koyo-postgres-replication 0.1.1.pre → 0.1.4.pre
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/.rubocop.yml +1 -0
- data/.yardoc/checksums +7 -7
- data/.yardoc/object_types +0 -0
- data/.yardoc/objects/root.dat +0 -0
- data/.yardopts +7 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +4 -1
- data/README.md +5 -3
- data/changelog.md +26 -4
- data/koyo-postgres-replication.gemspec +7 -4
- data/lib/koyo/repl/data_row.rb +13 -9
- data/lib/koyo/repl/database.rb +9 -0
- data/lib/koyo/repl/postgres_server.rb +56 -23
- data/lib/koyo/repl/railtie.rb +5 -0
- data/lib/koyo/repl/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d7e309ca1f76d89a85e0d84b66fd54b629e7060ffd089a6a4383099230ccad9f
|
|
4
|
+
data.tar.gz: d387c7c45a91cf7500c83188688024fd8c08c97c4298fcc015d1d7b12adc425b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 69dae55f084fc5d4206164d47e312d5bcbf530397190563126097fc3e0250760537ae1930b68228e18f7490e929e374af67663bb3ee8b6da99460dc718951bc6
|
|
7
|
+
data.tar.gz: 4c53b1c6a422c78f70885ac5db3a4951b8323b8ba9707771915cd4cbe933274d2697c467c2b75586ca9c77e2e5fd299cf8bdfdc5b011a39dc6efa2ab6288bb82
|
data/.rubocop.yml
CHANGED
data/.yardoc/checksums
CHANGED
|
@@ -3,12 +3,12 @@ lib/koyo/repl/log.rb 811d21aa6f8843589b66da79a96a4e8b755fcc2d
|
|
|
3
3
|
lib/koyo/repl/mod.rb 92b54b56643b06fdc74adc65dc04460f631d4036
|
|
4
4
|
lib/koyo/repl/data.rb cb847585c0f439b9f645b5ebd7fa3b96e08b94ff
|
|
5
5
|
lib/koyo/repl/install.rb 9b19b7bb74d084882a1f726693bac2d693015daa
|
|
6
|
-
lib/koyo/repl/railtie.rb
|
|
7
|
-
lib/koyo/repl/version.rb
|
|
8
|
-
lib/koyo/repl/data_row.rb
|
|
9
|
-
lib/koyo/repl/database.rb
|
|
10
|
-
lib/koyo/repl/diagnostics.rb
|
|
11
|
-
lib/koyo/repl/configuration.rb
|
|
12
|
-
lib/koyo/repl/postgres_server.rb
|
|
6
|
+
lib/koyo/repl/railtie.rb 9c560c38f4663edda57aa39c9bb4bd9411daabbd
|
|
7
|
+
lib/koyo/repl/version.rb d0d535b2aac27e3caa5eaeef69e117772e334f44
|
|
8
|
+
lib/koyo/repl/data_row.rb 46bd0b440721f3b0ddcded3fef1817ca5d77cb35
|
|
9
|
+
lib/koyo/repl/database.rb 719f2723b83a927e0524f6dea79393caaeba0514
|
|
10
|
+
lib/koyo/repl/diagnostics.rb 93226c47642c5e20f615425aff8a0c0ba988b07b
|
|
11
|
+
lib/koyo/repl/configuration.rb 8a32f819abf035340a3997d989ccafe0751d209e
|
|
12
|
+
lib/koyo/repl/postgres_server.rb 3d564dff9e7820962da02f8a383a607fb72110dc
|
|
13
13
|
lib/koyo_postgres_replication.rb e3f4d905e3045b59f1f7c799d84cd9fde70eebd8
|
|
14
14
|
lib/koyo/repl/event_handler_service.rb 99b67bdcf3e0e92a04cd01bf8d05a4569b45d218
|
data/.yardoc/object_types
CHANGED
|
Binary file
|
data/.yardoc/objects/root.dat
CHANGED
|
Binary file
|
data/.yardopts
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
koyo-postgres-replication (0.1.
|
|
4
|
+
koyo-postgres-replication (0.1.4.pre)
|
|
5
5
|
pg (~> 1.1)
|
|
6
6
|
rack (~> 2.0, >= 2.0.0)
|
|
7
7
|
rails (~> 7.0)
|
|
@@ -78,6 +78,8 @@ GEM
|
|
|
78
78
|
ast (2.4.2)
|
|
79
79
|
base64 (0.1.1)
|
|
80
80
|
builder (3.2.4)
|
|
81
|
+
composite_primary_keys (14.0.6)
|
|
82
|
+
activerecord (~> 7.0.2)
|
|
81
83
|
concurrent-ruby (1.2.2)
|
|
82
84
|
crass (1.0.6)
|
|
83
85
|
date (3.3.3)
|
|
@@ -215,6 +217,7 @@ PLATFORMS
|
|
|
215
217
|
arm64-darwin-22
|
|
216
218
|
|
|
217
219
|
DEPENDENCIES
|
|
220
|
+
composite_primary_keys (~> 14.0)
|
|
218
221
|
debug
|
|
219
222
|
factory_bot_rails
|
|
220
223
|
ffaker
|
data/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Koyo::Postgres::Replication
|
|
2
2
|
|
|
3
3
|
例 rei - Japanese for example
|
|
4
|
+
|
|
4
5
|
効用 koyo - Japanese for utility
|
|
5
6
|
|
|
6
7
|
## Replcation slots
|
|
@@ -36,9 +37,7 @@ wiki](https://github.com/wiseleyb/koyo-postgres-replication/wiki/Configuring-Pos
|
|
|
36
37
|
Add to Gemfile:
|
|
37
38
|
|
|
38
39
|
```
|
|
39
|
-
gem 'koyo-postgres-replication',
|
|
40
|
-
git: 'https://github.com/wiseleyb/koyo-postgres-replication',
|
|
41
|
-
require: 'koyo'
|
|
40
|
+
gem 'koyo-postgres-replication', require: 'koyo'
|
|
42
41
|
```
|
|
43
42
|
|
|
44
43
|
Then:
|
|
@@ -172,6 +171,9 @@ for sql examples on how to interact with replication slots.
|
|
|
172
171
|
|
|
173
172
|
## Yard Doc
|
|
174
173
|
|
|
174
|
+
Yard docs are up on
|
|
175
|
+
[RubyDoc.info](https://rubydoc.info/github/wiseleyb/koyo-postgres-replication/main)
|
|
176
|
+
|
|
175
177
|
Cheat sheets:
|
|
176
178
|
* https://gist.github.com/chetan/1827484
|
|
177
179
|
* https://kapeli.com/cheat_sheets/Yard.docset/Contents/Resources/Documents/index
|
data/changelog.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# Koyo Postgres Replication Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.4.pre
|
|
4
|
+
|
|
5
|
+
- Add link to
|
|
6
|
+
[doc](https://rubydoc.info/github/wiseleyb/koyo-postgres-replication/main) in
|
|
7
|
+
README
|
|
8
|
+
- Fix issues around composite keys (multiple primary keys) [Issues
|
|
9
|
+
4](https://github.com/wiseleyb/koyo-postgres-replication/issues/4)
|
|
10
|
+
|
|
11
|
+
## 0.1.3.pre
|
|
12
|
+
|
|
13
|
+
- republishing yanked gem
|
|
14
|
+
|
|
15
|
+
## 0.1.2.pre
|
|
16
|
+
|
|
17
|
+
- bump TargetRubyVersion for Rubocop to 3.2.2
|
|
18
|
+
- fix [Issue
|
|
19
|
+
2](https://github.com/wiseleyb/koyo-postgres-replication/issues/2) - gemspec
|
|
20
|
+
config around Yard doc
|
|
21
|
+
- Enter retry loop instead of crashing when db connection goes away
|
|
22
|
+
|
|
23
|
+
## 0.1.1.pre
|
|
24
|
+
|
|
25
|
+
- remove deprecated has_rdoc from gem spec
|
|
26
|
+
- fix [Issue 1](https://github.com/wiseleyb/koyo-postgres-replication/issues/1)
|
|
27
|
+
- remove recursive run, replace with simple loop
|
|
28
|
+
|
|
3
29
|
## 0.1.0.pre
|
|
4
30
|
|
|
5
31
|
- rails 7 plugin
|
|
@@ -12,7 +38,3 @@
|
|
|
12
38
|
- utility class for working with replication slots
|
|
13
39
|
- functional - but not tested in real life yet
|
|
14
40
|
|
|
15
|
-
## 0.1.1.pre
|
|
16
|
-
|
|
17
|
-
- remove deprecated has_rdoc from gem spec
|
|
18
|
-
- fix [Issue 1](https://github.com/wiseleyb/koyo-postgres-replication/issues/1) - remove recursive run, replace with simple loop
|
|
@@ -17,10 +17,13 @@ Gem::Specification.new do |spec|
|
|
|
17
17
|
|
|
18
18
|
spec.required_ruby_version = '>= 2.7.0'
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
spec.metadata = {
|
|
21
|
+
'bug_tracker_uri' => "#{url}/issues",
|
|
22
|
+
'changelog_uri' => "#{url}/blob/main/changelog.md",
|
|
23
|
+
'documentation' => 'https://www.rubydoc.info/github/wiseleyb/koyo-postgres-replication/main',
|
|
24
|
+
'homepage_uri' => spec.homepage,
|
|
25
|
+
'source_code_uri' => burl
|
|
26
|
+
}
|
|
24
27
|
|
|
25
28
|
spec.files = Dir.chdir(__dir__) do
|
|
26
29
|
`git ls-files -z`.split("\x0").reject do |f|
|
data/lib/koyo/repl/data_row.rb
CHANGED
|
@@ -11,8 +11,10 @@ module Koyo
|
|
|
11
11
|
:kind, # insert/update/delete
|
|
12
12
|
:schema, # always public for this - not needed
|
|
13
13
|
:table, # table being changed
|
|
14
|
-
:id, # table.id
|
|
15
|
-
:id_type, # integer/uuid
|
|
14
|
+
:id, # table.id, null for composite keys
|
|
15
|
+
:id_type, # integer/uuid, null for composite keys
|
|
16
|
+
:ids, # for composite keys - array of ids
|
|
17
|
+
:id_types, # for composite keys - array of types
|
|
16
18
|
:columns, # all columns from table - array
|
|
17
19
|
:column_types, # all types of columns - array
|
|
18
20
|
:values # all values from table - array
|
|
@@ -34,12 +36,12 @@ module Koyo
|
|
|
34
36
|
# WARN: this breaks for multiple primary keys
|
|
35
37
|
def check_set_primary_keys
|
|
36
38
|
if @row['oldkeys']
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
@ids = Array.new(@row['oldkeys']['keyvalues'])
|
|
40
|
+
@id_types = Array.new(@row['oldkeys']['keytypes'])
|
|
41
|
+
if @row['oldkeys']['keynames'].size == 1
|
|
42
|
+
@id = @ids.first
|
|
43
|
+
@id_type = @id_types.first
|
|
39
44
|
end
|
|
40
|
-
|
|
41
|
-
@id = @row['oldkeys']['keyvalues'].first
|
|
42
|
-
@id_type = @row['oldkeys']['keytypes'].first
|
|
43
45
|
else
|
|
44
46
|
@id = val(:id)
|
|
45
47
|
@id_type = type(:id)
|
|
@@ -49,13 +51,15 @@ module Koyo
|
|
|
49
51
|
# Gets a value for a name from columnsvalues
|
|
50
52
|
# @param name column name
|
|
51
53
|
def val(name)
|
|
52
|
-
|
|
54
|
+
idx = columns.index(name.to_s)
|
|
55
|
+
idx ? values[idx] : nil
|
|
53
56
|
end
|
|
54
57
|
|
|
55
58
|
# Get a val type from columntypes
|
|
56
59
|
# @param name column name
|
|
57
60
|
def type(name)
|
|
58
|
-
|
|
61
|
+
idx = columns.index(name.to_s)
|
|
62
|
+
idx ? column_types[idx] : nil
|
|
59
63
|
end
|
|
60
64
|
end
|
|
61
65
|
end
|
data/lib/koyo/repl/database.rb
CHANGED
|
@@ -19,6 +19,7 @@ module Koyo
|
|
|
19
19
|
conn_name = Koyo::Repl.config.database_name
|
|
20
20
|
|
|
21
21
|
unless conn_name
|
|
22
|
+
ActiveRecord::Base.establish_connection
|
|
22
23
|
@conn = ActiveRecord::Base.connection
|
|
23
24
|
return @conn
|
|
24
25
|
end
|
|
@@ -35,6 +36,14 @@ module Koyo
|
|
|
35
36
|
@conn
|
|
36
37
|
end
|
|
37
38
|
|
|
39
|
+
# Attempts to re-establish db connection
|
|
40
|
+
# This would be used when something happens like the postgres
|
|
41
|
+
# server restarts
|
|
42
|
+
def re_establish_conn
|
|
43
|
+
@conn = nil
|
|
44
|
+
conn
|
|
45
|
+
end
|
|
46
|
+
|
|
38
47
|
# Reads from the replication slot.
|
|
39
48
|
# Reading from this marks the rows read (so you won't see them again)
|
|
40
49
|
# For testing you can use `peek_slot` if you want to - which will keep
|
|
@@ -51,24 +51,69 @@ module Koyo
|
|
|
51
51
|
tick_tock
|
|
52
52
|
# Possibly fatal errors
|
|
53
53
|
rescue ActiveRecord::StatementInvalid => e
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
log_repl_fatal(msg, err: e)
|
|
58
|
-
break
|
|
59
|
-
else
|
|
60
|
-
log_recoverable_error(e)
|
|
61
|
-
end
|
|
62
|
-
# recoverable error
|
|
54
|
+
Koyo::Repl::EventHandlerService.koyo_error(e)
|
|
55
|
+
@retry = 0
|
|
56
|
+
break unless attempt_reconnect(e)
|
|
63
57
|
rescue StandardError => e
|
|
64
58
|
log_recoverable_error(e)
|
|
65
59
|
end
|
|
66
60
|
|
|
67
|
-
|
|
68
|
-
break unless success
|
|
61
|
+
break unless sleep_success?
|
|
69
62
|
end
|
|
70
63
|
end
|
|
71
64
|
|
|
65
|
+
# Does a single check of the replication slot
|
|
66
|
+
# If test_mode=true uses peek, which will
|
|
67
|
+
# leave data in the replication slot (for testing/debugging)
|
|
68
|
+
def check
|
|
69
|
+
read_sql_results.each do |sql_res|
|
|
70
|
+
rows = Koyo::Repl::Data.new(sql_res).rows # returns ReplDataRow
|
|
71
|
+
rows.each do |row|
|
|
72
|
+
check_row(row)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Attempts to re-establish DB connection. If it finds any other
|
|
78
|
+
# error this is fatal and server crashes at this point
|
|
79
|
+
# @param [StandardError] err Error that kicked off this retry loop
|
|
80
|
+
def attempt_reconnect(err)
|
|
81
|
+
@retry ||= 0
|
|
82
|
+
msg = "Error: Attempting to reconnect to DB. Retry: #{@retry}."
|
|
83
|
+
log_recoverable_error(err)
|
|
84
|
+
|
|
85
|
+
return false unless sleep_success?
|
|
86
|
+
|
|
87
|
+
Koyo::Repl::Database.re_establish_conn
|
|
88
|
+
msg = 'Re-established DB connection'
|
|
89
|
+
log_repl_info(msg)
|
|
90
|
+
true
|
|
91
|
+
rescue StandardError => e
|
|
92
|
+
unless bad_connection_error?(e)
|
|
93
|
+
msg = 'Fatal: Found erorr unrelated to PG::ConnectionBad while '\
|
|
94
|
+
"trying to reconnect: Error: #{e.message}"
|
|
95
|
+
log_repl_fatal(msg, err: e)
|
|
96
|
+
return false
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
@retry += 1
|
|
100
|
+
retry
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Test error to see if it's db:connection related
|
|
104
|
+
# Mostly here for specs
|
|
105
|
+
# @param [StandardError] err Error to check
|
|
106
|
+
def bad_connection_error?(err)
|
|
107
|
+
err.cause.exception.is_a?(PG::ConnectionBad)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Did sleep succeed... this fails when you do something like hit
|
|
111
|
+
# ctrl-c on the server
|
|
112
|
+
# Mostly here for specs
|
|
113
|
+
def sleep_success?
|
|
114
|
+
system("sleep #{Koyo::Repl.config.sql_delay}")
|
|
115
|
+
end
|
|
116
|
+
|
|
72
117
|
# Handles erros that aren't fatal. Calls back to
|
|
73
118
|
# Koyo::Repl::Log@log_repl_error which calls back
|
|
74
119
|
# to KoyoReplHandlerServer@log_repl_error
|
|
@@ -88,18 +133,6 @@ module Koyo
|
|
|
88
133
|
@tick_tock = 0
|
|
89
134
|
end
|
|
90
135
|
|
|
91
|
-
# Does a single check of the replication slot
|
|
92
|
-
# If test_mode=true uses peek, which will
|
|
93
|
-
# leave data in the replication slot (for testing/debugging)
|
|
94
|
-
def check
|
|
95
|
-
read_sql_results.each do |sql_res|
|
|
96
|
-
rows = Koyo::Repl::Data.new(sql_res).rows # returns ReplDataRow
|
|
97
|
-
rows.each do |row|
|
|
98
|
-
check_row(row)
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
136
|
# Reads data from the replication slot
|
|
104
137
|
# Handles test_mode (so will only peek if true)
|
|
105
138
|
def read_sql_results
|
data/lib/koyo/repl/railtie.rb
CHANGED
data/lib/koyo/repl/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: koyo-postgres-replication
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.4.pre
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ben Wiseley
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-08-
|
|
11
|
+
date: 2023-08-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: pg
|
|
@@ -115,6 +115,7 @@ files:
|
|
|
115
115
|
- ".yardoc/object_types"
|
|
116
116
|
- ".yardoc/objects/root.dat"
|
|
117
117
|
- ".yardoc/proxy_types"
|
|
118
|
+
- ".yardopts"
|
|
118
119
|
- Gemfile
|
|
119
120
|
- Gemfile.lock
|
|
120
121
|
- MIT-LICENSE
|
|
@@ -143,7 +144,9 @@ homepage: https://github.com/wiseleyb
|
|
|
143
144
|
licenses:
|
|
144
145
|
- MIT
|
|
145
146
|
metadata:
|
|
146
|
-
|
|
147
|
+
bug_tracker_uri: https://github.com/wiseleyb/koyo-postgres-replication/issues
|
|
148
|
+
changelog_uri: https://github.com/wiseleyb/koyo-postgres-replication/blob/main/changelog.md
|
|
149
|
+
documentation: https://www.rubydoc.info/github/wiseleyb/koyo-postgres-replication/main
|
|
147
150
|
homepage_uri: https://github.com/wiseleyb
|
|
148
151
|
source_code_uri: https://github.com/wiseleyb
|
|
149
152
|
post_install_message:
|