]>
Commit | Line | Data |
---|---|---|
20effc67 TL |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
4 | #ifndef CEPH_COMPRESSION_ONWIRE_H | |
5 | #define CEPH_COMPRESSION_ONWIRE_H | |
6 | ||
1e59de90 | 7 | #include <cstdint> |
20effc67 TL |
8 | #include <optional> |
9 | ||
10 | #include "compressor/Compressor.h" | |
11 | #include "include/buffer.h" | |
12 | ||
13 | class CompConnectionMeta; | |
14 | ||
15 | namespace ceph::compression::onwire { | |
16 | using Compressor = TOPNSPC::Compressor; | |
17 | using CompressorRef = TOPNSPC::CompressorRef; | |
18 | ||
19 | class Handler { | |
20 | public: | |
21 | Handler(CephContext* const cct, CompressorRef compressor) | |
22 | : m_cct(cct), m_compressor(compressor) {} | |
23 | ||
24 | protected: | |
25 | CephContext* const m_cct; | |
26 | CompressorRef m_compressor; | |
27 | }; | |
28 | ||
29 | class RxHandler final : private Handler { | |
30 | public: | |
31 | RxHandler(CephContext* const cct, CompressorRef compressor) | |
32 | : Handler(cct, compressor) {} | |
33 | ~RxHandler() {}; | |
34 | ||
35 | /** | |
36 | * Decompresses a bufferlist | |
37 | * | |
38 | * @param input compressed bufferlist | |
39 | * @param out decompressed bufferlist | |
40 | * | |
41 | * @returns true on success, false on failure | |
42 | */ | |
43 | std::optional<ceph::bufferlist> decompress(const ceph::bufferlist &input); | |
44 | }; | |
45 | ||
46 | class TxHandler final : private Handler { | |
47 | public: | |
48 | TxHandler(CephContext* const cct, CompressorRef compressor, int mode, std::uint64_t min_size) | |
49 | : Handler(cct, compressor), | |
50 | m_min_size(min_size), | |
51 | m_mode(static_cast<Compressor::CompressionMode>(mode)) | |
52 | {} | |
53 | ~TxHandler() {} | |
54 | ||
55 | void reset_handler(int num_segments, uint64_t size) { | |
56 | m_init_onwire_size = size; | |
57 | m_compress_potential = size; | |
58 | m_onwire_size = 0; | |
59 | } | |
60 | ||
61 | void done(); | |
62 | ||
63 | /** | |
64 | * Compresses a bufferlist | |
65 | * | |
66 | * @param input bufferlist to compress | |
67 | * @param out compressed bufferlist | |
68 | * | |
69 | * @returns true on success, false on failure | |
70 | */ | |
71 | std::optional<ceph::bufferlist> compress(const ceph::bufferlist &input); | |
72 | ||
73 | double get_ratio() const { | |
74 | return get_initial_size() / (double) get_final_size(); | |
75 | } | |
76 | ||
77 | uint64_t get_initial_size() const { | |
78 | return m_init_onwire_size; | |
79 | } | |
80 | ||
81 | uint64_t get_final_size() const { | |
82 | return m_onwire_size; | |
83 | } | |
84 | ||
85 | private: | |
86 | uint64_t m_min_size; | |
87 | Compressor::CompressionMode m_mode; | |
88 | ||
89 | uint64_t m_init_onwire_size; | |
90 | uint64_t m_onwire_size; | |
91 | uint64_t m_compress_potential; | |
92 | }; | |
93 | ||
94 | struct rxtx_t { | |
95 | std::unique_ptr<RxHandler> rx; | |
96 | std::unique_ptr<TxHandler> tx; | |
97 | ||
98 | static rxtx_t create_handler_pair( | |
99 | CephContext* ctx, | |
100 | const CompConnectionMeta& comp_meta, | |
101 | std::uint64_t compress_min_size); | |
102 | }; | |
103 | } | |
104 | ||
105 | #endif // CEPH_COMPRESSION_ONWIRE_H |