fix(db): handle large numbers of blocks in update (#10025)

Avoid failure when inserting file with very large block list
This commit is contained in:
Jakob Borg
2025-04-02 19:35:37 +02:00
committed by GitHub
parent 86cbc2486f
commit 4096a35b86
2 changed files with 45 additions and 5 deletions
+12 -5
View File
@@ -310,11 +310,18 @@ func (*DB) insertBlocksLocked(tx *txPreparedStmts, blocklistHash []byte, blocks
"size": b.Size,
}
}
_, err := tx.NamedExec(`
INSERT OR IGNORE INTO blocks (hash, blocklist_hash, idx, offset, size)
VALUES (:hash, :blocklist_hash, :idx, :offset, :size)
`, bs)
return wrap(err)
// Very large block lists (>8000 blocks) result in "too many variables"
// error. Chunk it to a reasonable size.
for chunk := range slices.Chunk(bs, 1000) {
if _, err := tx.NamedExec(`
INSERT OR IGNORE INTO blocks (hash, blocklist_hash, idx, offset, size)
VALUES (:hash, :blocklist_hash, :idx, :offset, :size)
`, chunk); err != nil {
return wrap(err)
}
}
return nil
}
func (s *DB) recalcGlobalForFolder(txp *txPreparedStmts, folderIdx int64) error {