drop in memory cache for key upon removeAllValues value, fileId request (fixes ClassNameCompletionTest.testAnnotationFiltering second run failjure)

This commit is contained in:
Maxim.Mossienko
2012-06-30 00:12:15 +04:00
parent f5daffd107
commit abd1fcf50e
5 changed files with 13 additions and 45 deletions
@@ -49,11 +49,9 @@ class ChangeTrackingValueContainer<Value> extends UpdatableValueContainer<Value>
if (merged != null) {
merged.addValue(inputId, value);
}
ValueContainerImpl<Value> added = myAdded;
if (added == null) {
myAdded = added = new ValueContainerImpl<Value>();
}
added.addValue(inputId, value); // will flush the changes & caller should ensure exclusiveness to avoid intermediate visibility issues
if (myAdded == null) myAdded = new ValueContainerImpl<Value>();
myAdded.addValue(inputId, value);
}
@Override
@@ -63,27 +61,10 @@ class ChangeTrackingValueContainer<Value> extends UpdatableValueContainer<Value>
merged.removeAssociatedValue(inputId);
}
ValueContainerImpl<Value> added = myAdded;
if (added != null) added.removeAssociatedValue(inputId);
if (myAdded != null) myAdded.removeAssociatedValue(inputId);
TIntHashSet invalidated = myInvalidated;
if (invalidated == null) {
invalidated = new TIntHashSet(1);
}
invalidated.add(inputId);
myInvalidated = invalidated; // volatile write
}
@Override
public boolean removeValue(int inputId, Value value) {
ValueContainerImpl<Value> merged = myMerged;
if (merged != null) {
merged.removeValue(inputId, value);
}
ValueContainerImpl<Value> added = myAdded;
if (added != null) added.removeValue(inputId, value);
return true;
if (myInvalidated == null) myInvalidated = new TIntHashSet(1);
myInvalidated.add(inputId);
}
@Override
@@ -142,9 +123,8 @@ class ChangeTrackingValueContainer<Value> extends UpdatableValueContainer<Value>
newMerged = ((ChangeTrackingValueContainer<Value>)fromDisk).getMergedData().copy();
}
TIntHashSet invalidated = myInvalidated;
if (invalidated != null) {
invalidated.forEach(new TIntProcedure() {
if (myInvalidated != null) {
myInvalidated.forEach(new TIntProcedure() {
@Override
public boolean execute(int inputId) {
newMerged.removeAssociatedValue(inputId);
@@ -153,9 +133,8 @@ class ChangeTrackingValueContainer<Value> extends UpdatableValueContainer<Value>
});
}
ValueContainerImpl<Value> added = myAdded;
if (added != null) {
added.forEach(new ContainerAction<Value>() {
if (myAdded != null) {
myAdded.forEach(new ContainerAction<Value>() {
@Override
public boolean perform(final int id, final Value value) {
newMerged.removeAssociatedValue(id); // enforcing "one-value-per-file for particular key" invariant
@@ -150,10 +150,8 @@ public class MemoryIndexStorage<Key, Value> implements IndexStorage<Key, Value>
getMemValueContainer(key).removeAssociatedValue(inputId);
return;
}
final ChangeTrackingValueContainer<Value> valueContainer = myMap.get(key);
if (valueContainer != null) {
valueContainer.dropMergedData();
}
myMap.remove(key); //
myBackendStorage.removeAllValues(key, inputId);
}
@@ -24,7 +24,5 @@ public abstract class UpdatableValueContainer<T> extends ValueContainer<T>{
public abstract void addValue(int inputId, T value);
public abstract boolean removeValue(int inputId, T value);
public abstract void removeAssociatedValue(int inputId);
}
@@ -97,7 +97,6 @@ class ValueContainerImpl<Value> extends UpdatableValueContainer<Value> implement
}
}
@Override
public boolean removeValue(int inputId, Value value) {
final Object input = getInput(value);
if (input == null) {
@@ -117,13 +117,7 @@ class ValueContainerMap<Key, Value> extends PersistentHashMap<Key, ValueContaine
final int idCount = DataInputOutputUtil.readSINT(in);
for (int i = 0; i < idCount; i++) {
final int id = DataInputOutputUtil.readSINT(in);
if (id < 0) {
valueContainer.removeValue(-id, value);
valueContainer.setNeedsCompacting(true);
}
else {
valueContainer.addValue(id, value);
}
valueContainer.addValue(id, value);
}
}
}