Commit d8d470e
fix: transactor nonce gaps causing stale queued txs (#896)
* fix: self-healing nonce drift detection in transactor
When transactions are lost from the mempool (e.g. after an Erigon node
restart), the transactor's local nonce counter can drift permanently
ahead of the chain's pending nonce, creating an unrecoverable nonce gap.
All subsequent transactions pile up in Erigon's queued pool and never
execute.
Add drift detection in PendingNonceAt: if the local nonce exceeds the
chain's pending nonce by more than maxNonceDrift (default: 5), reset to
the chain nonce. This uses no extra RPC calls — the chain's pending
nonce is already queried on every call.
Also fix a context leak where defer cancel() inside the SendTransaction
retry loop caused all context cancellations to pile up until function
return instead of being released per iteration.
* fix: prevent nonce gap when SendTransaction retries exhaust
When all retry attempts fail with DeadlineExceeded, the for loop
exits and falls through to the success path, incorrectly calling
watcher.Sent() and incrementing the nonce for a transaction that
was never actually sent. This creates a permanent nonce gap that
leads to stale queued transactions in the mempool.
Track the send error and check it after the loop exits. If all
retries failed, return the error so the defer puts the nonce back
into the channel for reuse.1 parent 6f86e2a commit d8d470e
2 files changed
Lines changed: 221 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
| |||
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
14 | 23 | | |
15 | 24 | | |
16 | 25 | | |
| |||
37 | 46 | | |
38 | 47 | | |
39 | 48 | | |
40 | | - | |
41 | | - | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
42 | 72 | | |
43 | 73 | | |
44 | 74 | | |
45 | 75 | | |
46 | 76 | | |
| 77 | + | |
47 | 78 | | |
48 | 79 | | |
49 | 80 | | |
50 | 81 | | |
51 | 82 | | |
52 | 83 | | |
53 | | - | |
| 84 | + | |
54 | 85 | | |
55 | 86 | | |
56 | 87 | | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
57 | 93 | | |
| 94 | + | |
58 | 95 | | |
59 | 96 | | |
60 | 97 | | |
| |||
73 | 110 | | |
74 | 111 | | |
75 | 112 | | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
76 | 126 | | |
77 | 127 | | |
78 | 128 | | |
| |||
90 | 140 | | |
91 | 141 | | |
92 | 142 | | |
| 143 | + | |
93 | 144 | | |
94 | 145 | | |
95 | 146 | | |
96 | | - | |
| 147 | + | |
| 148 | + | |
97 | 149 | | |
98 | | - | |
99 | | - | |
| 150 | + | |
| 151 | + | |
100 | 152 | | |
101 | 153 | | |
102 | 154 | | |
103 | 155 | | |
| 156 | + | |
104 | 157 | | |
105 | 158 | | |
106 | | - | |
107 | 159 | | |
108 | 160 | | |
109 | 161 | | |
110 | | - | |
| 162 | + | |
111 | 163 | | |
112 | 164 | | |
113 | 165 | | |
114 | 166 | | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
115 | 171 | | |
116 | 172 | | |
117 | 173 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
134 | 134 | | |
135 | 135 | | |
136 | 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 | + | |
| 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 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
137 | 290 | | |
138 | 291 | | |
139 | 292 | | |
| |||
157 | 310 | | |
158 | 311 | | |
159 | 312 | | |
| 313 | + | |
160 | 314 | | |
161 | 315 | | |
162 | 316 | | |
| |||
167 | 321 | | |
168 | 322 | | |
169 | 323 | | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
170 | 327 | | |
171 | 328 | | |
172 | 329 | | |
| |||
0 commit comments