github.com/hdt3213/godis@v1.2.9/cluster/del.go (about)

     1  package cluster
     2  
     3  import (
     4  	"github.com/hdt3213/godis/interface/redis"
     5  	"github.com/hdt3213/godis/redis/protocol"
     6  	"strconv"
     7  )
     8  
     9  // Del atomically removes given writeKeys from cluster, writeKeys can be distributed on any node
    10  // if the given writeKeys are distributed on different node, Del will use try-commit-catch to remove them
    11  func Del(cluster *Cluster, c redis.Connection, args [][]byte) redis.Reply {
    12  	if len(args) < 2 {
    13  		return protocol.MakeErrReply("ERR wrong number of arguments for 'del' command")
    14  	}
    15  	keys := make([]string, len(args)-1)
    16  	for i := 1; i < len(args); i++ {
    17  		keys[i-1] = string(args[i])
    18  	}
    19  	groupMap := cluster.groupBy(keys)
    20  	if len(groupMap) == 1 && allowFastTransaction { // do fast
    21  		for peer, group := range groupMap { // only one peerKeys
    22  			return cluster.relay(peer, c, makeArgs("DEL", group...))
    23  		}
    24  	}
    25  	// prepare
    26  	var errReply redis.Reply
    27  	txID := cluster.idGenerator.NextID()
    28  	txIDStr := strconv.FormatInt(txID, 10)
    29  	rollback := false
    30  	for peer, peerKeys := range groupMap {
    31  		peerArgs := []string{txIDStr, "DEL"}
    32  		peerArgs = append(peerArgs, peerKeys...)
    33  		var resp redis.Reply
    34  		if peer == cluster.self {
    35  			resp = execPrepare(cluster, c, makeArgs("Prepare", peerArgs...))
    36  		} else {
    37  			resp = cluster.relay(peer, c, makeArgs("Prepare", peerArgs...))
    38  		}
    39  		if protocol.IsErrorReply(resp) {
    40  			errReply = resp
    41  			rollback = true
    42  			break
    43  		}
    44  	}
    45  	var respList []redis.Reply
    46  	if rollback {
    47  		// rollback
    48  		requestRollback(cluster, c, txID, groupMap)
    49  	} else {
    50  		// commit
    51  		respList, errReply = requestCommit(cluster, c, txID, groupMap)
    52  		if errReply != nil {
    53  			rollback = true
    54  		}
    55  	}
    56  	if !rollback {
    57  		var deleted int64 = 0
    58  		for _, resp := range respList {
    59  			intResp := resp.(*protocol.IntReply)
    60  			deleted += intResp.Code
    61  		}
    62  		return protocol.MakeIntReply(int64(deleted))
    63  	}
    64  	return errReply
    65  }