docs: def process_manual_failover_from_leader(self):
          """Checks if manual failover is requested and takes action if appropriate.
  
          Cleans up failover key if failover conditions are not matched.
  
          :returns: action message if demote was initiated, None if no action was taken"""
          failover = self.cluster.failover
          if not failover or (self.is_paused() and not self.state_handler.is_leader()):
              return
  
          if (failover.scheduled_at and not
              self.should_run_scheduled_action("failover", failover.scheduled_at, lambda:
                                               self.dcs.manual_failover('', '', index=failover.index))):
              return
  
          if not failover.leader or failover.leader == self.state_handler.name:
              if not failover.candidate or failover.candidate != self.state_handler.name:
                  if not failover.candidate and self.is_paused():
                      logger.warning('Failover is possible only to a specific candidate in a paused state')
                  else:
                      if self.is_synchronous_mode():
                          if failover.candidate and not self.cluster.sync.matches(failover.candidate):
                              logger.warning('Failover candidate=%s does not match with sync_standby=%s',
                                             failover.candidate, self.cluster.sync.sync_standby)
                              members = []
                          else:
                              members = [m for m in self.cluster.members if self.cluster.sync.matches(m.name)]
                      else:
                          members = [m for m in self.cluster.members
                                     if not failover.candidate or m.name == failover.candidate]
                      if self.is_failover_possible(members):  # check that there are healthy members
                          self._async_executor.schedule('manual failover: demote')
                          self._async_executor.run_async(self.demote, ('graceful',))
                          return 'manual failover: demoting myself'
                      else:
                          logger.warning('manual failover: no healthy members found, failover is not possible')
              else:
                  logger.warning('manual failover: I am already the leader, no need to failover')
          else:
              logger.warning('manual failover: leader name does not match: %s != %s',
                             failover.leader, self.state_handler.name)
  
          logger.info('Cleaning up failover key')
          self.dcs.manual_failover('', '', index=failover.index)