public async Task SyncCluster()
        {
            try
            {
                IEnumerable <NodeServer> registeredNodes = await NodeSettingsAccessFactory.Get().GetNodesAsync();

                IEnumerable <NodeServer> clusterNodes = _clusterManager.NodeComponentDistribution.Keys;

                // remove nodes that are no longer desired
                var nodesToRemove = clusterNodes.Where(x => !registeredNodes.Select(rn => rn.NetworkName).Contains(x.NetworkName));
                if (nodesToRemove.Any())
                {
                    nodesToRemove //.AsParallel()
                                  //.ForAll(async node => await _clusterManager.ShrinkClusterAsync(node));
                    .Select(async node => await _clusterManager.ShrinkClusterAsync(node))
                    .ToList();
                }

                // expand cluster using new nodes
                var newNodes = registeredNodes.Where(x => !clusterNodes.Select(cn => cn.NetworkName).Contains(x.NetworkName));
                if (newNodes.Any())
                {
                    newNodes //.AsParallel()
                             //.ForAll(async node => await _clusterManager.ExpandClusterAsync(node));
                    .Select(async node => await _clusterManager.ExpandClusterAsync(node))
                    .ToList();
                }

                // sync remaining nodes
                var remainingNodes = registeredNodes.Where(x => !newNodes.Select(nc => nc.NetworkName).Contains(x.NetworkName));

                if (remainingNodes.Any())
                {
                    remainingNodes //.AsParallel()
                                   //.ForAll(async node => await _clusterManager.SyncNode(node));
                    .Select(async node => await _clusterManager.SyncNode(node))
                    .ToList();
                }
            }
            finally
            {
            }
        }