Commit afdf64f
committed
feat(persistence): implement optimistic concurrency control with CAS
Add resource_version-based optimistic concurrency control to the
persistence layer. Every write now requires an explicit WriteCondition
(MustCreate or MatchResourceVersion), enforced at compile time by
gating unconditional put/put_message behind #[cfg(test)].
- Add WriteCondition enum and put_if for conditional writes
- Add update_message_cas for atomic read-modify-write operations
- Add list_messages/list_messages_with_selector helpers that hydrate
resource_version from authoritative DB rows
- Convert all production write paths to CAS-aware methods
- Gate put/put_message behind #[cfg(test)] to prevent non-CAS writes
- Use structured PersistenceError::UniqueViolation matching instead of
string matching for duplicate detection
- Hydrate resource_version from WriteResult directly on creates,
eliminating unnecessary read-after-write round trips
Signed-off-by: Derek Carr <decarr@redhat.com>1 parent b4c7bc4 commit afdf64f
29 files changed
Lines changed: 3905 additions & 395 deletions
File tree
- architecture
- crates
- openshell-cli
- src
- tests
- openshell-core/src
- openshell-sandbox/src
- openshell-server
- migrations
- postgres
- sqlite
- src
- compute
- grpc
- persistence
- openshell-tui/src
- proto
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
83 | 83 | | |
84 | 84 | | |
85 | 85 | | |
| 86 | + | |
86 | 87 | | |
87 | 88 | | |
88 | 89 | | |
| |||
113 | 114 | | |
114 | 115 | | |
115 | 116 | | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
116 | 203 | | |
117 | 204 | | |
118 | 205 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2389 | 2389 | | |
2390 | 2390 | | |
2391 | 2391 | | |
| 2392 | + | |
| 2393 | + | |
| 2394 | + | |
| 2395 | + | |
| 2396 | + | |
2392 | 2397 | | |
2393 | 2398 | | |
2394 | 2399 | | |
| |||
3154 | 3159 | | |
3155 | 3160 | | |
3156 | 3161 | | |
| 3162 | + | |
3157 | 3163 | | |
3158 | 3164 | | |
3159 | 3165 | | |
| |||
3186 | 3192 | | |
3187 | 3193 | | |
3188 | 3194 | | |
3189 | | - | |
| 3195 | + | |
| 3196 | + | |
| 3197 | + | |
| 3198 | + | |
| 3199 | + | |
| 3200 | + | |
| 3201 | + | |
| 3202 | + | |
| 3203 | + | |
| 3204 | + | |
| 3205 | + | |
| 3206 | + | |
| 3207 | + | |
| 3208 | + | |
| 3209 | + | |
3190 | 3210 | | |
3191 | 3211 | | |
3192 | 3212 | | |
| 3213 | + | |
3193 | 3214 | | |
3194 | 3215 | | |
3195 | | - | |
3196 | | - | |
| 3216 | + | |
| 3217 | + | |
| 3218 | + | |
| 3219 | + | |
| 3220 | + | |
| 3221 | + | |
| 3222 | + | |
| 3223 | + | |
| 3224 | + | |
| 3225 | + | |
| 3226 | + | |
3197 | 3227 | | |
3198 | 3228 | | |
3199 | 3229 | | |
| |||
3215 | 3245 | | |
3216 | 3246 | | |
3217 | 3247 | | |
3218 | | - | |
| 3248 | + | |
| 3249 | + | |
| 3250 | + | |
| 3251 | + | |
| 3252 | + | |
| 3253 | + | |
| 3254 | + | |
| 3255 | + | |
| 3256 | + | |
| 3257 | + | |
| 3258 | + | |
| 3259 | + | |
| 3260 | + | |
| 3261 | + | |
| 3262 | + | |
3219 | 3263 | | |
3220 | 3264 | | |
3221 | 3265 | | |
| 3266 | + | |
3222 | 3267 | | |
3223 | 3268 | | |
3224 | | - | |
3225 | | - | |
| 3269 | + | |
| 3270 | + | |
| 3271 | + | |
| 3272 | + | |
| 3273 | + | |
| 3274 | + | |
| 3275 | + | |
| 3276 | + | |
| 3277 | + | |
| 3278 | + | |
| 3279 | + | |
3226 | 3280 | | |
3227 | 3281 | | |
3228 | 3282 | | |
| |||
3557 | 3611 | | |
3558 | 3612 | | |
3559 | 3613 | | |
| 3614 | + | |
3560 | 3615 | | |
3561 | 3616 | | |
3562 | 3617 | | |
| |||
3597 | 3652 | | |
3598 | 3653 | | |
3599 | 3654 | | |
| 3655 | + | |
3600 | 3656 | | |
3601 | 3657 | | |
3602 | 3658 | | |
| |||
4009 | 4065 | | |
4010 | 4066 | | |
4011 | 4067 | | |
| 4068 | + | |
4012 | 4069 | | |
4013 | 4070 | | |
4014 | 4071 | | |
| |||
4053 | 4110 | | |
4054 | 4111 | | |
4055 | 4112 | | |
| 4113 | + | |
| 4114 | + | |
| 4115 | + | |
| 4116 | + | |
| 4117 | + | |
4056 | 4118 | | |
4057 | 4119 | | |
4058 | 4120 | | |
| |||
4509 | 4571 | | |
4510 | 4572 | | |
4511 | 4573 | | |
| 4574 | + | |
4512 | 4575 | | |
4513 | 4576 | | |
4514 | 4577 | | |
| |||
5063 | 5126 | | |
5064 | 5127 | | |
5065 | 5128 | | |
| 5129 | + | |
5066 | 5130 | | |
5067 | 5131 | | |
5068 | 5132 | | |
| |||
5261 | 5325 | | |
5262 | 5326 | | |
5263 | 5327 | | |
| 5328 | + | |
5264 | 5329 | | |
5265 | 5330 | | |
5266 | 5331 | | |
| |||
5295 | 5360 | | |
5296 | 5361 | | |
5297 | 5362 | | |
| 5363 | + | |
5298 | 5364 | | |
5299 | 5365 | | |
5300 | 5366 | | |
| |||
5329 | 5395 | | |
5330 | 5396 | | |
5331 | 5397 | | |
| 5398 | + | |
5332 | 5399 | | |
5333 | 5400 | | |
5334 | 5401 | | |
| |||
5363 | 5430 | | |
5364 | 5431 | | |
5365 | 5432 | | |
| 5433 | + | |
5366 | 5434 | | |
5367 | 5435 | | |
5368 | 5436 | | |
| |||
5421 | 5489 | | |
5422 | 5490 | | |
5423 | 5491 | | |
| 5492 | + | |
5424 | 5493 | | |
5425 | 5494 | | |
5426 | 5495 | | |
| |||
5595 | 5664 | | |
5596 | 5665 | | |
5597 | 5666 | | |
| 5667 | + | |
5598 | 5668 | | |
5599 | 5669 | | |
5600 | 5670 | | |
| |||
Lines changed: 2 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
62 | 62 | | |
63 | 63 | | |
64 | 64 | | |
| 65 | + | |
65 | 66 | | |
66 | 67 | | |
67 | 68 | | |
| |||
326 | 327 | | |
327 | 328 | | |
328 | 329 | | |
| 330 | + | |
329 | 331 | | |
330 | 332 | | |
331 | 333 | | |
| |||
Lines changed: 22 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
| 23 | + | |
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| |||
83 | 83 | | |
84 | 84 | | |
85 | 85 | | |
86 | | - | |
| 86 | + | |
87 | 87 | | |
88 | | - | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
89 | 105 | | |
90 | 106 | | |
91 | 107 | | |
| |||
155 | 171 | | |
156 | 172 | | |
157 | 173 | | |
158 | | - | |
| 174 | + | |
159 | 175 | | |
160 | 176 | | |
161 | 177 | | |
| |||
192 | 208 | | |
193 | 209 | | |
194 | 210 | | |
195 | | - | |
| 211 | + | |
196 | 212 | | |
197 | 213 | | |
198 | 214 | | |
| |||
447 | 463 | | |
448 | 464 | | |
449 | 465 | | |
| 466 | + | |
450 | 467 | | |
451 | 468 | | |
452 | 469 | | |
| |||
0 commit comments