Beispiel #1
0
        public async Task <UUID> GetUUID(BobDisk info)
        {
            var disks = await disksFinder.FindDisks();

            var volume = disks.SelectMany(d => d.Volumes).Single(v => v.PhysicalId.Equals(info.PhysicalId));

            return(volume.UUID);
        }
Beispiel #2
0
        private async Task <bool> TryCleanPreviousData(Volume volume, BobApiClient bobApiClient, MountPath path)
        {
            int count = 0;

            await TryStopBobdisk(volume, bobApiClient);

            while (count++ < configuration.MaxUmountRetries)
            {
                try
                {
                    var disks = await disksFinder.FindDisks();

                    if (disks.Any(d => d.Volumes.Count > 0 && d.Volumes.Any(v => v.MountPath?.Equals(path) == true && v.IsMounted)))
                    {
                        logger.LogInformation($"Trying to unmount previous disks in {path}");
                        await processInvoker.InvokeSudoProcess("umount", path.ToString());

                        logger.LogInformation($"Successfully umounted previous disks in {path}");
                    }
                    return(true);
                }
                catch (ProcessFailedException e) when(e.ExitCode == 32)
                {
                    await Task.Delay(1000);
                }
            }
Beispiel #3
0
        public async Task AddEntriesFromBob(BobApiClient bobApiClient)
        {
            var disks = await disksFinder.FindDisks();

            var infos = await configGenerator.GenerateConfigFromBob(bobApiClient);

            foreach (var i in infos)
            {
                logger.LogInformation($"Received {i} from bob");
                var conflict = MonitoringEntries.FirstOrDefault(bd => bd.DiskNameInBob == i.DiskNameInBob && bd.BobPath.Equals(i.BobPath) && !bd.Equals(i));
                if (conflict != null)
                {
                    logger.LogWarning($"Conflict: disk from bob {i} conflicts with disk from config {conflict}");
                    continue;
                }
                var uuid = disks.SelectMany(d => d.Volumes).FirstOrDefault(v => v.PhysicalId.Equals(i.PhysicalId) && v.IsFormatted)?.UUID;
                if (uuid != null)
                {
                    SaveUUID(uuid);
                }
                MonitoringEntries.Add(i);
            }
        }
Beispiel #4
0
        public async Task <IEnumerable <BobDisk> > GenerateConfigFromBob(BobApiClient bobApiClient)
        {
            var disks = await bobApiClient.GetDisksToMonitor();

            if (disks == null)
            {
                logger.LogError($"Failed to get bob disks from {bobApiClient}");
                return(Enumerable.Empty <BobDisk>());
            }
            var physicalDisks = await disksFinder.FindDisks();

            var infos = disks.Where(d => d.IsActive).Select(d => FindInfo(d, physicalDisks)).Where(i => i != null);

            return(infos);
        }
Beispiel #5
0
        public async Task StartDisks(BobApiClient bobApiClient)
        {
            var disksToStart = configuration.MonitoringEntries;
            var disks        = await disksFinder.FindDisks();

            foreach (var i in disksToStart)
            {
                var inactiveDisks = await bobApiClient.GetInactiveDisks();

                if (inactiveDisks == null)
                {
                    return;
                }
                if (!inactiveDisks.Any(d => d.Name == i.DiskNameInBob))
                {
                    continue;
                }

                var disk   = disks.FirstOrDefault(d => d.Volumes.Any(v => v.MountPath.Equals(i.MountPath) && v.IsMounted));
                var volume = disk?.Volumes.First(v => v.MountPath.Equals(i.MountPath) && v.IsMounted);
                if (disks.Count == 0 ||
                    !disks.Any(d => !d.NoVolumes && d.Volumes.Any(v => v.MountPath.Equals(i.MountPath) && v.IsMounted && !v.IsReadOnly)))
                {
                    continue;
                }

                logger.LogInformation($"Trying to start disk {i}");
                if (!configuration.KnownUuids.Contains(volume.UUID))
                {
                    await disksCopier.CopyDataFromReplica(bobApiClient, i);
                }
                configuration.SaveUUID(await disksMonitor.GetUUID(i));
                logger.LogInformation($"Starting bobdisk {i}...");
                int retry = 0;
                while (!await bobApiClient.StartDisk(i.DiskNameInBob) && retry++ < configuration.StartRetryCount)
                {
                    logger.LogWarning($"Failed to start bobdisk in try {retry}, trying again");
                }
                if (retry == configuration.StartRetryCount)
                {
                    logger.LogError($"Failed to start bobdisk {i}");
                }
                else
                {
                    logger.LogInformation($"Bobdisk {i} started");
                }
            }
        }