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 }