Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
- (Feature) (AT) Add ArangoTask API
- (Bugfix) Fix NPE in State fetcher
- (Refactor) Configurable throttle inspector
- (Bugfix) Skip Replace operation on DBServer if they need to be scaled down

## [1.2.8](https://github.com/arangodb/kube-arangodb/tree/1.2.8) (2022-02-24)
- Do not check License V2 on Community images
Expand Down
11 changes: 11 additions & 0 deletions pkg/deployment/reconcile/plan_builder_normal.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,12 @@ func createMemberFailedRestorePlan(ctx context.Context,

// Check for members in failed state
status.Members.ForeachServerGroup(func(group api.ServerGroup, members api.MemberStatusList) error {
failed := 0
for _, m := range members {
if m.Phase == api.MemberPhaseFailed {
failed++
}
}
for _, m := range members {
if m.Phase != api.MemberPhaseFailed || len(plan) > 0 {
continue
Expand All @@ -112,6 +118,11 @@ func createMemberFailedRestorePlan(ctx context.Context,
continue
}

if c := spec.DBServers.GetCount(); c <= len(members)-failed {
// We have more or equal alive members than current count, we should not recreate this member
continue
}

if agencyState.Plan.Collections.IsDBServerInDatabases(m.ID) {
// DBServer still exists in agency plan! Will not be removed, but needs to be recreated
memberLog.Msg("Recreating DBServer - it cannot be removed gracefully")
Expand Down
50 changes: 48 additions & 2 deletions pkg/deployment/reconcile/plan_builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1058,13 +1058,13 @@ func TestCreatePlan(t *testing.T) {
ExpectedLog: "Creating member replacement plan because member has failed",
},
{
Name: "DBServer in failed state",
Name: "DBServer in failed state - recreate",
context: &testContext{
ArangoDeployment: deploymentTemplate.DeepCopy(),
},
Helper: func(ad *api.ArangoDeployment) {
ad.Spec.DBServers = api.ServerGroupSpec{
Count: util.NewInt(2),
Count: util.NewInt(3),
}
ad.Status.Members.DBServers[0].Phase = api.MemberPhaseFailed
ad.Status.Members.DBServers[0].ID = "id"
Expand All @@ -1076,6 +1076,26 @@ func TestCreatePlan(t *testing.T) {
},
ExpectedLog: "Creating member replacement plan because member has failed",
},
{
Name: "DBServer in failed state - remove",
context: &testContext{
ArangoDeployment: deploymentTemplate.DeepCopy(),
},
Helper: func(ad *api.ArangoDeployment) {
ad.Spec.DBServers = api.ServerGroupSpec{
Count: util.NewInt(2),
}
ad.Status.Members.DBServers[2].Phase = api.MemberPhaseFailed
ad.Status.Members.DBServers[2].ID = "id3"
},
ExpectedPlan: []api.Action{
actions.NewAction(api.ActionTypeCleanOutMember, api.ServerGroupDBServers, withPredefinedMember("id3")),
actions.NewAction(api.ActionTypeKillMemberPod, api.ServerGroupDBServers, withPredefinedMember("id3")),
actions.NewAction(api.ActionTypeShutdownMember, api.ServerGroupDBServers, withPredefinedMember("id3")),
actions.NewAction(api.ActionTypeRemoveMember, api.ServerGroupDBServers, withPredefinedMember("id3")),
},
ExpectedLog: "Creating scale-down plan",
},
{
Name: "CleanOut DBserver",
context: &testContext{
Expand All @@ -1101,6 +1121,32 @@ func TestCreatePlan(t *testing.T) {
},
ExpectedLog: "Creating dbserver replacement plan because server is cleanout in created phase",
},
{
Name: "CleanOut DBserver - scale down",
context: &testContext{
ArangoDeployment: deploymentTemplate.DeepCopy(),
},
Helper: func(ad *api.ArangoDeployment) {
ad.Spec.DBServers = api.ServerGroupSpec{
Count: util.NewInt(2),
}
ad.Status.Members.DBServers[2].ID = "id3"
ad.Status.Members.DBServers[2].Phase = api.MemberPhaseCreated
ad.Status.Members.DBServers[2].Conditions = api.ConditionList{
{
Type: api.ConditionTypeCleanedOut,
Status: core.ConditionTrue,
},
}
},
ExpectedPlan: []api.Action{
actions.NewAction(api.ActionTypeCleanOutMember, api.ServerGroupDBServers, withPredefinedMember("id3")),
actions.NewAction(api.ActionTypeKillMemberPod, api.ServerGroupDBServers, withPredefinedMember("id3")),
actions.NewAction(api.ActionTypeShutdownMember, api.ServerGroupDBServers, withPredefinedMember("id3")),
actions.NewAction(api.ActionTypeRemoveMember, api.ServerGroupDBServers, withPredefinedMember("id3")),
},
ExpectedLog: "Creating scale-down plan",
},
{
Name: "Scale down DBservers",
context: &testContext{
Expand Down