2013-12-05 22:09:13 +01:00
|
|
|
// Copyright (c) 2013, Facebook, Inc. All rights reserved.
|
|
|
|
// This source code is licensed under the BSD-style license found in the
|
|
|
|
// LICENSE file in the root directory of this source tree. An additional grant
|
|
|
|
// of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <memory>
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
#include "rocksdb/comparator.h"
|
|
|
|
#include "rocksdb/options.h"
|
|
|
|
#include "rocksdb/slice.h"
|
2014-01-28 19:35:48 +01:00
|
|
|
#include "rocksdb/table_properties.h"
|
2013-12-05 22:09:13 +01:00
|
|
|
#include "table/block_builder.h"
|
|
|
|
|
|
|
|
namespace rocksdb {
|
|
|
|
|
|
|
|
class BlockBuilder;
|
2013-12-06 01:51:26 +01:00
|
|
|
class BlockHandle;
|
|
|
|
class Env;
|
2013-12-05 22:09:13 +01:00
|
|
|
class Logger;
|
2013-12-06 01:51:26 +01:00
|
|
|
class RandomAccessFile;
|
2013-12-05 22:09:13 +01:00
|
|
|
struct TableProperties;
|
|
|
|
|
|
|
|
// An STL style comparator that does the bytewise comparator comparasion
|
|
|
|
// internally.
|
|
|
|
struct BytewiseLessThan {
|
|
|
|
bool operator()(const std::string& key1, const std::string& key2) const {
|
|
|
|
// smaller entries will be placed in front.
|
|
|
|
return comparator->Compare(key1, key2) <= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
const Comparator* comparator = BytewiseComparator();
|
|
|
|
};
|
|
|
|
|
|
|
|
// When writing to a block that requires entries to be sorted by
|
|
|
|
// `BytewiseComparator`, we can buffer the content to `BytewiseSortedMap`
|
|
|
|
// before writng to store.
|
|
|
|
typedef std::map<std::string, std::string, BytewiseLessThan> BytewiseSortedMap;
|
|
|
|
|
|
|
|
class MetaIndexBuilder {
|
|
|
|
public:
|
|
|
|
MetaIndexBuilder(const MetaIndexBuilder&) = delete;
|
|
|
|
MetaIndexBuilder& operator=(const MetaIndexBuilder&) = delete;
|
|
|
|
|
|
|
|
MetaIndexBuilder();
|
|
|
|
void Add(const std::string& key, const BlockHandle& handle);
|
|
|
|
|
|
|
|
// Write all the added key/value pairs to the block and return the contents
|
|
|
|
// of the block.
|
|
|
|
Slice Finish();
|
|
|
|
|
|
|
|
private:
|
|
|
|
// store the sorted key/handle of the metablocks.
|
|
|
|
BytewiseSortedMap meta_block_handles_;
|
|
|
|
std::unique_ptr<BlockBuilder> meta_index_block_;
|
|
|
|
};
|
|
|
|
|
|
|
|
class PropertyBlockBuilder {
|
|
|
|
public:
|
|
|
|
PropertyBlockBuilder(const PropertyBlockBuilder&) = delete;
|
|
|
|
PropertyBlockBuilder& operator=(const PropertyBlockBuilder&) = delete;
|
|
|
|
|
|
|
|
PropertyBlockBuilder();
|
|
|
|
|
|
|
|
void AddTableProperty(const TableProperties& props);
|
|
|
|
void Add(const std::string& key, uint64_t value);
|
|
|
|
void Add(const std::string& key, const std::string& value);
|
|
|
|
void Add(const UserCollectedProperties& user_collected_properties);
|
|
|
|
|
|
|
|
// Write all the added entries to the block and return the block contents
|
|
|
|
Slice Finish();
|
|
|
|
|
|
|
|
private:
|
|
|
|
std::unique_ptr<BlockBuilder> properties_block_;
|
|
|
|
BytewiseSortedMap props_;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Were we encounter any error occurs during user-defined statistics collection,
|
|
|
|
// we'll write the warning message to info log.
|
|
|
|
void LogPropertiesCollectionError(
|
|
|
|
Logger* info_log, const std::string& method, const std::string& name);
|
|
|
|
|
|
|
|
// Utility functions help table builder to trigger batch events for user
|
|
|
|
// defined property collectors.
|
|
|
|
// Return value indicates if there is any error occurred; if error occurred,
|
|
|
|
// the warning message will be logged.
|
|
|
|
// NotifyCollectTableCollectorsOnAdd() triggers the `Add` event for all
|
|
|
|
// property collectors.
|
|
|
|
bool NotifyCollectTableCollectorsOnAdd(
|
|
|
|
const Slice& key,
|
|
|
|
const Slice& value,
|
|
|
|
const Options::TablePropertiesCollectors& collectors,
|
|
|
|
Logger* info_log);
|
|
|
|
|
|
|
|
// NotifyCollectTableCollectorsOnAdd() triggers the `Finish` event for all
|
|
|
|
// property collectors. The collected properties will be added to `builder`.
|
|
|
|
bool NotifyCollectTableCollectorsOnFinish(
|
|
|
|
const Options::TablePropertiesCollectors& collectors,
|
|
|
|
Logger* info_log,
|
|
|
|
PropertyBlockBuilder* builder);
|
|
|
|
|
2013-12-06 01:51:26 +01:00
|
|
|
// Read the properties from the table.
|
|
|
|
Status ReadProperties(
|
|
|
|
const Slice& handle_value,
|
|
|
|
RandomAccessFile* file,
|
|
|
|
Env* env,
|
|
|
|
Logger* logger,
|
|
|
|
TableProperties* table_properties);
|
|
|
|
|
|
|
|
// Directly read the properties from the properties block of a plain table.
|
|
|
|
Status ReadTableProperties(
|
|
|
|
RandomAccessFile* file,
|
|
|
|
uint64_t file_size,
|
|
|
|
uint64_t table_magic_number,
|
|
|
|
Env* env,
|
|
|
|
Logger* info_log,
|
|
|
|
TableProperties* properties);
|
|
|
|
|
2013-12-05 22:09:13 +01:00
|
|
|
} // namespace rocksdb
|