Commit e55fbfe422a2721a0f056bc6a86f921748d985f1

Authored by Wiebe Cazemier
1 parent 78dcaba6

Don't hold two locks while expiring sessions

Showing 1 changed file with 10 additions and 2 deletions
subscriptionstore.cpp
@@ -665,6 +665,9 @@ void SubscriptionStore::removeExpiredSessionsClients() @@ -665,6 +665,9 @@ void SubscriptionStore::removeExpiredSessionsClients()
665 const std::chrono::time_point<std::chrono::steady_clock> now = std::chrono::steady_clock::now(); 665 const std::chrono::time_point<std::chrono::steady_clock> now = std::chrono::steady_clock::now();
666 const std::chrono::seconds secondsSinceEpoch = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()); 666 const std::chrono::seconds secondsSinceEpoch = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch());
667 667
  668 + // Collect sessions to remove for a separate step, to avoid holding two locks at the same time.
  669 + std::vector<std::shared_ptr<Session>> sessionsToRemove;
  670 +
668 int removedSessions = 0; 671 int removedSessions = 0;
669 int processedRemovals = 0; 672 int processedRemovals = 0;
670 int queuedRemovalsLeft = -1; 673 int queuedRemovalsLeft = -1;
@@ -693,8 +696,7 @@ void SubscriptionStore::removeExpiredSessionsClients() @@ -693,8 +696,7 @@ void SubscriptionStore::removeExpiredSessionsClients()
693 // A session could have been picked up again, so we have to verify its expiration status. 696 // A session could have been picked up again, so we have to verify its expiration status.
694 if (lockedSession && !lockedSession->hasActiveClient()) 697 if (lockedSession && !lockedSession->hasActiveClient())
695 { 698 {
696 - removeSession(lockedSession);  
697 - removedSessions++; 699 + sessionsToRemove.push_back(lockedSession);
698 } 700 }
699 } 701 }
700 it = queuedSessionRemovals.erase(it); 702 it = queuedSessionRemovals.erase(it);
@@ -705,6 +707,12 @@ void SubscriptionStore::removeExpiredSessionsClients() @@ -705,6 +707,12 @@ void SubscriptionStore::removeExpiredSessionsClients()
705 queuedRemovalsLeft = queuedSessionRemovals.size(); 707 queuedRemovalsLeft = queuedSessionRemovals.size();
706 } 708 }
707 709
  710 + for(std::shared_ptr<Session> &session : sessionsToRemove)
  711 + {
  712 + removeSession(session);
  713 + removedSessions++;
  714 + }
  715 +
708 logger->logf(LOG_DEBUG, "Processed %d queued session removals, resulting in %d deleted expired sessions. %d queued removals in the future.", 716 logger->logf(LOG_DEBUG, "Processed %d queued session removals, resulting in %d deleted expired sessions. %d queued removals in the future.",
709 processedRemovals, removedSessions, queuedRemovalsLeft); 717 processedRemovals, removedSessions, queuedRemovalsLeft);
710 718