Example usage for org.apache.zookeeper Watcher Watcher

List of usage examples for org.apache.zookeeper Watcher Watcher

Introduction

In this page you can find the example usage for org.apache.zookeeper Watcher Watcher.

Prototype

Watcher

Source Link

Usage

From source file:com.twitter.common.zookeeper.ZooKeeperMap.java

License:Apache License

private synchronized void watchChildren()
        throws InterruptedException, KeeperException, ZooKeeperConnectionException {

    /*//from   www  .  j  av  a2s  .c  o  m
     * Add a watch on the parent node itself, and attempt to rewatch if it
     * gets deleted
     */
    zkClient.get().exists(nodePath, new Watcher() {
        @Override
        public void process(WatchedEvent event) {
            if (event.getType() == Watcher.Event.EventType.NodeDeleted) {
                // If the parent node no longer exists
                localMap.clear();
                try {
                    tryWatchChildren();
                } catch (InterruptedException e) {
                    LOG.log(Level.WARNING, "Interrupted while trying to watch children.", e);
                    Thread.currentThread().interrupt();
                }
            }
        }
    });

    final Watcher childWatcher = new Watcher() {
        @Override
        public void process(WatchedEvent event) {
            if (event.getType() == Watcher.Event.EventType.NodeChildrenChanged) {
                try {
                    tryWatchChildren();
                } catch (InterruptedException e) {
                    LOG.log(Level.WARNING, "Interrupted while trying to watch children.", e);
                    Thread.currentThread().interrupt();
                }
            }
        }
    };

    List<String> children = zkClient.get().getChildren(nodePath, childWatcher);
    updateChildren(Sets.newHashSet(children));
}

From source file:com.twitter.common.zookeeper.ZooKeeperMap.java

License:Apache License

private void addChild(final String child)
        throws InterruptedException, KeeperException, ZooKeeperConnectionException {

    final Watcher nodeWatcher = new Watcher() {
        @Override//from w  w w  . j a v  a 2s  . co  m
        public void process(WatchedEvent event) {
            if (event.getType() == Watcher.Event.EventType.NodeDataChanged) {
                try {
                    tryAddChild(child);
                } catch (InterruptedException e) {
                    LOG.log(Level.WARNING, "Interrupted while trying to add a child.", e);
                    Thread.currentThread().interrupt();
                }
            } else if (event.getType() == Watcher.Event.EventType.NodeDeleted) {
                removeEntry(child);
            }
        }
    };

    try {
        V value = deserializer.apply(zkClient.get().getData(makePath(child), nodeWatcher, null));
        putEntry(child, value);
    } catch (KeeperException.NoNodeException e) {
        // This node doesn't exist anymore, remove it from the map and we're done.
        removeEntry(child);
    }
}

From source file:com.twitter.distributedlog.BKLogHandler.java

License:Apache License

Watcher registerExpirationHandler(final ZooKeeperClient.ZooKeeperSessionExpireNotifier onExpired) {
    if (conf.getZKNumRetries() > 0) {
        return new Watcher() {
            @Override//from w  ww .j a  v  a2 s  .co m
            public void process(WatchedEvent event) {
                // nop
            }
        };
    }
    return zooKeeperClient.registerExpirationHandler(onExpired);
}

From source file:com.twitter.distributedlog.LocalDLMEmulator.java

License:Apache License

public static ZooKeeper connectZooKeeper(String zkHost, int zkPort, int zkTimeoutSec)
        throws IOException, KeeperException, InterruptedException {
    final CountDownLatch latch = new CountDownLatch(1);
    final String zkHostPort = zkHost + ":" + zkPort;

    ZooKeeper zkc = new ZooKeeper(zkHostPort, zkTimeoutSec * 1000, new Watcher() {
        public void process(WatchedEvent event) {
            if (event.getState() == Event.KeeperState.SyncConnected) {
                latch.countDown();/*  www. j  a  va 2 s . c o  m*/
            }
        }
    });
    if (!latch.await(zkTimeoutSec, TimeUnit.SECONDS)) {
        throw new IOException("Zookeeper took too long to connect");
    }
    return zkc;
}

From source file:com.twitter.distributedlog.TestZooKeeperClient.java

License:Apache License

private void expireZooKeeperSession(ZooKeeper zk, int timeout)
        throws IOException, InterruptedException, KeeperException {
    final CountDownLatch latch = new CountDownLatch(1);

    ZooKeeper newZk = new ZooKeeper(zkServers, timeout, new Watcher() {
        @Override/* w w  w  . j a va2s.c  o m*/
        public void process(WatchedEvent event) {
            if (event.getType() == EventType.None && event.getState() == KeeperState.SyncConnected) {
                latch.countDown();
            }
        }
    }, zk.getSessionId(), zk.getSessionPasswd());

    if (!latch.await(timeout, TimeUnit.MILLISECONDS)) {
        throw KeeperException.create(KeeperException.Code.CONNECTIONLOSS);
    }

    newZk.close();
}

From source file:com.twitter.distributedlog.TestZooKeeperClient.java

License:Apache License

private CountDownLatch awaitConnectionEvent(final KeeperState state, final ZooKeeperClient zkc) {
    final CountDownLatch connected = new CountDownLatch(1);
    Watcher watcher = new Watcher() {
        @Override//w  w w .ja v a 2s. c  o m
        public void process(WatchedEvent event) {
            if (event.getType() == EventType.None && event.getState() == state) {
                connected.countDown();
            }
        }
    };
    zkc.register(watcher);
    return connected;
}

From source file:com.twitter.distributedlog.TestZooKeeperClient.java

License:Apache License

@Test(timeout = 60000)
public void testExceptionOnWatchers() throws Exception {
    TestWatcher w1 = new TestWatcher();
    TestWatcher w2 = new TestWatcher();

    final CountDownLatch latch = new CountDownLatch(2);
    w1.setLatch(latch);// w  w  w. j  a va2s .  co m
    w2.setLatch(latch);

    zkc.register(w1);
    zkc.register(w2);
    // register bad watcher
    zkc.register(new Watcher() {
        @Override
        public void process(WatchedEvent event) {
            throw new NullPointerException("bad watcher returning null");
        }
    });

    assertEquals(3, zkc.watchers.size());

    final String zkPath = "/test-exception-on-watchers";

    zkc.get().create(zkPath, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    zkc.get().getData(zkPath, true, new Stat());

    zkc.get().setData(zkPath, "first-set".getBytes(), -1);
    latch.await();
    assertEquals(1, w1.receivedEvents.size());
    assertEquals(zkPath, w1.receivedEvents.get(0).getPath());
    assertEquals(Watcher.Event.EventType.NodeDataChanged, w1.receivedEvents.get(0).getType());
    assertEquals(1, w2.receivedEvents.size());
    assertEquals(zkPath, w2.receivedEvents.get(0).getPath());
    assertEquals(Watcher.Event.EventType.NodeDataChanged, w2.receivedEvents.get(0).getType());
}

From source file:com.twitter.distributedlog.zk.TestZKWatcherManager.java

License:Apache License

@Test(timeout = 60000)
public void testRegisterUnregisterWatcher() throws Exception {
    ZKWatcherManager watcherManager = ZKWatcherManager.newBuilder().name("test-register-unregister-watcher")
            .statsLogger(NullStatsLogger.INSTANCE).build();
    String path = "/test-register-unregister-watcher";
    final List<WatchedEvent> events = new LinkedList<WatchedEvent>();
    final CountDownLatch latch = new CountDownLatch(2);
    Watcher watcher = new Watcher() {
        @Override//from   w w  w.j a  va 2  s .  c o  m
        public void process(WatchedEvent event) {
            events.add(event);
            latch.countDown();
        }
    };
    watcherManager.registerChildWatcher(path, watcher);

    // fire the event
    WatchedEvent event0 = new WatchedEvent(Watcher.Event.EventType.NodeCreated,
            Watcher.Event.KeeperState.SyncConnected, path);
    WatchedEvent event1 = new WatchedEvent(Watcher.Event.EventType.None,
            Watcher.Event.KeeperState.SyncConnected, path);
    WatchedEvent event2 = new WatchedEvent(Watcher.Event.EventType.NodeChildrenChanged,
            Watcher.Event.KeeperState.SyncConnected, path);
    watcher.process(event1);
    watcher.process(event2);

    latch.await();

    assertEquals(2, events.size());
    assertEquals(event1, events.get(0));
    assertEquals(event2, events.get(1));

    // unregister watcher
    watcherManager.unregisterChildWatcher(path, watcher);

    assertEquals(0, watcherManager.childWatches.size());
}

From source file:com.twitter.distributedlog.ZooKeeperClient.java

License:Apache License

private ZooKeeper buildZooKeeper() throws ZooKeeperConnectionException, InterruptedException {
    Watcher watcher = new Watcher() {
        @Override/*from  w  ww.  j  av  a2  s. co  m*/
        public void process(WatchedEvent event) {
            switch (event.getType()) {
            case None:
                switch (event.getState()) {
                case Expired:
                    if (null == retryPolicy) {
                        LOG.info("ZooKeeper {}' session expired. Event: {}", name, event);
                        closeInternal();
                    }
                    authenticated = false;
                    break;
                case Disconnected:
                    if (null == retryPolicy) {
                        LOG.info("ZooKeeper {} is disconnected from zookeeper now,"
                                + " but it is OK unless we received EXPIRED event.", name);
                    }
                    // Mark as not authenticated if expired or disconnected. In both cases
                    // we lose any attached auth info. Relying on Expired/Disconnected is
                    // sufficient since all Expired/Disconnected events are processed before
                    // all SyncConnected events, and the underlying member is not updated until
                    // SyncConnected is received.
                    authenticated = false;
                    break;
                default:
                    break;
                }
            }

            try {
                for (Watcher watcher : watchers) {
                    try {
                        watcher.process(event);
                    } catch (Throwable t) {
                        LOG.warn("Encountered unexpected exception from watcher {} : ", watcher, t);
                    }
                }
            } catch (Throwable t) {
                LOG.warn("Encountered unexpected exception when firing watched event {} : ", event, t);
            }
        }
    };

    Set<Watcher> watchers = new HashSet<Watcher>();
    watchers.add(watcher);

    ZooKeeper zk;
    try {
        RetryPolicy opRetryPolicy = null == retryPolicy
                ? new BoundExponentialBackoffRetryPolicy(sessionTimeoutMs, sessionTimeoutMs, 0)
                : retryPolicy;
        RetryPolicy connectRetryPolicy = null == retryPolicy
                ? new BoundExponentialBackoffRetryPolicy(sessionTimeoutMs, sessionTimeoutMs, 0)
                : new BoundExponentialBackoffRetryPolicy(sessionTimeoutMs, sessionTimeoutMs, Integer.MAX_VALUE);
        zk = org.apache.bookkeeper.zookeeper.ZooKeeperClient.newBuilder().connectString(zooKeeperServers)
                .sessionTimeoutMs(sessionTimeoutMs).watchers(watchers).operationRetryPolicy(opRetryPolicy)
                .connectRetryPolicy(connectRetryPolicy).statsLogger(statsLogger)
                .retryThreadCount(retryThreadCount).requestRateLimit(requestRateLimit).build();
    } catch (KeeperException e) {
        throw new ZooKeeperConnectionException("Problem connecting to servers: " + zooKeeperServers, e);
    } catch (IOException e) {
        throw new ZooKeeperConnectionException("Problem connecting to servers: " + zooKeeperServers, e);
    }
    return zk;
}

From source file:com.twitter.distributedlog.ZooKeeperClient.java

License:Apache License

/**
 * Clients that need to re-establish state after session expiration can register an
 * {@code onExpired} command to execute.
 *
 * @param onExpired the {@code Command} to register
 * @return the new {@link Watcher} which can later be passed to {@link #unregister} for
 *         removal./*from  w  w  w. j  av a  2 s. co m*/
 */
public Watcher registerExpirationHandler(final ZooKeeperSessionExpireNotifier onExpired) {
    Watcher watcher = new Watcher() {
        @Override
        public void process(WatchedEvent event) {
            if (event.getType() == EventType.None && event.getState() == KeeperState.Expired) {
                try {
                    onExpired.notifySessionExpired();
                } catch (Exception exc) {
                    // do nothing
                }
            }
        }
    };
    register(watcher);
    return watcher;
}