isClassLoadable answers false on threads without a context classloader
- Dominant language
- Scala
- Stars
- 2.4k
- Forks
- 1k
- PR merge metrics
- No merged PRs in 30d
Description
### Describe the bug
`ReflectUtils.isClassLoadable` defaults its loader to the thread context classloader:
```scala
def isClassLoadable(
className: String,
cl: ClassLoader = Thread.currentThread().getContextClassLoader): Boolean = ...
```
On a thread whose context classloader is null, `DynClasses.builder().loader(null)` resolves the name with `Class.forName(name, true, null)`, which delegates to the bootstrap loader. The bootstrap loader sees only JDK classes, so the probe answers `false` for every application class, including Kyuubi's own, even when that class is loadable through the loader that defined `ReflectUtils`.
A thread can carry a null context classloader in embedded scenarios: a host that starts the JVM through the JNI invocation API without setting one, or a container framework that clears it. `Logging` and `JDBCMetadataStore` probe optional integrations through this helper, so on such a thread the SLF4J bridge or the MySQL driver would be reported as absent when it is present.
Spark's own `Utils.classForName` / `getContextOrSparkClassLoader` guard against this by falling back to a real loader instead of trusting a null context loader.
### Affects Version(s)
master (1.13.0-SNAPSHOT), and earlier releases carrying `kyuubi-util-scala`.
### Are you willing to submit PR?
Yes.
Contributor guide
Research direction
Start at ReflectUtils.isClassLoadable and inspect how its default thread context classloader reaches DynClasses.builder().loader(null). Reproduce the probe with a null context classloader, then verify that an application class and the optional SLF4J or MySQL integrations are detected through a real defining loader.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- scala, spark
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 72/100