YugabyteDB (2.13.1.0-b60, 21121d69985fbf76aa6958d8f04a9bfa936293b5)

Coverage Report

Created: 2022-03-22 16:43

/Users/deen/code/yugabyte-db/src/yb/rocksdb/table/fixed_size_filter_block.cc
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) YugaByte, Inc.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
4
// in compliance with the License.  You may obtain a copy of the License at
5
//
6
// http://www.apache.org/licenses/LICENSE-2.0
7
//
8
// Unless required by applicable law or agreed to in writing, software distributed under the License
9
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
10
// or implied.  See the License for the specific language governing permissions and limitations
11
// under the License.
12
//
13
//
14
// Copyright (c) 2012 The LevelDB Authors. All rights reserved.
15
// Use of this source code is governed by a BSD-style license that can be
16
// found in the LICENSE file. See the AUTHORS file for names of contributors.
17
18
#include "yb/rocksdb/table/fixed_size_filter_block.h"
19
20
#include "yb/rocksdb/filter_policy.h"
21
#include "yb/rocksdb/util/perf_context_imp.h"
22
23
namespace rocksdb {
24
25
namespace {
26
27
void AppendItem(std::string* props, const std::string& key,
28
0
                const std::string& value) {
29
0
  char cspace = ' ';
30
0
  std::string value_str("");
31
0
  size_t i = 0;
32
0
  const size_t dataLength = 64;
33
0
  const size_t tabLength = 2;
34
0
  const size_t offLength = 16;
35
36
0
  value_str.append(&value[i], std::min(size_t(dataLength), value.size()));
37
0
  i += dataLength;
38
0
  while (i < value.size()) {
39
0
    value_str.append("\n");
40
0
    value_str.append(offLength, cspace);
41
0
    value_str.append(&value[i], std::min(size_t(dataLength), value.size() - i));
42
0
    i += dataLength;
43
0
  }
44
45
0
  std::string result("");
46
0
  if (key.size() < (offLength - tabLength))
47
0
    result.append(size_t((offLength - tabLength)) - key.size(), cspace);
48
0
  result.append(key);
49
50
0
  props->append(result + ": " + value_str + "\n");
51
0
}
52
53
template <class TKey>
54
void AppendItem(std::string* props, const TKey& key, const std::string& value) {
55
  std::string key_str = rocksdb::ToString(key);
56
  AppendItem(props, key_str, value);
57
}
58
}  // namespace
59
60
61
// See doc/table_format.txt for an explanation of the filter block format.
62
63
// Generate new filter for fixed number of keys
64
FixedSizeFilterBlockBuilder::FixedSizeFilterBlockBuilder(
65
    const SliceTransform* prefix_extractor,
66
    const BlockBasedTableOptions& table_opt)
67
    : policy_(table_opt.filter_policy.get()),
68
      prefix_extractor_(prefix_extractor),
69
      whole_key_filtering_(table_opt.whole_key_filtering),
70
7.11k
      bits_builder_(nullptr) {
71
7.11k
}
72
73
9.95k
void FixedSizeFilterBlockBuilder::StartBlock(uint64_t block_offset) {
74
9.95k
  assert(policy_);
75
0
  assert(!bits_builder_);
76
0
  FilterBitsBuilder* filter_bits_builder_ = policy_->GetFilterBitsBuilder();
77
9.95k
  assert(filter_bits_builder_);
78
0
  bits_builder_.reset(filter_bits_builder_);
79
9.95k
}
80
81
40.2M
void FixedSizeFilterBlockBuilder::Add(const Slice& key) {
82
40.2M
  if (prefix_extractor_ && 
prefix_extractor_->InDomain(key)201
) {
83
201
    AddPrefix(key);
84
201
  }
85
86
40.2M
  if (
whole_key_filtering_40.2M
) {
87
40.2M
    AddKey(key);
88
40.2M
  }
89
40.2M
}
90
91
40.2M
void FixedSizeFilterBlockBuilder::AddKey(const Slice& key) {
92
40.2M
  assert(bits_builder_);
93
0
  bits_builder_->AddKey(key);
94
40.2M
}
95
96
201
void FixedSizeFilterBlockBuilder::AddPrefix(const Slice& key) {
97
201
  assert(bits_builder_);
98
0
  Slice prefix = prefix_extractor_->Transform(key);
99
201
  bits_builder_->AddKey(prefix);
100
201
}
101
102
40.2M
bool FixedSizeFilterBlockBuilder::ShouldFlush() const {
103
40.2M
  assert(bits_builder_);
104
0
  return bits_builder_->IsFull();
105
40.2M
}
106
107
9.94k
Slice FixedSizeFilterBlockBuilder::Finish() {
108
9.94k
  assert(bits_builder_);
109
0
  Slice finished_slice = bits_builder_->Finish(&active_block_data_);
110
9.94k
  bits_builder_.reset();
111
9.94k
  results_.push_back(std::move(active_block_data_));
112
9.94k
  return finished_slice;
113
9.94k
}
114
115
FixedSizeFilterBlockReader::FixedSizeFilterBlockReader(
116
    const SliceTransform* prefix_extractor,
117
    const BlockBasedTableOptions& table_opt,
118
    bool whole_key_filtering,
119
    BlockContents&& contents)
120
    : policy_(table_opt.filter_policy.get()),
121
      prefix_extractor_(prefix_extractor),
122
      whole_key_filtering_(whole_key_filtering),
123
3.79k
      contents_(std::move(contents)) {
124
3.79k
  assert(policy_);
125
0
  reader_.reset(policy_->GetFilterBitsReader(contents_.data));
126
3.79k
}
127
128
12.9M
bool FixedSizeFilterBlockReader::KeyMayMatch(const Slice& key, uint64_t block_offset) {
129
12.9M
  return whole_key_filtering_ ? 
MayMatch(key)12.9M
:
true80
;
130
12.9M
}
131
132
1
bool FixedSizeFilterBlockReader::PrefixMayMatch(const Slice& prefix, uint64_t block_offset) {
133
1
  return prefix_extractor_ ? MayMatch(prefix) : 
true0
;
134
1
}
135
136
12.9M
bool FixedSizeFilterBlockReader::MayMatch(const Slice& entry) {
137
12.9M
  if (reader_->MayMatch(entry)) {
138
6.92M
    PERF_COUNTER_ADD(bloom_sst_hit_count, 1);
139
6.92M
    return true;
140
6.92M
  } else {
141
6.04M
    PERF_COUNTER_ADD(bloom_sst_miss_count, 1);
142
6.04M
    return false;
143
6.04M
  }
144
12.9M
}
145
146
0
size_t FixedSizeFilterBlockReader::ApproximateMemoryUsage() const {
147
0
  return contents_.data.size();
148
0
}
149
150
0
std::string FixedSizeFilterBlockReader::ToString() const {
151
0
  std::string result;
152
0
  result.reserve(contents_.data.size() * 2);
153
0
  AppendItem(&result, std::string("Filter block"), contents_.data.ToString(true));
154
0
  return result;
155
0
}
156
}  // namespace rocksdb