diff --git a/src/engine/writetransaction.cpp b/src/engine/writetransaction.cpp --- a/src/engine/writetransaction.cpp +++ b/src/engine/writetransaction.cpp @@ -265,6 +265,12 @@ PostingDB postingDB(m_dbis.postingDbi, m_txn); PositionDB positionDB(m_dbis.positionDBi, m_txn); + int operationCount = m_pendingOperations.size(); + if (operationCount > 1000000) + { + qWarning() << "WriteTransaction->commit(): suspiciously large transaction, operationCount=" << operationCount; + } + QHashIterator > iter(m_pendingOperations); while (iter.hasNext()) { iter.next(); diff --git a/src/tools/balooctl/main.cpp b/src/tools/balooctl/main.cpp --- a/src/tools/balooctl/main.cpp +++ b/src/tools/balooctl/main.cpp @@ -38,6 +38,8 @@ #include #include +#include + #include "global.h" #include "database.h" #include "transaction.h" @@ -209,28 +211,32 @@ return 1; } - Transaction tr(db, Transaction::ReadWrite); + auto tr = std::unique_ptr(new Transaction(db, Transaction::ReadWrite)); for (int i = 1; i < parser.positionalArguments().size(); ++i) { const QString url = QFileInfo(parser.positionalArguments().at(i)).absoluteFilePath(); quint64 id = filePathToId(QFile::encodeName(url)); if (id == 0) { out << "Could not stat file: " << url << endl; continue; } - if (tr.inPhaseOne(id)) { + if (tr->inPhaseOne(id)) { out << "Skipping: " << url << " Reason: Already scheduled for indexing\n"; continue; } - if (!tr.documentData(id).isEmpty()) { + if (!tr->documentData(id).isEmpty()) { out << "Skipping: " << url << " Reason: Already indexed\n"; continue; } - Indexer indexer(url, &tr); + Indexer indexer(url, tr.get()); out << "Indexing " << url << endl; indexer.index(); + if (i % 5 == 0) { + tr->commit(); + tr.reset(new Transaction(db, Transaction::ReadWrite)); + } } - tr.commit(); + tr->commit(); out << "File(s) indexed\n"; return 0; @@ -248,24 +254,28 @@ return 1; } - Transaction tr(db, Transaction::ReadWrite); + auto tr = std::unique_ptr(new Transaction(db, Transaction::ReadWrite)); for (int i = 1; i < parser.positionalArguments().size(); ++i) { const QString url = QFileInfo(parser.positionalArguments().at(i)).absoluteFilePath(); quint64 id = filePathToId(QFile::encodeName(url)); if (id == 0) { out << "Could not stat file: " << url << endl; continue; } - if (tr.documentData(id).isEmpty()) { + if (tr->documentData(id).isEmpty()) { out << "Skipping: " << url << " Reason: Not yet indexed\n"; continue; } - Indexer indexer(url, &tr); + Indexer indexer(url, tr.get()); out << "Clearing " << url << endl; - tr.removeDocument(id); + tr->removeDocument(id); + if (i % 5 == 0) { + tr->commit(); + tr.reset(new Transaction(db, Transaction::ReadWrite)); + } } - tr.commit(); + tr->commit(); out << "File(s) cleared\n"; return 0;