marty 1.0.24 → 1.0.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 86b79d602a84a7fea3fbca2b3704a8f9ccf6b00b
4
- data.tar.gz: 0720c7fe854939427a378e0cca9cfc8ebf96302f
3
+ metadata.gz: 5118b11e2b94fade41047bae2dec32b1a3bcd15a
4
+ data.tar.gz: c022e1c2d19cdb84ca5403fc7898ebfeececaa88
5
5
  SHA512:
6
- metadata.gz: b4d7f133d884839c72815a068934c54b26f7c366850fda2c313cd600a277eb93d2f438d5ad932fa5b66a9f0b9b25d7177465e209bdd1e8127d0309e4bc37fed7
7
- data.tar.gz: 429013d616affaa52db3d1eaffe52bc6402fd5e70245fb61f7de855debe7cbc68cd6214cb3e2c29dee96e535f80cc0da5e996c7a8ecc37c37df90e4dda5a873d
6
+ metadata.gz: 51e55d9a99ddce93de589b4873005c337b7ad8343659d1b8771b65a2146b2da68fc5757668eb05a420b06d45f866c61f635932e57f7ca4f06e798d08d5154f98
7
+ data.tar.gz: d097e901de04b56b8b073fb3e9459c952e7108f54261869c1e6501a56b4c473ef32793f4eae4deccf485f44ff92fcab6da79961af1737e8b69cf37a292da1029
@@ -36,7 +36,20 @@ class Marty::Log < Marty::Base
36
36
  stmt.bind_param(3, Time.zone.now.to_f)
37
37
  stmt.bind_param(4, details.pretty_inspect)
38
38
 
39
- stmt.execute
39
+ sent = false
40
+ retries = 3
41
+ delay = 0.1
42
+ until sent
43
+ begin
44
+ stmt.execute
45
+ sent = true
46
+ rescue SQLite3::BusyException
47
+ raise if retries == 0
48
+ retries -= 1
49
+ sleep delay
50
+ end
51
+ end
52
+
40
53
  rescue => e
41
54
  Marty::Util.logger.error("Marty::Logger failure: #{e.message}")
42
55
  ensure
@@ -1,3 +1,3 @@
1
1
  module Marty
2
- VERSION = "1.0.24"
2
+ VERSION = "1.0.25"
3
3
  end
@@ -41,4 +41,18 @@ class Gemini::Helper
41
41
  |pt|
42
42
  Mcfly.is_infinity pt
43
43
  end
44
+
45
+ delorean_fn :testlog, sig: 2 do
46
+ |str, data|
47
+ 10.times { Marty::Logger.info(str, data) }
48
+ true
49
+ end
50
+ delorean_fn :testaction, sig: 2 do
51
+ |str, id|
52
+ File.open("/tmp/logaction.txt", "a") do |f|
53
+ f.puts str % [id]
54
+ end
55
+ end
56
+
57
+
44
58
  end
@@ -102,6 +102,16 @@ FAILER:
102
102
  a = ERR('I had an error')
103
103
  EOS
104
104
 
105
+ NAME_K = "PromiseK"
106
+ SCRIPT_K = <<EOS
107
+ LOGGER:
108
+ msgid =? nil
109
+
110
+ result = Gemini::Helper.testlog('message', [msgid]) &&
111
+ Gemini::Helper.testaction('message %d', msgid)
112
+
113
+ EOS
114
+
105
115
  def promise_bodies
106
116
  {
107
117
  NAME_A => SCRIPT_A,
@@ -114,5 +124,6 @@ def promise_bodies
114
124
  NAME_H => SCRIPT_H,
115
125
  NAME_I => SCRIPT_I,
116
126
  NAME_J => SCRIPT_J,
127
+ NAME_K => SCRIPT_K,
117
128
  }
118
129
  end
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'job_helper'
2
3
 
3
4
  module Marty
4
5
  describe Logger do
@@ -97,4 +98,58 @@ module Marty
97
98
  end
98
99
  end
99
100
  end
101
+ describe "Exercise" do
102
+ before(:all) do
103
+ @clean_file = "/tmp/clean_#{Process.pid}.psql"
104
+ save_clean_db(@clean_file)
105
+ # transactional fixtures interfere with queueing jobs
106
+ self.use_transactional_fixtures = false
107
+
108
+ # Needed here because shutting transactional fixtures off
109
+ # means we lose the globally set user
110
+ Mcfly.whodunnit = UserHelpers.system_user
111
+
112
+ Marty::Script.load_script_bodies(promise_bodies, Date.today)
113
+ start_delayed_job
114
+ end
115
+ after(:all) do
116
+ restore_clean_db(@clean_file)
117
+ stop_delayed_job
118
+ File.unlink("/tmp/logaction.txt")
119
+ Marty::Log.cleanup(0)
120
+ self.use_transactional_fixtures = true
121
+ end
122
+
123
+ it "handles heavy load" do
124
+ File.open(Rails.root.join("log/test.log")) do |f|
125
+ f.seek(0, IO::SEEK_END)
126
+ engine = Marty::ScriptSet.new.get_engine(NAME_K)
127
+ (1..1000).each do |i|
128
+ engine.background_eval("LOGGER", {"msgid" => i}, ["result"])
129
+ end
130
+
131
+ 60.times do
132
+ running = Marty::Promise.uncached {
133
+ Marty::Promise.unscoped.where(result: nil)
134
+ }.count
135
+ break if running == 0
136
+ sleep 1
137
+ end
138
+
139
+ # each background_eval writes one line to /tmp/logaction.txt
140
+ # these must happen no matter what happens in Marty::Logger
141
+ expect(File.readlines("/tmp/logaction.txt").count).to eq(1000)
142
+
143
+ # each background_eval does 10 calls to Marty::Logger.
144
+ # failures (after 3 retries at 0.1 sec each) are logged to rails log
145
+ # the total count should be 10000
146
+ log_count = Marty::Log.all.count
147
+ failed_count = f.readlines.select do
148
+ |l|
149
+ l == "Marty::Logger failure: database is locked\n"
150
+ end.count
151
+ expect(log_count + failed_count).to eq(10000)
152
+ end
153
+ end
154
+ end
100
155
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marty
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.24
4
+ version: 1.0.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arman Bostani
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2017-03-21 00:00:00.000000000 Z
17
+ date: 2017-04-20 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: pg