Class: DCell::Registry::ZkAdapter::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/dcell/registries/zk_adapter.rb

Instance Method Summary collapse

Constructor Details

#initialize(zk, base_path, name, ephemeral) ⇒ Registry

Returns a new instance of Registry.



44
45
46
47
48
49
50
# File 'lib/dcell/registries/zk_adapter.rb', line 44

def initialize(zk, base_path, name, ephemeral)
  @zk = zk
  @base_path = File.join(base_path, name.to_s)
  @ephemeral = ephemeral
  @zk.mkdir_p @base_path
  @events = {}
end

Instance Method Details

#allObject



86
87
88
# File 'lib/dcell/registries/zk_adapter.rb', line 86

def all
  @zk.children @base_path
end

#clear_allObject



97
98
99
100
101
102
103
104
105
106
107
# File 'lib/dcell/registries/zk_adapter.rb', line 97

def clear_all
  # delete znodes so any registered
  # callback is triggered
  all.each do |key|
    remove key
  end
  @events.values.compact.each(&:unsubscribe)
  @events.clear
  @zk.rm_rf @base_path
  @zk.mkdir_p @base_path
end

#get(key) ⇒ Object



70
71
72
73
74
75
# File 'lib/dcell/registries/zk_adapter.rb', line 70

def get(key)
  register(key)
  result, _ = @zk.get("#{@base_path}/#{key}", watch: true)
  Marshal.load result
rescue ZK::Exceptions::NoNode
end

#register(key) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/dcell/registries/zk_adapter.rb', line 52

def register(key)
  path = "#{@base_path}/#{key}"
  @events[path] ||= @zk.register(path) do |event|
    key = event.path.match(/#{@base_path}\/(\w+)/)[1]
    @events[event.path].unsubscribe
    @events[event.path] = nil
    if event.node_changed?
      Celluloid::logger.debug "zk callback: node changed!"
      Node.update(key)
    end
    if event.node_deleted?
      Celluloid::logger.debug "zk callback: node deleted!"
      Node.remove(key)
    end

  end
end

#remove(key) ⇒ Object



90
91
92
93
94
95
# File 'lib/dcell/registries/zk_adapter.rb', line 90

def remove(key)
  keys.each do |key|
    path = "#{@base_path}/#{key}"
    @zk.delete path
  end
end

#set(key, value) ⇒ Object



77
78
79
80
81
82
83
84
# File 'lib/dcell/registries/zk_adapter.rb', line 77

def set(key, value)
  register(key)
  path = "#{@base_path}/#{key}"
  string = Marshal.dump value
  @zk.set path, string
rescue ZK::Exceptions::NoNode
  @zk.create path, string, :ephemeral => @ephemeral
end