fuser icon indicating copy to clipboard operation
fuser copied to clipboard

Support FUSE_INTERRUPT

Open cberner opened this issue 4 years ago • 3 comments

cberner avatar Sep 24 '20 17:09 cberner

I think FUSE_INTERRUPT could work really well with an async API runner. It would look something like:

let in_flight = HashMap<RequestId, JoinHandle<()>>::new();
let future_cancellations = Set<RequestId>::new();
for req in requests {
    if future_cancellations.contains(req.request_id()) {
        future_cancellations.pop(req.request_id());
        continue;
    }
    match req.operation() {
        Interrupt(x) => in_flight.pop(x.cancelled_id()).abort() || future_cancellations.push(x.cancelled_id());
    }
    in_flight[req.request_id()] = tokio::spawn(|| {
        handler(req);
        in_flight.pop(req.request_id());
    });
}

So interrupted pending tasks would be aborted, and their futures dropped in response to FUSE_INTERRUPT messages. It fits naturally with the async API.

wmanley avatar Mar 29 '21 10:03 wmanley

Ya, agreed! I'd love to see an async implementation :)

cberner avatar Mar 30 '21 04:03 cberner

Note to self, for the future: I looked into implementing this in the current API, and it doesn't make sense. FUSE_INTERRUPT is for interrupting code that's hung in userspace. However, the current Filesystem interface takes &mut self so concurrent calls aren't possible. Revisit it after async is implemented

cberner avatar Jun 25 '21 01:06 cberner