run_loop 1.2.0.pre1 → 1.2.0.pre2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15eee499a372a51db5f46a5f922da9d776075fd6
4
- data.tar.gz: c11c9303daa2a189a3e83d0f20565d89aaac8836
3
+ metadata.gz: dfc436b93536dc5fc25891e526a80a1b524dd94e
4
+ data.tar.gz: 119009225a74e03e009710319db28773d3d89e0c
5
5
  SHA512:
6
- metadata.gz: 90aba28289c9d7ffaf2eb8724b5c25f1feaa068c7a1c8989ae7deec311ba71362e2675707e93ce8d031583e17e161b76026cc5ac611c66614bd15d4048eb66fa
7
- data.tar.gz: 3d6913e3023a1a09c9e4a1a808a918e4b1ceda4a9a0b1ace9a693944254e54460ed7f47167f6d443213a873aba8a17e9021509fdec0910f14a29d95690e49e40
6
+ metadata.gz: 219265bba39959c8949ca278aa8e68d07d206f19cbbf6ffd660404de790ab3610e2bee7dde5f7454df9befa88b9ef40515b5132688ddf8978a2f7d360e5c8044
7
+ data.tar.gz: 1f02e149ce98e667c35194ae31cb8da6cc3f3f9621efacacf5a49385144395592b27e5387fd12c522a9325472c5579f231d7a9304f884f2607c1c9c08e1446c1
data/lib/run_loop/core.rb CHANGED
@@ -11,6 +11,9 @@ module RunLoop
11
11
  class TimeoutError < RuntimeError
12
12
  end
13
13
 
14
+ class WriteFailedError < RuntimeError
15
+ end
16
+
14
17
  module Core
15
18
 
16
19
  START_DELIMITER = "OUTPUT_JSON:\n"
@@ -488,23 +491,47 @@ module RunLoop
488
491
  RUBY_PLATFORM == 'java'
489
492
  end
490
493
 
491
- def self.write_request(run_loop, cmd)
494
+ def self.write_request(run_loop, cmd, logger=nil)
492
495
  repl_path = run_loop[:repl_path]
493
496
  index = run_loop[:index]
494
497
  cmd_str = "#{index}:#{escape_host_command(cmd)}"
495
- log(cmd_str) if ENV['DEBUG'] == '1'
496
- File.open(repl_path, 'w') { |f| f.puts(cmd_str) }
498
+ should_log = (ENV['DEBUG'] == '1')
499
+ RunLoop.log_info(logger, cmd_str) if should_log
500
+ write_succeeded = false
501
+ 2.times do |i|
502
+ RunLoop.log_info(logger, "Trying write of command #{cmd_str} at index #{index}") if should_log
503
+ File.open(repl_path, 'w') { |f| f.puts(cmd_str) }
504
+ write_succeeded = validate_index_written(run_loop, index, logger)
505
+ break if write_succeeded
506
+ end
507
+ unless write_succeeded
508
+ RunLoop.log_info(logger, 'Failing...Raising RunLoop::WriteFailedError') if should_log
509
+ raise RunLoop::WriteFailedError.new("Trying write of command #{cmd_str} at index #{index}")
510
+ end
497
511
  run_loop[:index] = index + 1
498
512
 
499
513
  index
500
514
  end
501
515
 
516
+ def self.validate_index_written(run_loop, index, logger)
517
+ begin
518
+ Timeout::timeout(10, TimeoutError) do
519
+ Core.read_response(run_loop, index, 10, 'last_index')
520
+ end
521
+ RunLoop.log_info(logger, "validate index written for index #{index} ok")
522
+ return true
523
+ rescue TimeoutError => _
524
+ RunLoop.log_info(logger, "validate index written for index #{index} failed. Retrying.")
525
+ return false
526
+ end
527
+ end
528
+
502
529
  def self.escape_host_command(cmd)
503
530
  backquote = "\\"
504
531
  cmd.gsub(backquote,backquote*4)
505
532
  end
506
533
 
507
- def self.read_response(run_loop, expected_index, empty_file_timeout=10)
534
+ def self.read_response(run_loop, expected_index, empty_file_timeout=10, search_for_property='index')
508
535
 
509
536
  log_file = run_loop[:log_file]
510
537
  initial_offset = run_loop[:initial_offset] || 0
@@ -566,7 +593,7 @@ module RunLoop
566
593
  if ENV['DEBUG_READ']=='1'
567
594
  p parsed_result
568
595
  end
569
- json_index_if_present = parsed_result['index']
596
+ json_index_if_present = parsed_result[search_for_property]
570
597
  if json_index_if_present && json_index_if_present == expected_index
571
598
  result = parsed_result
572
599
  break
@@ -792,16 +819,12 @@ module RunLoop
792
819
  expected_index = run_loop[:index]
793
820
  result = nil
794
821
  begin
795
- expected_index = Core.write_request(run_loop, cmd)
796
- rescue Errno::EINTR => intr_error
822
+ expected_index = Core.write_request(run_loop, cmd, logger)
823
+ rescue RunLoop::WriteFailedError, Errno::EINTR => write_error
797
824
  # Attempt recover from interrupt by attempting to read result (assuming write went OK)
798
825
  # or retry if attempted read result fails
799
826
  run_loop[:index] = expected_index # restore expected index in case it changed
800
- log_info(logger, "Core.write_request was interrupted: #{intr_error}. Attempting recovery...")
801
- sleep(1) # Arbitrary wait in hope that the system condition causing the interrupt passes
802
- if intr_error && intr_error.backtrace
803
- log_info(logger, "backtrace: #{intr_error.backtrace.join("\n")}")
804
- end
827
+ log_info(logger, "Core.write_request failed: #{write_error}. Attempting recovery...")
805
828
  log_info(logger, "Attempting read in case the request was received... Please wait (#{interrupt_retry_timeout})...")
806
829
  begin
807
830
  Timeout::timeout(interrupt_retry_timeout, TimeoutError) do
@@ -813,7 +836,7 @@ module RunLoop
813
836
  return result
814
837
  rescue TimeoutError => _
815
838
  log_info(logger, "Read did not result in a response for index #{expected_index}... Retrying send_command...")
816
- return send_command(run_loop, cmd, options, num_retries+1, intr_error)
839
+ return send_command(run_loop, cmd, options, num_retries+1, write_error)
817
840
  end
818
841
  end
819
842
 
@@ -1,5 +1,5 @@
1
1
  module RunLoop
2
- VERSION = '1.2.0.pre1'
2
+ VERSION = '1.2.0.pre2'
3
3
 
4
4
  # A model of a software release version that can be used to compare two versions.
5
5
  #
@@ -302,7 +302,7 @@ while (true) {
302
302
  _actualIndex = parseInt(_input.substring(0, _index), 10);
303
303
  if (!isNaN(_actualIndex) && _actualIndex >= _expectedIndex) {
304
304
  _exp = _input.substring(_index + 1, _input.length);
305
- UIALogger.logMessage("Execute command: "+_exp);
305
+ Log.output(_actualIndex);
306
306
  _result = eval(_exp);
307
307
  }
308
308
  else {//likely old command is lingering...
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: run_loop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0.pre1
4
+ version: 1.2.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karl Krukow
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-07 00:00:00.000000000 Z
11
+ date: 2014-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor