lib/s3backup/manager.rb in s3backup-0.6.10 vs lib/s3backup/manager.rb in s3backup-0.7.01
- old
+ new
@@ -19,10 +19,11 @@
}
return a.join;
end
def initialize(target,config)
@target = target
+ @resume = false
set_config(config)
end
def set_config(config)
if config["password"] and config["password"] != ""
unless config["salt"]
@@ -31,25 +32,41 @@
end
unless config["salt"] =~ /[0-9A-Fa-f]{16}/
S3log.error("salt format shoud be HexString and length should be 16.\n")
exit(-1)
end
- if config["buffer_size"]
- if config["buffer_size"].class == String
- @buf_size = config["buffer_size"].to_i
- else
- @buf_size = config["buffer_size"]
- end
- if @buf_size > 1000*1000*1000*5
- S3log.error("buffer_size must be less than 5G\n")
- exit(-1)
- end
+ @aes = Crypt.new(config["password"],config["salt"])
+ end
+ if config["buffer_size"]
+ if config["buffer_size"].class == String
+ @buf_size = config["buffer_size"].to_i
else
- @buf_size = DEFAULT_BUF_READ_SIZE
+ @buf_size = config["buffer_size"]
end
- @aes = Crypt.new(config["password"],config["salt"])
+ if @buf_size > 1000*1000*1000*5
+ S3log.error("buffer_size must be less than 5G\n")
+ exit(-1)
+ end
+ else
+ @buf_size = DEFAULT_BUF_READ_SIZE
end
+ if config["buffer_size"]
+ if config["buffer_size"].class == String
+ @buf_size = config["buffer_size"].to_i
+ else
+ @buf_size = config["buffer_size"]
+ end
+ if @buf_size > 1000*1000*1000*5
+ S3log.error("buffer_size must be less than 5G\n")
+ exit(-1)
+ end
+ else
+ @buf_size = DEFAULT_BUF_READ_SIZE
+ end
+ if config["resume"] == true
+ @resume = true
+ end
end
#指定されたディレクトリをtar gzip形式で圧縮する
def to_tgz(path,dir)
#サブディレクトリを圧縮の対象外にする。
sub_dir = []
@@ -173,21 +190,29 @@
old_tree = TreeInfo.new(@target.get(target_tree_name))
#前回と今回のファイル・ツリーを比較
diff_info = tree_info.diff(old_tree)
S3log.debug("diff_info=#{diff_info.inspect}")
-
+ dir_map = nil
+ if @resume
+ new_dir_map = tree_info.make_dir_map
+ old_dir_map = old_tree.make_dir_map
+ else
+ #メモリ節約のため開放
+ old_tree = nil
+ end
update_dir = diff_info[:directory][:add] + diff_info[:directory][:modify]
#更新されたディレクトリをアップロード
update_dir.each do |udir|
GC.start
store_directory(udir)
- udir_info = tree_info.get_dir_info(udir)
- #前回のファイル・ツリー情報のうち、今回アップデートしたディレクトリ情報ファイル情報を更新
- old_tree.update_dir(udir,udir_info)
- #更新したファイル・ツリー情報をアップロード(途中で失敗しても、resumeできるようにするため。)
- @target.post(target_tree_name,old_tree.dump_yaml)
+ if @resume
+ #前回のファイル・ツリー情報のうち、今回アップデートしたディレクトリ情報ファイル情報を更新
+ old_dir_map = old_tree.update_dir(udir,old_dir_map,new_dir_map[udir])
+ #更新したファイル・ツリー情報をアップロード(途中で失敗しても、resumeできるようにするため。)
+ @target.post(target_tree_name,old_tree.dump_yaml)
+ end
end
diff_info[:directory][:remove].each do |rm_dir|
delete_direcory(rm_dir)
end
#今回のファイル・ツリーをAWS S3に登録
@@ -224,10 +249,11 @@
m[1]
end
return dirs.compact
end
def expand_tree(dir,tree_info,output_dir)
+ now = Time.new
tree = tree_info.hierarchie(dir)
top = tree[0].keys[0]
top_dir = File.dirname(top)
tmp_dir = CGI.escape(top_dir)
output_dir = output_dir+"/"+tmp_dir
@@ -239,10 +265,10 @@
(tree.length - 1).downto(0){|n|
tree[n].each do |k,v|
dir_len = k.length
relative_path = k.slice(top_dir_len,dir_len - top_dir_len)
dir = output_dir + relative_path
- File.utime(v[:atime],v[:mtime],dir)
+ File.utime(now,v[:mtime],dir)
end
}
end
def restore(dir,output_dir)
tree = get_target_tree(dir)