public void SetNode(string path, string value, IEnumerable <ACL> acl) { var stat = Zookeeper.Exists(path, false); if (stat == null) { var createRet = Zookeeper.Create(path, value.GetBytes(), acl, CreateMode.Persistent); } else { Zookeeper.SetData(path, value.GetBytes(), stat.Version); } }
/** * Ensures that the given path exists with the given data, ACL and flags * @param path * @param acl * @param flags */ protected void EnsureExists(string path, byte[] data, List <ACL> acl, CreateMode flags) { try { var components = path.Split(PathUtils.PathSeparatorCharAsArray, StringSplitOptions.RemoveEmptyEntries); var pathBuilder = new StringBuilder(path.Length); for (var i = 0; i < components.Length; ++i) { // Create a loop-scoped variable to avoid closure troubles // inside RetryOperation. var isLastComponent = (i == components.Length - 1); var component = components[i]; pathBuilder.Append(PathUtils.PathSeparator); pathBuilder.Append(component); var currentPartialPath = pathBuilder.ToString(); RetryOperation(() => { var stat = Zookeeper.Exists(currentPartialPath, false); if (stat != null) { return(true); } Zookeeper.Create(currentPartialPath, isLastComponent ? data : null, acl, flags); return(true); }); } } catch (KeeperException e) { LOG.WarnFormat("Caught: {0} {1}", e, e.StackTrace); } catch (ThreadInterruptedException e) { LOG.WarnFormat("Caught: {0} {1}", e, e.StackTrace); } }
/** * Ensures that the given path exists with the given data, ACL and flags * @param path * @param acl * @param flags */ protected void EnsureExists(string path, byte[] data, List <ACL> acl, CreateMode flags) { try { RetryOperation(() => { Stat stat = Zookeeper.Exists(path, false); if (stat != null) { return(true); } Zookeeper.Create(path, data, acl, flags); return(true); }); } catch (KeeperException e) { LOG.WarnFormat("Caught: {0} {1}", e, e.StackTrace); } catch (ThreadInterruptedException e) { LOG.WarnFormat("Caught: {0} {1}", e, e.StackTrace); } }
public bool RunForLeader() { long sessionId = Zookeeper.SessionId; string prefix = "election-" + sessionId + "-"; var names = Zookeeper.GetChildren(path, false); // See whether we have already run for election in this process foreach (string name in names) { if (name.StartsWith(prefix)) { id = name; if (LOG.IsDebugEnabled) { LOG.DebugFormat("Found id created last time: {0}", id); } } } if (id == null) { id = Zookeeper.Create(path.Combine(prefix), data, Acl, CreateMode.EphemeralSequential); if (LOG.IsDebugEnabled) { LOG.DebugFormat("Created id: {0}", id); } } idName = new ZNodeName(id); names = Zookeeper.GetChildren(path, false); var sortedNames = new SortedSet <ZNodeName>(); foreach (var name in names) { sortedNames.Add(new ZNodeName(name)); } var priors = sortedNames.HeadSet(idName); if (priors.Count == 0) { throw new InvalidOperationException("Count of priors is 0, but should at least include this node."); } if (priors.Count == 1) { IsOwner = true; watcher.TakeLeadership(); return(true); } // only watch the node directly before us ZNodeName penultimate = null, last = null; foreach (var name in sortedNames) { penultimate = last; last = name; } if (penultimate == null) { throw new InvalidOperationException("Penultimate value in priors is null, but count shoudl have been at least 2."); } var penultimatePath = path.Combine(penultimate.Name); if (Zookeeper.Exists(penultimatePath, new LeaderWatcher(Zookeeper, this, penultimatePath, watcher, path, id)) == null) { IsOwner = true; watcher.TakeLeadership(); return(true); } return(false); }