95 lines
1.9 KiB
Ruby
95 lines
1.9 KiB
Ruby
|
#
|
||
|
# A dictionary server using Distributed Ruby (DRb).
|
||
|
#
|
||
|
# All modifications to the dictionary are done as commands,
|
||
|
# while read-only queries (i.e 'lookup') are done directly.
|
||
|
#
|
||
|
# First launch this server in the background, then use
|
||
|
# dictionary_client.rb to look up and add items to the
|
||
|
# dictionary.
|
||
|
# You can kill the server at any time. The contents of the
|
||
|
# dictionary will still be there when you restart it.
|
||
|
#
|
||
|
# DRb is available at http://raa.ruby-lang.org/list.rhtml?name=druby
|
||
|
#
|
||
|
|
||
|
$LOAD_PATH.unshift(".." + File::SEPARATOR + "lib")
|
||
|
require 'madeleine'
|
||
|
|
||
|
require 'drb'
|
||
|
|
||
|
|
||
|
class Dictionary
|
||
|
def initialize
|
||
|
@data = {}
|
||
|
end
|
||
|
|
||
|
def add(key, value)
|
||
|
@data[key] = value
|
||
|
end
|
||
|
|
||
|
def lookup(key)
|
||
|
@data[key]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
class Addition
|
||
|
def initialize(key, value)
|
||
|
@key, @value = key, value
|
||
|
end
|
||
|
|
||
|
def execute(system)
|
||
|
system.add(@key, @value)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
class Lookup
|
||
|
def initialize(key)
|
||
|
@key = key
|
||
|
end
|
||
|
|
||
|
def execute(system)
|
||
|
system.lookup(@key)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
class DictionaryServer
|
||
|
|
||
|
def initialize(madeleine)
|
||
|
@madeleine = madeleine
|
||
|
@dictionary = madeleine.system
|
||
|
end
|
||
|
|
||
|
def add(key, value)
|
||
|
# When adding a new key-value pair we modify the system, so
|
||
|
# this operation has to be done through a command.
|
||
|
@madeleine.execute_command(Addition.new(key, value))
|
||
|
end
|
||
|
|
||
|
def lookup(key)
|
||
|
# A lookup is a read-only operation, so we can do it as a non-logged
|
||
|
# query. If we weren't worried about concurrency problems we could
|
||
|
# have just called @dictionary.lookup(key) directly instead.
|
||
|
@madeleine.execute_query(Lookup.new(key))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
madeleine = SnapshotMadeleine.new("dictionary-base") { Dictionary.new }
|
||
|
|
||
|
Thread.new(madeleine) {
|
||
|
puts "Taking snapshot every 30 seconds."
|
||
|
while true
|
||
|
sleep(30)
|
||
|
madeleine.take_snapshot
|
||
|
end
|
||
|
}
|
||
|
|
||
|
DRb.start_service("druby://localhost:1234",
|
||
|
DictionaryServer.new(madeleine))
|
||
|
DRb.thread.join
|
||
|
|