distributed-process icon indicating copy to clipboard operation
distributed-process copied to clipboard

[DP-11] unmonitor should remove monitor messages from the mailbox (if any)

Open edsko opened this issue 13 years ago • 13 comments

[Imported from JIRA. Reported by Edsko de Vries @edsko) as DP-11 on 2012-10-23 11:23:33]

edsko avatar Oct 23 '12 12:10 edsko

Personally I think this should be an option rather than the default behaviour.

hyperthunk avatar Dec 13 '12 20:12 hyperthunk

There is a PR addressing this issue, and I'm wondering what the purpose of removing the notifications from the mailbox is. Notifications can arrive anytime after unmonitoring, so I don't see how this helps avoiding a message leak.

Moreover, the caller of unmonitor may be interested in handling the notifications after unmonitoring.

facundominguez avatar Sep 08 '15 12:09 facundominguez

May you please provide a use case when the caller of unmonitor may be interested in handling monitor notification? My understanding is that unmonitor is called when you are not interested in the monitored resource anymore? Am I missing something?

VicNumber21 avatar Sep 08 '15 19:09 VicNumber21

I have no use case. Just pointing at the fact for others to consider.

facundominguez avatar Sep 08 '15 20:09 facundominguez

I think part of the rationale for this is provided the same behaviour as Erlang/OTP. In that case, the unmonitor call flushes (or there's a flushing variant, I forget which is the case) so you won't get unexpected messages in the mailbox. This is particularly important in stateless gen_server and gen_fsm implementations (e.g., what we do in distributed-process-client-server), where an unexpected monitor signal might trigger a shutdown or restart that we don't actually want, and the server loop and message handling/receiving code are hidden from the caller.

hyperthunk avatar Oct 07 '15 14:10 hyperthunk

In that case, I would find less surprising to offer a variant that does the flushing of monitor notifications. Erlang provides more than one variant at least.

facundominguez avatar Oct 08 '15 17:10 facundominguez

Yes @facundominguez that's right, and I agree we should offer a variant rather than changing the current behaviour.

hyperthunk avatar Oct 16 '15 12:10 hyperthunk

Erlang does not flush by default, but as @hyperthunk says, gives you the option to. Makes sense to copy Erlang, with an unmonitorFlush variant or somesuch.

mboes avatar Oct 16 '15 20:10 mboes

Well, except that Erlang only kept the non-flush variant by default due to backwards compatibility... http://erlang.org/pipermail/erlang-questions/2008-August/037564.html

mboes avatar Oct 16 '15 20:10 mboes

@mboes you're right, I don't think unmonitor\1 is useful unless the calling process is trying to exit quickly. In that case however, it might've made sense at one time to use the non flushing variant, since you'd otherwise have to trawl a potentially very large mailbox to find the monitor signal you're waiting for before you can exit. Yes, I know that exiting while you've got a lot of mail left to process seems unlikely, but once you're in a supervision tree it becomes far more likely.

Now in Erlang this scenario isn't such a big issue, since selective receive using a monitor ref is heavily optimised. The same isn't true for CH, and we haven't even looked at segregating the mailbox by type to reduce the complexity of selective receive, so I think having a variant that doesn't make the caller wait for the monitor ref to arrive possibly does matter here.

hyperthunk avatar Oct 19 '15 09:10 hyperthunk

Would it work to have unmonitor and unmonitorNoFlush then? unmonitorNoFlush would have the current implementation of unmonitor, and unmonitor would have the implementation given in #252.

facundominguez avatar Oct 19 '15 12:10 facundominguez

It's true that there's a potential performance concern here. But i don't think we should choose the semantics based on the details of how things are implemented today. If one wants to unmonitor and exit quickly soon thereafter, can as well just exit with unmonitoring. So I don't see yet how anyone will ever need unmonitorNoFlush, but it's possible (I'd say change the behaviour of unmonitor now, then implement unmonitorNoFlush only once the need does arise for someone in practice).

IOW I vote for merging @VicNumber21's PR #252 without further ado (modulo any review feedback).

mboes avatar Oct 19 '15 14:10 mboes

Yes okay @mboes, I can't really disagree that we shouldn't choose semantics based on implementation details. And stray monitor signals are a pain, so let's merge #252 then, and address the potential /slowness/ of unmonitor as and when we need to.

hyperthunk avatar Oct 19 '15 23:10 hyperthunk