[ 
https://issues.apache.org/jira/browse/HIVE-17008?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Dan Burkert updated HIVE-17008:
-------------------------------
    Comment: was deleted

(was: My comment yesterday evening was a bit brief because I was low on time, 
but here's the exact sequence of events that leads to the NPE which originally 
prompted this issue.  As we've discussed it's just one of many inter-related 
issues in the class, but I wanted to make it clear what's happening in this 
specific case:

1. Application calls {{ThriftHiveMetastore.drop_database}} with a non-existent 
database name via the HMS thrift API¹.
2. In {{HiveMetaStore.drop_database_core}}, the {{db}} local variable is 
[initialized to 
{{null}}|https://github.com/apache/hive/blob/555f001146c4fc471e29e18899a0e02a4043cca5/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java#L1023].
3. In {{HiveMetaStore.drop_database_core}}, the [lookup of the non-existent 
database 
fails|https://github.com/apache/hive/blob/555f001146c4fc471e29e18899a0e02a4043cca5/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java#L1029],
 leaving {{db}} set to {{null}} and unwinding to the {{finally}} block.
4. In {{HiveMetaSotre.drop_database_core}} {{finally}} block, a new 
[{{DropDatabaseEvent}} is 
created|https://github.com/apache/hive/blob/555f001146c4fc471e29e18899a0e02a4043cca5/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java#L1139-L1143]
 with the {{null}} database, and listeners are notified with this event.
5. Somewhere (I haven't traced this bit), the notification log event listener 
is dereferencing the null database.

¹ Although I haven't reproduced it, it should be possible to reproduce this bug 
through the Java {{HiveMetastoreClient}} API as well, but it would require 
concurrent DDL operations.  The {{HiveMetastoreClient}} [checks that the 
database 
exists|https://github.com/apache/hive/blob/master/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java#L851-L858]
 before attempting to drop it; this is a benign TOCTOU which makes it difficult 
to reproduce using that API (again, it should still possible with the right 
interleavings of concurrent DDL ops).  A light skimming through that class 
reveals that the client is _very_ aggressive about validating state exists 
before issuing DDL operations.  Just my opinion, but that's a big code smell; 
the client should rely on the server to validate arguments.)

> HiveMetastore.drop_database can return NPE if database does not exist
> ---------------------------------------------------------------------
>
>                 Key: HIVE-17008
>                 URL: https://issues.apache.org/jira/browse/HIVE-17008
>             Project: Hive
>          Issue Type: Bug
>          Components: Metastore
>            Reporter: Dan Burkert
>            Assignee: Dan Burkert
>         Attachments: HIVE-17008.0.patch
>
>
> When dropping a non-existent database, the HMS will still fire registered 
> {{DROP_DATABASE}} event listeners.  This results in an NPE when the listeners 
> attempt to deref the {{null}} database parameter.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to