[tracker/porting/processor-rework: 3/5] Check space before creating DBs && disable indexer API when paused



commit f3d2b56acdb219bb0c13ab0ba39270ae3553ac75
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.
    
    Ported to master by Philip
---
 src/libtracker-common/tracker-file-utils.c |  156 ++++++++++++++++++++++++++++
 src/libtracker-common/tracker-file-utils.h |    6 +
 src/libtracker-db/tracker-db-manager.c     |   14 ++-
 src/libtracker-db/tracker-db-manager.h     |    2 +-
 src/tracker-indexer/tracker-main.c         |    2 +-
 src/tracker-utils/tracker-processes.c      |    5 +-
 src/trackerd/tracker-backup.c              |   27 ++++-
 src/trackerd/tracker-main.c                |    7 +-
 src/trackerd/tracker-processor.c           |    2 +-
 src/trackerd/tracker-status.c              |    4 +-
 10 files changed, 210 insertions(+), 15 deletions(-)

diff --git a/src/libtracker-common/tracker-file-utils.c b/src/libtracker-common/tracker-file-utils.c
index fa8b202..84ab11a 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>
 
@@ -178,6 +179,161 @@ tracker_file_get_mime_type (GFile *file)
 	return content_type ? content_type : g_strdup ("unknown");
 }
 
+static gchar *
+tracker_file_get_vfs_path (const gchar *uri)
+{
+	gchar *p;
+
+	if (!uri || !strchr (uri, G_DIR_SEPARATOR)) {
+		return NULL;
+	}
+
+	p = (gchar*) uri + strlen (uri) - 1;
+
+	/* Skip trailing slash */
+	if (p != uri && *p == G_DIR_SEPARATOR) {
+		p--;
+	}
+
+	/* Search backwards to the next slash. */
+	while (p != uri && *p != G_DIR_SEPARATOR) {
+		p--;
+	}
+
+	if (p[0] != '\0') {
+		gchar *new_uri_text;
+		gint   length;
+
+		length = p - uri;
+
+		if (length == 0) {
+			new_uri_text = g_strdup (G_DIR_SEPARATOR_S);
+		} else {
+			new_uri_text = g_malloc (length + 1);
+			memcpy (new_uri_text, uri, length);
+			new_uri_text[length] = '\0';
+		}
+
+		return new_uri_text;
+	} else {
+		return g_strdup (G_DIR_SEPARATOR_S);
+	}
+}
+
+static gchar *
+tracker_file_get_vfs_name (const gchar *uri)
+{
+	gchar *p, *res, *tmp, *result;
+
+	if (!uri || !strchr (uri, G_DIR_SEPARATOR)) {
+		return g_strdup (" ");
+	}
+
+	tmp = g_strdup (uri);
+	p = tmp + strlen (uri) - 1;
+
+	/* Skip trailing slash */
+	if (p != tmp && *p == G_DIR_SEPARATOR) {
+		*p = '\0';
+	}
+
+	/* Search backwards to the next slash.	*/
+	while (p != tmp && *p != G_DIR_SEPARATOR) {
+		p--;
+	}
+
+	res = p + 1;
+
+	if (res && res[0] != '\0') {
+		result = g_strdup (res);
+		g_free (tmp);
+
+		return result;
+	}
+
+	g_free (tmp);
+
+	return g_strdup (" ");
+}
+
+
+static gchar *
+normalize_uri (const gchar *uri) {
+
+	GFile  *f;
+	gchar *normalized;
+
+	f = g_file_new_for_path (uri);
+	normalized =  g_file_get_path (f);
+	g_object_unref (f);
+
+	return normalized;
+}
+
+void
+tracker_file_get_path_and_name (const gchar *uri,
+				gchar **path,
+				gchar **name)
+{
+
+	g_return_if_fail (uri);
+	g_return_if_fail (path);
+	g_return_if_fail (name);
+
+	if (uri[0] == G_DIR_SEPARATOR) {
+		gchar *checked_uri;
+
+		checked_uri = normalize_uri (uri);
+		*name = g_path_get_basename (checked_uri);
+		*path = g_path_get_dirname (checked_uri);
+
+		g_free (checked_uri);
+	} else {
+		*name = tracker_file_get_vfs_name (uri);
+		*path = tracker_file_get_vfs_path (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 *path)
 {
diff --git a/src/libtracker-common/tracker-file-utils.h b/src/libtracker-common/tracker-file-utils.h
index 8edcc02..dc5084f 100644
--- a/src/libtracker-common/tracker-file-utils.h
+++ b/src/libtracker-common/tracker-file-utils.h
@@ -38,6 +38,11 @@ void     tracker_file_close                        (FILE         *file,
 goffset  tracker_file_get_size                     (const gchar  *uri);
 guint64  tracker_file_get_mtime                    (const gchar  *uri);
 gchar *  tracker_file_get_mime_type                (GFile        *file);
+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);
@@ -45,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-manager.c b/src/libtracker-db/tracker-db-manager.c
index 64589ab..4b5ead0 100644
--- a/src/libtracker-db/tracker-db-manager.c
+++ b/src/libtracker-db/tracker-db-manager.c
@@ -42,6 +42,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
 
@@ -1018,7 +1021,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)
@@ -1035,7 +1038,7 @@ tracker_db_manager_init (TrackerDBManagerFlags	flags,
 	}
 
 	if (initialized) {
-		return;
+		return TRUE;
 	}
 
 	need_reindex = FALSE;
@@ -1136,7 +1139,7 @@ tracker_db_manager_init (TrackerDBManagerFlags	flags,
 	 */
 	if ((flags & TRACKER_DB_MANAGER_REMOVE_ALL) != 0) {
 		initialized = TRUE;
-		return;
+		return TRUE;
 	}
 
 	/* Set general database options */
@@ -1154,6 +1157,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.
@@ -1207,6 +1214,7 @@ tracker_db_manager_init (TrackerDBManagerFlags	flags,
 							    TRACKER_DB_FULLTEXT,
 							    TRACKER_DB_CONTENTS,
 							    TRACKER_DB_COMMON);
+	return TRUE;
 }
 
 void
diff --git a/src/libtracker-db/tracker-db-manager.h b/src/libtracker-db/tracker-db-manager.h
index b7023a7..7464f7a 100644
--- a/src/libtracker-db/tracker-db-manager.h
+++ b/src/libtracker-db/tracker-db-manager.h
@@ -53,7 +53,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 8293e98..099e265 100644
--- a/src/tracker-indexer/tracker-main.c
+++ b/src/tracker-indexer/tracker-main.c
@@ -366,7 +366,7 @@ main (gint argc, gchar *argv[])
 
 	if (!tracker_data_manager_init (config, language, flags, NULL, &is_first_time_index)) {
 		return EXIT_FAILURE;
-	}
+        }
 
 	tracker_module_config_init ();
 
diff --git a/src/tracker-utils/tracker-processes.c b/src/tracker-utils/tracker-processes.c
index e61a8ae..344853d 100644
--- a/src/tracker-utils/tracker-processes.c
+++ b/src/tracker-utils/tracker-processes.c
@@ -246,7 +246,10 @@ 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 ();
 
diff --git a/src/trackerd/tracker-backup.c b/src/trackerd/tracker-backup.c
index aae97b0..65d4bb2 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)
 
@@ -93,7 +94,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 ();
 
@@ -101,20 +103,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-main.c b/src/trackerd/tracker-main.c
index 01f80e0..9dfab1a 100644
--- a/src/trackerd/tracker-main.c
+++ b/src/trackerd/tracker-main.c
@@ -671,6 +671,7 @@ backup_user_metadata (TrackerConfig *config, TrackerLanguage *language)
 	/*
 	 *  Init the DB stack to get the user metadata
 	 */
+
 	tracker_data_manager_init (config, language, 0, NULL, &is_first_time_index);
 	
 	/*
@@ -970,7 +971,11 @@ main (gint argc, gchar *argv[])
 		flags |= TRACKER_DB_MANAGER_LOW_MEMORY_MODE;
 	}
 
-	tracker_data_manager_init (config, language, flags, NULL, &is_first_time_index);
+	if (!tracker_data_manager_init (config, language, flags, NULL, &is_first_time_index)) {
+		return EXIT_FAILURE;
+	}
+
+	tracker_status_set_is_first_time_index (is_first_time_index);
 
 	tracker_status_set_is_first_time_index (is_first_time_index);
 
diff --git a/src/trackerd/tracker-processor.c b/src/trackerd/tracker-processor.c
index 445454b..ae8bfe6 100644
--- a/src/trackerd/tracker-processor.c
+++ b/src/trackerd/tracker-processor.c
@@ -653,7 +653,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 db355b6..189088b 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]