From a97ad3e4a6b3159141582c9852bcf0aae1aeda89 Mon Sep 17 00:00:00 2001 From: "karl@rstudio.com" Date: Thu, 21 Feb 2019 09:17:27 -0600 Subject: [PATCH] Open source companion commit for https://github.com/rstudio/rstudio-pro/pull/893 --- src/cpp/server/ServerSessionProxy.cpp | 13 ++++----- src/cpp/server/ServerSessionProxyOverlay.cpp | 3 +- .../include/server/ServerSessionProxy.hpp | 3 +- .../org/rstudio/studio/client/RStudio.java | 28 ++++++++++++++++++- .../client/application/Application.java | 5 +++- .../model/ApplicationServerOperations.java | 3 ++ .../client/server/remote/RemoteServer.java | 15 +++++++++- .../client/workbench/model/SessionOpener.java | 7 +++++ 8 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/cpp/server/ServerSessionProxy.cpp b/src/cpp/server/ServerSessionProxy.cpp index 1d3525cde42..fbffeed8716 100644 --- a/src/cpp/server/ServerSessionProxy.cpp +++ b/src/cpp/server/ServerSessionProxy.cpp @@ -81,8 +81,7 @@ bool proxyRequest(int requestType, const boost::shared_ptr& pRequest, const r_util::SessionContext &context, boost::shared_ptr ptrConnection, - const http::ErrorHandler &errorHandler, - const http::ConnectionRetryProfile &connectionRetryProfile); + const http::ErrorHandler &errorHandler); bool proxyLocalhostRequest(http::Request& request, const std::string& port, @@ -578,8 +577,7 @@ void proxyRequest( invokeRequestFilter(pRequest.get()); // see if the request should be handled by the overlay - if (overlay::proxyRequest(requestType, pRequest, context, ptrConnection, - errorHandler, connectionRetryProfile)) + if (overlay::proxyRequest(requestType, pRequest, context, ptrConnection, errorHandler)) { // request handled by the overlay return; @@ -729,8 +727,9 @@ void proxyRpcRequest( boost::shared_ptr ptrConnection) { // validate the user if this is client_init - if (boost::algorithm::ends_with(ptrConnection->request().uri(), - "client_init")) + bool isClientInit = boost::algorithm::ends_with(ptrConnection->request().uri(), + "client_init"); + if (isClientInit) { if (!validateUser(ptrConnection, username)) return; @@ -741,7 +740,7 @@ void proxyRpcRequest( if (!sessionContextForRequest(ptrConnection, username, &context)) return; - proxyRequest(RequestType::Rpc, + proxyRequest(isClientInit ? RequestType::ClientInit : RequestType::Rpc, context, ptrConnection, boost::bind(handleRpcError, ptrConnection, context, _1), diff --git a/src/cpp/server/ServerSessionProxyOverlay.cpp b/src/cpp/server/ServerSessionProxyOverlay.cpp index 2886958be04..cf11c9b9897 100644 --- a/src/cpp/server/ServerSessionProxyOverlay.cpp +++ b/src/cpp/server/ServerSessionProxyOverlay.cpp @@ -31,8 +31,7 @@ bool proxyRequest( const boost::shared_ptr& pRequest, const r_util::SessionContext& context, boost::shared_ptr ptrConnection, - const http::ErrorHandler& errorHandler, - const http::ConnectionRetryProfile& connectionRetryProfile) + const http::ErrorHandler& errorHandler) { // not proxying the request return false; diff --git a/src/cpp/server/include/server/ServerSessionProxy.hpp b/src/cpp/server/include/server/ServerSessionProxy.hpp index c3ac00e4c3c..8affe14f55b 100644 --- a/src/cpp/server/include/server/ServerSessionProxy.hpp +++ b/src/cpp/server/include/server/ServerSessionProxy.hpp @@ -41,7 +41,8 @@ struct RequestType { Rpc, Content, - Events + Events, + ClientInit }; }; diff --git a/src/gwt/src/org/rstudio/studio/client/RStudio.java b/src/gwt/src/org/rstudio/studio/client/RStudio.java index fdcb3c5fe8b..7cfb1356275 100644 --- a/src/gwt/src/org/rstudio/studio/client/RStudio.java +++ b/src/gwt/src/org/rstudio/studio/client/RStudio.java @@ -77,6 +77,8 @@ import org.rstudio.studio.client.projects.ui.prefs.ProjectPreferencesDialogResources; import org.rstudio.studio.client.rmarkdown.RmdOutputSatellite; import org.rstudio.studio.client.rsconnect.ui.RSConnectDeploy; +import org.rstudio.studio.client.server.ServerError; +import org.rstudio.studio.client.server.ServerRequestCallback; import org.rstudio.studio.client.shiny.ShinyApplicationSatellite; import org.rstudio.studio.client.vcs.VCSApplication; import org.rstudio.studio.client.workbench.codesearch.ui.CodeSearchResources; @@ -181,6 +183,15 @@ private Command showProgress() homeLabel.getElement().getStyle().setProperty("fontFamily", fontFamily); homeLabel.getElement().getStyle().setProperty("fontSize", fontSize); messagePanel.add(homeLabel); + + connectionStatusLabel_ = new Label(); + connectionStatusLabel_.getElement().getStyle().setWidth(100, Style.Unit.PCT); + connectionStatusLabel_.getElement().getStyle().setProperty("textAlign", "center"); + connectionStatusLabel_.getElement().getStyle().setProperty("fontFamily", fontFamily); + connectionStatusLabel_.getElement().getStyle().setProperty("fontSize", "font-size: 6px;"); + connectionStatusLabel_.getElement().getStyle().setMarginTop(8, Style.Unit.PX); + connectionStatusLabel_.getElement().getStyle().setMarginBottom(8, Style.Unit.PX); + messagePanel.add(connectionStatusLabel_); statusPanel.add(messagePanel); messagePanel.setVisible(false); @@ -377,9 +388,23 @@ else if (PlumberAPISatellite.NAME.equals(view)) } else { + final ServerRequestCallback connectionStatusCallback = + new ServerRequestCallback() { + @Override + public void onResponseReceived(String message) + { + connectionStatusLabel_.setText(message); + } + @Override + public void onError(ServerError error) + { + } + }; + RStudioGinjector.INSTANCE.getApplication().go( RootLayoutPanel.get(), - dismissProgressAnimation_); + dismissProgressAnimation_, + connectionStatusCallback); } } @@ -452,4 +477,5 @@ private void ensureStylesInjected() private Command dismissProgressAnimation_; private Timer showStatusTimer_; + private Label connectionStatusLabel_; } diff --git a/src/gwt/src/org/rstudio/studio/client/application/Application.java b/src/gwt/src/org/rstudio/studio/client/application/Application.java index b6b242420c7..9de3d987cf0 100644 --- a/src/gwt/src/org/rstudio/studio/client/application/Application.java +++ b/src/gwt/src/org/rstudio/studio/client/application/Application.java @@ -155,7 +155,8 @@ public Application(ApplicationView view, } public void go(final RootLayoutPanel rootPanel, - final Command dismissLoadingProgress) + final Command dismissLoadingProgress, + final ServerRequestCallback connectionStatusCallback) { rootPanel_ = rootPanel; @@ -218,6 +219,8 @@ public void onError(ServerError error) error.getUserMessage()); } }) ; + + sessionOpener_.getJobConnectionStatus(connectionStatusCallback); } @Handler diff --git a/src/gwt/src/org/rstudio/studio/client/application/model/ApplicationServerOperations.java b/src/gwt/src/org/rstudio/studio/client/application/model/ApplicationServerOperations.java index 913ba97f8b6..c5496cd01ca 100644 --- a/src/gwt/src/org/rstudio/studio/client/application/model/ApplicationServerOperations.java +++ b/src/gwt/src/org/rstudio/studio/client/application/model/ApplicationServerOperations.java @@ -30,6 +30,9 @@ public interface ApplicationServerOperations extends PrefsServerOperations void clientInit(String baseURL, ServerRequestCallback requestCallback); + // get current connection status for a session job + void getJobConnectionStatus(ServerRequestCallback requestCallback); + // interrupt the current session void interrupt(ServerRequestCallback requestCallback); diff --git a/src/gwt/src/org/rstudio/studio/client/server/remote/RemoteServer.java b/src/gwt/src/org/rstudio/studio/client/server/remote/RemoteServer.java index b18e69f862f..12645334fb8 100644 --- a/src/gwt/src/org/rstudio/studio/client/server/remote/RemoteServer.java +++ b/src/gwt/src/org/rstudio/studio/client/server/remote/RemoteServer.java @@ -322,10 +322,17 @@ public void logException(ClientException e, public void clientInit(String baseURL, final ServerRequestCallback requestCallback) - { + { + // generate a unique id to represent this client init request + // this allows us to request the current status of routing for this request + // for launcher jobs + if (clientInitId_.isEmpty()) + clientInitId_ = StringUtil.makeRandomId(32); + // send init request (record clientId and version contained in response) JSONArray params = new JSONArray(); params.set(0, new JSONString(baseURL)); + params.set(1, new JSONString(clientInitId_)); sendRequest(RPC_SCOPE, CLIENT_INIT, params, @@ -345,6 +352,11 @@ public void onError(ServerError error) } }); } + + @Override + public void getJobConnectionStatus(final ServerRequestCallback requestCallback) + { + } private void setArrayString(JSONArray params, int index, List what) { JSONArray array = new JSONArray(); @@ -5875,6 +5887,7 @@ public void replaceCommentHeader(String command, sendRequest(RPC_SCOPE, REPLACE_COMMENT_HEADER, params, callback); } + protected String clientInitId_ = ""; private String clientId_; private String clientVersion_ = ""; private JsObject launchParameters_; diff --git a/src/gwt/src/org/rstudio/studio/client/workbench/model/SessionOpener.java b/src/gwt/src/org/rstudio/studio/client/workbench/model/SessionOpener.java index bd6716e7d22..5495c910dc8 100644 --- a/src/gwt/src/org/rstudio/studio/client/workbench/model/SessionOpener.java +++ b/src/gwt/src/org/rstudio/studio/client/workbench/model/SessionOpener.java @@ -195,6 +195,13 @@ protected void onFailure() } }); } + + /** + * Streams the session job's current connection details + */ + public void getJobConnectionStatus(final ServerRequestCallback connectionStatusCallback) + { + } protected void waitForSessionJobExit(final String afterRestartCommand, Command onClosed, Command onFailure)