Commit d65c359
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 f819f7d commit d65c359
29 files changed
Lines changed: 3904 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 | | |
| |||
3152 | 3157 | | |
3153 | 3158 | | |
3154 | 3159 | | |
3155 | | - | |
| 3160 | + | |
| 3161 | + | |
| 3162 | + | |
| 3163 | + | |
| 3164 | + | |
| 3165 | + | |
| 3166 | + | |
| 3167 | + | |
| 3168 | + | |
| 3169 | + | |
| 3170 | + | |
| 3171 | + | |
| 3172 | + | |
| 3173 | + | |
| 3174 | + | |
3156 | 3175 | | |
3157 | 3176 | | |
3158 | 3177 | | |
| 3178 | + | |
3159 | 3179 | | |
3160 | 3180 | | |
3161 | | - | |
3162 | | - | |
| 3181 | + | |
| 3182 | + | |
| 3183 | + | |
| 3184 | + | |
| 3185 | + | |
| 3186 | + | |
| 3187 | + | |
| 3188 | + | |
| 3189 | + | |
| 3190 | + | |
| 3191 | + | |
3163 | 3192 | | |
3164 | 3193 | | |
3165 | 3194 | | |
| |||
3181 | 3210 | | |
3182 | 3211 | | |
3183 | 3212 | | |
3184 | | - | |
| 3213 | + | |
| 3214 | + | |
| 3215 | + | |
| 3216 | + | |
| 3217 | + | |
| 3218 | + | |
| 3219 | + | |
| 3220 | + | |
| 3221 | + | |
| 3222 | + | |
| 3223 | + | |
| 3224 | + | |
| 3225 | + | |
| 3226 | + | |
| 3227 | + | |
3185 | 3228 | | |
3186 | 3229 | | |
3187 | 3230 | | |
| 3231 | + | |
3188 | 3232 | | |
3189 | 3233 | | |
3190 | | - | |
3191 | | - | |
| 3234 | + | |
| 3235 | + | |
| 3236 | + | |
| 3237 | + | |
| 3238 | + | |
| 3239 | + | |
| 3240 | + | |
| 3241 | + | |
| 3242 | + | |
| 3243 | + | |
| 3244 | + | |
3192 | 3245 | | |
3193 | 3246 | | |
3194 | 3247 | | |
| |||
3523 | 3576 | | |
3524 | 3577 | | |
3525 | 3578 | | |
| 3579 | + | |
3526 | 3580 | | |
3527 | 3581 | | |
3528 | 3582 | | |
| |||
3563 | 3617 | | |
3564 | 3618 | | |
3565 | 3619 | | |
| 3620 | + | |
3566 | 3621 | | |
3567 | 3622 | | |
3568 | 3623 | | |
| |||
3975 | 4030 | | |
3976 | 4031 | | |
3977 | 4032 | | |
| 4033 | + | |
3978 | 4034 | | |
3979 | 4035 | | |
3980 | 4036 | | |
| |||
4019 | 4075 | | |
4020 | 4076 | | |
4021 | 4077 | | |
| 4078 | + | |
| 4079 | + | |
| 4080 | + | |
| 4081 | + | |
| 4082 | + | |
4022 | 4083 | | |
4023 | 4084 | | |
4024 | 4085 | | |
| |||
4475 | 4536 | | |
4476 | 4537 | | |
4477 | 4538 | | |
| 4539 | + | |
4478 | 4540 | | |
4479 | 4541 | | |
4480 | 4542 | | |
| |||
5029 | 5091 | | |
5030 | 5092 | | |
5031 | 5093 | | |
| 5094 | + | |
5032 | 5095 | | |
5033 | 5096 | | |
5034 | 5097 | | |
| |||
5227 | 5290 | | |
5228 | 5291 | | |
5229 | 5292 | | |
| 5293 | + | |
5230 | 5294 | | |
5231 | 5295 | | |
5232 | 5296 | | |
| |||
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 | | |
| |||
5387 | 5454 | | |
5388 | 5455 | | |
5389 | 5456 | | |
| 5457 | + | |
5390 | 5458 | | |
5391 | 5459 | | |
5392 | 5460 | | |
| |||
5561 | 5629 | | |
5562 | 5630 | | |
5563 | 5631 | | |
| 5632 | + | |
5564 | 5633 | | |
5565 | 5634 | | |
5566 | 5635 | | |
| |||
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 | | |
| |||
Lines changed: 3 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
| 88 | + | |
88 | 89 | | |
89 | 90 | | |
90 | 91 | | |
| |||
104 | 105 | | |
105 | 106 | | |
106 | 107 | | |
| 108 | + | |
107 | 109 | | |
108 | 110 | | |
109 | 111 | | |
| |||
324 | 326 | | |
325 | 327 | | |
326 | 328 | | |
| 329 | + | |
327 | 330 | | |
328 | 331 | | |
329 | 332 | | |
| |||
0 commit comments