[
https://issues.apache.org/jira/browse/HIVE-22417?focusedWorklogId=796390&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-796390
]
ASF GitHub Bot logged work on HIVE-22417:
-----------------------------------------
Author: ASF GitHub Bot
Created on: 29/Jul/22 13:54
Start Date: 29/Jul/22 13:54
Worklog Time Spent: 10m
Work Description: zabetak commented on code in PR #3478:
URL: https://github.com/apache/hive/pull/3478#discussion_r933296697
##########
standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/ReplChangeManager.java:
##########
@@ -205,7 +205,7 @@ private ReplChangeManager(Configuration conf) throws
MetaException {
inited = true;
}
} catch (IOException e) {
- throw new MetaException(StringUtils.stringifyException(e));
+ throw new MetaException(e.getMessage());
Review Comment:
I agree that "Log-and-Throw" is problematic but losing the cause (or part of
the stack trace) is equally bad (maybe worse).
I was thinking a bit more about this and came up with the following idea:
```java
throw MetaStoreUtils.newMetaException("Failed to create ReplChangeManager",
e);
```
Using the above snippet we can avoid the "Log-and-Throw" anti-pattern and
also retain the original cause and stack trace without plumbing everything into
the exception message. If ever this error reaches the client it will have a
meaningful message pointing the problem without the redundant stack trace.
One problem that I see with my proposal (but also with the proposed changes
in this PR to deprecate `StringUtils.stringifyException`) is that if the
`MetaException` propagates all the way up to the Thrift processor (i.e., nobody
catches it) then we will have no clue about the real cause; there will be no
log events and the error reaching the client will only contain the message (no
cause neither stacktrace). Despite this problem, I still believe that the
pattern of putting the whole stacktrace as a message in another exception is a
bad practice and should not be used.
Moreover, I am not in favor of sending complete stack traces from server to
client. I know that there were attempts to explicitly do this (e.g., HIVE-3626,
HIVE-26345, etc) in order to give more information to the user but I would
advise against. Doing this can leak sensitive information and also goes against
the usual guidelines of throwing exceptions appropriate to the abstraction
(Effective Java, Item 61: Throw exceptions appropriate to the abstraction).
Long story short, I think it is worth pushing this PR forward possibly
incorporating the proposal outlined above. WDYT @belugabehr ?
##########
standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/ReplChangeManager.java:
##########
@@ -378,32 +378,28 @@ static Path getCMPath(Configuration conf, String name,
String checkSum, String c
* @return Corresponding FileInfo object
*/
public static FileInfo getFileInfo(Path src, String checksumString, String
srcCMRootURI, String subDir,
- Configuration conf) throws MetaException {
- try {
- FileSystem srcFs = src.getFileSystem(conf);
- if (checksumString == null) {
- return new FileInfo(srcFs, src, subDir);
- }
+ Configuration conf) throws IOException {
+ FileSystem srcFs = src.getFileSystem(conf);
+ if (checksumString == null) {
+ return new FileInfo(srcFs, src, subDir);
+ }
- Path cmPath = getCMPath(conf, src.getName(), checksumString,
srcCMRootURI);
- if (!srcFs.exists(src)) {
- return new FileInfo(srcFs, src, cmPath, checksumString, false, subDir);
- }
+ Path cmPath = getCMPath(conf, src.getName(), checksumString, srcCMRootURI);
+ if (!srcFs.exists(src)) {
+ return new FileInfo(srcFs, src, cmPath, checksumString, false, subDir);
+ }
- String currentChecksumString;
- try {
- currentChecksumString = checksumFor(src, srcFs);
- } catch (IOException ex) {
- // If the file is missing or getting modified, then refer CM path
- return new FileInfo(srcFs, src, cmPath, checksumString, false, subDir);
- }
- if ((currentChecksumString == null) ||
checksumString.equals(currentChecksumString)) {
- return new FileInfo(srcFs, src, cmPath, checksumString, true, subDir);
- } else {
- return new FileInfo(srcFs, src, cmPath, checksumString, false, subDir);
- }
- } catch (IOException e) {
- throw new MetaException(StringUtils.stringifyException(e));
Review Comment:
The decision of throwing `MetaException` in HIVE-15525 was either an
oversight or an attempt to keep this method inline with other methods in this
class. Ideally, the only place that should throw `MetaException` should be the
`HMSHandler` so removing it from here is a net positive change from my
perspective.
Moreover, I checked the immediate callers of this method and it seems
completely safe to drop the `MetaException` and propagate the `IOException`
since it will not affect the behavior of HMS.
Issue Time Tracking
-------------------
Worklog Id: (was: 796390)
Time Spent: 1h (was: 50m)
> Remove stringifyException from MetaStore
> ----------------------------------------
>
> Key: HIVE-22417
> URL: https://issues.apache.org/jira/browse/HIVE-22417
> Project: Hive
> Issue Type: Sub-task
> Components: Metastore, Standalone Metastore
> Affects Versions: 3.2.0
> Reporter: David Mollitor
> Assignee: David Mollitor
> Priority: Major
> Labels: pull-request-available
> Attachments: HIVE-22417.1.patch, HIVE-22417.2.patch
>
> Time Spent: 1h
> Remaining Estimate: 0h
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)