pgtk 0.32.3 → 0.32.4

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pgtk/stash.rb +32 -15
  3. data/lib/pgtk/version.rb +1 -1
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88d74c18619134011d6187d976ef4b2156e1d5e629399ce8accf9962458e011f
4
- data.tar.gz: 76cfad9774a3c1872ea8204112b441bdf92f5b34fce1845356e7cf37496e21d8
3
+ metadata.gz: 72cdeed11d9faa8c9097c01256603b2ce77a507b936c983ab623b9e1d6e7d364
4
+ data.tar.gz: ab60b5670e87009e1eb47983bd8d729eb403d78a9c6a20c82ea14d70d4a7d18f
5
5
  SHA512:
6
- metadata.gz: 1c4d9b98f94558363813c59d0a55a6a60a40ceefa7c25e9e831aa588175b90c8ee65f41e0c9b0bf89c52f0823ceffc80381ad741dad2d12e8a81c368880b36b0
7
- data.tar.gz: 16995fbc6540edcd37982b69b0b3222d8bb5d9b4094ba5477500d3250795c672282ecc1611443bb1357f675cf5534d115d0742b13d9c42f30abc0b77c198e7cf
6
+ metadata.gz: 691ea0c8b5ca6002b72ab4b66487b3dbf489feaedbc8e80cc772fe69cfc1ad966fa836e13298b561cadb38c75290ed8a533a389751a7d6b0454da23b87afcb74
7
+ data.tar.gz: 8a04b05ad839b935ac3f8e5362bb957eb64e8e70e1b963c5713a7c7755f8184e6c1e8c806a4d03467bba80e3ce5af0cf9c1a1a50c4d73f11e79d46dc9569fc2f
data/lib/pgtk/stash.rb CHANGED
@@ -61,7 +61,7 @@ class Pgtk::Stash
61
61
  # @param [Concurrent::ReentrantReadWriteLock] entrance Read-write lock for thread-safe access
62
62
  def initialize(
63
63
  pool,
64
- stash: { queries: {}, tables: {}, table_mod: {} },
64
+ stash: { queries: {}, tables: {}, table_mod: {}, table_inflight: {} },
65
65
  loog: Loog::NULL,
66
66
  entrance: Concurrent::ReentrantReadWriteLock.new,
67
67
  refill: 16,
@@ -76,6 +76,7 @@ class Pgtk::Stash
76
76
  @pool = pool
77
77
  @stash = stash
78
78
  @stash[:table_mod] ||= {}
79
+ @stash[:table_inflight] ||= {}
79
80
  @loog = loog
80
81
  @entrance = entrance
81
82
  @refill = refill
@@ -221,22 +222,33 @@ class Pgtk::Stash
221
222
  def modify(pure, params, result)
222
223
  tables = pure.scan(ALTS_RE).flatten
223
224
  tables.uniq!
224
- ret = @pool.exec(pure, params, result)
225
- now = Time.now
226
225
  affected = (tables + tables.flat_map { |t| @cascades&.fetch(t, []) || [] }).uniq
227
226
  @entrance.with_write_lock do
228
- affected.each do |t|
229
- old = @stash[:table_mod][t]
230
- stamp = old && old > now ? old : now
231
- @stash[:table_mod][t] = stamp
232
- @stash[:tables][t]&.each do |q|
233
- @stash[:queries][q]&.each_key do |key|
234
- @stash[:queries][q][key][:stale] = stamp
227
+ affected.each { |t| @stash[:table_inflight][t] = (@stash[:table_inflight][t] || 0) + 1 }
228
+ end
229
+ begin
230
+ ret = @pool.exec(pure, params, result)
231
+ now = Time.now
232
+ @entrance.with_write_lock do
233
+ affected.each do |t|
234
+ @stash[:table_inflight][t] -= 1
235
+ old = @stash[:table_mod][t]
236
+ stamp = old && old > now ? old : now
237
+ @stash[:table_mod][t] = stamp
238
+ @stash[:tables][t]&.each do |q|
239
+ @stash[:queries][q]&.each_key do |key|
240
+ @stash[:queries][q][key][:stale] = stamp
241
+ end
235
242
  end
236
243
  end
237
244
  end
245
+ ret
246
+ rescue StandardError
247
+ @entrance.with_write_lock do
248
+ affected.each { |t| @stash[:table_inflight][t] -= 1 }
249
+ end
250
+ raise
238
251
  end
239
- ret
240
252
  end
241
253
 
242
254
  def select(pure, params, result)
@@ -380,8 +392,12 @@ class Pgtk::Stash
380
392
  end
381
393
 
382
394
  def replenish(query)
395
+ tables = query.scan(READS_RE).flatten
396
+ tables.uniq!
397
+ pinned = nil
383
398
  snapshot =
384
399
  @entrance.with_read_lock do
400
+ pinned = tables.to_h { |t| [t, @stash[:table_mod][t]] }
385
401
  @stash[:queries][query]&.filter_map do |k, h|
386
402
  next unless h[:stale]
387
403
  next if h[:stale] > Time.now - @delay
@@ -396,10 +412,11 @@ class Pgtk::Stash
396
412
  @entrance.with_write_lock do
397
413
  h = @stash[:queries][query]&.dig(k)
398
414
  next unless h
399
- if h[:stale] == mark
400
- h[:ret] = ret
401
- h.delete(:stale)
402
- end
415
+ next unless h[:stale] == mark
416
+ next if pinned.any? { |t, m| @stash[:table_mod][t] != m }
417
+ next if tables.any? { |t| (@stash[:table_inflight][t] || 0).positive? }
418
+ h[:ret] = ret
419
+ h.delete(:stale)
403
420
  end
404
421
  end
405
422
  end
data/lib/pgtk/version.rb CHANGED
@@ -10,5 +10,5 @@ require_relative '../pgtk'
10
10
  # Copyright:: Copyright (c) 2019-2026 Yegor Bugayenko
11
11
  # License:: MIT
12
12
  module Pgtk
13
- VERSION = '0.32.3' unless defined?(VERSION)
13
+ VERSION = '0.32.4' unless defined?(VERSION)
14
14
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgtk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.32.3
4
+ version: 0.32.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko