marty 1.0.24 → 1.0.25

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: 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