Skip to content

Commit

Permalink
Make JmxTableHandle support multiple objectNames
Browse files Browse the repository at this point in the history
  • Loading branch information
kokosing committed Mar 22, 2018
1 parent a5fc80b commit 21a33cb
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,13 @@ public synchronized void addRow(String tableName, List<Object> row)
tableData.get(lowerCaseTableName).add(row);
}

public synchronized List<List<Object>> getRows(String tableName, List<Integer> selectedColumns)
public synchronized List<List<Object>> getRows(String objectName, List<Integer> selectedColumns)
{
String lowerCaseTableName = tableName.toLowerCase();
if (!tableData.containsKey(lowerCaseTableName)) {
String lowerCaseObjectName = objectName.toLowerCase();
if (!tableData.containsKey(lowerCaseObjectName)) {
return ImmutableList.of();
}
return projectRows(tableData.get(lowerCaseTableName), selectedColumns);
return projectRows(tableData.get(lowerCaseObjectName), selectedColumns);
}

private List<List<Object>> projectRows(Collection<List<Object>> rows, List<Integer> selectedColumns)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ private JmxTableHandle getJmxHistoryTableHandle(SchemaTableName tableName)
ImmutableList.Builder<JmxColumnHandle> builder = ImmutableList.builder();
builder.add(new JmxColumnHandle(TIMESTAMP_COLUMN_NAME, TIMESTAMP));
builder.addAll(handle.getColumnHandles());
return new JmxTableHandle(handle.getObjectName(), builder.build(), false);
return new JmxTableHandle(handle.getTableName(), handle.getObjectNames(), builder.build(), false);
}

private JmxTableHandle getJmxTableHandle(SchemaTableName tableName)
Expand All @@ -134,7 +134,7 @@ private JmxTableHandle getJmxTableHandle(SchemaTableName tableName)
.sorted(comparing(JmxColumnHandle::getColumnName))
.forEach(columns::add);

return new JmxTableHandle(objectName.get().toString(), columns.build(), true);
return new JmxTableHandle(tableName, ImmutableList.of(objectName.get().toString()), columns.build(), true);
}
catch (JMException e) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,13 @@ private void runUnsafe()

for (JmxTableHandle tableHandle : tableHandles) {
try {
List<Object> row = jmxRecordSetProvider.getLiveRow(
tableHandle,
tableHandle.getColumnHandles(),
dumpTimestamp);
jmxHistoricalData.addRow(tableHandle.getObjectName(), row);
for (String objectName : tableHandle.getObjectNames()) {
List<Object> row = jmxRecordSetProvider.getLiveRow(
objectName,
tableHandle.getColumnHandles(),
dumpTimestamp);
jmxHistoricalData.addRow(tableHandle.getTableName().getTableName(), row);
}
}
catch (Exception exception) {
log.error(exception, "Error reading jmx records");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import java.util.stream.Collectors;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static java.util.Objects.requireNonNull;

public class JmxRecordSetProvider
Expand All @@ -57,10 +58,10 @@ public JmxRecordSetProvider(MBeanServer mbeanServer, NodeManager nodeManager, Jm
this.jmxHistoricalData = requireNonNull(jmxHistoricalData, "jmxHistoryHolder is null");
}

public List<Object> getLiveRow(JmxTableHandle tableHandle, List<? extends ColumnHandle> columns, long entryTimestamp)
public List<Object> getLiveRow(String objectName, List<? extends ColumnHandle> columns, long entryTimestamp)
throws JMException
{
ImmutableMap<String, Optional<Object>> attributes = getAttributes(getColumnNames(columns), tableHandle);
ImmutableMap<String, Optional<Object>> attributes = getAttributes(getColumnNames(columns), objectName);
List<Object> row = new ArrayList<>();

for (ColumnHandle column : columns) {
Expand Down Expand Up @@ -158,12 +159,13 @@ public RecordSet getRecordSet(ConnectorTransactionHandle transaction, ConnectorS
List<List<Object>> rows;
try {
if (tableHandle.isLiveData()) {
rows = ImmutableList.of(getLiveRow(tableHandle, columns));
rows = getLiveRows(tableHandle, columns);
}
else {
rows = jmxHistoricalData.getRows(
tableHandle.getObjectName(),
calculateSelectedColumns(tableHandle.getColumnHandles(), getColumnNames(columns)));
List<Integer> selectedColumns = calculateSelectedColumns(tableHandle.getColumnHandles(), getColumnNames(columns));
rows = tableHandle.getObjectNames().stream()
.flatMap(objectName -> jmxHistoricalData.getRows(objectName, selectedColumns).stream())
.collect(toImmutableList());
}
}
catch (JMException e) {
Expand Down Expand Up @@ -201,10 +203,10 @@ private static List<Type> getColumnTypes(List<? extends ColumnHandle> columnHand
.collect(Collectors.toList());
}

private ImmutableMap<String, Optional<Object>> getAttributes(Set<String> uniqueColumnNames, JmxTableHandle tableHandle)
private ImmutableMap<String, Optional<Object>> getAttributes(Set<String> uniqueColumnNames, String name)
throws JMException
{
ObjectName objectName = new ObjectName(tableHandle.getObjectName());
ObjectName objectName = new ObjectName(name);

String[] columnNamesArray = uniqueColumnNames.toArray(new String[uniqueColumnNames.size()]);

Expand All @@ -215,9 +217,13 @@ private ImmutableMap<String, Optional<Object>> getAttributes(Set<String> uniqueC
return attributes.build();
}

private List<Object> getLiveRow(JmxTableHandle tableHandle, List<? extends ColumnHandle> columns)
private List<List<Object>> getLiveRows(JmxTableHandle tableHandle, List<? extends ColumnHandle> columns)
throws JMException
{
return getLiveRow(tableHandle, columns, 0);
ImmutableList.Builder<List<Object>> rows = ImmutableList.builder();
for (String objectName : tableHandle.getObjectNames()) {
rows.add(getLiveRow(objectName, columns, 0));
}
return rows.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,31 +24,43 @@
import java.util.Objects;

import static com.google.common.base.MoreObjects.toStringHelper;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.collect.Iterables.transform;
import static java.util.Objects.requireNonNull;

public class JmxTableHandle
implements ConnectorTableHandle
{
private final String objectName;
private final SchemaTableName tableName;
private final List<String> objectNames;
private final List<JmxColumnHandle> columnHandles;
private final boolean liveData;

@JsonCreator
public JmxTableHandle(
@JsonProperty("objectName") String objectName,
@JsonProperty("tableName") SchemaTableName tableName,
@JsonProperty("objectNames") List<String> objectNames,
@JsonProperty("columnHandles") List<JmxColumnHandle> columnHandles,
@JsonProperty("liveData") boolean liveData)
{
this.objectName = requireNonNull(objectName, "objectName is null");
this.tableName = requireNonNull(tableName, "tableName is null");
this.objectNames = ImmutableList.copyOf(requireNonNull(objectNames, "objectName is null"));
this.columnHandles = ImmutableList.copyOf(requireNonNull(columnHandles, "columnHandles is null"));
this.liveData = liveData;

checkArgument(!objectNames.isEmpty(), "objectsNames is empty");
}

@JsonProperty
public SchemaTableName getTableName()
{
return tableName;
}

@JsonProperty
public String getObjectName()
public List<String> getObjectNames()
{
return objectName;
return objectNames;
}

@JsonProperty
Expand All @@ -66,7 +78,7 @@ public boolean isLiveData()
@Override
public int hashCode()
{
return Objects.hash(objectName, columnHandles, liveData);
return Objects.hash(tableName, objectNames, columnHandles, liveData);
}

@Override
Expand All @@ -79,7 +91,8 @@ public boolean equals(Object obj)
return false;
}
JmxTableHandle other = (JmxTableHandle) obj;
return Objects.equals(this.objectName, other.objectName) &&
return Objects.equals(tableName, other.tableName) &&
Objects.equals(this.objectNames, other.objectNames) &&
Objects.equals(this.columnHandles, other.columnHandles) &&
Objects.equals(this.liveData, other.liveData);
}
Expand All @@ -88,7 +101,8 @@ public boolean equals(Object obj)
public String toString()
{
return toStringHelper(this)
.add("objectName", objectName)
.add("tableName", objectNames)
.add("objectNames", objectNames)
.add("columnHandles", columnHandles)
.add("liveData", liveData)
.toString();
Expand All @@ -97,7 +111,7 @@ public String toString()
public ConnectorTableMetadata getTableMetadata()
{
return new ConnectorTableMetadata(
new SchemaTableName(JmxMetadata.JMX_SCHEMA_NAME, objectName),
tableName,
ImmutableList.copyOf(transform(columnHandles, JmxColumnHandle::getColumnMetadata)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public void testListTables()
public void testGetTableHandle()
{
JmxTableHandle handle = metadata.getTableHandle(SESSION, RUNTIME_TABLE);
assertEquals(handle.getObjectName(), RUNTIME_OBJECT);
assertEquals(handle.getObjectNames(), ImmutableList.of(RUNTIME_OBJECT));

List<JmxColumnHandle> columns = handle.getColumnHandles();
assertTrue(columns.contains(new JmxColumnHandle("node", createUnboundedVarcharType())));
Expand All @@ -68,7 +68,7 @@ public void testGetTableHandle()
public void testGetTimeTableHandle()
{
JmxTableHandle handle = metadata.getTableHandle(SESSION, RUNTIME_HISTORY_TABLE);
assertEquals(handle.getObjectName(), RUNTIME_OBJECT);
assertEquals(handle.getObjectNames(), ImmutableList.of(RUNTIME_OBJECT));

List<JmxColumnHandle> columns = handle.getColumnHandles();
assertTrue(columns.contains(new JmxColumnHandle("timestamp", TIMESTAMP)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public NodeManager getNodeManager()
});

private final JmxColumnHandle columnHandle = new JmxColumnHandle("node", createUnboundedVarcharType());
private final JmxTableHandle tableHandle = new JmxTableHandle("objectName", ImmutableList.of(columnHandle), true);
private final JmxTableHandle tableHandle = new JmxTableHandle(new SchemaTableName("schema", "tableName"), ImmutableList.of("objectName"), ImmutableList.of(columnHandle), true);

private final JmxSplitManager splitManager = jmxConnector.getSplitManager();
private final JmxMetadata metadata = jmxConnector.getMetadata(new ConnectorTransactionHandle() {});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
*/
package com.facebook.presto.connector.jmx;

import com.facebook.presto.spi.SchemaTableName;
import com.google.common.collect.ImmutableList;
import io.airlift.testing.EquivalenceTester;
import org.testng.annotations.Test;
Expand All @@ -30,7 +31,8 @@ public class TestJmxTableHandle
.add(new JmxColumnHandle("id", BIGINT))
.add(new JmxColumnHandle("name", createUnboundedVarcharType()))
.build();
public static final JmxTableHandle TABLE = new JmxTableHandle("objectName", COLUMNS, true);
public static final SchemaTableName SCHEMA_TABLE_NAME = new SchemaTableName("schema", "tableName");
public static final JmxTableHandle TABLE = new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("objectName"), COLUMNS, true);

@Test
public void testJsonRoundTrip()
Expand All @@ -46,23 +48,23 @@ public void testEquivalence()
List<JmxColumnHandle> singleColumn = ImmutableList.of(COLUMNS.get(0));
EquivalenceTester.equivalenceTester()
.addEquivalentGroup(
new JmxTableHandle("name", COLUMNS, true),
new JmxTableHandle("name", COLUMNS, true))
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("name"), COLUMNS, true),
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("name"), COLUMNS, true))
.addEquivalentGroup(
new JmxTableHandle("name", COLUMNS, false),
new JmxTableHandle("name", COLUMNS, false))
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("name"), COLUMNS, false),
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("name"), COLUMNS, false))
.addEquivalentGroup(
new JmxTableHandle("nameX", COLUMNS, true),
new JmxTableHandle("nameX", COLUMNS, true))
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("nameX"), COLUMNS, true),
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("nameX"), COLUMNS, true))
.addEquivalentGroup(
new JmxTableHandle("nameX", COLUMNS, false),
new JmxTableHandle("nameX", COLUMNS, false))
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("nameX"), COLUMNS, false),
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("nameX"), COLUMNS, false))
.addEquivalentGroup(
new JmxTableHandle("name", singleColumn, true),
new JmxTableHandle("name", singleColumn, true))
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("name"), singleColumn, true),
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("name"), singleColumn, true))
.addEquivalentGroup(
new JmxTableHandle("name", singleColumn, false),
new JmxTableHandle("name", singleColumn, false))
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("name"), singleColumn, false),
new JmxTableHandle(SCHEMA_TABLE_NAME, ImmutableList.of("name"), singleColumn, false))
.check();
}
}

0 comments on commit 21a33cb

Please sign in to comment.