This is an automated email from the ASF dual-hosted git repository. pinal pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/master by this push: new 1ca1c4a8a ATLAS-4892: Export/Import: Unable to import shell entities 1ca1c4a8a is described below commit 1ca1c4a8a58358c7d92ce176113acbc0829294de Author: priyanshi-shah26 <priyanshi.s...@freestoneinfotech.com> AuthorDate: Fri Aug 23 19:14:16 2024 +0530 ATLAS-4892: Export/Import: Unable to import shell entities Signed-off-by: Pinal Shah <pinal.s...@freestoneinfotech.com> --- .../org/apache/atlas/type/AtlasEntityType.java | 3 +++ .../org/apache/atlas/type/AtlasStructType.java | 3 +++ .../graph/v2/AtlasEntityGraphDiscoveryV2.java | 2 +- .../store/graph/v2/AtlasEntityStoreV2.java | 13 +++++++--- .../store/graph/v2/EntityGraphMapper.java | 10 +++++++- .../store/graph/v2/IDBasedEntityResolver.java | 30 +++++++++++++++------- 6 files changed, 47 insertions(+), 14 deletions(-) diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java index 60e57a379..2f1959ef8 100644 --- a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java +++ b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java @@ -1190,6 +1190,9 @@ public class AtlasEntityType extends AtlasStructType { } if (value == null) { + if (entityObj.getIsIncomplete() != null && entityObj.getIsIncomplete()) {// In case of import shell entities, avoid checking of mandatory attributes + continue; + } ret = false; messages.add(objName + "." + attributeName + ": mandatory attribute value missing in type " + getTypeName()); } diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java b/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java index ffbe9e7d8..82e15fdd7 100644 --- a/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java +++ b/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java @@ -421,6 +421,9 @@ public class AtlasStructType extends AtlasType { AtlasEntity entityObj = (AtlasEntity) structObj; if (entityObj.getRelationshipAttribute(attrName) == null) { + if (entityObj.getIsIncomplete() != null && entityObj.getIsIncomplete()) { // In case of import shell entities, avoid checking of mandatory attributes + continue; + } ret = false; messages.add(fieldName + ": mandatory attribute value missing in type " + getTypeName()); } diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityGraphDiscoveryV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityGraphDiscoveryV2.java index b51951fe2..6ae3374ae 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityGraphDiscoveryV2.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityGraphDiscoveryV2.java @@ -192,7 +192,7 @@ public class AtlasEntityGraphDiscoveryV2 implements EntityGraphDiscovery { protected void resolveReferences() throws AtlasBaseException { MetricRecorder metric = RequestContext.get().startMetricRecord("resolveReferences"); - EntityResolver[] entityResolvers = new EntityResolver[] { new IDBasedEntityResolver(this.graph, typeRegistry), + EntityResolver[] entityResolvers = new EntityResolver[] { new IDBasedEntityResolver(this.graph, typeRegistry, entityGraphMapper), new UniqAttrBasedEntityResolver(this.graph, typeRegistry, entityGraphMapper) }; diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java index 656c9d14b..d113cf768 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java @@ -1254,6 +1254,10 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore { // change entity 'isInComplete' to 'false' during full update if (isEntityIncomplete(vertex)) { + if (RequestContext.get().isImportInProgress() && (entity.getIsIncomplete() != null && entity.getIsIncomplete())) { + continue; + } + vertex.removeProperty(IS_INCOMPLETE_PROPERTY_KEY); entity.setIsIncomplete(FALSE); @@ -1269,8 +1273,9 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore { requestContext.recordEntityGuidUpdate(entity, guid); } - - context.addUpdated(guid, entity, entityType, vertex); + if (!isEntityIncomplete(vertex)) { // In case of an import shell entities, skip updating to entitiesCreated, to avoid mapAttributesAndClassification // In case of hook shell entities, it will not reach to this case + context.addUpdated(guid, entity, entityType, vertex); + } } else { graphDiscoverer.validateAndNormalize(entity); @@ -1291,7 +1296,9 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore { requestContext.recordEntityGuidUpdate(entity, guid); - context.addCreated(guid, entity, entityType, vertex); + if (!isEntityIncomplete(vertex)) { // In case of an import shell entities, skip adding to entitiesUpdated, to avoid mapAttributesAndClassification // In case of hook shell entities, it will not reach to this case + context.addCreated(guid, entity, entityType, vertex); + } } // during import, update the system attributes diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphMapper.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphMapper.java index 77ab99a96..e58f96663 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphMapper.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphMapper.java @@ -194,7 +194,10 @@ public class EntityGraphMapper { LOG.debug("==> createShellEntityVertex({})", objectId.getTypeName()); } - final String guid = UUID.randomUUID().toString(); + String guid = objectId.getGuid(); + if (!AtlasTypeUtil.isAssignedGuid(guid)) { + guid = UUID.randomUUID().toString(); + } AtlasEntityType entityType = typeRegistry.getEntityTypeByName(objectId.getTypeName()); AtlasVertex ret = createStructVertex(objectId); @@ -225,6 +228,11 @@ public class EntityGraphMapper { return ret; } + public AtlasVertex createShellEntityVertex(AtlasEntity entity, EntityGraphDiscoveryContext context) throws AtlasBaseException { + AtlasObjectId objectId = new AtlasObjectId(entity.getGuid(), entity.getTypeName(), entity.getAttributes()); + return createShellEntityVertex(objectId, context); + } + public AtlasVertex createVertexWithGuid(AtlasEntity entity, String guid) throws AtlasBaseException { if (LOG.isDebugEnabled()) { LOG.debug("==> createVertexWithGuid({})", entity.getTypeName()); diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/IDBasedEntityResolver.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/IDBasedEntityResolver.java index 2f37eac6b..ae0d2ecdd 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/IDBasedEntityResolver.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/IDBasedEntityResolver.java @@ -38,10 +38,16 @@ public class IDBasedEntityResolver implements EntityResolver { private final AtlasGraph graph; private final AtlasTypeRegistry typeRegistry; + private final EntityGraphMapper entityGraphMapper; public IDBasedEntityResolver(AtlasGraph graph, AtlasTypeRegistry typeRegistry) { + this(graph, typeRegistry, null); + } + + public IDBasedEntityResolver(AtlasGraph graph, AtlasTypeRegistry typeRegistry, EntityGraphMapper entityGraphMapper) { this.graph = graph; this.typeRegistry = typeRegistry; + this.entityGraphMapper = entityGraphMapper; } public EntityGraphDiscoveryContext resolveEntityReferences(EntityGraphDiscoveryContext context) throws AtlasBaseException { @@ -55,19 +61,25 @@ public class IDBasedEntityResolver implements EntityResolver { boolean isAssignedGuid = AtlasTypeUtil.isAssignedGuid(guid); AtlasVertex vertex = isAssignedGuid ? AtlasGraphUtilsV2.findByGuid(this.graph, guid) : null; - if (vertex == null && !RequestContext.get().isImportInProgress()) { // if not found in the store, look if the entity is present in the stream + if (vertex == null) { // if not found in the store, look if the entity is present in the stream AtlasEntity entity = entityStream.getByGuid(guid); + if (!RequestContext.get().isImportInProgress()) { - if (entity != null) { // look for the entity in the store using unique-attributes - AtlasEntityType entityType = typeRegistry.getEntityTypeByName(entity.getTypeName()); + if (entity != null) { // look for the entity in the store using unique-attributes + AtlasEntityType entityType = typeRegistry.getEntityTypeByName(entity.getTypeName()); - if (entityType == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, TypeCategory.ENTITY.name(), entity.getTypeName()); - } + if (entityType == null) { + throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, TypeCategory.ENTITY.name(), entity.getTypeName()); + } - vertex = AtlasGraphUtilsV2.findByUniqueAttributes(this.graph, entityType, entity.getAttributes()); - } else if (!isAssignedGuid) { // for local-guids, entity must be in the stream - throw new AtlasBaseException(AtlasErrorCode.REFERENCED_ENTITY_NOT_FOUND, guid); + vertex = AtlasGraphUtilsV2.findByUniqueAttributes(this.graph, entityType, entity.getAttributes()); + } else if (!isAssignedGuid) { // for local-guids, entity must be in the stream + throw new AtlasBaseException(AtlasErrorCode.REFERENCED_ENTITY_NOT_FOUND, guid); + } + } else if (entity != null && entity.getIsIncomplete() != null && entity.getIsIncomplete()) { + if (entityGraphMapper != null) { + vertex = entityGraphMapper.createShellEntityVertex(entity, context); + } } }