higgs 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/ChangeLog
CHANGED
@@ -1,3 +1,106 @@
|
|
1
|
+
2007-11-11 TOKI Yoshinori <toki@freedom.ne.jp>
|
2
|
+
|
3
|
+
* lib/higgs/version.rb: version 0.1.3.
|
4
|
+
|
5
|
+
2007-11-10 TOKI Yoshinori <toki@freedom.ne.jp>
|
6
|
+
|
7
|
+
* bin/higgs_apply_jlog, bin/higgs_ping: some utilities.
|
8
|
+
|
9
|
+
2007-11-09 TOKI Yoshinori <toki@freedom.ne.jp>
|
10
|
+
|
11
|
+
* lib/higgs/storage.rb (Higgs::Storage class): probe for alived
|
12
|
+
storage.
|
13
|
+
|
14
|
+
2007-11-04 TOKI Yoshinori <toki@freedom.ne.jp>
|
15
|
+
|
16
|
+
* lib/higgs/storage.rb (Higgs::Storage class): standby mode check.
|
17
|
+
|
18
|
+
* lib/higgs/tman.rb (Higgs::TransactionManager class),
|
19
|
+
lib/higgs/services.rb (Higgs::RemoteServices class),
|
20
|
+
lib/higgs/sman.rb (Higgs::StorageManager class):
|
21
|
+
some methods for replication.
|
22
|
+
|
23
|
+
2007-10-31 TOKI Yoshinori <toki@freedom.ne.jp>
|
24
|
+
|
25
|
+
* lib/higgs/thread.rb (Higgs::SharedWork class),
|
26
|
+
lib/higgs/cache.rb (Higgs::SharedWorkCache class): ArgumentError
|
27
|
+
for no block argument.
|
28
|
+
|
29
|
+
2007-10-28 TOKI Yoshinori <toki@freedom.ne.jp>
|
30
|
+
|
31
|
+
* lib/higgs/utils/bman.rb (Higgs::Utils::BackupManager class):
|
32
|
+
checked eof-mark of journal log to backup.
|
33
|
+
|
34
|
+
2007-10-25 TOKI Yoshinori <toki@freedom.ne.jp>
|
35
|
+
|
36
|
+
* lib/higgs/storage.rb (Higgs::Storage class): fixed a bug, buffer
|
37
|
+
flush of write I/O handle is not done.
|
38
|
+
|
39
|
+
2007-10-24 TOKI Yoshinori <toki@freedom.ne.jp>
|
40
|
+
|
41
|
+
* lib/higgs/storage.rb (Higgs::Storage class): renamed from
|
42
|
+
`rotate_entries' to `rotated_entries'.
|
43
|
+
|
44
|
+
2007-10-23 TOKI Yoshinori <toki@freedom.ne.jp>
|
45
|
+
|
46
|
+
* lib/higgs/lock.rb: exclusive block of lock manager.
|
47
|
+
|
48
|
+
2007-10-21 TOKI Yoshinori <toki@freedom.ne.jp>
|
49
|
+
|
50
|
+
* lib/higgs/storage.rb (Higgs::Storage class): storage id
|
51
|
+
consistency check on applying journal log.
|
52
|
+
|
53
|
+
* lib/higgs/index.rb (Higgs::Index class),
|
54
|
+
lib/higgs/storage.rb (Higgs::Storage class): storage id.
|
55
|
+
|
56
|
+
2007-10-16 TOKI Yoshinori <toki@freedom.ne.jp>
|
57
|
+
|
58
|
+
* lib/higgs/utils/bman.rb (Higgs::Utils::BackupManager class):
|
59
|
+
localhost check for runtime.
|
60
|
+
|
61
|
+
* lib/higgs/storage.rb (Higgs::Storage class),
|
62
|
+
lib/higgs/services.rb (Higgs::RemoteServices class): provided
|
63
|
+
localhost check service.
|
64
|
+
|
65
|
+
2007-10-14 TOKI Yoshinori <toki@freedom.ne.jp>
|
66
|
+
|
67
|
+
* lib/higgs/storage.rb, lib/higgs/tman.rb: obsolete
|
68
|
+
Higgs::Storage::Export module, obsolete
|
69
|
+
Higgs::TransactionManager::Export module.
|
70
|
+
|
71
|
+
* lib/higgs/sman.rb (Higgs::StorageManager class): base class of
|
72
|
+
Higgs::Store and Higgs::DBM. this class integrates Higgs::Storage,
|
73
|
+
Higgs::TransactionManager, and Higgs::RemoteServices and is those
|
74
|
+
front end.
|
75
|
+
|
76
|
+
* bin/higgs_backup: obsolete `--jlog-rotate-service-uri=URI'
|
77
|
+
option, new `--remote-services-uri=URI' option.
|
78
|
+
|
79
|
+
* lib/higgs/utils/bman.rb: obsolete `:jlog_rotate_service_uri'
|
80
|
+
option, new `:remote_services_uri' option.
|
81
|
+
|
82
|
+
* lib/higgs/storage.rb (Higgs::Storage class): obsolete
|
83
|
+
`:jlog_rotate_service_uri' option. this remote service is
|
84
|
+
integrated to Higgs::RemoteServices.
|
85
|
+
|
86
|
+
* lib/higgs/services.rb (Higgs::RemoteServices class): class to
|
87
|
+
integrate remote services.
|
88
|
+
|
89
|
+
* lib/higgs/storage.rb (Higgs::Storage class): enabled to apply
|
90
|
+
journal log to online storage.
|
91
|
+
|
92
|
+
2007-10-13 TOKI Yoshinori <toki@freedom.ne.jp>
|
93
|
+
|
94
|
+
* lib/higgs/storage.rb (Higgs::Storage class): write EOA to
|
95
|
+
storage at each applying journal log.
|
96
|
+
|
97
|
+
* lib/higgs/storage.rb (Higgs::Storage class), lib/higgs/tman.rb
|
98
|
+
(Higgs::TransactionManager class, Higgs::TransactionContext
|
99
|
+
class): unique data id for secondary cache. index structure
|
100
|
+
changed a little.
|
101
|
+
|
102
|
+
* lib/higgs/tman.rb: fixed a bug of wrong key of secondary cache.
|
103
|
+
|
1
104
|
2007-10-12 TOKI Yoshinori <toki@freedom.ne.jp>
|
2
105
|
|
3
106
|
* lib/higgs/version.rb: version 0.1.2.
|
data/Rakefile
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# for ident(1)
|
2
|
-
CVS_ID = '$Id: Rakefile
|
2
|
+
CVS_ID = '$Id: Rakefile 678 2007-11-09 16:08:34Z toki $'
|
3
3
|
|
4
4
|
require 'lib/higgs/version'
|
5
5
|
require 'rake/gempackagetask'
|
@@ -46,7 +46,14 @@ spec = Gem::Specification.new{|s|
|
|
46
46
|
s.summary = 'pure ruby transactional storage compatible with unix TAR format'
|
47
47
|
s.author = 'TOKI Yoshinori'
|
48
48
|
s.email = 'toki@freedom.ne.jp'
|
49
|
-
s.executables = %w[
|
49
|
+
s.executables = %w[
|
50
|
+
higgs_apply_jlog
|
51
|
+
higgs_backup
|
52
|
+
higgs_dump_index
|
53
|
+
higgs_dump_jlog
|
54
|
+
higgs_ping
|
55
|
+
higgs_verify
|
56
|
+
]
|
50
57
|
s.files = Dir['**/{Rakefile,.strc,*.{rb,yml}}']
|
51
58
|
s.files += %w[ ChangeLog LICENSE README ]
|
52
59
|
s.test_files = %w[ test/run.rb ]
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
require 'drb'
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
# for ident(1)
|
7
|
+
CVS_ID = '$Id: higgs_apply_jlog 680 2007-11-11 02:04:47Z toki $'
|
8
|
+
|
9
|
+
opt_not_delete = false
|
10
|
+
opt_switch_to_write = false
|
11
|
+
|
12
|
+
opts = OptionParser.new
|
13
|
+
opts.banner = "Usage: #{opts.program_name} [OPTIONs] URI_FOR_REMOTE_SERVICES\n"
|
14
|
+
opts.banner << "OPTIONs:\n"
|
15
|
+
opts.on('-n', '--not-delete') {|value|
|
16
|
+
opt_not_delete = value ? true : false
|
17
|
+
}
|
18
|
+
opts.on('--switch-to-write') {|value|
|
19
|
+
opt_switch_to_write = true
|
20
|
+
}
|
21
|
+
opts.parse!
|
22
|
+
|
23
|
+
if (ARGV.empty?) then
|
24
|
+
puts opts
|
25
|
+
exit 1
|
26
|
+
end
|
27
|
+
|
28
|
+
uri = ARGV.shift
|
29
|
+
services = DRbObject.new_with_uri(uri)
|
30
|
+
jlog_apply_service = services[:jlog_apply_service_v1] or raise 'not provided remote service: jlog_apply_service_v1'
|
31
|
+
jlog_apply_service.call(opt_not_delete)
|
32
|
+
if (opt_switch_to_write) then
|
33
|
+
switch_to_write_service = services[:switch_to_write_service_v1] or raise 'not provided remote service: switch_to_write_service_v1'
|
34
|
+
switch_to_write_service.call
|
35
|
+
end
|
data/bin/higgs_backup
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
#!/usr/local/bin/ruby
|
2
2
|
|
3
|
+
require 'drb'
|
3
4
|
require 'higgs/utils/bman'
|
4
5
|
require 'optparse'
|
5
6
|
|
6
7
|
# for ident(1)
|
7
|
-
CVS_ID = '$Id: higgs_backup
|
8
|
+
CVS_ID = '$Id: higgs_backup 641 2007-10-18 16:04:02Z toki $'
|
8
9
|
|
9
10
|
STDOUT.sync = true
|
10
11
|
|
@@ -42,8 +43,8 @@ opts.on('-t', '--to-dir=DIR_TO_BACKUP', String) {|value|
|
|
42
43
|
opts.on('-n', '--to-name=NAME_TO_BACKUP', String) {|value|
|
43
44
|
options[:to_name] = value
|
44
45
|
}
|
45
|
-
opts.on('-
|
46
|
-
options[:
|
46
|
+
opts.on('-U', '--remote-services-uri=URI', String) {|value|
|
47
|
+
options[:remote_services_uri] = value
|
47
48
|
}
|
48
49
|
opts.on('-v', '--verbose', '--[no-]verbose') {|value|
|
49
50
|
if (value) then
|
@@ -71,6 +72,7 @@ unless (ARGV.empty?) then
|
|
71
72
|
commands = ARGV
|
72
73
|
end
|
73
74
|
|
75
|
+
DRb.start_service
|
74
76
|
bman = Higgs::Utils::BackupManager.new(options)
|
75
77
|
for cmd in commands
|
76
78
|
unless (bman.public_methods(false).include? cmd) then
|
data/bin/higgs_dump_jlog
CHANGED
@@ -6,7 +6,7 @@ require 'pp'
|
|
6
6
|
require 'yaml'
|
7
7
|
|
8
8
|
# for ident(1)
|
9
|
-
CVS_ID = '$Id: higgs_dump_jlog
|
9
|
+
CVS_ID = '$Id: higgs_dump_jlog 677 2007-11-08 16:22:02Z toki $'
|
10
10
|
|
11
11
|
opts = OptionParser.new
|
12
12
|
opts.banner = "Usage: #{opts.program_name} [options] [JOURNAL_LOG_PATHs]"
|
@@ -25,16 +25,32 @@ opts.on_tail('-h', '--help') {
|
|
25
25
|
}
|
26
26
|
opts.parse!
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
pp log
|
32
|
-
when :yaml
|
33
|
-
puts log.to_yaml
|
28
|
+
def scan_args
|
29
|
+
if (ARGV.empty?) then
|
30
|
+
yield(STDIN)
|
34
31
|
else
|
35
|
-
|
32
|
+
for filename in ARGV
|
33
|
+
File.open(filename, 'r') {|r|
|
34
|
+
r.binmode
|
35
|
+
yield(r)
|
36
|
+
}
|
37
|
+
end
|
36
38
|
end
|
37
|
-
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
|
42
|
+
scan_args do |r|
|
43
|
+
Higgs::JournalLogger.scan_log(r) do |log|
|
44
|
+
case (output_format)
|
45
|
+
when :pretty
|
46
|
+
pp log
|
47
|
+
when :yaml
|
48
|
+
puts log.to_yaml
|
49
|
+
else
|
50
|
+
raise "unknown output format: #{output_format}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
38
54
|
|
39
55
|
# Local Variables:
|
40
56
|
# mode: Ruby
|
data/bin/higgs_ping
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
require 'drb'
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
# for ident(1)
|
7
|
+
CVS_ID = '$Id: higgs_ping 679 2007-11-11 01:41:18Z toki $'
|
8
|
+
|
9
|
+
opt_verbose = 0
|
10
|
+
|
11
|
+
opts = OptionParser.new
|
12
|
+
opts.banner = "Usage: #{opts.program_name} [OPTIONs] URI_FOR_REMOTE_SERVICES\n"
|
13
|
+
opts.banner << "OPTIONs:\n"
|
14
|
+
opts.on('-v', '--[no-]verbose') {|value|
|
15
|
+
if (value) then
|
16
|
+
opt_verbose += 1
|
17
|
+
else
|
18
|
+
opt_verbose -= 1
|
19
|
+
end
|
20
|
+
}
|
21
|
+
opts.on('--verbose-level=LEVEL', Integer) {|value|
|
22
|
+
opt_verbose = value
|
23
|
+
}
|
24
|
+
opts.parse!
|
25
|
+
|
26
|
+
if (ARGV.empty?) then
|
27
|
+
puts opts
|
28
|
+
exit 1
|
29
|
+
end
|
30
|
+
|
31
|
+
uri = ARGV.shift
|
32
|
+
begin
|
33
|
+
puts "connect to #{uri}" if (opt_verbose >= 2)
|
34
|
+
services = DRbObject.new_with_uri(uri)
|
35
|
+
alive_service = services[:alive_service_v1] or raise 'not provided remote service: alive_service_v1'
|
36
|
+
if (alive_service.call) then
|
37
|
+
puts "alive" if (opt_verbose >= 1)
|
38
|
+
exit 0
|
39
|
+
end
|
40
|
+
rescue DRb::DRbError
|
41
|
+
# fall through
|
42
|
+
puts "error: #{$!}" if (opt_verbose >= 2)
|
43
|
+
end
|
44
|
+
|
45
|
+
puts "dead" if (opt_verbose >= 1)
|
46
|
+
exit 255
|
data/lib/higgs/block.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
# = block read/write
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-10-24 01:04:47 +0900 (Wed, 24 Oct 2007) $
|
5
|
+
# Revision:: $Revision: 654 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
9
9
|
#
|
10
10
|
|
11
|
+
require 'digest'
|
11
12
|
require 'higgs/exceptions'
|
12
13
|
|
13
14
|
module Higgs
|
@@ -27,7 +28,7 @@ module Higgs
|
|
27
28
|
#
|
28
29
|
module Block
|
29
30
|
# for ident(1)
|
30
|
-
CVS_ID = '$Id: block.rb
|
31
|
+
CVS_ID = '$Id: block.rb 654 2007-10-23 16:04:47Z toki $'
|
31
32
|
|
32
33
|
include Exceptions
|
33
34
|
|
@@ -42,26 +43,17 @@ module Higgs
|
|
42
43
|
HEAD_CKSUM_FMT = 'v'
|
43
44
|
|
44
45
|
BODY_HASH = {}
|
45
|
-
[ [ :SUM16, proc{|s| s.sum(16).to_s }, nil ],
|
46
|
-
[ :MD5, proc{|s| Digest::MD5.digest(s) }, 'digest/md5' ],
|
47
|
-
[ :RMD160, proc{|s| Digest::RMD160.digest(s) }, 'digest/rmd160' ],
|
48
|
-
[ :SHA1, proc{|s| Digest::SHA1.digest(s) }, 'digest/sha1' ],
|
49
|
-
[ :SHA256, proc{|s| Digest::SHA256.digest(s) }, 'digest/sha2' ],
|
50
|
-
[ :SHA384, proc{|s| Digest::SHA384.digest(s) }, 'digest/sha2' ],
|
51
|
-
[ :SHA512, proc{|s| Digest::SHA512.digest(s) }, 'digest/sha2' ]
|
52
|
-
].each do |hash_symbol, hash_proc, hash_lib|
|
53
|
-
if (hash_lib) then
|
54
|
-
begin
|
55
|
-
require(hash_lib)
|
56
|
-
rescue LoadError
|
57
|
-
next
|
58
|
-
end
|
59
|
-
end
|
60
|
-
BODY_HASH[hash_symbol] = hash_proc
|
61
|
-
end
|
62
|
-
|
63
46
|
BODY_HASH_BIN = {}
|
64
|
-
|
47
|
+
|
48
|
+
[ [ :SUM16, proc{|s| s.sum(16).to_s } ],
|
49
|
+
[ :MD5, proc{|s| Digest::MD5.digest(s) } ],
|
50
|
+
[ :RMD160, proc{|s| Digest::RMD160.digest(s) } ],
|
51
|
+
[ :SHA1, proc{|s| Digest::SHA1.digest(s) } ],
|
52
|
+
[ :SHA256, proc{|s| Digest::SHA256.digest(s) } ],
|
53
|
+
[ :SHA384, proc{|s| Digest::SHA384.digest(s) } ],
|
54
|
+
[ :SHA512, proc{|s| Digest::SHA512.digest(s) } ]
|
55
|
+
].each do |hash_symbol, hash_proc|
|
56
|
+
BODY_HASH[hash_symbol] = hash_proc
|
65
57
|
BODY_HASH_BIN[hash_symbol.to_s] = hash_proc
|
66
58
|
end
|
67
59
|
|
data/lib/higgs/cache.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# = cache 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
|
@@ -16,7 +16,7 @@ module Higgs
|
|
16
16
|
# = cache by Least Recently Used strategy
|
17
17
|
class LRUCache
|
18
18
|
# for ident(1)
|
19
|
-
CVS_ID = '$Id: cache.rb
|
19
|
+
CVS_ID = '$Id: cache.rb 659 2007-10-30 15:36:09Z toki $'
|
20
20
|
|
21
21
|
extend Forwardable
|
22
22
|
|
@@ -73,11 +73,11 @@ module Higgs
|
|
73
73
|
# = multi-thread safe cache
|
74
74
|
class SharedWorkCache
|
75
75
|
# for ident(1)
|
76
|
-
CVS_ID = '$Id: cache.rb
|
76
|
+
CVS_ID = '$Id: cache.rb 659 2007-10-30 15:36:09Z toki $'
|
77
77
|
|
78
78
|
def initialize(cache={}, &work)
|
79
79
|
unless (work) then
|
80
|
-
raise 'required work block'
|
80
|
+
raise ArgumentError, 'required work block'
|
81
81
|
end
|
82
82
|
@work = work
|
83
83
|
@lock = Mutex.new
|
data/lib/higgs/dbm.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
# = storage like dbm
|
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 dbm
|
@@ -53,34 +52,19 @@ module Higgs
|
|
53
52
|
# custom_property[number]: 0
|
54
53
|
# %
|
55
54
|
#
|
56
|
-
class DBM
|
55
|
+
class DBM < StorageManager
|
57
56
|
# for ident(1)
|
58
|
-
CVS_ID = '$Id: dbm.rb
|
59
|
-
|
60
|
-
include Storage::Export
|
61
|
-
include TransactionManager::Export
|
57
|
+
CVS_ID = '$Id: dbm.rb 653 2007-10-23 15:46:00Z toki $'
|
62
58
|
|
63
59
|
DECODE = proc{|r| r }
|
64
60
|
ENCODE = proc{|w| w }
|
65
61
|
|
66
|
-
# <tt>name</tt>
|
67
|
-
# detail. see Higgs::Storage::InitOptions and
|
68
|
-
# Higgs::TransactionManager::InitOptions for <tt>options</tt>.
|
62
|
+
# see Higgs::StorageManager.new for <tt>name</tt> and <tt>options</tt>.
|
69
63
|
def initialize(name, options={})
|
70
|
-
|
64
|
+
options = options.dup
|
71
65
|
options[:decode] = DECODE
|
72
66
|
options[:encode] = ENCODE
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.open(*args)
|
77
|
-
dbm = new(*args)
|
78
|
-
begin
|
79
|
-
r = yield(dbm)
|
80
|
-
ensure
|
81
|
-
dbm.shutdown
|
82
|
-
end
|
83
|
-
r
|
67
|
+
super(name, options)
|
84
68
|
end
|
85
69
|
end
|
86
70
|
end
|
data/lib/higgs/index.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# = storage index
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-10-21 22:40:57 +0900 (Sun, 21 Oct 2007) $
|
5
|
+
# Revision:: $Revision: 649 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
@@ -15,14 +15,14 @@ module Higgs
|
|
15
15
|
# = storage index
|
16
16
|
class Index
|
17
17
|
# for ident(1)
|
18
|
-
CVS_ID = '$Id: index.rb
|
18
|
+
CVS_ID = '$Id: index.rb 649 2007-10-21 13:40:57Z toki $'
|
19
19
|
|
20
20
|
extend Forwardable
|
21
21
|
include Block
|
22
22
|
|
23
23
|
MAGIC_SYMBOL = 'HIGGS_INDEX'
|
24
24
|
MAJOR_VERSION = 0
|
25
|
-
MINOR_VERSION =
|
25
|
+
MINOR_VERSION = 2
|
26
26
|
|
27
27
|
def initialize
|
28
28
|
@change_number = 0
|
@@ -30,10 +30,12 @@ module Higgs
|
|
30
30
|
@free_lists = {}
|
31
31
|
@index = {}
|
32
32
|
@identities = {}
|
33
|
+
@storage_id = nil
|
33
34
|
end
|
34
35
|
|
35
36
|
attr_reader :change_number
|
36
37
|
attr_accessor :eoa
|
38
|
+
attr_accessor :storage_id
|
37
39
|
|
38
40
|
def succ!
|
39
41
|
@change_number = @change_number.succ
|
@@ -104,7 +106,8 @@ module Higgs
|
|
104
106
|
:eoa => @eoa,
|
105
107
|
:free_lists => @free_lists,
|
106
108
|
:index => @index,
|
107
|
-
:identities => @identities
|
109
|
+
:identities => @identities,
|
110
|
+
:storage_id => @storage_id
|
108
111
|
}
|
109
112
|
end
|
110
113
|
|
@@ -130,6 +133,21 @@ module Higgs
|
|
130
133
|
end
|
131
134
|
private :migration_0_0_to_0_1
|
132
135
|
|
136
|
+
def migration_0_1_to_0_2(index_data)
|
137
|
+
if ((index_data[:version] <=> [ 0, 1 ]) > 0) then
|
138
|
+
return
|
139
|
+
end
|
140
|
+
if ((index_data[:version] <=> [ 0, 1 ]) < 0) then
|
141
|
+
raise "unexpected index format version: #{index_data[:version].join('.')}"
|
142
|
+
end
|
143
|
+
|
144
|
+
index_data[:storage_id] = @storage_id
|
145
|
+
index_data[:version] = [ 0, 2 ]
|
146
|
+
|
147
|
+
index_data
|
148
|
+
end
|
149
|
+
private :migration_0_1_to_0_2
|
150
|
+
|
133
151
|
def save(path)
|
134
152
|
tmp_path = "#{path}.tmp.#{$$}"
|
135
153
|
File.open(tmp_path, File::WRONLY | File::CREAT | File::TRUNC, 0660) {|f|
|
@@ -147,6 +165,7 @@ module Higgs
|
|
147
165
|
f.binmode
|
148
166
|
index_data = Marshal.load(block_read(f, MAGIC_SYMBOL))
|
149
167
|
migration_0_0_to_0_1(index_data)
|
168
|
+
migration_0_1_to_0_2(index_data)
|
150
169
|
if (index_data[:version] != [ MAJOR_VERSION, MINOR_VERSION ]) then
|
151
170
|
raise "unsupported version: #{index_data[:version].join('.')}"
|
152
171
|
end
|
@@ -155,6 +174,7 @@ module Higgs
|
|
155
174
|
@free_lists = index_data[:free_lists]
|
156
175
|
@index = index_data[:index]
|
157
176
|
@identities = index_data[:identities]
|
177
|
+
@storage_id = index_data[:storage_id]
|
158
178
|
}
|
159
179
|
self
|
160
180
|
end
|
data/lib/higgs/jlog.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# = journal log writer
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-10-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-10-28 23:35:37 +0900 (Sun, 28 Oct 2007) $
|
5
|
+
# Revision:: $Revision: 657 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
@@ -14,7 +14,7 @@ module Higgs
|
|
14
14
|
# = journal log writer
|
15
15
|
class JournalLogger
|
16
16
|
# for ident(1)
|
17
|
-
CVS_ID = '$Id: jlog.rb
|
17
|
+
CVS_ID = '$Id: jlog.rb 657 2007-10-28 14:35:37Z toki $'
|
18
18
|
|
19
19
|
include Block
|
20
20
|
|
@@ -71,10 +71,6 @@ module Higgs
|
|
71
71
|
|
72
72
|
class << self
|
73
73
|
def has_eof_mark?(path)
|
74
|
-
unless (File.exist? path) then
|
75
|
-
return true
|
76
|
-
end
|
77
|
-
|
78
74
|
File.open(path, 'r') {|f|
|
79
75
|
f.binmode
|
80
76
|
fsiz = f.stat.size
|
@@ -98,7 +94,7 @@ module Higgs
|
|
98
94
|
end
|
99
95
|
|
100
96
|
def need_for_recovery?(path)
|
101
|
-
! (has_eof_mark? path)
|
97
|
+
(File.exist? path) && ! (has_eof_mark? path)
|
102
98
|
end
|
103
99
|
|
104
100
|
def open(path, *args)
|
data/lib/higgs/lock.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# = multi-thread lock manager
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-10-23 00:23:50 +0900 (Tue, 23 Oct 2007) $
|
5
|
+
# Revision:: $Revision: 652 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
@@ -18,7 +18,7 @@ module Higgs
|
|
18
18
|
# = multi-thread lock manager
|
19
19
|
class LockManager
|
20
20
|
# for ident(1)
|
21
|
-
CVS_ID = '$Id: lock.rb
|
21
|
+
CVS_ID = '$Id: lock.rb 652 2007-10-22 15:23:50Z toki $'
|
22
22
|
|
23
23
|
include Exceptions
|
24
24
|
|
@@ -84,7 +84,7 @@ module Higgs
|
|
84
84
|
|
85
85
|
class GiantLockManager < LockManager
|
86
86
|
# for ident(1)
|
87
|
-
CVS_ID = '$Id: lock.rb
|
87
|
+
CVS_ID = '$Id: lock.rb 652 2007-10-22 15:23:50Z toki $'
|
88
88
|
|
89
89
|
def initialize(*args)
|
90
90
|
super
|
@@ -115,14 +115,23 @@ module Higgs
|
|
115
115
|
}
|
116
116
|
r
|
117
117
|
end
|
118
|
+
|
119
|
+
def exclusive
|
120
|
+
r = nil
|
121
|
+
@rw_lock.write_lock.synchronize{
|
122
|
+
r = yield
|
123
|
+
}
|
124
|
+
r
|
125
|
+
end
|
118
126
|
end
|
119
127
|
|
120
128
|
class FineGrainLockManager < LockManager
|
121
129
|
# for ident(1)
|
122
|
-
CVS_ID = '$Id: lock.rb
|
130
|
+
CVS_ID = '$Id: lock.rb 652 2007-10-22 15:23:50Z toki $'
|
123
131
|
|
124
132
|
def initialize(*args)
|
125
133
|
super
|
134
|
+
@tx_lock = ReadWriteLock.new
|
126
135
|
@cache = SharedWorkCache.new{|key| ReadWriteLock.new }
|
127
136
|
end
|
128
137
|
|
@@ -171,13 +180,26 @@ module Higgs
|
|
171
180
|
else
|
172
181
|
lock_handler = ReadWriteLockHandler.new(self, @cache)
|
173
182
|
end
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
183
|
+
|
184
|
+
r = nil
|
185
|
+
@tx_lock.read_lock.synchronize{
|
186
|
+
begin
|
187
|
+
r = yield(lock_handler)
|
188
|
+
ensure
|
189
|
+
for lock in lock_handler.lock_list
|
190
|
+
lock.unlock
|
191
|
+
end
|
179
192
|
end
|
180
|
-
|
193
|
+
}
|
194
|
+
|
195
|
+
r
|
196
|
+
end
|
197
|
+
|
198
|
+
def exclusive
|
199
|
+
r = nil
|
200
|
+
@tx_lock.write_lock.synchronize{
|
201
|
+
r = yield
|
202
|
+
}
|
181
203
|
r
|
182
204
|
end
|
183
205
|
end
|