fix(upload): prevent false 422s and EMFILE crash during bulk uploads
Four related issues made uploading 271+ activities unreliable: 1. merge_all/write_combined_feed were inside the extraction try/except — any merge race returned 422 even though the file was on disk, causing the mobile app to permanently mark the upload as failed. Fixed by moving them to a separate best-effort try/except after the extraction block. Switch to merge_one (single-activity symlink) instead of merge_all (full rebuild) so each upload is O(1) FS ops, not O(N). 2. The dev watcher fired merge_all for every activity .json write AND the upload endpoint also ran merge_all — O(N²) symlink operations during bulk uploads. Watcher now skips activities/*.json changes (upload endpoint handles those directly). 3. Vite/Chokidar followed the public/data symlink and opened a handle per activity file; constant merge rebuilds exhausted file descriptors and crashed the Astro dev server. Fixed with watch.ignored on public/data. 4. _write_year_shards and write_combined_feed used f.unlink() without missing_ok=True — concurrent callers racing the same file threw FileNotFoundError which propagated as a false extraction failure.
This commit is contained in:
@@ -39,6 +39,12 @@ export default defineConfig({
|
||||
// Proxy /api/* to bincio serve/edit so cookies work same-origin in dev.
|
||||
// In production nginx handles this — same pattern, no code change needed.
|
||||
server: {
|
||||
watch: {
|
||||
// public/data is a symlink to the live data dir; Chokidar follows it and
|
||||
// opens a handle per file, which causes EMFILE during bulk uploads as
|
||||
// activity count grows. Data files don't need HMR — exclude them.
|
||||
ignored: ['**/public/data/**'],
|
||||
},
|
||||
proxy: {
|
||||
// Both /api/upload and /api/upload/strava-zip return SSE streams in response
|
||||
// to POST requests. Vite's default proxy buffers the full body before forwarding,
|
||||
|
||||
Reference in New Issue
Block a user