func()

in server/api/shard.go [118:150]


func (handler *ShardHandler) Failover(c *gin.Context) {
	ns := c.Param("namespace")
	cluster, _ := c.MustGet(consts.ContextKeyCluster).(*store.Cluster)

	var req struct {
		PreferredNodeID string `json:"preferred_node_id"`
	}
	if c.Request.Body != nil {
		body, err := io.ReadAll(c.Request.Body)
		if err != nil {
			helper.ResponseBadRequest(c, err)
			return
		}
		if len(body) > 0 {
			if err := json.Unmarshal(body, &req); err != nil {
				helper.ResponseBadRequest(c, err)
				return
			}
		}
	}
	// We have checked this if statement in middleware.RequiredClusterShard
	shardIndex, _ := strconv.Atoi(c.Param("shard"))
	newMasterNodeID, err := cluster.PromoteNewMaster(c, shardIndex, "", req.PreferredNodeID)
	if err != nil {
		helper.ResponseError(c, err)
		return
	}
	if err := handler.s.UpdateCluster(c, ns, cluster); err != nil {
		helper.ResponseError(c, err)
		return
	}
	helper.ResponseOK(c, gin.H{"new_master_id": newMasterNodeID})
}