You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2012/04/30 23:48:55 UTC

svn commit: r1332419 - in /hbase/trunk/src: main/java/org/apache/hadoop/hbase/regionserver/ main/ruby/ main/ruby/hbase/ main/ruby/shell/ main/ruby/shell/commands/ test/java/org/apache/hadoop/hbase/regionserver/ test/ruby/hbase/

Author: stack
Date: Mon Apr 30 21:48:54 2012
New Revision: 1332419

URL: http://svn.apache.org/viewvc?rev=1332419&view=rev
Log:
HBASE-5548 Add ability to get a table in the shell

Added:
    hbase/trunk/src/main/ruby/shell/commands/get_table.rb
    hbase/trunk/src/main/ruby/shell/commands/table_help.rb
Modified:
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
    hbase/trunk/src/main/ruby/hbase/hbase.rb
    hbase/trunk/src/main/ruby/hbase/table.rb
    hbase/trunk/src/main/ruby/shell.rb
    hbase/trunk/src/main/ruby/shell/commands.rb
    hbase/trunk/src/main/ruby/shell/commands/count.rb
    hbase/trunk/src/main/ruby/shell/commands/create.rb
    hbase/trunk/src/main/ruby/shell/commands/delete.rb
    hbase/trunk/src/main/ruby/shell/commands/deleteall.rb
    hbase/trunk/src/main/ruby/shell/commands/get.rb
    hbase/trunk/src/main/ruby/shell/commands/get_counter.rb
    hbase/trunk/src/main/ruby/shell/commands/incr.rb
    hbase/trunk/src/main/ruby/shell/commands/put.rb
    hbase/trunk/src/main/ruby/shell/commands/scan.rb
    hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
    hbase/trunk/src/test/ruby/hbase/admin_test.rb

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Mon Apr 30 21:48:54 2012
@@ -491,6 +491,22 @@ public class HRegion implements HeapSize
     MonitoredTask status = TaskMonitor.get().createStatus(
         "Initializing region " + this);
 
+    long nextSeqId = -1;
+    try {
+      nextSeqId = initializeRegionInternals(reporter, status);
+      return nextSeqId;
+    } finally {
+      // nextSeqid will be -1 if the initialization fails.
+      // At least it will be 0 otherwise.
+      if (nextSeqId == -1) {
+        status
+            .abort("Exception during region " + this.getRegionNameAsString() + " initialization.");
+      }
+    }
+  }
+
+  private long initializeRegionInternals(final CancelableProgressable reporter, MonitoredTask status)
+      throws IOException, UnsupportedEncodingException {
     if (coprocessorHost != null) {
       status.setStatus("Running coprocessor pre-open hook");
       coprocessorHost.preOpen();

Modified: hbase/trunk/src/main/ruby/hbase/hbase.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/hbase/hbase.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/hbase/hbase.rb (original)
+++ hbase/trunk/src/main/ruby/hbase/hbase.rb Mon Apr 30 21:48:54 2012
@@ -45,8 +45,8 @@ module Hbase
     end
 
     # Create new one each time
-    def table(table, formatter)
-      ::Hbase::Table.new(configuration, table, formatter)
+    def table(table, shell)
+      ::Hbase::Table.new(configuration, table, shell)
     end
 
     def replication_admin(formatter)

Modified: hbase/trunk/src/main/ruby/hbase/table.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/hbase/table.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/hbase/table.rb (original)
+++ hbase/trunk/src/main/ruby/hbase/table.rb Mon Apr 30 21:48:54 2012
@@ -25,15 +25,102 @@ include Java
 module Hbase
   class Table
     include HBaseConstants
+
+    # Add the command 'name' to table s.t. the shell command also called via 'name'
+    # and has an internal method also called 'name'.
+    #
+    # e.g. name = scan, adds table.scan which calls Scan.scan
+    def self.add_shell_command(name)
+      self.add_command(name, name, name)
+    end
+
+    # add a named command to the table instance
+    #
+    # name - name of the command that should added to the table
+    #    (eg. sending 'scan' here would allow you to do table.scan)
+    # shell_command - name of the command in the shell
+    # internal_method_name - name of the method in the shell command to forward the call
+    def self.add_command(name, shell_command, internal_method_name)
+      method  = name.to_sym
+      self.class_eval do
+        define_method method do |*args|
+            @shell.internal_command(shell_command, internal_method_name, self, *args)
+         end
+      end
+    end
+    
+    # General help for the table
+    # class level so we can call it from anywhere
+    def self.help
+      return <<-EOF
+Help for table-reference commands.
+
+You can either create a table via 'create' and then manipulate the table via commands like 'put', 'get', etc.
+See the standard help information for how to use each of these commands.
+
+However, as of 0.96, you can also get a reference to a table, on which you can invoke commands.
+For instance, you can get create a table and keep around a reference to it via:
+
+   hbase> t = create 't', 'cf'
+
+Or, if you have already created the table, you can get a reference to it:
+
+   hbase> t = get_table 't'
+
+You can do things like call 'put' on the table:
+
+  hbase> t.put 'r', 'cf:q', 'v'
+
+which puts a row 'r' with column family 'cf', qualifier 'q' and value 'v' into table t.
+
+To read the data out, you can scan the table:
+
+  hbase> t.scan
+
+which will read all the rows in table 't'.
+
+Essentially, any command that takes a table name can also be done via table reference.
+Other commands include things like: get, delete, deleteall,
+get_all_columns, get_counter, count, incr. These functions, along with
+the standard JRuby object methods are also available via tab completion.
+
+For more information on how to use each of these commands, you can also just type:
+
+   hbase> t.help 'scan'
+
+which will output more information on how to use that command.
+
+You can also do general admin actions directly on a table; things like enable, disable,
+flush and drop just by typing:
+
+   hbase> t.enable
+   hbase> t.flush
+   hbase> t.disable
+   hbase> t.drop
+
+Note that after dropping a table, your reference to it becomes useless and further usage
+is undefined (and not recommended).
+EOF
+      end
+    
+    #---------------------------------------------------------------------------------------------
+
+    # let external objects read the underlying table object
     attr_reader :table
+    # let external objects read the table name
+    attr_reader :name
 
-    def initialize(configuration, table_name, formatter)
+    def initialize(configuration, table_name, shell)
       @table = org.apache.hadoop.hbase.client.HTable.new(configuration, table_name)
+      @name = table_name
+      @shell = shell
     end
 
+    # Note the below methods are prefixed with '_' to hide them from the average user, as
+    # they will be much less likely to tab complete to the 'dangerous' internal method
     #----------------------------------------------------------------------------------------------
     # Put a cell 'value' at specified table/row/column
-    def put(row, column, value, timestamp = nil)
+    def _put_internal(row, column, value, timestamp = nil)
       p = org.apache.hadoop.hbase.client.Put.new(row.to_s.to_java_bytes)
       family, qualifier = parse_column_name(column)
       if timestamp
@@ -46,13 +133,13 @@ module Hbase
 
     #----------------------------------------------------------------------------------------------
     # Delete a cell
-    def delete(row, column, timestamp = org.apache.hadoop.hbase.HConstants::LATEST_TIMESTAMP)
-      deleteall(row, column, timestamp)
+    def _delete_internal(row, column, timestamp = org.apache.hadoop.hbase.HConstants::LATEST_TIMESTAMP)
+      deleteall_internal(row, column, timestamp)
     end
 
     #----------------------------------------------------------------------------------------------
     # Delete a row
-    def deleteall(row, column = nil, timestamp = org.apache.hadoop.hbase.HConstants::LATEST_TIMESTAMP)
+    def _deleteall_internal(row, column = nil, timestamp = org.apache.hadoop.hbase.HConstants::LATEST_TIMESTAMP)
       d = org.apache.hadoop.hbase.client.Delete.new(row.to_s.to_java_bytes, timestamp, nil)
       if column
         family, qualifier = parse_column_name(column)
@@ -63,7 +150,7 @@ module Hbase
 
     #----------------------------------------------------------------------------------------------
     # Increment a counter atomically
-    def incr(row, column, value = nil)
+    def _incr_internal(row, column, value = nil)
       value ||= 1
       family, qualifier = parse_column_name(column)
       @table.incrementColumnValue(row.to_s.to_java_bytes, family, qualifier, value)
@@ -71,7 +158,7 @@ module Hbase
 
     #----------------------------------------------------------------------------------------------
     # Count rows in a table
-    def count(interval = 1000, caching_rows = 10)
+    def _count_internal(interval = 1000, caching_rows = 10)
       # We can safely set scanner caching with the first key only filter
       scan = org.apache.hadoop.hbase.client.Scan.new
       scan.cache_blocks = false
@@ -98,7 +185,7 @@ module Hbase
 
     #----------------------------------------------------------------------------------------------
     # Get from table
-    def get(row, *args)
+    def _get_internal(row, *args)
       get = org.apache.hadoop.hbase.client.Get.new(row.to_s.to_java_bytes)
       maxlength = -1
 
@@ -188,7 +275,7 @@ module Hbase
 
     #----------------------------------------------------------------------------------------------
     # Fetches and decodes a counter value from hbase
-    def get_counter(row, column)
+    def _get_counter_internal(row, column)
       family, qualifier = parse_column_name(column.to_s)
       # Format get request
       get = org.apache.hadoop.hbase.client.Get.new(row.to_s.to_java_bytes)
@@ -205,8 +292,8 @@ module Hbase
     end
 
     #----------------------------------------------------------------------------------------------
-    # Scans whole table or a range of keys and returns rows matching specific criterias
-    def scan(args = {})
+    # Scans whole table or a range of keys and returns rows matching specific criteria
+    def _scan_internal(args = {})
       unless args.kind_of?(Hash)
         raise ArgumentError, "Arguments should be a hash. Failed to parse #{args.inspect}, #{args.class}"
       end
@@ -298,8 +385,55 @@ module Hbase
       return ((block_given?) ? count : res)
     end
 
+    #----------------------------
+    # Add general administration utilities to the shell
+    # each of the names below adds this method name to the table
+    # by callling the corresponding method in the shell
+    # Add single method utilities to the current class
+    # Generally used for admin functions which just have one name and take the table name
+    def self.add_admin_utils(*args)
+      args.each do |method|
+        define_method method do
+          @shell.command(method, @name)
+        end
+      end
+    end
+
+    #Add the following admin utilities to the table
+    add_admin_utils :enable, :disable, :flush, :drop, :describe
+
+    #----------------------------
+    #give the general help for the table
+    # or the named command
+    def help (command = nil)
+      #if there is a command, get the per-command help from the shell
+      if command
+        begin
+          return @shell.help_command(command)
+        rescue NoMethodError
+          puts "Command \'#{command}\' does not exist. Please see general table help."
+          return nil
+        end
+      end
+      return @shell.help('table_help')
+    end
+
+    # Table to string
+    def to_s
+      cl = self.class()
+      return "#{cl} - #{@name}"
+    end
+
+    # Standard ruby call to get the return value for an object
+    # overriden here so we get sane semantics for printing a table on return
+    def inspect
+      to_s
+    end
+
     #----------------------------------------------------------------------------------------
     # Helper methods
+    #everthing below here is 'private' - can only be called from within the class context
+    private
 
     # Returns a list of column names in the table
     def get_all_columns
@@ -345,6 +479,5 @@ module Hbase
       end
       (maxlength != -1) ? val[0, maxlength] : val
     end
-
   end
 end

Modified: hbase/trunk/src/main/ruby/shell.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/shell.rb (original)
+++ hbase/trunk/src/main/ruby/shell.rb Mon Apr 30 21:48:54 2012
@@ -80,7 +80,7 @@ module Shell
     end
 
     def hbase_table(name)
-      hbase.table(name, formatter)
+      hbase.table(name, self)
     end
 
     def hbase_replication_admin
@@ -93,10 +93,15 @@ module Shell
 
     def export_commands(where)
       ::Shell.commands.keys.each do |cmd|
+        # here where is the IRB namespace
+        # this method just adds the call to the specified command
+        # which just references back to 'this' shell object
+        # a decently extensible way to add commands
         where.send :instance_eval, <<-EOF
           def #{cmd}(*args)
-            @shell.command('#{cmd}', *args)
+            ret = @shell.command('#{cmd}', *args)
             puts
+            return ret
           end
         EOF
       end
@@ -106,8 +111,17 @@ module Shell
       ::Shell.commands[command.to_s].new(self)
     end
 
+    #call the method 'command' on the specified command
     def command(command, *args)
-      command_instance(command).command_safe(self.debug, *args)
+      internal_command(command, :command, *args)
+    end
+
+    #call a specific internal method in the command instance
+    # command  - name of the command to call
+    # method_name - name of the method on the command to call. Defaults to just 'command'
+    # args - to be passed to the named method
+    def internal_command(command, method_name= :command, *args)
+      command_instance(command).command_safe(self.debug,method_name, *args)
     end
 
     def print_banner
@@ -211,6 +225,7 @@ Shell.load_command_group(
   :commands => %w[
     status
     version
+    table_help
   ]
 )
 
@@ -234,6 +249,7 @@ Shell.load_command_group(
     show_filters
     alter_status
     alter_async
+    get_table
   ]
 )
 

Modified: hbase/trunk/src/main/ruby/shell/commands.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands.rb (original)
+++ hbase/trunk/src/main/ruby/shell/commands.rb Mon Apr 30 21:48:54 2012
@@ -21,14 +21,18 @@
 module Shell
   module Commands
     class Command
-      attr_accessor :shell
 
       def initialize(shell)
-        self.shell = shell
+        @shell = shell
       end
 
-      def command_safe(debug, *args)
-        translate_hbase_exceptions(*args) { command(*args) }
+      #wrap an execution of cmd to catch hbase exceptions
+      # cmd - command name to execture
+      # args - arguments to pass to the command
+      def command_safe(debug, cmd = :command, *args)
+        # send is internal ruby method to call 'cmd' with *args
+        #(everything is a message, so this is just the formal semantics to support that idiom)
+        translate_hbase_exceptions(*args) { send(cmd,*args) }
       rescue => e
         puts
         puts "ERROR: #{e}"
@@ -37,30 +41,28 @@ module Shell
         puts "Here is some help for this command:"
         puts help
         puts
-      ensure
-        return nil
       end
 
       def admin
-        shell.hbase_admin
+        @shell.hbase_admin
       end
 
       def table(name)
-        shell.hbase_table(name)
+        @shell.hbase_table(name)
       end
 
       def replication_admin
-        shell.hbase_replication_admin
+        @shell.hbase_replication_admin
       end
 
       def security_admin
-        shell.hbase_security_admin
+        @shell.hbase_security_admin
       end
 
       #----------------------------------------------------------------------
 
       def formatter
-        shell.formatter
+        @shell.formatter
       end
 
       def format_simple_command
@@ -70,6 +72,14 @@ module Shell
         formatter.footer(now)
       end
 
+      def format_and_return_simple_command
+        now = Time.now
+        ret = yield
+        formatter.header
+        formatter.footer(now)
+        return ret
+      end
+
       def translate_hbase_exceptions(*args)
         yield
       rescue org.apache.hadoop.hbase.TableNotFoundException

Modified: hbase/trunk/src/main/ruby/shell/commands/count.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands/count.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands/count.rb (original)
+++ hbase/trunk/src/main/ruby/shell/commands/count.rb Mon Apr 30 21:48:54 2012
@@ -35,10 +35,22 @@ parameter. Examples:
  hbase> count 't1', INTERVAL => 100000
  hbase> count 't1', CACHE => 1000
  hbase> count 't1', INTERVAL => 10, CACHE => 1000
+
+The same commands also can be run on a table reference. Suppose you had a reference
+t to table 't1', the corresponding commands would be:
+
+ hbase> t.count
+ hbase> t.count INTERVAL => 100000
+ hbase> t.count CACHE => 1000
+ hbase> t.count INTERVAL => 10, CACHE => 1000
 EOF
       end
 
       def command(table, params = {})
+        count(table(table), params)
+      end
+
+      def count(table, params = {})
         # If the second parameter is an integer, then it is the old command syntax
         params = { 'INTERVAL' => params } if params.kind_of?(Fixnum)
 
@@ -51,7 +63,7 @@ EOF
         # Call the counter method
         now = Time.now
         formatter.header
-        count = table(table).count(params['INTERVAL'].to_i, params['CACHE'].to_i) do |cnt, row|
+        count = table._count_internal(params['INTERVAL'].to_i, params['CACHE'].to_i) do |cnt, row|
           formatter.row([ "Current count: #{cnt}, row: #{row}" ])
         end
         formatter.footer(now, count)
@@ -59,3 +71,6 @@ EOF
     end
   end
 end
+
+#Add the method table.count that calls count.count
+::Hbase::Table.add_shell_command("count")

Modified: hbase/trunk/src/main/ruby/shell/commands/create.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands/create.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands/create.rb (original)
+++ hbase/trunk/src/main/ruby/shell/commands/create.rb Mon Apr 30 21:48:54 2012
@@ -38,13 +38,22 @@ Examples:
   hbase> # Optionally pre-split the table into NUMREGIONS, using
   hbase> # SPLITALGO ("HexStringSplit", "UniformSplit" or classname)
   hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
+
+  You can also keep around a reference to the created table:
+
+  hbase> t1 = create 't1', 'f1'
+
+  Which gives you a reference to the table named 't1', on which you can then
+  call methods.
 EOF
       end
 
       def command(table, *args)
         format_simple_command do
-          admin.create(table, *args)
+          ret = admin.create(table, *args)
         end
+        #and then return the table you just created
+        table(table)
       end
     end
   end

Modified: hbase/trunk/src/main/ruby/shell/commands/delete.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands/delete.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands/delete.rb (original)
+++ hbase/trunk/src/main/ruby/shell/commands/delete.rb Mon Apr 30 21:48:54 2012
@@ -30,14 +30,26 @@ versions. To delete a cell from  't1' at
 marked with the time 'ts1', do:
 
   hbase> delete 't1', 'r1', 'c1', ts1
+
+The same command can also be run on a table reference. Suppose you had a reference
+t to table 't1', the corresponding command would be:
+
+  hbase> t.delete 'r1', 'c1',  ts1
 EOF
       end
 
       def command(table, row, column, timestamp = org.apache.hadoop.hbase.HConstants::LATEST_TIMESTAMP)
+        delete(table(table), row, column, timestamp)
+      end
+
+      def delete(table, row, column, timestamp = org.apache.hadoop.hbase.HConstants::LATEST_TIMESTAMP)
         format_simple_command do
-          table(table).delete(row, column, timestamp)
+          table._delete_internal(row, column, timestamp)
         end
       end
     end
   end
 end
+
+#Add the method table.delete that calls delete.delete
+::Hbase::Table.add_shell_command("delete")
\ No newline at end of file

Modified: hbase/trunk/src/main/ruby/shell/commands/deleteall.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands/deleteall.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands/deleteall.rb (original)
+++ hbase/trunk/src/main/ruby/shell/commands/deleteall.rb Mon Apr 30 21:48:54 2012
@@ -29,14 +29,28 @@ a column and timestamp. Examples:
   hbase> deleteall 't1', 'r1'
   hbase> deleteall 't1', 'r1', 'c1'
   hbase> deleteall 't1', 'r1', 'c1', ts1
+
+The same commands also can be run on a table reference. Suppose you had a reference
+t to table 't1', the corresponding command would be:
+
+  hbase> t.deleteall 'r1'
+  hbase> t.deleteall 'r1', 'c1'
+  hbase> t.deleteall 'r1', 'c1', ts1
 EOF
       end
 
-      def command(table, row, column = nil, timestamp = org.apache.hadoop.hbase.HConstants::LATEST_TIMESTAMP)
+      def command(table, row, column, timestamp = org.apache.hadoop.hbase.HConstants::LATEST_TIMESTAMP)
+        deleteall(table(table), row, column, timestamp)
+      end
+
+      def deleteall(table, row, column = nil, timestamp = org.apache.hadoop.hbase.HConstants::LATEST_TIMESTAMP)
         format_simple_command do
-          table(table).deleteall(row, column, timestamp)
+          table.deleteall_internal(row, column, timestamp)
         end
       end
     end
   end
 end
+
+#Add the method table.deleteall that calls deleteall.deleteall
+::Hbase::Table.add_shell_command("deleteall")
\ No newline at end of file

Modified: hbase/trunk/src/main/ruby/shell/commands/get.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands/get.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands/get.rb (original)
+++ hbase/trunk/src/main/ruby/shell/commands/get.rb Mon Apr 30 21:48:54 2012
@@ -36,14 +36,32 @@ a dictionary of column(s), timestamp, ti
   hbase> get 't1', 'r1', 'c1'
   hbase> get 't1', 'r1', 'c1', 'c2'
   hbase> get 't1', 'r1', ['c1', 'c2']
+
+The same commands also can be run on a reference to a table (obtained via get_table or
+ create_table). Suppose you had a reference t to table 't1', the corresponding commands would be:
+
+  hbase> t.get 'r1'
+  hbase> t.get 'r1', {TIMERANGE => [ts1, ts2]}
+  hbase> t.get 'r1', {COLUMN => 'c1'}
+  hbase> t.get 'r1', {COLUMN => ['c1', 'c2', 'c3']}
+  hbase> t.get 'r1', {COLUMN => 'c1', TIMESTAMP => ts1}
+  hbase> t.get 'r1', {COLUMN => 'c1', TIMERANGE => [ts1, ts2], VERSIONS => 4}
+  hbase> t.get 'r1', {COLUMN => 'c1', TIMESTAMP => ts1, VERSIONS => 4}
+  hbase> t.get 'r1', 'c1'
+  hbase> t.get 'r1', 'c1', 'c2'
+  hbase> t.get 'r1', ['c1', 'c2']
 EOF
       end
 
       def command(table, row, *args)
+        get(table(table), row, *args)
+      end
+
+      def get(table, row, *args)
         now = Time.now
         formatter.header(["COLUMN", "CELL"])
 
-        table(table).get(row, *args) do |column, value|
+        table._get_internal(row, *args) do |column, value|
           formatter.row([ column, value ])
         end
 
@@ -52,3 +70,6 @@ EOF
     end
   end
 end
+
+#add get command to table
+::Hbase::Table.add_shell_command('get')

Modified: hbase/trunk/src/main/ruby/shell/commands/get_counter.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands/get_counter.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands/get_counter.rb (original)
+++ hbase/trunk/src/main/ruby/shell/commands/get_counter.rb Mon Apr 30 21:48:54 2012
@@ -28,11 +28,19 @@ A cell cell should be managed with atomi
 and the data should be binary encoded. Example:
 
   hbase> get_counter 't1', 'r1', 'c1'
+
+The same commands also can be run on a table reference. Suppose you had a reference
+t to table 't1', the corresponding command would be:
+
+  hbase> t.get_counter 'r1', 'c1'
 EOF
       end
 
+      def command(table, row, column, value)
+        get_counter(table(table), row, column, value)
+      end
       def command(table, row, column, value = nil)
-        if cnt = table(table).get_counter(row, column)
+        if cnt = table._get_counter_internal(row, column)
           puts "COUNTER VALUE = #{cnt}"
         else
           puts "No counter found at specified coordinates"
@@ -41,3 +49,5 @@ EOF
     end
   end
 end
+
+::Hbase::Table.add_shell_command('get_counter')

Added: hbase/trunk/src/main/ruby/shell/commands/get_table.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands/get_table.rb?rev=1332419&view=auto
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands/get_table.rb (added)
+++ hbase/trunk/src/main/ruby/shell/commands/get_table.rb Mon Apr 30 21:48:54 2012
@@ -0,0 +1,46 @@
+#
+# 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 GetTable < Command
+      def help
+        return <<-EOF
+Get the given table name and return it as an actual object to
+be manipulated by the user. See table.help for more information
+on how to use the table.
+Eg.
+
+  hbase> t1 = get_table 't1'
+
+returns the table named 't1' as a table object. You can then do
+
+  hbase> t1.help
+
+which will then print the help for that table.
+EOF
+      end
+
+      def command(table, *args)
+        format_and_return_simple_command do
+          table(table)
+        end
+      end
+    end
+  end
+end

Modified: hbase/trunk/src/main/ruby/shell/commands/incr.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands/incr.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands/incr.rb (original)
+++ hbase/trunk/src/main/ruby/shell/commands/incr.rb Mon Apr 30 21:48:54 2012
@@ -30,13 +30,27 @@ To increment a cell value in table 't1' 
   hbase> incr 't1', 'r1', 'c1'
   hbase> incr 't1', 'r1', 'c1', 1
   hbase> incr 't1', 'r1', 'c1', 10
+
+The same commands also can be run on a table reference. Suppose you had a reference
+t to table 't1', the corresponding command would be:
+
+  hbase> t.incr 'r1', 'c1'
+  hbase> t.incr 'r1', 'c1', 1
+  hbase> t.incr 'r1', 'c1', 10
 EOF
       end
 
-      def command(table, row, column, value = nil)
-        cnt = table(table).incr(row, column, value)
+      def command(table, row, column, value)
+        incr(table(table), row, column, value)
+      end
+
+      def incr(table, row, column, value = nil)
+        cnt = table._incr_internal(row, column, value)
         puts "COUNTER VALUE = #{cnt}"
       end
     end
   end
 end
+
+#add incr comamnd to Table
+::Hbase::Table.add_shell_command("incr")
\ No newline at end of file

Modified: hbase/trunk/src/main/ruby/shell/commands/put.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands/put.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands/put.rb (original)
+++ hbase/trunk/src/main/ruby/shell/commands/put.rb Mon Apr 30 21:48:54 2012
@@ -28,14 +28,26 @@ timestamp coordinates.  To put a cell va
 row 'r1' under column 'c1' marked with the time 'ts1', do:
 
   hbase> put 't1', 'r1', 'c1', 'value', ts1
+
+The same commands also can be run on a table reference. Suppose you had a reference
+t to table 't1', the corresponding command would be:
+
+  hbase> t.put 'r1', 'c1', 'value', ts1
 EOF
       end
 
       def command(table, row, column, value, timestamp = nil)
+        put table(table), row, column, value, timestamp
+      end
+
+      def put(table, row, column, value, timestamp = nil)
         format_simple_command do
-          table(table).put(row, column, value, timestamp)
+          table._put_internal(row, column, value, timestamp)
         end
       end
     end
   end
 end
+
+#Add the method table.put that calls Put.put
+::Hbase::Table.add_shell_command("put")
\ No newline at end of file

Modified: hbase/trunk/src/main/ruby/shell/commands/scan.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands/scan.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands/scan.rb (original)
+++ hbase/trunk/src/main/ruby/shell/commands/scan.rb Mon Apr 30 21:48:54 2012
@@ -58,14 +58,28 @@ cells). This option cannot be combined w
 Disabled by default.  Example:
 
   hbase> scan 't1', {RAW => true, VERSIONS => 10}
+
+Scan can also be used directly from a table, by first getting a reference to a table, like such:
+
+  hbase> t = get_table 't'
+  hbase> t.scan
+
+Note in the above situation, you can still provide all the filtering, columns, options, etc as
+described above.
 EOF
       end
 
       def command(table, args = {})
+        scan(table(table), args)
+      end
+
+      #internal command that actually does the scanning
+      def scan(table, args = {})
         now = Time.now
         formatter.header(["ROW", "COLUMN+CELL"])
 
-        count = table(table).scan(args) do |row, cells|
+        #actually do the scanning
+        count = table._scan_internal(args) do |row, cells|
           formatter.row([ row, cells ])
         end
 
@@ -74,3 +88,6 @@ EOF
     end
   end
 end
+
+#Add the method table.scan that calls Scan.scan
+::Hbase::Table.add_shell_command("scan")

Added: hbase/trunk/src/main/ruby/shell/commands/table_help.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/ruby/shell/commands/table_help.rb?rev=1332419&view=auto
==============================================================================
--- hbase/trunk/src/main/ruby/shell/commands/table_help.rb (added)
+++ hbase/trunk/src/main/ruby/shell/commands/table_help.rb Mon Apr 30 21:48:54 2012
@@ -0,0 +1,33 @@
+#
+# 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 TableHelp < Command
+      def help
+        return Hbase::Table.help
+      end
+
+      #just print the help
+      def command
+        # call the shell to get the nice formatting there
+        @shell.help_command 'table_help'
+      end
+    end
+  end
+end

Modified: hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java (original)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java Mon Apr 30 21:48:54 2012
@@ -69,6 +69,7 @@ import org.apache.hadoop.hbase.filter.Nu
 import org.apache.hadoop.hbase.filter.PrefixFilter;
 import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
 import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;
 import org.apache.hadoop.hbase.monitoring.MonitoredTask;
 import org.apache.hadoop.hbase.monitoring.TaskMonitor;
 import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;
@@ -87,6 +88,7 @@ import org.apache.hadoop.hbase.util.Pair
 import org.apache.hadoop.hbase.util.Threads;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
+import org.mockito.Mockito;
 
 import com.google.common.collect.Lists;
 
@@ -3459,6 +3461,45 @@ public class TestHRegion extends HBaseTe
         }
       }
   }
+  
+  /**
+   * Testcase to check state of region initialization task set to ABORTED or not if any exceptions
+   * during initialization
+   * 
+   * @throws Exception
+   */
+  @Test
+  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {
+    HRegionInfo info = null;
+    try {
+      FileSystem fs = Mockito.mock(FileSystem.class);
+      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());
+      HTableDescriptor htd = new HTableDescriptor(tableName);
+      htd.addFamily(new HColumnDescriptor("cf"));
+      info = new HRegionInfo(htd.getName(), HConstants.EMPTY_BYTE_ARRAY,
+          HConstants.EMPTY_BYTE_ARRAY, false);
+      Path path = new Path(DIR + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");
+      // no where we are instantiating HStore in this test case so useTableNameGlobally is null. To
+      // avoid NullPointerException we are setting useTableNameGlobally to false.
+      SchemaMetrics.setUseTableNameInTest(false);
+      region = HRegion.newHRegion(path, null, fs, conf, info, htd, null);
+      // region initialization throws IOException and set task state to ABORTED.
+      region.initialize();
+      fail("Region initialization should fail due to IOException");
+    } catch (IOException io) {
+      List<MonitoredTask> tasks = TaskMonitor.get().getTasks();
+      for (MonitoredTask monitoredTask : tasks) {
+        if (!(monitoredTask instanceof MonitoredRPCHandler)
+            && monitoredTask.getDescription().contains(region.toString())) {
+          assertTrue("Region state should be ABORTED.",
+              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));
+          break;
+        }
+      }
+    } finally {
+      HRegion.closeHRegion(region);
+    }
+  }
 
   private void putData(int startRow, int numRows, byte [] qf,
       byte [] ...families)

Modified: hbase/trunk/src/test/ruby/hbase/admin_test.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/ruby/hbase/admin_test.rb?rev=1332419&r1=1332418&r2=1332419&view=diff
==============================================================================
--- hbase/trunk/src/test/ruby/hbase/admin_test.rb (original)
+++ hbase/trunk/src/test/ruby/hbase/admin_test.rb Mon Apr 30 21:48:54 2012
@@ -310,5 +310,13 @@ module Hbase
       assert_no_match(eval("/" + key1 + "\\$(\\d+)/"), admin.describe(@test_name))
       assert_no_match(eval("/" + key2 + "/"), admin.describe(@test_name))
     end
+
+    define_test "get_table should get a real table" do
+      drop_test_table(@test_name)
+      create_test_table(@test_name)
+
+      table = table(@test_name)
+      assert_not_equal(nil, table)
+    end
   end
 end