[ 
https://issues.apache.org/jira/browse/GOBBLIN-1826?focusedWorklogId=859287&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-859287
 ]

ASF GitHub Bot logged work on GOBBLIN-1826:
-------------------------------------------

                Author: ASF GitHub Bot
            Created on: 27/Apr/23 03:08
            Start Date: 27/Apr/23 03:08
    Worklog Time Spent: 10m 
      Work Description: Will-Lo opened a new pull request, #3688:
URL: https://github.com/apache/gobblin/pull/3688

   … fix bug in Hive registration where classes can escape type casts
   
   Dear Gobblin maintainers,
   
   Please accept this PR. I understand that it will not be reviewed until I 
have checked off all the steps below!
   
   
   ### JIRA
   - [ ] My PR addresses the following [Gobblin 
JIRA](https://issues.apache.org/jira/browse/GOBBLIN/) issues and references 
them in the PR title. For example, "[GOBBLIN-XXX] My Gobblin PR"
       - https://issues.apache.org/jira/browse/GOBBLIN-1826
   
   
   ### Description
   - [ ] Here are some details about my PR, including screenshots (if 
applicable):
   After the Guava 20 upgrade, there is a bug in the Hive registration code.
   When setting table properties, `HiveTable` calls this function in 
`HiveRegistrationUnit` to set Properties
   ```
     protected static <T> Optional<T> populateField(State state, String key, 
TypeToken<T> token) {
   ```
   Since it returns a type generic Optional, it is possible to assign an 
incorrect class to a field. So an Optional<Long> can actually be holding a 
String value and causes a Class cast exception.
   
   What was happening is that in Guava 20, `isAssignableFrom` is deprecated 
from the `TypeToken` class. Instead, the following code pattern was used:
   
   ```
         } else if (new TypeToken<Long>() 
{}.getRawType().isAssignableFrom(token.getClass())) {
   ```
   However, in this case getRawType() would have returned java.Lang.Long, so it 
would not be assignable to the token class but rather the base class.
   
   To avoid all this headache, and to also properly validate the List<String> 
token type, we should be using `.isSupertypeOf()` in lieu of 
`isAssignableFrom()`.
   
   This time also wrote a unit test to validate the runtime behavior of each 
type.
   
   
   ### Tests
   - [x] My PR adds the following unit tests __OR__ does not need testing for 
this extremely good reason:
   Unit tests
   
   ### Commits
   - [ ] My commits all reference JIRA issues in their subject lines, and I 
have squashed multiple commits if they address the same issue. In addition, my 
commits follow the guidelines from "[How to write a good git commit 
message](http://chris.beams.io/posts/git-commit/)":
       1. Subject is separated from body by a blank line
       2. Subject is limited to 50 characters
       3. Subject does not end with a period
       4. Subject uses the imperative mood ("add", not "adding")
       5. Body wraps at 72 characters
       6. Body explains "what" and "why", not "how"
   
   




Issue Time Tracking
-------------------

            Worklog Id:     (was: 859287)
    Remaining Estimate: 0h
            Time Spent: 10m

> Fix bug in Hive registration code where fields could be miscasted in types
> --------------------------------------------------------------------------
>
>                 Key: GOBBLIN-1826
>                 URL: https://issues.apache.org/jira/browse/GOBBLIN-1826
>             Project: Apache Gobblin
>          Issue Type: Bug
>          Components: gobblin-core
>            Reporter: William Lo
>            Assignee: Abhishek Tiwari
>            Priority: Major
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> After the Guava 20 upgrade, there was a major bug in the Hive registration 
> code where fields could be casted as an unexpected type in 
> HiveRegistrationUnit  
> {code:java}
> protected static <T> Optional<T> populateField(State state, String key, 
> TypeToken<T> token) {
>  {code}
> The field setter is returning an Optional generic, which allows the code to 
> compile but fail during runtime as the types are mismatched, leading to a 
> casting exception when reading the type e.g.
> {code:java}
>  java.lang.ClassCastException: java.lang.String cannot be cast to 
> java.lang.Long at 
> org.apache.gobblin.hive.metastore.HiveMetaStoreUtils.getTable(HiveMetaStoreUtils.java:111)
>  {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to