diff options
-rw-r--r-- | services/incremental/IncrementalService.cpp | 32 | ||||
-rw-r--r-- | services/incremental/IncrementalService.h | 4 |
2 files changed, 28 insertions, 8 deletions
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index 695b68bf71cb..149dfa6be6c4 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -1279,7 +1279,7 @@ bool IncrementalService::configureNativeBinaries(StorageId storage, std::string_ { std::lock_guard lock(mJobMutex); if (mRunning) { - auto& existingJobs = mJobQueue[storage]; + auto& existingJobs = mJobQueue[ifs->mountId]; if (existingJobs.empty()) { existingJobs = std::move(jobQueue); } else { @@ -1369,12 +1369,32 @@ void IncrementalService::extractZipFile(const IfsMountPtr& ifs, ZipArchiveHandle } bool IncrementalService::waitForNativeBinariesExtraction(StorageId storage) { + struct WaitPrinter { + const Clock::time_point startTs = Clock::now(); + ~WaitPrinter() noexcept { + if (sEnablePerfLogging) { + const auto endTs = Clock::now(); + LOG(INFO) << "incfs: waitForNativeBinariesExtraction() complete in " + << elapsedMcs(startTs, endTs) << "mcs"; + } + } + } waitPrinter; + + MountId mount; + { + auto ifs = getIfs(storage); + if (!ifs) { + return true; + } + mount = ifs->mountId; + } + std::unique_lock lock(mJobMutex); - mJobCondition.wait(lock, [this, storage] { + mJobCondition.wait(lock, [this, mount] { return !mRunning || - (mPendingJobsStorage != storage && mJobQueue.find(storage) == mJobQueue.end()); + (mPendingJobsMount != mount && mJobQueue.find(mount) == mJobQueue.end()); }); - return mPendingJobsStorage != storage && mJobQueue.find(storage) == mJobQueue.end(); + return mRunning; } void IncrementalService::runJobProcessing() { @@ -1386,7 +1406,7 @@ void IncrementalService::runJobProcessing() { } auto it = mJobQueue.begin(); - mPendingJobsStorage = it->first; + mPendingJobsMount = it->first; auto queue = std::move(it->second); mJobQueue.erase(it); lock.unlock(); @@ -1396,7 +1416,7 @@ void IncrementalService::runJobProcessing() { } lock.lock(); - mPendingJobsStorage = kInvalidStorageId; + mPendingJobsMount = kInvalidStorageId; lock.unlock(); mJobCondition.notify_all(); } diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h index e7705df633d1..c016bab067be 100644 --- a/services/incremental/IncrementalService.h +++ b/services/incremental/IncrementalService.h @@ -308,8 +308,8 @@ private: StorageId mNextId = 0; using Job = std::function<void()>; - std::unordered_map<StorageId, std::vector<Job>> mJobQueue; - StorageId mPendingJobsStorage = kInvalidStorageId; + std::unordered_map<MountId, std::vector<Job>> mJobQueue; + MountId mPendingJobsMount = kInvalidStorageId; std::condition_variable mJobCondition; std::mutex mJobMutex; std::thread mJobProcessor; |