Some checks failed
CI Code / Check spelling (pull_request) Failing after 21s
CI Code / Linux (arch) (pull_request) Failing after 3m6s
CI Code / Check coding style (pull_request) Failing after 3m10s
CI Code / Code Coverage (pull_request) Successful in 2m49s
CI Code / Linux (debian) (pull_request) Successful in 4m26s
CI Code / Linux (ubuntu) (pull_request) Successful in 4m38s
Address 6 of 7 high/medium audit findings on database_export.c.
End-to-end migration of 1M rows: ~5 min -> ~1 min.
H1 cache g_slist_length(merged) out of the write loop — was O(n²)
via 2000 list walks at 500-row progress interval, now O(1).
S7a_export_cold @ 1M: 309 s -> 11.2 s (-96 %)
L1 splice existing flatfile lines into merged via ownership
transfer instead of 12-strdup deep-copy + g_date_time_ref;
free list nodes only, NULL out existing.
S7b_export_dedup @ 1M: 304 s -> 13.3 s (-96 %)
RSS @ S7b 1M: 2.4 GB -> 1.9 GB
H2 mkstemp() with random suffix instead of fixed
"{log_path}.export.tmp". Eliminates the unlink-and-retry race
where two concurrent exports could clobber each other's
in-flight tmp files.
M4 SHA-256 over full body (incremental g_checksum_update) in
the dedup-key fallback. Previous body[:256] hash collided
on common preambles (signatures, code blocks) — second
occurrence silently dropped on import.
M2 Refuse _ff_read_all_lines on files > 2 GB. Each line expands
~10x in heap on parse; without a cap we OOM-kill prof on
large flatfiles. Surface a clear error instead.
M5 Break the outer import loop on system-level INSERT failure.
Was cascading "Import of X failed" through every remaining
contact when the real issue was disk-full / sqlite locked.
Verified on bench-pipeline-max: 1M rows, full content diff,
mismatches=0. baseline.csv updated.
Deferred: M3 O_TMPFILE (platform-conditional + linkat dance;
mkstemp covers most of the same window) and M6 SIGINT cancellation
(needs event-loop architecture changes).
5.1 KiB
5.1 KiB
| 1 | scenario | volume | bytes | lines | wall_ms | peak_rss_kb | note |
|---|---|---|---|---|---|---|---|
| 2 | S1_cold_tail | small | 39494716 | 10002 | 46.040 | 14408 | tail page=100 |
| 3 | S2_warm_tail | small | 39494716 | 10002 | 33.878 | 14716 | tail page=100 |
| 4 | S3_deep_pagination | small | 39494716 | 10002 | 1.024 | 14716 | n_pages=1000 |
| 5 | S4_first_build | small | 39494716 | 10002 | 39.139 | 14716 | idx_entries=20 |
| 6 | S5_incremental_extend | small | 104411 | 1000 | 0.859 | 14716 | appended=1000_lines |
| 7 | S6_verify | small | 39494716 | 10002 | 396.022 | 16424 | total=1 err=0 warn=1 info=0 |
| 8 | L1 | longmsg | 110586 | 100 | 1.486 | 9432 | n=100 body=1024 write=0.8ms read=0.6ms parsed=100 mismatch=0 parse_fail=0 1KB body x100 |
| 9 | L2 | longmsg | 1032186 | 100 | 10.468 | 9432 | n=100 body=10240 write=5.7ms read=4.8ms parsed=100 mismatch=0 parse_fail=0 10KB body x100 |
| 10 | L3 | longmsg | 10248186 | 100 | 100.337 | 9816 | n=100 body=102400 write=57.3ms read=43.1ms parsed=100 mismatch=0 parse_fail=0 100KB body x100 |
| 11 | L4 | longmsg | 52432936 | 50 | 502.785 | 13608 | n=50 body=1048576 write=264.5ms read=238.3ms parsed=50 mismatch=0 parse_fail=0 1MB body x50 |
| 12 | L5 | longmsg | 52429696 | 10 | 518.558 | 27764 | n=10 body=5242880 write=264.4ms read=254.2ms parsed=10 mismatch=0 parse_fail=0 5MB body x10 |
| 13 | L6 | longmsg | 41435552 | 4 | 407.803 | 45852 | n=4 body=10358784 write=211.3ms read=196.5ms parsed=4 mismatch=0 parse_fail=0 9.9MB body x4 (just under FF_MAX_LINE_LEN) |
| 14 | L7 | longmsg | 10485981 | 2 | 3.750 | 45852 | oversize=10485761_rejected=yes read=3.8ms parsed=1 |
| 15 | L8 | longmsg | 5175286 | 50 | 45.549 | 45852 | n=50 body=102400 write=26.6ms read=18.9ms parsed=50 mismatch=0 parse_fail=0 100KB body w/ \n every 100B |
| 16 | L9 | longmsg | 5124136 | 50 | 45.487 | 45852 | n=50 body=102400 write=24.5ms read=21.0ms parsed=50 mismatch=0 parse_fail=0 100KB body w/ pipes |
| 17 | L10 | longmsg | 5124136 | 50 | 43.254 | 45852 | n=50 body=102400 write=18.9ms read=24.4ms parsed=50 mismatch=0 parse_fail=0 100KB body utf-8 emoji |
| 18 | L11 | longmsg | 110586 | 100 | 1.284 | 45852 | n=100 body=1024 write=0.7ms read=0.6ms parsed=100 mismatch=0 parse_fail=0 sanity baseline |
| 19 | L12 | longmsg | 5415366 | 1000 | 26.437 | 45852 | 5x1MB_in_last_100 parsed=1000 |
| 20 | L13 | longmsg | 104865786 | 100 | 932.630 | 45852 | n=100 body=1048576 write=485.7ms read=446.9ms parsed=100 mismatch=0 parse_fail=0 verify-equiv full parse on 100x1MB |
| 21 | L14 | longmsg | 102481986 | 1000 | 962.342 | 45852 | n=1000 body=102400 write=510.4ms read=452.0ms parsed=1000 mismatch=0 parse_fail=0 rapid append 1000x100KB |
| 22 | F1 | fail-pass | 904 | 0 | 0.118 | 9540 | issues total=1 err=0 warn=1 (partial-line tail; expect graceful handle) |
| 23 | F2 | fail-pass | 1119 | 0 | 0.113 | 9540 | warnings=2 (expect CRLF warning) first_warn=File permissions are 644 expected 600 (sensitive data) |
| 24 | F3 | fail-pass | 341 | 0 | 0.072 | 9540 | errors=1 warnings=1 (expect 1 unparsable line for mid-file BOM) first=Unparsable line |
| 25 | F7 | fail-pass | 527 | 0 | 0.082 | 9540 | issues total=1 err=0 (cycle handled at read-time not verify) |
| 26 | F8 | fail-pass | 19044 | 0 | 0.981 | 9540 | 201 lines (1 orig + 200 corrections) errors=0 warns=1 |
| 27 | F9 | fail-pass | 341 | 0 | 0.069 | 9540 | errors=0 (parser splits at first ': ' — not flagged but body truncated) |
| 28 | F10 | fail-pass | 176 | 0 | 0.060 | 9540 | errors=0 warnings=1 (RTL/ZWSP preserved literally) |
| 29 | F11 | fail-pass | 323 | 0 | 0.264 | 9540 | errors=1 (Latin-1 byte: error or fallback OK) |
| 30 | F12 | fail-pass | 330 | 0 | 0.071 | 9540 | errors=0 (empty body OK) |
| 31 | F14 | fail-pass | 23236 | 0 | 0.914 | 9540 | v1_lines=100 v2_lines=250 (expect rebuild detected and 250 lines) |
| 32 | F15 | fail-pass | 0 | 0 | 0.121 | 9540 | errors=0 infos=1 warnings=1 (empty file should yield INFO) |
| 33 | S1_cold_tail | lmc | 389183687 | 100002 | 480.428 | 43456 | tail page=100 |
| 34 | S2_warm_tail | lmc | 389183687 | 100002 | 477.482 | 43456 | tail page=100 |
| 35 | S3_deep_pagination | lmc | 389183687 | 100002 | 1.066 | 43456 | n_pages=1000 |
| 36 | S4_first_build | lmc | 389183687 | 100002 | 473.604 | 43456 | idx_entries=200 |
| 37 | S5_incremental_extend | lmc | 104411 | 1000 | 0.902 | 43456 | appended=1000_lines |
| 38 | S6_verify | lmc | 389183687 | 100002 | 3892.137 | 43456 | total=1 err=0 warn=1 info=0 |
| 39 | S6_verify | ooo | 397586720 | 100002 | 4037.058 | 33336 | total=17573 err=0 warn=17573 info=0 |
| 40 | S7a_export_cold | pipe100000 | 40714240 | 100000 | 1231.613 | 148128 | exported=100000 db_rows=100000 |
| 41 | S7b_export_dedup | pipe100000 | 40714240 | 100000 | 1484.406 | 199460 | exported=0 db_rows=100000 |
| 42 | S7_seed_export | pipe100000 | 40714240 | 100000 | 1238.138 | 148208 | exported=100000 db_rows=100000 |
| 43 | S8a_import_cold | pipe100000 | 40628224 | 100000 | 3237.481 | 123108 | imported=100000 rows_before=0 rows_after=100000 |
| 44 | S8b_import_idempotent | pipe100000 | 40628224 | 0 | 1047.286 | 194860 | imported=0 rows_before=100000 rows_after=100000 |
| 45 | S8e_roundtrip | pipe100000 | 40521728 | 100000 | 6520.475 | 148184 | rows=100000 seed=1591ms export=1237ms import=3376ms diff=317ms exported=100000 imported=100000 rows_a=100000 rows_b=100000 mismatches=0 body=0 lmc=0 |
| 46 | S7a_export_cold | pipe1000000 | 407732224 | 1000000 | 11247.107 | 1376772 | exported=1000000 db_rows=1000000 |
| 47 | S7b_export_dedup | pipe1000000 | 407732224 | 1000000 | 13262.643 | 1873220 | exported=0 db_rows=1000000 |
| 48 | S7_seed_export | pipe1000000 | 407732224 | 1000000 | 12125.624 | 1377076 | exported=1000000 db_rows=1000000 |
| 49 | S8a_import_cold | pipe1000000 | 406605824 | 1000000 | 36877.801 | 1124804 | imported=1000000 rows_before=0 rows_after=1000000 |
| 50 | S8b_import_idempotent | pipe1000000 | 406605824 | 0 | 11986.786 | 1841488 | imported=0 rows_before=1000000 rows_after=1000000 |
| 51 | S8e_roundtrip | pipe1000000 | 405757952 | 1000000 | 66449.762 | 1377084 | rows=1000000 seed=20012ms export=11939ms import=31533ms diff=2966ms exported=1000000 imported=1000000 rows_a=1000000 rows_b=1000000 mismatches=0 body=0 lmc=0 |