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); }
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); } }
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); } }
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); }
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"); } } }