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