[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [akonadi/server-search] server/src/search: Only complete AgentSearchTask after ALL corresponding Res
From:       Christian Mollekopf <chrigi_1 () fastmail ! fm>
Date:       2014-01-31 21:09:49
Message-ID: E1W9LLR-0005TD-Tc () scm ! kde ! org
[Download RAW message or body]

Git commit cdda3b0b4201be31237bbe4bfce69740aa94698d by Christian Mollekopf.
Committed on 31/01/2014 at 21:09.
Pushed by cmollekopf into branch 'server-search'.

Only complete AgentSearchTask after ALL corresponding ResourceTasks have been completed.

An AgentSearchTask typically has multiple ResourceTasks associated, and all of them
need to complete first.

M  +18   -8    server/src/search/agentsearchmanager.cpp
M  +1    -0    server/src/search/agentsearchmanager.h

http://commits.kde.org/akonadi/cdda3b0b4201be31237bbe4bfce69740aa94698d

diff --git a/server/src/search/agentsearchmanager.cpp b/server/src/search/agentsearchmanager.cpp
index c90f53e..ffe3b78 100644
--- a/server/src/search/agentsearchmanager.cpp
+++ b/server/src/search/agentsearchmanager.cpp
@@ -167,14 +167,24 @@ void AgentSearchManager::pushResults( const QByteArray &searchId, const QSet<qin
   mWait.wakeAll();
 }
 
+bool AgentSearchManager::allResourceTasksCompleted( AgentSearchTask *agentSearchTask ) const
+{
+  QMap<QString, ResourceTask*>::const_iterator it = mRunningTasks.begin();
+  for ( ; it != mRunningTasks.end(); ) {
+    if ( it.value()->parentTask == agentSearchTask ) {
+      return false;
+    }
+  }
+  return true;
+}
+
 AgentSearchManager::TasksMap::Iterator AgentSearchManager::cancelRunningTask( TasksMap::Iterator &iter )
 {
   ResourceTask *task = iter.value();
   AgentSearchTask *parentTask = task->parentTask;
-  parentTask->sharedLock.lock();
-  parentTask->pendingResults.clear();
-  parentTask->complete = true;
-  parentTask->sharedLock.unlock();
+  QMutexLocker locker(&parentTask->sharedLock);
+  // We're not clearing the results since we don't want to clear successful results from other resources
+  parentTask->complete = allResourceTasksCompleted( parentTask );
   parentTask->notifier.wakeAll();
   delete task;
 
@@ -217,10 +227,10 @@ void AgentSearchManager::searchLoop()
       mPendingResults.remove( 0 );
       akDebug() << "Pending results for search" << finishedTask->parentTask->id << "available!";
       AgentSearchTask *parentTask = finishedTask->parentTask;
-      parentTask->sharedLock.lock();
-      parentTask->pendingResults = finishedTask->results;
-      parentTask->complete = true;
-      parentTask->sharedLock.unlock();
+      QMutexLocker locker( &parentTask->sharedLock );
+      // We need to append, this agent search task is shared
+      parentTask->pendingResults += finishedTask->results;
+      parentTask->complete = allResourceTasksCompleted( parentTask );
       parentTask->notifier.wakeAll();
       delete finishedTask;
     }
diff --git a/server/src/search/agentsearchmanager.h b/server/src/search/agentsearchmanager.h
index 8c95572..91c2e97 100644
--- a/server/src/search/agentsearchmanager.h
+++ b/server/src/search/agentsearchmanager.h
@@ -93,6 +93,7 @@ class AgentSearchManager : public QObject
     bool mShouldStop;
 
     TasksMap::Iterator cancelRunningTask( TasksMap::Iterator &iter );
+    bool allResourceTasksCompleted( AgentSearchTask* ) const;
 
     QMap<QString, AgentSearchInstance* > mInstances;
     QMutex mInstancesLock;

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic