From 84ed9f6ba48da513ff54d573ae0d075e2d078f99 Mon Sep 17 00:00:00 2001 From: tedyu Date: Thu, 20 Nov 2014 08:59:42 -0800 Subject: [PATCH] HBASE-8572 Enhance delete_snapshot.rb to call snapshot deletion API with regex (Ashish Singhi) --- .../hadoop/hbase/client/HBaseAdmin.java | 27 +++++--- hbase-shell/src/main/ruby/hbase/admin.rb | 6 ++ hbase-shell/src/main/ruby/shell.rb | 1 + .../shell/commands/delete_all_snapshot.rb | 61 +++++++++++++++++++ 4 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 hbase-shell/src/main/ruby/shell/commands/delete_all_snapshot.rb diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java index 5089138370a..f9720680460 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java @@ -3558,18 +3558,27 @@ public class HBaseAdmin implements Admin { public void deleteSnapshots(final Pattern pattern) throws IOException { List snapshots = listSnapshots(pattern); for (final SnapshotDescription snapshot : snapshots) { - // do the delete - executeCallable(new MasterCallable(getConnection()) { - @Override - public Void call(int callTimeout) throws ServiceException { - this.master.deleteSnapshot(null, - DeleteSnapshotRequest.newBuilder().setSnapshot(snapshot).build()); - return null; - } - }); + try { + internalDeleteSnapshot(snapshot); + } catch (IOException ex) { + LOG.info( + "Failed to delete snapshot " + snapshot.getName() + " for table " + snapshot.getTable(), + ex); + } } } + private void internalDeleteSnapshot(final SnapshotDescription snapshot) throws IOException { + executeCallable(new MasterCallable(getConnection()) { + @Override + public Void call(int callTimeout) throws ServiceException { + this.master.deleteSnapshot(null, DeleteSnapshotRequest.newBuilder().setSnapshot(snapshot) + .build()); + return null; + } + }); + } + /** * Parent of {@link MasterCallable} and {@link MasterCallable}. * Has common methods. diff --git a/hbase-shell/src/main/ruby/hbase/admin.rb b/hbase-shell/src/main/ruby/hbase/admin.rb index 971df06b10a..b08b5eb8418 100644 --- a/hbase-shell/src/main/ruby/hbase/admin.rb +++ b/hbase-shell/src/main/ruby/hbase/admin.rb @@ -780,6 +780,12 @@ module Hbase @admin.deleteSnapshot(snapshot_name.to_java_bytes) end + #---------------------------------------------------------------------------------------------- + # Deletes the snapshots matching the given regex + def delete_all_snapshot(regex) + @admin.deleteSnapshots(regex).to_a + end + #---------------------------------------------------------------------------------------------- # Returns a list of snapshots def list_snapshot(regex = ".*") diff --git a/hbase-shell/src/main/ruby/shell.rb b/hbase-shell/src/main/ruby/shell.rb index 48f1c780e3d..db691e5aca3 100644 --- a/hbase-shell/src/main/ruby/shell.rb +++ b/hbase-shell/src/main/ruby/shell.rb @@ -350,6 +350,7 @@ Shell.load_command_group( restore_snapshot rename_snapshot delete_snapshot + delete_all_snapshot list_snapshots ] ) diff --git a/hbase-shell/src/main/ruby/shell/commands/delete_all_snapshot.rb b/hbase-shell/src/main/ruby/shell/commands/delete_all_snapshot.rb new file mode 100644 index 00000000000..bc072597bb2 --- /dev/null +++ b/hbase-shell/src/main/ruby/shell/commands/delete_all_snapshot.rb @@ -0,0 +1,61 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module Shell + module Commands + class DeleteAllSnapshot < Command + def help + return <<-EOF +Delete all of the snapshots matching the given regex. Examples: + + hbase> delete_all_snapshot 's.*' + +EOF + end + + def command(regex) + formatter.header([ "SNAPSHOT", "TABLE + CREATION TIME"]) + list = admin.list_snapshot(regex) + count = list.size + list.each do |snapshot| + creation_time = Time.at(snapshot.getCreationTime() / 1000).to_s + formatter.row([ snapshot.getName, snapshot.getTable + " (" + creation_time + ")" ]) + end + puts "\nDelete the above #{count} snapshots (y/n)?" unless count == 0 + answer = 'n' + answer = gets.chomp unless count == 0 + puts "No snapshots matched the regex #{regex.to_s}" if count == 0 + return unless answer =~ /y.*/i + format_simple_command do + admin.delete_all_snapshot(regex) + end + list = admin.list_snapshot(regex) + leftOverSnapshotCount = list.size + successfullyDeleted = count - leftOverSnapshotCount + puts "#{successfullyDeleted} snapshots successfully deleted." unless successfullyDeleted == 0 + return if leftOverSnapshotCount == 0 + puts "\nFailed to delete the below #{leftOverSnapshotCount} snapshots." + formatter.header([ "SNAPSHOT", "TABLE + CREATION TIME"]) + list.each do |snapshot| + creation_time = Time.at(snapshot.getCreationTime() / 1000).to_s + formatter.row([ snapshot.getName, snapshot.getTable + " (" + creation_time + ")" ]) + end + end + end + end +end