/*
* Copyright 2010-2013 Luca Garulli (l.garulli--at--orientechnologies.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.orientechnologies.orient.server.distributed;
import org.junit.Assert;
import org.junit.Test;
/**
* Distributed test with 2 servers (0 and 1) running as dynamic and after a while the server 1 is isolated from the network (using a
* proxy) and then it re-merges the cluster again.
*/
public class SplitBrainNetwork2DynamicServersTest extends AbstractHARemoveNode {
final static int SERVERS = 2;
@Test
public void test() throws Exception {
useTransactions = true;
count = 10;
startupNodesInSequence = true;
init(SERVERS);
prepare(false);
execute();
}
@Override
protected void onAfterExecution() throws Exception {
Assert.assertEquals("europe-0", serverInstance.get(0).getServerInstance().getDistributedManager().getCoordinatorServer());
Assert.assertEquals("europe-0", serverInstance.get(1).getServerInstance().getDistributedManager().getCoordinatorServer());
banner("SIMULATE ISOLATION OF SERVER " + (SERVERS - 1) + "...");
checkInsertedEntries();
checkIndexedEntries();
serverInstance.get(1).disconnectFrom(serverInstance.get(0));
banner("SERVER " + (SERVERS - 1) + " HAS BEEN ISOLATED, WAITING FOR THE DATABASE ON SERVER " + (SERVERS - 1)
+ " TO BE OFFLINE...");
Assert.assertEquals("europe-0", serverInstance.get(0).getServerInstance().getDistributedManager().getCoordinatorServer());
Assert.assertEquals("europe-1", serverInstance.get(1).getServerInstance().getDistributedManager().getCoordinatorServer());
// CHECK THE SPLIT
waitForDatabaseStatus(0, "europe-1", getDatabaseName(), ODistributedServerManager.DB_STATUS.NOT_AVAILABLE, 30000);
assertDatabaseStatusEquals(0, "europe-1", getDatabaseName(), ODistributedServerManager.DB_STATUS.NOT_AVAILABLE);
assertDatabaseStatusEquals(0, "europe-0", getDatabaseName(), ODistributedServerManager.DB_STATUS.ONLINE);
waitForDatabaseStatus(1, "europe-0", getDatabaseName(), ODistributedServerManager.DB_STATUS.NOT_AVAILABLE, 90000);
assertDatabaseStatusEquals(1, "europe-0", getDatabaseName(), ODistributedServerManager.DB_STATUS.NOT_AVAILABLE);
assertDatabaseStatusEquals(1, "europe-1", getDatabaseName(), ODistributedServerManager.DB_STATUS.ONLINE);
banner("RUN TEST WITHOUT THE OFFLINE SERVER " + (SERVERS - 1) + "...");
checkInsertedEntries();
checkIndexedEntries();
count = 10;
// ONLY ONE SERVER SHOULD HAVE THE RECORDS
final long currentRecords = expected;
executeTestsOnServers = createServerList(0);
try {
executeMultipleTest();
} catch (AssertionError e) {
final String message = e.getMessage();
Assert.assertTrue(message,
message.contains("Server 1 count is not what was expected expected:<" + expected + "> but was:<" + (currentRecords) + ">"));
}
banner("TEST WITH THE ISOLATED NODE FINISHED, REJOIN THE SERVER " + (SERVERS - 1) + "...");
// FORCE THE REJOIN
serverInstance.get(1).rejoin(serverInstance.get(0));
count = 1000;
// CREATE NEW RECORD IN THE MEANWHILE ON SERVERS 1 AND 2
banner("RUNNING ONE WRITER ONLY ON SERVER 0");
createWriter(0, 100, getDatabaseURL(serverInstance.get(0))).call();
expected += count;
count = 10;
waitForDatabaseIsOnline(0, "europe-0", getDatabaseName(), 90000);
waitForDatabaseIsOnline(0, "europe-1", getDatabaseName(), 5000);
waitForDatabaseIsOnline(1, "europe-0", getDatabaseName(), 5000);
waitForDatabaseIsOnline(1, "europe-1", getDatabaseName(), 5000);
assertDatabaseStatusEquals(0, "europe-1", getDatabaseName(), ODistributedServerManager.DB_STATUS.ONLINE);
assertDatabaseStatusEquals(1, "europe-0", getDatabaseName(), ODistributedServerManager.DB_STATUS.ONLINE);
Assert.assertEquals("europe-0", serverInstance.get(0).getServerInstance().getDistributedManager().getCoordinatorServer());
Assert.assertEquals("europe-0", serverInstance.get(1).getServerInstance().getDistributedManager().getCoordinatorServer());
banner("NETWORK FOR THE ISOLATED NODE " + (SERVERS - 1) + " HAS BEEN RESTORED");
poolFactory.reset();
checkInsertedEntries();
checkIndexedEntries();
banner("RESTARTING TESTS WITH SERVER " + (SERVERS - 1) + " CONNECTED...");
count = 10;
executeMultipleTest();
}
protected String getDatabaseURL(final ServerRun server) {
return "plocal:" + server.getDatabasePath(getDatabaseName());
}
@Override
protected String getDistributedServerConfiguration(final ServerRun server) {
return "proxied-dyn-orientdb-dserver-config-" + server.getServerId() + ".xml";
}
@Override
public String getDatabaseName() {
return "ha-split-2-dynamic";
}
}