4012ca1c7b
Summary: Added a new field called max_size_amplification_ratio in the CompactionOptionsUniversal structure. This determines the maximum percentage overhead of space amplification. The size amplification is defined to be the ratio between the size of the oldest file to the sum of the sizes of all other files. If the size amplification exceeds the specified value, then min_merge_width and max_merge_width are ignored and a full compaction of all files is done. A value of 10 means that the size a database that stores 100 bytes of user data could occupy 110 bytes of physical storage. Test Plan: Unit test DBTest.UniversalCompactionSpaceAmplification added. Reviewers: haobo, emayanke, xjin Reviewed By: haobo CC: leveldb Differential Revision: https://reviews.facebook.net/D12825
71 lines
2.4 KiB
C++
71 lines
2.4 KiB
C++
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
|
|
#ifndef STORAGE_ROCKSDB_UNIVERSAL_COMPACTION_OPTIONS_H
|
|
#define STORAGE_ROCKSDB_UNIVERSAL_COMPACTION_OPTIONS_H
|
|
|
|
#include <stddef.h>
|
|
#include <string>
|
|
#include <memory>
|
|
#include <vector>
|
|
#include <stdint.h>
|
|
#include <climits>
|
|
#include "rocksdb/slice.h"
|
|
#include "rocksdb/statistics.h"
|
|
|
|
namespace leveldb {
|
|
|
|
//
|
|
// Algorithm used to make a compaction request stop picking new files
|
|
// into a single compaction run
|
|
//
|
|
enum CompactionStopStyle {
|
|
kCompactionStopStyleSimilarSize, // pick files of similar size
|
|
kCompactionStopStyleTotalSize // total size of picked files > next file
|
|
};
|
|
|
|
class CompactionOptionsUniversal {
|
|
public:
|
|
|
|
// Percentage flexibilty while comparing file size. If the candidate file(s)
|
|
// size is 1% smaller than the next file's size, then include next file into
|
|
// this candidate set. // Default: 1
|
|
unsigned int size_ratio;
|
|
|
|
// The minimum number of files in a single compaction run. Default: 2
|
|
unsigned int min_merge_width;
|
|
|
|
// The maximum number of files in a single compaction run. Default: UINT_MAX
|
|
unsigned int max_merge_width;
|
|
|
|
// The size amplification is defined as the amount (in percentage) of
|
|
// additional storage needed to store a single byte of data in the database.
|
|
// For example, a size amplification of 2% means that a database that
|
|
// contains 100 bytes of user-data may occupy upto 102 bytes of
|
|
// physical storage. By this definition, a fully compacted database has
|
|
// a size amplification of 0%. Rocksdb uses the following heuristic
|
|
// to calculate size amplification: it assumes that all files excluding
|
|
// the earliest file contribute to the size amplification.
|
|
// Default: 200, which means that a 100 byte database could require upto
|
|
// 300 bytes of storage.
|
|
unsigned int max_size_amplification_percent;
|
|
|
|
// The algorithm used to stop picking files into a single compaction run
|
|
// Default: kCompactionStopStyleTotalSize
|
|
CompactionStopStyle stop_style;
|
|
|
|
// Default set of parameters
|
|
CompactionOptionsUniversal() :
|
|
size_ratio(1),
|
|
min_merge_width(2),
|
|
max_merge_width(UINT_MAX),
|
|
max_size_amplification_percent(200),
|
|
stop_style(kCompactionStopStyleTotalSize) {
|
|
}
|
|
};
|
|
|
|
} // namespace leveldb
|
|
|
|
#endif // STORAGE_ROCKSDB_UNIVERSAL_COMPACTION_OPTIONS_H
|