From 3c1e7872154e296ac95c8b4212ed13b73145d991 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 12 Jul 2021 16:52:56 +0200 Subject: [PATCH] ClangCodeModel: Limit result count in clangd-based locator searches clangd memory usage explodes when the workspace/symbol result count hits the six-digit mark, so prevent that. Change-Id: Iefc2eeb3da7fe541e2b1d3105818126980fc3323 Reviewed-by: David Schulz --- src/libs/languageserverprotocol/workspace.h | 2 ++ src/plugins/clangcodemodel/clanggloballocatorfilters.cpp | 5 +++++ src/plugins/languageclient/locatorfilter.cpp | 2 ++ src/plugins/languageclient/locatorfilter.h | 3 +++ 4 files changed, 12 insertions(+) diff --git a/src/libs/languageserverprotocol/workspace.h b/src/libs/languageserverprotocol/workspace.h index 3b0b247b88b..0a745a984fd 100644 --- a/src/libs/languageserverprotocol/workspace.h +++ b/src/libs/languageserverprotocol/workspace.h @@ -188,6 +188,8 @@ public: QString query() const { return typedValue(queryKey); } void setQuery(const QString &query) { insert(queryKey, query); } + void setLimit(int limit) { insert("limit", limit); } // clangd extension + bool isValid() const override { return contains(queryKey); } }; diff --git a/src/plugins/clangcodemodel/clanggloballocatorfilters.cpp b/src/plugins/clangcodemodel/clanggloballocatorfilters.cpp index 004b10a087d..e979c8928c2 100644 --- a/src/plugins/clangcodemodel/clanggloballocatorfilters.cpp +++ b/src/plugins/clangcodemodel/clanggloballocatorfilters.cpp @@ -43,6 +43,8 @@ namespace ClangCodeModel { namespace Internal { +const int MaxResultCount = 10000; + class CppLocatorFilter : public CppTools::CppLocatorFilter { public: @@ -67,6 +69,7 @@ public: setDefaultShortcutString({}); setEnabled(false); setHidden(true); + setMaxResultCount(MaxResultCount); } }; @@ -94,6 +97,7 @@ public: setDefaultShortcutString({}); setEnabled(false); setHidden(true); + setMaxResultCount(MaxResultCount); } }; @@ -121,6 +125,7 @@ public: setDefaultShortcutString({}); setEnabled(false); setHidden(true); + setMaxResultCount(MaxResultCount); } }; diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp index b3abe0fc798..ce4fd5c9b5d 100644 --- a/src/plugins/languageclient/locatorfilter.cpp +++ b/src/plugins/languageclient/locatorfilter.cpp @@ -230,6 +230,8 @@ void WorkspaceLocatorFilter::prepareSearch(const QString &entry, WorkspaceSymbolParams params; params.setQuery(entry); + if (m_maxResultCount > 0) + params.setLimit(m_maxResultCount); QMutexLocker locker(&m_mutex); for (auto client : qAsConst(clients)) { diff --git a/src/plugins/languageclient/locatorfilter.h b/src/plugins/languageclient/locatorfilter.h index 58da2ddf9c2..6ef079ec45f 100644 --- a/src/plugins/languageclient/locatorfilter.h +++ b/src/plugins/languageclient/locatorfilter.h @@ -97,6 +97,8 @@ signals: protected: explicit WorkspaceLocatorFilter(const QVector &filter); + void setMaxResultCount(qint64 limit) { m_maxResultCount = limit; } + private: void prepareSearch(const QString &entry, const QVector &clients, bool force); void handleResponse(Client *client, @@ -106,6 +108,7 @@ private: QMap m_pendingRequests; QVector m_results; QVector m_filterKinds; + qint64 m_maxResultCount = 0; }; class LANGUAGECLIENT_EXPORT WorkspaceClassLocatorFilter : public WorkspaceLocatorFilter