Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: Non-daemon executor thread in Clojure prevents clean JVM shutdown #809

Open
oliyh opened this issue Nov 15, 2024 · 9 comments
Open
Labels

Comments

@oliyh
Copy link
Contributor

oliyh commented Nov 15, 2024

What happened?

Hi,

Firstly thank you for the great library, it transformed the way I thought about building UIs and it's so much more elegant than redux and so much cleaner than React hooks.

I have a library called re-graph which uses re-frame mostly for state management of websocket lifecycle. It runs in both cljs and clj, and we have uncovered an issue with the clj implementation which is preventing clean shutdown of the JVM because of an executor thread which is left running.

The full conversation is here: oliyh/re-graph#75

@lowecg has produced some code which works around the issue, but I think this would be best incorporated into re-frame (or maybe re-frame-test) and I'd be grateful to know what you think.

Thanks for your time

Version

1.2.0

What runtimes are you seeing the problem on?

JVM (CLJC)

Relevant console output

No response

@oliyh oliyh added the bug label Nov 15, 2024
@kimo-k
Copy link
Contributor

kimo-k commented Nov 15, 2024

Hey, I'd be happy to look into this. However, day8 are in crunch mode, so we can't spare much time until next Spring.

Please make a PR with explanation & references to the java features. The more straightforward the writing, the sooner we can merge it.

@lowecg
Copy link

lowecg commented Nov 17, 2024

I've created a minimal project demonstrating the issue: https://github.com/lowecg/re-frame-issue-809

I'll issue a PR shortly

@lowecg
Copy link

lowecg commented Nov 17, 2024

@kimo-k / @oliyh Thanks for you time on this. PR raised - I hope it meets expectation :-) Let me know if you need anything else.

@kimo-k
Copy link
Contributor

kimo-k commented Dec 2, 2024

My takeaways so far:

@lowecg
Copy link

lowecg commented Dec 2, 2024

Thanks @kimo-k, that's accurate.

some people want to oliyh/re-graph#75 (comment). What exactly does that mean?

If you use AWS Lambda with the JVM, then you want to likely want to use SnapStart to cut down cold start times. SnapStart requires you to prime your app by touching necessary classes in a warm up phase. This hits the executor.

I've just been doing some testing without interfering with the executor and it's working ok. So let's leave out the reuse after shutdown

lowecg added a commit to lowecg/re-frame that referenced this issue Dec 2, 2024
@kimo-k
Copy link
Contributor

kimo-k commented Dec 2, 2024

The PR where we added the executor has the premise that building a full app in .clj is a non-goal for re-frame.

I suppose that premise still holds - we have no ambitions to fully support .clj apps.

That seems to rule out the need to change re-frame so that re-graph can work. Maybe it's better if re-graph can just use the workaround.

However if this problem affects re-frame-test, that does seem more serious.

@kimo-k
Copy link
Contributor

kimo-k commented Dec 2, 2024

@lowecg, @oliyh, in your opinion, would it suffice to remove the executor altogether? Instead, next-tick would simply be (fn next-tick [f] (f) nil). We'd no longer call event handlers on a separate thread.

Looking at the context so far, it seems like the benefits of the executor could be more cosmetic than pragmatic. And we have observed at least one drawback to the executor (#469, #471).

@oliyh
Copy link
Contributor Author

oliyh commented Dec 2, 2024

Hi @kimo-k thanks for the time you have spent on this. I'm agnostic about how next-tick is implemented, I consider that re-frame internals and I don't know of anything that depends on this.

@lowecg
Copy link

lowecg commented Dec 2, 2024

@kimo-k - I agree with @oliyh. I'm happy to use the workaround in the meantime.

lowecg added a commit to lowecg/re-frame that referenced this issue Dec 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants