Skip to content

Commit 17954bd

Browse files
authored
[Bugfix] Member Status race condition fix (#816)
1 parent 3bdd591 commit 17954bd

File tree

4 files changed

+52
-22
lines changed

4 files changed

+52
-22
lines changed

pkg/deployment/reconcile/member_phase_updates.go renamed to pkg/deployment/member/phase_updates.go

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
// Author Adam Janikowski
2121
//
2222

23-
package reconcile
23+
package member
2424

2525
import (
2626
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
@@ -31,31 +31,53 @@ type phaseMapFunc func(action api.Action, m *api.MemberStatus)
3131
type phaseMapTo map[api.MemberPhase]phaseMapFunc
3232
type phaseMap map[api.MemberPhase]phaseMapTo
3333

34+
type PhaseExecutor interface {
35+
Execute(m *api.MemberStatus, action api.Action, to api.MemberPhase) bool
36+
}
37+
38+
func GetPhaseExecutor() PhaseExecutor {
39+
return phase
40+
}
41+
3442
var phase = phaseMap{
3543
api.MemberPhaseNone: {
3644
api.MemberPhasePending: func(action api.Action, m *api.MemberStatus) {
37-
// Clean conditions
38-
m.Conditions.Remove(api.ConditionTypeReady)
39-
m.Conditions.Remove(api.ConditionTypeTerminated)
40-
m.Conditions.Remove(api.ConditionTypeTerminating)
41-
m.Conditions.Remove(api.ConditionTypeAgentRecoveryNeeded)
42-
m.Conditions.Remove(api.ConditionTypeAutoUpgrade)
43-
m.Conditions.Remove(api.ConditionTypeUpgradeFailed)
44-
m.Conditions.Remove(api.ConditionTypePendingTLSRotation)
45-
m.Conditions.Remove(api.ConditionTypePendingRestart)
46-
m.Conditions.Remove(api.ConditionTypeRestart)
47-
m.Conditions.Remove(api.ConditionTypePendingUpdate)
48-
m.Conditions.Remove(api.ConditionTypeUpdating)
49-
m.Conditions.Remove(api.ConditionTypeUpdateFailed)
50-
m.Conditions.Remove(api.ConditionTypeCleanedOut)
51-
5245
// Change member RID
5346
m.RID = uuid.NewUUID()
5447

5548
// Clean Pod details
5649
m.PodUID = ""
5750
},
5851
},
52+
api.MemberPhasePending: {
53+
api.MemberPhaseCreated: func(action api.Action, m *api.MemberStatus) {
54+
// Clean conditions
55+
removeMemberConditionsMapFunc(m)
56+
},
57+
api.MemberPhaseUpgrading: func(action api.Action, m *api.MemberStatus) {
58+
removeMemberConditionsMapFunc(m)
59+
},
60+
},
61+
}
62+
63+
func removeMemberConditionsMapFunc(m *api.MemberStatus) {
64+
// Clean conditions
65+
m.Conditions.Remove(api.ConditionTypeReady)
66+
m.Conditions.Remove(api.ConditionTypeTerminated)
67+
m.Conditions.Remove(api.ConditionTypeTerminating)
68+
m.Conditions.Remove(api.ConditionTypeAgentRecoveryNeeded)
69+
m.Conditions.Remove(api.ConditionTypeAutoUpgrade)
70+
m.Conditions.Remove(api.ConditionTypeUpgradeFailed)
71+
m.Conditions.Remove(api.ConditionTypePendingTLSRotation)
72+
m.Conditions.Remove(api.ConditionTypePendingRestart)
73+
m.Conditions.Remove(api.ConditionTypeRestart)
74+
m.Conditions.Remove(api.ConditionTypePendingUpdate)
75+
m.Conditions.Remove(api.ConditionTypeUpdating)
76+
m.Conditions.Remove(api.ConditionTypeUpdateFailed)
77+
m.Conditions.Remove(api.ConditionTypeCleanedOut)
78+
m.Conditions.Remove(api.ConditionTypeTopologyAware)
79+
80+
m.Upgrade = false
5981
}
6082

6183
func (p phaseMap) empty(action api.Action, m *api.MemberStatus) {

pkg/deployment/reconcile/action_member_phase_update.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ package reconcile
2525
import (
2626
"context"
2727

28+
"github.com/arangodb/kube-arangodb/pkg/deployment/member"
29+
2830
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
2931
"github.com/arangodb/kube-arangodb/pkg/util/errors"
3032
"github.com/rs/zerolog"
@@ -72,7 +74,7 @@ func (a *memberPhaseUpdateAction) Start(ctx context.Context) (bool, error) {
7274
return true, nil
7375
}
7476

75-
if phase.Execute(&m, a.action, p) {
77+
if member.GetPhaseExecutor().Execute(&m, a.action, p) {
7678
if err := a.actionCtx.UpdateMember(ctx, m); err != nil {
7779
return false, errors.WithStack(err)
7880
}

pkg/deployment/reconcile/plan_executor.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,12 @@ func (d *Reconciler) executePlan(ctx context.Context, cachedStatus inspectorInte
145145
Str("group", planAction.Group.AsRole()).
146146
Str("member-id", planAction.MemberID)
147147

148+
if status, _ := d.context.GetStatus(); status.Members.ContainsID(planAction.MemberID) {
149+
if member, _, ok := status.Members.ElementByID(planAction.MemberID); ok {
150+
logContext = logContext.Str("phase", string(member.Phase))
151+
}
152+
}
153+
148154
for k, v := range planAction.Params {
149155
logContext = logContext.Str(k, v)
150156
}

pkg/deployment/resources/pod_creator.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import (
3333
"sync"
3434
"time"
3535

36+
"github.com/arangodb/kube-arangodb/pkg/deployment/member"
37+
3638
podMod "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/pod"
3739
core "k8s.io/api/core/v1"
3840
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -512,7 +514,7 @@ func (r *Resources) SelectImageForMember(spec api.DeploymentSpec, status api.Dep
512514
}
513515

514516
// createPodForMember creates all Pods listed in member status
515-
func (r *Resources) createPodForMember(ctx context.Context, cachedStatus inspectorInterface.Inspector, spec api.DeploymentSpec, member *api.ArangoMember, memberID string, imageNotFoundOnce *sync.Once) error {
517+
func (r *Resources) createPodForMember(ctx context.Context, cachedStatus inspectorInterface.Inspector, spec api.DeploymentSpec, arangoMember *api.ArangoMember, memberID string, imageNotFoundOnce *sync.Once) error {
516518
log := r.log
517519
status, lastVersion := r.context.GetStatus()
518520

@@ -525,7 +527,7 @@ func (r *Resources) createPodForMember(ctx context.Context, cachedStatus inspect
525527
return nil
526528
}
527529

528-
template := member.Status.Template
530+
template := arangoMember.Status.Template
529531

530532
if template == nil {
531533
// Template not yet propagated
@@ -634,8 +636,7 @@ func (r *Resources) createPodForMember(ctx context.Context, cachedStatus inspect
634636
m.PodSpecVersion = template.PodSpecChecksum
635637
}
636638

637-
// Record new member phase
638-
m.Phase = newPhase
639+
member.GetPhaseExecutor().Execute(&m, api.Action{}, newPhase)
639640

640641
if status.Topology.Enabled() {
641642
if m.Topology != nil && m.Topology.ID == status.Topology.ID {
@@ -645,7 +646,6 @@ func (r *Resources) createPodForMember(ctx context.Context, cachedStatus inspect
645646
}
646647
}
647648

648-
m.Upgrade = false
649649
r.log.Info().Str("pod", m.PodName).Msgf("Updating member")
650650
if err := status.Members.Update(m, group); err != nil {
651651
return errors.WithStack(err)

0 commit comments

Comments
 (0)