Package org.apache.zookeeper.server
Class DataTree
java.lang.Object
org.apache.zookeeper.server.DataTree
This class maintains the tree data structure. It doesn't have any networking
or client connection code in it so that it can be tested in a standalone way.
The tree maintains two parallel data structures: a hashtable that maps from full paths to DataNodes and a tree of DataNodes. All accesses to a path is through the hashtable. The tree is traversed only when serializing to disk.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classclassA helper class to maintain the digest meta associated with specific zxid. -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intstatic final intlongstatic final intover-the-wire size of znode stat. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionintvoidcreate a /zookeeper/config node for maintaining the configuration (membership and quorum system) info for zookeepervoidaddDigestWatcher(DigestWatcher digestWatcher) Add digest mismatch event handler.voidlongGet the size of the nodes based on path and data length.longbooleancompareDigest(TxnHeader header, Record txn, TxnDigest digest) Compares the digest of the tree with the digest present in transaction digest.voidcompareSnapshotDigests(long zxid) Compares the actual tree's digest with that in the snapshot.booleancontainsWatcher(String path, Watcher.WatcherType type, Watcher watcher) static voidstatic voidcopyStatPersisted(StatPersisted from, StatPersisted to) voidcreateNode(String path, byte[] data, List<ACL> acl, long ephemeralOwner, int parentCVersion, long zxid, long time) Add a new node to the DataTree.voidcreateNode(String path, byte[] data, List<ACL> acl, long ephemeralOwner, int parentCVersion, long zxid, long time, Stat outputStat) Add a new node to the DataTree.static StatPersistedcreateStat(long zxid, long time, long ephemeralOwner) Create a node stat from the given params.voiddeleteNode(String path, long zxid) remove the path from the datatreevoiddeserialize(InputArchive ia, String tag) booleanDeserializes the lastProcessedZxid from the input stream and updates the lastProcessedZxid field.booleandeserializeZxidDigest(InputArchive ia, long startZxidOfSnapshot) Deserializing the zxid digest from the input stream and update the digestFromLoadedSnapshot.voiddumpEphemerals(PrintWriter writer) Write a text dump of all the ephemerals in the datatree.voiddumpWatches(PrintWriter writer, boolean byPath) Write a text dump of all the watches on the datatree.voiddumpWatchesSummary(PrintWriter writer) Summary of the watches on the datatree.intgetAllChildrenNumber(String path) getChildren(String path, Stat stat, Watcher watcher) byte[]Return all the digests in the historical digest list.Returns a mapping of session ID to ephemeral znodes.getEphemerals(long sessionId) intgetMaxPrefixWithQuota(String path) If there is a quota set, return the appropriate prefix for that quota Else return nullintlonggetTtls()intReturns a watch report.Returns a watch report by path.Returns a watch summary.processTxn(TxnHeader header, Record txn) processTxn(TxnHeader header, Record txn, boolean isSubTxn) processTxn(TxnHeader header, Record txn, TxnDigest digest) voidremoveCnxn(Watcher watcher) booleanremoveWatch(String path, Watcher.WatcherType type, Watcher watcher) voidreportDigestMismatch(long zxid) Reports any mismatch in the transaction digest.voidserialize(OutputArchive oa, String tag) voidbooleanSerializes the lastProcessedZxid so we can get it from snapshot instead the snapshot file name.voidserializeNodeData(OutputArchive oa, String path, DataNode node) voidbooleanSerializing the digest to snapshot, this is done after the data tree is being serialized, so when we replay the txns, and it hits this zxid we know we should be in a non-fuzzy state, and have the same digest.voidsetCversionPzxid(String path, int newCversion, long zxid) This method sets the Cversion and Pzxid for the specified node to the values passed as arguments.voidsetWatches(long relativeZxid, List<String> dataWatches, List<String> existWatches, List<String> childWatches, List<String> persistentWatches, List<String> persistentRecursiveWatches, Watcher watcher) voidvoidupdateQuotaStat(String lastPrefix, long bytesDiff, int countDiff) update the count/bytes of this stat data node
-
Field Details
-
STAT_OVERHEAD_BYTES
public static final int STAT_OVERHEAD_BYTESover-the-wire size of znode stat. Counting the fields of Stat class- See Also:
-
DIGEST_LOG_LIMIT
public static final int DIGEST_LOG_LIMIT- See Also:
-
DIGEST_LOG_INTERVAL
public static final int DIGEST_LOG_INTERVAL- See Also:
-
lastProcessedZxid
public volatile long lastProcessedZxid
-
-
Constructor Details
-
DataTree
public DataTree()
-
-
Method Details
-
getEphemerals
-
getContainers
-
getTtls
-
getSessions
-
getNode
-
getNodeCount
public int getNodeCount() -
getWatchCount
public int getWatchCount() -
getEphemeralsCount
public int getEphemeralsCount() -
approximateDataSize
public long approximateDataSize()Get the size of the nodes based on path and data length.- Returns:
- size of the data
-
cachedApproximateDataSize
public long cachedApproximateDataSize() -
addConfigNode
public void addConfigNode()create a /zookeeper/config node for maintaining the configuration (membership and quorum system) info for zookeeper -
copyStatPersisted
-
copyStat
-
updateQuotaStat
update the count/bytes of this stat data node- Parameters:
lastPrefix- the path of the node that has a quota.bytesDiff- the diff to be added to number of bytescountDiff- the diff to be added to the count
-
createNode
public void createNode(String path, byte[] data, List<ACL> acl, long ephemeralOwner, int parentCVersion, long zxid, long time) throws KeeperException.NoNodeException, KeeperException.NodeExistsException Add a new node to the DataTree.- Parameters:
path- Path for the new node.data- Data to store in the node.acl- Node aclsephemeralOwner- the session id that owns this node. -1 indicates this is not an ephemeral node.zxid- Transaction IDtime-- Throws:
KeeperException.NodeExistsExceptionKeeperException.NoNodeException
-
createNode
public void createNode(String path, byte[] data, List<ACL> acl, long ephemeralOwner, int parentCVersion, long zxid, long time, Stat outputStat) throws KeeperException.NoNodeException, KeeperException.NodeExistsException Add a new node to the DataTree.- Parameters:
path- Path for the new node.data- Data to store in the node.acl- Node aclsephemeralOwner- the session id that owns this node. -1 indicates this is not an ephemeral node.zxid- Transaction IDtime-outputStat- A Stat object to store Stat output results into.- Throws:
KeeperException.NodeExistsExceptionKeeperException.NoNodeException
-
deleteNode
remove the path from the datatree- Parameters:
path- the path to of the node to be deletedzxid- the current zxid- Throws:
KeeperException.NoNodeException
-
setData
public Stat setData(String path, byte[] data, int version, long zxid, long time) throws KeeperException.NoNodeException - Throws:
KeeperException.NoNodeException
-
getMaxPrefixWithQuota
If there is a quota set, return the appropriate prefix for that quota Else return null- Parameters:
path- The ZK path to check for quota- Returns:
- Max quota prefix, or null if none
-
addWatch
-
getData
public byte[] getData(String path, Stat stat, Watcher watcher) throws KeeperException.NoNodeException - Throws:
KeeperException.NoNodeException
-
statNode
- Throws:
KeeperException.NoNodeException
-
getChildren
public List<String> getChildren(String path, Stat stat, Watcher watcher) throws KeeperException.NoNodeException - Throws:
KeeperException.NoNodeException
-
getAllChildrenNumber
-
setACL
- Throws:
KeeperException.NoNodeException
-
getACL
- Throws:
KeeperException.NoNodeException
-
getACL
-
aclCacheSize
public int aclCacheSize() -
processTxn
-
processTxn
-
processTxn
-
serializeNodeData
- Throws:
IOException
-
serializeAcls
- Throws:
IOException
-
serializeNodes
- Throws:
IOException
-
serialize
- Throws:
IOException
-
deserialize
- Throws:
IOException
-
dumpWatchesSummary
Summary of the watches on the datatree.- Parameters:
writer- the output to write to
-
dumpWatches
Write a text dump of all the watches on the datatree. Warning, this is expensive, use sparingly!- Parameters:
writer- the output to write to
-
getWatches
Returns a watch report.- Returns:
- watch report
- See Also:
-
getWatchesByPath
Returns a watch report by path.- Returns:
- watch report
- See Also:
-
getWatchesSummary
Returns a watch summary.- Returns:
- watch summary
- See Also:
-
dumpEphemerals
Write a text dump of all the ephemerals in the datatree.- Parameters:
writer- the output to write to
-
shutdownWatcher
public void shutdownWatcher() -
getEphemerals
Returns a mapping of session ID to ephemeral znodes.- Returns:
- map of session ID to sets of ephemeral znodes
-
removeCnxn
-
setWatches
-
setCversionPzxid
public void setCversionPzxid(String path, int newCversion, long zxid) throws KeeperException.NoNodeException This method sets the Cversion and Pzxid for the specified node to the values passed as arguments. The values are modified only if newCversion is greater than the current Cversion. A NoNodeException is thrown if a znode for the specified path is not found.- Parameters:
path- Full path to the znode whose Cversion needs to be modified. A "/" at the end of the path is ignored.newCversion- Value to be assigned to Cversionzxid- Value to be assigned to Pzxid- Throws:
KeeperException.NoNodeException- If znode not found.
-
containsWatcher
-
removeWatch
-
getReferenceCountedAclCache
-
serializeZxidDigest
Serializing the digest to snapshot, this is done after the data tree is being serialized, so when we replay the txns, and it hits this zxid we know we should be in a non-fuzzy state, and have the same digest.- Parameters:
oa- the output stream to write to- Returns:
- true if the digest is serialized successfully
- Throws:
IOException
-
deserializeZxidDigest
Deserializing the zxid digest from the input stream and update the digestFromLoadedSnapshot.- Parameters:
ia- the input stream to read fromstartZxidOfSnapshot- the zxid of snapshot file- Returns:
- the true if it deserialized successfully
- Throws:
IOException
-
serializeLastProcessedZxid
Serializes the lastProcessedZxid so we can get it from snapshot instead the snapshot file name. This is needed for performing snapshot and restore via admin server commands.- Parameters:
oa- the output stream to write to- Returns:
- true if the lastProcessedZxid is serialized successfully, otherwise false
- Throws:
IOException- if there is an I/O error
-
deserializeLastProcessedZxid
Deserializes the lastProcessedZxid from the input stream and updates the lastProcessedZxid field.- Parameters:
ia- the input stream to read from- Returns:
- true if lastProcessedZxid is deserialized successfully, otherwise false
- Throws:
IOException- if there is an I/O error
-
compareSnapshotDigests
public void compareSnapshotDigests(long zxid) Compares the actual tree's digest with that in the snapshot. Resets digestFromLoadedSnapshot after comparison.- Parameters:
zxid- zxid
-
compareDigest
Compares the digest of the tree with the digest present in transaction digest. If there is any error, logs and alerts the watchers.- Parameters:
header- transaction header being appliedtxn- transactiondigest- transaction digest- Returns:
- false if digest in the txn doesn't match what we have now in the data tree
-
reportDigestMismatch
public void reportDigestMismatch(long zxid) Reports any mismatch in the transaction digest.- Parameters:
zxid- zxid for which the error is being reported.
-
getTreeDigest
public long getTreeDigest() -
getLastProcessedZxidDigest
-
getDigestFromLoadedSnapshot
-
addDigestWatcher
Add digest mismatch event handler.- Parameters:
digestWatcher- the handler to add
-
getDigestLog
Return all the digests in the historical digest list. -
createStat
Create a node stat from the given params.- Parameters:
zxid- the zxid associated with the txntime- the time when the txn is createdephemeralOwner- the owner if the node is an ephemeral- Returns:
- the stat
-