eclipse-paho / eclipse-paho/paho.mqtt.java
DisconnectedMessageBuffer design polluting disk and making persisted message non-recoverable as long as client process is running
- Dominant language
- Java
- Stars
- 2.3k
- Forks
- 919
- PR merge metrics
- No merged PRs in 30d
Description
Please fill out the form below before submitting, thank you!
- [x] Bug exists Release Version 1.2.2 ( Master Branch)
Implementation of `public void sendNoWait(MqttWireMessage message, MqttToken token)` seems to have a basic flaw where invocation of `disconnectedMessageBuffer.putMessage` removes last message from in memory buffer in case deleteOldestMessages flag is set `bufferOpts.isDeleteOldestMessages() == true`
`public void putMessage(MqttWireMessage message, MqttToken token) throws MqttException {`
`BufferedMessage bufferedMessage = new BufferedMessage(message, token);`
`synchronized (bufLock) {`
`if (buffer.size() < bufferOpts.getBufferSize()) {`
`buffer.add(bufferedMessage);`
`} else if (bufferOpts.isDeleteOldestMessages() == true) {`
`buffer.remove(0);`
`buffer.add(bufferedMessage);`
`} else {`
`throw new MqttException(MqttException.REASON_CODE_DISCONNECTED_BUFFER_FULL);`
`}`
`}`
`}`
but the same message remains in persistence storage (in disk) and is never send for delivery as long as client is running. It seems to load such messages again one need to restart client (but this functionality is broken due to NullPointerException https://github.com/eclipse/paho.mqtt.java/issues/634).
This message should either be removed from disk or made available for delivery. I think removal is better option as in-memory buffer is designed for same.
Contributor guide
Assessment
This issue has not been assessed yet.