Skip to content

Commit 4cfeb36

Browse files
committed
Ensure docker volume deletion on DockerIM of CO
1 parent ab60bf1 commit 4cfeb36

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

pkg/app/instances/docker.go

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -387,16 +387,9 @@ func (m *DockerInstanceManager) deleteDockerContainer(ctx context.Context, user
387387
return nil
388388
}
389389

390-
func (m *DockerInstanceManager) deleteDockerVolumeIfNeeded(ctx context.Context, user accounts.User) error {
391-
containerListOpts := container.ListOptions{Filters: dockerFilter(user)}
392-
listRes, err := m.Client.ContainerList(ctx, containerListOpts)
393-
if err != nil {
394-
return fmt.Errorf("failed to list docker containers: %w", err)
395-
}
396-
if len(listRes) > 0 {
397-
return nil
398-
}
390+
const volumeInspectRetryCount = 3
399391

392+
func (m *DockerInstanceManager) deleteDockerVolumeIfNeeded(ctx context.Context, user accounts.User) error {
400393
mu := m.getRWMutex(user)
401394
if locked := mu.TryLock(); !locked {
402395
// If it can't acquire lock on this mutex, there's ongoing host
@@ -405,6 +398,15 @@ func (m *DockerInstanceManager) deleteDockerVolumeIfNeeded(ctx context.Context,
405398
return nil
406399
}
407400
defer mu.Unlock()
401+
402+
containerListOpts := container.ListOptions{Filters: dockerFilter(user)}
403+
listRes, err := m.Client.ContainerList(ctx, containerListOpts)
404+
if err != nil {
405+
return fmt.Errorf("failed to list docker containers: %w", err)
406+
}
407+
if len(listRes) > 0 {
408+
return nil
409+
}
408410
listOpts := volume.ListOptions{Filters: dockerFilter(user)}
409411
volumeListRes, err := m.Client.VolumeList(ctx, listOpts)
410412
if err != nil {
@@ -415,7 +417,14 @@ func (m *DockerInstanceManager) deleteDockerVolumeIfNeeded(ctx context.Context,
415417
return fmt.Errorf("failed to remove docker volume: %w", err)
416418
}
417419
}
418-
return nil
420+
// Ensure the deletion of docker volumes
421+
for i := 0; i < volumeInspectRetryCount; i++ {
422+
volumeListRes, err := m.Client.VolumeList(ctx, listOpts)
423+
if err == nil && len(volumeListRes.Volumes) == 0 {
424+
return nil
425+
}
426+
}
427+
return fmt.Errorf("removed docker volume but still exists")
419428
}
420429

421430
func (m *DockerInstanceManager) getRWMutex(user accounts.User) *sync.RWMutex {

0 commit comments

Comments
 (0)