Skip to content

Commit 3727351

Browse files
committed
OAS-10007 Fix race condition in ArangoBackup
1 parent 8264471 commit 3727351

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
- (Improvement) Better panic handling
1919
- (Feature) PongV1 Integration Service
2020
- (Feature) Custom Gateway image
21+
- (Bugfix) Fix race condition in ArangoBackup
2122

2223
## [1.2.42](https://github.com/arangodb/kube-arangodb/tree/1.2.42) (2024-07-23)
2324
- (Maintenance) Go 1.22.4 & Kubernetes 1.29.6 libraries

pkg/handlers/backup/handler.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,14 @@ func (h *handler) refreshDeployment(deployment *database.ArangoDeployment) error
123123
return err
124124
}
125125

126+
for _, backup := range backups.Items {
127+
switch backup.GetStatus().ArangoBackupState.State {
128+
case backupApi.ArangoBackupStateCreate, backupApi.ArangoBackupStateCreating:
129+
// Skip refreshing backups if they are in creation state
130+
return nil
131+
}
132+
}
133+
126134
existingBackups, err := client.List()
127135
if err != nil {
128136
return err

pkg/handlers/backup/handler_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,51 @@ func Test_Refresh_Cleanup(t *testing.T) {
129129
require.NoError(t, err)
130130
require.Len(t, backups.Items, 0)
131131
})
132+
133+
t.Run("Do not refresh if backup is creating", func(t *testing.T) {
134+
// Arrange
135+
fakeId := driver.BackupID(uuid.NewUUID())
136+
createBackup := backupApi.ArangoBackup{
137+
138+
ObjectMeta: meta.ObjectMeta{
139+
Name: "backup",
140+
},
141+
Status: backupApi.ArangoBackupStatus{
142+
ArangoBackupState: backupApi.ArangoBackupState{
143+
State: backupApi.ArangoBackupStateCreating,
144+
},
145+
Backup: &backupApi.ArangoBackupDetails{
146+
ID: string(fakeId),
147+
},
148+
},
149+
}
150+
b, err := handler.client.BackupV1().ArangoBackups(tests.FakeNamespace).Create(context.Background(), &createBackup, meta.CreateOptions{})
151+
require.NoError(t, err)
152+
require.NotNil(t, b)
153+
require.Equal(t, backupApi.ArangoBackupStateCreating, b.Status.State)
154+
155+
t.Run("Refresh should not happen if there is Backup in creation state", func(t *testing.T) {
156+
require.NoError(t, handler.refreshDeployment(arangoDeployment))
157+
158+
backups, err := handler.client.BackupV1().ArangoBackups(tests.FakeNamespace).List(context.Background(), meta.ListOptions{})
159+
require.NoError(t, err)
160+
require.Len(t, backups.Items, 1)
161+
require.NotNil(t, backups.Items[0].Status.Backup)
162+
require.EqualValues(t, fakeId, backups.Items[0].Status.Backup.ID)
163+
})
164+
165+
createBackup.Status.State = backupApi.ArangoBackupStateReady
166+
b, err = handler.client.BackupV1().ArangoBackups(tests.FakeNamespace).UpdateStatus(context.Background(), &createBackup, meta.UpdateOptions{})
167+
require.NoError(t, err)
168+
require.NotNil(t, b)
169+
require.Equal(t, backupApi.ArangoBackupStateReady, b.Status.State)
170+
171+
t.Run("Refresh should happen if there is Backup in ready state", func(t *testing.T) {
172+
require.NoError(t, handler.refreshDeployment(arangoDeployment))
173+
174+
backups, err := handler.client.BackupV1().ArangoBackups(tests.FakeNamespace).List(context.Background(), meta.ListOptions{})
175+
require.NoError(t, err)
176+
require.Len(t, backups.Items, 2)
177+
})
178+
})
132179
}

0 commit comments

Comments
 (0)