mirror of
https://github.com/usatiuk/dhfs.git
synced 2025-10-29 04:57:48 +01:00
don't use streams in deletion
they make a lot of garbage!
This commit is contained in:
@@ -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;
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user