Clang: Add busy timeout handler to database

You use now a busy timeout of one second. This is preventing the throwing
of a exception for a busy time under one second.

Change-Id: Iae800a525ad009b594c29883ffb243c1be8b3874
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Marco Bubke
2018-03-28 17:55:14 +02:00
parent 5870905db6
commit 68c1140d27
8 changed files with 59 additions and 10 deletions

View File

@@ -28,6 +28,10 @@
#include "sqlitetable.h"
#include "sqlitetransaction.h"
#include <chrono>
using namespace std::chrono_literals;
namespace Sqlite {
Database::Database()
@@ -36,7 +40,15 @@ Database::Database()
}
Database::Database(Utils::PathString &&databaseFilePath, JournalMode journalMode)
: m_databaseBackend(*this)
: Database(std::move(databaseFilePath), 0ms, journalMode)
{
}
Database::Database(Utils::PathString &&databaseFilePath,
std::chrono::milliseconds busyTimeout,
JournalMode journalMode)
: m_databaseBackend(*this),
m_busyTimeout(busyTimeout)
{
setJournalMode(journalMode);
open(std::move(databaseFilePath));
@@ -46,6 +58,7 @@ void Database::open()
{
m_databaseBackend.open(m_databaseFilePath, m_openMode);
m_databaseBackend.setJournalMode(m_journalMode);
m_databaseBackend.setBusyTimeout(m_busyTimeout);
initializeTables();
m_isOpen = true;
}
@@ -129,6 +142,4 @@ DatabaseBackend &Database::backend()
return m_databaseBackend;
}
} // namespace Sqlite

View File

@@ -32,6 +32,7 @@
#include <utils/smallstring.h>
#include <chrono>
#include <mutex>
#include <vector>
@@ -52,7 +53,11 @@ public:
using WriteStatement = Sqlite::WriteStatement;
Database();
Database(Utils::PathString &&databaseFilePath, JournalMode journalMode=JournalMode::Wal);
Database(Utils::PathString &&databaseFilePath,
JournalMode journalMode=JournalMode::Wal);
Database(Utils::PathString &&databaseFilePath,
std::chrono::milliseconds busyTimeout = {},
JournalMode journalMode=JournalMode::Wal);
Database(const Database &) = delete;
Database &operator=(const Database &) = delete;
@@ -138,6 +143,7 @@ private:
DatabaseBackend m_databaseBackend;
std::vector<Table> m_sqliteTables;
std::mutex m_databaseMutex;
std::chrono::milliseconds m_busyTimeout;
JournalMode m_journalMode = JournalMode::Wal;
OpenMode m_openMode = OpenMode::ReadWrite;
bool m_isOpen = false;

View File

@@ -105,7 +105,6 @@ void DatabaseBackend::open(Utils::SmallStringView databaseFilePath, OpenMode mod
checkDatabaseCouldBeOpened(resultCode);
registerBusyHandler();
registerRankingFunction();
cacheTextEncoding();
}
@@ -212,7 +211,9 @@ void DatabaseBackend::closeWithoutException()
void DatabaseBackend::registerBusyHandler()
{
sqlite3_busy_handler(sqliteDatabaseHandle(), &busyHandlerCallback, nullptr);
int resultCode = sqlite3_busy_handler(sqliteDatabaseHandle(), &busyHandlerCallback, nullptr);
checkIfBusyTimeoutWasSet(resultCode);
}
void DatabaseBackend::registerRankingFunction()
@@ -326,6 +327,12 @@ void DatabaseBackend::checkIfLogCouldBeCheckpointed(int resultCode)
throwException("SqliteDatabaseBackend::checkpointFullWalLog: WAL log could not be checkpointed!");
}
void DatabaseBackend::checkIfBusyTimeoutWasSet(int resultCode)
{
if (resultCode != SQLITE_OK)
throwException("SqliteDatabaseBackend::setBusyTimeout: Busy timeout cannot be set!");
}
namespace {
template<std::size_t Size>
int indexOfPragma(Utils::SmallStringView pragma, const Utils::SmallStringView (&pragmas)[Size])
@@ -395,6 +402,11 @@ int DatabaseBackend::openMode(OpenMode mode)
return sqliteMode;
}
void DatabaseBackend::setBusyTimeout(std::chrono::milliseconds timeout)
{
sqlite3_busy_timeout(m_databaseHandle, int(timeout.count()));
}
void DatabaseBackend::throwExceptionStatic(const char *whatHasHappens)
{
throw Exception(whatHasHappens);

View File

@@ -29,6 +29,8 @@
#include <utils/smallstringvector.h>
#include <chrono>
struct sqlite3;
namespace Sqlite {
@@ -81,6 +83,8 @@ public:
static int openMode(OpenMode);
void setBusyTimeout(std::chrono::milliseconds timeout);
protected:
bool databaseIsOpen() const;
@@ -105,6 +109,7 @@ protected:
void checkInitializeSqliteLibraryWasSuccesful(int resultCode);
void checkShutdownSqliteLibraryWasSuccesful(int resultCode);
void checkIfLogCouldBeCheckpointed(int resultCode);
void checkIfBusyTimeoutWasSet(int resultCode);
static Utils::SmallStringView journalModeToPragma(JournalMode journalMode);
static JournalMode pragmaToJournalMode(Utils::SmallStringView pragma);

View File

@@ -39,6 +39,10 @@
#include <utils/hostosinfo.h>
#include <chrono>
using namespace std::chrono_literals;
namespace ClangPchManager {
namespace {
@@ -55,7 +59,7 @@ QString backendProcessPath()
class ClangPchManagerPluginData
{
public:
Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}};
Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}, 1000ms};
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
ClangBackEnd::FilePathCaching filePathCache{database};
PrecompiledHeaderStorage<> preCompiledHeaderStorage{database};

View File

@@ -52,6 +52,10 @@
#include <QDir>
#include <QApplication>
#include <chrono>
using namespace std::chrono_literals;
namespace ClangRefactoring {
namespace {
@@ -74,7 +78,7 @@ public:
using QuerySqliteReadStatementFactory = QuerySqliteStatementFactory<Sqlite::Database,
Sqlite::ReadStatement>;
Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}};
Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}, 1000ms};
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
ClangBackEnd::FilePathCaching filePathCache{database};
RefactoringClient refactoringClient;

View File

@@ -43,8 +43,11 @@
#include <QTemporaryDir>
#include <QTimer>
#include <chrono>
#include <thread>
using namespace std::chrono_literals;
using ClangBackEnd::ClangPathWatcher;
using ClangBackEnd::ConnectionServer;
using ClangBackEnd::PchCreator;
@@ -109,7 +112,7 @@ int main(int argc, char *argv[])
const QString connectionName = arguments[0];
const QString databasePath = arguments[1];
Sqlite::Database database{Utils::PathString{databasePath}};
Sqlite::Database database{Utils::PathString{databasePath}, 1000ms};
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
ClangBackEnd::FilePathCaching filePathCache{database};
ClangPathWatcher<QFileSystemWatcher, QTimer> includeWatcher(filePathCache);

View File

@@ -35,6 +35,10 @@
#include <refactoringclientproxy.h>
#include <symbolindexing.h>
#include <chrono>
using namespace std::chrono_literals;
using ClangBackEnd::FilePathCaching;
using ClangBackEnd::RefactoringClientProxy;
using ClangBackEnd::RefactoringServer;
@@ -74,7 +78,7 @@ int main(int argc, char *argv[])
const QString connectionName = arguments[0];
const QString databasePath = arguments[1];
Sqlite::Database database{Utils::PathString{databasePath}};
Sqlite::Database database{Utils::PathString{databasePath}, 1000ms};
RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
FilePathCaching filePathCache{database};
SymbolIndexing symbolIndexing{database, filePathCache};