forked from tikv/pd
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This is an automated cherry-pick of tikv#7054
close tikv#7053 Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
- Loading branch information
1 parent
41f8422
commit 8b1e141
Showing
5 changed files
with
707 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
// Copyright 2022 TiKV Project Authors. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
package api | ||
|
||
import ( | ||
"net/http" | ||
"strconv" | ||
"strings" | ||
|
||
"github.com/gorilla/mux" | ||
"github.com/tikv/pd/pkg/utils/typeutil" | ||
"github.com/tikv/pd/server" | ||
"github.com/unrolled/render" | ||
) | ||
|
||
type minResolvedTSHandler struct { | ||
svr *server.Server | ||
rd *render.Render | ||
} | ||
|
||
func newMinResolvedTSHandler(svr *server.Server, rd *render.Render) *minResolvedTSHandler { | ||
return &minResolvedTSHandler{ | ||
svr: svr, | ||
rd: rd, | ||
} | ||
} | ||
|
||
// NOTE: This type is exported by HTTP API. Please pay more attention when modifying it. | ||
type minResolvedTS struct { | ||
IsRealTime bool `json:"is_real_time,omitempty"` | ||
MinResolvedTS uint64 `json:"min_resolved_ts"` | ||
PersistInterval typeutil.Duration `json:"persist_interval,omitempty"` | ||
StoresMinResolvedTS map[uint64]uint64 `json:"stores_min_resolved_ts"` | ||
} | ||
|
||
// @Tags min_store_resolved_ts | ||
// @Summary Get store-level min resolved ts. | ||
// @Produce json | ||
// @Success 200 {array} minResolvedTS | ||
// @Failure 400 {string} string "The input is invalid." | ||
// @Failure 500 {string} string "PD server failed to proceed the request." | ||
// @Router /min-resolved-ts/{store_id} [get] | ||
func (h *minResolvedTSHandler) GetStoreMinResolvedTS(w http.ResponseWriter, r *http.Request) { | ||
c := getCluster(r) | ||
idStr := mux.Vars(r)["store_id"] | ||
storeID, err := strconv.ParseUint(idStr, 10, 64) | ||
if err != nil { | ||
h.rd.JSON(w, http.StatusBadRequest, err.Error()) | ||
return | ||
} | ||
value := c.GetStoreMinResolvedTS(storeID) | ||
persistInterval := c.GetPDServerConfig().MinResolvedTSPersistenceInterval | ||
h.rd.JSON(w, http.StatusOK, minResolvedTS{ | ||
MinResolvedTS: value, | ||
PersistInterval: persistInterval, | ||
IsRealTime: persistInterval.Duration != 0, | ||
}) | ||
} | ||
|
||
// @Tags min_resolved_ts | ||
// @Summary Get cluster-level min resolved ts and optionally store-level min resolved ts. | ||
// @Description Optionally, we support a query parameter `scope` | ||
// to get store-level min resolved ts by specifying a list of store IDs. | ||
// - When no scope is given, cluster-level's min_resolved_ts will be returned and storesMinResolvedTS will be nil. | ||
// - When scope is `cluster`, cluster-level's min_resolved_ts will be returned and storesMinResolvedTS will be filled. | ||
// - When scope given a list of stores, min_resolved_ts will be provided for each store | ||
// and the scope-specific min_resolved_ts will be returned. | ||
// | ||
// @Produce json | ||
// @Param scope query string false "Scope of the min resolved ts: comma-separated list of store IDs (e.g., '1,2,3')." default(cluster) | ||
// @Success 200 {array} minResolvedTS | ||
// @Failure 500 {string} string "PD server failed to proceed the request." | ||
// @Router /min-resolved-ts [get] | ||
func (h *minResolvedTSHandler) GetMinResolvedTS(w http.ResponseWriter, r *http.Request) { | ||
c := getCluster(r) | ||
scopeMinResolvedTS := c.GetMinResolvedTS() | ||
persistInterval := c.GetPDServerConfig().MinResolvedTSPersistenceInterval | ||
|
||
var storesMinResolvedTS map[uint64]uint64 | ||
if scopeStr := r.URL.Query().Get("scope"); len(scopeStr) > 0 { | ||
// scope is an optional parameter, it can be `cluster` or specified store IDs. | ||
// - When no scope is given, cluster-level's min_resolved_ts will be returned and storesMinResolvedTS will be nil. | ||
// - When scope is `cluster`, cluster-level's min_resolved_ts will be returned and storesMinResolvedTS will be filled. | ||
// - When scope given a list of stores, min_resolved_ts will be provided for each store | ||
// and the scope-specific min_resolved_ts will be returned. | ||
if scopeStr == "cluster" { | ||
stores := c.GetMetaStores() | ||
ids := make([]uint64, len(stores)) | ||
for i, store := range stores { | ||
ids[i] = store.GetId() | ||
} | ||
// use cluster-level min_resolved_ts as the scope-specific min_resolved_ts. | ||
_, storesMinResolvedTS = c.GetMinResolvedTSByStoreIDs(ids) | ||
} else { | ||
scopeIDs := strings.Split(scopeStr, ",") | ||
ids := make([]uint64, len(scopeIDs)) | ||
for i, idStr := range scopeIDs { | ||
id, err := strconv.ParseUint(idStr, 10, 64) | ||
if err != nil { | ||
h.rd.JSON(w, http.StatusBadRequest, err.Error()) | ||
return | ||
} | ||
ids[i] = id | ||
} | ||
scopeMinResolvedTS, storesMinResolvedTS = c.GetMinResolvedTSByStoreIDs(ids) | ||
} | ||
} | ||
|
||
h.rd.JSON(w, http.StatusOK, minResolvedTS{ | ||
MinResolvedTS: scopeMinResolvedTS, | ||
PersistInterval: persistInterval, | ||
IsRealTime: persistInterval.Duration != 0, | ||
StoresMinResolvedTS: storesMinResolvedTS, | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.