summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@oath.com>2018-02-27 13:53:04 +0100
committerGeir Storli <geirst@oath.com>2018-02-27 14:30:09 +0100
commitf501d44bb86ffb4c09b2d46d3809e3c869ec7041 (patch)
treeefd4c954a6619f6f423289a0a250c4de2800fe21
parent112279999e9d453698ed9f7edff6eb047dc23761 (diff)
Wire buckets pending state into state version tracker.
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterStateView.java4
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterStatsBucketsPendingState.java6
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateVersionTracker.java6
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateVersionTrackerTest.java51
4 files changed, 65 insertions, 2 deletions
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterStateView.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterStateView.java
index 6ce719a97de..62cd158c759 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterStateView.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterStateView.java
@@ -112,6 +112,10 @@ public class ClusterStateView {
StorageNodeStatsBridge.generate(hostInfo.getDistributor()));
}
+ public ClusterStatsAggregator getStatsAggregator() {
+ return statsAggregator;
+ }
+
public String toString() {
return clusterState.toString();
}
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterStatsBucketsPendingState.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterStatsBucketsPendingState.java
index e556841c835..dfa64d72521 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterStatsBucketsPendingState.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterStatsBucketsPendingState.java
@@ -17,8 +17,12 @@ public class ClusterStatsBucketsPendingState {
this.prevMayHaveBucketsPending = false;
}
- public void updateAggregator(ClusterStatsAggregator newAggregator) {
+ public void syncBucketsPendingFlag() {
prevMayHaveBucketsPending = aggregator.mayHaveBucketsPendingInGlobalSpace();
+ }
+
+ public void updateAggregator(ClusterStatsAggregator newAggregator) {
+ syncBucketsPendingFlag();
aggregator = newAggregator;
}
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateVersionTracker.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateVersionTracker.java
index 78e587a7446..c2be8047a13 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateVersionTracker.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateVersionTracker.java
@@ -33,12 +33,14 @@ public class StateVersionTracker {
private ClusterStateBundle currentClusterState = latestCandidateState;
private ClusterStateView clusterStateView;
+ private ClusterStatsBucketsPendingState bucketsPendingState;
private final LinkedList<ClusterStateHistoryEntry> clusterStateHistory = new LinkedList<>();
private int maxHistoryEntryCount = 50;
StateVersionTracker() {
clusterStateView = ClusterStateView.create(currentUnversionedState.getBaselineClusterState());
+ bucketsPendingState = new ClusterStatsBucketsPendingState(clusterStateView.getStatsAggregator());
}
void setVersionRetrievedFromZooKeeper(final int version) {
@@ -84,6 +86,7 @@ public class StateVersionTracker {
public void updateLatestCandidateStateBundle(final ClusterStateBundle candidateBundle) {
assert(latestCandidateState.getBaselineClusterState().getVersion() == 0);
latestCandidateState = candidateBundle;
+ bucketsPendingState.syncBucketsPendingFlag();
}
/**
@@ -122,6 +125,7 @@ public class StateVersionTracker {
newStateBundle.getBaselineClusterState().getDistributionBitCount());
// TODO should this take place in updateLatestCandidateStateBundle instead? I.e. does it require a consolidated state?
clusterStateView = ClusterStateView.create(currentClusterState.getBaselineClusterState());
+ bucketsPendingState.updateAggregator(clusterStateView.getStatsAggregator());
}
private void recordCurrentStateInHistoryAtTime(final long currentTimeMs) {
@@ -138,7 +142,7 @@ public class StateVersionTracker {
}
boolean bucketSpaceMergeCompletionStateHasChanged() {
- return false; // TODO wire changes in merge info
+ return bucketsPendingState.stateHasChanged();
}
/*
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateVersionTrackerTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateVersionTrackerTest.java
index 0f4d1fcdefc..0859ee0e409 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateVersionTrackerTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateVersionTrackerTest.java
@@ -6,6 +6,7 @@ import com.yahoo.vdslib.state.Node;
import com.yahoo.vdslib.state.NodeState;
import com.yahoo.vdslib.state.NodeType;
import com.yahoo.vdslib.state.State;
+import com.yahoo.vespa.clustercontroller.core.hostinfo.HostInfo;
import org.junit.Test;
import java.text.ParseException;
@@ -17,6 +18,8 @@ import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
public class StateVersionTrackerTest {
@@ -267,4 +270,52 @@ public class StateVersionTrackerTest {
assertTrue(versionTracker.candidateChangedEnoughFromCurrentToWarrantPublish());
}
+ @Test
+ public void buckets_pending_state_is_tracked_between_cluster_states() {
+ final StateVersionTracker tracker = createWithMockedMetrics();
+ final NodeInfo distributorNode = mock(DistributorNodeInfo.class);
+ when(distributorNode.isDistributor()).thenReturn(true);
+ assertFalse(tracker.bucketSpaceMergeCompletionStateHasChanged());
+
+ tracker.updateLatestCandidateStateBundle(ClusterStateBundle
+ .ofBaselineOnly(stateWithoutAnnotations("distributor:1 storage:1")));
+ tracker.promoteCandidateToVersionedState(1234);
+ assertFalse(tracker.bucketSpaceMergeCompletionStateHasChanged());
+
+ // Give 'global' bucket space no buckets pending, which is the same as previous stats
+ tracker.handleUpdatedHostInfo(distributorNode, createHostInfo(0));
+ assertFalse(tracker.bucketSpaceMergeCompletionStateHasChanged());
+
+ // Give 'global' bucket space buckets pending, which is different from previous stats
+ tracker.handleUpdatedHostInfo(distributorNode, createHostInfo(1));
+ assertTrue(tracker.bucketSpaceMergeCompletionStateHasChanged());
+
+ tracker.updateLatestCandidateStateBundle(ClusterStateBundle
+ .ofBaselineOnly(stateWithoutAnnotations("distributor:1 storage:1")));
+ assertFalse(tracker.bucketSpaceMergeCompletionStateHasChanged());
+ }
+
+ private HostInfo createHostInfo(long bucketsPending) {
+ return HostInfo.createHostInfo(
+ "{\n" +
+ "\"cluster-state-version\": 2,\n" +
+ "\"distributor\": {\n" +
+ " \"storage-nodes\": [\n" +
+ " {\n" +
+ " \"node-index\": 0,\n" +
+ " \"bucket-spaces\": [\n" +
+ " {\n" +
+ " \"name\": \"global\"\n," +
+ " \"buckets\": {\n" +
+ " \"total\": 5,\n" +
+ " \"pending\": " + bucketsPending + "\n" +
+ " }\n" +
+ " }\n" +
+ " ]\n" +
+ " }\n" +
+ " ]\n" +
+ "}\n" +
+ "}");
+ }
+
}