in server/datasource/etcd/kv/kv_dao.go [273:308]
func txnFindOneAndDelete(ctx context.Context, kvID, project, domain string) (*model.KVDoc, error) {
kvKey := key.KV(domain, project, kvID)
kvDoc, err := getKVDoc(ctx, domain, project, kvID)
if err != nil {
openlog.Error(err.Error())
return nil, err
}
task, err := sync.NewTask(domain, project, sync.DeleteAction, datasource.ConfigResource, kvDoc)
if err != nil {
openlog.Error("fail to create task" + err.Error())
return nil, err
}
taskBytes, err := json.Marshal(task)
if err != nil {
openlog.Error("fail to marshal task" + err.Error())
return nil, err
}
tombstone := sync.NewTombstone(domain, project, datasource.ConfigResource, datasource.TombstoneID(kvDoc))
tombstoneBytes, err := json.Marshal(tombstone)
if err != nil {
openlog.Error("fail to marshal tombstone" + err.Error())
return nil, err
}
kvOpDel := etcdadpt.OpDel(etcdadpt.WithStrKey(kvKey))
taskOpPut := etcdadpt.OpPut(etcdadpt.WithStrKey(key.TaskKey(domain, project,
task.ID, task.Timestamp)), etcdadpt.WithValue(taskBytes))
tombstoneOpPut := etcdadpt.OpPut(etcdadpt.WithStrKey(key.TombstoneKey(domain, project, tombstone.ResourceType, tombstone.ResourceID)), etcdadpt.WithValue(tombstoneBytes))
err = etcdadpt.Txn(ctx, []etcdadpt.OpOptions{kvOpDel, taskOpPut, tombstoneOpPut})
if err != nil {
openlog.Error("find and delete error", openlog.WithTags(openlog.Tags{
"err": err.Error(),
}))
return nil, err
}
return kvDoc, nil
}