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 }