zookeeper 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +2 -0
 - data/Manifest +8 -1
 - data/examples/cloud_config.rb +125 -0
 - data/ext/zookeeper_c.c +27 -27
 - data/ext/zookeeper_lib.c +7 -7
 - data/ext/zookeeper_lib.h +10 -0
 - data/lib/zookeeper/stat.rb +1 -1
 - data/zookeeper.gemspec +3 -3
 - metadata +8 -7
 
    
        data/CHANGELOG
    CHANGED
    
    
    
        data/Manifest
    CHANGED
    
    | 
         @@ -1,7 +1,9 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            CHANGELOG
         
     | 
| 
       2 
2 
     | 
    
         
             
            LICENSE
         
     | 
| 
      
 3 
     | 
    
         
            +
            Manifest
         
     | 
| 
       3 
4 
     | 
    
         
             
            README
         
     | 
| 
       4 
5 
     | 
    
         
             
            Rakefile
         
     | 
| 
      
 6 
     | 
    
         
            +
            examples/cloud_config.rb
         
     | 
| 
       5 
7 
     | 
    
         
             
            ext/extconf.rb
         
     | 
| 
       6 
8 
     | 
    
         
             
            ext/zkc-3.3.1.tar.gz
         
     | 
| 
       7 
9 
     | 
    
         
             
            ext/zookeeper_c.c
         
     | 
| 
         @@ -13,4 +15,9 @@ lib/zookeeper/callbacks.rb 
     | 
|
| 
       13 
15 
     | 
    
         
             
            lib/zookeeper/constants.rb
         
     | 
| 
       14 
16 
     | 
    
         
             
            lib/zookeeper/exceptions.rb
         
     | 
| 
       15 
17 
     | 
    
         
             
            lib/zookeeper/stat.rb
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
      
 18 
     | 
    
         
            +
            test/test_basic.rb
         
     | 
| 
      
 19 
     | 
    
         
            +
            test/test_callback1.rb
         
     | 
| 
      
 20 
     | 
    
         
            +
            test/test_close.rb
         
     | 
| 
      
 21 
     | 
    
         
            +
            test/test_esoteric.rb
         
     | 
| 
      
 22 
     | 
    
         
            +
            test/test_watcher1.rb
         
     | 
| 
      
 23 
     | 
    
         
            +
            test/test_watcher2.rb
         
     | 
| 
         @@ -0,0 +1,125 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "rubygems"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "zookeeper"
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            # A basic cloud-based YAML config library.  Ruby Zookeeper client example.
         
     | 
| 
      
 5 
     | 
    
         
            +
            #
         
     | 
| 
      
 6 
     | 
    
         
            +
            # If you pass in a file as 'zk:/foo.yml/blah' it will go out to zookeeper. 
         
     | 
| 
      
 7 
     | 
    
         
            +
            # Otherwise the file is assumed to be local.  The yml file will get parsed
         
     | 
| 
      
 8 
     | 
    
         
            +
            # and cached locally, and keys after the .yml get interpreted as keys into
         
     | 
| 
      
 9 
     | 
    
         
            +
            # the YAML.
         
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
      
 11 
     | 
    
         
            +
            # e.g. get(zk:/config/service.yml/key1/key2/key3..) => 
         
     | 
| 
      
 12 
     | 
    
         
            +
            #   zk.get(:path => /config/service.yml)
         
     | 
| 
      
 13 
     | 
    
         
            +
            #   yaml <= YAML.parse(data)
         
     | 
| 
      
 14 
     | 
    
         
            +
            #   yaml[key1][key2][key3]...
         
     | 
| 
      
 15 
     | 
    
         
            +
            #
         
     | 
| 
      
 16 
     | 
    
         
            +
            # If keys are unspecified, it returns the parsed YAML as one big object
         
     | 
| 
      
 17 
     | 
    
         
            +
            #
         
     | 
| 
      
 18 
     | 
    
         
            +
            # TODO if staleness is set to 0, read in YAML immediately before next
         
     | 
| 
      
 19 
     | 
    
         
            +
            # get(...)
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            class CloudConfig
         
     | 
| 
      
 22 
     | 
    
         
            +
              class NodeNotFound < StandardError; end
         
     | 
| 
      
 23 
     | 
    
         
            +
              class BadPathError < StandardError; end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
              DEFAULT_SERVERS = "localhost:2181"
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              def initialize(zkservers = DEFAULT_SERVERS, staleness = 15)  # maximum allowed staleness in seconds
         
     | 
| 
      
 28 
     | 
    
         
            +
                @staleness = staleness
         
     | 
| 
      
 29 
     | 
    
         
            +
                @lock      = Mutex.new
         
     | 
| 
      
 30 
     | 
    
         
            +
                @zkservers = DEFAULT_SERVERS
         
     | 
| 
      
 31 
     | 
    
         
            +
                
         
     | 
| 
      
 32 
     | 
    
         
            +
                # cache
         
     | 
| 
      
 33 
     | 
    
         
            +
                @data      = {}
         
     | 
| 
      
 34 
     | 
    
         
            +
                @zkcb      = Zookeeper::WatcherCallback.new { dirty_callback(@zkcb.context) }
         
     | 
| 
      
 35 
     | 
    
         
            +
                @zk        = nil
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              def get(node)
         
     | 
| 
      
 39 
     | 
    
         
            +
                filename, keys = extract_filename(node)
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                # read(filename) is potentially a zk call, so do not hold the lock during the read
         
     | 
| 
      
 42 
     | 
    
         
            +
                if @lock.synchronize { !@data.has_key?(filename) }
         
     | 
| 
      
 43 
     | 
    
         
            +
                  d = YAML.load(read(filename))
         
     | 
| 
      
 44 
     | 
    
         
            +
                  @lock.synchronize { @data[filename] = d }
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
                
         
     | 
| 
      
 47 
     | 
    
         
            +
                # synchronized b/c we potentially have a background thread updating data nodes from zk
         
     | 
| 
      
 48 
     | 
    
         
            +
                # if keys is empty, return the whole file, otherwise roll up the keys
         
     | 
| 
      
 49 
     | 
    
         
            +
                @lock.synchronize {
         
     | 
| 
      
 50 
     | 
    
         
            +
                  keys.empty? ? @data[filename] : keys.inject(@data[filename]) { |hash, key| hash[key] }
         
     | 
| 
      
 51 
     | 
    
         
            +
                }
         
     | 
| 
      
 52 
     | 
    
         
            +
              end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
              # todo:
         
     | 
| 
      
 55 
     | 
    
         
            +
              #   factor get-and-watch into a different subsystem (so you can have
         
     | 
| 
      
 56 
     | 
    
         
            +
              #   polling stat() ops on local filesystem.)
         
     | 
| 
      
 57 
     | 
    
         
            +
              def read(yaml)
         
     | 
| 
      
 58 
     | 
    
         
            +
                # read yaml file and register watcher.  if watcher fires, set up
         
     | 
| 
      
 59 
     | 
    
         
            +
                # background thread to do read and update data.
         
     | 
| 
      
 60 
     | 
    
         
            +
                if yaml.match(/^zk:/)
         
     | 
| 
      
 61 
     | 
    
         
            +
                  @zk ||= init_zk
         
     | 
| 
      
 62 
     | 
    
         
            +
                  yaml = yaml['zk:'.length..-1] # strip off zk: from zk:/config/path.yml
         
     | 
| 
      
 63 
     | 
    
         
            +
                  resp = get_and_register(yaml)
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                  if resp[:rc] != Zookeeper::ZOK
         
     | 
| 
      
 66 
     | 
    
         
            +
                    @zk.unregister_watcher(resp[:req_id])
         
     | 
| 
      
 67 
     | 
    
         
            +
                    raise NodeNotFound
         
     | 
| 
      
 68 
     | 
    
         
            +
                  end
         
     | 
| 
      
 69 
     | 
    
         
            +
                  
         
     | 
| 
      
 70 
     | 
    
         
            +
                  resp[:data]
         
     | 
| 
      
 71 
     | 
    
         
            +
                else
         
     | 
| 
      
 72 
     | 
    
         
            +
                  raise NodeNotFound unless File.exists?(yaml)
         
     | 
| 
      
 73 
     | 
    
         
            +
                  File.read(yaml)
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
      
 75 
     | 
    
         
            +
              end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
              def extract_filename(node)
         
     | 
| 
      
 78 
     | 
    
         
            +
                path_elements = node.split("/")
         
     | 
| 
      
 79 
     | 
    
         
            +
                
         
     | 
| 
      
 80 
     | 
    
         
            +
                yamlindex = path_elements.map{ |x| x.match("\.yml$") != nil }.index(true)
         
     | 
| 
      
 81 
     | 
    
         
            +
                raise BadPathError unless yamlindex
         
     | 
| 
      
 82 
     | 
    
         
            +
                
         
     | 
| 
      
 83 
     | 
    
         
            +
                yamlname = path_elements[0..yamlindex].join '/'
         
     | 
| 
      
 84 
     | 
    
         
            +
                yamlkeys = path_elements[(yamlindex+1)..-1]
         
     | 
| 
      
 85 
     | 
    
         
            +
                
         
     | 
| 
      
 86 
     | 
    
         
            +
                return yamlname, yamlkeys
         
     | 
| 
      
 87 
     | 
    
         
            +
              end
         
     | 
| 
      
 88 
     | 
    
         
            +
                
         
     | 
| 
      
 89 
     | 
    
         
            +
             private
         
     | 
| 
      
 90 
     | 
    
         
            +
              def init_zk
         
     | 
| 
      
 91 
     | 
    
         
            +
                Zookeeper.new(@zkservers)
         
     | 
| 
      
 92 
     | 
    
         
            +
              end
         
     | 
| 
      
 93 
     | 
    
         
            +
              
         
     | 
| 
      
 94 
     | 
    
         
            +
              def get_and_register(znode)
         
     | 
| 
      
 95 
     | 
    
         
            +
                @zk.get(:path => znode, :watcher => @zkcb,
         
     | 
| 
      
 96 
     | 
    
         
            +
                               :watcher_context => { :path => znode,
         
     | 
| 
      
 97 
     | 
    
         
            +
                                                     :wait => rand(@staleness) })
         
     | 
| 
      
 98 
     | 
    
         
            +
              end
         
     | 
| 
      
 99 
     | 
    
         
            +
              
         
     | 
| 
      
 100 
     | 
    
         
            +
              def dirty_callback(context)
         
     | 
| 
      
 101 
     | 
    
         
            +
                path = context[:path]
         
     | 
| 
      
 102 
     | 
    
         
            +
                wait = context[:wait]
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
                # Fire off a background update that waits a randomized period of time up
         
     | 
| 
      
 105 
     | 
    
         
            +
                # to @staleness seconds.
         
     | 
| 
      
 106 
     | 
    
         
            +
                Thread.new do
         
     | 
| 
      
 107 
     | 
    
         
            +
                  sleep wait
         
     | 
| 
      
 108 
     | 
    
         
            +
                  background_update(path)
         
     | 
| 
      
 109 
     | 
    
         
            +
                end
         
     | 
| 
      
 110 
     | 
    
         
            +
              end
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
              def background_update(zkpath)
         
     | 
| 
      
 113 
     | 
    
         
            +
                # do a synchronous get/register a new watcher
         
     | 
| 
      
 114 
     | 
    
         
            +
                resp = get_and_register(zkpath)
         
     | 
| 
      
 115 
     | 
    
         
            +
                if resp[:rc] != Zookeeper::ZOK
         
     | 
| 
      
 116 
     | 
    
         
            +
                  # puts "Unable to read #{zkpath} from Zookeeper!"  @logger.error
         
     | 
| 
      
 117 
     | 
    
         
            +
                  zk.unregister_watcher(resp[:req_id])
         
     | 
| 
      
 118 
     | 
    
         
            +
                else
         
     | 
| 
      
 119 
     | 
    
         
            +
                  # puts "Updating data."
         
     | 
| 
      
 120 
     | 
    
         
            +
                  d = YAML.load(resp[:data])
         
     | 
| 
      
 121 
     | 
    
         
            +
                  @lock.synchronize { @data["zk:#{zkpath}"] = d }
         
     | 
| 
      
 122 
     | 
    
         
            +
                end
         
     | 
| 
      
 123 
     | 
    
         
            +
              end
         
     | 
| 
      
 124 
     | 
    
         
            +
            end
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
    
        data/ext/zookeeper_c.c
    CHANGED
    
    | 
         @@ -75,7 +75,7 @@ static VALUE method_init(VALUE self, VALUE hostPort) { 
     | 
|
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
              zk_local_ctx->zh = 
         
     | 
| 
       77 
77 
     | 
    
         
             
                  zookeeper_init(
         
     | 
| 
       78 
     | 
    
         
            -
                       
     | 
| 
      
 78 
     | 
    
         
            +
                      RSTRING_PTR(hostPort),
         
     | 
| 
       79 
79 
     | 
    
         
             
                      zkrb_state_callback,
         
     | 
| 
       80 
80 
     | 
    
         
             
                      10000,
         
     | 
| 
       81 
81 
     | 
    
         
             
                      &zk_local_ctx->myid,
         
     | 
| 
         @@ -127,19 +127,19 @@ static VALUE method_get_children(VALUE self, VALUE reqid, VALUE path, VALUE asyn 
     | 
|
| 
       127 
127 
     | 
    
         
             
              int rc;
         
     | 
| 
       128 
128 
     | 
    
         
             
              switch (call_type) {
         
     | 
| 
       129 
129 
     | 
    
         
             
                case SYNC:
         
     | 
| 
       130 
     | 
    
         
            -
                  rc = zoo_get_children2(zk->zh,  
     | 
| 
      
 130 
     | 
    
         
            +
                  rc = zoo_get_children2(zk->zh, RSTRING_PTR(path), 0, &strings, &stat);
         
     | 
| 
       131 
131 
     | 
    
         
             
                  break;
         
     | 
| 
       132 
132 
     | 
    
         | 
| 
       133 
133 
     | 
    
         
             
                case SYNC_WATCH:
         
     | 
| 
       134 
     | 
    
         
            -
                  rc = zoo_wget_children2(zk->zh,  
     | 
| 
      
 134 
     | 
    
         
            +
                  rc = zoo_wget_children2(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, &strings, &stat);
         
     | 
| 
       135 
135 
     | 
    
         
             
                  break;
         
     | 
| 
       136 
136 
     | 
    
         | 
| 
       137 
137 
     | 
    
         
             
                case ASYNC:
         
     | 
| 
       138 
     | 
    
         
            -
                  rc = zoo_aget_children2(zk->zh,  
     | 
| 
      
 138 
     | 
    
         
            +
                  rc = zoo_aget_children2(zk->zh, RSTRING_PTR(path), 0, zkrb_strings_stat_callback, data_ctx);
         
     | 
| 
       139 
139 
     | 
    
         
             
                  break;
         
     | 
| 
       140 
140 
     | 
    
         | 
| 
       141 
141 
     | 
    
         
             
                case ASYNC_WATCH:
         
     | 
| 
       142 
     | 
    
         
            -
                  rc = zoo_awget_children2(zk->zh,  
     | 
| 
      
 142 
     | 
    
         
            +
                  rc = zoo_awget_children2(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, zkrb_strings_stat_callback, data_ctx);
         
     | 
| 
       143 
143 
     | 
    
         
             
                  break;
         
     | 
| 
       144 
144 
     | 
    
         
             
              }
         
     | 
| 
       145 
145 
     | 
    
         | 
| 
         @@ -160,19 +160,19 @@ static VALUE method_exists(VALUE self, VALUE reqid, VALUE path, VALUE async, VAL 
     | 
|
| 
       160 
160 
     | 
    
         
             
              int rc;
         
     | 
| 
       161 
161 
     | 
    
         
             
              switch (call_type) {
         
     | 
| 
       162 
162 
     | 
    
         
             
                case SYNC:
         
     | 
| 
       163 
     | 
    
         
            -
                  rc = zoo_exists(zk->zh,  
     | 
| 
      
 163 
     | 
    
         
            +
                  rc = zoo_exists(zk->zh, RSTRING_PTR(path), 0, &stat);
         
     | 
| 
       164 
164 
     | 
    
         
             
                  break;
         
     | 
| 
       165 
165 
     | 
    
         | 
| 
       166 
166 
     | 
    
         
             
                case SYNC_WATCH:
         
     | 
| 
       167 
     | 
    
         
            -
                  rc = zoo_wexists(zk->zh,  
     | 
| 
      
 167 
     | 
    
         
            +
                  rc = zoo_wexists(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, &stat);
         
     | 
| 
       168 
168 
     | 
    
         
             
                  break;
         
     | 
| 
       169 
169 
     | 
    
         | 
| 
       170 
170 
     | 
    
         
             
                case ASYNC:
         
     | 
| 
       171 
     | 
    
         
            -
                  rc = zoo_aexists(zk->zh,  
     | 
| 
      
 171 
     | 
    
         
            +
                  rc = zoo_aexists(zk->zh, RSTRING_PTR(path), 0, zkrb_stat_callback, data_ctx);
         
     | 
| 
       172 
172 
     | 
    
         
             
                  break;
         
     | 
| 
       173 
173 
     | 
    
         | 
| 
       174 
174 
     | 
    
         
             
                case ASYNC_WATCH:
         
     | 
| 
       175 
     | 
    
         
            -
                  rc = zoo_awexists(zk->zh,  
     | 
| 
      
 175 
     | 
    
         
            +
                  rc = zoo_awexists(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, zkrb_stat_callback, data_ctx);
         
     | 
| 
       176 
176 
     | 
    
         
             
                  break;
         
     | 
| 
       177 
177 
     | 
    
         
             
              }
         
     | 
| 
       178 
178 
     | 
    
         | 
| 
         @@ -191,8 +191,8 @@ static VALUE method_create(VALUE self, VALUE reqid, VALUE path, VALUE data, VALU 
     | 
|
| 
       191 
191 
     | 
    
         
             
              struct Stat stat;
         
     | 
| 
       192 
192 
     | 
    
         
             
              if (data != Qnil) Check_Type(data, T_STRING);
         
     | 
| 
       193 
193 
     | 
    
         
             
              Check_Type(flags, T_FIXNUM);
         
     | 
| 
       194 
     | 
    
         
            -
              const char *data_ptr = (data == Qnil) ? NULL :  
     | 
| 
       195 
     | 
    
         
            -
              size_t      data_len = (data == Qnil) ? -1   :  
     | 
| 
      
 194 
     | 
    
         
            +
              const char *data_ptr = (data == Qnil) ? NULL : RSTRING_PTR(data);
         
     | 
| 
      
 195 
     | 
    
         
            +
              size_t      data_len = (data == Qnil) ? -1   : RSTRING_LEN(data);
         
     | 
| 
       196 
196 
     | 
    
         | 
| 
       197 
197 
     | 
    
         
             
              struct ACL_vector *aclptr = NULL;
         
     | 
| 
       198 
198 
     | 
    
         
             
              if (acls != Qnil) { aclptr = zkrb_ruby_to_aclvector(acls); }
         
     | 
| 
         @@ -201,11 +201,11 @@ static VALUE method_create(VALUE self, VALUE reqid, VALUE path, VALUE data, VALU 
     | 
|
| 
       201 
201 
     | 
    
         
             
              int rc;
         
     | 
| 
       202 
202 
     | 
    
         
             
              switch (call_type) {
         
     | 
| 
       203 
203 
     | 
    
         
             
                case SYNC:
         
     | 
| 
       204 
     | 
    
         
            -
                  rc = zoo_create(zk->zh,  
     | 
| 
      
 204 
     | 
    
         
            +
                  rc = zoo_create(zk->zh, RSTRING_PTR(path), data_ptr, data_len, aclptr, FIX2INT(flags), realpath, sizeof(realpath));
         
     | 
| 
       205 
205 
     | 
    
         
             
                  if (aclptr != NULL) deallocate_ACL_vector(aclptr);
         
     | 
| 
       206 
206 
     | 
    
         
             
                  break;
         
     | 
| 
       207 
207 
     | 
    
         
             
                case ASYNC:
         
     | 
| 
       208 
     | 
    
         
            -
                  rc = zoo_acreate(zk->zh,  
     | 
| 
      
 208 
     | 
    
         
            +
                  rc = zoo_acreate(zk->zh, RSTRING_PTR(path), data_ptr, data_len, aclptr, FIX2INT(flags), zkrb_string_callback, data_ctx);
         
     | 
| 
       209 
209 
     | 
    
         
             
                  if (aclptr != NULL) deallocate_ACL_vector(aclptr);
         
     | 
| 
       210 
210 
     | 
    
         
             
                  break;
         
     | 
| 
       211 
211 
     | 
    
         
             
                default:
         
     | 
| 
         @@ -230,10 +230,10 @@ static VALUE method_delete(VALUE self, VALUE reqid, VALUE path, VALUE version, V 
     | 
|
| 
       230 
230 
     | 
    
         
             
              int rc = 0;
         
     | 
| 
       231 
231 
     | 
    
         
             
              switch (call_type) {
         
     | 
| 
       232 
232 
     | 
    
         
             
                case SYNC:
         
     | 
| 
       233 
     | 
    
         
            -
                  rc = zoo_delete(zk->zh,  
     | 
| 
      
 233 
     | 
    
         
            +
                  rc = zoo_delete(zk->zh, RSTRING_PTR(path), FIX2INT(version));
         
     | 
| 
       234 
234 
     | 
    
         
             
                  break;
         
     | 
| 
       235 
235 
     | 
    
         
             
                case ASYNC:
         
     | 
| 
       236 
     | 
    
         
            -
                  rc = zoo_adelete(zk->zh,  
     | 
| 
      
 236 
     | 
    
         
            +
                  rc = zoo_adelete(zk->zh, RSTRING_PTR(path), FIX2INT(version), zkrb_void_callback, data_ctx);
         
     | 
| 
       237 
237 
     | 
    
         
             
                  break;
         
     | 
| 
       238 
238 
     | 
    
         
             
                default:
         
     | 
| 
       239 
239 
     | 
    
         
             
                  /* TODO(wickman) raise proper argument error */
         
     | 
| 
         @@ -258,19 +258,19 @@ static VALUE method_get(VALUE self, VALUE reqid, VALUE path, VALUE async, VALUE 
     | 
|
| 
       258 
258 
     | 
    
         | 
| 
       259 
259 
     | 
    
         
             
              switch (call_type) {
         
     | 
| 
       260 
260 
     | 
    
         
             
                case SYNC:
         
     | 
| 
       261 
     | 
    
         
            -
                  rc = zoo_get(zk->zh,  
     | 
| 
      
 261 
     | 
    
         
            +
                  rc = zoo_get(zk->zh, RSTRING_PTR(path), 0, data, &data_len, &stat);
         
     | 
| 
       262 
262 
     | 
    
         
             
                  break;
         
     | 
| 
       263 
263 
     | 
    
         | 
| 
       264 
264 
     | 
    
         
             
                case SYNC_WATCH:
         
     | 
| 
       265 
     | 
    
         
            -
                  rc = zoo_wget(zk->zh,  
     | 
| 
      
 265 
     | 
    
         
            +
                  rc = zoo_wget(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, data, &data_len, &stat);
         
     | 
| 
       266 
266 
     | 
    
         
             
                  break;
         
     | 
| 
       267 
267 
     | 
    
         | 
| 
       268 
268 
     | 
    
         
             
                case ASYNC:
         
     | 
| 
       269 
     | 
    
         
            -
                  rc = zoo_aget(zk->zh,  
     | 
| 
      
 269 
     | 
    
         
            +
                  rc = zoo_aget(zk->zh, RSTRING_PTR(path), 0, zkrb_data_callback, data_ctx);
         
     | 
| 
       270 
270 
     | 
    
         
             
                  break;
         
     | 
| 
       271 
271 
     | 
    
         | 
| 
       272 
272 
     | 
    
         
             
                case ASYNC_WATCH:
         
     | 
| 
       273 
     | 
    
         
            -
                  rc = zoo_awget(zk->zh,  
     | 
| 
      
 273 
     | 
    
         
            +
                  rc = zoo_awget(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, zkrb_data_callback, data_ctx);
         
     | 
| 
       274 
274 
     | 
    
         
             
                  break;
         
     | 
| 
       275 
275 
     | 
    
         
             
              }
         
     | 
| 
       276 
276 
     | 
    
         | 
| 
         @@ -291,16 +291,16 @@ static VALUE method_set(VALUE self, VALUE reqid, VALUE path, VALUE data, VALUE a 
     | 
|
| 
       291 
291 
     | 
    
         | 
| 
       292 
292 
     | 
    
         
             
              struct Stat stat;
         
     | 
| 
       293 
293 
     | 
    
         
             
              if (data != Qnil) Check_Type(data, T_STRING);
         
     | 
| 
       294 
     | 
    
         
            -
              const char *data_ptr = (data == Qnil) ? NULL :  
     | 
| 
       295 
     | 
    
         
            -
              size_t      data_len = (data == Qnil) ? -1   :  
     | 
| 
      
 294 
     | 
    
         
            +
              const char *data_ptr = (data == Qnil) ? NULL : RSTRING_PTR(data);
         
     | 
| 
      
 295 
     | 
    
         
            +
              size_t      data_len = (data == Qnil) ? -1   : RSTRING_LEN(data);
         
     | 
| 
       296 
296 
     | 
    
         | 
| 
       297 
297 
     | 
    
         
             
              int rc;
         
     | 
| 
       298 
298 
     | 
    
         
             
              switch (call_type) {
         
     | 
| 
       299 
299 
     | 
    
         
             
                case SYNC:
         
     | 
| 
       300 
     | 
    
         
            -
                  rc = zoo_set2(zk->zh,  
     | 
| 
      
 300 
     | 
    
         
            +
                  rc = zoo_set2(zk->zh, RSTRING_PTR(path), data_ptr, data_len, FIX2INT(version), &stat);
         
     | 
| 
       301 
301 
     | 
    
         
             
                  break;
         
     | 
| 
       302 
302 
     | 
    
         
             
                case ASYNC:
         
     | 
| 
       303 
     | 
    
         
            -
                  rc = zoo_aset(zk->zh,  
     | 
| 
      
 303 
     | 
    
         
            +
                  rc = zoo_aset(zk->zh, RSTRING_PTR(path), data_ptr, data_len, FIX2INT(version),
         
     | 
| 
       304 
304 
     | 
    
         
             
                                        zkrb_stat_callback, data_ctx);
         
     | 
| 
       305 
305 
     | 
    
         
             
                  break;
         
     | 
| 
       306 
306 
     | 
    
         
             
                default:
         
     | 
| 
         @@ -325,11 +325,11 @@ static VALUE method_set_acl(VALUE self, VALUE reqid, VALUE path, VALUE acls, VAL 
     | 
|
| 
       325 
325 
     | 
    
         
             
              int rc;
         
     | 
| 
       326 
326 
     | 
    
         
             
              switch (call_type) {
         
     | 
| 
       327 
327 
     | 
    
         
             
                case SYNC:
         
     | 
| 
       328 
     | 
    
         
            -
                  rc = zoo_set_acl(zk->zh,  
     | 
| 
      
 328 
     | 
    
         
            +
                  rc = zoo_set_acl(zk->zh, RSTRING_PTR(path), FIX2INT(version), aclptr);
         
     | 
| 
       329 
329 
     | 
    
         
             
                  deallocate_ACL_vector(aclptr);
         
     | 
| 
       330 
330 
     | 
    
         
             
                  break;
         
     | 
| 
       331 
331 
     | 
    
         
             
                case ASYNC:
         
     | 
| 
       332 
     | 
    
         
            -
                  rc = zoo_aset_acl(zk->zh,  
     | 
| 
      
 332 
     | 
    
         
            +
                  rc = zoo_aset_acl(zk->zh, RSTRING_PTR(path), FIX2INT(version), aclptr, zkrb_void_callback, data_ctx);
         
     | 
| 
       333 
333 
     | 
    
         
             
                  deallocate_ACL_vector(aclptr);
         
     | 
| 
       334 
334 
     | 
    
         
             
                  break;
         
     | 
| 
       335 
335 
     | 
    
         
             
                default:
         
     | 
| 
         @@ -351,10 +351,10 @@ static VALUE method_get_acl(VALUE self, VALUE reqid, VALUE path, VALUE async) { 
     | 
|
| 
       351 
351 
     | 
    
         
             
              int rc;
         
     | 
| 
       352 
352 
     | 
    
         
             
              switch (call_type) {
         
     | 
| 
       353 
353 
     | 
    
         
             
                case SYNC:
         
     | 
| 
       354 
     | 
    
         
            -
                  rc = zoo_get_acl(zk->zh,  
     | 
| 
      
 354 
     | 
    
         
            +
                  rc = zoo_get_acl(zk->zh, RSTRING_PTR(path), &acls, &stat);
         
     | 
| 
       355 
355 
     | 
    
         
             
                  break;
         
     | 
| 
       356 
356 
     | 
    
         
             
                case ASYNC:
         
     | 
| 
       357 
     | 
    
         
            -
                  rc = zoo_aget_acl(zk->zh,  
     | 
| 
      
 357 
     | 
    
         
            +
                  rc = zoo_aget_acl(zk->zh, RSTRING_PTR(path), zkrb_acl_callback, data_ctx);
         
     | 
| 
       358 
358 
     | 
    
         
             
                  break;
         
     | 
| 
       359 
359 
     | 
    
         
             
                default:
         
     | 
| 
       360 
360 
     | 
    
         
             
                  /* TODO(wickman) raise proper argument error */
         
     | 
    
        data/ext/zookeeper_lib.c
    CHANGED
    
    | 
         @@ -411,7 +411,7 @@ struct ACL_vector * zkrb_ruby_to_aclvector(VALUE acl_ary) { 
     | 
|
| 
       411 
411 
     | 
    
         
             
              Check_Type(acl_ary, T_ARRAY);
         
     | 
| 
       412 
412 
     | 
    
         | 
| 
       413 
413 
     | 
    
         
             
              struct ACL_vector *v = malloc(sizeof(struct ACL_vector));
         
     | 
| 
       414 
     | 
    
         
            -
              allocate_ACL_vector(v,  
     | 
| 
      
 414 
     | 
    
         
            +
              allocate_ACL_vector(v, RARRAY_LEN(acl_ary));
         
     | 
| 
       415 
415 
     | 
    
         | 
| 
       416 
416 
     | 
    
         
             
              int k;
         
     | 
| 
       417 
417 
     | 
    
         
             
              for (k = 0; k < v->count; ++k) {
         
     | 
| 
         @@ -442,17 +442,17 @@ struct Id zkrb_ruby_to_id(VALUE rubyid) { 
     | 
|
| 
       442 
442 
     | 
    
         
             
              VALUE ident  = rb_iv_get(rubyid, "@id");
         
     | 
| 
       443 
443 
     | 
    
         | 
| 
       444 
444 
     | 
    
         
             
              if (scheme != Qnil) {
         
     | 
| 
       445 
     | 
    
         
            -
                id.scheme = malloc( 
     | 
| 
       446 
     | 
    
         
            -
                strncpy(id.scheme,  
     | 
| 
       447 
     | 
    
         
            -
                id.scheme[ 
     | 
| 
      
 445 
     | 
    
         
            +
                id.scheme = malloc(RSTRING_LEN(scheme) + 1);
         
     | 
| 
      
 446 
     | 
    
         
            +
                strncpy(id.scheme, RSTRING_PTR(scheme), RSTRING_LEN(scheme));
         
     | 
| 
      
 447 
     | 
    
         
            +
                id.scheme[RSTRING_LEN(scheme)] = '\0';
         
     | 
| 
       448 
448 
     | 
    
         
             
              } else {
         
     | 
| 
       449 
449 
     | 
    
         
             
                id.scheme = NULL;
         
     | 
| 
       450 
450 
     | 
    
         
             
              }
         
     | 
| 
       451 
451 
     | 
    
         | 
| 
       452 
452 
     | 
    
         
             
              if (ident != Qnil) {
         
     | 
| 
       453 
     | 
    
         
            -
                id.id     = malloc( 
     | 
| 
       454 
     | 
    
         
            -
                strncpy(id.id,  
     | 
| 
       455 
     | 
    
         
            -
                id.id[ 
     | 
| 
      
 453 
     | 
    
         
            +
                id.id     = malloc(RSTRING_LEN(ident) + 1);
         
     | 
| 
      
 454 
     | 
    
         
            +
                strncpy(id.id, RSTRING_PTR(ident), RSTRING_LEN(ident));
         
     | 
| 
      
 455 
     | 
    
         
            +
                id.id[RSTRING_LEN(ident)] = '\0';
         
     | 
| 
       456 
456 
     | 
    
         
             
              } else {
         
     | 
| 
       457 
457 
     | 
    
         
             
                id.id = NULL;
         
     | 
| 
       458 
458 
     | 
    
         
             
              }
         
     | 
    
        data/ext/zookeeper_lib.h
    CHANGED
    
    | 
         @@ -11,6 +11,16 @@ 
     | 
|
| 
       11 
11 
     | 
    
         
             
            #define ZK_FALSE 0
         
     | 
| 
       12 
12 
     | 
    
         
             
            #define ZKRB_GLOBAL_REQ -1
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
      
 14 
     | 
    
         
            +
            #ifndef RSTRING_LEN
         
     | 
| 
      
 15 
     | 
    
         
            +
            # define RSTRING_LEN(x) RSTRING(x)->len
         
     | 
| 
      
 16 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 17 
     | 
    
         
            +
            #ifndef RSTRING_PTR
         
     | 
| 
      
 18 
     | 
    
         
            +
            # define RSTRING_PTR(x) RSTRING(x)->ptr
         
     | 
| 
      
 19 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 20 
     | 
    
         
            +
            #ifndef RARRAY_LEN
         
     | 
| 
      
 21 
     | 
    
         
            +
            # define RARRAY_LEN(x) RARRAY(x)->len
         
     | 
| 
      
 22 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
       14 
24 
     | 
    
         
             
            extern int ZKRBDebugging;
         
     | 
| 
       15 
25 
     | 
    
         | 
| 
       16 
26 
     | 
    
         
             
            struct zkrb_data_completion {
         
     | 
    
        data/lib/zookeeper/stat.rb
    CHANGED
    
    | 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module ZookeeperStat
         
     | 
| 
       2 
2 
     | 
    
         
             
              class Stat
         
     | 
| 
       3 
     | 
    
         
            -
                attr_reader :version, :exists
         
     | 
| 
      
 3 
     | 
    
         
            +
                attr_reader :version, :exists, :czxid, :mzxid, :ctime, :mtime, :cverzion, :aversion, :ephemeralOwner, :dataLength, :numChildren, :pzxid
         
     | 
| 
       4 
4 
     | 
    
         
             
                def initialize(val)
         
     | 
| 
       5 
5 
     | 
    
         
             
                  @exists = !!val
         
     | 
| 
       6 
6 
     | 
    
         
             
                  @czxid, @mzxid, @ctime, @mtime, @version, @cversion, @aversion,
         
     | 
    
        data/zookeeper.gemspec
    CHANGED
    
    | 
         @@ -2,16 +2,16 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            Gem::Specification.new do |s|
         
     | 
| 
       4 
4 
     | 
    
         
             
              s.name = %q{zookeeper}
         
     | 
| 
       5 
     | 
    
         
            -
              s.version = "0. 
     | 
| 
      
 5 
     | 
    
         
            +
              s.version = "0.4.0"
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
              s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
         
     | 
| 
       8 
8 
     | 
    
         
             
              s.authors = ["Phillip Pearson, Eric Maland, Evan Weaver, Brian Wickman"]
         
     | 
| 
       9 
     | 
    
         
            -
              s.date = %q{2010- 
     | 
| 
      
 9 
     | 
    
         
            +
              s.date = %q{2010-12-01}
         
     | 
| 
       10 
10 
     | 
    
         
             
              s.description = %q{An interface to the Zookeeper distributed configuration server.}
         
     | 
| 
       11 
11 
     | 
    
         
             
              s.email = %q{}
         
     | 
| 
       12 
12 
     | 
    
         
             
              s.extensions = ["ext/extconf.rb"]
         
     | 
| 
       13 
13 
     | 
    
         
             
              s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "ext/zookeeper_c.c", "lib/zookeeper.rb"]
         
     | 
| 
       14 
     | 
    
         
            -
              s.files = ["CHANGELOG", "LICENSE", "README", "Rakefile", "ext/extconf.rb", "ext/zkc-3.3.1.tar.gz", "ext/zookeeper_c.c", "ext/zookeeper_lib.c", "ext/zookeeper_lib.h", "lib/zookeeper.rb", "lib/zookeeper/acls.rb", "lib/zookeeper/callbacks.rb", "lib/zookeeper/constants.rb", "lib/zookeeper/exceptions.rb", "lib/zookeeper/stat.rb", " 
     | 
| 
      
 14 
     | 
    
         
            +
              s.files = ["CHANGELOG", "LICENSE", "README", "Rakefile", "examples/cloud_config.rb", "ext/extconf.rb", "ext/zkc-3.3.1.tar.gz", "ext/zookeeper_c.c", "ext/zookeeper_lib.c", "ext/zookeeper_lib.h", "lib/zookeeper.rb", "lib/zookeeper/acls.rb", "lib/zookeeper/callbacks.rb", "lib/zookeeper/constants.rb", "lib/zookeeper/exceptions.rb", "lib/zookeeper/stat.rb", "test/test_basic.rb", "test/test_callback1.rb", "test/test_close.rb", "test/test_esoteric.rb", "test/test_watcher1.rb", "test/test_watcher2.rb", "Manifest", "zookeeper.gemspec"]
         
     | 
| 
       15 
15 
     | 
    
         
             
              s.homepage = %q{http://blog.evanweaver.com/files/doc/fauna/zookeeper/}
         
     | 
| 
       16 
16 
     | 
    
         
             
              s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Zookeeper", "--main", "README"]
         
     | 
| 
       17 
17 
     | 
    
         
             
              s.require_paths = ["lib", "ext"]
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,13 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: zookeeper
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       4 
     | 
    
         
            -
              hash:  
     | 
| 
      
 4 
     | 
    
         
            +
              hash: 15
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       6 
6 
     | 
    
         
             
              segments: 
         
     | 
| 
       7 
7 
     | 
    
         
             
              - 0
         
     | 
| 
       8 
     | 
    
         
            -
              -  
     | 
| 
       9 
     | 
    
         
            -
              -  
     | 
| 
       10 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 8 
     | 
    
         
            +
              - 4
         
     | 
| 
      
 9 
     | 
    
         
            +
              - 0
         
     | 
| 
      
 10 
     | 
    
         
            +
              version: 0.4.0
         
     | 
| 
       11 
11 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       12 
12 
     | 
    
         
             
            authors: 
         
     | 
| 
       13 
13 
     | 
    
         
             
            - Phillip Pearson, Eric Maland, Evan Weaver, Brian Wickman
         
     | 
| 
         @@ -15,7 +15,7 @@ autorequire: 
     | 
|
| 
       15 
15 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       16 
16 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
            date: 2010- 
     | 
| 
      
 18 
     | 
    
         
            +
            date: 2010-12-01 00:00:00 -08:00
         
     | 
| 
       19 
19 
     | 
    
         
             
            default_executable: 
         
     | 
| 
       20 
20 
     | 
    
         
             
            dependencies: []
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
         @@ -36,6 +36,7 @@ files: 
     | 
|
| 
       36 
36 
     | 
    
         
             
            - LICENSE
         
     | 
| 
       37 
37 
     | 
    
         
             
            - README
         
     | 
| 
       38 
38 
     | 
    
         
             
            - Rakefile
         
     | 
| 
      
 39 
     | 
    
         
            +
            - examples/cloud_config.rb
         
     | 
| 
       39 
40 
     | 
    
         
             
            - ext/extconf.rb
         
     | 
| 
       40 
41 
     | 
    
         
             
            - ext/zkc-3.3.1.tar.gz
         
     | 
| 
       41 
42 
     | 
    
         
             
            - ext/zookeeper_c.c
         
     | 
| 
         @@ -47,14 +48,14 @@ files: 
     | 
|
| 
       47 
48 
     | 
    
         
             
            - lib/zookeeper/constants.rb
         
     | 
| 
       48 
49 
     | 
    
         
             
            - lib/zookeeper/exceptions.rb
         
     | 
| 
       49 
50 
     | 
    
         
             
            - lib/zookeeper/stat.rb
         
     | 
| 
       50 
     | 
    
         
            -
            - Manifest
         
     | 
| 
       51 
     | 
    
         
            -
            - zookeeper.gemspec
         
     | 
| 
       52 
51 
     | 
    
         
             
            - test/test_basic.rb
         
     | 
| 
       53 
52 
     | 
    
         
             
            - test/test_callback1.rb
         
     | 
| 
       54 
53 
     | 
    
         
             
            - test/test_close.rb
         
     | 
| 
       55 
54 
     | 
    
         
             
            - test/test_esoteric.rb
         
     | 
| 
       56 
55 
     | 
    
         
             
            - test/test_watcher1.rb
         
     | 
| 
       57 
56 
     | 
    
         
             
            - test/test_watcher2.rb
         
     | 
| 
      
 57 
     | 
    
         
            +
            - Manifest
         
     | 
| 
      
 58 
     | 
    
         
            +
            - zookeeper.gemspec
         
     | 
| 
       58 
59 
     | 
    
         
             
            has_rdoc: true
         
     | 
| 
       59 
60 
     | 
    
         
             
            homepage: http://blog.evanweaver.com/files/doc/fauna/zookeeper/
         
     | 
| 
       60 
61 
     | 
    
         
             
            licenses: []
         
     |