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

Kezhu Wang reassigned CURATOR-637:
----------------------------------

    Assignee: Kezhu Wang

> Get Leader zNode actual path from LeaderSelector
> ------------------------------------------------
>
>                 Key: CURATOR-637
>                 URL: https://issues.apache.org/jira/browse/CURATOR-637
>             Project: Apache Curator
>          Issue Type: Improvement
>          Components: Recipes
>    Affects Versions: 5.2.1
>            Reporter: Robin Singh
>            Assignee: Kezhu Wang
>            Priority: Minor
>             Fix For: TBD
>
>
> We are exploring LeaderSelector to implement leader election in our spring 
> application. To implement fencing, we have to fetch all the participating 
> zNodes in the leader election and then match the leaderSelector Id with each 
> child's data.
>  
> This code is being executed in a Timer.
>  
> {code:java}
> if (isLeader.get()) {
>      try {
>           curator.createContainers("/spring-integration/fence");
>           Stat stat = 
> curator.checkExists().forPath("/spring-integration/leader");
>           if (null != stat) {
>                List<String> allChilds = 
> curator.getChildren().forPath("/spring-integration/leader");
>                if (allChilds != null && !allChilds.isEmpty()) {
>                     String myChildPath = null;
>                     for (String child : allChilds) {
>                          String childPath = "/spring-integration/leader/" + 
> child;
>                          try {
>                               String childId = new 
> String(curator.getData().forPath(childPath), "UTF-8");
>                               if (myId.equals(childId)){
>                                    myChildPath = childPath;                   
>                           
>                                    break;                                     
>     
>                               }
>                          } catch (Exception e){
>                              //ignore                                     
>                          }
>                     }
>                if (null != myChildPath){
>                    curator.transaction()
>                    .forOperations(curator.transactionOp().setData()
>                    .forPath("/spring-integration/fence",new String("" + 
> counter.incrementAndGet()).getBytes()),                    
> curator.transactionOp().check().forPath(myChildPath));                        
>          
>                }
>            }
>            String stringData = new 
> String(curator.getData().forPath("/spring-integration/fence"));
>            System.out.println("SAVED DATA: " + stringData);
>            }
>        } catch (Exception e){                         
>             e.printStackTrace();                     
>        }
> } else{                     
>    System.out.println("I am Not the leader, I cannot write anything");
>    leaderSelector.requeue();                 
> }
> {code}
>  
> AutoRequeue is disabled, we are requeing leader selection if isLeader is 
> false.
>  
> This is the leaderSelectorListener.
> {code:java}
>  
> @Override
> public void takeLeadership(CuratorFramework client) throws Exception {
>    try{                    
>        System.out.println("I AM THE LEADER");                     
>        isLeader.set(true);                     
>        Thread.sleep(Long.MAX_VALUE);                 
>    } catch (@SuppressWarnings("unused") InterruptedException e){              
>        
>    } finally{                     
>         System.out.println("I AM NOT THE LEADER ANYMORE");                    
>  
>         myId = generateId();                     
>         leaderSelector.setId(myId);                     
>         isLeader.set(false);                 
>     }
> }
> {code}
>  
> Generating a new ID so that when requeing for leaderElection, a new node will 
> be generated with a different ID.
> Question 1. Do I have to re generate ID so that when requeing for 
> leaderElection a new zNode will be created using that new ID? Can I assume 
> that in all the scenarios the zNode will always be deleted and then only a 
> new leader will be elected from the participants?
>  
> Improvement 1. If only we could get the zNode path for our application using 
> leaderSelection.getCurrentPath() as InterProcessMutex stores that path in 
> threadData map the code for fencing would be cleaned up.
>  
> I was checking some issues related to fencing and leader based dataStore. And 
> from there I found this document 
> [https://docs.google.com/document/d/1cBY1t0k5g1xNqzyfZby3LcPu4t-wpx57G1xf-nmWrCo/edit#]



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

Reply via email to