Sha256: fd431bbc40e776e2beef78ed3518ebb2e22bb381463c2a07338051d0befa454f
Contents?: true
Size: 1.4 KB
Versions: 1
Compression:
Stored size: 1.4 KB
Contents
module Zoology class PathCache require 'zoology/path_cache/watcher' include Logging def initialize(client, path, &callback) @client = client @watches = {} @watcher = nil @path = path @callback = callback @client.on_connected do |_event| if @sleep logger.debug "Sleeping for #{@sleep}s to avoid thundering herd" sleep(@sleep) if @sleep end watch_paths end @client.on_expired do |_event| @watches.each { |_path, watcher| watcher.shutdown } @watches = {} @sleep = rand(10) end if @client.connected? watch_paths end end private def watch_paths watcher = lambda do |_wpath, type, req| if type == :update update_watches(req[:children]) if req[:rc] == Zookeeper::ZOK else @client.when_path(@path) { watch_paths } end end @watcher = Watcher.new(@client, @path, :get_children, &watcher) @watcher.watch end def update_watches(children) paths = children.map { |child| File.join(@path, child) } (paths - @watches.keys).each do |path| @watches[path] = Watcher.new(@client, path, &@callback) end (@watches.keys - paths).each do |path| @watches.delete(path).shutdown end @watches.each { |_name, watcher| watcher.watch } end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
zoology-0.1 | lib/zoology/path_cache.rb |