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