]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
qa: remove ceph file systems on completion 38775/head
authorPatrick Donnelly <pdonnell@redhat.com>
Tue, 5 Jan 2021 20:34:00 +0000 (12:34 -0800)
committerPatrick Donnelly <pdonnell@redhat.com>
Fri, 8 Jan 2021 18:44:53 +0000 (10:44 -0800)
So that we can avoid MDS replacement warnings.

Fixes: https://tracker.ceph.com/issues/48757
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
qa/tasks/ceph.py
qa/tasks/cephfs/filesystem.py
qa/tasks/mds_thrash.py

index 7685a132f105e34b59794c4e7063fa02449a06f2..e484d9127c807e48ffbc3b75ac229e43bad7bbba 100644 (file)
@@ -415,6 +415,7 @@ def cephfs_setup(ctx, config):
         fs_configs =  cephfs_config.pop('fs', [{'name': 'cephfs'}])
         set_allow_multifs = len(fs_configs) > 1
 
+        fss = []
         for fs_config in fs_configs:
             assert isinstance(fs_config, dict)
             name = fs_config.pop('name')
@@ -424,8 +425,14 @@ def cephfs_setup(ctx, config):
             if set_allow_multifs:
                 fs.set_allow_multifs()
                 set_allow_multifs = False
+            fss.append(fs)
 
-    yield
+        yield
+
+        for fs in fss:
+            fs.destroy()
+    else:
+        yield
 
 @contextlib.contextmanager
 def watchdog_setup(ctx, config):
index 8df09412576a176578155de5db20b6f573fe4174..66449bd3e0a54d09c6be9f3f15296e8055f3f383 100644 (file)
@@ -60,6 +60,13 @@ class ObjectNotFound(Exception):
     def __str__(self):
         return "Object not found: '{0}'".format(self._object_name)
 
+class FSMissing(Exception):
+    def __init__(self, ident):
+        self.ident = ident
+
+    def __str__(self):
+        return f"File system {self.ident} does not exist in the map"
+
 class FSStatus(object):
     """
     Operations on a snapshot of the FSMap.
@@ -109,7 +116,7 @@ class FSStatus(object):
         for fs in self.map['filesystems']:
             if fscid is None or fs['id'] == fscid:
                 return fs
-        raise RuntimeError("FSCID {0} not in map".format(fscid))
+        raise FSMissing(fscid)
 
     def get_fsmap_byname(self, name):
         """
@@ -118,7 +125,7 @@ class FSStatus(object):
         for fs in self.map['filesystems']:
             if name is None or fs['mdsmap']['fs_name'] == name:
                 return fs
-        raise RuntimeError("FS {0} not in map".format(name))
+        raise FSMissing(name)
 
     def get_replays(self, fscid):
         """
@@ -484,6 +491,12 @@ class Filesystem(MDSCluster):
         if not hasattr(self._ctx, "filesystem"):
             self._ctx.filesystem = self
 
+    def dead(self):
+        try:
+            return not bool(self.get_mds_map())
+        except FSMissing:
+            return True
+
     def get_task_status(self, status_key):
         return self.mon_manager.get_service_task_status("mds", status_key)
 
@@ -648,8 +661,11 @@ class Filesystem(MDSCluster):
         self.getinfo(refresh = True)
 
     def destroy(self, reset_obj_attrs=True):
-        log.info('Destroying file system ' + self.name +  ' and related '
-                 'pools')
+        log.info(f'Destroying file system {self.name} and related pools')
+
+        if self.dead():
+            log.debug('already dead...')
+            return
 
         # make sure no MDSs are attached to given FS.
         self.mon_manager.raw_cluster_cmd('fs', 'fail', self.name)
@@ -728,6 +744,7 @@ class Filesystem(MDSCluster):
     def _df(self):
         return json.loads(self.mon_manager.raw_cluster_cmd("df", "--format=json-pretty"))
 
+    # may raise FSMissing
     def get_mds_map(self, status=None):
         if status is None:
             status = self.status()
index 44dceae2287968160b839fd9f37c852a74190d3e..8c7f3cba590687ff771ffae866314acd8e8db51a 100644 (file)
@@ -13,7 +13,7 @@ from gevent.event import Event
 from teuthology import misc as teuthology
 
 from tasks import ceph_manager
-from tasks.cephfs.filesystem import MDSCluster, Filesystem
+from tasks.cephfs.filesystem import MDSCluster, Filesystem, FSMissing
 from tasks.thrasher import Thrasher
 
 log = logging.getLogger(__name__)
@@ -122,6 +122,8 @@ class MDSThrasher(Thrasher, Greenlet):
     def _run(self):
         try:
             self.do_thrash()
+        except FSMissing:
+            pass
         except Exception as e:
             # Log exceptions here so we get the full backtrace (gevent loses them).
             # Also allow successful completion as gevent exception handling is a broken mess: