This is an automated email from the ASF dual-hosted git repository.

sarath pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/atlas.git

commit df58d1ae782ede4b2ee69b1bf6cfba62c604d914
Author: chaitali borole <[email protected]>
AuthorDate: Tue Jul 7 23:20:19 2020 +0530

    ATLAS-3855 :- Bulk entity tag association and bulk api enhancement, 
authorization fix.
    
    Signed-off-by: nixonrodrigues <[email protected]>
    (cherry picked from commit 06cd0cb35a285b3c4a7b0b3c662ce7263848f7b6)
---
 .../store/graph/v2/AtlasEntityStoreV2.java         | 63 +++++++++++++++-------
 .../main/java/org/apache/atlas/RequestContext.java |  9 ++++
 .../org/apache/atlas/web/filters/AuditFilter.java  |  2 +
 3 files changed, 56 insertions(+), 18 deletions(-)

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 f721e7b..7cf77ea 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
@@ -210,10 +210,24 @@ public class AtlasEntityStoreV2 implements 
AtlasEntityStore {
         AtlasEntitiesWithExtInfo ret = 
entityRetriever.toAtlasEntitiesWithExtInfo(guids, isMinExtInfo);
 
         if(ret != null){
-            for(String guid : guids){
-                AtlasEntity entity = ret.getEntity(guid);
+            for(String guid : guids) {
+                try {
+                    AtlasEntity entity = ret.getEntity(guid);
+
+                    AtlasAuthorizationUtils.verifyAccess(new 
AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, new 
AtlasEntityHeader(entity)), "read entity: guid=", guid);
+                } catch (AtlasBaseException e) {
+                    if (RequestContext.get().isSkipFailedEntities()) {
+                        if (LOG.isDebugEnabled()) {
+                            LOG.debug("getByIds(): ignoring failure for entity 
{}: error code={}, message={}", guid, e.getAtlasErrorCode(), e.getMessage());
+                        }
+
+                        ret.removeEntity(guid);
+
+                        continue;
+                    }
 
-                AtlasAuthorizationUtils.verifyAccess(new 
AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, new 
AtlasEntityHeader(entity)), "read entity: guid=", guid);
+                    throw e;
+                }
             }
         }
 
@@ -706,37 +720,50 @@ public class AtlasEntityStoreV2 implements 
AtlasEntityStore {
         if (CollectionUtils.isEmpty(guids)) {
             throw new AtlasBaseException(AtlasErrorCode.INVALID_PARAMETERS, 
"Guid(s) not specified");
         }
+
         if (classification == null) {
             throw new AtlasBaseException(AtlasErrorCode.INVALID_PARAMETERS, 
"classification not specified");
         }
 
-        EntityMutationContext context = new EntityMutationContext();
+        validateAndNormalize(classification);
+
+        EntityMutationContext     context         = new 
EntityMutationContext();
+        List<AtlasClassification> classifications = 
Collections.singletonList(classification);
+        List<String>              validGuids      =  new ArrayList<>();
 
         GraphTransactionInterceptor.lockObjectAndReleasePostCommit(guids);
 
         for (String guid : guids) {
-            AtlasVertex entityVertex = AtlasGraphUtilsV2.findByGuid(graph, 
guid);
+            try {
+                AtlasVertex entityVertex = AtlasGraphUtilsV2.findByGuid(graph, 
guid);
 
-            if (entityVertex == null) {
-                throw new 
AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid);
-            }
+                if (entityVertex == null) {
+                    throw new 
AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid);
+                }
 
-            AtlasEntityHeader entityHeader = 
entityRetriever.toAtlasEntityHeaderWithClassifications(entityVertex);
+                AtlasEntityHeader entityHeader = 
entityRetriever.toAtlasEntityHeaderWithClassifications(entityVertex);
 
-            AtlasAuthorizationUtils.verifyAccess(new 
AtlasEntityAccessRequest(typeRegistry, 
AtlasPrivilege.ENTITY_ADD_CLASSIFICATION, entityHeader, classification),
-                                                 "add classification: guid=", 
guid, ", classification=", classification.getTypeName());
+                AtlasAuthorizationUtils.verifyAccess(new 
AtlasEntityAccessRequest(typeRegistry, 
AtlasPrivilege.ENTITY_ADD_CLASSIFICATION, entityHeader, classification),
+                        "add classification: guid=", guid, ", 
classification=", classification.getTypeName());
 
-            context.cacheEntity(guid, entityVertex, 
typeRegistry.getEntityTypeByName(entityHeader.getTypeName()));
-        }
+                validateEntityAssociations(guid, classifications);
 
+                validGuids.add(guid);
+                context.cacheEntity(guid, entityVertex, 
typeRegistry.getEntityTypeByName(entityHeader.getTypeName()));
+            } catch (AtlasBaseException abe) {
+                if (RequestContext.get().isSkipFailedEntities()) {
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("addClassification(): ignoring failure for 
entity {}: error code={}, message={}", guid, abe.getAtlasErrorCode(), 
abe.getMessage());
+                    }
 
-        validateAndNormalize(classification);
-
-        List<AtlasClassification> classifications = 
Collections.singletonList(classification);
+                    continue;
+                }
 
-        for (String guid : guids) {
-            validateEntityAssociations(guid, classifications);
+                throw abe;
+            }
+        }
 
+        for (String guid : validGuids) {
             entityGraphMapper.addClassifications(context, guid, 
classifications);
         }
     }
diff --git a/server-api/src/main/java/org/apache/atlas/RequestContext.java 
b/server-api/src/main/java/org/apache/atlas/RequestContext.java
index b93d31b..befd726 100644
--- a/server-api/src/main/java/org/apache/atlas/RequestContext.java
+++ b/server-api/src/main/java/org/apache/atlas/RequestContext.java
@@ -70,6 +70,7 @@ public class RequestContext {
     private boolean     isInNotificationProcessing = false;
     private boolean     isInTypePatching           = false;
     private boolean     createShellEntityForNonExistingReference = false;
+    private boolean     skipFailedEntities = false;
 
     private RequestContext() {
     }
@@ -207,6 +208,14 @@ public class RequestContext {
         this.createShellEntityForNonExistingReference = 
createShellEntityForNonExistingReference;
     }
 
+    public boolean isSkipFailedEntities() {
+        return skipFailedEntities;
+    }
+
+    public void setSkipFailedEntities(boolean skipFailedEntities) {
+        this.skipFailedEntities = skipFailedEntities;
+    }
+
     public void recordEntityUpdate(AtlasEntityHeader entity) {
         if (entity != null && entity.getGuid() != null && ! 
entitiesToSkipUpdate.contains(entity.getGuid())) {
             updatedEntities.put(entity.getGuid(), entity);
diff --git a/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java 
b/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java
index ddce3de..329d209 100755
--- a/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java
+++ b/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java
@@ -82,6 +82,7 @@ public class AuditFilter implements Filter {
         final String              user               = 
AtlasAuthorizationUtils.getCurrentUserName();
         final Set<String>         userGroups         = 
AtlasAuthorizationUtils.getCurrentUserGroups();
         final String              deleteType         = 
httpRequest.getParameter("deleteType");
+        final boolean             skipFailedEntities = 
Boolean.parseBoolean(httpRequest.getParameter("skipFailedEntities"));
 
         try {
             currentThread.setName(formatName(oldName, requestId));
@@ -92,6 +93,7 @@ public class AuditFilter implements Filter {
             
requestContext.setClientIPAddress(AtlasAuthorizationUtils.getRequestIpAddress(httpRequest));
             
requestContext.setCreateShellEntityForNonExistingReference(createShellEntityForNonExistingReference);
             
requestContext.setForwardedAddresses(AtlasAuthorizationUtils.getForwardedAddressesFromRequest(httpRequest));
+            requestContext.setSkipFailedEntities(skipFailedEntities);
 
             if (StringUtils.isNotEmpty(deleteType)) {
                 if (deleteTypeOverrideEnabled) {

Reply via email to