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)