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.hbase.classification.InterfaceAudience;
26 import org.apache.hadoop.conf.Configuration;
27 import org.apache.hadoop.hbase.HConstants;
28 import org.apache.hadoop.hbase.RegionLocations;
29 import org.apache.hadoop.hbase.ServerName;
30 import org.apache.hadoop.hbase.TableName;
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
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 public static ClusterConnection createShortCircuitHConnection(final Connection conn,
117 final ServerName serverName, final AdminService.BlockingInterface admin,
118 final ClientService.BlockingInterface client) {
119 return new ConnectionAdapter(conn) {
120 @Override
121 public AdminService.BlockingInterface getAdmin(
122 ServerName sn, boolean getMaster) throws IOException {
123 return serverName.equals(sn) ? admin : super.getAdmin(sn, getMaster);
124 }
125
126 @Override
127 public ClientService.BlockingInterface getClient(
128 ServerName sn) throws IOException {
129 return serverName.equals(sn) ? client : super.getClient(sn);
130 }
131 };
132 }
133
134
135
136
137
138 @VisibleForTesting
139 public static void setupMasterlessConnection(Configuration conf) {
140 conf.set(HConnection.HBASE_CLIENT_CONNECTION_IMPL,
141 MasterlessConnection.class.getName());
142 }
143
144
145
146
147
148 static class MasterlessConnection extends ConnectionManager.HConnectionImplementation {
149 MasterlessConnection(Configuration conf, boolean managed,
150 ExecutorService pool, User user) throws IOException {
151 super(conf, managed, pool, user);
152 }
153
154 @Override
155 public boolean isTableDisabled(TableName tableName) throws IOException {
156
157 return false;
158 }
159 }
160 }