Commit ae2f8d2
authored
fix(api): break the import cycle, stop pinning DB connections, revive retries (#66)
The module packages each re-exported their router while core.dependencies
imports identity.models, so importing any submodule dragged the router
graph back through a half-initialised core.dependencies. `import
helprs.core.dependencies` failed on its own; the app booted only because
main.py happens to import admin.views -- which imports a model -- first,
so re-sorting imports would have broken startup. That cycle was also the
reason two services carried function-level imports. The packages are bare
now, both workarounds are gone, and a test imports each module in a fresh
interpreter so the cycle cannot grow back.
FastAPI tears yield-dependencies down only after a streaming body ends, so
the SSE route's DbSession -- and the one behind its auth dependency -- kept
a pooled connection and an open transaction for the life of the stream, up
to CONTAINER_TTL_SECONDS. With 15 connections per worker, 15 viewers
starved the worker, and each idle-in-transaction backend blocked VACUUM.
finalize_session did the same across wait_container. Both now do their
database work in short transactions either side of the wait.
On client disconnect only finalization was detached, not the event drain.
The drain stopped with the generator, so finalize_session then built its
scorecard from a truncated history and posted that to the PR -- defeating
the thing detaching was meant to protect. Both are detached together.
Also:
- container status persisted the enum member NAME ("RUNNING") while the
column default is a value ("pending"), so a DB-defaulted row raised
LookupError through the ORM. values_callable plus a data migration.
- per_page=0 divided by zero and per_page=-5 reached Postgres as a
negative LIMIT; ?status=bogus raised ValueError mid-handler. All three
were 500s and are now 422s, constrained in the signature.
- a failed container start rolled back the FAILED status *and* the session
row, so the user got a 502 and a dashboard showing nothing happened.
- mark_failed wrote "failed" and the replay query never selected it, so
one handler exception dropped a delivery for good and MAX_RETRY_COUNT
was unreachable. Failed events are replayable and re-claimable, spaced
by updated_at, and abandonment is now a state that can actually occur.
- core.dependencies went through identity's repository instead of running
its own SELECT over another module's table.1 parent 49b0258 commit ae2f8d2
18 files changed
Lines changed: 491 additions & 140 deletions
File tree
- apps/api
- alembic/versions
- src/helprs
- core
- modules
- container
- identity
- installation
- webhook
- tests
- core
- modules
- container
- installation
- webhook
Lines changed: 34 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
10 | 9 | | |
11 | 10 | | |
12 | 11 | | |
13 | 12 | | |
14 | 13 | | |
| 14 | + | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| |||
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
37 | | - | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
38 | 44 | | |
39 | 45 | | |
40 | 46 | | |
| |||
43 | 49 | | |
44 | 50 | | |
45 | 51 | | |
46 | | - | |
47 | | - | |
48 | | - | |
49 | | - | |
50 | 52 | | |
51 | | - | |
52 | | - | |
| 53 | + | |
| 54 | + | |
53 | 55 | | |
54 | 56 | | |
55 | | - | |
56 | | - | |
| 57 | + | |
57 | 58 | | |
58 | 59 | | |
59 | 60 | | |
| |||
67 | 68 | | |
68 | 69 | | |
69 | 70 | | |
70 | | - | |
71 | | - | |
72 | | - | |
73 | | - | |
74 | | - | |
75 | | - | |
76 | | - | |
| 71 | + | |
| 72 | + | |
77 | 73 | | |
78 | 74 | | |
79 | | - | |
80 | | - | |
81 | | - | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
82 | 79 | | |
83 | | - | |
84 | | - | |
85 | | - | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
86 | 83 | | |
87 | 84 | | |
88 | | - | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
89 | 91 | | |
90 | 92 | | |
91 | 93 | | |
92 | 94 | | |
93 | 95 | | |
94 | | - | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
4 | | - | |
5 | | - | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
48 | | - | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
49 | 61 | | |
50 | 62 | | |
51 | 63 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
| 15 | + | |
| 16 | + | |
16 | 17 | | |
17 | 18 | | |
18 | 19 | | |
| |||
101 | 102 | | |
102 | 103 | | |
103 | 104 | | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
104 | 111 | | |
105 | 112 | | |
106 | 113 | | |
| |||
151 | 158 | | |
152 | 159 | | |
153 | 160 | | |
154 | | - | |
155 | 161 | | |
156 | | - | |
157 | 162 | | |
158 | 163 | | |
159 | | - | |
160 | | - | |
161 | | - | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
162 | 183 | | |
163 | | - | |
164 | | - | |
| 184 | + | |
165 | 185 | | |
166 | | - | |
167 | 186 | | |
168 | 187 | | |
169 | 188 | | |
| |||
177 | 196 | | |
178 | 197 | | |
179 | 198 | | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
180 | 206 | | |
181 | 207 | | |
182 | | - | |
183 | | - | |
184 | | - | |
185 | | - | |
186 | | - | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
187 | 216 | | |
188 | 217 | | |
189 | 218 | | |
| |||
208 | 237 | | |
209 | 238 | | |
210 | 239 | | |
211 | | - | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
212 | 252 | | |
| 253 | + | |
| 254 | + | |
213 | 255 | | |
| 256 | + | |
| 257 | + | |
214 | 258 | | |
215 | 259 | | |
216 | 260 | | |
| |||
0 commit comments