private void LogCurrentSegmentAssignment() { if (!log.IsDebugEnabled) { return; } var sb = new StringBuilder("Current segment assignments are: "); var stats = new Dictionary <NodeEndpoint, NodeEndpointStats>(); var groupByAssignment = Segments.GroupBy(x => x.AssignedEndpoint ?? new NodeEndpoint()); var groupByTentative = Segments.GroupBy(x => x.InProcessOfMovingToEndpoint); var groupByTentativeBackups = Segments.SelectMany(x => x.PendingBackups).GroupBy(x => x); var groupByBackups = Segments.SelectMany(x => x.Backups).GroupBy(x => x); foreach (var assignment in groupByAssignment) { stats[assignment.Key] = new NodeEndpointStats { AssignmentCount = assignment.Count() }; } NodeEndpointStats value; foreach (var backup in groupByBackups) { if (backup.Key == null) { continue; } if (stats.TryGetValue(backup.Key, out value)) { value.BackupCount = backup.Count(); } } foreach (var tentative in groupByTentative) { if (tentative.Key == null) { continue; } if (stats.TryGetValue(tentative.Key, out value)) { value.TentativeCount = tentative.Count(); } } foreach (var backup in groupByTentativeBackups) { if (backup.Key == null) { continue; } if (stats.TryGetValue(backup.Key, out value)) { value.TentativeBackupCount = backup.Count(); } } foreach (var segment in stats) { sb.Append("[") .Append(segment.Key.Sync.ToString() ?? "NULL") .Append(", assignments: ") .Append(segment.Value.AssignmentCount) .Append(", backups: ") .Append(segment.Value.BackupCount) .Append(", tentatives: ") .Append(segment.Value.TentativeCount) .Append(", tentative backups: ") .Append(segment.Value.TentativeBackupCount) .Append("], "); } log.Debug(sb.ToString()); }