I've added an ugly unit test to a branch on my GitHub to illustrate:

https://github.com/capnproto/capnproto/compare/master...Zentren:capnproto:membrane_issue?expand=1#diff-49ad79a4fffcbe88fcd8681ec67d49f5f6e5fc9010961c1b10ef1b462f0e957eR477

Note line 477 in *c++/src/capnp/membrane-test.c++* where I'd expect the 
request to have been cancelled as per membrane policy *onRevoked()* docs 
("all outstanding calls cancelled"). Looking at the behavior, it seems like 
chained promises in the request are not cancelled as part of this (only the 
initial *call(CallContext)* IF we have not yet entered its body).


Thanks,

Rowan Reeve
On Wednesday, March 15, 2023 at 3:42:39 PM UTC+2 Rowan Reeve wrote:

> Hi Kenton,
>
> I am encountering a problem where capabilities acting as views over some 
> resources are intermittently causing segfaults. The capability is wrapped 
> using *capnp::membrane* given a membrane policy where the promise 
> returned by *onRevoked* can be rejected on-demand via a synchronous 
> reject function (a kj::PromiseFulfillerPair is used to do this).
>
> The resources may be destroyed together at any time, whereby the membrane 
> managing the capabilities accessing the resource states is revoked. 
> However, this does not seem to be an instantaneous operation (presumably 
> due to revocation being managed by a promise), and I have encountered the 
> following issue as a result:
>
> Unresolved requests made before the membrane policy has been revoked and 
> where the resource has since been destroyed are not cancelled but will 
> rather resolve, accessing invalid memory.
>
> The workaround I have found to address this issue is to add a flag and a 
> *kj::Canceller* to the capability implementations whereby new requests 
> are rejected if the flag is set, and in addition when the flag is first 
> set, the canceler cancels all returned promises in cases where a chained 
> promise was returned rather than *kj::READY_NOW*. However, this is very 
> ugly and necessitates keeping around references to the capability 
> implementations before they are converted to *::Client* objects (so that 
> we can set that flag). I'm thinking that surely there has to be a better 
> way I have not considered.
>
> Do you have any thoughts on a better solution to this problem? If needed, 
> I can try create a minimal reproducible example to illustrate.
>
> In case it matters, OS is Ubuntu 20.04 and capnp version is 8.0.0, both 
> currently contained by my production environment.
>
> Thank you for your time,
>
> Rowan Reeve
>

-- 
You received this message because you are subscribed to the Google Groups 
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/capnproto/2d126940-b82e-4ef8-9f41-304d8a23c97cn%40googlegroups.com.

Reply via email to