1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.client;
21
22 import java.io.IOException;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26 import org.apache.hadoop.hbase.classification.InterfaceAudience;
27 import org.apache.hadoop.hbase.HRegionInfo;
28 import org.apache.hadoop.hbase.HRegionLocation;
29 import org.apache.hadoop.hbase.TableName;
30 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ClientService;
31 import org.apache.hadoop.hbase.util.Bytes;
32
33
34
35
36
37
38
39
40
41
42
43 @InterfaceAudience.Private
44 public abstract class RegionServerCallable<T> implements RetryingCallable<T> {
45
46 private static final Log LOG = LogFactory.getLog(RegionServerCallable.class);
47 protected final Connection connection;
48 protected final TableName tableName;
49 protected final byte[] row;
50 protected HRegionLocation location;
51 private ClientService.BlockingInterface stub;
52
53
54
55
56
57
58 public RegionServerCallable(Connection connection, TableName tableName, byte [] row) {
59 this.connection = connection;
60 this.tableName = tableName;
61 this.row = row;
62 }
63
64
65
66
67
68
69
70 @Override
71 public void prepare(final boolean reload) throws IOException {
72 try (RegionLocator regionLocator = connection.getRegionLocator(tableName)) {
73 this.location = regionLocator.getRegionLocation(row, reload);
74 }
75 if (this.location == null) {
76 throw new IOException("Failed to find location, tableName=" + tableName +
77 ", row=" + Bytes.toString(row) + ", reload=" + reload);
78 }
79 setStub(getConnection().getClient(this.location.getServerName()));
80 }
81
82
83
84
85 HConnection getConnection() {
86 return (HConnection) this.connection;
87 }
88
89 protected ClientService.BlockingInterface getStub() {
90 return this.stub;
91 }
92
93 void setStub(final ClientService.BlockingInterface stub) {
94 this.stub = stub;
95 }
96
97 protected HRegionLocation getLocation() {
98 return this.location;
99 }
100
101 protected void setLocation(final HRegionLocation location) {
102 this.location = location;
103 }
104
105 public TableName getTableName() {
106 return this.tableName;
107 }
108
109 public byte [] getRow() {
110 return this.row;
111 }
112
113 @Override
114 public void throwable(Throwable t, boolean retrying) {
115 if (location != null) {
116 getConnection().updateCachedLocations(tableName, location.getRegionInfo().getRegionName(),
117 row, t, location.getServerName());
118 }
119 }
120
121 @Override
122 public String getExceptionMessageAdditionalDetail() {
123 return "row '" + Bytes.toString(row) + "' on table '" + tableName + "' at " + location;
124 }
125
126 @Override
127 public long sleep(long pause, int tries) {
128 return ConnectionUtils.getPauseTime(pause, tries);
129 }
130
131
132
133
134 public HRegionInfo getHRegionInfo() {
135 if (this.location == null) {
136 return null;
137 }
138 return this.location.getRegionInfo();
139 }
140 }