mogilefs-client 3.7.1 → 3.8.0

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.
@@ -0,0 +1,44 @@
1
+ # example to fetch all usage files into the current directory
2
+ # This will download dev*/usage files to the current files with the template:
3
+ # ${HOSTNAME}_${PORT}_dev$DEVID.txt
4
+ $stderr.sync = $stdout.sync = Thread.abort_on_exception = true
5
+ ARGV.empty? and abort "Usage: #$0 TRACKERS"
6
+
7
+ require 'net/http/persistent' # gem install net-http-persistent
8
+ require 'uri'
9
+ require 'thread'
10
+ require 'mogilefs'
11
+ queue = Queue.new
12
+ nhp = Net::HTTP::Persistent.new
13
+ adm = MogileFS::Admin.new(hosts: ARGV)
14
+
15
+ by_hostid = {}
16
+ adm.get_hosts.each { |host| by_hostid[host["hostid"]] = host }
17
+ by_hostid.freeze # by_hostid is read-only at this point
18
+
19
+ nr = by_hostid.size
20
+ thr = nr.times.map do
21
+ Thread.new do
22
+ while dev = queue.shift
23
+ host = by_hostid[dev["hostid"]]
24
+ port = host["http_get_port"] || host["http_port"]
25
+ devid = dev["devid"]
26
+ url = "http://#{host["hostip"]}:#{port}/dev#{devid}/usage"
27
+ uri = URI(url)
28
+ response = nhp.request(uri)
29
+ body = response.body
30
+ File.open("#{host["hostname"]}_#{port}_dev#{devid}.txt", "w") do |fp|
31
+ fp.write(body)
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ adm.get_devices.each do |dev|
38
+ case dev["status"]
39
+ when "alive", "readonly", "drain"
40
+ queue.push(dev)
41
+ end
42
+ end
43
+ nr.times { queue.push(nil) } # terminate the threads
44
+ thr.each(&:join)
@@ -29,9 +29,9 @@ class MogileFS::Admin < MogileFS::Client
29
29
  #
30
30
  # [{"status"=>"alive",
31
31
  # "http_get_port"=>nil,
32
- # "http_port"=>"",
33
- # "hostid"=>"1",
34
- # "hostip"=>"",
32
+ # "http_port"=>7500,
33
+ # "hostid"=>1,
34
+ # "hostip"=>"192.168.1.2",
35
35
  # "hostname"=>"rur-1",
36
36
  # "altip"=>"",
37
37
  # "altmask"=>""}]
@@ -64,17 +64,18 @@ class MogileFS::Admin < MogileFS::Client
64
64
 
65
65
  def get_devices(devid = nil)
66
66
  to_i = %w(mb_asof mb_free mb_used mb_total devid weight hostid)
67
- want = %w(status observed_state).concat(to_i)
67
+ want = %w(status reject_bad_md5 observed_state utilization).concat(to_i)
68
68
  rv = @backend.get_devices(devid ? { :devid => devid } : {})
69
69
  rv = clean('devices', 'dev', rv, true, to_i, want)
70
- ostates = Hash[%w(readable writeable unreachable).map! { |f| [f,f] }]
71
70
 
72
71
  rv.each do |row|
73
72
  u = row["utilization"] and
74
73
  row["utilization"] = nil == u ? nil : u.to_f
75
74
 
76
- # maps "" to nil (for dead devices)
77
- row["observed_state"] = ostates[row["observed_state"]]
75
+ case row["observed_state"]
76
+ when ""
77
+ row["observed_state"] = nil
78
+ end
78
79
 
79
80
  # be sure we do not set this at all for pre-2.60 MogileFS-Server
80
81
  case row["reject_bad_md5"]
@@ -119,6 +120,7 @@ class MogileFS::Admin < MogileFS::Client
119
120
  #
120
121
  # *** This command no longer works with recent versions of MogileFS ***
121
122
  # *** Use mogstats(1) from the MogileFS::Utils package on CPAN ***
123
+ # *** We will remove this method in 4.x ***
122
124
  #
123
125
  # admin.get_stats
124
126
  #
@@ -147,9 +149,9 @@ class MogileFS::Admin < MogileFS::Client
147
149
  }
148
150
  end
149
151
 
150
- stats.delete 'device' if stats['device'].empty?
151
- stats.delete 'file' if stats['file'].empty?
152
- stats.delete 'replication' if stats['replication'].empty?
152
+ %w(device file replication).each do |s|
153
+ stats.delete(s) if stats[s].empty?
154
+ end
153
155
 
154
156
  stats
155
157
  end
@@ -0,0 +1,20 @@
1
+ ENV["VERSION"] or abort "VERSION= must be specified"
2
+ require 'olddoc'
3
+ $LOAD_PATH << 'lib'
4
+ require 'mogilefs'
5
+ extend Olddoc::Gemspec
6
+ name, summary, title = readme_metadata
7
+ Gem::Specification.new do |s|
8
+ manifest = File.read('.manifest').split(/\n/)
9
+ s.name = 'mogilefs-client'
10
+ s.version = MogileFS::VERSION
11
+ s.executables = %w(mog)
12
+ s.authors = ["#{s.name} hackers"]
13
+ s.summary = summary
14
+ s.description = readme_description
15
+ s.email = Olddoc.config['private_email']
16
+ s.files = manifest
17
+ s.add_development_dependency('olddoc', '~> 1.0')
18
+ s.homepage = Olddoc.config['rdoc_url']
19
+ s.license = 'BSD-3-Clause'
20
+ end
data/pkg.mk ADDED
@@ -0,0 +1,150 @@
1
+ RUBY = ruby
2
+ RAKE = rake
3
+ RSYNC = rsync
4
+ OLDDOC = olddoc
5
+ RDOC = rdoc
6
+
7
+ GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
8
+ @./GIT-VERSION-GEN
9
+ -include GIT-VERSION-FILE
10
+ -include local.mk
11
+ DLEXT := $(shell $(RUBY) -rrbconfig -e 'puts RbConfig::CONFIG["DLEXT"]')
12
+ RUBY_VERSION := $(shell $(RUBY) -e 'puts RUBY_VERSION')
13
+ RUBY_ENGINE := $(shell $(RUBY) -e 'puts((RUBY_ENGINE rescue "ruby"))')
14
+ lib := lib
15
+
16
+ ext := $(firstword $(wildcard ext/*))
17
+ ifneq ($(ext),)
18
+ ext_pfx := tmp/ext/$(RUBY_ENGINE)-$(RUBY_VERSION)
19
+ ext_h := $(wildcard $(ext)/*/*.h $(ext)/*.h)
20
+ ext_src := $(wildcard $(ext)/*.c $(ext_h))
21
+ ext_pfx_src := $(addprefix $(ext_pfx)/,$(ext_src))
22
+ ext_d := $(ext_pfx)/$(ext)/.d
23
+ $(ext)/extconf.rb: $(wildcard $(ext)/*.h)
24
+ @>> $@
25
+ $(ext_d):
26
+ @mkdir -p $(@D)
27
+ @> $@
28
+ $(ext_pfx)/$(ext)/%: $(ext)/% $(ext_d)
29
+ install -m 644 $< $@
30
+ $(ext_pfx)/$(ext)/Makefile: $(ext)/extconf.rb $(ext_d) $(ext_h)
31
+ $(RM) -f $(@D)/*.o
32
+ cd $(@D) && $(RUBY) $(CURDIR)/$(ext)/extconf.rb $(EXTCONF_ARGS)
33
+ ext_sfx := _ext.$(DLEXT)
34
+ ext_dl := $(ext_pfx)/$(ext)/$(notdir $(ext)_ext.$(DLEXT))
35
+ $(ext_dl): $(ext_src) $(ext_pfx_src) $(ext_pfx)/$(ext)/Makefile
36
+ @echo $^ == $@
37
+ $(MAKE) -C $(@D)
38
+ lib := $(lib):$(ext_pfx)/$(ext)
39
+ build: $(ext_dl)
40
+ else
41
+ build:
42
+ endif
43
+
44
+ pkg_extra += GIT-VERSION-FILE NEWS LATEST
45
+ NEWS: GIT-VERSION-FILE .olddoc.yml
46
+ $(OLDDOC) prepare
47
+ LATEST: NEWS
48
+
49
+ manifest:
50
+ $(RM) .manifest
51
+ $(MAKE) .manifest
52
+
53
+ .manifest: $(pkg_extra)
54
+ (git ls-files && for i in $@ $(pkg_extra); do echo $$i; done) | \
55
+ LC_ALL=C sort > $@+
56
+ cmp $@+ $@ || mv $@+ $@
57
+ $(RM) $@+
58
+
59
+ doc:: .document .olddoc.yml $(pkg_extra) $(PLACEHOLDERS)
60
+ -find lib -type f -name '*.rbc' -exec rm -f '{}' ';'
61
+ -find ext -type f -name '*.rbc' -exec rm -f '{}' ';'
62
+ $(RM) -r doc
63
+ $(RDOC) -f oldweb
64
+ $(OLDDOC) merge
65
+ if test -f COPYING; then install -m644 COPYING doc/COPYING; fi
66
+ install -m644 NEWS doc/NEWS
67
+ install -m644 NEWS.atom.xml doc/NEWS.atom.xml
68
+ install -m644 $(shell LC_ALL=C grep '^[A-Z]' .document) doc/
69
+
70
+ ifneq ($(VERSION),)
71
+ pkggem := pkg/$(rfpackage)-$(VERSION).gem
72
+ pkgtgz := pkg/$(rfpackage)-$(VERSION).tgz
73
+
74
+ # ensures we're actually on the tagged $(VERSION), only used for release
75
+ verify:
76
+ test x"$(shell umask)" = x0022
77
+ git rev-parse --verify refs/tags/v$(VERSION)^{}
78
+ git diff-index --quiet HEAD^0
79
+ test $$(git rev-parse --verify HEAD^0) = \
80
+ $$(git rev-parse --verify refs/tags/v$(VERSION)^{})
81
+
82
+ fix-perms:
83
+ -git ls-tree -r HEAD | awk '/^100644 / {print $$NF}' | xargs chmod 644
84
+ -git ls-tree -r HEAD | awk '/^100755 / {print $$NF}' | xargs chmod 755
85
+
86
+ gem: $(pkggem)
87
+
88
+ install-gem: $(pkggem)
89
+ gem install $(CURDIR)/$<
90
+
91
+ $(pkggem): manifest fix-perms
92
+ gem build $(rfpackage).gemspec
93
+ mkdir -p pkg
94
+ mv $(@F) $@
95
+
96
+ $(pkgtgz): distdir = $(basename $@)
97
+ $(pkgtgz): HEAD = v$(VERSION)
98
+ $(pkgtgz): manifest fix-perms
99
+ @test -n "$(distdir)"
100
+ $(RM) -r $(distdir)
101
+ mkdir -p $(distdir)
102
+ tar cf - $$(cat .manifest) | (cd $(distdir) && tar xf -)
103
+ cd pkg && tar cf - $(basename $(@F)) | gzip -9 > $(@F)+
104
+ mv $@+ $@
105
+
106
+ package: $(pkgtgz) $(pkggem)
107
+
108
+ release:: verify package
109
+ # push gem to RubyGems.org
110
+ gem push $(pkggem)
111
+ else
112
+ gem install-gem: GIT-VERSION-FILE
113
+ $(MAKE) $@ VERSION=$(GIT_VERSION)
114
+ endif
115
+
116
+ all:: check
117
+ test_units := $(wildcard test/test_*.rb)
118
+ test: check
119
+ check: test-unit
120
+ test-unit: $(test_units)
121
+ $(test_units): build
122
+ $(RUBY) -I $(lib) $@ $(RUBY_TEST_OPTS)
123
+
124
+ # this requires GNU coreutils variants
125
+ ifneq ($(RSYNC_DEST),)
126
+ publish_doc:
127
+ -git set-file-times
128
+ $(MAKE) doc
129
+ $(MAKE) doc_gz
130
+ $(RSYNC) -av doc/ $(RSYNC_DEST)/
131
+ git ls-files | xargs touch
132
+ endif
133
+
134
+ # Create gzip variants of the same timestamp as the original so nginx
135
+ # "gzip_static on" can serve the gzipped versions directly.
136
+ doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.gz$$')
137
+ doc_gz:
138
+ for i in $(docs); do \
139
+ gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
140
+ check-warnings:
141
+ @(for i in $$(git ls-files '*.rb'| grep -v '^setup\.rb$$'); \
142
+ do $(RUBY) -d -W2 -c $$i; done) | grep -v '^Syntax OK$$' || :
143
+
144
+ ifneq ($(PLACEHOLDERS),)
145
+ $(PLACEHOLDERS):
146
+ echo olddoc_placeholder > $@
147
+ endif
148
+
149
+ .PHONY: all .FORCE-GIT-VERSION-FILE doc check test $(test_units) manifest
150
+ .PHONY: check-warnings
data/test/fresh.rb CHANGED
@@ -7,24 +7,22 @@ require "net/http"
7
7
  module TestFreshSetup
8
8
  include TestExec
9
9
 
10
- def setup
11
- setup_mogilefs
12
- end
13
-
14
10
  def setup_mogilefs(plugins = nil)
11
+ @teardown_pid = $$
15
12
  @test_host = "127.0.0.1"
16
13
  setup_mogstored
17
14
  @tracker = TCPServer.new(@test_host, 0)
18
15
  @tracker_port = @tracker.addr[1]
19
16
 
20
- @dbname = Tempfile.new(["mogfresh", ".sqlite3"])
21
- @mogilefsd_conf = Tempfile.new(["mogilefsd", "conf"])
22
- @mogilefsd_pid = Tempfile.new(["mogilefsd", "pid"])
17
+ @dbname = Tempfile.new(["mogfresh", ".sqlite3"], @docroot)
18
+ @mogilefsd_conf = Tempfile.new(["mogilefsd", "conf"], @docroot)
19
+ @mogilefsd_pid = Tempfile.new(["mogilefsd", "pid"], @docroot)
20
+ @dbpath = @dbname.path
23
21
 
24
- cmd = %w(mogdbsetup --yes --type=SQLite --dbname) << @dbname.path
22
+ cmd = %w(mogdbsetup --yes --type=SQLite --dbname) << @dbpath
25
23
  x!(*cmd)
26
24
 
27
- @mogilefsd_conf.puts "db_dsn DBI:SQLite:#{@dbname.path}"
25
+ @mogilefsd_conf.puts "db_dsn DBI:SQLite:#@dbpath"
28
26
  @mogilefsd_conf.write <<EOF
29
27
  conf_port #@tracker_port
30
28
  listen #@test_host
@@ -63,59 +61,6 @@ EOF
63
61
  raise "#@test_host:#{port} never became ready"
64
62
  end
65
63
 
66
- def test_admin_setup_new_host_and_devices
67
- assert_equal [], @admin.get_hosts
68
- args = { :ip => @test_host, :port => @mogstored_http_port }
69
- @admin.create_host("me", args)
70
- yield_for_monitor_update { @admin.get_hosts.empty? or break }
71
- hosts = @admin.get_hosts
72
- assert_equal 1, hosts.size
73
- host = @admin.get_hosts[0]
74
- assert_equal "me", host["hostname"]
75
- assert_equal @mogstored_http_port, host["http_port"]
76
- assert_nil host["http_get_port"]
77
- assert_equal @test_host, host["hostip"]
78
- assert_kind_of Integer, host["hostid"]
79
- assert_equal hosts, @admin.get_hosts(host["hostid"])
80
-
81
- assert_equal [], @admin.get_devices
82
- end
83
-
84
- def test_replicate_now
85
- assert_equal({"count" => 0}, @admin.replicate_now)
86
- end
87
-
88
- def test_clear_cache
89
- assert_nil @admin.clear_cache
90
- end
91
-
92
- def test_create_update_delete_class
93
- domain = "rbmogtest#{Time.now.strftime('%Y%m%d%H%M%S')}.#{uuid}"
94
- @admin.create_domain(domain)
95
- yield_for_monitor_update { @admin.get_domains.include?(domain) and break }
96
-
97
- @admin.create_class(domain, "klassy", 1)
98
-
99
- assert_raises(MogileFS::Backend::ClassExistsError) do
100
- @admin.create_class(domain, "klassy", 1)
101
- end
102
-
103
- @admin.update_class(domain, "klassy",
104
- :mindevcount => 1, :replpolicy => "MultipleHosts(1)")
105
-
106
- tmp = nil
107
- yield_for_monitor_update do
108
- tmp = @admin.get_domains[domain]["klassy"]
109
- break if tmp && tmp["replpolicy"] == "MultipleHosts(1)"
110
- end
111
- assert tmp, "domain did not show up"
112
- assert_equal 1, tmp["mindevcount"]
113
- assert_equal "MultipleHosts(1)", tmp["replpolicy"]
114
- @admin.update_class(domain, "klassy", 2)
115
- ensure
116
- @admin.delete_class(domain, "klassy") rescue nil
117
- end
118
-
119
64
  def add_host_device_domain
120
65
  assert_equal [], @admin.get_hosts
121
66
  args = { :ip => @test_host, :port => @mogstored_http_port }
@@ -161,25 +106,8 @@ EOF
161
106
  @domain = domain
162
107
  end
163
108
 
164
- def test_device_file_add
165
- add_host_device_domain
166
- client = MogileFS::MogileFS.new :hosts => @hosts, :domain => @domain
167
- r, w = IO.pipe
168
- thr = Thread.new do
169
- (0..9).each do |i|
170
- sleep 0.05
171
- w.write("#{i}\n")
172
- end
173
- w.close
174
- :ok
175
- end
176
- assert_equal 20, client.store_file("pipe", nil, r)
177
- assert_equal :ok, thr.value
178
- r.close
179
- assert_equal "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n", client.get_file_data("pipe")
180
- end
181
-
182
109
  def teardown_mogilefs
110
+ return if $$ != @teardown_pid
183
111
  if @mogstored_pid
184
112
  pid = File.read(@mogstored_pid.path).to_i
185
113
  Process.kill(:TERM, pid) if pid > 0
@@ -215,8 +143,8 @@ EOF
215
143
  @mogstored_http = TCPServer.new(@test_host, 0)
216
144
  @mogstored_mgmt_port = @mogstored_mgmt.addr[1]
217
145
  @mogstored_http_port = @mogstored_http.addr[1]
218
- @mogstored_conf = Tempfile.new(["mogstored", "conf"])
219
- @mogstored_pid = Tempfile.new(["mogstored", "pid"])
146
+ @mogstored_conf = Tempfile.new(["mogstored", "conf"], @docroot)
147
+ @mogstored_pid = Tempfile.new(["mogstored", "pid"], @docroot)
220
148
  @mogstored_conf.write <<EOF
221
149
  pidfile = #{@mogstored_pid.path}
222
150
  maxconns = 1000
data/test/setup.rb CHANGED
@@ -58,13 +58,8 @@ require 'socket'
58
58
  class TempServer
59
59
  attr_reader :port, :pid
60
60
 
61
- def self.destroy_all!
62
- ObjectSpace.each_object(TempServer) { |t| t.destroy! }
63
- end
64
-
65
- at_exit { TempServer.destroy_all! }
66
-
67
61
  def initialize(server_proc, port = nil)
62
+ @destroy_pid = $$
68
63
  @pid = @sock = nil
69
64
  @port = port
70
65
  retries = 10
@@ -85,6 +80,7 @@ class TempServer
85
80
  end
86
81
 
87
82
  def destroy!
83
+ return if @destroy_pid != $$
88
84
  @sock.close rescue nil
89
85
  Process.kill('KILL', @pid) rescue nil
90
86
  end
data/test/test_admin.rb CHANGED
@@ -148,5 +148,29 @@ class TestMogileFS__Admin < TestMogileFS
148
148
  assert_equal expected, @client.list_fids(0, 100)
149
149
  end
150
150
 
151
+ def test_get_devices
152
+ @backend.get_devices = {
153
+ 'dev1_utilization' => '5.5',
154
+ 'dev1_devid' => '1',
155
+ 'dev1_hostid' => '3',
156
+ 'dev1_observed_state' => 'writable',
157
+ 'dev1_reject_bad_md5' => '1',
158
+ 'dev2_utilization' => nil,
159
+ 'dev2_devid' => '2',
160
+ 'dev2_hostid' => '4',
161
+ 'dev2_observed_state' => nil,
162
+ 'devices' => '2'
163
+ }
164
+ exp = [
165
+ {
166
+ 'observed_state' => 'writable',
167
+ 'devid' => 1,
168
+ 'reject_bad_md5' => true,
169
+ 'utilization' => 5.5,
170
+ 'hostid' => 3,
171
+ },
172
+ { 'devid' => 2, 'hostid' => 4 }
173
+ ]
174
+ assert_equal exp, @client.get_devices
175
+ end
151
176
  end
152
-