Merge "[incfs] Correctly wait for async .so's extraction" into rvc-dev am: ced11b60ad am: c514acfdd5

Change-Id: I1892e15de67f98ff47c1e581dd8330f5568940ce
This commit is contained in:
TreeHugger Robot
2020-04-13 20:31:28 +00:00
committed by Automerger Merge Worker
2 changed files with 28 additions and 8 deletions

View File

@@ -1279,7 +1279,7 @@ bool IncrementalService::configureNativeBinaries(StorageId storage, std::string_
{ {
std::lock_guard lock(mJobMutex); std::lock_guard lock(mJobMutex);
if (mRunning) { if (mRunning) {
auto& existingJobs = mJobQueue[storage]; auto& existingJobs = mJobQueue[ifs->mountId];
if (existingJobs.empty()) { if (existingJobs.empty()) {
existingJobs = std::move(jobQueue); existingJobs = std::move(jobQueue);
} else { } else {
@@ -1369,12 +1369,32 @@ void IncrementalService::extractZipFile(const IfsMountPtr& ifs, ZipArchiveHandle
} }
bool IncrementalService::waitForNativeBinariesExtraction(StorageId storage) { 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); std::unique_lock lock(mJobMutex);
mJobCondition.wait(lock, [this, storage] { mJobCondition.wait(lock, [this, mount] {
return !mRunning || 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() { void IncrementalService::runJobProcessing() {
@@ -1386,7 +1406,7 @@ void IncrementalService::runJobProcessing() {
} }
auto it = mJobQueue.begin(); auto it = mJobQueue.begin();
mPendingJobsStorage = it->first; mPendingJobsMount = it->first;
auto queue = std::move(it->second); auto queue = std::move(it->second);
mJobQueue.erase(it); mJobQueue.erase(it);
lock.unlock(); lock.unlock();
@@ -1396,7 +1416,7 @@ void IncrementalService::runJobProcessing() {
} }
lock.lock(); lock.lock();
mPendingJobsStorage = kInvalidStorageId; mPendingJobsMount = kInvalidStorageId;
lock.unlock(); lock.unlock();
mJobCondition.notify_all(); mJobCondition.notify_all();
} }

View File

@@ -308,8 +308,8 @@ private:
StorageId mNextId = 0; StorageId mNextId = 0;
using Job = std::function<void()>; using Job = std::function<void()>;
std::unordered_map<StorageId, std::vector<Job>> mJobQueue; std::unordered_map<MountId, std::vector<Job>> mJobQueue;
StorageId mPendingJobsStorage = kInvalidStorageId; MountId mPendingJobsMount = kInvalidStorageId;
std::condition_variable mJobCondition; std::condition_variable mJobCondition;
std::mutex mJobMutex; std::mutex mJobMutex;
std::thread mJobProcessor; std::thread mJobProcessor;