Skip to content

Commit e1b9833

Browse files
authored
Reduce getRealmConfig calls (#2337)
Classes with a `CallContext` field should call `getRealmConfig` once and store it as a field as well. The idea is that long term we would want to stop relying on the `CallContext` itself but instead inject its individual items. Thus we also add `RealmConfig` to `TestServices`.
1 parent a186141 commit e1b9833

File tree

14 files changed

+78
-104
lines changed

14 files changed

+78
-104
lines changed

runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import org.apache.polaris.core.auth.PolarisPrincipal;
8080
import org.apache.polaris.core.catalog.PolarisCatalogHelpers;
8181
import org.apache.polaris.core.config.FeatureConfiguration;
82+
import org.apache.polaris.core.config.RealmConfig;
8283
import org.apache.polaris.core.connection.AuthenticationParametersDpo;
8384
import org.apache.polaris.core.context.CallContext;
8485
import org.apache.polaris.core.entity.CatalogEntity;
@@ -138,6 +139,7 @@ public class PolarisAdminService {
138139
private static final Logger LOGGER = LoggerFactory.getLogger(PolarisAdminService.class);
139140

140141
private final CallContext callContext;
142+
private final RealmConfig realmConfig;
141143
private final ResolutionManifestFactory resolutionManifestFactory;
142144
private final SecurityContext securityContext;
143145
private final PolarisPrincipal polarisPrincipal;
@@ -158,6 +160,7 @@ public PolarisAdminService(
158160
@NotNull PolarisAuthorizer authorizer,
159161
@NotNull ReservedProperties reservedProperties) {
160162
this.callContext = callContext;
163+
this.realmConfig = callContext.getRealmConfig();
161164
this.resolutionManifestFactory = resolutionManifestFactory;
162165
this.metaStoreManager = metaStoreManager;
163166
this.securityContext = securityContext;
@@ -643,7 +646,7 @@ private String terminateWithSlash(String path) {
643646
*/
644647
private boolean catalogOverlapsWithExistingCatalog(CatalogEntity catalogEntity) {
645648
boolean allowOverlappingCatalogUrls =
646-
callContext.getRealmConfig().getConfig(FeatureConfiguration.ALLOW_OVERLAPPING_CATALOG_URLS);
649+
realmConfig.getConfig(FeatureConfiguration.ALLOW_OVERLAPPING_CATALOG_URLS);
647650
if (allowOverlappingCatalogUrls) {
648651
return false;
649652
}
@@ -744,8 +747,7 @@ public PolarisEntity createCatalog(CreateCatalogRequest catalogRequest) {
744747
PolarisAuthorizableOperation op = PolarisAuthorizableOperation.CREATE_CATALOG;
745748
authorizeBasicRootOperationOrThrow(op);
746749

747-
CatalogEntity entity =
748-
CatalogEntity.fromCatalog(callContext.getRealmConfig(), catalogRequest.getCatalog());
750+
CatalogEntity entity = CatalogEntity.fromCatalog(realmConfig, catalogRequest.getCatalog());
749751

750752
checkArgument(entity.getId() == -1, "Entity to be created must have no ID assigned");
751753

@@ -773,11 +775,10 @@ public PolarisEntity createCatalog(CreateCatalogRequest catalogRequest) {
773775
.addKeyValue("catalogName", entity.getName())
774776
.log("Creating a federated catalog");
775777
FeatureConfiguration.enforceFeatureEnabledOrThrow(
776-
callContext.getRealmConfig(), FeatureConfiguration.ENABLE_CATALOG_FEDERATION);
778+
realmConfig, FeatureConfiguration.ENABLE_CATALOG_FEDERATION);
777779
Map<String, SecretReference> processedSecretReferences = Map.of();
778780
List<String> supportedAuthenticationTypes =
779-
callContext
780-
.getRealmConfig()
781+
realmConfig
781782
.getConfig(FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES)
782783
.stream()
783784
.map(s -> s.toUpperCase(Locale.ROOT))
@@ -830,8 +831,7 @@ public void deleteCatalog(String name) {
830831
findCatalogByName(name)
831832
.orElseThrow(() -> new NotFoundException("Catalog %s not found", name));
832833
// TODO: Handle return value in case of concurrent modification
833-
boolean cleanup =
834-
callContext.getRealmConfig().getConfig(FeatureConfiguration.CLEANUP_ON_CATALOG_DROP);
834+
boolean cleanup = realmConfig.getConfig(FeatureConfiguration.CLEANUP_ON_CATALOG_DROP);
835835
DropEntityResult dropEntityResult =
836836
metaStoreManager.dropEntityIfExists(
837837
getCurrentPolarisContext(), null, entity, Map.of(), cleanup);
@@ -950,7 +950,7 @@ private void validateUpdateCatalogDiffOrThrow(
950950
}
951951
if (updateRequest.getStorageConfigInfo() != null) {
952952
updateBuilder.setStorageConfigurationInfo(
953-
callContext.getRealmConfig(), updateRequest.getStorageConfigInfo(), defaultBaseLocation);
953+
realmConfig, updateRequest.getStorageConfigInfo(), defaultBaseLocation);
954954
}
955955
CatalogEntity updatedEntity = updateBuilder.build();
956956

runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import org.apache.polaris.core.auth.PolarisAuthorizer;
6565
import org.apache.polaris.core.auth.PolarisPrincipal;
6666
import org.apache.polaris.core.config.FeatureConfiguration;
67+
import org.apache.polaris.core.config.RealmConfig;
6768
import org.apache.polaris.core.context.CallContext;
6869
import org.apache.polaris.core.context.RealmContext;
6970
import org.apache.polaris.core.entity.CatalogEntity;
@@ -98,6 +99,7 @@ public class PolarisServiceImpl
9899
private final MetaStoreManagerFactory metaStoreManagerFactory;
99100
private final UserSecretsManagerFactory userSecretsManagerFactory;
100101
private final CallContext callContext;
102+
private final RealmConfig realmConfig;
101103
private final ReservedProperties reservedProperties;
102104

103105
@Inject
@@ -113,6 +115,7 @@ public PolarisServiceImpl(
113115
this.userSecretsManagerFactory = userSecretsManagerFactory;
114116
this.polarisAuthorizer = polarisAuthorizer;
115117
this.callContext = callContext;
118+
this.realmConfig = callContext.getRealmConfig();
116119
this.reservedProperties = reservedProperties;
117120
}
118121

@@ -168,9 +171,7 @@ public Response createCatalog(
168171

169172
private void validateStorageConfig(StorageConfigInfo storageConfigInfo) {
170173
List<String> allowedStorageTypes =
171-
callContext
172-
.getRealmConfig()
173-
.getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES);
174+
realmConfig.getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES);
174175
if (!allowedStorageTypes.contains(storageConfigInfo.getStorageType().name())) {
175176
LOGGER
176177
.atWarn()
@@ -197,10 +198,7 @@ private void validateConnectionConfigInfo(ConnectionConfigInfo connectionConfigI
197198

198199
String connectionType = connectionConfigInfo.getConnectionType().name();
199200
List<String> supportedConnectionTypes =
200-
callContext
201-
.getRealmConfig()
202-
.getConfig(FeatureConfiguration.SUPPORTED_CATALOG_CONNECTION_TYPES)
203-
.stream()
201+
realmConfig.getConfig(FeatureConfiguration.SUPPORTED_CATALOG_CONNECTION_TYPES).stream()
204202
.map(s -> s.toUpperCase(Locale.ROOT))
205203
.toList();
206204
if (!supportedConnectionTypes.contains(connectionType)) {
@@ -212,8 +210,7 @@ private void validateAuthenticationParameters(AuthenticationParameters authentic
212210

213211
String authenticationType = authenticationParameters.getAuthenticationType().name();
214212
List<String> supportedAuthenticationTypes =
215-
callContext
216-
.getRealmConfig()
213+
realmConfig
217214
.getConfig(FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES)
218215
.stream()
219216
.map(s -> s.toUpperCase(Locale.ROOT))

runtime/service/src/main/java/org/apache/polaris/service/catalog/common/CatalogHandler.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.apache.polaris.core.auth.PolarisPrincipal;
3838
import org.apache.polaris.core.catalog.ExternalCatalogFactory;
3939
import org.apache.polaris.core.catalog.PolarisCatalogHelpers;
40+
import org.apache.polaris.core.config.RealmConfig;
4041
import org.apache.polaris.core.context.CallContext;
4142
import org.apache.polaris.core.entity.PolarisEntitySubType;
4243
import org.apache.polaris.core.entity.PolarisEntityType;
@@ -66,6 +67,7 @@ public abstract class CatalogHandler {
6667

6768
protected final PolarisDiagnostics diagnostics;
6869
protected final CallContext callContext;
70+
protected final RealmConfig realmConfig;
6971
protected final PolarisPrincipal polarisPrincipal;
7072
protected final SecurityContext securityContext;
7173

@@ -79,6 +81,7 @@ public CatalogHandler(
7981
Instance<ExternalCatalogFactory> externalCatalogFactories) {
8082
this.callContext = callContext;
8183
this.diagnostics = callContext.getPolarisCallContext().getDiagServices();
84+
this.realmConfig = callContext.getRealmConfig();
8285
this.resolutionManifestFactory = resolutionManifestFactory;
8386
this.catalogName = catalogName;
8487
diagnostics.checkNotNull(securityContext, "null_security_context");

runtime/service/src/main/java/org/apache/polaris/service/catalog/generic/GenericTableCatalogAdapter.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.polaris.core.auth.PolarisAuthorizer;
2929
import org.apache.polaris.core.catalog.ExternalCatalogFactory;
3030
import org.apache.polaris.core.config.FeatureConfiguration;
31+
import org.apache.polaris.core.config.RealmConfig;
3132
import org.apache.polaris.core.context.CallContext;
3233
import org.apache.polaris.core.context.RealmContext;
3334
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
@@ -50,6 +51,7 @@ public class GenericTableCatalogAdapter
5051
private static final Logger LOGGER = LoggerFactory.getLogger(GenericTableCatalogAdapter.class);
5152

5253
private final RealmContext realmContext;
54+
private final RealmConfig realmConfig;
5355
private final CallContext callContext;
5456
private final ResolutionManifestFactory resolutionManifestFactory;
5557
private final PolarisMetaStoreManager metaStoreManager;
@@ -72,6 +74,7 @@ public GenericTableCatalogAdapter(
7274
@Any Instance<ExternalCatalogFactory> externalCatalogFactories) {
7375
this.realmContext = realmContext;
7476
this.callContext = callContext;
77+
this.realmConfig = callContext.getRealmConfig();
7578
this.resolutionManifestFactory = resolutionManifestFactory;
7679
this.metaStoreManager = metaStoreManager;
7780
this.polarisAuthorizer = polarisAuthorizer;
@@ -84,7 +87,7 @@ public GenericTableCatalogAdapter(
8487
private GenericTableCatalogHandler newHandlerWrapper(
8588
SecurityContext securityContext, String prefix) {
8689
FeatureConfiguration.enforceFeatureEnabledOrThrow(
87-
callContext.getRealmConfig(), FeatureConfiguration.ENABLE_GENERIC_TABLES);
90+
realmConfig, FeatureConfiguration.ENABLE_GENERIC_TABLES);
8891
validatePrincipal(securityContext);
8992

9093
return new GenericTableCatalogHandler(

runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java

Lines changed: 21 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ public class IcebergCatalog extends BaseMetastoreViewCatalog
171171
private final StorageCredentialCache storageCredentialCache;
172172
private final ResolverFactory resolverFactory;
173173
private final CallContext callContext;
174+
private final RealmConfig realmConfig;
174175
private final PolarisResolutionManifestCatalogView resolvedEntityView;
175176
private final CatalogEntity catalogEntity;
176177
private final TaskExecutor taskExecutor;
@@ -209,6 +210,7 @@ public IcebergCatalog(
209210
this.storageCredentialCache = storageCredentialCache;
210211
this.resolverFactory = resolverFactory;
211212
this.callContext = callContext;
213+
this.realmConfig = callContext.getRealmConfig();
212214
this.resolvedEntityView = resolvedEntityView;
213215
this.catalogEntity =
214216
CatalogEntity.of(resolvedEntityView.getResolvedReferenceCatalogEntity().getRawLeafEntity());
@@ -256,7 +258,7 @@ public void initialize(String name, Map<String, String> properties) {
256258
var storageConfigurationInfo = catalogEntity.getStorageConfigurationInfo();
257259
ioImplClassName =
258260
IcebergPropertiesValidation.determineFileIOClassName(
259-
callContext.getRealmConfig(), properties, storageConfigurationInfo);
261+
realmConfig, properties, storageConfigurationInfo);
260262

261263
if (ioImplClassName == null) {
262264
LOGGER.warn(
@@ -346,10 +348,8 @@ public TableOperations newTableOps(
346348
@Override
347349
protected TableOperations newTableOps(TableIdentifier tableIdentifier) {
348350
boolean makeMetadataCurrentOnCommit =
349-
callContext
350-
.getRealmConfig()
351-
.getConfig(
352-
BehaviorChangeConfiguration.TABLE_OPERATIONS_MAKE_METADATA_CURRENT_ON_COMMIT);
351+
realmConfig.getConfig(
352+
BehaviorChangeConfiguration.TABLE_OPERATIONS_MAKE_METADATA_CURRENT_ON_COMMIT);
353353
return newTableOps(tableIdentifier, makeMetadataCurrentOnCommit);
354354
}
355355

@@ -488,7 +488,7 @@ private void createNamespaceInternal(
488488

489489
// Set / suffix
490490
boolean requireTrailingSlash =
491-
callContext.getRealmConfig().getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
491+
realmConfig.getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
492492
if (requireTrailingSlash && !baseLocation.endsWith("/")) {
493493
baseLocation += "/";
494494
}
@@ -502,9 +502,7 @@ private void createNamespaceInternal(
502502
.setCreateTimestamp(System.currentTimeMillis())
503503
.setBaseLocation(baseLocation)
504504
.build();
505-
if (!callContext
506-
.getRealmConfig()
507-
.getConfig(FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) {
505+
if (!realmConfig.getConfig(FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) {
508506
LOGGER.debug("Validating no overlap for {} with sibling tables or namespaces", namespace);
509507
validateNoLocationOverlap(entity, resolvedParent.getRawFullPath());
510508
} else {
@@ -641,9 +639,7 @@ public boolean dropNamespace(Namespace namespace) throws NamespaceNotEmptyExcept
641639
PolarisEntity.toCoreList(catalogPath),
642640
leafEntity,
643641
Map.of(),
644-
callContext
645-
.getRealmConfig()
646-
.getConfig(FeatureConfiguration.CLEANUP_ON_NAMESPACE_DROP));
642+
realmConfig.getConfig(FeatureConfiguration.CLEANUP_ON_NAMESPACE_DROP));
647643

648644
if (!dropEntityResult.isSuccess() && dropEntityResult.failedBecauseNotEmpty()) {
649645
throw new NamespaceNotEmptyException("Namespace %s is not empty", namespace);
@@ -668,9 +664,7 @@ public boolean setProperties(Namespace namespace, Map<String, String> properties
668664
PolarisEntity updatedEntity =
669665
new PolarisEntity.Builder(entity).setProperties(newProperties).build();
670666

671-
if (!callContext
672-
.getRealmConfig()
673-
.getConfig(FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) {
667+
if (!realmConfig.getConfig(FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) {
674668
LOGGER.debug("Validating no overlap with sibling tables or namespaces");
675669
validateNoLocationOverlap(
676670
NamespaceEntity.of(updatedEntity), resolvedEntities.getRawParentPath());
@@ -874,7 +868,6 @@ private String buildPrefixedLocation(TableIdentifier tableIdentifier) {
874868
*/
875869
private String applyDefaultLocationObjectStoragePrefix(
876870
TableIdentifier tableIdentifier, String location) {
877-
RealmConfig realmConfig = callContext.getRealmConfig();
878871
boolean prefixEnabled =
879872
realmConfig.getConfig(
880873
FeatureConfiguration.DEFAULT_LOCATION_OBJECT_STORAGE_PREFIX_ENABLED, catalogEntity);
@@ -1007,17 +1000,14 @@ private void validateLocationsForTableLike(
10071000
PolarisResolvedPathWrapper resolvedStorageEntity) {
10081001
Optional<PolarisStorageConfigurationInfo> optStorageConfiguration =
10091002
PolarisStorageConfigurationInfo.forEntityPath(
1010-
callContext.getRealmConfig(), resolvedStorageEntity.getRawFullPath());
1003+
realmConfig, resolvedStorageEntity.getRawFullPath());
10111004

10121005
optStorageConfiguration.ifPresentOrElse(
10131006
storageConfigInfo -> {
10141007
Map<String, Map<PolarisStorageActions, PolarisStorageIntegration.ValidationResult>>
10151008
validationResults =
10161009
InMemoryStorageIntegration.validateSubpathsOfAllowedLocations(
1017-
callContext.getRealmConfig(),
1018-
storageConfigInfo,
1019-
Set.of(PolarisStorageActions.ALL),
1020-
locations);
1010+
realmConfig, storageConfigInfo, Set.of(PolarisStorageActions.ALL), locations);
10211011
validationResults
10221012
.values()
10231013
.forEach(
@@ -1040,9 +1030,7 @@ private void validateLocationsForTableLike(
10401030
},
10411031
() -> {
10421032
List<String> allowedStorageTypes =
1043-
callContext
1044-
.getRealmConfig()
1045-
.getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES);
1033+
realmConfig.getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES);
10461034
if (!allowedStorageTypes.contains(StorageConfigInfo.StorageTypeEnum.FILE.name())) {
10471035
List<String> invalidLocations =
10481036
locations.stream()
@@ -1068,13 +1056,9 @@ private void validateNoLocationOverlap(
10681056
String location,
10691057
PolarisEntity entity) {
10701058
boolean validateViewOverlap =
1071-
callContext
1072-
.getRealmConfig()
1073-
.getConfig(BehaviorChangeConfiguration.VALIDATE_VIEW_LOCATION_OVERLAP);
1059+
realmConfig.getConfig(BehaviorChangeConfiguration.VALIDATE_VIEW_LOCATION_OVERLAP);
10741060

1075-
if (callContext
1076-
.getRealmConfig()
1077-
.getConfig(FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP, catalog)) {
1061+
if (realmConfig.getConfig(FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP, catalog)) {
10781062
LOGGER.debug("Skipping location overlap validation for identifier '{}'", identifier);
10791063
} else if (validateViewOverlap
10801064
|| entity.getSubType().equals(PolarisEntitySubType.ICEBERG_TABLE)) {
@@ -1108,7 +1092,7 @@ private <T extends PolarisEntity & LocationBasedEntity> void validateNoLocationO
11081092

11091093
// Attempt to directly query for siblings
11101094
boolean useOptimizedSiblingCheck =
1111-
callContext.getRealmConfig().getConfig(FeatureConfiguration.OPTIMIZED_SIBLING_CHECK);
1095+
realmConfig.getConfig(FeatureConfiguration.OPTIMIZED_SIBLING_CHECK);
11121096
if (useOptimizedSiblingCheck) {
11131097
Optional<Optional<String>> directSiblingCheckResult =
11141098
getMetaStoreManager().hasOverlappingSiblings(callContext.getPolarisCallContext(), entity);
@@ -2018,12 +2002,9 @@ protected void refreshFromMetadataLocation(
20182002
}
20192003

20202004
private void validateMetadataFileInTableDir(TableIdentifier identifier, TableMetadata metadata) {
2021-
boolean allowEscape =
2022-
callContext.getRealmConfig().getConfig(FeatureConfiguration.ALLOW_EXTERNAL_TABLE_LOCATION);
2005+
boolean allowEscape = realmConfig.getConfig(FeatureConfiguration.ALLOW_EXTERNAL_TABLE_LOCATION);
20232006
if (!allowEscape
2024-
&& !callContext
2025-
.getRealmConfig()
2026-
.getConfig(FeatureConfiguration.ALLOW_EXTERNAL_METADATA_FILE_LOCATION)) {
2007+
&& !realmConfig.getConfig(FeatureConfiguration.ALLOW_EXTERNAL_METADATA_FILE_LOCATION)) {
20272008
LOGGER.debug(
20282009
"Validating base location {} for table {} in metadata file {}",
20292010
metadata.location(),
@@ -2223,7 +2204,7 @@ private void createTableLike(
22232204
IcebergTableLikeEntity icebergTableLikeEntity = IcebergTableLikeEntity.of(entity);
22242205
// Set / suffix
22252206
boolean requireTrailingSlash =
2226-
callContext.getRealmConfig().getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
2207+
realmConfig.getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
22272208
if (requireTrailingSlash
22282209
&& icebergTableLikeEntity.getBaseLocation() != null
22292210
&& !icebergTableLikeEntity.getBaseLocation().endsWith("/")) {
@@ -2288,7 +2269,7 @@ private void updateTableLike(TableIdentifier identifier, PolarisEntity entity) {
22882269

22892270
// Set / suffix
22902271
boolean requireTrailingSlash =
2291-
callContext.getRealmConfig().getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
2272+
realmConfig.getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
22922273
if (requireTrailingSlash
22932274
&& icebergTableLikeEntity.getBaseLocation() != null
22942275
&& !icebergTableLikeEntity.getBaseLocation().endsWith("/")) {
@@ -2348,9 +2329,7 @@ private void updateTableLike(TableIdentifier identifier, PolarisEntity entity) {
23482329
// Check that purge is enabled, if it is set:
23492330
if (catalogPath != null && !catalogPath.isEmpty() && purge) {
23502331
boolean dropWithPurgeEnabled =
2351-
callContext
2352-
.getRealmConfig()
2353-
.getConfig(FeatureConfiguration.DROP_WITH_PURGE_ENABLED, catalogEntity);
2332+
realmConfig.getConfig(FeatureConfiguration.DROP_WITH_PURGE_ENABLED, catalogEntity);
23542333
if (!dropWithPurgeEnabled) {
23552334
throw new ForbiddenException(
23562335
String.format(
@@ -2575,8 +2554,6 @@ protected FileIO loadFileIO(String ioImpl, Map<String, String> properties) {
25752554
}
25762555

25772556
private int getMaxMetadataRefreshRetries() {
2578-
return callContext
2579-
.getRealmConfig()
2580-
.getConfig(FeatureConfiguration.MAX_METADATA_REFRESH_RETRIES);
2557+
return realmConfig.getConfig(FeatureConfiguration.MAX_METADATA_REFRESH_RETRIES);
25812558
}
25822559
}

0 commit comments

Comments
 (0)