|
20 | 20 |
|
21 | 21 | import java.io.IOException; |
22 | 22 | import java.util.ArrayList; |
23 | | -import java.util.Arrays; |
24 | 23 | import java.util.List; |
25 | | -import java.util.stream.Collectors; |
26 | | -import org.apache.hadoop.fs.FileStatus; |
27 | 24 | import org.apache.hadoop.fs.FileSystem; |
28 | 25 | import org.apache.hadoop.fs.Path; |
29 | 26 | import org.apache.hadoop.hbase.MetaTableAccessor; |
|
52 | 49 | import org.slf4j.Logger; |
53 | 50 | import org.slf4j.LoggerFactory; |
54 | 51 |
|
| 52 | +import org.apache.hbase.thirdparty.org.apache.commons.collections4.CollectionUtils; |
| 53 | + |
55 | 54 | import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; |
56 | 55 | import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos; |
57 | 56 | import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos; |
58 | 57 | import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.DeleteTableState; |
59 | | -import org.apache.hbase.thirdparty.org.apache.commons.collections4.CollectionUtils; |
60 | 58 |
|
61 | 59 | @InterfaceAudience.Private |
62 | 60 | public class DeleteTableProcedure |
@@ -278,92 +276,59 @@ protected static void deleteFromFs(final MasterProcedureEnv env, |
278 | 276 | final boolean archive) throws IOException { |
279 | 277 | final MasterFileSystem mfs = env.getMasterServices().getMasterFileSystem(); |
280 | 278 | final FileSystem fs = mfs.getFileSystem(); |
281 | | - final Path tempdir = mfs.getTempDir(); |
282 | 279 |
|
283 | 280 | final Path tableDir = CommonFSUtils.getTableDir(mfs.getRootDir(), tableName); |
284 | | - final Path tempTableDir = CommonFSUtils.getTableDir(tempdir, tableName); |
285 | 281 |
|
286 | 282 | if (fs.exists(tableDir)) { |
287 | | - // Ensure temp exists |
288 | | - if (!fs.exists(tempdir) && !fs.mkdirs(tempdir)) { |
289 | | - throw new IOException("HBase temp directory '" + tempdir + "' creation failure."); |
290 | | - } |
291 | | - |
292 | | - // Ensure parent exists |
293 | | - if (!fs.exists(tempTableDir.getParent()) && !fs.mkdirs(tempTableDir.getParent())) { |
294 | | - throw new IOException("HBase temp directory '" + tempdir + "' creation failure."); |
| 283 | + // Archive regions from FS (temp directory) |
| 284 | + if (archive) { |
| 285 | + List<Path> regionDirList = new ArrayList<>(); |
| 286 | + for (RegionInfo region : regions) { |
| 287 | + if (RegionReplicaUtil.isDefaultReplica(region)) { |
| 288 | + regionDirList.add(FSUtils.getRegionDirFromTableDir(tableDir, region)); |
| 289 | + List<RegionInfo> mergeRegions = MetaTableAccessor |
| 290 | + .getMergeRegions(env.getMasterServices().getConnection(), region.getRegionName()); |
| 291 | + if (!CollectionUtils.isEmpty(mergeRegions)) { |
| 292 | + mergeRegions.stream().forEach( |
| 293 | + r -> regionDirList.add(FSUtils.getRegionDirFromTableDir(tableDir, r))); |
| 294 | + } |
| 295 | + } |
| 296 | + } |
| 297 | + HFileArchiver |
| 298 | + .archiveRegions(env.getMasterConfiguration(), fs, mfs.getRootDir(), tableDir, |
| 299 | + regionDirList); |
| 300 | + if (!regionDirList.isEmpty()) { |
| 301 | + LOG.debug("Archived {} regions", tableName); |
| 302 | + } |
295 | 303 | } |
296 | 304 |
|
297 | | - if (fs.exists(tempTableDir)) { |
298 | | - // TODO |
299 | | - // what's in this dir? something old? probably something manual from the user... |
300 | | - // let's get rid of this stuff... |
301 | | - FileStatus[] files = fs.listStatus(tempTableDir); |
302 | | - if (files != null && files.length > 0) { |
303 | | - List<Path> regionDirList = Arrays.stream(files) |
304 | | - .filter(FileStatus::isDirectory) |
305 | | - .map(FileStatus::getPath) |
306 | | - .collect(Collectors.toList()); |
307 | | - HFileArchiver.archiveRegions(env.getMasterConfiguration(), fs, mfs.getRootDir(), |
308 | | - tempTableDir, regionDirList); |
309 | | - } |
310 | | - fs.delete(tempTableDir, true); |
| 305 | + // Archive mob data |
| 306 | + Path mobTableDir = |
| 307 | + CommonFSUtils.getTableDir(new Path(mfs.getRootDir(), MobConstants.MOB_DIR_NAME), tableName); |
| 308 | + Path regionDir = new Path(mobTableDir, MobUtils.getMobRegionInfo(tableName).getEncodedName()); |
| 309 | + if (fs.exists(regionDir)) { |
| 310 | + HFileArchiver.archiveRegion(fs, mfs.getRootDir(), mobTableDir, regionDir); |
311 | 311 | } |
312 | 312 |
|
313 | | - // Move the table in /hbase/.tmp |
314 | | - if (!fs.rename(tableDir, tempTableDir)) { |
315 | | - throw new IOException("Unable to move '" + tableDir + "' to temp '" + tempTableDir + "'"); |
| 313 | + // Delete table directory from FS |
| 314 | + if (!fs.delete(tableDir, true) && fs.exists(tableDir)) { |
| 315 | + throw new IOException("Couldn't delete " + tableDir); |
316 | 316 | } |
317 | | - } |
318 | 317 |
|
319 | | - // Archive regions from FS (temp directory) |
320 | | - if (archive) { |
321 | | - List<Path> regionDirList = new ArrayList<>(); |
322 | | - for (RegionInfo region : regions) { |
323 | | - if (RegionReplicaUtil.isDefaultReplica(region)) { |
324 | | - regionDirList.add(FSUtils.getRegionDirFromTableDir(tempTableDir, region)); |
325 | | - List<RegionInfo> mergeRegions = MetaTableAccessor |
326 | | - .getMergeRegions(env.getMasterServices().getConnection(), region.getRegionName()); |
327 | | - if (!CollectionUtils.isEmpty(mergeRegions)) { |
328 | | - mergeRegions.stream() |
329 | | - .forEach(r -> regionDirList.add(FSUtils.getRegionDirFromTableDir(tempTableDir, r))); |
330 | | - } |
| 318 | + // Delete the table directory where the mob files are saved |
| 319 | + if (mobTableDir != null && fs.exists(mobTableDir)) { |
| 320 | + if (!fs.delete(mobTableDir, true)) { |
| 321 | + throw new IOException("Couldn't delete mob dir " + mobTableDir); |
331 | 322 | } |
332 | 323 | } |
333 | | - HFileArchiver.archiveRegions(env.getMasterConfiguration(), fs, mfs.getRootDir(), tempTableDir, |
334 | | - regionDirList); |
335 | | - if (!regionDirList.isEmpty()) { |
336 | | - LOG.debug("Archived {} regions", tableName); |
337 | | - } |
338 | | - } |
339 | | - |
340 | | - // Archive mob data |
341 | | - Path mobTableDir = |
342 | | - CommonFSUtils.getTableDir(new Path(mfs.getRootDir(), MobConstants.MOB_DIR_NAME), tableName); |
343 | | - Path regionDir = |
344 | | - new Path(mobTableDir, MobUtils.getMobRegionInfo(tableName).getEncodedName()); |
345 | | - if (fs.exists(regionDir)) { |
346 | | - HFileArchiver.archiveRegion(fs, mfs.getRootDir(), mobTableDir, regionDir); |
347 | | - } |
348 | | - |
349 | | - // Delete table directory from FS (temp directory) |
350 | | - if (!fs.delete(tempTableDir, true) && fs.exists(tempTableDir)) { |
351 | | - throw new IOException("Couldn't delete " + tempTableDir); |
352 | | - } |
353 | 324 |
|
354 | | - // Delete the table directory where the mob files are saved |
355 | | - if (mobTableDir != null && fs.exists(mobTableDir)) { |
356 | | - if (!fs.delete(mobTableDir, true)) { |
357 | | - throw new IOException("Couldn't delete mob dir " + mobTableDir); |
| 325 | + // Delete the directory on wal filesystem |
| 326 | + FileSystem walFs = mfs.getWALFileSystem(); |
| 327 | + Path tableWALDir = CommonFSUtils.getWALTableDir(env.getMasterConfiguration(), tableName); |
| 328 | + if (walFs.exists(tableWALDir) && !walFs.delete(tableWALDir, true)) { |
| 329 | + throw new IOException("Couldn't delete table dir on wal filesystem" + tableWALDir); |
358 | 330 | } |
359 | 331 | } |
360 | | - |
361 | | - // Delete the directory on wal filesystem |
362 | | - FileSystem walFs = mfs.getWALFileSystem(); |
363 | | - Path tableWALDir = CommonFSUtils.getWALTableDir(env.getMasterConfiguration(), tableName); |
364 | | - if (walFs.exists(tableWALDir) && !walFs.delete(tableWALDir, true)) { |
365 | | - throw new IOException("Couldn't delete table dir on wal filesystem" + tableWALDir); |
366 | | - } |
367 | 332 | } |
368 | 333 |
|
369 | 334 | /** |
|
0 commit comments