1111except ImportError :
1212 cramjam = None
1313
14- try :
15- import lz4 .frame as lz4
16-
17- def _lz4_compress (payload , ** kwargs ):
18- # Kafka does not support LZ4 dependent blocks
19- # https://cwiki.apache.org/confluence/display/KAFKA/KIP-57+-+Interoperable+LZ4+Framing
20- kwargs .pop ("block_linked" , None )
21- return lz4 .compress (payload , block_linked = False , ** kwargs )
22-
23- except ImportError :
24- lz4 = None
25-
26- try :
27- import lz4f
28- except ImportError :
29- lz4f = None
30-
31- try :
32- import lz4framed
33- except ImportError :
34- lz4framed = None
35-
3614
3715def has_gzip ():
3816 return True
@@ -47,13 +25,7 @@ def has_zstd():
4725
4826
4927def has_lz4 ():
50- if lz4 is not None :
51- return True
52- if lz4f is not None :
53- return True
54- if lz4framed is not None :
55- return True
56- return False
28+ return cramjam is not None
5729
5830
5931def gzip_encode (payload , compresslevel = None ):
@@ -161,7 +133,7 @@ def _detect_xerial_stream(payload):
161133 """
162134
163135 if len (payload ) > 16 :
164- header = struct .unpack ("!" + _XERIAL_V1_FORMAT , bytes (payload )[:16 ])
136+ header = struct .unpack ("!" + _XERIAL_V1_FORMAT , memoryview (payload )[:16 ])
165137 return header == _XERIAL_V1_HEADER
166138 return False
167139
@@ -191,38 +163,26 @@ def snappy_decode(payload):
191163 return bytes (cramjam .snappy .decompress_raw (payload ))
192164
193165
194- if lz4 :
195- lz4_encode = _lz4_compress # pylint: disable-msg=no-member
196- elif lz4f :
197- lz4_encode = lz4f .compressFrame # pylint: disable-msg=no-member
198- elif lz4framed :
199- lz4_encode = lz4framed .compress # pylint: disable-msg=no-member
200- else :
201- lz4_encode = None
202-
203-
204- def lz4f_decode (payload ):
205- """Decode payload using interoperable LZ4 framing. Requires Kafka >= 0.10"""
206- # pylint: disable-msg=no-member
207- ctx = lz4f .createDecompContext ()
208- data = lz4f .decompressFrame (payload , ctx )
209- lz4f .freeDecompContext (ctx )
210-
211- # lz4f python module does not expose how much of the payload was
212- # actually read if the decompression was only partial.
213- if data ["next" ] != 0 :
214- raise RuntimeError ("lz4f unable to decompress full payload" )
215- return data ["decomp" ]
216-
217-
218- if lz4 :
219- lz4_decode = lz4 .decompress # pylint: disable-msg=no-member
220- elif lz4f :
221- lz4_decode = lz4f_decode
222- elif lz4framed :
223- lz4_decode = lz4framed .decompress # pylint: disable-msg=no-member
224- else :
225- lz4_decode = None
166+ def lz4_encode (payload , level = 9 ):
167+ # level=9 is used by default by broker itself
168+ # https://cwiki.apache.org/confluence/display/KAFKA/KIP-390%3A+Support+Compression+Level
169+ if not has_lz4 ():
170+ raise NotImplementedError ("LZ4 codec is not available" )
171+
172+ # Kafka broker doesn't support linked-block compression
173+ # https://cwiki.apache.org/confluence/display/KAFKA/KIP-57+-+Interoperable+LZ4+Framing
174+ compressor = cramjam .lz4 .Compressor (
175+ level = level , content_checksum = False , block_linked = False
176+ )
177+ compressor .compress (payload )
178+ return bytes (compressor .finish ())
179+
180+
181+ def lz4_decode (payload ):
182+ if not has_lz4 ():
183+ raise NotImplementedError ("LZ4 codec is not available" )
184+
185+ return bytes (cramjam .lz4 .decompress (payload ))
226186
227187
228188def zstd_encode (payload , level = None ):
0 commit comments