You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2014/12/04 02:52:19 UTC

hbase git commit: HBASE-12582 Backport HBASE-10881 'Support reverse scan in thrift2' to 0.98 (Ted Yu)

Repository: hbase
Updated Branches:
  refs/heads/0.98 ea4025d5f -> 9c1784217


HBASE-12582 Backport HBASE-10881 'Support reverse scan in thrift2' to 0.98 (Ted Yu)


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/9c178421
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/9c178421
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/9c178421

Branch: refs/heads/0.98
Commit: 9c1784217249dcee45a4acb261059da351536523
Parents: ea4025d
Author: Andrew Purtell <ap...@apache.org>
Authored: Wed Dec 3 16:50:23 2014 -0800
Committer: Andrew Purtell <ap...@apache.org>
Committed: Wed Dec 3 16:50:23 2014 -0800

----------------------------------------------------------------------
 .../hadoop/hbase/thrift/ThriftServerRunner.java |   3 +
 .../hadoop/hbase/thrift/generated/Hbase.java    | 104 ++++++++---------
 .../hbase/thrift/generated/TRowResult.java      |   4 +-
 .../hadoop/hbase/thrift/generated/TScan.java    | 108 +++++++++++++++++-
 .../hadoop/hbase/thrift2/ThriftUtilities.java   |   4 +
 .../hadoop/hbase/thrift2/generated/TAppend.java |   4 +-
 .../hadoop/hbase/thrift2/generated/TDelete.java |   4 +-
 .../hadoop/hbase/thrift2/generated/TGet.java    |   4 +-
 .../hbase/thrift2/generated/TIncrement.java     |   4 +-
 .../hadoop/hbase/thrift2/generated/TPut.java    |   4 +-
 .../hadoop/hbase/thrift2/generated/TScan.java   | 112 ++++++++++++++++++-
 .../org/apache/hadoop/hbase/thrift/Hbase.thrift |   3 +-
 .../apache/hadoop/hbase/thrift2/hbase.thrift    |   1 +
 .../hadoop/hbase/thrift/TestThriftServer.java   |  11 ++
 .../thrift2/TestThriftHBaseServiceHandler.java  |  63 +++++++++++
 15 files changed, 358 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
index 14b2ada..e245309 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
@@ -1347,6 +1347,9 @@ public class ThriftServerRunner implements Runnable {
           scan.setFilter(
               parseFilter.parseFilterString(tScan.getFilterString()));
         }
+        if (tScan.isSetReversed()) {
+          scan.setReversed(tScan.isReversed());
+        }
         return addScanner(table.getScanner(scan), tScan.sortColumns);
       } catch (IOException e) {
         LOG.warn(e.getMessage(), e);

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/Hbase.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/Hbase.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/Hbase.java
index 2eefad4..bd5bd52 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/Hbase.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/Hbase.java
@@ -10061,7 +10061,7 @@ public class Hbase {
                   struct.success = new HashMap<ByteBuffer,ColumnDescriptor>(2*_map42.size);
                   for (int _i43 = 0; _i43 < _map42.size; ++_i43)
                   {
-                    ByteBuffer _key44; // required
+                    ByteBuffer _key44; // optional
                     ColumnDescriptor _val45; // required
                     _key44 = iprot.readBinary();
                     _val45 = new ColumnDescriptor();
@@ -10167,7 +10167,7 @@ public class Hbase {
             struct.success = new HashMap<ByteBuffer,ColumnDescriptor>(2*_map48.size);
             for (int _i49 = 0; _i49 < _map48.size; ++_i49)
             {
-              ByteBuffer _key50; // required
+              ByteBuffer _key50; // optional
               ColumnDescriptor _val51; // required
               _key50 = iprot.readBinary();
               _val51 = new ColumnDescriptor();
@@ -13642,7 +13642,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map68.size);
                   for (int _i69 = 0; _i69 < _map68.size; ++_i69)
                   {
-                    ByteBuffer _key70; // required
+                    ByteBuffer _key70; // optional
                     ByteBuffer _val71; // required
                     _key70 = iprot.readBinary();
                     _val71 = iprot.readBinary();
@@ -13772,7 +13772,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map74.size);
             for (int _i75 = 0; _i75 < _map74.size; ++_i75)
             {
-              ByteBuffer _key76; // required
+              ByteBuffer _key76; // optional
               ByteBuffer _val77; // required
               _key76 = iprot.readBinary();
               _val77 = iprot.readBinary();
@@ -15083,7 +15083,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map86.size);
                   for (int _i87 = 0; _i87 < _map86.size; ++_i87)
                   {
-                    ByteBuffer _key88; // required
+                    ByteBuffer _key88; // optional
                     ByteBuffer _val89; // required
                     _key88 = iprot.readBinary();
                     _val89 = iprot.readBinary();
@@ -15226,7 +15226,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map92.size);
             for (int _i93 = 0; _i93 < _map92.size; ++_i93)
             {
-              ByteBuffer _key94; // required
+              ByteBuffer _key94; // optional
               ByteBuffer _val95; // required
               _key94 = iprot.readBinary();
               _val95 = iprot.readBinary();
@@ -16635,7 +16635,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map104.size);
                   for (int _i105 = 0; _i105 < _map104.size; ++_i105)
                   {
-                    ByteBuffer _key106; // required
+                    ByteBuffer _key106; // optional
                     ByteBuffer _val107; // required
                     _key106 = iprot.readBinary();
                     _val107 = iprot.readBinary();
@@ -16791,7 +16791,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map110.size);
             for (int _i111 = 0; _i111 < _map110.size; ++_i111)
             {
-              ByteBuffer _key112; // required
+              ByteBuffer _key112; // optional
               ByteBuffer _val113; // required
               _key112 = iprot.readBinary();
               _val113 = iprot.readBinary();
@@ -17888,7 +17888,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map122.size);
                   for (int _i123 = 0; _i123 < _map122.size; ++_i123)
                   {
-                    ByteBuffer _key124; // required
+                    ByteBuffer _key124; // optional
                     ByteBuffer _val125; // required
                     _key124 = iprot.readBinary();
                     _val125 = iprot.readBinary();
@@ -18003,7 +18003,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map128.size);
             for (int _i129 = 0; _i129 < _map128.size; ++_i129)
             {
-              ByteBuffer _key130; // required
+              ByteBuffer _key130; // optional
               ByteBuffer _val131; // required
               _key130 = iprot.readBinary();
               _val131 = iprot.readBinary();
@@ -19232,7 +19232,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map143.size);
                   for (int _i144 = 0; _i144 < _map143.size; ++_i144)
                   {
-                    ByteBuffer _key145; // required
+                    ByteBuffer _key145; // optional
                     ByteBuffer _val146; // required
                     _key145 = iprot.readBinary();
                     _val146 = iprot.readBinary();
@@ -19384,7 +19384,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map154.size);
             for (int _i155 = 0; _i155 < _map154.size; ++_i155)
             {
-              ByteBuffer _key156; // required
+              ByteBuffer _key156; // optional
               ByteBuffer _val157; // required
               _key156 = iprot.readBinary();
               _val157 = iprot.readBinary();
@@ -20583,7 +20583,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map166.size);
                   for (int _i167 = 0; _i167 < _map166.size; ++_i167)
                   {
-                    ByteBuffer _key168; // required
+                    ByteBuffer _key168; // optional
                     ByteBuffer _val169; // required
                     _key168 = iprot.readBinary();
                     _val169 = iprot.readBinary();
@@ -20711,7 +20711,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map172.size);
             for (int _i173 = 0; _i173 < _map172.size; ++_i173)
             {
-              ByteBuffer _key174; // required
+              ByteBuffer _key174; // optional
               ByteBuffer _val175; // required
               _key174 = iprot.readBinary();
               _val175 = iprot.readBinary();
@@ -22030,7 +22030,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map187.size);
                   for (int _i188 = 0; _i188 < _map187.size; ++_i188)
                   {
-                    ByteBuffer _key189; // required
+                    ByteBuffer _key189; // optional
                     ByteBuffer _val190; // required
                     _key189 = iprot.readBinary();
                     _val190 = iprot.readBinary();
@@ -22195,7 +22195,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map198.size);
             for (int _i199 = 0; _i199 < _map198.size; ++_i199)
             {
-              ByteBuffer _key200; // required
+              ByteBuffer _key200; // optional
               ByteBuffer _val201; // required
               _key200 = iprot.readBinary();
               _val201 = iprot.readBinary();
@@ -23312,7 +23312,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map213.size);
                   for (int _i214 = 0; _i214 < _map213.size; ++_i214)
                   {
-                    ByteBuffer _key215; // required
+                    ByteBuffer _key215; // optional
                     ByteBuffer _val216; // required
                     _key215 = iprot.readBinary();
                     _val216 = iprot.readBinary();
@@ -23449,7 +23449,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map224.size);
             for (int _i225 = 0; _i225 < _map224.size; ++_i225)
             {
-              ByteBuffer _key226; // required
+              ByteBuffer _key226; // optional
               ByteBuffer _val227; // required
               _key226 = iprot.readBinary();
               _val227 = iprot.readBinary();
@@ -24698,7 +24698,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map242.size);
                   for (int _i243 = 0; _i243 < _map242.size; ++_i243)
                   {
-                    ByteBuffer _key244; // required
+                    ByteBuffer _key244; // optional
                     ByteBuffer _val245; // required
                     _key244 = iprot.readBinary();
                     _val245 = iprot.readBinary();
@@ -24872,7 +24872,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map258.size);
             for (int _i259 = 0; _i259 < _map258.size; ++_i259)
             {
-              ByteBuffer _key260; // required
+              ByteBuffer _key260; // optional
               ByteBuffer _val261; // required
               _key260 = iprot.readBinary();
               _val261 = iprot.readBinary();
@@ -26091,7 +26091,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map273.size);
                   for (int _i274 = 0; _i274 < _map273.size; ++_i274)
                   {
-                    ByteBuffer _key275; // required
+                    ByteBuffer _key275; // optional
                     ByteBuffer _val276; // required
                     _key275 = iprot.readBinary();
                     _val276 = iprot.readBinary();
@@ -26241,7 +26241,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map284.size);
             for (int _i285 = 0; _i285 < _map284.size; ++_i285)
             {
-              ByteBuffer _key286; // required
+              ByteBuffer _key286; // optional
               ByteBuffer _val287; // required
               _key286 = iprot.readBinary();
               _val287 = iprot.readBinary();
@@ -27580,7 +27580,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map302.size);
                   for (int _i303 = 0; _i303 < _map302.size; ++_i303)
                   {
-                    ByteBuffer _key304; // required
+                    ByteBuffer _key304; // optional
                     ByteBuffer _val305; // required
                     _key304 = iprot.readBinary();
                     _val305 = iprot.readBinary();
@@ -27767,7 +27767,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map318.size);
             for (int _i319 = 0; _i319 < _map318.size; ++_i319)
             {
-              ByteBuffer _key320; // required
+              ByteBuffer _key320; // optional
               ByteBuffer _val321; // required
               _key320 = iprot.readBinary();
               _val321 = iprot.readBinary();
@@ -28997,7 +28997,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map333.size);
                   for (int _i334 = 0; _i334 < _map333.size; ++_i334)
                   {
-                    ByteBuffer _key335; // required
+                    ByteBuffer _key335; // optional
                     ByteBuffer _val336; // required
                     _key335 = iprot.readBinary();
                     _val336 = iprot.readBinary();
@@ -29150,7 +29150,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map344.size);
             for (int _i345 = 0; _i345 < _map344.size; ++_i345)
             {
-              ByteBuffer _key346; // required
+              ByteBuffer _key346; // optional
               ByteBuffer _val347; // required
               _key346 = iprot.readBinary();
               _val347 = iprot.readBinary();
@@ -30430,7 +30430,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map351.size);
                   for (int _i352 = 0; _i352 < _map351.size; ++_i352)
                   {
-                    ByteBuffer _key353; // required
+                    ByteBuffer _key353; // optional
                     ByteBuffer _val354; // required
                     _key353 = iprot.readBinary();
                     _val354 = iprot.readBinary();
@@ -30596,7 +30596,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map362.size);
             for (int _i363 = 0; _i363 < _map362.size; ++_i363)
             {
-              ByteBuffer _key364; // required
+              ByteBuffer _key364; // optional
               ByteBuffer _val365; // required
               _key364 = iprot.readBinary();
               _val365 = iprot.readBinary();
@@ -31662,7 +31662,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map369.size);
                   for (int _i370 = 0; _i370 < _map369.size; ++_i370)
                   {
-                    ByteBuffer _key371; // required
+                    ByteBuffer _key371; // optional
                     ByteBuffer _val372; // required
                     _key371 = iprot.readBinary();
                     _val372 = iprot.readBinary();
@@ -31800,7 +31800,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map380.size);
             for (int _i381 = 0; _i381 < _map380.size; ++_i381)
             {
-              ByteBuffer _key382; // required
+              ByteBuffer _key382; // optional
               ByteBuffer _val383; // required
               _key382 = iprot.readBinary();
               _val383 = iprot.readBinary();
@@ -32968,7 +32968,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map387.size);
                   for (int _i388 = 0; _i388 < _map387.size; ++_i388)
                   {
-                    ByteBuffer _key389; // required
+                    ByteBuffer _key389; // optional
                     ByteBuffer _val390; // required
                     _key389 = iprot.readBinary();
                     _val390 = iprot.readBinary();
@@ -33119,7 +33119,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map398.size);
             for (int _i399 = 0; _i399 < _map398.size; ++_i399)
             {
-              ByteBuffer _key400; // required
+              ByteBuffer _key400; // optional
               ByteBuffer _val401; // required
               _key400 = iprot.readBinary();
               _val401 = iprot.readBinary();
@@ -35603,7 +35603,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map402.size);
                   for (int _i403 = 0; _i403 < _map402.size; ++_i403)
                   {
-                    ByteBuffer _key404; // required
+                    ByteBuffer _key404; // optional
                     ByteBuffer _val405; // required
                     _key404 = iprot.readBinary();
                     _val405 = iprot.readBinary();
@@ -35733,7 +35733,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map408.size);
             for (int _i409 = 0; _i409 < _map408.size; ++_i409)
             {
-              ByteBuffer _key410; // required
+              ByteBuffer _key410; // optional
               ByteBuffer _val411; // required
               _key410 = iprot.readBinary();
               _val411 = iprot.readBinary();
@@ -36885,7 +36885,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map412.size);
                   for (int _i413 = 0; _i413 < _map412.size; ++_i413)
                   {
-                    ByteBuffer _key414; // required
+                    ByteBuffer _key414; // optional
                     ByteBuffer _val415; // required
                     _key414 = iprot.readBinary();
                     _val415 = iprot.readBinary();
@@ -37028,7 +37028,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map418.size);
             for (int _i419 = 0; _i419 < _map418.size; ++_i419)
             {
-              ByteBuffer _key420; // required
+              ByteBuffer _key420; // optional
               ByteBuffer _val421; // required
               _key420 = iprot.readBinary();
               _val421 = iprot.readBinary();
@@ -37966,7 +37966,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map422.size);
                   for (int _i423 = 0; _i423 < _map422.size; ++_i423)
                   {
-                    ByteBuffer _key424; // required
+                    ByteBuffer _key424; // optional
                     ByteBuffer _val425; // required
                     _key424 = iprot.readBinary();
                     _val425 = iprot.readBinary();
@@ -38081,7 +38081,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map428.size);
             for (int _i429 = 0; _i429 < _map428.size; ++_i429)
             {
-              ByteBuffer _key430; // required
+              ByteBuffer _key430; // optional
               ByteBuffer _val431; // required
               _key430 = iprot.readBinary();
               _val431 = iprot.readBinary();
@@ -40652,7 +40652,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map440.size);
                   for (int _i441 = 0; _i441 < _map440.size; ++_i441)
                   {
-                    ByteBuffer _key442; // required
+                    ByteBuffer _key442; // optional
                     ByteBuffer _val443; // required
                     _key442 = iprot.readBinary();
                     _val443 = iprot.readBinary();
@@ -40780,7 +40780,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map446.size);
             for (int _i447 = 0; _i447 < _map446.size; ++_i447)
             {
-              ByteBuffer _key448; // required
+              ByteBuffer _key448; // optional
               ByteBuffer _val449; // required
               _key448 = iprot.readBinary();
               _val449 = iprot.readBinary();
@@ -41712,7 +41712,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map450.size);
                   for (int _i451 = 0; _i451 < _map450.size; ++_i451)
                   {
-                    ByteBuffer _key452; // required
+                    ByteBuffer _key452; // optional
                     ByteBuffer _val453; // required
                     _key452 = iprot.readBinary();
                     _val453 = iprot.readBinary();
@@ -41828,7 +41828,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map456.size);
             for (int _i457 = 0; _i457 < _map456.size; ++_i457)
             {
-              ByteBuffer _key458; // required
+              ByteBuffer _key458; // optional
               ByteBuffer _val459; // required
               _key458 = iprot.readBinary();
               _val459 = iprot.readBinary();
@@ -43015,7 +43015,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map463.size);
                   for (int _i464 = 0; _i464 < _map463.size; ++_i464)
                   {
-                    ByteBuffer _key465; // required
+                    ByteBuffer _key465; // optional
                     ByteBuffer _val466; // required
                     _key465 = iprot.readBinary();
                     _val466 = iprot.readBinary();
@@ -43167,7 +43167,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map474.size);
             for (int _i475 = 0; _i475 < _map474.size; ++_i475)
             {
-              ByteBuffer _key476; // required
+              ByteBuffer _key476; // optional
               ByteBuffer _val477; // required
               _key476 = iprot.readBinary();
               _val477 = iprot.readBinary();
@@ -44470,7 +44470,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map481.size);
                   for (int _i482 = 0; _i482 < _map481.size; ++_i482)
                   {
-                    ByteBuffer _key483; // required
+                    ByteBuffer _key483; // optional
                     ByteBuffer _val484; // required
                     _key483 = iprot.readBinary();
                     _val484 = iprot.readBinary();
@@ -44637,7 +44637,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map492.size);
             for (int _i493 = 0; _i493 < _map492.size; ++_i493)
             {
-              ByteBuffer _key494; // required
+              ByteBuffer _key494; // optional
               ByteBuffer _val495; // required
               _key494 = iprot.readBinary();
               _val495 = iprot.readBinary();
@@ -45812,7 +45812,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map499.size);
                   for (int _i500 = 0; _i500 < _map499.size; ++_i500)
                   {
-                    ByteBuffer _key501; // required
+                    ByteBuffer _key501; // optional
                     ByteBuffer _val502; // required
                     _key501 = iprot.readBinary();
                     _val502 = iprot.readBinary();
@@ -45964,7 +45964,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map510.size);
             for (int _i511 = 0; _i511 < _map510.size; ++_i511)
             {
-              ByteBuffer _key512; // required
+              ByteBuffer _key512; // optional
               ByteBuffer _val513; // required
               _key512 = iprot.readBinary();
               _val513 = iprot.readBinary();
@@ -47253,7 +47253,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map517.size);
                   for (int _i518 = 0; _i518 < _map517.size; ++_i518)
                   {
-                    ByteBuffer _key519; // required
+                    ByteBuffer _key519; // optional
                     ByteBuffer _val520; // required
                     _key519 = iprot.readBinary();
                     _val520 = iprot.readBinary();
@@ -47418,7 +47418,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map528.size);
             for (int _i529 = 0; _i529 < _map528.size; ++_i529)
             {
-              ByteBuffer _key530; // required
+              ByteBuffer _key530; // optional
               ByteBuffer _val531; // required
               _key530 = iprot.readBinary();
               _val531 = iprot.readBinary();
@@ -48823,7 +48823,7 @@ public class Hbase {
                   struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map535.size);
                   for (int _i536 = 0; _i536 < _map535.size; ++_i536)
                   {
-                    ByteBuffer _key537; // required
+                    ByteBuffer _key537; // optional
                     ByteBuffer _val538; // required
                     _key537 = iprot.readBinary();
                     _val538 = iprot.readBinary();
@@ -49003,7 +49003,7 @@ public class Hbase {
             struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map546.size);
             for (int _i547 = 0; _i547 < _map546.size; ++_i547)
             {
-              ByteBuffer _key548; // required
+              ByteBuffer _key548; // optional
               ByteBuffer _val549; // required
               _key548 = iprot.readBinary();
               _val549 = iprot.readBinary();

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/TRowResult.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/TRowResult.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/TRowResult.java
index 3bb244d..66757d6 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/TRowResult.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/TRowResult.java
@@ -562,7 +562,7 @@ public class TRowResult implements org.apache.thrift.TBase<TRowResult, TRowResul
                 struct.columns = new HashMap<ByteBuffer,TCell>(2*_map8.size);
                 for (int _i9 = 0; _i9 < _map8.size; ++_i9)
                 {
-                  ByteBuffer _key10; // required
+                  ByteBuffer _key10; // optional
                   TCell _val11; // required
                   _key10 = iprot.readBinary();
                   _val11 = new TCell();
@@ -710,7 +710,7 @@ public class TRowResult implements org.apache.thrift.TBase<TRowResult, TRowResul
           struct.columns = new HashMap<ByteBuffer,TCell>(2*_map19.size);
           for (int _i20 = 0; _i20 < _map19.size; ++_i20)
           {
-            ByteBuffer _key21; // required
+            ByteBuffer _key21; // optional
             TCell _val22; // required
             _key21 = iprot.readBinary();
             _val22 = new TCell();

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/TScan.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/TScan.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/TScan.java
index 7e6a144..5f5cdc7 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/TScan.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/TScan.java
@@ -45,6 +45,7 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
   private static final org.apache.thrift.protocol.TField FILTER_STRING_FIELD_DESC = new org.apache.thrift.protocol.TField("filterString", org.apache.thrift.protocol.TType.STRING, (short)6);
   private static final org.apache.thrift.protocol.TField BATCH_SIZE_FIELD_DESC = new org.apache.thrift.protocol.TField("batchSize", org.apache.thrift.protocol.TType.I32, (short)7);
   private static final org.apache.thrift.protocol.TField SORT_COLUMNS_FIELD_DESC = new org.apache.thrift.protocol.TField("sortColumns", org.apache.thrift.protocol.TType.BOOL, (short)8);
+  private static final org.apache.thrift.protocol.TField REVERSED_FIELD_DESC = new org.apache.thrift.protocol.TField("reversed", org.apache.thrift.protocol.TType.BOOL, (short)9);
 
   private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
   static {
@@ -60,6 +61,7 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
   public ByteBuffer filterString; // optional
   public int batchSize; // optional
   public boolean sortColumns; // optional
+  public boolean reversed; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -70,7 +72,8 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     CACHING((short)5, "caching"),
     FILTER_STRING((short)6, "filterString"),
     BATCH_SIZE((short)7, "batchSize"),
-    SORT_COLUMNS((short)8, "sortColumns");
+    SORT_COLUMNS((short)8, "sortColumns"),
+    REVERSED((short)9, "reversed");
 
     private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
 
@@ -101,6 +104,8 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
           return BATCH_SIZE;
         case 8: // SORT_COLUMNS
           return SORT_COLUMNS;
+        case 9: // REVERSED
+          return REVERSED;
         default:
           return null;
       }
@@ -145,8 +150,9 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
   private static final int __CACHING_ISSET_ID = 1;
   private static final int __BATCHSIZE_ISSET_ID = 2;
   private static final int __SORTCOLUMNS_ISSET_ID = 3;
+  private static final int __REVERSED_ISSET_ID = 4;
   private byte __isset_bitfield = 0;
-  private _Fields optionals[] = {_Fields.START_ROW,_Fields.STOP_ROW,_Fields.TIMESTAMP,_Fields.COLUMNS,_Fields.CACHING,_Fields.FILTER_STRING,_Fields.BATCH_SIZE,_Fields.SORT_COLUMNS};
+  private _Fields optionals[] = {_Fields.START_ROW,_Fields.STOP_ROW,_Fields.TIMESTAMP,_Fields.COLUMNS,_Fields.CACHING,_Fields.FILTER_STRING,_Fields.BATCH_SIZE,_Fields.SORT_COLUMNS,_Fields.REVERSED};
   public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -167,6 +173,8 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
     tmpMap.put(_Fields.SORT_COLUMNS, new org.apache.thrift.meta_data.FieldMetaData("sortColumns", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
+    tmpMap.put(_Fields.REVERSED, new org.apache.thrift.meta_data.FieldMetaData("reversed", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
     metaDataMap = Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TScan.class, metaDataMap);
   }
@@ -199,6 +207,7 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     }
     this.batchSize = other.batchSize;
     this.sortColumns = other.sortColumns;
+    this.reversed = other.reversed;
   }
 
   public TScan deepCopy() {
@@ -219,6 +228,8 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     this.batchSize = 0;
     setSortColumnsIsSet(false);
     this.sortColumns = false;
+    setReversedIsSet(false);
+    this.reversed = false;
   }
 
   public byte[] getStartRow() {
@@ -454,6 +465,29 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __SORTCOLUMNS_ISSET_ID, value);
   }
 
+  public boolean isReversed() {
+    return this.reversed;
+  }
+
+  public TScan setReversed(boolean reversed) {
+    this.reversed = reversed;
+    setReversedIsSet(true);
+    return this;
+  }
+
+  public void unsetReversed() {
+    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __REVERSED_ISSET_ID);
+  }
+
+  /** Returns true if field reversed is set (has been assigned a value) and false otherwise */
+  public boolean isSetReversed() {
+    return EncodingUtils.testBit(__isset_bitfield, __REVERSED_ISSET_ID);
+  }
+
+  public void setReversedIsSet(boolean value) {
+    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __REVERSED_ISSET_ID, value);
+  }
+
   public void setFieldValue(_Fields field, Object value) {
     switch (field) {
     case START_ROW:
@@ -520,6 +554,14 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
       }
       break;
 
+    case REVERSED:
+      if (value == null) {
+        unsetReversed();
+      } else {
+        setReversed((Boolean)value);
+      }
+      break;
+
     }
   }
 
@@ -549,6 +591,9 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     case SORT_COLUMNS:
       return Boolean.valueOf(isSortColumns());
 
+    case REVERSED:
+      return Boolean.valueOf(isReversed());
+
     }
     throw new IllegalStateException();
   }
@@ -576,6 +621,8 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
       return isSetBatchSize();
     case SORT_COLUMNS:
       return isSetSortColumns();
+    case REVERSED:
+      return isSetReversed();
     }
     throw new IllegalStateException();
   }
@@ -665,6 +712,15 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
         return false;
     }
 
+    boolean this_present_reversed = true && this.isSetReversed();
+    boolean that_present_reversed = true && that.isSetReversed();
+    if (this_present_reversed || that_present_reversed) {
+      if (!(this_present_reversed && that_present_reversed))
+        return false;
+      if (this.reversed != that.reversed)
+        return false;
+    }
+
     return true;
   }
 
@@ -712,6 +768,11 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     if (present_sortColumns)
       builder.append(sortColumns);
 
+    boolean present_reversed = true && (isSetReversed());
+    builder.append(present_reversed);
+    if (present_reversed)
+      builder.append(reversed);
+
     return builder.toHashCode();
   }
 
@@ -803,6 +864,16 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
         return lastComparison;
       }
     }
+    lastComparison = Boolean.valueOf(isSetReversed()).compareTo(typedOther.isSetReversed());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetReversed()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.reversed, typedOther.reversed);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -886,6 +957,12 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
       sb.append(this.sortColumns);
       first = false;
     }
+    if (isSetReversed()) {
+      if (!first) sb.append(", ");
+      sb.append("reversed:");
+      sb.append(this.reversed);
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -1005,6 +1082,14 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 9: // REVERSED
+            if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
+              struct.reversed = iprot.readBool();
+              struct.setReversedIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -1075,6 +1160,11 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
         oprot.writeBool(struct.sortColumns);
         oprot.writeFieldEnd();
       }
+      if (struct.isSetReversed()) {
+        oprot.writeFieldBegin(REVERSED_FIELD_DESC);
+        oprot.writeBool(struct.reversed);
+        oprot.writeFieldEnd();
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -1117,7 +1207,10 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
       if (struct.isSetSortColumns()) {
         optionals.set(7);
       }
-      oprot.writeBitSet(optionals, 8);
+      if (struct.isSetReversed()) {
+        optionals.set(8);
+      }
+      oprot.writeBitSet(optionals, 9);
       if (struct.isSetStartRow()) {
         oprot.writeBinary(struct.startRow);
       }
@@ -1148,12 +1241,15 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
       if (struct.isSetSortColumns()) {
         oprot.writeBool(struct.sortColumns);
       }
+      if (struct.isSetReversed()) {
+        oprot.writeBool(struct.reversed);
+      }
     }
 
     @Override
     public void read(org.apache.thrift.protocol.TProtocol prot, TScan struct) throws org.apache.thrift.TException {
       TTupleProtocol iprot = (TTupleProtocol) prot;
-      BitSet incoming = iprot.readBitSet(8);
+      BitSet incoming = iprot.readBitSet(9);
       if (incoming.get(0)) {
         struct.startRow = iprot.readBinary();
         struct.setStartRowIsSet(true);
@@ -1195,6 +1291,10 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
         struct.sortColumns = iprot.readBool();
         struct.setSortColumnsIsSet(true);
       }
+      if (incoming.get(8)) {
+        struct.reversed = iprot.readBool();
+        struct.setReversedIsSet(true);
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java
index 3dc0eda..2fb17d5 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java
@@ -421,6 +421,10 @@ public class ThriftUtilities {
       out.setAuthorizations(new Authorizations(in.getAuthorizations().getLabels()));
     }
 
+    if (in.isSetReversed()) {
+      out.setReversed(in.isReversed());
+    }
+
     return out;
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TAppend.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TAppend.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TAppend.java
index 49d0e75..262cb82 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TAppend.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TAppend.java
@@ -770,7 +770,7 @@ public class TAppend implements org.apache.thrift.TBase<TAppend, TAppend._Fields
                 struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map91.size);
                 for (int _i92 = 0; _i92 < _map91.size; ++_i92)
                 {
-                  ByteBuffer _key93; // required
+                  ByteBuffer _key93; // optional
                   ByteBuffer _val94; // required
                   _key93 = iprot.readBinary();
                   _val94 = iprot.readBinary();
@@ -939,7 +939,7 @@ public class TAppend implements org.apache.thrift.TBase<TAppend, TAppend._Fields
           struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map102.size);
           for (int _i103 = 0; _i103 < _map102.size; ++_i103)
           {
-            ByteBuffer _key104; // required
+            ByteBuffer _key104; // optional
             ByteBuffer _val105; // required
             _key104 = iprot.readBinary();
             _val105 = iprot.readBinary();

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TDelete.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TDelete.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TDelete.java
index a4d7777..abbad1c 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TDelete.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TDelete.java
@@ -906,7 +906,7 @@ public class TDelete implements org.apache.thrift.TBase<TDelete, TDelete._Fields
                 struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map55.size);
                 for (int _i56 = 0; _i56 < _map55.size; ++_i56)
                 {
-                  ByteBuffer _key57; // required
+                  ByteBuffer _key57; // optional
                   ByteBuffer _val58; // required
                   _key57 = iprot.readBinary();
                   _val58 = iprot.readBinary();
@@ -1094,7 +1094,7 @@ public class TDelete implements org.apache.thrift.TBase<TDelete, TDelete._Fields
           struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map66.size);
           for (int _i67 = 0; _i67 < _map66.size; ++_i67)
           {
-            ByteBuffer _key68; // required
+            ByteBuffer _key68; // optional
             ByteBuffer _val69; // required
             _key68 = iprot.readBinary();
             _val69 = iprot.readBinary();

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TGet.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TGet.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TGet.java
index 7e93341..8e242b2 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TGet.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TGet.java
@@ -1051,7 +1051,7 @@ public class TGet implements org.apache.thrift.TBase<TGet, TGet._Fields>, java.i
                 struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map19.size);
                 for (int _i20 = 0; _i20 < _map19.size; ++_i20)
                 {
-                  ByteBuffer _key21; // required
+                  ByteBuffer _key21; // optional
                   ByteBuffer _val22; // required
                   _key21 = iprot.readBinary();
                   _val22 = iprot.readBinary();
@@ -1273,7 +1273,7 @@ public class TGet implements org.apache.thrift.TBase<TGet, TGet._Fields>, java.i
           struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map30.size);
           for (int _i31 = 0; _i31 < _map30.size; ++_i31)
           {
-            ByteBuffer _key32; // required
+            ByteBuffer _key32; // optional
             ByteBuffer _val33; // required
             _key32 = iprot.readBinary();
             _val33 = iprot.readBinary();

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TIncrement.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TIncrement.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TIncrement.java
index 358a9fc..90345aa 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TIncrement.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TIncrement.java
@@ -777,7 +777,7 @@ public class TIncrement implements org.apache.thrift.TBase<TIncrement, TIncremen
                 struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map73.size);
                 for (int _i74 = 0; _i74 < _map73.size; ++_i74)
                 {
-                  ByteBuffer _key75; // required
+                  ByteBuffer _key75; // optional
                   ByteBuffer _val76; // required
                   _key75 = iprot.readBinary();
                   _val76 = iprot.readBinary();
@@ -946,7 +946,7 @@ public class TIncrement implements org.apache.thrift.TBase<TIncrement, TIncremen
           struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map84.size);
           for (int _i85 = 0; _i85 < _map84.size; ++_i85)
           {
-            ByteBuffer _key86; // required
+            ByteBuffer _key86; // optional
             ByteBuffer _val87; // required
             _key86 = iprot.readBinary();
             _val87 = iprot.readBinary();

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TPut.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TPut.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TPut.java
index c9a122c..62ddffb 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TPut.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TPut.java
@@ -871,7 +871,7 @@ public class TPut implements org.apache.thrift.TBase<TPut, TPut._Fields>, java.i
                 struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map37.size);
                 for (int _i38 = 0; _i38 < _map37.size; ++_i38)
                 {
-                  ByteBuffer _key39; // required
+                  ByteBuffer _key39; // optional
                   ByteBuffer _val40; // required
                   _key39 = iprot.readBinary();
                   _val40 = iprot.readBinary();
@@ -1055,7 +1055,7 @@ public class TPut implements org.apache.thrift.TBase<TPut, TPut._Fields>, java.i
           struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map48.size);
           for (int _i49 = 0; _i49 < _map48.size; ++_i49)
           {
-            ByteBuffer _key50; // required
+            ByteBuffer _key50; // optional
             ByteBuffer _val51; // required
             _key50 = iprot.readBinary();
             _val51 = iprot.readBinary();

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TScan.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TScan.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TScan.java
index 542d068..0486b6b 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TScan.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/generated/TScan.java
@@ -48,6 +48,7 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
   private static final org.apache.thrift.protocol.TField BATCH_SIZE_FIELD_DESC = new org.apache.thrift.protocol.TField("batchSize", org.apache.thrift.protocol.TType.I32, (short)8);
   private static final org.apache.thrift.protocol.TField ATTRIBUTES_FIELD_DESC = new org.apache.thrift.protocol.TField("attributes", org.apache.thrift.protocol.TType.MAP, (short)9);
   private static final org.apache.thrift.protocol.TField AUTHORIZATIONS_FIELD_DESC = new org.apache.thrift.protocol.TField("authorizations", org.apache.thrift.protocol.TType.STRUCT, (short)10);
+  private static final org.apache.thrift.protocol.TField REVERSED_FIELD_DESC = new org.apache.thrift.protocol.TField("reversed", org.apache.thrift.protocol.TType.BOOL, (short)11);
 
   private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
   static {
@@ -65,6 +66,7 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
   public int batchSize; // optional
   public Map<ByteBuffer,ByteBuffer> attributes; // optional
   public TAuthorization authorizations; // optional
+  public boolean reversed; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -77,7 +79,8 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     FILTER_STRING((short)7, "filterString"),
     BATCH_SIZE((short)8, "batchSize"),
     ATTRIBUTES((short)9, "attributes"),
-    AUTHORIZATIONS((short)10, "authorizations");
+    AUTHORIZATIONS((short)10, "authorizations"),
+    REVERSED((short)11, "reversed");
 
     private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
 
@@ -112,6 +115,8 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
           return ATTRIBUTES;
         case 10: // AUTHORIZATIONS
           return AUTHORIZATIONS;
+        case 11: // REVERSED
+          return REVERSED;
         default:
           return null;
       }
@@ -155,8 +160,9 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
   private static final int __CACHING_ISSET_ID = 0;
   private static final int __MAXVERSIONS_ISSET_ID = 1;
   private static final int __BATCHSIZE_ISSET_ID = 2;
+  private static final int __REVERSED_ISSET_ID = 3;
   private byte __isset_bitfield = 0;
-  private _Fields optionals[] = {_Fields.START_ROW,_Fields.STOP_ROW,_Fields.COLUMNS,_Fields.CACHING,_Fields.MAX_VERSIONS,_Fields.TIME_RANGE,_Fields.FILTER_STRING,_Fields.BATCH_SIZE,_Fields.ATTRIBUTES,_Fields.AUTHORIZATIONS};
+  private _Fields optionals[] = {_Fields.START_ROW,_Fields.STOP_ROW,_Fields.COLUMNS,_Fields.CACHING,_Fields.MAX_VERSIONS,_Fields.TIME_RANGE,_Fields.FILTER_STRING,_Fields.BATCH_SIZE,_Fields.ATTRIBUTES,_Fields.AUTHORIZATIONS,_Fields.REVERSED};
   public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -183,6 +189,8 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
             new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING            , true))));
     tmpMap.put(_Fields.AUTHORIZATIONS, new org.apache.thrift.meta_data.FieldMetaData("authorizations", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, TAuthorization.class)));
+    tmpMap.put(_Fields.REVERSED, new org.apache.thrift.meta_data.FieldMetaData("reversed", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
     metaDataMap = Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TScan.class, metaDataMap);
   }
@@ -242,6 +250,7 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     if (other.isSetAuthorizations()) {
       this.authorizations = new TAuthorization(other.authorizations);
     }
+    this.reversed = other.reversed;
   }
 
   public TScan deepCopy() {
@@ -263,6 +272,8 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     this.batchSize = 0;
     this.attributes = null;
     this.authorizations = null;
+    setReversedIsSet(false);
+    this.reversed = false;
   }
 
   public byte[] getStartRow() {
@@ -558,6 +569,29 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     }
   }
 
+  public boolean isReversed() {
+    return this.reversed;
+  }
+
+  public TScan setReversed(boolean reversed) {
+    this.reversed = reversed;
+    setReversedIsSet(true);
+    return this;
+  }
+
+  public void unsetReversed() {
+    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __REVERSED_ISSET_ID);
+  }
+
+  /** Returns true if field reversed is set (has been assigned a value) and false otherwise */
+  public boolean isSetReversed() {
+    return EncodingUtils.testBit(__isset_bitfield, __REVERSED_ISSET_ID);
+  }
+
+  public void setReversedIsSet(boolean value) {
+    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __REVERSED_ISSET_ID, value);
+  }
+
   public void setFieldValue(_Fields field, Object value) {
     switch (field) {
     case START_ROW:
@@ -640,6 +674,14 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
       }
       break;
 
+    case REVERSED:
+      if (value == null) {
+        unsetReversed();
+      } else {
+        setReversed((Boolean)value);
+      }
+      break;
+
     }
   }
 
@@ -675,6 +717,9 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     case AUTHORIZATIONS:
       return getAuthorizations();
 
+    case REVERSED:
+      return Boolean.valueOf(isReversed());
+
     }
     throw new IllegalStateException();
   }
@@ -706,6 +751,8 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
       return isSetAttributes();
     case AUTHORIZATIONS:
       return isSetAuthorizations();
+    case REVERSED:
+      return isSetReversed();
     }
     throw new IllegalStateException();
   }
@@ -813,6 +860,15 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
         return false;
     }
 
+    boolean this_present_reversed = true && this.isSetReversed();
+    boolean that_present_reversed = true && that.isSetReversed();
+    if (this_present_reversed || that_present_reversed) {
+      if (!(this_present_reversed && that_present_reversed))
+        return false;
+      if (this.reversed != that.reversed)
+        return false;
+    }
+
     return true;
   }
 
@@ -870,6 +926,11 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
     if (present_authorizations)
       builder.append(authorizations);
 
+    boolean present_reversed = true && (isSetReversed());
+    builder.append(present_reversed);
+    if (present_reversed)
+      builder.append(reversed);
+
     return builder.toHashCode();
   }
 
@@ -981,6 +1042,16 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
         return lastComparison;
       }
     }
+    lastComparison = Boolean.valueOf(isSetReversed()).compareTo(typedOther.isSetReversed());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetReversed()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.reversed, typedOther.reversed);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -1088,6 +1159,12 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
       }
       first = false;
     }
+    if (isSetReversed()) {
+      if (!first) sb.append(", ");
+      sb.append("reversed:");
+      sb.append(this.reversed);
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -1222,7 +1299,7 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
                 struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map109.size);
                 for (int _i110 = 0; _i110 < _map109.size; ++_i110)
                 {
-                  ByteBuffer _key111; // required
+                  ByteBuffer _key111; // optional
                   ByteBuffer _val112; // required
                   _key111 = iprot.readBinary();
                   _val112 = iprot.readBinary();
@@ -1244,6 +1321,14 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 11: // REVERSED
+            if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
+              struct.reversed = iprot.readBool();
+              struct.setReversedIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -1338,6 +1423,11 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
           oprot.writeFieldEnd();
         }
       }
+      if (struct.isSetReversed()) {
+        oprot.writeFieldBegin(REVERSED_FIELD_DESC);
+        oprot.writeBool(struct.reversed);
+        oprot.writeFieldEnd();
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -1386,7 +1476,10 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
       if (struct.isSetAuthorizations()) {
         optionals.set(9);
       }
-      oprot.writeBitSet(optionals, 10);
+      if (struct.isSetReversed()) {
+        optionals.set(10);
+      }
+      oprot.writeBitSet(optionals, 11);
       if (struct.isSetStartRow()) {
         oprot.writeBinary(struct.startRow);
       }
@@ -1430,12 +1523,15 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
       if (struct.isSetAuthorizations()) {
         struct.authorizations.write(oprot);
       }
+      if (struct.isSetReversed()) {
+        oprot.writeBool(struct.reversed);
+      }
     }
 
     @Override
     public void read(org.apache.thrift.protocol.TProtocol prot, TScan struct) throws org.apache.thrift.TException {
       TTupleProtocol iprot = (TTupleProtocol) prot;
-      BitSet incoming = iprot.readBitSet(10);
+      BitSet incoming = iprot.readBitSet(11);
       if (incoming.get(0)) {
         struct.startRow = iprot.readBinary();
         struct.setStartRowIsSet(true);
@@ -1485,7 +1581,7 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
           struct.attributes = new HashMap<ByteBuffer,ByteBuffer>(2*_map120.size);
           for (int _i121 = 0; _i121 < _map120.size; ++_i121)
           {
-            ByteBuffer _key122; // required
+            ByteBuffer _key122; // optional
             ByteBuffer _val123; // required
             _key122 = iprot.readBinary();
             _val123 = iprot.readBinary();
@@ -1499,6 +1595,10 @@ public class TScan implements org.apache.thrift.TBase<TScan, TScan._Fields>, jav
         struct.authorizations.read(iprot);
         struct.setAuthorizationsIsSet(true);
       }
+      if (incoming.get(10)) {
+        struct.reversed = iprot.readBool();
+        struct.setReversedIsSet(true);
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift b/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
index 9fe6468..f2d264a 100644
--- a/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
+++ b/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
@@ -149,7 +149,8 @@ struct TScan {
   5:optional i32 caching,
   6:optional Text filterString,
   7:optional i32 batchSize,
-  8:optional bool sortColumns
+  8:optional bool sortColumns,
+  9:optional bool reversed 
 }
 
 //

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift b/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift
index 4a8ac1b..7c6d6a2 100644
--- a/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift
+++ b/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift
@@ -223,6 +223,7 @@ struct TScan {
   8: optional i32 batchSize,
   9: optional map<binary, binary> attributes
   10: optional TAuthorization authorizations
+  11: optional bool reversed
 }
 
 /**

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java
index b59e967..ba6bc6d 100644
--- a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java
+++ b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java
@@ -556,6 +556,17 @@ public class TestThriftServer {
       smallerColumn = currentColumn;
     }
 
+    TScan reversedScan = new TScan();
+    reversedScan.setReversed(true);
+    reversedScan.setStartRow(rowBname);
+    reversedScan.setStopRow(rowAname);
+
+    int scanner8 = handler.scannerOpenWithScan(tableAname , reversedScan, null);
+    List<TRowResult> results = handler.scannerGet(scanner8);
+    handler.scannerClose(scanner8);
+    assertEquals(results.size(), 1);
+    assertEquals(ByteBuffer.wrap(results.get(0).getRow()), rowBname);
+
     // Teardown
     handler.disableTable(tableAname);
     handler.deleteTable(tableAname);

http://git-wip-us.apache.org/repos/asf/hbase/blob/9c178421/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java
index db05c8d..5227df4 100644
--- a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java
+++ b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java
@@ -583,6 +583,55 @@ public class TestThriftHBaseServiceHandler {
   }
 
   @Test
+  public void testReverseScan() throws Exception {
+    ThriftHBaseServiceHandler handler = createHandler();
+    ByteBuffer table = wrap(tableAname);
+
+    // insert data
+    TColumnValue columnValue = new TColumnValue(wrap(familyAname), wrap(qualifierAname),
+      wrap(valueAname));
+    List<TColumnValue> columnValues = new ArrayList<TColumnValue>();
+    columnValues.add(columnValue);
+    for (int i = 0; i < 10; i++) {
+      TPut put = new TPut(wrap(("testReverseScan" + i).getBytes()), columnValues);
+      handler.put(table, put);
+    }
+
+    // create reverse scan instance
+    TScan scan = new TScan();
+    scan.setReversed(true);
+    List<TColumn> columns = new ArrayList<TColumn>();
+    TColumn column = new TColumn();
+    column.setFamily(familyAname);
+    column.setQualifier(qualifierAname);
+    columns.add(column);
+    scan.setColumns(columns);
+    scan.setStartRow("testReverseScan\uffff".getBytes());
+    scan.setStopRow("testReverseScan".getBytes());
+
+    // get scanner and rows
+    int scanId = handler.openScanner(table, scan);
+    List<TResult> results = handler.getScannerRows(scanId, 10);
+    assertEquals(10, results.size());
+    for (int i = 0; i < 10; i++) {
+      // check if the rows are returned and in order
+      assertArrayEquals(("testReverseScan" + (9 - i)).getBytes(), results.get(i).getRow());
+    }
+
+    // check that we are at the end of the scan
+    results = handler.getScannerRows(scanId, 10);
+    assertEquals(0, results.size());
+
+    // close scanner and check that it was indeed closed
+    handler.closeScanner(scanId);
+    try {
+      handler.getScannerRows(scanId, 10);
+      fail("Scanner id should be invalid");
+    } catch (TIllegalArgument e) {
+    }
+  }
+
+  @Test
   public void testScanWithFilter() throws Exception {
     ThriftHBaseServiceHandler handler = createHandler();
     ByteBuffer table = wrap(tableAname);
@@ -761,6 +810,20 @@ public class TestThriftHBaseServiceHandler {
       assertArrayEquals(("testGetScannerResults" + pad(i, (byte) 2)).getBytes(), results.get(i)
           .getRow());
     }
+
+    // reverse scan
+    scan = new TScan();
+    scan.setColumns(columns);
+    scan.setReversed(true);
+    scan.setStartRow("testGetScannerResults20".getBytes());
+    scan.setStopRow("testGetScannerResults".getBytes());
+    results = handler.getScannerResults(table, scan, 20);
+    assertEquals(20, results.size());
+    for (int i = 0; i < 20; i++) {
+      // check if the rows are returned and in order
+      assertArrayEquals(("testGetScannerResults" + pad(19 - i, (byte) 2)).getBytes(), results.get(i)
+          .getRow());
+    }
  }
 
   @Test