Skip to content

Commit bf21b4f

Browse files
committed
Minor optimization to methods list and getQualifiedNames.
1 parent 5e1bef4 commit bf21b4f

File tree

1 file changed

+43
-17
lines changed

1 file changed

+43
-17
lines changed

metacat-main/src/main/java/com/netflix/metacat/main/services/impl/PartitionServiceImpl.java

+43-17
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525
import com.facebook.presto.spi.TableNotFoundException;
2626
import com.fasterxml.jackson.databind.node.ObjectNode;
2727
import com.google.common.base.Splitter;
28+
import com.google.common.base.Throwables;
2829
import com.google.common.collect.Lists;
2930
import com.google.common.collect.Maps;
31+
import com.google.common.util.concurrent.Futures;
32+
import com.google.common.util.concurrent.ListenableFuture;
3033
import com.netflix.metacat.common.QualifiedName;
3134
import com.netflix.metacat.common.dto.HasMetadata;
3235
import com.netflix.metacat.common.dto.PartitionDto;
@@ -35,6 +38,7 @@
3538
import com.netflix.metacat.common.monitoring.DynamicGauge;
3639
import com.netflix.metacat.common.monitoring.LogConstants;
3740
import com.netflix.metacat.common.usermetadata.UserMetadataService;
41+
import com.netflix.metacat.common.util.ThreadServiceManager;
3842
import com.netflix.metacat.converters.PrestoConverters;
3943
import com.netflix.metacat.main.presto.split.SplitManager;
4044
import com.netflix.metacat.main.services.CatalogService;
@@ -52,6 +56,7 @@
5256
import java.util.List;
5357
import java.util.Map;
5458
import java.util.Optional;
59+
import java.util.concurrent.TimeUnit;
5560
import java.util.stream.Collectors;
5661

5762
public class PartitionServiceImpl implements PartitionService {
@@ -68,6 +73,8 @@ public class PartitionServiceImpl implements PartitionService {
6873
UserMetadataService userMetadataService;
6974
@Inject
7075
SessionProvider sessionProvider;
76+
@Inject
77+
ThreadServiceManager threadServiceManager;
7178

7279
private ConnectorPartitionResult getPartitionResult(QualifiedName name, String filter, List<String> partitionNames, Sort sort, Pageable pageable, boolean includePartitionDetails) {
7380
ConnectorPartitionResult result = null;
@@ -95,13 +102,23 @@ public List<PartitionDto> list(QualifiedName name, String filter, List<String> p
95102
})
96103
.collect(Collectors.toList());
97104
if(includeUserDefinitionMetadata || includeUserDataMetadata){
98-
Map<String,ObjectNode> dataMetadataMap = includeUserDataMetadata?userMetadataService.getDataMetadataMap(uris):
99-
Maps.newHashMap();
100-
Map<String,ObjectNode> definitionMetadataMap = includeUserDefinitionMetadata?userMetadataService.getDefinitionMetadataMap(names):
101-
Maps.newHashMap();
102-
result.stream().forEach(partitionDto -> userMetadataService.populateMetadata(partitionDto
103-
, definitionMetadataMap.get(partitionDto.getName().toString())
104-
, dataMetadataMap.get(partitionDto.getDataUri())));
105+
List<ListenableFuture<Map<String,ObjectNode>>> futures = Lists.newArrayList();
106+
futures.add(threadServiceManager.getExecutor().submit(() -> includeUserDefinitionMetadata ?
107+
userMetadataService.getDefinitionMetadataMap(names) :
108+
Maps.newHashMap()));
109+
futures.add(threadServiceManager.getExecutor().submit(() -> includeUserDataMetadata?
110+
userMetadataService.getDataMetadataMap(uris):
111+
Maps.newHashMap()));
112+
try {
113+
List<Map<String,ObjectNode>> metadataResults = Futures.successfulAsList(futures).get(1, TimeUnit.HOURS);
114+
Map<String,ObjectNode> definitionMetadataMap = metadataResults.get(0);
115+
Map<String,ObjectNode> dataMetadataMap = metadataResults.get(1);
116+
result.stream().forEach(partitionDto -> userMetadataService.populateMetadata(partitionDto
117+
, definitionMetadataMap.get(partitionDto.getName().toString())
118+
, dataMetadataMap.get(partitionDto.getDataUri())));
119+
} catch (Exception e) {
120+
Throwables.propagate(e);
121+
}
105122
}
106123
}
107124
TagList tags = BasicTagList.of("catalog", name.getCatalogName(), "database", name.getDatabaseName(), "table", name.getTableName());
@@ -154,12 +171,12 @@ public PartitionsSaveResponseDto save(QualifiedName name, List<PartitionDto> par
154171

155172
// Save metadata
156173
log.info("Saving user metadata for partitions for {}", name);
157-
userMetadataService.saveMetadatas(session.getUser(), partitionDtos, true);
158174
// delete metadata
159175
if( !deletePartitions.isEmpty()) {
160176
log.info("Deleting user metadata for partitions with names {} for {}", partitionIdsForDeletes, name);
161177
userMetadataService.deleteMetadatas(deletePartitions, false);
162178
}
179+
userMetadataService.saveMetadatas(session.getUser(), partitionDtos, true);
163180

164181
result.setUpdated(savePartitionResult.getUpdated());
165182
result.setAdded(savePartitionResult.getAdded());
@@ -204,18 +221,27 @@ public void delete(QualifiedName name, List<String> partitionIds) {
204221

205222
@Override
206223
public List<QualifiedName> getQualifiedNames(String uri, boolean prefixSearch){
207-
List<QualifiedName> result = Lists.newArrayList();
208-
224+
List<QualifiedName> result = Lists.newCopyOnWriteArrayList();
225+
List<ListenableFuture<Void>> futures = Lists.newArrayList();
209226
catalogService.getCatalogNames().stream().forEach(catalog -> {
210227
Session session = sessionProvider.getSession(QualifiedName.ofCatalog(catalog.getCatalogName()));
211-
List<SchemaTablePartitionName> schemaTablePartitionNames = splitManager.getPartitionNames( session, uri, prefixSearch);
212-
List<QualifiedName> qualifiedNames = schemaTablePartitionNames.stream().map(
213-
schemaTablePartitionName -> QualifiedName.ofPartition( catalog.getConnectorName()
214-
, schemaTablePartitionName.getTableName().getSchemaName()
215-
, schemaTablePartitionName.getTableName().getTableName()
216-
, schemaTablePartitionName.getPartitionId())).collect(Collectors.toList());
217-
result.addAll(qualifiedNames);
228+
futures.add(threadServiceManager.getExecutor().submit(() -> {
229+
List<SchemaTablePartitionName> schemaTablePartitionNames = splitManager
230+
.getPartitionNames(session, uri, prefixSearch);
231+
List<QualifiedName> qualifiedNames = schemaTablePartitionNames.stream().map(
232+
schemaTablePartitionName -> QualifiedName.ofPartition(catalog.getConnectorName()
233+
, schemaTablePartitionName.getTableName().getSchemaName()
234+
, schemaTablePartitionName.getTableName().getTableName()
235+
, schemaTablePartitionName.getPartitionId())).collect(Collectors.toList());
236+
result.addAll(qualifiedNames);
237+
return null;
238+
}));
218239
});
240+
try {
241+
Futures.allAsList(futures).get(1, TimeUnit.HOURS);
242+
} catch (Exception e) {
243+
Throwables.propagate(e);
244+
}
219245
return result;
220246
}
221247

0 commit comments

Comments
 (0)