-
-
Notifications
You must be signed in to change notification settings - Fork 20
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
Thread variables are not accessible #82
Comments
hello @bolshakov! looks like this is not a bug, this is how ruby fiber-local variables works:
sample copied from this post @flash-gordon correct me if i'm wrong |
Yeah, absolutely. It works "as expected" because ruby works this way. Fortunately, all thread local usages can be replaced by the state effect. It should be mentioned in the docs so I'll leave it open until then. |
I considered this library a great abstraction tool for dependency injection and algebraic effects. The knowledge about underlying fiber use is hidden and never mentioned.
It makes the library incompatible with other tools. Imagine a third-party library (say transaction manager) that uses thread locals. I'm not sure it's a good idea to force every library using thread-locals to migrate to dry-effects v0.1 to introduce it in the existing project. I understand this argument may sound reasonable for new projects, but it makes hardly possible to introduce "dry-effects" into old ones. Rewriting a lot of code to use "dry-effects" may be a huge commitment. Since the main purpose of this library is not the work with threads or fibers, I kindly suggest treating this as a bug and make it possible to cooperate "dry-effects" with threads-locals. |
I considered this. The plan was to add a compatibility layer to the gem via extensions. For example, there's one for rspec. Making it work in general is though possible but performance-wise is suboptimal. Instead, one can add a list of variable names to be preserved in child fibers (we can have an API for that). |
Nice, I didn't know about extensions 👍 I implemented a patch myself but ended up using old good thread locals because they appeared to be more readable, and my code that uses "dry-effect" could lead to hard-to-debug issues in the future.
It was chewy, and something else that I couldn't remember now. |
I agree this should be properly explained in the docs. Even if it's an edge-case it deserves an explanation. |
Hey, to put some context
The issue itself is rather hard to fix in one proper way, while it seems that Some related links:
When doing some research I had an issue with https://github.com/newrelic/newrelic-ruby-agent/blob/dev/lib/new_relic/agent/instrumentation/sidekiq.rb - when having dry-effect based code it hide tracing information initialized by middleware. |
Is this a problem only in case of the State effect? |
@bolshakov @kml I spoke with @flash-gordon and agreed on a simple After that, we (dry-rb team) will provide an extension for |
Describe the bug
Using state effect resets all
Thread.current
variables.To Reproduce
Oututs:
Expected behavior
As you can see variables set outside of the
with_updated_attributes
block are not visible inside the block.I expect the following output:
My environment
The text was updated successfully, but these errors were encountered: