Skip to content

Commit e9bf5d6

Browse files
adutrahors
andauthored
K8SPSMDB-1571: Make reconciliation interval configurable (#2221)
* feat: Make reconciliation interval configurable * review * review --------- Co-authored-by: Viacheslav Sarzhan <slava.sarzhan@percona.com>
1 parent 8093ebf commit e9bf5d6

6 files changed

Lines changed: 101 additions & 1 deletion

File tree

deploy/bundle.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26807,6 +26807,8 @@ spec:
2680726807
value: percona-server-mongodb-operator
2680826808
- name: RESYNC_PERIOD
2680926809
value: 5s
26810+
- name: RECONCILE_INTERVAL
26811+
value: 5s
2681026812
- name: DISABLE_TELEMETRY
2681126813
value: "false"
2681226814
- name: MAX_CONCURRENT_RECONCILES

deploy/cw-bundle.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26833,6 +26833,8 @@ spec:
2683326833
value: percona-server-mongodb-operator
2683426834
- name: RESYNC_PERIOD
2683526835
value: 5s
26836+
- name: RECONCILE_INTERVAL
26837+
value: 5s
2683626838
- name: DISABLE_TELEMETRY
2683726839
value: "false"
2683826840
- name: MAX_CONCURRENT_RECONCILES

deploy/cw-operator.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ spec:
5454
value: percona-server-mongodb-operator
5555
- name: RESYNC_PERIOD
5656
value: 5s
57+
- name: RECONCILE_INTERVAL
58+
value: 5s
5759
- name: DISABLE_TELEMETRY
5860
value: "false"
5961
- name: MAX_CONCURRENT_RECONCILES

deploy/operator.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ spec:
5656
value: percona-server-mongodb-operator
5757
- name: RESYNC_PERIOD
5858
value: 5s
59+
- name: RECONCILE_INTERVAL
60+
value: 5s
5961
- name: DISABLE_TELEMETRY
6062
value: "false"
6163
- name: MAX_CONCURRENT_RECONCILES

pkg/controller/perconaservermongodb/psmdb_controller.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func newReconciler(mgr manager.Manager) (reconcile.Reconciler, error) {
9999
client: client,
100100
scheme: mgr.GetScheme(),
101101
serverVersion: sv,
102-
reconcileIn: time.Second * 5,
102+
reconcileIn: getReconcileInterval(),
103103
crons: NewCronRegistry(),
104104
lockers: newLockStore(),
105105
newPBM: backup.NewPBM,
@@ -140,6 +140,32 @@ func getOperatorPodImage(ctx context.Context) (string, error) {
140140
return pod.Spec.Containers[0].Image, nil
141141
}
142142

143+
// getReconcileInterval returns the reconciliation interval from the RECONCILE_INTERVAL
144+
// environment variable, or the default of 5 seconds if not set or invalid.
145+
func getReconcileInterval() time.Duration {
146+
defaultInterval := 5 * time.Second
147+
148+
interval := os.Getenv("RECONCILE_INTERVAL")
149+
if interval == "" {
150+
return defaultInterval
151+
}
152+
153+
d, err := time.ParseDuration(interval)
154+
if err != nil {
155+
log := logf.Log.WithName("psmdb-controller")
156+
log.Info("Invalid RECONCILE_INTERVAL value, using default (5s)", "value", interval, "error", err, "default", defaultInterval)
157+
return defaultInterval
158+
}
159+
160+
if d < defaultInterval {
161+
log := logf.Log.WithName("psmdb-controller")
162+
log.Info("RECONCILE_INTERVAL must be at least 5s, using 5s", "value", interval, "default", defaultInterval)
163+
return defaultInterval
164+
}
165+
166+
return d
167+
}
168+
143169
// add adds a new Controller to mgr with r as the reconcile.Reconciler
144170
func add(mgr manager.Manager, r reconcile.Reconciler) error {
145171
return builder.ControllerManagedBy(mgr).

pkg/controller/perconaservermongodb/psmdb_controller_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ package perconaservermongodb
22

33
import (
44
"context"
5+
"os"
6+
"testing"
7+
"time"
58

69
. "github.com/onsi/ginkgo/v2"
710
. "github.com/onsi/gomega"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
813
corev1 "k8s.io/api/core/v1"
914
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1015
"k8s.io/apimachinery/pkg/types"
@@ -13,6 +18,67 @@ import (
1318
psmdbv1 "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
1419
)
1520

21+
func TestGetReconcileInterval(t *testing.T) {
22+
tests := []struct {
23+
name string
24+
envValue string
25+
setEnv bool
26+
want time.Duration
27+
}{
28+
{
29+
name: "unset",
30+
setEnv: false,
31+
want: 5 * time.Second,
32+
},
33+
{
34+
name: "valid duration",
35+
envValue: "30s",
36+
setEnv: true,
37+
want: 30 * time.Second,
38+
},
39+
{
40+
name: "invalid duration falls back to default",
41+
envValue: "invalid",
42+
setEnv: true,
43+
want: 5 * time.Second,
44+
},
45+
{
46+
name: "zero duration falls back to default",
47+
envValue: "0s",
48+
setEnv: true,
49+
want: 5 * time.Second,
50+
},
51+
{
52+
name: "negative duration falls back to default",
53+
envValue: "-5s",
54+
setEnv: true,
55+
want: 5 * time.Second,
56+
},
57+
{
58+
name: "duration less than 5s falls back to default",
59+
envValue: "1s",
60+
setEnv: true,
61+
want: 5 * time.Second,
62+
},
63+
}
64+
65+
for _, tt := range tests {
66+
t.Run(tt.name, func(t *testing.T) {
67+
defer func() {
68+
err := os.Unsetenv("RECONCILE_INTERVAL")
69+
require.NoError(t, err)
70+
}()
71+
if tt.setEnv {
72+
err := os.Setenv("RECONCILE_INTERVAL", tt.envValue)
73+
require.NoError(t, err)
74+
}
75+
76+
got := getReconcileInterval()
77+
assert.Equal(t, tt.want, got)
78+
})
79+
}
80+
}
81+
1682
var _ = Describe("PerconaServerMongoDB", Ordered, func() {
1783
ctx := context.Background()
1884
const ns = "psmdb"

0 commit comments

Comments
 (0)