meeseeker 0.0.4 → 0.0.5

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
  SHA256:
3
- metadata.gz: 8b01bc12292352c934627c0f6ed373b6eec30dd05fc91ddcfbe83a5aa3da1e95
4
- data.tar.gz: '07983e2f5ab16f93e178160140e208636fb5e073e10aac7b5a0212eb50e49f68'
3
+ metadata.gz: ee0984fc73172da1b1186ecaf6efee7301857ef06daa1b140f16cc732e93e97f
4
+ data.tar.gz: 60c2cad0dc9ddd541323dca737f1a6c017f0dc4b458075c5d2512b960133c863
5
5
  SHA512:
6
- metadata.gz: 04d532184efc2c4d086e78e25e8e96106bbd0bf15121b2b55e25ef872874ea44da99ed994fe4e96ee6653dd002be7f82d3c1dbe5fa751703a6167487f4989631
7
- data.tar.gz: 195cd89d7cdad7f430f6b2b91816c50bca5bafc52551edc8cb8ff253620980ceb872f7ad360a0a25824aefa038a4dbf978a25b843a9c509f62467d717974d684
6
+ metadata.gz: d031ecca3a20d7b4c484baa461bbe35a2405c240ee4a2cb0ba45d6342bbba91a884cc55b347fd7db4fcdd987734e6d163bbf29be302127d5cf9674215333b592
7
+ data.tar.gz: f4824210cb157c65a80fdb217f9ec30dc55e09dde132ebe62db3896a08f7b50d2b21978ce9721d7b60312fd3c629abb7f2755f235b2f239281039b394578b35e
@@ -1,5 +1,7 @@
1
1
  module Meeseeker
2
2
  class BlockFollowerJob
3
+ MAX_VOP_RETRY = 3
4
+
3
5
  def perform(options = {})
4
6
  block_api = Steem::BlockApi.new(url: Meeseeker.node_url)
5
7
  redis = Meeseeker.redis
@@ -116,12 +118,79 @@ module Meeseeker
116
118
  begin
117
119
  stream_options = {url: Meeseeker.node_url, mode: mode}
118
120
  options = options.merge(at_block_num: last_block_num)
121
+ condenser_api = nil
119
122
 
120
123
  Steem::Stream.new(stream_options).tap do |stream|
121
124
  puts "Stream begin: #{stream_options.to_json}; #{options.to_json}"
122
125
 
123
- stream.operations(options) do |op, trx_id, block_num|
124
- yield op, trx_id, block_num
126
+ # Prior to v0.0.4, we only streamed operations with stream.operations.
127
+
128
+ # After v0.0.5, we stream blocks so that we can get block.timestamp,
129
+ # to embed it into op values. This should also reduce streaming
130
+ # overhead since we no longer stream block_headers inder the hood.
131
+
132
+ stream.blocks(options) do |block, block_num|
133
+ block.transactions.each_with_index do |transaction, index|
134
+ transaction.operations.each do |op|
135
+ op = op.merge(timestamp: block.timestamp)
136
+
137
+ yield op, block.transaction_ids[index], block_num
138
+ end
139
+ end
140
+
141
+ next unless !!Meeseeker.include_virtual
142
+
143
+ retries = 0
144
+
145
+ # This is where it gets tricky. Virtual ops sometims don't show up
146
+ # right away, especially if we're streaming on head blocks. In that
147
+ # situation, we might only need to wait about 1 block. This loop
148
+ # will likely one execute one iteration, but we have fallback logic
149
+ # in case there are complications.
150
+ #
151
+ # See: https://developers.steem.io/tutorials-recipes/virtual-operations-when-streaming-blockchain-transactions
152
+
153
+ loop do
154
+ condenser_api ||= Steem::CondenserApi.new(url: Meeseeker.node_url)
155
+ condenser_api.get_ops_in_block(block_num, true) do |vops|
156
+ redo if vops.nil?
157
+
158
+ if vops.empty? && mode != :head
159
+ # Usually, we just need to slow down to allow virtual ops to
160
+ # show up after a short delay. Adding this delay doesn't
161
+ # impact overall performance because steem-ruby will batch
162
+ # when block streams fall behind.
163
+
164
+ if retries < MAX_VOP_RETRY
165
+ retries = retries + 1
166
+ condenser_api = nil
167
+ sleep 3 * retries
168
+
169
+ redo
170
+ end
171
+
172
+ puts "Gave up retrying virtual ops lookup on block #{block_num}"
173
+
174
+ break
175
+ end
176
+
177
+ if retries > 0
178
+ puts "Found virtual ops for block #{block_num} aftere #{retries} retrie(s)"
179
+ end
180
+
181
+ vops.each do |vop|
182
+ normalized_op = Hashie::Mash.new(
183
+ type: vop.op[0],
184
+ value: vop.op[1],
185
+ timestamp: vop.timestamp
186
+ )
187
+
188
+ yield normalized_op, vop.trx_id, vop.block
189
+ end
190
+ end
191
+
192
+ break
193
+ end
125
194
  end
126
195
  end
127
196
  end
@@ -1,3 +1,3 @@
1
1
  module Meeseeker
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.5'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meeseeker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anthony Martin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-18 00:00:00.000000000 Z
11
+ date: 2019-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake