17
17
*/
18
18
package com .datastax .oss .driver .internal .core .addresstranslation ;
19
19
20
- import static com .datastax .oss .driver .api .core .config .DefaultDriverOption .RESOLVE_CONTACT_POINTS ;
21
-
22
20
import com .datastax .oss .driver .api .core .addresstranslation .AddressTranslator ;
23
21
import com .datastax .oss .driver .api .core .config .DriverOption ;
24
22
import com .datastax .oss .driver .api .core .context .DriverContext ;
@@ -74,6 +72,13 @@ public class SubnetAddressTranslator implements AddressTranslator {
74
72
public static final String ADDRESS_TRANSLATOR_DEFAULT_ADDRESS =
75
73
"advanced.address-translator.default-address" ;
76
74
75
+ /**
76
+ * Whether to resolve the addresses on initialization (if true) or on each node (re-)connection
77
+ * (if false). Defaults to false.
78
+ */
79
+ public static final String ADDRESS_TRANSLATOR_RESOLVE_ADDRESSES =
80
+ "advanced.address-translator.resolve-addresses" ;
81
+
77
82
public static DriverOption ADDRESS_TRANSLATOR_SUBNET_ADDRESSES_OPTION =
78
83
new DriverOption () {
79
84
@ NonNull
@@ -92,13 +97,26 @@ public String getPath() {
92
97
}
93
98
};
94
99
100
+ public static DriverOption ADDRESS_TRANSLATOR_RESOLVE_ADDRESSES_OPTION =
101
+ new DriverOption () {
102
+ @ NonNull
103
+ @ Override
104
+ public String getPath () {
105
+ return ADDRESS_TRANSLATOR_RESOLVE_ADDRESSES ;
106
+ }
107
+ };
108
+
95
109
private final List <SubnetAddress > subnetAddresses ;
96
- private final Optional <String > defaultAddress ;
97
- private final boolean resolveAddresses ;
110
+ private final Optional <InetSocketAddress > defaultAddress ;
98
111
private final String logPrefix ;
99
112
100
113
public SubnetAddressTranslator (@ NonNull DriverContext context ) {
101
114
logPrefix = context .getSessionName ();
115
+ boolean resolveAddresses =
116
+ context
117
+ .getConfig ()
118
+ .getDefaultProfile ()
119
+ .getBoolean (ADDRESS_TRANSLATOR_RESOLVE_ADDRESSES_OPTION , false );
102
120
this .subnetAddresses =
103
121
context .getConfig ().getDefaultProfile ()
104
122
.getStringMap (ADDRESS_TRANSLATOR_SUBNET_ADDRESSES_OPTION ).entrySet ().stream ()
@@ -109,20 +127,18 @@ public SubnetAddressTranslator(@NonNull DriverContext context) {
109
127
// "100.64.0.0/15" -> '"100.64.0.0/15"'
110
128
String subnetCIDR = e .getKey ().replaceAll ("\" " , "" );
111
129
String address = e .getValue ();
112
- return new SubnetAddress (subnetCIDR , address );
130
+ return new SubnetAddress (subnetCIDR , parseAddress ( address , resolveAddresses ) );
113
131
})
114
132
.collect (Collectors .toList ());
115
133
this .defaultAddress =
116
134
Optional .ofNullable (
117
- context
118
- .getConfig ()
119
- .getDefaultProfile ()
120
- .getString (ADDRESS_TRANSLATOR_DEFAULT_ADDRESS_OPTION , null ));
121
- this .resolveAddresses =
122
- context .getConfig ().getDefaultProfile ().getBoolean (RESOLVE_CONTACT_POINTS , true );
135
+ context
136
+ .getConfig ()
137
+ .getDefaultProfile ()
138
+ .getString (ADDRESS_TRANSLATOR_DEFAULT_ADDRESS_OPTION , null ))
139
+ .map (address -> parseAddress (address , resolveAddresses ));
123
140
124
141
validateSubnetsAreNotOverlapping (this .subnetAddresses );
125
- this .defaultAddress .ifPresent (SubnetAddressTranslator ::validateAddress );
126
142
}
127
143
128
144
@ NonNull
@@ -131,32 +147,31 @@ public InetSocketAddress translate(@NonNull InetSocketAddress address) {
131
147
InetSocketAddress translatedAddress = null ;
132
148
for (SubnetAddress subnetAddress : subnetAddresses ) {
133
149
if (subnetAddress .contains (address )) {
134
- translatedAddress = parseAddress ( subnetAddress .address , resolveAddresses ) ;
150
+ translatedAddress = subnetAddress .address ;
135
151
}
136
152
}
137
153
if (translatedAddress == null && defaultAddress .isPresent ()) {
138
- translatedAddress = parseAddress ( defaultAddress .get (), resolveAddresses );
154
+ translatedAddress = defaultAddress .get ();
139
155
}
140
156
if (translatedAddress == null ) {
141
157
translatedAddress = address ;
142
158
}
143
- LOG .debug ("[{}] Resolved {} to {}" , logPrefix , address , translatedAddress );
159
+ LOG .debug ("[{}] Translated {} to {}" , logPrefix , address , translatedAddress );
144
160
return translatedAddress ;
145
161
}
146
162
147
163
@ Override
148
164
public void close () {}
149
165
150
166
@ Nullable
151
- private static InetSocketAddress parseAddress (String address , boolean resolve ) {
152
- return AddressUtils .extract (address , resolve ).iterator ().next ();
153
- }
154
-
155
- private static void validateAddress (String address ) {
167
+ private InetSocketAddress parseAddress (String address , boolean resolve ) {
156
168
try {
157
- parseAddress (address , false );
169
+ InetSocketAddress parsedAddress = AddressUtils .extract (address , resolve ).iterator ().next ();
170
+ LOG .debug ("[{}] Parsed {} to {}" , logPrefix , address , parsedAddress );
171
+ return parsedAddress ;
158
172
} catch (RuntimeException e ) {
159
- throw new IllegalArgumentException ("Invalid address: " + address , e );
173
+ throw new IllegalArgumentException (
174
+ String .format ("Invalid address %s (%s)" , address , e .getMessage ()));
160
175
}
161
176
}
162
177
@@ -177,13 +192,11 @@ private static void validateSubnetsAreNotOverlapping(List<SubnetAddress> subnetA
177
192
178
193
private static class SubnetAddress {
179
194
private final IPAddress subnet ;
180
- private final String address ;
195
+ private final InetSocketAddress address ;
181
196
182
- private SubnetAddress (String subnetCIDR , String address ) {
197
+ private SubnetAddress (String subnetCIDR , InetSocketAddress address ) {
183
198
this .subnet = parseSubnet (subnetCIDR );
184
199
this .address = address ;
185
-
186
- validateAddress (this .address );
187
200
}
188
201
189
202
private static IPAddress parseSubnet (String subnetCIDR ) {
0 commit comments