Use one transaction when updating packages via `PackageUpdater`
This should likely be done in the other updating functions of the `Database` class as well to avoid indexes and actual data appearing inconsistent during the write operations.
This commit is contained in:
parent
c6a8c81784
commit
84ef92aaa2
|
@ -906,6 +906,7 @@ void PackageUpdater::commit()
|
||||||
{
|
{
|
||||||
const auto &storage = m_database.m_storage;
|
const auto &storage = m_database.m_storage;
|
||||||
auto &pkgTxn = m_d->packagesTxn;
|
auto &pkgTxn = m_d->packagesTxn;
|
||||||
|
auto txnHandle = pkgTxn.getTransactionHandle();
|
||||||
if (m_d->clear) {
|
if (m_d->clear) {
|
||||||
const auto &toPreserve = m_d->handledIds;
|
const auto &toPreserve = m_d->handledIds;
|
||||||
for (auto i = pkgTxn.begin<std::unique_ptr>(); i != pkgTxn.end(); ++i) {
|
for (auto i = pkgTxn.begin<std::unique_ptr>(); i != pkgTxn.end(); ++i) {
|
||||||
|
@ -914,47 +915,43 @@ void PackageUpdater::commit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pkgTxn.commit();
|
|
||||||
{
|
{
|
||||||
auto txn = storage->providedDeps.getRWTransaction();
|
auto txn = storage->providedDeps.getRWTransaction(txnHandle);
|
||||||
if (m_d->clear) {
|
if (m_d->clear) {
|
||||||
txn.clear();
|
txn.clear();
|
||||||
}
|
}
|
||||||
for (auto &[dependencyName, affected] : m_d->affectedProvidedDeps) {
|
for (auto &[dependencyName, affected] : m_d->affectedProvidedDeps) {
|
||||||
m_d->submit(dependencyName, affected, txn);
|
m_d->submit(dependencyName, affected, txn);
|
||||||
}
|
}
|
||||||
txn.commit();
|
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
auto txn = storage->requiredDeps.getRWTransaction();
|
auto txn = storage->requiredDeps.getRWTransaction(txnHandle);
|
||||||
if (m_d->clear) {
|
if (m_d->clear) {
|
||||||
txn.clear();
|
txn.clear();
|
||||||
}
|
}
|
||||||
for (auto &[dependencyName, affected] : m_d->affectedRequiredDeps) {
|
for (auto &[dependencyName, affected] : m_d->affectedRequiredDeps) {
|
||||||
m_d->submit(dependencyName, affected, txn);
|
m_d->submit(dependencyName, affected, txn);
|
||||||
}
|
}
|
||||||
txn.commit();
|
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
auto txn = storage->providedLibs.getRWTransaction();
|
auto txn = storage->providedLibs.getRWTransaction(txnHandle);
|
||||||
if (m_d->clear) {
|
if (m_d->clear) {
|
||||||
txn.clear();
|
txn.clear();
|
||||||
}
|
}
|
||||||
for (auto &[libraryName, affected] : m_d->affectedProvidedLibs) {
|
for (auto &[libraryName, affected] : m_d->affectedProvidedLibs) {
|
||||||
m_d->submit(libraryName, affected, txn);
|
m_d->submit(libraryName, affected, txn);
|
||||||
}
|
}
|
||||||
txn.commit();
|
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
auto txn = storage->requiredLibs.getRWTransaction();
|
auto txn = storage->requiredLibs.getRWTransaction(txnHandle);
|
||||||
if (m_d->clear) {
|
if (m_d->clear) {
|
||||||
txn.clear();
|
txn.clear();
|
||||||
}
|
}
|
||||||
for (auto &[libraryName, affected] : m_d->affectedRequiredLibs) {
|
for (auto &[libraryName, affected] : m_d->affectedRequiredLibs) {
|
||||||
m_d->submit(libraryName, affected, txn);
|
m_d->submit(libraryName, affected, txn);
|
||||||
}
|
}
|
||||||
txn.commit();
|
|
||||||
}
|
}
|
||||||
|
pkgTxn.commit();
|
||||||
m_d->lock.unlock();
|
m_d->lock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue