Skip to content

Commit 572bc39

Browse files
viiryasrowen
authored andcommitted
[SPARK-12961][CORE] Prevent snappy-java memory leak
JIRA: https://issues.apache.org/jira/browse/SPARK-12961 To prevent memory leak in snappy-java, just call the method once and cache the result. After the library releases new version, we can remove this object. JoshRosen Author: Liang-Chi Hsieh <[email protected]> Closes #10875 from viirya/prevent-snappy-memory-leak. (cherry picked from commit 5936bf9) Signed-off-by: Sean Owen <[email protected]>
1 parent b40e58c commit 572bc39

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

core/src/main/scala/org/apache/spark/io/CompressionCodec.scala

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,7 @@ class LZFCompressionCodec(conf: SparkConf) extends CompressionCodec {
149149
*/
150150
@DeveloperApi
151151
class SnappyCompressionCodec(conf: SparkConf) extends CompressionCodec {
152-
153-
try {
154-
Snappy.getNativeLibraryVersion
155-
} catch {
156-
case e: Error => throw new IllegalArgumentException(e)
157-
}
152+
val version = SnappyCompressionCodec.version
158153

159154
override def compressedOutputStream(s: OutputStream): OutputStream = {
160155
val blockSize = conf.getSizeAsBytes("spark.io.compression.snappy.blockSize", "32k").toInt
@@ -164,6 +159,19 @@ class SnappyCompressionCodec(conf: SparkConf) extends CompressionCodec {
164159
override def compressedInputStream(s: InputStream): InputStream = new SnappyInputStream(s)
165160
}
166161

162+
/**
163+
* Object guards against memory leak bug in snappy-java library:
164+
* (https://github.com/xerial/snappy-java/issues/131).
165+
* Before a new version of the library, we only call the method once and cache the result.
166+
*/
167+
private final object SnappyCompressionCodec {
168+
private lazy val version: String = try {
169+
Snappy.getNativeLibraryVersion
170+
} catch {
171+
case e: Error => throw new IllegalArgumentException(e)
172+
}
173+
}
174+
167175
/**
168176
* Wrapper over [[SnappyOutputStream]] which guards against write-after-close and double-close
169177
* issues. See SPARK-7660 for more details. This wrapping can be removed if we upgrade to a version

0 commit comments

Comments
 (0)