don't use streams in deletion

they make a lot of garbage!
This commit is contained in:
2024-07-27 14:37:09 +02:00
parent c12e92c52f
commit 8384cc9efc
3 changed files with 38 additions and 37 deletions

View File

@@ -12,10 +12,7 @@ import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.UUID;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Stream;
@@ -138,6 +135,13 @@ public class JObjectRefProcessor {
return false;
}
private void deleteRef(JObject<?> self, String name) {
jObjectManager.get(name).ifPresent(ref -> ref.runWriteLocked(JObject.ResolutionStrategy.NO_RESOLUTION, (mc, dc, bc, ic) -> {
mc.removeRef(self.getName());
return null;
}));
}
private void refProcessorThread() {
try {
while (!Thread.interrupted()) {
@@ -149,38 +153,32 @@ public class JObjectRefProcessor {
next = _candidates.get(canDeleteRetryDelay);
}
var got = jObjectManager.get(next);
if (got.isEmpty()) continue;
var got = jObjectManager.get(next).orElse(null);
if (got == null) continue;
try {
got.get().runWriteLocked(JObject.ResolutionStrategy.NO_RESOLUTION, (m, d, v, i) -> {
got.runWriteLocked(JObject.ResolutionStrategy.NO_RESOLUTION, (m, d, v, i) -> {
if (m.isLocked()) return null;
if (m.isDeleted()) return null;
if (!m.isDeletionCandidate()) return null;
if (m.isSeen() && m.getKnownClass().isAnnotationPresent(Movable.class)) {
if (!processMovable(got.get()))
if (!processMovable(got))
return null;
}
got.get().tryResolve(JObject.ResolutionStrategy.LOCAL_ONLY);
got.tryResolve(JObject.ResolutionStrategy.LOCAL_ONLY);
Log.trace("Deleting " + m.getName());
m.markDeleted();
Stream<String> refs = Stream.empty();
Collection<String> extracted = null;
if (got.getData() != null) extracted = got.getData().extractRefs();
if (m.getSavedRefs() != null)
refs = m.getSavedRefs().stream();
if (got.get().getData() != null)
refs = Streams.concat(refs, got.get().getData().extractRefs().stream());
got.discardData();
got.get().discardData();
refs.forEach(c -> {
jObjectManager.get(c).ifPresent(ref -> ref.runWriteLocked(JObject.ResolutionStrategy.NO_RESOLUTION, (mc, dc, bc, ic) -> {
mc.removeRef(m.getName());
return null;
}));
});
if (got.getMeta().getSavedRefs() != null)
for (var r : got.getMeta().getSavedRefs()) deleteRef(got, r);
if (extracted != null)
for (var r : extracted) deleteRef(got, r);
return null;
});

View File

@@ -16,6 +16,7 @@ import org.apache.commons.collections4.MultiValuedMap;
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Optional;
@@ -131,6 +132,13 @@ public class JObjectResolver {
}
}
private void quickDeleteRef(JObject<?> self, String name) {
jObjectManager.get(name).ifPresent(ref -> ref.runWriteLocked(JObject.ResolutionStrategy.NO_RESOLUTION, (mc, dc, bc, ic) -> {
mc.removeRef(self.getName());
return null;
}));
}
private void tryQuickDelete(JObject<?> self) {
self.assertRWLock();
self.tryResolve(JObject.ResolutionStrategy.LOCAL_ONLY);
@@ -138,21 +146,15 @@ public class JObjectResolver {
Log.trace("Quick delete of: " + self.getName());
self.getMeta().markDeleted();
Stream<String> refs = Stream.empty();
if (self.getMeta().getSavedRefs() != null)
refs = self.getMeta().getSavedRefs().stream();
if (self.getData() != null)
refs = Streams.concat(refs, self.getData().extractRefs().stream());
Collection<String> extracted = null;
if (self.getData() != null) extracted = self.getData().extractRefs();
self.discardData();
refs.forEach(c -> {
jObjectManager.get(c).ifPresent(ref -> ref.runWriteLocked(JObject.ResolutionStrategy.NO_RESOLUTION, (mc, dc, bc, ic) -> {
mc.removeRef(self.getName());
return null;
}));
});
if (self.getMeta().getSavedRefs() != null)
for (var r : self.getMeta().getSavedRefs()) quickDeleteRef(self, r);
if (extracted != null)
for (var r : extracted) quickDeleteRef(self, r);
}
public <T extends JObjectData> Optional<T> resolveDataLocal(JObject<T> jObject) {
@@ -185,7 +187,8 @@ public class JObjectResolver {
}
}
public <T extends JObjectData> void notifyWrite(JObject<T> self, boolean metaChanged, boolean externalChanged, boolean hasDataChanged) {
public <T extends JObjectData> void notifyWrite(JObject<T> self, boolean metaChanged,
boolean externalChanged, boolean hasDataChanged) {
self.assertRWLock();
if (metaChanged || hasDataChanged)
jObjectWriteback.markDirty(self);

View File

@@ -108,7 +108,7 @@ public class FileObjectPersistentStore implements ObjectPersistentStore {
private <T extends Message> T readObjectImpl(T defaultInstance, Path path) {
try (var fsb = new FileInputStream(path.toFile());
var fs = new BufferedInputStream(fsb, 1048576)) {
var fs = new BufferedInputStream(fsb, 131072)) {
return (T) defaultInstance.getParserForType().parseFrom(fs);
} catch (FileNotFoundException | NoSuchFileException fx) {
throw new StatusRuntimeExceptionNoStacktrace(Status.NOT_FOUND);
@@ -133,7 +133,7 @@ public class FileObjectPersistentStore implements ObjectPersistentStore {
private void writeObjectImpl(Path path, Message data) {
try {
try (var fsb = new FileOutputStream(path.toFile(), false);
var fs = new BufferedOutputStream(fsb, 1048576)) {
var fs = new BufferedOutputStream(fsb, 131072)) {
data.writeTo(fs);
}
} catch (IOException e) {