private void after(int eventsSize) {
    CollectedEvents collectedEvents = myCollectedEvents;
    if (collectedEvents == null) {
      // some crazy invalid event nesting happened, like in DbSrcFileSystem.getOutputStream
      // where refresh is called right inside stream.close(), leading to before(), before(), after(), after() events
      return;
    }
    myCollectedEvents = null;
    long start = System.currentTimeMillis();
    ApplicationManager.getApplication().assertWriteIntentLockAcquired(); // guarantees no attempts to get read action lock under "this" lock
    incModificationCount();

    //noinspection SynchronizeOnThis
    synchronized (this) {
      for (NodeToUpdate toUpdate : collectedEvents.toUpdateNodes) {
        FilePartNode parent = toUpdate.parent;
        FilePartNode node = toUpdate.node;

        node.update(parent, getRoot(node.myFS), "VFPMI invalidated VFP during update", toUpdate.myEvent);
      }
    }

    for (EventDescriptor event : collectedEvents.eventList) {
      event.fireAfter();
    }

    assertConsistency();
    long afterElapsedMs = System.currentTimeMillis() - start;
    if (afterElapsedMs > 1000 || collectedEvents.prepareElapsedMs > 1000) {
      LOG.warn("VirtualFilePointerManagerImpl.prepareChange(" + eventsSize + " events): " + collectedEvents.prepareElapsedMs + "ms."
               + "; total pointers: " + numberOfPointers()
               + "; afterElapsedMs: " + afterElapsedMs + "ms.; eventList.size(): " + collectedEvents.eventList.size()
               + "; toFirePointers.size(): " + collectedEvents.toFirePointers.size() + "; toUpdateNodes.size(): " + collectedEvents.toUpdateNodes.size()
               + "; eventList: " + ContainerUtil.getFirstItems(collectedEvents.eventList, 100));
    }
  }
private void after(int eventsSize)