This is an automated email from the ASF dual-hosted git repository. hulk pushed a commit to branch unstable in repository https://gitbox.apache.org/repos/asf/kvrocks-controller.git
The following commit(s) were added to refs/heads/unstable by this push: new 4899f99 Validate the preferred node id format in failover API (#323) 4899f99 is described below commit 4899f99d613d043c5a8b010956ea78463dce7beb Author: hulk <hulk.webs...@gmail.com> AuthorDate: Mon Jul 7 23:55:20 2025 +0800 Validate the preferred node id format in failover API (#323) Currently, it will still promote a new master even through the preferred node is in invalid format, and it might cause confusing since the new master is not what users expected. --- server/api/shard.go | 16 ++++++---------- server/api/shard_test.go | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/server/api/shard.go b/server/api/shard.go index 6af2fdf..2706146 100644 --- a/server/api/shard.go +++ b/server/api/shard.go @@ -20,9 +20,8 @@ package api import ( - "encoding/json" "errors" - "io" + "fmt" "strconv" "github.com/gin-gonic/gin" @@ -123,17 +122,14 @@ func (handler *ShardHandler) Failover(c *gin.Context) { PreferredNodeID string `json:"preferred_node_id"` } if c.Request.Body != nil { - body, err := io.ReadAll(c.Request.Body) - if err != nil { + if err := c.ShouldBindJSON(&req); err != nil { helper.ResponseBadRequest(c, err) return } - if len(body) > 0 { - if err := json.Unmarshal(body, &req); err != nil { - helper.ResponseBadRequest(c, err) - return - } - } + } + if len(req.PreferredNodeID) > 0 && len(req.PreferredNodeID) != store.NodeIDLen { + helper.ResponseBadRequest(c, fmt.Errorf("invalid node id: %s", req.PreferredNodeID)) + return } // We have checked this if statement in middleware.RequiredClusterShard shardIndex, _ := strconv.Atoi(c.Param("shard")) diff --git a/server/api/shard_test.go b/server/api/shard_test.go index 967400f..39d9f91 100644 --- a/server/api/shard_test.go +++ b/server/api/shard_test.go @@ -220,4 +220,18 @@ func TestClusterFailover(t *testing.T) { require.NoError(t, err) require.EqualValues(t, "master", clusterNodeInfo1.Role) }) + + t.Run("failover with invalid node id", func(t *testing.T) { + recorder := httptest.NewRecorder() + ctx := GetTestContext(recorder) + ctx.Set(consts.ContextKeyStore, handler.s) + ctx.Params = []gin.Param{ + {Key: "namespace", Value: ns}, + {Key: "cluster", Value: clusterName}, + {Key: "shard", Value: "0"}, + } + ctx.Request.Body = io.NopCloser(bytes.NewBufferString(`{"preferred_node_id": "1234567890"}`)) + middleware.RequiredClusterShard(ctx) + require.Equal(t, http.StatusOK, recorder.Code) + }) }