/
StartClientSNI.java
87 lines (72 loc) · 3.31 KB
/
StartClientSNI.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.geode.benchmark.tasks;
import static org.apache.geode.benchmark.topology.Roles.PROXY;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.util.Properties;
import org.apache.geode.cache.client.ClientCacheFactory;
import org.apache.geode.perftest.TestContext;
public class StartClientSNI extends StartClient {
private final int proxyPort;
public StartClientSNI(final int locatorPort, final int proxyPort) {
super(locatorPort);
this.proxyPort = proxyPort;
}
@Override
protected ClientCacheFactory createClientCacheFactory(final InetAddress locator,
final String statsFile,
final Properties properties,
final TestContext context)
throws NoSuchMethodException, InvocationTargetException,
IllegalAccessException, ClassNotFoundException {
final ClientCacheFactory cacheFactory =
super.createClientCacheFactory(locator, statsFile, properties, context);
final InetAddress proxyInetAddress =
context.getHostsForRole(PROXY.name()).stream().findFirst().get();
return reflectivelySetSniSocketFactory(cacheFactory, proxyInetAddress);
}
protected ClientCacheFactory reflectivelySetSniSocketFactory(
final ClientCacheFactory clientCacheFactory,
final InetAddress proxyInetAddress)
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException,
ClassNotFoundException {
/*
* We'd like to simply do the following, but that would introduce a compile-time dependency on
* Geode [1.13,). But we want this benchmark code to work with older Geode version. So we'll
* use reflection to do it.
*
* return clientCacheFactory
* .setPoolSocketFactory(ProxySocketFactories.sni(
* proxyHostAddress,
* SNI_PROXY_PORT));
*/
final Class<?> proxySocketFactoriesClass =
Class.forName("org.apache.geode.cache.client.proxy.ProxySocketFactories");
final Method sniStaticMethod =
proxySocketFactoriesClass.getMethod("sni", String.class, int.class);
final Object sniSocketFactory =
sniStaticMethod.invoke(null, proxyInetAddress.getHostName(), proxyPort);
final Class<?> socketFactoryClass =
Class.forName("org.apache.geode.cache.client.SocketFactory");
final Method setPoolSocketFactoryMethod =
clientCacheFactory.getClass().getMethod("setPoolSocketFactory", socketFactoryClass);
return (ClientCacheFactory) setPoolSocketFactoryMethod.invoke(clientCacheFactory,
sniSocketFactory);
}
}