From 700465f5b3dd0a99d9da45a1db5d1fa6bd9e864f Mon Sep 17 00:00:00 2001 From: acekingke Date: Fri, 8 Sep 2023 09:25:17 +0800 Subject: [PATCH] *: try leader by label --- internal/pod_executor.go | 12 ++++++++++++ mysqlcluster/syncer/status.go | 25 +++++++++++++++++++++++++ utils/constants.go | 1 + 3 files changed, 38 insertions(+) diff --git a/internal/pod_executor.go b/internal/pod_executor.go index 4bfa35a2..c2406b77 100644 --- a/internal/pod_executor.go +++ b/internal/pod_executor.go @@ -116,3 +116,15 @@ func (p *PodExecutor) CloseXenonSemiCheck(namespace, podName string) error { } return nil } + +func (p *PodExecutor) XenonTryLeader(namespace, podName string) error { + cmd := []string{"xenoncli", "raft", "trytoleader"} + _, stderr, err := p.Exec(namespace, podName, "xenon", cmd...) + if err != nil { + return err + } + if len(stderr) != 0 { + return fmt.Errorf("run command %s in xenon failed: %s", cmd, stderr) + } + return nil +} diff --git a/mysqlcluster/syncer/status.go b/mysqlcluster/syncer/status.go index 2c5f410f..b87e93d9 100644 --- a/mysqlcluster/syncer/status.go +++ b/mysqlcluster/syncer/status.go @@ -121,6 +121,9 @@ func (s *StatusSyncer) Sync(ctx context.Context) (syncer.SyncResult, error) { } continue } + if err := s.TryLeader(ctx, &pod); err != nil { + s.log.Error(err, "failed to Try leader", "pod", pod.Name, "namespace", pod.Namespace) + } for _, cond := range pod.Status.Conditions { switch cond.Type { case corev1.ContainersReady: @@ -789,3 +792,25 @@ func (s *StatusSyncer) DoRoRebuild(ctx context.Context, pod *corev1.Pod, items [ } return nil } + +func (s *StatusSyncer) TryLeader(ctx context.Context, pod *corev1.Pod) error { + if pod.ObjectMeta.Labels == nil || len(pod.ObjectMeta.Labels[utils.LabelTryLeader]) == 0 { + return nil + } + // 1. close the xenon's SemiCheck. + executor, err := internal.NewPodExecutor() + if err != nil { + return err + } + + err = executor.XenonTryLeader(s.Namespace, pod.Name) + s.log.Info("the xenon's tryleader", "pod", pod.Name) + if err != nil { + return err + } + delete(pod.ObjectMeta.Labels, utils.LabelTryLeader) + if err := s.cli.Update(ctx, pod); err != nil { + return err + } + return nil +} diff --git a/utils/constants.go b/utils/constants.go index 49e89127..2875b78f 100644 --- a/utils/constants.go +++ b/utils/constants.go @@ -203,6 +203,7 @@ const ( const LableRebuild = "rebuild" const LabelRebuildFrom = "rebuild-from" const LabelMaintain = "maintain" +const LabelTryLeader = "tryleader" // XenonHttpUrl is a http url corresponding to the xenon instruction. type XenonHttpUrl string