diff --git a/gateway-ha/src/main/java/io/trino/gateway/ha/router/HaGatewayManager.java b/gateway-ha/src/main/java/io/trino/gateway/ha/router/HaGatewayManager.java index efa5a8a97..03c7b9795 100644 --- a/gateway-ha/src/main/java/io/trino/gateway/ha/router/HaGatewayManager.java +++ b/gateway-ha/src/main/java/io/trino/gateway/ha/router/HaGatewayManager.java @@ -13,8 +13,8 @@ */ package io.trino.gateway.ha.router; -import com.google.common.collect.ImmutableList; -import io.airlift.log.Logger; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import io.trino.gateway.ha.config.ProxyBackendConfiguration; import io.trino.gateway.ha.persistence.dao.GatewayBackend; import io.trino.gateway.ha.persistence.dao.GatewayBackendDao; @@ -23,59 +23,63 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; +import static com.google.common.collect.ImmutableList.toImmutableList; import static java.util.Objects.requireNonNull; +import static java.util.concurrent.TimeUnit.MILLISECONDS; public class HaGatewayManager implements GatewayBackendManager { - private static final Logger log = Logger.get(HaGatewayManager.class); - private final GatewayBackendDao dao; + private final Supplier> gatewayBackendSupplier; + private final AtomicReference> cache = new AtomicReference<>(); public HaGatewayManager(Jdbi jdbi) { dao = requireNonNull(jdbi, "jdbi is null").onDemand(GatewayBackendDao.class); + gatewayBackendSupplier = Suppliers.memoizeWithExpiration(dao::findAll, 500, MILLISECONDS); } @Override public List getAllBackends() { - List proxyBackendList = dao.findAll(); + List proxyBackendList = fetchAllBackends(); return upcast(proxyBackendList); } @Override public List getAllActiveBackends() { - List proxyBackendList = dao.findActiveBackend(); + List proxyBackendList = fetchAllBackends().stream() + .filter(GatewayBackend::active) + .collect(toImmutableList()); return upcast(proxyBackendList); } @Override public List getActiveAdhocBackends() { - try { - List proxyBackendList = dao.findActiveAdhocBackend(); - return upcast(proxyBackendList); - } - catch (Exception e) { - log.info("Error fetching all backends: %s", e.getLocalizedMessage()); - } - return ImmutableList.of(); + return getActiveBackends("adhoc"); } @Override public List getActiveBackends(String routingGroup) { - List proxyBackendList = dao.findActiveBackendByRoutingGroup(routingGroup); + List proxyBackendList = fetchAllBackends().stream() + .filter(GatewayBackend::active) + .filter(backend -> backend.routingGroup().equals(routingGroup)) + .collect(toImmutableList()); return upcast(proxyBackendList); } @Override public Optional getBackendByName(String name) { - List proxyBackendList = dao.findByName(name); + List proxyBackendList = fetchAllBackends().stream() + .filter(backend -> backend.name().equals(name)) + .collect(toImmutableList()); return upcast(proxyBackendList).stream().findAny(); } @@ -130,4 +134,16 @@ private static List upcast(List gatew } return proxyBackendConfigurations; } + + private List fetchAllBackends() + { + try { + List backends = gatewayBackendSupplier.get(); + cache.set(backends); + return backends; + } + catch (Exception e) { + return cache.get(); + } + } } diff --git a/gateway-ha/src/main/java/io/trino/gateway/ha/router/HaQueryHistoryManager.java b/gateway-ha/src/main/java/io/trino/gateway/ha/router/HaQueryHistoryManager.java index f96bb3c71..7e863b725 100644 --- a/gateway-ha/src/main/java/io/trino/gateway/ha/router/HaQueryHistoryManager.java +++ b/gateway-ha/src/main/java/io/trino/gateway/ha/router/HaQueryHistoryManager.java @@ -14,6 +14,7 @@ package io.trino.gateway.ha.router; import com.google.common.base.Strings; +import io.airlift.log.Logger; import io.trino.gateway.ha.domain.TableData; import io.trino.gateway.ha.domain.request.QueryHistoryRequest; import io.trino.gateway.ha.domain.response.DistributionResponse; @@ -35,6 +36,8 @@ public class HaQueryHistoryManager implements QueryHistoryManager { + private final Logger logger = Logger.get(HaQueryHistoryManager.class); + private static final int FIRST_PAGE_NO = 1; private final QueryHistoryDao dao; @@ -52,13 +55,18 @@ public void submitQueryDetail(QueryDetail queryDetail) return; } - dao.insertHistory( - queryDetail.getQueryId(), - queryDetail.getQueryText(), - queryDetail.getBackendUrl(), - queryDetail.getUser(), - queryDetail.getSource(), - queryDetail.getCaptureTime()); + try { + dao.insertHistory( + queryDetail.getQueryId(), + queryDetail.getQueryText(), + queryDetail.getBackendUrl(), + queryDetail.getUser(), + queryDetail.getSource(), + queryDetail.getCaptureTime()); + } + catch (Exception e) { + logger.error(e); + } } @Override