Commit 3cad02c
committed
Fix Durable Object ordering when mixing RPC and fetch calls
When a caller fires interleaved stub.rpc() and stub.fetch() calls on
the same DO stub without awaiting, all fetch calls were processed before
all RPC calls, regardless of send order. This violated the expected
E-order guarantee for actors.
Root cause: fetch reaches the InputGate in ~1 async hop (via
WorkerEntrypoint::request() -> context.run() -> InputGate::wait()),
while RPC takes ~4+ hops (customEvent -> JsRpcSessionCustomEvent::run()
-> Cap'n Proto session setup -> capability fulfillment -> pipelined
call dispatch -> JsRpcTargetBase::call() -> kj::yield() -> ctx.run()
-> InputGate::wait()). Since all operations originate from the same
synchronous JS execution, fetch calls always reached the FIFO queue
before any RPC calls.
Fix: eagerly acquire the InputGate position in
JsRpcSessionCustomEvent::run() — at the same level where
WorkerEntrypoint::request() acquires it — then thread the lock through
to the first ctx.run() call via the existing
IoContext::run(func, Maybe<InputGate::Lock>) overload. The lock is
consumed by the first RPC method invocation and is NOT held for the
session lifetime. The kj::yield() in JsRpcTargetBase::call() and
ExternalPusher ordering are unaffected.
Fixes #6561
Made-with: Cursor1 parent d9cfdd0 commit 3cad02c
4 files changed
Lines changed: 113 additions & 1 deletion
File tree
- src/workerd/api
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
37 | 38 | | |
38 | 39 | | |
39 | 40 | | |
| 41 | + | |
40 | 42 | | |
41 | 43 | | |
42 | 44 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
586 | 586 | | |
587 | 587 | | |
588 | 588 | | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
589 | 608 | | |
590 | 609 | | |
591 | 610 | | |
| |||
2117 | 2136 | | |
2118 | 2137 | | |
2119 | 2138 | | |
| 2139 | + | |
| 2140 | + | |
| 2141 | + | |
| 2142 | + | |
| 2143 | + | |
| 2144 | + | |
| 2145 | + | |
| 2146 | + | |
| 2147 | + | |
| 2148 | + | |
| 2149 | + | |
| 2150 | + | |
| 2151 | + | |
| 2152 | + | |
| 2153 | + | |
| 2154 | + | |
| 2155 | + | |
| 2156 | + | |
| 2157 | + | |
| 2158 | + | |
| 2159 | + | |
| 2160 | + | |
| 2161 | + | |
| 2162 | + | |
| 2163 | + | |
| 2164 | + | |
| 2165 | + | |
| 2166 | + | |
| 2167 | + | |
| 2168 | + | |
| 2169 | + | |
| 2170 | + | |
| 2171 | + | |
| 2172 | + | |
| 2173 | + | |
| 2174 | + | |
| 2175 | + | |
| 2176 | + | |
| 2177 | + | |
| 2178 | + | |
| 2179 | + | |
| 2180 | + | |
| 2181 | + | |
| 2182 | + | |
| 2183 | + | |
| 2184 | + | |
| 2185 | + | |
| 2186 | + | |
| 2187 | + | |
| 2188 | + | |
| 2189 | + | |
| 2190 | + | |
| 2191 | + | |
| 2192 | + | |
| 2193 | + | |
| 2194 | + | |
| 2195 | + | |
| 2196 | + | |
| 2197 | + | |
| 2198 | + | |
| 2199 | + | |
| 2200 | + | |
| 2201 | + | |
| 2202 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| 28 | + | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
| |||
33 | 34 | | |
34 | 35 | | |
35 | 36 | | |
| 37 | + | |
36 | 38 | | |
37 | 39 | | |
38 | 40 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1000 | 1000 | | |
1001 | 1001 | | |
1002 | 1002 | | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
1003 | 1008 | | |
1004 | 1009 | | |
1005 | | - | |
| 1010 | + | |
1006 | 1011 | | |
1007 | 1012 | | |
1008 | 1013 | | |
| |||
1057 | 1062 | | |
1058 | 1063 | | |
1059 | 1064 | | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + | |
1060 | 1071 | | |
1061 | 1072 | | |
1062 | 1073 | | |
| |||
2174 | 2185 | | |
2175 | 2186 | | |
2176 | 2187 | | |
| 2188 | + | |
| 2189 | + | |
| 2190 | + | |
| 2191 | + | |
| 2192 | + | |
| 2193 | + | |
| 2194 | + | |
| 2195 | + | |
| 2196 | + | |
| 2197 | + | |
| 2198 | + | |
| 2199 | + | |
| 2200 | + | |
2177 | 2201 | | |
2178 | 2202 | | |
2179 | 2203 | | |
| |||
2182 | 2206 | | |
2183 | 2207 | | |
2184 | 2208 | | |
| 2209 | + | |
2185 | 2210 | | |
2186 | 2211 | | |
2187 | 2212 | | |
| |||
0 commit comments