public UsageListing(Exhibitor exhibitor, String startPath, int maxChildren) { if ( startPath.trim().length() == 0 ) { startPath = "/"; } ZKPaths.PathAndNode pathAndNode = ZKPaths.getPathAndNode(startPath); this.exhibitor = exhibitor; this.startPath = ZKPaths.makePath(pathAndNode.getPath(), pathAndNode.getNode()); this.maxChildren = maxChildren; }
public void update(final String path, final byte[] bytes) { synchronized (toAnnounce) { if (!started) { // removeParentsIfCreated is not relevant for updates; use dummy value "false". toUpdate.add(new Announceable(path, bytes, false)); return; } } final ZKPaths.PathAndNode pathAndNode = ZKPaths.getPathAndNode(path); final String parentPath = pathAndNode.getPath(); final String nodePath = pathAndNode.getNode(); ConcurrentMap<String, byte[]> subPaths = announcements.get(parentPath); if (subPaths == null || subPaths.get(nodePath) == null) { throw new ISE("Cannot update a path[%s] that hasn't been announced!", path); } synchronized (toAnnounce) { try { byte[] oldBytes = subPaths.get(nodePath); if (!Arrays.equals(oldBytes, bytes)) { subPaths.put(nodePath, bytes); updateAnnouncement(path, bytes); } } catch (Exception e) { throw Throwables.propagate(e); } } }
if ( children.size() == 0 ) thisPath = ZKPaths.getPathAndNode(thisPath).getPath(); // assume a child node was passed - use its parent if ( thisPath.equals("/") )
@Override public boolean update(final byte[] bytes) { final String parent = ZKPaths.getPathAndNode(path).getPath(); try { if (zooKeeperClient.stat(parent) == null) { return false; } if (zooKeeperClient.stat(path) == null) { zooKeeperClient.createAndSetData(path, bytes); } else { zooKeeperClient.setData(path, bytes); } return true; } catch (KeeperException.NodeExistsException ignore) { // Conflict due to curator retry or losing a race. We're done here. return true; } catch (KeeperException.ConnectionLossException e) { log.warn("ZooKeeper connection lost while updating node: {}", path); return false; } catch (KeeperException e) { log.error("failed to update node: {}", path, e); return false; } } }
final ZKPaths.PathAndNode pathAndNode = ZKPaths.getPathAndNode(path);
case CHILD_REMOVED: final ChildData child = event.getData(); final ZKPaths.PathAndNode childPath = ZKPaths.getPathAndNode(child.getPath()); final byte[] value = finalSubPaths.get(childPath.getNode()); if (value != null) { for (String path : thePathsLost) { log.info("Reinstating [%s]", path); final ZKPaths.PathAndNode split = ZKPaths.getPathAndNode(path); createAnnouncement(path, announcements.get(split.getPath()).get(split.getNode()));
/** * Unannounces an announcement created at path. Note that if all announcements get removed, the Announcer * will continue to have ZK watches on paths because clearing them out is a source of ugly race conditions. * <p/> * If you need to completely clear all the state of what is being watched and announced, stop() the Announcer. * * @param path the path to unannounce */ public void unannounce(String path) { log.info("unannouncing [%s]", path); final ZKPaths.PathAndNode pathAndNode = ZKPaths.getPathAndNode(path); final String parentPath = pathAndNode.getPath(); final ConcurrentMap<String, byte[]> subPaths = announcements.get(parentPath); if (subPaths == null || subPaths.remove(pathAndNode.getNode()) == null) { log.error("Path[%s] not announced, cannot unannounce.", path); return; } try { curator.inTransaction().delete().forPath(path).and().commit(); } catch (KeeperException.NoNodeException e) { log.info("node[%s] didn't exist anyway...", path); } catch (Exception e) { throw Throwables.propagate(e); } }
@Test public void testCleansUpItsLittleTurdlings() throws Exception { curator.start(); curator.blockUntilConnected(); Announcer announcer = new Announcer(curator, exec); final byte[] billy = StringUtils.toUtf8("billy"); final String testPath = "/somewhere/test2"; final String parent = ZKPaths.getPathAndNode(testPath).getPath(); announcer.start(); try { Assert.assertNull(curator.checkExists().forPath(parent)); awaitAnnounce(announcer, testPath, billy, true); Assert.assertNotNull(curator.checkExists().forPath(parent)); } finally { announcer.stop(); } Assert.assertNull(curator.checkExists().forPath(parent)); }
@Test public void testLeavesBehindTurdlingsWhenToldTo() throws Exception { curator.start(); curator.blockUntilConnected(); Announcer announcer = new Announcer(curator, exec); final byte[] billy = StringUtils.toUtf8("billy"); final String testPath = "/somewhere/test2"; final String parent = ZKPaths.getPathAndNode(testPath).getPath(); announcer.start(); try { Assert.assertNull(curator.checkExists().forPath(parent)); awaitAnnounce(announcer, testPath, billy, false); Assert.assertNotNull(curator.checkExists().forPath(parent)); } finally { announcer.stop(); } Assert.assertNotNull(curator.checkExists().forPath(parent)); }
@Test public void testLeavesBehindTurdlingsThatAlreadyExisted() throws Exception { curator.start(); curator.blockUntilConnected(); Announcer announcer = new Announcer(curator, exec); final byte[] billy = StringUtils.toUtf8("billy"); final String testPath = "/somewhere/test2"; final String parent = ZKPaths.getPathAndNode(testPath).getPath(); curator.create().forPath(parent); final Stat initialStat = curator.checkExists().forPath(parent); announcer.start(); try { Assert.assertEquals(initialStat.getMzxid(), curator.checkExists().forPath(parent).getMzxid()); awaitAnnounce(announcer, testPath, billy, true); Assert.assertEquals(initialStat.getMzxid(), curator.checkExists().forPath(parent).getMzxid()); } finally { announcer.stop(); } Assert.assertEquals(initialStat.getMzxid(), curator.checkExists().forPath(parent).getMzxid()); }
@VisibleForTesting String adjustPath(String path) throws Exception { if ( doProtected ) { ZKPaths.PathAndNode pathAndNode = ZKPaths.getPathAndNode(path); String name = getProtectedPrefix(protectedId) + pathAndNode.getNode(); path = ZKPaths.makePath(pathAndNode.getPath(), name); } return path; }
private String protectedPathInForeground(String adjustedPath, byte[] data, List<ACL> aclList) throws Exception { try { return pathInForeground(adjustedPath, data, aclList); } catch ( Exception e) { ThreadUtils.checkInterrupted(e); if ( ( e instanceof KeeperException.ConnectionLossException || !( e instanceof KeeperException )) && protectedId != null ) { /* * CURATOR-45 + CURATOR-79: we don't know if the create operation was successful or not, * register the znode to be sure it is deleted later. */ new FindAndDeleteProtectedNodeInBackground(client, ZKPaths.getPathAndNode(adjustedPath).getPath(), protectedId).execute(); /* * The current UUID is scheduled to be deleted, it is not safe to use it again. * If this builder is used again later create a new UUID */ protectedId = UUID.randomUUID().toString(); } throw e; } }
final String parent = ZKPaths.getPathAndNode(path).getPath(); if ( !parent.equals(ZKPaths.PATH_SEPARATOR) )
public static Type infoTypefromZKPath(String path) { if (ZKPaths.getPathAndNode(path).getPath().equals(ZK_CORES_URI)) { return Type.URI; } else { return Type.PLAIN; } }
public static String getRunIdFromRunPath(String path) { return ZKPaths.getPathAndNode(path).getNode(); }
@VisibleForTesting String adjustPath(String path) throws Exception { if ( doProtected ) { ZKPaths.PathAndNode pathAndNode = ZKPaths.getPathAndNode(path); String name = getProtectedPrefix(protectedId) + pathAndNode.getNode(); path = ZKPaths.makePath(pathAndNode.getPath(), name); } return path; }
/** * NOTE: this is a BLOCKING method. Rebuild the internal cache for the given node by querying * for all needed data WITHOUT generating any events to send to listeners. * * @param fullPath full path of the node to rebuild * @throws Exception errors */ public void rebuildNode(String fullPath) throws Exception { Preconditions.checkArgument(ZKPaths.getPathAndNode(fullPath).getPath().startsWith(path), "Node is not part of this cache: " + fullPath); Preconditions.checkState(!executorService.isShutdown(), "cache has been closed"); ensurePath.ensure(client.getZookeeperClient()); internalRebuildNode(fullPath); // this is necessary so that any updates that occurred while rebuilding are taken // have to rebuild entire tree in case this node got deleted in the interim offerOperation(new TreeRefreshOperation(this, path, RefreshMode.FORCE_GET_DATA_AND_STAT)); }
/** * NOTE: this is a BLOCKING method. Rebuild the internal cache for the given node by querying * for all needed data WITHOUT generating any events to send to listeners. * * @param fullPath full path of the node to rebuild * @throws Exception errors */ public void rebuildNode(String fullPath) throws Exception { Preconditions.checkArgument(ZKPaths.getPathAndNode(fullPath).getPath().startsWith(path), "Node is not part of this cache: " + fullPath); Preconditions.checkState(!executorService.isShutdown(), "cache has been closed"); ensurePath.ensure(client.getZookeeperClient()); internalRebuildNode(fullPath); // this is necessary so that any updates that occurred while rebuilding are taken // have to rebuild entire tree in case this node got deleted in the interim offerOperation(new TreeRefreshOperation(this, path, RefreshMode.FORCE_GET_DATA_AND_STAT)); }
/** * NOTE: this is a BLOCKING method. Rebuild the internal cache for the given node by querying * for all needed data WITHOUT generating any events to send to listeners. * * @param fullPath full path of the node to rebuild * @throws Exception errors */ public void rebuildNode(String fullPath) throws Exception { Preconditions.checkArgument(ZKPaths.getPathAndNode(fullPath).getPath().equals(path), "Node is not part of this cache: " + fullPath); Preconditions.checkState(!executorService.isShutdown(), "cache has been closed"); ensurePath(); internalRebuildNode(fullPath); // this is necessary so that any updates that occurred while rebuilding are taken // have to rebuild entire tree in case this node got deleted in the interim offerOperation(new RefreshOperation(this, RefreshMode.FORCE_GET_DATA_AND_STAT)); }
@Override public boolean update(final byte[] bytes) { final String parent = ZKPaths.getPathAndNode(path).getPath(); try { if (zooKeeperClient.stat(parent) == null) { return false; } if (zooKeeperClient.stat(path) == null) { zooKeeperClient.createAndSetData(path, bytes); } else { zooKeeperClient.setData(path, bytes); } return true; } catch (KeeperException.NodeExistsException ignore) { // Conflict due to curator retry or losing a race. We're done here. return true; } catch (KeeperException.ConnectionLossException e) { log.warn("ZooKeeper connection lost while updating node: {}", path); return false; } catch (KeeperException e) { log.error("failed to update node: {}", path, e); return false; } } }