diff --git a/src/include/homeobject/homeobject.hpp b/src/include/homeobject/homeobject.hpp index 1b49125..2eef7d2 100644 --- a/src/include/homeobject/homeobject.hpp +++ b/src/include/homeobject/homeobject.hpp @@ -57,9 +57,10 @@ struct HomeObjectStats { uint64_t used_capacity_bytes{0}; uint32_t num_open_shards{0}; uint32_t avail_open_shards{0}; + uint32_t num_disks{0}; std::string to_string() const { - return fmt::format("total_capacity_bytes={}, used_capacity_bytes={}, num_open_shards={}, avail_open_shards={}", - total_capacity_bytes, used_capacity_bytes, num_open_shards, avail_open_shards); + return fmt::format("total_capacity_bytes={}, used_capacity_bytes={}, num_open_shards={}, avail_open_shards={}, num_disks={}", + total_capacity_bytes, used_capacity_bytes, num_open_shards, avail_open_shards, num_disks); } }; diff --git a/src/include/homeobject/pg_manager.hpp b/src/include/homeobject/pg_manager.hpp index e6ea614..a8874cc 100644 --- a/src/include/homeobject/pg_manager.hpp +++ b/src/include/homeobject/pg_manager.hpp @@ -34,6 +34,7 @@ struct PGInfo { pg_id_t id; mutable MemberSet members; peer_id_t replica_set_uuid; + u_int64_t size; auto operator<=>(PGInfo const& rhs) const { return id <=> rhs.id; } auto operator==(PGInfo const& rhs) const { return id == rhs.id; } @@ -51,6 +52,7 @@ struct PGStats { uint64_t avail_bytes; // total number of bytes available on this PG; uint64_t num_active_objects; // total number of active objects on this PG; uint64_t num_tombstone_objects; // total number of tombstone objects on this PG; + uint64_t pg_state; // PG state; std::vector< std::tuple< peer_id_t, std::string, uint64_t /* last_commit_lsn */, uint64_t /* last_succ_resp_us_ */ > > members; @@ -76,7 +78,7 @@ struct PGStats { class PGManager : public Manager< PGError > { public: virtual NullAsyncResult create_pg(PGInfo&& pg_info) = 0; - virtual NullAsyncResult replace_member(pg_id_t id, peer_id_t const& old_member, PGMember const& new_member) = 0; + virtual NullAsyncResult replace_member(pg_id_t id, peer_id_t const& old_member, PGMember const& new_member, u_int32_t const& commit_quorum) = 0; /** * Retrieves the statistics for a specific PG (Placement Group) identified by its ID. diff --git a/src/lib/homeobject_impl.hpp b/src/lib/homeobject_impl.hpp index 731198e..7619f2e 100644 --- a/src/lib/homeobject_impl.hpp +++ b/src/lib/homeobject_impl.hpp @@ -145,7 +145,7 @@ class HomeObjectImpl : public HomeObject, /// PgManager PGManager::NullAsyncResult create_pg(PGInfo&& pg_info) final; PGManager::NullAsyncResult replace_member(pg_id_t id, peer_id_t const& old_member, - PGMember const& new_member) final; + PGMember const& new_member, u_int32_t const& commit_quorum) final; // see api comments in base class; bool get_stats(pg_id_t id, PGStats& stats) const final; void get_pg_ids(std::vector< pg_id_t >& pg_ids) const final; diff --git a/src/lib/pg_manager.cpp b/src/lib/pg_manager.cpp index f38410f..6645d9a 100644 --- a/src/lib/pg_manager.cpp +++ b/src/lib/pg_manager.cpp @@ -21,7 +21,7 @@ PGManager::NullAsyncResult HomeObjectImpl::create_pg(PGInfo&& pg_info) { } PGManager::NullAsyncResult HomeObjectImpl::replace_member(pg_id_t id, peer_id_t const& old_member, - PGMember const& new_member) { + PGMember const& new_member, u_int32_t const& commit_quorum) { LOGI("[pg={}] replace member [{}] with [{}]", id, to_string(old_member), to_string(new_member.id)); if (old_member == new_member.id) { LOGW("rejecting identical replacement SvcId [{}]!", to_string(old_member)); diff --git a/src/lib/tests/PGManagerTest.cpp b/src/lib/tests/PGManagerTest.cpp index 6afef29..c079454 100644 --- a/src/lib/tests/PGManagerTest.cpp +++ b/src/lib/tests/PGManagerTest.cpp @@ -33,25 +33,25 @@ TEST_F(TestFixture, CreateDuplicatePg) { TEST_F(TestFixture, Migrate) { EXPECT_EQ(homeobj_->pg_manager() ->replace_member(UINT16_MAX, boost::uuids::random_generator()(), - PGMember{boost::uuids::random_generator()()}) + PGMember{boost::uuids::random_generator()()}, 0) .get() .error(), PGError::UNSUPPORTED_OP); EXPECT_EQ( homeobj_->pg_manager() - ->replace_member(_pg_id, boost::uuids::random_generator()(), PGMember{boost::uuids::random_generator()()}) + ->replace_member(_pg_id, boost::uuids::random_generator()(), PGMember{boost::uuids::random_generator()()}, 0) .get() .error(), PGError::UNSUPPORTED_OP); - EXPECT_EQ(homeobj_->pg_manager()->replace_member(_pg_id, _peer1, PGMember{_peer1}).get().error(), + EXPECT_EQ(homeobj_->pg_manager()->replace_member(_pg_id, _peer1, PGMember{_peer1}).get().error(), 0, PGError::INVALID_ARG); - EXPECT_EQ(homeobj_->pg_manager()->replace_member(_pg_id, _peer1, PGMember{_peer2}).get().error(), + EXPECT_EQ(homeobj_->pg_manager()->replace_member(_pg_id, _peer1, PGMember{_peer2}).get().error(), 0, PGError::INVALID_ARG); EXPECT_EQ(homeobj_->pg_manager() - ->replace_member(_pg_id, _peer1, PGMember{boost::uuids::random_generator()()}) + ->replace_member(_pg_id, _peer1, PGMember{boost::uuids::random_generator()()}, 0) .get() .error(), PGError::INVALID_ARG); EXPECT_FALSE( - homeobj_->pg_manager()->replace_member(_pg_id, _peer2, PGMember{boost::uuids::random_generator()()}).get()); + homeobj_->pg_manager()->replace_member(_pg_id, _peer2, PGMember{boost::uuids::random_generator()()}).get(), 0); }