dont aggressively clean up answer pipelines

This commit is contained in:
Vaci Koblizek 2020-11-12 20:34:48 +00:00
parent d526eca4b9
commit ce9e1689cb

View file

@ -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;
}
} }
} }