def create(self, path, value=b"", sequence=False, ephemeral=False, session_id=None): def sequence_iter(path, parent_path): for i in itertools.count(0): sequence_id = self._sequences.get(parent_path, 0) if sequence_id == SEQ_ROLLOVER: self._sequences[parent_path] = SEQ_ROLLOVER_TO else: self._sequences[parent_path] = sequence_id + 1 yield path + '%010d' % (sequence_id) parent_path, _node_name = os.path.split(path) with self.lock: if sequence: for possible_path in sequence_iter(path, parent_path): if possible_path not in self: path = possible_path break parents = sorted(six.iterkeys(self.get_parents(path))) if parent_path not in self: if sequence: self._sequences.pop(parent_path, None) raise k_exceptions.NoNodeError( "Parent node %s does not exist" % (parent_path)) if ephemeral and not session_id: raise k_exceptions.SystemZookeeperError("Ephemeral node %s can" " not be created" " without a session" " id" % path) if path in self: raise k_exceptions.NodeExistsError("Node %s already" " exists" % (path)) for parent_path in reversed(parents): if self._paths[parent_path]['ephemeral']: raise k_exceptions.NoChildrenForEphemeralsError( "Parent %s is ephemeral" % parent_path) path_data = { # Kazoo clients expect in milliseconds 'created_on': utils.millitime(), 'updated_on': utils.millitime(), 'version': 0, # Not supported for now... 'aversion': -1, 'cversion': -1, 'data': value, } if ephemeral: path_data['ephemeral_owner'] = session_id path_data['ephemeral'] = True else: path_data['ephemeral'] = False self._paths[path] = path_data return (True, parents, path)
def create(self, path, value=b"", sequence=False, ephemeral=False, session_id=None): def sequence_iter(path, parent_path): for i in itertools.count(0): sequence_id = self._sequences.get(parent_path, 0) if sequence_id == SEQ_ROLLOVER: self._sequences[parent_path] = SEQ_ROLLOVER_TO else: self._sequences[parent_path] = sequence_id + 1 yield path + '%010d' % (sequence_id) parent_path, _node_name = os.path.split(path) with self.lock: if sequence: for possible_path in sequence_iter(path, parent_path): if possible_path not in self: path = possible_path break parents = sorted(six.iterkeys(self.get_parents(path))) if parent_path not in self: if sequence: self._sequences.pop(parent_path, None) raise k_exceptions.NoNodeError("Parent node %s does not exist" % (parent_path)) if ephemeral and not session_id: raise k_exceptions.SystemZookeeperError("Ephemeral node %s can" " not be created" " without a session" " id" % path) if path in self: raise k_exceptions.NodeExistsError("Node %s already" " exists" % (path)) for parent_path in reversed(parents): if self._paths[parent_path]['ephemeral']: raise k_exceptions.NoChildrenForEphemeralsError( "Parent %s is ephemeral" % parent_path) path_data = { # Kazoo clients expect in milliseconds 'created_on': utils.millitime(), 'updated_on': utils.millitime(), 'version': 0, # Not supported for now... 'aversion': -1, 'cversion': -1, 'data': value, } if ephemeral: path_data['ephemeral_owner'] = session_id path_data['ephemeral'] = True else: path_data['ephemeral'] = False self._paths[path] = path_data return (True, parents, path)
def set(self, path, value, version=-1): with self.lock: if version != -1: stat = self.get(path)[1] if stat.version != version: raise k_exceptions.BadVersionError("Version mismatch %s " "!= %s" % (stat.version, version)) self._paths[path]['data'] = value self._paths[path]['updated_on'] = utils.millitime() self._paths[path]['version'] += 1 else: self._paths[path]['data'] = value self._paths[path]['updated_on'] = utils.millitime() self._paths[path]['version'] += 1 return self.get(path)[1]