Hi Alan,

I think I understand your point. If we come up with the standalone MetaStore 
but the interface is completely different then the original one, then we will 
lose in adoption. I agree with your assessment.

Do you (or anyone) have any ideas, how can we rationalize the interface without 
disrupting the use cases you mentioned?
Sooner or later maintaining those 37 different ways to fetch partitions will be 
a huge burden, especially if we start adding new features like HIVE-17990, and 
hopefully others that come after that.
For example in Hadoop and Spark I see that there are "deprecated" methods which 
are getting removed after major releases. Do we have plans for this?

There are some boundaries which I did not feel yet, so I would like to know how 
the more experienced Hive developers feel about what constitutes a breaking 
change?
Is it a breaking change, if for a specific error the API was throwing 
InvalidObjectException, but after the change it will throw 
NoSuchObjectException -even if the method declaration does not need to be 
change for this?
Is it acceptable if we add a configuration value to the MetaStore to 
disable/enable throwing new exceptions? Like if "compatibility mode" is true, 
then the old exceptions are thrown, if it is false, then the new exceptions are 
thrown.
Note, that the complexity of the 2. version is only worth it, if we plan to 
adapt something like the Hadoop model, and sooner or later deprecate the old 
versions.

Thanks for joining the conversation, and highlighting important constraints!
Peter



> On Dec 15, 2017, at 4:33 PM, Alan Gates <alanfga...@gmail.com> wrote:
> 
> We do not want to break either the Thrift APIs or the IMetaStoreClient
> ones.  I do not know if we have ever declared them to be public or not, but
> they are de facto public in that everyone uses them.  Consider that these
> are used by Impala, Presto, Qubole, Amazon's Glue, Spark, and probably
> others we don't know about.  If we produce a new version that does not
> maintain those APIs everyone will just ignore it and stay on the older
> version (just like python 3).  I would even include changing exception
> types in this.
> 
> I would like to have a clean API with consistent error handling and that
> does not include 37 different ways to fetch partitions (I exaggerate only
> slightly), but we need to find a way to do it that does not force users to
> rewrite their application to upgrade to the standalone metastore.
> 
> Alan.
> 
> 
> On Fri, Dec 15, 2017 at 2:20 AM, Peter Vary <pv...@cloudera.com> wrote:
> 
>> If the application using the old API does not handle the original
>> exceptions differently than the TExceptions then it should work as expected.
>> 
>>> On Dec 14, 2017, at 10:50 PM, Thejas Nair <thejas.n...@gmail.com> wrote:
>>> 
>>> This direction looks good to me.
>>> If the new exceptions are inheriting from TException the applications
>> would
>>> still work. But would it still work if we old metastore client library is
>>> used with a newer version of metastore server running with these changes
>> ?
>>> 
>>> 
>>> On Wed, Dec 13, 2017 at 4:02 AM, Peter Vary <pv...@cloudera.com> wrote:
>>> 
>>>> Hi Team,
>>>> 
>>>> Since the work begin to separate the HMS to a standalone project we
>>>> thought that it would be useful the create extensive API tests for the
>>>> public APIs of the new project.
>>>> We started to create tests using the IMetaStoreClient interface
>>>> implementations and found that not surprisingly the happy paths are
>> working
>>>> as expected, but there are some gaps in the exception handling. Most of
>> the
>>>> enhancements affect the Thrift API as well.
>>>> We went through the following methods:
>>>> Functions
>>>> Indexes
>>>> Tables
>>>> Databases
>>>> We also plan to comb through at least the Partition related methods too.
>>>> 
>>>> The possible enhancements we found could be grouped to the following
>>>> categories:
>>>> Bugs: For example IMetaStoreClient.drop/alter/createFunction with null
>>>> function name might throw NullPointerException exception - this is
>> clearly
>>>> a bug which should be solved:
>>>> Embedded MetaStore throws NullPointerException
>>>> Remote MetaStore client throws TTransportException
>>>> Sub-optimal error handling: For example IMetaStoreClient.alterFunction
>>>> will not check if the new function is already exist, and tries to
>> insert it
>>>> anyway. After 10 tries it throws a MetaException where the exception
>> text
>>>> is "Update of object [...] failed : java.sql.
>>>> SQLIntegrityConstraintViolationException [...]". Fixing this could be
>>>> done without interface change, but following the logic of the other
>> methods
>>>> on the interface AlreadyExistsException should be thrown.
>>>> Inconsistent exception handling: Different methods will throw different
>>>> exceptions for similar errors. This makes the interface hard to
>> understand,
>>>> hard to document and maintain. For example:
>>>> Calling IMetaStoreClient.createTable with nonexistent database name will
>>>> throw InvalidObjectException
>>>> Calling IMetaStoreClient.createFunction with nonexistent database name
>>>> database will throw NoSuchObjectException
>>>> There are some cases when the Embedded MetaStore handles error
>> differently
>>>> than the Remote MetaStore. For example: IMetaStoreClient.dropTable with
>>>> "null" as a database:
>>>> Embedded MetaStore throws MetaException
>>>> Remote MetaStore client throws TProtocolException
>>>> 
>>>> Proposed changes:
>>>> Fixing cases 1. and 2. is a simple bug fix - it could be done
>> independently
>>>> Fixing cases 3. and 4. will change how the IMetaStoreClient and HMS
>> Thrift
>>>> API works. For these we should review the IMetaStoreClient and HMS
>> Thrift
>>>> API interface exception handling, to create consistent and easy to
>> follow
>>>> rules for the possible exceptions. We propose to keep the current
>>>> exceptions, and only change when the given type of exceptions are
>> thrown.
>>>> If we stick to this then the interface will be binary backward
>> compatible
>>>> since currently every method defines TException as a throwable and every
>>>> exception is inherited from TException. I think we allowed to change
>> this
>>>> since 3.0.0 is a major release.
>>>> 
>>>> Do we agree with the general direction of these changes?
>>>> 
>>>> Thanks,
>>>> Peter
>>>> 
>>>> 
>> 
>> 

Reply via email to