blobsterix 0.0.35 → 0.0.36
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/blobsterix/exceptions.rb +2 -0
- data/lib/blobsterix/storage/file_system.rb +118 -46
- data/lib/blobsterix/storage/file_system_meta_data.rb +28 -17
- data/lib/blobsterix/storage/storage.rb +3 -0
- data/lib/blobsterix/transformation/transformation_manager.rb +2 -2
- data/lib/blobsterix/version.rb +1 -1
- data/templates/storage_template.rb +4 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7445c28b6f045636c287259d79540cb33490a6e5
|
4
|
+
data.tar.gz: 301c5d44eba26cb07e3cbe0c8ca24598ecf4c0cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79d8ada8a2a3c8fe79c3f26b5f93fda2b97a36e7e6f09f326fa4e92ac55cec620a2099ee50940a7709b0a127027fcad4535c25b869cab3e04f64ca7a85643079
|
7
|
+
data.tar.gz: 0bb50d3e731c1f7868861043c9029155c44f1ac7d0e9c0175a590065b16eeaf0027ac7fc69c1b3fc4d54b02037f2b122b2f704a4d3f2200220cc2912d17ac409
|
@@ -7,93 +7,151 @@ module Blobsterix
|
|
7
7
|
include Blobsterix::Logable
|
8
8
|
|
9
9
|
def initialize(path)
|
10
|
-
|
11
|
-
@contents =
|
12
|
-
FileUtils.mkdir_p(@contents) unless Dir.exist?(@contents)
|
13
|
-
FileUtils.touch File.join(@contents,".keep")
|
10
|
+
@contents_path = path
|
11
|
+
@contents = nil
|
14
12
|
end
|
15
13
|
|
16
14
|
def bucket_exist(bucket="root")
|
17
|
-
|
15
|
+
begin
|
16
|
+
Dir.entries(contents).include?(bucket) and File.directory?(File.join(contents,bucket))
|
17
|
+
rescue => e
|
18
|
+
if e.is_a? ::Blosterix::BlobsterixStorageError
|
19
|
+
raise e
|
20
|
+
else
|
21
|
+
raise ::Blosterix::BlobsterixStorageError.new("Could not check for bucket")
|
22
|
+
end
|
23
|
+
end
|
18
24
|
end
|
19
25
|
|
20
26
|
def list(bucket="root", opts={})
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
if bucket_exist(bucket)
|
25
|
-
b = Bucket.new(bucket, time_string_of(bucket))
|
26
|
-
b.marker = opts[:start_path] if opts[:start_path]
|
27
|
-
Blobsterix.wait_for(Proc.new {
|
28
|
-
collect_bucket_entries(bucket, b, opts)
|
29
|
-
})
|
30
|
-
b
|
27
|
+
begin
|
28
|
+
if bucket =~ /root/
|
29
|
+
list_buckets
|
31
30
|
else
|
32
|
-
|
33
|
-
|
31
|
+
if bucket_exist(bucket)
|
32
|
+
b = Bucket.new(bucket, time_string_of(bucket))
|
33
|
+
b.marker = opts[:start_path] if opts[:start_path]
|
34
|
+
Blobsterix.wait_for(Proc.new {
|
35
|
+
collect_bucket_entries(bucket, b, opts)
|
36
|
+
})
|
37
|
+
b
|
38
|
+
else
|
39
|
+
Nokogiri::XML::Builder.new do |xml|
|
40
|
+
xml.Error "no such bucket"
|
41
|
+
end
|
34
42
|
end
|
35
43
|
end
|
44
|
+
rescue => e
|
45
|
+
if e.is_a? ::Blosterix::BlobsterixStorageError
|
46
|
+
raise e
|
47
|
+
else
|
48
|
+
raise ::Blosterix::BlobsterixStorageError.new("Could not list bucket(s)")
|
49
|
+
end
|
36
50
|
end
|
37
51
|
end
|
38
52
|
|
39
53
|
def get(bucket, key)
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
54
|
+
begin
|
55
|
+
if (not File.directory?(contents(bucket, key))) # and bucket_files(bucket).include?(key)
|
56
|
+
Blobsterix.storage_read(BlobAccess.new(:bucket => bucket, :id => key))
|
57
|
+
metaData(bucket, key)
|
58
|
+
else
|
59
|
+
Blobsterix.storage_read_fail(BlobAccess.new(:bucket => bucket, :id => key))
|
60
|
+
Blobsterix::Storage::BlobMetaData.new
|
61
|
+
end
|
62
|
+
rescue => e
|
63
|
+
if e.is_a? ::Blosterix::BlobsterixStorageError
|
64
|
+
raise e
|
65
|
+
else
|
66
|
+
raise ::Blosterix::BlobsterixStorageError.new("Could not get bucket entry: #{@contents_path}")
|
67
|
+
end
|
46
68
|
end
|
47
69
|
end
|
48
70
|
|
49
71
|
def put(bucket, key, value, opts={})
|
50
|
-
|
72
|
+
begin
|
73
|
+
Blobsterix.storage_write(BlobAccess.new(:bucket => bucket, :id => key))
|
51
74
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
75
|
+
meta = Blobsterix.wait_for(Proc.new do
|
76
|
+
result = metaData(bucket, key).write() do |f|
|
77
|
+
FileUtils.copy_stream(value, f)
|
78
|
+
end
|
79
|
+
FileUtils.touch File.join(contents(bucket), ".keep")
|
80
|
+
result
|
81
|
+
end)
|
59
82
|
|
60
|
-
|
83
|
+
value.close if opts[:close_after_write]
|
61
84
|
|
62
|
-
|
85
|
+
Blobsterix.wait_for(Proc.new {Blobsterix.cache.invalidate(Blobsterix::BlobAccess.new(:bucket => bucket, :id => key))})
|
63
86
|
|
64
|
-
|
87
|
+
meta
|
88
|
+
rescue => e
|
89
|
+
if e.is_a? ::Blosterix::BlobsterixStorageError
|
90
|
+
raise e
|
91
|
+
else
|
92
|
+
raise ::Blosterix::BlobsterixStorageError.new("Could not create bucket entry")
|
93
|
+
end
|
94
|
+
end
|
65
95
|
end
|
66
96
|
|
67
97
|
def create(bucket)
|
68
|
-
|
69
|
-
|
70
|
-
|
98
|
+
begin
|
99
|
+
logger.info "Storage: create bucket #{contents(bucket)}"
|
100
|
+
FileUtils.mkdir_p(contents(bucket)) unless File.exist?(contents(bucket))
|
101
|
+
FileUtils.touch File.join(contents(bucket), ".keep")
|
71
102
|
|
72
|
-
|
73
|
-
|
103
|
+
Nokogiri::XML::Builder.new do |xml|
|
104
|
+
end.to_s
|
105
|
+
rescue => e
|
106
|
+
if e.is_a? ::Blosterix::BlobsterixStorageError
|
107
|
+
raise e
|
108
|
+
else
|
109
|
+
raise ::Blosterix::BlobsterixStorageError.new("Could not create bucket")
|
110
|
+
end
|
111
|
+
end
|
74
112
|
end
|
75
113
|
|
76
114
|
def delete(bucket)
|
77
|
-
|
78
|
-
|
79
|
-
|
115
|
+
begin
|
116
|
+
logger.info "Storage: delete bucket #{contents(bucket)}"
|
117
|
+
FileUtils.rm_rf(contents(bucket)) if bucket_exist(bucket) && bucket_empty?(bucket)
|
118
|
+
rescue => e
|
119
|
+
if e.is_a? ::Blosterix::BlobsterixStorageError
|
120
|
+
raise e
|
121
|
+
else
|
122
|
+
raise ::Blosterix::BlobsterixStorageError.new("Could not delete bucket")
|
123
|
+
end
|
124
|
+
end
|
80
125
|
end
|
81
126
|
|
82
127
|
def delete_key(bucket, key)
|
83
|
-
|
84
|
-
|
128
|
+
begin
|
129
|
+
Blobsterix.storage_delete(BlobAccess.new(:bucket => bucket, :id => key))
|
130
|
+
Blobsterix.wait_for(Proc.new {Blobsterix.cache.invalidate(Blobsterix::BlobAccess.new(:bucket => bucket, :id => key))})
|
131
|
+
|
132
|
+
metaData(bucket, key).delete # if bucket_files(bucket).include? key
|
133
|
+
rescue => e
|
134
|
+
if e.is_a? ::Blosterix::BlobsterixStorageError
|
135
|
+
raise e
|
136
|
+
else
|
137
|
+
raise ::Blosterix::BlobsterixStorageError.new("Could not delete bucket key")
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
85
141
|
|
86
|
-
|
142
|
+
def name
|
143
|
+
@contents_path
|
87
144
|
end
|
88
145
|
|
89
146
|
private
|
90
147
|
def list_buckets
|
91
148
|
BucketList.new do |l|
|
92
149
|
Dir.entries("#{contents}").each{|dir|
|
93
|
-
l.buckets << Bucket.new(dir, time_string_of(dir)) if File.directory? File.join("#{contents}",dir) and !(dir =='.' || dir == '..')
|
150
|
+
l.buckets << Bucket.new(dir, time_string_of(dir)) if File.directory? File.join("#{contents}",dir) and !(dir =='.' || dir == '..')
|
94
151
|
}
|
95
152
|
end
|
96
153
|
end
|
154
|
+
|
97
155
|
def collect_bucket_entries(bucket, b, opts)
|
98
156
|
start_path = map_filename(opts[:start_path].to_s.gsub("/", "\\")) if opts[:start_path]
|
99
157
|
current_obj = Blobsterix::DirectoryList.each_limit(contents(bucket), :limit => 20, :start_path => start_path) do |path, file|
|
@@ -110,7 +168,9 @@ module Blobsterix
|
|
110
168
|
b.truncated=true
|
111
169
|
end
|
112
170
|
end
|
171
|
+
|
113
172
|
def contents(bucket=nil, key=nil)
|
173
|
+
initialize_contents
|
114
174
|
if bucket
|
115
175
|
key ? File.join(@contents, bucket, map_filename(key.gsub("/", "\\"))) : File.join(@contents, bucket)
|
116
176
|
else
|
@@ -118,6 +178,18 @@ module Blobsterix
|
|
118
178
|
end
|
119
179
|
end
|
120
180
|
|
181
|
+
def initialize_contents
|
182
|
+
return if @contents != nil
|
183
|
+
begin
|
184
|
+
logger.info "Create FileSystem at #{@contents_path}"
|
185
|
+
FileUtils.mkdir_p(@contents_path) unless Dir.exist?(@contents_path)
|
186
|
+
FileUtils.touch File.join(@contents_path,".keep")
|
187
|
+
@contents = @contents_path
|
188
|
+
rescue
|
189
|
+
raise ::Blosterix::BlobsterixStorageError.new("Could not connect to FileSystem")
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
121
193
|
def map_filename(filename)
|
122
194
|
Murmur.map_filename(filename, filename)
|
123
195
|
end
|
@@ -67,7 +67,7 @@ module Blobsterix
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def header()
|
70
|
-
{"Etag" => etag, "Content-Type" => mimetype, "Last-Modified" => last_modified.strftime("%Y
|
70
|
+
{"Etag" => etag, "Content-Type" => mimetype, "Last-Modified" => last_modified.strftime("%a, %d %b %Y %H:%M:%S GMT"), "Cache-Control" => "max-age=#{60*60*24}", "Expires" => (Time.new+(60*60*24)).strftime("%a, %d %b %Y %H:%M:%S GMT")}
|
71
71
|
end
|
72
72
|
|
73
73
|
def valid
|
@@ -79,24 +79,32 @@ module Blobsterix
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def write
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
82
|
+
begin
|
83
|
+
if block_given?
|
84
|
+
delete
|
85
|
+
FileUtils.mkdir_p(File.dirname(path))
|
86
|
+
f = File.open(path, "wb")
|
87
|
+
yield f
|
88
|
+
f.close
|
89
|
+
end
|
90
|
+
save_meta_file
|
91
|
+
self
|
92
|
+
rescue
|
93
|
+
raise ::Blosterix::BlobsterixStorageError.new("Could not create MetaData entry")
|
88
94
|
end
|
89
|
-
save_meta_file
|
90
|
-
self
|
91
95
|
end
|
92
96
|
|
93
97
|
def open
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
98
|
+
begin
|
99
|
+
if block_given?
|
100
|
+
f = File.open(path, "rb")
|
101
|
+
yield f
|
102
|
+
f.close
|
103
|
+
else
|
104
|
+
File.open(path, "rb")
|
105
|
+
end
|
106
|
+
rescue
|
107
|
+
raise ::Blosterix::BlobsterixStorageError.new("Could not open FilesystemMetaData")
|
100
108
|
end
|
101
109
|
end
|
102
110
|
|
@@ -138,8 +146,11 @@ module Blobsterix
|
|
138
146
|
end
|
139
147
|
def save_meta_file
|
140
148
|
return if not valid
|
141
|
-
|
142
|
-
|
149
|
+
begin
|
150
|
+
File.write(meta_path, to_json)
|
151
|
+
rescue
|
152
|
+
raise ::Blosterix::BlobsterixStorageError.new("Could not create MetaData entry")
|
153
|
+
end
|
143
154
|
end
|
144
155
|
def load_meta_file
|
145
156
|
return if not valid
|
@@ -102,7 +102,7 @@ module Blobsterix::Transformations
|
|
102
102
|
logger.debug "Transformation: done #{blob_access} finish connections"
|
103
103
|
running_transformations[blob_access.identifier].each{|fiber|
|
104
104
|
fiber.resume(result)
|
105
|
-
}
|
105
|
+
} if running_transformations[blob_access.identifier] # check if there are pending fibers or if the connection was already closed
|
106
106
|
uncue_transformation(blob_access)
|
107
107
|
end
|
108
108
|
|
@@ -118,4 +118,4 @@ module Blobsterix::Transformations
|
|
118
118
|
trafos.empty? ? nil : trafos[0]
|
119
119
|
end
|
120
120
|
end
|
121
|
-
end
|
121
|
+
end
|
data/lib/blobsterix/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blobsterix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.36
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Sudmann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -333,3 +333,4 @@ test_files:
|
|
333
333
|
- spec/lib/storage/cache_spec.rb
|
334
334
|
- spec/lib/storage/file_system_spec.rb
|
335
335
|
- spec/spec_helper.rb
|
336
|
+
has_rdoc:
|