Fix for race condition in cf server initializion on Eclipse

- sometimes cf server would not receive initial information about
  targets defined in boot dash.

See: https://www.pivotaltracker.com/story/show/171827114
This commit is contained in:
Kris De Volder
2020-03-17 14:56:54 -07:00
parent 71b1b41ad1
commit 331b9acfe4
4 changed files with 16 additions and 26 deletions

View File

@@ -18,17 +18,13 @@ import java.nio.file.FileSystems;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.lang3.tuple.Pair;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.lsp4e.server.StreamConnectionProvider;
import org.eclipse.lsp4j.DidChangeConfigurationParams;
import org.eclipse.lsp4j.InitializeResult;
@@ -37,10 +33,8 @@ import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
import org.eclipse.lsp4j.services.LanguageServer;
import org.springframework.ide.eclipse.boot.dash.remoteapps.RemoteBootAppsDataHolder;
import org.springframework.ide.eclipse.boot.dash.remoteapps.RemoteBootAppsDataHolder.RemoteAppData;
import org.springframework.tooling.boot.ls.prefs.RemoteAppsPrefs;
import org.springframework.tooling.ls.eclipse.commons.LanguageServerCommonsActivator;
import org.springsource.ide.eclipse.commons.livexp.core.ValueListener;
import org.springsource.ide.eclipse.commons.livexp.ui.Disposable;
import com.google.common.collect.ImmutableSet;
import com.google.gson.Gson;

View File

@@ -25,7 +25,7 @@ import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
import org.eclipse.lsp4j.services.LanguageServer;
import org.springframework.tooling.ls.eclipse.commons.STS4LanguageServerProcessStreamConnector;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableMap;
/**
* @author Martin Lippert
@@ -63,9 +63,9 @@ public class CloudFoundryManifestLanguageServer extends STS4LanguageServerProces
if (responseMessage.getResult() instanceof InitializeResult) {
this.languageServer = languageServer;
this.rootPath = rootPath;
updateLanguageServer();
addLanguageServer(this);
servers.add(this);
BootDashTargetInfoSynchronizer.start();
}
}
}
@@ -80,31 +80,21 @@ public class CloudFoundryManifestLanguageServer extends STS4LanguageServerProces
@Override
public void stop() {
removeLanguageServer(this);
servers.remove(this);
super.stop();
}
@Override
public Object getInitializationOptions(URI rootUri) {
Object opts = cfTargetOptionSettings;
return opts!=null?opts:ImmutableSet.of();
return opts!=null?opts:ImmutableMap.of();
}
protected void updateLanguageServer() {
private void updateLanguageServer() {
DidChangeConfigurationParams params = new DidChangeConfigurationParams(getInitializationOptions(rootPath));
languageServer.getWorkspaceService().didChangeConfiguration(params);
}
private static void addLanguageServer(CloudFoundryManifestLanguageServer server) {
BootDashTargetInfoSynchronizer.start();
servers.add(server);
}
private static void removeLanguageServer(CloudFoundryManifestLanguageServer server) {
servers.remove(server);
}
@Override
protected String getPluginId() {
return Constants.PLUGIN_ID;

View File

@@ -144,4 +144,10 @@ public class CfTargetsInfo {
return "Target [api=" + api + ", org=" + org + ", space=" + space + "]";
}
}
@Override
public String toString() {
return "CfTargetsInfo "+cfTargets;
}
}

View File

@@ -240,13 +240,13 @@ public class LanguageServerRunner implements CommandLineRunner {
Function<MessageConsumer, MessageConsumer> wrapper = (MessageConsumer consumer) -> {
return (msg) -> {
try {
long beforeConsumingMessage = System.currentTimeMillis();
// long beforeConsumingMessage = System.currentTimeMillis();
consumer.consume(msg);
long afterConsumingMessage = System.currentTimeMillis();
String shortMessage = StringUtils.left(msg.toString(), 140);
log.info("working on message took " + (afterConsumingMessage - beforeConsumingMessage) + "ms - message content: " + shortMessage);
// long afterConsumingMessage = System.currentTimeMillis();
// String shortMessage = StringUtils.left(msg.toString(), 140);
// log.info("working on message took " + (afterConsumingMessage - beforeConsumingMessage) + "ms - message content: " + shortMessage);
} catch (UnsupportedOperationException e) {
//log a warning and ignore. We are getting some messages from vsCode the server doesn't know about