-
Notifications
You must be signed in to change notification settings - Fork 2.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Core: Consolidate write.folder-storage.path and write.object-storage.path to write.data.path #3094
Changes from 10 commits
b12ec79
abcf950
85c9f66
45a79a0
e4517b7
9579578
5402407
0c3209b
6018496
df70964
884cbf8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -28,10 +28,11 @@ | |
import org.apache.iceberg.transforms.Transforms; | ||
import org.apache.iceberg.types.Types; | ||
import org.apache.iceberg.util.PropertyUtil; | ||
|
||
import static org.apache.iceberg.TableProperties.OBJECT_STORE_PATH; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
public class LocationProviders { | ||
private static final Logger LOG = LoggerFactory.getLogger(LocationProviders.class); | ||
|
||
private LocationProviders() { | ||
} | ||
|
@@ -68,16 +69,11 @@ public static LocationProvider locationsFor(String location, Map<String, String> | |
} | ||
} | ||
|
||
private static String defaultDataLocation(String tableLocation, Map<String, String> properties) { | ||
return properties.getOrDefault(TableProperties.WRITE_FOLDER_STORAGE_LOCATION, | ||
String.format("%s/data", tableLocation)); | ||
} | ||
|
||
static class DefaultLocationProvider implements LocationProvider { | ||
private final String dataLocation; | ||
|
||
DefaultLocationProvider(String tableLocation, Map<String, String> properties) { | ||
this.dataLocation = stripTrailingSlash(defaultDataLocation(tableLocation, properties)); | ||
this.dataLocation = stripTrailingSlash(dataLocation(properties, tableLocation, false)); | ||
} | ||
|
||
@Override | ||
|
@@ -99,8 +95,7 @@ static class ObjectStoreLocationProvider implements LocationProvider { | |
private final String context; | ||
|
||
ObjectStoreLocationProvider(String tableLocation, Map<String, String> properties) { | ||
this.storageLocation = stripTrailingSlash(properties.getOrDefault(OBJECT_STORE_PATH, | ||
defaultDataLocation(tableLocation, properties))); | ||
this.storageLocation = stripTrailingSlash(dataLocation(properties, tableLocation, true)); | ||
this.context = pathContext(tableLocation); | ||
} | ||
|
||
|
@@ -141,4 +136,41 @@ private static String stripTrailingSlash(String path) { | |
} | ||
return result; | ||
} | ||
|
||
/** | ||
* Get the data file location. For the {@link DefaultLocationProvider}, the priority level are | ||
* "write.data.path" -> "write.folder-storage.path" -> "table-location/data". | ||
* For the {@link ObjectStoreLocationProvider}, the priority level are | ||
* "write.data.path" -> "write.object-storage.path" -> "write.folder-storage.path" -> "table-location/data". | ||
*/ | ||
private static String dataLocation(Map<String, String> properties, String tableLocation, boolean isObjectStore) { | ||
String dataLocation = properties.get(TableProperties.WRITE_DATA_LOCATION); | ||
if (dataLocation == null) { | ||
dataLocation = deprecatedDataLocation(properties, isObjectStore); | ||
if (dataLocation == null) { | ||
dataLocation = String.format("%s/data", tableLocation); | ||
} | ||
} | ||
return dataLocation; | ||
} | ||
|
||
private static String deprecatedDataLocation(Map<String, String> properties, boolean isObjectStore) { | ||
String deprecatedProperty = isObjectStore ? | ||
TableProperties.OBJECT_STORE_PATH : TableProperties.WRITE_FOLDER_STORAGE_LOCATION; | ||
|
||
String dataLocation = properties.get(deprecatedProperty); | ||
|
||
final String warnMsg = "Table property {} is deprecated, please use " + TableProperties.WRITE_DATA_LOCATION + | ||
" instead."; | ||
if (dataLocation != null) { | ||
LOG.warn(warnMsg, deprecatedProperty); | ||
} else if (deprecatedProperty.equals(TableProperties.OBJECT_STORE_PATH)) { | ||
dataLocation = properties.get(TableProperties.WRITE_FOLDER_STORAGE_LOCATION); | ||
if (dataLocation != null) { | ||
LOG.warn(warnMsg, TableProperties.WRITE_FOLDER_STORAGE_LOCATION); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No need for warnings. This is not important enough to nag users about. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Removed |
||
} | ||
} | ||
|
||
return dataLocation; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This looks way too complicated to be worth it. Let's just duplicate the logic and minimize the changes in each location provider. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Made the change. |
||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -135,21 +135,31 @@ private TableProperties() { | |
public static final String OBJECT_STORE_ENABLED = "write.object-storage.enabled"; | ||
public static final boolean OBJECT_STORE_ENABLED_DEFAULT = false; | ||
|
||
/** | ||
* @deprecated Use {@link #WRITE_DATA_LOCATION} instead. | ||
*/ | ||
@Deprecated | ||
public static final String OBJECT_STORE_PATH = "write.object-storage.path"; | ||
|
||
public static final String WRITE_LOCATION_PROVIDER_IMPL = "write.location-provider.impl"; | ||
|
||
// This only applies to files written after this property is set. Files previously written aren't | ||
// relocated to reflect this parameter. | ||
// If not set, defaults to a "data" folder underneath the root path of the table. | ||
/** | ||
* @deprecated Use {@link #WRITE_DATA_LOCATION} instead. | ||
*/ | ||
@Deprecated | ||
public static final String WRITE_FOLDER_STORAGE_LOCATION = "write.folder-storage.path"; | ||
|
||
/** | ||
* @deprecated will be removed in 0.14.0, use {@link #WRITE_FOLDER_STORAGE_LOCATION} instead | ||
* @deprecated will be removed in 0.14.0, use {@link #WRITE_DATA_LOCATION} instead | ||
*/ | ||
@Deprecated | ||
public static final String WRITE_NEW_DATA_LOCATION = "write.folder-storage.path"; | ||
|
||
// This only applies to files written after this property is set. Files previously written aren't | ||
// relocated to reflect this parameter. | ||
// If not set, defaults to a "data" folder underneath the root path of the table. | ||
public static final String WRITE_DATA_LOCATION = "write.data.path"; | ||
Comment on lines
+158
to
+161
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nit: Do we want to update the comment for the default if not set to reflect anything about the possibility of object storage location provider? Up to you. The more I think about it, the more I think it just complicates things and that we should just properly document the behavior on the website. But up to you. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit: we can move L161 to after L144 to avoid deleting the comments and add again here. |
||
|
||
// This only applies to files written after this property is set. Files previously written aren't | ||
// relocated to reflect this parameter. | ||
// If not set, defaults to a "metadata" folder underneath the root path of the table. | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -168,6 +168,8 @@ protected Map<String, String> destTableProps() { | |
properties.remove(LOCATION); | ||
properties.remove(TableProperties.WRITE_METADATA_LOCATION); | ||
properties.remove(TableProperties.WRITE_FOLDER_STORAGE_LOCATION); | ||
properties.remove(TableProperties.OBJECT_STORE_PATH); | ||
properties.remove(TableProperties.WRITE_DATA_LOCATION); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When snapshotting a table that has folder storage location set, should we also remove it in addition to write data location? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It'd be safer to remove both. Added in the new commit. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I have a PR #2966 for this change, you can either also port my tests here, or remove this and I will update that PR once this is merged. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hi @jackye1995 , thanks for the information. I've added both There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, I can do that |
||
|
||
// set default and user-provided props | ||
properties.put(TableCatalog.PROP_PROVIDER, "iceberg"); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit / non-blocking: Naming this
isObjectStorageLocationProvider
or something to indicate that it's not just object storage, but specifically the usage of object storage location provider.However, since I just realized this is already in
LocationProviders.java
, I think this is probably fine and no need to change (especially as it's documented in the java doc).