eclipse-paho / eclipse-paho/paho.mqtt.java

DisconnectedMessageBuffer design polluting disk and making persisted message non-recoverable as long as client process is running

Open
#759 8 comments 0 reactions 0 assignees View on GitHub
triage
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.