mmmurf-starling 0.9.7.10 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,18 @@
1
+ == 0.9.9
2
+ * remove dependency on SyslogLogger so that starling works on windows.
3
+
4
+ == 0.9.8
5
+ * add fix to enable relative paths <david@motorator.com>
6
+ * fix tests so they don't run 10 times due to a stupid bug with how the server is forked <seth@mojodna.net>
7
+ * fix some other tests <romeda@gmail.com>
8
+ * fix some error messages <romeda@gmail.com>
9
+ * probably some other things <romeda@gmail.com>
10
+
11
+ == 0.9.7.9
12
+ * properly complain if the spool directory isn't writable <seth@mojodna.net>
13
+ * assume group and user privileges in a working order <seth@mojodna.net>
14
+ * support string user / group names in addition to uid/gids <seth@mojodna.net>
15
+
1
16
  == 0.9.7.7
2
17
  * added init.d scripts for redhat and ubuntu by Mike Perham <mperham@gmail.com>
3
18
  * fixed dependencies for SyslogLogger, eventmachine and memcache-client by Mike Perham <mperham@gmail.com>
data/Rakefile CHANGED
@@ -2,6 +2,8 @@ require 'rubygems'
2
2
  require 'rake/rdoctask'
3
3
  require 'spec/rake/spectask'
4
4
 
5
+ task :default => :spec
6
+
5
7
  task :install do
6
8
  sh %{gem build starling.gemspec}
7
9
  sh %{sudo gem install starling-*.gem}
@@ -9,7 +11,7 @@ end
9
11
 
10
12
  Spec::Rake::SpecTask.new do |t|
11
13
  t.ruby_opts = ['-rtest/unit']
12
- t.spec_files = FileList['test/test_*.rb']
14
+ t.spec_files = FileList['spec/*_spec.rb']
13
15
  t.fail_on_error = true
14
16
  end
15
17
 
@@ -17,5 +19,4 @@ Rake::RDocTask.new do |rd|
17
19
  rd.main = "README.rdoc"
18
20
  rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
19
21
  rd.rdoc_dir = 'doc'
20
- # rd.options = spec.rdoc_options
21
22
  end
@@ -0,0 +1,9 @@
1
+ starling:
2
+ port: 22122
3
+ pid_file: /tmp/starling/starling.pid
4
+ queue_path: /tmp/starling/spool
5
+ timeout: 0
6
+ syslog_channel: starling-tampopo
7
+ log_level: DEBUG
8
+ daemonize: true
9
+
@@ -25,30 +25,30 @@ module StarlingServer
25
25
 
26
26
  # STAT Response
27
27
  STATS_COMMAND = /\Astats\r\n/m
28
- STATS_RESPONSE = "STAT pid %d
29
- STAT uptime %d
30
- STAT time %d
31
- STAT version %s
32
- STAT rusage_user %0.6f
33
- STAT rusage_system %0.6f
34
- STAT curr_items %d
35
- STAT total_items %d
36
- STAT bytes %d
37
- STAT curr_connections %d
38
- STAT total_connections %d
39
- STAT cmd_get %d
40
- STAT cmd_set %d
41
- STAT get_hits %d
42
- STAT get_misses %d
43
- STAT bytes_read %d
44
- STAT bytes_written %d
45
- STAT limit_maxbytes %d
28
+ STATS_RESPONSE = "STAT pid %d\r
29
+ STAT uptime %d\r
30
+ STAT time %d\r
31
+ STAT version %s\r
32
+ STAT rusage_user %0.6f\r
33
+ STAT rusage_system %0.6f\r
34
+ STAT curr_items %d\r
35
+ STAT total_items %d\r
36
+ STAT bytes %d\r
37
+ STAT curr_connections %d\r
38
+ STAT total_connections %d\r
39
+ STAT cmd_get %d\r
40
+ STAT cmd_set %d\r
41
+ STAT get_hits %d\r
42
+ STAT get_misses %d\r
43
+ STAT bytes_read %d\r
44
+ STAT bytes_written %d\r
45
+ STAT limit_maxbytes %d\r
46
46
  %sEND\r\n".freeze
47
- QUEUE_STATS_RESPONSE = "STAT queue_%s_items %d
48
- STAT queue_%s_total_items %d
49
- STAT queue_%s_logsize %d
50
- STAT queue_%s_expired_items %d
51
- STAT queue_%s_age %d\n".freeze
47
+ QUEUE_STATS_RESPONSE = "STAT queue_%s_items %d\r
48
+ STAT queue_%s_total_items %d\r
49
+ STAT queue_%s_logsize %d\r
50
+ STAT queue_%s_expired_items %d\r
51
+ STAT queue_%s_age %d\r\n".freeze
52
52
 
53
53
  SHUTDOWN_COMMAND = /\Ashutdown\r\n/m
54
54
 
@@ -15,7 +15,7 @@ module StarlingServer
15
15
 
16
16
  def initialize(path)
17
17
  unless File.directory?(path) && File.writable?(path)
18
- raise InaccessibleQueuePath.new("#{path} must exist and be writable by #{Etc.getpwuid(Process.uid).name}.")
18
+ raise InaccessibleQueuePath.new("'#{path}' must exist and be read-writable by #{Etc.getpwuid(Process.uid).name}.")
19
19
  end
20
20
 
21
21
  @shutdown_mutex = Mutex.new
@@ -2,7 +2,6 @@ require 'socket'
2
2
  require 'logger'
3
3
  require 'rubygems'
4
4
  require 'eventmachine'
5
- require 'analyzer_tools/syslog_logger'
6
5
 
7
6
  here = File.dirname(__FILE__)
8
7
 
@@ -11,7 +10,7 @@ require File.join(here, 'handler')
11
10
 
12
11
  module StarlingServer
13
12
 
14
- VERSION = "0.9.7.9"
13
+ VERSION = "0.9.8"
15
14
 
16
15
  class Base
17
16
  attr_reader :logger
@@ -68,14 +67,27 @@ module StarlingServer
68
67
  def run
69
68
  @stats[:start_time] = Time.now
70
69
 
71
- @@logger = case @opts[:logger]
72
- when IO, String; Logger.new(@opts[:logger])
73
- when Logger; @opts[:logger]
74
- else; Logger.new(STDERR)
75
- end
76
- @@logger = SyslogLogger.new(@opts[:syslog_channel]) if @opts[:syslog_channel]
70
+ if @opts[:syslog_channel]
71
+ begin
72
+ require 'syslog_logger'
73
+ @@logger = SyslogLogger.new(@opts[:syslog_channel])
74
+ rescue LoadError
75
+ # SyslogLogger isn't available, so we're just going to use Logger
76
+ end
77
+ end
77
78
 
78
- @opts[:queue] = QueueCollection.new(@opts[:path])
79
+ @@logger ||= case @opts[:logger]
80
+ when IO, String; Logger.new(@opts[:logger])
81
+ when Logger; @opts[:logger]
82
+ else; Logger.new(STDERR)
83
+ end
84
+
85
+ begin
86
+ @opts[:queue] = QueueCollection.new(@opts[:path])
87
+ rescue InaccessibleQueuePath => e
88
+ puts "Error: #{e.message}"
89
+ exit 1
90
+ end
79
91
  @@logger.level = @opts[:log_level] || Logger::ERROR
80
92
 
81
93
  @@logger.info "Starling STARTUP on #{@opts[:host]}:#{@opts[:port]}"
@@ -51,11 +51,11 @@ module StarlingServer
51
51
  def parse_options
52
52
  self.options = { :host => '127.0.0.1',
53
53
  :port => 22122,
54
- :path => File.join(%w( / tmp starling spool )),
54
+ :path => File.join('', 'var', 'spool', 'starling'),
55
55
  :log_level => Logger::INFO,
56
56
  :daemonize => false,
57
57
  :timeout => 0,
58
- :pid_file => File.join(%w( / tmp starling starling.pid )) }
58
+ :pid_file => File.join('', 'var', 'run', 'starling.pid') }
59
59
 
60
60
  OptionParser.new do |opts|
61
61
  opts.summary_width = 25
@@ -76,7 +76,7 @@ module StarlingServer
76
76
  opts.on("-q", "--queue_path PATH",
77
77
  :REQUIRED,
78
78
  "Path to store Starling queue logs", "(default: #{options[:path]})") do |queue_path|
79
- options[:path] = queue_path
79
+ options[:path] = File.expand_path(queue_path)
80
80
  end
81
81
 
82
82
  opts.separator ""; opts.separator "Network:"
@@ -96,7 +96,7 @@ module StarlingServer
96
96
  end
97
97
 
98
98
  opts.on("-PFILE", "--pid FILENAME", "save PID in FILENAME when using -d option.", "(default: #{options[:pid_file]})") do |pid_file|
99
- options[:pid_file] = pid_file
99
+ options[:pid_file] = File.expand_path(pid_file)
100
100
  end
101
101
 
102
102
  opts.on("-u", "--user USER", "User to run as") do |user|
@@ -110,11 +110,16 @@ module StarlingServer
110
110
  opts.separator ""; opts.separator "Logging:"
111
111
 
112
112
  opts.on("-L", "--log [FILE]", "Path to print debugging information.") do |log_path|
113
- options[:logger] = log_path
113
+ options[:logger] = File.expand_path(log_path)
114
114
  end
115
115
 
116
- opts.on("-l", "--syslog CHANNEL", "Write logs to the syslog instead of a log file.") do |channel|
117
- options[:syslog_channel] = channel
116
+ begin
117
+ require 'syslog_logger'
118
+
119
+ opts.on("-l", "--syslog CHANNEL", "Write logs to the syslog instead of a log file.") do |channel|
120
+ options[:syslog_channel] = channel
121
+ end
122
+ rescue LoadError
118
123
  end
119
124
 
120
125
  opts.on("-v", "Increase logging verbosity (may be used multiple times).") do
@@ -216,7 +221,7 @@ module StarlingServer
216
221
  safefork and exit
217
222
 
218
223
  unless sess_id = Process.setsid
219
- raise "Couldn't detache from controlling terminal."
224
+ raise "Couldn't detach from controlling terminal."
220
225
  end
221
226
 
222
227
  trap 'SIGHUP', 'IGNORE'
@@ -22,7 +22,7 @@ def safely_fork(&block)
22
22
  while blocking
23
23
  sleep 0.1
24
24
  end
25
-
25
+
26
26
  pid
27
27
  end
28
28
 
@@ -41,7 +41,11 @@ describe "StarlingServer" do
41
41
  :path => @tmp_path,
42
42
  :logger => Logger.new(STDERR),
43
43
  :log_level => Logger::FATAL)
44
- Signal.trap("INT") { server.stop }
44
+ Signal.trap("INT") {
45
+ server.stop
46
+ exit
47
+ }
48
+
45
49
  Process.kill("USR1", Process.ppid)
46
50
  server.run
47
51
  end
@@ -62,7 +66,6 @@ describe "StarlingServer" do
62
66
  @client.get('test_set_and_get_one_entry').should eql(v)
63
67
  end
64
68
 
65
-
66
69
  it "should expire entries" do
67
70
  v = rand((2**32)-1)
68
71
  @client.get('test_set_with_expiry').should be_nil
@@ -143,45 +146,42 @@ describe "StarlingServer" do
143
146
  # handle more than 1024 connections.
144
147
 
145
148
  unless IO::popen("uname").read.chomp == "Linux"
146
- raise "(Skipping epoll test: not on Linux)"
147
- skip = true
149
+ pending "skipping epoll test: not on Linux"
148
150
  end
151
+
149
152
  fd_limit = IO::popen("bash -c 'ulimit -n'").read.chomp.to_i
150
153
  unless fd_limit > 1024
151
- raise "(Skipping epoll test: 'ulimit -n' = #{fd_limit}, need > 1024)"
152
- skip = true
154
+ pending "skipping epoll test: 'ulimit -n' = #{fd_limit}, need > 1024"
153
155
  end
154
156
 
155
- unless skip
156
- v = rand(2**32 - 1)
157
- @client.set('test_epoll', v)
158
-
159
- # we can't open 1024 connections to memcache from within this process,
160
- # because we will hit ruby's 1024 fd limit ourselves!
161
- pid1 = safely_fork do
162
- unused_sockets = []
163
- 600.times do
164
- unused_sockets << TCPSocket.new("127.0.0.1", 22133)
165
- end
166
- Process.kill("USR1", Process.ppid)
167
- sleep 90
157
+ v = rand(2**32 - 1)
158
+ @client.set('test_epoll', v)
159
+
160
+ # we can't open 1024 connections to memcache from within this process,
161
+ # because we will hit ruby's 1024 fd limit ourselves!
162
+ pid1 = safely_fork do
163
+ unused_sockets = []
164
+ 600.times do
165
+ unused_sockets << TCPSocket.new("127.0.0.1", 22133)
168
166
  end
169
- pid2 = safely_fork do
170
- unused_sockets = []
171
- 600.times do
172
- unused_sockets << TCPSocket.new("127.0.0.1", 22133)
173
- end
174
- Process.kill("USR1", Process.ppid)
175
- sleep 90
167
+ Process.kill("USR1", Process.ppid)
168
+ sleep 90
169
+ end
170
+ pid2 = safely_fork do
171
+ unused_sockets = []
172
+ 600.times do
173
+ unused_sockets << TCPSocket.new("127.0.0.1", 22133)
176
174
  end
175
+ Process.kill("USR1", Process.ppid)
176
+ sleep 90
177
+ end
177
178
 
178
- begin
179
- client = MemCache.new('127.0.0.1:22133')
180
- client.get('test_epoll').should eql(v)
181
- ensure
182
- Process.kill("TERM", pid1)
183
- Process.kill("TERM", pid2)
184
- end
179
+ begin
180
+ client = MemCache.new('127.0.0.1:22133')
181
+ client.get('test_epoll').should eql(v)
182
+ ensure
183
+ Process.kill("TERM", pid1)
184
+ Process.kill("TERM", pid2)
185
185
  end
186
186
  end
187
187
 
@@ -202,4 +202,4 @@ describe "StarlingServer" do
202
202
  @client.reset
203
203
  FileUtils.rm(Dir.glob(File.join(@tmp_path, '*')))
204
204
  end
205
- end
205
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mmmurf-starling
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.7.10
4
+ version: 0.9.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Blaine Cook
@@ -25,15 +25,6 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: "0"
27
27
  version:
28
- - !ruby/object:Gem::Dependency
29
- name: SyslogLogger
30
- version_requirement:
31
- version_requirements: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: "0"
36
- version:
37
28
  - !ruby/object:Gem::Dependency
38
29
  name: eventmachine
39
30
  version_requirement:
@@ -70,6 +61,7 @@ files:
70
61
  - lib/starling.rb
71
62
  - etc/starling.redhat
72
63
  - etc/starling.ubuntu
64
+ - etc/sample-config.yml
73
65
  has_rdoc: true
74
66
  homepage: http://github.com/mmmurf/starling/
75
67
  post_install_message:
@@ -105,4 +97,4 @@ signing_key:
105
97
  specification_version: 2
106
98
  summary: Starling is a lightweight, transactional, distributed queue server
107
99
  test_files:
108
- - test/test_starling_server.rb
100
+ - spec/starling_server_spec.rb