Re: [Tracker] how to handle this case (nfs share home directory among two PC)
- From: Rick Ju <Rick Ju Sun COM>
- To: jamie <jamiemcc blueyonder co uk>
- Cc: Jerry Tan <Jerry Tan Sun COM>, Halton Huo Sun COM, Tracker-List <tracker-list gnome org>
- Subject: Re: [Tracker] how to handle this case (nfs share home directory among two PC)
- Date: Mon, 03 Dec 2007 17:07:20 +0800
Hi, Jamie,
Please review the patch. It is not fully tested yet and not compatible
with Solaris since more work may be needed.
a. Is get_files()(tracker-utils.c) appropriate place to check remote
dir? If user explicitly add a remote mounted directoy in watch/crawl
list, and the SkipRemoteMount == True, the directory should still be
indexed.
b. Is another SkipRemoteMounts needed? or just use current
SkipMountPoints? I am not sure what exactly SkipMountPoints means.
-rick
jamie wrote:
On Mon, 2007-11-26 at 13:46 +0800, Rick Ju wrote:
Yes, of course. A cache and checking mtab file modification , this is
what I was thinking.
-rick
ok great - look forward to seeing the patch
jamie
_______________________________________________
tracker-list mailing list
tracker-list gnome org
http://mail.gnome.org/mailman/listinfo/tracker-list
Index: tracker-utils.h
===================================================================
--- tracker-utils.h (revision 1055)
+++ tracker-utils.h (working copy)
@@ -309,6 +309,7 @@
gboolean skip_mount_points; /* should tracker descend into mounted directories? see
Tracker.root_directory_devices */
GSList * root_directory_devices;
+ GHashTable *remote_directories;
IndexStatus index_status;
@@ -594,6 +595,7 @@
void tracker_add_root_dir (const char *uri); /* add a directory to the list of
watch/crawl/service roots */
void tracker_add_root_directories (GSList *uri_list); /* adds a bunch of directories to the
list of watch/crawl/service roots */
gboolean tracker_file_is_in_root_dir (const char *uri); /* test if a given file resides in the
watch/crawl/service roots */
+gboolean tracker_file_is_remote_mounted (const char *uri);
GSList * tracker_get_all_files (const char *dir, gboolean dir_only);
GSList * tracker_get_files (const char *dir, gboolean dir_only);
Index: tracker-utils.c
===================================================================
--- tracker-utils.c (revision 1055)
+++ tracker-utils.c (working copy)
@@ -40,6 +40,7 @@
#include <glib/gpattern.h>
#include <zlib.h>
#include <math.h>
+#include <mntent.h>
#include "tracker-dbus.h"
#include "tracker-utils.h"
#include "tracker-indexer.h"
@@ -105,6 +106,9 @@
{NULL, NULL},
};
+static const char * g_remote_fs_type_list[] = {"nfs", "smbfs", NULL};
+static const char * g_mnt_tab_linux = "/etc/mtab";
+static const char * g_mnt_tab_solaris = "/etc/mnttab";
char *
tracker_get_service_by_id (int service_type_id)
@@ -1264,7 +1268,58 @@
}
+static gboolean
+tracker_is_remote_fs_type(const char *fs_type)
+{
+ int i;
+ for (i = 0; NULL != g_remote_fs_type_list[i]; i++) {
+ if (g_str_equal(g_remote_fs_type_list[i], fs_type))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+static void
+tracker_init_remote_dirs()
+{
+ if (tracker->remote_directories)
+ return;
+
+ tracker->remote_directories = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
+
+ FILE *file = setmntent(g_mnt_tab_linux, "r");
+ if (!file)
+ file = setmntent(g_mnt_tab_solaris, "r");
+ if (!file)
+ return;
+
+ struct mntent * ent = getmntent(file);
+ while (ent) {
+ if (tracker_is_remote_fs_type(ent->mnt_type))
+ g_hash_table_insert (tracker->remote_directories, ent->mnt_dir, NULL);
+
+ ent = getmntent(file);
+ }
+
+ endmntent(file);
+ return;
+}
+
+
gboolean
+tracker_file_is_remote_mounted (const char *uri)
+{
+ if (!tracker->remote_directories) {
+ tracker_init_remote_dirs();
+ }
+
+ return g_hash_table_lookup_extended(tracker->remote_directories, uri, NULL, NULL);
+}
+
+
+gboolean
tracker_file_info_is_valid (FileInfo *info)
{
if (!info || !info->uri) {
@@ -1999,6 +2054,12 @@
continue;
}
+ if (tracker->skip_mount_points && tracker_file_is_remote_mounted (mystr)) {
+ tracker_log ("Skipping remote mount point %s", mystr);
+ g_free (mystr);
+ continue;
+ }
+
if (!dir_only || tracker_is_directory (mystr)) {
if (!tracker_file_is_no_watched (mystr)) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]