From 9d54b16914885f294d1c37c87f58dbcd3a0373c7 Mon Sep 17 00:00:00 2001 From: Ayoub Boudhar Date: Wed, 21 Nov 2018 10:23:25 +0100 Subject: [PATCH] oio-meta2-mover, Python API: Delete meta2 index entries from old peer --- bin/oio-meta2-mover | 3 ++- oio/directory/meta.py | 10 +++++++++- oio/directory/meta1.py | 13 +++++++++++++ oio/rdir/client.py | 6 +++--- 4 files changed, 27 insertions(+), 5 deletions(-) mode change 100644 => 100755 bin/oio-meta2-mover diff --git a/bin/oio-meta2-mover b/bin/oio-meta2-mover old mode 100644 new mode 100755 index d31268dfb9..3af7c9c082 --- a/bin/oio-meta2-mover +++ b/bin/oio-meta2-mover @@ -54,7 +54,8 @@ if __name__ == '__main__': mapping = Meta1RefMapping(args.namespace) moved = mapping.move(args.src_service, args.dest_service, args.base, 'meta2') - moved_ok = mapping.apply(moved) + kwargs = {'src_service': args.src_service} + moved_ok = mapping.apply(moved, **kwargs) except Exception as exc: print("ERROR: " + str(exc)) if not moved_ok: diff --git a/oio/directory/meta.py b/oio/directory/meta.py index 5fcf969b7b..e33df3487f 100644 --- a/oio/directory/meta.py +++ b/oio/directory/meta.py @@ -16,6 +16,7 @@ from collections import defaultdict from oio.directory.admin import AdminClient +from oio.rdir.client import RdirClient from oio.conscience.client import ConscienceClient from oio.common.exceptions import OioException, ServiceBusy from oio.common.logger import get_logger @@ -26,10 +27,11 @@ class MetaMapping(object): def __init__(self, conf, service_types, admin_client=None, conscience_client=None, logger=None, - **kwargs): + rdir_client=None, **kwargs): self.conf = conf self._admin = admin_client self._conscience = conscience_client + self._rdir = rdir_client self.logger = logger or get_logger(self.conf) self.raw_services_by_base = defaultdict(list) self.services_by_base = dict() @@ -50,6 +52,12 @@ def conscience(self): self._conscience = ConscienceClient(self.conf) return self._conscience + @property + def rdir(self): + if not self._rdir: + self._rdir = RdirClient(self.conf) + return self._rdir + def reset(self): """ Reset the base allocations and reload the services from Conscience. diff --git a/oio/directory/meta1.py b/oio/directory/meta1.py index 11e5bc0646..8e982f36cf 100644 --- a/oio/directory/meta1.py +++ b/oio/directory/meta1.py @@ -53,6 +53,19 @@ def _apply_link_services(self, moved_ok, **kwargs): service_type=service_type, cid=cid, replace=True, services=dict(host=','.join(peers), type=service_type, args=args, seq=seq)) + """ + FIXME(ABO): This part can be removed when, either: + - meta1 sends the removed services bundled with the + account.services events. + - meta2 sends a storage.container.deleted event when the + sqliterepo layer is the one that notifies the deletion of + the databases. + """ + if service_type == 'meta2' and kwargs.get('src_service'): + self.rdir.meta2_index_delete( + volume_id=kwargs.get('src_service'), + container_id=cid + ) except OioException as exc: self.logger.warn( "Failed to link services for base %s (seq=%d): %s", diff --git a/oio/rdir/client.py b/oio/rdir/client.py index 2fbabbcb5d..833d81b4a1 100644 --- a/oio/rdir/client.py +++ b/oio/rdir/client.py @@ -484,8 +484,8 @@ def _resolve_cid_to_path(self, cid): resp['name'] ) - def meta2_index_delete(self, volume_id, container_id=None, container_path=None, - **kwargs): + def meta2_index_delete(self, volume_id, container_path=None, + container_id=None, **kwargs): """ Remove a meta2 record from the volume's index. Either the container ID or the container path have to be given. @@ -499,7 +499,7 @@ def meta2_index_delete(self, volume_id, container_id=None, container_path=None, elif container_path and not container_id: _tmp = container_path.rsplit("/") container_id = cid_from_name(_tmp[1], _tmp[3]) - else: + elif not container_path and not container_id: raise ValueError("At least the container ID or the container path " "should be given.")