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 long addJitter(final long pause, final float jitter) {
73 float lag = pause * (RANDOM.nextFloat() - 0.5f) * jitter;
74 long newPause = pause + (long) lag;
75 if (newPause <= 0) {
76 return 1;
77 }
78 return newPause;
79 }
80
81
82
83
84
85
86 public static NonceGenerator injectNonceGeneratorForTesting(
87 ClusterConnection conn, NonceGenerator cnm) {
88 return ConnectionManager.injectNonceGeneratorForTesting(conn, cnm);
89 }
90
91
92
93
94
95
96
97
98 public static void setServerSideHConnectionRetriesConfig(
99 final Configuration c, final String sn, final Log log) {
100
101 int hcRetries = c.getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,
102 HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);
103
104
105 int serversideMultiplier = c.getInt("hbase.client.serverside.retries.multiplier", 10);
106 int retries = hcRetries * serversideMultiplier;
107 c.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, retries);
108 log.info(sn + " server-side HConnection retries=" + retries);
109 }
110
111
112
113
114
115
116
117
118
119
120 @Deprecated
121 public static ClusterConnection createShortCircuitHConnection(final Connection conn,
122 final ServerName serverName, final AdminService.BlockingInterface admin,
123 final ClientService.BlockingInterface client) {
124 return new ConnectionAdapter(conn) {
125 @Override
126 public AdminService.BlockingInterface getAdmin(
127 ServerName sn, boolean getMaster) throws IOException {
128 return serverName.equals(sn) ? admin : super.getAdmin(sn, getMaster);
129 }
130
131 @Override
132 public ClientService.BlockingInterface getClient(
133 ServerName sn) throws IOException {
134 return serverName.equals(sn) ? client : super.getClient(sn);
135 }
136 };
137 }
138
139
140
141
142
143
144
145
146
147
148
149
150
151 public static ClusterConnection createShortCircuitConnection(final Configuration conf,
152 ExecutorService pool, User user, final ServerName serverName,
153 final AdminService.BlockingInterface admin, final ClientService.BlockingInterface client)
154 throws IOException {
155 if (user == null) {
156 user = UserProvider.instantiate(conf).getCurrent();
157 }
158 return new ConnectionManager.HConnectionImplementation(conf, false, pool, user) {
159 @Override
160 public AdminService.BlockingInterface getAdmin(ServerName sn, boolean getMaster)
161 throws IOException {
162 return serverName.equals(sn) ? admin : super.getAdmin(sn, getMaster);
163 }
164
165 @Override
166 public ClientService.BlockingInterface getClient(ServerName sn) throws IOException {
167 return serverName.equals(sn) ? client : super.getClient(sn);
168 }
169 };
170 }
171
172
173
174
175
176 @VisibleForTesting
177 public static void setupMasterlessConnection(Configuration conf) {
178 conf.set(HConnection.HBASE_CLIENT_CONNECTION_IMPL,
179 MasterlessConnection.class.getName());
180 }
181
182
183
184
185
186 static class MasterlessConnection extends ConnectionManager.HConnectionImplementation {
187 MasterlessConnection(Configuration conf, boolean managed,
188 ExecutorService pool, User user) throws IOException {
189 super(conf, managed, pool, user);
190 }
191
192 @Override
193 public boolean isTableDisabled(TableName tableName) throws IOException {
194
195 return false;
196 }
197 }
198 }