| 115 | } |
| 116 | |
| 117 | func (handler *ShardHandler) Failover(c *gin.Context) { |
| 118 | ns := c.Param("namespace") |
| 119 | cluster, _ := c.MustGet(consts.ContextKeyCluster).(*store.Cluster) |
| 120 | |
| 121 | var req struct { |
| 122 | PreferredNodeID string `json:"preferred_node_id"` |
| 123 | } |
| 124 | if c.Request.Body != nil { |
| 125 | if err := c.ShouldBindJSON(&req); err != nil { |
| 126 | helper.ResponseBadRequest(c, err) |
| 127 | return |
| 128 | } |
| 129 | } |
| 130 | if len(req.PreferredNodeID) > 0 && len(req.PreferredNodeID) != store.NodeIDLen { |
| 131 | helper.ResponseBadRequest(c, fmt.Errorf("invalid node id: %s", req.PreferredNodeID)) |
| 132 | return |
| 133 | } |
| 134 | // We have checked this if statement in middleware.RequiredClusterShard |
| 135 | shardIndex, _ := strconv.Atoi(c.Param("shard")) |
| 136 | newMasterNodeID, err := cluster.PromoteNewMaster(c, shardIndex, "", req.PreferredNodeID) |
| 137 | if err != nil { |
| 138 | helper.ResponseError(c, err) |
| 139 | return |
| 140 | } |
| 141 | if err := handler.s.UpdateCluster(c, ns, cluster); err != nil { |
| 142 | helper.ResponseError(c, err) |
| 143 | return |
| 144 | } |
| 145 | helper.ResponseOK(c, gin.H{"new_master_id": newMasterNodeID}) |
| 146 | } |