Skip to content

Commit ce7a6c1

Browse files
committed
[manager/meta] refactor group spec names
1 parent 1680900 commit ce7a6c1

7 files changed

Lines changed: 218 additions & 112 deletions

File tree

docs/api/report_event.md

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ unsigned uint64;KVCM 按相同的 64-bit bit pattern 归一化,例如
6262
使用 uint64 的约定兼容;超出 uint64 或 int64 表示范围、带正号或空白的字符串会被拒绝。
6363

6464
- `medium` 是 block 级属性,例如 `gpu``hbm``memory``disk`
65-
- `spec.name` 区分一个 block 内的多个物理组成部分,例如不同 TP、full attention 或 mamba state;
65+
- `spec.name` 区分一个 block 内的多个物理组成部分,例如 `F0``L1` 等 cache group;
66+
- ADD、DELETE 和 SNAPSHOT 中使用的每个 spec name 都必须已在
67+
`RegisterInstance.location_spec_infos` 中注册;未注册的 spec 对应 item 返回
68+
`INVALID_ARGUMENT`,且不会修改 metadata。同一请求中的其他合法 item 仍可生效;
6669
- 同一 `block_key` 可以同时存在于多个 medium;
6770
- 同一 `block_key + medium` 可以包含多个不同的 spec name;
6871
- 同一 `block_key + medium + spec.name` 是集合语义,不是引用计数。
@@ -249,11 +252,11 @@ InstanceGroup 必须把对应 EventReport storage 配置在
249252
"medium": "gpu",
250253
"specs": [
251254
{
252-
"name": "full_attention:group=0:tp=0",
255+
"name": "F0",
253256
"uri": "event_report://10.0.0.8:9600/gpu/123?size=4096"
254257
},
255258
{
256-
"name": "mamba_state:group=0:tp=0",
259+
"name": "L1",
257260
"uri": "event_report://10.0.0.8:9600/gpu/123?size=1024"
258261
}
259262
]
@@ -266,7 +269,7 @@ InstanceGroup 必须把对应 EventReport storage 配置在
266269
- `block_key` 必须是可解析的十进制整数文本;
267270
- `medium` 非空,且不能包含 location id 分隔符 `#`
268271
- `specs` 非空;
269-
- 每个 `spec.name` 非空,且同一事件内不能重复;
272+
- 每个 `spec.name` 非空、已在 `RegisterInstance.location_spec_infos` 中注册,且同一事件内不能重复;
270273
- 每个 URI 必须合法;
271274
- 客户端 URI 不能带 `s_version`
272275
- 旧字段 `block_add.uri` 已废弃,只有 `specs` 生效。
@@ -288,7 +291,7 @@ InstanceGroup 必须把对应 EventReport storage 配置在
288291
"block_key": "123",
289292
"medium": "gpu",
290293
"spec_names": [
291-
"full_attention:group=0:tp=0"
294+
"F0"
292295
]
293296
}
294297
}
@@ -298,7 +301,7 @@ InstanceGroup 必须把对应 EventReport storage 配置在
298301

299302
- `block_key``medium` 非空且合法;`medium` 不能包含 location id 分隔符 `#`
300303
- `spec_names` 非空;
301-
- spec name 非空且同一事件内不能重复
304+
- spec name 非空、已在 `RegisterInstance.location_spec_infos` 中注册,且同一事件内不能重复
302305

303306
行为:
304307

@@ -321,11 +324,11 @@ InstanceGroup 必须把对应 EventReport storage 配置在
321324
"medium": "gpu",
322325
"specs": [
323326
{
324-
"name": "full_attention:group=0:tp=0",
327+
"name": "F0",
325328
"uri": "event_report://10.0.0.8:9600/gpu/123?size=4096"
326329
},
327330
{
328-
"name": "mamba_state:group=0:tp=0",
331+
"name": "L1",
329332
"uri": "event_report://10.0.0.8:9600/gpu/123?size=1024"
330333
}
331334
]
@@ -335,7 +338,7 @@ InstanceGroup 必须把对应 EventReport storage 配置在
335338
"medium": "memory",
336339
"specs": [
337340
{
338-
"name": "full_attention:group=0:tp=0",
341+
"name": "F0",
339342
"uri": "event_report://10.0.0.8:9600/memory/456"
340343
}
341344
]
@@ -353,7 +356,8 @@ Snapshot 的完整性规则:
353356
- 同一 `block_key + medium` 只能出现一次;
354357
- 相同 block key 可以出现在不同 medium;
355358
- `medium` 不能包含 location id 分隔符 `#`
356-
- 每个 block 的 specs 必须非空,且 spec name 不能重复;
359+
- 每个 block 的 specs 必须非空,且 spec name 必须已在
360+
`RegisterInstance.location_spec_infos` 中注册并且不能重复;
357361
- `blocks=[]` 表示该 reporter 当前没有任何 cache,会异步清理其全部旧 location。
358362

359363
Snapshot 的更新语义:

integration_test/meta_service/test_report_event.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,14 @@ def _ensure_instance_registered(cls):
352352
},
353353
"location_spec_infos": [
354354
{"name": "tp0", "size": 1024},
355+
{"name": "mem_spec", "size": 1024},
356+
{"name": "disk_spec", "size": 1024},
357+
{"name": "spec_4096", "size": 1024},
358+
{"name": "spec_8192", "size": 1024},
359+
{"name": "keep_spec", "size": 1024},
360+
{"name": "drop_spec", "size": 1024},
361+
{"name": "l1p5_spec", "size": 1024},
362+
{"name": "l2_spec", "size": 1024},
355363
],
356364
})
357365
except Exception as e:

kv_cache_manager/manager/cache_manager.cc

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2789,6 +2789,21 @@ ErrorCode CacheManager::ReportEvent(RequestContext *request_context,
27892789
return EC_INSTANCE_NOT_EXIST;
27902790
}
27912791

2792+
auto instance_info = registry_manager_->GetInstanceInfo(request_context, instance_id);
2793+
if (!instance_info) {
2794+
KVCM_LOG_WARN("trace_id [%s] | ReportEvent: instance info not found for instance [%s]",
2795+
trace_id.c_str(),
2796+
instance_id.c_str());
2797+
response_status->set_code(proto::meta::INSTANCE_NOT_EXIST);
2798+
response_status->set_message("instance info not found for instance: " + instance_id);
2799+
return EC_INSTANCE_NOT_EXIST;
2800+
}
2801+
std::unordered_set<std::string_view> registered_spec_names;
2802+
registered_spec_names.reserve(instance_info->location_spec_infos().size());
2803+
for (const auto &spec_info : instance_info->location_spec_infos()) {
2804+
registered_spec_names.insert(spec_info.name());
2805+
}
2806+
27922807
const int events_size = request->events_size();
27932808
std::vector<ErrorCode> per_item_ec(events_size, EC_OK);
27942809
DeltaMutationGuard delta_mutations(event_backend, reporter_key);
@@ -3142,7 +3157,8 @@ ErrorCode CacheManager::ReportEvent(RequestContext *request_context,
31423157
}
31433158
std::uint64_t event_total_size = 0;
31443159
for (const auto &spec : params.specs()) {
3145-
if (params.specs_size() > 1 && !seen_spec_names.insert(std::string_view(spec.name())).second) {
3160+
if (registered_spec_names.find(spec.name()) == registered_spec_names.end() ||
3161+
(params.specs_size() > 1 && !seen_spec_names.insert(std::string_view(spec.name())).second)) {
31463162
per_item_ec[i] = EC_BADARGS;
31473163
break;
31483164
}
@@ -3232,7 +3248,7 @@ ErrorCode CacheManager::ReportEvent(RequestContext *request_context,
32323248
seen_spec_names.reserve(params.spec_names_size());
32333249
}
32343250
for (const auto &spec_name : params.spec_names()) {
3235-
if (spec_name.empty() ||
3251+
if (spec_name.empty() || registered_spec_names.find(spec_name) == registered_spec_names.end() ||
32363252
(params.spec_names_size() > 1 && !seen_spec_names.insert(std::string_view(spec_name)).second)) {
32373253
per_item_ec[i] = EC_BADARGS;
32383254
break;
@@ -3306,7 +3322,8 @@ ErrorCode CacheManager::ReportEvent(RequestContext *request_context,
33063322
seen_spec_names.reserve(block.specs_size());
33073323
}
33083324
for (const auto &spec : block.specs()) {
3309-
if (block.specs_size() > 1 && !seen_spec_names.insert(std::string_view(spec.name())).second) {
3325+
if (registered_spec_names.find(spec.name()) == registered_spec_names.end() ||
3326+
(block.specs_size() > 1 && !seen_spec_names.insert(std::string_view(spec.name())).second)) {
33103327
per_item_ec[i] = EC_BADARGS;
33113328
break;
33123329
}

kv_cache_manager/manager/meta_searcher.cc

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -791,9 +791,54 @@ int64_t ComputePrefixMatchBlocks(const std::vector<std::set<std::string>> &specs
791791
return prefix_len;
792792
}
793793

794-
bool IsFullLocationSpecGroup(const LocationSpecGroup &group) {
795-
const auto &name = group.name();
796-
return name.rfind("full", 0) == 0 || name.rfind("FULL", 0) == 0;
794+
ErrorCode ClassifySpecGroups(RequestContext *request_context,
795+
const std::vector<LocationSpecGroup> &location_spec_groups,
796+
std::vector<const LocationSpecGroup *> &full_groups,
797+
std::vector<const LocationSpecGroup *> &mamba_state_groups) {
798+
full_groups.clear();
799+
mamba_state_groups.clear();
800+
for (const auto &group : location_spec_groups) {
801+
const auto &group_name = group.name();
802+
const char category = group_name.empty() ? '?' : group_name.front();
803+
switch (category) {
804+
case 'F':
805+
full_groups.push_back(&group);
806+
break;
807+
case 'L':
808+
mamba_state_groups.push_back(&group);
809+
break;
810+
case 'W':
811+
case 'C':
812+
case 'E':
813+
case 'X': {
814+
std::string error_msg =
815+
"unsupported location spec category for QT_PREFIX_MATCH_WITH_MAMBA, group: " + group_name +
816+
", category: " + std::string(1, category);
817+
request_context->error_tracer()->AddErrorMsg(error_msg);
818+
KVCM_LOG_WARN("%s", error_msg.c_str());
819+
return EC_BADARGS;
820+
}
821+
default: {
822+
std::string error_msg =
823+
"invalid location spec category for QT_PREFIX_MATCH_WITH_MAMBA, group: " + group_name +
824+
", category: " + std::string(1, category);
825+
request_context->error_tracer()->AddErrorMsg(error_msg);
826+
KVCM_LOG_WARN("%s", error_msg.c_str());
827+
return EC_BADARGS;
828+
}
829+
}
830+
}
831+
832+
if (full_groups.empty() || mamba_state_groups.empty()) {
833+
std::string group_names = Jsonizable::ToJsonString(location_spec_groups);
834+
std::string error_msg =
835+
full_groups.empty() ? "no full location spec group" : "no mamba state location spec group";
836+
error_msg += ", location_spec_groups: " + group_names;
837+
request_context->error_tracer()->AddErrorMsg(error_msg);
838+
KVCM_LOG_WARN("%s", error_msg.c_str());
839+
return EC_BADARGS;
840+
}
841+
return EC_OK;
797842
}
798843

799844
bool HasAllLocationSpecGroups(const std::set<std::string> &spec_names,
@@ -1814,21 +1859,9 @@ ErrorCode MetaSearcher::PrefixMatchWithMambaByHost(RequestContext *request_conte
18141859

18151860
std::vector<const LocationSpecGroup *> full_groups;
18161861
std::vector<const LocationSpecGroup *> mamba_state_groups;
1817-
for (const auto &group : location_spec_groups) {
1818-
if (IsFullLocationSpecGroup(group)) {
1819-
full_groups.push_back(&group);
1820-
} else {
1821-
mamba_state_groups.push_back(&group);
1822-
}
1823-
}
1824-
if (full_groups.empty() || mamba_state_groups.empty()) {
1825-
std::string group_names = Jsonizable::ToJsonString(location_spec_groups);
1826-
std::string error_msg =
1827-
full_groups.empty() ? "no full location spec group" : "no mamba state location spec group";
1828-
error_msg += ", location_spec_groups: " + group_names;
1829-
request_context->error_tracer()->AddErrorMsg(error_msg);
1830-
KVCM_LOG_WARN("%s", error_msg.c_str());
1831-
return EC_BADARGS;
1862+
auto ec = ClassifySpecGroups(request_context, location_spec_groups, full_groups, mamba_state_groups);
1863+
if (ec != EC_OK) {
1864+
return ec;
18321865
}
18331866
if (p2p_host_count == 0) {
18341867
return PrefixMatchWithMambaByHostWithoutP2P(meta_indexer_.get(),

0 commit comments

Comments
 (0)