Only warn once about disk shortage in case database and log file are on the same device (e.g. both on / )

Signed-off-by: DL6ER <dl6er@dl6er.de>
This commit is contained in:
DL6ER
2023-02-06 21:16:23 +01:00
parent d7da3f7996
commit 4ee054b962
4 changed files with 39 additions and 16 deletions
+3 -6
View File
@@ -685,11 +685,11 @@ void log_resource_shortage(const double load, const int nprocs, const int shmem,
else if(disk > -1)
{
// Get filesystem details for this path
struct fstab *fsdetails = get_filesystem_details(path);
struct mntent *fsdetails = get_filesystem_details(path);
// Create plain message
if(fsdetails != NULL)
ret = snprintf(buf, sizeof(buf), "Disk shortage ahead: %d%% is used (%s) on filesystem mounted at %s", disk, msg, fsdetails->fs_file);
ret = snprintf(buf, sizeof(buf), "Disk shortage ahead: %d%% is used (%s) on filesystem mounted at %s", disk, msg, fsdetails->mnt_dir);
else
ret = snprintf(buf, sizeof(buf), "Disk shortage ahead: %d%% is used (%s) on partition containing the file %s", disk, msg, path);
@@ -708,16 +708,13 @@ void log_resource_shortage(const double load, const int nprocs, const int shmem,
// Create HTML message
if(fsdetails != NULL)
ret = snprintf(buf, sizeof(buf), "Disk shortage ahead: <strong>%d%%</strong> is used (%s) on filesystem mounted at <code>%s</code>",
disk, msg, fsdetails->fs_file);
disk, msg, fsdetails->mnt_dir);
else
ret = snprintf(buf, sizeof(buf), "Disk shortage ahead: <strong>%d%%</strong> is used (%s) on partition containing the file <code>%s</code>",
disk, msg, path);
if(ret > (int)sizeof(buf))
log_warn("log_resource_shortage(): Buffer too small to hold HTML message, warning truncated");
// Rewind fsdetails to the beginning of the list
endfsent();
add_html_message(item, buf);
}
}
+9 -6
View File
@@ -250,26 +250,29 @@ unsigned int get_path_usage(const char *path, char buffer[64])
}
// Get the filesystem where the given path is located
// Credits: https://stackoverflow.com/a/40660348/2087442
struct fstab *get_filesystem_details(const char *path) {
struct mntent *get_filesystem_details(const char *path)
{
/* stat the file in question */
struct stat path_stat;
stat(path, &path_stat);
/* iterate through the list of devices */
struct fstab *fs = NULL;
while( (fs = getfsent()) )
FILE *aFile = setmntent("/proc/mounts", "r");
struct mntent *ent;
while((ent = getmntent(aFile)) != NULL)
{
/* stat the mount point */
struct stat dev_stat;
stat(fs->fs_file, &dev_stat);
stat(ent->mnt_dir, &dev_stat);
/* check if our file and the mount point are on the same device */
if( dev_stat.st_dev == path_stat.st_dev )
break;
}
return fs;
endmntent(aFile);
return ent;
}
// Credits: https://stackoverflow.com/a/55410469
+3 -3
View File
@@ -12,8 +12,8 @@
#include <stdbool.h>
#include <sys/stat.h>
// getfsent()
#include <fstab.h>
// setmntent()
#include <mntent.h>
#define ZIP_ROTATIONS 3
#define MAX_ROTATIONS 15
@@ -25,7 +25,7 @@ unsigned long long get_FTL_db_filesize(void);
void get_permission_string(char permissions[10], struct stat *st);
void ls_dir(const char* path);
unsigned int get_path_usage(const char *path, char buffer[64]);
struct fstab *get_filesystem_details(const char *path);
struct mntent *get_filesystem_details(const char *path);
bool directory_exists(const char *path);
void rotate_files(const char *path, char **first_file);
+24 -1
View File
@@ -276,6 +276,18 @@ static void runGC(const time_t now, time_t *lastGCrun)
DBdeleteoldqueries = true;
}
static bool check_files_on_same_device(const char *path1, const char *path2)
{
struct stat s1, s2;
if(stat(path1, &s1) != 0 || stat(path2, &s2) != 0)
{
log_warn("check_files_on_same_device(): stat() failed: %s", strerror(errno));
return false;
}
return s1.st_dev == s2.st_dev;
}
void *GC_thread(void *val)
{
// Set thread name
@@ -292,6 +304,9 @@ void *GC_thread(void *val)
unsigned int LastLogStorageUsage = 0;
unsigned int LastDBStorageUsage = 0;
bool db_and_log_on_same_dev = false;
db_and_log_on_same_dev = check_files_on_same_device(config.files.database.v.s, config.files.log.ftl.v.s);
// Create inotify watcher for pihole.toml config file
watch_config(true);
@@ -319,9 +334,17 @@ void *GC_thread(void *val)
// Check available resources
if(now - lastResourceCheck >= RCinterval)
{
// Check load averages
check_load();
// Check disk space of database file
LastDBStorageUsage = check_space(config.files.database.v.s, LastDBStorageUsage);
LastLogStorageUsage = check_space(config.files.log.ftl.v.s, LastLogStorageUsage);
// Check disk space of log file only if they are not on
// the same file system
if(!db_and_log_on_same_dev)
LastLogStorageUsage = check_space(config.files.log.ftl.v.s, LastLogStorageUsage);
lastResourceCheck = now;
}