Skip to content

Commit

Permalink
<fix>[storage]: support estimate template size
Browse files Browse the repository at this point in the history
Resolves: ZSTAC-55245

Change-Id: I676f6f6262626e617465786c64756f667164676b
  • Loading branch information
MaJin1996 committed May 30, 2023
1 parent ce94cec commit b0dc864
Show file tree
Hide file tree
Showing 23 changed files with 486 additions and 84 deletions.
4 changes: 2 additions & 2 deletions conf/db/upgrade/V4.7.0__schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ DELIMITER ;
call addHostHaStatus();
DROP PROCEDURE IF EXISTS addHostHaStatus;

CREATE TABLE `VolumeSnapshotReferenceTreeVO` (
CREATE TABLE IF NOT EXISTS `VolumeSnapshotReferenceTreeVO` (
`uuid` varchar(32) NOT NULL,
`rootImageUuid` varchar(32) DEFAULT NULL,
`rootVolumeUuid` VARCHAR(32) DEFAULT NULL,
Expand All @@ -294,7 +294,7 @@ CREATE TABLE `VolumeSnapshotReferenceTreeVO` (
PRIMARY KEY (`uuid`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

CREATE TABLE `VolumeSnapshotReferenceVO` (
CREATE TABLE IF NOT EXISTS `VolumeSnapshotReferenceVO` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`parentId` bigint(20) DEFAULT NULL,
`volumeUuid` varchar(32) DEFAULT NULL,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
public class EstimateVolumeTemplateSizeMsg extends NeedReplyMessage implements VolumeMessage {
private String volumeUuid;

private boolean ignoreError = true;

@Override
public String getVolumeUuid() {
return volumeUuid;
Expand All @@ -13,4 +15,12 @@ public String getVolumeUuid() {
public void setVolumeUuid(String volumeUuid) {
this.volumeUuid = volumeUuid;
}

public boolean isIgnoreError() {
return ignoreError;
}

public void setIgnoreError(boolean ignoreError) {
this.ignoreError = ignoreError;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
public class EstimateVolumeTemplateSizeReply extends MessageReply {
private long actualSize;
private long size;
private boolean withInternalSnapshot;

public long getSize() {
return size;
Expand All @@ -21,4 +22,12 @@ public long getActualSize() {
public void setActualSize(long actualSize) {
this.actualSize = actualSize;
}

public void setWithInternalSnapshot(boolean withInternalSnapshot) {
this.withInternalSnapshot = withInternalSnapshot;
}

public boolean isWithInternalSnapshot() {
return withInternalSnapshot;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3041,14 +3041,56 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) {

@Override
protected void handle(SyncVolumeSizeOnPrimaryStorageMsg msg) {
inQueue().name(String.format("sync-volume-size-on-primarystorage-%s", self.getUuid()))
.asyncBackup(msg)
.run(chain -> syncVolumeSizeOnPrimaryStorage(msg, new NoErrorCompletion(chain) {
@Override
public void done() {
chain.next();
}
}));
SyncVolumeSizeOnPrimaryStorageReply reply = new SyncVolumeSizeOnPrimaryStorageReply();
syncVolumeSize(msg.getVolumeUuid(), msg.getInstallPath(), new ReturnValueCompletion<GetVolumeSizeRsp>(msg) {
@Override
public void success(GetVolumeSizeRsp rsp) {
markVolumeActualSize(msg.getVolumeUuid(), rsp.actualSize);

// some ceph version has no way to get actual size
long asize = rsp.actualSize != null ? rsp.actualSize : Q.New(VolumeVO.class)
.select(VolumeVO_.actualSize)
.eq(VolumeVO_.uuid, msg.getVolumeUuid())
.findValue();
reply.setActualSize(asize);
reply.setSize(rsp.size);
reply.setWithInternalSnapshot(true);
bus.reply(msg, reply);
}

@Override
public void fail(ErrorCode errorCode) {
reply.setError(errorCode);
bus.reply(msg, reply);
}
});
}

@Override
protected void handle(EstimateVolumeTemplateSizeOnPrimaryStorageMsg msg) {
EstimateVolumeTemplateSizeOnPrimaryStorageReply reply = new EstimateVolumeTemplateSizeOnPrimaryStorageReply();
// TODO: estimate template size
syncVolumeSize(msg.getVolumeUuid(), msg.getInstallPath(), new ReturnValueCompletion<GetVolumeSizeRsp>(msg) {
@Override
public void success(GetVolumeSizeRsp rsp) {
markVolumeActualSize(msg.getVolumeUuid(), rsp.actualSize);

// some ceph version has no way to get actual size
long asize = rsp.actualSize != null ? rsp.actualSize : Q.New(VolumeVO.class)
.select(VolumeVO_.actualSize)
.eq(VolumeVO_.uuid, msg.getVolumeUuid())
.findValue();
reply.setActualSize(asize);
reply.setWithInternalSnapshot(true);
bus.reply(msg, reply);
}

@Override
public void fail(ErrorCode errorCode) {
reply.setError(errorCode);
bus.reply(msg, reply);
}
});
}

@Override
Expand All @@ -3063,38 +3105,15 @@ public void done() {
}));
}

protected void syncVolumeSizeOnPrimaryStorage(final SyncVolumeSizeOnPrimaryStorageMsg msg, final NoErrorCompletion completion) {
protected void syncVolumeSize(String volumeUuid, String installPath, final ReturnValueCompletion<GetVolumeSizeRsp> completion) {
final SyncVolumeSizeOnPrimaryStorageReply reply = new SyncVolumeSizeOnPrimaryStorageReply();
final VolumeVO vol = dbf.findByUuid(msg.getVolumeUuid(), VolumeVO.class);

String installPath = vol.getInstallPath();
GetVolumeSizeCmd cmd = new GetVolumeSizeCmd();
cmd.fsId = getSelf().getFsid();
cmd.uuid = self.getUuid();
cmd.volumeUuid = msg.getVolumeUuid();
cmd.volumeUuid = volumeUuid;
cmd.installPath = installPath;

httpCall(GET_VOLUME_SIZE_PATH, cmd, GetVolumeSizeRsp.class, new ReturnValueCompletion<GetVolumeSizeRsp>(msg) {
@Override
public void success(GetVolumeSizeRsp rsp) {
markVolumeActualSize(vol.getUuid(), rsp.actualSize);

// current ceph has no way to get actual size
long asize = rsp.actualSize == null ? vol.getActualSize() : rsp.actualSize;
reply.setActualSize(asize);
reply.setSize(rsp.size);
reply.setWithInternalSnapshot(true);
bus.reply(msg, reply);
completion.done();
}

@Override
public void fail(ErrorCode errorCode) {
reply.setError(errorCode);
bus.reply(msg, reply);
completion.done();
}
});
httpCall(GET_VOLUME_SIZE_PATH, cmd, GetVolumeSizeRsp.class, completion);
}

private void BatchSyncVolumeSizeOnPrimaryStorage(BatchSyncVolumeSizeOnPrimaryStorageMsg msg, NoErrorCompletion completion) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,7 @@
import org.zstack.header.vm.*;
import org.zstack.header.vo.ResourceVO;
import org.zstack.header.volume.*;
import org.zstack.storage.primary.PrimaryStorageBase;
import org.zstack.storage.primary.PrimaryStorageCapacityUpdater;
import org.zstack.storage.primary.PrimaryStoragePhysicalCapacityManager;
import org.zstack.storage.primary.*;
import org.zstack.storage.primary.local.APIGetLocalStorageHostDiskCapacityReply.HostDiskCapacity;
import org.zstack.storage.primary.local.MigrateBitsStruct.ResourceInfo;
import org.zstack.storage.volume.VolumeSystemTags;
Expand Down Expand Up @@ -2615,6 +2613,26 @@ public void fail(ErrorCode errorCode) {
});
}

@Override
protected void handle(EstimateVolumeTemplateSizeOnPrimaryStorageMsg msg) {
LocalStorageHypervisorFactory f = getHypervisorBackendFactoryByResourceUuid(msg.getVolumeUuid(), VolumeVO.class.getSimpleName());
LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self);
String huuid = getHostUuidByResourceUuid(msg.getVolumeUuid());
bkd.handle(msg, huuid, new ReturnValueCompletion<EstimateVolumeTemplateSizeOnPrimaryStorageReply>(msg) {
@Override
public void success(EstimateVolumeTemplateSizeOnPrimaryStorageReply returnValue) {
bus.reply(msg, returnValue);
}

@Override
public void fail(ErrorCode errorCode) {
EstimateVolumeTemplateSizeOnPrimaryStorageReply reply = new EstimateVolumeTemplateSizeOnPrimaryStorageReply();
reply.setError(errorCode);
bus.reply(msg, reply);
}
});
}

@Override
protected void handle(BatchSyncVolumeSizeOnPrimaryStorageMsg msg) {
LocalStorageHypervisorFactory f = getHypervisorBackendFactoryByHostUuid(msg.getHostUuid());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import org.zstack.header.volume.BatchSyncVolumeSizeOnPrimaryStorageMsg;
import org.zstack.header.volume.BatchSyncVolumeSizeOnPrimaryStorageReply;
import org.zstack.header.volume.VolumeInventory;
import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageMsg;
import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageReply;

import java.util.List;

Expand Down Expand Up @@ -70,6 +72,8 @@ public LocalStorageHypervisorBackend(PrimaryStorageVO self) {

abstract void handle(SyncVolumeSizeOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion<SyncVolumeSizeOnPrimaryStorageReply> completion);

abstract void handle(EstimateVolumeTemplateSizeOnPrimaryStorageMsg msg, String huuid, ReturnValueCompletion<EstimateVolumeTemplateSizeOnPrimaryStorageReply> completion);

abstract void handle(BatchSyncVolumeSizeOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion<BatchSyncVolumeSizeOnPrimaryStorageReply> completion);

abstract void handle(CreateImageCacheFromVolumeOnPrimaryStorageMsg msg, ReturnValueCompletion<CreateImageCacheFromVolumeOnPrimaryStorageReply> completion);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,7 @@
import org.zstack.header.volume.*;
import org.zstack.identity.AccountManager;
import org.zstack.kvm.*;
import org.zstack.storage.primary.ImageCacheUtil;
import org.zstack.storage.primary.PrimaryStorageGlobalProperty;
import org.zstack.storage.primary.PrimaryStoragePathMaker;
import org.zstack.storage.primary.PrimaryStorageSystemTags;
import org.zstack.storage.primary.*;
import org.zstack.storage.primary.local.LocalStorageKvmMigrateVmFlow.CopyBitsFromRemoteCmd;
import org.zstack.storage.primary.local.MigrateBitsStruct.ResourceInfo;
import org.zstack.storage.volume.VolumeErrors;
Expand Down Expand Up @@ -450,6 +447,39 @@ public void setSize(long size) {
}
}

public static class EstimateTemplateSizeCmd extends AgentCommand {
private String volumePath;

public String getVolumePath() {
return volumePath;
}

public void setVolumePath(String rootVolumePath) {
this.volumePath = rootVolumePath;
}
}

public static class EstimateTemplateSizeRsp extends AgentResponse {
private long size;
private long actualSize;

public long getActualSize() {
return actualSize;
}

public void setActualSize(long actualSize) {
this.actualSize = actualSize;
}

public long getSize() {
return size;
}

public void setSize(long size) {
this.size = size;
}
}

public static class RevertVolumeFromSnapshotCmd extends AgentCommand {
private String snapshotInstallPath;

Expand Down Expand Up @@ -854,6 +884,7 @@ public void setHashValue(String hashValue) {
public static final String CHECK_BITS_PATH = "/localstorage/checkbits";
public static final String UNLINK_BITS_PATH = "/localstorage/unlink";
public static final String CREATE_TEMPLATE_FROM_VOLUME = "/localstorage/volume/createtemplate";
public static final String ESTIMATE_TEMPLATE_SIZE_PATH = "/localstorage/volume/estimatetemplatesize";
public static final String REVERT_SNAPSHOT_PATH = "/localstorage/snapshot/revert";
public static final String REINIT_IMAGE_PATH = "/localstorage/reinit/image";
public static final String MERGE_SNAPSHOT_PATH = "/localstorage/snapshot/merge";
Expand Down Expand Up @@ -2275,10 +2306,7 @@ void handle(SyncVolumeSizeOnPrimaryStorageMsg msg, String hostUuid, final Return
GetVolumeSizeCmd cmd = new GetVolumeSizeCmd();
cmd.installPath = msg.getInstallPath();
cmd.volumeUuid = msg.getVolumeUuid();
cmd.storagePath = Q.New(PrimaryStorageVO.class)
.eq(PrimaryStorageVO_.uuid, msg.getPrimaryStorageUuid())
.select(PrimaryStorageVO_.url)
.findValue();
cmd.storagePath = self.getUrl();

KvmCommandSender sender = new KvmCommandSender(hostUuid);
sender.send(cmd, GET_VOLUME_SIZE, new KvmCommandFailureChecker() {
Expand All @@ -2303,6 +2331,27 @@ public void fail(ErrorCode errorCode) {
});
}

@Override
void handle(EstimateVolumeTemplateSizeOnPrimaryStorageMsg msg, String huuid, ReturnValueCompletion<EstimateVolumeTemplateSizeOnPrimaryStorageReply> completion) {
final EstimateVolumeTemplateSizeOnPrimaryStorageReply reply = new EstimateVolumeTemplateSizeOnPrimaryStorageReply();
EstimateTemplateSizeCmd cmd = new EstimateTemplateSizeCmd();
cmd.volumePath = msg.getInstallPath();

httpCall(ESTIMATE_TEMPLATE_SIZE_PATH, huuid, cmd, EstimateTemplateSizeRsp.class, new ReturnValueCompletion<EstimateTemplateSizeRsp>(completion) {
@Override
public void success(EstimateTemplateSizeRsp rsp) {
reply.setSize(rsp.size);
reply.setActualSize(rsp.actualSize);
completion.success(reply);
}

@Override
public void fail(ErrorCode errorCode) {
completion.fail(errorCode);
}
});
}

@Override
void handle(BatchSyncVolumeSizeOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion<BatchSyncVolumeSizeOnPrimaryStorageReply> completion) {
final BatchSyncVolumeSizeOnPrimaryStorageReply reply = new BatchSyncVolumeSizeOnPrimaryStorageReply();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,7 @@
import org.zstack.header.vm.VmInstanceVO_;
import org.zstack.header.volume.*;
import org.zstack.kvm.KVMConstant;
import org.zstack.storage.primary.PrimaryStorageBase;
import org.zstack.storage.primary.PrimaryStorageCapacityUpdater;
import org.zstack.storage.primary.PrimaryStorageGlobalProperty;
import org.zstack.storage.primary.*;
import org.zstack.storage.volume.VolumeErrors;
import org.zstack.storage.volume.VolumeSystemTags;
import org.zstack.tag.SystemTagCreator;
Expand Down Expand Up @@ -1367,6 +1365,30 @@ public void fail(ErrorCode errorCode) {
});
}

@Override
protected void handle(EstimateVolumeTemplateSizeOnPrimaryStorageMsg msg) {
NfsPrimaryStorageBackend backend = getUsableBackend();
if (backend == null) {
throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation",
self.getUuid(), self.getName()));
}

backend.handle(getSelfInventory(), msg, new ReturnValueCompletion<EstimateVolumeTemplateSizeOnPrimaryStorageReply>(msg) {
@Override
public void success(EstimateVolumeTemplateSizeOnPrimaryStorageReply reply) {
saveVolumeProvisioningStrategy(msg.getVolumeUuid(), reply.getActualSize() < reply.getSize() ? VolumeProvisioningStrategy.ThinProvisioning : VolumeProvisioningStrategy.ThickProvisioning);
bus.reply(msg, reply);
}

@Override
public void fail(ErrorCode errorCode) {
EstimateVolumeTemplateSizeOnPrimaryStorageReply reply = new EstimateVolumeTemplateSizeOnPrimaryStorageReply();
reply.setError(errorCode);
bus.reply(msg, reply);
}
});
}

@Override
protected void handle(BatchSyncVolumeSizeOnPrimaryStorageMsg msg) {
NfsPrimaryStorageBackend backend = getBackendByHostUuid(msg.getHostUuid());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import org.zstack.header.volume.BatchSyncVolumeSizeOnPrimaryStorageMsg;
import org.zstack.header.volume.BatchSyncVolumeSizeOnPrimaryStorageReply;
import org.zstack.header.volume.VolumeInventory;
import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageMsg;
import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageReply;
import org.zstack.storage.primary.PrimaryStorageBase.PhysicalCapacityUsage;

public interface NfsPrimaryStorageBackend {
Expand All @@ -26,6 +28,8 @@ public interface NfsPrimaryStorageBackend {

void handle(PrimaryStorageInventory inv, SyncVolumeSizeOnPrimaryStorageMsg msg, ReturnValueCompletion<SyncVolumeSizeOnPrimaryStorageReply> completion);

void handle(PrimaryStorageInventory inv, EstimateVolumeTemplateSizeOnPrimaryStorageMsg msg, ReturnValueCompletion<EstimateVolumeTemplateSizeOnPrimaryStorageReply> completion);

void handle(PrimaryStorageInventory inv, BatchSyncVolumeSizeOnPrimaryStorageMsg msg, ReturnValueCompletion<BatchSyncVolumeSizeOnPrimaryStorageReply> completion);

void handle(PrimaryStorageInventory inv, GetVolumeRootImageUuidFromPrimaryStorageMsg msg, ReturnValueCompletion<GetVolumeRootImageUuidFromPrimaryStorageReply> completion);
Expand Down
Loading

0 comments on commit b0dc864

Please sign in to comment.