37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/fdblocality.rb', line 37
def self.get_boundary_keys(db_or_tr, bkey, ekey)
bkey = FDB.key_to_bytes(bkey).dup.force_encoding('BINARY')
ekey = FDB.key_to_bytes(ekey).dup.force_encoding('BINARY')
if db_or_tr.is_a? Transaction
tr = db_or_tr.db.create_transaction
tr.set_read_version db_or_tr.get_read_version
else
tr = db_or_tr.create_transaction
end
tr.options.set_read_system_keys
tr.options.set_lock_aware
lastbkey = bkey
kvs = tr.snapshot.get_range("\xff/keyServers/"+bkey, "\xff/keyServers/"+ekey)
y = Enumerator.new do |yielder|
_tr = tr
_bkey = bkey
_ekey = ekey
_lastbkey = lastbkey
_kvs = kvs
while _bkey < _ekey
begin
_kvs.each do |kv|
yielder.yield kv.key.byteslice(13..-1)
_bkey = kv.key.byteslice(13..-1) + "\x00"
end
_bkey = _ekey
rescue FDB::Error => e
if e.code == 1007 and _bkey != _lastbkey _tr = _tr.db.create_transaction
else
_tr.on_error(e).wait
end
_tr.options.set_read_system_keys
_lastbkey = _bkey
_kvs = _tr.snapshot.get_range("\xff/keyServers/" + _bkey, "\xff/keyServers/" + _ekey)
end
end
end
return y
end
|