dont aggressively clean up answer pipelines
This commit is contained in:
parent
d526eca4b9
commit
ce9e1689cb
1 changed files with 8 additions and 24 deletions
|
@ -307,11 +307,6 @@ final class RpcState<VatId> {
|
||||||
List<CompletionStage<java.lang.Void>> resolveOpsToRelease = new ArrayList<>();
|
List<CompletionStage<java.lang.Void>> resolveOpsToRelease = new ArrayList<>();
|
||||||
|
|
||||||
for (var answer : answers) {
|
for (var answer : answers) {
|
||||||
if (answer.pipeline != null) {
|
|
||||||
pipelinesToRelease.add(answer.pipeline);
|
|
||||||
answer.pipeline = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (answer.redirectedResults != null) {
|
if (answer.redirectedResults != null) {
|
||||||
tailCallsToRelease.add(answer.redirectedResults);
|
tailCallsToRelease.add(answer.redirectedResults);
|
||||||
answer.redirectedResults = null;
|
answer.redirectedResults = null;
|
||||||
|
@ -548,6 +543,7 @@ final class RpcState<VatId> {
|
||||||
response.setFds(List.of());
|
response.setFds(List.of());
|
||||||
|
|
||||||
answer.resultExports = writeDescriptors(caps, payload, fds);
|
answer.resultExports = writeDescriptors(caps, payload, fds);
|
||||||
|
assert answer.pipeline == null;
|
||||||
answer.pipeline = ops -> ops.length == 0
|
answer.pipeline = ops -> ops.length == 0
|
||||||
? capHook
|
? capHook
|
||||||
: Capability.newBrokenCap("Invalid pipeline transform.");
|
: Capability.newBrokenCap("Invalid pipeline transform.");
|
||||||
|
@ -603,6 +599,7 @@ final class RpcState<VatId> {
|
||||||
{
|
{
|
||||||
var answer = answers.find(answerId);
|
var answer = answers.find(answerId);
|
||||||
assert answer != null;
|
assert answer != null;
|
||||||
|
assert answer.pipeline == null;
|
||||||
answer.pipeline = pap.pipeline;
|
answer.pipeline = pap.pipeline;
|
||||||
|
|
||||||
if (redirectResults) {
|
if (redirectResults) {
|
||||||
|
@ -728,7 +725,6 @@ final class RpcState<VatId> {
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
answer.resultExports = null;
|
answer.resultExports = null;
|
||||||
answer.pipeline = null;
|
|
||||||
|
|
||||||
// If the call isn't actually done yet, cancel it. Otherwise, we can go ahead and erase the
|
// If the call isn't actually done yet, cancel it. Otherwise, we can go ahead and erase the
|
||||||
// question from the table.
|
// question from the table.
|
||||||
|
@ -1373,7 +1369,7 @@ final class RpcState<VatId> {
|
||||||
message.send();
|
message.send();
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanupAnswerTable(null, false);
|
cleanupAnswerTable(null);
|
||||||
}
|
}
|
||||||
return new ClientHook.VoidPromiseAndPipeline(tailInfo.promise, tailInfo.pipeline);
|
return new ClientHook.VoidPromiseAndPipeline(tailInfo.promise, tailInfo.pipeline);
|
||||||
}
|
}
|
||||||
|
@ -1412,7 +1408,7 @@ final class RpcState<VatId> {
|
||||||
this.returnMessage.setAnswerId(this.answerId);
|
this.returnMessage.setAnswerId(this.answerId);
|
||||||
this.returnMessage.setReleaseParamCaps(false);
|
this.returnMessage.setReleaseParamCaps(false);
|
||||||
|
|
||||||
var exports = new int[0];
|
int[] exports = null;
|
||||||
try {
|
try {
|
||||||
exports = ((RpcServerResponseImpl) response).send();
|
exports = ((RpcServerResponseImpl) response).send();
|
||||||
} catch (Throwable exc) {
|
} catch (Throwable exc) {
|
||||||
|
@ -1420,9 +1416,7 @@ final class RpcState<VatId> {
|
||||||
sendErrorReturn(exc);
|
sendErrorReturn(exc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no caps in the results, the pipeline is irrelevant.
|
cleanupAnswerTable(exports);
|
||||||
boolean shouldFreePipeline = exports.length == 0;
|
|
||||||
cleanupAnswerTable(exports, shouldFreePipeline);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendErrorReturn(Throwable exc) {
|
private void sendErrorReturn(Throwable exc) {
|
||||||
|
@ -1441,7 +1435,7 @@ final class RpcState<VatId> {
|
||||||
message.send();
|
message.send();
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanupAnswerTable(null, false);
|
cleanupAnswerTable(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isFirstResponder() {
|
private boolean isFirstResponder() {
|
||||||
|
@ -1452,25 +1446,15 @@ final class RpcState<VatId> {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cleanupAnswerTable(int[] resultExports, boolean shouldFreePipeline) {
|
private void cleanupAnswerTable(int[] resultExports) {
|
||||||
if (resultExports == null) {
|
|
||||||
resultExports = new int[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.cancelRequested) {
|
if (this.cancelRequested) {
|
||||||
assert resultExports.length == 0;
|
assert resultExports == null || resultExports.length == 0;
|
||||||
answers.erase(this.answerId);
|
answers.erase(this.answerId);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var answer = answers.find(answerId);
|
var answer = answers.find(answerId);
|
||||||
answer.callContext = null;
|
answer.callContext = null;
|
||||||
answer.resultExports = resultExports;
|
answer.resultExports = resultExports;
|
||||||
|
|
||||||
if (shouldFreePipeline) {
|
|
||||||
assert resultExports.length == 0;
|
|
||||||
answer.pipeline = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue