-
Notifications
You must be signed in to change notification settings - Fork 4.8k
HIVE-27224: Enhance drop table/partition command #5851
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
|
|
A couple of test failures seem to be related to this patch. |
| wh.addToChangeManagement(funcCmPath); | ||
| } | ||
| if (req.isDeleteData()) { | ||
| // Moving the data deletion out of the async handler. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we should move this into the operation handler, because if a thrift client only calls this api once in async mode, then such cleanup code would never be run.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In async mode, the client still need to ping the server for the operation status until the end, the client needs to know whether the request is a failure or not.
The main reason is the TUGIBasedProcessor/TUGIAssumingProcessor might close the shared FileSystem behind, causing the "java.io.IOException: Filesystem closed" for the handler running in background.
Still we need to address this "Filesystem closed" issue, as we don't know whether there are Filesystem operations in the Metastore listeners.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FileSystem.closeAllForUGI(clientUgi); in TUGIAssumingProcessor seems a bug, assume that there are two requests with same ugi to handle the same path uri concurrently, it may also hit the "Filesystem closed" issue.
This is indeed a tricky problem, not sure if we can only remove cache for inactive ugi to solve it. And for this thread, it still has an issue if the client crush between two pings before the operation handler finished, the cleanup code will not take effect either.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nice catch, we should take the client crash into the picture
...-server/src/main/java/org/apache/hadoop/hive/metastore/handler/AbstractOperationHandler.java
Show resolved
Hide resolved
e603abc to
e54f5a9
Compare
| if (ugiTransport.getClientUGI() == null) { | ||
| ugiTransport.setClientUGI(clientUgi); | ||
| } | ||
| clientUgi = ugiTransport.getClientUGI(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this line unnecessary? clientUgi is already initialized.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The ugi is identical: https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/UserGroupInformation.java#L483-L491,
reuse the ugi cached in ugiTransport if possible so the connection will get the same FileSystem instance from cache in the whole lifetime
...ne-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
Outdated
Show resolved
Hide resolved
| if (request.isNeedResult()) { | ||
| AddPartitionsHandler addPartsOp = AbstractOperationHandler.offer(this, request); | ||
| if (addPartsOp.success() && request.isNeedResult()) { | ||
| AddPartitionsHandler.AddPartitionsResult addPartsResult = addPartsOp.getResult(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we store the partition list in the AddPartitionsResult and return it directly here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no enough, the addPartsOp.success() need to check on the state(success or not) of addPartsOp.getResult()
| if (async) { | ||
| OPID_CLEANER.schedule(() -> OPID_TO_HANDLER.remove(id), 1, TimeUnit.HOURS); | ||
| } | ||
| afterExecute(resultV); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If afterExecute() is needed only when the execute() is success, we can check the result here
| afterExecute(resultV); | |
| if (resultV != null && resultV.success()) { | |
| afterExecute(resultV); | |
| }``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the afterExecute is also called in case of failure to free up some resources the handler might hold
|
wecharyu
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM(non-binding), it's a nice enhance to such heavy operations and a good start to split the huge HMSHandler class.



What changes were proposed in this pull request?
Why are the changes needed?
Does this PR introduce any user-facing change?
How was this patch tested?