/** * This generates a map for use on the recalculation and recovery of pending maps after reloading * it * * @param queues * @param pendingNonTXPageCounter * @param txRecoverCounter * @return * @throws Exception */ private Map<SimpleString, Map<Long, Map<Long, List<PageCountPending>>>> generateMapsOnPendingCount( Map<Long, Queue> queues, List<PageCountPending> pendingNonTXPageCounter, Transaction txRecoverCounter) throws Exception { Map<SimpleString, Map<Long, Map<Long, List<PageCountPending>>>> perAddressMap = new HashMap<>(); for (PageCountPending pgCount : pendingNonTXPageCounter) { long queueID = pgCount.getQueueID(); long pageID = pgCount.getPageID(); // We first figure what Queue is based on the queue id Queue queue = queues.get(queueID); if (queue == null) { logger.debug( "removing pending page counter id = " + pgCount.getID() + " as queueID=" + pgCount.getID() + " no longer exists"); // this means the queue doesn't exist any longer, we will remove it from the storage storageManager.deletePendingPageCounter(txRecoverCounter.getID(), pgCount.getID()); txRecoverCounter.setContainsPersistent(); continue; } // Level 1 on the structure, per address SimpleString address = queue.getAddress(); Map<Long, Map<Long, List<PageCountPending>>> perPageMap = perAddressMap.get(address); if (perPageMap == null) { perPageMap = new HashMap<>(); perAddressMap.put(address, perPageMap); } Map<Long, List<PageCountPending>> perQueueMap = perPageMap.get(pageID); if (perQueueMap == null) { perQueueMap = new HashMap<>(); perPageMap.put(pageID, perQueueMap); } List<PageCountPending> pendingCounters = perQueueMap.get(queueID); if (pendingCounters == null) { pendingCounters = new LinkedList<>(); perQueueMap.put(queueID, pendingCounters); } pendingCounters.add(pgCount); perQueueMap.put(queueID, pendingCounters); } return perAddressMap; }