From 439b2867e3b2612df1eddef899a8727afe005ad5 Mon Sep 17 00:00:00 2001 From: sk0x50 Date: Thu, 30 Jan 2025 18:27:12 +0200 Subject: [PATCH 1/3] IGNITE-23365 Improve assignments tracker logging --- .../placementdriver/AssignmentsTracker.java | 100 ++++++++++++++++-- 1 file changed, 92 insertions(+), 8 deletions(-) diff --git a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java index df6438e2093..01e20d10b70 100644 --- a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java +++ b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java @@ -23,6 +23,8 @@ import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture; import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -74,7 +76,6 @@ public class AssignmentsTracker implements AssignmentsPlacementDriver { /** Pending assignment Meta storage watch listener. */ private final WatchListener pendingAssignmentsListener; - /** * The constructor. * @@ -102,15 +103,14 @@ public void startTrack() { handleRecoveryAssignments(recoveryRevisions, STABLE_ASSIGNMENTS_PREFIX_BYTES, groupStableAssignments); }).whenComplete((res, ex) -> { if (ex != null) { - LOG.error("Cannot do recovery", ex); + LOG.error("Failed to start assignment tracker due to recovery error", ex); + } else if (LOG.isInfoEnabled()) { + LOG.info( + "Assignment cache initialized for placement driver [stableAssignments=[{}], pendingAssignments=[{}]]", + prepareAssignmentsForLogging(groupStableAssignments), + prepareAssignmentsForLogging(groupPendingAssignments)); } }); - - LOG.info( - "Assignment cache initialized for placement driver [groupStableAssignments={}, groupPendingAssignments={}]", - groupStableAssignments, - groupPendingAssignments - ); } /** @@ -241,4 +241,88 @@ private static String collectKeysFromEventAsString(WatchEvent event) { .collect(Collectors.joining(",")); } + /** + * Prepares assignments for logging using the following structure: + * consistentId=[peers=[1_part_1, 1_part_2], learners=[2_part_0]]. + * + * @param assignmentsMap assignments to be logged. + * @return String representation of assignments. + */ + private static String prepareAssignmentsForLogging(Map assignmentsMap) { + class NodeAssignments { + private List peers; + private List learners; + + private NodeAssignments() { + this.peers = new ArrayList<>(); + this.learners = new ArrayList<>(); + } + + private void addLearner(ReplicationGroupId peer) { + if (learners == null) { + learners = new ArrayList<>(); + } + + learners.add(peer); + } + + private void addPeer(ReplicationGroupId peer) { + if (peers == null) { + peers = new ArrayList<>(); + } + + peers.add(peer); + } + + private boolean arePeersEmpty() { + return peers == null || peers.isEmpty(); + } + + private boolean areLearnersEmpty() { + return learners == null || learners.isEmpty(); + } + } + + Map assignmentsToLog = new HashMap<>(); + + for (Map.Entry assignments : assignmentsMap.entrySet()) { + for (Assignment assignment : assignments.getValue().nodes()) { + NodeAssignments v = assignmentsToLog.computeIfAbsent(assignment.consistentId(), k -> new NodeAssignments()); + + if (assignment.isPeer()) { + v.addPeer(assignments.getKey()); + } else { + v.addLearner(assignments.getKey()); + } + } + } + + boolean first = true; + StringBuilder sb = new StringBuilder(); + + for (Map.Entry entry : assignmentsToLog.entrySet()) { + NodeAssignments value = entry.getValue(); + + if (value.arePeersEmpty() && value.areLearnersEmpty()) { + continue; + } + + if (first) { + first = false; + } else { + sb.append(", "); + } + + sb.append(entry.getKey()).append("=["); + if (!value.arePeersEmpty()) { + sb.append("peers=").append(value.peers); + } + if (!value.areLearnersEmpty()) { + sb.append("learners=").append(value.learners); + } + sb.append("]"); + } + + return sb.toString(); + } } From 99536e504f201b7fb6954cf6445f97ebc80d575b Mon Sep 17 00:00:00 2001 From: sk0x50 Date: Thu, 30 Jan 2025 18:45:24 +0200 Subject: [PATCH 2/3] IGNITE-23365 Fix PMD issue --- .../ignite/internal/placementdriver/AssignmentsTracker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java index 01e20d10b70..1215d635c50 100644 --- a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java +++ b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java @@ -320,7 +320,7 @@ private boolean areLearnersEmpty() { if (!value.areLearnersEmpty()) { sb.append("learners=").append(value.learners); } - sb.append("]"); + sb.append(']'); } return sb.toString(); From 03af5c470bf117fa55e8660b83081baca88376b1 Mon Sep 17 00:00:00 2001 From: sk0x50 Date: Fri, 31 Jan 2025 10:49:34 +0200 Subject: [PATCH 3/3] IGNITE-23365 Fix output for assignments --- .../placementdriver/AssignmentsTracker.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java index 1215d635c50..c4cd8994787 100644 --- a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java +++ b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java @@ -254,24 +254,24 @@ class NodeAssignments { private List learners; private NodeAssignments() { - this.peers = new ArrayList<>(); - this.learners = new ArrayList<>(); } - private void addLearner(ReplicationGroupId peer) { - if (learners == null) { - learners = new ArrayList<>(); - } - - learners.add(peer); - } + private void addReplicationGroupId(ReplicationGroupId replicationGroupId, boolean isPeer) { + List peersOrLearners; - private void addPeer(ReplicationGroupId peer) { - if (peers == null) { - peers = new ArrayList<>(); + if (isPeer) { + if (peers == null) { + peers = new ArrayList<>(); + } + peersOrLearners = peers; + } else { + if (learners == null) { + learners = new ArrayList<>(); + } + peersOrLearners = learners; } - peers.add(peer); + peersOrLearners.add(replicationGroupId); } private boolean arePeersEmpty() { @@ -287,13 +287,9 @@ private boolean areLearnersEmpty() { for (Map.Entry assignments : assignmentsMap.entrySet()) { for (Assignment assignment : assignments.getValue().nodes()) { - NodeAssignments v = assignmentsToLog.computeIfAbsent(assignment.consistentId(), k -> new NodeAssignments()); - - if (assignment.isPeer()) { - v.addPeer(assignments.getKey()); - } else { - v.addLearner(assignments.getKey()); - } + assignmentsToLog + .computeIfAbsent(assignment.consistentId(), k -> new NodeAssignments()) + .addReplicationGroupId(assignments.getKey(), assignment.isPeer()); } } @@ -316,6 +312,9 @@ private boolean areLearnersEmpty() { sb.append(entry.getKey()).append("=["); if (!value.arePeersEmpty()) { sb.append("peers=").append(value.peers); + if (!value.areLearnersEmpty()) { + sb.append(", "); + } } if (!value.areLearnersEmpty()) { sb.append("learners=").append(value.learners);