Пример #1
0
 def test_start_raises(self):
     self.coordinator = coordination.RugCoordinator(self.queue)
     self.fake_coord.create_group.side_effect = (
         tz_coordination.GroupAlreadyExist(self.coordinator.group))
     self.fake_coord.join_group.side_effect = (
         tz_coordination.MemberAlreadyExist(
             self.coordinator.host, self.coordinator.group))
     return self.test_start()
Пример #2
0
 def _join_group_handler(async_result, timeout, group_id, member_id):
     try:
         async_result.get(block=True, timeout=timeout)
     except exceptions.NodeExistsError:
         raise coordination.MemberAlreadyExist(group_id, member_id)
     except exceptions.NoNodeError:
         raise coordination.GroupNotCreated(group_id)
     except exceptions.ZookeeperError as e:
         raise coordination.ToozError(str(e))
Пример #3
0
 def _join_group(p):
     if not p.exists(encoded_group):
         raise coordination.GroupNotCreated(group_id)
     p.multi()
     p.hset(encoded_group, encoded_member_id, self._dumps(capabilities))
     c = p.execute()[0]
     if c == 0:
         # Field already exists...
         raise coordination.MemberAlreadyExist(group_id,
                                               self._member_id)
     else:
         self._joined_groups.add(group_id)
Пример #4
0
 def _join_group():
     group_members, cas = self.client.gets(encoded_group)
     if group_members is None:
         raise coordination.GroupNotCreated(group_id)
     if self._member_id in group_members:
         raise coordination.MemberAlreadyExist(group_id,
                                               self._member_id)
     group_members[self._member_id] = {
         b"capabilities": capabilities,
     }
     if not self.client.cas(encoded_group, group_members, cas):
         # It changed, let's try again
         raise _retry.TryAgain
     self._joined_groups.add(group_id)
Пример #5
0
 def _do_join_group():
     if not os.path.isdir(group_dir):
         raise coordination.GroupNotCreated(group_id)
     if os.path.isfile(me_path):
         raise coordination.MemberAlreadyExist(group_id,
                                               self._member_id)
     details = {
         'capabilities': capabilities,
         'joined_on': datetime.datetime.now(),
         'member_id': self._member_id,
     }
     details_blob = utils.dumps(details)
     with open(me_path, "wb") as fh:
         fh.write(details_blob)
     self._joined_groups.add(group_id)
Пример #6
0
 def _join_group_handler(async_result, timeout, timeout_exception, group_id,
                         member_id):
     try:
         async_result.get(block=True, timeout=timeout)
     except timeout_exception as e:
         utils.raise_with_cause(coordination.OperationTimedOut,
                                encodeutils.exception_to_unicode(e),
                                cause=e)
     except exceptions.NodeExistsError:
         raise coordination.MemberAlreadyExist(group_id, member_id)
     except exceptions.NoNodeError:
         raise coordination.GroupNotCreated(group_id)
     except exceptions.ZookeeperError as e:
         utils.raise_with_cause(tooz.ToozError,
                                encodeutils.exception_to_unicode(e),
                                cause=e)
Пример #7
0
 def _do_join_group():
     if not os.path.exists(os.path.join(group_dir, ".metadata")):
         raise coordination.GroupNotCreated(group_id)
     if os.path.isfile(me_path):
         raise coordination.MemberAlreadyExist(group_id,
                                               self._member_id)
     details = {
         u'capabilities': capabilities,
         u'joined_on': datetime.datetime.now(),
         u'member_id': utils.to_binary(self._member_id,
                                       encoding="utf-8")
     }
     details[u'encoded'] = details[u"member_id"] != self._member_id
     details_blob = utils.dumps(details)
     with open(me_path, "wb") as fh:
         fh.write(details_blob)
     self._joined_groups.add(group_id)
Пример #8
0
        def _join_group():
            # lock the group so that it doesn't get deleted while we join
            with self._get_group_lock(group_id):
                group_path = self._path_group(group_id)
                member_path = self._path_member(group_id, self._member_id)
                group, members = self._get_group_members(group_path)
                if not group:
                    raise coordination.GroupNotCreated(group_id)

                for m in members:
                    if m["Key"] == member_path:
                        raise coordination.MemberAlreadyExist(
                            group_id, self._member_id)

                # create with Check-And-Set index 0 will only succeed if the
                # key doesn't exit
                self._client.kv.put(member_path,
                                    utils.dumps(capabilities),
                                    cas=0)
                self._joined_groups.add(group_id)
Пример #9
0
        def _join_group():
            prefix_group = self._prefix_group(group_id)
            prefix_member = prefix_group + self._member_id
            members = self.client.get_prefix(prefix_group)

            encoded_member = _encode(prefix_member)

            group_metadata = None
            for cap, metadata in members:
                if metadata['key'] == prefix_member:
                    raise coordination.MemberAlreadyExist(group_id,
                                                          self._member_id)
                if metadata['key'] == prefix_group:
                    group_metadata = metadata

            if group_metadata is None:
                raise coordination.GroupNotCreated(group_id)

            encoded_group = self._encode_group_id(group_id)
            txn = {
                'compare': [{
                    'key': encoded_group,
                    'result': 'EQUAL',
                    'target': 'VERSION',
                    'version': int(group_metadata['version'])
                }],
                'success': [{
                    'request_put': {
                        'key': encoded_member,
                        'value': _encode(utils.dumps(capabilities)),
                        'lease': self._membership_lease.id
                    }
                }],
                'failure': []
            }
            result = self.client.transaction(txn)
            if not result.get('succeeded'):
                raise _retry.TryAgain
            else:
                self._joined_groups.add(group_id)
Пример #10
0
        def _join_group():
            members = list(self.client.get_prefix(encoded_group))

            encoded_member = self._encode_group_member_id(
                group_id, self._member_id)

            group_metadata = None
            for cap, metadata in members:
                if metadata.key == encoded_member:
                    raise coordination.MemberAlreadyExist(
                        group_id, self._member_id)
                if metadata.key == encoded_group:
                    group_metadata = metadata

            if group_metadata is None:
                raise coordination.GroupNotCreated(group_id)

            status, results = self.client.transaction(
                # This comparison makes sure the group has not been deleted in
                # the mean time
                compare=[
                    self.client.transactions.version(encoded_group) ==
                    group_metadata.version
                ],
                success=[
                    self.client.transactions.put(encoded_member,
                                                 utils.dumps(capabilities),
                                                 lease=self._membership_lease)
                ],
                failure=[],
            )
            if not status:
                # TODO(jd) There's a small optimization doable by getting the
                # current range on failure and passing it to this function as
                # the first arg when retrying to avoid redoing a get_prefix()
                raise _retry.TryAgain