Class WatchManagerOptimized

java.lang.Object
org.apache.zookeeper.server.watch.WatchManagerOptimized
All Implemented Interfaces:
IDeadWatcherListener, IWatchManager

public class WatchManagerOptimized extends Object implements IWatchManager, IDeadWatcherListener
Optimized in memory and time complexity, compared to WatchManager, both the memory consumption and time complexity improved a lot, but it cannot efficiently remove the watcher when the session or socket is closed, for majority use case this is not a problem. Changed made compared to WatchManager: - Use HashSet and BitSet to store the watchers to find a balance between memory usage and time complexity - Use ReadWriteLock instead of synchronized to reduce lock retention - Lazily clean up the closed watchers
  • Constructor Details

    • WatchManagerOptimized

      public WatchManagerOptimized()
  • Method Details

    • addWatch

      public boolean addWatch(String path, Watcher watcher)
      Description copied from interface: IWatchManager
      Add watch to specific path.
      Specified by:
      addWatch in interface IWatchManager
      Parameters:
      path - znode path
      watcher - watcher object reference
      Returns:
      true if the watcher added is not already present
    • containsWatcher

      public boolean containsWatcher(String path, Watcher watcher)
      Used in the OpCode.checkWatches, which is a read operation, since read and write requests are exclusively processed, we don't need to hold lock here. Different from addWatch this method doesn't mutate any state, so we don't need to hold read lock to avoid dead watcher (cnxn closed) being added to the watcher manager. It's possible that before we lazily clean up the dead watcher, this will return true, but since the cnxn is closed, the response will dropped as well, so it doesn't matter.
      Specified by:
      containsWatcher in interface IWatchManager
      Parameters:
      path - znode path
      watcher - watcher object reference
      Returns:
      true if the watcher exists, false otherwise
    • removeWatcher

      public boolean removeWatcher(String path, Watcher watcher)
      Description copied from interface: IWatchManager
      Removes the specified watcher for the given path.
      Specified by:
      removeWatcher in interface IWatchManager
      Parameters:
      path - znode path
      watcher - watcher object reference
      Returns:
      true if the watcher successfully removed, false otherwise
    • removeWatcher

      public void removeWatcher(Watcher watcher)
      Description copied from interface: IWatchManager
      The entry to remove the watcher when the cnxn is closed.
      Specified by:
      removeWatcher in interface IWatchManager
      Parameters:
      watcher - watcher object reference
    • processDeadWatchers

      public void processDeadWatchers(Set<Integer> deadWatchers)
      Entry for WatcherCleaner to remove dead watchers
      Specified by:
      processDeadWatchers in interface IDeadWatcherListener
      Parameters:
      deadWatchers - the watchers need to be removed
    • triggerWatch

      public WatcherOrBitSet triggerWatch(String path, Watcher.Event.EventType type, List<ACL> acl)
      Description copied from interface: IWatchManager
      Distribute the watch event for the given path.
      Specified by:
      triggerWatch in interface IWatchManager
      Parameters:
      path - znode path
      type - the watch event type
      acl - ACL of the znode in path
      Returns:
      the watchers have been notified
    • triggerWatch

      public WatcherOrBitSet triggerWatch(String path, Watcher.Event.EventType type, List<ACL> acl, WatcherOrBitSet suppress)
      Description copied from interface: IWatchManager
      Distribute the watch event for the given path, but ignore those suppressed ones.
      Specified by:
      triggerWatch in interface IWatchManager
      Parameters:
      path - znode path
      type - the watch event type
      suppress - the suppressed watcher set
      Returns:
      the watchers have been notified
    • size

      public int size()
      Description copied from interface: IWatchManager
      Get the size of watchers.
      Specified by:
      size in interface IWatchManager
      Returns:
      the watchers number managed in this class.
    • shutdown

      public void shutdown()
      Description copied from interface: IWatchManager
      Clean up the watch manager.
      Specified by:
      shutdown in interface IWatchManager
    • getWatchesSummary

      public WatchesSummary getWatchesSummary()
      Description copied from interface: IWatchManager
      Returns a watch summary.
      Specified by:
      getWatchesSummary in interface IWatchManager
      Returns:
      watch summary
      See Also:
    • getWatches

      public WatchesReport getWatches()
      Description copied from interface: IWatchManager
      Returns a watch report.
      Specified by:
      getWatches in interface IWatchManager
      Returns:
      watch report
      See Also:
    • getWatchesByPath

      public WatchesPathReport getWatchesByPath()
      Iterate through ConcurrentHashMap is 'safe', it will reflect the state of the map at the time iteration began, may miss update while iterating, given this is used in the commands to get a general idea of the watches state, we don't care about missing some update.
      Specified by:
      getWatchesByPath in interface IWatchManager
      Returns:
      watch report
      See Also:
    • getWatcher2PathesMap

      public Map<Watcher,Set<String>> getWatcher2PathesMap()
      May cause OOM if there are lots of watches, might better to forbid it in this class.
    • dumpWatches

      public void dumpWatches(PrintWriter pwriter, boolean byPath)
      Description copied from interface: IWatchManager
      String representation of watches. Warning, may be large!
      Specified by:
      dumpWatches in interface IWatchManager
      Parameters:
      pwriter - the writer to dump the watches
      byPath - iff true output watches by paths, otw output watches by connection
    • toString

      public String toString()
      Overrides:
      toString in class Object