Github user anmolnar commented on a diff in the pull request:

    https://github.com/apache/zookeeper/pull/622#discussion_r217739881
  
    --- Diff: src/java/main/org/apache/zookeeper/server/DataTree.java ---
    @@ -1057,22 +1065,49 @@ void killSession(long session, long zxid) {
             // so there is no need for synchronization. The list is not
             // changed here. Only create and delete change the list which
             // are again called from FinalRequestProcessor in sequence.
    -        Set<String> list = ephemerals.remove(session);
    -        if (list != null) {
    -            for (String path : list) {
    -                try {
    -                    deleteNode(path, zxid);
    -                    if (LOG.isDebugEnabled()) {
    -                        LOG
    -                                .debug("Deleting ephemeral node " + path
    -                                        + " for session 0x"
    -                                        + Long.toHexString(session));
    -                    }
    -                } catch (NoNodeException e) {
    -                    LOG.warn("Ignoring NoNodeException for path " + path
    -                            + " while removing ephemeral for dead session 
0x"
    +        killSession(session, zxid, ephemerals.remove(session), null);
    +    }
    +
    +    void killSession(long session, long zxid, Set<String> 
paths2DeleteLocal,
    +            List<String> paths2DeleteInTxn) {
    +        if (paths2DeleteInTxn != null) {
    +            deleteNodes(session, zxid, paths2DeleteInTxn);
    +        }
    +
    +        if (paths2DeleteLocal == null) {
    +            return;
    +        }
    +
    +        if (paths2DeleteInTxn != null) {
    +            // explicitly check and remove to avoid potential performance
    +            // issue when using removeAll
    +            for (String path: paths2DeleteInTxn) {
    +                paths2DeleteLocal.remove(path);
    +            }
    +            if (!paths2DeleteLocal.isEmpty()) {
    --- End diff --
    
    In which case could this happen?


---

Reply via email to