Skip to content

Commit 3dd4eb4

Browse files
bryanckBryan Keller
andauthored
Configurable long timeout for metadata queries (#609)
Co-authored-by: Bryan Keller <[email protected]>
1 parent 97d3dec commit 3dd4eb4

File tree

6 files changed

+35
-7
lines changed

6 files changed

+35
-7
lines changed

metacat-common-server/src/main/java/com/netflix/metacat/common/server/properties/Config.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,13 @@ public interface Config {
587587
*/
588588
int getMetadataQueryTimeout();
589589

590+
/**
591+
* Metadata query timeout in seconds, for longer running queries.
592+
*
593+
* @return Metadata query timeout in seconds for longer running queries
594+
*/
595+
int getLongMetadataQueryTimeout();
596+
590597
/**
591598
* Whether to check the existence of the iceberg metadata location before updating the table.
592599
*

metacat-common-server/src/main/java/com/netflix/metacat/common/server/properties/DefaultConfigImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,11 @@ public int getMetadataQueryTimeout() {
664664
return this.metacatProperties.getUsermetadata().getQueryTimeoutInSeconds();
665665
}
666666

667+
@Override
668+
public int getLongMetadataQueryTimeout() {
669+
return this.metacatProperties.getUsermetadata().getLongQueryTimeoutInSeconds();
670+
}
671+
667672
@Override
668673
public boolean isIcebergPreviousMetadataLocationCheckEnabled() {
669674
return this.metacatProperties.getHive().getIceberg().isIcebergPreviousMetadataLocationCheckEnabled();

metacat-common-server/src/main/java/com/netflix/metacat/common/server/properties/UserMetadata.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class UserMetadata {
3131
@NonNull
3232
private Config config = new Config();
3333
private int queryTimeoutInSeconds = 60;
34+
private int longQueryTimeoutInSeconds = 120;
3435

3536
/**
3637
* config related properties.

metacat-metadata-mysql/src/main/java/com/netflix/metacat/metadata/mysql/MySqlServiceUtil.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.springframework.dao.EmptyResultDataAccessException;
2020
import org.springframework.jdbc.core.JdbcTemplate;
2121

22+
import javax.sql.DataSource;
2223
import java.io.InputStream;
2324
import java.net.URL;
2425
import java.nio.file.FileSystems;
@@ -81,6 +82,19 @@ public static void loadMySqlDataSource(final DataSourceManager dataSourceManager
8182
}
8283
dataSourceManager.load(UserMetadataService.NAME_DATASOURCE, connectionProperties);
8384
}
85+
86+
/**
87+
* Create a JDBC template with a query timeout.
88+
*
89+
* @param dataSource data source
90+
* @param timeoutSec query timeout, in sec
91+
* @return the JDBC template
92+
*/
93+
public static JdbcTemplate createJdbcTemplate(final DataSource dataSource, final int timeoutSec) {
94+
final JdbcTemplate result = new JdbcTemplate(dataSource);
95+
result.setQueryTimeout(timeoutSec);
96+
return result;
97+
}
8498
}
8599

86100

metacat-metadata-mysql/src/main/java/com/netflix/metacat/metadata/mysql/MySqlTagService.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ public class MySqlTagService implements TagService {
9999
private final LookupService lookupService;
100100
private final MetacatJson metacatJson;
101101
private final UserMetadataService userMetadataService;
102-
private JdbcTemplate jdbcTemplate;
102+
private final JdbcTemplate jdbcTemplate;
103+
private final JdbcTemplate jdbcTemplateLongTimeout;
103104

104105
/**
105106
* Constructor.
@@ -119,6 +120,8 @@ public MySqlTagService(
119120
) {
120121
this.config = Preconditions.checkNotNull(config, "config is required");
121122
this.jdbcTemplate = jdbcTemplate;
123+
this.jdbcTemplateLongTimeout = MySqlServiceUtil.createJdbcTemplate(
124+
jdbcTemplate.getDataSource(), config.getLongMetadataQueryTimeout());
122125
this.lookupService = Preconditions.checkNotNull(lookupService, "lookupService is required");
123126
this.metacatJson = Preconditions.checkNotNull(metacatJson, "metacatJson is required");
124127
this.userMetadataService = Preconditions.checkNotNull(userMetadataService, "userMetadataService is required");
@@ -320,7 +323,7 @@ public Set<String> getTags() {
320323
* @return list of qualified names of the items
321324
*/
322325
@Override
323-
@Transactional(readOnly = true, timeout = 120)
326+
@Transactional(readOnly = true)
324327
public List<QualifiedName> list(
325328
@Nullable final Set<String> includeTags,
326329
@Nullable final Set<String> excludeTags,
@@ -477,7 +480,7 @@ private List<String> queryTaggedItems(final String name,
477480
new SqlParameterValue(Types.INTEGER, type == null ? 1 : 0),
478481
new SqlParameterValue(Types.VARCHAR, type == null ? ".*" : type.getRegexValue())
479482
).collect(Collectors.toList()));
480-
return jdbcTemplate.query(query,
483+
return jdbcTemplateLongTimeout.query(query,
481484
sqlParams.toArray(),
482485
(rs, rowNum) -> rs.getString("name"));
483486
}

metacat-metadata-mysql/src/main/java/com/netflix/metacat/metadata/mysql/MySqlUserMetadataConfig.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,7 @@ public DataSourceTransactionManager metadataTxManager(
162162
public JdbcTemplate metadataJdbcTemplate(
163163
@Qualifier("metadataDataSource") final DataSource mySqlDataSource,
164164
final Config config) {
165-
final JdbcTemplate result = new JdbcTemplate(mySqlDataSource);
166-
result.setQueryTimeout(config.getMetadataQueryTimeout());
167-
return result;
165+
return MySqlServiceUtil.createJdbcTemplate(
166+
mySqlDataSource, config.getMetadataQueryTimeout());
168167
}
169-
170168
}

0 commit comments

Comments
 (0)