[tracker/tracker-0.6] Check space before creating DBs && disable indexer API when paused
- From: Martyn James Russell <mr src gnome org>
- To: svn-commits-list gnome org
- Subject: [tracker/tracker-0.6] Check space before creating DBs && disable indexer API when paused
- Date: Mon, 1 Jun 2009 06:43:50 -0400 (EDT)
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]