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

Gowrima updated ZOOKEEPER-2409:
-------------------------------
    Labels:   (was: easyfix)

> zookeeper recipes lock's c implement: function child_floor bug
> --------------------------------------------------------------
>
>                 Key: ZOOKEEPER-2409
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2409
>             Project: ZooKeeper
>          Issue Type: Bug
>          Components: c client
>    Affects Versions: 3.4.8
>         Environment: zookeeper cluster with multi servers(not standalone 
> mode), and multi clients connect to different zookeeper server.
>            Reporter: europelee
>            Priority: Major
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> 1. start zookeeper cluster with multi servers
> 2. multi clients connect to different zookeeper server at the same time
> 3. clients use lock from zookeeper recipes lock's C implement.
> for example:
> Client A  create a node like x-025373e3a9960050-0000000067
> and Client B create a node like x-015373e3a9960050-0000000068;
> A is a lock owner now, then kill A,  as expect, B should become owner, but in 
> fact B not.
> Because in zoo_lock.c, function  zkr_lock_operation call child_floor to 
> monitoring a pre node, but child_floor has bug, it caused B not check its 
> prenode A.
> B function child_floor just simply strcmp "x-025373e3a9960050-0000000067" 
> with own node "x-015373e3a9960050-0000000068", 
> it should only strcmp "0000000067" with "0000000068", not include session 
> info.
> besides, it is better that using binary search than travelling every node for 
> looking for a pre node when there exists many nodes.
> fix:
> static char* child_floor(char **sorted_data, int len, char *element) {
>     char* ret = NULL;
>     int begin = 0;
>     int end = len-1;
>     int index = 0;
>     while (begin <= end) {
>         index = (begin+end)/2;
>         int iCmpRet = strcmp(strrchr(sorted_data[index], '-')+1, 
> strrchr(element, '-')+1);
>         if (iCmpRet < 0) {
>             begin = index + 1;
>         }
>         else {
>             if (iCmpRet == 0) {
>                 if (index - 1 >= 0) {
>                     ret = sorted_data[index-1];
>                 }
>                 break;
>             }
>             else {
>                 end = index - 1;
>             }
>         }
>     }
>     return ret;
> }



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

Reply via email to