diff --git a/src/main/java/com/couchbase/client/core/config/AbstractBucketConfig.java b/src/main/java/com/couchbase/client/core/config/AbstractBucketConfig.java index 148aef7..eb3b5f2 100644 --- a/src/main/java/com/couchbase/client/core/config/AbstractBucketConfig.java +++ b/src/main/java/com/couchbase/client/core/config/AbstractBucketConfig.java @@ -15,8 +15,6 @@ */ package com.couchbase.client.core.config; -import com.couchbase.client.core.logging.CouchbaseLogger; -import com.couchbase.client.core.logging.CouchbaseLoggerFactory; import com.couchbase.client.core.service.ServiceType; import com.couchbase.client.core.utils.NetworkAddress; @@ -25,7 +23,6 @@ import java.util.List; import java.util.Map; public abstract class AbstractBucketConfig implements BucketConfig { - private static final CouchbaseLogger LOGGER = CouchbaseLoggerFactory.getInstance(AbstractBucketConfig.class); private final String name; private String username; @@ -38,13 +35,14 @@ public abstract class AbstractBucketConfig implements BucketConfig { private final List bucketCapabilities; protected AbstractBucketConfig(String name, BucketNodeLocator locator, String uri, String streamingUri, - List nodeInfos, List portInfos, List bucketCapabilities) { + List nodeInfos, List portInfos, List bucketCapabilities, + NetworkAddress hostAddress) { this.name = name; this.locator = locator; this.uri = uri; this.streamingUri = streamingUri; this.bucketCapabilities = bucketCapabilities; - this.nodeInfo = portInfos == null ? nodeInfos : nodeInfoFromExtended(portInfos, nodeInfos); + this.nodeInfo = portInfos == null ? nodeInfos : nodeInfoFromExtended(portInfos, nodeInfos, hostAddress); int es = 0; for (NodeInfo info : nodeInfo) { for (ServiceType type : info.services().keySet()) { @@ -66,17 +64,18 @@ public abstract class AbstractBucketConfig implements BucketConfig { * @param nodesExt the extended information. * @return the generated node infos. */ - private List nodeInfoFromExtended(final List nodesExt, final List nodeInfos) { + private List nodeInfoFromExtended(final List nodesExt, final List nodeInfos, + final NetworkAddress hostAddress) { List converted = new ArrayList(nodesExt.size()); for (int i = 0; i < nodesExt.size(); i++) { NetworkAddress hostname = nodesExt.get(i).hostname(); if (hostname == null) { if (nodeInfos.size() == nodesExt.size()) { + // handle < 3.0.2 hostname = nodeInfos.get(i).hostname(); } else { - // If hostname missing, then node configured using localhost - LOGGER.debug("Hostname is for nodesExt[{}] is not available, falling back to localhost.", i); - hostname = NetworkAddress.localhost(); + // fallback to the address we used to contact this host + hostname = hostAddress; } } Map ports = nodesExt.get(i).ports(); @@ -144,4 +143,4 @@ public abstract class AbstractBucketConfig implements BucketConfig { public boolean serviceEnabled(ServiceType type) { return (enabledServices & (1 << type.ordinal())) != 0; } -} +} \ No newline at end of file diff --git a/src/main/java/com/couchbase/client/core/config/DefaultCouchbaseBucketConfig.java b/src/main/java/com/couchbase/client/core/config/DefaultCouchbaseBucketConfig.java index 2033d82..2464096 100644 --- a/src/main/java/com/couchbase/client/core/config/DefaultCouchbaseBucketConfig.java +++ b/src/main/java/com/couchbase/client/core/config/DefaultCouchbaseBucketConfig.java @@ -19,6 +19,7 @@ import com.couchbase.client.core.logging.CouchbaseLogger; import com.couchbase.client.core.logging.CouchbaseLoggerFactory; import com.couchbase.client.core.service.ServiceType; import com.couchbase.client.core.utils.NetworkAddress; +import com.fasterxml.jackson.annotation.JacksonInject; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -28,7 +29,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import static com.couchbase.client.core.logging.RedactableArgument.meta; import static com.couchbase.client.core.logging.RedactableArgument.system; @JsonIgnoreProperties(ignoreUnknown = true) @@ -66,8 +66,9 @@ public class DefaultCouchbaseBucketConfig extends AbstractBucketConfig implement @JsonProperty("vBucketServerMap") CouchbasePartitionInfo partitionInfo, @JsonProperty("nodes") List nodeInfos, @JsonProperty("nodesExt") List portInfos, - @JsonProperty("bucketCapabilities") List bucketCapabilities) { - super(name, BucketNodeLocator.VBUCKET, uri, streamingUri, nodeInfos, portInfos, bucketCapabilities); + @JsonProperty("bucketCapabilities") List bucketCapabilities, + @JacksonInject("hostAddress") NetworkAddress hostAddress) { + super(name, BucketNodeLocator.VBUCKET, uri, streamingUri, nodeInfos, portInfos, bucketCapabilities, hostAddress); this.partitionInfo = partitionInfo; this.tainted = partitionInfo.tainted(); List extendedNodeInfos = this.nodes(); // includes ports for SSL services diff --git a/src/main/java/com/couchbase/client/core/config/DefaultMemcachedBucketConfig.java b/src/main/java/com/couchbase/client/core/config/DefaultMemcachedBucketConfig.java index f310f92..ccc5436 100644 --- a/src/main/java/com/couchbase/client/core/config/DefaultMemcachedBucketConfig.java +++ b/src/main/java/com/couchbase/client/core/config/DefaultMemcachedBucketConfig.java @@ -58,8 +58,9 @@ public class DefaultMemcachedBucketConfig extends AbstractBucketConfig implement @JsonProperty("streamingUri") String streamingUri, @JsonProperty("nodes") List nodeInfos, @JsonProperty("nodesExt") List portInfos, - @JsonProperty("bucketCapabilities") List bucketCapabilities) { - super(name, BucketNodeLocator.KETAMA, uri, streamingUri, nodeInfos, portInfos, bucketCapabilities); + @JsonProperty("bucketCapabilities") List bucketCapabilities, + @JacksonInject("hostAddress") NetworkAddress hostAddress) { + super(name, BucketNodeLocator.KETAMA, uri, streamingUri, nodeInfos, portInfos, bucketCapabilities, hostAddress); this.env = env; this.rev = rev; this.ketamaNodes = new TreeMap(); diff --git a/src/main/java/com/couchbase/client/core/config/loader/AbstractLoader.java b/src/main/java/com/couchbase/client/core/config/loader/AbstractLoader.java index 770f594..083c036 100644 --- a/src/main/java/com/couchbase/client/core/config/loader/AbstractLoader.java +++ b/src/main/java/com/couchbase/client/core/config/loader/AbstractLoader.java @@ -183,7 +183,7 @@ public abstract class AbstractLoader implements Loader { @Override public Tuple2 call(final String rawConfig) { LOGGER.debug("Got configuration from Service, attempting to parse."); - BucketConfig config = BucketConfigParser.parse(rawConfig, env()); + BucketConfig config = BucketConfigParser.parse(rawConfig, env(), node); config.username(username); config.password(password); return Tuple.create(loaderType, config); diff --git a/src/main/java/com/couchbase/client/core/config/parser/BucketConfigParser.java b/src/main/java/com/couchbase/client/core/config/parser/BucketConfigParser.java index 0c1d359..8d8360c 100644 --- a/src/main/java/com/couchbase/client/core/config/parser/BucketConfigParser.java +++ b/src/main/java/com/couchbase/client/core/config/parser/BucketConfigParser.java @@ -19,6 +19,7 @@ import com.couchbase.client.core.CouchbaseException; import com.couchbase.client.core.config.BucketConfig; import com.couchbase.client.core.env.ConfigParserEnvironment; import com.couchbase.client.core.utils.DefaultObjectMapper; +import com.couchbase.client.core.utils.NetworkAddress; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.InjectableValues; @@ -38,10 +39,11 @@ public final class BucketConfigParser { * @param input the raw string input. * @return the parsed bucket configuration. */ - public static BucketConfig parse(final String input, final ConfigParserEnvironment env) { + public static BucketConfig parse(final String input, final ConfigParserEnvironment env, NetworkAddress hostAddress) { try { InjectableValues inject = new InjectableValues.Std() - .addValue("env", env); + .addValue("env", env) + .addValue("hostAddress", hostAddress); return DefaultObjectMapper.reader() .forType(BucketConfig.class) .with(inject)