1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.master.handler;
20
21 import java.io.IOException;
22 import java.util.List;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26 import org.apache.hadoop.classification.InterfaceAudience;
27 import org.apache.hadoop.fs.FileSystem;
28 import org.apache.hadoop.fs.Path;
29 import org.apache.hadoop.hbase.TableName;
30 import org.apache.hadoop.hbase.HRegionInfo;
31 import org.apache.hadoop.hbase.Server;
32 import org.apache.hadoop.hbase.backup.HFileArchiver;
33 import org.apache.hadoop.hbase.catalog.MetaEditor;
34 import org.apache.hadoop.hbase.executor.EventType;
35 import org.apache.hadoop.hbase.master.AssignmentManager;
36 import org.apache.hadoop.hbase.master.HMaster;
37 import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
38 import org.apache.hadoop.hbase.master.MasterFileSystem;
39 import org.apache.hadoop.hbase.master.MasterServices;
40 import org.apache.hadoop.hbase.master.RegionStates;
41 import org.apache.hadoop.hbase.master.RegionState.State;
42 import org.apache.hadoop.hbase.util.Bytes;
43 import org.apache.hadoop.hbase.util.Threads;
44 import org.apache.zookeeper.KeeperException;
45
46 @InterfaceAudience.Private
47 public class DeleteTableHandler extends TableEventHandler {
48 private static final Log LOG = LogFactory.getLog(DeleteTableHandler.class);
49
50 public DeleteTableHandler(TableName tableName, Server server,
51 final MasterServices masterServices) {
52 super(EventType.C_M_DELETE_TABLE, tableName, server, masterServices);
53 }
54
55 @Override
56 protected void prepareWithTableLock() throws IOException {
57
58 getTableDescriptor();
59 }
60
61 @Override
62 protected void handleTableOperation(List<HRegionInfo> regions)
63 throws IOException, KeeperException {
64 MasterCoprocessorHost cpHost = ((HMaster) this.server)
65 .getCoprocessorHost();
66 if (cpHost != null) {
67 cpHost.preDeleteTableHandler(this.tableName);
68 }
69
70
71 AssignmentManager am = this.masterServices.getAssignmentManager();
72 RegionStates states = am.getRegionStates();
73 long waitTime = server.getConfiguration().
74 getLong("hbase.master.wait.on.region", 5 * 60 * 1000);
75 for (HRegionInfo region : regions) {
76 long done = System.currentTimeMillis() + waitTime;
77 while (System.currentTimeMillis() < done) {
78 if (states.isRegionInState(region, State.FAILED_OPEN)) {
79 am.regionOffline(region);
80 }
81 if (!states.isRegionInTransition(region)) break;
82 Threads.sleep(waitingTimeForEvents);
83 LOG.debug("Waiting on region to clear regions in transition; "
84 + am.getRegionStates().getRegionTransitionState(region));
85 }
86 if (states.isRegionInTransition(region)) {
87 throw new IOException("Waited hbase.master.wait.on.region (" +
88 waitTime + "ms) for region to leave region " +
89 region.getRegionNameAsString() + " in transitions");
90 }
91 }
92
93
94 LOG.debug("Deleting regions from META");
95 MetaEditor.deleteRegions(this.server.getCatalogTracker(), regions);
96
97
98 MasterFileSystem mfs = this.masterServices.getMasterFileSystem();
99 Path tempTableDir = mfs.moveTableToTemp(tableName);
100
101 try {
102
103 FileSystem fs = mfs.getFileSystem();
104 for (HRegionInfo hri: regions) {
105 LOG.debug("Archiving region " + hri.getRegionNameAsString() + " from FS");
106 HFileArchiver.archiveRegion(fs, mfs.getRootDir(),
107 tempTableDir, new Path(tempTableDir, hri.getEncodedName()));
108 }
109
110
111 if (!fs.delete(tempTableDir, true)) {
112 LOG.error("Couldn't delete " + tempTableDir);
113 }
114
115 LOG.debug("Table '" + tableName + "' archived!");
116 } finally {
117
118 LOG.debug("Removing '" + tableName + "' descriptor.");
119 this.masterServices.getTableDescriptors().remove(tableName);
120
121
122 LOG.debug("Marking '" + tableName + "' as deleted.");
123 am.getZKTable().setDeletedTable(tableName);
124 }
125
126 if (cpHost != null) {
127 cpHost.postDeleteTableHandler(this.tableName);
128 }
129 }
130
131 @Override
132 protected void releaseTableLock() {
133 super.releaseTableLock();
134 try {
135 masterServices.getTableLockManager().tableDeleted(tableName);
136 } catch (IOException ex) {
137 LOG.warn("Received exception from TableLockManager.tableDeleted:", ex);
138 }
139 }
140
141 @Override
142 public String toString() {
143 String name = "UnknownServerName";
144 if(server != null && server.getServerName() != null) {
145 name = server.getServerName().toString();
146 }
147 return getClass().getSimpleName() + "-" + name + "-" + getSeqid() + "-" + tableName;
148 }
149 }