Fix metadata link handling

This commit is contained in:
Marcus Holland-Moritz 2020-12-01 11:39:11 +01:00
parent 24616178f3
commit 984fca1b51
3 changed files with 30 additions and 1 deletions

View File

@ -206,7 +206,7 @@ class metadata_ : public metadata_v2::impl {
std::string_view link_value(entry_view entry) const { std::string_view link_value(entry_view entry) const {
return meta_ return meta_
.links()[meta_.link_index()[entry.inode()] - meta_.link_index_offset()]; .links()[meta_.link_index()[entry.inode() - meta_.link_index_offset()]];
} }
folly::ByteRange data_; folly::ByteRange data_;

View File

@ -533,6 +533,7 @@ void scanner_<LoggerPolicy>::scan(filesystem_writer& fsw,
mv2.links = ge_data.get_links(); mv2.links = ge_data.get_links();
mv2.timestamp_base = ge_data.get_timestamp_base(); mv2.timestamp_base = ge_data.get_timestamp_base();
mv2.chunk_index_offset = first_file_inode; mv2.chunk_index_offset = first_file_inode;
mv2.link_index_offset = first_link_inode;
mv2.block_size = UINT32_C(1) << cfg_.block_size_bits; mv2.block_size = UINT32_C(1) << cfg_.block_size_bits;
mv2.total_fs_size = prog.original_size; mv2.total_fs_size = prog.original_size;

View File

@ -77,6 +77,7 @@ std::unordered_map<std::string, simplestat> statmap{
{"//foo.pl", {S_IFREG | 0600, 1337, 0, 23456}}, {"//foo.pl", {S_IFREG | 0600, 1337, 0, 23456}},
{"//ipsum.txt", {S_IFREG | 0644, 1000, 1000, 2000000}}, {"//ipsum.txt", {S_IFREG | 0644, 1000, 1000, 2000000}},
{"//somedir/ipsum.py", {S_IFREG | 0644, 1000, 1000, 10000}}, {"//somedir/ipsum.py", {S_IFREG | 0644, 1000, 1000, 10000}},
{"//somedir/bad", {S_IFLNK | 0777, 1000, 1000, 6}},
}; };
} // namespace } // namespace
@ -87,6 +88,13 @@ class mmap_mock : public mmif {
assign(m_data.data(), m_data.size()); assign(m_data.data(), m_data.size());
} }
boost::system::error_code lock(void const*, size_t) override {
return boost::system::error_code();
}
boost::system::error_code advise(void const*, size_t, int) override {
return boost::system::error_code();
}
private: private:
const std::string m_data; const std::string m_data;
}; };
@ -105,6 +113,7 @@ class os_access_mock : public os_access {
".", ".",
"..", "..",
"ipsum.py", "ipsum.py",
"bad",
}; };
return std::make_shared<dir_reader_mock>(std::move(files)); return std::make_shared<dir_reader_mock>(std::move(files));
@ -128,6 +137,8 @@ class os_access_mock : public os_access {
std::string readlink(const std::string& path, size_t size) const override { std::string readlink(const std::string& path, size_t size) const override {
if (path == "//somelink" && size == 16) { if (path == "//somelink" && size == 16) {
return "somedir/ipsum.py"; return "somedir/ipsum.py";
} else if (path == "//somedir/bad" && size == 6) {
return "../foo";
} }
throw std::runtime_error("oops"); throw std::runtime_error("oops");
@ -216,6 +227,23 @@ void basic_end_to_end_test(const std::string& compressor,
ssize_t rv = fs.read(inode, &buf[0], st.st_size, 0); ssize_t rv = fs.read(inode, &buf[0], st.st_size, 0);
EXPECT_EQ(rv, st.st_size); EXPECT_EQ(rv, st.st_size);
EXPECT_EQ(std::string(buf.begin(), buf.end()), test::loremipsum(st.st_size)); EXPECT_EQ(std::string(buf.begin(), buf.end()), test::loremipsum(st.st_size));
entry = fs.find("/somelink");
EXPECT_EQ(fs.getattr(*entry, &st), 0);
EXPECT_EQ(st.st_size, 16);
std::string link;
EXPECT_EQ(fs.readlink(*entry, &link), 0);
EXPECT_EQ(link, "somedir/ipsum.py");
entry = fs.find("/somedir/bad");
EXPECT_EQ(fs.getattr(*entry, &st), 0);
EXPECT_EQ(st.st_size, 6);
EXPECT_EQ(fs.readlink(*entry, &link), 0);
EXPECT_EQ(link, "../foo");
} }
std::vector<std::string> const compressions{"null", std::vector<std::string> const compressions{"null",