use of org.apache.zookeeper.server.ZooKeeperServer in project zookeeper by apache.
the class EmptiedSnapshotRecoveryTest method runTest.
public void runTest(boolean leaveEmptyFile, boolean trustEmptySnap) throws Exception {
File tmpSnapDir = ClientBase.createTmpDir();
File tmpLogDir = ClientBase.createTmpDir();
ClientBase.setupTestEnv();
ZooKeeperServer zks = new ZooKeeperServer(tmpSnapDir, tmpLogDir, 3000);
SyncRequestProcessor.setSnapCount(SNAP_COUNT);
final int PORT = Integer.parseInt(HOSTPORT.split(":")[1]);
ServerCnxnFactory f = ServerCnxnFactory.createFactory(PORT, -1);
f.startup(zks);
assertTrue(ClientBase.waitForServerUp(HOSTPORT, CONNECTION_TIMEOUT), "waiting for server being up ");
ZooKeeper zk = new ZooKeeper(HOSTPORT, CONNECTION_TIMEOUT, this);
try {
for (int i = 0; i < N_TRANSACTIONS; i++) {
zk.create("/node-" + i, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
} finally {
zk.close();
}
f.shutdown();
zks.shutdown();
assertTrue(ClientBase.waitForServerDown(HOSTPORT, CONNECTION_TIMEOUT), "waiting for server to shutdown");
// start server again with intact database
zks = new ZooKeeperServer(tmpSnapDir, tmpLogDir, 3000);
zks.startdata();
long zxid = zks.getZKDatabase().getDataTreeLastProcessedZxid();
LOG.info("After clean restart, zxid = {}", zxid);
assertTrue(zxid > 0, "zxid > 0");
zks.shutdown();
// Make all snapshots empty
FileTxnSnapLog txnLogFactory = zks.getTxnLogFactory();
List<File> snapshots = txnLogFactory.findNRecentSnapshots(10);
assertTrue(snapshots.size() > 0, "We have a snapshot to corrupt");
for (File file : snapshots) {
if (leaveEmptyFile) {
new PrintWriter(file).close();
} else {
file.delete();
}
}
if (trustEmptySnap) {
System.setProperty(FileTxnSnapLog.ZOOKEEPER_SNAPSHOT_TRUST_EMPTY, "true");
}
// start server again with corrupted database
zks = new ZooKeeperServer(tmpSnapDir, tmpLogDir, 3000);
try {
zks.startdata();
long currentZxid = zks.getZKDatabase().getDataTreeLastProcessedZxid();
if (!trustEmptySnap) {
fail("Should have gotten exception for corrupted database");
}
assertEquals(currentZxid, zxid, "zxid mismatch after restoring database");
} catch (IOException e) {
// expected behavior
if (trustEmptySnap) {
fail("Should not get exception for empty database");
}
} finally {
if (trustEmptySnap) {
System.clearProperty(FileTxnSnapLog.ZOOKEEPER_SNAPSHOT_TRUST_EMPTY);
}
}
zks.shutdown();
}
use of org.apache.zookeeper.server.ZooKeeperServer in project zookeeper by apache.
the class OOMTest method testOOM.
@Test
@Disabled
public void testOOM() throws IOException, InterruptedException, KeeperException {
File tmpDir = ClientBase.createTmpDir();
// Grab some memory so that it is easier to cause an
// OOM condition;
List<byte[]> hog = new ArrayList<>();
while (true) {
try {
hog.add(new byte[1024 * 1024 * 2]);
} catch (OutOfMemoryError e) {
hog.remove(0);
break;
}
}
ClientBase.setupTestEnv();
ZooKeeperServer zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
final int PORT = PortAssignment.unique();
ServerCnxnFactory f = ServerCnxnFactory.createFactory(PORT, -1);
f.startup(zks);
assertTrue(ClientBase.waitForServerUp("127.0.0.1:" + PORT, CONNECTION_TIMEOUT), "waiting for server up");
System.err.println("OOM Stage 0");
utestPrep(PORT);
System.out.println("Free = " + Runtime.getRuntime().freeMemory() + " total = " + Runtime.getRuntime().totalMemory() + " max = " + Runtime.getRuntime().maxMemory());
System.err.println("OOM Stage 1");
for (int i = 0; i < 1000; i++) {
System.out.println(i);
utestExists(PORT);
}
System.out.println("Free = " + Runtime.getRuntime().freeMemory() + " total = " + Runtime.getRuntime().totalMemory() + " max = " + Runtime.getRuntime().maxMemory());
System.err.println("OOM Stage 2");
for (int i = 0; i < 1000; i++) {
System.out.println(i);
utestGet(PORT);
}
System.out.println("Free = " + Runtime.getRuntime().freeMemory() + " total = " + Runtime.getRuntime().totalMemory() + " max = " + Runtime.getRuntime().maxMemory());
System.err.println("OOM Stage 3");
for (int i = 0; i < 1000; i++) {
System.out.println(i);
utestChildren(PORT);
}
System.out.println("Free = " + Runtime.getRuntime().freeMemory() + " total = " + Runtime.getRuntime().totalMemory() + " max = " + Runtime.getRuntime().maxMemory());
hog.get(0)[0] = (byte) 1;
f.shutdown();
zks.shutdown();
assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + PORT, CONNECTION_TIMEOUT), "waiting for server down");
}
use of org.apache.zookeeper.server.ZooKeeperServer in project zookeeper by apache.
the class ClientBase method shutdownServerInstance.
static void shutdownServerInstance(ServerCnxnFactory factory, String hostPort) {
if (factory != null) {
ZKDatabase zkDb = null;
{
ZooKeeperServer zs = factory.getZooKeeperServer();
if (zs != null) {
zkDb = zs.getZKDatabase();
}
}
factory.shutdown();
try {
if (zkDb != null) {
zkDb.close();
}
} catch (IOException ie) {
LOG.warn("Error closing logs ", ie);
}
final int PORT = getPort(hostPort);
assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + PORT, CONNECTION_TIMEOUT, factory.isSecure()), "waiting for server down");
}
}
use of org.apache.zookeeper.server.ZooKeeperServer in project zookeeper by apache.
the class ClientBase method startServerInstance.
/**
* Starting the given server instance
*/
public static void startServerInstance(File dataDir, ServerCnxnFactory factory, String hostPort, int serverId) throws IOException, InterruptedException {
final int port = getPort(hostPort);
LOG.info("STARTING server instance 127.0.0.1:{}", port);
ZooKeeperServer zks = new ZooKeeperServer(dataDir, dataDir, 3000);
zks.setCreateSessionTrackerServerId(serverId);
factory.startup(zks);
assertTrue(ClientBase.waitForServerUp("127.0.0.1:" + port, CONNECTION_TIMEOUT, factory.isSecure()), "waiting for server up");
}
use of org.apache.zookeeper.server.ZooKeeperServer in project zookeeper by apache.
the class ACLCountTest method testAclCount.
/**
* Create a node and add 4 ACL values to it, but there are only 2 unique ACL values,
* and each is repeated once:
*
* ACL(ZooDefs.Perms.READ,ZooDefs.Ids.ANYONE_ID_UNSAFE);
* ACL(ZooDefs.Perms.ALL,ZooDefs.Ids.AUTH_IDS);
* ACL(ZooDefs.Perms.READ,ZooDefs.Ids.ANYONE_ID_UNSAFE);
* ACL(ZooDefs.Perms.ALL,ZooDefs.Ids.AUTH_IDS);
*
* Even though we've added 4 ACL values, there should only be 2 ACLs for that node,
* since there are only 2 *unique* ACL values.
*/
@Test
public void testAclCount() throws Exception {
File tmpDir = ClientBase.createTmpDir();
ClientBase.setupTestEnv();
ZooKeeperServer zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
SyncRequestProcessor.setSnapCount(1000);
final int PORT = Integer.parseInt(HOSTPORT.split(":")[1]);
ServerCnxnFactory f = ServerCnxnFactory.createFactory(PORT, -1);
f.startup(zks);
ZooKeeper zk;
final ArrayList<ACL> CREATOR_ALL_AND_WORLD_READABLE = new ArrayList<ACL>() {
{
add(new ACL(ZooDefs.Perms.READ, ZooDefs.Ids.ANYONE_ID_UNSAFE));
add(new ACL(ZooDefs.Perms.ALL, ZooDefs.Ids.AUTH_IDS));
add(new ACL(ZooDefs.Perms.READ, ZooDefs.Ids.ANYONE_ID_UNSAFE));
add(new ACL(ZooDefs.Perms.ALL, ZooDefs.Ids.AUTH_IDS));
}
};
try {
LOG.info("starting up the zookeeper server .. waiting");
assertTrue(ClientBase.waitForServerUp(HOSTPORT, CONNECTION_TIMEOUT), "waiting for server being up");
zk = ClientBase.createZKClient(HOSTPORT);
zk.addAuthInfo("digest", "pat:test".getBytes());
zk.setACL("/", Ids.CREATOR_ALL_ACL, -1);
String path = "/path";
try {
assertEquals(4, CREATOR_ALL_AND_WORLD_READABLE.size());
} catch (Exception e) {
LOG.error("Something is fundamentally wrong with ArrayList's add() method. add()ing four times to an empty ArrayList should result in an ArrayList with 4 members.");
throw e;
}
zk.create(path, path.getBytes(), CREATOR_ALL_AND_WORLD_READABLE, CreateMode.PERSISTENT);
List<ACL> acls = zk.getACL("/path", new Stat());
assertEquals(2, acls.size());
} catch (Exception e) {
// test failed somehow.
assertTrue(false);
}
f.shutdown();
zks.shutdown();
}
Aggregations