Changed String for guids to its value object
This commit is contained in:
@@ -17,6 +17,7 @@ package io.moquette.spi.persistence;
|
||||
|
||||
import io.moquette.spi.IMatchingCondition;
|
||||
import io.moquette.spi.IMessagesStore;
|
||||
import io.moquette.spi.MessageGUID;
|
||||
import org.mapdb.DB;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -36,9 +37,9 @@ class MapDBMessagesStore implements IMessagesStore {
|
||||
private DB m_db;
|
||||
|
||||
//maps clientID -> guid
|
||||
private ConcurrentMap<String, String> m_retainedStore;
|
||||
private ConcurrentMap<String, MessageGUID> m_retainedStore;
|
||||
//maps guid to message, it's message store
|
||||
private ConcurrentMap<String, IMessagesStore.StoredMessage> m_persistentMessageStore;
|
||||
private ConcurrentMap<MessageGUID, IMessagesStore.StoredMessage> m_persistentMessageStore;
|
||||
|
||||
|
||||
MapDBMessagesStore(DB db) {
|
||||
@@ -52,7 +53,7 @@ class MapDBMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void storeRetained(String topic, String guid) {
|
||||
public void storeRetained(String topic, MessageGUID guid) {
|
||||
m_retainedStore.put(topic, guid);
|
||||
}
|
||||
|
||||
@@ -61,8 +62,8 @@ class MapDBMessagesStore implements IMessagesStore {
|
||||
LOG.debug("searchMatching scanning all retained messages, presents are {}", m_retainedStore.size());
|
||||
|
||||
List<StoredMessage> results = new ArrayList<>();
|
||||
for (Map.Entry<String, String> entry : m_retainedStore.entrySet()) {
|
||||
final String guid = entry.getValue();
|
||||
for (Map.Entry<String, MessageGUID> entry : m_retainedStore.entrySet()) {
|
||||
final MessageGUID guid = entry.getValue();
|
||||
StoredMessage storedMsg = m_persistentMessageStore.get(guid);
|
||||
if (condition.match(entry.getKey())) {
|
||||
results.add(storedMsg);
|
||||
@@ -73,25 +74,25 @@ class MapDBMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String storePublishForFuture(StoredMessage evt) {
|
||||
public MessageGUID storePublishForFuture(StoredMessage evt) {
|
||||
LOG.debug("storePublishForFuture store evt {}", evt);
|
||||
if (evt.getClientID() == null) {
|
||||
LOG.error("persisting a message without a clientID, bad programming error msg: {}", evt);
|
||||
throw new IllegalArgumentException("\"persisting a message without a clientID, bad programming error");
|
||||
}
|
||||
String guid = UUID.randomUUID().toString();
|
||||
MessageGUID guid = new MessageGUID(UUID.randomUUID().toString());
|
||||
evt.setGuid(guid);
|
||||
LOG.debug("storePublishForFuture guid <{}>", guid);
|
||||
m_persistentMessageStore.put(guid, evt);
|
||||
ConcurrentMap<Integer, String> messageIdToGuid = m_db.getHashMap(MapDBSessionsStore.messageId2GuidsMapName(evt.getClientID()));
|
||||
ConcurrentMap<Integer, MessageGUID> messageIdToGuid = m_db.getHashMap(MapDBSessionsStore.messageId2GuidsMapName(evt.getClientID()));
|
||||
messageIdToGuid.put(evt.getMessageID(), guid);
|
||||
return guid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<StoredMessage> listMessagesInSession(Collection<String> guids) {
|
||||
public List<StoredMessage> listMessagesInSession(Collection<MessageGUID> guids) {
|
||||
List<StoredMessage> ret = new ArrayList<>();
|
||||
for (String guid : guids) {
|
||||
for (MessageGUID guid : guids) {
|
||||
ret.add(m_persistentMessageStore.get(guid));
|
||||
}
|
||||
return ret;
|
||||
@@ -99,14 +100,14 @@ class MapDBMessagesStore implements IMessagesStore {
|
||||
|
||||
@Override
|
||||
public void dropMessagesInSession(String clientID) {
|
||||
ConcurrentMap<Integer, String> messageIdToGuid = m_db.getHashMap(MapDBSessionsStore.messageId2GuidsMapName(clientID));
|
||||
for (String guid : messageIdToGuid.values()) {
|
||||
ConcurrentMap<Integer, MessageGUID> messageIdToGuid = m_db.getHashMap(MapDBSessionsStore.messageId2GuidsMapName(clientID));
|
||||
for (MessageGUID guid : messageIdToGuid.values()) {
|
||||
removeStoredMessage(guid);
|
||||
}
|
||||
messageIdToGuid.clear();
|
||||
}
|
||||
|
||||
void removeStoredMessage(String guid) {
|
||||
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) {
|
||||
@@ -116,7 +117,7 @@ class MapDBMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public StoredMessage getMessageByGuid(String guid) {
|
||||
public StoredMessage getMessageByGuid(MessageGUID guid) {
|
||||
return m_persistentMessageStore.get(guid);
|
||||
}
|
||||
|
||||
@@ -126,14 +127,14 @@ class MapDBMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void incUsageCounter(String guid) {
|
||||
public void incUsageCounter(MessageGUID guid) {
|
||||
IMessagesStore.StoredMessage storedMessage = m_persistentMessageStore.get(guid);
|
||||
storedMessage.incReferenceCounter();
|
||||
m_persistentMessageStore.replace(guid, storedMessage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void decUsageCounter(String guid) {
|
||||
public void decUsageCounter(MessageGUID guid) {
|
||||
IMessagesStore.StoredMessage storedMessage = m_persistentMessageStore.get(guid);
|
||||
storedMessage.decReferenceCounter();
|
||||
m_persistentMessageStore.replace(guid, storedMessage);
|
||||
|
||||
@@ -18,6 +18,7 @@ package io.moquette.spi.persistence;
|
||||
import io.moquette.spi.ClientSession;
|
||||
import io.moquette.spi.IMessagesStore.StoredMessage;
|
||||
import io.moquette.spi.ISessionsStore;
|
||||
import io.moquette.spi.MessageGUID;
|
||||
import io.moquette.spi.impl.Utils;
|
||||
import io.moquette.spi.impl.subscriptions.Subscription;
|
||||
import io.moquette.spi.persistence.MapDBPersistentStore.PersistentSession;
|
||||
@@ -38,14 +39,14 @@ class MapDBSessionsStore implements ISessionsStore {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(MapDBSessionsStore.class);
|
||||
|
||||
//maps clientID->[MessageId -> guid]
|
||||
private ConcurrentMap<String, Map<Integer, String>> m_inflightStore;
|
||||
private ConcurrentMap<String, Map<Integer, MessageGUID>> m_inflightStore;
|
||||
//map clientID <-> set of currently in flight packet identifiers
|
||||
private Map<String, Set<Integer>> m_inFlightIds;
|
||||
private ConcurrentMap<String, PersistentSession> m_persistentSessions;
|
||||
//maps clientID->[guid*], insertion order cares, it's queue
|
||||
private ConcurrentMap<String, List<String>> m_enqueuedStore;
|
||||
private ConcurrentMap<String, List<MessageGUID>> m_enqueuedStore;
|
||||
//maps clientID->[MessageId -> guid]
|
||||
private ConcurrentMap<String, Map<Integer, String>> m_secondPhaseStore;
|
||||
private ConcurrentMap<String, Map<Integer, MessageGUID>> m_secondPhaseStore;
|
||||
|
||||
private final DB m_db;
|
||||
private final MapDBMessagesStore m_messagesStore;
|
||||
@@ -172,7 +173,7 @@ class MapDBSessionsStore implements ISessionsStore {
|
||||
@Override
|
||||
public void inFlightAck(String clientID, int messageID) {
|
||||
LOG.info("acknowledging inflight clientID <{}> messageID {}", clientID, messageID);
|
||||
Map<Integer, String> m = this.m_inflightStore.get(clientID);
|
||||
Map<Integer, MessageGUID> m = this.m_inflightStore.get(clientID);
|
||||
if (m == null) {
|
||||
LOG.error("Can't find the inFlight record for client <{}>", clientID);
|
||||
return;
|
||||
@@ -187,8 +188,8 @@ class MapDBSessionsStore implements ISessionsStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void inFlight(String clientID, int messageID, String guid) {
|
||||
Map<Integer, String> m = this.m_inflightStore.get(clientID);
|
||||
public void inFlight(String clientID, int messageID, MessageGUID guid) {
|
||||
Map<Integer, MessageGUID> m = this.m_inflightStore.get(clientID);
|
||||
if (m == null) {
|
||||
m = new HashMap<>();
|
||||
}
|
||||
@@ -198,21 +199,21 @@ class MapDBSessionsStore implements ISessionsStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindToDeliver(String guid, String clientID) {
|
||||
List<String> guids = Utils.defaultGet(m_enqueuedStore, clientID, new ArrayList<String>());
|
||||
public void bindToDeliver(MessageGUID guid, String clientID) {
|
||||
List<MessageGUID> guids = Utils.defaultGet(m_enqueuedStore, clientID, new ArrayList<MessageGUID>());
|
||||
guids.add(guid);
|
||||
m_enqueuedStore.put(clientID, guids);
|
||||
m_messagesStore.incUsageCounter(guid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> enqueued(String clientID) {
|
||||
return Utils.defaultGet(m_enqueuedStore, clientID, new ArrayList<String>());
|
||||
public Collection<MessageGUID> enqueued(String clientID) {
|
||||
return Utils.defaultGet(m_enqueuedStore, clientID, new ArrayList<MessageGUID>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeEnqueued(String clientID, String guid) {
|
||||
List<String> guids = Utils.defaultGet(m_enqueuedStore, clientID, new ArrayList<String>());
|
||||
public void removeEnqueued(String clientID, MessageGUID guid) {
|
||||
List<MessageGUID> guids = Utils.defaultGet(m_enqueuedStore, clientID, new ArrayList<MessageGUID>());
|
||||
guids.remove(guid);
|
||||
m_enqueuedStore.put(clientID, guids);
|
||||
m_messagesStore.decUsageCounter(guid);
|
||||
@@ -223,12 +224,12 @@ class MapDBSessionsStore implements ISessionsStore {
|
||||
@Override
|
||||
public void moveInFlightToSecondPhaseAckWaiting(String clientID, int messageID) {
|
||||
LOG.info("acknowledging inflight clientID <{}> messageID {}", clientID, messageID);
|
||||
Map<Integer, String> m = this.m_inflightStore.get(clientID);
|
||||
Map<Integer, MessageGUID> m = this.m_inflightStore.get(clientID);
|
||||
if (m == null) {
|
||||
LOG.error("Can't find the inFlight record for client <{}>", clientID);
|
||||
return;
|
||||
}
|
||||
String guid = m.remove(messageID);
|
||||
MessageGUID guid = m.remove(messageID);
|
||||
|
||||
//remove from the ids store
|
||||
Set<Integer> inFlightForClient = this.m_inFlightIds.get(clientID);
|
||||
@@ -237,22 +238,22 @@ class MapDBSessionsStore implements ISessionsStore {
|
||||
}
|
||||
|
||||
LOG.info("Moving to second phase store");
|
||||
Map<Integer, String> messageIDs = Utils.defaultGet(m_secondPhaseStore, clientID, new HashMap<Integer, String>());
|
||||
Map<Integer, MessageGUID> messageIDs = Utils.defaultGet(m_secondPhaseStore, clientID, new HashMap<Integer, MessageGUID>());
|
||||
messageIDs.put(messageID, guid);
|
||||
m_secondPhaseStore.put(clientID, messageIDs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String secondPhaseAcknowledged(String clientID, int messageID) {
|
||||
Map<Integer, String> messageIDs = Utils.defaultGet(m_secondPhaseStore, clientID, new HashMap<Integer, String>());
|
||||
String guid = messageIDs.remove(messageID);
|
||||
public MessageGUID secondPhaseAcknowledged(String clientID, int messageID) {
|
||||
Map<Integer, MessageGUID> messageIDs = Utils.defaultGet(m_secondPhaseStore, clientID, new HashMap<Integer, MessageGUID>());
|
||||
MessageGUID guid = messageIDs.remove(messageID);
|
||||
m_secondPhaseStore.put(clientID, messageIDs);
|
||||
return guid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String mapToGuid(String clientID, int messageID) {
|
||||
ConcurrentMap<Integer, String> messageIdToGuid = m_db.getHashMap(messageId2GuidsMapName(clientID));
|
||||
public MessageGUID mapToGuid(String clientID, int messageID) {
|
||||
ConcurrentMap<Integer, MessageGUID> messageIdToGuid = m_db.getHashMap(messageId2GuidsMapName(clientID));
|
||||
return messageIdToGuid.get(messageID);
|
||||
}
|
||||
|
||||
@@ -262,10 +263,10 @@ class MapDBSessionsStore implements ISessionsStore {
|
||||
|
||||
@Override
|
||||
public StoredMessage getInflightMessage(String clientID, int messageID) {
|
||||
Map<Integer, String> clientEntries = m_inflightStore.get(clientID);
|
||||
Map<Integer, MessageGUID> clientEntries = m_inflightStore.get(clientID);
|
||||
if (clientEntries == null)
|
||||
return null;
|
||||
String guid = clientEntries.get(messageID);
|
||||
MessageGUID guid = clientEntries.get(messageID);
|
||||
LOG.info("inflight messageID {} guid <{}>", messageID, guid);
|
||||
if (guid == null)
|
||||
return null;
|
||||
|
||||
Reference in New Issue
Block a user