mogilefs-client 3.1.1 → 3.2.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/GIT-VERSION-GEN CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  CONSTANT = "MogileFS::VERSION"
3
3
  RVF = "lib/mogilefs/version.rb"
4
- DEF_VER = "v3.1.1"
4
+ DEF_VER = "v3.2.0-rc1"
5
5
  vn = DEF_VER
6
6
 
7
7
  # First see if there is a version file (included in release tarballs),
data/Manifest.txt ADDED
@@ -0,0 +1,67 @@
1
+ .document
2
+ .gitignore
3
+ .wrongdoc.yml
4
+ GIT-VERSION-GEN
5
+ GNUmakefile
6
+ HACKING
7
+ History
8
+ LICENSE
9
+ README
10
+ Rakefile
11
+ TODO
12
+ bin/mog
13
+ examples/stale_fid_checker.rb
14
+ lib/mogilefs.rb
15
+ lib/mogilefs/admin.rb
16
+ lib/mogilefs/backend.rb
17
+ lib/mogilefs/bigfile.rb
18
+ lib/mogilefs/bigfile/filter.rb
19
+ lib/mogilefs/chunker.rb
20
+ lib/mogilefs/client.rb
21
+ lib/mogilefs/copy_stream.rb
22
+ lib/mogilefs/http_file.rb
23
+ lib/mogilefs/http_reader.rb
24
+ lib/mogilefs/mogilefs.rb
25
+ lib/mogilefs/mysql.rb
26
+ lib/mogilefs/new_file.rb
27
+ lib/mogilefs/new_file/common.rb
28
+ lib/mogilefs/new_file/content_range.rb
29
+ lib/mogilefs/new_file/stream.rb
30
+ lib/mogilefs/new_file/tempfile.rb
31
+ lib/mogilefs/new_file/writer.rb
32
+ lib/mogilefs/paths_size.rb
33
+ lib/mogilefs/pool.rb
34
+ lib/mogilefs/socket.rb
35
+ lib/mogilefs/socket/kgio.rb
36
+ lib/mogilefs/socket/pure_ruby.rb
37
+ lib/mogilefs/socket_common.rb
38
+ lib/mogilefs/util.rb
39
+ setup.rb
40
+ test/.gitignore
41
+ test/aggregate.rb
42
+ test/exec.rb
43
+ test/fresh.rb
44
+ test/integration.rb
45
+ test/setup.rb
46
+ test/socket_test.rb
47
+ test/test_admin.rb
48
+ test/test_backend.rb
49
+ test/test_bigfile.rb
50
+ test/test_client.rb
51
+ test/test_db_backend.rb
52
+ test/test_fresh.rb
53
+ test/test_http_reader.rb
54
+ test/test_mogilefs.rb
55
+ test/test_mogilefs_integration.rb
56
+ test/test_mogilefs_integration_large_pipe.rb
57
+ test/test_mogilefs_integration_list_keys.rb
58
+ test/test_mogilefs_socket_kgio.rb
59
+ test/test_mogilefs_socket_pure.rb
60
+ test/test_mogstored_rack.rb
61
+ test/test_mogtool_bigfile.rb
62
+ test/test_mysql.rb
63
+ test/test_pool.rb
64
+ Manifest.txt
65
+ ChangeLog
66
+ NEWS
67
+ lib/mogilefs/version.rb
data/NEWS ADDED
@@ -0,0 +1,308 @@
1
+ === Ruby mogilefs-client 3.2.0-rc1 / 2012-06-15 01:05 UTC
2
+
3
+ * "list_keys" and "exist?" client commands raise errors properly
4
+ on failure.
5
+
6
+ * backend connections no longer terminate on ERR responses, only
7
+ on socket/connection errors.
8
+
9
+ * support the "updateclass" client command. This is for updating
10
+ the class of a given key and not to be confused with the
11
+ "update_class" admin command.
12
+
13
+ * "new_file" checksum usage is now documented since MogileFS 2.60
14
+ includes official support for checksums
15
+
16
+ === Ruby mogilefs-client 3.1.1 / 2012-02-28 22:12 UTC
17
+
18
+ This releases fixes problems short reads when slurping files
19
+ into memory. Thanks to Matthew Draper for this fix.
20
+ There are also minor documentation updates.
21
+
22
+ === Ruby mogilefs-client 3.1.0 / 2011-12-15 04:10 UTC
23
+
24
+ * improved API support for uploading large files
25
+ While we've always supported uploading large files, the
26
+ (still-supported) existing APIs were somewhat awkward or
27
+ required the file to exist on the file system. See
28
+ MogileFS::NewFile for details and examples.
29
+
30
+ * more informative exception messages for timed-out requests
31
+
32
+ * :fail_timeout parameter, the timeout for retrying a failed
33
+ tracker connection. This defaults to 5 seconds (same as
34
+ previous versions where this was hard-coded.
35
+
36
+ * :new_file_max_time parameter
37
+ Controls the maximum of time spent creating and uploading
38
+ a new file in MogileFS. This defaults to 1 hour (which
39
+ matching the expiry time of a row in the MogileFS internal
40
+ tempfile table).
41
+
42
+ * store_file works on unlinked File/Tempfile objects
43
+
44
+ * each_fid method in MogileFS::Admin fixed
45
+
46
+ * stale_fid_checker example script added
47
+
48
+ * mogstored_rack example split into a standalone RubyGem:
49
+ http://bogomips.org/mogstored_rack/
50
+
51
+ * backend error constants are generated on const_missing,
52
+ instead of when raised, making it easier to rescue exceptions
53
+ we didn't explicitly enable
54
+
55
+ * some internal cleanups and documentation improvements
56
+
57
+ === Ruby mogilefs-client 3.0.0 / 2011-11-28 20:53 UTC
58
+
59
+ Changes since 3.0.0-rc1:
60
+
61
+ * 1.8 copy_stream emulator respects creation umask
62
+ This matches the latest IO.copy_stream behavior.
63
+ [ruby-core:41308], r33851 in ruby/trunk
64
+
65
+ * higher timeouts for uploads to compensate for slow
66
+ (but not dead) servers.
67
+
68
+ Changes since v2.2.0:
69
+
70
+ === client changes
71
+
72
+ * "store_file" now accepts any IO object capable of streaming
73
+ data (e.g. pipes and sockets). This uses chunked
74
+ Transfer-Encoding for PUTs, so backend storage nodes
75
+ will need to support this (latest mogstored does).
76
+
77
+ * "store_file" no longer uses an infinite timeout when
78
+ awaiting a response after a PUT, the new timeout for the
79
+ response is now calculated based on the time and size of
80
+ the PUT request.
81
+
82
+ * new commands: "file_debug" and "file_info" (new commands
83
+ in mogilefsd, be sure you have the latest version)
84
+
85
+ * "get_paths" takes optional ":pathcount" parameter
86
+ to control the number of returned paths.
87
+
88
+ * "get_file_data" supports offset and count for partial
89
+ transfer (requires support from storage node for
90
+ Range: requests, most HTTP servers are capable of this)
91
+
92
+ * IO.copy_stream is enabled by default under Ruby 1.9.3.
93
+ Expect performance improvements.
94
+
95
+ * "list_keys" with a passed block (for additional info) is
96
+ faster due to internal pipelining implementation and the
97
+ addition of "file_info" support.
98
+
99
+ * fixed handling of "+" in key/domain names (old bug)
100
+
101
+ * rare, truncated partial responses due to network/server
102
+ failure now raise MogileFS::InvalidResponseError
103
+
104
+ === admin changes
105
+
106
+ Admin support is still a work-in-progress,
107
+ I usually just find myself using "mogadm" anyways.
108
+
109
+ * new admin commands: "replicate_now"
110
+
111
+ * "get_stats" no longer works on new mogilefsd versions
112
+
113
+ * get_domains handles "repl_policy" field correctly for classes
114
+ in MogileFS 2.x
115
+
116
+ * admin commands should convert all numeric fields to either
117
+ Integer or Float objects and not String representations
118
+ of numerics. Affected methods include:
119
+ get_hosts, get_devices, list_fids, each_fids, get_domains
120
+
121
+ === miscellany
122
+
123
+ * we no longer add methods to standard Ruby classes
124
+ (at least we never /changed/ existing methods :P)
125
+
126
+ * {kgio}[http://bogomips.org/kgio] automatically used
127
+ if available, but not required to avoid exceptions
128
+ with non-blocking I/O
129
+
130
+ * dropped Ruby 1.8.6 support, 1.8.7 or later is required.
131
+
132
+ * Tested with MRI 1.8.7, 1.9.3 and Rubinius 1.2.4
133
+
134
+ * MogileFS::Mysql - deprecated, to be removed in 2012
135
+
136
+ * improved test suite
137
+
138
+ * some optional experimental features/changes,
139
+ see "git log" for details
140
+
141
+ * Added internal pipelining implementation, this is
142
+ not easy-to-use since the server can respond-out-of-order,
143
+ but still useful for things like a list_keys+file_info
144
+ loop.
145
+
146
+ === mogilefs-client 3.0.0-rc1 / 2011-11-21 02:48 UTC
147
+
148
+ === client changes
149
+
150
+ * "store_file" now accepts any IO object capable of streaming
151
+ data (e.g. pipes and sockets). This uses chunked
152
+ Transfer-Encoding for PUTs, so backend storage nodes
153
+ will need to support this (latest mogstored does).
154
+
155
+ * "store_file" no longer uses an infinite timeout when
156
+ awaiting a response after a PUT, the new timeout for the
157
+ response is now calculated based on the time and size of
158
+ the PUT request.
159
+
160
+ * new commands: "file_debug" and "file_info" (new commands
161
+ in mogilefsd, be sure you have the latest version)
162
+
163
+ * "get_paths" takes optional ":pathcount" parameter
164
+ to control the number of returned paths.
165
+
166
+ * "get_file_data" supports offset and count for partial
167
+ transfer (requires support from storage node for
168
+ Range: requests, most HTTP servers are capable of this)
169
+
170
+ * IO.copy_stream is enabled by default under Ruby 1.9.3.
171
+ Expect performance improvements.
172
+
173
+ * "list_keys" with a passed block (for additional info) is
174
+ faster due to internal pipelining implementation and the
175
+ addition of "file_info" support.
176
+
177
+ * fixed handling of "+" in key/domain names (old bug)
178
+
179
+ * rare, truncated partial responses due to network/server
180
+ failure now raise MogileFS::InvalidResponseError
181
+
182
+ === admin changes
183
+
184
+ Admin support is still a work-in-progress,
185
+ I usually just find myself using "mogadm" anyways.
186
+
187
+ * new admin commands: "replicate_now"
188
+
189
+ * "get_stats" no longer works on new mogilefsd versions
190
+
191
+ * get_domains handles "repl_policy" field correctly for classes
192
+ in MogileFS 2.x
193
+
194
+ * admin commands should convert all numeric fields to either
195
+ Integer or Float objects and not String representations
196
+ of numerics. Affected methods include:
197
+ get_hosts, get_devices, list_fids, each_fids, get_domains
198
+
199
+ === miscellany
200
+
201
+ * we no longer add methods to standard Ruby classes
202
+ (at least we never /changed/ existing methods :P)
203
+
204
+ * {kgio}[http://bogomips.org/kgio] automatically used
205
+ if available, but not required to avoid exceptions
206
+ with non-blocking I/O
207
+
208
+ * dropped Ruby 1.8.6 support, 1.8.7 or later is required.
209
+
210
+ * Tested with MRI 1.8.7, 1.9.3 and Rubinius 1.2.4
211
+
212
+ * MogileFS::Mysql - deprecated, to be removed in 2012
213
+
214
+ * improved test suite
215
+
216
+ * some optional experimental features/changes,
217
+ see "git log" for details
218
+
219
+ * Added internal pipelining implementation, this is
220
+ not easy-to-use since the server can respond-out-of-order,
221
+ but still useful for things like a list_keys+file_info
222
+ loop.
223
+
224
+ === mogilefs-client 2.2.0 / 2011-01-13 02:10 UTC
225
+
226
+ = 2.2.0
227
+ * internal cleanups (no public API breakage)
228
+ * refactor backend socket/connection handling for reliability
229
+
230
+ There'll probably be more aggressive cleanups/refactoring in
231
+ future releases if I have time.
232
+
233
+ === mogilefs-client 2.1.0 / 2009-04-12 03:04 UTC
234
+
235
+ = 2.1.0
236
+ * MySQL interface returns integer length and devcount (API change)
237
+ * Ensure store_{content,file} always returns size (API fix)
238
+ * Add get_uris API method
239
+ * Respect timeout when doing get_file_data
240
+ * MySQL interface filters out URLs for down/dead hosts/devices
241
+ * Really remove all NFS support
242
+ * get_file in slurp mode slurps all output correctly
243
+
244
+ Eric Wong (18):
245
+ tests: retry random ports correctly
246
+ test_mogilefs: fix race conditions
247
+ MySQL interface returns integer length and devcount
248
+ Respect timeout when doing get_file_data
249
+ Unify internal HTTP GET/HEAD methods
250
+ Close socket we create before raising exceptions
251
+ Compact get_paths output so we don't have nils
252
+ Really remove all NFS support
253
+ README: add a note about emailing me
254
+ Extra checking for full_timeout in sysread_full
255
+ Add get_uris API method
256
+ verify_uris: use write_nonblock instead of syswrite
257
+ README: add links to the repo.or.cz mirror
258
+ mysql: filter out URLs for down/dead hosts/devices
259
+ mog: small cleanup
260
+ Ensure store_{content,file} always returns size
261
+ GNUmakefile: better logging/output control
262
+ mogilefs-client 2.1.0
263
+
264
+ godfat (1):
265
+ call IO.select([sock]) if sock is not ready.
266
+
267
+ === mogilefs-client 1.2.1 / 2009-03-25 07:29 UTC
268
+
269
+ Retroactively tagging this old release since
270
+ it was in SVN or Perforce...
271
+
272
+ === mogilefs-client 2.0.2 / 2009-03-02 21:56 UTC
273
+
274
+ initial
275
+
276
+ === mogilefs-client v2.0.1 / 2009-02-25 08:13 UTC
277
+
278
+ * verify_uris method made more robust
279
+ * preliminary Ruby 1.9 compatibility, tests still need some work
280
+ * allow store_content to be used with a streamable object of known length
281
+ * add setup.rb for non-RubyGems users
282
+
283
+ === mogilefs-client 2.0.0 / 2009-02-03 04:27 UTC
284
+
285
+ initial
286
+
287
+ === v1.3.1 / 2008-10-03 03:01 UTC
288
+
289
+ * Fix missing MogileFS::Util include for sysrwloop in MogileFS::MogileFS
290
+
291
+ === v1.3.0 / 2008-09-18 23:46 UTC
292
+
293
+ * Fixed MogileFS#rename. Bug #14465 submitted by Justin Dossey.
294
+ * Removed infinite loop in MogileFS::HTTPFile#store_file. Patch #13789
295
+ submitted by Andy Lo-A-Foe.
296
+ * Made MogileFS#get_file_data timeout configurable. Bug #13490 submitted by
297
+ Andy Lo-A-Foe.
298
+ * Add MogileFS#size. Feature Request #14484 submitted by Justin Dossey.
299
+ * Fix MogileFS#get_file_data to return the data for HTTP mode. Bug #7133
300
+ submitted by John Wanko.
301
+ * New maintainer: Eric Wong
302
+ * Add `mog' command-line tool as a demo/example
303
+ * Lower memory consumption with large files
304
+ * Allow get_file_data to accept a block for large files
305
+ * Fix each_keys loop termination condition
306
+ * Apply error handling patch from Matthew Willson. Bug #15987
307
+ * Merge large file patch from Andy Lo-A-Foe. Bug #13764
308
+
data/README CHANGED
@@ -14,6 +14,7 @@ email :: mailto:normalperson@yhbt.net
14
14
  repo :: git://bogomips.org/mogilefs-client.git
15
15
  cgit :: http://bogomips.org/mogilefs-client.git
16
16
  gitweb :: http://repo.or.cz/w/ruby-mogilefs-client.git
17
+ download :: http://bogomips.org/mogilefs-client/files/
17
18
 
18
19
  == Install
19
20
 
data/Rakefile CHANGED
@@ -7,11 +7,21 @@ $:.unshift 'lib'
7
7
  require 'mogilefs'
8
8
  Hoe.plugin :seattlerb
9
9
 
10
+ if ! File.exist?("ChangeLog") || ! File.exist?("NEWS")
11
+ system("wrongdoc all")
12
+ end
13
+
10
14
  manifest = "Manifest.txt"
11
15
  if ! File.exist?(manifest) ||
12
- File.stat(manifest).mtime < File.stat(RVF).mtime
16
+ File.stat(manifest).mtime < File.stat(RVF).mtime ||
17
+ File.stat(manifest).mtime < File.stat(__FILE__).mtime
13
18
  system("git ls-files > #{manifest}")
14
- File.open(manifest, "a") { |fp| fp.puts("lib/mogilefs/version.rb") }
19
+ File.open(manifest, "a") do |fp|
20
+ fp.puts "Manifest.txt"
21
+ fp.puts "ChangeLog"
22
+ fp.puts "NEWS"
23
+ fp.puts "lib/mogilefs/version.rb"
24
+ end
15
25
  end
16
26
 
17
27
  Hoe.spec 'mogilefs-client' do
@@ -19,7 +29,7 @@ Hoe.spec 'mogilefs-client' do
19
29
  developer 'Eric Wong', 'normalperson@yhbt.net'
20
30
  # developer 'drbrain@segment7.net', 'Eric Hodel'
21
31
  self.readme_file = "README"
22
- self.history_file = "History"
32
+ self.history_file = "NEWS"
23
33
  self.url = "http://bogomips.org/mogilefs-client"
24
34
  self.description = self.paragraphs_of("README", 1)
25
35
  self.summary = "MogileFS client library for Ruby"
@@ -36,6 +46,3 @@ task :fix_perms do
36
46
  end
37
47
  end
38
48
  end
39
-
40
- # vim: syntax=Ruby
41
-
@@ -118,6 +118,7 @@ class MogileFS::Backend
118
118
  add_command :delete_domain
119
119
  add_command :create_class
120
120
  add_command :update_class
121
+ add_command :updateclass
121
122
  add_command :delete_class
122
123
  add_command :create_host
123
124
  add_command :update_host
@@ -228,11 +229,15 @@ class MogileFS::Backend
228
229
  def do_request(cmd, args, idempotent = false)
229
230
  no_raise = args.delete(:ruby_no_raise)
230
231
  request = make_request(cmd, args)
232
+ line = nil
231
233
  @mutex.synchronize do
232
234
  begin
233
235
  io = dispatch_unlocked(request)
234
- line = io.timed_gets(@timeout) and
235
- return parse_response(line, no_raise ? request : nil)
236
+ line = io.timed_gets(@timeout)
237
+ break if /\r?\n\z/ =~ line
238
+
239
+ line and raise MogileFS::InvalidResponseError,
240
+ "Invalid response from server: #{line.inspect}"
236
241
 
237
242
  idempotent or
238
243
  raise EOFError, "end of file reached after: #{request.inspect}"
@@ -251,6 +256,7 @@ class MogileFS::Backend
251
256
  shutdown_unlocked(true)
252
257
  end while idempotent
253
258
  end # @mutex.synchronize
259
+ parse_response(line, no_raise ? request : nil)
254
260
  end
255
261
 
256
262
  # Makes a new request string for +cmd+ and +args+.
@@ -140,7 +140,14 @@ class MogileFS::MogileFS < MogileFS::Client
140
140
  # Returns +true+ if +key+ exists, +false+ if not
141
141
  def exist?(key)
142
142
  args = { :key => key, :domain => @domain , :ruby_no_raise => true}
143
- Hash === @backend.get_paths(args)
143
+ case rv = @backend.get_paths(args)
144
+ when Hash
145
+ true
146
+ when MogileFS::Backend::UnknownKeyError
147
+ false
148
+ else
149
+ raise rv
150
+ end
144
151
  end
145
152
 
146
153
  # Get the URIs for +key+ (paths) as URI::HTTP objects
@@ -172,6 +179,20 @@ class MogileFS::MogileFS < MogileFS::Client
172
179
  # [ :class => String]
173
180
  #
174
181
  # The MogileFS storage class of the object.
182
+ #
183
+ # [:content_md5 => String, Proc, or :trailer]
184
+ #
185
+ # This can either be a Base64-encoded String, a Proc object, or
186
+ # the :trailer symbol. If given a String, it will be used as the
187
+ # Content-MD5 HTTP header. If given the :trailer symbol, this library
188
+ # will automatically generate an Content-MD5 HTTP trailer. If given
189
+ # a Proc object, this Proc object should give a Base64-encoded string
190
+ # which can be used as the Content-MD5 HTTP trailer when called at the
191
+ # end of the request.
192
+ #
193
+ # Keep in mind most HTTP servers do not support HTTP trailers, so
194
+ # passing a String is usually the safest way to use this.
195
+ #
175
196
  def new_file(key, args = nil, bytes = nil) # :yields: file
176
197
  raise MogileFS::ReadOnlyError if readonly?
177
198
  opts = { :key => key, :multi_dest => 1 }
@@ -256,6 +277,14 @@ class MogileFS::MogileFS < MogileFS::Client
256
277
  true
257
278
  end
258
279
 
280
+ # Updates +key+ to +newclass+
281
+ def updateclass(key, newclass)
282
+ raise MogileFS::ReadOnlyError if readonly?
283
+
284
+ @backend.updateclass(:domain => @domain, :key => key, :class => newclass)
285
+ true
286
+ end
287
+
259
288
  # Sleeps +duration+, only used for testing
260
289
  def sleep(duration) # :nodoc:
261
290
  @backend.sleep :duration => duration
@@ -294,6 +323,7 @@ class MogileFS::MogileFS < MogileFS::Client
294
323
  :after => after, :limit => limit,
295
324
  :ruby_no_raise => true)
296
325
  MogileFS::Backend::NoneMatchError === res and return
326
+ raise res if MogileFS::Error === res
297
327
 
298
328
  keys = (1..res['key_count'].to_i).map { |i| res["key_#{i}"] }
299
329
  if block
@@ -1 +1 @@
1
- MogileFS::VERSION = '3.1.1'
1
+ MogileFS::VERSION = '3.2.0.rc1'
data/test/test_fresh.rb CHANGED
@@ -5,4 +5,25 @@ class TestMogFresh < Test::Unit::TestCase
5
5
  include TestFreshSetup
6
6
  alias setup setup_mogilefs
7
7
  alias teardown teardown_mogilefs
8
+
9
+ def test_list_keys_invalid_domain
10
+ add_host_device_domain
11
+ domain = @domain + ".non-existent"
12
+ client = MogileFS::MogileFS.new :hosts => @hosts, :domain => domain
13
+ assert_raises(MogileFS::Backend::UnregDomainError) do
14
+ client.list_keys
15
+ end
16
+ end
17
+
18
+ def test_invalid_key_exists
19
+ add_host_device_domain
20
+ domain = @domain + ".non-existent"
21
+ client = MogileFS::MogileFS.new :hosts => @hosts, :domain => domain
22
+ assert_raises(MogileFS::Backend::UnregDomainError) do
23
+ client.exist?("FOO")
24
+ end
25
+
26
+ client = MogileFS::MogileFS.new :hosts => @hosts, :domain => @domain
27
+ assert_equal false, client.exist?("non-existent")
28
+ end
8
29
  end
@@ -290,4 +290,25 @@ class TestMogileFSIntegration < TestMogIntegration
290
290
 
291
291
  assert_equal "HIHI", @client.get_file_data("unlinked")
292
292
  end
293
+
294
+ def test_updateclass
295
+ admin = MogileFS::Admin.new(:hosts => @trackers)
296
+ admin.create_class(@domain, "one", 1)
297
+ admin.create_class(@domain, "two", 2)
298
+ 4.times { admin.clear_cache }
299
+
300
+ assert_equal 4, @client.store_content("uc", "default", "DATA")
301
+ assert_equal true, @client.updateclass("uc", "one")
302
+ assert_equal true, @client.updateclass("uc", "two")
303
+ assert_raises(MogileFS::Backend::ClassNotFoundError) do
304
+ @client.updateclass("uc", "wtf")
305
+ end
306
+ assert_raises(MogileFS::Backend::InvalidKeyError) do
307
+ @client.updateclass("nonexistent", "one")
308
+ end
309
+
310
+ @client.delete "uc"
311
+ admin.delete_class @domain, "one"
312
+ admin.delete_class @domain, "two"
313
+ end
293
314
  end