Class ZKDatabase


  • public class ZKDatabase
    extends Object
    This class maintains the in memory database of zookeeper server states that includes the sessions, datatree and the committed logs. It is booted up after reading the logs and snapshots from the disk.
    • Field Detail

      • dataTree

        protected DataTree dataTree
        make sure on a clear you take care of all these members.
      • minCommittedLog

        protected long minCommittedLog
      • maxCommittedLog

        protected long maxCommittedLog
      • SNAPSHOT_SIZE_FACTOR

        public static final String SNAPSHOT_SIZE_FACTOR
        Default value is to use snapshot if txnlog size exceeds 1/3 the size of snapshot
        See Also:
        Constant Field Values
      • DEFAULT_SNAPSHOT_SIZE_FACTOR

        public static final double DEFAULT_SNAPSHOT_SIZE_FACTOR
        See Also:
        Constant Field Values
      • DEFAULT_COMMIT_LOG_COUNT

        public static final int DEFAULT_COMMIT_LOG_COUNT
        See Also:
        Constant Field Values
      • commitLogCount

        public int commitLogCount
      • commitLogBuffer

        protected static int commitLogBuffer
    • Constructor Detail

      • ZKDatabase

        public ZKDatabase​(FileTxnSnapLog snapLog)
        the filetxnsnaplog that this zk database maps to. There is a one to one relationship between a filetxnsnaplog and zkdatabase.
        Parameters:
        snapLog - the FileTxnSnapLog mapping this zkdatabase
    • Method Detail

      • isInitialized

        public boolean isInitialized()
        checks to see if the zk database has been initialized or not.
        Returns:
        true if zk database is initialized and false if not
      • clear

        public void clear()
        clear the zkdatabase. Note to developers - be careful to see that the clear method does clear out all the data structures in zkdatabase.
      • getDataTree

        public DataTree getDataTree()
        the datatree for this zkdatabase
        Returns:
        the datatree for this zkdatabase
      • getmaxCommittedLog

        public long getmaxCommittedLog()
        the committed log for this zk database
        Returns:
        the committed log for this zkdatabase
      • getminCommittedLog

        public long getminCommittedLog()
        the minimum committed transaction log available in memory
        Returns:
        the minimum committed transaction log available in memory
      • getLogLock

        public ReentrantReadWriteLock getLogLock()
        Get the lock that controls the committedLog. If you want to get the pointer to the committedLog, you need to use this lock to acquire a read lock before calling getCommittedLog()
        Returns:
        the lock that controls the committed log
      • getDataTreeLastProcessedZxid

        public long getDataTreeLastProcessedZxid()
        get the last processed zxid from a datatree
        Returns:
        the last processed zxid of a datatree
      • getSessions

        public Collection<Long> getSessions()
        return the sessions in the datatree
        Returns:
        the data tree sessions
      • getSessionCount

        public long getSessionCount()
        Returns:
        number of (global) sessions
      • getSessionWithTimeOuts

        public ConcurrentHashMap<Long,​Integer> getSessionWithTimeOuts()
        get sessions with timeouts
        Returns:
        the hashmap of sessions with timeouts
      • loadDataBase

        public long loadDataBase()
                          throws IOException
        load the database from the disk onto memory and also add the transactions to the committedlog in memory.
        Returns:
        the last valid zxid on disk
        Throws:
        IOException
      • fastForwardDataBase

        public long fastForwardDataBase()
                                 throws IOException
        Fast forward the database adding transactions from the committed log into memory.
        Returns:
        the last valid zxid.
        Throws:
        IOException
      • addCommittedProposal

        public void addCommittedProposal​(Request request)
        maintains a list of last committedLog or so committed requests. This is used for fast follower synchronization.
        Parameters:
        request - committed request
      • isTxnLogSyncEnabled

        public boolean isTxnLogSyncEnabled()
      • calculateTxnLogSizeLimit

        public long calculateTxnLogSizeLimit()
      • getProposalsFromTxnLog

        public Iterator<Leader.Proposal> getProposalsFromTxnLog​(long startZxid,
                                                                long sizeLimit)
        Get proposals from txnlog. Only packet part of proposal is populated.
        Parameters:
        startZxid - the starting zxid of the proposal
        sizeLimit - maximum on-disk size of txnlog to fetch 0 is unlimited, negative value means disable.
        Returns:
        list of proposal (request part of each proposal is null)
      • removeCnxn

        public void removeCnxn​(ServerCnxn cnxn)
        remove a cnxn from the datatree
        Parameters:
        cnxn - the cnxn to remove from the datatree
      • killSession

        public void killSession​(long sessionId,
                                long zxid)
        kill a given session in the datatree
        Parameters:
        sessionId - the session id to be killed
        zxid - the zxid of kill session transaction
      • dumpEphemerals

        public void dumpEphemerals​(PrintWriter pwriter)
        write a text dump of all the ephemerals in the datatree
        Parameters:
        pwriter - the output to write to
      • getNodeCount

        public int getNodeCount()
        the node count of the datatree
        Returns:
        the node count of datatree
      • getEphemerals

        public Set<String> getEphemerals​(long sessionId)
        the paths for ephemeral session id
        Parameters:
        sessionId - the session id for which paths match to
        Returns:
        the paths for a session id
      • setlastProcessedZxid

        public void setlastProcessedZxid​(long zxid)
        the last processed zxid in the datatree
        Parameters:
        zxid - the last processed zxid in the datatree
      • processTxn

        public DataTree.ProcessTxnResult processTxn​(TxnHeader hdr,
                                                    Record txn,
                                                    TxnDigest digest)
        the process txn on the data and perform digest comparision.
        Parameters:
        hdr - the txnheader for the txn
        txn - the transaction that needs to be processed
        digest - the expected digest. A null value would skip the check
        Returns:
        the result of processing the transaction on this datatree/zkdatabase
      • getNode

        public DataNode getNode​(String path)
        get the datanode for this path
        Parameters:
        path - the path to lookup
        Returns:
        the datanode for getting the path
      • setWatches

        public void setWatches​(long relativeZxid,
                               List<String> dataWatches,
                               List<String> existWatches,
                               List<String> childWatches,
                               List<String> persistentWatches,
                               List<String> persistentRecursiveWatches,
                               Watcher watcher)
        set watches on the datatree
        Parameters:
        relativeZxid - the relative zxid that client has seen
        dataWatches - the data watches the client wants to reset
        existWatches - the exists watches the client wants to reset
        childWatches - the child watches the client wants to reset
        persistentWatches - the persistent watches the client wants to reset
        persistentRecursiveWatches - the persistent recursive watches the client wants to reset
        watcher - the watcher function
      • addWatch

        public void addWatch​(String basePath,
                             Watcher watcher,
                             int mode)
        Add a watch
        Parameters:
        basePath - watch base
        watcher - the watcher
        mode - a mode from ZooDefs.AddWatchModes
      • isSpecialPath

        public boolean isSpecialPath​(String path)
        check if the path is special or not
        Parameters:
        path - the input path
        Returns:
        true if path is special and false if not
      • getAclSize

        public int getAclSize()
        get the acl size of the datatree
        Returns:
        the acl size of the datatree
      • truncateLog

        public boolean truncateLog​(long zxid)
                            throws IOException
        Truncate the ZKDatabase to the specified zxid
        Parameters:
        zxid - the zxid to truncate zk database to
        Returns:
        true if the truncate is successful and false if not
        Throws:
        IOException
      • deserializeSnapshot

        public void deserializeSnapshot​(InputArchive ia)
                                 throws IOException
        deserialize a snapshot from an input archive
        Parameters:
        ia - the input archive you want to deserialize from
        Throws:
        IOException
      • append

        public boolean append​(Request si)
                       throws IOException
        append to the underlying transaction log
        Parameters:
        si - the request to append
        Returns:
        true if the append was succesfull and false if not
        Throws:
        IOException
      • commit

        public void commit()
                    throws IOException
        commit to the underlying transaction log
        Throws:
        IOException
      • initConfigInZKDatabase

        public void initConfigInZKDatabase​(QuorumVerifier qv)
      • setSnapshotSizeFactor

        public void setSnapshotSizeFactor​(double snapshotSizeFactor)
        Use for unit testing, so we can turn this feature on/off
        Parameters:
        snapshotSizeFactor - Set to minus value to turn this off.
      • containsWatcher

        public boolean containsWatcher​(String path,
                                       Watcher.WatcherType type,
                                       Watcher watcher)
        Check whether the given watcher exists in datatree
        Parameters:
        path - node to check watcher existence
        type - type of watcher
        watcher - watcher function
      • removeWatch

        public boolean removeWatch​(String path,
                                   Watcher.WatcherType type,
                                   Watcher watcher)
        Remove watch from the datatree
        Parameters:
        path - node to remove watches from
        type - type of watcher to remove
        watcher - watcher function to remove
      • createDataTree

        public DataTree createDataTree()
      • resetTxnCount

        public void resetTxnCount()
        Reset the number of txn since last rollLog
      • getTxnCount

        public int getTxnCount()
        Get the number of txn since last snapshot
      • getTxnSize

        public long getTxnSize()
        Get the size of txn since last snapshot