Well, let me know if you have to dive into that and we can wrestle it to the 
ground. I suppose the short answer is “that code is correct if I remember 
correctly”….

> On Aug 6, 2020, at 8:22 PM, Đạt Cao Mạnh <[email protected]> wrote:
> 
> Thank Erick,
> 
> I'm not fully understand it, but it kinda makes sense somehow.
> 
> Thank you!
> 
> On Thu, Aug 6, 2020 at 6:40 PM Erick Erickson <[email protected]> wrote:
> Dat:
> 
> That’s a confusingly-named variable, surely needs a comment. Remembering from 
> a long time ago trying to work with PreferredLeader, the problem is that you 
> can’t _replace_ the head because that’s the one that actually is the leader. 
> You have to spoof that by inserting a node that points to the leader, then 
> making the leader go away so election takes place. IIRC (and lots may have 
> changed since then), you wind up with a situation where
> 
> znode0 is the current leader
> znode1 points to znode0
> znode2 _also_ points to znode0
> znode3 points to znode1
> znode 4 points to znode3
> 
> znode1 here was the original znode put in the queue to become the next 
> leader. znode2 is the one added by the code you’re looking at. When leader 
> election actually happens, this situation is detected and znode2 becomes the 
> leader and znode3 is changed to point to znode2 WARNING: This is what I 
> remember from code I worked on a long time ago, it may have been changed a 
> lot since then. But I’m fairly sure that’s what’s behind that code.
> 
> Best,
> Erick
> 
> 
> 
> > On Aug 6, 2020, at 6:18 AM, Cao Mạnh Đạt <[email protected]> wrote:
> > 
> > Hi guys,
> > 
> > When I look at these lines, 
> > if(joinAtHead){
> >   log.debug("Node {} trying to join election at the head", id);
> >   List<String> nodes = 
> > OverseerTaskProcessor.getSortedElectionNodes(zkClient, shardsElectZkPath);
> >   if(nodes.size() <2){
> >     leaderSeqPath = zkClient.create(shardsElectZkPath + "/" + id + "-n_", 
> > null,
> >         CreateMode.EPHEMERAL_SEQUENTIAL, false);
> >   } else {
> >     String firstInLine = nodes.get(1);
> >     log.debug("The current head: {}", firstInLine);
> >     Matcher m = LEADER_SEQ.matcher(firstInLine);
> >     if (!m.matches()) {
> >       throw new IllegalStateException("Could not find regex match in:"
> >           + firstInLine);
> >     }
> >     leaderSeqPath = shardsElectZkPath + "/" + id + "-n_"+ m.group(1);
> >     zkClient.create(leaderSeqPath, null, CreateMode.EPHEMERAL, false);
> >   }
> > } else {
> > the line firstInLine = nodes.get(1) seems problematic to me. Why do we get 
> > the middle of a sorted list and say that it is the first thing in line? 
> > Should I open an issue for this?
> > 
> > Thanks
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 
> 
> 
> -- 
> Best regards,
> Cao Mạnh Đạt
> E-mail: [email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to