rhoconnect 3.0.0.rc1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/{CHANGELOG → CHANGELOG.md} +8 -1
  2. data/CREDITS +6 -1
  3. data/Gemfile.lock +19 -1
  4. data/Rakefile +12 -13
  5. data/bench/blobapp/settings/license.key +1 -1
  6. data/doc/authentication.txt +1 -1
  7. data/doc/install.txt +1 -1
  8. data/doc/rest-api.txt +11 -0
  9. data/doc/settings.txt +0 -22
  10. data/generators/templates/application/Gemfile +2 -0
  11. data/generators/templates/application/config.ru +5 -0
  12. data/install.sh +17 -6
  13. data/installer/{utils → unix-like}/create_texts.rb +2 -2
  14. data/installer/unix-like/rho_connect_install_checkers.rb +2 -3
  15. data/installer/unix-like/rho_connect_install_constants.rb +22 -29
  16. data/installer/unix-like/rho_connect_install_installers.rb +18 -43
  17. data/installer/unix-like/rho_connect_install_utilities.rb +1 -0
  18. data/installer/unix-like/rhoinstaller.rb +12 -5
  19. data/installer/utils/constants.rb +45 -0
  20. data/installer/utils/nix_installation.rake +0 -0
  21. data/installer/utils/unix_install_test.rb +258 -0
  22. data/lib/rhoconnect/api/source/push_deletes.rb +4 -1
  23. data/lib/rhoconnect/api/source/push_objects.rb +4 -1
  24. data/lib/rhoconnect/document.rb +8 -0
  25. data/lib/rhoconnect/source.rb +7 -33
  26. data/lib/rhoconnect/source_adapter.rb +9 -5
  27. data/lib/rhoconnect/source_sync.rb +49 -29
  28. data/lib/rhoconnect/store.rb +51 -0
  29. data/lib/rhoconnect/tasks.rb +20 -1
  30. data/lib/rhoconnect/version.rb +1 -1
  31. data/rhoconnect.gemspec +1 -1
  32. data/spec/source_sync_spec.rb +0 -50
  33. data/spec/store_spec.rb +36 -1
  34. data/tasks/redis.rake +17 -0
  35. metadata +9 -9
  36. data/installer/utils/install_test.rb +0 -152
@@ -0,0 +1,258 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'net/http'
4
+ require 'constants'
5
+ require 'rubygems'
6
+ require 'fog'
7
+ require 'readline'
8
+
9
+ # METHODS
10
+
11
+ # cmd
12
+ # easily issue system commands in a clear way
13
+ def cmd(cmd)
14
+ puts cmd
15
+ system(cmd)
16
+ end #cmd
17
+
18
+ # ssh_cmd
19
+ # More easily issue commands over the ssh connection.
20
+ def ssh_cmd(cmd)
21
+ puts cmd
22
+ puts @ssh.run(cmd)[0].stdout
23
+ end #ssh_cmd
24
+
25
+ # compile_stack_info
26
+ # Fills in all necessary information which is stack specific
27
+ def compile_stack_info
28
+ # User is stack specific but not to
29
+ # be included in the fog creation hash
30
+ @user = @stack[:user]
31
+ @stack.delete :user
32
+
33
+ # This part of the package name will always be the same
34
+ local_file = "#{`pwd`.strip}/../../pkg/"
35
+
36
+ # Append the rest of the file name according to distribution
37
+ if @user == 'ubuntu'
38
+ @dist = { :package => "rhoconnect_#{Constants::RC_VERSION}_all.deb",
39
+ :local_file => "#{local_file}rhoconnect_#{Constants::RC_VERSION}_all.deb",
40
+ :pkg_mgr => 'dpkg',
41
+ :pkg_repo => 'apt-get -y',
42
+ :deps => Constants::DEB_DEPS }
43
+ elsif @user == 'root'
44
+ @dist = { :package => "rhoconnect_#{Constants::RC_VERSION}_noarch.rpm",
45
+ :local_file => "#{local_file}rhoconnect_#{Constants::RC_VERSION}_noarch.rpm",
46
+ :pkg_mgr => 'rpm',
47
+ :pkg_repo => 'yes | yum',
48
+ :deps => Constants::RPM_DEPS }
49
+ else
50
+ puts "Incorrect user name"
51
+ exit
52
+ end #i
53
+ end #compile_stack_info
54
+
55
+ # create_ec2_instance
56
+ # Generates the Fog object and creates a new ec2 instance.
57
+ def create_ec2_instance
58
+ make_fog
59
+ start_new_instance
60
+ end #create_ec2_instance
61
+
62
+ # get_access_keys
63
+ # Retrieves the access key and secret access key from the above specified file.
64
+ def get_access_keys
65
+ lines = IO.readlines Constants::ACCESS_KEY_FILE
66
+ @access_key = lines.first.strip
67
+ @secret_access_key = lines.last.strip
68
+ end #get_access_keys
69
+
70
+ # make_fog
71
+ # Generates the Fog object used to create the new ec2 instance.
72
+ def make_fog
73
+ get_access_keys
74
+ @fog = Fog::Compute.new(
75
+ :provider => 'AWS',
76
+ :region => Constants::REGION,
77
+ :aws_access_key_id => @access_key,
78
+ :aws_secret_access_key => @secret_access_key
79
+ )
80
+ end #make_fog
81
+
82
+ # start_new_instance
83
+ # Creates a new ec2 instance as per the given stack.
84
+ def start_new_instance
85
+ puts "Creating new instance..."
86
+
87
+ @server = @fog.servers.create(@stack)
88
+ @server.wait_for { print "."; STDOUT.flush; ready? }
89
+ puts
90
+ if @server.ready?
91
+ # wait for all services to start on remote VM
92
+ puts "Waiting #{Constants::SLEEP} seconds for services to start on remote VM..."
93
+ Constants::SLEEP.times do
94
+ sleep( 1 )
95
+ print "."
96
+ STDOUT.flush
97
+ end #do
98
+ puts
99
+
100
+ # save important instance information
101
+ @host = @server.dns_name
102
+ @server_id = @server.id
103
+ else
104
+ puts "Server timed out."
105
+ exit
106
+ end #if
107
+ end #start_new_instance
108
+
109
+ # establish_ssh_connection
110
+ # Establishes the ssh connection needed to issue commands to the remote machine.
111
+ def establish_ssh_connection
112
+ @ssh = Fog::SSH.new( @host, @user, :keys => Constants::SSH_KEY )
113
+ end #establish_ssh_connection
114
+
115
+ # establish_scp_connection
116
+ # Establishes a gateway through which to transfer data
117
+ def establish_scp_connection
118
+ @scp = Fog::SCP.new( @host, @user, :keys => Constants::SSH_KEY )
119
+ end #create_scp_connection
120
+
121
+ # transfer
122
+ # transfers given data to remote machine via scp
123
+ def transfer(local_data, remote_data)
124
+ puts "Attempting to establish SCP connection..."
125
+ @scp.upload( local_data, remote_data ) do |cd, name, sent, total|
126
+ print "\r#{name}: #{(sent.to_f * 100 / total.to_f).to_i}%"
127
+ end #do
128
+ puts
129
+ end #establish_scp_connection
130
+
131
+ # transfer_rhoconnect
132
+ # Transfers the rhoconnect package over SCP
133
+ def transfer_rhoconnect
134
+ transfer @dist[:local_file], Constants::REMOTE_HOME
135
+ end #transfer_rhoconnect
136
+
137
+ # destroy_ec2_instance
138
+ # Terminates the current ec2 instance
139
+ def destroy_ec2_instance
140
+ @server.destroy
141
+ puts "Terminating Instance."
142
+ end #destroy_ec2_instance
143
+
144
+ # install_dependencies
145
+ # Installs all dependant packages on the remove machine
146
+ def install_dependencies
147
+ dep_install_string = "sudo #{@dist[:pkg_repo]} install"
148
+ @dist[:deps].each do |dep|
149
+ dep_install_string << " #{dep}"
150
+ end #do
151
+ ssh_cmd "sudo #{@dist[:pkg_repo]} update"
152
+ ssh_cmd dep_install_string
153
+ puts
154
+ end #install_dependencies
155
+
156
+ # install_package
157
+ # Issues commands to the remote machine to start the installation
158
+ def install_package
159
+ install_dependencies
160
+ ssh_cmd "sudo #{@dist[:pkg_mgr]} -i #{@dist[:package]}"
161
+ puts
162
+ end #install_package
163
+
164
+ def start_servers
165
+ puts "Starting Redis server"
166
+ ssh_cmd "sudo /etc/init.d/redis start"
167
+ puts "Starting nginx server"
168
+ ssh_cmd "sudo /etc/init.d/nginx start"
169
+ puts
170
+ end # start_servers
171
+
172
+ def check_rc_service
173
+ request = Net::HTTP.get_response(@host, '/console')
174
+ puts "Host: #{@host}"
175
+ puts "Code: #{request.code} Message: #{request.message}"
176
+ if request.code == '200'
177
+ puts "Rhoconnect service up!"
178
+ else
179
+ puts "Rhoconnect service down :("
180
+ end #if
181
+ end #check_rc_service
182
+
183
+ def compute_time(start_time, end_time)
184
+ time_delta = (end_time - start_time)
185
+
186
+ if time_delta >= 60
187
+ time_delta /= 60
188
+ time_units = 'minute'
189
+ if time_delta > 1
190
+ time_units << 's'
191
+ end #if
192
+ else
193
+ time_units = 'seconds'
194
+ end #if
195
+
196
+ "Test completed in #{time_delta} #{time_units}"
197
+ end #compute_time
198
+
199
+ # SCRIPT
200
+
201
+ # Create Packages
202
+
203
+ # Creating debian package
204
+ cmd "sudo rake build:deb"
205
+ # Make sure package was created successfully
206
+ if $? != 0
207
+ puts "Debian package was not created successfully" +
208
+ "Exiting..."
209
+ exit 1
210
+ end #if
211
+
212
+ # Keep commented until running on a machine with rpm
213
+ # Creating RPM package
214
+ #cmd "sudo rake build:rpm"
215
+ # Make sure package was created successfully
216
+ #if $? != 0
217
+ # puts "RPM package was not created successfully" +
218
+ # "Exiting..."
219
+ # exit 1
220
+ #end #if
221
+
222
+ # Test Package installations
223
+ start_time = Time.now
224
+ Constants::STACKS.each do |stack|
225
+ begin
226
+ @stack = stack
227
+ compile_stack_info
228
+
229
+ create_ec2_instance
230
+
231
+ # Establish connections
232
+ establish_ssh_connection
233
+ establish_scp_connection
234
+
235
+ # Transfer the Rhoconnect package to the remote machine
236
+ transfer_rhoconnect
237
+
238
+ puts "Installing rhoconnect package.\n" +
239
+ "This may take a while..."
240
+ install_package
241
+
242
+ # Start the redis and nginx servers on the remote machine
243
+ start_servers
244
+
245
+ # Check the status of the rhoconnect service
246
+ check_rc_service
247
+ rescue => e
248
+ puts "OH NOEZ, Exception!!"
249
+ puts e.inspect
250
+ puts e.backtrace
251
+ ensure
252
+ if @server != nil
253
+ destroy_ec2_instance
254
+ end #if
255
+ end #begin
256
+ end #do
257
+ end_time = Time.now
258
+ puts compute_time start_time end_time
@@ -3,6 +3,9 @@ Server.api :push_deletes, :source do |params,user|
3
3
  # if source does not exist create one for dynamic adapter
4
4
  source = Source.create({:name => params[:source_id]},{:app_id => APP_NAME,:user_id=>params[:user_id]}) unless source
5
5
  source_sync = SourceSync.new(source)
6
- source_sync.push_deletes(params[:objects])
6
+ timeout = params[:timeout] || 10
7
+ raise_on_expire = params[:raise_on_expire] || false
8
+ rebuild_md = params[:rebuild_md].nil? ? true : params[:rebuild_md]
9
+ source_sync.push_deletes(params[:objects],timeout,raise_on_expire,rebuild_md)
7
10
  'done'
8
11
  end
@@ -3,6 +3,9 @@ Server.api :push_objects, :source do |params,user|
3
3
  # if source does not exist create one for dynamic adapter
4
4
  source = Source.create({:name => params[:source_id]},{:app_id => APP_NAME,:user_id=>params[:user_id]}) unless source
5
5
  source_sync = SourceSync.new(source)
6
- source_sync.push_objects(params[:objects])
6
+ timeout = params[:timeout] || 10
7
+ raise_on_expire = params[:raise_on_expire] || false
8
+ rebuild_md = params[:rebuild_md].nil? ? true : params[:rebuild_md]
9
+ source_sync.push_objects(params[:objects],timeout,raise_on_expire,rebuild_md)
7
10
  'done'
8
11
  end
@@ -13,6 +13,14 @@ module Document
13
13
  Store.put_data(docname(doctype),data,append)
14
14
  end
15
15
 
16
+ def update_objects(doctype,updates)
17
+ Store.update_objects(docname(doctype),updates)
18
+ end
19
+
20
+ def remove_objects(doctype,deletes)
21
+ Store.delete_objects(docname(doctype),deletes)
22
+ end
23
+
16
24
  def put_value(doctype,data)
17
25
  Store.put_value(docname(doctype),data)
18
26
  end
@@ -262,42 +262,16 @@ module Rhoconnect
262
262
  self.poll_interval == 0 or
263
263
  (self.poll_interval != -1 and self.read_state.refresh_time <= Time.now.to_i)
264
264
  end
265
-
266
- def if_need_refresh(client_id=nil,params=nil)
267
- need_refresh = check_refresh_time
268
- yield client_id,params if need_refresh
269
- end
270
265
 
271
- def update_refresh_time(query_failure = false)
272
- if self.poll_interval == 0
273
- self.read_state.refresh_time = Time.now.to_i + self.poll_interval
274
- return
275
- end
276
-
277
- allowed_update = true
278
- # reset number of retries on succesfull query
279
- # or if last refresh was more than 'poll_interval' time ago
280
- if not query_failure or (Time.now.to_i - self.read_state.refresh_time >= self.poll_interval)
281
- self.read_state.retry_counter = 0
282
- end
283
-
284
- # do not reset the refresh time on failure
285
- # if retry limit is not reached
286
- if query_failure
287
- if self.read_state.retry_counter < self.retry_limit
288
- allowed_update = false
289
- self.read_state.increment!(:retry_counter)
290
- # we have reached the limit - update the refresh time
291
- # and reset the counter
292
- else
293
- self.read_state.retry_counter = 0
294
- end
295
- end
296
- if allowed_update
297
- self.read_state.refresh_time = Time.now.to_i + self.poll_interval
266
+ def if_need_refresh(client_id=nil,params=nil)
267
+ need_refresh = lock(:md) do |s|
268
+ check = check_refresh_time
269
+ s.read_state.refresh_time = Time.now.to_i + s.poll_interval if check
270
+ check
298
271
  end
272
+ yield client_id,params if need_refresh
299
273
  end
300
-
274
+
301
275
  def is_pass_through?
302
276
  self.pass_through and self.pass_through == 'true'
303
277
  end
@@ -55,16 +55,20 @@ module Rhoconnect
55
55
 
56
56
  def sync
57
57
  if @result and @result.empty?
58
- @source.flash_data(:md)
59
- @source.put_value(:md_size,0)
58
+ @source.lock(:md) do |s|
59
+ s.flash_data(:md)
60
+ s.put_value(:md_size,0)
61
+ end
60
62
  else
61
63
  if @result
62
64
  Store.put_data(@tmp_docname,@result)
63
65
  @stash_size += @result.size
64
66
  end
65
- @source.flash_data(:md)
66
- Store.rename(@tmp_docname,@source.docname(:md))
67
- @source.put_value(:md_size,@stash_size)
67
+ @source.lock(:md) do |s|
68
+ s.flash_data(:md)
69
+ Store.rename(@tmp_docname,s.docname(:md))
70
+ s.put_value(:md_size,@stash_size)
71
+ end
68
72
  end
69
73
  end
70
74
 
@@ -90,17 +90,11 @@ module Rhoconnect
90
90
 
91
91
  def do_query(params=nil)
92
92
  result = nil
93
- @source.lock(:md) do
94
- @source.if_need_refresh do
95
- Stats::Record.update("source:query:#{@source.name}") do
96
- if _auth_op('login')
97
- result = self.read(nil,params)
98
- _auth_op('logoff')
99
- end
100
- # update refresh time
101
- query_failure = Store.get_keys(@source.docname(:errors)).size > 0
102
- @source.update_refresh_time(query_failure)
103
- end
93
+ @source.if_need_refresh do
94
+ Stats::Record.update("source:query:#{@source.name}") do
95
+ return if _auth_op('login') == false
96
+ result = self.read(nil,params)
97
+ _auth_op('logoff')
104
98
  end
105
99
  end
106
100
  result
@@ -113,31 +107,57 @@ module Rhoconnect
113
107
  @source.app_id,@source.user_id,client_id,params)
114
108
  end
115
109
 
116
- def push_objects(objects,timeout=10,raise_on_expire=false)
110
+ def push_objects(objects,timeout=10,raise_on_expire=false,rebuild_md=true)
117
111
  @source.lock(:md,timeout,raise_on_expire) do |s|
118
- doc = @source.get_data(:md)
119
- orig_doc_size = doc.size
120
- objects.each do |id,obj|
121
- doc[id] ||= {}
122
- doc[id].merge!(obj)
123
- end
124
- diff_count = doc.size - orig_doc_size
125
- @source.put_data(:md,doc)
112
+ diff_count = 0
113
+ # in case of rebuild_md
114
+ # we clean-up and rebuild the whole :md doc
115
+ # on every request
116
+ if(rebuild_md)
117
+ doc = @source.get_data(:md)
118
+ orig_doc_size = doc.size
119
+ objects.each do |id,obj|
120
+ doc[id] ||= {}
121
+ doc[id].merge!(obj)
122
+ end
123
+ diff_count = doc.size - orig_doc_size
124
+ @source.put_data(:md,doc)
125
+ else
126
+ # if rebuild_md == false
127
+ # we only operate on specific set values
128
+ # which brings a big optimization
129
+ # in case of small transactions
130
+ diff_count = @source.update_objects(:md, objects)
131
+ end
132
+
126
133
  @source.update_count(:md_size,diff_count)
127
134
  end
128
135
  end
129
136
 
130
- def push_deletes(objects,timeout=10,raise_on_expire=false)
137
+ def push_deletes(objects,timeout=10,raise_on_expire=false,rebuild_md=true)
131
138
  @source.lock(:md,timeout,raise_on_expire) do |s|
132
- doc = @source.get_data(:md)
133
- orig_doc_size = doc.size
134
- objects.each do |id|
135
- doc.delete(id)
136
- end
137
- diff_count = doc.size - orig_doc_size
138
- @source.put_data(:md,doc)
139
+ diff_count = 0
140
+ if(rebuild_md)
141
+ # in case of rebuild_md
142
+ # we clean-up and rebuild the whole :md doc
143
+ # on every request
144
+ doc = @source.get_data(:md)
145
+ orig_doc_size = doc.size
146
+ objects.each do |id|
147
+ doc.delete(id)
148
+ end
149
+ diff_count = doc.size - orig_doc_size
150
+ @source.put_data(:md,doc)
151
+ else
152
+ # if rebuild_md == false
153
+ # we only operate on specific set values
154
+ # which brings a big optimization
155
+ # in case of small transactions
156
+ diff_count = -@source.remove_objects(:md, objects)
157
+ end
158
+
139
159
  @source.update_count(:md_size,diff_count)
140
- end
160
+ end
141
161
  end
142
162
 
143
163
  private
@@ -47,6 +47,57 @@ module Rhoconnect
47
47
  end
48
48
  true
49
49
  end
50
+
51
+ # updates objects for a given doctype, source, user
52
+ # create new objects if necessary
53
+ def update_objects(dockey, data={})
54
+ return 0 unless dockey and data
55
+
56
+ new_object_count = 0
57
+ doc = get_data(dockey)
58
+ @@db.pipelined do
59
+ data.each do |key,value|
60
+ is_create = doc[key].nil?
61
+ new_object_count += 1 if is_create
62
+ value.each do |attrib,value|
63
+ next if _is_reserved?(attrib, value)
64
+
65
+ new_element = setelement(key,attrib,value)
66
+ element_exists = is_create ? false : doc[key].has_key?(attrib)
67
+ if element_exists
68
+ existing_element = setelement(key,attrib,doc[key][attrib])
69
+ if existing_element != new_element
70
+ @@db.srem(dockey, existing_element)
71
+ @@db.sadd(dockey, new_element)
72
+ end
73
+ else
74
+ @@db.sadd(dockey, new_element)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ new_object_count
80
+ end
81
+
82
+ # Removes objects from a given doctype,source,user
83
+ def delete_objects(dockey,data=[])
84
+ return 0 unless dockey and data
85
+
86
+ deleted_object_count = 0
87
+ doc = get_data(dockey)
88
+ @@db.pipelined do
89
+ data.each do |id|
90
+ if doc[id]
91
+ doc[id].each do |name,value|
92
+ @@db.srem(dockey, setelement(id,name,value))
93
+ end
94
+ deleted_object_count += 1
95
+ end
96
+ doc.delete(id)
97
+ end
98
+ end
99
+ deleted_object_count
100
+ end
50
101
 
51
102
  # Adds a simple key/value pair
52
103
  def put_value(dockey,value)
@@ -270,7 +270,7 @@ namespace :rhoconnect do
270
270
  end
271
271
  end
272
272
 
273
- desc "Start rhoconnect server in bg mode (Rhostudio)"
273
+ # desc "Start rhoconnect server in bg mode (Rhostudio) - this is an internal command"
274
274
  task :startbg do
275
275
  cmd = (jruby?) ? trinidad? : (thin? || mongrel? || report_missing_server)
276
276
  Thread.new {
@@ -288,6 +288,25 @@ namespace :rhoconnect do
288
288
  exit
289
289
  end
290
290
 
291
+ # desc "Start rhoconnect server in debug mode (Rhostudio) - this is an internal command"
292
+ task :startdebug do
293
+ cmd = (jruby?) ? trinidad? : (thin? || mongrel? || report_missing_server)
294
+ ENV['DEBUG'] = 'yes'
295
+ Thread.new {
296
+ if windows?
297
+ puts 'Starting rhoconnect...'
298
+ system("#{cmd} config.ru -P #{rhoconnect_pid}")
299
+ elsif jruby?
300
+ puts 'Starting rhoconnect in jruby environment...'
301
+ system("#{cmd}")
302
+ else
303
+ system("#{cmd} config.ru -P #{rhoconnect_pid}")
304
+ end
305
+ }
306
+
307
+ exit
308
+ end
309
+
291
310
  desc "run rhoconnect console"
292
311
  task :console, :environment do |t, args|
293
312
  if RedisRunner.running?
@@ -1,3 +1,3 @@
1
1
  module Rhoconnect
2
- VERSION = '3.0.0.rc1'
2
+ VERSION = '3.0.0'
3
3
  end
data/rhoconnect.gemspec CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
16
16
  s.rubyforge_project = nil
17
17
 
18
18
  s.files = %w(
19
- CHANGELOG CREDITS Gemfile Gemfile.lock install.sh README.md Rakefile LICENSE Rakefile rhoconnect.gemspec
19
+ CHANGELOG.md CREDITS Gemfile Gemfile.lock install.sh README.md Rakefile LICENSE Rakefile rhoconnect.gemspec
20
20
  )
21
21
  s.files += Dir.glob("bench/**/*")
22
22
  s.files += Dir.glob("doc/**/*")
@@ -231,55 +231,6 @@ describe "SourceSync" do
231
231
  verify_read_operation_with_error('query')
232
232
  end
233
233
 
234
- it "should do query with exception raised and update refresh time only after retries limit is exceeded" do
235
- @s.retry_limit = 1
236
- msg = "Error during query"
237
- @ss.should_receive(:log).with("SourceAdapter raised query exception: #{msg}")
238
- @ss.should_receive(:log).with(anything)
239
- set_test_data('test_db_storage',{},msg,"query error")
240
- res = @ss.do_query
241
- verify_result(@s.docname(:md) => {},
242
- @s.docname(:errors) => {'query-error'=>{'message'=>msg}})
243
- # 1) if retry_limit is set to N - then, first N retries should not update refresh_time
244
- @s.read_state.retry_counter.should == 1
245
- @s.read_state.refresh_time.should <= Time.now.to_i
246
-
247
- # try once more and fail again
248
- @ss.should_receive(:log).with("SourceAdapter raised query exception: #{msg}")
249
- @ss.should_receive(:log).with(anything)
250
- set_test_data('test_db_storage',{},msg,"query error")
251
- res = @ss.do_query
252
- verify_result(@s.docname(:md) => {},
253
- @s.docname(:errors) => {'query-error'=>{'message'=>msg}})
254
-
255
- # 2) if retry_limit is set to N and number of retries exceeded it - update refresh_time
256
- @s.read_state.retry_counter.should == 0
257
- @s.read_state.refresh_time.should > Time.now.to_i
258
- end
259
-
260
- it "should do query with exception raised and restore state with succesfull retry" do
261
- @s.retry_limit = 1
262
- msg = "Error during query"
263
- @ss.should_receive(:log).with("SourceAdapter raised query exception: #{msg}")
264
- @ss.should_receive(:log).with(anything)
265
- set_test_data('test_db_storage',{},msg,"query error")
266
- res = @ss.do_query
267
- verify_result(@s.docname(:md) => {},
268
- @s.docname(:errors) => {'query-error'=>{'message'=>msg}})
269
- # 1) if retry_limit is set to N - then, first N retries should not update refresh_time
270
- @s.read_state.retry_counter.should == 1
271
- @s.read_state.refresh_time.should <= Time.now.to_i
272
-
273
- # try once more (with success)
274
- expected = {'1'=>@product1,'2'=>@product2}
275
- set_test_data('test_db_storage',expected)
276
- @ss.do_query
277
- verify_result(@s.docname(:md) => expected,
278
- @s.docname(:errors) => {})
279
- @s.read_state.retry_counter.should == 0
280
- @s.read_state.refresh_time.should > Time.now.to_i
281
- end
282
-
283
234
  it "should do query with exception raised and update refresh time if retry_limit is 0" do
284
235
  @s.retry_limit = 0
285
236
  msg = "Error during query"
@@ -289,7 +240,6 @@ describe "SourceSync" do
289
240
  res = @ss.do_query
290
241
  verify_result(@s.docname(:md) => {},
291
242
  @s.docname(:errors) => {'query-error'=>{'message'=>msg}})
292
- # if poll_interval is set to 0 - refresh time should be updated
293
243
  @s.read_state.retry_counter.should == 0
294
244
  @s.read_state.refresh_time.should > Time.now.to_i
295
245
  end