Introduced the FlightZone concept (inbound and outbound) and separated logic of storage system.
This commit is contained in:
@@ -35,7 +35,6 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
private Map<Topic, MessageGUID> m_retainedStore = new HashMap<>();
|
||||
private Map<MessageGUID, StoredMessage> m_persistentMessageStore = new HashMap<>();
|
||||
private Map<String, Map<Integer, MessageGUID>> m_messageToGuids = new HashMap<>();
|
||||
|
||||
MemoryMessagesStore() {
|
||||
}
|
||||
@@ -72,21 +71,13 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
MessageGUID guid = new MessageGUID(UUID.randomUUID().toString());
|
||||
storedMessage.setGuid(guid);
|
||||
m_persistentMessageStore.put(guid, storedMessage);
|
||||
final HashMap<Integer, MessageGUID> emptyGuids = new HashMap<>();
|
||||
Map<Integer, MessageGUID> guids = defaultGet(m_messageToGuids, storedMessage.getClientID(), emptyGuids);
|
||||
guids.put(storedMessage.getMessageID(), guid);
|
||||
m_messageToGuids.put(storedMessage.getClientID(), guids);
|
||||
return guid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dropMessagesInSession(String clientID) {
|
||||
Map<Integer, MessageGUID> messageGUIDMap = m_messageToGuids.get(clientID);
|
||||
if (messageGUIDMap == null || messageGUIDMap.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
public void dropInFlightMessagesInSession(Collection<MessageGUID> pendingAckMessages) {
|
||||
//remove all guids from retained
|
||||
Collection<MessageGUID> messagesToRemove = new HashSet<>(messageGUIDMap.values());
|
||||
Collection<MessageGUID> messagesToRemove = new HashSet<>(pendingAckMessages);
|
||||
messagesToRemove.removeAll(m_retainedStore.values());
|
||||
|
||||
for (MessageGUID guid : messagesToRemove) {
|
||||
@@ -103,20 +94,4 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
public void cleanRetained(Topic topic) {
|
||||
m_retainedStore.remove(topic);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPendingPublishMessages(String clientID) {
|
||||
Map<Integer, MessageGUID> messageToGuids = m_messageToGuids.get(clientID);
|
||||
if (messageToGuids == null)
|
||||
return 0;
|
||||
else
|
||||
return messageToGuids.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageGUID mapToGuid(String clientID, int messageID) {
|
||||
final HashMap<Integer, MessageGUID> emptyGuids = new HashMap<>();
|
||||
Map<Integer, MessageGUID> guids = Utils.defaultGet(m_messageToGuids, clientID, emptyGuids);
|
||||
return guids.get(messageID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,8 @@ import java.util.*;
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
|
||||
import static io.moquette.spi.impl.Utils.defaultGet;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andrea
|
||||
@@ -45,12 +47,15 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
|
||||
// maps clientID->[MessageId -> guid]
|
||||
private Map<String, Map<Integer, MessageGUID>> m_inflightStore = new HashMap<>();
|
||||
// private Map<String, Set<Integer>> m_inflightIDs = new HashMap<>();
|
||||
// maps clientID->BlockingQueue
|
||||
private Map<String, BlockingQueue<StoredMessage>> queues = new HashMap<>();
|
||||
// maps clientID->[MessageId -> guid]
|
||||
private Map<String, Map<Integer, MessageGUID>> m_secondPhaseStore = new HashMap<>();
|
||||
|
||||
private Map<String, Map<Integer, MessageGUID>> outboundFlightMessageToGuid = new HashMap<>();
|
||||
|
||||
private Map<String, Map<Integer, MessageGUID>> inboundFlightMessageToGuid = new HashMap<>();
|
||||
|
||||
private final IMessagesStore m_messagesStore;
|
||||
|
||||
public MemorySessionStore(IMessagesStore messagesStore) {
|
||||
@@ -176,6 +181,11 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
}
|
||||
m.put(messageID, guid);
|
||||
this.m_inflightStore.put(clientID, m);
|
||||
|
||||
final HashMap<Integer, MessageGUID> emptyGuids = new HashMap<>();
|
||||
Map<Integer, MessageGUID> guids = defaultGet(outboundFlightMessageToGuid, clientID, emptyGuids);
|
||||
guids.put(messageID, guid);
|
||||
outboundFlightMessageToGuid.put(clientID, guids);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -251,9 +261,25 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
return inflightMessages.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public StoredMessage inboundInflight(String clientID, int messageID) {
|
||||
final HashMap<Integer, MessageGUID> emptyGuids = new HashMap<>();
|
||||
Map<Integer, MessageGUID> guids = Utils.defaultGet(inboundFlightMessageToGuid, clientID, emptyGuids);
|
||||
final MessageGUID guid = guids.get(messageID);
|
||||
return m_messagesStore.getMessageByGuid(guid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsInboundInflight(String clientID, int messageID, MessageGUID guid) {
|
||||
final HashMap<Integer, MessageGUID> emptyGuids = new HashMap<>();
|
||||
Map<Integer, MessageGUID> guids = Utils.defaultGet(inboundFlightMessageToGuid, clientID, emptyGuids);
|
||||
guids.put(messageID, guid);
|
||||
inboundFlightMessageToGuid.put(clientID, guids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPendingPublishMessagesNo(String clientID) {
|
||||
return m_messagesStore.getPendingPublishMessages(clientID);
|
||||
return queues.get(clientID).size();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -265,4 +291,13 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
return pendingAcks.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<MessageGUID> pendingAck(String clientID) {
|
||||
Map<Integer, MessageGUID> messageGUIDMap = outboundFlightMessageToGuid.get(clientID);
|
||||
if (messageGUIDMap == null || messageGUIDMap.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
return new ArrayList<>(messageGUIDMap.values());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user