higgs 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +103 -0
- data/Rakefile +9 -2
- data/bin/higgs_apply_jlog +35 -0
- data/bin/higgs_backup +5 -3
- data/bin/higgs_dump_jlog +25 -9
- data/bin/higgs_ping +46 -0
- data/lib/higgs/block.rb +14 -22
- data/lib/higgs/cache.rb +5 -5
- data/lib/higgs/dbm.rb +8 -24
- data/lib/higgs/index.rb +25 -5
- data/lib/higgs/jlog.rb +4 -8
- data/lib/higgs/lock.rb +33 -11
- data/lib/higgs/services.rb +65 -0
- data/lib/higgs/sman.rb +98 -0
- data/lib/higgs/storage.rb +263 -133
- data/lib/higgs/store.rb +8 -24
- data/lib/higgs/thread.rb +9 -9
- data/lib/higgs/tman.rb +66 -21
- data/lib/higgs/utils/bman.rb +40 -20
- data/lib/higgs/version.rb +4 -4
- data/lib/higgs.rb +4 -4
- data/test/test_block.rb +2 -2
- data/test/test_cache.rb +4 -4
- data/test/test_index.rb +17 -5
- data/test/test_jlog.rb +4 -2
- data/test/test_lock.rb +92 -5
- data/test/test_online_backup.rb +19 -10
- data/test/test_replication.rb +468 -0
- data/test/test_services.rb +125 -0
- data/test/test_storage.rb +338 -16
- data/test/test_storage_conf.rb +1 -9
- data/test/test_storage_init_opts.rb +1 -9
- data/test/test_thread.rb +7 -7
- data/test/test_tman.rb +205 -15
- data/test/test_utils_bman.rb +66 -62
- metadata +10 -2
data/lib/higgs/store.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
# = storage like pstore
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-10-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-10-24 00:46:00 +0900 (Wed, 24 Oct 2007) $
|
5
|
+
# Revision:: $Revision: 653 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
9
9
|
#
|
10
10
|
|
11
|
-
require 'higgs/
|
12
|
-
require 'higgs/tman'
|
11
|
+
require 'higgs/sman'
|
13
12
|
|
14
13
|
module Higgs
|
15
14
|
# = storage like pstore
|
@@ -217,34 +216,19 @@ module Higgs
|
|
217
216
|
# 1000
|
218
217
|
# %
|
219
218
|
#
|
220
|
-
class Store
|
219
|
+
class Store < StorageManager
|
221
220
|
# for ident(1)
|
222
|
-
CVS_ID = '$Id: store.rb
|
223
|
-
|
224
|
-
include Storage::Export
|
225
|
-
include TransactionManager::Export
|
221
|
+
CVS_ID = '$Id: store.rb 653 2007-10-23 15:46:00Z toki $'
|
226
222
|
|
227
223
|
DECODE = proc{|r| Marshal.load(r) }
|
228
224
|
ENCODE = proc{|w| Marshal.dump(w) }
|
229
225
|
|
230
|
-
# <tt>name</tt>
|
231
|
-
# detail. see Higgs::Storage::InitOptions and
|
232
|
-
# Higgs::TransactionManager::InitOptions for <tt>options</tt>.
|
226
|
+
# see Higgs::StorageManager.new for <tt>name</tt> and <tt>options</tt>.
|
233
227
|
def initialize(name, options={})
|
228
|
+
options = options.dup
|
234
229
|
options[:decode] = DECODE
|
235
230
|
options[:encode] = ENCODE
|
236
|
-
|
237
|
-
@tman = TransactionManager.new(@storage, options)
|
238
|
-
end
|
239
|
-
|
240
|
-
def self.open(*args)
|
241
|
-
store = new(*args)
|
242
|
-
begin
|
243
|
-
r = yield(store)
|
244
|
-
ensure
|
245
|
-
store.shutdown
|
246
|
-
end
|
247
|
-
r
|
231
|
+
super(name, options)
|
248
232
|
end
|
249
233
|
end
|
250
234
|
end
|
data/lib/higgs/thread.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# = multi-thread utilities
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-10-31 00:36:09 +0900 (Wed, 31 Oct 2007) $
|
5
|
+
# Revision:: $Revision: 659 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
@@ -15,7 +15,7 @@ require 'thread'
|
|
15
15
|
module Higgs
|
16
16
|
class Latch
|
17
17
|
# for ident(1)
|
18
|
-
CVS_ID = '$Id: thread.rb
|
18
|
+
CVS_ID = '$Id: thread.rb 659 2007-10-30 15:36:09Z toki $'
|
19
19
|
|
20
20
|
def initialize
|
21
21
|
@lock = Mutex.new
|
@@ -43,7 +43,7 @@ module Higgs
|
|
43
43
|
|
44
44
|
class CountDownLatch
|
45
45
|
# for ident(1)
|
46
|
-
CVS_ID = '$Id: thread.rb
|
46
|
+
CVS_ID = '$Id: thread.rb 659 2007-10-30 15:36:09Z toki $'
|
47
47
|
|
48
48
|
def initialize(count)
|
49
49
|
@count = count
|
@@ -73,7 +73,7 @@ module Higgs
|
|
73
73
|
|
74
74
|
class Barrier
|
75
75
|
# for ident(1)
|
76
|
-
CVS_ID = '$Id: thread.rb
|
76
|
+
CVS_ID = '$Id: thread.rb 659 2007-10-30 15:36:09Z toki $'
|
77
77
|
|
78
78
|
def initialize(count)
|
79
79
|
@count = count
|
@@ -102,11 +102,11 @@ module Higgs
|
|
102
102
|
|
103
103
|
class SharedWork
|
104
104
|
# for ident(1)
|
105
|
-
CVS_ID = '$Id: thread.rb
|
105
|
+
CVS_ID = '$Id: thread.rb 659 2007-10-30 15:36:09Z toki $'
|
106
106
|
|
107
107
|
def initialize(&work)
|
108
108
|
unless (work) then
|
109
|
-
raise 'required work block'
|
109
|
+
raise ArgumentError, 'required work block'
|
110
110
|
end
|
111
111
|
@work = work
|
112
112
|
@lock = Mutex.new
|
@@ -158,7 +158,7 @@ module Higgs
|
|
158
158
|
|
159
159
|
class ReadWriteLock
|
160
160
|
# for ident(1)
|
161
|
-
CVS_ID = '$Id: thread.rb
|
161
|
+
CVS_ID = '$Id: thread.rb 659 2007-10-30 15:36:09Z toki $'
|
162
162
|
|
163
163
|
def initialize
|
164
164
|
@lock = Mutex.new
|
@@ -295,7 +295,7 @@ module Higgs
|
|
295
295
|
|
296
296
|
class Pool
|
297
297
|
# for ident(1)
|
298
|
-
CVS_ID = '$Id: thread.rb
|
298
|
+
CVS_ID = '$Id: thread.rb 659 2007-10-30 15:36:09Z toki $'
|
299
299
|
|
300
300
|
class ShutdownException < Exceptions::ShutdownException
|
301
301
|
end
|
data/lib/higgs/tman.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
# = transaction manager
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-11-06 00:55:14 +0900 (Tue, 06 Nov 2007) $
|
5
|
+
# Revision:: $Revision: 674 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
9
9
|
#
|
10
10
|
|
11
|
-
require 'forwardable'
|
12
11
|
require 'higgs/cache'
|
13
12
|
require 'higgs/exceptions'
|
14
13
|
require 'higgs/lock'
|
@@ -18,7 +17,7 @@ require 'singleton'
|
|
18
17
|
module Higgs
|
19
18
|
class TransactionManager
|
20
19
|
# for ident(1)
|
21
|
-
CVS_ID = '$Id: tman.rb
|
20
|
+
CVS_ID = '$Id: tman.rb 674 2007-11-05 15:55:14Z toki $'
|
22
21
|
|
23
22
|
include Exceptions
|
24
23
|
|
@@ -47,6 +46,10 @@ module Higgs
|
|
47
46
|
# these options are defined.
|
48
47
|
# [<tt>:read_only</tt>] if <tt>true</tt> then transaction is always read-only.
|
49
48
|
# default is <tt>false</tt>.
|
49
|
+
# <tt>:standby</tt> is standby mode. in standby mode, transaction is
|
50
|
+
# read-only and Higgs::TransactionManager#apply_journal_log is callable.
|
51
|
+
# if Higgs::TransactionManager#switch_to_write is called in standby mode
|
52
|
+
# then state of manager changes from standby mode to read-write mode.
|
50
53
|
# [<tt>:decode</tt>] procedure to decode data on read. if <tt>:string_only</tt>
|
51
54
|
# property at an entry is <tt>true</tt> then <tt>decode</tt>
|
52
55
|
# is not used to read the entry. default is <tt>proc{|r| r }</tt>.
|
@@ -60,6 +63,9 @@ module Higgs
|
|
60
63
|
# [<tt>:secondary_cache</tt>] secondary read-cache for encoded string data.
|
61
64
|
# key of cache is always unique string.
|
62
65
|
# default is no effect.
|
66
|
+
# [<tt>:jlog_apply_dir</tt>] journal logs under the directory of this parameter is
|
67
|
+
# applied to storage on call of
|
68
|
+
# Higgs::TransactionManager#apply_journal_log
|
63
69
|
def init_options(options)
|
64
70
|
if (options.key? :read_only) then
|
65
71
|
@read_only = options[:read_only]
|
@@ -72,31 +78,23 @@ module Higgs
|
|
72
78
|
@lock_manager = options[:lock_manager] || GiantLockManager.new
|
73
79
|
@master_cache = options[:master_cache] || LRUCache.new
|
74
80
|
@secondary_cache = options[:secondary_cache] || PseudoSecondaryCache.instance
|
81
|
+
@jlog_apply_dir = options[:jlog_apply_dir] || nil
|
75
82
|
end
|
76
83
|
|
77
84
|
attr_reader :read_only
|
78
85
|
end
|
79
86
|
include InitOptions
|
80
87
|
|
81
|
-
#
|
82
|
-
#
|
83
|
-
# these methods are delegated.
|
84
|
-
# * Higgs::TransactionManager#read_only
|
85
|
-
# * Higgs::TransactionManager#transaction
|
86
|
-
#
|
87
|
-
module Export
|
88
|
-
extend Forwardable
|
89
|
-
|
90
|
-
def_delegator :@tman, :read_only
|
91
|
-
def_delegator :@tman, :transaction
|
92
|
-
end
|
93
|
-
|
88
|
+
# see Higgs::TransactionManager::InitOptions for <tt>options</tt>.
|
94
89
|
def initialize(storage, options={})
|
95
90
|
@storage = storage
|
96
91
|
init_options(options)
|
92
|
+
if (@read_only == :standby && ! @jlog_apply_dir) then
|
93
|
+
raise ArgumentError, "need for `:jlog_apply_dir' parameter in standby mode"
|
94
|
+
end
|
97
95
|
@master_cache = SharedWorkCache.new(@master_cache) {|key|
|
98
|
-
(id = @storage.
|
99
|
-
(value = @storage.fetch(key) and @secondary_cache[@storage.
|
96
|
+
(id = @storage.unique_data_id(key) and @secondary_cache[id]) or
|
97
|
+
(value = @storage.fetch(key) and @secondary_cache[@storage.unique_data_id(key)] = value.freeze)
|
100
98
|
}
|
101
99
|
end
|
102
100
|
|
@@ -134,11 +132,38 @@ module Higgs
|
|
134
132
|
def self.current_transaction
|
135
133
|
Thread.current[:higgs_current_transaction]
|
136
134
|
end
|
135
|
+
|
136
|
+
def apply_journal_log(not_delete=false)
|
137
|
+
@lock_manager.exclusive{
|
138
|
+
if (@read_only != :standby) then
|
139
|
+
raise "not standby mode: #{@read_only}"
|
140
|
+
end
|
141
|
+
name = File.join(@jlog_apply_dir, File.basename(@storage.name))
|
142
|
+
for jlog_path in Storage.rotated_entries("#{name}.jlog")
|
143
|
+
@storage.apply_journal_log(jlog_path) {|key|
|
144
|
+
@master_cache.delete(key)
|
145
|
+
}
|
146
|
+
File.unlink(jlog_path) unless not_delete
|
147
|
+
end
|
148
|
+
}
|
149
|
+
nil
|
150
|
+
end
|
151
|
+
|
152
|
+
def switch_to_write
|
153
|
+
@lock_manager.exclusive{
|
154
|
+
if (@read_only != :standby) then
|
155
|
+
raise "not standby mode: #{@read_only}"
|
156
|
+
end
|
157
|
+
@read_only = false
|
158
|
+
@storage.switch_to_write
|
159
|
+
}
|
160
|
+
nil
|
161
|
+
end
|
137
162
|
end
|
138
163
|
|
139
164
|
class TransactionContext
|
140
165
|
# for ident(1)
|
141
|
-
CVS_ID = '$Id: tman.rb
|
166
|
+
CVS_ID = '$Id: tman.rb 674 2007-11-05 15:55:14Z toki $'
|
142
167
|
|
143
168
|
include Enumerable
|
144
169
|
|
@@ -330,6 +355,12 @@ module Higgs
|
|
330
355
|
if (@ope_map[key] != :delete) then
|
331
356
|
if (properties = @local_properties_cache[key]) then
|
332
357
|
case (name)
|
358
|
+
when :identity
|
359
|
+
@storage.identity(key)
|
360
|
+
when :data_change_number
|
361
|
+
@storage.data_change_number(key)
|
362
|
+
when :properties_change_number
|
363
|
+
@storage.properties_change_number(key)
|
333
364
|
when Symbol
|
334
365
|
properties['system_properties'][name.to_s]
|
335
366
|
when String
|
@@ -384,6 +415,12 @@ module Higgs
|
|
384
415
|
|
385
416
|
if (self.key? key) then # lock
|
386
417
|
case (name)
|
418
|
+
when :identity
|
419
|
+
return @storage.identity(key) != nil
|
420
|
+
when :data_change_number
|
421
|
+
return @storage.data_change_number(key) != nil
|
422
|
+
when :properties_change_number
|
423
|
+
return @storage.properties_change_number(key) != nil
|
387
424
|
when Symbol
|
388
425
|
return (@local_properties_cache[key]['system_properties'].key? name.to_s)
|
389
426
|
when String
|
@@ -399,6 +436,15 @@ module Higgs
|
|
399
436
|
unless (self.key? key) then # lock
|
400
437
|
raise IndexError, "not exist properties at key: #{key}"
|
401
438
|
end
|
439
|
+
if (value = @storage.identity(key)) then
|
440
|
+
yield(:identity, value)
|
441
|
+
end
|
442
|
+
if (value = @storage.data_change_number(key)) then
|
443
|
+
yield(:data_change_number, value)
|
444
|
+
end
|
445
|
+
if (value = @storage.properties_change_number(key)) then
|
446
|
+
yield(:properties_change_number, value)
|
447
|
+
end
|
402
448
|
@local_properties_cache[key]['system_properties'].each_pair do |name, value|
|
403
449
|
yield(name.to_sym, value)
|
404
450
|
end
|
@@ -467,7 +513,6 @@ module Higgs
|
|
467
513
|
case (ope)
|
468
514
|
when :write
|
469
515
|
@master_cache.delete(key)
|
470
|
-
@secondary_cache[key] = value
|
471
516
|
when :delete
|
472
517
|
@master_cache.delete(key)
|
473
518
|
@secondary_cache.delete(key)
|
data/lib/higgs/utils/bman.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# = backup manager
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-11-11 11:20:51 +0900 (Sun, 11 Nov 2007) $
|
5
|
+
# Revision:: $Revision: 682 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
@@ -11,6 +11,7 @@
|
|
11
11
|
require 'drb'
|
12
12
|
require 'fileutils'
|
13
13
|
require 'higgs/flock'
|
14
|
+
require 'higgs/jlog'
|
14
15
|
require 'higgs/storage'
|
15
16
|
|
16
17
|
module Higgs
|
@@ -18,11 +19,16 @@ module Higgs
|
|
18
19
|
# = backup manager
|
19
20
|
# == requirements for online-backup
|
20
21
|
#
|
21
|
-
# these parameters should be required when Higgs::
|
22
|
+
# these parameters should be required when Higgs::StorageManager
|
23
|
+
# of backup target is opened.
|
22
24
|
#
|
23
25
|
# [<tt>:jlog_rotate_max</tt>] value is <tt>0</tt>. rotated journal logs shuold be preserved.
|
24
|
-
# [<tt>:
|
25
|
-
#
|
26
|
+
# [<tt>:remote_services_uri</tt>] value is <tt>"druby://<em>host</em>:<em>port</em>"</tt>.
|
27
|
+
# journal log rotation remote service should be enabled.
|
28
|
+
#
|
29
|
+
# DRb service should be started before Higgs::BackupManager is used.
|
30
|
+
#
|
31
|
+
# DRb.start_service
|
26
32
|
#
|
27
33
|
# == online-backup
|
28
34
|
#
|
@@ -104,8 +110,7 @@ module Higgs
|
|
104
110
|
# -f, --from=BACKUP_TARGET_STORAGE
|
105
111
|
# -t, --to-dir=DIR_TO_BACKUP
|
106
112
|
# -n, --to-name=NAME_TO_BACKUP
|
107
|
-
# -
|
108
|
-
# --jlog-rotate-service-uri
|
113
|
+
# -U, --remote-services-uri=URI
|
109
114
|
# -v, --verbose, --[no-]verbose
|
110
115
|
# --verbose-level=LEVEL
|
111
116
|
#
|
@@ -145,27 +150,30 @@ module Higgs
|
|
145
150
|
# if this option is omitted then <tt>NAME_TO_BACKUP</tt> is the same
|
146
151
|
# as <tt>BACKUP_TARGET_STORAGE</tt>.
|
147
152
|
#
|
148
|
-
# === OPTION: <tt>--
|
153
|
+
# === OPTION: <tt>--remote-services-uri=URI</tt>
|
149
154
|
# access point for journal log rotation remote service.
|
150
|
-
# <tt>URI</tt> is the same as <tt>:
|
151
|
-
# when Higgs::
|
155
|
+
# <tt>URI</tt> is the same as <tt>:remote_services_uri</tt>
|
156
|
+
# when Higgs::StorageManager is opened.
|
152
157
|
#
|
153
158
|
# === OPTION: <tt>--verbose</tt>
|
154
159
|
# verbose level up.
|
155
160
|
#
|
161
|
+
# === OPTION: <tt>--no-verbose</tt>
|
162
|
+
# verbose level down.
|
163
|
+
#
|
156
164
|
# === OPTION: <tt>--verbose-level=LEVEL</tt>
|
157
165
|
# set verbose level to <tt>LEVEL</tt>.
|
158
166
|
#
|
159
167
|
class BackupManager
|
160
168
|
# for ident(1)
|
161
|
-
CVS_ID = '$Id: bman.rb
|
169
|
+
CVS_ID = '$Id: bman.rb 682 2007-11-11 02:20:51Z toki $'
|
162
170
|
|
163
171
|
def initialize(options={})
|
164
172
|
@from = options[:from]
|
165
173
|
to_dir = options[:to_dir]
|
166
174
|
to_name = options[:to_name] || (@from && File.basename(@from))
|
167
175
|
@to = File.join(to_dir, to_name) if (to_dir && to_name)
|
168
|
-
@
|
176
|
+
@remote_services_uri = options[:remote_services_uri]
|
169
177
|
@verbose = options[:verbose] || 0
|
170
178
|
@out = options[:out] || STDOUT
|
171
179
|
end
|
@@ -179,11 +187,20 @@ module Higgs
|
|
179
187
|
private :log
|
180
188
|
|
181
189
|
def connect_service
|
182
|
-
unless (@
|
183
|
-
raise 'required
|
190
|
+
unless (@remote_services_uri) then
|
191
|
+
raise 'required remote_services_uri'
|
184
192
|
end
|
185
|
-
@out << log("connect to
|
186
|
-
@
|
193
|
+
@out << log("connect to remote services: #{@remote_services_uri}") if (@verbose >= 2)
|
194
|
+
@services = DRbObject.new_with_uri(@remote_services_uri)
|
195
|
+
|
196
|
+
localhost_check_service = @services[:localhost_check_service_v1] or
|
197
|
+
raise 'not provided remote service: localhost_check_service_v1'
|
198
|
+
localhost_check_service.call{|localhost_check|
|
199
|
+
localhost_check.call
|
200
|
+
}
|
201
|
+
|
202
|
+
@jlog_rotate_service = @services[:jlog_rotate_service_v1] or
|
203
|
+
raise 'not provided remote service: jlog_rotate_service_v1'
|
187
204
|
end
|
188
205
|
private :connect_service
|
189
206
|
|
@@ -231,8 +248,11 @@ module Higgs
|
|
231
248
|
unless (@to) then
|
232
249
|
raise 'required to_storage'
|
233
250
|
end
|
234
|
-
for path in Storage.
|
251
|
+
for path in Storage.rotated_entries("#{@from}.jlog")
|
235
252
|
path =~ /\.jlog\.\d+$/ or raise "mismatch jlog name: #{path}"
|
253
|
+
unless (JournalLogger.has_eof_mark? path) then
|
254
|
+
raise "broken journal log: #{path}"
|
255
|
+
end
|
236
256
|
ext = $&
|
237
257
|
FileUtils.cp(path, "#{@to}#{ext}", :preserve => true, :verbose => @verbose >= 2)
|
238
258
|
end
|
@@ -275,7 +295,7 @@ module Higgs
|
|
275
295
|
raise 'required to_storage'
|
276
296
|
end
|
277
297
|
|
278
|
-
for to_jlog in Storage.
|
298
|
+
for to_jlog in Storage.rotated_entries("#{@to}.jlog")
|
279
299
|
to_jlog =~ /\.jlog\.\d+$/ or raise "mismatch jlog name: #{to_jlog}"
|
280
300
|
ext = $&
|
281
301
|
from_jlog = @from + ext
|
@@ -295,7 +315,7 @@ module Higgs
|
|
295
315
|
raise 'required to_storage'
|
296
316
|
end
|
297
317
|
|
298
|
-
for to_jlog in Storage.
|
318
|
+
for to_jlog in Storage.rotated_entries("#{@to}.jlog")
|
299
319
|
FileUtils.rm(to_jlog, :verbose => @verbose >= 2)
|
300
320
|
end
|
301
321
|
|
@@ -330,7 +350,7 @@ module Higgs
|
|
330
350
|
flock.synchronize{
|
331
351
|
FileUtils.cp("#{@to}.idx", "#{@from}.idx", :preserve => true, :verbose => @verbose >= 2)
|
332
352
|
FileUtils.cp("#{@to}.tar", "#{@from}.tar", :preserve => true, :verbose => @verbose >= 2)
|
333
|
-
for path in Storage.
|
353
|
+
for path in Storage.rotated_entries("#{@to}.jlog")
|
334
354
|
path =~ /\.jlog\.\d+$/ or raise "mismatch jlog name: #{path}"
|
335
355
|
ext = $&
|
336
356
|
FileUtils.cp(path, "#{@from}#{ext}", :preserve => true, :verbose => @verbose >= 2)
|
data/lib/higgs/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# = version
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-11-11 11:22:01 +0900 (Sun, 11 Nov 2007) $
|
5
|
+
# Revision:: $Revision: 683 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
@@ -10,9 +10,9 @@
|
|
10
10
|
|
11
11
|
module Higgs
|
12
12
|
# for ident(1)
|
13
|
-
CVS_ID = '$Id: version.rb
|
13
|
+
CVS_ID = '$Id: version.rb 683 2007-11-11 02:22:01Z toki $'
|
14
14
|
|
15
|
-
VERSION = '0.1.
|
15
|
+
VERSION = '0.1.3'
|
16
16
|
end
|
17
17
|
|
18
18
|
# Local Variables:
|
data/lib/higgs.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# = pure ruby transactional storage compatible with unix TAR format
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-10-14 18:43:23 +0900 (Sun, 14 Oct 2007) $
|
5
|
+
# Revision:: $Revision: 636 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
@@ -37,9 +37,9 @@ require 'higgs/version'
|
|
37
37
|
#
|
38
38
|
# === case of online backup
|
39
39
|
#
|
40
|
-
# [REQUIREMENTS] open with parameters:
|
40
|
+
# [REQUIREMENTS] open Higgs::StorageManager with these parameters:
|
41
41
|
# <tt>jlog_rotate_max => 0</tt>,
|
42
|
-
# <tt>
|
42
|
+
# <tt>remtoe_services_uri => "druby://<em>host</em>:<em>port</em>"</tt>,
|
43
43
|
# and execute <tt>higgs_backup</tt> (see Higgs::Utils::BackupManager)
|
44
44
|
# [NORMAL SHUTDOWN] OK, no recovery
|
45
45
|
# [PROCESS ABORT] OK, automatic recovery on read-write open
|
data/test/test_block.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/local/bin/ruby
|
2
2
|
|
3
|
-
require 'digest
|
3
|
+
require 'digest'
|
4
4
|
require 'fileutils'
|
5
5
|
require 'higgs/block'
|
6
6
|
require 'test/unit'
|
@@ -10,7 +10,7 @@ module Higgs::Test
|
|
10
10
|
include Higgs::Block
|
11
11
|
|
12
12
|
# for ident(1)
|
13
|
-
CVS_ID = '$Id: test_block.rb
|
13
|
+
CVS_ID = '$Id: test_block.rb 654 2007-10-23 16:04:47Z toki $'
|
14
14
|
|
15
15
|
def setup
|
16
16
|
@io = File.open('block.test_io', 'w+')
|
data/test/test_cache.rb
CHANGED
@@ -10,7 +10,7 @@ module Higgs::Test
|
|
10
10
|
include Higgs
|
11
11
|
|
12
12
|
# for ident(1)
|
13
|
-
CVS_ID = '$Id: test_cache.rb
|
13
|
+
CVS_ID = '$Id: test_cache.rb 659 2007-10-30 15:36:09Z toki $'
|
14
14
|
|
15
15
|
CACHE_LIMIT_SIZE = 10
|
16
16
|
|
@@ -84,7 +84,7 @@ module Higgs::Test
|
|
84
84
|
include Higgs
|
85
85
|
|
86
86
|
# for ident(1)
|
87
|
-
CVS_ID = '$Id: test_cache.rb
|
87
|
+
CVS_ID = '$Id: test_cache.rb 659 2007-10-30 15:36:09Z toki $'
|
88
88
|
|
89
89
|
def setup
|
90
90
|
@calc_calls = 0
|
@@ -212,10 +212,10 @@ module Higgs::Test
|
|
212
212
|
include Higgs
|
213
213
|
|
214
214
|
# for ident(1)
|
215
|
-
CVS_ID = '$Id: test_cache.rb
|
215
|
+
CVS_ID = '$Id: test_cache.rb 659 2007-10-30 15:36:09Z toki $'
|
216
216
|
|
217
217
|
def test_no_work_block
|
218
|
-
assert_raise(
|
218
|
+
assert_raise(ArgumentError) {
|
219
219
|
SharedWorkCache.new
|
220
220
|
}
|
221
221
|
end
|
data/test/test_index.rb
CHANGED
@@ -10,7 +10,7 @@ module Higgs::Test
|
|
10
10
|
include Higgs
|
11
11
|
|
12
12
|
# for ident(1)
|
13
|
-
CVS_ID = '$Id: test_index.rb
|
13
|
+
CVS_ID = '$Id: test_index.rb 650 2007-10-21 13:47:29Z toki $'
|
14
14
|
|
15
15
|
def setup
|
16
16
|
@idx = Index.new
|
@@ -45,7 +45,7 @@ module Higgs::Test
|
|
45
45
|
include Higgs
|
46
46
|
|
47
47
|
# for ident(1)
|
48
|
-
CVS_ID = '$Id: test_index.rb
|
48
|
+
CVS_ID = '$Id: test_index.rb 650 2007-10-21 13:47:29Z toki $'
|
49
49
|
|
50
50
|
def setup
|
51
51
|
@idx = Index.new
|
@@ -91,7 +91,7 @@ module Higgs::Test
|
|
91
91
|
include Higgs
|
92
92
|
|
93
93
|
# for ident(1)
|
94
|
-
CVS_ID = '$Id: test_index.rb
|
94
|
+
CVS_ID = '$Id: test_index.rb 650 2007-10-21 13:47:29Z toki $'
|
95
95
|
|
96
96
|
def setup
|
97
97
|
@idx = Index.new
|
@@ -164,7 +164,7 @@ module Higgs::Test
|
|
164
164
|
include Higgs
|
165
165
|
|
166
166
|
# for ident(1)
|
167
|
-
CVS_ID = '$Id: test_index.rb
|
167
|
+
CVS_ID = '$Id: test_index.rb 650 2007-10-21 13:47:29Z toki $'
|
168
168
|
|
169
169
|
def setup
|
170
170
|
@idx = Index.new
|
@@ -205,7 +205,7 @@ module Higgs::Test
|
|
205
205
|
include Higgs
|
206
206
|
|
207
207
|
# for ident(1)
|
208
|
-
CVS_ID = '$Id: test_index.rb
|
208
|
+
CVS_ID = '$Id: test_index.rb 650 2007-10-21 13:47:29Z toki $'
|
209
209
|
|
210
210
|
def setup
|
211
211
|
@path = 'test.idx'
|
@@ -246,12 +246,24 @@ module Higgs::Test
|
|
246
246
|
}
|
247
247
|
|
248
248
|
i = Index.new
|
249
|
+
i.storage_id = '68c6b76688d84b4d72856d8f589a5551'
|
249
250
|
i.load(@path)
|
251
|
+
|
252
|
+
h = i.to_h
|
253
|
+
assert_equal([ Index::MAJOR_VERSION, Index::MINOR_VERSION ], h[:version])
|
254
|
+
assert_equal(0, h[:change_number])
|
255
|
+
assert_equal(1024, h[:eoa])
|
256
|
+
assert_equal({ 512 => [ 512 ] }, h[:free_lists])
|
257
|
+
assert_equal({ :foo => [ 'foo', 0 ] }, h[:index], 'index format version: 0.1')
|
258
|
+
assert_equal({ 'foo' => :foo }, h[:identities], 'index format version: 0.1')
|
259
|
+
assert_equal('68c6b76688d84b4d72856d8f589a5551', h[:storage_id], 'index format version: 0.2')
|
260
|
+
|
250
261
|
assert_equal(0, i.change_number)
|
251
262
|
assert_equal(1024, i.eoa)
|
252
263
|
assert_equal(512, i.free_fetch(512))
|
253
264
|
assert_equal(0, i[:foo])
|
254
265
|
assert_equal('foo', i.identity(:foo))
|
266
|
+
assert_equal('68c6b76688d84b4d72856d8f589a5551', i.storage_id)
|
255
267
|
end
|
256
268
|
|
257
269
|
def test_migration_RuntimeError_unsupported_version
|
data/test/test_jlog.rb
CHANGED
@@ -10,7 +10,7 @@ module Higgs::Test
|
|
10
10
|
include Higgs
|
11
11
|
|
12
12
|
# for ident(1)
|
13
|
-
CVS_ID = '$Id: test_jlog.rb
|
13
|
+
CVS_ID = '$Id: test_jlog.rb 657 2007-10-28 14:35:37Z toki $'
|
14
14
|
|
15
15
|
def setup
|
16
16
|
@path = 't.jlog'
|
@@ -110,7 +110,9 @@ module Higgs::Test
|
|
110
110
|
|
111
111
|
def test_eof_mark_no_file
|
112
112
|
assert_equal(false, (File.exist? @path))
|
113
|
-
|
113
|
+
assert_raise(Errno::ENOENT) {
|
114
|
+
JournalLogger.has_eof_mark? @path
|
115
|
+
}
|
114
116
|
end
|
115
117
|
|
116
118
|
def test_eof_mark_empty_file
|