s3_meta_sync 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5656a323ca7eaad2a794b645ff158819a2d1edd6
4
- data.tar.gz: 47323041dbc94b89b34aa8dc821eb54dd9be3880
3
+ metadata.gz: 7e7e8df15d87392103c01db3a50028655bfaeee1
4
+ data.tar.gz: eb8535f78ac0c43e5446f24d940c40f927548e97
5
5
  SHA512:
6
- metadata.gz: 3b8037f17c549849ab87b37c4587c68cdaaafe70d0532f556dbfd7e30a6f6d9a42ab1d28ffa6668d401e07ecfd2328282b94b366c54e94f3e0d740536e480ce5
7
- data.tar.gz: 37130dbe101aa047ad4fdd30163a5cd20754985368eb2db6b4db98d84e72ae2a84e4fad4b99ea64d62d637d04cb89c0c20744ea6aec5c59eb4569079e2a16431
6
+ metadata.gz: 16603033e2b2c25c91df705cb4ae1ecefcd94bf79f2cb5859986a828e980ae882a99c6bbb9643bdd219d335bf67a4caaea95d6e150bf87a6d85cc211c19dfa1b
7
+ data.tar.gz: 25154a729785baf27091469c2a08b735b80105d829f2e01368a6ad539212539a155ba6ca4edb6410f9cb1582c95ee3c2e3a9e672b42a4c868637b54e6b1660d8
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/lib/s3_meta_sync.rb CHANGED
@@ -19,6 +19,7 @@ module S3MetaSync
19
19
  RemoteWithoutMeta = Class.new(Exception)
20
20
  RemoteCorrupt = Class.new(Exception)
21
21
  META_FILE = ".s3-meta-sync"
22
+ CORRUPT_FILES_LOG = "s3-meta-sync-corrupted.log"
22
23
 
23
24
  class Syncer
24
25
  def initialize(config)
@@ -40,15 +41,16 @@ module S3MetaSync
40
41
  private
41
42
 
42
43
  def upload(source, destination)
44
+ corrupted = consume_corrupted_files(source)
43
45
  remote_info = begin
44
46
  download_meta(destination)
45
47
  rescue RemoteWithoutMeta
46
- log "Remote has no .s3-meta-sync, uploading everything"
48
+ log "Remote has no .s3-meta-sync, uploading everything", true
47
49
  {}
48
50
  end
49
51
  generate_meta(source)
50
52
  local_info = read_meta(source)
51
- upload = local_info.select { |path, md5| remote_info[path] != md5 }.map(&:first)
53
+ upload = local_info.select { |path, md5| remote_info[path] != md5 }.map(&:first) | corrupted
52
54
  delete = remote_info.keys - local_info.keys
53
55
  log "Uploading: #{upload.size} Deleting: #{delete.size}", true
54
56
 
@@ -67,14 +69,14 @@ module S3MetaSync
67
69
  log "Downloading: #{download.size} Deleting: #{delete.size}", true
68
70
 
69
71
  unless download.empty? && delete.empty?
70
- Dir.mktmpdir do |dir|
71
- copy_content(destination, dir)
72
- download_files(source, dir, download)
73
- delete_local_files(dir, delete)
74
- download_file(source, META_FILE, dir)
75
- verify_integrity!(dir)
76
- delete_empty_folders(dir)
77
- swap_in_directory(destination, dir)
72
+ Dir.mktmpdir do |staging_area|
73
+ copy_content(destination, staging_area)
74
+ download_files(source, staging_area, download)
75
+ delete_local_files(staging_area, delete)
76
+ download_file(source, META_FILE, staging_area)
77
+ verify_integrity!(staging_area, destination)
78
+ delete_empty_folders(staging_area)
79
+ swap_in_directory(destination, staging_area)
78
80
  end
79
81
  end
80
82
  end
@@ -89,17 +91,29 @@ module S3MetaSync
89
91
  FileUtils.mkdir(dir) # make ensure in outside mktmpdir not blow up
90
92
  end
91
93
 
92
- def verify_integrity!(source)
93
- file = "#{source}/#{META_FILE}"
94
- old = File.read(file)
95
- generate_meta(source)
96
- new = File.read(file)
97
- if new != old
98
- log "old meta:\n#{old}\n\nnew meta:\n#{new}", true
94
+ def verify_integrity!(staging_area, destination)
95
+ file = "#{staging_area}/#{META_FILE}"
96
+ downloaded = YAML.load_file(file)
97
+ actual = meta_data(staging_area)
98
+
99
+ if downloaded != actual
100
+ corrupted = actual.select { |file, md5| downloaded[file] != md5 }.map(&:first)
101
+ File.write("#{destination}/#{CORRUPT_FILES_LOG}", corrupted.join("\n"))
102
+ log "corrupted files downloaded:\n#{corrupted.join("\n")}", true
99
103
  raise RemoteCorrupt
100
104
  end
101
- ensure
102
- File.write(file, old) if old
105
+ end
106
+
107
+ def consume_corrupted_files(source)
108
+ log = "#{source}/#{CORRUPT_FILES_LOG}"
109
+ if File.exist?(log)
110
+ corrupted = File.read(log).split("\n")
111
+ log "force uploading #{corrupted.size} corrupted files", true
112
+ File.unlink log
113
+ corrupted
114
+ else
115
+ []
116
+ end
103
117
  end
104
118
 
105
119
  def upload_file(source, path, destination)
@@ -236,6 +250,7 @@ module S3MetaSync
236
250
  opts.on("-s", "--secret SECRET", "AWS secret key") { |c| options[:secret] = c }
237
251
  opts.on("-r", "--region REGION", "AWS region if not us-standard") { |c| options[:region] = c }
238
252
  opts.on("-p", "--parallel COUNT", Integer, "Use COUNT threads for download/upload default: 10") { |c| options[:parallel] = c }
253
+ opts.on("--log-corrupted-files", "Log corrupted files, they will be force uploaded on the next run") { |c| options[:log_corrupted_files] = true }
239
254
  opts.on("--ssl-none", "Do not verify ssl certs") { |c| options[:ssl_none] = true }
240
255
  opts.on("-V", "--verbose", "Verbose mode"){ options[:verbose] = true }
241
256
  opts.on("-h", "--help", "Show this.") { puts opts; exit }
@@ -1,3 +1,3 @@
1
1
  module S3MetaSync
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: s3_meta_sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
@@ -30,7 +30,7 @@ cert_chain:
30
30
  F5etKHZg0j3eHO31/i2HnswY04lqGImUu6aM5EnijFTB7PPW2KwKKM4+kKDYFdlw
31
31
  /0WV1Ng2/Y6qsHwmqGg2VlYj2h4=
32
32
  -----END CERTIFICATE-----
33
- date: 2014-02-27 00:00:00.000000000 Z
33
+ date: 2014-03-01 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: aws-sdk
metadata.gz.sig CHANGED
Binary file