Repository: hive Updated Branches: refs/heads/master 603c5341e -> c9cfb6019
http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/gen/thrift/gen-php/metastore/ThriftHiveMetastore.php ---------------------------------------------------------------------- diff --git a/metastore/src/gen/thrift/gen-php/metastore/ThriftHiveMetastore.php b/metastore/src/gen/thrift/gen-php/metastore/ThriftHiveMetastore.php index 4fb7183..2bb4755 100644 --- a/metastore/src/gen/thrift/gen-php/metastore/ThriftHiveMetastore.php +++ b/metastore/src/gen/thrift/gen-php/metastore/ThriftHiveMetastore.php @@ -1195,6 +1195,11 @@ interface ThriftHiveMetastoreIf extends \FacebookServiceIf { * @return \metastore\CacheFileMetadataResult */ public function cache_file_metadata(\metastore\CacheFileMetadataRequest $req); + /** + * @return string + * @throws \metastore\MetaException + */ + public function get_metastore_db_uuid(); } class ThriftHiveMetastoreClient extends \FacebookServiceClient implements \metastore\ThriftHiveMetastoreIf { @@ -9941,6 +9946,59 @@ class ThriftHiveMetastoreClient extends \FacebookServiceClient implements \metas throw new \Exception("cache_file_metadata failed: unknown result"); } + public function get_metastore_db_uuid() + { + $this->send_get_metastore_db_uuid(); + return $this->recv_get_metastore_db_uuid(); + } + + public function send_get_metastore_db_uuid() + { + $args = new \metastore\ThriftHiveMetastore_get_metastore_db_uuid_args(); + $bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary'); + if ($bin_accel) + { + thrift_protocol_write_binary($this->output_, 'get_metastore_db_uuid', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite()); + } + else + { + $this->output_->writeMessageBegin('get_metastore_db_uuid', TMessageType::CALL, $this->seqid_); + $args->write($this->output_); + $this->output_->writeMessageEnd(); + $this->output_->getTransport()->flush(); + } + } + + public function recv_get_metastore_db_uuid() + { + $bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary'); + if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\metastore\ThriftHiveMetastore_get_metastore_db_uuid_result', $this->input_->isStrictRead()); + else + { + $rseqid = 0; + $fname = null; + $mtype = 0; + + $this->input_->readMessageBegin($fname, $mtype, $rseqid); + if ($mtype == TMessageType::EXCEPTION) { + $x = new TApplicationException(); + $x->read($this->input_); + $this->input_->readMessageEnd(); + throw $x; + } + $result = new \metastore\ThriftHiveMetastore_get_metastore_db_uuid_result(); + $result->read($this->input_); + $this->input_->readMessageEnd(); + } + if ($result->success !== null) { + return $result->success; + } + if ($result->o1 !== null) { + throw $result->o1; + } + throw new \Exception("get_metastore_db_uuid failed: unknown result"); + } + } // HELPER FUNCTIONS AND STRUCTURES @@ -45318,4 +45376,154 @@ class ThriftHiveMetastore_cache_file_metadata_result { } +class ThriftHiveMetastore_get_metastore_db_uuid_args { + static $_TSPEC; + + + public function __construct() { + if (!isset(self::$_TSPEC)) { + self::$_TSPEC = array( + ); + } + } + + public function getName() { + return 'ThriftHiveMetastore_get_metastore_db_uuid_args'; + } + + public function read($input) + { + $xfer = 0; + $fname = null; + $ftype = 0; + $fid = 0; + $xfer += $input->readStructBegin($fname); + while (true) + { + $xfer += $input->readFieldBegin($fname, $ftype, $fid); + if ($ftype == TType::STOP) { + break; + } + switch ($fid) + { + default: + $xfer += $input->skip($ftype); + break; + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; + } + + public function write($output) { + $xfer = 0; + $xfer += $output->writeStructBegin('ThriftHiveMetastore_get_metastore_db_uuid_args'); + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; + } + +} + +class ThriftHiveMetastore_get_metastore_db_uuid_result { + static $_TSPEC; + + /** + * @var string + */ + public $success = null; + /** + * @var \metastore\MetaException + */ + public $o1 = null; + + public function __construct($vals=null) { + if (!isset(self::$_TSPEC)) { + self::$_TSPEC = array( + 0 => array( + 'var' => 'success', + 'type' => TType::STRING, + ), + 1 => array( + 'var' => 'o1', + 'type' => TType::STRUCT, + 'class' => '\metastore\MetaException', + ), + ); + } + if (is_array($vals)) { + if (isset($vals['success'])) { + $this->success = $vals['success']; + } + if (isset($vals['o1'])) { + $this->o1 = $vals['o1']; + } + } + } + + public function getName() { + return 'ThriftHiveMetastore_get_metastore_db_uuid_result'; + } + + public function read($input) + { + $xfer = 0; + $fname = null; + $ftype = 0; + $fid = 0; + $xfer += $input->readStructBegin($fname); + while (true) + { + $xfer += $input->readFieldBegin($fname, $ftype, $fid); + if ($ftype == TType::STOP) { + break; + } + switch ($fid) + { + case 0: + if ($ftype == TType::STRING) { + $xfer += $input->readString($this->success); + } else { + $xfer += $input->skip($ftype); + } + break; + case 1: + if ($ftype == TType::STRUCT) { + $this->o1 = new \metastore\MetaException(); + $xfer += $this->o1->read($input); + } else { + $xfer += $input->skip($ftype); + } + break; + default: + $xfer += $input->skip($ftype); + break; + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; + } + + public function write($output) { + $xfer = 0; + $xfer += $output->writeStructBegin('ThriftHiveMetastore_get_metastore_db_uuid_result'); + if ($this->success !== null) { + $xfer += $output->writeFieldBegin('success', TType::STRING, 0); + $xfer += $output->writeString($this->success); + $xfer += $output->writeFieldEnd(); + } + if ($this->o1 !== null) { + $xfer += $output->writeFieldBegin('o1', TType::STRUCT, 1); + $xfer += $this->o1->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; + } + +} + http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore-remote ---------------------------------------------------------------------- diff --git a/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore-remote b/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore-remote index f2a9799..9faf830 100755 --- a/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore-remote +++ b/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore-remote @@ -178,6 +178,7 @@ if len(sys.argv) <= 1 or sys.argv[1] == '--help': print(' PutFileMetadataResult put_file_metadata(PutFileMetadataRequest req)') print(' ClearFileMetadataResult clear_file_metadata(ClearFileMetadataRequest req)') print(' CacheFileMetadataResult cache_file_metadata(CacheFileMetadataRequest req)') + print(' string get_metastore_db_uuid()') print(' string getName()') print(' string getVersion()') print(' fb_status getStatus()') @@ -1171,6 +1172,12 @@ elif cmd == 'cache_file_metadata': sys.exit(1) pp.pprint(client.cache_file_metadata(eval(args[0]),)) +elif cmd == 'get_metastore_db_uuid': + if len(args) != 0: + print('get_metastore_db_uuid requires 0 args') + sys.exit(1) + pp.pprint(client.get_metastore_db_uuid()) + elif cmd == 'getName': if len(args) != 0: print('getName requires 0 args') http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore.py ---------------------------------------------------------------------- diff --git a/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore.py b/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore.py index 8ee84af..b6306f0 100644 --- a/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore.py +++ b/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore.py @@ -1239,6 +1239,9 @@ class Iface(fb303.FacebookService.Iface): """ pass + def get_metastore_db_uuid(self): + pass + class Client(fb303.FacebookService.Client, Iface): """ @@ -6804,6 +6807,34 @@ class Client(fb303.FacebookService.Client, Iface): return result.success raise TApplicationException(TApplicationException.MISSING_RESULT, "cache_file_metadata failed: unknown result") + def get_metastore_db_uuid(self): + self.send_get_metastore_db_uuid() + return self.recv_get_metastore_db_uuid() + + def send_get_metastore_db_uuid(self): + self._oprot.writeMessageBegin('get_metastore_db_uuid', TMessageType.CALL, self._seqid) + args = get_metastore_db_uuid_args() + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_get_metastore_db_uuid(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = get_metastore_db_uuid_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + if result.o1 is not None: + raise result.o1 + raise TApplicationException(TApplicationException.MISSING_RESULT, "get_metastore_db_uuid failed: unknown result") + class Processor(fb303.FacebookService.Processor, Iface, TProcessor): def __init__(self, handler): @@ -6962,6 +6993,7 @@ class Processor(fb303.FacebookService.Processor, Iface, TProcessor): self._processMap["put_file_metadata"] = Processor.process_put_file_metadata self._processMap["clear_file_metadata"] = Processor.process_clear_file_metadata self._processMap["cache_file_metadata"] = Processor.process_cache_file_metadata + self._processMap["get_metastore_db_uuid"] = Processor.process_get_metastore_db_uuid def process(self, iprot, oprot): (name, type, seqid) = iprot.readMessageBegin() @@ -10732,6 +10764,28 @@ class Processor(fb303.FacebookService.Processor, Iface, TProcessor): oprot.writeMessageEnd() oprot.trans.flush() + def process_get_metastore_db_uuid(self, seqid, iprot, oprot): + args = get_metastore_db_uuid_args() + args.read(iprot) + iprot.readMessageEnd() + result = get_metastore_db_uuid_result() + try: + result.success = self._handler.get_metastore_db_uuid() + msg_type = TMessageType.REPLY + except (TTransport.TTransportException, KeyboardInterrupt, SystemExit): + raise + except MetaException as o1: + msg_type = TMessageType.REPLY + result.o1 = o1 + except Exception as ex: + msg_type = TMessageType.EXCEPTION + logging.exception(ex) + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("get_metastore_db_uuid", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + # HELPER FUNCTIONS AND STRUCTURES @@ -36796,3 +36850,127 @@ class cache_file_metadata_result: def __ne__(self, other): return not (self == other) + +class get_metastore_db_uuid_args: + + thrift_spec = ( + ) + + 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: + fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec)) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None: + oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec))) + return + oprot.writeStructBegin('get_metastore_db_uuid_args') + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + + def __hash__(self): + value = 17 + return value + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.iteritems()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) + +class get_metastore_db_uuid_result: + """ + Attributes: + - success + - o1 + """ + + thrift_spec = ( + (0, TType.STRING, 'success', None, None, ), # 0 + (1, TType.STRUCT, 'o1', (MetaException, MetaException.thrift_spec), None, ), # 1 + ) + + def __init__(self, success=None, o1=None,): + self.success = success + self.o1 = o1 + + 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: + fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec)) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.STRING: + self.success = iprot.readString() + else: + iprot.skip(ftype) + elif fid == 1: + if ftype == TType.STRUCT: + self.o1 = MetaException() + self.o1.read(iprot) + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None: + oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec))) + return + oprot.writeStructBegin('get_metastore_db_uuid_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.STRING, 0) + oprot.writeString(self.success) + oprot.writeFieldEnd() + if self.o1 is not None: + oprot.writeFieldBegin('o1', TType.STRUCT, 1) + self.o1.write(oprot) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + + def __hash__(self): + value = 17 + value = (value * 31) ^ hash(self.success) + value = (value * 31) ^ hash(self.o1) + return value + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.iteritems()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/gen/thrift/gen-rb/thrift_hive_metastore.rb ---------------------------------------------------------------------- diff --git a/metastore/src/gen/thrift/gen-rb/thrift_hive_metastore.rb b/metastore/src/gen/thrift/gen-rb/thrift_hive_metastore.rb index 04e63f3..b9d0fa2 100644 --- a/metastore/src/gen/thrift/gen-rb/thrift_hive_metastore.rb +++ b/metastore/src/gen/thrift/gen-rb/thrift_hive_metastore.rb @@ -2562,6 +2562,22 @@ module ThriftHiveMetastore raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'cache_file_metadata failed: unknown result') end + def get_metastore_db_uuid() + send_get_metastore_db_uuid() + return recv_get_metastore_db_uuid() + end + + def send_get_metastore_db_uuid() + send_message('get_metastore_db_uuid', Get_metastore_db_uuid_args) + end + + def recv_get_metastore_db_uuid() + result = receive_message(Get_metastore_db_uuid_result) + return result.success unless result.success.nil? + raise result.o1 unless result.o1.nil? + raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'get_metastore_db_uuid failed: unknown result') + end + end class Processor < ::FacebookService::Processor @@ -4457,6 +4473,17 @@ module ThriftHiveMetastore write_result(result, oprot, 'cache_file_metadata', seqid) end + def process_get_metastore_db_uuid(seqid, iprot, oprot) + args = read_args(iprot, Get_metastore_db_uuid_args) + result = Get_metastore_db_uuid_result.new() + begin + result.success = @handler.get_metastore_db_uuid() + rescue ::MetaException => o1 + result.o1 = o1 + end + write_result(result, oprot, 'get_metastore_db_uuid', seqid) + end + end # HELPER FUNCTIONS AND STRUCTURES @@ -10231,5 +10258,38 @@ module ThriftHiveMetastore ::Thrift::Struct.generate_accessors self end + class Get_metastore_db_uuid_args + include ::Thrift::Struct, ::Thrift::Struct_Union + + FIELDS = { + + } + + def struct_fields; FIELDS; end + + def validate + end + + ::Thrift::Struct.generate_accessors self + end + + class Get_metastore_db_uuid_result + include ::Thrift::Struct, ::Thrift::Struct_Union + SUCCESS = 0 + O1 = 1 + + FIELDS = { + SUCCESS => {:type => ::Thrift::Types::STRING, :name => 'success'}, + O1 => {:type => ::Thrift::Types::STRUCT, :name => 'o1', :class => ::MetaException} + } + + def struct_fields; FIELDS; end + + def validate + end + + ::Thrift::Struct.generate_accessors self + end + end http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java index cbcfc72..d9d50ab 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java @@ -6970,6 +6970,16 @@ public class HiveMetaStore extends ThriftHiveMetastore { } return new ForeignKeysResponse(ret); } + + @Override + public String get_metastore_db_uuid() throws MetaException, TException { + try { + return getMS().getMetastoreDbUuid(); + } catch (MetaException e) { + LOG.error("Exception thrown while querying metastore db uuid", e); + throw e; + } + } } http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java index 53f8118..3e6add2 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java @@ -2536,4 +2536,9 @@ public class HiveMetaStoreClient implements IMetaStoreClient { CacheFileMetadataResult result = client.cache_file_metadata(req); return result.isIsSupported(); } + + @Override + public String getMetastoreDbUuid() throws TException { + return client.get_metastore_db_uuid(); + } } http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java b/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java index 023a289..9c24c23 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java @@ -1664,4 +1664,12 @@ public interface IMetaStoreClient { void addForeignKey(List<SQLForeignKey> foreignKeyCols) throws MetaException, NoSuchObjectException, TException; + + /** + * Gets the unique id of the backing database instance used for storing metadata + * @return unique id of the backing database instance + * @throws MetaException if HMS is not able to fetch the UUID or if there are multiple UUIDs found in the database + * @throws TException in case of Thrift errors + */ + String getMetastoreDbUuid() throws MetaException, TException; } http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java b/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java index a83e12e..ed19f42 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java @@ -25,6 +25,8 @@ import java.lang.reflect.Field; import java.net.InetAddress; import java.net.URI; import java.nio.ByteBuffer; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -38,6 +40,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.Set; +import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Lock; @@ -145,6 +148,7 @@ import org.apache.hadoop.hive.metastore.model.MTableColumnStatistics; import org.apache.hadoop.hive.metastore.model.MTablePrivilege; import org.apache.hadoop.hive.metastore.model.MType; import org.apache.hadoop.hive.metastore.model.MVersionTable; +import org.apache.hadoop.hive.metastore.model.MMetastoreDBProperties; import org.apache.hadoop.hive.metastore.parser.ExpressionTree; import org.apache.hadoop.hive.metastore.parser.ExpressionTree.FilterBuilder; import org.apache.hadoop.hive.metastore.partition.spec.PartitionSpecProxy; @@ -170,6 +174,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; import com.google.common.collect.Maps; + /** * This class is the interface between the application logic and the database * store that contains the objects. Refrain putting any logic in mode.M* objects @@ -3505,6 +3510,77 @@ public class ObjectStore implements RawStore, Configurable { addForeignKeys(fks, true); } + @Override + public String getMetastoreDbUuid() throws MetaException { + String ret = getGuidFromDB(); + if(ret != null) { + return ret; + } + return createDbGuidAndPersist(); + } + + private String createDbGuidAndPersist() throws MetaException { + boolean success = false; + Query query = null; + try { + openTransaction(); + MMetastoreDBProperties prop = new MMetastoreDBProperties(); + prop.setPropertykey("guid"); + final String guid = UUID.randomUUID().toString(); + LOG.debug("Attempting to add a guid " + guid + " for the metastore db"); + prop.setPropertyValue(guid); + prop.setDescription("Metastore DB GUID generated on " + + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))); + pm.makePersistent(prop); + success = commitTransaction(); + if (success) { + LOG.info("Metastore db guid " + guid + " created successfully"); + return guid; + } + } catch (Exception e) { + LOG.warn(e.getMessage(), e); + } finally { + rollbackAndCleanup(success, query); + } + // it possible that some other HMS instance could have created the guid + // at the same time due which this instance could not create a guid above + // in such case return the guid already generated + final String guid = getGuidFromDB(); + if (guid == null) { + throw new MetaException("Unable to create or fetch the metastore database uuid"); + } + return guid; + } + + private String getGuidFromDB() throws MetaException { + boolean success = false; + Query query = null; + try { + openTransaction(); + query = pm.newQuery(MMetastoreDBProperties.class, "this.propertyKey == key"); + query.declareParameters("java.lang.String key"); + Collection<MMetastoreDBProperties> names = (Collection<MMetastoreDBProperties>) query.execute("guid"); + List<String> uuids = new ArrayList<String>(); + for (Iterator<MMetastoreDBProperties> i = names.iterator(); i.hasNext();) { + String uuid = i.next().getPropertyValue(); + LOG.debug("Found guid " + uuid); + uuids.add(uuid); + } + success = commitTransaction(); + if(uuids.size() > 1) { + throw new MetaException("Multiple uuids found"); + } + if(!uuids.isEmpty()) { + LOG.debug("Returning guid of metastore db : " + uuids.get(0)); + return uuids.get(0); + } + } finally { + rollbackAndCleanup(success, query); + } + LOG.warn("Guid for metastore db not found"); + return null; + } + private void addForeignKeys( List<SQLForeignKey> fks, boolean retrieveCD) throws InvalidObjectException, MetaException { http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/java/org/apache/hadoop/hive/metastore/RawStore.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/RawStore.java b/metastore/src/java/org/apache/hadoop/hive/metastore/RawStore.java index c22a1db..c1af690 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/RawStore.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/RawStore.java @@ -708,4 +708,11 @@ public interface RawStore extends Configurable { void addPrimaryKeys(List<SQLPrimaryKey> pks) throws InvalidObjectException, MetaException; void addForeignKeys(List<SQLForeignKey> fks) throws InvalidObjectException, MetaException; + + /** + * Gets the unique id of the backing datastore for the metadata + * @return + * @throws MetaException + */ + String getMetastoreDbUuid() throws MetaException; } http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java b/metastore/src/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java index 39b1676..a04fd5b 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java @@ -1576,4 +1576,9 @@ public class CachedStore implements RawStore, Configurable { public void setRawStore(RawStore rawStore) { this.rawStore = rawStore; } + + @Override + public String getMetastoreDbUuid() throws MetaException { + return rawStore.getMetastoreDbUuid(); + } } http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseStore.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseStore.java b/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseStore.java index f6420f5..0c7d8bb 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseStore.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/hbase/HBaseStore.java @@ -2859,4 +2859,9 @@ public class HBaseStore implements RawStore { // TODO: see if it makes sense to implement this here return null; } + + @Override + public String getMetastoreDbUuid() throws MetaException { + throw new MetaException("Get metastore DB uuid is not implemented"); + } } http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/model/org/apache/hadoop/hive/metastore/model/MMetastoreDBProperties.java ---------------------------------------------------------------------- diff --git a/metastore/src/model/org/apache/hadoop/hive/metastore/model/MMetastoreDBProperties.java b/metastore/src/model/org/apache/hadoop/hive/metastore/model/MMetastoreDBProperties.java new file mode 100644 index 0000000..c0a2485 --- /dev/null +++ b/metastore/src/model/org/apache/hadoop/hive/metastore/model/MMetastoreDBProperties.java @@ -0,0 +1,56 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hive.metastore.model; + +public class MMetastoreDBProperties { + private String propertyKey; + private String propertyValue; + private String description; + + public MMetastoreDBProperties() {} + + public MMetastoreDBProperties(String propertykey, String propertyValue, String description) { + this.propertyKey = propertykey; + this.propertyValue = propertyValue; + this.description = description; + } + + public String getPropertykey() { + return propertyKey; + } + + public void setPropertykey(String propertykey) { + this.propertyKey = propertykey; + } + + public String getPropertyValue() { + return propertyValue; + } + + public void setPropertyValue(String propertyValue) { + this.propertyValue = propertyValue; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/model/package.jdo ---------------------------------------------------------------------- diff --git a/metastore/src/model/package.jdo b/metastore/src/model/package.jdo index 969e199..9c7c691 100644 --- a/metastore/src/model/package.jdo +++ b/metastore/src/model/package.jdo @@ -971,6 +971,24 @@ </field> </class> + <class name="MMetastoreDBProperties" table="METASTORE_DB_PROPERTIES" identity-type="datastore" detachable="true"> + <datastore-identity> + <column name="PROPERTY_ID"/> + </datastore-identity> + <field name ="propertyKey"> + <column name="PROPERTY_KEY" length="255" jdbc-type="VARCHAR" allows-null="false"/> + </field> + <field name ="propertyValue"> + <column name="PROPERTY_VALUE" length="1000" jdbc-type="VARCHAR" allows-null="false"/> + </field> + <field name ="description"> + <column name="DESCRIPTION" length="1000" jdbc-type="VARCHAR" allows-null="false"/> + </field> + <index name="PropertyKeyIndex" unique="true"> + <column name="PROPERTY_KEY"/> + </index> + </class> + <class name="MResourceUri" embedded-only="true" table="RESOURCE_URI" detachable="true"> <field name="resourceType"> <column name="RESOURCE_TYPE" jdbc-type="INTEGER"/> http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/test/org/apache/hadoop/hive/metastore/DummyRawStoreControlledCommit.java ---------------------------------------------------------------------- diff --git a/metastore/src/test/org/apache/hadoop/hive/metastore/DummyRawStoreControlledCommit.java b/metastore/src/test/org/apache/hadoop/hive/metastore/DummyRawStoreControlledCommit.java index 3e3fd20..f613c30 100644 --- a/metastore/src/test/org/apache/hadoop/hive/metastore/DummyRawStoreControlledCommit.java +++ b/metastore/src/test/org/apache/hadoop/hive/metastore/DummyRawStoreControlledCommit.java @@ -877,4 +877,9 @@ public class DummyRawStoreControlledCommit implements RawStore, Configurable { // TODO Auto-generated method stub return null; } + + @Override + public String getMetastoreDbUuid() throws MetaException { + throw new MetaException("Get metastore uuid is not implemented"); + } } http://git-wip-us.apache.org/repos/asf/hive/blob/c9cfb601/metastore/src/test/org/apache/hadoop/hive/metastore/DummyRawStoreForJdoConnection.java ---------------------------------------------------------------------- diff --git a/metastore/src/test/org/apache/hadoop/hive/metastore/DummyRawStoreForJdoConnection.java b/metastore/src/test/org/apache/hadoop/hive/metastore/DummyRawStoreForJdoConnection.java index 91d8c2a..1720e37 100644 --- a/metastore/src/test/org/apache/hadoop/hive/metastore/DummyRawStoreForJdoConnection.java +++ b/metastore/src/test/org/apache/hadoop/hive/metastore/DummyRawStoreForJdoConnection.java @@ -893,6 +893,9 @@ public class DummyRawStoreForJdoConnection implements RawStore { // TODO Auto-generated method stub return null; } -} - + @Override + public String getMetastoreDbUuid() throws MetaException { + throw new MetaException("Get metastore uuid is not implemented"); + } +}
