]> granicus.if.org Git - vnstat/commitdiff
expose SQLite synchronous flag as DatabaseSynchronous in configuration with default...
authorTeemu Toivola <git@humdi.net>
Mon, 13 May 2019 17:25:11 +0000 (20:25 +0300)
committerTeemu Toivola <git@humdi.net>
Mon, 13 May 2019 17:25:11 +0000 (20:25 +0300)
CHANGES
UPGRADE.md
cfg/vnstat.conf
man/vnstat.conf.5
src/cfg.c
src/cfgoutput.c
src/common.h
src/dbsql.c

diff --git a/CHANGES b/CHANGES
index 82d7e73e70802779ba95bfa4ae4197435665f9e4..4e47643480bd154ca8d5c844e7033dc83b5e5263 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -11,6 +11,9 @@
      Write-Ahead Logging mode which may provide some disk i/o benefits,
      see https://www.sqlite.org/wal.html for more details and note that
      SQLite 3.22.0 or later is required to support read-only operations
+   - Add configuration option DatabaseSynchronous for changing the SQLite
+     setting of the "synchronous" flag, see
+     https://www.sqlite.org/pragma.html#pragma_synchronous for more details
    - Show warning in log if writing cached data to database is slow
    - Try database query for up to 5 seconds when database is busy or locked
      instead of giving up immediately
index 9147a7e846fdefde46b1ab29eafe7ada9c1bc4b1..c4448db68cac11aba7a5d0469b73b166e888ada0 100644 (file)
@@ -1,7 +1,7 @@
 
 # New configuration settings
 
- * 2.3: WriteAheadLoggingDatabase
+ * 2.3: WriteAheadLoggingDatabase, DatabaseSynchronous
 
  * 2.2: 64bitInterfaceCounters
 
index ad178e35961ff442b185b0a08f08bb046846c4b7..72bd8bc3ca08190778c4a084e22502703ec2f0fd 100644 (file)
@@ -151,6 +151,10 @@ PidFile "/var/run/vnstat/vnstat.pid"
 # use SQLite Write-Ahead Logging mode (1 = enabled, 0 = disabled)
 WriteAheadLoggingDatabase 0
 
+# change the setting of the SQLite "synchronous" flag
+# (-1 = auto, 0 = off, 1, = normal, 2 = full, 3 = extra)
+DatabaseSynchronous -1
+
 
 # vnstati
 ##
index 01584f703864e7541174a7526be74e6e87e265a8..50f5ec418fec4eb8690ac26bccf9ea272adabbe5 100644 (file)
@@ -212,6 +212,18 @@ defines for how many past days entries will be stored. Set to -1 for
 unlimited entries or to 0 to disable the data collection of this
 resolution.
 
+.TP
+.B DatabaseSynchronous
+Change the setting of the SQLite "synchronous" flag which controls how much
+care is taken to ensure disk writes have fully completed when writing data to
+the database before continuing other actions. Higher values take extra steps
+to ensure data safety at the cost of slower performance. A value of 0 will
+result in all handling being left to the filesystem itself. Set to -1 to
+select the default value according to database mode controlled by
+.B WriteAheadLoggingDatabase
+setting. See SQLite documentation for more details regarding values from 1
+to 3. Value range: -1..3
+
 .TP
 .B HourlyDays
 Data retention duration for the one hour resolution entries. The configuration
index 69177375336d3f1f87e50ab38041392155f033c1..9a4d16132e3e50ee3ef55ed64a62e5c48f299379 100644 (file)
--- a/src/cfg.c
+++ b/src/cfg.c
@@ -65,6 +65,7 @@ int loadcfg(const char *cfgfile)
                 {"PidFile", cfg.pidfile, 0, 512, 0},
                 {"64bitInterfaceCounters", 0, &cfg.is64bit, 0, 0},
                 {"WriteAheadLoggingDatabase", 0, &cfg.waldb, 0, 0},
+                {"DatabaseSynchronous", 0, &cfg.dbsynchronous, 0, 0},
                 {"HeaderFormat", cfg.hformat, 0, 64, 0},
                 {"HourlyRate", 0, &cfg.hourlyrate, 0, 0},
                 {"SummaryRate", 0, &cfg.summaryrate, 0, 0},
@@ -192,6 +193,7 @@ void validatecfg(void)
        validateint("UpdateFileOwner", &cfg.updatefileowner, UPDATEFILEOWNER, 0, 2);
        validateint("64bitInterfaceCounters", &cfg.is64bit, IS64BIT, -2, 1);
        validatebool("WriteAheadLoggingDatabase", &cfg.waldb, WALDB);
+       validateint("DatabaseSynchronous", &cfg.dbsynchronous, DBSYNCHRONOUS, -1, 3);
        validatebool("TransparentBg", &cfg.transbg, TRANSBG);
        validatebool("HourlyRate", &cfg.hourlyrate, HOURLYRATE);
        validatebool("SummaryRate", &cfg.summaryrate, SUMMARYRATE);
@@ -342,6 +344,7 @@ void defaultcfg(void)
        strncpy_nt(cfg.pidfile, PIDFILE, 512);
        cfg.is64bit = IS64BIT;
        cfg.waldb = WALDB;
+       cfg.dbsynchronous = DBSYNCHRONOUS;
 
        cfg.transbg = TRANSBG;
        strncpy_nt(cfg.cbg, CBACKGROUND, 8);
index c24a52d6314010728293fe7788a60523c056ad11..e6dce2ae257093ad5b21057c7e1f3ae945ef6687 100644 (file)
@@ -166,6 +166,10 @@ void printcfgfile(void)
        printf("# use SQLite Write-Ahead Logging mode (1 = enabled, 0 = disabled)\n");
        printf("WriteAheadLoggingDatabase %d\n\n", cfg.waldb);
 
+       printf("# change the setting of the SQLite \"synchronous\" flag\n");
+       printf("# (-1 = auto, 0 = off, 1, = normal, 2 = full, 3 = extra)\n");
+       printf("DatabaseSynchronous %d\n\n", cfg.dbsynchronous);
+
        printf("\n");
 
        /* vnstati section */
index 296fa48ac53e26207d665ff60a7b577b9e95f21a..15abcc8c5284565676d06001e7a1da878b483cb5 100644 (file)
@@ -234,6 +234,7 @@ and most can be changed later from the config file.
 #define WALDB 0
 #define WALDBCHECKPOINTINTERVALMINS 240
 #define SLOWDBFLUSHWARNLIMIT 3.0
+#define DBSYNCHRONOUS -1
 
 /* database read timeout */
 #define DBREADTIMEOUTSECS 5
@@ -269,7 +270,7 @@ typedef struct {
        char cline[8], clinel[8], cvnstat[8], crx[8], crxd[8], ctx[8], ctxd[8];
        int32_t unitmode, rateunitmode, rateunit, bvar, qmode, sampletime, hourlyrate, summaryrate;
        int32_t monthrotate, monthrotateyears, maxbw, spacecheck, trafficlessentries, transbg, ostyle;
-       int32_t defaultdecimals, hourlydecimals, hourlystyle, is64bit, waldb;
+       int32_t defaultdecimals, hourlydecimals, hourlystyle, is64bit, waldb, dbsynchronous;
        char cfgfile[512], logfile[512], pidfile[512];
        char daemonuser[33], daemongroup[33];
        int32_t timesyncwait, updateinterval, pollinterval, saveinterval, offsaveinterval, savestatus;
index 73babe8d82debe5199f502b829dd92fc72a414e5..584ccf07d02302b0d1cb2a71cdb719e07e3be5e7 100644 (file)
@@ -165,6 +165,7 @@ int db_validate(const int readonly)
 int db_setpragmas(void)
 {
        int rc;
+       char sql[25];
        sqlite3_stmt *sqlstmt;
 
        /* enable use of foreign keys */
@@ -204,18 +205,36 @@ int db_setpragmas(void)
                if (!db_exec("PRAGMA journal_mode = WAL")) {
                        return 0;
                }
-               if (!db_exec("PRAGMA synchronous = 1")) {
-                       return 0;
-               }
        } else {
                if (!db_exec("PRAGMA journal_mode = DELETE")) {
                        return 0;
                }
+       }
+#endif
+
+       /* set synchronous */
+       if (cfg.dbsynchronous == -1) {
+#if HAVE_DECL_SQLITE_CHECKPOINT_RESTART
+               if (cfg.waldb) {
+                       if (!db_exec("PRAGMA synchronous = 1")) {
+                               return 0;
+                       }
+               } else {
+                       if (!db_exec("PRAGMA synchronous = 2")) {
+                               return 0;
+                       }
+               }
+#else
                if (!db_exec("PRAGMA synchronous = 2")) {
                        return 0;
                }
-       }
 #endif
+       } else {
+               snprintf(sql, 25, "PRAGMA synchronous = %d", cfg.dbsynchronous);
+               if (!db_exec(sql)) {
+                       return 0;
+               }
+       }
 
        return 1;
 }