msg-batcher 0.0.1 → 0.0.3
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 +4 -4
- data/lib/msg-batcher.rb +34 -18
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c39c802008e79837870af5f88a607a52bc0d1fe47a634012b2fb9d683560d726
|
4
|
+
data.tar.gz: c2ca34fdb97390eb44953dcd2fd3fbefdad4c15f380ca52384ba1d7e1ff0e113
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6398ddc1c414860880e4ed71e885856c657a5de8bc04e867fae8aa0c636b9ae9cdb8fe0d3228cb1eae086671ba9f6d82ff908c09b5b0215753d07792e05a4995
|
7
|
+
data.tar.gz: 2c301ea4cb70350c1a5a048612d7959dbda580897b99567d6b61a2ac3ee221271883040f70a4bbfb07c9916fa83407b2776d60b059fe251534217df01a73ec0c
|
data/lib/msg-batcher.rb
CHANGED
@@ -35,15 +35,26 @@ class MsgBatcher
|
|
35
35
|
start_timer
|
36
36
|
end
|
37
37
|
|
38
|
-
def kill
|
39
|
-
|
40
|
-
@
|
38
|
+
def kill(blocking: true)
|
39
|
+
# no #push will interfere
|
40
|
+
@m.synchronize do
|
41
|
+
# want to make sure that timer thread is in a waiting position. Hence, acquiring @m2
|
42
|
+
@m2.synchronize do
|
43
|
+
@closed = true
|
44
|
+
# releasing timer thread
|
45
|
+
@timer_start_cv.signal
|
46
|
+
# This can happen, however, that timer thread will wait timeout on @timer_release_cv.
|
47
|
+
# If it was waiting on @timer_start_cv. Because timer thread won't reach @timer_release_cv wait poisition
|
48
|
+
@timer_release_cv.signal
|
49
|
+
end
|
50
|
+
@timer_thread.join if blocking
|
51
|
+
end
|
41
52
|
end
|
42
53
|
|
43
54
|
# Thread-safe
|
44
55
|
# @raise [Error] when invoked when batcher has been closed
|
45
56
|
def push(entry)
|
46
|
-
raise Error,
|
57
|
+
raise Error, 'Batcher is closed - cannot push' if @closed
|
47
58
|
|
48
59
|
@m.lock
|
49
60
|
@m2.lock
|
@@ -78,7 +89,7 @@ class MsgBatcher
|
|
78
89
|
@storage = []
|
79
90
|
|
80
91
|
@already_released = true
|
81
|
-
dputs
|
92
|
+
dputs 'kill timer'
|
82
93
|
@timer_release_cv.signal # informing timer that release is happening
|
83
94
|
|
84
95
|
# Now interesting happens
|
@@ -91,12 +102,20 @@ class MsgBatcher
|
|
91
102
|
# So now we can be sure that timer is at the beginning, ready to wait for @timer_start_cv signal.
|
92
103
|
|
93
104
|
if from_push
|
94
|
-
dputs
|
105
|
+
dputs '--------before wait m2'
|
95
106
|
@timer_full_cycle_cv.wait @m2
|
96
107
|
@m2.unlock
|
97
|
-
dputs
|
108
|
+
dputs '-----22222'
|
98
109
|
@m.unlock
|
99
|
-
dputs
|
110
|
+
dputs '---- unlock all'
|
111
|
+
end
|
112
|
+
|
113
|
+
if temp.empty?
|
114
|
+
# The situation when the batch is empty should not happen.
|
115
|
+
# However, when the batcher is killed and the timer thread is forced to finish this can happen
|
116
|
+
# In any case, just ignoring this empty batch and do not call callback on it
|
117
|
+
warn 'MsgBatcher: empty batch. This should not have happened' unless @closed
|
118
|
+
return
|
100
119
|
end
|
101
120
|
|
102
121
|
begin
|
@@ -116,31 +135,28 @@ class MsgBatcher
|
|
116
135
|
@already_released = false
|
117
136
|
# informing release that timer is at the beginning
|
118
137
|
@timer_full_cycle_cv.signal
|
119
|
-
dputs
|
120
|
-
|
121
|
-
|
138
|
+
dputs 'sdlkfjsd'
|
122
139
|
|
123
140
|
# Position: TT1
|
124
141
|
# Wait for invocation from push
|
125
142
|
# Each release invocation finishes when timer thread are below (waiting for @timer_start_cv)
|
126
|
-
|
127
|
-
dputs "TT1"
|
143
|
+
dputs 'TT1'
|
128
144
|
@timer_start_cv.wait @m2
|
129
|
-
|
145
|
+
|
146
|
+
dputs 'TT1 after wait'
|
130
147
|
@timer_started_cv.signal
|
131
148
|
|
132
|
-
dputs
|
149
|
+
dputs 'TT2'
|
133
150
|
# then wait either time to elapse or signal that data has been released
|
134
151
|
@timer_release_cv.wait @m2, @max_time_msecs / 1000.0
|
135
|
-
|
136
152
|
dputs "timer end #{@m2.owned?}"
|
137
|
-
|
138
153
|
# @m2 is locked here!
|
139
|
-
|
140
154
|
unless @already_released
|
141
155
|
dputs "timer's release"
|
142
156
|
release(false)
|
143
157
|
end
|
158
|
+
|
159
|
+
break if @closed
|
144
160
|
end
|
145
161
|
end
|
146
162
|
# wait for timer to be in waiting state
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: msg-batcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ertygiq
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A Ruby library that facilitates thread-safe batch processing of messages.
|
14
14
|
In certain situations, processing multiple messages in batch is more efficient than
|