]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
cephadm: agent gatherers wake up agent if change detected 43635/head
authorAdam King <adking@redhat.com>
Tue, 26 Oct 2021 20:34:01 +0000 (16:34 -0400)
committerAdam King <adking@redhat.com>
Tue, 26 Oct 2021 20:34:01 +0000 (16:34 -0400)
In this case it's just for ls to faster report added/removed
or change in state of daemons we detect.

Signed-off-by: Adam King <adking@redhat.com>
src/cephadm/cephadm

index 8bd9bd50961b319286246aaca6de4bb4df986792..1364c51ac997460a9ff7bfbf93161e82dab8c574 100755 (executable)
@@ -3684,7 +3684,7 @@ WantedBy=ceph-{fsid}.target
             self.event.wait(max(self.loop_interval - int(run_time_average), 0))
             self.event.clear()
 
-    def _ceph_volume(self, enhanced: bool = False) -> str:
+    def _ceph_volume(self, enhanced: bool = False) -> Tuple[str, bool]:
         self.ctx.command = 'inventory --format=json'.split()
         if enhanced:
             self.ctx.command.append('--with-lsm')
@@ -3697,7 +3697,7 @@ WantedBy=ceph-{fsid}.target
         stdout = stream.getvalue()
 
         if stdout:
-            return stdout
+            return (stdout, False)
         else:
             raise Exception('ceph-volume returned empty value')
 
@@ -3774,15 +3774,17 @@ WantedBy=ceph-{fsid}.target
                 name_id_mapping[name] = id
         return name_id_mapping
 
-    def _get_ls(self) -> List[Dict[str, str]]:
+    def _get_ls(self) -> Tuple[List[Dict[str, str]], bool]:
         if not self.cached_ls_values:
             logger.info('No cached ls output. Running full daemon ls')
             ls = list_daemons(self.ctx)
             for d in ls:
                 self.cached_ls_values[d['name']] = d
+            return (ls, True)
         else:
             ls_subset = self._daemon_ls_subset()
             need_full_ls = False
+            state_change = False
             if set(self.cached_ls_values.keys()) != set(ls_subset.keys()):
                 # case for a new daemon in ls or an old daemon no longer appearing.
                 # If that happens we need a full ls
@@ -3790,7 +3792,7 @@ WantedBy=ceph-{fsid}.target
                 ls = list_daemons(self.ctx)
                 for d in ls:
                     self.cached_ls_values[d['name']] = d
-                return ls
+                return (ls, True)
             for daemon, info in self.cached_ls_values.items():
                 if info['style'] == 'legacy':
                     # for legacy containers, ls_subset just grabs all the info
@@ -3801,6 +3803,14 @@ WantedBy=ceph-{fsid}.target
                         # info we didn't grab like version and start time could have changed
                         need_full_ls = True
                         break
+
+                    # want to know if a daemons state change because in those cases we want
+                    # to report back quicker
+                    if (
+                        self.cached_ls_values[daemon]['enabled'] != ls_subset[daemon]['enabled']
+                        or self.cached_ls_values[daemon]['state'] != ls_subset[daemon]['state']
+                    ):
+                        state_change = True
                     # if we reach here, container id matched. Update the few values we do track
                     # from ls subset: state, enabled, memory_usage.
                     self.cached_ls_values[daemon]['enabled'] = ls_subset[daemon]['enabled']
@@ -3812,9 +3822,10 @@ WantedBy=ceph-{fsid}.target
                 ls = list_daemons(self.ctx)
                 for d in ls:
                     self.cached_ls_values[d['name']] = d
+                return (ls, True)
             else:
                 ls = [info for daemon, info in self.cached_ls_values.items()]
-        return ls
+                return (ls, state_change)
 
 
 class AgentGatherer(Thread):
@@ -3836,12 +3847,13 @@ class AgentGatherer(Thread):
                 start_time = time.monotonic()
 
                 ack = self.agent.ack
+                change = False
                 try:
-                    self.data = self.func()
+                    self.data, change = self.func()
                 except Exception as e:
                     logger.error(f'{self.gatherer_type} Gatherer encountered exception gathering data: {e}')
                     self.data = None
-                if ack != self.ack:
+                if ack != self.ack or change:
                     self.ack = ack
                     self.agent.wakeup()