You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by se...@apache.org on 2016/10/17 20:42:46 UTC

[54/67] [abbrv] hive git commit: HIVE-11957 : Add StartedTime and LastHeartbeatTime columns to SHOW TRANSACTIONS output (Wei Zheng, reviewed by Eugene Koifman)

HIVE-11957 : Add StartedTime and LastHeartbeatTime columns to SHOW TRANSACTIONS output (Wei Zheng, reviewed by Eugene Koifman)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/36bdbcc1
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/36bdbcc1
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/36bdbcc1

Branch: refs/heads/hive-14535
Commit: 36bdbcc18e6efa017a28248eb5caef1bf5cfde00
Parents: 1901e3a
Author: Wei Zheng <we...@apache.org>
Authored: Sun Oct 16 14:28:15 2016 -0700
Committer: Wei Zheng <we...@apache.org>
Committed: Sun Oct 16 14:28:15 2016 -0700

----------------------------------------------------------------------
 metastore/if/hive_metastore.thrift              |   2 +
 .../gen/thrift/gen-cpp/hive_metastore_types.cpp |  44 ++++
 .../gen/thrift/gen-cpp/hive_metastore_types.h   |  20 +-
 .../hadoop/hive/metastore/api/TxnInfo.java      | 206 ++++++++++++++++++-
 .../src/gen/thrift/gen-php/metastore/Types.php  |  46 +++++
 .../gen/thrift/gen-py/hive_metastore/ttypes.py  |  28 ++-
 .../gen/thrift/gen-rb/hive_metastore_types.rb   |   6 +-
 .../hadoop/hive/metastore/txn/TxnHandler.java   |  12 +-
 .../org/apache/hadoop/hive/ql/exec/DDLTask.java |   8 +
 .../hadoop/hive/ql/plan/ShowTxnsDesc.java       |   2 +-
 .../clientpositive/dbtxnmgr_showlocks.q.out     |   2 +-
 11 files changed, 362 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/36bdbcc1/metastore/if/hive_metastore.thrift
----------------------------------------------------------------------
diff --git a/metastore/if/hive_metastore.thrift b/metastore/if/hive_metastore.thrift
index c5ba309..9f6ef91 100755
--- a/metastore/if/hive_metastore.thrift
+++ b/metastore/if/hive_metastore.thrift
@@ -625,6 +625,8 @@ struct TxnInfo {
     5: optional string agentInfo = "Unknown",
     6: optional i32 heartbeatCount=0,
     7: optional string metaInfo,
+    8: optional i64 startedTime,
+    9: optional i64 lastHeartbeatTime,
 }
 
 struct GetOpenTxnsInfoResponse {

http://git-wip-us.apache.org/repos/asf/hive/blob/36bdbcc1/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp
----------------------------------------------------------------------
diff --git a/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp b/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp
index 174b539..89541fa 100644
--- a/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp
+++ b/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp
@@ -11579,6 +11579,16 @@ void TxnInfo::__set_metaInfo(const std::string& val) {
 __isset.metaInfo = true;
 }
 
+void TxnInfo::__set_startedTime(const int64_t val) {
+  this->startedTime = val;
+__isset.startedTime = true;
+}
+
+void TxnInfo::__set_lastHeartbeatTime(const int64_t val) {
+  this->lastHeartbeatTime = val;
+__isset.lastHeartbeatTime = true;
+}
+
 uint32_t TxnInfo::read(::apache::thrift::protocol::TProtocol* iprot) {
 
   apache::thrift::protocol::TInputRecursionTracker tracker(*iprot);
@@ -11662,6 +11672,22 @@ uint32_t TxnInfo::read(::apache::thrift::protocol::TProtocol* iprot) {
           xfer += iprot->skip(ftype);
         }
         break;
+      case 8:
+        if (ftype == ::apache::thrift::protocol::T_I64) {
+          xfer += iprot->readI64(this->startedTime);
+          this->__isset.startedTime = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
+      case 9:
+        if (ftype == ::apache::thrift::protocol::T_I64) {
+          xfer += iprot->readI64(this->lastHeartbeatTime);
+          this->__isset.lastHeartbeatTime = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
       default:
         xfer += iprot->skip(ftype);
         break;
@@ -11718,6 +11744,16 @@ uint32_t TxnInfo::write(::apache::thrift::protocol::TProtocol* oprot) const {
     xfer += oprot->writeString(this->metaInfo);
     xfer += oprot->writeFieldEnd();
   }
+  if (this->__isset.startedTime) {
+    xfer += oprot->writeFieldBegin("startedTime", ::apache::thrift::protocol::T_I64, 8);
+    xfer += oprot->writeI64(this->startedTime);
+    xfer += oprot->writeFieldEnd();
+  }
+  if (this->__isset.lastHeartbeatTime) {
+    xfer += oprot->writeFieldBegin("lastHeartbeatTime", ::apache::thrift::protocol::T_I64, 9);
+    xfer += oprot->writeI64(this->lastHeartbeatTime);
+    xfer += oprot->writeFieldEnd();
+  }
   xfer += oprot->writeFieldStop();
   xfer += oprot->writeStructEnd();
   return xfer;
@@ -11732,6 +11768,8 @@ void swap(TxnInfo &a, TxnInfo &b) {
   swap(a.agentInfo, b.agentInfo);
   swap(a.heartbeatCount, b.heartbeatCount);
   swap(a.metaInfo, b.metaInfo);
+  swap(a.startedTime, b.startedTime);
+  swap(a.lastHeartbeatTime, b.lastHeartbeatTime);
   swap(a.__isset, b.__isset);
 }
 
@@ -11743,6 +11781,8 @@ TxnInfo::TxnInfo(const TxnInfo& other507) {
   agentInfo = other507.agentInfo;
   heartbeatCount = other507.heartbeatCount;
   metaInfo = other507.metaInfo;
+  startedTime = other507.startedTime;
+  lastHeartbeatTime = other507.lastHeartbeatTime;
   __isset = other507.__isset;
 }
 TxnInfo& TxnInfo::operator=(const TxnInfo& other508) {
@@ -11753,6 +11793,8 @@ TxnInfo& TxnInfo::operator=(const TxnInfo& other508) {
   agentInfo = other508.agentInfo;
   heartbeatCount = other508.heartbeatCount;
   metaInfo = other508.metaInfo;
+  startedTime = other508.startedTime;
+  lastHeartbeatTime = other508.lastHeartbeatTime;
   __isset = other508.__isset;
   return *this;
 }
@@ -11766,6 +11808,8 @@ void TxnInfo::printTo(std::ostream& out) const {
   out << ", " << "agentInfo="; (__isset.agentInfo ? (out << to_string(agentInfo)) : (out << "<null>"));
   out << ", " << "heartbeatCount="; (__isset.heartbeatCount ? (out << to_string(heartbeatCount)) : (out << "<null>"));
   out << ", " << "metaInfo="; (__isset.metaInfo ? (out << to_string(metaInfo)) : (out << "<null>"));
+  out << ", " << "startedTime="; (__isset.startedTime ? (out << to_string(startedTime)) : (out << "<null>"));
+  out << ", " << "lastHeartbeatTime="; (__isset.lastHeartbeatTime ? (out << to_string(lastHeartbeatTime)) : (out << "<null>"));
   out << ")";
 }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/36bdbcc1/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h
----------------------------------------------------------------------
diff --git a/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h b/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h
index bfec694..303c298 100644
--- a/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h
+++ b/metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h
@@ -4753,10 +4753,12 @@ inline std::ostream& operator<<(std::ostream& out, const Function& obj)
 }
 
 typedef struct _TxnInfo__isset {
-  _TxnInfo__isset() : agentInfo(true), heartbeatCount(true), metaInfo(false) {}
+  _TxnInfo__isset() : agentInfo(true), heartbeatCount(true), metaInfo(false), startedTime(false), lastHeartbeatTime(false) {}
   bool agentInfo :1;
   bool heartbeatCount :1;
   bool metaInfo :1;
+  bool startedTime :1;
+  bool lastHeartbeatTime :1;
 } _TxnInfo__isset;
 
 class TxnInfo {
@@ -4764,7 +4766,7 @@ class TxnInfo {
 
   TxnInfo(const TxnInfo&);
   TxnInfo& operator=(const TxnInfo&);
-  TxnInfo() : id(0), state((TxnState::type)0), user(), hostname(), agentInfo("Unknown"), heartbeatCount(0), metaInfo() {
+  TxnInfo() : id(0), state((TxnState::type)0), user(), hostname(), agentInfo("Unknown"), heartbeatCount(0), metaInfo(), startedTime(0), lastHeartbeatTime(0) {
   }
 
   virtual ~TxnInfo() throw();
@@ -4775,6 +4777,8 @@ class TxnInfo {
   std::string agentInfo;
   int32_t heartbeatCount;
   std::string metaInfo;
+  int64_t startedTime;
+  int64_t lastHeartbeatTime;
 
   _TxnInfo__isset __isset;
 
@@ -4792,6 +4796,10 @@ class TxnInfo {
 
   void __set_metaInfo(const std::string& val);
 
+  void __set_startedTime(const int64_t val);
+
+  void __set_lastHeartbeatTime(const int64_t val);
+
   bool operator == (const TxnInfo & rhs) const
   {
     if (!(id == rhs.id))
@@ -4814,6 +4822,14 @@ class TxnInfo {
       return false;
     else if (__isset.metaInfo && !(metaInfo == rhs.metaInfo))
       return false;
+    if (__isset.startedTime != rhs.__isset.startedTime)
+      return false;
+    else if (__isset.startedTime && !(startedTime == rhs.startedTime))
+      return false;
+    if (__isset.lastHeartbeatTime != rhs.__isset.lastHeartbeatTime)
+      return false;
+    else if (__isset.lastHeartbeatTime && !(lastHeartbeatTime == rhs.lastHeartbeatTime))
+      return false;
     return true;
   }
   bool operator != (const TxnInfo &rhs) const {

http://git-wip-us.apache.org/repos/asf/hive/blob/36bdbcc1/metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/TxnInfo.java
----------------------------------------------------------------------
diff --git a/metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/TxnInfo.java b/metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/TxnInfo.java
index 9c56ee3..ed382ed 100644
--- a/metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/TxnInfo.java
+++ b/metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/TxnInfo.java
@@ -45,6 +45,8 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
   private static final org.apache.thrift.protocol.TField AGENT_INFO_FIELD_DESC = new org.apache.thrift.protocol.TField("agentInfo", org.apache.thrift.protocol.TType.STRING, (short)5);
   private static final org.apache.thrift.protocol.TField HEARTBEAT_COUNT_FIELD_DESC = new org.apache.thrift.protocol.TField("heartbeatCount", org.apache.thrift.protocol.TType.I32, (short)6);
   private static final org.apache.thrift.protocol.TField META_INFO_FIELD_DESC = new org.apache.thrift.protocol.TField("metaInfo", org.apache.thrift.protocol.TType.STRING, (short)7);
+  private static final org.apache.thrift.protocol.TField STARTED_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("startedTime", org.apache.thrift.protocol.TType.I64, (short)8);
+  private static final org.apache.thrift.protocol.TField LAST_HEARTBEAT_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("lastHeartbeatTime", org.apache.thrift.protocol.TType.I64, (short)9);
 
   private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
   static {
@@ -59,6 +61,8 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
   private String agentInfo; // optional
   private int heartbeatCount; // optional
   private String metaInfo; // optional
+  private long startedTime; // optional
+  private long lastHeartbeatTime; // 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 {
@@ -72,7 +76,9 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
     HOSTNAME((short)4, "hostname"),
     AGENT_INFO((short)5, "agentInfo"),
     HEARTBEAT_COUNT((short)6, "heartbeatCount"),
-    META_INFO((short)7, "metaInfo");
+    META_INFO((short)7, "metaInfo"),
+    STARTED_TIME((short)8, "startedTime"),
+    LAST_HEARTBEAT_TIME((short)9, "lastHeartbeatTime");
 
     private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
 
@@ -101,6 +107,10 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
           return HEARTBEAT_COUNT;
         case 7: // META_INFO
           return META_INFO;
+        case 8: // STARTED_TIME
+          return STARTED_TIME;
+        case 9: // LAST_HEARTBEAT_TIME
+          return LAST_HEARTBEAT_TIME;
         default:
           return null;
       }
@@ -143,8 +153,10 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
   // isset id assignments
   private static final int __ID_ISSET_ID = 0;
   private static final int __HEARTBEATCOUNT_ISSET_ID = 1;
+  private static final int __STARTEDTIME_ISSET_ID = 2;
+  private static final int __LASTHEARTBEATTIME_ISSET_ID = 3;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.AGENT_INFO,_Fields.HEARTBEAT_COUNT,_Fields.META_INFO};
+  private static final _Fields optionals[] = {_Fields.AGENT_INFO,_Fields.HEARTBEAT_COUNT,_Fields.META_INFO,_Fields.STARTED_TIME,_Fields.LAST_HEARTBEAT_TIME};
   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);
@@ -162,6 +174,10 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
     tmpMap.put(_Fields.META_INFO, new org.apache.thrift.meta_data.FieldMetaData("metaInfo", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.STARTED_TIME, new org.apache.thrift.meta_data.FieldMetaData("startedTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+    tmpMap.put(_Fields.LAST_HEARTBEAT_TIME, new org.apache.thrift.meta_data.FieldMetaData("lastHeartbeatTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     metaDataMap = Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TxnInfo.class, metaDataMap);
   }
@@ -209,6 +225,8 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
     if (other.isSetMetaInfo()) {
       this.metaInfo = other.metaInfo;
     }
+    this.startedTime = other.startedTime;
+    this.lastHeartbeatTime = other.lastHeartbeatTime;
   }
 
   public TxnInfo deepCopy() {
@@ -227,6 +245,10 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
     this.heartbeatCount = 0;
 
     this.metaInfo = null;
+    setStartedTimeIsSet(false);
+    this.startedTime = 0;
+    setLastHeartbeatTimeIsSet(false);
+    this.lastHeartbeatTime = 0;
   }
 
   public long getId() {
@@ -396,6 +418,50 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
     }
   }
 
+  public long getStartedTime() {
+    return this.startedTime;
+  }
+
+  public void setStartedTime(long startedTime) {
+    this.startedTime = startedTime;
+    setStartedTimeIsSet(true);
+  }
+
+  public void unsetStartedTime() {
+    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __STARTEDTIME_ISSET_ID);
+  }
+
+  /** Returns true if field startedTime is set (has been assigned a value) and false otherwise */
+  public boolean isSetStartedTime() {
+    return EncodingUtils.testBit(__isset_bitfield, __STARTEDTIME_ISSET_ID);
+  }
+
+  public void setStartedTimeIsSet(boolean value) {
+    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __STARTEDTIME_ISSET_ID, value);
+  }
+
+  public long getLastHeartbeatTime() {
+    return this.lastHeartbeatTime;
+  }
+
+  public void setLastHeartbeatTime(long lastHeartbeatTime) {
+    this.lastHeartbeatTime = lastHeartbeatTime;
+    setLastHeartbeatTimeIsSet(true);
+  }
+
+  public void unsetLastHeartbeatTime() {
+    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __LASTHEARTBEATTIME_ISSET_ID);
+  }
+
+  /** Returns true if field lastHeartbeatTime is set (has been assigned a value) and false otherwise */
+  public boolean isSetLastHeartbeatTime() {
+    return EncodingUtils.testBit(__isset_bitfield, __LASTHEARTBEATTIME_ISSET_ID);
+  }
+
+  public void setLastHeartbeatTimeIsSet(boolean value) {
+    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __LASTHEARTBEATTIME_ISSET_ID, value);
+  }
+
   public void setFieldValue(_Fields field, Object value) {
     switch (field) {
     case ID:
@@ -454,6 +520,22 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
       }
       break;
 
+    case STARTED_TIME:
+      if (value == null) {
+        unsetStartedTime();
+      } else {
+        setStartedTime((Long)value);
+      }
+      break;
+
+    case LAST_HEARTBEAT_TIME:
+      if (value == null) {
+        unsetLastHeartbeatTime();
+      } else {
+        setLastHeartbeatTime((Long)value);
+      }
+      break;
+
     }
   }
 
@@ -480,6 +562,12 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
     case META_INFO:
       return getMetaInfo();
 
+    case STARTED_TIME:
+      return getStartedTime();
+
+    case LAST_HEARTBEAT_TIME:
+      return getLastHeartbeatTime();
+
     }
     throw new IllegalStateException();
   }
@@ -505,6 +593,10 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
       return isSetHeartbeatCount();
     case META_INFO:
       return isSetMetaInfo();
+    case STARTED_TIME:
+      return isSetStartedTime();
+    case LAST_HEARTBEAT_TIME:
+      return isSetLastHeartbeatTime();
     }
     throw new IllegalStateException();
   }
@@ -585,6 +677,24 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
         return false;
     }
 
+    boolean this_present_startedTime = true && this.isSetStartedTime();
+    boolean that_present_startedTime = true && that.isSetStartedTime();
+    if (this_present_startedTime || that_present_startedTime) {
+      if (!(this_present_startedTime && that_present_startedTime))
+        return false;
+      if (this.startedTime != that.startedTime)
+        return false;
+    }
+
+    boolean this_present_lastHeartbeatTime = true && this.isSetLastHeartbeatTime();
+    boolean that_present_lastHeartbeatTime = true && that.isSetLastHeartbeatTime();
+    if (this_present_lastHeartbeatTime || that_present_lastHeartbeatTime) {
+      if (!(this_present_lastHeartbeatTime && that_present_lastHeartbeatTime))
+        return false;
+      if (this.lastHeartbeatTime != that.lastHeartbeatTime)
+        return false;
+    }
+
     return true;
   }
 
@@ -627,6 +737,16 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
     if (present_metaInfo)
       list.add(metaInfo);
 
+    boolean present_startedTime = true && (isSetStartedTime());
+    list.add(present_startedTime);
+    if (present_startedTime)
+      list.add(startedTime);
+
+    boolean present_lastHeartbeatTime = true && (isSetLastHeartbeatTime());
+    list.add(present_lastHeartbeatTime);
+    if (present_lastHeartbeatTime)
+      list.add(lastHeartbeatTime);
+
     return list.hashCode();
   }
 
@@ -708,6 +828,26 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
         return lastComparison;
       }
     }
+    lastComparison = Boolean.valueOf(isSetStartedTime()).compareTo(other.isSetStartedTime());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetStartedTime()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.startedTime, other.startedTime);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = Boolean.valueOf(isSetLastHeartbeatTime()).compareTo(other.isSetLastHeartbeatTime());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetLastHeartbeatTime()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.lastHeartbeatTime, other.lastHeartbeatTime);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -781,6 +921,18 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
       }
       first = false;
     }
+    if (isSetStartedTime()) {
+      if (!first) sb.append(", ");
+      sb.append("startedTime:");
+      sb.append(this.startedTime);
+      first = false;
+    }
+    if (isSetLastHeartbeatTime()) {
+      if (!first) sb.append(", ");
+      sb.append("lastHeartbeatTime:");
+      sb.append(this.lastHeartbeatTime);
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -898,6 +1050,22 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 8: // STARTED_TIME
+            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
+              struct.startedTime = iprot.readI64();
+              struct.setStartedTimeIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 9: // LAST_HEARTBEAT_TIME
+            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
+              struct.lastHeartbeatTime = iprot.readI64();
+              struct.setLastHeartbeatTimeIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -948,6 +1116,16 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
           oprot.writeFieldEnd();
         }
       }
+      if (struct.isSetStartedTime()) {
+        oprot.writeFieldBegin(STARTED_TIME_FIELD_DESC);
+        oprot.writeI64(struct.startedTime);
+        oprot.writeFieldEnd();
+      }
+      if (struct.isSetLastHeartbeatTime()) {
+        oprot.writeFieldBegin(LAST_HEARTBEAT_TIME_FIELD_DESC);
+        oprot.writeI64(struct.lastHeartbeatTime);
+        oprot.writeFieldEnd();
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -979,7 +1157,13 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
       if (struct.isSetMetaInfo()) {
         optionals.set(2);
       }
-      oprot.writeBitSet(optionals, 3);
+      if (struct.isSetStartedTime()) {
+        optionals.set(3);
+      }
+      if (struct.isSetLastHeartbeatTime()) {
+        optionals.set(4);
+      }
+      oprot.writeBitSet(optionals, 5);
       if (struct.isSetAgentInfo()) {
         oprot.writeString(struct.agentInfo);
       }
@@ -989,6 +1173,12 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
       if (struct.isSetMetaInfo()) {
         oprot.writeString(struct.metaInfo);
       }
+      if (struct.isSetStartedTime()) {
+        oprot.writeI64(struct.startedTime);
+      }
+      if (struct.isSetLastHeartbeatTime()) {
+        oprot.writeI64(struct.lastHeartbeatTime);
+      }
     }
 
     @Override
@@ -1002,7 +1192,7 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
       struct.setUserIsSet(true);
       struct.hostname = iprot.readString();
       struct.setHostnameIsSet(true);
-      BitSet incoming = iprot.readBitSet(3);
+      BitSet incoming = iprot.readBitSet(5);
       if (incoming.get(0)) {
         struct.agentInfo = iprot.readString();
         struct.setAgentInfoIsSet(true);
@@ -1015,6 +1205,14 @@ public class TxnInfo implements org.apache.thrift.TBase<TxnInfo, TxnInfo._Fields
         struct.metaInfo = iprot.readString();
         struct.setMetaInfoIsSet(true);
       }
+      if (incoming.get(3)) {
+        struct.startedTime = iprot.readI64();
+        struct.setStartedTimeIsSet(true);
+      }
+      if (incoming.get(4)) {
+        struct.lastHeartbeatTime = iprot.readI64();
+        struct.setLastHeartbeatTimeIsSet(true);
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/36bdbcc1/metastore/src/gen/thrift/gen-php/metastore/Types.php
----------------------------------------------------------------------
diff --git a/metastore/src/gen/thrift/gen-php/metastore/Types.php b/metastore/src/gen/thrift/gen-php/metastore/Types.php
index 2f9cc9b..18895cf 100644
--- a/metastore/src/gen/thrift/gen-php/metastore/Types.php
+++ b/metastore/src/gen/thrift/gen-php/metastore/Types.php
@@ -11683,6 +11683,14 @@ class TxnInfo {
    * @var string
    */
   public $metaInfo = null;
+  /**
+   * @var int
+   */
+  public $startedTime = null;
+  /**
+   * @var int
+   */
+  public $lastHeartbeatTime = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -11715,6 +11723,14 @@ class TxnInfo {
           'var' => 'metaInfo',
           'type' => TType::STRING,
           ),
+        8 => array(
+          'var' => 'startedTime',
+          'type' => TType::I64,
+          ),
+        9 => array(
+          'var' => 'lastHeartbeatTime',
+          'type' => TType::I64,
+          ),
         );
     }
     if (is_array($vals)) {
@@ -11739,6 +11755,12 @@ class TxnInfo {
       if (isset($vals['metaInfo'])) {
         $this->metaInfo = $vals['metaInfo'];
       }
+      if (isset($vals['startedTime'])) {
+        $this->startedTime = $vals['startedTime'];
+      }
+      if (isset($vals['lastHeartbeatTime'])) {
+        $this->lastHeartbeatTime = $vals['lastHeartbeatTime'];
+      }
     }
   }
 
@@ -11810,6 +11832,20 @@ class TxnInfo {
             $xfer += $input->skip($ftype);
           }
           break;
+        case 8:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->startedTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 9:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->lastHeartbeatTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -11858,6 +11894,16 @@ class TxnInfo {
       $xfer += $output->writeString($this->metaInfo);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->startedTime !== null) {
+      $xfer += $output->writeFieldBegin('startedTime', TType::I64, 8);
+      $xfer += $output->writeI64($this->startedTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->lastHeartbeatTime !== null) {
+      $xfer += $output->writeFieldBegin('lastHeartbeatTime', TType::I64, 9);
+      $xfer += $output->writeI64($this->lastHeartbeatTime);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;

http://git-wip-us.apache.org/repos/asf/hive/blob/36bdbcc1/metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py
----------------------------------------------------------------------
diff --git a/metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py b/metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py
index 2d308c9..65a65dd 100644
--- a/metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py
+++ b/metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py
@@ -8027,6 +8027,8 @@ class TxnInfo:
    - agentInfo
    - heartbeatCount
    - metaInfo
+   - startedTime
+   - lastHeartbeatTime
   """
 
   thrift_spec = (
@@ -8038,9 +8040,11 @@ class TxnInfo:
     (5, TType.STRING, 'agentInfo', None, "Unknown", ), # 5
     (6, TType.I32, 'heartbeatCount', None, 0, ), # 6
     (7, TType.STRING, 'metaInfo', None, None, ), # 7
+    (8, TType.I64, 'startedTime', None, None, ), # 8
+    (9, TType.I64, 'lastHeartbeatTime', None, None, ), # 9
   )
 
-  def __init__(self, id=None, state=None, user=None, hostname=None, agentInfo=thrift_spec[5][4], heartbeatCount=thrift_spec[6][4], metaInfo=None,):
+  def __init__(self, id=None, state=None, user=None, hostname=None, agentInfo=thrift_spec[5][4], heartbeatCount=thrift_spec[6][4], metaInfo=None, startedTime=None, lastHeartbeatTime=None,):
     self.id = id
     self.state = state
     self.user = user
@@ -8048,6 +8052,8 @@ class TxnInfo:
     self.agentInfo = agentInfo
     self.heartbeatCount = heartbeatCount
     self.metaInfo = metaInfo
+    self.startedTime = startedTime
+    self.lastHeartbeatTime = lastHeartbeatTime
 
   def read(self, iprot):
     if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
@@ -8093,6 +8099,16 @@ class TxnInfo:
           self.metaInfo = iprot.readString()
         else:
           iprot.skip(ftype)
+      elif fid == 8:
+        if ftype == TType.I64:
+          self.startedTime = iprot.readI64()
+        else:
+          iprot.skip(ftype)
+      elif fid == 9:
+        if ftype == TType.I64:
+          self.lastHeartbeatTime = iprot.readI64()
+        else:
+          iprot.skip(ftype)
       else:
         iprot.skip(ftype)
       iprot.readFieldEnd()
@@ -8131,6 +8147,14 @@ class TxnInfo:
       oprot.writeFieldBegin('metaInfo', TType.STRING, 7)
       oprot.writeString(self.metaInfo)
       oprot.writeFieldEnd()
+    if self.startedTime is not None:
+      oprot.writeFieldBegin('startedTime', TType.I64, 8)
+      oprot.writeI64(self.startedTime)
+      oprot.writeFieldEnd()
+    if self.lastHeartbeatTime is not None:
+      oprot.writeFieldBegin('lastHeartbeatTime', TType.I64, 9)
+      oprot.writeI64(self.lastHeartbeatTime)
+      oprot.writeFieldEnd()
     oprot.writeFieldStop()
     oprot.writeStructEnd()
 
@@ -8155,6 +8179,8 @@ class TxnInfo:
     value = (value * 31) ^ hash(self.agentInfo)
     value = (value * 31) ^ hash(self.heartbeatCount)
     value = (value * 31) ^ hash(self.metaInfo)
+    value = (value * 31) ^ hash(self.startedTime)
+    value = (value * 31) ^ hash(self.lastHeartbeatTime)
     return value
 
   def __repr__(self):

http://git-wip-us.apache.org/repos/asf/hive/blob/36bdbcc1/metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb
----------------------------------------------------------------------
diff --git a/metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb b/metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb
index bd94e98..51adf50 100644
--- a/metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb
+++ b/metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb
@@ -1793,6 +1793,8 @@ class TxnInfo
   AGENTINFO = 5
   HEARTBEATCOUNT = 6
   METAINFO = 7
+  STARTEDTIME = 8
+  LASTHEARTBEATTIME = 9
 
   FIELDS = {
     ID => {:type => ::Thrift::Types::I64, :name => 'id'},
@@ -1801,7 +1803,9 @@ class TxnInfo
     HOSTNAME => {:type => ::Thrift::Types::STRING, :name => 'hostname'},
     AGENTINFO => {:type => ::Thrift::Types::STRING, :name => 'agentInfo', :default => %q"Unknown", :optional => true},
     HEARTBEATCOUNT => {:type => ::Thrift::Types::I32, :name => 'heartbeatCount', :default => 0, :optional => true},
-    METAINFO => {:type => ::Thrift::Types::STRING, :name => 'metaInfo', :optional => true}
+    METAINFO => {:type => ::Thrift::Types::STRING, :name => 'metaInfo', :optional => true},
+    STARTEDTIME => {:type => ::Thrift::Types::I64, :name => 'startedTime', :optional => true},
+    LASTHEARTBEATTIME => {:type => ::Thrift::Types::I64, :name => 'lastHeartbeatTime', :optional => true}
   }
 
   def struct_fields; FIELDS; end

http://git-wip-us.apache.org/repos/asf/hive/blob/36bdbcc1/metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java
----------------------------------------------------------------------
diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java b/metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java
index fe16ebd..547ee98 100644
--- a/metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java
+++ b/metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java
@@ -292,9 +292,10 @@ abstract class TxnHandler implements TxnStore, TxnStore.MutexAPI {
             "initialized, null record found in next_txn_id");
         }
         close(rs);
-        List<TxnInfo> txnInfo = new ArrayList<TxnInfo>();
+        List<TxnInfo> txnInfos = new ArrayList<TxnInfo>();
         //need the WHERE clause below to ensure consistent results with READ_COMMITTED
-        s = "select txn_id, txn_state, txn_user, txn_host from TXNS where txn_id <= " + hwm;
+        s = "select txn_id, txn_state, txn_user, txn_host, txn_started, txn_last_heartbeat from " +
+            "TXNS where txn_id <= " + hwm;
         LOG.debug("Going to execute query<" + s + ">");
         rs = stmt.executeQuery(s);
         while (rs.next()) {
@@ -313,11 +314,14 @@ abstract class TxnHandler implements TxnStore, TxnStore.MutexAPI {
               throw new MetaException("Unexpected transaction state " + c +
                 " found in txns table");
           }
-          txnInfo.add(new TxnInfo(rs.getLong(1), state, rs.getString(3), rs.getString(4)));
+          TxnInfo txnInfo = new TxnInfo(rs.getLong(1), state, rs.getString(3), rs.getString(4));
+          txnInfo.setStartedTime(rs.getLong(5));
+          txnInfo.setLastHeartbeatTime(rs.getLong(6));
+          txnInfos.add(txnInfo);
         }
         LOG.debug("Going to rollback");
         dbConn.rollback();
-        return new GetOpenTxnsInfoResponse(hwm, txnInfo);
+        return new GetOpenTxnsInfoResponse(hwm, txnInfos);
       } catch (SQLException e) {
         LOG.debug("Going to rollback");
         rollbackDBConn(dbConn);

http://git-wip-us.apache.org/repos/asf/hive/blob/36bdbcc1/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
index 362ea32..acf570f 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
@@ -2791,6 +2791,10 @@ public class DDLTask extends Task<DDLWork> implements Serializable {
       os.write(separator);
       os.writeBytes("Transaction State");
       os.write(separator);
+      os.writeBytes("Started Time");
+      os.write(separator);
+      os.writeBytes("Last Heartbeat Time");
+      os.write(separator);
       os.writeBytes("User");
       os.write(separator);
       os.writeBytes("Hostname");
@@ -2801,6 +2805,10 @@ public class DDLTask extends Task<DDLWork> implements Serializable {
         os.write(separator);
         os.writeBytes(txn.getState().toString());
         os.write(separator);
+        os.writeBytes(Long.toString(txn.getStartedTime()));
+        os.write(separator);
+        os.writeBytes(Long.toString(txn.getLastHeartbeatTime()));
+        os.write(separator);
         os.writeBytes(txn.getUser());
         os.write(separator);
         os.writeBytes(txn.getHostname());

http://git-wip-us.apache.org/repos/asf/hive/blob/36bdbcc1/ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTxnsDesc.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTxnsDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTxnsDesc.java
index c4508d0..9885cca 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTxnsDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTxnsDesc.java
@@ -27,7 +27,7 @@ import java.io.Serializable;
 public class ShowTxnsDesc extends DDLDesc implements Serializable {
 
   private static final long serialVersionUID = 1L;
-  private static final String schema = "txnid,state,user,host#string:string:string:string";
+  private static final String schema = "txnid,state,startedtime,lastheartbeattime,user,host#string:string:string:string:string:string";
 
   private String resFile;
 

http://git-wip-us.apache.org/repos/asf/hive/blob/36bdbcc1/ql/src/test/results/clientpositive/dbtxnmgr_showlocks.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/dbtxnmgr_showlocks.q.out b/ql/src/test/results/clientpositive/dbtxnmgr_showlocks.q.out
index ef07a2a..3b683f8 100644
--- a/ql/src/test/results/clientpositive/dbtxnmgr_showlocks.q.out
+++ b/ql/src/test/results/clientpositive/dbtxnmgr_showlocks.q.out
@@ -17,7 +17,7 @@ PREHOOK: query: show transactions
 PREHOOK: type: SHOW TRANSACTIONS
 POSTHOOK: query: show transactions
 POSTHOOK: type: SHOW TRANSACTIONS
-Transaction ID	Transaction State	User	Hostname
+Transaction ID	Transaction State	Started Time	Last Heartbeat Time	User	Hostname
 PREHOOK: query: create table partitioned_acid_table (a int, b int) partitioned by (p string) clustered by (a) into 2 buckets stored as orc tblproperties ('transactional'='true')
 PREHOOK: type: CREATETABLE
 PREHOOK: Output: database:default