Skip to content

Commit e703673

Browse files
committed
[service] allow follower ReportEvent queries
1 parent 534df33 commit e703673

3 files changed

Lines changed: 69 additions & 1 deletion

File tree

kv_cache_manager/service/meta_service_impl.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -964,8 +964,10 @@ void MetaServiceImpl::GetHostCacheState(RequestContext *request_context,
964964
const proto::meta::GetHostCacheStateRequest *request,
965965
proto::meta::GetHostCacheStateResponse *response) {
966966
SPAN_TRACER(request_context);
967+
// This is a best-effort read of the node's local ReportEvent view. Followers may
968+
// serve a stale view, while ReportEvent mutations remain leader-only.
967969
API_CALL_GUARD_WITH_DEBUG("GetHostCacheState",
968-
true,
970+
false,
969971
BuildGetHostCacheStateRequestAccessLogSummary(request),
970972
BuildGetHostCacheStateResponseAccessLogSummary(response));
971973
auto *header = response->mutable_header();

kv_cache_manager/service/test/BUILD

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,21 @@ cc_test(
1515
],
1616
)
1717

18+
cc_test(
19+
name = "MetaServiceImplTest",
20+
srcs = [
21+
"meta_service_impl_test.cc",
22+
],
23+
copts = ["-fno-access-control"],
24+
deps = [
25+
"//kv_cache_manager/common:unittest",
26+
"//kv_cache_manager/config",
27+
"//kv_cache_manager/manager:cache_manager",
28+
"//kv_cache_manager/metrics:metrics_registry",
29+
"//kv_cache_manager/service:meta_service_impl",
30+
],
31+
)
32+
1833
cc_test(
1934
name = "CommandLineTest",
2035
srcs = [
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include <memory>
2+
3+
#include "kv_cache_manager/common/request_context.h"
4+
#include "kv_cache_manager/common/unittest.h"
5+
#include "kv_cache_manager/config/registry_manager.h"
6+
#include "kv_cache_manager/manager/cache_manager.h"
7+
#include "kv_cache_manager/metrics/metrics_registry.h"
8+
#include "kv_cache_manager/protocol/protobuf/meta_service.pb.h"
9+
#include "kv_cache_manager/service/meta_service_impl.h"
10+
11+
namespace kv_cache_manager {
12+
13+
class MetaServiceImplTest : public TESTBASE {
14+
protected:
15+
void SetUp() override {
16+
metrics_registry_ = std::make_shared<MetricsRegistry>();
17+
registry_manager_ = std::make_shared<RegistryManager>("", metrics_registry_);
18+
cache_manager_ = std::make_shared<CacheManager>(metrics_registry_, registry_manager_);
19+
service_ = std::make_unique<MetaServiceImpl>(cache_manager_, nullptr, nullptr);
20+
service_->DisableLeaderOnlyRequests();
21+
}
22+
23+
std::shared_ptr<MetricsRegistry> metrics_registry_;
24+
std::shared_ptr<RegistryManager> registry_manager_;
25+
std::shared_ptr<CacheManager> cache_manager_;
26+
std::unique_ptr<MetaServiceImpl> service_;
27+
};
28+
29+
TEST_F(MetaServiceImplTest, FollowerAllowsReportEventQueryButRejectsWrite) {
30+
RequestContext query_context("follower-query");
31+
proto::meta::GetHostCacheStateRequest query_request;
32+
query_request.set_trace_id(query_context.trace_id());
33+
proto::meta::GetHostCacheStateResponse query_response;
34+
35+
service_->GetHostCacheState(&query_context, &query_request, &query_response);
36+
37+
// INVALID_ARGUMENT proves the read passed the follower gate and reached
38+
// normal request validation instead of being rejected as SERVER_NOT_LEADER.
39+
EXPECT_EQ(proto::meta::INVALID_ARGUMENT, query_response.header().status().code());
40+
41+
RequestContext write_context("follower-write");
42+
proto::meta::ReportEventRequest write_request;
43+
write_request.set_trace_id(write_context.trace_id());
44+
proto::meta::ReportEventResponse write_response;
45+
46+
service_->ReportEvent(&write_context, &write_request, &write_response);
47+
48+
EXPECT_EQ(proto::meta::SERVER_NOT_LEADER, write_response.header().status().code());
49+
}
50+
51+
} // namespace kv_cache_manager

0 commit comments

Comments
 (0)