diff --git a/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java b/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java index 510cd0f6cd..c7033a50d1 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java @@ -61,7 +61,7 @@ public PolarisCallContext( public static PolarisCallContext copyOf(PolarisCallContext original) { return new PolarisCallContext( - original.getMetaStore(), + original.getMetaStore().detach(), original.getDiagServices(), original.getConfigurationStore(), original.getClock()); diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/BasePersistence.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/BasePersistence.java index dccb546848..88e5143cf8 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/BasePersistence.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/BasePersistence.java @@ -392,4 +392,15 @@ boolean hasChildren( @Nullable PolarisEntityType optionalEntityType, long catalogId, long parentId); + + /** + * Performs operations necessary to isolate the state of {@code this} {@link BasePersistence} + * instance from the state of the returned instance as far as multithreaded usage is concerned. If + * the implementation has state that is not supposed to be accessed or modified by multiple + * threads, it may return a copy from this method. If the implementation is thread-safe, it may + * return {@code this}. + */ + default BasePersistence detach() { + return this; + } }