]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/common/test_cdc.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
8 #include "include/types.h"
9 #include "include/buffer.h"
11 #include "common/CDC.h"
12 #include "gtest/gtest.h"
16 class CDCTest
: public ::testing::Test
,
17 public ::testing::WithParamInterface
<const char*> {
19 std::unique_ptr
<CDC
> cdc
;
22 auto plugin
= GetParam();
23 cdc
= CDC::create(plugin
, 18);
27 TEST_P(CDCTest
, insert_front
)
29 if (GetParam() == "fixed"s
) return;
30 for (int frontlen
= 1; frontlen
< 163840; frontlen
*= 3) {
32 generate_buffer(4*1024*1024, &bl1
);
33 generate_buffer(frontlen
, &bl2
);
37 vector
<pair
<uint64_t, uint64_t>> chunks1
, chunks2
;
38 cdc
->calc_chunks(bl1
, &chunks1
);
39 cdc
->calc_chunks(bl2
, &chunks2
);
40 cout
<< "1: " << chunks1
<< std::endl
;
41 cout
<< "2: " << chunks2
<< std::endl
;
43 ASSERT_GE(chunks2
.size(), chunks1
.size());
45 for (unsigned i
= 0; i
< chunks1
.size(); ++i
) {
46 unsigned j
= i
+ (chunks2
.size() - chunks1
.size());
47 if (chunks1
[i
].first
+ frontlen
== chunks2
[j
].first
&&
48 chunks1
[i
].second
== chunks2
[j
].second
) {
52 ASSERT_GE(match
, chunks1
.size() - 1);
56 TEST_P(CDCTest
, insert_middle
)
58 if (GetParam() == "fixed"s
) return;
59 for (int frontlen
= 1; frontlen
< 163840; frontlen
*= 3) {
61 generate_buffer(4*1024*1024, &bl1
);
63 generate_buffer(frontlen
, &m
);
64 f
.substr_of(bl1
, 0, bl1
.length() / 2);
65 e
.substr_of(bl1
, bl1
.length() / 2, bl1
.length() / 2);
71 vector
<pair
<uint64_t, uint64_t>> chunks1
, chunks2
;
72 cdc
->calc_chunks(bl1
, &chunks1
);
73 cdc
->calc_chunks(bl2
, &chunks2
);
74 cout
<< "1: " << chunks1
<< std::endl
;
75 cout
<< "2: " << chunks2
<< std::endl
;
77 ASSERT_GE(chunks2
.size(), chunks1
.size());
80 for (i
= 0; i
< chunks1
.size()/2; ++i
) {
82 if (chunks1
[i
].first
== chunks2
[j
].first
&&
83 chunks1
[i
].second
== chunks2
[j
].second
) {
87 for (; i
< chunks1
.size(); ++i
) {
88 unsigned j
= i
+ (chunks2
.size() - chunks1
.size());
89 if (chunks1
[i
].first
+ frontlen
== chunks2
[j
].first
&&
90 chunks1
[i
].second
== chunks2
[j
].second
) {
94 ASSERT_GE(match
, chunks1
.size() - 2);
98 TEST_P(CDCTest
, specific_result
)
100 map
<string
,vector
<pair
<uint64_t,uint64_t>>> expected
= {
101 {"fixed", { {0, 262144}, {262144, 262144}, {524288, 262144}, {786432, 262144}, {1048576, 262144}, {1310720, 262144}, {1572864, 262144}, {1835008, 262144}, {2097152, 262144}, {2359296, 262144}, {2621440, 262144}, {2883584, 262144}, {3145728, 262144}, {3407872, 262144}, {3670016, 262144}, {3932160, 262144} }},
102 {"fastcdc", { {0, 151460}, {151460, 441676}, {593136, 407491}, {1000627, 425767}, {1426394, 602875}, {2029269, 327307}, {2356576, 155515}, {2512091, 159392}, {2671483, 829416}, {3500899, 539667}, {4040566, 153738}}},
106 generate_buffer(4*1024*1024, &bl
);
107 vector
<pair
<uint64_t,uint64_t>> chunks
;
108 cdc
->calc_chunks(bl
, &chunks
);
109 ASSERT_EQ(chunks
, expected
[GetParam()]);
113 void do_size_histogram(CDC
& cdc
, bufferlist
& bl
,
116 vector
<pair
<uint64_t, uint64_t>> chunks
;
117 cdc
.calc_chunks(bl
, &chunks
);
120 for (auto& i
: chunks
) {
121 //unsigned b = i.second & 0xfffff000;
122 unsigned b
= 1 << (cbits(i
.second
- 1));
127 (*h
)[0] = total
/ num
;
130 void print_histogram(map
<int,int>& h
)
132 cout
<< "size\tcount" << std::endl
;
135 cout
<< i
.first
<< "\t" << i
.second
<< std::endl
;
137 cout
<< "avg\t" << i
.second
<< std::endl
;
142 TEST_P(CDCTest
, chunk_random
)
145 for (int i
= 0; i
< 32; ++i
) {
149 generate_buffer(16*1024*1024, &r
, i
);
150 do_size_histogram(*cdc
, r
, &h
);
157 INSTANTIATE_TEST_SUITE_P(
161 "fixed", // note: we skip most tests bc this is not content-based