[tracker/libtracker-miner] Added disk space checking back
- From: Martyn James Russell <mr src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/libtracker-miner] Added disk space checking back
- Date: Thu, 27 Aug 2009 16:50:17 +0000 (UTC)
commit a7e95eb58858e5e5c925e5afe11a7a9882dc275c
Author: Martyn Russell <martyn lanedo com>
Date: Thu Aug 27 17:24:05 2009 +0100
Added disk space checking back
src/tracker-miner-fs/tracker-miner-files.c | 138 ++++++++++++++++++++++++++-
1 files changed, 132 insertions(+), 6 deletions(-)
---
diff --git a/src/tracker-miner-fs/tracker-miner-files.c b/src/tracker-miner-fs/tracker-miner-files.c
index 85e22bd..ff24561 100644
--- a/src/tracker-miner-fs/tracker-miner-files.c
+++ b/src/tracker-miner-fs/tracker-miner-files.c
@@ -20,20 +20,32 @@
#include "config.h"
+#include <sys/statvfs.h>
+
+#include <glib/gi18n.h>
+
#include <libtracker-common/tracker-ontology.h>
#include <libtracker-common/tracker-storage.h>
#include <libtracker-common/tracker-type-utils.h>
#include <libtracker-common/tracker-utils.h>
+#include <libtracker-miner/tracker-miner.h>
+
#include "tracker-miner-files.h"
#include "tracker-config.h"
+#define DISK_SPACE_CHECK_FREQUENCY 10
+
#define TRACKER_MINER_FILES_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_MINER_FILES, TrackerMinerFilesPrivate))
struct TrackerMinerFilesPrivate {
TrackerConfig *config;
TrackerStorage *storage;
+
GVolumeMonitor *volume_monitor;
+
+ guint disk_space_check_id;
+ guint disk_space_pause_cookie;
};
enum {
@@ -59,6 +71,11 @@ static void mount_pre_unmount_cb (GVolumeMonitor *volume_moni
GMount *mount,
TrackerMinerFiles *mf);
static void initialize_removable_devices (TrackerMinerFiles *mf);
+static void disk_space_check_start (TrackerMinerFiles *mf);
+static void disk_space_check_stop (TrackerMinerFiles *mf);
+static void low_disk_space_limit_cb (GObject *gobject,
+ GParamSpec *arg1,
+ gpointer user_data);
static gboolean miner_files_check_file (TrackerMinerFS *fs,
GFile *file);
static gboolean miner_files_check_directory (TrackerMinerFS *fs,
@@ -165,6 +182,8 @@ miner_files_finalize (GObject *object)
priv = TRACKER_MINER_FILES_GET_PRIVATE (object);
+ disk_space_check_stop (TRACKER_MINER_FILES (object));
+
g_object_unref (priv->config);
#ifdef HAVE_HAL
@@ -182,22 +201,22 @@ miner_files_finalize (GObject *object)
static void
miner_files_constructed (GObject *object)
{
- TrackerMinerFilesPrivate *priv;
+ TrackerMinerFiles *mf;
TrackerMinerFS *fs;
GSList *dirs;
G_OBJECT_CLASS (tracker_miner_files_parent_class)->constructed (object);
- priv = TRACKER_MINER_FILES_GET_PRIVATE (object);
+ mf = TRACKER_MINER_FILES (object);
fs = TRACKER_MINER_FS (object);
- if (!priv->config) {
+ if (!mf->private->config) {
g_critical ("No config. This is mandatory");
g_assert_not_reached ();
}
/* Fill in directories to inspect */
- dirs = tracker_config_get_index_single_directories (priv->config);
+ dirs = tracker_config_get_index_single_directories (mf->private->config);
while (dirs) {
GFile *file;
@@ -221,7 +240,7 @@ miner_files_constructed (GObject *object)
dirs = dirs->next;
}
- dirs = tracker_config_get_index_recursive_directories (priv->config);
+ dirs = tracker_config_get_index_recursive_directories (mf->private->config);
while (dirs) {
GFile *file;
@@ -246,8 +265,13 @@ miner_files_constructed (GObject *object)
}
#ifdef HAVE_HAL
- initialize_removable_devices (TRACKER_MINER_FILES (fs));
+ initialize_removable_devices (mf);
#endif
+ g_signal_connect (mf->private->config, "notify::low-disk-space-limit",
+ G_CALLBACK (low_disk_space_limit_cb),
+ mf);
+
+ disk_space_check_start (mf);
}
#ifdef HAVE_HAL
@@ -311,6 +335,108 @@ mount_pre_unmount_cb (GVolumeMonitor *volume_monitor,
}
static gboolean
+disk_space_check (TrackerMinerFiles *mf)
+{
+ struct statvfs st;
+ gint limit;
+ gchar *data_dir;
+
+ limit = tracker_config_get_low_disk_space_limit (mf->private->config);
+
+ if (limit < 1) {
+ return FALSE;
+ }
+
+ data_dir = g_build_filename (g_get_user_cache_dir (), "tracker", NULL);
+
+ if (statvfs (data_dir, &st) == -1) {
+ g_warning ("Could not statvfs() '%s'", data_dir);
+ g_free (data_dir);
+ return FALSE;
+ }
+
+ g_free (data_dir);
+
+ if (((long long) st.f_bavail * 100 / st.f_blocks) <= limit) {
+ g_message ("WARNING: Available disk space is below configured "
+ "threshold for acceptable working (%d%%)",
+ limit);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+disk_space_check_cb (gpointer user_data)
+{
+ TrackerMinerFiles *mf = user_data;
+
+ if (disk_space_check (mf)) {
+ mf->private->disk_space_pause_cookie =
+ tracker_miner_pause (TRACKER_MINER (mf),
+ g_get_application_name (),
+ _("Low disk space"),
+ NULL);
+ } else {
+ tracker_miner_resume (TRACKER_MINER (mf),
+ mf->private->disk_space_pause_cookie,
+ NULL);
+ mf->private->disk_space_pause_cookie = 0;
+ }
+
+ return TRUE;
+}
+
+static void
+disk_space_check_start (TrackerMinerFiles *mf)
+{
+ gint limit;
+
+ if (mf->private->disk_space_check_id != 0) {
+ return;
+ }
+
+ limit = tracker_config_get_low_disk_space_limit (mf->private->config);
+
+ if (limit != -1) {
+ g_message ("Starting disk space check for every %d seconds",
+ DISK_SPACE_CHECK_FREQUENCY);
+ mf->private->disk_space_check_id =
+ g_timeout_add_seconds (DISK_SPACE_CHECK_FREQUENCY,
+ disk_space_check_cb,
+ mf);
+
+ /* Call the function now too to make sure we have an
+ * initial value too!
+ */
+ disk_space_check_cb (mf);
+ } else {
+ g_message ("Not setting disk space, configuration is set to -1 (disabled)");
+ }
+}
+
+static void
+disk_space_check_stop (TrackerMinerFiles *mf)
+{
+ if (mf->private->disk_space_check_id) {
+ g_message ("Stopping disk space check");
+ g_source_remove (mf->private->disk_space_check_id);
+ mf->private->disk_space_check_id = 0;
+ }
+}
+
+static void
+low_disk_space_limit_cb (GObject *gobject,
+ GParamSpec *arg1,
+ gpointer user_data)
+{
+ TrackerMinerFiles *mf = user_data;
+
+ disk_space_check_cb (mf);
+}
+
+static gboolean
miner_files_check_file (TrackerMinerFS *fs,
GFile *file)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]