Hi Vishal, Each server uses a different configuration file, so config files for different servers can be different. If you were in a situation where you would _want_ to bind to the wildcard interface, then you would need different configuration files anyway. For example....
Assume Server 1 has two interfaces, one for each of 192.168.0.1 and 192.168.0.2. ---- Server 1 config file ----- server.1=*:3181:4181 server.2=192.169.0.3:3181:4181 server.3=192.169.0.4:3181:4181 ---------------------------------- ---- Server 2 config file ----- server.1=192.168.0.1:3181:4181 <--- note the ip server.2=192.169.0.3:3181:4181 server.3=192.169.0.4:3181:4181 ---------------------------------- ---- Server 3 config file ----- server.1=192.168.0.2:3181:4181 <--- note the ip server.2=192.169.0.3:3181:4181 server.3=192.169.0.4:3181:4181 ---------------------------------- In this situation, where two servers are communicating with you through different addresses, server 1 needs to bind to *. However, in the normal case where everyone has the same config file, every server will communicate with server 1 on the same address, so server 1 has no need to bind to any other address. To me it seems like another config option would tell server 1 to bind to wildcard (or a host or whatever), but then the config files of the servers would still have to be different... Does that make sense? Jared On Fri, Aug 27, 2010 at 10:49 AM, Vishal K <vishalm...@gmail.com> wrote: > Hi Jared, > > If we keep this optional, then the servers would not need to bind to any > specific interface. We will just use the current implementation > (InetSocketAddress(port) with wildcard IP). > You are right, keeping it optional does not buy us much. However, I did not > understand your solution of using "server.#:0.0.0.0[:port][:port]" in the > config file. > How will a peer know the IP address of other peers? > > -Vishal > > On Fri, Aug 27, 2010 at 10:20 AM, Jared Cantwell > <jared.cantw...@gmail.com>wrote: > > > Thanks for the response Vishal. I agree that it should be used for both > > FLE > > and normal communication (both server ports). I believe the diff I sent > > incorporates that thinking, although I may not have been clear. I > > considered that it be optional, but cases where you would want it to bind > > on > > all interfaces seem rare to me, since it would require specializing the > > config files for each server so that two different servers communicated > > with > > a third server on different ports. Users who would want this to be > > optional > > could achieve the same effect by specifying their own > > "server.#=address[:port][:[port]" entry as > > "server.#:0.0.0.0[:port][:port]". > > > > I guess my proposal is that the address specified in the server.# should > be > > used. Advanced configurations can specify 0:0:0:0 to get the current > > behavior. This way there wouldn't need to be another option to say that > > (which would need customized anyway in such configurations). > > > > ~Jared > > > > On Fri, Aug 27, 2010 at 9:45 AM, Vishal K <vishalm...@gmail.com> wrote: > > > > > Hi Jared, > > > > > > I like the idea of allowing communication with ZK on only the IP > > addresses > > > specified in the config file. This is useful when you are having a host > > > with > > > multiple IP address and/or when you want to have traffic isolation. In > > our > > > setup, we will use this feature for traffic isolation. We have multiple > > > interfaces on the server, and we want to route certain type of traffic > > > through certain interfaces. > > > > > > Why not have this feature for both FLE and leader-follower > communication? > > I > > > would suggest to keep this optional (add a property) since most users > > would > > > prefer to have the ability to reach the servers from all interfaces. > > > > > > -Vishal > > > > > > On Thu, Aug 26, 2010 at 1:34 PM, Jared Cantwell < > > jared.cantw...@gmail.com > > > >wrote: > > > > > > > Hello, > > > > > > > > My project currently has the need to specify the local address that > is > > > used > > > > for leader communication (and not use the default of listening on all > > > > interfaces). This is similar to the clientPortAddress parameter that > > was > > > > recently added. After reviewing the code, we can't think of a reason > > why > > > > only the port would be used with the wildcard interface, when servers > > are > > > > already connecting specifically to that interface anyway. Is binding > > to > > > > the > > > > wildcard interface for leader communication intentional? > > > > > > > > I believe the change would be straightforward-- one change for each > > > leader > > > > port used. Note: this doesn't account for all leader election > > > algorithms, > > > > only the default. > > > > > > > > Index: > > > > > src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java > > > > =================================================================== > > > > --- > > > > > src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java > > > > (revision 989805) > > > > +++ > > > > > src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java > > > > (working copy) > > > > @@ -434,7 +434,7 @@ > > > > ss = ServerSocketChannel.open(); > > > > int port = > > > > self.quorumPeers.get(self.getId()).electionAddr.getPort(); > > > > ss.socket().setReuseAddress(true); > > > > - InetSocketAddress addr = new > > > InetSocketAddress(port); > > > > + InetSocketAddress addr = > > > > self.quorumPeers.get(self.getId()).electionAddr; > > > > LOG.info("My election bind port: " + > > > addr.toString()); > > > > setName(addr.toString()); > > > > ss.socket().bind(addr); > > > > Index: src/java/main/org/apache/zookeeper/server/quorum/Leader.java > > > > =================================================================== > > > > --- src/java/main/org/apache/zookeeper/server/quorum/Leader.java > > > > (revision 989805) > > > > +++ src/java/main/org/apache/zookeeper/server/quorum/Leader.java > > > > (working > > > > copy) > > > > @@ -128,10 +128,11 @@ > > > > Leader(QuorumPeer self,LeaderZooKeeperServer zk) throws > IOException > > { > > > > this.self = self; > > > > try { > > > > - ss = new > ServerSocket(self.getQuorumAddress().getPort()); > > > > + ss = new ServerSocket(); > > > > + ss.bind(self.getQuorumAddress()); > > > > } catch (BindException e) { > > > > - LOG.error("Couldn't bind to port " > > > > - + self.getQuorumAddress().getPort(), e); > > > > + LOG.error("Couldn't bind to address " > > > > + + self.getQuorumAddress().getAddress() + ":" + > > > > self.getQuorumAddress().getPort(), e); > > > > throw e; > > > > } > > > > this.zk=zk; > > > > > > > > > > > > Does this seem like a reasonable change? Thoughts? > > > > > > > > ~Jared > > > > > > > > > >