You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zookeeper.apache.org by "Rakesh R (JIRA)" <ji...@apache.org> on 2014/03/12 09:56:48 UTC

[jira] [Commented] (ZOOKEEPER-1665) Support recursive deletion in multi

    [ https://issues.apache.org/jira/browse/ZOOKEEPER-1665?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13931552#comment-13931552 ] 

Rakesh R commented on ZOOKEEPER-1665:
-------------------------------------

Hi [~yuzhihong@gmail.com], 

My bad, previously when I tested multi api it failed. Now its working fine for me. I don't have a strong point to expose a new utility api for multiDeleteRecursive(). Because users can still achieve the behavior through the existing "ZKUtil" and "ZooKeeper" exposed apis. If anybody interested, I would be happy to convert the snippet into a patch.

Please see the below snippet where it shows one pattern to achieve it, here you can pass String array {acquiredZnode, reachedZnode, abortZnode} or if you dont want the transaction across pathRoots, simply pass one by one. Hope this will help you.
{code}
    public static List<OpResult> multiDeleteRecursive(ZooKeeper zk,
            String... pathRoots) throws InterruptedException, KeeperException {

        // TODO: handle empty pathRoots and return.
        List<Op> opList = new ArrayList<Op>();
        for (String eachPath : pathRoots) {
            List<Op> eachRoot = prepareOpList(zk, eachPath);
            opList.addAll(eachRoot);
        }
        return zk.multi(opList);
    }

    private static List<Op> prepareOpList(ZooKeeper zk, final String pathRoot)
            throws InterruptedException, KeeperException {
        PathUtils.validatePath(pathRoot);

        List<String> tree = ZKUtil.listSubTreeBFS(zk, pathRoot);
        LOG.debug("Deleting " + tree);
        LOG.debug("Deleting " + tree.size() + " subnodes ");
        List<Op> opList = new ArrayList<Op>(tree.size());
        for (int i = tree.size() - 1; i >= 0; --i) {
            // Delete the leaves first and eventually get rid of the root
            opList.add(Op.delete(tree.get(i), -1));
        }
        return opList;
    }
{code}

Thanks,
Rakesh

> Support recursive deletion in multi
> -----------------------------------
>
>                 Key: ZOOKEEPER-1665
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1665
>             Project: ZooKeeper
>          Issue Type: New Feature
>            Reporter: Ted Yu
>
> Use case in HBase is that we need to recursively delete multiple subtrees:
> {code}
>     ZKUtil.deleteChildrenRecursively(watcher, acquiredZnode);
>     ZKUtil.deleteChildrenRecursively(watcher, reachedZnode);
>     ZKUtil.deleteChildrenRecursively(watcher, abortZnode);
> {code}
> To achieve high consistency, it is desirable to use multi for the above operations.
> This JIRA adds support for recursive deletion in multi.



--
This message was sent by Atlassian JIRA
(v6.2#6252)