|
20 | 20 | */
|
21 | 21 |
|
22 | 22 | import java.util.Arrays;
|
| 23 | +import java.util.Collections; |
23 | 24 |
|
24 | 25 | import com.google.common.collect.Lists;
|
25 | 26 | import com.google.common.collect.Sets;
|
@@ -263,4 +264,60 @@ public void testSleepTransition() throws InterruptedException {
|
263 | 264 | // The new participant causes rebalance, but the state transitions are all stuck
|
264 | 265 | Assert.assertFalse(strictMatchVerifier.verify(3000));
|
265 | 266 | }
|
| 267 | + |
| 268 | + @Test |
| 269 | + public void testExternalViewBestPossibleVerifierWorkWithWaged() throws InterruptedException { |
| 270 | + // Create a WAGED resource with 2 replicas and verify that it is balanced |
| 271 | + String testDB1 = "resource-wagedDB1"; |
| 272 | + _setupTool.addResourceToCluster(_clusterName, testDB1, 1, |
| 273 | + BuiltInStateModelDefinitions.MasterSlave.name(), RebalanceMode.FULL_AUTO.toString()); |
| 274 | + _admin.enableWagedRebalance(_clusterName, Collections.singletonList(testDB1)); |
| 275 | + IdealState db1IdealState = _admin.getResourceIdealState(_clusterName, testDB1); |
| 276 | + db1IdealState.setReplicas(Integer.toString(2)); |
| 277 | + db1IdealState.getRecord().setListField(testDB1 + "_0", |
| 278 | + Arrays.asList(_participants[0].getInstanceName(), _participants[1].getInstanceName())); |
| 279 | + _admin.setResourceIdealState(_clusterName, testDB1, db1IdealState); |
| 280 | + |
| 281 | + // Verify that the resource is balanced |
| 282 | + BestPossibleExternalViewVerifier bestPossibleVerifier = |
| 283 | + new BestPossibleExternalViewVerifier.Builder(_clusterName).setZkClient(_gZkClient) |
| 284 | + .setResources(Sets.newHashSet(testDB1)) |
| 285 | + .setWaitTillVerify(TestHelper.DEFAULT_REBALANCE_PROCESSING_WAIT_TIME) |
| 286 | + .build(); |
| 287 | + Assert.assertTrue(bestPossibleVerifier.verify(10000)); |
| 288 | + |
| 289 | + // Re-start a new participant with sleeping transition(all state model transition cannot finish) |
| 290 | + // This should fail the verification of the second resource |
| 291 | + _participants[2].syncStop(); |
| 292 | + Thread.sleep(1000); |
| 293 | + |
| 294 | + _participants[2] = new MockParticipantManager(ZK_ADDR, _clusterName, _participants[2].getInstanceName()); |
| 295 | + _participants[2].setTransition(new SleepTransition(99999999)); |
| 296 | + _participants[2].syncStart(); |
| 297 | + |
| 298 | + // Create the second WAGED resource with 2 replicas and verify that it is NOT balanced |
| 299 | + String testDB2 = "resource-wagedDB2"; |
| 300 | + _setupTool.addResourceToCluster(_clusterName, testDB2, 1, |
| 301 | + BuiltInStateModelDefinitions.MasterSlave.name(), RebalanceMode.FULL_AUTO.toString()); |
| 302 | + _admin.enableWagedRebalance(_clusterName, Collections.singletonList(testDB2)); |
| 303 | + IdealState db2IdealState = _admin.getResourceIdealState(_clusterName, testDB2); |
| 304 | + db2IdealState.setReplicas(Integer.toString(2)); |
| 305 | + db2IdealState.getRecord().setListField(testDB2 + "_0", |
| 306 | + Arrays.asList(_participants[1].getInstanceName(), _participants[2].getInstanceName())); |
| 307 | + _admin.setResourceIdealState(_clusterName, testDB2, db2IdealState); |
| 308 | + |
| 309 | + // Verify that the resource is NOT balanced |
| 310 | + bestPossibleVerifier = new BestPossibleExternalViewVerifier.Builder(_clusterName).setZkClient(_gZkClient) |
| 311 | + .setResources(Sets.newHashSet(testDB2)) |
| 312 | + .setWaitTillVerify(TestHelper.DEFAULT_REBALANCE_PROCESSING_WAIT_TIME) |
| 313 | + .build(); |
| 314 | + Assert.assertFalse(bestPossibleVerifier.verify(3000)); |
| 315 | + |
| 316 | + // The verification of the first resource should still pass |
| 317 | + bestPossibleVerifier = new BestPossibleExternalViewVerifier.Builder(_clusterName).setZkClient(_gZkClient) |
| 318 | + .setResources(Sets.newHashSet(testDB1)) |
| 319 | + .setWaitTillVerify(TestHelper.DEFAULT_REBALANCE_PROCESSING_WAIT_TIME) |
| 320 | + .build(); |
| 321 | + Assert.assertTrue(bestPossibleVerifier.verify(10000)); |
| 322 | + } |
266 | 323 | }
|
0 commit comments