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