Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
        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();
            }
        }