diff --git a/src/NzbDrone.Common/Disk/DriveInfoMount.cs b/src/NzbDrone.Common/Disk/DriveInfoMount.cs index 5e246313b..40f4fb6cd 100644 --- a/src/NzbDrone.Common/Disk/DriveInfoMount.cs +++ b/src/NzbDrone.Common/Disk/DriveInfoMount.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Common.Disk { get { - if (VolumeLabel.IsNullOrWhiteSpace()) + if (VolumeLabel.IsNullOrWhiteSpace() || VolumeLabel.StartsWith("UUID=") || Name == VolumeLabel) { return Name; } diff --git a/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs b/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs index d7650c204..f91a90ac2 100644 --- a/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs +++ b/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs @@ -130,5 +130,25 @@ namespace NzbDrone.Core.Test.DiskSpace Mocker.GetMock() .Verify(v => v.GetAvailableSpace(It.IsAny()), Times.Never()); } + + [TestCase("/boot")] + [TestCase("/var/lib/rancher")] + [TestCase("/var/lib/kubelet")] + [TestCase("/var/lib/docker")] + [TestCase("/some/place/docker/aufs")] + public void should_not_check_diskspace_for_irrelevant_mounts(string path) + { + var mount = new Mock(); + mount.SetupGet(v => v.RootDirectory).Returns(path); + mount.SetupGet(v => v.DriveType).Returns(System.IO.DriveType.Fixed); + + Mocker.GetMock() + .Setup(v => v.GetMounts()) + .Returns(new List { mount.Object }); + + var freeSpace = Subject.GetFreeSpace(); + + freeSpace.Should().BeEmpty(); + } } } diff --git a/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs b/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs index edc641533..4f3d8f0ba 100644 --- a/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs +++ b/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs @@ -1,7 +1,8 @@ using System; -using System.IO; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Text.RegularExpressions; using NLog; using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; @@ -22,6 +23,8 @@ namespace NzbDrone.Core.DiskSpace private readonly IDiskProvider _diskProvider; private readonly Logger _logger; + private static readonly Regex _regexSpecialDrive = new Regex("^/var/lib/(docker|rancher|kubelet)$|^/boot$|docker(/var)?/aufs", RegexOptions.Compiled); + public DiskSpaceService(ISeriesService seriesService, IConfigService configService, IDiskProvider diskProvider, Logger logger) { _seriesService = seriesService; @@ -32,37 +35,36 @@ namespace NzbDrone.Core.DiskSpace public List GetFreeSpace() { - var diskSpace = new List(); - diskSpace.AddRange(GetSeriesFreeSpace()); - diskSpace.AddRange(GetDroneFactoryFreeSpace()); - diskSpace.AddRange(GetFixedDisksFreeSpace()); + var rootPaths = new List(); + rootPaths.AddRange(GetSeriesRootPaths()); + rootPaths.AddRange(GetDroneFactoryRootPaths()); + rootPaths.AddRange(GetFixedDisksRootPaths()); - return diskSpace.DistinctBy(d => d.Path).ToList(); + return GetDiskSpace(rootPaths.Distinct()).ToList(); } - private IEnumerable GetSeriesFreeSpace() + private IEnumerable GetSeriesRootPaths() { - var seriesRootPaths = _seriesService.GetAllSeries() + return _seriesService.GetAllSeries() .Where(s => _diskProvider.FolderExists(s.Path)) .Select(s => _diskProvider.GetPathRoot(s.Path)) .Distinct(); - - return GetDiskSpace(seriesRootPaths); } - private IEnumerable GetDroneFactoryFreeSpace() + private IEnumerable GetDroneFactoryRootPaths() { if (_configService.DownloadedEpisodesFolder.IsNotNullOrWhiteSpace() && _diskProvider.FolderExists(_configService.DownloadedEpisodesFolder)) { - return GetDiskSpace(new[] { _diskProvider.GetPathRoot(_configService.DownloadedEpisodesFolder) }); + yield return _configService.DownloadedEpisodesFolder; } - - return new List(); } - private IEnumerable GetFixedDisksFreeSpace() + private IEnumerable GetFixedDisksRootPaths() { - return GetDiskSpace(_diskProvider.GetMounts().Where(d => d.DriveType == DriveType.Fixed).Select(d => d.RootDirectory), true); + return _diskProvider.GetMounts() + .Where(d => d.DriveType == DriveType.Fixed) + .Where(d => !_regexSpecialDrive.IsMatch(d.RootDirectory)) + .Select(d => d.RootDirectory); } private IEnumerable GetDiskSpace(IEnumerable paths, bool suppressWarnings = false) diff --git a/src/NzbDrone.Mono/Disk/ProcMount.cs b/src/NzbDrone.Mono/Disk/ProcMount.cs index af3e59bca..154af2971 100644 --- a/src/NzbDrone.Mono/Disk/ProcMount.cs +++ b/src/NzbDrone.Mono/Disk/ProcMount.cs @@ -45,7 +45,7 @@ namespace NzbDrone.Mono.Disk { get { - if (VolumeLabel.IsNullOrWhiteSpace() || VolumeLabel.StartsWith("UUID=")) + if (VolumeLabel.IsNullOrWhiteSpace() || VolumeLabel.StartsWith("UUID=") || Name == VolumeLabel) { return Name; }