Skip to content

refactor: use BackendPid instead of BackendKeyData where secret is not required#1025

Draft
meskill wants to merge 3 commits into
mainfrom
refactor/backend_key_data
Draft

refactor: use BackendPid instead of BackendKeyData where secret is not required#1025
meskill wants to merge 3 commits into
mainfrom
refactor/backend_key_data

Conversation

@meskill
Copy link
Copy Markdown
Contributor

@meskill meskill commented May 29, 2026

Refactor the codebase by using BackendKeyData (contains a connection secret) only where the secret is required, while all other places will use BackendPid (wrapper around u32) to refer the connection or store it. The BackendKeyData becomes complex type without copy and hash and it should be cloned where needed instead and it makes visible the non-free operation of 256 bytes array copying.

The performance benefits are not huge and I had to tweak the pgbench configuration with options -t 10000 -c 100 to see the difference around the commit #2f70a7a70cc8eceefe577f994e89b5e943e0724d that added the support for the extended secret.

Benchmark comparisions

commit before protocol change (1213bccd)

3.0

progress: 1.0 s, 64284.8 tps, lat 1.077 ms stddev 1.546, 0 failed
progress: 2.0 s, 103382.5 tps, lat 0.963 ms stddev 0.384, 0 failed
progress: 3.0 s, 109524.8 tps, lat 0.910 ms stddev 0.354, 0 failed
progress: 4.0 s, 104265.4 tps, lat 0.956 ms stddev 0.426, 0 failed
progress: 5.0 s, 105109.7 tps, lat 0.948 ms stddev 0.686, 0 failed
progress: 6.0 s, 106551.5 tps, lat 0.936 ms stddev 0.408, 0 failed
progress: 7.0 s, 107288.2 tps, lat 0.928 ms stddev 0.458, 0 failed
progress: 8.0 s, 105747.3 tps, lat 0.943 ms stddev 0.379, 0 failed
progress: 9.0 s, 109564.1 tps, lat 0.910 ms stddev 0.352, 0 failed
transaction type: <builtin: select only>
scaling factor: 1
query mode: extended
number of clients: 100
number of threads: 1
maximum number of tries: 1
number of transactions per client: 10000
number of transactions actually processed: 1000000/1000000
number of failed transactions: 0 (0.000%)
latency average = 0.944 ms
latency stddev = 0.579 ms
initial connection time = 304.888 ms
tps = 105265.939132 (without initial connection time)

commit with protocol change (2f70a7a7)

3.0

progress: 1.0 s, 58272.9 tps, lat 1.170 ms stddev 1.127, 0 failed
progress: 2.0 s, 94177.8 tps, lat 1.058 ms stddev 0.427, 0 failed
progress: 3.0 s, 97705.7 tps, lat 1.021 ms stddev 0.428, 0 failed
progress: 4.0 s, 95059.2 tps, lat 1.049 ms stddev 0.451, 0 failed
progress: 5.0 s, 95471.2 tps, lat 1.045 ms stddev 0.423, 0 failed
progress: 6.0 s, 96092.2 tps, lat 1.038 ms stddev 0.431, 0 failed
progress: 7.0 s, 94516.8 tps, lat 1.055 ms stddev 0.454, 0 failed
progress: 8.0 s, 94852.2 tps, lat 1.052 ms stddev 0.466, 0 failed
progress: 9.0 s, 93997.7 tps, lat 1.061 ms stddev 0.440, 0 failed
progress: 10.0 s, 94333.2 tps, lat 1.057 ms stddev 0.427, 0 failed
transaction type: <builtin: select only>
scaling factor: 1
query mode: extended
number of clients: 100
number of threads: 1
maximum number of tries: 1
number of transactions per client: 10000
number of transactions actually processed: 1000000/1000000
number of failed transactions: 0 (0.000%)
latency average = 1.054 ms
latency stddev = 0.509 ms
initial connection time = 315.652 ms
tps = 94268.307777 (without initial connection time)

3.2

progress: 1.0 s, 63850.8 tps, lat 1.096 ms stddev 0.569, 0 failed
progress: 2.0 s, 93276.9 tps, lat 1.069 ms stddev 0.442, 0 failed
progress: 3.0 s, 94956.4 tps, lat 1.051 ms stddev 0.442, 0 failed
progress: 4.0 s, 92639.9 tps, lat 1.077 ms stddev 0.447, 0 failed
progress: 5.0 s, 95421.7 tps, lat 1.045 ms stddev 0.437, 0 failed
progress: 6.0 s, 95773.4 tps, lat 1.042 ms stddev 0.410, 0 failed
progress: 7.0 s, 94532.0 tps, lat 1.055 ms stddev 0.407, 0 failed
progress: 8.0 s, 91373.8 tps, lat 1.091 ms stddev 0.498, 0 failed
progress: 9.0 s, 97471.6 tps, lat 1.024 ms stddev 0.442, 0 failed
progress: 10.0 s, 96465.4 tps, lat 1.034 ms stddev 0.408, 0 failed
transaction type: <builtin: select only>
scaling factor: 1
query mode: extended
number of clients: 100
number of threads: 1
maximum number of tries: 1
number of transactions per client: 10000
number of transactions actually processed: 1000000/1000000
number of failed transactions: 0 (0.000%)
latency average = 1.058 ms
latency stddev = 0.451 ms
initial connection time = 297.277 ms
tps = 94053.071327 (without initial connection time)

commit on main

3.0

progress: 1.0 s, 63412.7 tps, lat 1.182 ms stddev 1.107, 0 failed
progress: 2.0 s, 95552.5 tps, lat 1.043 ms stddev 0.432, 0 failed
progress: 3.0 s, 95806.5 tps, lat 1.042 ms stddev 0.409, 0 failed
progress: 4.0 s, 89794.0 tps, lat 1.111 ms stddev 0.474, 0 failed
progress: 5.0 s, 96405.1 tps, lat 1.035 ms stddev 0.430, 0 failed
progress: 6.0 s, 95296.9 tps, lat 1.047 ms stddev 0.462, 0 failed
progress: 7.0 s, 90622.2 tps, lat 1.101 ms stddev 0.477, 0 failed
progress: 8.0 s, 95969.6 tps, lat 1.039 ms stddev 0.421, 0 failed
progress: 9.0 s, 98236.7 tps, lat 1.016 ms stddev 0.403, 0 failed
progress: 10.0 s, 91498.0 tps, lat 1.090 ms stddev 0.505, 0 failed
transaction type: <builtin: select only>
scaling factor: 1
query mode: extended
number of clients: 100
number of threads: 1
maximum number of tries: 1
number of transactions per client: 10000
number of transactions actually processed: 1000000/1000000
number of failed transactions: 0 (0.000%)
latency average = 1.062 ms
latency stddev = 0.515 ms
initial connection time = 247.252 ms
tps = 93552.326857 (without initial connection time)

3.2

progress: 1.0 s, 74672.9 tps, lat 1.046 ms stddev 0.450, 0 failed
progress: 2.0 s, 92049.0 tps, lat 1.083 ms stddev 0.483, 0 failed
progress: 3.0 s, 94283.1 tps, lat 1.058 ms stddev 0.479, 0 failed
progress: 4.0 s, 97674.7 tps, lat 1.022 ms stddev 0.411, 0 failed
progress: 5.0 s, 94013.9 tps, lat 1.061 ms stddev 0.458, 0 failed
progress: 6.0 s, 97004.8 tps, lat 1.028 ms stddev 0.434, 0 failed
progress: 7.0 s, 94271.1 tps, lat 1.059 ms stddev 0.438, 0 failed
progress: 8.0 s, 92420.1 tps, lat 1.079 ms stddev 0.473, 0 failed
progress: 9.0 s, 96882.3 tps, lat 1.030 ms stddev 0.455, 0 failed
progress: 10.0 s, 95606.0 tps, lat 1.044 ms stddev 0.467, 0 failed
transaction type: <builtin: select only>
scaling factor: 1
query mode: extended
number of clients: 100
number of threads: 1
maximum number of tries: 1
number of transactions per client: 10000
number of transactions actually processed: 1000000/1000000
number of failed transactions: 0 (0.000%)
latency average = 1.051 ms
latency stddev = 0.452 ms
initial connection time = 214.759 ms
tps = 94557.837152 (without initial connection time)

refactor

3.0

progress: 1.0 s, 70670.2 tps, lat 1.048 ms stddev 1.346, 0 failed
progress: 2.0 s, 107099.5 tps, lat 0.930 ms stddev 0.382, 0 failed
progress: 3.0 s, 107923.4 tps, lat 0.924 ms stddev 0.388, 0 failed
progress: 4.0 s, 103806.0 tps, lat 0.960 ms stddev 0.444, 0 failed
progress: 5.0 s, 107500.9 tps, lat 0.927 ms stddev 0.349, 0 failed
progress: 6.0 s, 110055.2 tps, lat 0.906 ms stddev 0.377, 0 failed
progress: 7.0 s, 101593.1 tps, lat 0.981 ms stddev 0.424, 0 failed
progress: 8.0 s, 108966.8 tps, lat 0.915 ms stddev 0.358, 0 failed
progress: 9.0 s, 109519.1 tps, lat 0.911 ms stddev 0.411, 0 failed
transaction type: <builtin: select only>
scaling factor: 1
query mode: extended
number of clients: 100
number of threads: 1
maximum number of tries: 1
number of transactions per client: 10000
number of transactions actually processed: 1000000/1000000
number of failed transactions: 0 (0.000%)
latency average = 0.941 ms
latency stddev = 0.527 ms
initial connection time = 256.664 ms
tps = 105492.454072 (without initial connection time)

3.2

progress: 1.0 s, 85192.0 tps, lat 0.922 ms stddev 0.411, 0 failed
progress: 2.0 s, 107580.1 tps, lat 0.926 ms stddev 0.390, 0 failed
progress: 3.0 s, 103631.8 tps, lat 0.962 ms stddev 0.414, 0 failed
progress: 4.0 s, 108258.3 tps, lat 0.921 ms stddev 0.412, 0 failed
progress: 5.0 s, 106677.5 tps, lat 0.934 ms stddev 0.350, 0 failed
progress: 6.0 s, 105955.7 tps, lat 0.941 ms stddev 0.420, 0 failed
progress: 7.0 s, 103849.4 tps, lat 0.960 ms stddev 0.396, 0 failed
progress: 8.0 s, 109807.7 tps, lat 0.908 ms stddev 0.387, 0 failed
progress: 9.0 s, 105221.1 tps, lat 0.947 ms stddev 0.427, 0 failed
transaction type: <builtin: select only>
scaling factor: 1
query mode: extended
number of clients: 100
number of threads: 1
maximum number of tries: 1
number of transactions per client: 10000
number of transactions actually processed: 1000000/1000000
number of failed transactions: 0 (0.000%)
latency average = 0.934 ms
latency stddev = 0.402 ms
initial connection time = 210.913 ms
tps = 106376.709288 (without initial connection time)

refactor taken.rs

3.0

progress: 1.0 s, 73139.4 tps, lat 1.026 ms stddev 1.544, 0 failed
progress: 2.0 s, 106600.8 tps, lat 0.935 ms stddev 0.380, 0 failed
progress: 3.0 s, 107713.6 tps, lat 0.925 ms stddev 0.406, 0 failed
progress: 4.0 s, 105902.3 tps, lat 0.941 ms stddev 0.394, 0 failed
progress: 5.0 s, 110257.9 tps, lat 0.905 ms stddev 0.361, 0 failed
progress: 6.0 s, 104843.7 tps, lat 0.950 ms stddev 0.438, 0 failed
progress: 7.0 s, 110620.3 tps, lat 0.901 ms stddev 0.372, 0 failed
progress: 8.0 s, 109629.6 tps, lat 0.909 ms stddev 0.395, 0 failed
progress: 9.0 s, 108185.1 tps, lat 0.922 ms stddev 0.402, 0 failed
transaction type: <builtin: select only>
scaling factor: 1
query mode: extended
number of clients: 100
number of threads: 1
maximum number of tries: 1
number of transactions per client: 10000
number of transactions actually processed: 1000000/1000000
number of failed transactions: 0 (0.000%)
latency average = 0.931 ms
latency stddev = 0.568 ms
initial connection time = 246.663 ms
tps = 106630.076911 (without initial connection time)

3.2

progress: 1.0 s, 78327.4 tps, lat 0.989 ms stddev 0.422, 0 failed
progress: 2.0 s, 111089.4 tps, lat 0.897 ms stddev 0.368, 0 failed
progress: 3.0 s, 110143.4 tps, lat 0.905 ms stddev 0.384, 0 failed
progress: 4.0 s, 104486.5 tps, lat 0.954 ms stddev 0.431, 0 failed
progress: 5.0 s, 111117.3 tps, lat 0.897 ms stddev 0.370, 0 failed
progress: 6.0 s, 110026.7 tps, lat 0.906 ms stddev 0.427, 0 failed
progress: 7.0 s, 106161.7 tps, lat 0.939 ms stddev 0.424, 0 failed
progress: 8.0 s, 109794.5 tps, lat 0.908 ms stddev 0.333, 0 failed
progress: 9.0 s, 107956.2 tps, lat 0.923 ms stddev 0.391, 0 failed
transaction type: <builtin: select only>
scaling factor: 1
query mode: extended
number of clients: 100
number of threads: 1
maximum number of tries: 1
number of transactions per client: 10000
number of transactions actually processed: 1000000/1000000
number of failed transactions: 0 (0.000%)
latency average = 0.924 ms
latency stddev = 0.398 ms
initial connection time = 221.501 ms
tps = 107541.255245 (without initial connection time)

use small vec

3.0

progress: 1.0 s, 75604.0 tps, lat 0.992 ms stddev 0.829, 0 failed
progress: 2.0 s, 105667.3 tps, lat 0.943 ms stddev 0.397, 0 failed
progress: 3.0 s, 109196.7 tps, lat 0.913 ms stddev 0.390, 0 failed
progress: 4.0 s, 105584.7 tps, lat 0.944 ms stddev 0.370, 0 failed
progress: 5.0 s, 106206.0 tps, lat 0.939 ms stddev 0.441, 0 failed
progress: 6.0 s, 108435.9 tps, lat 0.919 ms stddev 0.386, 0 failed
progress: 7.0 s, 107940.5 tps, lat 0.924 ms stddev 0.434, 0 failed
progress: 8.0 s, 104209.7 tps, lat 0.957 ms stddev 0.413, 0 failed
progress: 9.0 s, 108662.8 tps, lat 0.917 ms stddev 0.385, 0 failed
transaction type: <builtin: select only>
scaling factor: 1
query mode: extended
number of clients: 100
number of threads: 1
maximum number of tries: 1
number of transactions per client: 10000
number of transactions actually processed: 1000000/1000000
number of failed transactions: 0 (0.000%)
latency average = 0.935 ms
latency stddev = 0.451 ms
initial connection time = 245.926 ms
tps = 106242.580284 (without initial connection time)

3.2

progress: 1.0 s, 80461.8 tps, lat 0.971 ms stddev 0.388, 0 failed
progress: 2.0 s, 107152.2 tps, lat 0.930 ms stddev 0.441, 0 failed
progress: 3.0 s, 103553.7 tps, lat 0.963 ms stddev 0.430, 0 failed
progress: 4.0 s, 113189.0 tps, lat 0.881 ms stddev 0.372, 0 failed
progress: 5.0 s, 108662.4 tps, lat 0.918 ms stddev 0.412, 0 failed
progress: 6.0 s, 104669.5 tps, lat 0.952 ms stddev 0.423, 0 failed
progress: 7.0 s, 106442.4 tps, lat 0.937 ms stddev 0.398, 0 failed
progress: 8.0 s, 106510.3 tps, lat 0.936 ms stddev 0.390, 0 failed
progress: 9.0 s, 102740.4 tps, lat 0.970 ms stddev 0.451, 0 failed
transaction type: <builtin: select only>
scaling factor: 1
query mode: extended
number of clients: 100
number of threads: 1
maximum number of tries: 1
number of transactions per client: 10000
number of transactions actually processed: 1000000/1000000
number of failed transactions: 0 (0.000%)
latency average = 0.936 ms
latency stddev = 0.409 ms
initial connection time = 215.410 ms
tps = 106187.514621 (without initial connection time)

The performance difference is there. Integration test for cancellation has been added and some around refactoring have done.

@meskill meskill marked this pull request as draft May 29, 2026 22:58
@meskill meskill force-pushed the refactor/backend_key_data branch from a12f655 to 6e8a433 Compare May 29, 2026 23:00
copy_out: usize,
copy_data: usize,
first_backend_data: Option<BackendKeyData>,
first_backend_data: Option<BackendPid>,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is extremely unlikely, but the backend PIDs could collide (same PID, different servers). The secret kinda makes sure that cannot practically happen.

@meskill meskill force-pushed the refactor/backend_key_data branch from 6e8a433 to c7711f7 Compare May 29, 2026 23:17
@blacksmith-sh
Copy link
Copy Markdown
Contributor

blacksmith-sh Bot commented May 29, 2026

Found 1 test failure on Blacksmith runners:

Failure

Test View Logs
prepared_spec/
prepared_statements = disabled fails named extended-protocol statements in transaction
pool mode
View Logs

Fix in Cursor

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants