From b8e7b077467704e95e5cefcddb89263ec865b107 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Mon, 29 Apr 2024 19:37:47 -0500 Subject: [PATCH 1/2] Don't recreate subscriptions with failed tables --- .../main/java/io/deephaven/web/client/api/WorkerConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java b/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java index f9fe987e1b6..a3808691c8b 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java @@ -1399,7 +1399,7 @@ private void flush() { } } } - } else { + } else if (state.isRunning()) { List vps = new ArrayList<>(); state.forActiveSubscriptions((table, subscription) -> { assert table.isActive(state) : "Inactive table has a viewport still attached"; From e597269749b8a97576f02ec8d8eb0419e37f77bd Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Thu, 16 May 2024 13:37:52 -0500 Subject: [PATCH 2/2] Defend against fast micro-task loop of reconnecting a table created by batch --- .../web/client/state/ClientTableState.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java b/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java index 355e3f8e6f2..8a8be5f1dfc 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java @@ -15,7 +15,6 @@ import io.deephaven.web.client.api.barrage.WebBarrageUtils; import io.deephaven.web.client.api.barrage.def.ColumnDefinition; import io.deephaven.web.client.api.barrage.def.InitialTableDefinition; -import io.deephaven.web.client.api.barrage.def.TableAttributesDefinition; import io.deephaven.web.client.api.batch.TableConfig; import io.deephaven.web.client.api.filter.FilterCondition; import io.deephaven.web.client.api.lifecycle.HasLifecycle; @@ -28,12 +27,8 @@ import jsinterop.base.Js; import java.util.*; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.stream.Collector; import java.util.stream.Collectors; -import static io.deephaven.web.client.api.barrage.WebBarrageUtils.keyValuePairs; import static io.deephaven.web.client.fu.JsItr.iterate; /** @@ -251,13 +246,7 @@ public ClientTableState newState(TableTicket newHandle, TableConfig config) { final ClientTableState newState = new ClientTableState( connection, newHandle, sorts, conditions, filters, customColumns, dropColumns, viewColumns, this, - (c, s, metadata) -> { - // This fetcher will not be used for the initial fetch, only for refetches. - // Importantly, any CTS with a source (what we are creating here; source=this, above) - // is revived, it does not use the refetcher; we directly rebuild batch operations instead. - // It may make sense to actually have batches route through reviver instead. - connection.getReviver().revive(metadata, s); - }, config.toSummaryString()); + null, config.toSummaryString()); newState.setFlat(config.isFlat()); if (!isRunning()) { onFailed(reason -> newState.setResolution(ResolutionState.FAILED, reason), JsRunnable.doNothing()); @@ -991,6 +980,12 @@ public Promise fetchTable(HasEventHandling failHandler, BrowserHeaders } public Promise refetch(HasEventHandling failHandler, BrowserHeaders metadata) { + if (fetch == null) { + if (failMsg != null) { + return Promise.reject(failMsg); + } + return Promise.resolve(this); + } final Promise promise = Callbacks.grpcUnaryPromise(c -> fetch.fetch(c, this, metadata)); // noinspection unchecked