Fix BloscCompression class poisoning when Blosc is unavailable#6
Merged
Conversation
GeffUtils.DEFAULT_COMPRESSION was a static field initialized at class
load time. When computeFirstDimChunk() was called before N5ZarrWriter
was constructed, loading GeffUtils triggered new BloscCompression(),
which threw UnsatisfiedLinkError and permanently marked the class as
failed. N5ZarrWriter subsequently called Class.forName("BloscCompression")
internally and received NoClassDefFoundError, which it does not catch,
causing a crash.
Replace the static field with a lazy-initialization holder (the
initialization-on-demand holder idiom). DefaultCompressionHolder.INSTANCE
is only initialized the first time a write method calls defaultCompression(),
by which point N5ZarrWriter has already handled the UnsatisfiedLinkError
itself. The subsequent NoClassDefFoundError thrown inside
createDefaultCompression() is caught by the existing Throwable handler and
falls back to RawCompression as intended.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
GeffUtils.DEFAULT_COMPRESSION was a static field initialized at class load time. When computeFirstDimChunk() was called before N5ZarrWriter was constructed, loading GeffUtils triggered new BloscCompression(), which threw UnsatisfiedLinkError and permanently marked the class as failed. N5ZarrWriter subsequently called Class.forName("BloscCompression") internally and received NoClassDefFoundError, which it does not catch, causing a crash.
Replace the static field with a lazy-initialization holder (the initialization-on-demand holder idiom). DefaultCompressionHolder.INSTANCE is only initialized the first time a write method calls defaultCompression(), by which point N5ZarrWriter has already handled the UnsatisfiedLinkError itself. The subsequent NoClassDefFoundError thrown inside createDefaultCompression() is caught by the existing Throwable handler and falls back to RawCompression as intended.