@@ -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
421430func (m * DockerInstanceManager ) getRWMutex (user accounts.User ) * sync.RWMutex {
0 commit comments