コード例 #1
0
        private static bool RemoveReplica(ClusterConfiguration.VDisk.Replica replica,
                                          ClusterConfiguration.VDisk vDisk,
                                          string path,
                                          ExpandClusterOptions options)
        {
            var dsaPath   = Path.GetFullPath(options.DiskStatusAnalyzer);
            var startInfo = new ProcessStartInfo
            {
                FileName         = dsaPath,
                WorkingDirectory = Path.GetDirectoryName(dsaPath),
            };

            startInfo.ArgumentList.Add("remove-dir");
            startInfo.ArgumentList.Add($"--node");
            startInfo.ArgumentList.Add($"{replica.Node}");
            startInfo.ArgumentList.Add($"--dir");
            startInfo.ArgumentList.Add($"{path}{Path.DirectorySeparatorChar}bob{Path.DirectorySeparatorChar}{vDisk.Id}");
            var process = new Process {
                StartInfo = startInfo
            };

            logger.LogInformation($"Starting process (pwd={startInfo.WorkingDirectory}) {startInfo.FileName} {string.Join(" ", process.StartInfo.ArgumentList)}");
            if (options.DryRun)
            {
                return(true);
            }
            process.Start();
            process.WaitForExit();
            logger.LogInformation($"Process returned code {process.ExitCode}");
            return(process.ExitCode == 0);
        }
コード例 #2
0
        private static async Task ExpandCluster(ExpandClusterOptions options)
        {
            logger.LogDebug($"Expanding cluster from {options.OldConfigPath} to {options.NewConfigPath}");
            var oldConfig = await ClusterConfiguration.FromYamlFile(options.OldConfigPath);

            var newConfig = await ClusterConfiguration.FromYamlFile(options.NewConfigPath);

            foreach (var vdisk in newConfig.VDisks)
            {
                using var _ = logger.BeginScope("VDisk {vdiskId}", vdisk.Id);
                logger.LogDebug("Analyzing vdisk from new config");
                var oldVdisk = oldConfig.VDisks.Find(vd => vd.Id == vdisk.Id);
                if (oldVdisk != null && oldVdisk.Replicas.Count > 0)
                {
                    foreach (var replica in vdisk.Replicas)
                    {
                        using var __ = logger.BeginScope("Replica = {replicaNode}-{replicaDisk}", replica.Node, replica.Disk);
                        logger.LogDebug("Analyzing replica from new config");
                        var node = newConfig.Nodes.Find(n => n.Name == replica.Node);
                        var disk = node.Disks.Find(d => d.Name == replica.Disk);
                        using var ___ = logger.BeginScope("Path = {replicaPath}", disk.Path);
                        var oldReplica = oldVdisk.Replicas.Find(r => r.Node == replica.Node && r.Disk == replica.Disk);
                        if (oldReplica != null)
                        {
                            logger.LogDebug("Found replica in old config");
                        }
                        else
                        {
                            logger.LogWarning("Replica not found in old config, restoring data...");
                            foreach (var selectedReplica in oldVdisk.Replicas)
                            {
                                var oldNode = oldConfig.Nodes.Find(n => n.Name == selectedReplica.Node);
                                var oldDisk = oldNode.Disks.Find(d => d.Name == selectedReplica.Disk);
                                if (CopyReplica(vdisk, replica, selectedReplica, oldDisk.Path, disk.Path, options))
                                {
                                    break;
                                }
                                else
                                {
                                    logger.LogWarning($"Failed to copy from replica on node {selectedReplica.Node}");
                                }
                            }
                        }
                    }
                }
                else
                {
                    logger.LogDebug($"Vdisk's replicas not found in old config");
                }
            }

            if (options.RemoveSourceFiles)
            {
                foreach (var vDisk in oldConfig.VDisks)
                {
                    using var _ = logger.BeginScope("VDisk {vdiskId}", vDisk.Id);
                    foreach (var replica in vDisk.Replicas.Where(r => !newConfig.VDisks.Any(vd => vd.Replicas.Any(r1 => r.Disk == r1.Disk && r.Node == r1.Node))))
                    {
                        using var __ = logger.BeginScope("Replica = {replicaNode}-{replicaDisk}", replica.Node, replica.Disk);
                        var node = oldConfig.Nodes.Find(n => n.Name == replica.Node);
                        var disk = node.Disks.Find(d => d.Name == replica.Disk);
                        RemoveReplica(replica, vDisk, disk.Path, options);
                    }
                }
            }
        }