couchrest_changes 0.0.3 → 0.0.4
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.
- data/lib/couchrest/changes/config.rb +6 -1
- data/lib/couchrest/changes/version.rb +1 -1
- data/lib/couchrest/changes.rb +59 -23
- metadata +2 -2
@@ -5,6 +5,7 @@ module CouchRest
|
|
5
5
|
module Config
|
6
6
|
extend self
|
7
7
|
|
8
|
+
attr_writer :app_name
|
8
9
|
attr_accessor :connection
|
9
10
|
attr_accessor :seq_file
|
10
11
|
attr_accessor :log_file
|
@@ -43,6 +44,10 @@ module CouchRest
|
|
43
44
|
join('_')
|
44
45
|
end
|
45
46
|
|
47
|
+
def app_name
|
48
|
+
@app_name ||= Pathname.new($0).basename
|
49
|
+
end
|
50
|
+
|
46
51
|
private
|
47
52
|
|
48
53
|
def init_logger
|
@@ -51,7 +56,7 @@ module CouchRest
|
|
51
56
|
@logger = Logger.new(log_file)
|
52
57
|
else
|
53
58
|
require 'syslog/logger'
|
54
|
-
@logger = Syslog::Logger.new(
|
59
|
+
@logger = Syslog::Logger.new(app_name)
|
55
60
|
end
|
56
61
|
@logger.level = Logger.const_get(log_level.upcase)
|
57
62
|
end
|
data/lib/couchrest/changes.rb
CHANGED
@@ -11,8 +11,8 @@ module CouchRest
|
|
11
11
|
|
12
12
|
def initialize(db_name, options = {})
|
13
13
|
db_name = Config.complete_db_name(db_name)
|
14
|
-
|
15
|
-
|
14
|
+
info "Tracking #{db_name}"
|
15
|
+
debug "Options: #{options.inspect}" if options.keys.any?
|
16
16
|
@options = options
|
17
17
|
@db = CouchRest.new(Config.couch_host).database(db_name)
|
18
18
|
read_seq(Config.seq_file) unless rerun?
|
@@ -40,30 +40,24 @@ module CouchRest
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def listen
|
43
|
-
|
44
|
-
|
43
|
+
info "listening..."
|
44
|
+
debug "Starting at sequence #{since}"
|
45
45
|
result = db.changes feed_options do |hash|
|
46
|
+
@retry_count = 0
|
46
47
|
callbacks(hash)
|
47
48
|
store_seq(hash["seq"])
|
48
49
|
end
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
50
|
+
raise EOFError
|
51
|
+
# appearently MultiJson has issues with the end of the couch stream.
|
52
|
+
# So sometimes we get a MultiJson::LoadError instead...
|
53
|
+
rescue MultiJson::LoadError, EOFError, RestClient::ServerBrokeConnection
|
54
|
+
return if run_once?
|
55
|
+
log_and_recover(result)
|
56
|
+
retry
|
55
57
|
end
|
56
58
|
|
57
59
|
protected
|
58
60
|
|
59
|
-
def logger
|
60
|
-
logger ||= Config.logger
|
61
|
-
end
|
62
|
-
|
63
|
-
def db
|
64
|
-
@db
|
65
|
-
end
|
66
|
-
|
67
61
|
def feed_options
|
68
62
|
if run_once?
|
69
63
|
{ :since => since }
|
@@ -96,22 +90,22 @@ module CouchRest
|
|
96
90
|
end
|
97
91
|
|
98
92
|
def read_seq(filename)
|
99
|
-
|
93
|
+
debug "Looking up sequence here: #{filename}"
|
100
94
|
FileUtils.touch(filename)
|
101
95
|
unless File.writable?(filename)
|
102
96
|
raise StandardError.new("Can't write to sequence file #{filename}")
|
103
97
|
end
|
104
98
|
@since = File.read(filename)
|
105
99
|
rescue Errno::ENOENT => e
|
106
|
-
|
100
|
+
warn "No sequence file found. Starting from scratch"
|
107
101
|
end
|
108
102
|
|
109
103
|
def check_seq
|
110
104
|
if @since == ''
|
111
105
|
@since = nil
|
112
|
-
|
106
|
+
debug "Found no sequence in the file."
|
113
107
|
elsif @since
|
114
|
-
|
108
|
+
debug "Found sequence: #{@since}"
|
115
109
|
end
|
116
110
|
end
|
117
111
|
|
@@ -119,13 +113,21 @@ module CouchRest
|
|
119
113
|
File.write Config.seq_file, MultiJson.dump(seq)
|
120
114
|
end
|
121
115
|
|
116
|
+
def log_and_recover(result)
|
117
|
+
debug result.inspect if result
|
118
|
+
info "Couch stream ended unexpectedly."
|
119
|
+
info "Will retry in 15 seconds."
|
120
|
+
info "Retried #{retry_count} times so far."
|
121
|
+
sleep 15
|
122
|
+
@retry_count += 1
|
123
|
+
end
|
124
|
+
|
122
125
|
#
|
123
126
|
# UNUSED: this is useful for only following new sequences.
|
124
127
|
# might also require .to_json to work on bigcouch.
|
125
128
|
#
|
126
129
|
def fetch_last_seq
|
127
130
|
hash = db.changes :limit => 1, :descending => true
|
128
|
-
logger.info "starting at seq: " + hash["last_seq"]
|
129
131
|
return hash["last_seq"]
|
130
132
|
end
|
131
133
|
|
@@ -136,5 +138,39 @@ module CouchRest
|
|
136
138
|
def run_once?
|
137
139
|
Config.flags.include?('--run-once')
|
138
140
|
end
|
141
|
+
|
142
|
+
def info(message)
|
143
|
+
return unless log_attempt?
|
144
|
+
logger.info message
|
145
|
+
end
|
146
|
+
|
147
|
+
def debug(message)
|
148
|
+
return unless log_attempt?
|
149
|
+
logger.debug message
|
150
|
+
end
|
151
|
+
|
152
|
+
def warn(message)
|
153
|
+
return unless log_attempt?
|
154
|
+
logger.warn message
|
155
|
+
end
|
156
|
+
|
157
|
+
# let's not clutter the logs if couch is down for a longer time.
|
158
|
+
def log_attempt?
|
159
|
+
[0, 1, 2, 4, 8, 20, 40, 120].include?(retry_count) ||
|
160
|
+
retry_count % 240 == 0
|
161
|
+
end
|
162
|
+
|
163
|
+
def retry_count
|
164
|
+
@retry_count ||= 0
|
165
|
+
end
|
166
|
+
|
167
|
+
def logger
|
168
|
+
logger ||= Config.logger
|
169
|
+
end
|
170
|
+
|
171
|
+
def db
|
172
|
+
@db
|
173
|
+
end
|
174
|
+
|
139
175
|
end
|
140
176
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couchrest_changes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-01-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: couchrest
|