kim-toms-starling 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,60 @@
1
+ == 0.10.0
2
+ * Solved compatibility issues with the new (and awesome, thanks mperham) Memcache client
3
+ * Fixed the old rspec tests.
4
+
5
+ == 0.9.9
6
+ * remove dependency on SyslogLogger so that starling works on windows.
7
+ * fix config file loading so relative paths are expanded properly <jacob@jacobatzen.dk>
8
+ * clean up redhat init.d script <gaffneyc@gmail.com>
9
+ * add a 'fetch' command that is non-blocking equivalent to 'get' <aaron.hawkins@shawkvalue.com>
10
+ * implement the 'delete' method to allow queues to be deleted <timshadel@gmail.com>
11
+
12
+ == 0.9.8
13
+ * add fix to enable relative paths <david@motorator.com>
14
+ * fix tests so they don't run 10 times due to a stupid bug with how the server is forked <seth@mojodna.net>
15
+ * fix some other tests <romeda@gmail.com>
16
+ * fix some error messages <romeda@gmail.com>
17
+ * probably some other things <romeda@gmail.com>
18
+
19
+ == 0.9.7.9
20
+ * properly complain if the spool directory isn't writable <seth@mojodna.net>
21
+ * assume group and user privileges in a working order <seth@mojodna.net>
22
+ * support string user / group names in addition to uid/gids <seth@mojodna.net>
23
+
24
+ == 0.9.7.7
25
+ * added init.d scripts for redhat and ubuntu by Mike Perham <mperham@gmail.com>
26
+ * fixed dependencies for SyslogLogger, eventmachine and memcache-client by Mike Perham <mperham@gmail.com>
27
+ * added starling_top script to monitor starling server by Mike Perham <mperham@gmail.com>
28
+ * fixed starling_top to use 22122 as port by Abdul-Rahman Advany <abdulrahman@advany.com>
29
+
30
+ == 0.9.7.6 2008-06-24
31
+ * removed client code (will be added to different project) by Abdul-Rahman Advany <abdulrahman@advany.com>
32
+
33
+ == 0.9.7.5 2008-05-04
34
+ * added worker class, using starling client you can now run them in background by Abdul-Rahman Advany <abdulrahman@advany.com>
35
+ - handles creation of threadpool
36
+ - handles fetching of messages and passing these to the threads
37
+ - handles pushing of processed messages to starling again if needed
38
+
39
+ == 0.9.7 2008-05-03
40
+ * merged branch of AnotherBritt and Glenn Rempe by Abdul-Rahman Advany <abdulrahman@advany.com>
41
+ * rspeced tests by Abdul-Rahman Advany <abdulrahman@advany.com>
42
+
43
+ == 0.9.6 2008-04-30
44
+ * logging of message lifecycle as :age by AnotherBritt <?>
45
+ * added some extra logging options by AnotherBritt <?>
46
+ * added some test for epoll by AnotherBritt <?>
47
+
48
+ == 0.9.5.4 2008-04-28
49
+
50
+ * Bumped version number by Glenn Rempe <glenn.rempe@gmail.com>
51
+ * Purged all old RubyForge config. Now GitHub friendly by Glenn Rempe <glenn.rempe@gmail.com>
52
+ * New gemspec for GitHub gem auto-build-serve by Glenn Rempe <glenn.rempe@gmail.com>
53
+
54
+ == 0.9.4 2008-01-31 ==
55
+ * Evented code added using EventMachine by Chris Wanstrath <chris@ozmm.org>
56
+
57
+ == 2007-11-02
58
+
59
+ * Initial release
60
+
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2007 FIXME full name
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,108 @@
1
+ = Name
2
+
3
+ Starling - a light weight server for reliable distributed message passing.
4
+
5
+ = Description
6
+
7
+ Starling is a powerful but simple messaging server that enables reliable
8
+ distributed queuing with an absolutely minimal overhead. It speaks the
9
+ MemCache protocol for maximum cross-platform compatibility. Any language
10
+ that speaks MemCache can take advantage of Starling's queue facilities.
11
+
12
+ = Installation
13
+
14
+ The Starling source is hosted at GitHub and can be found at:
15
+
16
+ http://github.com/starling/starling/tree/master
17
+
18
+ The original source was to be found at RubyForge but no longer exists there.
19
+
20
+ GitHub serves gems prefixed by a username to differentiate different forks.
21
+ This project can be installed with:
22
+
23
+ # THIS COMMAND ONE TIME ONLY
24
+ gem sources -a http://gems.github.com/
25
+
26
+ # As often as you like
27
+ sudo gem install starling-starling
28
+
29
+ See http://gems.github.com/ if you want more info about GitHub and gems.
30
+
31
+ = Quick Start Usage
32
+
33
+ # View the Starling help and usage message
34
+ starling --help
35
+
36
+ # In a console window start the Starling server. By default
37
+ # it runs verbosely in the foreground, listening on 127.0.0.1:22122
38
+ # and stores its files under /tmp/starling:
39
+ starling
40
+
41
+ # In a new console test the put and get of messages on a queue:
42
+
43
+ irb
44
+ >> require 'starling'
45
+ => true
46
+ >> starling = Starling.new('127.0.0.1:22122')
47
+ => MemCache: 1 servers, ns: nil, ro: false
48
+ >> starling.set('my_queue', 12345)
49
+ => nil
50
+ >> starling.get('my_queue')
51
+ => 12345
52
+
53
+ # You can do a simple loop over a queue with something like:
54
+ >> loop { puts starling.get('my_queue'); sleep 1 }
55
+ 12345
56
+ nil
57
+ nil
58
+ ...
59
+
60
+ For more information run the following in a new console:
61
+
62
+ 'gem server'
63
+
64
+ This will start a gem server on http://localhost:8808/ which you can view in your
65
+ browser to see the RDocs for the gem. Or generate rdocs by running the following
66
+ in a new console:
67
+
68
+ 'rdoc'
69
+
70
+ = Using memcache-client
71
+
72
+ memcache-client is now maintained by Mike Perham (http://www.mikeperham.com/)
73
+
74
+ He is the current maintainer of the gem which is hosted at GitHub and can be found at:
75
+
76
+ http://github.com/mperham/memcache-client/tree/master
77
+
78
+ It can be installed using:
79
+
80
+ # THIS COMMAND ONE TIME ONLY
81
+ gem sources -a http://gems.github.com/
82
+
83
+ # As often as you like
84
+ sudo gem install memcache-client
85
+
86
+ = Known Issues
87
+
88
+ * Only tested with Memcache client 1.7.x and with SystemTimer (http://systemtimer.rubyforge.org/)
89
+ * Starling is "slow" as far as messaging systems are concerned. In practice,
90
+ it's fast enough.
91
+
92
+ == TODO
93
+
94
+ * Implement memcached instead of memcache as a client interface (to make it faster)
95
+
96
+ = Authors
97
+
98
+ * Blaine Cook <romeda@gmail.com>
99
+ * Chris Wanstrath <chris@ozmm.org>
100
+ * AnotherBritt <?>
101
+ * Glenn Rempe <?>
102
+ * Abdul-Rahman Advany <abdulrahman@advany.com>
103
+ * Harm Aarts <harmaarts@gmail.com>
104
+
105
+ = Copyright
106
+
107
+ Starling - a light-weight server for reliable distributed message passing.
108
+ Copyright 2007-2008 Blaine Cook <blaine@twitter.com>, Twitter Inc.
data/Rakefile ADDED
@@ -0,0 +1,76 @@
1
+ require 'rubygems'
2
+ require 'rake/rdoctask'
3
+ require 'spec/rake/spectask'
4
+ require File.join("lib", "starling", "server")
5
+
6
+ task :default => :spec
7
+
8
+ task :install do
9
+ sh %{gem build starling.gemspec}
10
+ sh %{sudo gem install starling-*.gem}
11
+ end
12
+
13
+ desc "Run specs"
14
+ task :spec do
15
+ Dir.glob('spec/*_spec.rb').each do |f|
16
+ puts f
17
+ system "spec #{f}"
18
+ end
19
+ end
20
+
21
+ Rake::RDocTask.new do |rd|
22
+ rd.main = "README.rdoc"
23
+ rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
24
+ rd.rdoc_dir = 'doc'
25
+ end
26
+
27
+ def get_files(rev, path)
28
+ result = []
29
+ `git-ls-tree #{rev}`.each_line do |line|
30
+ columns = line.split(/\s/)
31
+ case columns[1]
32
+ when 'blob'
33
+ next if columns[3] == '.gitignore' #Not part of gem
34
+ result << "#{path}/#{columns[3]}"
35
+ when 'tree'
36
+ result << get_files(columns[2], "#{path}/#{columns[3]}")
37
+ end
38
+ end
39
+ result
40
+ end
41
+
42
+ desc "Generate a gemspec"
43
+ task :gemspec do
44
+ excess_files = Dir.glob('./spec/*') # remove spec files from generated gem
45
+
46
+ gemspec =<<-EOF
47
+ # this file is automatically generated
48
+ Gem::Specification.new do |s|
49
+ s.name = "starling"
50
+ s.version = "#{StarlingServer::VERSION}"
51
+ s.authors = ["Blaine Cook", "Chris Wanstrath", "Britt Selvitelle", "Glenn Rempe", "Abdul-Rahman Advany", "Seth Fitzsimmons", "Haarm Arts", "Chris Gaffney", "Kim Toms"]
52
+ s.email = ["blaine@twitter.com", "chris@ozmm.org", "abdulrahman@advany.com", "starlingmq@groups.google.com", "harmaarts@gmail.com", "gaffneyc@gmail.com", "kim.toms@gmail.com"]
53
+ s.homepage = "http://github.com/starling/starling/"
54
+ s.summary = "Starling is a lightweight, transactional, distributed queue server"
55
+ s.description = s.summary
56
+
57
+ s.files = #{(get_files('HEAD', '.').flatten - excess_files).inspect}
58
+
59
+ s.executables = ["starling", "starling_top"]
60
+ s.require_paths = ["lib"]
61
+
62
+ s.has_rdoc = true
63
+ s.rdoc_options = ["--quiet", "--title", "starling documentation", "--opname", "index.html", "--line-numbers", "--main", "README.rdoc", "--inline-source"]
64
+ s.extra_rdoc_files = ["README.rdoc", "CHANGELOG", "LICENSE"]
65
+
66
+ s.add_dependency 'fiveruns-memcache-client'
67
+ s.add_dependency 'eventmachine', [">= 0.12.0"]
68
+ end
69
+ EOF
70
+
71
+ open("starling.gemspec", "w") do |f|
72
+ f << gemspec
73
+ end
74
+
75
+ puts "gemspec successfully created."
76
+ end
data/bin/starling ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'starling/server_runner'
4
+
5
+ StarlingServer::Runner.run
6
+
data/bin/starling_top ADDED
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'ostruct'
5
+ require 'socket'
6
+
7
+ @options = OpenStruct.new
8
+ @options.hostname = 'localhost'
9
+ @options.port = 22122
10
+
11
+ op = OptionParser.new do |opts|
12
+ opts.banner = "STARLING TOP\nUsage: startop [options]"
13
+ opts.separator "General Options:"
14
+ opts.on("-h HOSTNAME", "--hostname=HOSTNAME", "Hostname [default: localhost]") do |h|
15
+ @options.hostname = h
16
+ end
17
+ opts.on("-p PORT", "--port=PORT", Integer, "Port [default: 22122]") do |p|
18
+ @options.port = p
19
+ end
20
+ opts.on_tail("--help", "Show this message") do
21
+ puts opts
22
+ exit
23
+ end
24
+ end
25
+ op.parse!
26
+
27
+
28
+ def stats_data
29
+ data = ''
30
+ sock = TCPSocket.new(@options.hostname, @options.port)
31
+ sock.print("stats\r\n")
32
+ sock.flush
33
+ # memcached does not close the socket once it is done writing
34
+ # the stats data. We need to read line by line until we detect
35
+ # the END line and then stop/close on our side.
36
+ stats = sock.gets
37
+ while true
38
+ data += stats
39
+ break if stats.strip == 'END'
40
+ stats = sock.gets
41
+ end
42
+ sock.close
43
+ data
44
+ end
45
+
46
+ def parse(stats_data)
47
+ stats = []
48
+ stats_data.each_line do |line|
49
+ stats << "#{$1}: #{$2}" if line =~ /STAT (\w+) (\S+)/
50
+ end
51
+ stats.sort
52
+ end
53
+
54
+ stats = parse(stats_data)
55
+ stats.each do |stat|
56
+ puts stat
57
+ 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
+
@@ -0,0 +1,66 @@
1
+ #!/bin/bash
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
+ #
6
+ # starling This shell script takes care of starting and stopping
7
+ # the starling server
8
+ # chkconfig: 345 98 98
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
27
+
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"
33
+
34
+ start() {
35
+ echo -n $"Starting starling: "
36
+
37
+ daemon --pidfile=$PIDFILE $DAEMON $OPTS
38
+ echo
39
+ }
40
+
41
+ stop() {
42
+ echo -n $"Stopping starling: "
43
+
44
+ killproc -p $PIDFILE starling
45
+ echo
46
+ }
47
+
48
+ case "$1" in
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
66
+ esac
@@ -0,0 +1,71 @@
1
+ #! /bin/sh
2
+ ### BEGIN INIT INFO
3
+ # Provides: starling
4
+ # Required-Start: $local_fs $remote_fs
5
+ # Required-Stop: $local_fs $remote_fs
6
+ # Default-Start: 2 3 4 5
7
+ # Default-Stop: S 0 1 6
8
+ # Short-Description: Starling queue server
9
+ # Description: The Starling distributed, transactional queue server
10
+ ### END INIT INFO
11
+ # Author: Twitter
12
+ # Version: 0.10.0
13
+
14
+ set -e
15
+
16
+ DUSER=starling
17
+ DGROUP=starling
18
+ LOGFILE=/var/log/starling/starling.log
19
+ SPOOLDIR=/var/spool/starling
20
+ PORT=22122
21
+ LISTEN=0.0.0.0
22
+ PIDFILE=/var/run/starling/starling.pid
23
+
24
+ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
25
+ NAME=starling
26
+ DESC="Starling"
27
+ INSTALL_DIR=/usr/local/bin
28
+ DAEMON=$INSTALL_DIR/$NAME
29
+ SCRIPTNAME=/etc/init.d/$NAME
30
+ OPTS="-h $LISTEN -p $PORT -d -q $SPOOLDIR -P $PIDFILE -L $LOGFILE"
31
+
32
+ . /lib/lsb/init-functions
33
+
34
+
35
+ # Gracefully exit if the package has been removed.
36
+ test -x $DAEMON || exit 0
37
+
38
+ d_start() {
39
+ log_begin_msg "Starting Starling Server..."
40
+ start-stop-daemon -c $DUSER:$DGROUP --start --quiet --pidfile $PIDFILE --exec $DAEMON \
41
+ -- $OPTS || log_end_msg 1
42
+ log_end_msg 0
43
+ }
44
+
45
+ d_stop() {
46
+ log_begin_msg "Stopping Starling Server..."
47
+ start-stop-daemon -c $DUSER:$DGROUP --stop --quiet --pidfile $PIDFILE \
48
+ || log_end_msg 1
49
+ log_end_msg 0
50
+ }
51
+
52
+ case "$1" in
53
+ start)
54
+ d_start
55
+ ;;
56
+ stop)
57
+ d_stop
58
+ ;;
59
+ restart|force-reload|reload)
60
+ d_stop
61
+ sleep 2
62
+ d_start
63
+ ;;
64
+ *)
65
+ echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
66
+ exit 3
67
+ ;;
68
+ esac
69
+
70
+ exit 0
71
+