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 <christian.kandeler@qt.io>
This commit is contained in:
David Schulz
2021-07-14 11:23:29 +02:00
parent f8c7d2e848
commit 5c5e9bd339

View File

@@ -137,22 +137,29 @@ void LanguageClientManager::clientFinished(Client *client)
constexpr int restartTimeoutS = 5; constexpr int restartTimeoutS = 5;
const bool unexpectedFinish = client->state() != Client::Shutdown const bool unexpectedFinish = client->state() != Client::Shutdown
&& client->state() != Client::ShutdownRequested; && client->state() != Client::ShutdownRequested;
if (unexpectedFinish && !managerInstance->m_shuttingDown && client->reset()) {
if (unexpectedFinish) {
if (!managerInstance->m_shuttingDown) {
const QList<TextEditor::TextDocument *> &clientDocs
= managerInstance->m_clientForDocument.keys(client);
if (client->reset()) {
client->disconnect(managerInstance); client->disconnect(managerInstance);
client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS)); client->log(
tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS));
QTimer::singleShot(restartTimeoutS * 1000, client, [client]() { client->start(); }); QTimer::singleShot(restartTimeoutS * 1000, client, [client]() { client->start(); });
for (TextEditor::TextDocument *document : managerInstance->m_clientForDocument.keys(client)) for (TextEditor::TextDocument *document : clientDocs)
client->deactivateDocument(document); client->deactivateDocument(document);
} else { return;
if (unexpectedFinish && !managerInstance->m_shuttingDown) }
client->log(tr("Unexpectedly finished.")); client->log(tr("Unexpectedly finished."));
for (TextEditor::TextDocument *document : managerInstance->m_clientForDocument.keys(client)) for (TextEditor::TextDocument *document : clientDocs)
managerInstance->m_clientForDocument.remove(document); managerInstance->m_clientForDocument.remove(document);
}
}
deleteClient(client); deleteClient(client);
if (managerInstance->m_shuttingDown && managerInstance->m_clients.isEmpty()) if (managerInstance->m_shuttingDown && managerInstance->m_clients.isEmpty())
emit managerInstance->shutdownFinished(); emit managerInstance->shutdownFinished();
} }
}
Client *LanguageClientManager::startClient(BaseSettings *setting, ProjectExplorer::Project *project) Client *LanguageClientManager::startClient(BaseSettings *setting, ProjectExplorer::Project *project)
{ {
@@ -193,6 +200,10 @@ void LanguageClientManager::shutdownClient(Client *client)
{ {
if (!client) if (!client)
return; 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()) if (client->reachable())
client->shutdown(); client->shutdown();
else if (client->state() != Client::Shutdown && client->state() != Client::ShutdownRequested) else if (client->state() != Client::Shutdown && client->state() != Client::ShutdownRequested)