Add switch to disable native lz4 #480
Merged
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.
By default, we use the native (JNI) LZ4 implementation, which is expected to be faster than the Java implementation.
However, the JNI mechanism has a drawback: native calls will hold the GCLock, which prevents GCs.
Consequently, if there are many parallel compression tasks, a typical scenario in IoTDB, GCs will be constantly blocked by native calls and can only run effectively for a short time.
OOM occurs when the CPU is not powerful enough to collect enough garbage during the limited GC time.
In this PR, the new configuration item "lz4_use_jni" allows the user to choose to adjust the LZ4 implementation.
When it is true (by default), TsFile will use the native implementation. Otherwise, it falls back to the Java implementation.
Although some performance loss is expected due to the less efficient Java implementation, reducing the chance of OOM when the GC pressure is high will reduce the need to hold GCLock.