data_transfer.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. # Copyright 2016 Cloudbase Solutions Srl
  2. # All Rights Reserved.
  3. import struct
  4. import zlib
  5. from oslo_log import log as logging
  6. LOG = logging.getLogger(__name__)
  7. def encode_data(msg_id, path, offset, content, compress=True):
  8. inflated_content = (path.encode() + b'\0' +
  9. struct.pack("<Q", offset) +
  10. content)
  11. data_len_inflated = len(inflated_content)
  12. if compress:
  13. data_content = zlib.compress(inflated_content)
  14. data_len = len(data_content)
  15. compression_saving = 100.0 * (1 - float(data_len) / data_len_inflated)
  16. LOG.debug("Compression space saving: {:.02f}%".format(
  17. compression_saving))
  18. if data_len >= data_len_inflated:
  19. # No advantage in sending the compressed data
  20. LOG.debug("Ignoring compression, not worth")
  21. compress = False
  22. if not compress:
  23. data_len = data_len_inflated
  24. data_len_inflated = 0
  25. data_content = inflated_content
  26. return (struct.pack("<I", msg_id) +
  27. struct.pack("<I", data_len) +
  28. struct.pack("<I", data_len_inflated) +
  29. data_content)
  30. def encode_eod(msg_id):
  31. return struct.pack("<I", msg_id) + struct.pack("<I", 0)