From 4a4066989757e55c8613b00898d7667ae86c7410 Mon Sep 17 00:00:00 2001 From: Mandar Ambawane Date: Sun, 1 Jun 2025 17:26:57 +0530 Subject: [PATCH] ATLAS-5029 : Connected export : When multiple entities are exported , not all of its connected entities are exported --- .../repository/impexp/ExportService.java | 18 +++- .../RelationshipAttributesExtractor.java | 3 + .../repository/impexp/ExportServiceTest.java | 77 ++++++++++++++++++ .../src/test/resources/ctas_hive_tables.zip | Bin 0 -> 33417 bytes 4 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 repository/src/test/resources/ctas_hive_tables.zip diff --git a/repository/src/main/java/org/apache/atlas/repository/impexp/ExportService.java b/repository/src/main/java/org/apache/atlas/repository/impexp/ExportService.java index 8ccc63c1b17..95a8e487b3a 100644 --- a/repository/src/main/java/org/apache/atlas/repository/impexp/ExportService.java +++ b/repository/src/main/java/org/apache/atlas/repository/impexp/ExportService.java @@ -248,10 +248,11 @@ private AtlasExportResult.OperationStatus processObjectId(AtlasObjectId item, Ex AtlasVertex vertex = AtlasGraphUtilsV2.findByGuid(guid); String typeName = GraphHelper.getTypeName(vertex); context.startingEntityType = typeName; + context.startingEntityGuid = guid; processEntityGuid(guid, context); } - while (!context.guidsToProcess.isEmpty()) { + while (!context.guidsToProcess.isEmpty() || !context.lineageToProcess.isEmpty()) { while (!context.guidsToProcess.isEmpty()) { String guid = context.guidsToProcess.remove(0); @@ -288,8 +289,19 @@ private List getStartingEntity(AtlasObjectId item, ExportContext context private void processEntityGuid(String guid, ExportContext context) throws AtlasBaseException { LOG.debug("==> processEntityGuid({})", guid); + boolean resumeExportForStartingEntity = false; + if ((context.fetchType == ExportFetchType.CONNECTED + || (context.fetchType == ExportFetchType.INCREMENTAL && context.changeMarker <= 0)) + && guid.equals(context.startingEntityGuid)) { + resumeExportForStartingEntity = true; + } + if (context.guidsProcessed.contains(guid)) { - return; + if (resumeExportForStartingEntity) { + LOG.info("Resuming export for {}", guid); + } else { + return; + } } if (context.fetchType == ExportFetchType.INCREMENTAL && context.startingEntityType.equals(ATLAS_TYPE_HIVE_DB) && !context.skipLineage) { @@ -472,6 +484,7 @@ static class ExportContext { boolean isSkipConnectedFetch; private int progressReportCount; public String startingEntityType; + public String startingEntityGuid; ExportContext(AtlasExportResult result, ZipSink sink) { this.result = result; @@ -512,6 +525,7 @@ public void clear() { guidsProcessed.clear(); guidDirection.clear(); startingEntityType = null; + startingEntityGuid = null; } public void addToBeProcessed(boolean isSuperTypeProcess, String guid, TraversalDirection direction) { diff --git a/repository/src/main/java/org/apache/atlas/repository/impexp/RelationshipAttributesExtractor.java b/repository/src/main/java/org/apache/atlas/repository/impexp/RelationshipAttributesExtractor.java index 6f42e1b85f9..064efc80f95 100644 --- a/repository/src/main/java/org/apache/atlas/repository/impexp/RelationshipAttributesExtractor.java +++ b/repository/src/main/java/org/apache/atlas/repository/impexp/RelationshipAttributesExtractor.java @@ -53,6 +53,9 @@ public void connectedFetch(AtlasEntity entity, ExportContext context) { } ExportService.TraversalDirection direction = context.guidDirection.get(entity.getGuid()); + if (context.startingEntityGuid.equals(entity.getGuid())) { + direction = null; + } if (direction == null || direction == UNKNOWN) { addToBeProcessed(entity, context, OUTWARD, INWARD); diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/ExportServiceTest.java b/repository/src/test/java/org/apache/atlas/repository/impexp/ExportServiceTest.java index 5890143eff7..66b3bd5194a 100644 --- a/repository/src/test/java/org/apache/atlas/repository/impexp/ExportServiceTest.java +++ b/repository/src/test/java/org/apache/atlas/repository/impexp/ExportServiceTest.java @@ -23,6 +23,7 @@ import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.impexp.AtlasExportRequest; import org.apache.atlas.model.impexp.AtlasExportResult; +import org.apache.atlas.model.impexp.AtlasImportResult; import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.model.instance.AtlasObjectId; import org.apache.atlas.model.instance.EntityMutationResponse; @@ -37,9 +38,11 @@ import org.apache.atlas.type.AtlasTypeRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.testng.ITestContext; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeTest; +import org.testng.annotations.DataProvider; import org.testng.annotations.Guice; import org.testng.annotations.Test; @@ -48,6 +51,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -76,6 +80,25 @@ public class ExportServiceTest extends AtlasTestBase { @Inject private AtlasEntityStoreV2 entityStore; + @Inject + private ImportService importService; + + private static final String HIVE_TABLE_TYPE_NAME = "hive_table"; + + private static final String TABLE_1_GUID = "9f9e5088-3ace-4dd7-ae3e-41a93875e264"; + private static final String TABLE_2_GUID = "49dc552e-835a-4b88-b752-220e03c6df36"; + private static final String TABLE_3_GUID = "8b2f7e53-ac4b-4c6b-8159-8b6b62805d1a"; + private static final String TABLE_4_GUID = "e5c2edd4-df48-4646-8f22-0fbdce235496"; + private static final String TABLE_5_GUID = "1f6cb442-e7c4-4521-827a-49d567240e74"; + private static final String TABLE_6_GUID = "edc9facc-2e76-4dbd-830d-ad7644541451"; + + private static final String TABLE_1_QUALIFIED_NAME = "hivedb01.hivetable01@primary"; + private static final String TABLE_2_QUALIFIED_NAME = "hivedb01.hivetable02@primary"; + private static final String TABLE_3_QUALIFIED_NAME = "hivedb01.hivetable03@primary"; + private static final String TABLE_4_QUALIFIED_NAME = "hivedb01.hivetable04@primary"; + private static final String TABLE_5_QUALIFIED_NAME = "hivedb01.hivetable05@primary"; + private static final String TABLE_6_QUALIFIED_NAME = "hivedb01.hivetable06@primary"; + @BeforeTest public void setupTest() throws IOException, AtlasBaseException { RequestContext.clear(); @@ -234,6 +257,60 @@ public void verifyTypeFull() throws AtlasBaseException, IOException { verifyExportForFullEmployeeData(zipSource); } + @DataProvider(name = "ctashivetables") + public static Object[][] importCtasData(ITestContext context) throws IOException, AtlasBaseException { + return ZipFileResourceTestUtils.getZipSource("ctas_hive_tables.zip"); + } + + @Test(dataProvider = "ctashivetables") + public void testExportConnectedHiveTables(InputStream inputStream) throws AtlasBaseException, IOException { + AtlasImportResult result = ZipFileResourceTestUtils.runImportWithNoParameters(importService, inputStream); + assertEquals(result.getOperationStatus(), AtlasImportResult.OperationStatus.SUCCESS); + + AtlasExportRequest request = getRequestForConnected(HIVE_TABLE_TYPE_NAME, TABLE_1_QUALIFIED_NAME, TABLE_2_QUALIFIED_NAME); + ZipSource zipSource = runExportWithParameters(request); + List guidList = zipSource.getCreationOrder(); + + assertTrue(guidList.contains(TABLE_1_GUID)); + assertTrue(guidList.contains(TABLE_2_GUID)); + assertTrue(guidList.contains(TABLE_3_GUID)); + assertFalse(guidList.contains(TABLE_4_GUID)); + assertFalse(guidList.contains(TABLE_5_GUID)); + assertFalse(guidList.contains(TABLE_6_GUID)); + + request = getRequestForConnected(HIVE_TABLE_TYPE_NAME, TABLE_1_QUALIFIED_NAME, TABLE_6_QUALIFIED_NAME); + zipSource = runExportWithParameters(request); + guidList = zipSource.getCreationOrder(); + + assertTrue(guidList.contains(TABLE_1_GUID)); + assertTrue(guidList.contains(TABLE_2_GUID)); + assertFalse(guidList.contains(TABLE_3_GUID)); + assertFalse(guidList.contains(TABLE_4_GUID)); + assertTrue(guidList.contains(TABLE_5_GUID)); + assertTrue(guidList.contains(TABLE_6_GUID)); + + request = getRequestForConnected(HIVE_TABLE_TYPE_NAME, TABLE_1_QUALIFIED_NAME, TABLE_4_QUALIFIED_NAME); + zipSource = runExportWithParameters(request); + guidList = zipSource.getCreationOrder(); + + assertTrue(guidList.contains(TABLE_1_GUID)); + assertTrue(guidList.contains(TABLE_2_GUID)); + assertTrue(guidList.contains(TABLE_3_GUID)); + assertTrue(guidList.contains(TABLE_4_GUID)); + assertTrue(guidList.contains(TABLE_5_GUID)); + assertFalse(guidList.contains(TABLE_6_GUID)); + } + + private AtlasExportRequest getRequestForConnected(String typeName, String qualifiedName1, String qualifiedName2) { + AtlasExportRequest request = new AtlasExportRequest(); + List itemsToExport = new ArrayList<>(); + itemsToExport.add(new AtlasObjectId(typeName, "qualifiedName", qualifiedName1)); + itemsToExport.add(new AtlasObjectId(typeName, "qualifiedName", qualifiedName2)); + request.setItemsToExport(itemsToExport); + setOptionsMap(request, true, AtlasExportRequest.FETCH_TYPE_CONNECTED, false, ""); + return request; + } + private AtlasExportRequest getRequestForFullFetch() { AtlasExportRequest request = new AtlasExportRequest(); diff --git a/repository/src/test/resources/ctas_hive_tables.zip b/repository/src/test/resources/ctas_hive_tables.zip new file mode 100644 index 0000000000000000000000000000000000000000..911a147c7dad43ac170dcc80fc4b335f8d05821f GIT binary patch literal 33417 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�ND`3a#CJubMZySU(c}0bDCsrX~K8d0ER`ZXGtVdyp@w6AiuU@^Q z>0=+y7VQJZ)8<$4_DHVBz?uox)z#z;Q_!`Gx7(js)Qox)6sbu|$5f zx-^ll#KA@7Hrjo1dnab_%X&K}QQ36I`1r}muN7FZF3Ko~0a*0BaJ*)2Pb};QH!xoB z7fJ+C(8i}|z1ARv1P%IDDma@|7*jfcf@p1UWzaIx2TkC*DWdmvod zcdm|{kcjiU*hBZ#>4OagtT=Ed|!pN#|;Som4% z>D$--AalZ=O3ZEnxRQ162~{NKWrO(Jxwn0AC`@qk4!UVIZ!ZkkpJzU{@2dMfAmlP`}426 zssB^auF586)0`jk$a{W{G zuQ~I7mzDg;PWsn9R{kmb*GS>N%PJCoyo7%nS^rPjzeY0tUAB!91ms_*6aQ28uVH$B zm;KG~;mZ2A>5l)D{c8%<-(?+`K|ua>F5f?8|C-S2PpSnk-yo_{weU+V)(~A_P>v{&wmB}IjbqlL4IVFf`A}@d^jLM KKm-AQ{Q5r=Y)c{l literal 0 HcmV?d00001