[ 
https://issues.apache.org/jira/browse/RANGER-4956?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Madhan Neethiraj updated RANGER-4956:
-------------------------------------
    Attachment: RANGER-4956.patch

> RangerBasePlugin is not getting initialised when tag dedup feature is enabled
> -----------------------------------------------------------------------------
>
>                 Key: RANGER-4956
>                 URL: https://issues.apache.org/jira/browse/RANGER-4956
>             Project: Ranger
>          Issue Type: Bug
>          Components: plugins
>    Affects Versions: 2.5.0
>            Reporter: Anand Nadar
>            Assignee: Madhan Neethiraj
>            Priority: Major
>             Fix For: 3.0.0, 2.6.0
>
>         Attachments: RANGER-4956.patch
>
>
> When ranger.admin.supports.tags.dedup is set to true, i.e tag dedup feature 
> is enabled, we have found that the ranger plugin is not getting initialised 
> using the below rangerbaseplugin constructor.
> public RangerBasePlugin(RangerPluginConfig pluginConfig, ServicePolicies 
> policies, ServiceTags tags, RangerRoles roles, RangerUserStore userStore, 
> ServiceGdsInfo gdsInfo) 
> Here we have tags data as below which is provided in the above constructor
> {code:java}
> {
>   "op": "add_or_update",
>   "serviceName": "hive",
>   "tagVersion": 7,
>   "tagDefinitions": {
>     "2": {
>       "id": 2,
>       "isEnabled": true,
>       "name": "TAG2",
>       "source": "Internal"
>     }
>   },
>   "tags": {
>     "10": {
>       "id": 10,
>       "isEnabled": true,
>       "type": "TAG2"
>     }
>   },
>   "serviceResources": [
>     {
>       "id": 8,
>       "isEnabled": true,
>       "resourceElements": {
>         "database": {
>           "values": [
>             "db1"
>           ],
>           "isExcludes": false,
>           "isRecursive": false
>         }
>       },
>       "resourceSignature": 
> "7ea12bf936f94ba73833373104ca818c249dfea758ed3366b675e86f42f01983"
>     }
>   ],
>   "resourceToTagIds": {
>     "8": [
>       10
>     ]
>   },
>   "isDelta": false,
>   "tagsChangeExtent": "ALL",
>   "isTagsDeduped": true,
>   "id": 0
> }{code}
> and therefore we set the tags in the tag enricher using the below 
> tagEnricher.setServiceTags(tags);
> Now in the below method
> protected void setServiceTags(final ServiceTags serviceTags, final boolean 
> rebuildOnlyIndex) 
> we have this piece of code
> {code:java}
> if (!serviceTags.getIsDelta()) {                                      
>    if (serviceTags.getIsTagsDeduped()) {                                      
>                                final int countOfDuplicateTags = 
> serviceTags.dedupTags();
> LOG.info("Number of duplicate tags removed from the received serviceTags:[" + 
> countOfDuplicateTags + "]. Number of tags in the de-duplicated serviceTags 
> :[" + serviceTags.getTags().size() + "].");                                  
> }                                       processServiceTags(serviceTags);      
>                           }{code}
> Here if serviceTags.getIsTagsDeduped() is true, we are deduping the tags 
> again.
> And when this is being triggered, an infinite for loop is triggered 
> inserviceTags serviceTags.dedupTags() method
> Below is the code which goes in infinite loop
> {code:java}
> for (Long replacerTagId = replacedIds.get(tagId); replacerTagId != null; 
> replacerTagId = replacedIds.get(tagId)) {
>                     tagId = replacerTagId;
>                 } {code}
> {10, 1} was already available in cachedTags.
> Here replacedIds has \{10=10}
> tagId is 10
> and for this as data, the the for loop goes into infinite.
> {*}Note{*}: This behaviour is seen in the below case:
> 1. We initialise the plugin with the above available tag data and 
> Rangerbaseplugin constructor. This works fine
> 2. Now we are trying to initialise a new Rangerbaseplugin with the same tags 
> and this is when the plugin is not initialised and the for loop goes into an 
> infinite state.
> Suggestion:
> {code:java}
> if (!serviceTags.getIsDelta()) { 
> if (serviceTags.getIsTagsDeduped()) { final int countOfDuplicateTags = 
> serviceTags.dedupTags(); LOG.info("Number of duplicate tags removed from the 
> received serviceTags:[" + countOfDuplicateTags + "]. Number of tags in the 
> de-duplicated serviceTags :[" + serviceTags.getTags().size() + "]."); } 
> processServiceTags(serviceTags); } {code}
> Should the above piece of code in RangerTagEnricher be modified to 
> {code:java}
> if (!serviceTags.getIsDelta()) { 
> processServiceTags(serviceTags); 
> } {code}
> Since tags are already deduped in ranger admin, I feel there is no need to 
> dedup it in the plugin end.
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to