| <!DOCTYPE HTML> |
| <html lang="en"> |
| <head> |
| <!-- Generated by javadoc (17) --> |
| <title>Source code</title> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <meta name="description" content="source: package: org.apache.hadoop.hbase.zookeeper, class: ZKUtil, class: NodeAndData"> |
| <meta name="generator" content="javadoc/SourceToHTMLConverter"> |
| <link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style"> |
| </head> |
| <body class="source-page"> |
| <main role="main"> |
| <div class="source-container"> |
| <pre><span class="source-line-no">001</span><span id="line-1">/*</span> |
| <span class="source-line-no">002</span><span id="line-2"> * Licensed to the Apache Software Foundation (ASF) under one</span> |
| <span class="source-line-no">003</span><span id="line-3"> * or more contributor license agreements. See the NOTICE file</span> |
| <span class="source-line-no">004</span><span id="line-4"> * distributed with this work for additional information</span> |
| <span class="source-line-no">005</span><span id="line-5"> * regarding copyright ownership. The ASF licenses this file</span> |
| <span class="source-line-no">006</span><span id="line-6"> * to you under the Apache License, Version 2.0 (the</span> |
| <span class="source-line-no">007</span><span id="line-7"> * "License"); you may not use this file except in compliance</span> |
| <span class="source-line-no">008</span><span id="line-8"> * with the License. You may obtain a copy of the License at</span> |
| <span class="source-line-no">009</span><span id="line-9"> *</span> |
| <span class="source-line-no">010</span><span id="line-10"> * http://www.apache.org/licenses/LICENSE-2.0</span> |
| <span class="source-line-no">011</span><span id="line-11"> *</span> |
| <span class="source-line-no">012</span><span id="line-12"> * Unless required by applicable law or agreed to in writing, software</span> |
| <span class="source-line-no">013</span><span id="line-13"> * distributed under the License is distributed on an "AS IS" BASIS,</span> |
| <span class="source-line-no">014</span><span id="line-14"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span> |
| <span class="source-line-no">015</span><span id="line-15"> * See the License for the specific language governing permissions and</span> |
| <span class="source-line-no">016</span><span id="line-16"> * limitations under the License.</span> |
| <span class="source-line-no">017</span><span id="line-17"> */</span> |
| <span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase.zookeeper;</span> |
| <span class="source-line-no">019</span><span id="line-19"></span> |
| <span class="source-line-no">020</span><span id="line-20">import java.io.IOException;</span> |
| <span class="source-line-no">021</span><span id="line-21">import java.util.ArrayList;</span> |
| <span class="source-line-no">022</span><span id="line-22">import java.util.Arrays;</span> |
| <span class="source-line-no">023</span><span id="line-23">import java.util.Collections;</span> |
| <span class="source-line-no">024</span><span id="line-24">import java.util.Deque;</span> |
| <span class="source-line-no">025</span><span id="line-25">import java.util.Iterator;</span> |
| <span class="source-line-no">026</span><span id="line-26">import java.util.LinkedList;</span> |
| <span class="source-line-no">027</span><span id="line-27">import java.util.List;</span> |
| <span class="source-line-no">028</span><span id="line-28">import java.util.stream.Collectors;</span> |
| <span class="source-line-no">029</span><span id="line-29">import org.apache.commons.lang3.StringUtils;</span> |
| <span class="source-line-no">030</span><span id="line-30">import org.apache.hadoop.conf.Configuration;</span> |
| <span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.hbase.HConstants;</span> |
| <span class="source-line-no">032</span><span id="line-32">import org.apache.hadoop.hbase.exceptions.DeserializationException;</span> |
| <span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.util.Bytes;</span> |
| <span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.util.Threads;</span> |
| <span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.zookeeper.ZKUtil.ZKUtilOp.CreateAndFailSilent;</span> |
| <span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.zookeeper.ZKUtil.ZKUtilOp.DeleteNodeFailSilent;</span> |
| <span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.zookeeper.ZKUtil.ZKUtilOp.SetData;</span> |
| <span class="source-line-no">038</span><span id="line-38">import org.apache.yetus.audience.InterfaceAudience;</span> |
| <span class="source-line-no">039</span><span id="line-39">import org.apache.zookeeper.AsyncCallback;</span> |
| <span class="source-line-no">040</span><span id="line-40">import org.apache.zookeeper.CreateMode;</span> |
| <span class="source-line-no">041</span><span id="line-41">import org.apache.zookeeper.KeeperException;</span> |
| <span class="source-line-no">042</span><span id="line-42">import org.apache.zookeeper.KeeperException.NoNodeException;</span> |
| <span class="source-line-no">043</span><span id="line-43">import org.apache.zookeeper.Op;</span> |
| <span class="source-line-no">044</span><span id="line-44">import org.apache.zookeeper.ZooKeeper;</span> |
| <span class="source-line-no">045</span><span id="line-45">import org.apache.zookeeper.data.Stat;</span> |
| <span class="source-line-no">046</span><span id="line-46">import org.apache.zookeeper.proto.CreateRequest;</span> |
| <span class="source-line-no">047</span><span id="line-47">import org.apache.zookeeper.proto.DeleteRequest;</span> |
| <span class="source-line-no">048</span><span id="line-48">import org.apache.zookeeper.proto.SetDataRequest;</span> |
| <span class="source-line-no">049</span><span id="line-49">import org.slf4j.Logger;</span> |
| <span class="source-line-no">050</span><span id="line-50">import org.slf4j.LoggerFactory;</span> |
| <span class="source-line-no">051</span><span id="line-51"></span> |
| <span class="source-line-no">052</span><span id="line-52">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span> |
| <span class="source-line-no">053</span><span id="line-53">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos;</span> |
| <span class="source-line-no">054</span><span id="line-54"></span> |
| <span class="source-line-no">055</span><span id="line-55">/**</span> |
| <span class="source-line-no">056</span><span id="line-56"> * Internal HBase utility class for ZooKeeper.</span> |
| <span class="source-line-no">057</span><span id="line-57"> * <p></span> |
| <span class="source-line-no">058</span><span id="line-58"> * Contains only static methods and constants.</span> |
| <span class="source-line-no">059</span><span id="line-59"> * <p></span> |
| <span class="source-line-no">060</span><span id="line-60"> * Methods all throw {@link KeeperException} if there is an unexpected zookeeper exception, so</span> |
| <span class="source-line-no">061</span><span id="line-61"> * callers of these methods must handle appropriately. If ZK is required for the operation, the</span> |
| <span class="source-line-no">062</span><span id="line-62"> * server will need to be aborted.</span> |
| <span class="source-line-no">063</span><span id="line-63"> */</span> |
| <span class="source-line-no">064</span><span id="line-64">@InterfaceAudience.Private</span> |
| <span class="source-line-no">065</span><span id="line-65">public final class ZKUtil {</span> |
| <span class="source-line-no">066</span><span id="line-66"> private static final Logger LOG = LoggerFactory.getLogger(ZKUtil.class);</span> |
| <span class="source-line-no">067</span><span id="line-67"></span> |
| <span class="source-line-no">068</span><span id="line-68"> private ZKUtil() {</span> |
| <span class="source-line-no">069</span><span id="line-69"> }</span> |
| <span class="source-line-no">070</span><span id="line-70"></span> |
| <span class="source-line-no">071</span><span id="line-71"> //</span> |
| <span class="source-line-no">072</span><span id="line-72"> // Helper methods</span> |
| <span class="source-line-no">073</span><span id="line-73"> //</span> |
| <span class="source-line-no">074</span><span id="line-74"> /**</span> |
| <span class="source-line-no">075</span><span id="line-75"> * Returns the full path of the immediate parent of the specified node.</span> |
| <span class="source-line-no">076</span><span id="line-76"> * @param node path to get parent of</span> |
| <span class="source-line-no">077</span><span id="line-77"> * @return parent of path, null if passed the root node or an invalid node</span> |
| <span class="source-line-no">078</span><span id="line-78"> */</span> |
| <span class="source-line-no">079</span><span id="line-79"> public static String getParent(String node) {</span> |
| <span class="source-line-no">080</span><span id="line-80"> int idx = node.lastIndexOf(ZNodePaths.ZNODE_PATH_SEPARATOR);</span> |
| <span class="source-line-no">081</span><span id="line-81"> return idx <= 0 ? null : node.substring(0, idx);</span> |
| <span class="source-line-no">082</span><span id="line-82"> }</span> |
| <span class="source-line-no">083</span><span id="line-83"></span> |
| <span class="source-line-no">084</span><span id="line-84"> /**</span> |
| <span class="source-line-no">085</span><span id="line-85"> * Get the name of the current node from the specified fully-qualified path.</span> |
| <span class="source-line-no">086</span><span id="line-86"> * @param path fully-qualified path</span> |
| <span class="source-line-no">087</span><span id="line-87"> * @return name of the current node</span> |
| <span class="source-line-no">088</span><span id="line-88"> */</span> |
| <span class="source-line-no">089</span><span id="line-89"> public static String getNodeName(String path) {</span> |
| <span class="source-line-no">090</span><span id="line-90"> return path.substring(path.lastIndexOf("/") + 1);</span> |
| <span class="source-line-no">091</span><span id="line-91"> }</span> |
| <span class="source-line-no">092</span><span id="line-92"></span> |
| <span class="source-line-no">093</span><span id="line-93"> //</span> |
| <span class="source-line-no">094</span><span id="line-94"> // Existence checks and watches</span> |
| <span class="source-line-no">095</span><span id="line-95"> //</span> |
| <span class="source-line-no">096</span><span id="line-96"></span> |
| <span class="source-line-no">097</span><span id="line-97"> /**</span> |
| <span class="source-line-no">098</span><span id="line-98"> * Watch the specified znode for delete/create/change events. The watcher is set whether or not</span> |
| <span class="source-line-no">099</span><span id="line-99"> * the node exists. If the node already exists, the method returns true. If the node does not</span> |
| <span class="source-line-no">100</span><span id="line-100"> * exist, the method returns false.</span> |
| <span class="source-line-no">101</span><span id="line-101"> * @param zkw zk reference</span> |
| <span class="source-line-no">102</span><span id="line-102"> * @param znode path of node to watch</span> |
| <span class="source-line-no">103</span><span id="line-103"> * @return true if znode exists, false if does not exist or error</span> |
| <span class="source-line-no">104</span><span id="line-104"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">105</span><span id="line-105"> */</span> |
| <span class="source-line-no">106</span><span id="line-106"> public static boolean watchAndCheckExists(ZKWatcher zkw, String znode) throws KeeperException {</span> |
| <span class="source-line-no">107</span><span id="line-107"> try {</span> |
| <span class="source-line-no">108</span><span id="line-108"> Stat s = zkw.getRecoverableZooKeeper().exists(znode, zkw);</span> |
| <span class="source-line-no">109</span><span id="line-109"> boolean exists = s != null;</span> |
| <span class="source-line-no">110</span><span id="line-110"> if (exists) {</span> |
| <span class="source-line-no">111</span><span id="line-111"> LOG.debug(zkw.prefix("Set watcher on existing znode=" + znode));</span> |
| <span class="source-line-no">112</span><span id="line-112"> } else {</span> |
| <span class="source-line-no">113</span><span id="line-113"> LOG.debug(zkw.prefix("Set watcher on znode that does not yet exist, " + znode));</span> |
| <span class="source-line-no">114</span><span id="line-114"> }</span> |
| <span class="source-line-no">115</span><span id="line-115"> return exists;</span> |
| <span class="source-line-no">116</span><span id="line-116"> } catch (KeeperException e) {</span> |
| <span class="source-line-no">117</span><span id="line-117"> LOG.warn(zkw.prefix("Unable to set watcher on znode " + znode), e);</span> |
| <span class="source-line-no">118</span><span id="line-118"> zkw.keeperException(e);</span> |
| <span class="source-line-no">119</span><span id="line-119"> return false;</span> |
| <span class="source-line-no">120</span><span id="line-120"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">121</span><span id="line-121"> LOG.warn(zkw.prefix("Unable to set watcher on znode " + znode), e);</span> |
| <span class="source-line-no">122</span><span id="line-122"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">123</span><span id="line-123"> return false;</span> |
| <span class="source-line-no">124</span><span id="line-124"> }</span> |
| <span class="source-line-no">125</span><span id="line-125"> }</span> |
| <span class="source-line-no">126</span><span id="line-126"></span> |
| <span class="source-line-no">127</span><span id="line-127"> /**</span> |
| <span class="source-line-no">128</span><span id="line-128"> * Watch the specified znode, but only if exists. Useful when watching for deletions. Uses</span> |
| <span class="source-line-no">129</span><span id="line-129"> * .getData() (and handles NoNodeException) instead of .exists() to accomplish this, as .getData()</span> |
| <span class="source-line-no">130</span><span id="line-130"> * will only set a watch if the znode exists.</span> |
| <span class="source-line-no">131</span><span id="line-131"> * @param zkw zk reference</span> |
| <span class="source-line-no">132</span><span id="line-132"> * @param znode path of node to watch</span> |
| <span class="source-line-no">133</span><span id="line-133"> * @return true if the watch is set, false if node does not exists</span> |
| <span class="source-line-no">134</span><span id="line-134"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">135</span><span id="line-135"> */</span> |
| <span class="source-line-no">136</span><span id="line-136"> public static boolean setWatchIfNodeExists(ZKWatcher zkw, String znode) throws KeeperException {</span> |
| <span class="source-line-no">137</span><span id="line-137"> try {</span> |
| <span class="source-line-no">138</span><span id="line-138"> zkw.getRecoverableZooKeeper().getData(znode, true, null);</span> |
| <span class="source-line-no">139</span><span id="line-139"> return true;</span> |
| <span class="source-line-no">140</span><span id="line-140"> } catch (NoNodeException e) {</span> |
| <span class="source-line-no">141</span><span id="line-141"> return false;</span> |
| <span class="source-line-no">142</span><span id="line-142"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">143</span><span id="line-143"> LOG.warn(zkw.prefix("Unable to set watcher on znode " + znode), e);</span> |
| <span class="source-line-no">144</span><span id="line-144"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">145</span><span id="line-145"> return false;</span> |
| <span class="source-line-no">146</span><span id="line-146"> }</span> |
| <span class="source-line-no">147</span><span id="line-147"> }</span> |
| <span class="source-line-no">148</span><span id="line-148"></span> |
| <span class="source-line-no">149</span><span id="line-149"> /**</span> |
| <span class="source-line-no">150</span><span id="line-150"> * Check if the specified node exists. Sets no watches.</span> |
| <span class="source-line-no">151</span><span id="line-151"> * @param zkw zk reference</span> |
| <span class="source-line-no">152</span><span id="line-152"> * @param znode path of node to watch</span> |
| <span class="source-line-no">153</span><span id="line-153"> * @return version of the node if it exists, -1 if does not exist</span> |
| <span class="source-line-no">154</span><span id="line-154"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">155</span><span id="line-155"> */</span> |
| <span class="source-line-no">156</span><span id="line-156"> public static int checkExists(ZKWatcher zkw, String znode) throws KeeperException {</span> |
| <span class="source-line-no">157</span><span id="line-157"> try {</span> |
| <span class="source-line-no">158</span><span id="line-158"> Stat s = zkw.getRecoverableZooKeeper().exists(znode, null);</span> |
| <span class="source-line-no">159</span><span id="line-159"> return s != null ? s.getVersion() : -1;</span> |
| <span class="source-line-no">160</span><span id="line-160"> } catch (KeeperException e) {</span> |
| <span class="source-line-no">161</span><span id="line-161"> LOG.warn(zkw.prefix("Unable to set watcher on znode (" + znode + ")"), e);</span> |
| <span class="source-line-no">162</span><span id="line-162"> zkw.keeperException(e);</span> |
| <span class="source-line-no">163</span><span id="line-163"> return -1;</span> |
| <span class="source-line-no">164</span><span id="line-164"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">165</span><span id="line-165"> LOG.warn(zkw.prefix("Unable to set watcher on znode (" + znode + ")"), e);</span> |
| <span class="source-line-no">166</span><span id="line-166"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">167</span><span id="line-167"> return -1;</span> |
| <span class="source-line-no">168</span><span id="line-168"> }</span> |
| <span class="source-line-no">169</span><span id="line-169"> }</span> |
| <span class="source-line-no">170</span><span id="line-170"></span> |
| <span class="source-line-no">171</span><span id="line-171"> //</span> |
| <span class="source-line-no">172</span><span id="line-172"> // Znode listings</span> |
| <span class="source-line-no">173</span><span id="line-173"> //</span> |
| <span class="source-line-no">174</span><span id="line-174"></span> |
| <span class="source-line-no">175</span><span id="line-175"> /**</span> |
| <span class="source-line-no">176</span><span id="line-176"> * Lists the children znodes of the specified znode. Also sets a watch on the specified znode</span> |
| <span class="source-line-no">177</span><span id="line-177"> * which will capture a NodeDeleted event on the specified znode as well as NodeChildrenChanged if</span> |
| <span class="source-line-no">178</span><span id="line-178"> * any children of the specified znode are created or deleted. Returns null if the specified node</span> |
| <span class="source-line-no">179</span><span id="line-179"> * does not exist. Otherwise returns a list of children of the specified node. If the node exists</span> |
| <span class="source-line-no">180</span><span id="line-180"> * but it has no children, an empty list will be returned.</span> |
| <span class="source-line-no">181</span><span id="line-181"> * @param zkw zk reference</span> |
| <span class="source-line-no">182</span><span id="line-182"> * @param znode path of node to list and watch children of</span> |
| <span class="source-line-no">183</span><span id="line-183"> * @return list of children of the specified node, an empty list if the node exists but has no</span> |
| <span class="source-line-no">184</span><span id="line-184"> * children, and null if the node does not exist</span> |
| <span class="source-line-no">185</span><span id="line-185"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">186</span><span id="line-186"> */</span> |
| <span class="source-line-no">187</span><span id="line-187"> public static List<String> listChildrenAndWatchForNewChildren(ZKWatcher zkw, String znode)</span> |
| <span class="source-line-no">188</span><span id="line-188"> throws KeeperException {</span> |
| <span class="source-line-no">189</span><span id="line-189"> try {</span> |
| <span class="source-line-no">190</span><span id="line-190"> return zkw.getRecoverableZooKeeper().getChildren(znode, zkw);</span> |
| <span class="source-line-no">191</span><span id="line-191"> } catch (KeeperException.NoNodeException ke) {</span> |
| <span class="source-line-no">192</span><span id="line-192"> LOG.debug(zkw.prefix("Unable to list children of znode " + znode + " "</span> |
| <span class="source-line-no">193</span><span id="line-193"> + "because node does not exist (not an error)"));</span> |
| <span class="source-line-no">194</span><span id="line-194"> } catch (KeeperException e) {</span> |
| <span class="source-line-no">195</span><span id="line-195"> LOG.warn(zkw.prefix("Unable to list children of znode " + znode + " "), e);</span> |
| <span class="source-line-no">196</span><span id="line-196"> zkw.keeperException(e);</span> |
| <span class="source-line-no">197</span><span id="line-197"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">198</span><span id="line-198"> LOG.warn(zkw.prefix("Unable to list children of znode " + znode + " "), e);</span> |
| <span class="source-line-no">199</span><span id="line-199"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">200</span><span id="line-200"> }</span> |
| <span class="source-line-no">201</span><span id="line-201"></span> |
| <span class="source-line-no">202</span><span id="line-202"> return null;</span> |
| <span class="source-line-no">203</span><span id="line-203"> }</span> |
| <span class="source-line-no">204</span><span id="line-204"></span> |
| <span class="source-line-no">205</span><span id="line-205"> /**</span> |
| <span class="source-line-no">206</span><span id="line-206"> * List all the children of the specified znode, setting a watch for children changes and also</span> |
| <span class="source-line-no">207</span><span id="line-207"> * setting a watch on every individual child in order to get the NodeCreated and NodeDeleted</span> |
| <span class="source-line-no">208</span><span id="line-208"> * events.</span> |
| <span class="source-line-no">209</span><span id="line-209"> * @param zkw zookeeper reference</span> |
| <span class="source-line-no">210</span><span id="line-210"> * @param znode node to get children of and watch</span> |
| <span class="source-line-no">211</span><span id="line-211"> * @return list of znode names, null if the node doesn't exist</span> |
| <span class="source-line-no">212</span><span id="line-212"> * @throws KeeperException if a ZooKeeper operation fails</span> |
| <span class="source-line-no">213</span><span id="line-213"> */</span> |
| <span class="source-line-no">214</span><span id="line-214"> public static List<String> listChildrenAndWatchThem(ZKWatcher zkw, String znode)</span> |
| <span class="source-line-no">215</span><span id="line-215"> throws KeeperException {</span> |
| <span class="source-line-no">216</span><span id="line-216"> List<String> children = listChildrenAndWatchForNewChildren(zkw, znode);</span> |
| <span class="source-line-no">217</span><span id="line-217"> if (children == null) {</span> |
| <span class="source-line-no">218</span><span id="line-218"> return null;</span> |
| <span class="source-line-no">219</span><span id="line-219"> }</span> |
| <span class="source-line-no">220</span><span id="line-220"> for (String child : children) {</span> |
| <span class="source-line-no">221</span><span id="line-221"> watchAndCheckExists(zkw, ZNodePaths.joinZNode(znode, child));</span> |
| <span class="source-line-no">222</span><span id="line-222"> }</span> |
| <span class="source-line-no">223</span><span id="line-223"> return children;</span> |
| <span class="source-line-no">224</span><span id="line-224"> }</span> |
| <span class="source-line-no">225</span><span id="line-225"></span> |
| <span class="source-line-no">226</span><span id="line-226"> /**</span> |
| <span class="source-line-no">227</span><span id="line-227"> * Lists the children of the specified znode without setting any watches. Sets no watches at all,</span> |
| <span class="source-line-no">228</span><span id="line-228"> * this method is best effort. Returns an empty list if the node has no children. Returns null if</span> |
| <span class="source-line-no">229</span><span id="line-229"> * the parent node itself does not exist.</span> |
| <span class="source-line-no">230</span><span id="line-230"> * @param zkw zookeeper reference</span> |
| <span class="source-line-no">231</span><span id="line-231"> * @param znode node to get children</span> |
| <span class="source-line-no">232</span><span id="line-232"> * @return list of data of children of specified znode, empty if no children, null if parent does</span> |
| <span class="source-line-no">233</span><span id="line-233"> * not exist</span> |
| <span class="source-line-no">234</span><span id="line-234"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">235</span><span id="line-235"> */</span> |
| <span class="source-line-no">236</span><span id="line-236"> public static List<String> listChildrenNoWatch(ZKWatcher zkw, String znode)</span> |
| <span class="source-line-no">237</span><span id="line-237"> throws KeeperException {</span> |
| <span class="source-line-no">238</span><span id="line-238"> List<String> children = null;</span> |
| <span class="source-line-no">239</span><span id="line-239"> try {</span> |
| <span class="source-line-no">240</span><span id="line-240"> // List the children without watching</span> |
| <span class="source-line-no">241</span><span id="line-241"> children = zkw.getRecoverableZooKeeper().getChildren(znode, null);</span> |
| <span class="source-line-no">242</span><span id="line-242"> } catch (KeeperException.NoNodeException nne) {</span> |
| <span class="source-line-no">243</span><span id="line-243"> return null;</span> |
| <span class="source-line-no">244</span><span id="line-244"> } catch (InterruptedException ie) {</span> |
| <span class="source-line-no">245</span><span id="line-245"> zkw.interruptedException(ie);</span> |
| <span class="source-line-no">246</span><span id="line-246"> }</span> |
| <span class="source-line-no">247</span><span id="line-247"> return children;</span> |
| <span class="source-line-no">248</span><span id="line-248"> }</span> |
| <span class="source-line-no">249</span><span id="line-249"></span> |
| <span class="source-line-no">250</span><span id="line-250"> /**</span> |
| <span class="source-line-no">251</span><span id="line-251"> * Simple class to hold a node path and node data.</span> |
| <span class="source-line-no">252</span><span id="line-252"> * @deprecated Unused</span> |
| <span class="source-line-no">253</span><span id="line-253"> */</span> |
| <span class="source-line-no">254</span><span id="line-254"> @Deprecated</span> |
| <span class="source-line-no">255</span><span id="line-255"> public static class NodeAndData {</span> |
| <span class="source-line-no">256</span><span id="line-256"> private String node;</span> |
| <span class="source-line-no">257</span><span id="line-257"> private byte[] data;</span> |
| <span class="source-line-no">258</span><span id="line-258"></span> |
| <span class="source-line-no">259</span><span id="line-259"> public NodeAndData(String node, byte[] data) {</span> |
| <span class="source-line-no">260</span><span id="line-260"> this.node = node;</span> |
| <span class="source-line-no">261</span><span id="line-261"> this.data = data;</span> |
| <span class="source-line-no">262</span><span id="line-262"> }</span> |
| <span class="source-line-no">263</span><span id="line-263"></span> |
| <span class="source-line-no">264</span><span id="line-264"> public String getNode() {</span> |
| <span class="source-line-no">265</span><span id="line-265"> return node;</span> |
| <span class="source-line-no">266</span><span id="line-266"> }</span> |
| <span class="source-line-no">267</span><span id="line-267"></span> |
| <span class="source-line-no">268</span><span id="line-268"> public byte[] getData() {</span> |
| <span class="source-line-no">269</span><span id="line-269"> return data;</span> |
| <span class="source-line-no">270</span><span id="line-270"> }</span> |
| <span class="source-line-no">271</span><span id="line-271"></span> |
| <span class="source-line-no">272</span><span id="line-272"> @Override</span> |
| <span class="source-line-no">273</span><span id="line-273"> public String toString() {</span> |
| <span class="source-line-no">274</span><span id="line-274"> return node;</span> |
| <span class="source-line-no">275</span><span id="line-275"> }</span> |
| <span class="source-line-no">276</span><span id="line-276"></span> |
| <span class="source-line-no">277</span><span id="line-277"> public boolean isEmpty() {</span> |
| <span class="source-line-no">278</span><span id="line-278"> return (data == null || data.length == 0);</span> |
| <span class="source-line-no">279</span><span id="line-279"> }</span> |
| <span class="source-line-no">280</span><span id="line-280"> }</span> |
| <span class="source-line-no">281</span><span id="line-281"></span> |
| <span class="source-line-no">282</span><span id="line-282"> /**</span> |
| <span class="source-line-no">283</span><span id="line-283"> * Checks if the specified znode has any children. Sets no watches. Returns true if the node</span> |
| <span class="source-line-no">284</span><span id="line-284"> * exists and has children. Returns false if the node does not exist or if the node does not have</span> |
| <span class="source-line-no">285</span><span id="line-285"> * any children. Used during master initialization to determine if the master is a failed-over-to</span> |
| <span class="source-line-no">286</span><span id="line-286"> * master or the first master during initial cluster startup. If the directory for regionserver</span> |
| <span class="source-line-no">287</span><span id="line-287"> * ephemeral nodes is empty then this is a cluster startup, if not then it is not cluster startup.</span> |
| <span class="source-line-no">288</span><span id="line-288"> * @param zkw zk reference</span> |
| <span class="source-line-no">289</span><span id="line-289"> * @param znode path of node to check for children of</span> |
| <span class="source-line-no">290</span><span id="line-290"> * @return true if node has children, false if not or node does not exist</span> |
| <span class="source-line-no">291</span><span id="line-291"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">292</span><span id="line-292"> */</span> |
| <span class="source-line-no">293</span><span id="line-293"> public static boolean nodeHasChildren(ZKWatcher zkw, String znode) throws KeeperException {</span> |
| <span class="source-line-no">294</span><span id="line-294"> try {</span> |
| <span class="source-line-no">295</span><span id="line-295"> return !zkw.getRecoverableZooKeeper().getChildren(znode, null).isEmpty();</span> |
| <span class="source-line-no">296</span><span id="line-296"> } catch (KeeperException.NoNodeException ke) {</span> |
| <span class="source-line-no">297</span><span id="line-297"> LOG.debug(zkw.prefix("Unable to list children of znode " + znode</span> |
| <span class="source-line-no">298</span><span id="line-298"> + " because node does not exist (not an error)"));</span> |
| <span class="source-line-no">299</span><span id="line-299"> return false;</span> |
| <span class="source-line-no">300</span><span id="line-300"> } catch (KeeperException e) {</span> |
| <span class="source-line-no">301</span><span id="line-301"> LOG.warn(zkw.prefix("Unable to list children of znode " + znode), e);</span> |
| <span class="source-line-no">302</span><span id="line-302"> zkw.keeperException(e);</span> |
| <span class="source-line-no">303</span><span id="line-303"> return false;</span> |
| <span class="source-line-no">304</span><span id="line-304"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">305</span><span id="line-305"> LOG.warn(zkw.prefix("Unable to list children of znode " + znode), e);</span> |
| <span class="source-line-no">306</span><span id="line-306"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">307</span><span id="line-307"> return false;</span> |
| <span class="source-line-no">308</span><span id="line-308"> }</span> |
| <span class="source-line-no">309</span><span id="line-309"> }</span> |
| <span class="source-line-no">310</span><span id="line-310"></span> |
| <span class="source-line-no">311</span><span id="line-311"> /**</span> |
| <span class="source-line-no">312</span><span id="line-312"> * Get the number of children of the specified node. If the node does not exist or has no</span> |
| <span class="source-line-no">313</span><span id="line-313"> * children, returns 0. Sets no watches at all.</span> |
| <span class="source-line-no">314</span><span id="line-314"> * @param zkw zk reference</span> |
| <span class="source-line-no">315</span><span id="line-315"> * @param znode path of node to count children of</span> |
| <span class="source-line-no">316</span><span id="line-316"> * @return number of children of specified node, 0 if none or parent does not exist</span> |
| <span class="source-line-no">317</span><span id="line-317"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">318</span><span id="line-318"> */</span> |
| <span class="source-line-no">319</span><span id="line-319"> public static int getNumberOfChildren(ZKWatcher zkw, String znode) throws KeeperException {</span> |
| <span class="source-line-no">320</span><span id="line-320"> try {</span> |
| <span class="source-line-no">321</span><span id="line-321"> Stat stat = zkw.getRecoverableZooKeeper().exists(znode, null);</span> |
| <span class="source-line-no">322</span><span id="line-322"> return stat == null ? 0 : stat.getNumChildren();</span> |
| <span class="source-line-no">323</span><span id="line-323"> } catch (KeeperException e) {</span> |
| <span class="source-line-no">324</span><span id="line-324"> LOG.warn(zkw.prefix("Unable to get children of node " + znode));</span> |
| <span class="source-line-no">325</span><span id="line-325"> zkw.keeperException(e);</span> |
| <span class="source-line-no">326</span><span id="line-326"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">327</span><span id="line-327"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">328</span><span id="line-328"> }</span> |
| <span class="source-line-no">329</span><span id="line-329"> return 0;</span> |
| <span class="source-line-no">330</span><span id="line-330"> }</span> |
| <span class="source-line-no">331</span><span id="line-331"></span> |
| <span class="source-line-no">332</span><span id="line-332"> //</span> |
| <span class="source-line-no">333</span><span id="line-333"> // Data retrieval</span> |
| <span class="source-line-no">334</span><span id="line-334"> //</span> |
| <span class="source-line-no">335</span><span id="line-335"></span> |
| <span class="source-line-no">336</span><span id="line-336"> /**</span> |
| <span class="source-line-no">337</span><span id="line-337"> * Get znode data. Does not set a watcher.</span> |
| <span class="source-line-no">338</span><span id="line-338"> * @return ZNode data, null if the node does not exist or if there is an error.</span> |
| <span class="source-line-no">339</span><span id="line-339"> */</span> |
| <span class="source-line-no">340</span><span id="line-340"> public static byte[] getData(ZKWatcher zkw, String znode)</span> |
| <span class="source-line-no">341</span><span id="line-341"> throws KeeperException, InterruptedException {</span> |
| <span class="source-line-no">342</span><span id="line-342"> try {</span> |
| <span class="source-line-no">343</span><span id="line-343"> byte[] data = zkw.getRecoverableZooKeeper().getData(znode, null, null);</span> |
| <span class="source-line-no">344</span><span id="line-344"> logRetrievedMsg(zkw, znode, data, false);</span> |
| <span class="source-line-no">345</span><span id="line-345"> return data;</span> |
| <span class="source-line-no">346</span><span id="line-346"> } catch (KeeperException.NoNodeException e) {</span> |
| <span class="source-line-no">347</span><span id="line-347"> LOG.debug(zkw.prefix("Unable to get data of znode " + znode + " "</span> |
| <span class="source-line-no">348</span><span id="line-348"> + "because node does not exist (not an error)"));</span> |
| <span class="source-line-no">349</span><span id="line-349"> return null;</span> |
| <span class="source-line-no">350</span><span id="line-350"> } catch (KeeperException e) {</span> |
| <span class="source-line-no">351</span><span id="line-351"> LOG.warn(zkw.prefix("Unable to get data of znode " + znode), e);</span> |
| <span class="source-line-no">352</span><span id="line-352"> zkw.keeperException(e);</span> |
| <span class="source-line-no">353</span><span id="line-353"> return null;</span> |
| <span class="source-line-no">354</span><span id="line-354"> }</span> |
| <span class="source-line-no">355</span><span id="line-355"> }</span> |
| <span class="source-line-no">356</span><span id="line-356"></span> |
| <span class="source-line-no">357</span><span id="line-357"> /**</span> |
| <span class="source-line-no">358</span><span id="line-358"> * Get the data at the specified znode and set a watch. Returns the data and sets a watch if the</span> |
| <span class="source-line-no">359</span><span id="line-359"> * node exists. Returns null and no watch is set if the node does not exist or there is an</span> |
| <span class="source-line-no">360</span><span id="line-360"> * exception.</span> |
| <span class="source-line-no">361</span><span id="line-361"> * @param zkw zk reference</span> |
| <span class="source-line-no">362</span><span id="line-362"> * @param znode path of node</span> |
| <span class="source-line-no">363</span><span id="line-363"> * @return data of the specified znode, or null</span> |
| <span class="source-line-no">364</span><span id="line-364"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">365</span><span id="line-365"> */</span> |
| <span class="source-line-no">366</span><span id="line-366"> public static byte[] getDataAndWatch(ZKWatcher zkw, String znode) throws KeeperException {</span> |
| <span class="source-line-no">367</span><span id="line-367"> return getDataInternal(zkw, znode, null, true, true);</span> |
| <span class="source-line-no">368</span><span id="line-368"> }</span> |
| <span class="source-line-no">369</span><span id="line-369"></span> |
| <span class="source-line-no">370</span><span id="line-370"> /**</span> |
| <span class="source-line-no">371</span><span id="line-371"> * Get the data at the specified znode and set a watch. Returns the data and sets a watch if the</span> |
| <span class="source-line-no">372</span><span id="line-372"> * node exists. Returns null and no watch is set if the node does not exist or there is an</span> |
| <span class="source-line-no">373</span><span id="line-373"> * exception.</span> |
| <span class="source-line-no">374</span><span id="line-374"> * @param zkw zk reference</span> |
| <span class="source-line-no">375</span><span id="line-375"> * @param znode path of node</span> |
| <span class="source-line-no">376</span><span id="line-376"> * @param throwOnInterrupt if false then just interrupt the thread, do not throw exception</span> |
| <span class="source-line-no">377</span><span id="line-377"> * @return data of the specified znode, or null</span> |
| <span class="source-line-no">378</span><span id="line-378"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">379</span><span id="line-379"> */</span> |
| <span class="source-line-no">380</span><span id="line-380"> public static byte[] getDataAndWatch(ZKWatcher zkw, String znode, boolean throwOnInterrupt)</span> |
| <span class="source-line-no">381</span><span id="line-381"> throws KeeperException {</span> |
| <span class="source-line-no">382</span><span id="line-382"> return getDataInternal(zkw, znode, null, true, throwOnInterrupt);</span> |
| <span class="source-line-no">383</span><span id="line-383"> }</span> |
| <span class="source-line-no">384</span><span id="line-384"></span> |
| <span class="source-line-no">385</span><span id="line-385"> /**</span> |
| <span class="source-line-no">386</span><span id="line-386"> * Get the data at the specified znode and set a watch. Returns the data and sets a watch if the</span> |
| <span class="source-line-no">387</span><span id="line-387"> * node exists. Returns null and no watch is set if the node does not exist or there is an</span> |
| <span class="source-line-no">388</span><span id="line-388"> * exception.</span> |
| <span class="source-line-no">389</span><span id="line-389"> * @param zkw zk reference</span> |
| <span class="source-line-no">390</span><span id="line-390"> * @param znode path of node</span> |
| <span class="source-line-no">391</span><span id="line-391"> * @param stat object to populate the version of the znode</span> |
| <span class="source-line-no">392</span><span id="line-392"> * @return data of the specified znode, or null</span> |
| <span class="source-line-no">393</span><span id="line-393"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">394</span><span id="line-394"> */</span> |
| <span class="source-line-no">395</span><span id="line-395"> public static byte[] getDataAndWatch(ZKWatcher zkw, String znode, Stat stat)</span> |
| <span class="source-line-no">396</span><span id="line-396"> throws KeeperException {</span> |
| <span class="source-line-no">397</span><span id="line-397"> return getDataInternal(zkw, znode, stat, true, true);</span> |
| <span class="source-line-no">398</span><span id="line-398"> }</span> |
| <span class="source-line-no">399</span><span id="line-399"></span> |
| <span class="source-line-no">400</span><span id="line-400"> private static byte[] getDataInternal(ZKWatcher zkw, String znode, Stat stat, boolean watcherSet,</span> |
| <span class="source-line-no">401</span><span id="line-401"> boolean throwOnInterrupt) throws KeeperException {</span> |
| <span class="source-line-no">402</span><span id="line-402"> try {</span> |
| <span class="source-line-no">403</span><span id="line-403"> byte[] data = zkw.getRecoverableZooKeeper().getData(znode, zkw, stat);</span> |
| <span class="source-line-no">404</span><span id="line-404"> logRetrievedMsg(zkw, znode, data, watcherSet);</span> |
| <span class="source-line-no">405</span><span id="line-405"> return data;</span> |
| <span class="source-line-no">406</span><span id="line-406"> } catch (KeeperException.NoNodeException e) {</span> |
| <span class="source-line-no">407</span><span id="line-407"> // This log can get pretty annoying when we cycle on 100ms waits.</span> |
| <span class="source-line-no">408</span><span id="line-408"> // Enable trace if you really want to see it.</span> |
| <span class="source-line-no">409</span><span id="line-409"> LOG.trace(zkw.prefix("Unable to get data of znode " + znode + " "</span> |
| <span class="source-line-no">410</span><span id="line-410"> + "because node does not exist (not an error)"));</span> |
| <span class="source-line-no">411</span><span id="line-411"> return null;</span> |
| <span class="source-line-no">412</span><span id="line-412"> } catch (KeeperException e) {</span> |
| <span class="source-line-no">413</span><span id="line-413"> LOG.warn(zkw.prefix("Unable to get data of znode " + znode), e);</span> |
| <span class="source-line-no">414</span><span id="line-414"> zkw.keeperException(e);</span> |
| <span class="source-line-no">415</span><span id="line-415"> return null;</span> |
| <span class="source-line-no">416</span><span id="line-416"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">417</span><span id="line-417"> LOG.warn(zkw.prefix("Unable to get data of znode " + znode), e);</span> |
| <span class="source-line-no">418</span><span id="line-418"> if (throwOnInterrupt) {</span> |
| <span class="source-line-no">419</span><span id="line-419"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">420</span><span id="line-420"> } else {</span> |
| <span class="source-line-no">421</span><span id="line-421"> zkw.interruptedExceptionNoThrow(e, true);</span> |
| <span class="source-line-no">422</span><span id="line-422"> }</span> |
| <span class="source-line-no">423</span><span id="line-423"> return null;</span> |
| <span class="source-line-no">424</span><span id="line-424"> }</span> |
| <span class="source-line-no">425</span><span id="line-425"> }</span> |
| <span class="source-line-no">426</span><span id="line-426"></span> |
| <span class="source-line-no">427</span><span id="line-427"> /**</span> |
| <span class="source-line-no">428</span><span id="line-428"> * Get the data at the specified znode without setting a watch. Returns the data if the node</span> |
| <span class="source-line-no">429</span><span id="line-429"> * exists. Returns null if the node does not exist. Sets the stats of the node in the passed Stat</span> |
| <span class="source-line-no">430</span><span id="line-430"> * object. Pass a null stat if not interested.</span> |
| <span class="source-line-no">431</span><span id="line-431"> * @param zkw zk reference</span> |
| <span class="source-line-no">432</span><span id="line-432"> * @param znode path of node</span> |
| <span class="source-line-no">433</span><span id="line-433"> * @param stat node status to get if node exists</span> |
| <span class="source-line-no">434</span><span id="line-434"> * @return data of the specified znode, or null if node does not exist</span> |
| <span class="source-line-no">435</span><span id="line-435"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">436</span><span id="line-436"> */</span> |
| <span class="source-line-no">437</span><span id="line-437"> public static byte[] getDataNoWatch(ZKWatcher zkw, String znode, Stat stat)</span> |
| <span class="source-line-no">438</span><span id="line-438"> throws KeeperException {</span> |
| <span class="source-line-no">439</span><span id="line-439"> try {</span> |
| <span class="source-line-no">440</span><span id="line-440"> byte[] data = zkw.getRecoverableZooKeeper().getData(znode, null, stat);</span> |
| <span class="source-line-no">441</span><span id="line-441"> logRetrievedMsg(zkw, znode, data, false);</span> |
| <span class="source-line-no">442</span><span id="line-442"> return data;</span> |
| <span class="source-line-no">443</span><span id="line-443"> } catch (KeeperException.NoNodeException e) {</span> |
| <span class="source-line-no">444</span><span id="line-444"> LOG.debug(zkw.prefix("Unable to get data of znode " + znode + " "</span> |
| <span class="source-line-no">445</span><span id="line-445"> + "because node does not exist (not necessarily an error)"));</span> |
| <span class="source-line-no">446</span><span id="line-446"> return null;</span> |
| <span class="source-line-no">447</span><span id="line-447"> } catch (KeeperException e) {</span> |
| <span class="source-line-no">448</span><span id="line-448"> LOG.warn(zkw.prefix("Unable to get data of znode " + znode), e);</span> |
| <span class="source-line-no">449</span><span id="line-449"> zkw.keeperException(e);</span> |
| <span class="source-line-no">450</span><span id="line-450"> return null;</span> |
| <span class="source-line-no">451</span><span id="line-451"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">452</span><span id="line-452"> LOG.warn(zkw.prefix("Unable to get data of znode " + znode), e);</span> |
| <span class="source-line-no">453</span><span id="line-453"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">454</span><span id="line-454"> return null;</span> |
| <span class="source-line-no">455</span><span id="line-455"> }</span> |
| <span class="source-line-no">456</span><span id="line-456"> }</span> |
| <span class="source-line-no">457</span><span id="line-457"></span> |
| <span class="source-line-no">458</span><span id="line-458"> /**</span> |
| <span class="source-line-no">459</span><span id="line-459"> * Returns the date of child znodes of the specified znode. Also sets a watch on the specified</span> |
| <span class="source-line-no">460</span><span id="line-460"> * znode which will capture a NodeDeleted event on the specified znode as well as</span> |
| <span class="source-line-no">461</span><span id="line-461"> * NodeChildrenChanged if any children of the specified znode are created or deleted. Returns null</span> |
| <span class="source-line-no">462</span><span id="line-462"> * if the specified node does not exist. Otherwise returns a list of children of the specified</span> |
| <span class="source-line-no">463</span><span id="line-463"> * node. If the node exists but it has no children, an empty list will be returned.</span> |
| <span class="source-line-no">464</span><span id="line-464"> * @param zkw zk reference</span> |
| <span class="source-line-no">465</span><span id="line-465"> * @param baseNode path of node to list and watch children of</span> |
| <span class="source-line-no">466</span><span id="line-466"> * @return list of data of children of the specified node, an empty list if the node exists but</span> |
| <span class="source-line-no">467</span><span id="line-467"> * has no children, and null if the node does not exist</span> |
| <span class="source-line-no">468</span><span id="line-468"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">469</span><span id="line-469"> * @deprecated Unused</span> |
| <span class="source-line-no">470</span><span id="line-470"> */</span> |
| <span class="source-line-no">471</span><span id="line-471"> @Deprecated</span> |
| <span class="source-line-no">472</span><span id="line-472"> public static List<NodeAndData> getChildDataAndWatchForNewChildren(ZKWatcher zkw, String baseNode)</span> |
| <span class="source-line-no">473</span><span id="line-473"> throws KeeperException {</span> |
| <span class="source-line-no">474</span><span id="line-474"> return getChildDataAndWatchForNewChildren(zkw, baseNode, true);</span> |
| <span class="source-line-no">475</span><span id="line-475"> }</span> |
| <span class="source-line-no">476</span><span id="line-476"></span> |
| <span class="source-line-no">477</span><span id="line-477"> /**</span> |
| <span class="source-line-no">478</span><span id="line-478"> * Returns the date of child znodes of the specified znode. Also sets a watch on the specified</span> |
| <span class="source-line-no">479</span><span id="line-479"> * znode which will capture a NodeDeleted event on the specified znode as well as</span> |
| <span class="source-line-no">480</span><span id="line-480"> * NodeChildrenChanged if any children of the specified znode are created or deleted. Returns null</span> |
| <span class="source-line-no">481</span><span id="line-481"> * if the specified node does not exist. Otherwise returns a list of children of the specified</span> |
| <span class="source-line-no">482</span><span id="line-482"> * node. If the node exists but it has no children, an empty list will be returned.</span> |
| <span class="source-line-no">483</span><span id="line-483"> * @param zkw zk reference</span> |
| <span class="source-line-no">484</span><span id="line-484"> * @param baseNode path of node to list and watch children of</span> |
| <span class="source-line-no">485</span><span id="line-485"> * @param throwOnInterrupt if true then just interrupt the thread, do not throw exception</span> |
| <span class="source-line-no">486</span><span id="line-486"> * @return list of data of children of the specified node, an empty list if the node exists but</span> |
| <span class="source-line-no">487</span><span id="line-487"> * has no children, and null if the node does not exist</span> |
| <span class="source-line-no">488</span><span id="line-488"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">489</span><span id="line-489"> * @deprecated Unused</span> |
| <span class="source-line-no">490</span><span id="line-490"> */</span> |
| <span class="source-line-no">491</span><span id="line-491"> @Deprecated</span> |
| <span class="source-line-no">492</span><span id="line-492"> public static List<NodeAndData> getChildDataAndWatchForNewChildren(ZKWatcher zkw, String baseNode,</span> |
| <span class="source-line-no">493</span><span id="line-493"> boolean throwOnInterrupt) throws KeeperException {</span> |
| <span class="source-line-no">494</span><span id="line-494"> List<String> nodes = ZKUtil.listChildrenAndWatchForNewChildren(zkw, baseNode);</span> |
| <span class="source-line-no">495</span><span id="line-495"> if (nodes != null) {</span> |
| <span class="source-line-no">496</span><span id="line-496"> List<NodeAndData> newNodes = new ArrayList<>();</span> |
| <span class="source-line-no">497</span><span id="line-497"> for (String node : nodes) {</span> |
| <span class="source-line-no">498</span><span id="line-498"> if (Thread.interrupted()) {</span> |
| <span class="source-line-no">499</span><span id="line-499"> // Partial data should not be processed. Cancel processing by sending empty list.</span> |
| <span class="source-line-no">500</span><span id="line-500"> return Collections.emptyList();</span> |
| <span class="source-line-no">501</span><span id="line-501"> }</span> |
| <span class="source-line-no">502</span><span id="line-502"> String nodePath = ZNodePaths.joinZNode(baseNode, node);</span> |
| <span class="source-line-no">503</span><span id="line-503"> byte[] data = ZKUtil.getDataAndWatch(zkw, nodePath, throwOnInterrupt);</span> |
| <span class="source-line-no">504</span><span id="line-504"> newNodes.add(new NodeAndData(nodePath, data));</span> |
| <span class="source-line-no">505</span><span id="line-505"> }</span> |
| <span class="source-line-no">506</span><span id="line-506"> return newNodes;</span> |
| <span class="source-line-no">507</span><span id="line-507"> }</span> |
| <span class="source-line-no">508</span><span id="line-508"> return null;</span> |
| <span class="source-line-no">509</span><span id="line-509"> }</span> |
| <span class="source-line-no">510</span><span id="line-510"></span> |
| <span class="source-line-no">511</span><span id="line-511"> /**</span> |
| <span class="source-line-no">512</span><span id="line-512"> * Update the data of an existing node with the expected version to have the specified data.</span> |
| <span class="source-line-no">513</span><span id="line-513"> * Throws an exception if there is a version mismatch or some other problem. Sets no watches under</span> |
| <span class="source-line-no">514</span><span id="line-514"> * any conditions.</span> |
| <span class="source-line-no">515</span><span id="line-515"> * @param zkw zk reference</span> |
| <span class="source-line-no">516</span><span id="line-516"> * @param znode the path to the ZNode</span> |
| <span class="source-line-no">517</span><span id="line-517"> * @param data the data to store in ZooKeeper</span> |
| <span class="source-line-no">518</span><span id="line-518"> * @param expectedVersion the expected version</span> |
| <span class="source-line-no">519</span><span id="line-519"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">520</span><span id="line-520"> * @throws KeeperException.BadVersionException if version mismatch</span> |
| <span class="source-line-no">521</span><span id="line-521"> * @deprecated Unused</span> |
| <span class="source-line-no">522</span><span id="line-522"> */</span> |
| <span class="source-line-no">523</span><span id="line-523"> @Deprecated</span> |
| <span class="source-line-no">524</span><span id="line-524"> public static void updateExistingNodeData(ZKWatcher zkw, String znode, byte[] data,</span> |
| <span class="source-line-no">525</span><span id="line-525"> int expectedVersion) throws KeeperException {</span> |
| <span class="source-line-no">526</span><span id="line-526"> try {</span> |
| <span class="source-line-no">527</span><span id="line-527"> zkw.getRecoverableZooKeeper().setData(znode, data, expectedVersion);</span> |
| <span class="source-line-no">528</span><span id="line-528"> } catch (InterruptedException ie) {</span> |
| <span class="source-line-no">529</span><span id="line-529"> zkw.interruptedException(ie);</span> |
| <span class="source-line-no">530</span><span id="line-530"> }</span> |
| <span class="source-line-no">531</span><span id="line-531"> }</span> |
| <span class="source-line-no">532</span><span id="line-532"></span> |
| <span class="source-line-no">533</span><span id="line-533"> //</span> |
| <span class="source-line-no">534</span><span id="line-534"> // Data setting</span> |
| <span class="source-line-no">535</span><span id="line-535"> //</span> |
| <span class="source-line-no">536</span><span id="line-536"></span> |
| <span class="source-line-no">537</span><span id="line-537"> /**</span> |
| <span class="source-line-no">538</span><span id="line-538"> * Sets the data of the existing znode to be the specified data. Ensures that the current data has</span> |
| <span class="source-line-no">539</span><span id="line-539"> * the specified expected version.</span> |
| <span class="source-line-no">540</span><span id="line-540"> * <p></span> |
| <span class="source-line-no">541</span><span id="line-541"> * If the node does not exist, a {@link NoNodeException} will be thrown.</span> |
| <span class="source-line-no">542</span><span id="line-542"> * <p></span> |
| <span class="source-line-no">543</span><span id="line-543"> * If their is a version mismatch, method returns null.</span> |
| <span class="source-line-no">544</span><span id="line-544"> * <p></span> |
| <span class="source-line-no">545</span><span id="line-545"> * No watches are set but setting data will trigger other watchers of this node.</span> |
| <span class="source-line-no">546</span><span id="line-546"> * <p></span> |
| <span class="source-line-no">547</span><span id="line-547"> * If there is another problem, a KeeperException will be thrown.</span> |
| <span class="source-line-no">548</span><span id="line-548"> * @param zkw zk reference</span> |
| <span class="source-line-no">549</span><span id="line-549"> * @param znode path of node</span> |
| <span class="source-line-no">550</span><span id="line-550"> * @param data data to set for node</span> |
| <span class="source-line-no">551</span><span id="line-551"> * @param expectedVersion version expected when setting data</span> |
| <span class="source-line-no">552</span><span id="line-552"> * @return true if data set, false if version mismatch</span> |
| <span class="source-line-no">553</span><span id="line-553"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">554</span><span id="line-554"> */</span> |
| <span class="source-line-no">555</span><span id="line-555"> public static boolean setData(ZKWatcher zkw, String znode, byte[] data, int expectedVersion)</span> |
| <span class="source-line-no">556</span><span id="line-556"> throws KeeperException, KeeperException.NoNodeException {</span> |
| <span class="source-line-no">557</span><span id="line-557"> try {</span> |
| <span class="source-line-no">558</span><span id="line-558"> return zkw.getRecoverableZooKeeper().setData(znode, data, expectedVersion) != null;</span> |
| <span class="source-line-no">559</span><span id="line-559"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">560</span><span id="line-560"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">561</span><span id="line-561"> return false;</span> |
| <span class="source-line-no">562</span><span id="line-562"> }</span> |
| <span class="source-line-no">563</span><span id="line-563"> }</span> |
| <span class="source-line-no">564</span><span id="line-564"></span> |
| <span class="source-line-no">565</span><span id="line-565"> /**</span> |
| <span class="source-line-no">566</span><span id="line-566"> * Set data into node creating node if it doesn't yet exist. Does not set watch.</span> |
| <span class="source-line-no">567</span><span id="line-567"> * @param zkw zk reference</span> |
| <span class="source-line-no">568</span><span id="line-568"> * @param znode path of node</span> |
| <span class="source-line-no">569</span><span id="line-569"> * @param data data to set for node</span> |
| <span class="source-line-no">570</span><span id="line-570"> * @throws KeeperException if a ZooKeeper operation fails</span> |
| <span class="source-line-no">571</span><span id="line-571"> */</span> |
| <span class="source-line-no">572</span><span id="line-572"> public static void createSetData(final ZKWatcher zkw, final String znode, final byte[] data)</span> |
| <span class="source-line-no">573</span><span id="line-573"> throws KeeperException {</span> |
| <span class="source-line-no">574</span><span id="line-574"> if (checkExists(zkw, znode) == -1) {</span> |
| <span class="source-line-no">575</span><span id="line-575"> ZKUtil.createWithParents(zkw, znode, data);</span> |
| <span class="source-line-no">576</span><span id="line-576"> } else {</span> |
| <span class="source-line-no">577</span><span id="line-577"> ZKUtil.setData(zkw, znode, data);</span> |
| <span class="source-line-no">578</span><span id="line-578"> }</span> |
| <span class="source-line-no">579</span><span id="line-579"> }</span> |
| <span class="source-line-no">580</span><span id="line-580"></span> |
| <span class="source-line-no">581</span><span id="line-581"> /**</span> |
| <span class="source-line-no">582</span><span id="line-582"> * Sets the data of the existing znode to be the specified data. The node must exist but no checks</span> |
| <span class="source-line-no">583</span><span id="line-583"> * are done on the existing data or version.</span> |
| <span class="source-line-no">584</span><span id="line-584"> * <p></span> |
| <span class="source-line-no">585</span><span id="line-585"> * If the node does not exist, a {@link NoNodeException} will be thrown.</span> |
| <span class="source-line-no">586</span><span id="line-586"> * <p></span> |
| <span class="source-line-no">587</span><span id="line-587"> * No watches are set but setting data will trigger other watchers of this node.</span> |
| <span class="source-line-no">588</span><span id="line-588"> * <p></span> |
| <span class="source-line-no">589</span><span id="line-589"> * If there is another problem, a KeeperException will be thrown.</span> |
| <span class="source-line-no">590</span><span id="line-590"> * @param zkw zk reference</span> |
| <span class="source-line-no">591</span><span id="line-591"> * @param znode path of node</span> |
| <span class="source-line-no">592</span><span id="line-592"> * @param data data to set for node</span> |
| <span class="source-line-no">593</span><span id="line-593"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">594</span><span id="line-594"> */</span> |
| <span class="source-line-no">595</span><span id="line-595"> public static void setData(ZKWatcher zkw, String znode, byte[] data)</span> |
| <span class="source-line-no">596</span><span id="line-596"> throws KeeperException, KeeperException.NoNodeException {</span> |
| <span class="source-line-no">597</span><span id="line-597"> setData(zkw, (SetData) ZKUtilOp.setData(znode, data));</span> |
| <span class="source-line-no">598</span><span id="line-598"> }</span> |
| <span class="source-line-no">599</span><span id="line-599"></span> |
| <span class="source-line-no">600</span><span id="line-600"> private static void setData(ZKWatcher zkw, SetData setData)</span> |
| <span class="source-line-no">601</span><span id="line-601"> throws KeeperException, KeeperException.NoNodeException {</span> |
| <span class="source-line-no">602</span><span id="line-602"> SetDataRequest sd = (SetDataRequest) toZooKeeperOp(zkw, setData).toRequestRecord();</span> |
| <span class="source-line-no">603</span><span id="line-603"> setData(zkw, sd.getPath(), sd.getData(), sd.getVersion());</span> |
| <span class="source-line-no">604</span><span id="line-604"> }</span> |
| <span class="source-line-no">605</span><span id="line-605"></span> |
| <span class="source-line-no">606</span><span id="line-606"> //</span> |
| <span class="source-line-no">607</span><span id="line-607"> // Node creation</span> |
| <span class="source-line-no">608</span><span id="line-608"> //</span> |
| <span class="source-line-no">609</span><span id="line-609"></span> |
| <span class="source-line-no">610</span><span id="line-610"> /**</span> |
| <span class="source-line-no">611</span><span id="line-611"> * Set the specified znode to be an ephemeral node carrying the specified data. If the node is</span> |
| <span class="source-line-no">612</span><span id="line-612"> * created successfully, a watcher is also set on the node. If the node is not created</span> |
| <span class="source-line-no">613</span><span id="line-613"> * successfully because it already exists, this method will also set a watcher on the node. If</span> |
| <span class="source-line-no">614</span><span id="line-614"> * there is another problem, a KeeperException will be thrown.</span> |
| <span class="source-line-no">615</span><span id="line-615"> * @param zkw zk reference</span> |
| <span class="source-line-no">616</span><span id="line-616"> * @param znode path of node</span> |
| <span class="source-line-no">617</span><span id="line-617"> * @param data data of node</span> |
| <span class="source-line-no">618</span><span id="line-618"> * @return true if node created, false if not, watch set in both cases</span> |
| <span class="source-line-no">619</span><span id="line-619"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">620</span><span id="line-620"> */</span> |
| <span class="source-line-no">621</span><span id="line-621"> public static boolean createEphemeralNodeAndWatch(ZKWatcher zkw, String znode, byte[] data)</span> |
| <span class="source-line-no">622</span><span id="line-622"> throws KeeperException {</span> |
| <span class="source-line-no">623</span><span id="line-623"> boolean ret = true;</span> |
| <span class="source-line-no">624</span><span id="line-624"> try {</span> |
| <span class="source-line-no">625</span><span id="line-625"> zkw.getRecoverableZooKeeper().create(znode, data, zkw.createACL(znode), CreateMode.EPHEMERAL);</span> |
| <span class="source-line-no">626</span><span id="line-626"> } catch (KeeperException.NodeExistsException nee) {</span> |
| <span class="source-line-no">627</span><span id="line-627"> ret = false;</span> |
| <span class="source-line-no">628</span><span id="line-628"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">629</span><span id="line-629"> LOG.info("Interrupted", e);</span> |
| <span class="source-line-no">630</span><span id="line-630"> Thread.currentThread().interrupt();</span> |
| <span class="source-line-no">631</span><span id="line-631"> }</span> |
| <span class="source-line-no">632</span><span id="line-632"> if (!watchAndCheckExists(zkw, znode)) {</span> |
| <span class="source-line-no">633</span><span id="line-633"> // It did exist but now it doesn't, try again</span> |
| <span class="source-line-no">634</span><span id="line-634"> return createEphemeralNodeAndWatch(zkw, znode, data);</span> |
| <span class="source-line-no">635</span><span id="line-635"> }</span> |
| <span class="source-line-no">636</span><span id="line-636"> return ret;</span> |
| <span class="source-line-no">637</span><span id="line-637"> }</span> |
| <span class="source-line-no">638</span><span id="line-638"></span> |
| <span class="source-line-no">639</span><span id="line-639"> /**</span> |
| <span class="source-line-no">640</span><span id="line-640"> * Creates the specified znode to be a persistent node carrying the specified data. Returns true</span> |
| <span class="source-line-no">641</span><span id="line-641"> * if the node was successfully created, false if the node already existed. If the node is created</span> |
| <span class="source-line-no">642</span><span id="line-642"> * successfully, a watcher is also set on the node. If the node is not created successfully</span> |
| <span class="source-line-no">643</span><span id="line-643"> * because it already exists, this method will also set a watcher on the node but return false. If</span> |
| <span class="source-line-no">644</span><span id="line-644"> * there is another problem, a KeeperException will be thrown.</span> |
| <span class="source-line-no">645</span><span id="line-645"> * @param zkw zk reference</span> |
| <span class="source-line-no">646</span><span id="line-646"> * @param znode path of node</span> |
| <span class="source-line-no">647</span><span id="line-647"> * @param data data of node</span> |
| <span class="source-line-no">648</span><span id="line-648"> * @return true if node created, false if not, watch set in both cases</span> |
| <span class="source-line-no">649</span><span id="line-649"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">650</span><span id="line-650"> */</span> |
| <span class="source-line-no">651</span><span id="line-651"> public static boolean createNodeIfNotExistsAndWatch(ZKWatcher zkw, String znode, byte[] data)</span> |
| <span class="source-line-no">652</span><span id="line-652"> throws KeeperException {</span> |
| <span class="source-line-no">653</span><span id="line-653"> boolean ret = true;</span> |
| <span class="source-line-no">654</span><span id="line-654"> try {</span> |
| <span class="source-line-no">655</span><span id="line-655"> zkw.getRecoverableZooKeeper().create(znode, data, zkw.createACL(znode),</span> |
| <span class="source-line-no">656</span><span id="line-656"> CreateMode.PERSISTENT);</span> |
| <span class="source-line-no">657</span><span id="line-657"> } catch (KeeperException.NodeExistsException nee) {</span> |
| <span class="source-line-no">658</span><span id="line-658"> ret = false;</span> |
| <span class="source-line-no">659</span><span id="line-659"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">660</span><span id="line-660"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">661</span><span id="line-661"> return false;</span> |
| <span class="source-line-no">662</span><span id="line-662"> }</span> |
| <span class="source-line-no">663</span><span id="line-663"> try {</span> |
| <span class="source-line-no">664</span><span id="line-664"> zkw.getRecoverableZooKeeper().exists(znode, zkw);</span> |
| <span class="source-line-no">665</span><span id="line-665"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">666</span><span id="line-666"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">667</span><span id="line-667"> return false;</span> |
| <span class="source-line-no">668</span><span id="line-668"> }</span> |
| <span class="source-line-no">669</span><span id="line-669"> return ret;</span> |
| <span class="source-line-no">670</span><span id="line-670"> }</span> |
| <span class="source-line-no">671</span><span id="line-671"></span> |
| <span class="source-line-no">672</span><span id="line-672"> /**</span> |
| <span class="source-line-no">673</span><span id="line-673"> * Creates the specified znode with the specified data but does not watch it. Returns the znode of</span> |
| <span class="source-line-no">674</span><span id="line-674"> * the newly created node If there is another problem, a KeeperException will be thrown.</span> |
| <span class="source-line-no">675</span><span id="line-675"> * @param zkw zk reference</span> |
| <span class="source-line-no">676</span><span id="line-676"> * @param znode path of node</span> |
| <span class="source-line-no">677</span><span id="line-677"> * @param data data of node</span> |
| <span class="source-line-no">678</span><span id="line-678"> * @param createMode specifying whether the node to be created is ephemeral and/or sequential</span> |
| <span class="source-line-no">679</span><span id="line-679"> * @return true name of the newly created znode or null</span> |
| <span class="source-line-no">680</span><span id="line-680"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">681</span><span id="line-681"> */</span> |
| <span class="source-line-no">682</span><span id="line-682"> public static String createNodeIfNotExistsNoWatch(ZKWatcher zkw, String znode, byte[] data,</span> |
| <span class="source-line-no">683</span><span id="line-683"> CreateMode createMode) throws KeeperException {</span> |
| <span class="source-line-no">684</span><span id="line-684"> try {</span> |
| <span class="source-line-no">685</span><span id="line-685"> return zkw.getRecoverableZooKeeper().create(znode, data, zkw.createACL(znode), createMode);</span> |
| <span class="source-line-no">686</span><span id="line-686"> } catch (KeeperException.NodeExistsException nee) {</span> |
| <span class="source-line-no">687</span><span id="line-687"> return znode;</span> |
| <span class="source-line-no">688</span><span id="line-688"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">689</span><span id="line-689"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">690</span><span id="line-690"> return null;</span> |
| <span class="source-line-no">691</span><span id="line-691"> }</span> |
| <span class="source-line-no">692</span><span id="line-692"> }</span> |
| <span class="source-line-no">693</span><span id="line-693"></span> |
| <span class="source-line-no">694</span><span id="line-694"> /**</span> |
| <span class="source-line-no">695</span><span id="line-695"> * Creates the specified node with the specified data and watches it.</span> |
| <span class="source-line-no">696</span><span id="line-696"> * <p></span> |
| <span class="source-line-no">697</span><span id="line-697"> * Throws an exception if the node already exists.</span> |
| <span class="source-line-no">698</span><span id="line-698"> * <p></span> |
| <span class="source-line-no">699</span><span id="line-699"> * The node created is persistent and open access.</span> |
| <span class="source-line-no">700</span><span id="line-700"> * <p></span> |
| <span class="source-line-no">701</span><span id="line-701"> * Returns the version number of the created node if successful.</span> |
| <span class="source-line-no">702</span><span id="line-702"> * @param zkw zk reference</span> |
| <span class="source-line-no">703</span><span id="line-703"> * @param znode path of node to create</span> |
| <span class="source-line-no">704</span><span id="line-704"> * @param data data of node to create</span> |
| <span class="source-line-no">705</span><span id="line-705"> * @return version of node created</span> |
| <span class="source-line-no">706</span><span id="line-706"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">707</span><span id="line-707"> * @throws KeeperException.NodeExistsException if node already exists</span> |
| <span class="source-line-no">708</span><span id="line-708"> */</span> |
| <span class="source-line-no">709</span><span id="line-709"> public static int createAndWatch(ZKWatcher zkw, String znode, byte[] data)</span> |
| <span class="source-line-no">710</span><span id="line-710"> throws KeeperException, KeeperException.NodeExistsException {</span> |
| <span class="source-line-no">711</span><span id="line-711"> try {</span> |
| <span class="source-line-no">712</span><span id="line-712"> zkw.getRecoverableZooKeeper().create(znode, data, zkw.createACL(znode),</span> |
| <span class="source-line-no">713</span><span id="line-713"> CreateMode.PERSISTENT);</span> |
| <span class="source-line-no">714</span><span id="line-714"> Stat stat = zkw.getRecoverableZooKeeper().exists(znode, zkw);</span> |
| <span class="source-line-no">715</span><span id="line-715"> if (stat == null) {</span> |
| <span class="source-line-no">716</span><span id="line-716"> // Likely a race condition. Someone deleted the znode.</span> |
| <span class="source-line-no">717</span><span id="line-717"> throw KeeperException.create(KeeperException.Code.SYSTEMERROR,</span> |
| <span class="source-line-no">718</span><span id="line-718"> "ZK.exists returned null (i.e.: znode does not exist) for znode=" + znode);</span> |
| <span class="source-line-no">719</span><span id="line-719"> }</span> |
| <span class="source-line-no">720</span><span id="line-720"></span> |
| <span class="source-line-no">721</span><span id="line-721"> return stat.getVersion();</span> |
| <span class="source-line-no">722</span><span id="line-722"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">723</span><span id="line-723"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">724</span><span id="line-724"> return -1;</span> |
| <span class="source-line-no">725</span><span id="line-725"> }</span> |
| <span class="source-line-no">726</span><span id="line-726"> }</span> |
| <span class="source-line-no">727</span><span id="line-727"></span> |
| <span class="source-line-no">728</span><span id="line-728"> /**</span> |
| <span class="source-line-no">729</span><span id="line-729"> * Async creates the specified node with the specified data.</span> |
| <span class="source-line-no">730</span><span id="line-730"> * <p></span> |
| <span class="source-line-no">731</span><span id="line-731"> * Throws an exception if the node already exists.</span> |
| <span class="source-line-no">732</span><span id="line-732"> * <p></span> |
| <span class="source-line-no">733</span><span id="line-733"> * The node created is persistent and open access.</span> |
| <span class="source-line-no">734</span><span id="line-734"> * @param zkw zk reference</span> |
| <span class="source-line-no">735</span><span id="line-735"> * @param znode path of node to create</span> |
| <span class="source-line-no">736</span><span id="line-736"> * @param data data of node to create</span> |
| <span class="source-line-no">737</span><span id="line-737"> * @param cb the callback to use for the creation</span> |
| <span class="source-line-no">738</span><span id="line-738"> * @param ctx the context to use for the creation</span> |
| <span class="source-line-no">739</span><span id="line-739"> */</span> |
| <span class="source-line-no">740</span><span id="line-740"> public static void asyncCreate(ZKWatcher zkw, String znode, byte[] data,</span> |
| <span class="source-line-no">741</span><span id="line-741"> final AsyncCallback.StringCallback cb, final Object ctx) {</span> |
| <span class="source-line-no">742</span><span id="line-742"> zkw.getRecoverableZooKeeper().getZooKeeper().create(znode, data, zkw.createACL(znode),</span> |
| <span class="source-line-no">743</span><span id="line-743"> CreateMode.PERSISTENT, cb, ctx);</span> |
| <span class="source-line-no">744</span><span id="line-744"> }</span> |
| <span class="source-line-no">745</span><span id="line-745"></span> |
| <span class="source-line-no">746</span><span id="line-746"> /**</span> |
| <span class="source-line-no">747</span><span id="line-747"> * Creates the specified node, iff the node does not exist. Does not set a watch and fails</span> |
| <span class="source-line-no">748</span><span id="line-748"> * silently if the node already exists. The node created is persistent and open access.</span> |
| <span class="source-line-no">749</span><span id="line-749"> * @param zkw zk reference</span> |
| <span class="source-line-no">750</span><span id="line-750"> * @param znode path of node</span> |
| <span class="source-line-no">751</span><span id="line-751"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">752</span><span id="line-752"> */</span> |
| <span class="source-line-no">753</span><span id="line-753"> public static void createAndFailSilent(ZKWatcher zkw, String znode) throws KeeperException {</span> |
| <span class="source-line-no">754</span><span id="line-754"> createAndFailSilent(zkw, znode, new byte[0]);</span> |
| <span class="source-line-no">755</span><span id="line-755"> }</span> |
| <span class="source-line-no">756</span><span id="line-756"></span> |
| <span class="source-line-no">757</span><span id="line-757"> /**</span> |
| <span class="source-line-no">758</span><span id="line-758"> * Creates the specified node containing specified data, iff the node does not exist. Does not set</span> |
| <span class="source-line-no">759</span><span id="line-759"> * a watch and fails silently if the node already exists. The node created is persistent and open</span> |
| <span class="source-line-no">760</span><span id="line-760"> * access.</span> |
| <span class="source-line-no">761</span><span id="line-761"> * @param zkw zk reference</span> |
| <span class="source-line-no">762</span><span id="line-762"> * @param znode path of node</span> |
| <span class="source-line-no">763</span><span id="line-763"> * @param data a byte array data to store in the znode</span> |
| <span class="source-line-no">764</span><span id="line-764"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">765</span><span id="line-765"> */</span> |
| <span class="source-line-no">766</span><span id="line-766"> public static void createAndFailSilent(ZKWatcher zkw, String znode, byte[] data)</span> |
| <span class="source-line-no">767</span><span id="line-767"> throws KeeperException {</span> |
| <span class="source-line-no">768</span><span id="line-768"> createAndFailSilent(zkw, (CreateAndFailSilent) ZKUtilOp.createAndFailSilent(znode, data));</span> |
| <span class="source-line-no">769</span><span id="line-769"> }</span> |
| <span class="source-line-no">770</span><span id="line-770"></span> |
| <span class="source-line-no">771</span><span id="line-771"> private static void createAndFailSilent(ZKWatcher zkw, CreateAndFailSilent cafs)</span> |
| <span class="source-line-no">772</span><span id="line-772"> throws KeeperException {</span> |
| <span class="source-line-no">773</span><span id="line-773"> CreateRequest create = (CreateRequest) toZooKeeperOp(zkw, cafs).toRequestRecord();</span> |
| <span class="source-line-no">774</span><span id="line-774"> String znode = create.getPath();</span> |
| <span class="source-line-no">775</span><span id="line-775"> RecoverableZooKeeper zk = zkw.getRecoverableZooKeeper();</span> |
| <span class="source-line-no">776</span><span id="line-776"> try {</span> |
| <span class="source-line-no">777</span><span id="line-777"> if (zk.exists(znode, false) == null) {</span> |
| <span class="source-line-no">778</span><span id="line-778"> zk.create(znode, create.getData(), create.getAcl(), CreateMode.fromFlag(create.getFlags()));</span> |
| <span class="source-line-no">779</span><span id="line-779"> }</span> |
| <span class="source-line-no">780</span><span id="line-780"> } catch (KeeperException.NodeExistsException nee) {</span> |
| <span class="source-line-no">781</span><span id="line-781"> // pass</span> |
| <span class="source-line-no">782</span><span id="line-782"> } catch (KeeperException.NoAuthException nee) {</span> |
| <span class="source-line-no">783</span><span id="line-783"> try {</span> |
| <span class="source-line-no">784</span><span id="line-784"> if (zk.exists(znode, false) == null) {</span> |
| <span class="source-line-no">785</span><span id="line-785"> // If we failed to create the file and it does not already exist.</span> |
| <span class="source-line-no">786</span><span id="line-786"> throw nee;</span> |
| <span class="source-line-no">787</span><span id="line-787"> }</span> |
| <span class="source-line-no">788</span><span id="line-788"> } catch (InterruptedException ie) {</span> |
| <span class="source-line-no">789</span><span id="line-789"> zkw.interruptedException(ie);</span> |
| <span class="source-line-no">790</span><span id="line-790"> }</span> |
| <span class="source-line-no">791</span><span id="line-791"> } catch (InterruptedException ie) {</span> |
| <span class="source-line-no">792</span><span id="line-792"> zkw.interruptedException(ie);</span> |
| <span class="source-line-no">793</span><span id="line-793"> }</span> |
| <span class="source-line-no">794</span><span id="line-794"> }</span> |
| <span class="source-line-no">795</span><span id="line-795"></span> |
| <span class="source-line-no">796</span><span id="line-796"> /**</span> |
| <span class="source-line-no">797</span><span id="line-797"> * Creates the specified node and all parent nodes required for it to exist. No watches are set</span> |
| <span class="source-line-no">798</span><span id="line-798"> * and no errors are thrown if the node already exists. The nodes created are persistent and open</span> |
| <span class="source-line-no">799</span><span id="line-799"> * access.</span> |
| <span class="source-line-no">800</span><span id="line-800"> * @param zkw zk reference</span> |
| <span class="source-line-no">801</span><span id="line-801"> * @param znode path of node</span> |
| <span class="source-line-no">802</span><span id="line-802"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">803</span><span id="line-803"> */</span> |
| <span class="source-line-no">804</span><span id="line-804"> public static void createWithParents(ZKWatcher zkw, String znode) throws KeeperException {</span> |
| <span class="source-line-no">805</span><span id="line-805"> createWithParents(zkw, znode, new byte[0]);</span> |
| <span class="source-line-no">806</span><span id="line-806"> }</span> |
| <span class="source-line-no">807</span><span id="line-807"></span> |
| <span class="source-line-no">808</span><span id="line-808"> /**</span> |
| <span class="source-line-no">809</span><span id="line-809"> * Creates the specified node and all parent nodes required for it to exist. The creation of</span> |
| <span class="source-line-no">810</span><span id="line-810"> * parent znodes is not atomic with the leafe znode creation but the data is written atomically</span> |
| <span class="source-line-no">811</span><span id="line-811"> * when the leaf node is created. No watches are set and no errors are thrown if the node already</span> |
| <span class="source-line-no">812</span><span id="line-812"> * exists. The nodes created are persistent and open access.</span> |
| <span class="source-line-no">813</span><span id="line-813"> * @param zkw zk reference</span> |
| <span class="source-line-no">814</span><span id="line-814"> * @param znode path of node</span> |
| <span class="source-line-no">815</span><span id="line-815"> * @throws KeeperException if unexpected zookeeper exception</span> |
| <span class="source-line-no">816</span><span id="line-816"> */</span> |
| <span class="source-line-no">817</span><span id="line-817"> public static void createWithParents(ZKWatcher zkw, String znode, byte[] data)</span> |
| <span class="source-line-no">818</span><span id="line-818"> throws KeeperException {</span> |
| <span class="source-line-no">819</span><span id="line-819"> try {</span> |
| <span class="source-line-no">820</span><span id="line-820"> if (znode == null) {</span> |
| <span class="source-line-no">821</span><span id="line-821"> return;</span> |
| <span class="source-line-no">822</span><span id="line-822"> }</span> |
| <span class="source-line-no">823</span><span id="line-823"> zkw.getRecoverableZooKeeper().create(znode, data, zkw.createACL(znode),</span> |
| <span class="source-line-no">824</span><span id="line-824"> CreateMode.PERSISTENT);</span> |
| <span class="source-line-no">825</span><span id="line-825"> } catch (KeeperException.NodeExistsException nee) {</span> |
| <span class="source-line-no">826</span><span id="line-826"> return;</span> |
| <span class="source-line-no">827</span><span id="line-827"> } catch (KeeperException.NoNodeException nne) {</span> |
| <span class="source-line-no">828</span><span id="line-828"> createWithParents(zkw, getParent(znode));</span> |
| <span class="source-line-no">829</span><span id="line-829"> createWithParents(zkw, znode, data);</span> |
| <span class="source-line-no">830</span><span id="line-830"> } catch (InterruptedException ie) {</span> |
| <span class="source-line-no">831</span><span id="line-831"> zkw.interruptedException(ie);</span> |
| <span class="source-line-no">832</span><span id="line-832"> }</span> |
| <span class="source-line-no">833</span><span id="line-833"> }</span> |
| <span class="source-line-no">834</span><span id="line-834"></span> |
| <span class="source-line-no">835</span><span id="line-835"> //</span> |
| <span class="source-line-no">836</span><span id="line-836"> // Deletes</span> |
| <span class="source-line-no">837</span><span id="line-837"> //</span> |
| <span class="source-line-no">838</span><span id="line-838"></span> |
| <span class="source-line-no">839</span><span id="line-839"> /**</span> |
| <span class="source-line-no">840</span><span id="line-840"> * Delete the specified node. Sets no watches. Throws all exceptions.</span> |
| <span class="source-line-no">841</span><span id="line-841"> */</span> |
| <span class="source-line-no">842</span><span id="line-842"> public static void deleteNode(ZKWatcher zkw, String node) throws KeeperException {</span> |
| <span class="source-line-no">843</span><span id="line-843"> deleteNode(zkw, node, -1);</span> |
| <span class="source-line-no">844</span><span id="line-844"> }</span> |
| <span class="source-line-no">845</span><span id="line-845"></span> |
| <span class="source-line-no">846</span><span id="line-846"> /**</span> |
| <span class="source-line-no">847</span><span id="line-847"> * Delete the specified node with the specified version. Sets no watches. Throws all exceptions.</span> |
| <span class="source-line-no">848</span><span id="line-848"> */</span> |
| <span class="source-line-no">849</span><span id="line-849"> public static boolean deleteNode(ZKWatcher zkw, String node, int version) throws KeeperException {</span> |
| <span class="source-line-no">850</span><span id="line-850"> try {</span> |
| <span class="source-line-no">851</span><span id="line-851"> zkw.getRecoverableZooKeeper().delete(node, version);</span> |
| <span class="source-line-no">852</span><span id="line-852"> return true;</span> |
| <span class="source-line-no">853</span><span id="line-853"> } catch (KeeperException.BadVersionException bve) {</span> |
| <span class="source-line-no">854</span><span id="line-854"> return false;</span> |
| <span class="source-line-no">855</span><span id="line-855"> } catch (InterruptedException ie) {</span> |
| <span class="source-line-no">856</span><span id="line-856"> zkw.interruptedException(ie);</span> |
| <span class="source-line-no">857</span><span id="line-857"> return false;</span> |
| <span class="source-line-no">858</span><span id="line-858"> }</span> |
| <span class="source-line-no">859</span><span id="line-859"> }</span> |
| <span class="source-line-no">860</span><span id="line-860"></span> |
| <span class="source-line-no">861</span><span id="line-861"> /**</span> |
| <span class="source-line-no">862</span><span id="line-862"> * Deletes the specified node. Fails silent if the node does not exist.</span> |
| <span class="source-line-no">863</span><span id="line-863"> * @param zkw reference to the {@link ZKWatcher} which also contains configuration and operation</span> |
| <span class="source-line-no">864</span><span id="line-864"> * @param node the node to delete</span> |
| <span class="source-line-no">865</span><span id="line-865"> * @throws KeeperException if a ZooKeeper operation fails</span> |
| <span class="source-line-no">866</span><span id="line-866"> */</span> |
| <span class="source-line-no">867</span><span id="line-867"> public static void deleteNodeFailSilent(ZKWatcher zkw, String node) throws KeeperException {</span> |
| <span class="source-line-no">868</span><span id="line-868"> deleteNodeFailSilent(zkw, (DeleteNodeFailSilent) ZKUtilOp.deleteNodeFailSilent(node));</span> |
| <span class="source-line-no">869</span><span id="line-869"> }</span> |
| <span class="source-line-no">870</span><span id="line-870"></span> |
| <span class="source-line-no">871</span><span id="line-871"> private static void deleteNodeFailSilent(ZKWatcher zkw, DeleteNodeFailSilent dnfs)</span> |
| <span class="source-line-no">872</span><span id="line-872"> throws KeeperException {</span> |
| <span class="source-line-no">873</span><span id="line-873"> DeleteRequest delete = (DeleteRequest) toZooKeeperOp(zkw, dnfs).toRequestRecord();</span> |
| <span class="source-line-no">874</span><span id="line-874"> try {</span> |
| <span class="source-line-no">875</span><span id="line-875"> zkw.getRecoverableZooKeeper().delete(delete.getPath(), delete.getVersion());</span> |
| <span class="source-line-no">876</span><span id="line-876"> } catch (KeeperException.NoNodeException nne) {</span> |
| <span class="source-line-no">877</span><span id="line-877"> } catch (InterruptedException ie) {</span> |
| <span class="source-line-no">878</span><span id="line-878"> zkw.interruptedException(ie);</span> |
| <span class="source-line-no">879</span><span id="line-879"> }</span> |
| <span class="source-line-no">880</span><span id="line-880"> }</span> |
| <span class="source-line-no">881</span><span id="line-881"></span> |
| <span class="source-line-no">882</span><span id="line-882"> /**</span> |
| <span class="source-line-no">883</span><span id="line-883"> * Delete the specified node and all of it's children.</span> |
| <span class="source-line-no">884</span><span id="line-884"> * <p></span> |
| <span class="source-line-no">885</span><span id="line-885"> * If the node does not exist, just returns.</span> |
| <span class="source-line-no">886</span><span id="line-886"> * <p></span> |
| <span class="source-line-no">887</span><span id="line-887"> * Sets no watches. Throws all exceptions besides dealing with deletion of children.</span> |
| <span class="source-line-no">888</span><span id="line-888"> */</span> |
| <span class="source-line-no">889</span><span id="line-889"> public static void deleteNodeRecursively(ZKWatcher zkw, String node) throws KeeperException {</span> |
| <span class="source-line-no">890</span><span id="line-890"> deleteNodeRecursivelyMultiOrSequential(zkw, true, node);</span> |
| <span class="source-line-no">891</span><span id="line-891"> }</span> |
| <span class="source-line-no">892</span><span id="line-892"></span> |
| <span class="source-line-no">893</span><span id="line-893"> /**</span> |
| <span class="source-line-no">894</span><span id="line-894"> * Delete all the children of the specified node but not the node itself. Sets no watches. Throws</span> |
| <span class="source-line-no">895</span><span id="line-895"> * all exceptions besides dealing with deletion of children.</span> |
| <span class="source-line-no">896</span><span id="line-896"> * @throws KeeperException if a ZooKeeper operation fails</span> |
| <span class="source-line-no">897</span><span id="line-897"> */</span> |
| <span class="source-line-no">898</span><span id="line-898"> public static void deleteChildrenRecursively(ZKWatcher zkw, String node) throws KeeperException {</span> |
| <span class="source-line-no">899</span><span id="line-899"> deleteChildrenRecursivelyMultiOrSequential(zkw, true, node);</span> |
| <span class="source-line-no">900</span><span id="line-900"> }</span> |
| <span class="source-line-no">901</span><span id="line-901"></span> |
| <span class="source-line-no">902</span><span id="line-902"> /**</span> |
| <span class="source-line-no">903</span><span id="line-903"> * Delete all the children of the specified node but not the node itself. This will first traverse</span> |
| <span class="source-line-no">904</span><span id="line-904"> * the znode tree for listing the children and then delete these znodes using multi-update api or</span> |
| <span class="source-line-no">905</span><span id="line-905"> * sequential based on the specified configurations.</span> |
| <span class="source-line-no">906</span><span id="line-906"> * <p></span> |
| <span class="source-line-no">907</span><span id="line-907"> * Sets no watches. Throws all exceptions besides dealing with deletion of children.</span> |
| <span class="source-line-no">908</span><span id="line-908"> * <p></span> |
| <span class="source-line-no">909</span><span id="line-909"> * If the following is true:</span> |
| <span class="source-line-no">910</span><span id="line-910"> * <ul></span> |
| <span class="source-line-no">911</span><span id="line-911"> * <li>runSequentialOnMultiFailure is true</span> |
| <span class="source-line-no">912</span><span id="line-912"> * </ul></span> |
| <span class="source-line-no">913</span><span id="line-913"> * on calling multi, we get a ZooKeeper exception that can be handled by a sequential call(*), we</span> |
| <span class="source-line-no">914</span><span id="line-914"> * retry the operations one-by-one (sequentially). - zk reference - if true when we get a</span> |
| <span class="source-line-no">915</span><span id="line-915"> * ZooKeeper exception that could retry the operations one-by-one (sequentially) - path of the</span> |
| <span class="source-line-no">916</span><span id="line-916"> * parent node(s)</span> |
| <span class="source-line-no">917</span><span id="line-917"> * @throws KeeperException.NotEmptyException if node has children while deleting if unexpected</span> |
| <span class="source-line-no">918</span><span id="line-918"> * ZooKeeper exception if an invalid path is specified</span> |
| <span class="source-line-no">919</span><span id="line-919"> */</span> |
| <span class="source-line-no">920</span><span id="line-920"> public static void deleteChildrenRecursivelyMultiOrSequential(ZKWatcher zkw,</span> |
| <span class="source-line-no">921</span><span id="line-921"> boolean runSequentialOnMultiFailure, String... pathRoots) throws KeeperException {</span> |
| <span class="source-line-no">922</span><span id="line-922"> if (pathRoots == null || pathRoots.length <= 0) {</span> |
| <span class="source-line-no">923</span><span id="line-923"> LOG.warn("Given path is not valid!");</span> |
| <span class="source-line-no">924</span><span id="line-924"> return;</span> |
| <span class="source-line-no">925</span><span id="line-925"> }</span> |
| <span class="source-line-no">926</span><span id="line-926"> List<ZKUtilOp> ops = new ArrayList<>();</span> |
| <span class="source-line-no">927</span><span id="line-927"> for (String eachRoot : pathRoots) {</span> |
| <span class="source-line-no">928</span><span id="line-928"> List<String> children = listChildrenBFSNoWatch(zkw, eachRoot);</span> |
| <span class="source-line-no">929</span><span id="line-929"> // Delete the leaves first and eventually get rid of the root</span> |
| <span class="source-line-no">930</span><span id="line-930"> for (int i = children.size() - 1; i >= 0; --i) {</span> |
| <span class="source-line-no">931</span><span id="line-931"> ops.add(ZKUtilOp.deleteNodeFailSilent(children.get(i)));</span> |
| <span class="source-line-no">932</span><span id="line-932"> }</span> |
| <span class="source-line-no">933</span><span id="line-933"> }</span> |
| <span class="source-line-no">934</span><span id="line-934"> submitBatchedMultiOrSequential(zkw, runSequentialOnMultiFailure, ops);</span> |
| <span class="source-line-no">935</span><span id="line-935"> }</span> |
| <span class="source-line-no">936</span><span id="line-936"></span> |
| <span class="source-line-no">937</span><span id="line-937"> /**</span> |
| <span class="source-line-no">938</span><span id="line-938"> * Delete the specified node and its children. This traverse the znode tree for listing the</span> |
| <span class="source-line-no">939</span><span id="line-939"> * children and then delete these znodes including the parent using multi-update api or sequential</span> |
| <span class="source-line-no">940</span><span id="line-940"> * based on the specified configurations.</span> |
| <span class="source-line-no">941</span><span id="line-941"> * <p></span> |
| <span class="source-line-no">942</span><span id="line-942"> * Sets no watches. Throws all exceptions besides dealing with deletion of children.</span> |
| <span class="source-line-no">943</span><span id="line-943"> * <p></span> |
| <span class="source-line-no">944</span><span id="line-944"> * If the following is true:</span> |
| <span class="source-line-no">945</span><span id="line-945"> * <ul></span> |
| <span class="source-line-no">946</span><span id="line-946"> * <li>runSequentialOnMultiFailure is true</span> |
| <span class="source-line-no">947</span><span id="line-947"> * </ul></span> |
| <span class="source-line-no">948</span><span id="line-948"> * on calling multi, we get a ZooKeeper exception that can be handled by a sequential call(*), we</span> |
| <span class="source-line-no">949</span><span id="line-949"> * retry the operations one-by-one (sequentially). - zk reference - if true when we get a</span> |
| <span class="source-line-no">950</span><span id="line-950"> * ZooKeeper exception that could retry the operations one-by-one (sequentially) - path of the</span> |
| <span class="source-line-no">951</span><span id="line-951"> * parent node(s)</span> |
| <span class="source-line-no">952</span><span id="line-952"> * @throws KeeperException.NotEmptyException if node has children while deleting if unexpected</span> |
| <span class="source-line-no">953</span><span id="line-953"> * ZooKeeper exception if an invalid path is specified</span> |
| <span class="source-line-no">954</span><span id="line-954"> */</span> |
| <span class="source-line-no">955</span><span id="line-955"> public static void deleteNodeRecursivelyMultiOrSequential(ZKWatcher zkw,</span> |
| <span class="source-line-no">956</span><span id="line-956"> boolean runSequentialOnMultiFailure, String... pathRoots) throws KeeperException {</span> |
| <span class="source-line-no">957</span><span id="line-957"> if (pathRoots == null || pathRoots.length <= 0) {</span> |
| <span class="source-line-no">958</span><span id="line-958"> LOG.warn("Given path is not valid!");</span> |
| <span class="source-line-no">959</span><span id="line-959"> return;</span> |
| <span class="source-line-no">960</span><span id="line-960"> }</span> |
| <span class="source-line-no">961</span><span id="line-961"> List<ZKUtilOp> ops = new ArrayList<>();</span> |
| <span class="source-line-no">962</span><span id="line-962"> for (String eachRoot : pathRoots) {</span> |
| <span class="source-line-no">963</span><span id="line-963"> // ZooKeeper Watches are one time triggers; When children of parent nodes are deleted</span> |
| <span class="source-line-no">964</span><span id="line-964"> // recursively, must set another watch, get notified of delete node</span> |
| <span class="source-line-no">965</span><span id="line-965"> List<String> children = listChildrenBFSAndWatchThem(zkw, eachRoot);</span> |
| <span class="source-line-no">966</span><span id="line-966"> // Delete the leaves first and eventually get rid of the root</span> |
| <span class="source-line-no">967</span><span id="line-967"> for (int i = children.size() - 1; i >= 0; --i) {</span> |
| <span class="source-line-no">968</span><span id="line-968"> ops.add(ZKUtilOp.deleteNodeFailSilent(children.get(i)));</span> |
| <span class="source-line-no">969</span><span id="line-969"> }</span> |
| <span class="source-line-no">970</span><span id="line-970"> try {</span> |
| <span class="source-line-no">971</span><span id="line-971"> if (zkw.getRecoverableZooKeeper().exists(eachRoot, zkw) != null) {</span> |
| <span class="source-line-no">972</span><span id="line-972"> ops.add(ZKUtilOp.deleteNodeFailSilent(eachRoot));</span> |
| <span class="source-line-no">973</span><span id="line-973"> }</span> |
| <span class="source-line-no">974</span><span id="line-974"> } catch (InterruptedException e) {</span> |
| <span class="source-line-no">975</span><span id="line-975"> zkw.interruptedException(e);</span> |
| <span class="source-line-no">976</span><span id="line-976"> }</span> |
| <span class="source-line-no">977</span><span id="line-977"> }</span> |
| <span class="source-line-no">978</span><span id="line-978"> submitBatchedMultiOrSequential(zkw, runSequentialOnMultiFailure, ops);</span> |
| <span class="source-line-no">979</span><span id="line-979"> }</span> |
| <span class="source-line-no">980</span><span id="line-980"></span> |
| <span class="source-line-no">981</span><span id="line-981"> /**</span> |
| <span class="source-line-no">982</span><span id="line-982"> * Chunks the provided {@code ops} when their approximate size exceeds the the configured limit.</span> |
| <span class="source-line-no">983</span><span id="line-983"> * Take caution that this can ONLY be used for operations where atomicity is not important, e.g.</span> |
| <span class="source-line-no">984</span><span id="line-984"> * deletions. It must not be used when atomicity of the operations is critical.</span> |
| <span class="source-line-no">985</span><span id="line-985"> * @param zkw reference to the {@link ZKWatcher} which contains</span> |
| <span class="source-line-no">986</span><span id="line-986"> * configuration and constants</span> |
| <span class="source-line-no">987</span><span id="line-987"> * @param runSequentialOnMultiFailure if true when we get a ZooKeeper exception that could retry</span> |
| <span class="source-line-no">988</span><span id="line-988"> * the operations one-by-one (sequentially)</span> |
| <span class="source-line-no">989</span><span id="line-989"> * @param ops list of ZKUtilOp {@link ZKUtilOp} to partition while</span> |
| <span class="source-line-no">990</span><span id="line-990"> * submitting batched multi or sequential</span> |
| <span class="source-line-no">991</span><span id="line-991"> * @throws KeeperException unexpected ZooKeeper Exception / Zookeeper unreachable</span> |
| <span class="source-line-no">992</span><span id="line-992"> */</span> |
| <span class="source-line-no">993</span><span id="line-993"> private static void submitBatchedMultiOrSequential(ZKWatcher zkw,</span> |
| <span class="source-line-no">994</span><span id="line-994"> boolean runSequentialOnMultiFailure, List<ZKUtilOp> ops) throws KeeperException {</span> |
| <span class="source-line-no">995</span><span id="line-995"> // at least one element should exist</span> |
| <span class="source-line-no">996</span><span id="line-996"> if (ops.isEmpty()) {</span> |
| <span class="source-line-no">997</span><span id="line-997"> return;</span> |
| <span class="source-line-no">998</span><span id="line-998"> }</span> |
| <span class="source-line-no">999</span><span id="line-999"> final int maxMultiSize = zkw.getRecoverableZooKeeper().getMaxMultiSizeLimit();</span> |
| <span class="source-line-no">1000</span><span id="line-1000"> // Batch up the items to over smashing through jute.maxbuffer with too many Ops.</span> |
| <span class="source-line-no">1001</span><span id="line-1001"> final List<List<ZKUtilOp>> batchedOps = partitionOps(ops, maxMultiSize);</span> |
| <span class="source-line-no">1002</span><span id="line-1002"> // Would use forEach() but have to handle KeeperException</span> |
| <span class="source-line-no">1003</span><span id="line-1003"> for (List<ZKUtilOp> batch : batchedOps) {</span> |
| <span class="source-line-no">1004</span><span id="line-1004"> multiOrSequential(zkw, batch, runSequentialOnMultiFailure);</span> |
| <span class="source-line-no">1005</span><span id="line-1005"> }</span> |
| <span class="source-line-no">1006</span><span id="line-1006"> }</span> |
| <span class="source-line-no">1007</span><span id="line-1007"></span> |
| <span class="source-line-no">1008</span><span id="line-1008"> /**</span> |
| <span class="source-line-no">1009</span><span id="line-1009"> * Partition the list of {@code ops} by size (using {@link #estimateSize(ZKUtilOp)}).</span> |
| <span class="source-line-no">1010</span><span id="line-1010"> */</span> |
| <span class="source-line-no">1011</span><span id="line-1011"> static List<List<ZKUtilOp>> partitionOps(List<ZKUtilOp> ops, int maxPartitionSize) {</span> |
| <span class="source-line-no">1012</span><span id="line-1012"> List<List<ZKUtilOp>> partitionedOps = new ArrayList<>();</span> |
| <span class="source-line-no">1013</span><span id="line-1013"> List<ZKUtilOp> currentPartition = new ArrayList<>();</span> |
| <span class="source-line-no">1014</span><span id="line-1014"> int currentPartitionSize = 0;</span> |
| <span class="source-line-no">1015</span><span id="line-1015"> partitionedOps.add(currentPartition);</span> |
| <span class="source-line-no">1016</span><span id="line-1016"> Iterator<ZKUtilOp> iter = ops.iterator();</span> |
| <span class="source-line-no">1017</span><span id="line-1017"> while (iter.hasNext()) {</span> |
| <span class="source-line-no">1018</span><span id="line-1018"> ZKUtilOp currentOp = iter.next();</span> |
| <span class="source-line-no">1019</span><span id="line-1019"> int currentOpSize = estimateSize(currentOp);</span> |
| <span class="source-line-no">1020</span><span id="line-1020"></span> |
| <span class="source-line-no">1021</span><span id="line-1021"> // Roll a new partition if necessary</span> |
| <span class="source-line-no">1022</span><span id="line-1022"> // If the current partition is empty, put the element in there anyways.</span> |
| <span class="source-line-no">1023</span><span id="line-1023"> // We can roll a new partition if we get another element</span> |
| <span class="source-line-no">1024</span><span id="line-1024"> if (!currentPartition.isEmpty() && currentOpSize + currentPartitionSize > maxPartitionSize) {</span> |
| <span class="source-line-no">1025</span><span id="line-1025"> currentPartition = new ArrayList<>();</span> |
| <span class="source-line-no">1026</span><span id="line-1026"> partitionedOps.add(currentPartition);</span> |
| <span class="source-line-no">1027</span><span id="line-1027"> currentPartitionSize = 0;</span> |
| <span class="source-line-no">1028</span><span id="line-1028"> }</span> |
| <span class="source-line-no">1029</span><span id="line-1029"></span> |
| <span class="source-line-no">1030</span><span id="line-1030"> // Add the current op to the partition</span> |
| <span class="source-line-no">1031</span><span id="line-1031"> currentPartition.add(currentOp);</span> |
| <span class="source-line-no">1032</span><span id="line-1032"> // And record its size</span> |
| <span class="source-line-no">1033</span><span id="line-1033"> currentPartitionSize += currentOpSize;</span> |
| <span class="source-line-no">1034</span><span id="line-1034"> }</span> |
| <span class="source-line-no">1035</span><span id="line-1035"> return partitionedOps;</span> |
| <span class="source-line-no">1036</span><span id="line-1036"> }</span> |
| <span class="source-line-no">1037</span><span id="line-1037"></span> |
| <span class="source-line-no">1038</span><span id="line-1038"> static int estimateSize(ZKUtilOp op) {</span> |
| <span class="source-line-no">1039</span><span id="line-1039"> return Bytes.toBytes(op.getPath()).length;</span> |
| <span class="source-line-no">1040</span><span id="line-1040"> }</span> |
| <span class="source-line-no">1041</span><span id="line-1041"></span> |
| <span class="source-line-no">1042</span><span id="line-1042"> /**</span> |
| <span class="source-line-no">1043</span><span id="line-1043"> * BFS Traversal of all the children under path, with the entries in the list, in the same order</span> |
| <span class="source-line-no">1044</span><span id="line-1044"> * as that of the traversal. Lists all the children without setting any watches. - zk reference -</span> |
| <span class="source-line-no">1045</span><span id="line-1045"> * path of node</span> |
| <span class="source-line-no">1046</span><span id="line-1046"> * @return list of children znodes under the path if unexpected ZooKeeper exception</span> |
| <span class="source-line-no">1047</span><span id="line-1047"> */</span> |
| <span class="source-line-no">1048</span><span id="line-1048"> private static List<String> listChildrenBFSNoWatch(ZKWatcher zkw, final String znode)</span> |
| <span class="source-line-no">1049</span><span id="line-1049"> throws KeeperException {</span> |
| <span class="source-line-no">1050</span><span id="line-1050"> Deque<String> queue = new LinkedList<>();</span> |
| <span class="source-line-no">1051</span><span id="line-1051"> List<String> tree = new ArrayList<>();</span> |
| <span class="source-line-no">1052</span><span id="line-1052"> queue.add(znode);</span> |
| <span class="source-line-no">1053</span><span id="line-1053"> while (true) {</span> |
| <span class="source-line-no">1054</span><span id="line-1054"> String node = queue.pollFirst();</span> |
| <span class="source-line-no">1055</span><span id="line-1055"> if (node == null) {</span> |
| <span class="source-line-no">1056</span><span id="line-1056"> break;</span> |
| <span class="source-line-no">1057</span><span id="line-1057"> }</span> |
| <span class="source-line-no">1058</span><span id="line-1058"> List<String> children = listChildrenNoWatch(zkw, node);</span> |
| <span class="source-line-no">1059</span><span id="line-1059"> if (children == null) {</span> |
| <span class="source-line-no">1060</span><span id="line-1060"> continue;</span> |
| <span class="source-line-no">1061</span><span id="line-1061"> }</span> |
| <span class="source-line-no">1062</span><span id="line-1062"> for (final String child : children) {</span> |
| <span class="source-line-no">1063</span><span id="line-1063"> final String childPath = node + "/" + child;</span> |
| <span class="source-line-no">1064</span><span id="line-1064"> queue.add(childPath);</span> |
| <span class="source-line-no">1065</span><span id="line-1065"> tree.add(childPath);</span> |
| <span class="source-line-no">1066</span><span id="line-1066"> }</span> |
| <span class="source-line-no">1067</span><span id="line-1067"> }</span> |
| <span class="source-line-no">1068</span><span id="line-1068"> return tree;</span> |
| <span class="source-line-no">1069</span><span id="line-1069"> }</span> |
| <span class="source-line-no">1070</span><span id="line-1070"></span> |
| <span class="source-line-no">1071</span><span id="line-1071"> /**</span> |
| <span class="source-line-no">1072</span><span id="line-1072"> * BFS Traversal of all the children under path, with the entries in the list, in the same order</span> |
| <span class="source-line-no">1073</span><span id="line-1073"> * as that of the traversal. Lists all the children and set watches on to them. - zk reference -</span> |
| <span class="source-line-no">1074</span><span id="line-1074"> * path of node</span> |
| <span class="source-line-no">1075</span><span id="line-1075"> * @return list of children znodes under the path if unexpected ZooKeeper exception</span> |
| <span class="source-line-no">1076</span><span id="line-1076"> */</span> |
| <span class="source-line-no">1077</span><span id="line-1077"> private static List<String> listChildrenBFSAndWatchThem(ZKWatcher zkw, final String znode)</span> |
| <span class="source-line-no">1078</span><span id="line-1078"> throws KeeperException {</span> |
| <span class="source-line-no">1079</span><span id="line-1079"> Deque<String> queue = new LinkedList<>();</span> |
| <span class="source-line-no">1080</span><span id="line-1080"> List<String> tree = new ArrayList<>();</span> |
| <span class="source-line-no">1081</span><span id="line-1081"> queue.add(znode);</span> |
| <span class="source-line-no">1082</span><span id="line-1082"> while (true) {</span> |
| <span class="source-line-no">1083</span><span id="line-1083"> String node = queue.pollFirst();</span> |
| <span class="source-line-no">1084</span><span id="line-1084"> if (node == null) {</span> |
| <span class="source-line-no">1085</span><span id="line-1085"> break;</span> |
| <span class="source-line-no">1086</span><span id="line-1086"> }</span> |
| <span class="source-line-no">1087</span><span id="line-1087"> List<String> children = listChildrenAndWatchThem(zkw, node);</span> |
| <span class="source-line-no">1088</span><span id="line-1088"> if (children == null) {</span> |
| <span class="source-line-no">1089</span><span id="line-1089"> continue;</span> |
| <span class="source-line-no">1090</span><span id="line-1090"> }</span> |
| <span class="source-line-no">1091</span><span id="line-1091"> for (final String child : children) {</span> |
| <span class="source-line-no">1092</span><span id="line-1092"> final String childPath = node + "/" + child;</span> |
| <span class="source-line-no">1093</span><span id="line-1093"> queue.add(childPath);</span> |
| <span class="source-line-no">1094</span><span id="line-1094"> tree.add(childPath);</span> |
| <span class="source-line-no">1095</span><span id="line-1095"> }</span> |
| <span class="source-line-no">1096</span><span id="line-1096"> }</span> |
| <span class="source-line-no">1097</span><span id="line-1097"> return tree;</span> |
| <span class="source-line-no">1098</span><span id="line-1098"> }</span> |
| <span class="source-line-no">1099</span><span id="line-1099"></span> |
| <span class="source-line-no">1100</span><span id="line-1100"> /**</span> |
| <span class="source-line-no">1101</span><span id="line-1101"> * Represents an action taken by ZKUtil, e.g. createAndFailSilent. These actions are higher-level</span> |
| <span class="source-line-no">1102</span><span id="line-1102"> * than ZKOp actions, which represent individual actions in the ZooKeeper API, like create.</span> |
| <span class="source-line-no">1103</span><span id="line-1103"> */</span> |
| <span class="source-line-no">1104</span><span id="line-1104"> public abstract static class ZKUtilOp {</span> |
| <span class="source-line-no">1105</span><span id="line-1105"> private String path;</span> |
| <span class="source-line-no">1106</span><span id="line-1106"></span> |
| <span class="source-line-no">1107</span><span id="line-1107"> @Override</span> |
| <span class="source-line-no">1108</span><span id="line-1108"> public String toString() {</span> |
| <span class="source-line-no">1109</span><span id="line-1109"> return this.getClass().getSimpleName() + ", path=" + this.path;</span> |
| <span class="source-line-no">1110</span><span id="line-1110"> }</span> |
| <span class="source-line-no">1111</span><span id="line-1111"></span> |
| <span class="source-line-no">1112</span><span id="line-1112"> private ZKUtilOp(String path) {</span> |
| <span class="source-line-no">1113</span><span id="line-1113"> this.path = path;</span> |
| <span class="source-line-no">1114</span><span id="line-1114"> }</span> |
| <span class="source-line-no">1115</span><span id="line-1115"></span> |
| <span class="source-line-no">1116</span><span id="line-1116"> /** Returns a createAndFailSilent ZKUtilOp */</span> |
| <span class="source-line-no">1117</span><span id="line-1117"> public static ZKUtilOp createAndFailSilent(String path, byte[] data) {</span> |
| <span class="source-line-no">1118</span><span id="line-1118"> return new CreateAndFailSilent(path, data);</span> |
| <span class="source-line-no">1119</span><span id="line-1119"> }</span> |
| <span class="source-line-no">1120</span><span id="line-1120"></span> |
| <span class="source-line-no">1121</span><span id="line-1121"> /** Returns a deleteNodeFailSilent ZKUtilOP */</span> |
| <span class="source-line-no">1122</span><span id="line-1122"> public static ZKUtilOp deleteNodeFailSilent(String path) {</span> |
| <span class="source-line-no">1123</span><span id="line-1123"> return new DeleteNodeFailSilent(path);</span> |
| <span class="source-line-no">1124</span><span id="line-1124"> }</span> |
| <span class="source-line-no">1125</span><span id="line-1125"></span> |
| <span class="source-line-no">1126</span><span id="line-1126"> /** Returns a setData ZKUtilOp */</span> |
| <span class="source-line-no">1127</span><span id="line-1127"> public static ZKUtilOp setData(String path, byte[] data) {</span> |
| <span class="source-line-no">1128</span><span id="line-1128"> return new SetData(path, data);</span> |
| <span class="source-line-no">1129</span><span id="line-1129"> }</span> |
| <span class="source-line-no">1130</span><span id="line-1130"></span> |
| <span class="source-line-no">1131</span><span id="line-1131"> /** Returns a setData ZKUtilOp */</span> |
| <span class="source-line-no">1132</span><span id="line-1132"> public static ZKUtilOp setData(String path, byte[] data, int version) {</span> |
| <span class="source-line-no">1133</span><span id="line-1133"> return new SetData(path, data, version);</span> |
| <span class="source-line-no">1134</span><span id="line-1134"> }</span> |
| <span class="source-line-no">1135</span><span id="line-1135"></span> |
| <span class="source-line-no">1136</span><span id="line-1136"> /** Returns path to znode where the ZKOp will occur */</span> |
| <span class="source-line-no">1137</span><span id="line-1137"> public String getPath() {</span> |
| <span class="source-line-no">1138</span><span id="line-1138"> return path;</span> |
| <span class="source-line-no">1139</span><span id="line-1139"> }</span> |
| <span class="source-line-no">1140</span><span id="line-1140"></span> |
| <span class="source-line-no">1141</span><span id="line-1141"> /**</span> |
| <span class="source-line-no">1142</span><span id="line-1142"> * ZKUtilOp representing createAndFailSilent in ZooKeeper (attempt to create node, ignore error</span> |
| <span class="source-line-no">1143</span><span id="line-1143"> * if already exists)</span> |
| <span class="source-line-no">1144</span><span id="line-1144"> */</span> |
| <span class="source-line-no">1145</span><span id="line-1145"> public static final class CreateAndFailSilent extends ZKUtilOp {</span> |
| <span class="source-line-no">1146</span><span id="line-1146"> private byte[] data;</span> |
| <span class="source-line-no">1147</span><span id="line-1147"></span> |
| <span class="source-line-no">1148</span><span id="line-1148"> private CreateAndFailSilent(String path, byte[] data) {</span> |
| <span class="source-line-no">1149</span><span id="line-1149"> super(path);</span> |
| <span class="source-line-no">1150</span><span id="line-1150"> this.data = data;</span> |
| <span class="source-line-no">1151</span><span id="line-1151"> }</span> |
| <span class="source-line-no">1152</span><span id="line-1152"></span> |
| <span class="source-line-no">1153</span><span id="line-1153"> public byte[] getData() {</span> |
| <span class="source-line-no">1154</span><span id="line-1154"> return data;</span> |
| <span class="source-line-no">1155</span><span id="line-1155"> }</span> |
| <span class="source-line-no">1156</span><span id="line-1156"></span> |
| <span class="source-line-no">1157</span><span id="line-1157"> @Override</span> |
| <span class="source-line-no">1158</span><span id="line-1158"> public boolean equals(Object o) {</span> |
| <span class="source-line-no">1159</span><span id="line-1159"> if (this == o) {</span> |
| <span class="source-line-no">1160</span><span id="line-1160"> return true;</span> |
| <span class="source-line-no">1161</span><span id="line-1161"> }</span> |
| <span class="source-line-no">1162</span><span id="line-1162"> if (!(o instanceof CreateAndFailSilent)) {</span> |
| <span class="source-line-no">1163</span><span id="line-1163"> return false;</span> |
| <span class="source-line-no">1164</span><span id="line-1164"> }</span> |
| <span class="source-line-no">1165</span><span id="line-1165"></span> |
| <span class="source-line-no">1166</span><span id="line-1166"> CreateAndFailSilent op = (CreateAndFailSilent) o;</span> |
| <span class="source-line-no">1167</span><span id="line-1167"> return getPath().equals(op.getPath()) && Arrays.equals(data, op.data);</span> |
| <span class="source-line-no">1168</span><span id="line-1168"> }</span> |
| <span class="source-line-no">1169</span><span id="line-1169"></span> |
| <span class="source-line-no">1170</span><span id="line-1170"> @Override</span> |
| <span class="source-line-no">1171</span><span id="line-1171"> public int hashCode() {</span> |
| <span class="source-line-no">1172</span><span id="line-1172"> int ret = 17 + getPath().hashCode() * 31;</span> |
| <span class="source-line-no">1173</span><span id="line-1173"> return ret * 31 + Bytes.hashCode(data);</span> |
| <span class="source-line-no">1174</span><span id="line-1174"> }</span> |
| <span class="source-line-no">1175</span><span id="line-1175"> }</span> |
| <span class="source-line-no">1176</span><span id="line-1176"></span> |
| <span class="source-line-no">1177</span><span id="line-1177"> /**</span> |
| <span class="source-line-no">1178</span><span id="line-1178"> * ZKUtilOp representing deleteNodeFailSilent in ZooKeeper (attempt to delete node, ignore error</span> |
| <span class="source-line-no">1179</span><span id="line-1179"> * if node doesn't exist)</span> |
| <span class="source-line-no">1180</span><span id="line-1180"> */</span> |
| <span class="source-line-no">1181</span><span id="line-1181"> public static final class DeleteNodeFailSilent extends ZKUtilOp {</span> |
| <span class="source-line-no">1182</span><span id="line-1182"> private DeleteNodeFailSilent(String path) {</span> |
| <span class="source-line-no">1183</span><span id="line-1183"> super(path);</span> |
| <span class="source-line-no">1184</span><span id="line-1184"> }</span> |
| <span class="source-line-no">1185</span><span id="line-1185"></span> |
| <span class="source-line-no">1186</span><span id="line-1186"> @Override</span> |
| <span class="source-line-no">1187</span><span id="line-1187"> public boolean equals(Object o) {</span> |
| <span class="source-line-no">1188</span><span id="line-1188"> if (this == o) {</span> |
| <span class="source-line-no">1189</span><span id="line-1189"> return true;</span> |
| <span class="source-line-no">1190</span><span id="line-1190"> }</span> |
| <span class="source-line-no">1191</span><span id="line-1191"> if (!(o instanceof DeleteNodeFailSilent)) {</span> |
| <span class="source-line-no">1192</span><span id="line-1192"> return false;</span> |
| <span class="source-line-no">1193</span><span id="line-1193"> }</span> |
| <span class="source-line-no">1194</span><span id="line-1194"></span> |
| <span class="source-line-no">1195</span><span id="line-1195"> return super.equals(o);</span> |
| <span class="source-line-no">1196</span><span id="line-1196"> }</span> |
| <span class="source-line-no">1197</span><span id="line-1197"></span> |
| <span class="source-line-no">1198</span><span id="line-1198"> @Override</span> |
| <span class="source-line-no">1199</span><span id="line-1199"> public int hashCode() {</span> |
| <span class="source-line-no">1200</span><span id="line-1200"> return getPath().hashCode();</span> |
| <span class="source-line-no">1201</span><span id="line-1201"> }</span> |
| <span class="source-line-no">1202</span><span id="line-1202"> }</span> |
| <span class="source-line-no">1203</span><span id="line-1203"></span> |
| <span class="source-line-no">1204</span><span id="line-1204"> /**</span> |
| <span class="source-line-no">1205</span><span id="line-1205"> * ZKUtilOp representing setData in ZooKeeper</span> |
| <span class="source-line-no">1206</span><span id="line-1206"> */</span> |
| <span class="source-line-no">1207</span><span id="line-1207"> public static final class SetData extends ZKUtilOp {</span> |
| <span class="source-line-no">1208</span><span id="line-1208"> private byte[] data;</span> |
| <span class="source-line-no">1209</span><span id="line-1209"> private int version = -1;</span> |
| <span class="source-line-no">1210</span><span id="line-1210"></span> |
| <span class="source-line-no">1211</span><span id="line-1211"> private SetData(String path, byte[] data) {</span> |
| <span class="source-line-no">1212</span><span id="line-1212"> super(path);</span> |
| <span class="source-line-no">1213</span><span id="line-1213"> this.data = data;</span> |
| <span class="source-line-no">1214</span><span id="line-1214"> }</span> |
| <span class="source-line-no">1215</span><span id="line-1215"></span> |
| <span class="source-line-no">1216</span><span id="line-1216"> private SetData(String path, byte[] data, int version) {</span> |
| <span class="source-line-no">1217</span><span id="line-1217"> super(path);</span> |
| <span class="source-line-no">1218</span><span id="line-1218"> this.data = data;</span> |
| <span class="source-line-no">1219</span><span id="line-1219"> this.version = version;</span> |
| <span class="source-line-no">1220</span><span id="line-1220"> }</span> |
| <span class="source-line-no">1221</span><span id="line-1221"></span> |
| <span class="source-line-no">1222</span><span id="line-1222"> public byte[] getData() {</span> |
| <span class="source-line-no">1223</span><span id="line-1223"> return data;</span> |
| <span class="source-line-no">1224</span><span id="line-1224"> }</span> |
| <span class="source-line-no">1225</span><span id="line-1225"></span> |
| <span class="source-line-no">1226</span><span id="line-1226"> public int getVersion() {</span> |
| <span class="source-line-no">1227</span><span id="line-1227"> return version;</span> |
| <span class="source-line-no">1228</span><span id="line-1228"> }</span> |
| <span class="source-line-no">1229</span><span id="line-1229"></span> |
| <span class="source-line-no">1230</span><span id="line-1230"> @Override</span> |
| <span class="source-line-no">1231</span><span id="line-1231"> public boolean equals(Object o) {</span> |
| <span class="source-line-no">1232</span><span id="line-1232"> if (this == o) {</span> |
| <span class="source-line-no">1233</span><span id="line-1233"> return true;</span> |
| <span class="source-line-no">1234</span><span id="line-1234"> }</span> |
| <span class="source-line-no">1235</span><span id="line-1235"> if (!(o instanceof SetData)) {</span> |
| <span class="source-line-no">1236</span><span id="line-1236"> return false;</span> |
| <span class="source-line-no">1237</span><span id="line-1237"> }</span> |
| <span class="source-line-no">1238</span><span id="line-1238"></span> |
| <span class="source-line-no">1239</span><span id="line-1239"> SetData op = (SetData) o;</span> |
| <span class="source-line-no">1240</span><span id="line-1240"> return getPath().equals(op.getPath()) && Arrays.equals(data, op.data)</span> |
| <span class="source-line-no">1241</span><span id="line-1241"> && getVersion() == op.getVersion();</span> |
| <span class="source-line-no">1242</span><span id="line-1242"> }</span> |
| <span class="source-line-no">1243</span><span id="line-1243"></span> |
| <span class="source-line-no">1244</span><span id="line-1244"> @Override</span> |
| <span class="source-line-no">1245</span><span id="line-1245"> public int hashCode() {</span> |
| <span class="source-line-no">1246</span><span id="line-1246"> int ret = getPath().hashCode();</span> |
| <span class="source-line-no">1247</span><span id="line-1247"> ret = ret * 31 + Bytes.hashCode(data);</span> |
| <span class="source-line-no">1248</span><span id="line-1248"> return ret * 31 + Integer.hashCode(version);</span> |
| <span class="source-line-no">1249</span><span id="line-1249"> }</span> |
| <span class="source-line-no">1250</span><span id="line-1250"> }</span> |
| <span class="source-line-no">1251</span><span id="line-1251"> }</span> |
| <span class="source-line-no">1252</span><span id="line-1252"></span> |
| <span class="source-line-no">1253</span><span id="line-1253"> /**</span> |
| <span class="source-line-no">1254</span><span id="line-1254"> * Convert from ZKUtilOp to ZKOp</span> |
| <span class="source-line-no">1255</span><span id="line-1255"> */</span> |
| <span class="source-line-no">1256</span><span id="line-1256"> private static Op toZooKeeperOp(ZKWatcher zkw, ZKUtilOp op) throws UnsupportedOperationException {</span> |
| <span class="source-line-no">1257</span><span id="line-1257"> if (op == null) {</span> |
| <span class="source-line-no">1258</span><span id="line-1258"> return null;</span> |
| <span class="source-line-no">1259</span><span id="line-1259"> }</span> |
| <span class="source-line-no">1260</span><span id="line-1260"></span> |
| <span class="source-line-no">1261</span><span id="line-1261"> if (op instanceof CreateAndFailSilent) {</span> |
| <span class="source-line-no">1262</span><span id="line-1262"> CreateAndFailSilent cafs = (CreateAndFailSilent) op;</span> |
| <span class="source-line-no">1263</span><span id="line-1263"> return Op.create(cafs.getPath(), cafs.getData(), zkw.createACL(cafs.getPath()),</span> |
| <span class="source-line-no">1264</span><span id="line-1264"> CreateMode.PERSISTENT);</span> |
| <span class="source-line-no">1265</span><span id="line-1265"> } else if (op instanceof DeleteNodeFailSilent) {</span> |
| <span class="source-line-no">1266</span><span id="line-1266"> DeleteNodeFailSilent dnfs = (DeleteNodeFailSilent) op;</span> |
| <span class="source-line-no">1267</span><span id="line-1267"> return Op.delete(dnfs.getPath(), -1);</span> |
| <span class="source-line-no">1268</span><span id="line-1268"> } else if (op instanceof SetData) {</span> |
| <span class="source-line-no">1269</span><span id="line-1269"> SetData sd = (SetData) op;</span> |
| <span class="source-line-no">1270</span><span id="line-1270"> return Op.setData(sd.getPath(), sd.getData(), sd.getVersion());</span> |
| <span class="source-line-no">1271</span><span id="line-1271"> } else {</span> |
| <span class="source-line-no">1272</span><span id="line-1272"> throw new UnsupportedOperationException(</span> |
| <span class="source-line-no">1273</span><span id="line-1273"> "Unexpected ZKUtilOp type: " + op.getClass().getName());</span> |
| <span class="source-line-no">1274</span><span id="line-1274"> }</span> |
| <span class="source-line-no">1275</span><span id="line-1275"> }</span> |
| <span class="source-line-no">1276</span><span id="line-1276"></span> |
| <span class="source-line-no">1277</span><span id="line-1277"> // Static boolean for warning about useMulti because ideally there will be one warning per</span> |
| <span class="source-line-no">1278</span><span id="line-1278"> // process instance. It is fine if two threads end up racing on this for a bit. We do not</span> |
| <span class="source-line-no">1279</span><span id="line-1279"> // need to use an atomic type for this, that is overkill. The goal of reducing the number of</span> |
| <span class="source-line-no">1280</span><span id="line-1280"> // warnings from many to one or a few at startup is still achieved.</span> |
| <span class="source-line-no">1281</span><span id="line-1281"> private static boolean useMultiWarn = true;</span> |
| <span class="source-line-no">1282</span><span id="line-1282"></span> |
| <span class="source-line-no">1283</span><span id="line-1283"> /**</span> |
| <span class="source-line-no">1284</span><span id="line-1284"> * Use ZooKeeper's multi-update functionality. If all of the following are true: -</span> |
| <span class="source-line-no">1285</span><span id="line-1285"> * runSequentialOnMultiFailure is true - on calling multi, we get a ZooKeeper exception that can</span> |
| <span class="source-line-no">1286</span><span id="line-1286"> * be handled by a sequential call(*) Then: - we retry the operations one-by-one (sequentially)</span> |
| <span class="source-line-no">1287</span><span id="line-1287"> * Note *: an example is receiving a NodeExistsException from a "create" call. Without multi, a</span> |
| <span class="source-line-no">1288</span><span id="line-1288"> * user could call "createAndFailSilent" to ensure that a node exists if they don't care who</span> |
| <span class="source-line-no">1289</span><span id="line-1289"> * actually created the node (i.e. the NodeExistsException from ZooKeeper is caught). This will</span> |
| <span class="source-line-no">1290</span><span id="line-1290"> * cause all operations in the multi to fail, however, because the NodeExistsException that</span> |
| <span class="source-line-no">1291</span><span id="line-1291"> * zk.create throws will fail the multi transaction. In this case, if the previous conditions</span> |
| <span class="source-line-no">1292</span><span id="line-1292"> * hold, the commands are run sequentially, which should result in the correct final state, but</span> |
| <span class="source-line-no">1293</span><span id="line-1293"> * means that the operations will not run atomically.</span> |
| <span class="source-line-no">1294</span><span id="line-1294"> * @throws KeeperException if a ZooKeeper operation fails</span> |
| <span class="source-line-no">1295</span><span id="line-1295"> */</span> |
| <span class="source-line-no">1296</span><span id="line-1296"> public static void multiOrSequential(ZKWatcher zkw, List<ZKUtilOp> ops,</span> |
| <span class="source-line-no">1297</span><span id="line-1297"> boolean runSequentialOnMultiFailure) throws KeeperException {</span> |
| <span class="source-line-no">1298</span><span id="line-1298"> if (ops == null) {</span> |
| <span class="source-line-no">1299</span><span id="line-1299"> return;</span> |
| <span class="source-line-no">1300</span><span id="line-1300"> }</span> |
| <span class="source-line-no">1301</span><span id="line-1301"> if (useMultiWarn) { // Only check and warn at first use</span> |
| <span class="source-line-no">1302</span><span id="line-1302"> if (zkw.getConfiguration().get("hbase.zookeeper.useMulti") != null) {</span> |
| <span class="source-line-no">1303</span><span id="line-1303"> LOG.warn("hbase.zookeeper.useMulti is deprecated. Default to true always.");</span> |
| <span class="source-line-no">1304</span><span id="line-1304"> }</span> |
| <span class="source-line-no">1305</span><span id="line-1305"> useMultiWarn = false;</span> |
| <span class="source-line-no">1306</span><span id="line-1306"> }</span> |
| <span class="source-line-no">1307</span><span id="line-1307"> List<Op> zkOps = new LinkedList<>();</span> |
| <span class="source-line-no">1308</span><span id="line-1308"> for (ZKUtilOp op : ops) {</span> |
| <span class="source-line-no">1309</span><span id="line-1309"> zkOps.add(toZooKeeperOp(zkw, op));</span> |
| <span class="source-line-no">1310</span><span id="line-1310"> }</span> |
| <span class="source-line-no">1311</span><span id="line-1311"> try {</span> |
| <span class="source-line-no">1312</span><span id="line-1312"> zkw.getRecoverableZooKeeper().multi(zkOps);</span> |
| <span class="source-line-no">1313</span><span id="line-1313"> } catch (KeeperException ke) {</span> |
| <span class="source-line-no">1314</span><span id="line-1314"> switch (ke.code()) {</span> |
| <span class="source-line-no">1315</span><span id="line-1315"> case NODEEXISTS:</span> |
| <span class="source-line-no">1316</span><span id="line-1316"> case NONODE:</span> |
| <span class="source-line-no">1317</span><span id="line-1317"> case BADVERSION:</span> |
| <span class="source-line-no">1318</span><span id="line-1318"> case NOAUTH:</span> |
| <span class="source-line-no">1319</span><span id="line-1319"> case NOTEMPTY:</span> |
| <span class="source-line-no">1320</span><span id="line-1320"> // if we get an exception that could be solved by running sequentially</span> |
| <span class="source-line-no">1321</span><span id="line-1321"> // (and the client asked us to), then break out and run sequentially</span> |
| <span class="source-line-no">1322</span><span id="line-1322"> if (runSequentialOnMultiFailure) {</span> |
| <span class="source-line-no">1323</span><span id="line-1323"> LOG.info(</span> |
| <span class="source-line-no">1324</span><span id="line-1324"> "multi exception: {}; running operations sequentially "</span> |
| <span class="source-line-no">1325</span><span id="line-1325"> + "(runSequentialOnMultiFailure=true); {}",</span> |
| <span class="source-line-no">1326</span><span id="line-1326"> ke.toString(), ops.stream().map(o -> o.toString()).collect(Collectors.joining(",")));</span> |
| <span class="source-line-no">1327</span><span id="line-1327"> processSequentially(zkw, ops);</span> |
| <span class="source-line-no">1328</span><span id="line-1328"> break;</span> |
| <span class="source-line-no">1329</span><span id="line-1329"> }</span> |
| <span class="source-line-no">1330</span><span id="line-1330"> default:</span> |
| <span class="source-line-no">1331</span><span id="line-1331"> throw ke;</span> |
| <span class="source-line-no">1332</span><span id="line-1332"> }</span> |
| <span class="source-line-no">1333</span><span id="line-1333"> } catch (InterruptedException ie) {</span> |
| <span class="source-line-no">1334</span><span id="line-1334"> zkw.interruptedException(ie);</span> |
| <span class="source-line-no">1335</span><span id="line-1335"> }</span> |
| <span class="source-line-no">1336</span><span id="line-1336"> }</span> |
| <span class="source-line-no">1337</span><span id="line-1337"></span> |
| <span class="source-line-no">1338</span><span id="line-1338"> private static void processSequentially(ZKWatcher zkw, List<ZKUtilOp> ops)</span> |
| <span class="source-line-no">1339</span><span id="line-1339"> throws KeeperException, NoNodeException {</span> |
| <span class="source-line-no">1340</span><span id="line-1340"> for (ZKUtilOp op : ops) {</span> |
| <span class="source-line-no">1341</span><span id="line-1341"> if (op instanceof CreateAndFailSilent) {</span> |
| <span class="source-line-no">1342</span><span id="line-1342"> createAndFailSilent(zkw, (CreateAndFailSilent) op);</span> |
| <span class="source-line-no">1343</span><span id="line-1343"> } else if (op instanceof DeleteNodeFailSilent) {</span> |
| <span class="source-line-no">1344</span><span id="line-1344"> deleteNodeFailSilent(zkw, (DeleteNodeFailSilent) op);</span> |
| <span class="source-line-no">1345</span><span id="line-1345"> } else if (op instanceof SetData) {</span> |
| <span class="source-line-no">1346</span><span id="line-1346"> setData(zkw, (SetData) op);</span> |
| <span class="source-line-no">1347</span><span id="line-1347"> } else {</span> |
| <span class="source-line-no">1348</span><span id="line-1348"> throw new UnsupportedOperationException(</span> |
| <span class="source-line-no">1349</span><span id="line-1349"> "Unexpected ZKUtilOp type: " + op.getClass().getName());</span> |
| <span class="source-line-no">1350</span><span id="line-1350"> }</span> |
| <span class="source-line-no">1351</span><span id="line-1351"> }</span> |
| <span class="source-line-no">1352</span><span id="line-1352"> }</span> |
| <span class="source-line-no">1353</span><span id="line-1353"></span> |
| <span class="source-line-no">1354</span><span id="line-1354"> //</span> |
| <span class="source-line-no">1355</span><span id="line-1355"> // ZooKeeper cluster information</span> |
| <span class="source-line-no">1356</span><span id="line-1356"> //</span> |
| <span class="source-line-no">1357</span><span id="line-1357"></span> |
| <span class="source-line-no">1358</span><span id="line-1358"> private static void logRetrievedMsg(final ZKWatcher zkw, final String znode, final byte[] data,</span> |
| <span class="source-line-no">1359</span><span id="line-1359"> final boolean watcherSet) {</span> |
| <span class="source-line-no">1360</span><span id="line-1360"> if (!LOG.isTraceEnabled()) {</span> |
| <span class="source-line-no">1361</span><span id="line-1361"> return;</span> |
| <span class="source-line-no">1362</span><span id="line-1362"> }</span> |
| <span class="source-line-no">1363</span><span id="line-1363"></span> |
| <span class="source-line-no">1364</span><span id="line-1364"> LOG.trace(zkw.prefix("Retrieved " + ((data == null) ? 0 : data.length)</span> |
| <span class="source-line-no">1365</span><span id="line-1365"> + " byte(s) of data from znode " + znode + (watcherSet ? " and set watcher; " : "; data=")</span> |
| <span class="source-line-no">1366</span><span id="line-1366"> + (data == null ? "null"</span> |
| <span class="source-line-no">1367</span><span id="line-1367"> : data.length == 0 ? "empty"</span> |
| <span class="source-line-no">1368</span><span id="line-1368"> : (zkw.getZNodePaths().isMetaZNodePath(znode) ? getServerNameOrEmptyString(data)</span> |
| <span class="source-line-no">1369</span><span id="line-1369"> : znode.startsWith(zkw.getZNodePaths().backupMasterAddressesZNode)</span> |
| <span class="source-line-no">1370</span><span id="line-1370"> ? getServerNameOrEmptyString(data)</span> |
| <span class="source-line-no">1371</span><span id="line-1371"> : StringUtils.abbreviate(Bytes.toStringBinary(data), 32)))));</span> |
| <span class="source-line-no">1372</span><span id="line-1372"> }</span> |
| <span class="source-line-no">1373</span><span id="line-1373"></span> |
| <span class="source-line-no">1374</span><span id="line-1374"> private static String getServerNameOrEmptyString(final byte[] data) {</span> |
| <span class="source-line-no">1375</span><span id="line-1375"> try {</span> |
| <span class="source-line-no">1376</span><span id="line-1376"> return ProtobufUtil.parseServerNameFrom(data).toString();</span> |
| <span class="source-line-no">1377</span><span id="line-1377"> } catch (DeserializationException e) {</span> |
| <span class="source-line-no">1378</span><span id="line-1378"> return "";</span> |
| <span class="source-line-no">1379</span><span id="line-1379"> }</span> |
| <span class="source-line-no">1380</span><span id="line-1380"> }</span> |
| <span class="source-line-no">1381</span><span id="line-1381"></span> |
| <span class="source-line-no">1382</span><span id="line-1382"> /**</span> |
| <span class="source-line-no">1383</span><span id="line-1383"> * Waits for HBase installation's base (parent) znode to become available.</span> |
| <span class="source-line-no">1384</span><span id="line-1384"> * @throws IOException on ZK errors</span> |
| <span class="source-line-no">1385</span><span id="line-1385"> */</span> |
| <span class="source-line-no">1386</span><span id="line-1386"> public static void waitForBaseZNode(Configuration conf) throws IOException {</span> |
| <span class="source-line-no">1387</span><span id="line-1387"> LOG.info("Waiting until the base znode is available");</span> |
| <span class="source-line-no">1388</span><span id="line-1388"> String parentZNode =</span> |
| <span class="source-line-no">1389</span><span id="line-1389"> conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT, HConstants.DEFAULT_ZOOKEEPER_ZNODE_PARENT);</span> |
| <span class="source-line-no">1390</span><span id="line-1390"> ZooKeeper zk = new ZooKeeper(ZKConfig.getZKQuorumServersString(conf),</span> |
| <span class="source-line-no">1391</span><span id="line-1391"> conf.getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT),</span> |
| <span class="source-line-no">1392</span><span id="line-1392"> EmptyWatcher.instance);</span> |
| <span class="source-line-no">1393</span><span id="line-1393"></span> |
| <span class="source-line-no">1394</span><span id="line-1394"> final int maxTimeMs = 10000;</span> |
| <span class="source-line-no">1395</span><span id="line-1395"> final int maxNumAttempts = maxTimeMs / HConstants.SOCKET_RETRY_WAIT_MS;</span> |
| <span class="source-line-no">1396</span><span id="line-1396"></span> |
| <span class="source-line-no">1397</span><span id="line-1397"> KeeperException keeperEx = null;</span> |
| <span class="source-line-no">1398</span><span id="line-1398"> try {</span> |
| <span class="source-line-no">1399</span><span id="line-1399"> try {</span> |
| <span class="source-line-no">1400</span><span id="line-1400"> for (int attempt = 0; attempt < maxNumAttempts; ++attempt) {</span> |
| <span class="source-line-no">1401</span><span id="line-1401"> try {</span> |
| <span class="source-line-no">1402</span><span id="line-1402"> if (zk.exists(parentZNode, false) != null) {</span> |
| <span class="source-line-no">1403</span><span id="line-1403"> LOG.info("Parent znode exists: {}", parentZNode);</span> |
| <span class="source-line-no">1404</span><span id="line-1404"> keeperEx = null;</span> |
| <span class="source-line-no">1405</span><span id="line-1405"> break;</span> |
| <span class="source-line-no">1406</span><span id="line-1406"> }</span> |
| <span class="source-line-no">1407</span><span id="line-1407"> } catch (KeeperException e) {</span> |
| <span class="source-line-no">1408</span><span id="line-1408"> keeperEx = e;</span> |
| <span class="source-line-no">1409</span><span id="line-1409"> }</span> |
| <span class="source-line-no">1410</span><span id="line-1410"> Threads.sleepWithoutInterrupt(HConstants.SOCKET_RETRY_WAIT_MS);</span> |
| <span class="source-line-no">1411</span><span id="line-1411"> }</span> |
| <span class="source-line-no">1412</span><span id="line-1412"> } finally {</span> |
| <span class="source-line-no">1413</span><span id="line-1413"> zk.close();</span> |
| <span class="source-line-no">1414</span><span id="line-1414"> }</span> |
| <span class="source-line-no">1415</span><span id="line-1415"> } catch (InterruptedException ex) {</span> |
| <span class="source-line-no">1416</span><span id="line-1416"> Thread.currentThread().interrupt();</span> |
| <span class="source-line-no">1417</span><span id="line-1417"> }</span> |
| <span class="source-line-no">1418</span><span id="line-1418"></span> |
| <span class="source-line-no">1419</span><span id="line-1419"> if (keeperEx != null) {</span> |
| <span class="source-line-no">1420</span><span id="line-1420"> throw new IOException(keeperEx);</span> |
| <span class="source-line-no">1421</span><span id="line-1421"> }</span> |
| <span class="source-line-no">1422</span><span id="line-1422"> }</span> |
| <span class="source-line-no">1423</span><span id="line-1423"></span> |
| <span class="source-line-no">1424</span><span id="line-1424"> /**</span> |
| <span class="source-line-no">1425</span><span id="line-1425"> * Convert a {@link DeserializationException} to a more palatable {@link KeeperException}. Used</span> |
| <span class="source-line-no">1426</span><span id="line-1426"> * when can't let a {@link DeserializationException} out w/o changing public API.</span> |
| <span class="source-line-no">1427</span><span id="line-1427"> * @param e Exception to convert</span> |
| <span class="source-line-no">1428</span><span id="line-1428"> * @return Converted exception</span> |
| <span class="source-line-no">1429</span><span id="line-1429"> */</span> |
| <span class="source-line-no">1430</span><span id="line-1430"> public static KeeperException convert(final DeserializationException e) {</span> |
| <span class="source-line-no">1431</span><span id="line-1431"> KeeperException ke = new KeeperException.DataInconsistencyException();</span> |
| <span class="source-line-no">1432</span><span id="line-1432"> ke.initCause(e);</span> |
| <span class="source-line-no">1433</span><span id="line-1433"> return ke;</span> |
| <span class="source-line-no">1434</span><span id="line-1434"> }</span> |
| <span class="source-line-no">1435</span><span id="line-1435"></span> |
| <span class="source-line-no">1436</span><span id="line-1436"> /**</span> |
| <span class="source-line-no">1437</span><span id="line-1437"> * Recursively print the current state of ZK (non-transactional)</span> |
| <span class="source-line-no">1438</span><span id="line-1438"> * @param root name of the root directory in zk to print</span> |
| <span class="source-line-no">1439</span><span id="line-1439"> */</span> |
| <span class="source-line-no">1440</span><span id="line-1440"> public static void logZKTree(ZKWatcher zkw, String root) {</span> |
| <span class="source-line-no">1441</span><span id="line-1441"> if (!LOG.isDebugEnabled()) {</span> |
| <span class="source-line-no">1442</span><span id="line-1442"> return;</span> |
| <span class="source-line-no">1443</span><span id="line-1443"> }</span> |
| <span class="source-line-no">1444</span><span id="line-1444"></span> |
| <span class="source-line-no">1445</span><span id="line-1445"> LOG.debug("Current zk system:");</span> |
| <span class="source-line-no">1446</span><span id="line-1446"> String prefix = "|-";</span> |
| <span class="source-line-no">1447</span><span id="line-1447"> LOG.debug(prefix + root);</span> |
| <span class="source-line-no">1448</span><span id="line-1448"> try {</span> |
| <span class="source-line-no">1449</span><span id="line-1449"> logZKTree(zkw, root, prefix);</span> |
| <span class="source-line-no">1450</span><span id="line-1450"> } catch (KeeperException e) {</span> |
| <span class="source-line-no">1451</span><span id="line-1451"> throw new RuntimeException(e);</span> |
| <span class="source-line-no">1452</span><span id="line-1452"> }</span> |
| <span class="source-line-no">1453</span><span id="line-1453"> }</span> |
| <span class="source-line-no">1454</span><span id="line-1454"></span> |
| <span class="source-line-no">1455</span><span id="line-1455"> /**</span> |
| <span class="source-line-no">1456</span><span id="line-1456"> * Helper method to print the current state of the ZK tree.</span> |
| <span class="source-line-no">1457</span><span id="line-1457"> * @see #logZKTree(ZKWatcher, String)</span> |
| <span class="source-line-no">1458</span><span id="line-1458"> * @throws KeeperException if an unexpected exception occurs</span> |
| <span class="source-line-no">1459</span><span id="line-1459"> */</span> |
| <span class="source-line-no">1460</span><span id="line-1460"> private static void logZKTree(ZKWatcher zkw, String root, String prefix) throws KeeperException {</span> |
| <span class="source-line-no">1461</span><span id="line-1461"> List<String> children = ZKUtil.listChildrenNoWatch(zkw, root);</span> |
| <span class="source-line-no">1462</span><span id="line-1462"></span> |
| <span class="source-line-no">1463</span><span id="line-1463"> if (children == null) {</span> |
| <span class="source-line-no">1464</span><span id="line-1464"> return;</span> |
| <span class="source-line-no">1465</span><span id="line-1465"> }</span> |
| <span class="source-line-no">1466</span><span id="line-1466"></span> |
| <span class="source-line-no">1467</span><span id="line-1467"> for (String child : children) {</span> |
| <span class="source-line-no">1468</span><span id="line-1468"> LOG.debug(prefix + child);</span> |
| <span class="source-line-no">1469</span><span id="line-1469"> String node = ZNodePaths.joinZNode(root.equals("/") ? "" : root, child);</span> |
| <span class="source-line-no">1470</span><span id="line-1470"> logZKTree(zkw, node, prefix + "---");</span> |
| <span class="source-line-no">1471</span><span id="line-1471"> }</span> |
| <span class="source-line-no">1472</span><span id="line-1472"> }</span> |
| <span class="source-line-no">1473</span><span id="line-1473"></span> |
| <span class="source-line-no">1474</span><span id="line-1474"> /**</span> |
| <span class="source-line-no">1475</span><span id="line-1475"> * @param position the position to serialize</span> |
| <span class="source-line-no">1476</span><span id="line-1476"> * @return Serialized protobuf of <code>position</code> with pb magic prefix prepended suitable</span> |
| <span class="source-line-no">1477</span><span id="line-1477"> * for use as content of an wal position in a replication queue.</span> |
| <span class="source-line-no">1478</span><span id="line-1478"> */</span> |
| <span class="source-line-no">1479</span><span id="line-1479"> public static byte[] positionToByteArray(final long position) {</span> |
| <span class="source-line-no">1480</span><span id="line-1480"> byte[] bytes = ReplicationProtos.ReplicationHLogPosition.newBuilder().setPosition(position)</span> |
| <span class="source-line-no">1481</span><span id="line-1481"> .build().toByteArray();</span> |
| <span class="source-line-no">1482</span><span id="line-1482"> return ProtobufUtil.prependPBMagic(bytes);</span> |
| <span class="source-line-no">1483</span><span id="line-1483"> }</span> |
| <span class="source-line-no">1484</span><span id="line-1484"></span> |
| <span class="source-line-no">1485</span><span id="line-1485"> /**</span> |
| <span class="source-line-no">1486</span><span id="line-1486"> * @param bytes - Content of a WAL position znode.</span> |
| <span class="source-line-no">1487</span><span id="line-1487"> * @return long - The current WAL position.</span> |
| <span class="source-line-no">1488</span><span id="line-1488"> * @throws DeserializationException if the WAL position cannot be parsed</span> |
| <span class="source-line-no">1489</span><span id="line-1489"> */</span> |
| <span class="source-line-no">1490</span><span id="line-1490"> public static long parseWALPositionFrom(final byte[] bytes) throws DeserializationException {</span> |
| <span class="source-line-no">1491</span><span id="line-1491"> if (bytes == null) {</span> |
| <span class="source-line-no">1492</span><span id="line-1492"> throw new DeserializationException("Unable to parse null WAL position.");</span> |
| <span class="source-line-no">1493</span><span id="line-1493"> }</span> |
| <span class="source-line-no">1494</span><span id="line-1494"> if (ProtobufUtil.isPBMagicPrefix(bytes)) {</span> |
| <span class="source-line-no">1495</span><span id="line-1495"> int pblen = ProtobufUtil.lengthOfPBMagic();</span> |
| <span class="source-line-no">1496</span><span id="line-1496"> ReplicationProtos.ReplicationHLogPosition.Builder builder =</span> |
| <span class="source-line-no">1497</span><span id="line-1497"> ReplicationProtos.ReplicationHLogPosition.newBuilder();</span> |
| <span class="source-line-no">1498</span><span id="line-1498"> ReplicationProtos.ReplicationHLogPosition position;</span> |
| <span class="source-line-no">1499</span><span id="line-1499"> try {</span> |
| <span class="source-line-no">1500</span><span id="line-1500"> ProtobufUtil.mergeFrom(builder, bytes, pblen, bytes.length - pblen);</span> |
| <span class="source-line-no">1501</span><span id="line-1501"> position = builder.build();</span> |
| <span class="source-line-no">1502</span><span id="line-1502"> } catch (IOException e) {</span> |
| <span class="source-line-no">1503</span><span id="line-1503"> throw new DeserializationException(e);</span> |
| <span class="source-line-no">1504</span><span id="line-1504"> }</span> |
| <span class="source-line-no">1505</span><span id="line-1505"> return position.getPosition();</span> |
| <span class="source-line-no">1506</span><span id="line-1506"> } else {</span> |
| <span class="source-line-no">1507</span><span id="line-1507"> if (bytes.length > 0) {</span> |
| <span class="source-line-no">1508</span><span id="line-1508"> return Bytes.toLong(bytes);</span> |
| <span class="source-line-no">1509</span><span id="line-1509"> }</span> |
| <span class="source-line-no">1510</span><span id="line-1510"> return 0;</span> |
| <span class="source-line-no">1511</span><span id="line-1511"> }</span> |
| <span class="source-line-no">1512</span><span id="line-1512"> }</span> |
| <span class="source-line-no">1513</span><span id="line-1513">}</span> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </pre> |
| </div> |
| </main> |
| </body> |
| </html> |