summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTaras <voyn1991@gmail.com>2018-02-19 16:59:57 +0200
committerTaras <voyn1991@gmail.com>2018-02-19 16:59:57 +0200
commit53b0c70ebc208d843e1660a9ee57fd2e615efb16 (patch)
treedcbd7e71df753676b0114f39ff3af509c29db575
parent60b22b15900621fc3d0cd73021bda8d5fc252055 (diff)
downloadkafka-python-53b0c70ebc208d843e1660a9ee57fd2e615efb16.tar.gz
Use hardware accelerated CRC32C function if available
-rw-r--r--kafka/record/util.py14
-rw-r--r--test/record/test_util.py5
-rw-r--r--tox.ini1
3 files changed, 15 insertions, 5 deletions
diff --git a/kafka/record/util.py b/kafka/record/util.py
index 55d7adb..74b9a69 100644
--- a/kafka/record/util.py
+++ b/kafka/record/util.py
@@ -1,6 +1,10 @@
import binascii
from kafka.record._crc32c import crc as crc32c_py
+try:
+ from crc32c import crc32 as crc32c_c
+except ImportError:
+ crc32c_c = None
def encode_varint(value, write):
@@ -113,11 +117,15 @@ def decode_varint(buffer, pos=0):
raise ValueError("Out of int64 range")
-def calc_crc32c(memview):
+_crc32c = crc32c_py
+if crc32c_c is not None:
+ _crc32c = crc32c_c
+
+
+def calc_crc32c(memview, _crc32c=_crc32c):
""" Calculate CRC-32C (Castagnoli) checksum over a memoryview of data
"""
- crc = crc32c_py(memview)
- return crc
+ return _crc32c(memview)
def calc_crc32(memview):
diff --git a/test/record/test_util.py b/test/record/test_util.py
index bfe0fcc..0b2782e 100644
--- a/test/record/test_util.py
+++ b/test/record/test_util.py
@@ -68,9 +68,10 @@ def test_size_of_varint(encoded, decoded):
assert util.size_of_varint(decoded) == len(encoded)
-def test_crc32c():
+@pytest.mark.parametrize("crc32_func", [util.crc32c_c, util.crc32c_py])
+def test_crc32c(crc32_func):
def make_crc(data):
- crc = util.calc_crc32c(data)
+ crc = crc32_func(data)
return struct.pack(">I", crc)
assert make_crc(b"") == b"\x00\x00\x00\x00"
assert make_crc(b"a") == b"\xc1\xd0\x43\x30"
diff --git a/tox.ini b/tox.ini
index 0f1aaf4..35dc842 100644
--- a/tox.ini
+++ b/tox.ini
@@ -18,6 +18,7 @@ deps =
python-snappy
lz4
xxhash
+ crc32c
py26: unittest2
commands =
py.test {posargs:--pylint --pylint-rcfile=pylint.rc --pylint-error-types=EF --cov=kafka --cov-config=.covrc}