GP-2068: Indexing, caching, other optimizations for TraceRmi.

This commit is contained in:
Dan 2023-11-03 10:34:31 -04:00
parent 9c6eabfbb3
commit a41c4ca5f7
63 changed files with 3529 additions and 1167 deletions

View file

@ -356,6 +356,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
name = object.getName() + "." + nextId;
}
}
name = object.getName() + "." + System.currentTimeMillis();
// Don't catch it this last time
return parent.createFile(name, object, monitor);
}
@ -948,9 +949,12 @@ public class TraceRmiHandler implements TraceRmiConnection {
tx.tx.abortOnClose();
}
tx.tx.close();
OpenTrace open = requireOpenTrace(tx.txId.doId);
if (!tx.undoable) {
requireOpenTrace(tx.txId.doId).trace.clearUndo();
open.trace.clearUndo();
}
// TODO: Check for other transactions on the same trace?
open.trace.setEventsEnabled(true);
return ReplyEndTx.getDefaultInstance();
}
@ -976,10 +980,11 @@ public class TraceRmiHandler implements TraceRmiConnection {
RequestGetValuesIntersecting req) throws AddressOverflowException {
OpenTrace open = requireOpenTrace(req.getOid());
AddressRange range = open.toRange(req.getBox().getRange(), false);
String key = req.getKey() == "" ? null : req.getKey();
Collection<? extends TraceObjectValue> col = range == null
? List.of()
: open.trace.getObjectManager()
.getValuesIntersecting(toLifespan(req.getBox().getSpan()), range);
.getValuesIntersecting(toLifespan(req.getBox().getSpan()), range, key);
return ReplyGetValues.newBuilder()
.addAllValues(col.stream().map(TraceRmiHandler::makeValDesc).toList())
.build();
@ -1074,16 +1079,15 @@ public class TraceRmiHandler implements TraceRmiConnection {
if (object == null) {
return ReplyRetainValues.getDefaultInstance();
}
Lifespan span = toLifespan(req.getSpan());
Collection<? extends TraceObjectValue> values = switch (req.getKinds()) {
case VK_ELEMENTS -> object.getElements();
case VK_ATTRIBUTES -> object.getAttributes();
case VK_BOTH -> object.getValues();
case VK_ELEMENTS -> object.getElements(span);
case VK_ATTRIBUTES -> object.getAttributes(span);
case VK_BOTH -> object.getValues(span);
default -> throw new TraceRmiError("Protocol error: Invalid value kinds");
};
Lifespan span = toLifespan(req.getSpan());
Set<String> keysToKeep = Set.copyOf(req.getKeysList());
List<String> keysToDelete = values.stream()
.filter(v -> v.getLifespan().intersects(span))
.map(v -> v.getEntryKey())
.filter(k -> !keysToKeep.contains(k))
.distinct()
@ -1123,6 +1127,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
// Implies request was to set value to null
return ReplySetValue.newBuilder().setSpan(makeSpan(Lifespan.EMPTY)).build();
}
TraceObjectValue val = object.setValue(toLifespan(value.getSpan()), value.getKey(),
objVal, toResolution(req.getResolution()));
return ReplySetValue.newBuilder()
@ -1144,6 +1149,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
protected ReplyStartTx handleStartTx(RequestStartTx req) {
OpenTrace open = requireOpenTrace(req.getOid());
Tid tid = requireAvailableTid(open, req.getTxid());
open.trace.setEventsEnabled(false);
@SuppressWarnings("resource")
OpenTx tx =
new OpenTx(tid, open.trace.openTransaction(req.getDescription()), req.getUndoable());

View file

@ -847,11 +847,10 @@ public class TraceRmiTarget extends AbstractTarget {
protected TraceObject getProcessForSpace(AddressSpace space) {
for (TraceObjectValue objVal : trace.getObjectManager()
.getValuesIntersecting(Lifespan.at(getSnap()),
new AddressRangeImpl(space.getMinAddress(), space.getMaxAddress()))) {
if (!TargetMemoryRegion.RANGE_ATTRIBUTE_NAME.equals(objVal.getEntryKey())) {
continue;
}
.getValuesIntersecting(
Lifespan.at(getSnap()),
new AddressRangeImpl(space.getMinAddress(), space.getMaxAddress()),
TargetMemoryRegion.RANGE_ATTRIBUTE_NAME)) {
TraceObject obj = objVal.getParent();
if (!obj.getInterfaces().contains(TraceObjectMemoryRegion.class)) {
continue;

View file

@ -361,6 +361,7 @@ message ReplyGetValues {
message RequestGetValuesIntersecting {
DomObjId oid = 1;
Box box = 2;
string key = 3;
}
// Analysis operations

View file

@ -389,10 +389,10 @@ class Trace(object):
span = Lifespan(self.snap(), self.snap())
return self._make_values(self.client._get_values(self.id, span, pattern))
def get_values_intersecting(self, rng, span=None):
def get_values_intersecting(self, rng, span=None, key=""):
if span is None:
span = Lifespan(self.snap(), self.snap())
return self._make_values(self.client._get_values_intersecting(self.id, span, rng))
return self._make_values(self.client._get_values_intersecting(self.id, span, rng, key))
def _activate_object(self, object):
self.client._activate_object(self.id, object)
@ -1053,11 +1053,12 @@ class Client(object):
return self._read_values(reply)
return self._batch_or_now(root, 'reply_get_values', _handle)
def _get_values_intersecting(self, id, span, rng):
def _get_values_intersecting(self, id, span, rng, key):
root = bufs.RootMessage()
root.request_get_values_intersecting.oid.id = id
self._write_span(root.request_get_values_intersecting.box.span, span)
self._write_range(root.request_get_values_intersecting.box.range, rng)
root.request_get_values_intersecting.key = key
def _handle(reply):
return self._read_values(reply)