1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.client;
19
20 import java.io.IOException;
21 import java.util.Random;
22 import java.util.concurrent.ExecutorService;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.hadoop.conf.Configuration;
26 import org.apache.hadoop.hbase.HConstants;
27 import org.apache.hadoop.hbase.RegionLocations;
28 import org.apache.hadoop.hbase.ServerName;
29 import org.apache.hadoop.hbase.TableName;
30 import org.apache.hadoop.hbase.classification.InterfaceAudience;
31 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.AdminService;
32 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ClientService;
33 import org.apache.hadoop.hbase.security.User;
34 import org.apache.hadoop.hbase.security.UserProvider;
35
36 import com.google.common.annotations.VisibleForTesting;
37
38
39
40
41 @InterfaceAudience.Private
42 public class ConnectionUtils {
43
44 private static final Random RANDOM = new Random();
45
46
47
48
49
50
51
52 public static long getPauseTime(final long pause, final int tries) {
53 int ntries = tries;
54 if (ntries >= HConstants.RETRY_BACKOFF.length) {
55 ntries = HConstants.RETRY_BACKOFF.length - 1;
56 }
57 if (ntries < 0) {
58 ntries = 0;
59 }
60
61 long normalPause = pause * HConstants.RETRY_BACKOFF[ntries];
62 long jitter = (long)(normalPause * RANDOM.nextFloat() * 0.01f);
63 return normalPause + jitter;
64 }
65
66
67
68
69
70
71
72 public static NonceGenerator injectNonceGeneratorForTesting(
73 ClusterConnection conn, NonceGenerator cnm) {
74 return ConnectionManager.injectNonceGeneratorForTesting(conn, cnm);
75 }
76
77
78
79
80
81
82
83
84 public static void setServerSideHConnectionRetriesConfig(
85 final Configuration c, final String sn, final Log log) {
86
87 int hcRetries = c.getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,
88 HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);
89
90
91 int serversideMultiplier = c.getInt("hbase.client.serverside.retries.multiplier", 10);
92 int retries = hcRetries * serversideMultiplier;
93 c.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, retries);
94 log.info(sn + " server-side HConnection retries=" + retries);
95 }
96
97
98
99
100
101
102
103
104
105
106 @Deprecated
107 public static ClusterConnection createShortCircuitHConnection(final Connection conn,
108 final ServerName serverName, final AdminService.BlockingInterface admin,
109 final ClientService.BlockingInterface client) {
110 return new ConnectionAdapter(conn) {
111 @Override
112 public AdminService.BlockingInterface getAdmin(
113 ServerName sn, boolean getMaster) throws IOException {
114 return serverName.equals(sn) ? admin : super.getAdmin(sn, getMaster);
115 }
116
117 @Override
118 public ClientService.BlockingInterface getClient(
119 ServerName sn) throws IOException {
120 return serverName.equals(sn) ? client : super.getClient(sn);
121 }
122 };
123 }
124
125
126
127
128
129
130
131
132
133
134
135
136
137 public static ClusterConnection createShortCircuitConnection(final Configuration conf,
138 ExecutorService pool, User user, final ServerName serverName,
139 final AdminService.BlockingInterface admin, final ClientService.BlockingInterface client)
140 throws IOException {
141 if (user == null) {
142 user = UserProvider.instantiate(conf).getCurrent();
143 }
144 return new ConnectionManager.HConnectionImplementation(conf, false, pool, user) {
145 @Override
146 public AdminService.BlockingInterface getAdmin(ServerName sn, boolean getMaster)
147 throws IOException {
148 return serverName.equals(sn) ? admin : super.getAdmin(sn, getMaster);
149 }
150
151 @Override
152 public ClientService.BlockingInterface getClient(ServerName sn) throws IOException {
153 return serverName.equals(sn) ? client : super.getClient(sn);
154 }
155 };
156 }
157
158
159
160
161
162 @VisibleForTesting
163 public static void setupMasterlessConnection(Configuration conf) {
164 conf.set(HConnection.HBASE_CLIENT_CONNECTION_IMPL,
165 MasterlessConnection.class.getName());
166 }
167
168
169
170
171
172 static class MasterlessConnection extends ConnectionManager.HConnectionImplementation {
173 MasterlessConnection(Configuration conf, boolean managed,
174 ExecutorService pool, User user) throws IOException {
175 super(conf, managed, pool, user);
176 }
177
178 @Override
179 public boolean isTableDisabled(TableName tableName) throws IOException {
180
181 return false;
182 }
183 }
184 }