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