sijie commented on a change in pull request #425: BOOKKEEPER-1105:
RackAwarePolicy: Failure to map node into rack may result in failure to add
other nodes.
URL: https://github.com/apache/bookkeeper/pull/425#discussion_r132529923
##########
File path:
bookkeeper-server/src/main/java/org/apache/bookkeeper/net/DNSToSwitchMapping.java
##########
@@ -41,14 +41,14 @@
* <p/>
*
* If a name cannot be resolved to a rack, the implementation
- * should return {@link NetworkTopology#DEFAULT_RACK}. This
+ * should return {@link NetworkTopology#DEFAULT_REGION_AND_RACK}. This
* is what the bundled implementations do, though it is not a formal
requirement
*
* @param names the list of hosts to resolve (can be empty)
* @return list of resolved network paths.
* If <i>names</i> is empty, the returned list is also empty
*/
- public List<String> resolve(List<String> names);
+ public List<String> resolve(List<String> names, String defaultRack);
Review comment:
This would break the binary compatibility for any people who implemented
DNSToSwitchMapping.
The main problem is
```java
public static String resolveNetworkLocation(DNSToSwitchMapping
dnsResolver, InetSocketAddress addr) {
List<String> names = new ArrayList<String>(1);
if (dnsResolver instanceof CachedDNSToSwitchMapping) {
names.add(addr.getAddress().getHostAddress());
} else {
names.add(addr.getHostName());
}
// resolve network addresses
List<String> rNames = dnsResolver.resolve(names);
String netLoc;
if (null == rNames) {
logger.warn("Failed to resolve network location for {}, using
default rack for them : {}.", names,
NetworkTopology.DEFAULT_RACK);
netLoc = NetworkTopology.DEFAULT_RACK;
} else {
netLoc = rNames.get(0);
}
return netLoc;
}
```
I think a clean solution without breaking the binary compatibility is
- Fix the DefaultResolver to allow passing in a `defaultRack`
```java
class DefaultResolver {
final String defaultRack = ...;
DefaultResolver() {
this(...);
}
DefaultResolver(String defaultRack) {
this.defaultRack = defaultRack;
}
}
```
the rackware can use new DefaultResolver(`/default-rack`) and regionaware
can use new DefaultResolver(`/default-region/default-rack`)
- create a DNSResolverDelegator with default-rack and remove the logic
`NetUtils#resolveNetworkLocation` to this delegator.
```java
class DNSResolverDelegator extends DefaultResolver {
DNSToSwitchMapping resolver;
DNSResolverDelegator(DNSToSwitchMapping resolver, String defaultRack) {
super(defaultRack);
this.resolver= resolver;
}
List<String> resolve(List<String> names) {
List<String> resolvedNames = resolver.resolve(names);
if (null == resolvedNames) {
// return default rack
}
}
}
```
- on initialization
```java
if (optionalDnsResolver.isPresent()) {
dnsResolver = optionalDnsResolver.get();
} else {
String dnsResolverName = conf.getString(REPP_DNS_RESOLVER_CLASS,
ScriptBasedMapping.class.getName());
try {
dnsResolver = ReflectionUtils.newInstance(dnsResolverName,
DNSToSwitchMapping.class);
if (dnsResolver instanceof Configurable) {
((Configurable) dnsResolver).setConf(conf);
}
} catch (RuntimeException re) {
LOG.info("Failed to initialize DNS Resolver {}, used default
subnet resolver.", dnsResolverName, re);
dnsResolver = new DefaultResolver(`default-rack`); // <= add
default rack
}
}
this.dnsResolver = new DNSResolverDelegator(dnsResolver,
defaultRack);
```
In this way you don't need to change the signature of the methods. How does
that sound?
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services