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 >> >>