diff options
author | Tor Brede Vekterli <vekterli@yahoo-inc.com> | 2017-09-19 17:18:27 +0200 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@yahoo-inc.com> | 2017-09-19 17:18:27 +0200 |
commit | b9e23296d4b7c36f910054f8d073f0ebef925c23 (patch) | |
tree | 0ba791793bd5f7085d6c4e51efc105bc68648938 /clustercontroller-core | |
parent | d825bb328c94e138ea87301282c85cc4edb5e585 (diff) |
Immediately complete remote tasks when not leader
Avoids edge case where set-node-state requests sent to followers would
have their response delayed indefinitely due to controller not
publishing any versions that the task's ACK barrier could be released by.
Diffstat (limited to 'clustercontroller-core')
2 files changed, 17 insertions, 1 deletions
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java index d8628663199..745ade3f04b 100644 --- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java +++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java @@ -665,7 +665,8 @@ public class FleetController implements NodeStateOrHostInfoChangeHandler, NodeAd final RemoteClusterControllerTask task = remoteTasks.poll(); log.finest(() -> String.format("Processing remote task of type '%s'", task.getClass().getName())); task.doRemoteFleetControllerTask(context); - if (!task.hasVersionAckDependency()) { + // We cannot introduce a version barrier for tasks when we're not the master (and therefore will not publish new versions). + if (!isMaster() || !task.hasVersionAckDependency()) { log.finest(() -> String.format("Done processing remote task of type '%s'", task.getClass().getName())); task.notifyCompleted(); } else { diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java index 49cfe8bd3b6..6a8ffae8f3f 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java @@ -1508,4 +1508,19 @@ public class StateChangeTest extends FleetControllerTest { assertTrue(task.isCompleted()); } + @Test + public void synchronous_task_immediately_answered_when_not_leader() throws Exception { + FleetControllerOptions options = optionsWithZeroTransitionTime(); + options.fleetControllerCount = 3; + RemoteTaskFixture fixture = createFixtureWith(options); + + fixture.loseLeadership(); + markAllNodesAsUp(options); + + MockTask task = fixture.scheduleVersionDependentTaskWithSideEffects(); + + assertTrue(task.isInvoked()); + assertTrue(task.isCompleted()); + } + } |