[ 
https://issues.apache.org/jira/browse/HELIX-572?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14351965#comment-14351965
 ] 

kishore gopalakrishna commented on HELIX-572:
---------------------------------------------

For now, I will submit a patch to not delete the external view. I am assuming 
the reason we were deleting earlier was to handle the change in number of 
buckets dynamically. I dont think we can support changing them dynamically. We 
will have to re visit that again.

> External view is recreated every time for bucketized resource
> -------------------------------------------------------------
>
>                 Key: HELIX-572
>                 URL: https://issues.apache.org/jira/browse/HELIX-572
>             Project: Apache Helix
>          Issue Type: Bug
>          Components: helix-core
>    Affects Versions: 0.7.1, 0.6.4
>            Reporter: kishore gopalakrishna
>            Assignee: kishore gopalakrishna
>            Priority: Critical
>             Fix For: 0.6.5, 0.7.2
>
>
> If the resource is bucketized, controller first deletes the existing external 
> view and then recreates it. First of all this is inefficient and triggers a 
> lot of unwanted changes.
> The code is i here ZKHelixDataAccessor
> {code}
>    case EXTERNALVIEW:
>         if (value.getBucketSize() == 0) {
>           records.add(value.getRecord());
>         } else {
>           _baseDataAccessor.remove(path, options);
> {code}
> Second, the external view change listeners stops listening to further 
> changes.  This may or may not happen all the time, but the probability of 
> occurrence is pretty high.
> After EV is deleted, the listener gets a callback. The callback is handled by 
> zkcallbackhandler. When it gets a callback, it tries to set the watch again 
> but the path may or may not exist (depending on how fast the controller 
> recreated the external view). If the path exists there is not problem, but if 
> it does not, we assume that the parent node is deleted and remove the 
> listener and invoke FINALIZE. Again this would not have happened if the 
> resource was not bucketized.
> {code}
> @Override
>   public void handleChildChange(String parentPath, List<String> 
> currentChilds) {
>     try {
>       updateNotificationTime(System.nanoTime());
>       if (parentPath != null && parentPath.startsWith(_path)) {
>         NotificationContext changeContext = new NotificationContext(_manager);
>         if (currentChilds == null) {
>           // parentPath has been removed
>           if (parentPath.equals(_path)) {
>             // _path has been removed, remove this listener
>             _manager.removeListener(_propertyKey, _listener);
>           }
>           changeContext.setType(NotificationContext.Type.FINALIZE);
>         } else {
>           changeContext.setType(NotificationContext.Type.CALLBACK);
>         }
>         changeContext.setPathChanged(_path);
>         invoke(changeContext);
>       }
>     } catch (Exception e) {
>       String msg =
>           "exception in handling child-change. instance: " + _instanceName + 
> ", parentPath: "
>               + parentPath + ", listener: " + _listener;
>       ZKExceptionHandler.getInstance().handle(msg, e);
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to