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 stand alone
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 class
class
A helper class to maintain the digest meta associated with specific zxid. -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final int
static final int
long
static final int
over-the-wire size of znode's stat. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionint
void
create a /zookeeper/config node for maintaining the configuration (membership and quorum system) info for zookeepervoid
addDigestWatcher
(DigestWatcher digestWatcher) Add digest mismatch event handler.void
long
Get the size of the nodes based on path and data length.long
boolean
compareDigest
(TxnHeader header, Record txn, TxnDigest digest) Compares the digest of the tree with the digest present in transaction digest.void
compareSnapshotDigests
(long zxid) Compares the actual tree's digest with that in the snapshot.boolean
containsWatcher
(String path, Watcher.WatcherType type, Watcher watcher) static void
static void
copyStatPersisted
(StatPersisted from, StatPersisted to) void
createNode
(String path, byte[] data, List<ACL> acl, long ephemeralOwner, int parentCVersion, long zxid, long time) Add a new node to the DataTree.void
createNode
(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 StatPersisted
createStat
(long zxid, long time, long ephemeralOwner) Create a node stat from the given params.void
deleteNode
(String path, long zxid) remove the path from the datatreevoid
deserialize
(InputArchive ia, String tag) boolean
deserializeZxidDigest
(InputArchive ia, long startZxidOfSnapshot) Deserializing the zxid digest from the input stream and update the digestFromLoadedSnapshot.void
dumpEphemerals
(PrintWriter pwriter) Write a text dump of all the ephemerals in the datatree.void
dumpWatches
(PrintWriter pwriter, boolean byPath) Write a text dump of all the watches on the datatree.void
dumpWatchesSummary
(PrintWriter pwriter) Summary of the watches on the datatree.int
getAllChildrenNumber
(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) int
getMaxPrefixWithQuota
(String path) If there is a quota set, return the appropriate prefix for that quota Else return nullint
long
getTtls()
int
Returns 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) void
removeCnxn
(Watcher watcher) boolean
removeWatch
(String path, Watcher.WatcherType type, Watcher watcher) void
reportDigestMismatch
(long zxid) Reports any mismatch in the transaction digest.void
serialize
(OutputArchive oa, String tag) void
void
serializeNodeData
(OutputArchive oa, String path, DataNode node) void
boolean
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.void
setCversionPzxid
(String path, int newCversion, long zxid) This method sets the Cversion and Pzxid for the specified node to the values passed as arguments.void
setWatches
(long relativeZxid, List<String> dataWatches, List<String> existWatches, List<String> childWatches, List<String> persistentWatches, List<String> persistentRecursiveWatches, Watcher watcher) void
void
updateQuotaStat
(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's 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.NodeExistsException
KeeperException.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.NodeExistsException
KeeperException.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:
pwriter
- the output to write to
-
dumpWatches
Write a text dump of all the watches on the datatree. Warning, this is expensive, use sparingly!- Parameters:
pwriter
- 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:
pwriter
- 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
-
compareSnapshotDigests
public void compareSnapshotDigests(long zxid) Compares the actual tree's digest with that in the snapshot. Resets digestFromLoadedSnapshot after comparision.- 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
-