starling-starling 0.9.7.10 → 0.9.8.200810061510

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,20 @@
1
+ == 0.9.9
2
+ * remove dependency on SyslogLogger so that starling works on windows.
3
+ * fix config file loading so relative paths are expanded properly <jacob@jacobatzen.dk>
4
+ * clean up redhat init.d script <gaffneyc@gmail.com>
5
+
6
+ == 0.9.8
7
+ * add fix to enable relative paths <david@motorator.com>
8
+ * fix tests so they don't run 10 times due to a stupid bug with how the server is forked <seth@mojodna.net>
9
+ * fix some other tests <romeda@gmail.com>
10
+ * fix some error messages <romeda@gmail.com>
11
+ * probably some other things <romeda@gmail.com>
12
+
13
+ == 0.9.7.9
14
+ * properly complain if the spool directory isn't writable <seth@mojodna.net>
15
+ * assume group and user privileges in a working order <seth@mojodna.net>
16
+ * support string user / group names in addition to uid/gids <seth@mojodna.net>
17
+
1
18
  == 0.9.7.7
2
19
  * added init.d scripts for redhat and ubuntu by Mike Perham <mperham@gmail.com>
3
20
  * 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
+
data/etc/starling.redhat CHANGED
@@ -1,63 +1,66 @@
1
1
  #!/bin/bash
2
2
  #
3
+ # Make sure the /var/run/starling, /var/log/starling and /var/spool/starling
4
+ # all exist and are owned by starling:starling
5
+ #
3
6
  # starling This shell script takes care of starting and stopping
4
7
  # the starling server
5
8
  # chkconfig: 345 98 98
6
9
  # description: The starling queue server
10
+ # processname: starling
11
+ # pidfile: /var/run/starling/starling.pid
12
+ # logfile: /var/log/starling/starling.log
13
+
14
+ # Source function library.
15
+ . /etc/rc.d/init.d/functions
16
+
17
+ # Source networking configuration.
18
+ [ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
19
+
20
+ DUSER=starling
21
+ DGROUP=starling
22
+ LOGFILE=/var/log/starling/starling.log
23
+ SPOOLDIR=/var/spool/starling
24
+ PORT=22122
25
+ LISTEN=0.0.0.0
26
+ PIDFILE=/var/run/starling/starling.pid
7
27
 
8
- #determine where the 'pidof' executable is located
9
- if [ -e /bin/pidof ]; then
10
- PIDOF="/bin/pidof"
11
- elif [ -e /sbin/pidof ]; then
12
- PIDOF="/sbin/pidof"
13
- elif [ -e /usr/local/bin/pidof ]; then
14
- PIDOF="/usr/local/bin/pidof"
15
- elif [ -e /bin/pgrep ]; then
16
- PIDOF="/bin/pgrep"
17
- elif [ -e /usr/bin/pgrep ]; then
18
- PIDOF="/usr/bin/pgrep"
19
- elif [ -e /usr/local/bin/pgrep ]; then
20
- PIDOF="/usr/local/bin/pgrep"
21
- else
22
- echo "Could not find pidof or pgrep"
23
- fi
24
-
25
- PROGDIR="/usr/bin"
26
- PROGNAME="starling"
27
- OPTIONS="-u nobody -g nobody -L /var/log/starling.log -q /var/spool/starling"
28
+ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
29
+ NAME=starling
30
+ INSTALL_DIR=/usr/local/bin
31
+ DAEMON=$INSTALL_DIR/$NAME
32
+ OPTS="-h $LISTEN -p $PORT -d -q $SPOOLDIR -P $PIDFILE -L $LOGFILE -u $DUSER -g $DGROUP"
28
33
 
29
34
  start() {
30
- pid=`$PIDOF $PROGNAME`
31
- if [ "$pid" != "" ]; then
32
- echo "$PROGDIR$PROGNAME already running: $pid"
33
- else
34
- echo "Starting $PROGDIR$PROGNAME"
35
- cd $PROGDIR
36
- nohup $PROGDIR$PROGNAME $OPTIONS &
37
- fi
35
+ echo -n $"Starting starling: "
36
+
37
+ daemon --pidfile=$PIDFILE $DAEMON $OPTS
38
+ echo
38
39
  }
39
40
 
40
41
  stop() {
41
- pid=`$PIDOF $PROGNAME`
42
- if [ "$pid" != "" ]; then
43
- echo "Stopping $PROGDIR$PROGNAME: $pid"
44
- kill $pid
45
- else
46
- echo "$PROGDIR$PROGNAME not running"
47
- fi
42
+ echo -n $"Stopping starling: "
43
+
44
+ killproc -p $PIDFILE starling
45
+ echo
48
46
  }
49
47
 
50
48
  case "$1" in
51
- start)
52
- start
53
- ;;
54
- stop)
55
- stop
56
- ;;
57
- restart)
58
- stop
59
- sleep 3
60
- start
61
- ;;
62
-
49
+ start)
50
+ start
51
+ ;;
52
+ stop)
53
+ stop
54
+ ;;
55
+ restart)
56
+ stop
57
+ sleep 3
58
+ start
59
+ ;;
60
+ status)
61
+ status -p $PIDFILE starling
62
+ ;;
63
+ *)
64
+ echo $"Usage: $0 {start|stop|restart|status}"
65
+ exit 1
63
66
  esac
data/lib/starling.rb CHANGED
@@ -3,18 +3,60 @@ require 'memcache'
3
3
  class Starling < MemCache
4
4
 
5
5
  WAIT_TIME = 0.25
6
+ alias_method :_original_get, :get
7
+ alias_method :_original_delete, :delete
6
8
 
7
9
  ##
8
10
  # fetch an item from a queue.
9
11
 
10
12
  def get(*args)
11
13
  loop do
12
- response = super(*args)
14
+ response = _original_get(*args)
13
15
  return response unless response.nil?
14
16
  sleep WAIT_TIME
15
17
  end
16
18
  end
19
+
20
+ ##
21
+ # will return the next item or nil
22
+
23
+ def fetch(*args)
24
+ _original_get(*args)
25
+ end
17
26
 
27
+ ##
28
+ # Delete the key (queue) from all Starling servers. This is necessary
29
+ # because the random way a server is chosen in #get_server_for_key
30
+ # implies that the queue could easily be spread across the entire
31
+ # Starling cluster.
32
+
33
+ def delete(key, expiry = 0)
34
+ with_servers do
35
+ _original_delete(key, expiry)
36
+ end
37
+ end
38
+
39
+ ##
40
+ # Provides a way to work with a specific list of servers by
41
+ # forcing all calls to #get_server_for_key to use a specific
42
+ # server, and changing that server each time that the call
43
+ # yields to the block provided. This helps work around the
44
+ # normally random nature of the #get_server_for_key method.
45
+ #
46
+ # Acquires the mutex for the entire duration of the call
47
+ # since unrelated calls to #get_server_for_key might be
48
+ # adversely affected by the non_random result.
49
+ def with_servers(my_servers = @servers.dup)
50
+ return unless block_given?
51
+ with_lock do
52
+ my_servers.each do |server|
53
+ @force_server = server
54
+ yield
55
+ end
56
+ @force_server = nil
57
+ end
58
+ end
59
+
18
60
  ##
19
61
  # insert +value+ into +queue+.
20
62
  #
@@ -90,6 +132,7 @@ class Starling < MemCache
90
132
  raise ArgumentError, "illegal character in key #{key.inspect}" if key =~ /\s/
91
133
  raise ArgumentError, "key too long #{key.inspect}" if key.length > 250
92
134
  raise MemCacheError, "No servers available" if @servers.empty?
135
+ return @force_server if @force_server
93
136
 
94
137
  bukkits = @buckets.dup
95
138
  bukkits.nitems.times do |try|
@@ -102,3 +145,24 @@ class Starling < MemCache
102
145
  raise MemCacheError, "No servers available (all dead)"
103
146
  end
104
147
  end
148
+
149
+
150
+ class MemCache
151
+
152
+ protected
153
+
154
+ ##
155
+ # Ensure that everything within the given block is executed
156
+ # within the locked mutex if this client is multithreaded.
157
+ # If the client isn't multithreaded, the block is simply executed.
158
+ def with_lock
159
+ return unless block_given?
160
+ begin
161
+ @mutex.lock if @multithread
162
+ yield
163
+ ensure
164
+ @mutex.unlock if @multithread
165
+ end
166
+ end
167
+
168
+ end
@@ -22,33 +22,37 @@ module StarlingServer
22
22
  SET_RESPONSE_SUCCESS = "STORED\r\n".freeze
23
23
  SET_RESPONSE_FAILURE = "NOT STORED\r\n".freeze
24
24
  SET_CLIENT_DATA_ERROR = "CLIENT_ERROR bad data chunk\r\nERROR\r\n".freeze
25
+
26
+ # DELETE Responses
27
+ DELETE_COMMAND = /\Adelete (.{1,250}) ([0-9]+)\r\n/m
28
+ DELETE_RESPONSE = "END\r\n".freeze
25
29
 
26
30
  # STAT Response
27
31
  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
32
+ STATS_RESPONSE = "STAT pid %d\r
33
+ STAT uptime %d\r
34
+ STAT time %d\r
35
+ STAT version %s\r
36
+ STAT rusage_user %0.6f\r
37
+ STAT rusage_system %0.6f\r
38
+ STAT curr_items %d\r
39
+ STAT total_items %d\r
40
+ STAT bytes %d\r
41
+ STAT curr_connections %d\r
42
+ STAT total_connections %d\r
43
+ STAT cmd_get %d\r
44
+ STAT cmd_set %d\r
45
+ STAT get_hits %d\r
46
+ STAT get_misses %d\r
47
+ STAT bytes_read %d\r
48
+ STAT bytes_written %d\r
49
+ STAT limit_maxbytes %d\r
46
50
  %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
51
+ QUEUE_STATS_RESPONSE = "STAT queue_%s_items %d\r
52
+ STAT queue_%s_total_items %d\r
53
+ STAT queue_%s_logsize %d\r
54
+ STAT queue_%s_expired_items %d\r
55
+ STAT queue_%s_age %d\r\n".freeze
52
56
 
53
57
  SHUTDOWN_COMMAND = /\Ashutdown\r\n/m
54
58
 
@@ -108,7 +112,6 @@ STAT queue_%s_age %d\n".freeze
108
112
  @data_buf = data
109
113
  return
110
114
  end
111
-
112
115
  case data
113
116
  when SET_COMMAND
114
117
  @server.stats[:set_requests] += 1
@@ -121,6 +124,8 @@ STAT queue_%s_age %d\n".freeze
121
124
  when SHUTDOWN_COMMAND
122
125
  # no point in responding, they'll never get it.
123
126
  Runner::shutdown
127
+ when DELETE_COMMAND
128
+ delete $1
124
129
  else
125
130
  logger.warn "Unknown command: #{data}."
126
131
  respond ERR_UNKNOWN_COMMAND
@@ -136,6 +141,12 @@ STAT queue_%s_age %d\n".freeze
136
141
  end
137
142
 
138
143
  private
144
+
145
+ def delete(queue)
146
+ @queue_collection.delete(queue)
147
+ respond DELETE_RESPONSE
148
+ end
149
+
139
150
  def respond(str, *args)
140
151
  response = sprintf(str, *args)
141
152
  @server.stats[:bytes_written] += response.length
@@ -83,6 +83,11 @@ module StarlingServer
83
83
  @trx = nil
84
84
  @not_trx.close
85
85
  end
86
+
87
+ def purge
88
+ close
89
+ File.delete(log_path)
90
+ end
86
91
 
87
92
  private
88
93
 
@@ -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
@@ -59,6 +59,12 @@ module StarlingServer
59
59
  @stats[:current_bytes] -= result.size
60
60
  result
61
61
  end
62
+
63
+ def delete(key)
64
+ queue = @queues.delete(key)
65
+ return if queue.nil?
66
+ queue.purge
67
+ end
62
68
 
63
69
  ##
64
70
  # Returns all active queues.
@@ -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]}"
@@ -40,6 +40,11 @@ module StarlingServer
40
40
  when "queue_path" then key = "path"
41
41
  when "log_file" then key = "logger"
42
42
  end
43
+
44
+ if %w(logger path pid_file).include?(key)
45
+ value = File.expand_path(value)
46
+ end
47
+
43
48
  options[key.to_sym] = value
44
49
 
45
50
  if options[:log_level].instance_of?(String)
@@ -51,11 +56,11 @@ module StarlingServer
51
56
  def parse_options
52
57
  self.options = { :host => '127.0.0.1',
53
58
  :port => 22122,
54
- :path => File.join(%w( / tmp starling spool )),
59
+ :path => File.join('', 'var', 'spool', 'starling'),
55
60
  :log_level => Logger::INFO,
56
61
  :daemonize => false,
57
62
  :timeout => 0,
58
- :pid_file => File.join(%w( / tmp starling starling.pid )) }
63
+ :pid_file => File.join('', 'var', 'run', 'starling.pid') }
59
64
 
60
65
  OptionParser.new do |opts|
61
66
  opts.summary_width = 25
@@ -76,7 +81,7 @@ module StarlingServer
76
81
  opts.on("-q", "--queue_path PATH",
77
82
  :REQUIRED,
78
83
  "Path to store Starling queue logs", "(default: #{options[:path]})") do |queue_path|
79
- options[:path] = queue_path
84
+ options[:path] = File.expand_path(queue_path)
80
85
  end
81
86
 
82
87
  opts.separator ""; opts.separator "Network:"
@@ -96,7 +101,7 @@ module StarlingServer
96
101
  end
97
102
 
98
103
  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
104
+ options[:pid_file] = File.expand_path(pid_file)
100
105
  end
101
106
 
102
107
  opts.on("-u", "--user USER", "User to run as") do |user|
@@ -110,11 +115,16 @@ module StarlingServer
110
115
  opts.separator ""; opts.separator "Logging:"
111
116
 
112
117
  opts.on("-L", "--log [FILE]", "Path to print debugging information.") do |log_path|
113
- options[:logger] = log_path
118
+ options[:logger] = File.expand_path(log_path)
114
119
  end
115
120
 
116
- opts.on("-l", "--syslog CHANNEL", "Write logs to the syslog instead of a log file.") do |channel|
117
- options[:syslog_channel] = channel
121
+ begin
122
+ require 'syslog_logger'
123
+
124
+ opts.on("-l", "--syslog CHANNEL", "Write logs to the syslog instead of a log file.") do |channel|
125
+ options[:syslog_channel] = channel
126
+ end
127
+ rescue LoadError
118
128
  end
119
129
 
120
130
  opts.on("-v", "Increase logging verbosity (may be used multiple times).") do
@@ -216,7 +226,7 @@ module StarlingServer
216
226
  safefork and exit
217
227
 
218
228
  unless sess_id = Process.setsid
219
- raise "Couldn't detache from controlling terminal."
229
+ raise "Couldn't detach from controlling terminal."
220
230
  end
221
231
 
222
232
  trap 'SIGHUP', 'IGNORE'
@@ -4,6 +4,7 @@ require 'rubygems'
4
4
  require 'fileutils'
5
5
  require 'memcache'
6
6
  require 'digest/md5'
7
+ require 'starling'
7
8
 
8
9
  require 'starling/server'
9
10
 
@@ -22,7 +23,7 @@ def safely_fork(&block)
22
23
  while blocking
23
24
  sleep 0.1
24
25
  end
25
-
26
+
26
27
  pid
27
28
  end
28
29
 
@@ -41,12 +42,17 @@ describe "StarlingServer" do
41
42
  :path => @tmp_path,
42
43
  :logger => Logger.new(STDERR),
43
44
  :log_level => Logger::FATAL)
44
- Signal.trap("INT") { server.stop }
45
+ Signal.trap("INT") {
46
+ server.stop
47
+ exit
48
+ }
49
+
45
50
  Process.kill("USR1", Process.ppid)
46
51
  server.run
47
52
  end
48
53
 
49
54
  @client = MemCache.new('127.0.0.1:22133')
55
+
50
56
  end
51
57
 
52
58
  it "should test if temp_path exists and is writeable" do
@@ -62,6 +68,14 @@ describe "StarlingServer" do
62
68
  @client.get('test_set_and_get_one_entry').should eql(v)
63
69
  end
64
70
 
71
+ it "should respond to delete" do
72
+ @client.delete("my_queue").should eql("END\r\n")
73
+ starling_client = Starling.new('127.0.0.1:22133')
74
+ starling_client.set('my_queue', 50)
75
+ starling_client.available_queues.size.should eql(1)
76
+ starling_client.delete("my_queue")
77
+ starling_client.available_queues.size.should eql(0)
78
+ end
65
79
 
66
80
  it "should expire entries" do
67
81
  v = rand((2**32)-1)
@@ -143,45 +157,42 @@ describe "StarlingServer" do
143
157
  # handle more than 1024 connections.
144
158
 
145
159
  unless IO::popen("uname").read.chomp == "Linux"
146
- raise "(Skipping epoll test: not on Linux)"
147
- skip = true
160
+ pending "skipping epoll test: not on Linux"
148
161
  end
162
+
149
163
  fd_limit = IO::popen("bash -c 'ulimit -n'").read.chomp.to_i
150
164
  unless fd_limit > 1024
151
- raise "(Skipping epoll test: 'ulimit -n' = #{fd_limit}, need > 1024)"
152
- skip = true
165
+ pending "skipping epoll test: 'ulimit -n' = #{fd_limit}, need > 1024"
153
166
  end
154
167
 
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
168
+ v = rand(2**32 - 1)
169
+ @client.set('test_epoll', v)
170
+
171
+ # we can't open 1024 connections to memcache from within this process,
172
+ # because we will hit ruby's 1024 fd limit ourselves!
173
+ pid1 = safely_fork do
174
+ unused_sockets = []
175
+ 600.times do
176
+ unused_sockets << TCPSocket.new("127.0.0.1", 22133)
168
177
  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
178
+ Process.kill("USR1", Process.ppid)
179
+ sleep 90
180
+ end
181
+ pid2 = safely_fork do
182
+ unused_sockets = []
183
+ 600.times do
184
+ unused_sockets << TCPSocket.new("127.0.0.1", 22133)
176
185
  end
186
+ Process.kill("USR1", Process.ppid)
187
+ sleep 90
188
+ end
177
189
 
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
190
+ begin
191
+ client = MemCache.new('127.0.0.1:22133')
192
+ client.get('test_epoll').should eql(v)
193
+ ensure
194
+ Process.kill("TERM", pid1)
195
+ Process.kill("TERM", pid2)
185
196
  end
186
197
  end
187
198
 
@@ -202,4 +213,4 @@ describe "StarlingServer" do
202
213
  @client.reset
203
214
  FileUtils.rm(Dir.glob(File.join(@tmp_path, '*')))
204
215
  end
205
- end
216
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: starling-starling
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.7.10
4
+ version: 0.9.8.200810061510
5
5
  platform: ruby
6
6
  authors:
7
7
  - Blaine Cook
@@ -13,20 +13,11 @@ autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
15
 
16
- date: 2008-08-13 00:00:00 -07:00
16
+ date: 2008-10-09 00:00:00 -07:00
17
17
  default_executable:
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
- name: fiveruns-memcache-client
21
- version_requirement:
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: "0"
27
- version:
28
- - !ruby/object:Gem::Dependency
29
- name: SyslogLogger
20
+ name: memcache-client
30
21
  version_requirement:
31
22
  version_requirements: !ruby/object:Gem::Requirement
32
23
  requirements:
@@ -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/starling/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