diff --git a/test/dwarfs.cpp b/test/dwarfs.cpp index ce82df8e..82fd6d26 100644 --- a/test/dwarfs.cpp +++ b/test/dwarfs.cpp @@ -921,3 +921,44 @@ TEST(filesystem, uid_gid_32bit) { EXPECT_EQ(65536, st32.uid); EXPECT_EQ(4294967295, st32.gid); } + +TEST(filesystem, uid_gid_count) { + test::test_logger lgr; + + auto input = std::make_shared(); + + input->add("", {1, 040755, 1, 0, 0, 10, 42, 0, 0, 0}); + + for (uint32_t i = 0; i < 100000; ++i) { + input->add(fmt::format("foo{:05d}.txt", i), + {2 + i, 0100644, 1, 50000 + i, 250000 + i, 10, 42, 0, 0, 0}, + fmt::format("hello{:05d}", i)); + } + + auto fsimage = build_dwarfs(lgr, input, "null"); + + auto mm = std::make_shared(std::move(fsimage)); + + filesystem_v2 fs(lgr, mm); + + auto iv00000 = fs.find("/foo00000.txt"); + auto iv50000 = fs.find("/foo50000.txt"); + auto iv99999 = fs.find("/foo99999.txt"); + + EXPECT_TRUE(iv00000); + EXPECT_TRUE(iv50000); + EXPECT_TRUE(iv99999); + + file_stat st00000, st50000, st99999; + + EXPECT_EQ(0, fs.getattr(*iv00000, &st00000)); + EXPECT_EQ(0, fs.getattr(*iv50000, &st50000)); + EXPECT_EQ(0, fs.getattr(*iv99999, &st99999)); + + EXPECT_EQ(50000, st00000.uid); + EXPECT_EQ(250000, st00000.gid); + EXPECT_EQ(100000, st50000.uid); + EXPECT_EQ(300000, st50000.gid); + EXPECT_EQ(149999, st99999.uid); + EXPECT_EQ(349999, st99999.gid); +} diff --git a/thrift/metadata.thrift b/thrift/metadata.thrift index 7ed3bf9a..bb9a5b7c 100644 --- a/thrift/metadata.thrift +++ b/thrift/metadata.thrift @@ -77,13 +77,13 @@ struct directory { */ struct inode_data { // index into `metadata.modes[]` - 2: UInt16 mode_index + 2: UInt32 mode_index // index into `metadata.uids[]` - 4: UInt16 owner_index + 4: UInt32 owner_index // index into `metadata.gids[]` - 5: UInt16 group_index + 5: UInt32 group_index // atime relative to `metadata.timestamp_base` 6: UInt64 atime_offset