private void onDropFromCache(Key key, @NotNull ChangeTrackingValueContainer<Value> valueContainer) {
    try {
      if (myReadOnly || !valueContainer.isDirty()) {
        return;
      }

      if (myKeyIsUniqueForIndexedFile) {
        if (valueContainer.containsOnlyInvalidatedChange()) {
          myMap.remove(key);
          return;
        }

        //RC: afaicu, this is done just to ensure we do NOT use append-changes branch in a .merge().
        //    Append-changes is useless in keyIsUniqueForFile case because there is always <=1 (inputId, value) entry in
        //    ValueContainer, and at this point container could contain only 1 update change that container has changes (isDirty) and those changes are not removals
        //    (!containsOnlyInvalidatedChange) which (for keyIsUniqueForFile) implies there is 1 and only 1 added change
        if (valueContainer.containsCachedMergedData()) {
          valueContainer.setNeedsCompacting(true);
        }
      }
      myMap.merge(key, valueContainer);
    }
    catch (IOException e) {
      throw new RuntimeException(e);
    }
  }
private void onDropFromCache(Key key, @NotNull ChangeTrackingValueContainer<Value> valueContainer)