Skip to content

<fix>[vm]: add MetadataImpact#3601

Closed
MatheMatrix wants to merge 1 commit into
feature-zsv-5.0.0-vm-registrationfrom
sync/tao.gan/ZSV-11559@@3
Closed

<fix>[vm]: add MetadataImpact#3601
MatheMatrix wants to merge 1 commit into
feature-zsv-5.0.0-vm-registrationfrom
sync/tao.gan/ZSV-11559@@3

Conversation

@MatheMatrix

Copy link
Copy Markdown
Owner

APIImpact

Resolves: ZSV-11559

Change-Id: I6b6a6378627264646d6a76726762736e77787373

sync from gitlab !9461

@coderabbitai

coderabbitai Bot commented Mar 26, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 44fa24e2-a343-451a-b2b9-e69651ec7555

📥 Commits

Reviewing files that changed from the base of the PR and between 8f986c3 and dfbb104.

⛔ Files ignored due to path filters (5)
  • conf/globalConfig/vm.xml is excluded by !**/*.xml
  • conf/persistence.xml is excluded by !**/*.xml
  • conf/serviceConfig/primaryStorage.xml is excluded by !**/*.xml
  • conf/serviceConfig/vmInstance.xml is excluded by !**/*.xml
  • conf/springConfigXml/VmInstanceManager.xml is excluded by !**/*.xml
📒 Files selected for processing (148)
  • compute/src/main/java/org/zstack/compute/vm/CleanupVmInstanceMetadataOnPrimaryStorageGC.java
  • compute/src/main/java/org/zstack/compute/vm/VmExpungeMetadataFlow.java
  • compute/src/main/java/org/zstack/compute/vm/VmGlobalConfig.java
  • compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java
  • compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java
  • conf/db/upgrade/V5.0.0__schema.sql
  • header/src/main/java/org/zstack/header/storage/primary/APIScanVmInstanceMetadataFromPrimaryStorageEvent.java
  • header/src/main/java/org/zstack/header/storage/primary/APIScanVmInstanceMetadataFromPrimaryStorageMsg.java
  • header/src/main/java/org/zstack/header/storage/primary/APIScanVmInstanceMetadataFromPrimaryStorageMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/storage/primary/APIScanVmInstanceMetadataFromPrimaryStorageReplyDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/storage/primary/CleanupVmInstanceMetadataOnPrimaryStorageMsg.java
  • header/src/main/java/org/zstack/header/storage/primary/CleanupVmInstanceMetadataOnPrimaryStorageReply.java
  • header/src/main/java/org/zstack/header/storage/primary/GetVmInstanceMetadataFromPrimaryStorageMsg.java
  • header/src/main/java/org/zstack/header/storage/primary/GetVmInstanceMetadataFromPrimaryStorageReply.java
  • header/src/main/java/org/zstack/header/storage/primary/ReadVmInstanceMetadataMsg.java
  • header/src/main/java/org/zstack/header/storage/primary/ReadVmInstanceMetadataReply.java
  • header/src/main/java/org/zstack/header/storage/primary/RebaseVolumeBackingFileOnPrimaryStorageMsg.java
  • header/src/main/java/org/zstack/header/storage/primary/RebaseVolumeBackingFileOnPrimaryStorageReply.java
  • header/src/main/java/org/zstack/header/storage/primary/ScanVmInstanceMetadataFromPrimaryStorageMsg.java
  • header/src/main/java/org/zstack/header/storage/primary/ScanVmInstanceMetadataFromPrimaryStorageReply.java
  • header/src/main/java/org/zstack/header/storage/primary/VmMetadataScanEntry.java
  • header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsg.java
  • header/src/main/java/org/zstack/header/storage/snapshot/APIRevertVolumeFromSnapshotMsg.java
  • header/src/main/java/org/zstack/header/storage/snapshot/APIShrinkVolumeSnapshotMsg.java
  • header/src/main/java/org/zstack/header/storage/snapshot/APIUpdateVolumeSnapshotMsg.java
  • header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsg.java
  • header/src/main/java/org/zstack/header/storage/snapshot/group/APIRevertVmFromSnapshotGroupMsg.java
  • header/src/main/java/org/zstack/header/storage/snapshot/group/APIUngroupVolumeSnapshotGroupMsg.java
  • header/src/main/java/org/zstack/header/storage/snapshot/group/APIUpdateVolumeSnapshotGroupMsg.java
  • header/src/main/java/org/zstack/header/tag/APICreateSystemTagMsg.java
  • header/src/main/java/org/zstack/header/tag/APICreateSystemTagsMsg.java
  • header/src/main/java/org/zstack/header/tag/APIDeleteTagMsg.java
  • header/src/main/java/org/zstack/header/tag/APIUpdateSystemTagMsg.java
  • header/src/main/java/org/zstack/header/vm/APIAttachIsoToVmInstanceMsg.java
  • header/src/main/java/org/zstack/header/vm/APIAttachL3NetworkToVmMsg.java
  • header/src/main/java/org/zstack/header/vm/APIAttachVmNicToVmMsg.java
  • header/src/main/java/org/zstack/header/vm/APIChangeInstanceOfferingMsg.java
  • header/src/main/java/org/zstack/header/vm/APIChangeVmNicNetworkMsg.java
  • header/src/main/java/org/zstack/header/vm/APIChangeVmNicStateMsg.java
  • header/src/main/java/org/zstack/header/vm/APIConvertTemplatedVmInstanceToVmInstanceMsg.java
  • header/src/main/java/org/zstack/header/vm/APIConvertVmInstanceToTemplatedVmInstanceMsg.java
  • header/src/main/java/org/zstack/header/vm/APICreateVmNicMsg.java
  • header/src/main/java/org/zstack/header/vm/APIDeleteVmBootModeMsg.java
  • header/src/main/java/org/zstack/header/vm/APIDeleteVmConsolePasswordMsg.java
  • header/src/main/java/org/zstack/header/vm/APIDeleteVmHostnameMsg.java
  • header/src/main/java/org/zstack/header/vm/APIDeleteVmNicMsg.java
  • header/src/main/java/org/zstack/header/vm/APIDeleteVmSshKeyMsg.java
  • header/src/main/java/org/zstack/header/vm/APIDeleteVmStaticIpMsg.java
  • header/src/main/java/org/zstack/header/vm/APIDestroyVmInstanceMsg.java
  • header/src/main/java/org/zstack/header/vm/APIDetachIsoFromVmInstanceMsg.java
  • header/src/main/java/org/zstack/header/vm/APIDetachL3NetworkFromVmMsg.java
  • header/src/main/java/org/zstack/header/vm/APIExpungeVmInstanceMsg.java
  • header/src/main/java/org/zstack/header/vm/APIMigrateVmMsg.java
  • header/src/main/java/org/zstack/header/vm/APIRecoverVmInstanceMsg.java
  • header/src/main/java/org/zstack/header/vm/APIReimageVmInstanceMsg.java
  • header/src/main/java/org/zstack/header/vm/APISetVmBootModeMsg.java
  • header/src/main/java/org/zstack/header/vm/APISetVmBootOrderMsg.java
  • header/src/main/java/org/zstack/header/vm/APISetVmBootVolumeMsg.java
  • header/src/main/java/org/zstack/header/vm/APISetVmClockTrackMsg.java
  • header/src/main/java/org/zstack/header/vm/APISetVmConsolePasswordMsg.java
  • header/src/main/java/org/zstack/header/vm/APISetVmHostnameMsg.java
  • header/src/main/java/org/zstack/header/vm/APISetVmQxlMemoryMsg.java
  • header/src/main/java/org/zstack/header/vm/APISetVmSoundTypeMsg.java
  • header/src/main/java/org/zstack/header/vm/APISetVmSshKeyMsg.java
  • header/src/main/java/org/zstack/header/vm/APISetVmStaticIpMsg.java
  • header/src/main/java/org/zstack/header/vm/APIUpdateVmInstanceMsg.java
  • header/src/main/java/org/zstack/header/vm/APIUpdateVmNicDriverMsg.java
  • header/src/main/java/org/zstack/header/vm/APIUpdateVmPriorityMsg.java
  • header/src/main/java/org/zstack/header/vm/VmInstanceState.java
  • header/src/main/java/org/zstack/header/vm/cdrom/APICreateVmCdRomMsg.java
  • header/src/main/java/org/zstack/header/vm/cdrom/APISetVmInstanceDefaultCdRomMsg.java
  • header/src/main/java/org/zstack/header/vm/metadata/APICleanupVmInstanceMetadataEvent.java
  • header/src/main/java/org/zstack/header/vm/metadata/APICleanupVmInstanceMetadataEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/vm/metadata/APICleanupVmInstanceMetadataMsg.java
  • header/src/main/java/org/zstack/header/vm/metadata/APICleanupVmInstanceMetadataMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/vm/metadata/APIGetVmInstanceMetadataFromPrimaryStorageEvent.java
  • header/src/main/java/org/zstack/header/vm/metadata/APIGetVmInstanceMetadataFromPrimaryStorageMsg.java
  • header/src/main/java/org/zstack/header/vm/metadata/APIGetVmInstanceMetadataFromPrimaryStorageMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/vm/metadata/APIGetVmInstanceMetadataFromPrimaryStorageReplyDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/vm/metadata/APIRegisterVmInstanceFromMetadataEvent.java
  • header/src/main/java/org/zstack/header/vm/metadata/APIRegisterVmInstanceFromMetadataEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/vm/metadata/APIRegisterVmInstanceFromMetadataMsg.java
  • header/src/main/java/org/zstack/header/vm/metadata/APIRegisterVmInstanceFromMetadataMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/vm/metadata/APIUpdateVmInstanceMetadataEvent.java
  • header/src/main/java/org/zstack/header/vm/metadata/APIUpdateVmInstanceMetadataEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/vm/metadata/APIUpdateVmInstanceMetadataMsg.java
  • header/src/main/java/org/zstack/header/vm/metadata/APIUpdateVmInstanceMetadataMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/vm/metadata/MetadataImpact.java
  • header/src/main/java/org/zstack/header/vm/metadata/ResourceMetadata.java
  • header/src/main/java/org/zstack/header/vm/metadata/UpdateVmInstanceMetadataMsg.java
  • header/src/main/java/org/zstack/header/vm/metadata/UpdateVmInstanceMetadataOnPrimaryStorageMsg.java
  • header/src/main/java/org/zstack/header/vm/metadata/UpdateVmInstanceMetadataOnPrimaryStorageReply.java
  • header/src/main/java/org/zstack/header/vm/metadata/UpdateVmInstanceMetadataReply.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmInstanceMetadataConstants.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmInstanceMetadataDTO.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmMetadataCategory.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmMetadataDirtyService.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmMetadataDirtyVO.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmMetadataDirtyVO_.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmMetadataErrors.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmMetadataFingerprintVO.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmMetadataPathBuildExtensionPoint.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmMetadataPathReplacementExtensionPoint.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmMetadataResourcePersistExtensionPoint.java
  • header/src/main/java/org/zstack/header/vm/metadata/VmUuidFromApiResolver.java
  • header/src/main/java/org/zstack/header/vm/metadata/VolumeResourceMetadata.java
  • header/src/main/java/org/zstack/header/volume/APIAttachDataVolumeToVmMsg.java
  • header/src/main/java/org/zstack/header/volume/APIChangeVolumeStateMsg.java
  • header/src/main/java/org/zstack/header/volume/APICreateVolumeSnapshotGroupMsg.java
  • header/src/main/java/org/zstack/header/volume/APICreateVolumeSnapshotMsg.java
  • header/src/main/java/org/zstack/header/volume/APIDeleteDataVolumeMsg.java
  • header/src/main/java/org/zstack/header/volume/APIDetachDataVolumeFromVmMsg.java
  • header/src/main/java/org/zstack/header/volume/APIExpungeDataVolumeMsg.java
  • header/src/main/java/org/zstack/header/volume/APIFlattenVolumeMsg.java
  • header/src/main/java/org/zstack/header/volume/APIRecoverDataVolumeMsg.java
  • header/src/main/java/org/zstack/header/volume/APISyncVolumeSizeMsg.java
  • header/src/main/java/org/zstack/header/volume/APIUndoSnapshotCreationMsg.java
  • header/src/main/java/org/zstack/header/volume/APIUpdateVolumeMsg.java
  • plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APILocalStorageMigrateVolumeMsg.java
  • plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java
  • plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java
  • plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java
  • plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageSimulator.java
  • plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageSimulatorConfig.java
  • plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageVmMetadataExtension.java
  • plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java
  • plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageBackend.java
  • plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java
  • plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackendCommands.java
  • plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsVmMetadataExtension.java
  • resourceconfig/src/main/java/org/zstack/resourceconfig/APIDeleteResourceConfigMsg.java
  • resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java
  • sdk/src/main/java/SourceClassMap.java
  • sdk/src/main/java/org/zstack/sdk/CleanupVmInstanceMetadataAction.java
  • sdk/src/main/java/org/zstack/sdk/CleanupVmInstanceMetadataResult.java
  • sdk/src/main/java/org/zstack/sdk/GetVmInstanceMetadataFromPrimaryStorageAction.java
  • sdk/src/main/java/org/zstack/sdk/GetVmInstanceMetadataFromPrimaryStorageResult.java
  • sdk/src/main/java/org/zstack/sdk/RegisterVmInstanceFromMetadataAction.java
  • sdk/src/main/java/org/zstack/sdk/RegisterVmInstanceFromMetadataResult.java
  • sdk/src/main/java/org/zstack/sdk/ScanVmInstanceMetadataFromPrimaryStorageAction.java
  • sdk/src/main/java/org/zstack/sdk/ScanVmInstanceMetadataFromPrimaryStorageResult.java
  • sdk/src/main/java/org/zstack/sdk/UpdateVmInstanceMetadataAction.java
  • sdk/src/main/java/org/zstack/sdk/UpdateVmInstanceMetadataResult.java
  • sdk/src/main/java/org/zstack/sdk/VmMetadataScanEntry.java
  • storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java
  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
  • testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy
  • testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy

Walkthrough

新增完整的云主机元数据子系统:API/消息/事件、数据库表、全局配置、扩展点、主存储(Local/NFS)与KVM 后端集成,以及元数据注册/读取/扫描/清理流程与 GC 重试机制。

Changes

Cohort / File(s) Summary
核心 API 与 消息/事件
header/src/main/java/org/zstack/header/vm/metadata/API*.java, header/src/main/java/org/zstack/header/storage/primary/APIScanVmInstanceMetadataFromPrimaryStorage*.java, header/src/main/java/org/zstack/header/storage/primary/*.java
新增多条 REST API 消息与事件(注册/清理/获取/更新/扫描等)及其请求/回复消息类;新增用于主存储与云总线的消息类型(Get/Scan/Cleanup/Update/Rebase 等)。
头部模型、DTO、VO 与常量
header/src/main/java/org/zstack/header/vm/metadata/*, header/src/main/java/org/zstack/header/storage/primary/VmMetadataScanEntry.java
新增 MetadataImpact 注解、ResourceMetadata、VmInstanceMetadataDTO、VolumeResourceMetadata、VmMetadataScanEntry、错误枚举、常量类及若干 DTO/Reply 类型。
扩展点接口与解析器
header/src/main/java/org/zstack/header/vm/metadata/*ExtensionPoint.java, VmUuidFromApiResolver.java
新增路径构建/替换/持久化扩展点接口与 API 字段→VM 解析器接口。
数据库迁移(JPA VO / SQL)
conf/db/upgrade/V5.0.0__schema.sql, header/src/main/java/org/zstack/header/vm/metadata/VmMetadataDirtyVO*.java, VmMetadataFingerprintVO*.java
新增两张表及对应 JPA 实体/元模型:VmMetadataDirtyVO 与 VmMetadataFingerprintVO(字段、外键、索引、生命周期字段等)。
计算模块(workflow / GC / 拦截器 / 配置 / 标签)
compute/src/main/java/org/zstack/compute/vm/{VmExpungeMetadataFlow,CleanupVmInstanceMetadataOnPrimaryStorageGC,VmGlobalConfig,VmInstanceApiInterceptor,VmSystemTags}.java
新增 VmExpungeMetadataFlow(NoRollbackFlow)、CleanupVmInstanceMetadataOnPrimaryStorageGC、若干 VmGlobalConfig、API 拦截器校验与系统标签;实现发送清理消息并在失败时提交去重 GC 重试。
主存储基类与路由
storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java
扩展 PrimaryStorageBase 路由元数据相关消息并提供统一“不支持”回复;增加对 APIScan 的处理与扫描结果过滤。
本地存储实现(Local)
plugin/localstorage/src/main/java/org/zstack/storage/primary/local/*
Local 存储新增 KVM agent 命令/响应、Simulator 端点、LocalStorageVmMetadataExtension(路径构建/验证/替换/持久化)、以及 LocalStorageBase/KVM backend 的元数据消息处理(读/写/扫/清/变基)。
NFS 存储实现(NFS)
plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/*
NFS 后端新增 KVM agent 命令/响应、路径常量与 KVM backend 实现,支持元数据写/取/扫/清及前缀变基;PrimaryStorage 路由新增相应处理。
大量现有 API 注解应用
header/src/main/java/org/zstack/header/{vm,volume,storage,tag,...}/*Msg.java
为大量现有 API 消息添加 @MetadataImpact 注解(NONE/CONFIG/STORAGE 及 resolver/field/updateOnFailure 等),以支持元数据影响追踪。
SDK 与 测试库
sdk/src/main/java/org/zstack/sdk/*, testlib/src/main/java/org/zstack/testlib/*.groovy
新增多项 SDK Action/Result/DTO(cleanup/get/register/scan/update 等)并更新 SourceClassMap;ApiHelper 与模拟器注册补充新 API 的测试辅助方法与模拟端点。

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant API
    participant Compute
    participant PrimaryStorage
    participant KVMHost
    participant Database

    Client->>API: POST /vm-instances/metadata/register
    API->>Compute: APIRegisterVmInstanceFromMetadataMsg
    Compute->>Compute: 校验 metadataPath(通过扩展点)
    alt path valid
        Compute->>PrimaryStorage: GetVmInstanceMetadataFromPrimaryStorageMsg
        PrimaryStorage->>KVMHost: agent HTTP 请求 (GET metadata)
        KVMHost->>PrimaryStorage: 返回 metadata
        PrimaryStorage->>Compute: GetVmInstanceMetadataFromPrimaryStorageReply(metadata)
        Compute->>Database: 持久化/创建 VM 记录
        Compute->>API: APIRegisterVmInstanceFromMetadataEvent(success)
        API->>Client: 返回注册结果
    else invalid
        Compute->>API: 返回错误事件
        API->>Client: 返回失败
    end
Loading
sequenceDiagram
    participant Client
    participant API
    participant Compute
    participant PrimaryStorage
    participant KVMHost

    Client->>API: PUT /vm-instances/metadata/cleanup
    API->>Compute: APICleanupVmInstanceMetadataMsg(vmUuids)
    Compute->>PrimaryStorage: CleanupVmInstanceMetadataOnPrimaryStorageMsg (per-ps)
    PrimaryStorage->>KVMHost: agent HTTP POST /cleanup-metadata
    KVMHost->>PrimaryStorage: CleanupRsp
    PrimaryStorage->>Compute: Cleanup reply
    Compute->>API: APICleanupVmInstanceMetadataEvent(result)
    API->>Client: 返回清理结果
Loading

Estimated code review effort

🎯 4 (复杂) | ⏱️ ~60 分钟

Poem

🐰 我是小兔在代码林,
带着元数据来巡视,
扫描、注册与温柔清理,
在主存与主机间跳跃不息,
数据整齐,春光满园。

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sync/tao.gan/ZSV-11559@@3

@ZStack-Robot

Copy link
Copy Markdown
Collaborator

Comment from yaohua.wu:

Review: MR !9461 — ZSV-11559 【注册虚拟机】(zstack core)

关联 MR: premium !13328 | zstack-utility !6815
Jira: ZSV-11559 — P0 New Feature,实现 VM 元数据持久化到主存储,支持虚拟机注册/恢复

总体评价

本 MR 是 VM 注册功能的核心框架层:定义了 @MetadataImpact 注解体系、元数据脏标记 VO、API 消息、扩展点接口和 Expunge 清理流程。架构设计清晰,关注点分离合理:

  • header 层:纯数据定义(VO、DTO、Message、ExtensionPoint),无业务逻辑
  • compute 层:流程编排(ExpungeFlow、GC、GlobalConfig)
  • premium 层(另一个 MR):业务实现

153 个文件改动中,大部分是 API 消息类上新增 @MetadataImpact 注解(约 70 个文件),改动量虽大但模式统一、机械化程度高。


Warning

1. 🟡 [VmExpungeMetadataFlow.java] Completion AsyncBackup 参数需确认

// Line ~80 (推测)
bus.send(msg, new CloudBusCallBack(trigger) {

CloudBusCallBack(trigger)FlowTrigger 作为 AsyncBackup 传入。当回调内部 trigger.next() 之后如果有异常(虽然概率极低),AsyncSafeAspect 会尝试对 trigger 做 fail 操作。需确认 FlowTrigger 作为 AsyncBackup 的行为是否符合预期(即 trigger.next() 之后不会被重复触发)。

2. 🟡 [VmGlobalConfig.java] VM_METADATA_LAST_REFRESH_VERSION 缺少 defaultValue 注解

@GlobalConfigValidation()
public static GlobalConfig VM_METADATA_LAST_REFRESH_VERSION = new GlobalConfig(CATEGORY, "vm.metadata.lastRefreshVersion");

@GlobalConfigValidation() 为空校验,但在 vm.xmldefaultValue 设为 "5.0.0"。这个 GlobalConfig 用于防止跨 MN 重复触发升级刷新,属于内部状态。建议:

  • 增加注释说明此配置为系统内部使用,不应被用户修改
  • 或者考虑用 DB 记录代替 GlobalConfig 存储此状态

3. 🟡 [VmInstanceMetadataConstants.java] extractOldPrefix 路径标记列表可能不完整

private static final String[] STORAGE_PATH_MARKERS = {
    "/rootVolumes/", "/dataVolumes/", "/volumeSnapshots/", "/memory/"
};

如果未来新增存储路径模式(如 cache volume、temp volume),此列表需要同步更新。建议在注释中标注此列表的维护要求,或改用更通用的路径解析策略。

4. 🟡 [VmMetadataDirtyVO.java] lastOpDate 使用 @PreUpdate 手动置空

@PreUpdate
private void preUpdate() {
    lastOpDate = null;

这是 ZStack 的常见模式(让 DB 的 ON UPDATE CURRENT_TIMESTAMP 生效)。但 VmMetadataDirtyVOlastClaimTimenextRetryTime 也是 Timestamp 类型,@PreUpdate 只清 lastOpDate 是正确的。确认一下 lastClaimTime / nextRetryTime 由业务代码显式设置即可。

5. 🟡 [@MetadataImpact 注解覆盖度] 部分 API 无 diff 内容

文件列表中约 30 个 API 消息文件(index 100-136)显示 0L diff,说明 GitLab API 未返回 diff 内容。需确认这些文件是否确实添加了 @MetadataImpact 注解。如果遗漏,会导致某些 API 操作不触发元数据更新。


Suggestion

1. 🟢 [V5.0.0__schema.sql] VmMetadataFingerprintVO.metadataSnapshot 类型为 LONGTEXT

`metadataSnapshot` LONGTEXT,

根据 VmMetadataBuilderUtils 中的阈值(REJECT_THRESHOLD = 30MB),实际存储的 fingerprint 可能只是 hash 或压缩后的摘要。如果确实存储完整 JSON,LONGTEXT(4GB max)过于宽泛;如果存储 hash,VARCHAR 即可。建议根据实际用途选择合适的列类型。

2. 🟢 [CleanupVmInstanceMetadataOnPrimaryStorageGC.java] GC name 建议包含 PS UUID

public static String getGCName(String vmUuid) {
    return String.format("gc-cleanup-vm-metadata-%s", vmUuid);
}

一个 VM 可能在多个 PS 上有元数据(迁移场景),建议 GC name 同时包含 PS UUID 以避免冲突:

return String.format("gc-cleanup-vm-metadata-%s-on-%s", vmUuid, psUuid);

3. 🟢 [VmMetadataCategory.java] 建议添加 JavaDoc 说明每个 category 含义

public enum VmMetadataCategory {
    REGULAR,        // 普通虚拟机
    TEMPLATE,       // 模板虚拟机
    TEMPLATE_CACHE  // 模板缓存虚拟机
}

Verdict: APPROVED

整体架构设计合理,扩展点接口清晰,@MetadataImpact 注解模式是一个优雅的声明式设计。Warning 项均为防御性建议,不阻塞合并。需确认 0L diff 文件的注解覆盖完整性(Warning #5)。


🤖 Robot Reviewer

@MatheMatrix MatheMatrix force-pushed the sync/tao.gan/ZSV-11559@@3 branch from 8f986c3 to b18062f Compare March 26, 2026 03:04
APIImpact

Resolves: ZSV-11559

Change-Id: I6b6a6378627264646d6a76726762736e77787373
@MatheMatrix MatheMatrix force-pushed the sync/tao.gan/ZSV-11559@@3 branch from b18062f to dfbb104 Compare March 26, 2026 03:09
@zstack-robot-2 zstack-robot-2 deleted the sync/tao.gan/ZSV-11559@@3 branch March 26, 2026 03:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants