Commit c9f5ea6
committed
adapter: refuse a write timestamp past the write timeline's bound
`GroupCommitter::commit_timestamped` documented an obligation it never
discharged. Its doc lists the wall-clock throttle among the things it skips,
"`target_timestamp` is the caller's to choose, and it must not run the write
timeline ahead of the clock", and then it committed whatever it was handed.
That is load-bearing, because the oracle is monotone and durable. A write
that lands far ahead of the clock is applied to the oracle, and from then on
every write and strict-serializable read on the timeline blocks until the
clock catches up. Restarting does not help. The oracle row is durable, and
the same timestamp also reaches the catalog shard's upper, which boot
re-applies to the oracle. Under `serializable` it is worse than a block:
those reads pick a timestamp near the clock and never consult the oracle, so
an acknowledged write stays invisible until the clock arrives.
The frontend read-then-write path can produce such a target today. It writes
at the frontier its subscribe observed, and a selection over a materialized
view with a `REFRESH` option settles until the next refresh, so that frontier
is legitimately hours or days out.
So enforce the bound where it is stated. A target above
`write_ts_upper_bound(now)`, the same ceiling `check_runaway_write_ts`
already measured against, is refused before the append, and the session
turns that into a statement error. This is a backstop rather than a fix: the
right answer is for the caller to pick a timestamp near the clock and use the
frontier only to certify what it read, which is a larger change to the OCC
loop. What this guarantees is that the worst outcome is one failed statement
instead of a stalled timeline.
Two smaller things in the same area. `check_runaway_write_ts` soft panics
instead of logging, so a runaway fails a test rather than leaving a line in a
log, and it degrades to that log line in production. Boot reports a catalog
upper that is already past the bound, which is the one channel that survives
a restart and was silent. Boot does not refuse to start, because the timeline
is stalled either way and a process that will not boot turns that into an
outage plus a crash loop.
The wall-clock bound on `write_ts` also holds in every oracle implementation
and is pinned by the shared conformance test, but was stated in none of them,
so the trait now carries it. Along with it: `peek_write_ts` does not advance
the timestamp, `apply_write` raises both timestamps rather than only bounding
future reads, and it is the door through which a timestamp the oracle did not
allocate enters, which is why the bound is a property of the
`EpochMilliseconds` timeline rather than of the oracle.
Tests: an integration test that drives the far-future target from a
materialized view with two refreshes, one a few seconds out so the view is
readable at all and one far away so the write target is deterministic, and
asserts the statement is refused, the oracle did not move, and the timeline
still takes writes and reads afterwards.1 parent 946b68f commit c9f5ea6
7 files changed
Lines changed: 201 additions & 19 deletions
File tree
- src
- adapter/src
- coord
- environmentd/tests
- timestamp-oracle/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4828 | 4828 | | |
4829 | 4829 | | |
4830 | 4830 | | |
| 4831 | + | |
| 4832 | + | |
| 4833 | + | |
| 4834 | + | |
| 4835 | + | |
| 4836 | + | |
| 4837 | + | |
| 4838 | + | |
| 4839 | + | |
| 4840 | + | |
| 4841 | + | |
| 4842 | + | |
| 4843 | + | |
| 4844 | + | |
4831 | 4845 | | |
4832 | 4846 | | |
4833 | 4847 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
| 67 | + | |
67 | 68 | | |
68 | 69 | | |
69 | 70 | | |
| |||
174 | 175 | | |
175 | 176 | | |
176 | 177 | | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
177 | 184 | | |
178 | 185 | | |
179 | 186 | | |
| |||
438 | 445 | | |
439 | 446 | | |
440 | 447 | | |
441 | | - | |
442 | | - | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
443 | 453 | | |
444 | 454 | | |
445 | 455 | | |
| |||
466 | 476 | | |
467 | 477 | | |
468 | 478 | | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
469 | 492 | | |
470 | 493 | | |
471 | 494 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
28 | | - | |
| 28 | + | |
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| |||
347 | 347 | | |
348 | 348 | | |
349 | 349 | | |
350 | | - | |
351 | | - | |
352 | | - | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
353 | 359 | | |
354 | 360 | | |
355 | 361 | | |
356 | 362 | | |
357 | 363 | | |
358 | 364 | | |
359 | | - | |
360 | | - | |
361 | | - | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
362 | 373 | | |
363 | | - | |
| 374 | + | |
364 | 375 | | |
365 | | - | |
366 | | - | |
367 | | - | |
368 | | - | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
369 | 379 | | |
370 | 380 | | |
371 | 381 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
140 | 140 | | |
141 | 141 | | |
142 | 142 | | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
143 | 154 | | |
144 | 155 | | |
145 | 156 | | |
| |||
836 | 847 | | |
837 | 848 | | |
838 | 849 | | |
| 850 | + | |
| 851 | + | |
| 852 | + | |
| 853 | + | |
| 854 | + | |
| 855 | + | |
839 | 856 | | |
840 | 857 | | |
841 | 858 | | |
| |||
900 | 917 | | |
901 | 918 | | |
902 | 919 | | |
| 920 | + | |
| 921 | + | |
| 922 | + | |
903 | 923 | | |
904 | 924 | | |
905 | 925 | | |
| |||
1281 | 1301 | | |
1282 | 1302 | | |
1283 | 1303 | | |
| 1304 | + | |
| 1305 | + | |
| 1306 | + | |
| 1307 | + | |
| 1308 | + | |
| 1309 | + | |
| 1310 | + | |
| 1311 | + | |
| 1312 | + | |
| 1313 | + | |
1284 | 1314 | | |
1285 | 1315 | | |
1286 | 1316 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
248 | 248 | | |
249 | 249 | | |
250 | 250 | | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
251 | 258 | | |
252 | 259 | | |
253 | 260 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1721 | 1721 | | |
1722 | 1722 | | |
1723 | 1723 | | |
| 1724 | + | |
| 1725 | + | |
| 1726 | + | |
| 1727 | + | |
| 1728 | + | |
| 1729 | + | |
| 1730 | + | |
| 1731 | + | |
| 1732 | + | |
| 1733 | + | |
| 1734 | + | |
| 1735 | + | |
| 1736 | + | |
| 1737 | + | |
| 1738 | + | |
| 1739 | + | |
| 1740 | + | |
| 1741 | + | |
| 1742 | + | |
| 1743 | + | |
| 1744 | + | |
| 1745 | + | |
| 1746 | + | |
| 1747 | + | |
| 1748 | + | |
| 1749 | + | |
| 1750 | + | |
| 1751 | + | |
| 1752 | + | |
| 1753 | + | |
| 1754 | + | |
| 1755 | + | |
| 1756 | + | |
| 1757 | + | |
| 1758 | + | |
| 1759 | + | |
| 1760 | + | |
| 1761 | + | |
| 1762 | + | |
| 1763 | + | |
| 1764 | + | |
| 1765 | + | |
| 1766 | + | |
| 1767 | + | |
| 1768 | + | |
| 1769 | + | |
| 1770 | + | |
| 1771 | + | |
| 1772 | + | |
| 1773 | + | |
| 1774 | + | |
| 1775 | + | |
| 1776 | + | |
| 1777 | + | |
| 1778 | + | |
| 1779 | + | |
| 1780 | + | |
| 1781 | + | |
| 1782 | + | |
| 1783 | + | |
| 1784 | + | |
| 1785 | + | |
| 1786 | + | |
| 1787 | + | |
| 1788 | + | |
| 1789 | + | |
| 1790 | + | |
| 1791 | + | |
| 1792 | + | |
| 1793 | + | |
| 1794 | + | |
| 1795 | + | |
| 1796 | + | |
| 1797 | + | |
| 1798 | + | |
| 1799 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
44 | | - | |
| 44 | + | |
| 45 | + | |
45 | 46 | | |
46 | 47 | | |
47 | 48 | | |
48 | 49 | | |
49 | 50 | | |
50 | 51 | | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
51 | 62 | | |
52 | 63 | | |
53 | | - | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
54 | 67 | | |
55 | 68 | | |
56 | 69 | | |
| |||
62 | 75 | | |
63 | 76 | | |
64 | 77 | | |
65 | | - | |
66 | | - | |
67 | | - | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
68 | 90 | | |
69 | 91 | | |
70 | 92 | | |
| |||
0 commit comments