higgs 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +15 -1
- data/lib/higgs/flock.rb +13 -3
- data/lib/higgs/storage.rb +32 -32
- data/lib/higgs/utils/bman.rb +14 -12
- data/lib/higgs/version.rb +4 -4
- data/test/test_online_backup.rb +3 -3
- data/test/test_storage.rb +11 -9
- metadata +2 -2
data/ChangeLog
CHANGED
@@ -1,8 +1,22 @@
|
|
1
|
+
2007-10-12 TOKI Yoshinori <toki@freedom.ne.jp>
|
2
|
+
|
3
|
+
* lib/higgs/version.rb: version 0.1.2.
|
4
|
+
|
5
|
+
2007-10-10 TOKI Yoshinori <toki@freedom.ne.jp>
|
6
|
+
|
7
|
+
* lib/higgs/storage.rb (Higgs::Storage class),
|
8
|
+
lib/higgs/utils/bman.rb (Higgs::Utils::BackupManager class): fixed
|
9
|
+
some close leakage bugs of file lock in the error case of
|
10
|
+
recovery.
|
11
|
+
|
12
|
+
* lib/higgs/flock.rb (Higgs::FileLock class): open with block.
|
13
|
+
|
1
14
|
2007-10-08 TOKI Yoshinori <toki@freedom.ne.jp>
|
2
15
|
|
3
16
|
* lib/higgs/version.rb: version 0.1.1.
|
4
17
|
|
5
|
-
* lib/higgs/utils/bman.rb
|
18
|
+
* lib/higgs/utils/bman.rb (Higgs::Utils::BackupManager class):
|
19
|
+
added variation of incremental backup.
|
6
20
|
|
7
21
|
* bin/higgs_backup: changed command line syntax. added restore
|
8
22
|
commands.
|
data/lib/higgs/flock.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# = file lock
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-10-10 00:49:33 +0900 (Wed, 10 Oct 2007) $
|
5
|
+
# Revision:: $Revision: 626 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
@@ -11,7 +11,7 @@
|
|
11
11
|
module Higgs
|
12
12
|
class FileLock
|
13
13
|
# for ident(1)
|
14
|
-
CVS_ID = '$Id: flock.rb
|
14
|
+
CVS_ID = '$Id: flock.rb 626 2007-10-09 15:49:33Z toki $'
|
15
15
|
|
16
16
|
def initialize(path, read_only=false)
|
17
17
|
@path = path
|
@@ -68,6 +68,16 @@ module Higgs
|
|
68
68
|
|
69
69
|
r
|
70
70
|
end
|
71
|
+
|
72
|
+
def self.open(*args)
|
73
|
+
flock = new(*args)
|
74
|
+
begin
|
75
|
+
r = yield(flock)
|
76
|
+
ensure
|
77
|
+
flock.close
|
78
|
+
end
|
79
|
+
r
|
80
|
+
end
|
71
81
|
end
|
72
82
|
end
|
73
83
|
|
data/lib/higgs/storage.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# = transactional storage core
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-10-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-10-10 00:49:33 +0900 (Wed, 10 Oct 2007) $
|
5
|
+
# Revision:: $Revision: 626 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
@@ -23,7 +23,7 @@ module Higgs
|
|
23
23
|
# = transactional storage core
|
24
24
|
class Storage
|
25
25
|
# for ident(1)
|
26
|
-
CVS_ID = '$Id: storage.rb
|
26
|
+
CVS_ID = '$Id: storage.rb 626 2007-10-09 15:49:33Z toki $'
|
27
27
|
|
28
28
|
extend Forwardable
|
29
29
|
include Exceptions
|
@@ -837,41 +837,41 @@ module Higgs
|
|
837
837
|
jlog_name = "#{name}.jlog"
|
838
838
|
lock_name = "#{name}.lock"
|
839
839
|
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
840
|
+
FileLock.open(lock_name) {|flock|
|
841
|
+
flock.synchronize{
|
842
|
+
begin
|
843
|
+
w_io = File.open(tar_name, File::WRONLY | File::CREAT | File::EXCL, 0660)
|
844
|
+
rescue Errno::EEXIST
|
845
|
+
w_io = File.open(tar_name, File::WRONLY, 0660)
|
846
|
+
end
|
847
|
+
w_io.binmode
|
848
|
+
w_tar = Tar::ArchiveWriter.new(w_io)
|
849
849
|
|
850
|
-
|
851
|
-
|
850
|
+
index = Index.new
|
851
|
+
index.load(idx_name) if (File.exist? idx_name)
|
852
852
|
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
853
|
+
out << "recovery target: #{name}\n" if (out && verbose_level >= 1)
|
854
|
+
jlog_list = rotate_entries(jlog_name)
|
855
|
+
jlog_list << jlog_name if (File.exist? jlog_name)
|
856
|
+
for curr_name in jlog_list
|
857
|
+
begin
|
858
|
+
JournalLogger.each_log(curr_name) do |log|
|
859
|
+
change_number = log[0]
|
860
|
+
out << "apply journal log: #{change_number}\n" if (out && verbose_level >= 1)
|
861
|
+
apply_journal(w_tar, index, log)
|
862
|
+
end
|
863
|
+
rescue Block::BrokenError
|
864
|
+
out << "warning: incompleted journal log and stopped at #{curr_name}\n" if out
|
862
865
|
end
|
863
|
-
rescue Block::BrokenError
|
864
|
-
out << "warning: incompleted journal log and stopped at #{curr_name}\n" if out
|
865
866
|
end
|
866
|
-
|
867
|
-
|
868
|
-
w_tar.write_EOA
|
867
|
+
w_tar.seek(index.eoa)
|
868
|
+
w_tar.write_EOA
|
869
869
|
|
870
|
-
|
871
|
-
|
872
|
-
|
870
|
+
index.save(idx_name)
|
871
|
+
w_tar.fsync
|
872
|
+
w_tar.close(false)
|
873
|
+
}
|
873
874
|
}
|
874
|
-
flock.close
|
875
875
|
|
876
876
|
nil
|
877
877
|
end
|
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-10-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-10-10 00:49:33 +0900 (Wed, 10 Oct 2007) $
|
5
|
+
# Revision:: $Revision: 626 $
|
6
6
|
#
|
7
7
|
# == license
|
8
8
|
# :include:LICENSE
|
@@ -146,7 +146,7 @@ module Higgs
|
|
146
146
|
# as <tt>BACKUP_TARGET_STORAGE</tt>.
|
147
147
|
#
|
148
148
|
# === OPTION: <tt>--jlog-rotate-service-uri=URI</tt>
|
149
|
-
# access point journal log rotation remote service.
|
149
|
+
# access point for journal log rotation remote service.
|
150
150
|
# <tt>URI</tt> is the same as <tt>:jlog_rotate_service_uri</tt>
|
151
151
|
# when Higgs::Storage is opened.
|
152
152
|
#
|
@@ -158,7 +158,7 @@ module Higgs
|
|
158
158
|
#
|
159
159
|
class BackupManager
|
160
160
|
# for ident(1)
|
161
|
-
CVS_ID = '$Id: bman.rb
|
161
|
+
CVS_ID = '$Id: bman.rb 626 2007-10-09 15:49:33Z toki $'
|
162
162
|
|
163
163
|
def initialize(options={})
|
164
164
|
@from = options[:from]
|
@@ -326,14 +326,16 @@ module Higgs
|
|
326
326
|
unless (@to) then
|
327
327
|
raise 'required to_storage'
|
328
328
|
end
|
329
|
-
FileLock.
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
path
|
334
|
-
|
335
|
-
|
336
|
-
|
329
|
+
FileLock.open("#{@from}.lock") {|flock|
|
330
|
+
flock.synchronize{
|
331
|
+
FileUtils.cp("#{@to}.idx", "#{@from}.idx", :preserve => true, :verbose => @verbose >= 2)
|
332
|
+
FileUtils.cp("#{@to}.tar", "#{@from}.tar", :preserve => true, :verbose => @verbose >= 2)
|
333
|
+
for path in Storage.rotate_entries("#{@to}.jlog")
|
334
|
+
path =~ /\.jlog\.\d+$/ or raise "mismatch jlog name: #{path}"
|
335
|
+
ext = $&
|
336
|
+
FileUtils.cp(path, "#{@from}#{ext}", :preserve => true, :verbose => @verbose >= 2)
|
337
|
+
end
|
338
|
+
}
|
337
339
|
}
|
338
340
|
@out << log('completed storage files restore.') if (@verbose >= 1)
|
339
341
|
nil
|
data/lib/higgs/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# = version
|
2
2
|
#
|
3
3
|
# Author:: $Author: toki $
|
4
|
-
# Date:: $Date: 2007-10-
|
5
|
-
# Revision:: $Revision:
|
4
|
+
# Date:: $Date: 2007-10-12 16:19:52 +0900 (Fri, 12 Oct 2007) $
|
5
|
+
# Revision:: $Revision: 628 $
|
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 628 2007-10-12 07:19:52Z toki $'
|
14
14
|
|
15
|
-
VERSION = '0.1.
|
15
|
+
VERSION = '0.1.2'
|
16
16
|
end
|
17
17
|
|
18
18
|
# Local Variables:
|
data/test/test_online_backup.rb
CHANGED
@@ -30,7 +30,7 @@ module Higgs::Test
|
|
30
30
|
include OnlineBackupParams
|
31
31
|
|
32
32
|
# for ident(1)
|
33
|
-
CVS_ID = '$Id: test_online_backup.rb
|
33
|
+
CVS_ID = '$Id: test_online_backup.rb 627 2007-10-12 07:10:13Z toki $'
|
34
34
|
|
35
35
|
def setup
|
36
36
|
srand(0)
|
@@ -143,9 +143,9 @@ module Higgs::Test
|
|
143
143
|
Storage.recover(@restore_name)
|
144
144
|
|
145
145
|
# recovered files are same as original files.
|
146
|
-
assert(FileUtils.cmp("#{@backup_name}.tar", "#{@restore_name}.tar"), '
|
146
|
+
assert(FileUtils.cmp("#{@backup_name}.tar", "#{@restore_name}.tar"), 'data')
|
147
147
|
assert_equal(Index.new.load("#{@backup_name}.idx").to_h,
|
148
|
-
Index.new.load("#{@restore_name}.idx").to_h, '
|
148
|
+
Index.new.load("#{@restore_name}.idx").to_h, 'index')
|
149
149
|
ensure
|
150
150
|
FileUtils.touch(@stop_latch)
|
151
151
|
FileUtils.touch(@end_latch)
|
data/test/test_storage.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_storage.rb
|
13
|
+
CVS_ID = '$Id: test_storage.rb 627 2007-10-12 07:10:13Z toki $'
|
14
14
|
|
15
15
|
def setup
|
16
16
|
srand(0) # preset for rand
|
@@ -36,7 +36,7 @@ module Higgs::Test
|
|
36
36
|
include StorageTestCase
|
37
37
|
|
38
38
|
# for ident(1)
|
39
|
-
CVS_ID = '$Id: test_storage.rb
|
39
|
+
CVS_ID = '$Id: test_storage.rb 627 2007-10-12 07:10:13Z toki $'
|
40
40
|
|
41
41
|
def new_storage
|
42
42
|
Storage.new(@name, :logger => @logger)
|
@@ -372,7 +372,7 @@ module Higgs::Test
|
|
372
372
|
include StorageTestCase
|
373
373
|
|
374
374
|
# for ident(1)
|
375
|
-
CVS_ID = '$Id: test_storage.rb
|
375
|
+
CVS_ID = '$Id: test_storage.rb 627 2007-10-12 07:10:13Z toki $'
|
376
376
|
|
377
377
|
def new_storage
|
378
378
|
Storage.new(@name,
|
@@ -421,8 +421,9 @@ module Higgs::Test
|
|
421
421
|
end
|
422
422
|
Storage.recover(other_name)
|
423
423
|
|
424
|
-
assert(FileUtils.cmp("#{@name}.tar", "#{other_name}.tar"), '
|
425
|
-
assert(
|
424
|
+
assert(FileUtils.cmp("#{@name}.tar", "#{other_name}.tar"), 'data')
|
425
|
+
assert(Index.new.load("#{@name}.idx").to_h ==
|
426
|
+
Index.new.load("#{other_name}.idx").to_h, 'index')
|
426
427
|
end
|
427
428
|
|
428
429
|
def test_auto_recovery
|
@@ -445,9 +446,10 @@ module Higgs::Test
|
|
445
446
|
st2 = Storage.new(other_name, :logger => @logger)
|
446
447
|
st2.shutdown
|
447
448
|
|
448
|
-
assert(FileUtils.cmp("#{@name}.tar", "#{other_name}.tar"), '
|
449
|
-
assert(
|
450
|
-
|
449
|
+
assert(FileUtils.cmp("#{@name}.tar", "#{other_name}.tar"), 'data')
|
450
|
+
assert(Index.new.load("#{@name}.idx").to_h ==
|
451
|
+
Index.new.load("#{other_name}.idx").to_h)
|
452
|
+
assert(FileUtils.cmp("#{@name}.jlog", "#{other_name}.jlog"), 'index')
|
451
453
|
end
|
452
454
|
|
453
455
|
def test_lost_journal_log_error
|
@@ -474,7 +476,7 @@ module Higgs::Test
|
|
474
476
|
include Higgs
|
475
477
|
|
476
478
|
# for ident(1)
|
477
|
-
CVS_ID = '$Id: test_storage.rb
|
479
|
+
CVS_ID = '$Id: test_storage.rb 627 2007-10-12 07:10:13Z toki $'
|
478
480
|
|
479
481
|
def setup
|
480
482
|
@test_dir = 'st_test'
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: higgs
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-10-
|
6
|
+
version: 0.1.2
|
7
|
+
date: 2007-10-12 00:00:00 +09:00
|
8
8
|
summary: pure ruby transactional storage compatible with unix TAR format
|
9
9
|
require_paths:
|
10
10
|
- lib
|