diff --git metastore/if/hive_metastore.thrift metastore/if/hive_metastore.thrift index c5ba309..d7ed5d0 100755 --- metastore/if/hive_metastore.thrift +++ metastore/if/hive_metastore.thrift @@ -620,11 +620,13 @@ struct Function { struct TxnInfo { 1: required i64 id, 2: required TxnState state, - 3: required string user, // used in 'show transactions' to help admins find who has open transactions - 4: required string hostname, // used in 'show transactions' to help admins find who has open transactions - 5: optional string agentInfo = "Unknown", - 6: optional i32 heartbeatCount=0, - 7: optional string metaInfo, + 3: required i64 startedTime, + 4: required i64 lastHeartbeatTime, + 5: required string user, // used in 'show transactions' to help admins find who has open transactions + 6: required string hostname, // used in 'show transactions' to help admins find who has open transactions + 7: optional string agentInfo = "Unknown", + 8: optional i32 heartbeatCount=0, + 9: optional string metaInfo, } struct GetOpenTxnsInfoResponse { diff --git metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp index 174b539..3459d81 100644 --- metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp +++ metastore/src/gen/thrift/gen-cpp/hive_metastore_types.cpp @@ -11556,6 +11556,14 @@ void TxnInfo::__set_state(const TxnState::type val) { this->state = val; } +void TxnInfo::__set_startedTime(const int64_t val) { + this->startedTime = val; +} + +void TxnInfo::__set_lastHeartbeatTime(const int64_t val) { + this->lastHeartbeatTime = val; +} + void TxnInfo::__set_user(const std::string& val) { this->user = val; } @@ -11593,6 +11601,8 @@ uint32_t TxnInfo::read(::apache::thrift::protocol::TProtocol* iprot) { bool isset_id = false; bool isset_state = false; + bool isset_startedTime = false; + bool isset_lastHeartbeatTime = false; bool isset_user = false; bool isset_hostname = false; @@ -11623,6 +11633,22 @@ uint32_t TxnInfo::read(::apache::thrift::protocol::TProtocol* iprot) { } break; case 3: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->startedTime); + isset_startedTime = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->lastHeartbeatTime); + isset_lastHeartbeatTime = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: if (ftype == ::apache::thrift::protocol::T_STRING) { xfer += iprot->readString(this->user); isset_user = true; @@ -11630,7 +11656,7 @@ uint32_t TxnInfo::read(::apache::thrift::protocol::TProtocol* iprot) { xfer += iprot->skip(ftype); } break; - case 4: + case 6: if (ftype == ::apache::thrift::protocol::T_STRING) { xfer += iprot->readString(this->hostname); isset_hostname = true; @@ -11638,7 +11664,7 @@ uint32_t TxnInfo::read(::apache::thrift::protocol::TProtocol* iprot) { xfer += iprot->skip(ftype); } break; - case 5: + case 7: if (ftype == ::apache::thrift::protocol::T_STRING) { xfer += iprot->readString(this->agentInfo); this->__isset.agentInfo = true; @@ -11646,7 +11672,7 @@ uint32_t TxnInfo::read(::apache::thrift::protocol::TProtocol* iprot) { xfer += iprot->skip(ftype); } break; - case 6: + case 8: if (ftype == ::apache::thrift::protocol::T_I32) { xfer += iprot->readI32(this->heartbeatCount); this->__isset.heartbeatCount = true; @@ -11654,7 +11680,7 @@ uint32_t TxnInfo::read(::apache::thrift::protocol::TProtocol* iprot) { xfer += iprot->skip(ftype); } break; - case 7: + case 9: if (ftype == ::apache::thrift::protocol::T_STRING) { xfer += iprot->readString(this->metaInfo); this->__isset.metaInfo = true; @@ -11675,6 +11701,10 @@ uint32_t TxnInfo::read(::apache::thrift::protocol::TProtocol* iprot) { throw TProtocolException(TProtocolException::INVALID_DATA); if (!isset_state) throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_startedTime) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_lastHeartbeatTime) + throw TProtocolException(TProtocolException::INVALID_DATA); if (!isset_user) throw TProtocolException(TProtocolException::INVALID_DATA); if (!isset_hostname) @@ -11695,26 +11725,34 @@ uint32_t TxnInfo::write(::apache::thrift::protocol::TProtocol* oprot) const { xfer += oprot->writeI32((int32_t)this->state); xfer += oprot->writeFieldEnd(); - xfer += oprot->writeFieldBegin("user", ::apache::thrift::protocol::T_STRING, 3); + xfer += oprot->writeFieldBegin("startedTime", ::apache::thrift::protocol::T_I64, 3); + xfer += oprot->writeI64(this->startedTime); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("lastHeartbeatTime", ::apache::thrift::protocol::T_I64, 4); + xfer += oprot->writeI64(this->lastHeartbeatTime); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("user", ::apache::thrift::protocol::T_STRING, 5); xfer += oprot->writeString(this->user); xfer += oprot->writeFieldEnd(); - xfer += oprot->writeFieldBegin("hostname", ::apache::thrift::protocol::T_STRING, 4); + xfer += oprot->writeFieldBegin("hostname", ::apache::thrift::protocol::T_STRING, 6); xfer += oprot->writeString(this->hostname); xfer += oprot->writeFieldEnd(); if (this->__isset.agentInfo) { - xfer += oprot->writeFieldBegin("agentInfo", ::apache::thrift::protocol::T_STRING, 5); + xfer += oprot->writeFieldBegin("agentInfo", ::apache::thrift::protocol::T_STRING, 7); xfer += oprot->writeString(this->agentInfo); xfer += oprot->writeFieldEnd(); } if (this->__isset.heartbeatCount) { - xfer += oprot->writeFieldBegin("heartbeatCount", ::apache::thrift::protocol::T_I32, 6); + xfer += oprot->writeFieldBegin("heartbeatCount", ::apache::thrift::protocol::T_I32, 8); xfer += oprot->writeI32(this->heartbeatCount); xfer += oprot->writeFieldEnd(); } if (this->__isset.metaInfo) { - xfer += oprot->writeFieldBegin("metaInfo", ::apache::thrift::protocol::T_STRING, 7); + xfer += oprot->writeFieldBegin("metaInfo", ::apache::thrift::protocol::T_STRING, 9); xfer += oprot->writeString(this->metaInfo); xfer += oprot->writeFieldEnd(); } @@ -11727,6 +11765,8 @@ void swap(TxnInfo &a, TxnInfo &b) { using ::std::swap; swap(a.id, b.id); swap(a.state, b.state); + swap(a.startedTime, b.startedTime); + swap(a.lastHeartbeatTime, b.lastHeartbeatTime); swap(a.user, b.user); swap(a.hostname, b.hostname); swap(a.agentInfo, b.agentInfo); @@ -11738,6 +11778,8 @@ void swap(TxnInfo &a, TxnInfo &b) { TxnInfo::TxnInfo(const TxnInfo& other507) { id = other507.id; state = other507.state; + startedTime = other507.startedTime; + lastHeartbeatTime = other507.lastHeartbeatTime; user = other507.user; hostname = other507.hostname; agentInfo = other507.agentInfo; @@ -11748,6 +11790,8 @@ TxnInfo::TxnInfo(const TxnInfo& other507) { TxnInfo& TxnInfo::operator=(const TxnInfo& other508) { id = other508.id; state = other508.state; + startedTime = other508.startedTime; + lastHeartbeatTime = other508.lastHeartbeatTime; user = other508.user; hostname = other508.hostname; agentInfo = other508.agentInfo; @@ -11761,6 +11805,8 @@ void TxnInfo::printTo(std::ostream& out) const { out << "TxnInfo("; out << "id=" << to_string(id); out << ", " << "state=" << to_string(state); + out << ", " << "startedTime=" << to_string(startedTime); + out << ", " << "lastHeartbeatTime=" << to_string(lastHeartbeatTime); out << ", " << "user=" << to_string(user); out << ", " << "hostname=" << to_string(hostname); out << ", " << "agentInfo="; (__isset.agentInfo ? (out << to_string(agentInfo)) : (out << "")); diff --git metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h index bfec694..21f0cfa 100644 --- metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h +++ metastore/src/gen/thrift/gen-cpp/hive_metastore_types.h @@ -4764,12 +4764,14 @@ 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), startedTime(0), lastHeartbeatTime(0), user(), hostname(), agentInfo("Unknown"), heartbeatCount(0), metaInfo() { } virtual ~TxnInfo() throw(); int64_t id; TxnState::type state; + int64_t startedTime; + int64_t lastHeartbeatTime; std::string user; std::string hostname; std::string agentInfo; @@ -4782,6 +4784,10 @@ class TxnInfo { void __set_state(const TxnState::type val); + void __set_startedTime(const int64_t val); + + void __set_lastHeartbeatTime(const int64_t val); + void __set_user(const std::string& val); void __set_hostname(const std::string& val); @@ -4798,6 +4804,10 @@ class TxnInfo { return false; if (!(state == rhs.state)) return false; + if (!(startedTime == rhs.startedTime)) + return false; + if (!(lastHeartbeatTime == rhs.lastHeartbeatTime)) + return false; if (!(user == rhs.user)) return false; if (!(hostname == rhs.hostname)) diff --git metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/TxnInfo.java metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/TxnInfo.java index 9c56ee3..e165fa0 100644 --- metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/TxnInfo.java +++ metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/TxnInfo.java @@ -40,11 +40,13 @@ private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField("id", org.apache.thrift.protocol.TType.I64, (short)1); private static final org.apache.thrift.protocol.TField STATE_FIELD_DESC = new org.apache.thrift.protocol.TField("state", org.apache.thrift.protocol.TType.I32, (short)2); - private static final org.apache.thrift.protocol.TField USER_FIELD_DESC = new org.apache.thrift.protocol.TField("user", org.apache.thrift.protocol.TType.STRING, (short)3); - private static final org.apache.thrift.protocol.TField HOSTNAME_FIELD_DESC = new org.apache.thrift.protocol.TField("hostname", org.apache.thrift.protocol.TType.STRING, (short)4); - 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)3); + 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)4); + private static final org.apache.thrift.protocol.TField USER_FIELD_DESC = new org.apache.thrift.protocol.TField("user", org.apache.thrift.protocol.TType.STRING, (short)5); + private static final org.apache.thrift.protocol.TField HOSTNAME_FIELD_DESC = new org.apache.thrift.protocol.TField("hostname", org.apache.thrift.protocol.TType.STRING, (short)6); + 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)7); + 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)8); + 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)9); private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); static { @@ -54,6 +56,8 @@ private long id; // required private TxnState state; // required + private long startedTime; // required + private long lastHeartbeatTime; // required private String user; // required private String hostname; // required private String agentInfo; // optional @@ -68,11 +72,13 @@ * @see TxnState */ STATE((short)2, "state"), - USER((short)3, "user"), - HOSTNAME((short)4, "hostname"), - AGENT_INFO((short)5, "agentInfo"), - HEARTBEAT_COUNT((short)6, "heartbeatCount"), - META_INFO((short)7, "metaInfo"); + STARTED_TIME((short)3, "startedTime"), + LAST_HEARTBEAT_TIME((short)4, "lastHeartbeatTime"), + USER((short)5, "user"), + HOSTNAME((short)6, "hostname"), + AGENT_INFO((short)7, "agentInfo"), + HEARTBEAT_COUNT((short)8, "heartbeatCount"), + META_INFO((short)9, "metaInfo"); private static final Map byName = new HashMap(); @@ -91,15 +97,19 @@ public static _Fields findByThriftId(int fieldId) { return ID; case 2: // STATE return STATE; - case 3: // USER + case 3: // STARTED_TIME + return STARTED_TIME; + case 4: // LAST_HEARTBEAT_TIME + return LAST_HEARTBEAT_TIME; + case 5: // USER return USER; - case 4: // HOSTNAME + case 6: // HOSTNAME return HOSTNAME; - case 5: // AGENT_INFO + case 7: // AGENT_INFO return AGENT_INFO; - case 6: // HEARTBEAT_COUNT + case 8: // HEARTBEAT_COUNT return HEARTBEAT_COUNT; - case 7: // META_INFO + case 9: // META_INFO return META_INFO; default: return null; @@ -142,7 +152,9 @@ public String getFieldName() { // 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 = 1; + private static final int __LASTHEARTBEATTIME_ISSET_ID = 2; + private static final int __HEARTBEATCOUNT_ISSET_ID = 3; private byte __isset_bitfield = 0; private static final _Fields optionals[] = {_Fields.AGENT_INFO,_Fields.HEARTBEAT_COUNT,_Fields.META_INFO}; public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; @@ -152,6 +164,10 @@ public String getFieldName() { new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64))); tmpMap.put(_Fields.STATE, new org.apache.thrift.meta_data.FieldMetaData("state", org.apache.thrift.TFieldRequirementType.REQUIRED, new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, TxnState.class))); + tmpMap.put(_Fields.STARTED_TIME, new org.apache.thrift.meta_data.FieldMetaData("startedTime", org.apache.thrift.TFieldRequirementType.REQUIRED, + 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.REQUIRED, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64))); tmpMap.put(_Fields.USER, new org.apache.thrift.meta_data.FieldMetaData("user", org.apache.thrift.TFieldRequirementType.REQUIRED, new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); tmpMap.put(_Fields.HOSTNAME, new org.apache.thrift.meta_data.FieldMetaData("hostname", org.apache.thrift.TFieldRequirementType.REQUIRED, @@ -176,6 +192,8 @@ public TxnInfo() { public TxnInfo( long id, TxnState state, + long startedTime, + long lastHeartbeatTime, String user, String hostname) { @@ -183,6 +201,10 @@ public TxnInfo( this.id = id; setIdIsSet(true); this.state = state; + this.startedTime = startedTime; + setStartedTimeIsSet(true); + this.lastHeartbeatTime = lastHeartbeatTime; + setLastHeartbeatTimeIsSet(true); this.user = user; this.hostname = hostname; } @@ -196,6 +218,8 @@ public TxnInfo(TxnInfo other) { if (other.isSetState()) { this.state = other.state; } + this.startedTime = other.startedTime; + this.lastHeartbeatTime = other.lastHeartbeatTime; if (other.isSetUser()) { this.user = other.user; } @@ -220,6 +244,10 @@ public void clear() { setIdIsSet(false); this.id = 0; this.state = null; + setStartedTimeIsSet(false); + this.startedTime = 0; + setLastHeartbeatTimeIsSet(false); + this.lastHeartbeatTime = 0; this.user = null; this.hostname = null; this.agentInfo = "Unknown"; @@ -282,6 +310,50 @@ public void setStateIsSet(boolean value) { } } + 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 String getUser() { return this.user; } @@ -414,6 +486,22 @@ public void setFieldValue(_Fields field, Object value) { } 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; + case USER: if (value == null) { unsetUser(); @@ -465,6 +553,12 @@ public Object getFieldValue(_Fields field) { case STATE: return getState(); + case STARTED_TIME: + return getStartedTime(); + + case LAST_HEARTBEAT_TIME: + return getLastHeartbeatTime(); + case USER: return getUser(); @@ -495,6 +589,10 @@ public boolean isSet(_Fields field) { return isSetId(); case STATE: return isSetState(); + case STARTED_TIME: + return isSetStartedTime(); + case LAST_HEARTBEAT_TIME: + return isSetLastHeartbeatTime(); case USER: return isSetUser(); case HOSTNAME: @@ -540,6 +638,24 @@ public boolean equals(TxnInfo that) { return false; } + boolean this_present_startedTime = true; + boolean that_present_startedTime = true; + 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; + boolean that_present_lastHeartbeatTime = true; + if (this_present_lastHeartbeatTime || that_present_lastHeartbeatTime) { + if (!(this_present_lastHeartbeatTime && that_present_lastHeartbeatTime)) + return false; + if (this.lastHeartbeatTime != that.lastHeartbeatTime) + return false; + } + boolean this_present_user = true && this.isSetUser(); boolean that_present_user = true && that.isSetUser(); if (this_present_user || that_present_user) { @@ -602,6 +718,16 @@ public int hashCode() { if (present_state) list.add(state.getValue()); + boolean present_startedTime = true; + list.add(present_startedTime); + if (present_startedTime) + list.add(startedTime); + + boolean present_lastHeartbeatTime = true; + list.add(present_lastHeartbeatTime); + if (present_lastHeartbeatTime) + list.add(lastHeartbeatTime); + boolean present_user = true && (isSetUser()); list.add(present_user); if (present_user) @@ -658,6 +784,26 @@ public int compareTo(TxnInfo other) { 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; + } + } lastComparison = Boolean.valueOf(isSetUser()).compareTo(other.isSetUser()); if (lastComparison != 0) { return lastComparison; @@ -740,6 +886,14 @@ public String toString() { } first = false; if (!first) sb.append(", "); + sb.append("startedTime:"); + sb.append(this.startedTime); + first = false; + if (!first) sb.append(", "); + sb.append("lastHeartbeatTime:"); + sb.append(this.lastHeartbeatTime); + first = false; + if (!first) sb.append(", "); sb.append("user:"); if (this.user == null) { sb.append("null"); @@ -795,6 +949,14 @@ public void validate() throws org.apache.thrift.TException { throw new org.apache.thrift.protocol.TProtocolException("Required field 'state' is unset! Struct:" + toString()); } + if (!isSetStartedTime()) { + throw new org.apache.thrift.protocol.TProtocolException("Required field 'startedTime' is unset! Struct:" + toString()); + } + + if (!isSetLastHeartbeatTime()) { + throw new org.apache.thrift.protocol.TProtocolException("Required field 'lastHeartbeatTime' is unset! Struct:" + toString()); + } + if (!isSetUser()) { throw new org.apache.thrift.protocol.TProtocolException("Required field 'user' is unset! Struct:" + toString()); } @@ -858,7 +1020,23 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, TxnInfo struct) thr org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } break; - case 3: // USER + case 3: // 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 4: // 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; + case 5: // USER if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { struct.user = iprot.readString(); struct.setUserIsSet(true); @@ -866,7 +1044,7 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, TxnInfo struct) thr org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } break; - case 4: // HOSTNAME + case 6: // HOSTNAME if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { struct.hostname = iprot.readString(); struct.setHostnameIsSet(true); @@ -874,7 +1052,7 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, TxnInfo struct) thr org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } break; - case 5: // AGENT_INFO + case 7: // AGENT_INFO if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { struct.agentInfo = iprot.readString(); struct.setAgentInfoIsSet(true); @@ -882,7 +1060,7 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, TxnInfo struct) thr org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } break; - case 6: // HEARTBEAT_COUNT + case 8: // HEARTBEAT_COUNT if (schemeField.type == org.apache.thrift.protocol.TType.I32) { struct.heartbeatCount = iprot.readI32(); struct.setHeartbeatCountIsSet(true); @@ -890,7 +1068,7 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, TxnInfo struct) thr org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } break; - case 7: // META_INFO + case 9: // META_INFO if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { struct.metaInfo = iprot.readString(); struct.setMetaInfoIsSet(true); @@ -919,6 +1097,12 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, TxnInfo struct) th oprot.writeI32(struct.state.getValue()); oprot.writeFieldEnd(); } + oprot.writeFieldBegin(STARTED_TIME_FIELD_DESC); + oprot.writeI64(struct.startedTime); + oprot.writeFieldEnd(); + oprot.writeFieldBegin(LAST_HEARTBEAT_TIME_FIELD_DESC); + oprot.writeI64(struct.lastHeartbeatTime); + oprot.writeFieldEnd(); if (struct.user != null) { oprot.writeFieldBegin(USER_FIELD_DESC); oprot.writeString(struct.user); @@ -967,6 +1151,8 @@ public void write(org.apache.thrift.protocol.TProtocol prot, TxnInfo struct) thr TTupleProtocol oprot = (TTupleProtocol) prot; oprot.writeI64(struct.id); oprot.writeI32(struct.state.getValue()); + oprot.writeI64(struct.startedTime); + oprot.writeI64(struct.lastHeartbeatTime); oprot.writeString(struct.user); oprot.writeString(struct.hostname); BitSet optionals = new BitSet(); @@ -998,6 +1184,10 @@ public void read(org.apache.thrift.protocol.TProtocol prot, TxnInfo struct) thro struct.setIdIsSet(true); struct.state = org.apache.hadoop.hive.metastore.api.TxnState.findByValue(iprot.readI32()); struct.setStateIsSet(true); + struct.startedTime = iprot.readI64(); + struct.setStartedTimeIsSet(true); + struct.lastHeartbeatTime = iprot.readI64(); + struct.setLastHeartbeatTimeIsSet(true); struct.user = iprot.readString(); struct.setUserIsSet(true); struct.hostname = iprot.readString(); diff --git metastore/src/gen/thrift/gen-php/metastore/Types.php metastore/src/gen/thrift/gen-php/metastore/Types.php index 2f9cc9b..10c8ab8 100644 --- metastore/src/gen/thrift/gen-php/metastore/Types.php +++ metastore/src/gen/thrift/gen-php/metastore/Types.php @@ -11664,6 +11664,14 @@ class TxnInfo { */ public $state = null; /** + * @var int + */ + public $startedTime = null; + /** + * @var int + */ + public $lastHeartbeatTime = null; + /** * @var string */ public $user = null; @@ -11696,22 +11704,30 @@ class TxnInfo { 'type' => TType::I32, ), 3 => array( + 'var' => 'startedTime', + 'type' => TType::I64, + ), + 4 => array( + 'var' => 'lastHeartbeatTime', + 'type' => TType::I64, + ), + 5 => array( 'var' => 'user', 'type' => TType::STRING, ), - 4 => array( + 6 => array( 'var' => 'hostname', 'type' => TType::STRING, ), - 5 => array( + 7 => array( 'var' => 'agentInfo', 'type' => TType::STRING, ), - 6 => array( + 8 => array( 'var' => 'heartbeatCount', 'type' => TType::I32, ), - 7 => array( + 9 => array( 'var' => 'metaInfo', 'type' => TType::STRING, ), @@ -11724,6 +11740,12 @@ class TxnInfo { if (isset($vals['state'])) { $this->state = $vals['state']; } + if (isset($vals['startedTime'])) { + $this->startedTime = $vals['startedTime']; + } + if (isset($vals['lastHeartbeatTime'])) { + $this->lastHeartbeatTime = $vals['lastHeartbeatTime']; + } if (isset($vals['user'])) { $this->user = $vals['user']; } @@ -11776,34 +11798,48 @@ class TxnInfo { } break; case 3: + if ($ftype == TType::I64) { + $xfer += $input->readI64($this->startedTime); + } else { + $xfer += $input->skip($ftype); + } + break; + case 4: + if ($ftype == TType::I64) { + $xfer += $input->readI64($this->lastHeartbeatTime); + } else { + $xfer += $input->skip($ftype); + } + break; + case 5: if ($ftype == TType::STRING) { $xfer += $input->readString($this->user); } else { $xfer += $input->skip($ftype); } break; - case 4: + case 6: if ($ftype == TType::STRING) { $xfer += $input->readString($this->hostname); } else { $xfer += $input->skip($ftype); } break; - case 5: + case 7: if ($ftype == TType::STRING) { $xfer += $input->readString($this->agentInfo); } else { $xfer += $input->skip($ftype); } break; - case 6: + case 8: if ($ftype == TType::I32) { $xfer += $input->readI32($this->heartbeatCount); } else { $xfer += $input->skip($ftype); } break; - case 7: + case 9: if ($ftype == TType::STRING) { $xfer += $input->readString($this->metaInfo); } else { @@ -11833,28 +11869,38 @@ class TxnInfo { $xfer += $output->writeI32($this->state); $xfer += $output->writeFieldEnd(); } + if ($this->startedTime !== null) { + $xfer += $output->writeFieldBegin('startedTime', TType::I64, 3); + $xfer += $output->writeI64($this->startedTime); + $xfer += $output->writeFieldEnd(); + } + if ($this->lastHeartbeatTime !== null) { + $xfer += $output->writeFieldBegin('lastHeartbeatTime', TType::I64, 4); + $xfer += $output->writeI64($this->lastHeartbeatTime); + $xfer += $output->writeFieldEnd(); + } if ($this->user !== null) { - $xfer += $output->writeFieldBegin('user', TType::STRING, 3); + $xfer += $output->writeFieldBegin('user', TType::STRING, 5); $xfer += $output->writeString($this->user); $xfer += $output->writeFieldEnd(); } if ($this->hostname !== null) { - $xfer += $output->writeFieldBegin('hostname', TType::STRING, 4); + $xfer += $output->writeFieldBegin('hostname', TType::STRING, 6); $xfer += $output->writeString($this->hostname); $xfer += $output->writeFieldEnd(); } if ($this->agentInfo !== null) { - $xfer += $output->writeFieldBegin('agentInfo', TType::STRING, 5); + $xfer += $output->writeFieldBegin('agentInfo', TType::STRING, 7); $xfer += $output->writeString($this->agentInfo); $xfer += $output->writeFieldEnd(); } if ($this->heartbeatCount !== null) { - $xfer += $output->writeFieldBegin('heartbeatCount', TType::I32, 6); + $xfer += $output->writeFieldBegin('heartbeatCount', TType::I32, 8); $xfer += $output->writeI32($this->heartbeatCount); $xfer += $output->writeFieldEnd(); } if ($this->metaInfo !== null) { - $xfer += $output->writeFieldBegin('metaInfo', TType::STRING, 7); + $xfer += $output->writeFieldBegin('metaInfo', TType::STRING, 9); $xfer += $output->writeString($this->metaInfo); $xfer += $output->writeFieldEnd(); } diff --git metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py index 2d308c9..b17a38d 100644 --- metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py +++ metastore/src/gen/thrift/gen-py/hive_metastore/ttypes.py @@ -8022,6 +8022,8 @@ class TxnInfo: Attributes: - id - state + - startedTime + - lastHeartbeatTime - user - hostname - agentInfo @@ -8033,16 +8035,20 @@ class TxnInfo: None, # 0 (1, TType.I64, 'id', None, None, ), # 1 (2, TType.I32, 'state', None, None, ), # 2 - (3, TType.STRING, 'user', None, None, ), # 3 - (4, TType.STRING, 'hostname', None, None, ), # 4 - (5, TType.STRING, 'agentInfo', None, "Unknown", ), # 5 - (6, TType.I32, 'heartbeatCount', None, 0, ), # 6 - (7, TType.STRING, 'metaInfo', None, None, ), # 7 + (3, TType.I64, 'startedTime', None, None, ), # 3 + (4, TType.I64, 'lastHeartbeatTime', None, None, ), # 4 + (5, TType.STRING, 'user', None, None, ), # 5 + (6, TType.STRING, 'hostname', None, None, ), # 6 + (7, TType.STRING, 'agentInfo', None, "Unknown", ), # 7 + (8, TType.I32, 'heartbeatCount', None, 0, ), # 8 + (9, TType.STRING, 'metaInfo', 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, startedTime=None, lastHeartbeatTime=None, user=None, hostname=None, agentInfo=thrift_spec[7][4], heartbeatCount=thrift_spec[8][4], metaInfo=None,): self.id = id self.state = state + self.startedTime = startedTime + self.lastHeartbeatTime = lastHeartbeatTime self.user = user self.hostname = hostname self.agentInfo = agentInfo @@ -8069,26 +8075,36 @@ def read(self, iprot): else: iprot.skip(ftype) elif fid == 3: + if ftype == TType.I64: + self.startedTime = iprot.readI64() + else: + iprot.skip(ftype) + elif fid == 4: + if ftype == TType.I64: + self.lastHeartbeatTime = iprot.readI64() + else: + iprot.skip(ftype) + elif fid == 5: if ftype == TType.STRING: self.user = iprot.readString() else: iprot.skip(ftype) - elif fid == 4: + elif fid == 6: if ftype == TType.STRING: self.hostname = iprot.readString() else: iprot.skip(ftype) - elif fid == 5: + elif fid == 7: if ftype == TType.STRING: self.agentInfo = iprot.readString() else: iprot.skip(ftype) - elif fid == 6: + elif fid == 8: if ftype == TType.I32: self.heartbeatCount = iprot.readI32() else: iprot.skip(ftype) - elif fid == 7: + elif fid == 9: if ftype == TType.STRING: self.metaInfo = iprot.readString() else: @@ -8111,24 +8127,32 @@ def write(self, oprot): oprot.writeFieldBegin('state', TType.I32, 2) oprot.writeI32(self.state) oprot.writeFieldEnd() + if self.startedTime is not None: + oprot.writeFieldBegin('startedTime', TType.I64, 3) + oprot.writeI64(self.startedTime) + oprot.writeFieldEnd() + if self.lastHeartbeatTime is not None: + oprot.writeFieldBegin('lastHeartbeatTime', TType.I64, 4) + oprot.writeI64(self.lastHeartbeatTime) + oprot.writeFieldEnd() if self.user is not None: - oprot.writeFieldBegin('user', TType.STRING, 3) + oprot.writeFieldBegin('user', TType.STRING, 5) oprot.writeString(self.user) oprot.writeFieldEnd() if self.hostname is not None: - oprot.writeFieldBegin('hostname', TType.STRING, 4) + oprot.writeFieldBegin('hostname', TType.STRING, 6) oprot.writeString(self.hostname) oprot.writeFieldEnd() if self.agentInfo is not None: - oprot.writeFieldBegin('agentInfo', TType.STRING, 5) + oprot.writeFieldBegin('agentInfo', TType.STRING, 7) oprot.writeString(self.agentInfo) oprot.writeFieldEnd() if self.heartbeatCount is not None: - oprot.writeFieldBegin('heartbeatCount', TType.I32, 6) + oprot.writeFieldBegin('heartbeatCount', TType.I32, 8) oprot.writeI32(self.heartbeatCount) oprot.writeFieldEnd() if self.metaInfo is not None: - oprot.writeFieldBegin('metaInfo', TType.STRING, 7) + oprot.writeFieldBegin('metaInfo', TType.STRING, 9) oprot.writeString(self.metaInfo) oprot.writeFieldEnd() oprot.writeFieldStop() @@ -8139,6 +8163,10 @@ def validate(self): raise TProtocol.TProtocolException(message='Required field id is unset!') if self.state is None: raise TProtocol.TProtocolException(message='Required field state is unset!') + if self.startedTime is None: + raise TProtocol.TProtocolException(message='Required field startedTime is unset!') + if self.lastHeartbeatTime is None: + raise TProtocol.TProtocolException(message='Required field lastHeartbeatTime is unset!') if self.user is None: raise TProtocol.TProtocolException(message='Required field user is unset!') if self.hostname is None: @@ -8150,6 +8178,8 @@ def __hash__(self): value = 17 value = (value * 31) ^ hash(self.id) value = (value * 31) ^ hash(self.state) + value = (value * 31) ^ hash(self.startedTime) + value = (value * 31) ^ hash(self.lastHeartbeatTime) value = (value * 31) ^ hash(self.user) value = (value * 31) ^ hash(self.hostname) value = (value * 31) ^ hash(self.agentInfo) diff --git metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb index bd94e98..309decd 100644 --- metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb +++ metastore/src/gen/thrift/gen-rb/hive_metastore_types.rb @@ -1788,15 +1788,19 @@ class TxnInfo include ::Thrift::Struct, ::Thrift::Struct_Union ID = 1 STATE = 2 - USER = 3 - HOSTNAME = 4 - AGENTINFO = 5 - HEARTBEATCOUNT = 6 - METAINFO = 7 + STARTEDTIME = 3 + LASTHEARTBEATTIME = 4 + USER = 5 + HOSTNAME = 6 + AGENTINFO = 7 + HEARTBEATCOUNT = 8 + METAINFO = 9 FIELDS = { ID => {:type => ::Thrift::Types::I64, :name => 'id'}, STATE => {:type => ::Thrift::Types::I32, :name => 'state', :enum_class => ::TxnState}, + STARTEDTIME => {:type => ::Thrift::Types::I64, :name => 'startedTime'}, + LASTHEARTBEATTIME => {:type => ::Thrift::Types::I64, :name => 'lastHeartbeatTime'}, USER => {:type => ::Thrift::Types::STRING, :name => 'user'}, HOSTNAME => {:type => ::Thrift::Types::STRING, :name => 'hostname'}, AGENTINFO => {:type => ::Thrift::Types::STRING, :name => 'agentInfo', :default => %q"Unknown", :optional => true}, @@ -1809,6 +1813,8 @@ class TxnInfo def validate raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field id is unset!') unless @id raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field state is unset!') unless @state + raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field startedTime is unset!') unless @startedTime + raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field lastHeartbeatTime is unset!') unless @lastHeartbeatTime raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field user is unset!') unless @user raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field hostname is unset!') unless @hostname unless @state.nil? || ::TxnState::VALID_VALUES.include?(@state) diff --git metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java index fe16ebd..b9d455e 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java @@ -294,7 +294,8 @@ public GetOpenTxnsInfoResponse getOpenTxnsInfo() throws MetaException { close(rs); List txnInfo = new ArrayList(); //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_started, txn_last_heartbeat, txn_user, txn_host from " + + "TXNS where txn_id <= " + hwm; LOG.debug("Going to execute query<" + s + ">"); rs = stmt.executeQuery(s); while (rs.next()) { @@ -313,7 +314,8 @@ public GetOpenTxnsInfoResponse getOpenTxnsInfo() throws MetaException { 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.add(new TxnInfo(rs.getLong(1), state, rs.getLong(3), rs.getLong(4), + rs.getString(5), rs.getString(6))); } LOG.debug("Going to rollback"); dbConn.rollback(); diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java index cea8ce8..479bd32 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java @@ -2782,6 +2782,10 @@ private int showTxns(Hive db, ShowTxnsDesc desc) throws HiveException { 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"); @@ -2792,6 +2796,10 @@ private int showTxns(Hive db, ShowTxnsDesc desc) throws HiveException { 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()); diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTxnsDesc.java ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTxnsDesc.java index c4508d0..9885cca 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTxnsDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTxnsDesc.java @@ -27,7 +27,7 @@ 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; diff --git ql/src/test/results/clientpositive/dbtxnmgr_showlocks.q.out ql/src/test/results/clientpositive/dbtxnmgr_showlocks.q.out index ef07a2a..3b683f8 100644 --- ql/src/test/results/clientpositive/dbtxnmgr_showlocks.q.out +++ 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