Search in sources :

Example 1 with ZooLock

use of org.apache.accumulo.server.zookeeper.ZooLock in project accumulo by apache.

the class ZombieTServer method main.

public static void main(String[] args) throws Exception {
    Random random = new Random(System.currentTimeMillis() % 1000);
    int port = random.nextInt(30000) + 2000;
    Instance instance = HdfsZooInstance.getInstance();
    AccumuloServerContext context = new AccumuloServerContext(instance, new ServerConfigurationFactory(instance));
    TransactionWatcher watcher = new TransactionWatcher();
    final ThriftClientHandler tch = new ThriftClientHandler(context, watcher);
    Processor<Iface> processor = new Processor<>(tch);
    ServerAddress serverPort = TServerUtils.startTServer(context.getConfiguration(), ThriftServerType.CUSTOM_HS_HA, processor, "ZombieTServer", "walking dead", 2, 1, 1000, 10 * 1024 * 1024, null, null, -1, HostAndPort.fromParts("0.0.0.0", port));
    String addressString = serverPort.address.toString();
    String zPath = ZooUtil.getRoot(context.getInstance()) + Constants.ZTSERVERS + "/" + addressString;
    ZooReaderWriter zoo = ZooReaderWriter.getInstance();
    zoo.putPersistentData(zPath, new byte[] {}, NodeExistsPolicy.SKIP);
    ZooLock zlock = new ZooLock(zPath);
    LockWatcher lw = new LockWatcher() {

        @Override
        public void lostLock(final LockLossReason reason) {
            try {
                tch.halt(Tracer.traceInfo(), null, null);
            } catch (Exception ex) {
                log.error("Exception", ex);
                System.exit(1);
            }
        }

        @Override
        public void unableToMonitorLockNode(Throwable e) {
            try {
                tch.halt(Tracer.traceInfo(), null, null);
            } catch (Exception ex) {
                log.error("Exception", ex);
                System.exit(1);
            }
        }
    };
    byte[] lockContent = new ServerServices(addressString, Service.TSERV_CLIENT).toString().getBytes(UTF_8);
    if (zlock.tryLock(lw, lockContent)) {
        log.debug("Obtained tablet server lock {}", zlock.getLockPath());
    }
    // modify metadata
    synchronized (tch) {
        while (!tch.halted) {
            tch.wait();
        }
    }
    System.exit(0);
}
Also used : AccumuloServerContext(org.apache.accumulo.server.AccumuloServerContext) Processor(org.apache.accumulo.core.tabletserver.thrift.TabletClientService.Processor) ServerServices(org.apache.accumulo.core.util.ServerServices) Instance(org.apache.accumulo.core.client.Instance) HdfsZooInstance(org.apache.accumulo.server.client.HdfsZooInstance) ServerAddress(org.apache.accumulo.server.rpc.ServerAddress) ZooReaderWriter(org.apache.accumulo.server.zookeeper.ZooReaderWriter) ServerConfigurationFactory(org.apache.accumulo.server.conf.ServerConfigurationFactory) TException(org.apache.thrift.TException) ThriftSecurityException(org.apache.accumulo.core.client.impl.thrift.ThriftSecurityException) Iface(org.apache.accumulo.core.tabletserver.thrift.TabletClientService.Iface) TransactionWatcher(org.apache.accumulo.server.zookeeper.TransactionWatcher) Random(java.util.Random) LockWatcher(org.apache.accumulo.fate.zookeeper.ZooLock.LockWatcher) LockLossReason(org.apache.accumulo.fate.zookeeper.ZooLock.LockLossReason) ZooLock(org.apache.accumulo.server.zookeeper.ZooLock)

Example 2 with ZooLock

use of org.apache.accumulo.server.zookeeper.ZooLock in project accumulo by apache.

the class SplitRecoveryIT method run.

private void run() throws Exception {
    Instance inst = HdfsZooInstance.getInstance();
    AccumuloServerContext c = new AccumuloServerContext(inst, new ServerConfigurationFactory(inst));
    String zPath = ZooUtil.getRoot(inst) + "/testLock";
    IZooReaderWriter zoo = ZooReaderWriter.getInstance();
    zoo.putPersistentData(zPath, new byte[0], NodeExistsPolicy.OVERWRITE);
    ZooLock zl = new ZooLock(zPath);
    boolean gotLock = zl.tryLock(new LockWatcher() {

        @Override
        public void lostLock(LockLossReason reason) {
            System.exit(-1);
        }

        @Override
        public void unableToMonitorLockNode(Throwable e) {
            System.exit(-1);
        }
    }, "foo".getBytes(UTF_8));
    if (!gotLock) {
        System.err.println("Failed to get lock " + zPath);
    }
    // run test for a table with one tablet
    runSplitRecoveryTest(c, 0, "sp", 0, zl, nke("foo0", null, null));
    runSplitRecoveryTest(c, 1, "sp", 0, zl, nke("foo1", null, null));
    // run test for tables with two tablets, run test on first and last tablet
    runSplitRecoveryTest(c, 0, "k", 0, zl, nke("foo2", "m", null), nke("foo2", null, "m"));
    runSplitRecoveryTest(c, 1, "k", 0, zl, nke("foo3", "m", null), nke("foo3", null, "m"));
    runSplitRecoveryTest(c, 0, "o", 1, zl, nke("foo4", "m", null), nke("foo4", null, "m"));
    runSplitRecoveryTest(c, 1, "o", 1, zl, nke("foo5", "m", null), nke("foo5", null, "m"));
    // run test for table w/ three tablets, run test on middle tablet
    runSplitRecoveryTest(c, 0, "o", 1, zl, nke("foo6", "m", null), nke("foo6", "r", "m"), nke("foo6", null, "r"));
    runSplitRecoveryTest(c, 1, "o", 1, zl, nke("foo7", "m", null), nke("foo7", "r", "m"), nke("foo7", null, "r"));
    // run test for table w/ three tablets, run test on first
    runSplitRecoveryTest(c, 0, "g", 0, zl, nke("foo8", "m", null), nke("foo8", "r", "m"), nke("foo8", null, "r"));
    runSplitRecoveryTest(c, 1, "g", 0, zl, nke("foo9", "m", null), nke("foo9", "r", "m"), nke("foo9", null, "r"));
    // run test for table w/ three tablets, run test on last tablet
    runSplitRecoveryTest(c, 0, "w", 2, zl, nke("fooa", "m", null), nke("fooa", "r", "m"), nke("fooa", null, "r"));
    runSplitRecoveryTest(c, 1, "w", 2, zl, nke("foob", "m", null), nke("foob", "r", "m"), nke("foob", null, "r"));
}
Also used : AccumuloServerContext(org.apache.accumulo.server.AccumuloServerContext) Instance(org.apache.accumulo.core.client.Instance) TServerInstance(org.apache.accumulo.server.master.state.TServerInstance) HdfsZooInstance(org.apache.accumulo.server.client.HdfsZooInstance) IZooReaderWriter(org.apache.accumulo.fate.zookeeper.IZooReaderWriter) LockWatcher(org.apache.accumulo.fate.zookeeper.ZooLock.LockWatcher) ServerConfigurationFactory(org.apache.accumulo.server.conf.ServerConfigurationFactory) LockLossReason(org.apache.accumulo.fate.zookeeper.ZooLock.LockLossReason) ZooLock(org.apache.accumulo.server.zookeeper.ZooLock)

Example 3 with ZooLock

use of org.apache.accumulo.server.zookeeper.ZooLock in project accumulo by apache.

the class Master method getMasterLock.

private void getMasterLock(final String zMasterLoc) throws KeeperException, InterruptedException {
    log.info("trying to get master lock");
    final String masterClientAddress = hostname + ":" + getConfiguration().getPort(Property.MASTER_CLIENTPORT)[0];
    while (true) {
        MasterLockWatcher masterLockWatcher = new MasterLockWatcher();
        masterLock = new ZooLock(zMasterLoc);
        masterLock.lockAsync(masterLockWatcher, masterClientAddress.getBytes());
        masterLockWatcher.waitForChange();
        if (masterLockWatcher.acquiredLock) {
            break;
        }
        if (!masterLockWatcher.failedToAcquireLock) {
            throw new IllegalStateException("master lock in unknown state");
        }
        masterLock.tryToCancelAsyncLockOrUnlock();
        sleepUninterruptibly(TIME_TO_WAIT_BETWEEN_LOCK_CHECKS, TimeUnit.MILLISECONDS);
    }
    setMasterState(MasterState.HAVE_LOCK);
}
Also used : ZooLock(org.apache.accumulo.server.zookeeper.ZooLock)

Example 4 with ZooLock

use of org.apache.accumulo.server.zookeeper.ZooLock in project accumulo by apache.

the class SimpleGarbageCollector method getZooLock.

private void getZooLock(HostAndPort addr) throws KeeperException, InterruptedException {
    String path = ZooUtil.getRoot(getInstance()) + Constants.ZGC_LOCK;
    LockWatcher lockWatcher = new LockWatcher() {

        @Override
        public void lostLock(LockLossReason reason) {
            Halt.halt("GC lock in zookeeper lost (reason = " + reason + "), exiting!", 1);
        }

        @Override
        public void unableToMonitorLockNode(final Throwable e) {
            // ACCUMULO-3651 Level changed to error and FATAL added to message for slf4j compatibility
            Halt.halt(-1, new Runnable() {

                @Override
                public void run() {
                    log.error("FATAL: No longer able to monitor lock node ", e);
                }
            });
        }
    };
    while (true) {
        lock = new ZooLock(path);
        if (lock.tryLock(lockWatcher, new ServerServices(addr.toString(), Service.GC_CLIENT).toString().getBytes())) {
            log.debug("Got GC ZooKeeper lock");
            return;
        }
        log.debug("Failed to get GC ZooKeeper lock, will retry");
        sleepUninterruptibly(1, TimeUnit.SECONDS);
    }
}
Also used : ServerServices(org.apache.accumulo.core.util.ServerServices) LockWatcher(org.apache.accumulo.fate.zookeeper.ZooLock.LockWatcher) LockLossReason(org.apache.accumulo.fate.zookeeper.ZooLock.LockLossReason) ZooLock(org.apache.accumulo.server.zookeeper.ZooLock)

Example 5 with ZooLock

use of org.apache.accumulo.server.zookeeper.ZooLock in project accumulo by apache.

the class Monitor method getMonitorLock.

/**
 * Get the monitor lock in ZooKeeper
 */
private void getMonitorLock() throws KeeperException, InterruptedException {
    final String zRoot = ZooUtil.getRoot(instance);
    final String monitorPath = zRoot + Constants.ZMONITOR;
    final String monitorLockPath = zRoot + Constants.ZMONITOR_LOCK;
    // Ensure that everything is kosher with ZK as this has changed.
    ZooReaderWriter zoo = ZooReaderWriter.getInstance();
    if (zoo.exists(monitorPath)) {
        byte[] data = zoo.getData(monitorPath, null);
        // If the node isn't empty, it's from a previous install (has hostname:port for HTTP server)
        if (0 != data.length) {
            // Recursively delete from that parent node
            zoo.recursiveDelete(monitorPath, NodeMissingPolicy.SKIP);
            // And then make the nodes that we expect for the incoming ephemeral nodes
            zoo.putPersistentData(monitorPath, new byte[0], NodeExistsPolicy.FAIL);
            zoo.putPersistentData(monitorLockPath, new byte[0], NodeExistsPolicy.FAIL);
        } else if (!zoo.exists(monitorLockPath)) {
            // monitor node in ZK exists and is empty as we expect
            // but the monitor/lock node does not
            zoo.putPersistentData(monitorLockPath, new byte[0], NodeExistsPolicy.FAIL);
        }
    } else {
        // 1.5.0 and earlier
        zoo.putPersistentData(zRoot + Constants.ZMONITOR, new byte[0], NodeExistsPolicy.FAIL);
        if (!zoo.exists(monitorLockPath)) {
            // Somehow the monitor node exists but not monitor/lock
            zoo.putPersistentData(monitorLockPath, new byte[0], NodeExistsPolicy.FAIL);
        }
    }
    // Get a ZooLock for the monitor
    while (true) {
        MoniterLockWatcher monitorLockWatcher = new MoniterLockWatcher();
        monitorLock = new ZooLock(monitorLockPath);
        monitorLock.lockAsync(monitorLockWatcher, new byte[0]);
        monitorLockWatcher.waitForChange();
        if (monitorLockWatcher.acquiredLock) {
            break;
        }
        if (!monitorLockWatcher.failedToAcquireLock) {
            throw new IllegalStateException("monitor lock in unknown state");
        }
        monitorLock.tryToCancelAsyncLockOrUnlock();
        sleepUninterruptibly(getContext().getConfiguration().getTimeInMillis(Property.MONITOR_LOCK_CHECK_INTERVAL), TimeUnit.MILLISECONDS);
    }
    log.info("Got Monitor lock.");
}
Also used : ZooReaderWriter(org.apache.accumulo.server.zookeeper.ZooReaderWriter) ZooLock(org.apache.accumulo.server.zookeeper.ZooLock)

Aggregations

ZooLock (org.apache.accumulo.server.zookeeper.ZooLock)6 LockLossReason (org.apache.accumulo.fate.zookeeper.ZooLock.LockLossReason)4 LockWatcher (org.apache.accumulo.fate.zookeeper.ZooLock.LockWatcher)4 ServerServices (org.apache.accumulo.core.util.ServerServices)3 Instance (org.apache.accumulo.core.client.Instance)2 ThriftSecurityException (org.apache.accumulo.core.client.impl.thrift.ThriftSecurityException)2 IZooReaderWriter (org.apache.accumulo.fate.zookeeper.IZooReaderWriter)2 AccumuloServerContext (org.apache.accumulo.server.AccumuloServerContext)2 HdfsZooInstance (org.apache.accumulo.server.client.HdfsZooInstance)2 ServerConfigurationFactory (org.apache.accumulo.server.conf.ServerConfigurationFactory)2 ZooReaderWriter (org.apache.accumulo.server.zookeeper.ZooReaderWriter)2 TException (org.apache.thrift.TException)2 IOException (java.io.IOException)1 UnknownHostException (java.net.UnknownHostException)1 Random (java.util.Random)1 CancellationException (java.util.concurrent.CancellationException)1 ExecutionException (java.util.concurrent.ExecutionException)1 TimeoutException (java.util.concurrent.TimeoutException)1 AccumuloException (org.apache.accumulo.core.client.AccumuloException)1 AccumuloSecurityException (org.apache.accumulo.core.client.AccumuloSecurityException)1