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 
20 package org.apache.hadoop.hbase.coordination;
21 
22 import java.io.IOException;
23 
24 import org.apache.hadoop.hbase.classification.InterfaceAudience;
25 import org.apache.hadoop.hbase.HRegionInfo;
26 import org.apache.hadoop.hbase.ServerName;
27 import org.apache.hadoop.hbase.regionserver.HRegion;
28 import org.apache.hadoop.hbase.regionserver.Region;
29 import org.apache.hadoop.hbase.regionserver.RegionServerServices;
30 
31 /**
32  * Coordination operations for split transaction. The split operation should be coordinated at the
33  * following stages:
34  * 1. start - all preparation/initialization for split transaction should be done there.
35  * 2. waitForSplitTransaction  - the coordination should perform all logic related to split
36  *    transaction and wait till it's finished
37  * 3. completeSplitTransaction - all steps that are required to complete the transaction.
38  *    Called after PONR (point of no return)
39  */
40 @InterfaceAudience.Private
41 public interface SplitTransactionCoordination {
42 
43   /**
44    * Dummy interface for split transaction details.
45    */
46   public static interface SplitTransactionDetails {
47   }
48 
getDefaultDetails()49   SplitTransactionDetails getDefaultDetails();
50 
51 
52   /**
53    * init coordination for split transaction
54    * @param parent region to be created as offline
55    * @param serverName server event originates from
56    * @param hri_a daughter region
57    * @param hri_b daughter region
58    * @throws IOException
59    */
startSplitTransaction(HRegion parent, ServerName serverName, HRegionInfo hri_a, HRegionInfo hri_b)60   void startSplitTransaction(HRegion parent, ServerName serverName,
61       HRegionInfo hri_a, HRegionInfo hri_b) throws IOException;
62 
63   /**
64    * Wait while coordination process the transaction
65    * @param services Used to online/offline regions.
66    * @param parent region
67    * @param hri_a daughter region
68    * @param hri_b daughter region
69    * @param std split transaction details
70    * @throws IOException
71    */
waitForSplitTransaction(final RegionServerServices services, Region parent, HRegionInfo hri_a, HRegionInfo hri_b, SplitTransactionDetails std)72   void waitForSplitTransaction(final RegionServerServices services,
73       Region parent, HRegionInfo hri_a, HRegionInfo hri_b, SplitTransactionDetails std)
74       throws IOException;
75 
76   /**
77    * Finish off split transaction
78    * @param services Used to online/offline regions.
79    * @param first daughter region
80    * @param second daughter region
81    * @param std split transaction details
82    * @param parent
83    * @throws IOException If thrown, transaction failed. Call
84    *                     {@link org.apache.hadoop.hbase.regionserver.SplitTransaction#rollback(
85    *                         Server, RegionServerServices)}
86    */
completeSplitTransaction(RegionServerServices services, Region first, Region second, SplitTransactionDetails std, Region parent)87   void completeSplitTransaction(RegionServerServices services, Region first,
88       Region second, SplitTransactionDetails std, Region parent) throws IOException;
89 
90   /**
91    * clean the split transaction
92    * @param hri node to delete
93    */
clean(final HRegionInfo hri)94   void clean(final HRegionInfo hri);
95 
96   /**
97    * Required by AssignmentManager
98    */
processTransition(HRegionInfo p, HRegionInfo hri_a, HRegionInfo hri_b, ServerName sn, SplitTransactionDetails std)99   int processTransition(HRegionInfo p, HRegionInfo hri_a, HRegionInfo hri_b,
100       ServerName sn, SplitTransactionDetails std) throws IOException;
101 }
102