Commit 12e98e5
committed
Indexing: stop the full reconcile from wedging on a large delta
A local or network full reconcile sent one UpsertEntryV2/Delete per changed entry, and each one propagated its size delta up the entire ancestor chain — O(entries × tree-depth). But the reconcile already finishes with a single ComputeAllAggregates that recomputes every dir_stats from scratch, so that per-entry propagation is pure waste: its results are immediately overwritten. On a large delta (e.g. completing a 270k partial up to a 6M-entry /) the writer can't drain, the walk thread parks on a full channel, and the app appears hung for hours.
Add a writer 'bulk reconcile' mode (SetDeltaPropagation): the two full-reconcile walkers bracket their walk with a BulkReconcileGuard (RAII — re-enables propagation on every exit path, including cancel/empty-root/error/panic), and the writer skips ONLY the ancestor propagation while it's on. Entry writes, hardlink dedup, and new-dir dir_stats row init are all kept; the final ComputeAllAggregates makes the result identical. Writes drop from O(N×depth) to O(N). The live FSEvents path is untouched — it has no final aggregate, so it keeps propagating.
Latent since the network reconcile landed (a6a2f58); the local port (368d726) exposed it at / scale. The perf gate only ever tested no-op and 1%-changed deltas; added a large-delta guard test that asserts no per-entry propagation happens mid-walk (RED if propagation is forced on). 438 indexing tests green.1 parent c40448e commit 12e98e5
6 files changed
Lines changed: 347 additions & 30 deletions
File tree
- apps/desktop/src-tauri/src/indexing
- writer
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
373 | 373 | | |
374 | 374 | | |
375 | 375 | | |
| 376 | + | |
| 377 | + | |
376 | 378 | | |
377 | 379 | | |
378 | 380 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
220 | 220 | | |
221 | 221 | | |
222 | 222 | | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
223 | 230 | | |
224 | 231 | | |
225 | 232 | | |
| |||
873 | 880 | | |
874 | 881 | | |
875 | 882 | | |
| 883 | + | |
| 884 | + | |
| 885 | + | |
| 886 | + | |
| 887 | + | |
| 888 | + | |
| 889 | + | |
| 890 | + | |
| 891 | + | |
| 892 | + | |
| 893 | + | |
| 894 | + | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | + | |
| 910 | + | |
| 911 | + | |
| 912 | + | |
| 913 | + | |
| 914 | + | |
| 915 | + | |
| 916 | + | |
| 917 | + | |
| 918 | + | |
| 919 | + | |
| 920 | + | |
| 921 | + | |
| 922 | + | |
| 923 | + | |
| 924 | + | |
| 925 | + | |
| 926 | + | |
| 927 | + | |
| 928 | + | |
876 | 929 | | |
877 | 930 | | |
878 | 931 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
623 | 623 | | |
624 | 624 | | |
625 | 625 | | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
626 | 663 | | |
627 | 664 | | |
628 | 665 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
496 | 496 | | |
497 | 497 | | |
498 | 498 | | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
499 | 506 | | |
500 | 507 | | |
501 | 508 | | |
| |||
0 commit comments