diff options
author | Sam Thursfield <sam@afuera.me.uk> | 2018-07-20 16:05:12 +0200 |
---|---|---|
committer | Sam Thursfield <sam@afuera.me.uk> | 2018-07-20 16:47:27 +0200 |
commit | 68381c1dd7b68b1f83eef5c8590965f18224c732 (patch) | |
tree | d8f7371093206449104988ef1fa9e1eae43e144a | |
parent | 0dcb7ab20c5dd20db2bb955fd4fd64a2131059db (diff) | |
download | tracker-68381c1dd7b68b1f83eef5c8590965f18224c732.tar.gz |
libtracker-miner: Fix race which resulted in files being queued out of order
The TrackerFileNotifier signals need to be emitted in a heirarchical
order. If we have this directory heirarchy...
test-monitored/
test-monitored/file1.txt
...we must always emit ::file-created for 'test-monitored/' before we emit
::file-created for 'test-monitored/file1.txt'.
The tracker_file_notifier_ensure_parents() function ensures that we do
this, but it would previously not work correctly in situations where
'test-monitored/' was a configured indexing root, rather than a
subdirectory of one of the roots.
This was causing the tracker-miners functional tests to randomly fail
with errors such as this:
** (tracker-miner-fs:18181): WARNING **: 16:01:00.461: Parent 'file:///home/sam/tracker-tests/tmpDSmsQI/test-monitored' not indexed yet
This is presumably a regression from 2e2dd4f5dc650aefa4b7188cf1a612b2d27f84ba.
-rw-r--r-- | src/libtracker-miner/tracker-file-notifier.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/libtracker-miner/tracker-file-notifier.c b/src/libtracker-miner/tracker-file-notifier.c index 59ea41f6f..53795468d 100644 --- a/src/libtracker-miner/tracker-file-notifier.c +++ b/src/libtracker-miner/tracker-file-notifier.c @@ -1069,8 +1069,7 @@ tracker_file_notifier_ensure_parents (TrackerFileNotifier *notifier, parent = g_file_get_parent (file); while (parent) { - if (tracker_indexing_tree_file_is_root (priv->indexing_tree, parent) || - tracker_file_notifier_get_file_iri (notifier, parent, TRUE)) { + if (tracker_file_notifier_get_file_iri (notifier, parent, TRUE)) { g_object_unref (parent); break; } @@ -1082,6 +1081,11 @@ tracker_file_notifier_ensure_parents (TrackerFileNotifier *notifier, g_object_unref (parent); g_signal_emit (notifier, signals[FILE_CREATED], 0, canonical); + + if (tracker_indexing_tree_file_is_root (priv->indexing_tree, canonical)) { + break; + } + parent = g_file_get_parent (canonical); } } |