Phase 0: fixes from review (torn files, pending blobs, exact sequences, UTF-8, storage checks)
- detect files changing during reading or between resumable steps and re-read them (size/mtime/ctime/inode), spike F overwrites mid-run - drop pending blob ids when a pack or index upload fails - dump and restore PostgreSQL sequence state exactly, bound parameters, validated catalog names; spike C checks all sequences exactly - keep invalid UTF-8 byte-exact (tagged base64) - refuse large tables without a primary key - StorageBackend: check write/flush/close results, validate base path - user_migration import/export: root paths, intermediate folders, partial writes, read errors - spikes: never touch an existing account, own fixtures, 512M note
This commit is contained in:
@@ -59,9 +59,17 @@ final class PackWriter {
|
||||
fwrite($this->buffer, $header . pack('N', strlen($header)));
|
||||
rewind($this->buffer);
|
||||
$path = 'packs/' . substr($packId, 0, 2) . '/' . $packId;
|
||||
$this->backend->put($path, $this->buffer); // closes the buffer
|
||||
unset($this->buffer);
|
||||
$this->index->addPack($packId, $this->entries);
|
||||
try {
|
||||
$this->backend->put($path, $this->buffer); // closes the buffer
|
||||
unset($this->buffer);
|
||||
$this->index->addPack($packId, $this->entries);
|
||||
} catch (\Throwable $e) {
|
||||
// The blobs of this pack are not durable: forget them, so a retry stores them again.
|
||||
$this->index->dropPending(array_column($this->entries, 'id'));
|
||||
unset($this->buffer);
|
||||
$this->reset();
|
||||
throw $e;
|
||||
}
|
||||
$this->reset();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user