private async Task <List <RestartInfo?> > CopyAliensFromNode(NodeWithDirs node, List <NodeWithDirs> nodes, Configuration config) { var result = new List <RestartInfo?>(); var client = new BobApiClient(node.Uri); var disks = await client.GetDisksToMonitor(); var alienDisk = disks.FirstOrDefault(d => d.Path == node.AlienDir.Path).Name; if (alienDisk == null) { return(result); } await client.StopDisk(alienDisk); await client.StartDisk(alienDisk); var tasks = new List <Task <RestartInfo?[]> >(); foreach (var alienNode in node.AlienDir.Nodes) { tasks.Add(CopyAlien(alienNode, nodes, config)); } return(await Task.WhenAll(tasks).ContinueWith(t => t.Result.SelectMany(_ => _).ToList())); }
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"); } } }