Skip to content

Commit 5864736

Browse files
lmicciniclaude
andcommitted
Cache secret hashes in nodeset sync checks to avoid redundant API calls
AreSecretHashesInSync and IsSecretHashInSync previously fetched and hashed each secret once per NodeSet that referenced it. In environments with N NodeSets sharing the same secrets, this caused N redundant Get and Hash calls per secret per reconcile cycle. Add a hash cache (map for AreSecretHashesInSync, single variable for IsSecretHashInSync) so each secret is fetched and hashed at most once per function invocation. No signature or behavioral change for callers. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent ce00f67 commit 5864736

1 file changed

Lines changed: 40 additions & 26 deletions

File tree

modules/edpm/unstructured/nodeset.go

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ func AreSecretHashesInSync(
8585
return true, "", nil
8686
}
8787

88+
hashCache := map[string]string{}
89+
8890
for i := range nodesetList.Items {
8991
item := &nodesetList.Items[i]
9092

@@ -102,23 +104,28 @@ func AreSecretHashesInSync(
102104
}
103105

104106
for secretName, deployedHash := range secretHashes {
105-
currentSecret := &corev1.Secret{}
106-
err := c.Get(ctx, types.NamespacedName{
107-
Name: secretName,
108-
Namespace: namespace,
109-
}, currentSecret)
110-
if err != nil {
111-
if k8s_errors.IsNotFound(err) {
112-
info := fmt.Sprintf("nodeset %s/%s: deployed secret %s no longer exists",
113-
item.GetNamespace(), item.GetName(), secretName)
114-
return false, info, nil
107+
currentHash, ok := hashCache[secretName]
108+
if !ok {
109+
currentSecret := &corev1.Secret{}
110+
err := c.Get(ctx, types.NamespacedName{
111+
Name: secretName,
112+
Namespace: namespace,
113+
}, currentSecret)
114+
if err != nil {
115+
if k8s_errors.IsNotFound(err) {
116+
info := fmt.Sprintf("nodeset %s/%s: deployed secret %s no longer exists",
117+
item.GetNamespace(), item.GetName(), secretName)
118+
return false, info, nil
119+
}
120+
return false, "", fmt.Errorf("failed to get secret %s: %w", secretName, err)
115121
}
116-
return false, "", fmt.Errorf("failed to get secret %s: %w", secretName, err)
117-
}
118122

119-
currentHash, hashErr := oko_secret.Hash(currentSecret)
120-
if hashErr != nil {
121-
return false, "", fmt.Errorf("failed to hash secret %s: %w", secretName, hashErr)
123+
h, hashErr := oko_secret.Hash(currentSecret)
124+
if hashErr != nil {
125+
return false, "", fmt.Errorf("failed to hash secret %s: %w", secretName, hashErr)
126+
}
127+
currentHash = h
128+
hashCache[secretName] = currentHash
122129
}
123130

124131
if currentHash != deployedHash {
@@ -167,6 +174,9 @@ func IsSecretHashInSync(
167174
return false, "", fmt.Errorf("failed to list OpenStackDataPlaneNodeSets: %w", err)
168175
}
169176

177+
var currentHash string
178+
var hashResolved bool
179+
170180
for i := range nodesetList.Items {
171181
item := &nodesetList.Items[i]
172182

@@ -184,19 +194,23 @@ func IsSecretHashInSync(
184194
continue
185195
}
186196

187-
currentSecret := &corev1.Secret{}
188-
if err := c.Get(ctx, types.NamespacedName{Name: secretName, Namespace: namespace}, currentSecret); err != nil {
189-
if k8s_errors.IsNotFound(err) {
190-
info := fmt.Sprintf("nodeset %s/%s: deployed secret %s no longer exists",
191-
item.GetNamespace(), item.GetName(), secretName)
192-
return false, info, nil
197+
if !hashResolved {
198+
currentSecret := &corev1.Secret{}
199+
if err := c.Get(ctx, types.NamespacedName{Name: secretName, Namespace: namespace}, currentSecret); err != nil {
200+
if k8s_errors.IsNotFound(err) {
201+
info := fmt.Sprintf("nodeset %s/%s: deployed secret %s no longer exists",
202+
item.GetNamespace(), item.GetName(), secretName)
203+
return false, info, nil
204+
}
205+
return false, "", fmt.Errorf("failed to get secret %s: %w", secretName, err)
193206
}
194-
return false, "", fmt.Errorf("failed to get secret %s: %w", secretName, err)
195-
}
196207

197-
currentHash, hashErr := oko_secret.Hash(currentSecret)
198-
if hashErr != nil {
199-
return false, "", fmt.Errorf("failed to hash secret %s: %w", secretName, hashErr)
208+
h, hashErr := oko_secret.Hash(currentSecret)
209+
if hashErr != nil {
210+
return false, "", fmt.Errorf("failed to hash secret %s: %w", secretName, hashErr)
211+
}
212+
currentHash = h
213+
hashResolved = true
200214
}
201215

202216
if currentHash != deployedHash {

0 commit comments

Comments
 (0)