public Response UnmountVolume(VolumeUnmountRequest request) { if (!this.VolumeExists(request.Name)) { return(new Response("volume not found")); } this.rwLock.EnterWriteLock(); try { if (!knownVolumeMappings.ContainsKey(request.Name)) { return(new Response("volume not found")); } string mountMetadataFilename = Path.Combine(mountMetadataPath, request.Name, request.ID); bool mountpointNotExist = string.IsNullOrEmpty(this.knownVolumeMappings[request.Name].Mountpoint); bool mountIDNotExist = !this.knownVolumeMappings[request.Name].MountIDs.Contains(request.ID); bool mountMetadataFileNotExist = !System.IO.File.Exists(mountMetadataFilename); if (mountpointNotExist || mountIDNotExist || mountMetadataFileNotExist) { TraceWriter.WriteWarningWithId( TraceType, this.serviceContext.TraceId, $"Unmount volume {request.Name}:{request.ID} unexpected state: mountpointNotExist-{mountpointNotExist} mountIDNotExist-{mountIDNotExist}:mountMetadataFileNotExist-{mountMetadataFileNotExist}"); // We are not tracking this volume mount. return(new Response()); } System.IO.File.Delete(mountMetadataFilename); this.knownVolumeMappings[request.Name].MountIDs.Remove(request.ID); return(new Response()); } catch (Exception e) { TraceWriter.WriteErrorWithId( TraceType, this.serviceContext.TraceId, $"Unmount volume {request.Name} failed with exception {e}."); return(new Response($"Unmount volume {request.Name}:{request.ID} failed with exception {e}.")); } finally { this.rwLock.ExitWriteLock(); } }
public Response UnmountVolume(VolumeUnmountRequest request, string traceId) { if (!this.VolumeExists(request.Name)) { string errorMessage = String.Format("Attempt to unmount volume {0} that does not exist.", request.Name); TraceWriter.WriteErrorWithId(Constants.TraceSource, traceId, errorMessage); return(new Response(errorMessage)); } this.volumeRWLock.EnterWriteLock(); try { if (!volumeMappings.ContainsKey(request.Name)) { string errorMessage = String.Format("Mapping for volume {0} was not found.", request.Name); TraceWriter.WriteErrorWithId(Constants.TraceSource, traceId, errorMessage); return(new Response(errorMessage)); } if (string.IsNullOrEmpty(this.volumeMappings[request.Name].Mountpoint) || !this.volumeMappings[request.Name].MountIDs.Contains(request.ID)) { // We are not tracking this volume mount. return(new Response()); } this.volumeMappings[request.Name].MountIDs.Remove(request.ID); --this.volumeMappings[request.Name].NumberOfMounts; #if DotNetCoreClrLinux Interlocked.Decrement(ref BSDockerVolumePlugin.SynchronizedKestrelCommunicationListener.TotalMountedVolumesOnNode); if (this.volumeMappings[request.Name].NumberOfMounts == 0) { TraceWriter.WriteInfoWithId(Constants.TraceSource, traceId, "Attempting umount of " + this.volumeMappings[request.Name].Mountpoint); var returnValue = umount(this.volumeMappings[request.Name].Mountpoint); TraceWriter.WriteInfoWithId(Constants.TraceSource, traceId, "Umount returned" + returnValue); } #endif return(new Response()); } finally { this.volumeRWLock.ExitWriteLock(); } }