Skip to content

Commit be5cb17

Browse files
gtretteneroGiorgio Trettenero
andauthored
Removing migrated_data_location from definitionMetadata (#637)
* Removing migrated_data_location from definitionMetadata add smoke test and delete from db add smoke test and delete from db testing smoke test fix test error * test recreate * test recreate * test recreate * address nit --------- Co-authored-by: Giorgio Trettenero <[email protected]>
1 parent 5165556 commit be5cb17

File tree

3 files changed

+71
-1
lines changed

3 files changed

+71
-1
lines changed

metacat-common-server/src/main/java/com/netflix/metacat/common/server/util/MetacatUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ public class MetacatUtils {
3434
public static final String NAME_TAGS = "tags";
3535
private static final String DATA_DEPENDENCY_NODE = "data_dependency";
3636
private static final String VTTS_FIELD = "valid_thru_utc_ts";
37+
public static final String MIGRATED_DATA_LOCATION = "migrated_data_location";
3738

3839
/**
3940
* Iceberg common view field names.
4041
*/
4142
public static final String COMMON_VIEW = "common_view";
4243
public static final String STORAGE_TABLE = "storage_table";
4344

44-
4545
/**
4646
* Default Ctor.
4747
*/

metacat-functional-tests/src/functionalTest/groovy/com/netflix/metacat/MetacatSmokeSpec.groovy

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2685,4 +2685,63 @@ class MetacatSmokeSpec extends Specification {
26852685
assert parentChildRelV1.getChildren(catalogName, databaseName, child21).isEmpty()
26862686
assert parentChildRelV1.getParents(catalogName, databaseName, child21) == [new ParentInfoDto("hive-metastore/iceberg_db/parent2", "CLONE", "p2_uuid")] as Set
26872687
}
2688+
2689+
def "Test remove migrated_data_location before soft delete"() {
2690+
given:
2691+
def catalogName = 'hive-metastore'
2692+
def databaseName = 'smoke_db'
2693+
def tableName = 'test_table_migrated_data_location'
2694+
def uri = isLocalEnv ? String.format('file:/tmp/%s/%s', databaseName, tableName) : null
2695+
def tableDto = PigDataDtoProvider.getTable(catalogName, databaseName, tableName, 'gtret', uri)
2696+
2697+
// Add multiple metadata fields to verify they persist
2698+
tableDto.definitionMetadata.put('migrated_data_location', 's3://old/location')
2699+
tableDto.definitionMetadata.put('preserved_field', 'should remain')
2700+
tableDto.definitionMetadata.put('another_field', 'should also remain')
2701+
2702+
try {
2703+
api.createDatabase(catalogName, databaseName, new DatabaseCreateRequestDto())
2704+
} catch (Exception ignored) {
2705+
}
2706+
2707+
when:
2708+
def createdTable = api.createTable(catalogName, databaseName, tableName, tableDto)
2709+
2710+
then:
2711+
assert createdTable.definitionMetadata.has('migrated_data_location')
2712+
assert createdTable.definitionMetadata.has('preserved_field')
2713+
assert createdTable.definitionMetadata.has('another_field')
2714+
2715+
// Soft delete the table
2716+
when:
2717+
api.deleteTable(catalogName, databaseName, tableName)
2718+
2719+
// Recreate the table with the same name and verify migrated_data_location is gone
2720+
def newTableDto = PigDataDtoProvider.getTable(catalogName, databaseName, tableName, 'gtret', uri)
2721+
def recreatedTable = api.createTable(catalogName, databaseName, tableName, newTableDto)
2722+
2723+
then:
2724+
// Verify migrated_data_location is not present
2725+
!recreatedTable.definitionMetadata.has('migrated_data_location')
2726+
// Verify other fields are still present
2727+
recreatedTable.definitionMetadata.has('preserved_field')
2728+
recreatedTable.definitionMetadata.get('preserved_field').asText() == 'should remain'
2729+
recreatedTable.definitionMetadata.has('another_field')
2730+
recreatedTable.definitionMetadata.get('another_field').asText() == 'should also remain'
2731+
2732+
// Verify the definition metadata doesn't contain migrated_data_location
2733+
def definitionMetadatas = metadataApi.getDefinitionMetadataList(null, null, null, null, null, null, "$catalogName/$databaseName/$tableName", null)
2734+
definitionMetadatas.each { definition ->
2735+
assert !definition.getDefinitionMetadata().has("migrated_data_location")
2736+
}
2737+
2738+
// Verify no exceptions are thrown
2739+
noExceptionThrown()
2740+
2741+
cleanup:
2742+
try {
2743+
api.deleteTable(catalogName, databaseName, tableName)
2744+
} catch (Exception ignored) {
2745+
}
2746+
}
26882747
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,15 @@ public TableDto deleteAndReturn(final QualifiedName name, final boolean isMView)
431431
tagService.delete(name, false);
432432
} else {
433433
if (config.canSoftDeleteDataMetadata() && tableDto.isDataExternal()) {
434+
// Remove the migrated_data_location field before soft deleting to allow for cleanup of old prefixes
435+
if (tableDto.getDefinitionMetadata() != null
436+
&& tableDto.getDefinitionMetadata().has(MetacatUtils.MIGRATED_DATA_LOCATION)) {
437+
tableDto.getDefinitionMetadata().remove(MetacatUtils.MIGRATED_DATA_LOCATION);
438+
userMetadataService.saveDefinitionMetadata(tableDto.getName(),
439+
metacatRequestContext.getUserName(),
440+
Optional.of(tableDto.getDefinitionMetadata()),
441+
false);
442+
}
434443
userMetadataService.softDeleteDataMetadata(metacatRequestContext.getUserName(),
435444
Lists.newArrayList(tableDto.getDataUri()));
436445
}
@@ -453,6 +462,8 @@ private boolean hasTags(@Nullable final TableDto tableDto, final Set<String> has
453462
return false;
454463
}
455464

465+
466+
456467
/**
457468
* Returns true
458469
* 1. If the system is configured to delete deifnition metadata.

0 commit comments

Comments
 (0)