1 /**
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.apache.hadoop.hbase.master;
20 
21 import java.io.IOException;
22 import java.util.List;
23 
24 import org.apache.hadoop.hbase.classification.InterfaceAudience;
25 import org.apache.hadoop.hbase.HColumnDescriptor;
26 import org.apache.hadoop.hbase.HRegionInfo;
27 import org.apache.hadoop.hbase.HTableDescriptor;
28 import org.apache.hadoop.hbase.NamespaceDescriptor;
29 import org.apache.hadoop.hbase.ProcedureInfo;
30 import org.apache.hadoop.hbase.Server;
31 import org.apache.hadoop.hbase.TableDescriptors;
32 import org.apache.hadoop.hbase.TableName;
33 import org.apache.hadoop.hbase.TableNotDisabledException;
34 import org.apache.hadoop.hbase.TableNotFoundException;
35 import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
36 import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
37 import org.apache.hadoop.hbase.executor.ExecutorService;
38 import org.apache.hadoop.hbase.quotas.MasterQuotaManager;
39 
40 import com.google.protobuf.Service;
41 
42 /**
43  * Services Master supplies
44  */
45 @InterfaceAudience.Private
46 public interface MasterServices extends Server {
47   /**
48    * @return Master's instance of the {@link AssignmentManager}
49    */
getAssignmentManager()50   AssignmentManager getAssignmentManager();
51 
52   /**
53    * @return Master's filesystem {@link MasterFileSystem} utility class.
54    */
getMasterFileSystem()55   MasterFileSystem getMasterFileSystem();
56 
57   /**
58    * @return Master's {@link ServerManager} instance.
59    */
getServerManager()60   ServerManager getServerManager();
61 
62   /**
63    * @return Master's instance of {@link ExecutorService}
64    */
getExecutorService()65   ExecutorService getExecutorService();
66 
67   /**
68    * @return Master's instance of {@link TableLockManager}
69    */
getTableLockManager()70   TableLockManager getTableLockManager();
71 
72   /**
73    * @return Master's instance of {@link MasterCoprocessorHost}
74    */
getMasterCoprocessorHost()75   MasterCoprocessorHost getMasterCoprocessorHost();
76 
77   /**
78    * @return Master's instance of {@link MasterQuotaManager}
79    */
getMasterQuotaManager()80   MasterQuotaManager getMasterQuotaManager();
81 
82   /**
83    * @return Master's instance of {@link ProcedureExecutor}
84    */
getMasterProcedureExecutor()85   ProcedureExecutor<MasterProcedureEnv> getMasterProcedureExecutor();
86 
87   /**
88    * Check table is modifiable; i.e. exists and is offline.
89    * @param tableName Name of table to check.
90    * @throws TableNotDisabledException
91    * @throws TableNotFoundException
92    * @throws IOException
93    */
94   // We actually throw the exceptions mentioned in the
checkTableModifiable(final TableName tableName)95   void checkTableModifiable(final TableName tableName)
96       throws IOException, TableNotFoundException, TableNotDisabledException;
97 
98   /**
99    * Create a table using the given table definition.
100    * @param desc The table definition
101    * @param splitKeys Starting row keys for the initial table regions.  If null
102    * @param nonceGroup
103    * @param nonce
104    *     a single region is created.
105    */
createTable( final HTableDescriptor desc, final byte[][] splitKeys, final long nonceGroup, final long nonce)106   long createTable(
107       final HTableDescriptor desc,
108       final byte[][] splitKeys,
109       final long nonceGroup,
110       final long nonce) throws IOException;
111 
112   /**
113    * Delete a table
114    * @param tableName The table name
115    * @param nonceGroup
116    * @param nonce
117    * @throws IOException
118    */
deleteTable( final TableName tableName, final long nonceGroup, final long nonce)119   long deleteTable(
120       final TableName tableName,
121       final long nonceGroup,
122       final long nonce) throws IOException;
123 
124   /**
125    * Truncate a table
126    * @param tableName The table name
127    * @param preserveSplits True if the splits should be preserved
128    * @param nonceGroup
129    * @param nonce
130    * @throws IOException
131    */
truncateTable( final TableName tableName, final boolean preserveSplits, final long nonceGroup, final long nonce)132   public void truncateTable(
133       final TableName tableName,
134       final boolean preserveSplits,
135       final long nonceGroup,
136       final long nonce) throws IOException;
137 
138   /**
139    * Modify the descriptor of an existing table
140    * @param tableName The table name
141    * @param descriptor The updated table descriptor
142    * @param nonceGroup
143    * @param nonce
144    * @throws IOException
145    */
modifyTable( final TableName tableName, final HTableDescriptor descriptor, final long nonceGroup, final long nonce)146   void modifyTable(
147       final TableName tableName,
148       final HTableDescriptor descriptor,
149       final long nonceGroup,
150       final long nonce)
151       throws IOException;
152 
153   /**
154    * Enable an existing table
155    * @param tableName The table name
156    * @param nonceGroup
157    * @param nonce
158    * @throws IOException
159    */
enableTable( final TableName tableName, final long nonceGroup, final long nonce)160   long enableTable(
161       final TableName tableName,
162       final long nonceGroup,
163       final long nonce) throws IOException;
164 
165   /**
166    * Disable an existing table
167    * @param tableName The table name
168    * @param nonceGroup
169    * @param nonce
170    * @throws IOException
171    */
disableTable( final TableName tableName, final long nonceGroup, final long nonce)172   long disableTable(
173       final TableName tableName,
174       final long nonceGroup,
175       final long nonce) throws IOException;
176 
177 
178   /**
179    * Add a new column to an existing table
180    * @param tableName The table name
181    * @param column The column definition
182    * @param nonceGroup
183    * @param nonce
184    * @throws IOException
185    */
addColumn( final TableName tableName, final HColumnDescriptor column, final long nonceGroup, final long nonce)186   void addColumn(
187       final TableName tableName,
188       final HColumnDescriptor column,
189       final long nonceGroup,
190       final long nonce)
191       throws IOException;
192 
193   /**
194    * Modify the column descriptor of an existing column in an existing table
195    * @param tableName The table name
196    * @param descriptor The updated column definition
197    * @param nonceGroup
198    * @param nonce
199    * @throws IOException
200    */
modifyColumn( final TableName tableName, final HColumnDescriptor descriptor, final long nonceGroup, final long nonce)201   void modifyColumn(
202       final TableName tableName,
203       final HColumnDescriptor descriptor,
204       final long nonceGroup,
205       final long nonce)
206       throws IOException;
207 
208   /**
209    * Delete a column from an existing table
210    * @param tableName The table name
211    * @param columnName The column name
212    * @param nonceGroup
213    * @param nonce
214    * @throws IOException
215    */
deleteColumn( final TableName tableName, final byte[] columnName, final long nonceGroup, final long nonce)216   void deleteColumn(
217       final TableName tableName,
218       final byte[] columnName,
219       final long nonceGroup,
220       final long nonce)
221       throws IOException;
222 
223   /**
224    * @return Return table descriptors implementation.
225    */
getTableDescriptors()226   TableDescriptors getTableDescriptors();
227 
228   /**
229    * @return true if master enables ServerShutdownHandler;
230    */
isServerCrashProcessingEnabled()231   boolean isServerCrashProcessingEnabled();
232 
233   /**
234    * Registers a new protocol buffer {@link Service} subclass as a master coprocessor endpoint.
235    *
236    * <p>
237    * Only a single instance may be registered for a given {@link Service} subclass (the
238    * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.
239    * After the first registration, subsequent calls with the same service name will fail with
240    * a return value of {@code false}.
241    * </p>
242    * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint
243    * @return {@code true} if the registration was successful, {@code false}
244    * otherwise
245    */
registerService(Service instance)246   boolean registerService(Service instance);
247 
248   /**
249    * Merge two regions. The real implementation is on the regionserver, master
250    * just move the regions together and send MERGE RPC to regionserver
251    * @param region_a region to merge
252    * @param region_b region to merge
253    * @param forcible true if do a compulsory merge, otherwise we will only merge
254    *          two adjacent regions
255    * @throws IOException
256    */
dispatchMergingRegions( final HRegionInfo region_a, final HRegionInfo region_b, final boolean forcible )257   void dispatchMergingRegions(
258     final HRegionInfo region_a, final HRegionInfo region_b, final boolean forcible
259   ) throws IOException;
260 
261   /**
262    * @return true if master is initialized
263    */
isInitialized()264   boolean isInitialized();
265 
266   /**
267    * Create a new namespace
268    * @param descriptor descriptor which describes the new namespace
269    * @throws IOException
270    */
createNamespace(NamespaceDescriptor descriptor)271   public void createNamespace(NamespaceDescriptor descriptor) throws IOException;
272 
273   /**
274    * Modify an existing namespace
275    * @param descriptor descriptor which updates the existing namespace
276    * @throws IOException
277    */
modifyNamespace(NamespaceDescriptor descriptor)278   public void modifyNamespace(NamespaceDescriptor descriptor) throws IOException;
279 
280   /**
281    * Delete an existing namespace. Only empty namespaces (no tables) can be removed.
282    * @param name namespace name
283    * @throws IOException
284    */
deleteNamespace(String name)285   public void deleteNamespace(String name) throws IOException;
286 
287   /**
288    * Abort a procedure.
289    * @param procId ID of the procedure
290    * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted?
291    * @return true if aborted, false if procedure already completed or does not exist
292    * @throws IOException
293    */
abortProcedure(final long procId, final boolean mayInterruptIfRunning)294   public boolean abortProcedure(final long procId, final boolean mayInterruptIfRunning)
295       throws IOException;
296 
297   /**
298    * List procedures
299    * @return procedure list
300    * @throws IOException
301    */
listProcedures()302   public List<ProcedureInfo> listProcedures() throws IOException;
303 
304   /**
305    * Get a namespace descriptor by name
306    * @param name name of namespace descriptor
307    * @return A descriptor
308    * @throws IOException
309    */
getNamespaceDescriptor(String name)310   public NamespaceDescriptor getNamespaceDescriptor(String name) throws IOException;
311 
312   /**
313    * List available namespace descriptors
314    * @return A descriptor
315    * @throws IOException
316    */
listNamespaceDescriptors()317   public List<NamespaceDescriptor> listNamespaceDescriptors() throws IOException;
318 
319   /**
320    * Get list of table descriptors by namespace
321    * @param name namespace name
322    * @return descriptors
323    * @throws IOException
324    */
listTableDescriptorsByNamespace(String name)325   public List<HTableDescriptor> listTableDescriptorsByNamespace(String name) throws IOException;
326 
327   /**
328    * Get list of table names by namespace
329    * @param name namespace name
330    * @return table names
331    * @throws IOException
332    */
listTableNamesByNamespace(String name)333   public List<TableName> listTableNamesByNamespace(String name) throws IOException;
334 
335   /**
336    * @param table
337    * @return the timestamp of the last successful major compaction for the passed table,
338    * or 0 if no HFile resulting from a major compaction exists
339    * @throws IOException
340    */
getLastMajorCompactionTimestamp(TableName table)341   public long getLastMajorCompactionTimestamp(TableName table) throws IOException;
342 
343   /**
344    * @param regionName
345    * @return the timestamp of the last successful major compaction for the passed region
346    * or 0 if no HFile resulting from a major compaction exists
347    * @throws IOException
348    */
getLastMajorCompactionTimestampForRegion(byte[] regionName)349   public long getLastMajorCompactionTimestampForRegion(byte[] regionName) throws IOException;
350 }
351