예제 #1
0
 /**
  * this method traverses the quota path and update the path trie and sets
  *
  * @param path
  */
 private void traverseNode(String path) {
   DataNode node = getNode(path);
   String children[] = null;
   synchronized (node) {
     children = node.children.toArray(new String[node.children.size()]);
   }
   if (children.length == 0) {
     // this node does not have a child
     // is the leaf node
     // check if its the leaf node
     String endString = "/" + Quotas.limitNode;
     if (path.endsWith(endString)) {
       // ok this is the limit node
       // get the real node and update
       // the count and the bytes
       String realPath = path.substring(Quotas.quotaZookeeper.length(), path.indexOf(endString));
       updateQuotaForPath(realPath);
       this.pTrie.addPath(realPath);
     }
     return;
   }
   for (String child : children) {
     traverseNode(path + "/" + child);
   }
 }
예제 #2
0
 /**
  * @param path
  * @param data
  * @param acl
  * @param ephemeralOwner the session id that owns this node. -1 indicates this is not an ephemeral
  *     node.
  * @param zxid
  * @param time
  * @return the patch of the created node
  * @throws KeeperException
  */
 public String createNode(
     String path, byte data[], List<ACL> acl, long ephemeralOwner, long zxid, long time)
     throws KeeperException.NoNodeException, KeeperException.NodeExistsException {
   int lastSlash = path.lastIndexOf('/');
   String parentName = path.substring(0, lastSlash);
   String childName = path.substring(lastSlash + 1);
   StatPersisted stat = new StatPersisted();
   stat.setCtime(time);
   stat.setMtime(time);
   stat.setCzxid(zxid);
   stat.setMzxid(zxid);
   stat.setPzxid(zxid);
   stat.setVersion(0);
   stat.setAversion(0);
   stat.setEphemeralOwner(ephemeralOwner);
   DataNode parent = nodes.get(parentName);
   if (parent == null) {
     throw new KeeperException.NoNodeException();
   }
   synchronized (parent) {
     if (parent.children.contains(childName)) {
       throw new KeeperException.NodeExistsException();
     }
     int cver = parent.stat.getCversion();
     cver++;
     parent.stat.setCversion(cver);
     parent.stat.setPzxid(zxid);
     Long longval = convertAcls(acl);
     DataNode child = new DataNode(parent, data, longval, stat);
     parent.children.add(childName);
     nodes.put(path, child);
     if (ephemeralOwner != 0) {
       HashSet<String> list = ephemerals.get(ephemeralOwner);
       if (list == null) {
         list = new HashSet<String>();
         ephemerals.put(ephemeralOwner, list);
       }
       synchronized (list) {
         list.add(path);
       }
     }
   }
   // now check if its one of the zookeeper node child
   if (parentName.startsWith(quotaZookeeper)) {
     // now check if its the limit node
     if (Quotas.limitNode.equals(childName)) {
       // this is the limit node
       // get the parent and add it to the trie
       pTrie.addPath(parentName.substring(quotaZookeeper.length()));
     }
     if (Quotas.statNode.equals(childName)) {
       updateQuotaForPath(parentName.substring(quotaZookeeper.length()));
     }
   }
   // also check to update the quotas for this node
   String lastPrefix = pTrie.findMaxPrefix(path);
   if (!rootZookeeper.equals(lastPrefix) && !("".equals(lastPrefix))) {
     // ok we have some match and need to update
     updateCount(lastPrefix, 1);
     updateBytes(lastPrefix, data == null ? 0 : data.length);
   }
   dataWatches.triggerWatch(path, Event.EventType.NodeCreated);
   childWatches.triggerWatch(
       parentName.equals("") ? "/" : parentName, Event.EventType.NodeChildrenChanged);
   return path;
 }