From 5c5e9bd339dddf91a07bfaa7350d7f01e75f12a7 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 14 Jul 2021 11:23:29 +0200 Subject: [PATCH] LanguageClient: reset assigned documents on shutdown request Allows to reassign the documents to another server before the old server is completely shutdown. Change-Id: I20538c317a7664523f55073736eb22d96def8df8 Reviewed-by: Christian Kandeler --- .../languageclient/languageclientmanager.cpp | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 24afdaac643..a2ae95a1fad 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -137,21 +137,28 @@ void LanguageClientManager::clientFinished(Client *client) constexpr int restartTimeoutS = 5; const bool unexpectedFinish = client->state() != Client::Shutdown && client->state() != Client::ShutdownRequested; - if (unexpectedFinish && !managerInstance->m_shuttingDown && client->reset()) { - client->disconnect(managerInstance); - client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS)); - QTimer::singleShot(restartTimeoutS * 1000, client, [client]() { client->start(); }); - for (TextEditor::TextDocument *document : managerInstance->m_clientForDocument.keys(client)) - client->deactivateDocument(document); - } else { - if (unexpectedFinish && !managerInstance->m_shuttingDown) + + if (unexpectedFinish) { + if (!managerInstance->m_shuttingDown) { + const QList &clientDocs + = managerInstance->m_clientForDocument.keys(client); + if (client->reset()) { + client->disconnect(managerInstance); + client->log( + tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS)); + QTimer::singleShot(restartTimeoutS * 1000, client, [client]() { client->start(); }); + for (TextEditor::TextDocument *document : clientDocs) + client->deactivateDocument(document); + return; + } client->log(tr("Unexpectedly finished.")); - for (TextEditor::TextDocument *document : managerInstance->m_clientForDocument.keys(client)) - managerInstance->m_clientForDocument.remove(document); - deleteClient(client); - if (managerInstance->m_shuttingDown && managerInstance->m_clients.isEmpty()) - emit managerInstance->shutdownFinished(); + for (TextEditor::TextDocument *document : clientDocs) + managerInstance->m_clientForDocument.remove(document); + } } + deleteClient(client); + if (managerInstance->m_shuttingDown && managerInstance->m_clients.isEmpty()) + emit managerInstance->shutdownFinished(); } Client *LanguageClientManager::startClient(BaseSettings *setting, ProjectExplorer::Project *project) @@ -193,6 +200,10 @@ void LanguageClientManager::shutdownClient(Client *client) { if (!client) return; + // reset the documents for that client already when requesting the shutdown so they can get + // reassigned to another server right after this request to another server + for (TextEditor::TextDocument *document : managerInstance->m_clientForDocument.keys(client)) + managerInstance->m_clientForDocument.remove(document); if (client->reachable()) client->shutdown(); else if (client->state() != Client::Shutdown && client->state() != Client::ShutdownRequested)