diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2011-07-13T14·05+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2011-07-13T14·05+0000 |
commit | e649f3168bb03053c8201489ca52f9077c0d8b17 (patch) | |
tree | 41060896ca6194aebc83277507cac532a3558585 /scripts/NixManifest.pm.in | |
parent | 0a623a10c7e89a80b6dc74445a0ae6240f65723e (diff) |
* Fix concurrency issues in download-using-manifests' handling of the
SQLite manifest cache. The DBI AutoCommit feature caused every process to have an active transaction at all times, which could indefinitely block processes wanting to update the manifest cache. * Disable fsync() in the manifest cache because we don't need integrity (the cache can always be recreated if it gets corrupted).
Diffstat (limited to 'scripts/NixManifest.pm.in')
-rw-r--r-- | scripts/NixManifest.pm.in | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/scripts/NixManifest.pm.in b/scripts/NixManifest.pm.in index 2d4b626570fb..e1a0b97094be 100644 --- a/scripts/NixManifest.pm.in +++ b/scripts/NixManifest.pm.in @@ -219,11 +219,12 @@ sub updateManifestDB { # Open/create the database. our $dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "") or die "cannot open database `$dbPath'"; - $dbh->{AutoCommit} = 0; $dbh->{RaiseError} = 1; $dbh->{PrintError} = 0; $dbh->do("pragma foreign_keys = on"); + $dbh->do("pragma synchronous = off"); # we can always reproduce the cache + $dbh->do("pragma journal_mode = truncate"); # Initialise the database schema, if necessary. $dbh->do(<<EOF); @@ -278,6 +279,8 @@ EOF open MAINLOCK, ">>$manifestDir/cache.lock" or die; flock(MAINLOCK, LOCK_EX) or die; + $dbh->begin_work; + # Read each manifest in $manifestDir and add it to the database, # unless we've already done so on a previous run. my %seen; @@ -291,6 +294,8 @@ EOF "select 1 from Manifests where path = ? and timestamp = ?", {}, $manifest, $timestamp)} == 1; + print STDERR "caching $manifest...\n"; + $dbh->do("delete from Manifests where path = ?", {}, $manifest); $dbh->do("insert into Manifests(path, timestamp) values (?, ?)", |