Skip to content

Commit d52dc52

Browse files
authored
refactor force-reconcile (#192)
1 parent 5ca8edc commit d52dc52

File tree

2 files changed

+10
-24
lines changed

2 files changed

+10
-24
lines changed

pkg/reconciler/reconciler.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"fmt"
1212
"math"
1313
"strconv"
14+
"time"
1415

1516
"github.com/iancoleman/strcase"
1617
"github.com/pkg/errors"
@@ -387,7 +388,7 @@ func (r *Reconciler) Apply(ctx context.Context, inventory *[]*InventoryItem, obj
387388
// calculate object digest
388389
// note: if the effective reconcile policy of an object changes, it will always be reconciled at least one more time;
389390
// this is in particular the case if the policy changes from or to ReconcilePolicyOnce.
390-
digest, err := calculateObjectDigest(object, item, componentRevision, getReconcilePolicy(object))
391+
digest, err := calculateObjectDigest(object, componentRevision, getReconcilePolicy(object))
391392
if err != nil {
392393
return false, errors.Wrapf(err, "error calculating digest for object %s", types.ObjectKeyToString(object))
393394
}
@@ -632,14 +633,18 @@ func (r *Reconciler) Apply(ctx context.Context, inventory *[]*InventoryItem, obj
632633
setAnnotation(object, r.annotationKeyDigest, item.Digest)
633634

634635
updatePolicy := getUpdatePolicy(object)
636+
now := time.Now()
635637
if existingObject == nil {
636638
if err := r.createObject(ctx, object, nil, updatePolicy); err != nil {
637639
return false, errors.Wrapf(err, "error creating object %s", item)
638640
}
639641
item.Phase = PhaseCreating
640642
item.Status = status.InProgressStatus
643+
item.LastAppliedAt = &metav1.Time{Time: now}
641644
numUnready++
642-
} else if existingObject.GetDeletionTimestamp().IsZero() && existingObject.GetAnnotations()[r.annotationKeyDigest] != item.Digest {
645+
} else if existingObject.GetDeletionTimestamp().IsZero() &&
646+
// TODO: make force-reconcile period (60 minutes as of now) configurable
647+
(existingObject.GetAnnotations()[r.annotationKeyDigest] != item.Digest || item.LastAppliedAt != nil && item.LastAppliedAt.Time.Before(now.Add(-60*time.Minute))) {
643648
switch updatePolicy {
644649
case UpdatePolicyRecreate:
645650
// TODO: perform an additional owner id check
@@ -654,6 +659,7 @@ func (r *Reconciler) Apply(ctx context.Context, inventory *[]*InventoryItem, obj
654659
}
655660
item.Phase = PhaseUpdating
656661
item.Status = status.InProgressStatus
662+
item.LastAppliedAt = &metav1.Time{Time: now}
657663
numUnready++
658664
} else {
659665
existingStatus, err := r.statusAnalyzer.ComputeStatus(existingObject)

pkg/reconciler/util.go

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ import (
1111
"encoding/hex"
1212
"encoding/json"
1313
"fmt"
14-
"regexp"
15-
"strconv"
1614
"strings"
17-
"time"
1815

1916
"github.com/pkg/errors"
2017
"github.com/sap/go-generics/slices"
@@ -61,7 +58,7 @@ func checkRange(x int, min int, max int) error {
6158
return nil
6259
}
6360

64-
func calculateObjectDigest(obj client.Object, item *InventoryItem, revision int64, reconcilePolicy ReconcilePolicy) (string, error) {
61+
func calculateObjectDigest(obj client.Object, revision int64, reconcilePolicy ReconcilePolicy) (string, error) {
6562
if reconcilePolicy == ReconcilePolicyOnce {
6663
return "__once__", nil
6764
}
@@ -85,24 +82,7 @@ func calculateObjectDigest(obj client.Object, item *InventoryItem, revision int6
8582
digest = fmt.Sprintf("%s@%d", digest, revision)
8683
}
8784

88-
previousDigest := ""
89-
previousTimestamp := int64(0)
90-
if item != nil {
91-
if m := regexp.MustCompile(`^([0-9a-f@]+):(\d{10})$`).FindStringSubmatch(item.Digest); m != nil {
92-
previousDigest = m[1]
93-
previousTimestamp = must(strconv.ParseInt(m[2], 10, 64))
94-
}
95-
}
96-
now := time.Now().Unix()
97-
timestamp := int64(0)
98-
// TODO: make force-reconcile period configurable (globally, per object, ...?)
99-
if previousDigest == digest && now-previousTimestamp <= 3600 {
100-
timestamp = previousTimestamp
101-
} else {
102-
timestamp = now
103-
}
104-
105-
return fmt.Sprintf("%s:%d", digest, timestamp), nil
85+
return digest, nil
10686
}
10787

10888
func setLabel(obj client.Object, key string, value string) {

0 commit comments

Comments
 (0)