diff --git a/plugin/trino-jmx/src/main/java/io/trino/plugin/jmx/JmxRecordSetProvider.java b/plugin/trino-jmx/src/main/java/io/trino/plugin/jmx/JmxRecordSetProvider.java index 9045d6ac98d4..3c3c0cf67b4d 100644 --- a/plugin/trino-jmx/src/main/java/io/trino/plugin/jmx/JmxRecordSetProvider.java +++ b/plugin/trino-jmx/src/main/java/io/trino/plugin/jmx/JmxRecordSetProvider.java @@ -29,6 +29,7 @@ import io.trino.spi.type.Type; import javax.management.Attribute; +import javax.management.InstanceNotFoundException; import javax.management.JMException; import javax.management.MBeanServer; import javax.management.ObjectName; @@ -228,7 +229,12 @@ private List> getLiveRows(JmxTableHandle tableHandle, List> rows = ImmutableList.builder(); for (String objectName : tableHandle.objectNames()) { - rows.add(getLiveRow(objectName, columns, 0)); + try { + rows.add(getLiveRow(objectName, columns, 0)); + } + catch (InstanceNotFoundException _) { + // Ignore if the object doesn't exist. This might happen when it exists on the coordinator but has not yet been created on the worker. + } } return rows.build(); } diff --git a/plugin/trino-jmx/src/test/java/io/trino/plugin/jmx/TestJmxSplitManager.java b/plugin/trino-jmx/src/test/java/io/trino/plugin/jmx/TestJmxSplitManager.java index 9c1add71c322..e5588e22a4f3 100644 --- a/plugin/trino-jmx/src/test/java/io/trino/plugin/jmx/TestJmxSplitManager.java +++ b/plugin/trino-jmx/src/test/java/io/trino/plugin/jmx/TestJmxSplitManager.java @@ -43,6 +43,7 @@ import java.net.URI; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.ExecutionException; @@ -156,6 +157,46 @@ public void testRecordSetProvider() } } + @Test + public void testNonExistentObjectName() + throws Exception + { + JmxTableHandle jmxTableHandle = metadata.listTables(SESSION, Optional.of(JMX_SCHEMA_NAME)).stream() + .map(schemaTableName -> metadata.getTableHandle(SESSION, schemaTableName, Optional.empty(), Optional.empty())) + .filter(Objects::nonNull) + .filter(tableHandle -> !tableHandle.objectNames().isEmpty()) + .findFirst() + .orElseThrow(); + + ImmutableList objectNames = ImmutableList.builder() + .addAll(jmxTableHandle.objectNames()) + .add("JMImplementation:type=Unknown") + .build(); + JmxTableHandle tableHandleWithUnknownObject = new JmxTableHandle( + jmxTableHandle.tableName(), + objectNames, + jmxTableHandle.columnHandles(), + jmxTableHandle.liveData(), + jmxTableHandle.nodeFilter()); + + List columnHandles = ImmutableList.copyOf(metadata.getColumnHandles(SESSION, tableHandleWithUnknownObject).values()); + ConnectorSplitSource splitSource = splitManager.getSplits(JmxTransactionHandle.INSTANCE, SESSION, tableHandleWithUnknownObject, DynamicFilter.EMPTY, Constraint.alwaysTrue()); + List allSplits = getAllSplits(splitSource); + assertThat(allSplits).hasSize(nodes.size()); + ConnectorSplit split = allSplits.getFirst(); + + RecordSet recordSet = recordSetProvider.getRecordSet(JmxTransactionHandle.INSTANCE, SESSION, split, tableHandleWithUnknownObject, columnHandles); + + int count = 0; + try (RecordCursor cursor = recordSet.cursor()) { + while (cursor.advanceNextPosition()) { + count++; + } + } + + assertThat(count).isEqualTo(objectNames.size() - 1); + } + @Test public void testHistoryRecordSetProvider() throws Exception