Skip to content

Commit 992cae7

Browse files
authored
fix(quorum): correct ConfigMap key and bootstrap wait gate (#253)
1 parent 3924757 commit 992cae7

2 files changed

Lines changed: 27 additions & 5 deletions

File tree

internal/controller/typesensecluster_quorum.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,12 @@ func (r *TypesenseClusterReconciler) ReconcileQuorum(ctx context.Context, ts *ts
116116
r.logger.V(debugLevel).Info("reporting cluster status", "status", clusterStatus)
117117

118118
if clusterStatus == ClusterStatusSplitBrain {
119-
nodeslist := strings.Split(quorum.NodesListConfigMap.Data["nodeslist"], ",")
120-
if _, c := contains(nodeslist, fmt.Sprintf(ClusterStatefulSet, ts.Name)); c == true {
119+
rawNodeslist, ok := quorum.NodesListConfigMap.Data["nodes"]
120+
if !ok || rawNodeslist == "" {
121+
return ConditionReasonQuorumNotReady, 0, fmt.Errorf("configmap %s is missing 'nodes' key", quorum.NodesListConfigMap.Name)
122+
}
123+
nodeslist := strings.Split(rawNodeslist, ",")
124+
if hasHostnameBasedNodes(nodeslist, fmt.Sprintf(ClusterStatefulSet, ts.Name)) {
121125
return ConditionReasonQuorumNotReadyWaitATerm, 0, nil
122126
}
123127
return r.downgradeQuorum(ctx, ts, quorum.NodesListConfigMap, stsObjectKey, sts.Status.ReadyReplicas, int32(quorum.MinRequiredNodes))
@@ -170,8 +174,12 @@ func (r *TypesenseClusterReconciler) ReconcileQuorum(ctx context.Context, ts *ts
170174
}
171175

172176
if clusterStatus == ClusterStatusElectionDeadlock {
173-
nodeslist := strings.Split(quorum.NodesListConfigMap.Data["nodeslist"], ",")
174-
if _, c := contains(nodeslist, fmt.Sprintf(ClusterStatefulSet, ts.Name)); c == true {
177+
rawNodeslist, ok := quorum.NodesListConfigMap.Data["nodes"]
178+
if !ok || rawNodeslist == "" {
179+
return ConditionReasonQuorumNotReady, 0, fmt.Errorf("configmap %s is missing 'nodes' key", quorum.NodesListConfigMap.Name)
180+
}
181+
nodeslist := strings.Split(rawNodeslist, ",")
182+
if hasHostnameBasedNodes(nodeslist, fmt.Sprintf(ClusterStatefulSet, ts.Name)) {
175183
return ConditionReasonQuorumNotReadyWaitATerm, 0, nil
176184
}
177185
return r.downgradeQuorum(ctx, ts, quorum.NodesListConfigMap, stsObjectKey, int32(healthyNodes), int32(minRequiredNodes))
@@ -381,3 +389,13 @@ func (r *TypesenseClusterReconciler) updatePodReadinessGate(ctx context.Context,
381389
//r.logger.V(debugLevel).Info("updating pod readiness gate condition", "pod", pod.Name, "condition", condition.Type, "conditionStatus", condition.Status)
382390
return nil
383391
}
392+
393+
func hasHostnameBasedNodes(nodes []string, statefulSetName string) bool {
394+
for _, node := range nodes {
395+
if strings.Contains(node, statefulSetName) {
396+
return true
397+
}
398+
}
399+
400+
return false
401+
}

internal/controller/typesensecluster_quorum_helpers.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,11 @@ func (r *TypesenseClusterReconciler) getQuorum(ctx context.Context, ts *tsv1alph
159159
return &Quorum{}, err
160160
}
161161

162-
nodes := strings.Split(cm.Data["nodes"], ",")
162+
rawNodes, ok := cm.Data["nodes"]
163+
if !ok || strings.TrimSpace(rawNodes) == "" {
164+
return &Quorum{}, fmt.Errorf("configmap %s is missing 'nodes' key", cm.Name)
165+
}
166+
nodes := strings.Split(rawNodes, ",")
163167
availableNodes := len(nodes)
164168
minRequiredNodes := getMinimumRequiredNodes(int(sts.Status.Replicas))
165169

0 commit comments

Comments
 (0)