This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 712ac5ad29f [feat](snapshot) cannot drop instance if has snapshots; 
drop instance should remove snapshot_reference_key (#58111)
712ac5ad29f is described below

commit 712ac5ad29ff2caf875d4d890caa18cec28402d2
Author: meiyi <[email protected]>
AuthorDate: Thu Nov 20 04:06:50 2025 +0800

    [feat](snapshot) cannot drop instance if has snapshots; drop instance 
should remove snapshot_reference_key (#58111)
---
 cloud/src/meta-service/meta_service.h            |  3 +-
 cloud/src/meta-service/meta_service_resource.cpp | 97 +++++++++++++++++-------
 2 files changed, 70 insertions(+), 30 deletions(-)

diff --git a/cloud/src/meta-service/meta_service.h 
b/cloud/src/meta-service/meta_service.h
index bef3dd75580..37bca4c15aa 100644
--- a/cloud/src/meta-service/meta_service.h
+++ b/cloud/src/meta-service/meta_service.h
@@ -398,7 +398,8 @@ public:
 private:
     std::pair<MetaServiceCode, std::string> alter_instance(
             const AlterInstanceRequest* request,
-            std::function<std::pair<MetaServiceCode, 
std::string>(InstanceInfoPB*)> action);
+            std::function<std::pair<MetaServiceCode, 
std::string>(Transaction*, InstanceInfoPB*)>
+                    action);
 
     bool get_mow_tablet_stats_and_meta(MetaServiceCode& code, std::string& msg,
                                        const GetDeleteBitmapUpdateLockRequest* 
request,
diff --git a/cloud/src/meta-service/meta_service_resource.cpp 
b/cloud/src/meta-service/meta_service_resource.cpp
index 634d0315683..a2ae32e372b 100644
--- a/cloud/src/meta-service/meta_service_resource.cpp
+++ b/cloud/src/meta-service/meta_service_resource.cpp
@@ -42,6 +42,7 @@
 #include "meta-service/meta_service.h"
 #include "meta-service/meta_service_helper.h"
 #include "meta-store/keys.h"
+#include "meta-store/meta_reader.h"
 #include "meta-store/txn_kv.h"
 #include "meta-store/txn_kv_error.h"
 
@@ -2173,32 +2174,68 @@ void 
MetaServiceImpl::alter_instance(google::protobuf::RpcController* controller
     std::pair<MetaServiceCode, std::string> ret;
     switch (request->op()) {
     case AlterInstanceRequest::DROP: {
-        ret = alter_instance(request, [&request](InstanceInfoPB* instance) {
-            std::string msg;
-            // check instance doesn't have any cluster.
-            if (instance->clusters_size() != 0) {
-                msg = "failed to drop instance, instance has clusters";
-                LOG(WARNING) << msg;
-                return std::make_pair(MetaServiceCode::INVALID_ARGUMENT, msg);
-            }
+        ret = alter_instance(
+                request, [&request, &instance_id](Transaction* txn, 
InstanceInfoPB* instance) {
+                    std::string msg;
+                    // check instance doesn't have any cluster.
+                    if (instance->clusters_size() != 0) {
+                        msg = "failed to drop instance, instance has clusters";
+                        LOG(WARNING) << msg;
+                        return 
std::make_pair(MetaServiceCode::INVALID_ARGUMENT, msg);
+                    }
 
-            instance->set_status(InstanceInfoPB::DELETED);
-            instance->set_mtime(
-                    
duration_cast<seconds>(system_clock::now().time_since_epoch()).count());
+                    // check instance doesn't have any snapshot.
+                    MetaReader meta_reader(instance_id);
+                    std::vector<std::pair<SnapshotPB, Versionstamp>> snapshots;
+                    TxnErrorCode err = meta_reader.get_snapshots(txn, 
&snapshots);
+                    if (err != TxnErrorCode::TXN_OK) {
+                        msg = "failed to get snapshots";
+                        LOG(WARNING) << msg << " err=" << err;
+                        return std::make_pair(cast_as<ErrCategory::READ>(err), 
msg);
+                    }
+                    for (auto& [snapshot, _] : snapshots) {
+                        if (snapshot.status() != 
SnapshotStatus::SNAPSHOT_RECYCLED) {
+                            // still has snapshots, cannot drop
+                            msg = "failed to drop instance, instance has 
snapshots";
+                            LOG(WARNING) << msg;
+                            return 
std::make_pair(MetaServiceCode::INVALID_ARGUMENT, msg);
+                        }
+                    }
 
-            std::string ret = instance->SerializeAsString();
-            if (ret.empty()) {
-                msg = "failed to serialize";
-                LOG(ERROR) << msg;
-                return std::make_pair(MetaServiceCode::PROTOBUF_SERIALIZE_ERR, 
msg);
-            }
-            LOG(INFO) << "put instance_id=" << request->instance_id()
-                      << "drop instance json=" << proto_to_json(*instance);
-            return std::make_pair(MetaServiceCode::OK, ret);
-        });
+                    instance->set_status(InstanceInfoPB::DELETED);
+                    instance->set_mtime(
+                            
duration_cast<seconds>(system_clock::now().time_since_epoch()).count());
+
+                    std::string ret = instance->SerializeAsString();
+                    if (ret.empty()) {
+                        msg = "failed to serialize";
+                        LOG(ERROR) << msg;
+                        return 
std::make_pair(MetaServiceCode::PROTOBUF_SERIALIZE_ERR, msg);
+                    }
+                    LOG(INFO) << "put instance_id=" << request->instance_id()
+                              << "drop instance json=" << 
proto_to_json(*instance);
+
+                    if (instance->has_source_instance_id() && 
instance->has_source_snapshot_id() &&
+                        !instance->source_instance_id().empty() &&
+                        !instance->source_snapshot_id().empty()) {
+                        Versionstamp snapshot_versionstamp;
+                        if (!SnapshotManager::parse_snapshot_versionstamp(
+                                    instance->source_snapshot_id(), 
&snapshot_versionstamp)) {
+                            msg = "failed to parse snapshot_id to 
versionstamp, snapshot_id=" +
+                                  instance->source_snapshot_id();
+                            LOG(WARNING) << msg;
+                            return 
std::make_pair(MetaServiceCode::INVALID_ARGUMENT, msg);
+                        }
+                        versioned::SnapshotReferenceKeyInfo ref_key_info {
+                                instance->source_instance_id(), 
snapshot_versionstamp, instance_id};
+                        std::string reference_key = 
versioned::snapshot_reference_key(ref_key_info);
+                        txn->remove(reference_key);
+                    }
+                    return std::make_pair(MetaServiceCode::OK, ret);
+                });
     } break;
     case AlterInstanceRequest::RENAME: {
-        ret = alter_instance(request, [&request](InstanceInfoPB* instance) {
+        ret = alter_instance(request, [&request](Transaction* txn, 
InstanceInfoPB* instance) {
             std::string msg;
             std::string name = request->has_name() ? request->name() : "";
             if (name.empty()) {
@@ -2220,7 +2257,7 @@ void 
MetaServiceImpl::alter_instance(google::protobuf::RpcController* controller
         });
     } break;
     case AlterInstanceRequest::ENABLE_SSE: {
-        ret = alter_instance(request, [&request](InstanceInfoPB* instance) {
+        ret = alter_instance(request, [&request](Transaction* txn, 
InstanceInfoPB* instance) {
             std::string msg;
             if (instance->sse_enabled()) {
                 msg = "failed to enable sse, instance has enabled sse";
@@ -2246,7 +2283,7 @@ void 
MetaServiceImpl::alter_instance(google::protobuf::RpcController* controller
         });
     } break;
     case AlterInstanceRequest::DISABLE_SSE: {
-        ret = alter_instance(request, [&request](InstanceInfoPB* instance) {
+        ret = alter_instance(request, [&request](Transaction* txn, 
InstanceInfoPB* instance) {
             std::string msg;
             if (!instance->sse_enabled()) {
                 msg = "failed to disable sse, instance has disabled sse";
@@ -2275,7 +2312,7 @@ void 
MetaServiceImpl::alter_instance(google::protobuf::RpcController* controller
         ret = resource_mgr_->refresh_instance(request->instance_id());
     } break;
     case AlterInstanceRequest::SET_OVERDUE: {
-        ret = alter_instance(request, [&request](InstanceInfoPB* instance) {
+        ret = alter_instance(request, [&request](Transaction* txn, 
InstanceInfoPB* instance) {
             std::string msg;
 
             if (instance->status() == InstanceInfoPB::DELETED) {
@@ -2306,7 +2343,7 @@ void 
MetaServiceImpl::alter_instance(google::protobuf::RpcController* controller
         });
     } break;
     case AlterInstanceRequest::SET_NORMAL: {
-        ret = alter_instance(request, [&request](InstanceInfoPB* instance) {
+        ret = alter_instance(request, [&request](Transaction* txn, 
InstanceInfoPB* instance) {
             std::string msg;
 
             if (instance->status() == InstanceInfoPB::DELETED) {
@@ -2352,7 +2389,8 @@ void 
MetaServiceImpl::alter_instance(google::protobuf::RpcController* controller
      * the provided values conform to the expected format and constraints.
      */
     case AlterInstanceRequest::SET_SNAPSHOT_PROPERTY: {
-        ret = alter_instance(request, [&request, &instance_id](InstanceInfoPB* 
instance) {
+        ret = alter_instance(request, [&request, &instance_id](Transaction* 
txn,
+                                                               InstanceInfoPB* 
instance) {
             std::string msg;
             auto properties = request->properties();
             if (properties.empty()) {
@@ -2471,7 +2509,8 @@ void 
MetaServiceImpl::get_instance(google::protobuf::RpcController* controller,
 
 std::pair<MetaServiceCode, std::string> MetaServiceImpl::alter_instance(
         const cloud::AlterInstanceRequest* request,
-        std::function<std::pair<MetaServiceCode, 
std::string>(InstanceInfoPB*)> action) {
+        std::function<std::pair<MetaServiceCode, std::string>(Transaction*, 
InstanceInfoPB*)>
+                action) {
     MetaServiceCode code = MetaServiceCode::OK;
     std::string msg = "OK";
     std::string instance_id = request->has_instance_id() ? 
request->instance_id() : "";
@@ -2515,7 +2554,7 @@ std::pair<MetaServiceCode, std::string> 
MetaServiceImpl::alter_instance(
         LOG(WARNING) << msg;
         return std::make_pair(code, msg);
     }
-    auto r = action(&instance);
+    auto r = action(txn.get(), &instance);
     if (r.first != MetaServiceCode::OK) {
         return r;
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to