1
0
Fork 0
arangodb/3rdParty/iresearch/tests/index/index_meta_tests.cpp

209 lines
6.5 KiB
C++

////////////////////////////////////////////////////////////////////////////////
/// DISCLAIMER
///
/// Copyright 2016 by EMC Corporation, All Rights Reserved
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is EMC Corporation
///
/// @author Andrey Abramov
/// @author Vasiliy Nabatchikov
////////////////////////////////////////////////////////////////////////////////
#include "tests_shared.hpp"
#include "formats/formats_10.hpp"
#include "store/memory_directory.hpp"
#include "index/index_meta.hpp"
#include "utils/type_limits.hpp"
#include <boost/algorithm/string/predicate.hpp>
using namespace iresearch;
TEST(index_meta_tests, memory_directory_read_write_10) {
auto codec = irs::formats::get("1_0");
ASSERT_NE(nullptr, codec);
irs::memory_directory dir;
auto writer = codec->get_index_meta_writer();
// check that there are no files in a directory
std::vector<std::string> files;
auto list_files = [&files] (std::string& name) {
files.emplace_back(std::move(name));
return true;
};
ASSERT_TRUE(dir.visit(list_files));
ASSERT_TRUE(files.empty());
// create index metadata and write it into the specified directory
irs::index_meta meta_orig;
ASSERT_TRUE(meta_orig.payload().null());
// set payload
const irs::bytes_ref payload = ref_cast<byte_type>(string_ref("payload"));
const_cast<bytes_ref&>(meta_orig.payload()) = payload;
ASSERT_TRUE(writer->prepare(dir, meta_orig));
// we should increase meta generation after we write to directory
EXPECT_EQ(1, meta_orig.generation());
// check that files were successfully
// written to directory
files.clear();
ASSERT_TRUE(dir.visit(list_files));
EXPECT_EQ(1, files.size());
EXPECT_EQ(files[0], irs::string_ref("pending_segments_1"));
writer->commit();
// create index metadata and read it from the specified directory
irs::index_meta meta_read;
{
std::string segments_file;
auto reader = codec->get_index_meta_reader();
const bool index_exists = reader->last_segments_file(dir, segments_file);
ASSERT_TRUE(index_exists);
reader->read(dir, meta_read, segments_file);
}
EXPECT_EQ(meta_orig.counter(), meta_read.counter());
EXPECT_EQ(meta_orig.generation(), meta_read.generation());
EXPECT_EQ(meta_orig.size(), meta_read.size());
EXPECT_TRUE(meta_read.payload().null());
EXPECT_NE(meta_orig, meta_read);
const_cast<bytes_ref&>(meta_orig.payload()) = bytes_ref::NIL;
EXPECT_EQ(meta_orig, meta_read);
}
TEST(index_meta_tests, memory_directory_read_write_11) {
auto codec = irs::formats::get("1_1");
ASSERT_NE(nullptr, codec);
irs::memory_directory dir;
auto writer = codec->get_index_meta_writer();
// check that there are no files in a directory
std::vector<std::string> files;
auto list_files = [&files] (std::string& name) {
files.emplace_back(std::move(name));
return true;
};
ASSERT_TRUE(dir.visit(list_files));
ASSERT_TRUE(files.empty());
// create index metadata and write it into the specified directory
irs::index_meta meta_orig;
ASSERT_TRUE(meta_orig.payload().null());
// set payload
const irs::bytes_ref payload = ref_cast<byte_type>(string_ref("payload"));
const_cast<bytes_ref&>(meta_orig.payload()) = payload;
ASSERT_TRUE(writer->prepare(dir, meta_orig));
// we should increase meta generation after we write to directory
EXPECT_EQ(1, meta_orig.generation());
// check that files were successfully
// written to directory
files.clear();
ASSERT_TRUE(dir.visit(list_files));
EXPECT_EQ(1, files.size());
EXPECT_EQ(files[0], irs::string_ref("pending_segments_1"));
writer->commit();
// create index metadata and read it from the specified directory
irs::index_meta meta_read;
{
std::string segments_file;
auto reader = codec->get_index_meta_reader();
const bool index_exists = reader->last_segments_file(dir, segments_file);
ASSERT_TRUE(index_exists);
reader->read(dir, meta_read, segments_file);
}
EXPECT_EQ(meta_orig.counter(), meta_read.counter());
EXPECT_EQ(meta_orig.generation(), meta_read.generation());
EXPECT_EQ(meta_orig.size(), meta_read.size());
EXPECT_EQ(meta_orig.payload(), meta_read.payload());
EXPECT_EQ(meta_orig, meta_read);
}
TEST(index_meta_tests, ctor) {
irs::index_meta meta;
EXPECT_EQ(0, meta.counter());
EXPECT_EQ(0, meta.size());
EXPECT_TRUE(meta.payload().null());
EXPECT_EQ(irs::type_limits<type_t::index_gen_t>::invalid(), meta.generation());
}
TEST(index_meta_tests, last_generation) {
const char prefix[] = "segments_";
std::vector<std::string> names;
names.emplace_back("segments_387");
names.emplace_back("segments_622");
names.emplace_back("segments_314");
names.emplace_back("segments_933");
names.emplace_back("segments_660");
names.emplace_back("segments_966");
names.emplace_back("segments_074");
names.emplace_back("segments_057");
names.emplace_back("segments_836");
names.emplace_back("segments_282");
names.emplace_back("segments_882");
names.emplace_back("segments_191");
names.emplace_back("segments_965");
names.emplace_back("segments_164");
names.emplace_back("segments_117");
// get max value
uint64_t max = 0;
for (const auto& s : names) {
int num = atoi(s.c_str() + sizeof(prefix) - 1);
if (num > max) {
max = num;
}
}
// populate directory
irs::memory_directory dir;
for (auto& name : names) {
auto out = dir.create(name);
ASSERT_FALSE(!out);
}
auto codec = irs::formats::get("1_0");
ASSERT_NE(nullptr, codec);
std::string last_seg_file;
auto reader = codec->get_index_meta_reader();
const bool index_exists = reader->last_segments_file(dir, last_seg_file);
const std::string expected_seg_file = "segments_" + std::to_string(max);
ASSERT_TRUE(index_exists);
EXPECT_EQ(expected_seg_file, last_seg_file);
}
// -----------------------------------------------------------------------------
// --SECTION-- END-OF-FILE
// -----------------------------------------------------------------------------