[tracker/tracker-0.6] Check space before creating DBs && disable indexer API when paused



commit 3a1c59a6766bbcb0790bc44dbf035c95169a9036
Author: Martyn Russell <martyn imendio com>
Date:   Mon Jun 1 11:43:32 2009 +0100

    Check space before creating DBs && disable indexer API when paused
    
    The debugging is also a bit clearer when we are below the disk space
    threshold as set in the config. The frequency of these messages is
    slightly longer too so we don't fill the logs up so quickly.
---
 src/libtracker-common/tracker-file-utils.c   |   40 ++++++++++++++++++++++++
 src/libtracker-common/tracker-file-utils.h   |    3 ++
 src/libtracker-db/tracker-db-index-manager.c |    6 ++++
 src/libtracker-db/tracker-db-manager.c       |   15 +++++++--
 src/libtracker-db/tracker-db-manager.h       |    2 +-
 src/tracker-indexer/tracker-main.c           |    5 ++-
 src/tracker-utils/tracker-processes.c        |   10 +++++-
 src/trackerd/tracker-backup.c                |   27 +++++++++++++----
 src/trackerd/tracker-keywords.c              |   42 +++++++++++++++++++++++++-
 src/trackerd/tracker-main.c                  |   11 +++++--
 src/trackerd/tracker-metadata.c              |   19 +++++++++++-
 src/trackerd/tracker-processor.c             |    2 +-
 src/trackerd/tracker-status.c                |    4 ++-
 13 files changed, 166 insertions(+), 20 deletions(-)

diff --git a/src/libtracker-common/tracker-file-utils.c b/src/libtracker-common/tracker-file-utils.c
index 1b330bb..7284470 100644
--- a/src/libtracker-common/tracker-file-utils.c
+++ b/src/libtracker-common/tracker-file-utils.c
@@ -26,6 +26,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/statvfs.h>
 #include <fcntl.h>
 #include <limits.h>
 
@@ -318,6 +319,45 @@ tracker_file_get_path_and_name (const gchar *uri,
 
 }
 
+gboolean
+tracker_file_system_has_enough_space (const gchar *path,
+				      gulong       required_bytes)
+{
+	struct statvfs st;
+	gchar *str1;
+	gchar *str2;
+	gboolean enough;
+
+	g_return_val_if_fail (path != NULL, FALSE);
+
+	if (statvfs (path, &st) == -1) {
+		g_critical ("Could not statvfs() '%s'", path);
+		return FALSE;
+	}
+
+	str1 = g_format_size_for_display (required_bytes);
+	str2 = g_format_size_for_display (st.f_bsize * st.f_bavail);
+
+	enough = ((long long) st.f_bsize * st.f_bavail) <= required_bytes;
+
+	if (!enough) {
+		g_critical ("Not enough disk space to create databases, "
+			    "%s remaining, %s required as a minimum",
+			    str2,
+			    str1);
+	} else { 
+		g_message ("Checking for adequate disk space to create databases, "
+			   "%s remaining, %s required as a minimum",
+			   str2,
+			   str1);
+	}
+
+	g_free (str2);
+	g_free (str1);
+
+	return enough;
+}
+
 void
 tracker_path_remove (const gchar *uri)
 {
diff --git a/src/libtracker-common/tracker-file-utils.h b/src/libtracker-common/tracker-file-utils.h
index fc4d6b1..3f59cfc 100644
--- a/src/libtracker-common/tracker-file-utils.h
+++ b/src/libtracker-common/tracker-file-utils.h
@@ -41,6 +41,8 @@ gchar *  tracker_file_get_mime_type                (const gchar  *uri);
 void     tracker_file_get_path_and_name            (const gchar  *uri,
 						    gchar       **path,
 						    gchar       **name);
+gboolean tracker_file_system_has_enough_space      (const gchar  *path,
+						    gulong        required_bytes);
 void     tracker_path_remove                       (const gchar  *uri);
 gboolean tracker_path_is_in_path                   (const gchar  *path,
 						    const gchar  *in_path);
@@ -48,6 +50,7 @@ void     tracker_path_hash_table_filter_duplicates (GHashTable   *roots);
 GSList * tracker_path_list_filter_duplicates       (GSList       *roots,
 						    const gchar  *basename_exception_prefix);
 gchar *  tracker_path_evaluate_name                (const gchar  *uri);
+
 gboolean tracker_env_check_xdg_dirs                (void);
 
 #endif /* __LIBTRACKER_COMMON_FILE_UTILS_H__ */
diff --git a/src/libtracker-db/tracker-db-index-manager.c b/src/libtracker-db/tracker-db-index-manager.c
index 91a5bb2..2de51d3 100644
--- a/src/libtracker-db/tracker-db-index-manager.c
+++ b/src/libtracker-db/tracker-db-index-manager.c
@@ -34,6 +34,8 @@
 
 #define MAX_INDEX_FILE_SIZE 2000000000
 
+#define MIN_REQUIRED_SPACE  5242880
+
 typedef struct {
 	TrackerDBIndexType  type;
 	TrackerDBIndex	   *index;
@@ -183,6 +185,10 @@ tracker_db_index_manager_init (TrackerDBIndexManagerFlags flags,
 		return TRUE;
 	}
 
+	if (!tracker_file_system_has_enough_space (data_dir, MIN_REQUIRED_SPACE)) {
+		return FALSE;
+	}
+
 	g_message ("Merging old temporary indexes");
 
 	i = TRACKER_DB_INDEX_FILE;
diff --git a/src/libtracker-db/tracker-db-manager.c b/src/libtracker-db/tracker-db-manager.c
index a68c7ae..8771294 100644
--- a/src/libtracker-db/tracker-db-manager.c
+++ b/src/libtracker-db/tracker-db-manager.c
@@ -41,6 +41,9 @@
 /* ZLib buffer settings */
 #define ZLIB_BUF_SIZE		      8192
 
+/* Required minimum space needed to create databases (5Mb) */
+#define TRACKER_DB_MIN_REQUIRED_SPACE 5242880
+
 /* Default memory settings for databases */
 #define TRACKER_DB_PAGE_SIZE_DONT_SET -1
 
@@ -2136,7 +2139,7 @@ tracker_db_manager_ensure_locale (void)
 	g_free (stored_locale);
 }
 
-void
+gboolean
 tracker_db_manager_init (TrackerDBManagerFlags	flags,
 			 gboolean	       *first_time,
 			 gboolean	        shared_cache)
@@ -2153,7 +2156,7 @@ tracker_db_manager_init (TrackerDBManagerFlags	flags,
 	}
 
 	if (initialized) {
-		return;
+		return TRUE;
 	}
 
 	need_reindex = FALSE;
@@ -2267,7 +2270,7 @@ tracker_db_manager_init (TrackerDBManagerFlags	flags,
 	 */
 	if ((flags & TRACKER_DB_MANAGER_REMOVE_ALL) != 0) {
 		initialized = TRUE;
-		return;
+		return TRUE;
 	}
 
 	/* Set general database options */
@@ -2291,6 +2294,10 @@ tracker_db_manager_init (TrackerDBManagerFlags	flags,
 			*first_time = TRUE;
 		}
 
+		if (!tracker_file_system_has_enough_space (data_dir, TRACKER_DB_MIN_REQUIRED_SPACE)) {
+			return FALSE;
+		}
+
 		/* We call an internal version of this function here
 		 * because at the time 'initialized' = FALSE and that
 		 * will cause errors and do nothing.
@@ -2350,6 +2357,8 @@ tracker_db_manager_init (TrackerDBManagerFlags	flags,
 	tracker_db_manager_ensure_locale ();
 
 	initialized = TRUE;
+
+	return TRUE;
 }
 
 void
diff --git a/src/libtracker-db/tracker-db-manager.h b/src/libtracker-db/tracker-db-manager.h
index 1bd86be..3a0961d 100644
--- a/src/libtracker-db/tracker-db-manager.h
+++ b/src/libtracker-db/tracker-db-manager.h
@@ -64,7 +64,7 @@ typedef enum {
 
 GType	     tracker_db_get_type			    (void) G_GNUC_CONST;
 
-void	     tracker_db_manager_init			    (TrackerDBManagerFlags  flags,
+gboolean     tracker_db_manager_init			    (TrackerDBManagerFlags  flags,
 							     gboolean		   *first_time,
 							     gboolean 		    shared_cache);
 void	     tracker_db_manager_shutdown		    (void);
diff --git a/src/tracker-indexer/tracker-main.c b/src/tracker-indexer/tracker-main.c
index 908fa95..e22dbaa 100644
--- a/src/tracker-indexer/tracker-main.c
+++ b/src/tracker-indexer/tracker-main.c
@@ -363,7 +363,10 @@ main (gint argc, gchar *argv[])
 		flags |= TRACKER_DB_MANAGER_LOW_MEMORY_MODE;
 	}
 
-	tracker_db_manager_init (flags, NULL, FALSE);
+	if (!tracker_db_manager_init (flags, NULL, FALSE)) {
+		return EXIT_FAILURE;
+        }
+
 	if (!tracker_db_index_manager_init (0,
 					    tracker_config_get_min_bucket_count (config),
 					    tracker_config_get_max_bucket_count (config))) {
diff --git a/src/tracker-utils/tracker-processes.c b/src/tracker-utils/tracker-processes.c
index 0ff38b1..dae5140 100644
--- a/src/tracker-utils/tracker-processes.c
+++ b/src/tracker-utils/tracker-processes.c
@@ -247,11 +247,17 @@ main (int argc, char **argv)
 		g_log_set_default_handler (log_handler, NULL);
 
 		/* Clean up */
-		tracker_db_manager_init (TRACKER_DB_MANAGER_REMOVE_ALL, NULL, FALSE);
+		if (!tracker_db_manager_init (TRACKER_DB_MANAGER_REMOVE_ALL, NULL, FALSE)) {
+			return EXIT_FAILURE;
+		}
+
 		tracker_db_manager_remove_all ();
 		tracker_db_manager_shutdown ();
 
-		tracker_db_index_manager_init (TRACKER_DB_INDEX_MANAGER_REMOVE_ALL, 0, 0);
+		if (!tracker_db_index_manager_init (TRACKER_DB_INDEX_MANAGER_REMOVE_ALL, 0, 0)) {
+			return EXIT_FAILURE;
+		}
+
 		tracker_db_index_manager_remove_all ();
 		tracker_db_index_manager_shutdown ();
 
diff --git a/src/trackerd/tracker-backup.c b/src/trackerd/tracker-backup.c
index c184ffd..d7abaed 100644
--- a/src/trackerd/tracker-backup.c
+++ b/src/trackerd/tracker-backup.c
@@ -22,13 +22,14 @@
 
 #include <glib-object.h>
 #include <glib/gstdio.h>
+
 #include <libtracker-common/tracker-dbus.h>
 #include <libtracker-data/tracker-data-backup.h>
 
 #include "tracker-dbus.h"
 #include "tracker-indexer-client.h"
 #include "tracker-backup.h"
-
+#include "tracker-status.h"
 
 G_DEFINE_TYPE (TrackerBackup, tracker_backup, G_TYPE_OBJECT)
 
@@ -90,7 +91,8 @@ tracker_backup_restore (TrackerBackup          *object,
 			GError                **error)
 {
 	guint request_id;
-	GError *err = NULL;
+	GError *actual_error = NULL;
+	GError *restore_error = NULL;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -98,20 +100,33 @@ tracker_backup_restore (TrackerBackup          *object,
 				  "DBus request to restore backup from '%s'",
 				  path);
 
+	/* First check we have disk space, we do this with ALL our
+	 * indexer commands.
+	 */
+	if (tracker_status_get_is_paused_for_space ()) {
+		tracker_dbus_request_failed (request_id,
+					     &actual_error,
+					     "No disk space left to write to the databases");
+		dbus_g_method_return_error (context, actual_error);
+		g_error_free (actual_error);
+		return;
+	}
+
 	org_freedesktop_Tracker_Indexer_restore_backup (tracker_dbus_indexer_get_proxy (),
-							path, &err);
+							path, 
+							&restore_error);
 
-	if (err) {
+	if (restore_error) {
 		GError *actual_error = NULL;
 
 		tracker_dbus_request_failed (request_id,
 					     &actual_error,
-					     err->message);
+					     restore_error->message);
 
 		dbus_g_method_return_error (context, actual_error);
 
 		g_error_free (actual_error);
-		g_error_free (err);
+		g_error_free (restore_error);
 	} else {
 		dbus_g_method_return (context);
 		tracker_dbus_request_success (request_id);
diff --git a/src/trackerd/tracker-keywords.c b/src/trackerd/tracker-keywords.c
index 8009b7a..5eaf654 100644
--- a/src/trackerd/tracker-keywords.c
+++ b/src/trackerd/tracker-keywords.c
@@ -36,6 +36,7 @@
 
 #include "tracker-dbus.h"
 #include "tracker-keywords.h"
+#include "tracker-status.h"
 #include "tracker-marshal.h"
 #include "tracker-indexer-client.h"
 
@@ -309,6 +310,19 @@ tracker_keywords_add (TrackerKeywords	     *object,
 		g_free (stripped_value);
 	}
 
+	/* First check we have disk space, we do this with ALL our
+	 * indexer commands.
+	 */
+	if (tracker_status_get_is_paused_for_space ()) {
+		tracker_dbus_request_failed (request_id,
+					     &actual_error,
+					     "No disk space left to write to the databases");
+		dbus_g_method_return_error (context, actual_error);
+		g_error_free (actual_error);
+		g_free (id);
+		return;
+	}
+
 	org_freedesktop_Tracker_Indexer_property_set (tracker_dbus_indexer_get_proxy (),
 						      service_type,
 						      uri,
@@ -388,6 +402,19 @@ tracker_keywords_remove (TrackerKeywords	*object,
 		return;
 	}
 
+	/* First check we have disk space, we do this with ALL our
+	 * indexer commands.
+	 */
+	if (tracker_status_get_is_paused_for_space ()) {
+		tracker_dbus_request_failed (request_id,
+					     &actual_error,
+					     "No disk space left to write to the databases");
+		dbus_g_method_return_error (context, actual_error);
+		g_error_free (actual_error);
+		g_free (service_id);
+		return;
+	}
+
 	org_freedesktop_Tracker_Indexer_property_remove (tracker_dbus_indexer_get_proxy (),
 							 service_type,
 							 uri,
@@ -465,8 +492,22 @@ tracker_keywords_remove_all (TrackerKeywords	    *object,
 		return;
 	}
 
+	/* First check we have disk space, we do this with ALL our
+	 * indexer commands.
+	 */
+	if (tracker_status_get_is_paused_for_space ()) {
+		tracker_dbus_request_failed (request_id,
+					     &actual_error,
+					     "No disk space left to write to the databases");
+		dbus_g_method_return_error (context, actual_error);
+		g_error_free (actual_error);
+		g_free (service_id);
+		return;
+	}
+
 	values = g_new0 (gchar *, 1);
 	values[0] = NULL;
+
 	org_freedesktop_Tracker_Indexer_property_remove (tracker_dbus_indexer_get_proxy (),
 							 service_type,
 							 uri,
@@ -484,7 +525,6 @@ tracker_keywords_remove_all (TrackerKeywords	    *object,
 		return;
 	}
 
-
 	dbus_g_method_return (context);
 
 	tracker_dbus_request_success (request_id);
diff --git a/src/trackerd/tracker-main.c b/src/trackerd/tracker-main.c
index 446472c..c20361d 100644
--- a/src/trackerd/tracker-main.c
+++ b/src/trackerd/tracker-main.c
@@ -598,7 +598,9 @@ backup_user_metadata (TrackerConfig *config, TrackerLanguage *language)
 	/*
 	 *  Init the DB stack to get the user metadata
 	 */
-	tracker_db_manager_init (0, &is_first_time_index, TRUE);
+	if (!tracker_db_manager_init (0, &is_first_time_index, TRUE)) {
+		return;
+	}
 
 	/*
 	 * If some database is missing or the dbs dont exists, we dont need
@@ -1107,8 +1109,9 @@ main (gint argc, gchar *argv[])
 		flags |= TRACKER_DB_MANAGER_LOW_MEMORY_MODE;
 	}
 
-	tracker_db_manager_init (flags, &is_first_time_index, TRUE);
-	tracker_status_set_is_first_time_index (is_first_time_index);
+	if (!tracker_db_manager_init (flags, &is_first_time_index, TRUE)) {
+		return EXIT_FAILURE;
+	}
 
 	if (!tracker_db_index_manager_init (index_flags,
 					    tracker_config_get_min_bucket_count (config),
@@ -1116,6 +1119,8 @@ main (gint argc, gchar *argv[])
 		return EXIT_FAILURE;
 	}
 
+	tracker_status_set_is_first_time_index (is_first_time_index);
+
 	/*
 	 * Check instances running
 	 */
diff --git a/src/trackerd/tracker-metadata.c b/src/trackerd/tracker-metadata.c
index c501ec7..af8aa7e 100644
--- a/src/trackerd/tracker-metadata.c
+++ b/src/trackerd/tracker-metadata.c
@@ -40,6 +40,7 @@
 
 #include "tracker-indexer-client.h"
 #include "tracker-dbus.h"
+#include "tracker-status.h"
 #include "tracker-metadata.h"
 #include "tracker-marshal.h"
 
@@ -371,6 +372,7 @@ tracker_metadata_set (TrackerMetadata	     *object,
 						     keys[i]);
 			dbus_g_method_return_error (context, actual_error);
 			g_error_free (actual_error);
+			g_free (service_id);
 			return;
 		}
 
@@ -386,13 +388,27 @@ tracker_metadata_set (TrackerMetadata	     *object,
 						     len);
 			dbus_g_method_return_error (context, actual_error);
 			g_error_free (actual_error);
+			g_free (service_id);
 			return;
 		}
 	}
 
+	/* First check we have disk space, we do this with ALL our
+	 * indexer commands.
+	 */
+	if (tracker_status_get_is_paused_for_space ()) {
+		tracker_dbus_request_failed (request_id,
+					     &actual_error,
+					     "No disk space left to write to the databases");
+		dbus_g_method_return_error (context, actual_error);
+		g_error_free (actual_error);
+		g_free (service_id);
+		return;
+	}
+
 	/* Real insertion */
 	for (i = 0; i < g_strv_length (keys); i++) {
-		gchar	    **value;
+		gchar **value;
 
 		value = tracker_string_to_string_list (values[i]);
 		org_freedesktop_Tracker_Indexer_property_set (tracker_dbus_indexer_get_proxy (),
@@ -406,6 +422,7 @@ tracker_metadata_set (TrackerMetadata	     *object,
 			tracker_dbus_request_failed (request_id, &actual_error, NULL);
 			dbus_g_method_return_error (context, actual_error);
 			g_error_free (actual_error);
+			g_free (service_id);
 			return;
 		}
 	}
diff --git a/src/trackerd/tracker-processor.c b/src/trackerd/tracker-processor.c
index 251ff95..2b0b7f4 100644
--- a/src/trackerd/tracker-processor.c
+++ b/src/trackerd/tracker-processor.c
@@ -637,7 +637,7 @@ item_queue_handlers_cb (gpointer user_data)
 	/* Don't spam */
 	g_get_current_time (&time_now);
 
-	should_repeat = (time_now.tv_sec - time_last.tv_sec) >= 5;
+	should_repeat = (time_now.tv_sec - time_last.tv_sec) >= 10;
 	if (should_repeat) {
 		time_last = time_now;
 	}
diff --git a/src/trackerd/tracker-status.c b/src/trackerd/tracker-status.c
index c82bca1..46a25db 100644
--- a/src/trackerd/tracker-status.c
+++ b/src/trackerd/tracker-status.c
@@ -305,7 +305,9 @@ disk_space_check (void)
 	}
 
 	if (((long long) st.f_bavail * 100 / st.f_blocks) <= limit) {
-		g_message ("Disk space is low");
+		g_message ("WARNING: Available disk space is below configured "
+			   "threshold for acceptable working (%d%%)",
+			   limit);
 		return TRUE;
 	}
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]