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})
}