zookeeper-ng 1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/.ctags_paths +1 -0
  3. data/.dotfiles/ruby-gemset +1 -0
  4. data/.dotfiles/ruby-version +1 -0
  5. data/.dotfiles/rvmrc +2 -0
  6. data/.gitignore +19 -0
  7. data/.gitmodules +3 -0
  8. data/.travis.yml +25 -0
  9. data/CHANGELOG +395 -0
  10. data/Gemfile +30 -0
  11. data/Guardfile +8 -0
  12. data/LICENSE +23 -0
  13. data/Manifest +29 -0
  14. data/README.markdown +85 -0
  15. data/Rakefile +121 -0
  16. data/cause-abort.rb +117 -0
  17. data/ext/.gitignore +6 -0
  18. data/ext/Rakefile +41 -0
  19. data/ext/c_zookeeper.rb +398 -0
  20. data/ext/common.h +17 -0
  21. data/ext/dbg.h +53 -0
  22. data/ext/depend +5 -0
  23. data/ext/event_lib.c +740 -0
  24. data/ext/event_lib.h +175 -0
  25. data/ext/extconf.rb +103 -0
  26. data/ext/generate_gvl_code.rb +321 -0
  27. data/ext/patches/zkc-3.3.5-network.patch +24 -0
  28. data/ext/patches/zkc-3.4.5-fetch-and-add.patch +16 -0
  29. data/ext/patches/zkc-3.4.5-logging.patch +41 -0
  30. data/ext/patches/zkc-3.4.5-out-of-order-ping.patch +163 -0
  31. data/ext/patches/zkc-3.4.5-overflow.patch +11 -0
  32. data/ext/patches/zkc-3.4.5-yosemite-htonl-fix.patch +102 -0
  33. data/ext/zkc-3.4.5.tar.gz +0 -0
  34. data/ext/zkrb.c +1075 -0
  35. data/ext/zkrb_wrapper.c +775 -0
  36. data/ext/zkrb_wrapper.h +350 -0
  37. data/ext/zkrb_wrapper_compat.c +15 -0
  38. data/ext/zkrb_wrapper_compat.h +11 -0
  39. data/ext/zookeeper_base.rb +256 -0
  40. data/java/java_base.rb +503 -0
  41. data/lib/zookeeper.rb +115 -0
  42. data/lib/zookeeper/acls.rb +44 -0
  43. data/lib/zookeeper/callbacks.rb +108 -0
  44. data/lib/zookeeper/client.rb +30 -0
  45. data/lib/zookeeper/client_methods.rb +282 -0
  46. data/lib/zookeeper/common.rb +122 -0
  47. data/lib/zookeeper/common/queue_with_pipe.rb +110 -0
  48. data/lib/zookeeper/compatibility.rb +138 -0
  49. data/lib/zookeeper/constants.rb +97 -0
  50. data/lib/zookeeper/continuation.rb +223 -0
  51. data/lib/zookeeper/core_ext.rb +58 -0
  52. data/lib/zookeeper/em_client.rb +55 -0
  53. data/lib/zookeeper/exceptions.rb +135 -0
  54. data/lib/zookeeper/forked.rb +19 -0
  55. data/lib/zookeeper/latch.rb +34 -0
  56. data/lib/zookeeper/logger.rb +39 -0
  57. data/lib/zookeeper/logger/forwarding_logger.rb +84 -0
  58. data/lib/zookeeper/monitor.rb +19 -0
  59. data/lib/zookeeper/rake_tasks.rb +165 -0
  60. data/lib/zookeeper/request_registry.rb +153 -0
  61. data/lib/zookeeper/stat.rb +21 -0
  62. data/lib/zookeeper/version.rb +4 -0
  63. data/notes.txt +14 -0
  64. data/scripts/upgrade-1.0-sed-alike.rb +46 -0
  65. data/spec/c_zookeeper_spec.rb +51 -0
  66. data/spec/chrooted_connection_spec.rb +83 -0
  67. data/spec/compatibilty_spec.rb +8 -0
  68. data/spec/default_watcher_spec.rb +41 -0
  69. data/spec/em_spec.rb +51 -0
  70. data/spec/ext/zookeeper_base_spec.rb +19 -0
  71. data/spec/forked_connection_spec.rb +124 -0
  72. data/spec/latch_spec.rb +24 -0
  73. data/spec/log4j.properties +17 -0
  74. data/spec/shared/all_success_return_values.rb +10 -0
  75. data/spec/shared/connection_examples.rb +1077 -0
  76. data/spec/spec_helper.rb +61 -0
  77. data/spec/support/00_logging.rb +38 -0
  78. data/spec/support/10_spawn_zookeeper.rb +24 -0
  79. data/spec/support/progress_formatter.rb +15 -0
  80. data/spec/support/zookeeper_spec_helpers.rb +96 -0
  81. data/spec/zookeeper_spec.rb +24 -0
  82. data/zookeeper.gemspec +38 -0
  83. data/zoomonkey/duplicates +3 -0
  84. data/zoomonkey/zoomonkey.rb +194 -0
  85. metadata +157 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d3ab715117fac5110ed30a26d5b1d4a0f26e1651004ad41c21f38b9d46128d40
4
+ data.tar.gz: 5cd912c227b7f5fcb764b3ebffe5af6f86aff62adcc56557006abce6133377b6
5
+ SHA512:
6
+ metadata.gz: cba2378c1ca772f6552e13b4aa02100a8addd8bba04783be4a75784dbfdbe17c43e5401fb30456f0244642ffa6d0b2e62e6ccc0d0f06e5f2b5736978df902b8a
7
+ data.tar.gz: 370d3c712634c8f102c647bc968e778ab5b40aba68c44f0e38358e298039340dca86ef51e884ae1188f9dd5e0aae97a611420bd9c26e1da57c3f079a75601606
data/.ctags_paths ADDED
@@ -0,0 +1 @@
1
+ ~/vendor/ruby/*.{c,h}
@@ -0,0 +1 @@
1
+ zookeeper
@@ -0,0 +1 @@
1
+ ruby-1.9.3-p429
data/.dotfiles/rvmrc ADDED
@@ -0,0 +1,2 @@
1
+ rvm ruby-1.9.3@zookeeper --create
2
+ export ZK_DEV=1
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.o
3
+ *.so
4
+ *~
5
+ *.log
6
+ Makefile
7
+ pkg
8
+ zookeeper.gemspec
9
+ Gemfile.*
10
+ tmp/
11
+ .rvmrc
12
+ .zkserver
13
+ coverage
14
+
15
+ *.swp
16
+ *.swo
17
+
18
+ .ruby-gemset
19
+ .ruby-version
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "releaseops"]
2
+ path = releaseops
3
+ url = git://github.com/slyphon/releaseops.git
data/.travis.yml ADDED
@@ -0,0 +1,25 @@
1
+ ---
2
+ notifications:
3
+ email:
4
+ - ich@abwesend.com
5
+
6
+ # pull in releaseops submodule
7
+ before_install:
8
+ - git submodule update --init --recursive
9
+
10
+ env:
11
+ - SPAWN_ZOOKEEPER='true'
12
+
13
+ language: ruby
14
+
15
+ rvm:
16
+ - 2.6
17
+ - 2.7
18
+ - 3.0
19
+
20
+ bundler_args: --without development docs coverage
21
+
22
+ # blacklist
23
+ branches:
24
+ except:
25
+ # - 'dev/zookeeper-st'
data/CHANGELOG ADDED
@@ -0,0 +1,395 @@
1
+ v1.5
2
+ * going forward, publishing this fork under zookeeper-ng
3
+
4
+ v1.4.11
5
+ * backported fix for ZOOKEEPER-2253 by @chchen - #76
6
+
7
+ v1.4.10
8
+
9
+ * fix for ruby 2.2.0 build - #74 (h/t: fbernier)
10
+
11
+ v1.4.9
12
+
13
+ * Fix for build on OS-X 10.10 by @e0en
14
+
15
+ v1.4.8
16
+
17
+ * Fix deadlock related to state checks that can happen during reconnecting
18
+
19
+ v1.4.7
20
+
21
+ * Fixing dependent library compilation on FreeBSD 10 #53 (h/t: gogreen53)
22
+
23
+ v1.4.6
24
+
25
+ * Fix two issues with dealing with unresponsive zookeeper servers
26
+ that would prevent the client from properly recovering the session
27
+ (including one in the Apache ZooKeeper C library — see ZOOKEEPER-1756
28
+ for more details)
29
+ * Reduce the chances of seeing Zookeeper::Exceptions::NotConnected
30
+ exceptions by only submitting new commands if we are connected
31
+ * Prevent commands from being queued to be sent to the server if the
32
+ session has expired which will solve most cases involving the
33
+ Zookeeper::Exceptions::ContinuationTimeoutError exception
34
+ * Upgrade the Apache ZooKeeper C library to 3.4.5 (client is backward
35
+ compatible with 3.3 servers). The Java library has not been updated.
36
+ * Cleanup complaints from compiler for uninitialized variable access
37
+
38
+ v1.4.5
39
+
40
+ * Allow passing :session_id and :session_password options #42 (thanks to avalanche123)
41
+ * Fix permissions constants #46, #47, #48 (thanks to jaeho-kim)
42
+ * Allow JRuby to read nil values #44 (thanks to reidmorrison)
43
+
44
+
45
+ v1.4.4 fix build under FreeBSD (h/t: stass)
46
+
47
+ * https://github.com/slyphon/zookeeper/pull/40
48
+
49
+ v1.4.3 fix build for ruby 2.0.0-rc2
50
+
51
+ * https://github.com/slyphon/zookeeper/pull/34
52
+
53
+ v1.4.2 fix a bug in the forwarding logger format string
54
+
55
+ v1.4.1 merge pull request 29 - fix exception handling in jruby 1.7.x
56
+
57
+ * h/t to @dynamix for the patch
58
+
59
+
60
+ v1.4.0 Removed the 'logging' gem
61
+
62
+ * At the request of a user, use of the logging gem has been discontinued as
63
+ it appears to cause a fair amount of RSS memory bloating (8MB was
64
+ reported). It's been replaced by a fairly simple ad-hoc implementation
65
+ using the stdlib 'logger' class. No user impact is expected unless you were
66
+ adjusting the Loggers on components of zookeeper.
67
+
68
+ v1.3.0 much needed refactor of event and async result delivery
69
+
70
+ * event and async blocks were previously mixed in with a bunch of other
71
+ common code, and shared a Monitor with other unrelated functionality. This
72
+ code has been gently refactored into its own self-contained class (with its
73
+ own task-specific lock), which should help with maintenance.
74
+
75
+ v1.2.14 merge add_auth pull request, reduce chances for ContinuationTimeoutError
76
+
77
+ * added support for the add_auth call (h/t: @bradhe) see pull req #25
78
+
79
+ * fix a corner case where some pending Continuations may get stuck without
80
+ being shutdown when the event thread exits. This would lead to a
81
+ ContinuationTimeoutError being raised after 30s as a failsafe.
82
+
83
+ v1.2.13 fix build under rbenv
84
+
85
+ * h/t to Eric Lindvall for fixing #22 in http://git.io/PEPgnA
86
+ build reportedly works in rbenv now.
87
+
88
+ v1.2.12 improve locking in dispatch_next_callback
89
+
90
+ * Possible fix for an edgy NoMethodError on nil
91
+
92
+ v1.2.11 remove dependency on backports gem
93
+
94
+ * Somewhat naively we were requiring the backports gem to provide
95
+ Kernel#require_relative. This release implements similar functionlity
96
+ inside the Zookeeper module and doesn't affect the global namespace.
97
+
98
+ We apologise for the inconvenience.
99
+
100
+ v1.2.10 minor bug fix in java code
101
+
102
+ * Don't obscure a legitimate exception because of an unexpected nil
103
+
104
+ v1.2.7 further lock adjustments, deadlock risk reduction
105
+
106
+ * Refactor ZookeeperBase to not hold onto the mutex while waiting
107
+ for the dispatch thread to exit and the CZookeeper instance to close.
108
+ Instead, lock, nil out @czk, and unlock (which will cause all calls to
109
+ raise NotConnected), and then carry on with the shutdown procedure, greatly
110
+ reducing the chances of a deadlock. Also add a hardcoded 30 second timeout
111
+ to the join of the shutdown thread, that way we won't hang indefinitely in
112
+ the case of an unforseen condition.
113
+
114
+ * Improve the CZookeeper#wait_until_connected to use a deadline approach
115
+ to waiting for both running and connected states. Also, handle the
116
+ 'nil' (wait forever) timeout properly.
117
+
118
+ * Wake all waiting threads on all ConditionVariables when CZookeeper#shut_down!
119
+ is called
120
+
121
+ v1.2.6 fix build on fedora
122
+
123
+ v1.2.5 cleanup locking in ZookeeperBase
124
+
125
+ * There were several situations where we would hold the lock before calling
126
+ a method on CZookeeper (inquisitors and #create in particular). This
127
+ exposed us to deadlocks in situations where an async event would be
128
+ delivered (probably a SESSION_EXPIRED event), but the callback block could
129
+ not be called because the dispatch thread would block on the mutex being
130
+ held by the caller of create.
131
+
132
+ This version cleans up that usage, and ensures that the only time we hold
133
+ the mutex is during startup/shutdown (when the value of @czk may be changing),
134
+ and in all other cases we grab the mutex, dereference, and unlock then perform
135
+ whatever action on the reference.
136
+
137
+ * Add a safety net to Continuation (which will soon be called 'Promise' or
138
+ 'Future' at the request of @eric). If any operation takes more than 30s
139
+ an exception will be raised in the calling thread. The session timeout
140
+ setting makes it so that no operation should take more than 20s, so we know
141
+ if we haven't received a reply in *longer* than that, something has gone
142
+ awry.
143
+
144
+ v1.2.4 fix buffer overflow in CZookeeper client_id code
145
+
146
+ * the 'passwd' part of the struct is a char[16], but isn't null terminated.
147
+ use rb_str_new with an explicit length, rather than rb_str_new2 which
148
+ uses strlen().
149
+
150
+ v1.2.3 ensure that all threads are woken up on shutdown
151
+
152
+ * There was an edge case where a call would be queued up and its thread
153
+ sleeping waiting for a response, but that response would never come because
154
+ the connection was shut down. This version includes a patch for that case
155
+ to ensure that if a call is in 'pending' state, and shutdown time arrives
156
+ that all pending threads will receive a Zookeeper::Exceptions::NotConnected
157
+ exception.
158
+
159
+ v1.2.2 avoid race while waiting for connection
160
+
161
+ * There was a possible race in CZookeeper#wait_until_connected where if we
162
+ couldn't connect to the port specified (localhost:28271) then we wound up
163
+ burning 100% CPU and spinning. This solution fixes that by hooking into the
164
+ event delivery and keeping track of what the current state is. When there's
165
+ a change, we use a ConditionVariable to wake up threads that were waiting
166
+ until the connection was connected. Additionally, we now respect the
167
+ timeout parameter again.
168
+
169
+ v1.2.1 simplify assert_open
170
+
171
+ * The client methods were all calling assert_open before performing an
172
+ action. This was meant as a fail-early lightweight check of the connection
173
+ state and it worked well when we were running against the mt code. Now this
174
+ requires us to use a Continuation and make our way through the event loop.
175
+ There is a possible deadlock this release should solve that was caused by
176
+ the assert_open code holding a lock while making an async call through
177
+ the event loop. This is no longer the case. The assert_open call only checks
178
+ that the current handle hasn't been closed, the connection-state checking
179
+ now occurs before submitting a request on the event iteration thread, and
180
+ the behavior should be the same as it was before. If the underlying
181
+ connection is not in the 'connected' state, an exception will be raised.
182
+
183
+ v1.2.0 Stop the World, I Wanna fork()
184
+
185
+ * changed pause/resume methods to pause_before_fork_in_parent
186
+ and resume_after_fork_in_parent to match their ZK counterparts
187
+
188
+ * replaced the Queue in QueueWithPipe (really have to change that name)
189
+ with an Array and Mutex/ConditionVariable pair. This allows us to
190
+ have better control over the shutdown signaling, and lets us resume
191
+ operations after a pause.
192
+
193
+
194
+ v1.1.1 Cleanup after code review (h/t @eric)
195
+
196
+ * While hunting down this bug: https://bugs.ruby-lang.org/issues/6438
197
+ Eric Lindvall made a number of helpful catches.
198
+
199
+ * Reduce syscall overhead by not using an unnecessary pipe in the event_lib.c
200
+ implementation
201
+
202
+ * More careful use of rb_raise, don't longjmp past necessary free() calls.
203
+
204
+ * More careful malloc in the get() implementation (we need to allocate 1MB
205
+ to hold the data in a znode, but only in the SYNC cases).
206
+
207
+
208
+ v1.1.0 Rewrite C backend to use zookeeper_st, the async library
209
+
210
+ * In order to ensure fork safety, a rewrite of the backend was necessary.
211
+ It was impossible to guarantee with the mt lib that a lock would not
212
+ be held by a thread when fork() was called, which opened up the possibility
213
+ for corruption and other badness.
214
+
215
+ This version contains a Continuation class, which allows us to present a
216
+ synchronous front-end to the asynchronous backend. All features are still
217
+ supported, no special action is necessary to prepare for a fork, and the
218
+ post-fork procedure is the same as before: call reopen() in the child,
219
+ continue on in the parent like nothing happened.
220
+
221
+ v1.0.6 Only include backports if RUBY_VERSION is 1.8.x
222
+
223
+ * 'backports' pollutes too much, use sparingly
224
+
225
+ v1.0.5 Minor cleanup
226
+
227
+ * Fix the InheritedConnectionError message
228
+
229
+ * Clean up the module includes
230
+
231
+ v1.0.3 Linux: Fix hang on reopen after fork
232
+
233
+ * Linux users relying on fork() should upgrade to 1.0.3, as it
234
+ fixes a bug in the reopen code that would cause a hang in the child.
235
+ If you're running on linux, you *really* should upgrade
236
+
237
+ v1.0.0 Single Zookeeper namespace
238
+
239
+ * The top level Zookeeper class is now a module, the former Zookeeper
240
+ class is now Zookeeper::Client
241
+
242
+ * Consolidate the 6 top-level namespaces into one, Zookeeper module
243
+
244
+ ZookeeperCommon -> Zookeeper::Common
245
+ ZookeeperCallbacks -> Zookeeper::Callbacks
246
+ ZookeeperConstants -> Zookeeper::Constants
247
+ ZookeeperExceptions -> Zookeeper::Exceptions
248
+ ZookeeperACLs -> Zookeeper::ACLs
249
+ CZookeeper -> Zookeeper::CZookeeper
250
+
251
+ * Added a 'zookeeper/compatibility' file that will define the old names
252
+ and look up the new constants for users, and print a warning telling them
253
+ the change has occurred and that they should update their code
254
+
255
+ * Added scripts/upgrade-1.0-sed-alike.rb which will basically do a
256
+ find-and-replace, changing the old names to the new names (worked on
257
+ both the Zookeeper and ZK codebases).
258
+
259
+ * Java and C now use different names for the base class, to avoid the
260
+ possibility of error. Java is now JavaBase, C remains ZookeeperBase.
261
+
262
+ * All client methods are defined in the ClientMethods module and mixed
263
+ into the constructed Client class.
264
+
265
+ * Fix all requires, no longer monkey with $LOAD_PATH, use require_relative
266
+
267
+ * Bugfix for C client.
268
+
269
+ Because we release the GIL, there's the possibilty that in the middle of a
270
+ synchronous C call, ruby will have switched thread contexts and one of
271
+ those threads will call close. It seems that during normal operation, this
272
+ is not a problem, but during shutdown, this causes CPU to spike to 100% and
273
+ a deadlock. This fix essentially wraps every call to the C layer in a
274
+ mutex. There may be a slightly less heavyweight optimization in the future,
275
+ but this is the safest option at the moment.
276
+
277
+ v0.9.3 Event thread shutdown fix, Windows compatibility fix
278
+
279
+ * Use a 'shutdown thread' to coordinate cleanup if close is called from the
280
+ event thread (prevents deadlock)
281
+
282
+ * Default Logger now uses $stderr instead of opening /dev/null [#16]
283
+
284
+ * Gemfile/gemspec/Rakefile refactoring.
285
+
286
+ v0.9.2 More efficient and simpler wrappers for GIL release
287
+
288
+ * After a code review by Andrew Wason (rectalogic), use a much simpler
289
+ technique for creating the arg structs and passing them to the
290
+ zkrb_gvl_* functions. No malloc(), no free(), no problem.
291
+
292
+ v0.9.1 see v0.8.4 notes, same patch
293
+
294
+ v0.9.0 RELEASE THE KRAK..er, GIL!!
295
+
296
+ * In >= 1.9.2 the ruby interpreter allows you to release the GIL when
297
+ calling into native code, sounds like a good idea.
298
+
299
+ This release makes use of that code by parsing the zookeeper.h header file
300
+ and extracting the method signatures of all relevant zoo_* functions, then
301
+ generating boilerplate that allows us to call those functions via the
302
+ rb_thread_blocking_region function.
303
+
304
+ 1.8.7 compatibility is maintained by stubbing out that functionality if built
305
+ under 1.8.7.
306
+
307
+ * 1.8.7 is deprecated! I will continue to support 1.8.7 for the near future
308
+ but sometime soon, you're gonna have to upgrade.
309
+
310
+ v0.8.4 fix NameError, require 'forwardable'
311
+
312
+ * Really not sure why this didn't come up in tests
313
+
314
+ * issue here https://github.com/slyphon/zk/issues/22
315
+
316
+ v0.8.3 fix NonLocalJump exception in event delivery thread shutdown code
317
+
318
+ * hit a corner case where we're waiting for the zkc handle setup
319
+ and the user decides to shutdown, but before we've had a chance
320
+ to enter the delivery loop.
321
+
322
+ * Cleaned up some nasty code in ZookeeperConstants
323
+
324
+ * removed ZookeeperConstants#print_events and ZookeeperConstants#print_states
325
+
326
+ * changed EVENT_TYPE_NAMES and EVENT_STATE_NAMES in ZookeeperConstants
327
+ to use string values instead of symbols
328
+
329
+ v0.8.2 fix close after a fork()
330
+
331
+ * The dispatch thread will be dead in this situation, so we need to
332
+ check to see if it's already dead before waiting on it to exit.
333
+
334
+ v0.8.1 Java client fix, silence warnings
335
+
336
+ v0.8.0 Refactor C implementaion, EventMachine client
337
+
338
+ * separated CZookeeper and ZookeeperBase implementation
339
+
340
+ This solves issues with reopen not working properly, makes for a much
341
+ cleaner event delivery implementation. ZookeeperBase controls the lifecycle
342
+ of the event dispatch thread now, rather than it being tied to CZookeeper.
343
+
344
+ * added support for the 'sync' API call
345
+
346
+ * Refactored zookeeper_c.c and zookeeper_lib.c
347
+
348
+ More error checking in zookeeper_lib.c and restructure some things to make
349
+ logic easier to follow
350
+
351
+ Fix bug in method_get_next_event that made the shutdown case so complicated
352
+
353
+ * Massively simplified EMClient implementation
354
+
355
+ Rather than trying to hook the IO used by zookeeper_lib to notify zookeeper_c
356
+ about event availabiltiy directly into EventMachine, use the same event delivery
357
+ thread, but wrap the dispatch call in EM.schedule.
358
+
359
+ * Improve implementation of spin-lock-esque code that waits for the connection to be
360
+ established before returning.
361
+
362
+ This cut the test runtime down from 1m 20s to 2s.
363
+
364
+ * Java client refactoring, similar correctness changes
365
+
366
+ * Change ZookeeperException base class to StandardError instead of Exception
367
+
368
+
369
+ v0.4.5 Upgrade to ZooKeeper 3.3.3
370
+
371
+ v0.4.4 Fix race condition on close, possible data corruption on async get.
372
+
373
+ v0.4.3 Fix a handful of memory-related bugs, fix SIGSEGV on master change, reduce latency of event handling, fix compilation on OSX.
374
+
375
+ v0.4.2 Add options to Zookeeper#initialize, silence most Zookeeper logs.
376
+
377
+ v0.4.1 Upgrade to ZooKeeper 3.3.2
378
+
379
+ v0.4.0. More attr-readers (StarvingMarvin) and 1.9 compatibility (tsuraan)
380
+
381
+ v0.3.2. Handle close, closed connections and expired sessions a little more gracefully.
382
+
383
+ v0.3.1. ACL bugfix.
384
+
385
+ v0.3.0. Wickman's rewrite, breaks dependencies from myelin/emaland port.
386
+
387
+ v0.2.2. Fix compatibility with stock Leopard fat-binary Ruby.
388
+
389
+ v0.2.1. No more camelcase classname.
390
+
391
+ v0.2. Bundle C dependencies, like memcached.gem.
392
+
393
+ v0.1. First release.
394
+
395
+ # vim:ft=text:ts=2:sw=2:et