Commit ce543fb
authored
serviceability: make CreateUser naked and idempotent (#4116)
Resolves #4110. Part 2 of #4108.
## Summary
The #4111 connect flow needs `CreateUser` to mean "make sure my user
exists": create it bare, poll to `Activated`, then join feeds with one
`SubscribeFeed`. Today it can't: under an EdgeSeat pass a multicast
create fails with `FeedAccountRequired` unless it names a feed and
group, and a re-run fails with `AccountAlreadyInitialized`, so `connect`
can neither create a user that holds nothing nor call create
unconditionally and retry.
- The feed gate moved out of `create_user_core` into
`CreateSubscribeUser`, its only real caller. A new user starts with no
groups, no feeds, and no seat charged; seats are charged by
`SubscribeFeed`. Bare multicast users at zero seat cost (bounded by
`device.max_users`) are deliberate: they receive nothing.
- Re-running `CreateUser` for an existing user matching the requested
owner, device, user type, and tenant succeeds without changing state. A
mismatch still fails with `AccountAlreadyInitialized`; a banned user
fails with `InvalidStatus` so connect fails fast instead of polling
forever. Owner is checked because the user PDA carries no owner in its
seeds; without it a second buyer with a pass at the same client IP would
get success for an account they do not own.
- The exists check sits after the pass identity checks and before every
counter bump; the tenant, epoch, device-status, and capacity gates stay
below it so a retry survives an epoch rollover or a device that filled
up.
- `CreateSubscribeUser` is unchanged: a duplicate still errors and the
gate still applies.
## Testing Verification
- Re-run asserts full-struct equality on User, Device, and AccessPass,
so any counter bump fails it; a re-run against a device shrunk to
`max_users = 1` still succeeds.
- Rejections: different device, different tenant, different owner
(second buyer, same client IP), and banned user all fail and leave the
user untouched; a duplicate `CreateSubscribeUser` errors and ticks no
seat.
- `test_naked_create_then_subscribe_feed`: a bare user is admitted on an
EdgeSeat pass with no seat, then one `SubscribeFeed` joins the feed and
charges it.
- `feed_metro_gate_test` and `create_subscribe_user_test` cover the gate
on the `CreateSubscribeUser` path after the move.1 parent caa85b0 commit ce543fb
12 files changed
Lines changed: 888 additions & 90 deletions
File tree
- controlplane/controller/internal/controller
- fixtures
- templates
- smartcontract/programs/doublezero-serviceability
- src
- processors/user
- state
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
| 12 | + | |
11 | 13 | | |
12 | 14 | | |
| 15 | + | |
13 | 16 | | |
14 | 17 | | |
15 | 18 | | |
| |||
Lines changed: 47 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
79 | 79 | | |
80 | 80 | | |
81 | 81 | | |
| 82 | + | |
82 | 83 | | |
83 | 84 | | |
84 | 85 | | |
| |||
126 | 127 | | |
127 | 128 | | |
128 | 129 | | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
129 | 145 | | |
130 | 146 | | |
131 | 147 | | |
| |||
157 | 173 | | |
158 | 174 | | |
159 | 175 | | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
160 | 185 | | |
161 | 186 | | |
162 | 187 | | |
163 | 188 | | |
| 189 | + | |
164 | 190 | | |
165 | 191 | | |
166 | 192 | | |
| |||
203 | 229 | | |
204 | 230 | | |
205 | 231 | | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
206 | 238 | | |
207 | 239 | | |
208 | 240 | | |
| |||
221 | 253 | | |
222 | 254 | | |
223 | 255 | | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
224 | 262 | | |
225 | 263 | | |
226 | 264 | | |
| |||
230 | 268 | | |
231 | 269 | | |
232 | 270 | | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
233 | 274 | | |
234 | 275 | | |
235 | 276 | | |
| 277 | + | |
236 | 278 | | |
237 | 279 | | |
238 | 280 | | |
| |||
254 | 296 | | |
255 | 297 | | |
256 | 298 | | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
257 | 304 | | |
258 | 305 | | |
259 | 306 | | |
| |||
Lines changed: 15 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
378 | 378 | | |
379 | 379 | | |
380 | 380 | | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
381 | 396 | | |
382 | 397 | | |
383 | 398 | | |
| |||
Lines changed: 15 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
219 | 219 | | |
220 | 220 | | |
221 | 221 | | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
222 | 237 | | |
223 | 238 | | |
224 | 239 | | |
| |||
Lines changed: 6 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
171 | 171 | | |
172 | 172 | | |
173 | 173 | | |
174 | | - | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
175 | 177 | | |
176 | 178 | | |
177 | 179 | | |
| |||
404 | 406 | | |
405 | 407 | | |
406 | 408 | | |
407 | | - | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
408 | 412 | | |
409 | 413 | | |
410 | 414 | | |
| |||
Lines changed: 6 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
106 | 106 | | |
107 | 107 | | |
108 | 108 | | |
109 | | - | |
| 109 | + | |
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
| |||
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
119 | | - | |
120 | | - | |
121 | | - | |
122 | | - | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
123 | 124 | | |
124 | 125 | | |
125 | 126 | | |
| |||
Lines changed: 51 additions & 38 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
| 22 | + | |
26 | 23 | | |
27 | 24 | | |
28 | 25 | | |
| |||
57 | 54 | | |
58 | 55 | | |
59 | 56 | | |
60 | | - | |
61 | | - | |
62 | | - | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
63 | 63 | | |
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
68 | | - | |
| 68 | + | |
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
| |||
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
80 | | - | |
81 | | - | |
82 | | - | |
83 | | - | |
84 | | - | |
| 80 | + | |
85 | 81 | | |
86 | 82 | | |
87 | 83 | | |
88 | | - | |
89 | | - | |
90 | | - | |
| 84 | + | |
91 | 85 | | |
92 | 86 | | |
93 | 87 | | |
| |||
204 | 198 | | |
205 | 199 | | |
206 | 200 | | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
207 | 238 | | |
208 | 239 | | |
209 | 240 | | |
| |||
317 | 348 | | |
318 | 349 | | |
319 | 350 | | |
320 | | - | |
321 | | - | |
322 | | - | |
323 | | - | |
324 | | - | |
325 | | - | |
326 | | - | |
327 | | - | |
328 | | - | |
329 | | - | |
330 | | - | |
331 | | - | |
332 | | - | |
333 | | - | |
334 | | - | |
335 | | - | |
336 | | - | |
337 | | - | |
338 | | - | |
339 | 351 | | |
340 | 352 | | |
341 | 353 | | |
| |||
406 | 418 | | |
407 | 419 | | |
408 | 420 | | |
409 | | - | |
| 421 | + | |
| 422 | + | |
410 | 423 | | |
411 | 424 | | |
412 | | - | |
| 425 | + | |
413 | 426 | | |
414 | 427 | | |
415 | 428 | | |
416 | 429 | | |
417 | 430 | | |
418 | 431 | | |
419 | 432 | | |
420 | | - | |
| 433 | + | |
421 | 434 | | |
0 commit comments