private async Task <RestartInfo?> CopyAlienFromVDisk(VDiskDir vDisk, Configuration config, NodeWithDirs targetNode) { var targetVDisk = GetTargetVDisk(vDisk, targetNode); if (targetVDisk == null) { logger.LogError($"VDisk {vDisk.Id} not found on target {targetNode.Name}"); return(null); } logger.LogInformation($"Checking copy from {vDisk} to {targetVDisk}"); logger.LogInformation($"Found not copied partition on {vDisk}"); if (config.CopyAliens) { if (!await rsyncWrapper.Copy(vDisk, targetVDisk)) { logger.LogError($"Error copying {vDisk} to {targetVDisk}"); } else { logger.LogInformation($"Successfully copied partitions from {vDisk}"); if (config.RestartAfterCopy) { return(new RestartInfo(targetNode, vDisk)); } } } return(null); }
private bool ContainsNonCopiedPartition(VDiskDir vDisk, VDiskDir targetVDisk) { if (targetVDisk?.Partitions != null && vDisk?.Partitions != null) { return(vDisk.Partitions.Any(partition => targetVDisk.Partitions.All(p => p.Name != partition.Name))); } return(false); }
private async Task RemoveCopiedData(VDiskDir vDisk) { var filesInDir = await rsyncWrapper.FindFilesWithUniqueIdRelative(vDisk); var syncedFiles = await rsyncWrapper.FindSyncedFiles(vDisk); foreach (var file in filesInDir) { logger.LogInformation($"In dir: {file}"); } foreach (var file in syncedFiles) { logger.LogInformation($"Synced: {file}"); } var filesToRemove = new List <string>(); foreach (var syncedFile in syncedFiles) { var pathIndex = syncedFile.IndexOf(RsyncWrapper.PathStart) + RsyncWrapper.PathStart.Length; if (pathIndex < syncedFile.Length) { var filename = syncedFile.Substring(pathIndex).Trim(); if (filesInDir.Contains(syncedFile)) { logger.LogInformation($"File {filename} is marked for removal"); filesToRemove.Add(filename); } } else { logger.LogWarning($"Received strange file string: {syncedFile}"); } } if (filesToRemove.Count > 0) { logger.LogInformation($"Removing files {string.Join(", ", filesToRemove)}"); if (!await rsyncWrapper.RemoveFiles( vDisk, filesToRemove.Select(f => Path.Combine(vDisk.Path, f.Trim('/'))))) { logger.LogError($"Failed to remove files"); } } }
public RestartInfo(NodeWithDirs node, VDiskDir vDisk) { Node = node; VDisk = vDisk; }
private VDiskDir GetTargetVDisk(VDiskDir vDisk, NodeWithDirs targetNode) { return(targetNode.DiskDirs .SelectMany(d => d.Bob.VDisks.Where(vd => vd.Id == vDisk.Id)).FirstOrDefault()); }