code: def restart(self, restart_data, run_async=False):
          
          assert isinstance(restart_data, dict)
  
          if (not self.restart_matches(restart_data.get('role'),
                                       restart_data.get('postgres_version'),
                                       ('restart_pending' in restart_data))):
              return (False, "restart conditions are not satisfied")
  
          with self._async_executor:
              prev = self._async_executor.schedule('restart')
              if prev is not None:
                  return (False, prev + ' already in progress')
  
              # Make the main loop to think that we were recovering dead postgres. If we fail
              # to start postgres after a specified timeout (see below), we need to remove
              # leader key (if it belong to us) rather than trying to start postgres once again.
              self.recovering = True
  
          # Now that restart is scheduled we can set timeout for startup, it will get reset
          # once async executor runs and main loop notices PostgreSQL as up.
          timeout = restart_data.get('timeout', self.patroni.config['master_start_timeout'])
          self.set_start_timeout(timeout)
  
          # For non async cases we want to wait for restart to complete or timeout before returning.
          do_restart = functools.partial(self.state_handler.restart, timeout, self._async_executor.critical_task)
          if self.is_synchronous_mode() and not self.has_lock():
              do_restart = functools.partial(self.while_not_sync_standby, do_restart)
  
          if run_async:
              self._async_executor.run_async(do_restart)
              return (True, 'restart initiated')
          else:
              res = self._async_executor.run(do_restart)
              if res:
                  return (True, 'restarted successfully')
              elif res is None:
                  return (False, 'postgres is still starting')
              else:
                  return (False, 'restart failed')
docs: conditional and unconditional restart