Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
 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]
Exemplo n.º 4
0
 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]