@NotNull
  ListResult update(@NotNull VirtualFile parent,
                    int parentId,
                    @NotNull Function<? super ListResult, ListResult> childrenConvertor) {
    SlowOperations.assertSlowOperationsAreAllowed();
    PersistentFSConnection.ensureIdIsValid(parentId);

    updateLock.lock(parentId);
    try {
      ListResult children = list(parentId);
      ListResult modifiedChildren = childrenConvertor.apply(children);

      // optimization: when converter returned unchanged children (see e.g. PersistentFSImpl.findChildInfo())
      // then do not save them back again unnecessarily
      if (!modifiedChildren.equals(children)) {
        //if (LOG.isDebugEnabled()) {
        //  LOG.debug("Update children for " + parent + " (id = " + parentId + "); old = " + children + ", new = " + modifiedChildren);
        //}
        checkNotClosed();

        //TODO RC: why we update symlinks here, under the lock?
        updateSymlinksForNewChildren(parent, children, modifiedChildren);

        treeAccessor.doSaveChildren(parentId, modifiedChildren);
        connection.markRecordAsModified(parentId);
      }
      return modifiedChildren;
    }
    catch (ProcessCanceledException e) {
      // NewVirtualFileSystem.list methods can be interrupted now
      throw e;
    }
    catch (Throwable e) {
      throw handleError(e);
    }
    finally {
      updateLock.unlock(parentId);
    }
  }
@NotNull
  ListResult update(@NotNull VirtualFile parent,
                    int parentId,
                    @NotNull Function<? super ListResult, ListResult> childrenConvertor)