Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions conf/db/zsv/V5.1.0__schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -314,3 +314,21 @@ CREATE TABLE IF NOT EXISTS `zstack`.`PlatformServiceInstanceVO` (

-- Feature: LicenseHistoryVO cause | ZSV-12697
CALL INSERT_COLUMN('LicenseHistoryVO', 'cause', 'varchar(32)', 0, 'UpdateLicense', 'source');

-- Feature: serialize VM metadata cleanup with cluster-wide metadata flushes | ZSV-11867
CREATE TABLE IF NOT EXISTS `zstack`.`VmMetadataCleanupBarrierVO` (
`id` varchar(32) NOT NULL,
`state` varchar(32) NOT NULL DEFAULT 'Idle',
`operationUuid` varchar(32) DEFAULT NULL,
`managementNodeUuid` varchar(32) DEFAULT NULL,
`leaseExpireDate` timestamp NULL DEFAULT NULL,
`generation` bigint NOT NULL DEFAULT 0,
`lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59',
PRIMARY KEY (`id`),
CONSTRAINT `fkVmMetadataCleanupBarrierVOManagementNodeVO`
FOREIGN KEY (`managementNodeUuid`) REFERENCES `ManagementNodeVO` (`uuid`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT IGNORE INTO `zstack`.`VmMetadataCleanupBarrierVO` (`id`, `state`, `createDate`)
VALUES ('vm-metadata-cleanup', 'Idle', CURRENT_TIMESTAMP);
1 change: 1 addition & 0 deletions conf/persistence.xml
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,7 @@
<class>org.zstack.header.resourceattribute.entity.ResourceAttributeKeyResourceTypeVO</class>
<class>org.zstack.header.resourceattribute.entity.ResourceAttributeConstraintVO</class>
<class>org.zstack.softwarePackage.header.SoftwarePackageVO</class>
<class>org.zstack.header.vm.metadata.VmMetadataCleanupBarrierVO</class>
<class>org.zstack.header.vm.metadata.VmMetadataDirtyVO</class>
<class>org.zstack.header.vm.metadata.VmMetadataFlushStateVO</class>
<class>org.zstack.log.server.LogServerVO</class>
Expand Down
15 changes: 9 additions & 6 deletions conf/serviceConfig/vmInstance.xml
Original file line number Diff line number Diff line change
Expand Up @@ -264,12 +264,15 @@
<message>
<name>org.zstack.header.vm.APIDeleteTemplatedVmInstanceMsg</name>
</message>
<message>
<name>org.zstack.header.vm.APICleanupVmInstanceMetadataMsg</name>
</message>
<message>
<name>org.zstack.header.vm.APIRegisterVmInstanceFromMetadataMsg</name>
</message>
<message>
<name>org.zstack.header.vm.APICleanupVmInstanceMetadataMsg</name>
</message>
<message>
<name>org.zstack.header.vm.APICleanupAllVmInstanceMetadataMsg</name>
</message>
<message>
<name>org.zstack.header.vm.APIRegisterVmInstanceFromMetadataMsg</name>
</message>
<message>
<name>org.zstack.header.vm.APIUpdateVmInstanceMetadataMsg</name>
</message>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.zstack.header.storage.primary;

import org.zstack.header.message.NeedReplyMessage;

public class CleanupAllVmMetadataOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage {
private String primaryStorageUuid;
private String metadataDir;
private long metadataGeneration;

@Override
public String getPrimaryStorageUuid() {
return primaryStorageUuid;
}

public void setPrimaryStorageUuid(String primaryStorageUuid) {
this.primaryStorageUuid = primaryStorageUuid;
}

public String getMetadataDir() {
return metadataDir;
}

public void setMetadataDir(String metadataDir) {
this.metadataDir = metadataDir;
}

public long getMetadataGeneration() {
return metadataGeneration;
}

public void setMetadataGeneration(long metadataGeneration) {
this.metadataGeneration = metadataGeneration;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.zstack.header.storage.primary;

import org.zstack.header.message.MessageReply;

public class CleanupAllVmMetadataOnPrimaryStorageReply extends MessageReply {
private boolean skipped;
private Long currentGeneration;

public boolean isSkipped() {
return skipped;
}

public void setSkipped(boolean skipped) {
this.skipped = skipped;
}

public Long getCurrentGeneration() {
return currentGeneration;
}

public void setCurrentGeneration(Long currentGeneration) {
this.currentGeneration = currentGeneration;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.zstack.header.vm;

import org.zstack.header.message.APIEvent;
import org.zstack.header.rest.RestResponse;

import java.util.List;

@RestResponse(fieldsTo = {"all"})
public class APICleanupAllVmInstanceMetadataEvent extends APIEvent {
private List<String> failedPrimaryStorageUuids;

public APICleanupAllVmInstanceMetadataEvent() {
super(null);
}

public APICleanupAllVmInstanceMetadataEvent(String apiId) {
super(apiId);
}

public List<String> getFailedPrimaryStorageUuids() {
return failedPrimaryStorageUuids;
}

public void setFailedPrimaryStorageUuids(List<String> failedPrimaryStorageUuids) {
this.failedPrimaryStorageUuids = failedPrimaryStorageUuids;
}

public static APICleanupAllVmInstanceMetadataEvent __example__() {
APICleanupAllVmInstanceMetadataEvent evt = new APICleanupAllVmInstanceMetadataEvent();
evt.failedPrimaryStorageUuids = java.util.Collections.emptyList();
return evt;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.zstack.header.vm

import org.zstack.header.errorcode.ErrorCode

doc {

title "清理全部云主机元数据返回"

field {
name "failedPrimaryStorageUuids"
desc "清理失败的主存储UUID列表;具体失败原因汇总见 error 字段,逐条详情见 mn / agent 日志"
type "List"
since "5.1.0"
}
field {
name "success"
desc "操作是否成功;任一主存储清理失败则为 false"
type "boolean"
since "5.1.0"
}
ref {
name "error"
path "org.zstack.header.vm.APICleanupAllVmInstanceMetadataEvent.error"
desc "错误码;success=false 时聚合所有失败主存储的失败原因"
type "ErrorCode"
since "5.1.0"
clz ErrorCode.class
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.zstack.header.vm;

import org.springframework.http.HttpMethod;
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.primary.PrimaryStorageVO;

import java.util.List;

@RestRequest(
path = "/vm-instances/metadata",
method = HttpMethod.DELETE,
responseClass = APICleanupAllVmInstanceMetadataEvent.class
)
public class APICleanupAllVmInstanceMetadataMsg extends APIMessage {
@APIParam(resourceType = PrimaryStorageVO.class, required = false)
private List<String> primaryStorageUuids;

public List<String> getPrimaryStorageUuids() {
return primaryStorageUuids;
}

public void setPrimaryStorageUuids(List<String> primaryStorageUuids) {
this.primaryStorageUuids = primaryStorageUuids;
}

public static APICleanupAllVmInstanceMetadataMsg __example__() {
APICleanupAllVmInstanceMetadataMsg msg = new APICleanupAllVmInstanceMetadataMsg();
msg.primaryStorageUuids = java.util.Arrays.asList(uuid(), uuid());
return msg;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package org.zstack.header.vm

import org.zstack.header.vm.APICleanupAllVmInstanceMetadataEvent

doc {
title "清理全部云主机元数据"

category "云主机"

desc """清理一个或多个主存储上保存的全部云主机元数据文件,仅管理员可调用。当 primaryStorageUuids 为空(未传或传空列表)时,将清理系统中所有 Enabled+Connected 且支持云主机元数据的主存储;否则仅清理列表中指定的主存储。"""

rest {
request {
url "DELETE /v1/vm-instances/metadata"

header (Authorization: 'OAuth the-session-uuid')

clz APICleanupAllVmInstanceMetadataMsg.class

desc """"""

params {

column {
name "primaryStorageUuids"
enclosedIn ""
desc "需要清理云主机元数据的主存储UUID列表;为空时清理所有 Enabled+Connected 主存储上的元数据"
location "query"
type "List"
optional true
since "5.1.0"
}
column {
name "systemTags"
enclosedIn ""
desc "系统标签"
location "query"
type "List"
optional true
since "5.1.0"
}
column {
name "userTags"
enclosedIn ""
desc "用户标签"
location "query"
type "List"
optional true
since "5.1.0"
}
}
}

response {
clz APICleanupAllVmInstanceMetadataEvent.class
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public class UpdateVmInstanceMetadataOnPrimaryStorageMsg extends NeedReplyMessag
private String schemaVersion;
private boolean storageStructureChange;
private String metadataPath;
private long metadataGeneration;

@Override
public String getPrimaryStorageUuid() {
Expand Down Expand Up @@ -95,4 +96,12 @@ public String getMetadataPath() {
public void setMetadataPath(String metadataPath) {
this.metadataPath = metadataPath;
}

public long getMetadataGeneration() {
return metadataGeneration;
}

public void setMetadataGeneration(long metadataGeneration) {
this.metadataGeneration = metadataGeneration;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.zstack.header.vm.metadata;

public enum VmMetadataCleanupBarrierState {
Idle,
Draining,
Cleaning
}
Loading