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