Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Try to reopen gravity database when not available #699

Merged
merged 2 commits into from
Feb 25, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 21 additions & 14 deletions src/database/gravity-db.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ static bool get_client_groupids(const clientsData* client, char **groups)
*groups = NULL;

// Do not proceed when database is not available
if(!gravity_database_avail)
if(!gravity_database_avail && !gravityDB_open())
{
logg("get_client_groupids(): Gravity database not available");
return false;
Expand All @@ -134,7 +134,6 @@ static bool get_client_groupids(const clientsData* client, char **groups)
logg("get_client_groupids(%s) - SQL error prepare (%i): %s",
querystr, rc, sqlite3_errmsg(gravity_db));
sqlite3_finalize(table_stmt);
gravityDB_close();
free(querystr);
return false;
}
Expand Down Expand Up @@ -162,7 +161,6 @@ static bool get_client_groupids(const clientsData* client, char **groups)
logg("get_client_groupids(%s) - SQL error step (%i): %s",
querystr, rc, sqlite3_errmsg(gravity_db));
sqlite3_finalize(table_stmt);
gravityDB_close();
free(querystr);
return false;
}
Expand Down Expand Up @@ -191,7 +189,6 @@ static bool get_client_groupids(const clientsData* client, char **groups)
logg("get_client_groupids(%s) - SQL error prepare (%i): %s",
querystr, rc, sqlite3_errmsg(gravity_db));
sqlite3_finalize(table_stmt);
gravityDB_close();
free(querystr);
return false;
}
Expand All @@ -218,12 +215,12 @@ static bool get_client_groupids(const clientsData* client, char **groups)
logg("get_client_groupids(%s) - SQL error step (%i): %s",
querystr, rc, sqlite3_errmsg(gravity_db));
sqlite3_finalize(table_stmt);
gravityDB_close();
free(querystr);
return false;
}
// Finalize statement
gravityDB_finalizeTable();

// Free allocated memory and return result
free(querystr);
return true;
Expand All @@ -232,7 +229,7 @@ static bool get_client_groupids(const clientsData* client, char **groups)
bool gravityDB_prepare_client_statements(clientsData* client)
{
// Return early if gravity database is not available
if(!gravity_database_avail)
if(!gravity_database_avail && !gravityDB_open())
return false;

if(config.debug & DEBUG_DATABASE)
Expand Down Expand Up @@ -297,18 +294,26 @@ inline void gravityDB_finalize_client_statements(clientsData* client)

void gravityDB_reload_client_statements(void)
{
// Set SQLite3 busy timeout to a user-defined value (defaults to 1 second)
// to avoid immediate failures when the gravity database is still busy
// writing the changes to disk
sqlite3_busy_timeout(gravity_db, DATABASE_BUSY_TIMEOUT);

for(int i=0; i < counters->clients; i++)
{
clientsData* client = getClient(i, true);
if(client != NULL)
gravityDB_prepare_client_statements(client);
}

// Reset SQLite3 busy timeout to zero
sqlite3_busy_timeout(gravity_db, 0);
}

void gravityDB_close(void)
{
// Return early if gravity database is not available
if(!gravity_database_avail)
if(!gravity_database_avail && !gravityDB_open())
return;

// Finalize list statements
Expand All @@ -330,7 +335,7 @@ void gravityDB_close(void)
// a table which is specified when calling this function
bool gravityDB_getTable(const unsigned char list)
{
if(!gravity_database_avail)
if(!gravity_database_avail && !gravityDB_open())
{
logg("gravityDB_getTable(%u): Gravity database not available", list);
return false;
Expand Down Expand Up @@ -419,7 +424,7 @@ void gravityDB_finalizeTable(void)
// encounter any error
int gravityDB_count(const unsigned char list)
{
if(!gravity_database_avail)
if(!gravity_database_avail && !gravityDB_open())
{
logg("gravityDB_count(%d): Gravity database not available", list);
return DB_FAILED;
Expand Down Expand Up @@ -488,7 +493,7 @@ int gravityDB_count(const unsigned char list)
static bool domain_in_list(const char *domain, sqlite3_stmt* stmt, const char* listname)
{
// Do not try to bind text to statement when database is not available
if(!gravity_database_avail)
if(!gravity_database_avail && !gravityDB_open())
{
logg("domain_in_list(%s): Gravity database not available", domain);
return false;
Expand Down Expand Up @@ -617,16 +622,18 @@ bool gravityDB_get_regex_client_groups(clientsData* client, const int numregex,
while((rc = sqlite3_step(query_stmt)) == SQLITE_ROW)
{
const int result = sqlite3_column_int(query_stmt, 0);
for(int i = 0; i < numregex; i++)
for(int regexID = 0; regexID < numregex; regexID++)
{
if(regexid[i] == result)
if(regexid[regexID] == result)
{
unsigned int regexID = i;
if(type == REGEX_WHITELIST)
regexID += counters->num_regex[REGEX_BLACKLIST];

set_per_client_regex(clientID, regexID, true);

if(config.debug & DEBUG_REGEX)
logg("Regex %s: Enabling regex with DB ID %i for client %s", regextype[type], regexid[i], getstr(client->ippos));
logg("Regex %s: Enabling regex with DB ID %i for client %s", regextype[type], regexid[regexID], getstr(client->ippos));

break;
}
}
Expand Down