redsnapper 0.2.0 → 0.2.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: 062acc09584fa69d3d578a9e3c31f8e43c894e6f
4
- data.tar.gz: 802d7dcd2beeef69c6d36e12f81d69717f22137a
3
+ metadata.gz: c309291faf31352831f25043200a135caf7bcfec
4
+ data.tar.gz: 5257b0a6599e3a6b651d19774fac3b3d6cf89d11
5
5
  SHA512:
6
- metadata.gz: c11dfc51cd54450e5e9e1c5304021e06130997e98fa9c8a07539e499dac07b1b4cce05e0d0e519d01fa4d41e005d2743eb4c782f55d26074333982453a2bb5fa
7
- data.tar.gz: c09deb701584d816271ad581d276ee58ab472af3329ab0f2badad4c00f7c38f3684013d042b7146d9df992c753b2b49a3b2bcfd22457d6a0817ea89ef1546004
6
+ metadata.gz: 5c6ef06d9e9a0c067cfd4dfcf19125d2a4420f877fa38985d6db376379c7f98df3e8da6b21ce0943b8890e21fd3da7f289a867051c5b0539a89da359a332ef84
7
+ data.tar.gz: 39b6eca49cc73cf4f4771b6d0b6b22f78e2fdbe220e8ff1d6509c036eb050ebe513573487eb14f6e5be25204e7bf26fddbc8feaafa702215374c212743a2daac
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -10,6 +10,13 @@ OptionParser.new do |opts|
10
10
  opts.on('-d', '--directory DIR', 'Extract files from this directory of the archive') do |dir|
11
11
  options[:directory] = dir
12
12
  end
13
+ opts.on('-j', '--jobs COUNT', Integer, 'Number of workers to use') do |jobs|
14
+ options[:thread_pool_size] = jobs
15
+ end
16
+ opts.on('-m', '--max-files-per-job COUNT', Integer,
17
+ 'Maximum number of files to extract in one job') do |count|
18
+ options[:max_files_per_job] = count
19
+ end
13
20
  end.parse!
14
21
 
15
22
  RedSnapper.new(ARGV.shift, options.merge(:tarsnap_options => ARGV)).run
@@ -2,6 +2,21 @@ require 'thread/pool'
2
2
  require 'open3'
3
3
  require 'set'
4
4
 
5
+ class Array
6
+ def interleaved_slices(max_per_slice)
7
+ raise ArgumentError unless max_per_slice >= 1
8
+
9
+ count = (size.to_f / max_per_slice).ceil
10
+
11
+ slices = (1..count).map { [] }
12
+ each_with_index do |v, i|
13
+ slices[i % count].push(v)
14
+ end
15
+
16
+ slices
17
+ end
18
+ end
19
+
5
20
  class RedSnapper
6
21
  TARSNAP = 'tarsnap'
7
22
  THREAD_POOL_SIZE = 10
@@ -10,6 +25,8 @@ class RedSnapper
10
25
  def initialize(archive, options = {})
11
26
  @archive = archive
12
27
  @options = options
28
+ @max_files_per_job = options[:max_files_per_job] || MAX_FILES_PER_JOB
29
+ @thread_pool_size = options[:thread_pool_size] || THREAD_POOL_SIZE
13
30
  end
14
31
 
15
32
  def file_groups
@@ -40,11 +57,12 @@ class RedSnapper
40
57
  end
41
58
 
42
59
  files.push(*empty_dirs)
43
- files.each_slice([ (files.size.to_f / THREAD_POOL_SIZE).ceil, MAX_FILES_PER_JOB ].min).to_a
60
+ files_per_slice = [ (files.size.to_f / @thread_pool_size).ceil, @max_files_per_job ].min
61
+ files.interleaved_slices(files_per_slice)
44
62
  end
45
63
 
46
64
  def run
47
- pool = Thread.pool(THREAD_POOL_SIZE)
65
+ pool = Thread.pool(@thread_pool_size)
48
66
  mutex = Mutex.new
49
67
 
50
68
  file_groups.each do |chunk|
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: redsnapper 0.2.0 ruby lib
5
+ # stub: redsnapper 0.2.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "redsnapper"
9
- s.version = "0.2.0"
9
+ s.version = "0.2.1"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Scott Wheeler"]
14
- s.date = "2016-12-16"
14
+ s.date = "2016-12-30"
15
15
  s.description = "Faster extraction of large tarsnap archives using a pool of parallel tarsnap clients"
16
16
  s.email = "scott@directededge.com"
17
17
  s.executables = ["redsnapper"]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redsnapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Wheeler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-16 00:00:00.000000000 Z
11
+ date: 2016-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thread