[
https://issues.apache.org/jira/browse/ZOOKEEPER-661?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12879197#action_12879197
]
brian wickman commented on ZOOKEEPER-661:
-----------------------------------------
Yet another version - http://github.com/wickman/zookeeper
In the distant future when we're able to move our app to 1.9, it'd make good
sense to merge with the FFI branch. In the meantime, we're stuck on 1.8. This
fork uses a client API similar to Reynhout's FFI version (args via hashes w/
optionals), but differs in that it works on MRI 1.8 while still supporting
watchers and callbacks. Right now it polls to dispatch callbacks, and like
Topper's, needs only another 10 lines of code to integrate EventMachine to wake
up to a ping over a FIFO/socket passed to the C extension. For the sake of
minimalism, I left it as-is for now since we're not exactly using ZK as a
hyper-performant datastore.
I'm not sure about Topper's dev environment (maybe Ruby threading on Solaris is
happier?), but I was unable to get any Ruby C extension API methods to work at
all from the Zookeeper thread pool. I'm sure the 1.9 dev environment is a bit
safer still. Unfortunately, the instant you try to do anything on 1.8 that has
the side effect of allocating some data on a stack (e.g. rb_funcall or
rb_hash_new), the Ruby interpreter segfaults. To get around this in my
extension, all callback and watcher completions get saved and queued on the ZK
side and dispatched from the polling method on the Ruby side, effectively
decoupling the ZK threadpool from the Ruby interpreter. Conversion from ZK
data types to native Ruby data types always happens in a thread context that is
active in the Ruby interpreter, side-stepping the annoying thread-safety
problems.
Please take a look. I'm new to Ruby, so pardon any idiomatic faux pas.
> Add Ruby bindings
> -----------------
>
> Key: ZOOKEEPER-661
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-661
> Project: Zookeeper
> Issue Type: New Feature
> Components: contrib-bindings
> Environment: MRI Ruby 1.9
> JRuby 1.4
> Reporter: Andrew Reynhout
> Priority: Minor
>
> Add Ruby bindings to the ZooKeeper distribution.
> Ruby presents special threading difficulties for asynchronous ZK calls (aget,
> watchers, etc). It looks like the simplest workaround is to patch the ZK C
> API.
> Proposed approach will be described in comment.
> Please use this ticket for discussion and suggestions.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.