diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index e2994d0d..0499579b 100644 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -21,6 +21,7 @@ import io.moquette.parser.proto.messages.AbstractMessage; import java.util.Collection; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; /** * Defines the SPI to be implemented by a StorageService that handle persistence of messages @@ -36,7 +37,7 @@ public interface IMessagesStore { //Optional attribute, available only fo QoS 1 and 2 private Integer m_msgID; private MessageGUID m_guid; - private int referenceCounter = 0; + private AtomicInteger referenceCounter = new AtomicInteger(0); public StoredMessage(byte[] message, AbstractMessage.QOSType qos, String topic) { m_qos = qos; @@ -93,15 +94,15 @@ public interface IMessagesStore { } public void incReferenceCounter() { - this.referenceCounter++; + this.referenceCounter.incrementAndGet(); } public void decReferenceCounter() { - this.referenceCounter--; + this.referenceCounter.decrementAndGet(); } public int getReferenceCounter() { - return this.referenceCounter; + return this.referenceCounter.get(); } @Override diff --git a/broker/src/main/java/io/moquette/spi/persistence/MapDBMessagesStore.java b/broker/src/main/java/io/moquette/spi/persistence/MapDBMessagesStore.java index 4eb497e0..f8c3d583 100644 --- a/broker/src/main/java/io/moquette/spi/persistence/MapDBMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/persistence/MapDBMessagesStore.java @@ -110,7 +110,10 @@ class MapDBMessagesStore implements IMessagesStore { void removeStoredMessage(MessageGUID guid) { //remove only the not retained and no more referenced StoredMessage storedMessage = m_persistentMessageStore.get(guid); - if (!storedMessage.isRetained() && storedMessage.getReferenceCounter() == 0) { + if (!storedMessage.isRetained() && storedMessage.getReferenceCounter() <= 0) { + if(storedMessage.getReferenceCounter() < 0) { + LOG.error("we should never have gotten a reference count less than zero"); + } LOG.debug("Cleaning not retained message guid {}", guid); m_persistentMessageStore.remove(guid); }