mogilefs-client 2.2.0 → 3.0.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.
Files changed (63) hide show
  1. data/.document +11 -0
  2. data/.gemtest +0 -0
  3. data/.gitignore +4 -0
  4. data/.wrongdoc.yml +5 -0
  5. data/GIT-VERSION-GEN +28 -0
  6. data/GNUmakefile +44 -0
  7. data/HACKING +33 -0
  8. data/{History.txt → History} +0 -1
  9. data/{LICENSE.txt → LICENSE} +0 -1
  10. data/Manifest.txt +34 -7
  11. data/README +51 -0
  12. data/Rakefile +11 -11
  13. data/TODO +10 -0
  14. data/bin/mog +109 -68
  15. data/examples/mogstored_rack.rb +189 -0
  16. data/lib/mogilefs.rb +56 -17
  17. data/lib/mogilefs/admin.rb +128 -62
  18. data/lib/mogilefs/backend.rb +205 -95
  19. data/lib/mogilefs/bigfile.rb +54 -70
  20. data/lib/mogilefs/bigfile/filter.rb +58 -0
  21. data/lib/mogilefs/chunker.rb +30 -0
  22. data/lib/mogilefs/client.rb +0 -2
  23. data/lib/mogilefs/copy_stream.rb +30 -0
  24. data/lib/mogilefs/http_file.rb +175 -0
  25. data/lib/mogilefs/http_reader.rb +79 -0
  26. data/lib/mogilefs/mogilefs.rb +242 -148
  27. data/lib/mogilefs/mysql.rb +3 -4
  28. data/lib/mogilefs/paths_size.rb +24 -0
  29. data/lib/mogilefs/pool.rb +0 -1
  30. data/lib/mogilefs/socket.rb +9 -0
  31. data/lib/mogilefs/socket/kgio.rb +55 -0
  32. data/lib/mogilefs/socket/pure_ruby.rb +70 -0
  33. data/lib/mogilefs/socket_common.rb +58 -0
  34. data/lib/mogilefs/util.rb +6 -169
  35. data/test/aggregate.rb +11 -11
  36. data/test/exec.rb +72 -0
  37. data/test/fresh.rb +222 -0
  38. data/test/integration.rb +43 -0
  39. data/test/setup.rb +1 -0
  40. data/test/socket_test.rb +98 -0
  41. data/test/test_admin.rb +14 -37
  42. data/test/test_backend.rb +50 -107
  43. data/test/test_bigfile.rb +2 -2
  44. data/test/test_db_backend.rb +1 -2
  45. data/test/test_fresh.rb +8 -0
  46. data/test/test_http_reader.rb +34 -0
  47. data/test/test_mogilefs.rb +278 -98
  48. data/test/test_mogilefs_integration.rb +174 -0
  49. data/test/test_mogilefs_integration_large_pipe.rb +62 -0
  50. data/test/test_mogilefs_integration_list_keys.rb +40 -0
  51. data/test/test_mogilefs_socket_kgio.rb +11 -0
  52. data/test/test_mogilefs_socket_pure.rb +7 -0
  53. data/test/test_mogstored_rack.rb +89 -0
  54. data/test/test_mogtool_bigfile.rb +116 -0
  55. data/test/test_mysql.rb +1 -2
  56. data/test/test_pool.rb +1 -1
  57. data/test/test_unit_mogstored_rack.rb +72 -0
  58. metadata +76 -54
  59. data/README.txt +0 -80
  60. data/lib/mogilefs/httpfile.rb +0 -157
  61. data/lib/mogilefs/network.rb +0 -107
  62. data/test/test_network.rb +0 -56
  63. data/test/test_util.rb +0 -121
data/test/test_mysql.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  # -*- encoding: binary -*-
2
- require 'test/setup'
3
- require 'mogilefs/mysql'
2
+ require './test/setup'
4
3
 
5
4
  class MogileFS::Mysql
6
5
  public :refresh_device
data/test/test_pool.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  require 'test/unit'
3
3
 
4
4
  $TESTING = true
5
-
5
+ require 'mogilefs'
6
6
  require 'mogilefs/pool'
7
7
 
8
8
  class MogileFS::Pool
@@ -0,0 +1,72 @@
1
+ # -*- encoding: binary -*-
2
+ require "test/unit"
3
+ require "tmpdir"
4
+ require "fileutils"
5
+ begin
6
+ require "./examples/mogstored_rack"
7
+ rescue LoadError
8
+ end
9
+
10
+ class TestUnitMogstoredRack < Test::Unit::TestCase
11
+ attr_reader :req
12
+
13
+ def setup
14
+ @docroot = Dir.mktmpdir(["mogstored_rack", ".docroot"])
15
+ end
16
+
17
+ def test_defaults
18
+ req = Rack::MockRequest.new(MogstoredRack.new(@docroot))
19
+ all_methods(req)
20
+ end
21
+
22
+ def test_fsync_true
23
+ req = Rack::MockRequest.new(MogstoredRack.new(@docroot, :fsync=>true))
24
+ all_methods(req)
25
+ end
26
+
27
+ def test_reread_verify
28
+ app = MogstoredRack.new(@docroot, :reread_verify=>true)
29
+ req = Rack::MockRequest.new(app)
30
+ all_methods(req)
31
+ end
32
+
33
+ def all_methods(req)
34
+ assert_equal 200, req.get("/").status
35
+ assert ! File.directory?("#@docroot/dev666")
36
+ assert_equal 204, req.request("MKCOL", "/dev666").status
37
+ assert File.directory?("#@docroot/dev666")
38
+
39
+ io = StringIO.new("HELLO")
40
+ r = req.request("PUT", "/dev666/666.fid", :input => io)
41
+ assert_equal 201, r.status
42
+ assert_equal "HELLO", IO.read("#@docroot/dev666/666.fid")
43
+
44
+ # invalid MD5
45
+ io = StringIO.new("WORLD")
46
+ md5 = [ Digest::MD5.new.digest ].pack("m").strip!
47
+ opts = { :input => io, "HTTP_CONTENT_MD5" => md5 }
48
+ r = req.request("PUT", "/dev666/666.fid", opts)
49
+ assert_equal 400, r.status
50
+ assert_equal "HELLO", IO.read("#@docroot/dev666/666.fid")
51
+
52
+ # valid MD5
53
+ io = StringIO.new("VALID")
54
+ md5 = [ Digest::MD5.digest("VALID") ].pack("m").strip!
55
+ opts = { :input => io, "HTTP_CONTENT_MD5" => md5 }
56
+ r = req.request("PUT", "/dev666/666.fid", opts)
57
+ assert_equal 201, r.status
58
+ assert_equal "VALID", IO.read("#@docroot/dev666/666.fid")
59
+
60
+ r = req.request("GET", "/dev666/666.fid")
61
+ assert_equal 200, r.status
62
+ assert_equal "VALID", r.body
63
+
64
+ r = req.request("DELETE", "/dev666/666.fid")
65
+ assert_equal 204, r.status
66
+ assert ! File.exist?("#@docroot/dev666/666.fid")
67
+ end
68
+
69
+ def teardown
70
+ FileUtils.rmtree(@docroot)
71
+ end
72
+ end if defined?(Rack)
metadata CHANGED
@@ -1,109 +1,121 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mogilefs-client
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
5
- prerelease: false
4
+ hash: 15424119
5
+ prerelease: 6
6
6
  segments:
7
- - 2
8
- - 2
7
+ - 3
8
+ - 0
9
9
  - 0
10
- version: 2.2.0
10
+ - rc
11
+ - 1
12
+ version: 3.0.0.rc1
11
13
  platform: ruby
12
14
  authors:
13
15
  - Eric Wong
14
- - Eric Hodel
15
16
  autorequire:
16
17
  bindir: bin
17
18
  cert_chain: []
18
19
 
19
- date: 2011-01-13 00:00:00 +00:00
20
- default_executable:
20
+ date: 2011-11-21 00:00:00 Z
21
21
  dependencies:
22
- - !ruby/object:Gem::Dependency
23
- name: ZenTest
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
26
- none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 29
31
- segments:
32
- - 3
33
- - 6
34
- - 1
35
- version: 3.6.1
36
- type: :development
37
- version_requirements: *id001
38
22
  - !ruby/object:Gem::Dependency
39
23
  name: hoe
40
24
  prerelease: false
41
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ requirement: &id001 !ruby/object:Gem::Requirement
42
26
  none: false
43
27
  requirements:
44
- - - ">="
28
+ - - ~>
45
29
  - !ruby/object:Gem::Version
46
- hash: 47
30
+ hash: 27
47
31
  segments:
48
32
  - 2
49
- - 8
50
- - 0
51
- version: 2.8.0
33
+ - 12
34
+ version: "2.12"
52
35
  type: :development
53
- version_requirements: *id002
54
- description: "Source repository (git):"
55
- email: normalperson@yhbt.net
36
+ version_requirements: *id001
37
+ description: |-
38
+ A MogileFS client library for Ruby. MogileFS is an open source
39
+ distributed filesystem, see: http://mogilefs.org for more details. This
40
+ library allows any Ruby application to read, write and delete files in a
41
+ MogileFS instance.
42
+ email:
43
+ - normalperson@yhbt.net
56
44
  executables:
57
45
  - mog
58
46
  extensions: []
59
47
 
60
48
  extra_rdoc_files:
61
- - History.txt
62
- - LICENSE.txt
63
49
  - Manifest.txt
64
- - README.txt
65
50
  files:
51
+ - .document
66
52
  - .gitignore
53
+ - .wrongdoc.yml
54
+ - GIT-VERSION-GEN
67
55
  - GNUmakefile
68
- - History.txt
69
- - LICENSE.txt
56
+ - HACKING
57
+ - History
58
+ - LICENSE
70
59
  - Manifest.txt
71
- - README.txt
60
+ - README
72
61
  - Rakefile
62
+ - TODO
73
63
  - bin/mog
64
+ - examples/mogstored_rack.rb
74
65
  - lib/mogilefs.rb
75
66
  - lib/mogilefs/admin.rb
76
67
  - lib/mogilefs/backend.rb
77
68
  - lib/mogilefs/bigfile.rb
69
+ - lib/mogilefs/bigfile/filter.rb
70
+ - lib/mogilefs/chunker.rb
78
71
  - lib/mogilefs/client.rb
79
- - lib/mogilefs/httpfile.rb
72
+ - lib/mogilefs/copy_stream.rb
73
+ - lib/mogilefs/http_file.rb
74
+ - lib/mogilefs/http_reader.rb
80
75
  - lib/mogilefs/mogilefs.rb
81
76
  - lib/mogilefs/mysql.rb
82
- - lib/mogilefs/network.rb
77
+ - lib/mogilefs/paths_size.rb
83
78
  - lib/mogilefs/pool.rb
79
+ - lib/mogilefs/socket.rb
80
+ - lib/mogilefs/socket/kgio.rb
81
+ - lib/mogilefs/socket/pure_ruby.rb
82
+ - lib/mogilefs/socket_common.rb
84
83
  - lib/mogilefs/util.rb
85
84
  - setup.rb
86
85
  - test/.gitignore
87
86
  - test/aggregate.rb
87
+ - test/exec.rb
88
+ - test/fresh.rb
89
+ - test/integration.rb
88
90
  - test/setup.rb
91
+ - test/socket_test.rb
89
92
  - test/test_admin.rb
90
93
  - test/test_backend.rb
91
94
  - test/test_bigfile.rb
92
95
  - test/test_client.rb
93
96
  - test/test_db_backend.rb
97
+ - test/test_fresh.rb
98
+ - test/test_http_reader.rb
94
99
  - test/test_mogilefs.rb
100
+ - test/test_mogilefs_integration.rb
101
+ - test/test_mogilefs_integration_large_pipe.rb
102
+ - test/test_mogilefs_integration_list_keys.rb
103
+ - test/test_mogilefs_socket_kgio.rb
104
+ - test/test_mogilefs_socket_pure.rb
105
+ - test/test_mogstored_rack.rb
106
+ - test/test_mogtool_bigfile.rb
95
107
  - test/test_mysql.rb
96
- - test/test_network.rb
97
108
  - test/test_pool.rb
98
- - test/test_util.rb
99
- has_rdoc: true
100
- homepage: http://seattlerb.rubyforge.org/mogilefs-client
109
+ - test/test_unit_mogstored_rack.rb
110
+ - lib/mogilefs/version.rb
111
+ - .gemtest
112
+ homepage: http://bogomips.org/mogilefs-client
101
113
  licenses: []
102
114
 
103
115
  post_install_message:
104
116
  rdoc_options:
105
117
  - --main
106
- - README.txt
118
+ - README
107
119
  require_paths:
108
120
  - lib
109
121
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -118,27 +130,37 @@ required_ruby_version: !ruby/object:Gem::Requirement
118
130
  required_rubygems_version: !ruby/object:Gem::Requirement
119
131
  none: false
120
132
  requirements:
121
- - - ">="
133
+ - - ">"
122
134
  - !ruby/object:Gem::Version
123
- hash: 3
135
+ hash: 25
124
136
  segments:
125
- - 0
126
- version: "0"
137
+ - 1
138
+ - 3
139
+ - 1
140
+ version: 1.3.1
127
141
  requirements: []
128
142
 
129
143
  rubyforge_project: seattlerb
130
- rubygems_version: 1.3.7
144
+ rubygems_version: 1.8.11
131
145
  signing_key:
132
146
  specification_version: 3
133
- summary: A Ruby MogileFS client
147
+ summary: MogileFS client library for Ruby
134
148
  test_files:
149
+ - test/test_http_reader.rb
150
+ - test/test_unit_mogstored_rack.rb
151
+ - test/test_mogilefs_integration_list_keys.rb
135
152
  - test/test_db_backend.rb
136
- - test/test_network.rb
153
+ - test/test_mogilefs_socket_pure.rb
137
154
  - test/test_mysql.rb
138
- - test/test_util.rb
139
155
  - test/test_backend.rb
140
156
  - test/test_mogilefs.rb
157
+ - test/test_mogtool_bigfile.rb
141
158
  - test/test_client.rb
142
159
  - test/test_admin.rb
160
+ - test/test_mogilefs_socket_kgio.rb
161
+ - test/test_mogilefs_integration.rb
162
+ - test/test_fresh.rb
143
163
  - test/test_pool.rb
144
164
  - test/test_bigfile.rb
165
+ - test/test_mogilefs_integration_large_pipe.rb
166
+ - test/test_mogstored_rack.rb
data/README.txt DELETED
@@ -1,80 +0,0 @@
1
- = mogilefs-client
2
-
3
- A Ruby MogileFS client
4
-
5
- Rubyforge Project:
6
-
7
- http://rubyforge.org/projects/seattlerb/
8
-
9
- Documentation:
10
-
11
- http://seattlerb.rubyforge.org/mogilefs-client
12
-
13
- File bugs:
14
-
15
- http://rubyforge.org/tracker/?func=add&group_id=1513&atid=5921
16
-
17
- Please email Eric Wong at normalperson@yhbt.net as well since
18
- he finds web interfaces difficult to use.
19
-
20
- Source repository (git):
21
-
22
- git://git.bogomips.org/mogilefs-client.git
23
- http://git.bogomips.org/mogilefs-client.git
24
- git://repo.or.cz/ruby-mogilefs-client.git (mirror)
25
- http://repo.or.cz/r/ruby-mogilefs-client.git (mirror)
26
-
27
- Repository browsers:
28
-
29
- * http://git.bogomips.org/cgit/mogilefs-client.git (cgit)
30
- * http://repo.or.cz/w/ruby-mogilefs-client.git (gitweb mirror)
31
-
32
- == About
33
-
34
- A Ruby MogileFS client. MogileFS is a distributed filesystem written
35
- by Danga Interactive. This client only supports HTTP.
36
-
37
- For information on MogileFS see:
38
-
39
- http://danga.com/mogilefs/
40
-
41
- == Installing mogilefs-client
42
-
43
- First you need a MogileFS setup. You can find information on how to do
44
- that at the above URL.
45
-
46
- Then install the gem:
47
-
48
- $ sudo gem install mogilefs-client
49
-
50
- == Using mogilefs-client
51
-
52
- # Create a new instance that will communicate with these trackers:
53
- hosts = %w[192.168.1.69:6001 192.168.1.70:6001]
54
- mg = MogileFS::MogileFS.new(:domain => 'test', :hosts => hosts)
55
-
56
- # Stores "A bunch of text to store" into 'some_key' with a class of 'text'.
57
- mg.store_content 'some_key', 'text', "A bunch of text to store"
58
-
59
- # Retrieve data from 'some_key'
60
- data = mg.get_file_data 'some_key'
61
-
62
- # Store the contents of 'image.jpeg' into the key 'my_image' with a class of
63
- # 'image'.
64
- mg.store_file 'my_image', 'image', 'image.jpeg'
65
-
66
- # Store the contents of 'image.jpeg' into the key 'my_image' with a class of
67
- # 'image' using an open IO.
68
- File.open 'image.jpeg', 'rb' do |fp|
69
- mg.store_file 'my_image', 'image', fp
70
- end
71
-
72
- # Remove the key 'my_image' and 'some_key'.
73
- mg.delete 'my_image'
74
- mg.delete 'some_key'
75
-
76
- == WARNING!
77
-
78
- This client is only supported in HTTP mode. NFS mode was previously
79
- supported in 1.3.x, but since MogileFS 2.x has dropped support for
80
- NFS, this client has removed support for it.
@@ -1,157 +0,0 @@
1
- # -*- encoding: binary -*-
2
- require 'stringio'
3
- require 'uri'
4
- require 'mogilefs/backend'
5
- require 'mogilefs/util'
6
-
7
- ##
8
- # HTTPFile wraps up the new file operations for storing files onto an HTTP
9
- # storage node.
10
- #
11
- # You really don't want to create an HTTPFile by hand. Instead you want to
12
- # create a new file using MogileFS::MogileFS.new_file.
13
- #
14
- #--
15
- # TODO dup'd content in MogileFS::NFSFile
16
-
17
- class MogileFS::HTTPFile < StringIO
18
- include MogileFS::Util
19
-
20
- class EmptyResponseError < MogileFS::Error; end
21
- class BadResponseError < MogileFS::Error; end
22
- class UnparseableResponseError < MogileFS::Error; end
23
- class NoStorageNodesError < MogileFS::Error
24
- def message; 'Unable to open socket to storage node'; end
25
- end
26
-
27
- ##
28
- # The URI this file will be stored to.
29
-
30
- attr_reader :uri
31
-
32
- ##
33
- # The key for this file. This key won't represent a real file until you've
34
- # called #close.
35
-
36
- attr_reader :key
37
-
38
- ##
39
- # The class of this file.
40
-
41
- attr_reader :class
42
-
43
- ##
44
- # The big_io name in case we have file > 256M
45
-
46
- attr_accessor :big_io
47
-
48
- attr_accessor :streaming_io
49
-
50
- ##
51
- # Works like File.open. Use MogileFS::MogileFS#new_file instead of this
52
- # method.
53
-
54
- def self.open(*args)
55
- fp = new(*args)
56
- fp.set_encoding(Encoding::BINARY) if fp.respond_to?(:set_encoding)
57
-
58
- return fp unless block_given?
59
-
60
- begin
61
- yield fp
62
- ensure
63
- fp.close
64
- end
65
- end
66
-
67
- ##
68
- # Creates a new HTTPFile with MogileFS-specific data. Use
69
- # MogileFS::MogileFS#new_file instead of this method.
70
-
71
- def initialize(mg, fid, klass, key, dests, content_length)
72
- super ''
73
- @mg = mg
74
- @fid = fid
75
- @uri = @devid = nil
76
- @klass = klass
77
- @key = key
78
- @big_io = nil
79
- @streaming_io = nil
80
-
81
- @dests = dests
82
- @tried = {}
83
-
84
- @socket = nil
85
- end
86
-
87
- ##
88
- # Writes an HTTP PUT request to +sock+ to upload the file and
89
- # returns file size if the socket finished writing
90
- def upload(devid, uri)
91
- file_size = length
92
- sock = Socket.mogilefs_new(uri.host, uri.port)
93
-
94
- if @streaming_io
95
- file_size = @streaming_io.length
96
- syswrite_full(sock, "PUT #{uri.request_uri} HTTP/1.0\r\n" \
97
- "Content-Length: #{file_size}\r\n\r\n")
98
- @streaming_io.call(Proc.new do |data_to_write|
99
- syswrite_full(sock, data_to_write)
100
- end)
101
- elsif @big_io
102
- # Don't try to run out of memory
103
- File.open(@big_io, "rb") do |fp|
104
- file_size = fp.stat.size
105
- syswrite_full(sock, "PUT #{uri.request_uri} HTTP/1.0\r\n" \
106
- "Content-Length: #{file_size}\r\n\r\n")
107
- sysrwloop(fp, sock)
108
- end
109
- else
110
- syswrite_full(sock, "PUT #{uri.request_uri} HTTP/1.0\r\n" \
111
- "Content-Length: #{length}\r\n\r\n#{string}")
112
- end
113
-
114
- line = sock.gets or
115
- raise EmptyResponseError, 'Unable to read response line from server'
116
-
117
- if line =~ %r%^HTTP/\d+\.\d+\s+(\d+)% then
118
- case $1.to_i
119
- when 200..299 then # success!
120
- else
121
- raise BadResponseError, "HTTP response status from upload: #{$1}"
122
- end
123
- else
124
- raise UnparseableResponseError, "Response line not understood: #{line}"
125
- end
126
-
127
- @mg.backend.create_close(:fid => @fid, :devid => devid,
128
- :domain => @mg.domain, :key => @key,
129
- :path => uri.to_s, :size => file_size)
130
- file_size
131
- end # def upload
132
-
133
- def close
134
- try_dests = @dests.dup
135
- last_err = nil
136
-
137
- loop do
138
- devid, url = try_dests.shift
139
- devid && url or break
140
-
141
- uri = URI.parse(url)
142
- begin
143
- bytes = upload(devid, uri)
144
- @devid, @uri = devid, uri
145
- return bytes
146
- rescue SystemCallError, Errno::ECONNREFUSED, MogileFS::Timeout,
147
- EmptyResponseError, BadResponseError,
148
- UnparseableResponseError => err
149
- last_err = @tried[url] = err
150
- end
151
- end
152
-
153
- raise last_err ? last_err : NoStorageNodesError
154
- end
155
-
156
- end
157
-