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); }
public async Task CopyDataFromReplica(BobApiClient bobApiClient, BobDisk bobDisk) { if (configuration.PathToDiskStatusAnalyzer == null || !File.Exists(configuration.PathToDiskStatusAnalyzer)) { logger.LogInformation($"DiskStatusAnalyzer path ({configuration.PathToDiskStatusAnalyzer}) is invalid, skipping copy"); return; } var status = await bobApiClient.GetStatus(); if (status is null) { logger.LogError($"Failed to get status from {bobApiClient}"); return; } var destName = status?.Name; var diskName = bobDisk.DiskNameInBob; bool IsCurrent(Replica replica) => replica.Node == destName && replica.Disk == diskName; var vdisks = status?.VDisks.Where(vd => vd.Replicas.Any(IsCurrent)); if (!vdisks.Any()) { logger.LogError($"VDisks with replica ({diskName}, {destName}) not found"); return; } foreach (var vdisk in vdisks) { var bobPath = Path.Combine(bobDisk.BobPath.Path, "bob"); await TryCreateDir(bobPath); await TryCreateDir(Path.Combine(bobPath, vdisk.Id.ToString())); foreach (var replica in vdisk.Replicas) { if (replica.Node == destName) { continue; } logger.LogInformation($"Trying to copy {vdisk} from {replica.Node} to {destName}"); try { await PerformCopy(replica.Node, destName, vdisk.Id); logger.LogInformation($"Successfully copied {vdisk} from {replica.Node} to {destName}"); break; } catch (Exception e) { logger.LogError($"Failed to copy {vdisk} from {replica.Node} to {destName}: {e.Message}"); } } } }