Try to prevent long queue lengths.

This commit is contained in:
Jacob Dufault 2018-03-19 20:01:23 -07:00 committed by Fangrui Song
parent db7e25c542
commit 4e76cdaaae

View File

@ -45,6 +45,22 @@ MAKE_REFLECT_STRUCT(Out_Progress::Params,
activeThreads); activeThreads);
MAKE_REFLECT_STRUCT(Out_Progress, jsonrpc, method, params); MAKE_REFLECT_STRUCT(Out_Progress, jsonrpc, method, params);
// Instead of processing messages forever, we only process upto
// |kIterationSize| messages of a type at one time. While the import time
// likely stays the same, this should reduce overall queue lengths which means
// the user gets a usable index faster.
struct IterationLoop {
const int kIterationSize = 100;
int count = 0;
bool Next() {
return count++ < kIterationSize;
}
void Reset() {
count = 0;
}
};
struct IModificationTimestampFetcher { struct IModificationTimestampFetcher {
virtual ~IModificationTimestampFetcher() = default; virtual ~IModificationTimestampFetcher() = default;
virtual optional<int64_t> GetModificationTime(const std::string& path) = 0; virtual optional<int64_t> GetModificationTime(const std::string& path) = 0;
@ -522,7 +538,8 @@ bool IndexMergeIndexUpdates() {
return false; return false;
bool did_merge = false; bool did_merge = false;
while (true) { IterationLoop loop;
while (loop.Next()) {
optional<Index_OnIndexed> to_join = queue->on_indexed.TryPopBack(); optional<Index_OnIndexed> to_join = queue->on_indexed.TryPopBack();
if (!to_join) { if (!to_join) {
queue->on_indexed.PushFront(std::move(*root)); queue->on_indexed.PushFront(std::move(*root));
@ -599,7 +616,8 @@ void Indexer_Main(Config* config,
// Build one index per-indexer, as building the index acquires a global lock. // Build one index per-indexer, as building the index acquires a global lock.
auto indexer = IIndexer::MakeClangIndexer(); auto indexer = IIndexer::MakeClangIndexer();
while (true) { IterationLoop loop;
while (loop.Next()) {
bool did_work = false; bool did_work = false;
{ {
@ -726,6 +744,7 @@ void QueryDb_OnIndexed(QueueManager* queue,
import_manager->DoneQueryDbImport(updated_file.value.path); import_manager->DoneQueryDbImport(updated_file.value.path);
} }
} }
} // namespace } // namespace
bool QueryDb_ImportMain(Config* config, bool QueryDb_ImportMain(Config* config,
@ -740,7 +759,8 @@ bool QueryDb_ImportMain(Config* config,
bool did_work = false; bool did_work = false;
while (true) { IterationLoop loop;
while (loop.Next()) {
optional<Index_DoIdMap> request = queue->do_id_map.TryPopFront(); optional<Index_DoIdMap> request = queue->do_id_map.TryPopFront();
if (!request) if (!request)
break; break;
@ -748,7 +768,8 @@ bool QueryDb_ImportMain(Config* config,
QueryDb_DoIdMap(queue, db, import_manager, &*request); QueryDb_DoIdMap(queue, db, import_manager, &*request);
} }
while (true) { loop.Reset();
while (loop.Next()) {
optional<Index_OnIndexed> response = queue->on_indexed.TryPopFront(); optional<Index_OnIndexed> response = queue->on_indexed.TryPopFront();
if (!response) if (!response)
break; break;