lib/avro/data_file.rb in avro-1.8.1 vs lib/avro/data_file.rb in avro-1.8.2
- old
+ new
@@ -336,15 +336,32 @@
class SnappyCodec
def codec_name; 'snappy'; end
def decompress(data)
load_snappy!
+ crc32 = data.slice(-4..-1).unpack('N').first
+ uncompressed = Snappy.inflate(data.slice(0..-5))
+
+ if crc32 == Zlib.crc32(uncompressed)
+ uncompressed
+ else
+ # older versions of avro-ruby didn't write the checksum, so if it
+ # doesn't match this must assume that it wasn't there and return
+ # the entire payload uncompressed.
+ Snappy.inflate(data)
+ end
+ rescue Snappy::Error
+ # older versions of avro-ruby didn't write the checksum, so removing
+ # the last 4 bytes may cause Snappy to fail. recover by assuming the
+ # payload is from an older file and uncompress the entire buffer.
Snappy.inflate(data)
end
def compress(data)
load_snappy!
- Snappy.deflate(data)
+ crc32 = Zlib.crc32(data)
+ compressed = Snappy.deflate(data)
+ [compressed, crc32].pack('a*N')
end
private
def load_snappy!