diff options
author | Todd Gamblin <tgamblin@llnl.gov> | 2019-12-21 16:29:53 -0800 |
---|---|---|
committer | Todd Gamblin <tgamblin@llnl.gov> | 2019-12-23 23:18:44 -0800 |
commit | b3a5f2e3c3ce4e3e9836301504f5b5987117248e (patch) | |
tree | 9beda00ced952bcb53eb2e1108e078a0f3937383 /LICENSE-APACHE | |
parent | 98577e3af5cf571d5408fcb1da32de3586238ead (diff) | |
download | spack-b3a5f2e3c3ce4e3e9836301504f5b5987117248e.tar.gz spack-b3a5f2e3c3ce4e3e9836301504f5b5987117248e.tar.bz2 spack-b3a5f2e3c3ce4e3e9836301504f5b5987117248e.tar.xz spack-b3a5f2e3c3ce4e3e9836301504f5b5987117248e.zip |
lock transactions: ensure that nested write transactions write
If a write transaction was nested inside a read transaction, it would not
write properly on release, e.g., in a sequence like this, inside our
`LockTransaction` class:
```
1 with spack.store.db.read_transaction():
2 with spack.store.db.write_transaction():
3 ...
4 with spack.store.db.read_transaction():
...
```
The WriteTransaction on line 2 had no way of knowing that its
`__exit__()` call was the last *write* in the nesting, and it would skip
calling its write function.
The `__exit__()` call of the `ReadTransaction` on line 1 wouldn't know
how to write, and the file would never be written.
The DB would be correct in memory, but the `ReadTransaction` on line 4
would re-read the whole DB assuming that other processes may have
modified it. Since the DB was never written, we got stale data.
- [x] Make `Lock.release_write()` return `True` whenever we release the
*last write* in a nest.
Diffstat (limited to 'LICENSE-APACHE')
0 files changed, 0 insertions, 0 deletions