Skip to content

Commit 99aa4df

Browse files
committed
storeliveness: add LastSupportWithdrawnTime to InspectZ output
Following up on the previous commit, we make the LastSupportWithdrawnTime observable via inspectz and the crdb_internal schema. Most of this commit is splitting out the SupportFor and SupportFrom inspectz codepaths, as they can no longer use the same underlying slpb.SupportState. Informs #158513 Release note: None
1 parent a0010f2 commit 99aa4df

File tree

9 files changed

+137
-65
lines changed

9 files changed

+137
-65
lines changed

pkg/inspectz/inspectz.go

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,11 @@ func NewServer(
5959
mux.Handle("/inspectz/v2/kvflowcontroller", server.makeKVFlowControllerHandler(server.KVFlowControllerV2))
6060
mux.Handle(
6161
"/inspectz/storeliveness/supportFrom",
62-
server.makeStoreLivenessHandler(server.StoreLivenessSupportFrom),
62+
server.makeStoreLivenessSupportFromHandler(server.StoreLivenessSupportFrom),
6363
)
6464
mux.Handle(
6565
"/inspectz/storeliveness/supportFor",
66-
server.makeStoreLivenessHandler(server.StoreLivenessSupportFor),
66+
server.makeStoreLivenessSupportForHandler(server.StoreLivenessSupportFor),
6767
)
6868

6969
return server
@@ -112,9 +112,27 @@ func (s *Server) makeKVFlowControllerHandler(
112112
}
113113
}
114114

115-
func (s *Server) makeStoreLivenessHandler(
115+
func (s *Server) makeStoreLivenessSupportFromHandler(
116116
impl func(ctx context.Context, request *slpb.InspectStoreLivenessRequest) (
117-
*slpb.InspectStoreLivenessResponse, error,
117+
*slpb.InspectSupportFromResponse, error,
118+
),
119+
) http.HandlerFunc {
120+
return func(w http.ResponseWriter, r *http.Request) {
121+
ctx := s.AnnotateCtx(context.Background())
122+
req := &slpb.InspectStoreLivenessRequest{}
123+
resp, err := impl(ctx, req)
124+
if err != nil {
125+
log.Dev.ErrorfDepth(ctx, 1, "%s", err)
126+
http.Error(w, "internal error: check logs for details", http.StatusInternalServerError)
127+
return
128+
}
129+
respond(ctx, w, http.StatusOK, resp)
130+
}
131+
}
132+
133+
func (s *Server) makeStoreLivenessSupportForHandler(
134+
impl func(ctx context.Context, request *slpb.InspectStoreLivenessRequest) (
135+
*slpb.InspectSupportForResponse, error,
118136
),
119137
) http.HandlerFunc {
120138
return func(w http.ResponseWriter, r *http.Request) {
@@ -147,20 +165,20 @@ func (s *Server) KVFlowHandlesV2(
147165
// StoreLivenessSupportFrom implements the InspectzServer interface.
148166
func (s *Server) StoreLivenessSupportFrom(
149167
_ context.Context, _ *slpb.InspectStoreLivenessRequest,
150-
) (*slpb.InspectStoreLivenessResponse, error) {
151-
resp := &slpb.InspectStoreLivenessResponse{}
168+
) (*slpb.InspectSupportFromResponse, error) {
169+
resp := &slpb.InspectSupportFromResponse{}
152170
support, err := s.storeLiveness.InspectAllSupportFrom()
153-
resp.SupportStatesPerStore = support
171+
resp.SupportFromStatesPerStore = support
154172
return resp, err
155173
}
156174

157175
// StoreLivenessSupportFor implements the InspectzServer interface.
158176
func (s *Server) StoreLivenessSupportFor(
159177
_ context.Context, _ *slpb.InspectStoreLivenessRequest,
160-
) (*slpb.InspectStoreLivenessResponse, error) {
161-
resp := &slpb.InspectStoreLivenessResponse{}
178+
) (*slpb.InspectSupportForResponse, error) {
179+
resp := &slpb.InspectSupportForResponse{}
162180
support, err := s.storeLiveness.InspectAllSupportFor()
163-
resp.SupportStatesPerStore = support
181+
resp.SupportForStatesPerStore = support
164182
return resp, err
165183
}
166184

pkg/inspectz/inspectzpb/inspectz.proto

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ service Inspectz {
3232
// storeliveness.SupportManagers' views of support provided from other stores.
3333
// It's housed under /inspectz/storeliveness/supportFrom.
3434
rpc StoreLivenessSupportFrom(kv.kvserver.storeliveness.storelivenesspb.InspectStoreLivenessRequest)
35-
returns (kv.kvserver.storeliveness.storelivenesspb.InspectStoreLivenessResponse) {}
35+
returns (kv.kvserver.storeliveness.storelivenesspb.InspectSupportFromResponse) {}
3636

3737
// StoreLivenessSupportFor exposes the in-memory state of all stores'
3838
// storeliveness.SupportManagers' views of support provided for other stores.
3939
// It's housed under /inspectz/storeliveness/supportFor.
4040
rpc StoreLivenessSupportFor(kv.kvserver.storeliveness.storelivenesspb.InspectStoreLivenessRequest)
41-
returns (kv.kvserver.storeliveness.storelivenesspb.InspectStoreLivenessResponse) {}
41+
returns (kv.kvserver.storeliveness.storelivenesspb.InspectSupportForResponse) {}
4242

4343
}
4444

pkg/inspectz/unsupported.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ func (u Unsupported) KVFlowHandlesV2(
5151
// StoreLivenessSupportFrom is part of the inspectzpb.InspectzServer interface.
5252
func (u Unsupported) StoreLivenessSupportFrom(
5353
_ context.Context, _ *slpb.InspectStoreLivenessRequest,
54-
) (*slpb.InspectStoreLivenessResponse, error) {
54+
) (*slpb.InspectSupportFromResponse, error) {
5555
return nil, errorutil.UnsupportedUnderClusterVirtualization(errorutil.FeatureNotAvailableToNonSystemTenantsIssue)
5656
}
5757

5858
// StoreLivenessSupportFor is part of the inspectzpb.InspectzServer interface.
5959
func (u Unsupported) StoreLivenessSupportFor(
6060
_ context.Context, _ *slpb.InspectStoreLivenessRequest,
61-
) (*slpb.InspectStoreLivenessResponse, error) {
61+
) (*slpb.InspectSupportForResponse, error) {
6262
return nil, errorutil.UnsupportedUnderClusterVirtualization(errorutil.FeatureNotAvailableToNonSystemTenantsIssue)
6363
}

pkg/kv/kvserver/storeliveness/fabric.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,6 @@ type Fabric interface {
7373
// InspectFabric is an interface that exposes all in-memory support state for a
7474
// given store. It is used to power the Store Liveness /inspectz functionality.
7575
type InspectFabric interface {
76-
InspectSupportFrom() slpb.SupportStatesPerStore
77-
InspectSupportFor() slpb.SupportStatesPerStore
76+
InspectSupportFrom() slpb.InspectSupportFromStatesPerStore
77+
InspectSupportFor() slpb.InspectSupportForStatesPerStore
7878
}

pkg/kv/kvserver/storeliveness/storelivenesspb/service.proto

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -155,19 +155,42 @@ message SupportState {
155155
util.hlc.Timestamp expiration = 3 [(gogoproto.nullable) = false];
156156
}
157157

158+
// InspectSupportForState is used for observability via inspectz. It wraps
159+
// SupportState and includes additional non-persisted metadata like
160+
// LastSupportWithdrawnTime.
161+
message InspectSupportForState {
162+
SupportState support_state = 1 [(gogoproto.nullable) = false, (gogoproto.embed) = true];
163+
// LastSupportWithdrawnTime is the timestamp at which support was last
164+
// withdrawn from the remote store. This field is not persisted to disk.
165+
util.hlc.Timestamp last_support_withdrawn_time = 2 [(gogoproto.nullable) = false];
166+
}
167+
158168
// InspectStoreLivenessRequest is used to power the Store Liveness /inspectz
159169
// functionality. The request doesn't take any parameters.
160170
message InspectStoreLivenessRequest {}
161171

162-
// InspectStoreLivenessRequest is used to power the Store Liveness /inspectz
163-
// functionality. The response is a list of SupportStatesPerStore.
164-
message InspectStoreLivenessResponse {
165-
repeated SupportStatesPerStore support_states_per_store = 1 [(gogoproto.nullable) = false];
172+
// InspectSupportFromResponse is used to power the Store Liveness /inspectz
173+
// supportFrom functionality.
174+
message InspectSupportFromResponse {
175+
repeated InspectSupportFromStatesPerStore support_from_states_per_store = 1 [(gogoproto.nullable) = false];
176+
}
177+
178+
// InspectSupportForResponse is used to power the Store Liveness /inspectz
179+
// supportFor functionality.
180+
message InspectSupportForResponse {
181+
repeated InspectSupportForStatesPerStore support_for_states_per_store = 1 [(gogoproto.nullable) = false];
182+
}
183+
184+
// InspectSupportFromStatesPerStore includes all SupportStates for a given
185+
// store; they correspond to the support-from map of a given store.
186+
message InspectSupportFromStatesPerStore {
187+
StoreIdent store_id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "StoreID"];
188+
repeated SupportState support_from_states = 2 [(gogoproto.nullable) = false];
166189
}
167190

168-
// SupportStatesPerStore includes all SupportStates for a given store; they
169-
// correspond to either the support-from or support-for map of a given store.
170-
message SupportStatesPerStore {
191+
// InspectSupportForStatesPerStore includes all InspectSupportForStates for a
192+
// given store; they correspond to the support-for map of a given store.
193+
message InspectSupportForStatesPerStore {
171194
StoreIdent store_id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "StoreID"];
172-
repeated SupportState support_states = 2 [(gogoproto.nullable) = false];
195+
repeated InspectSupportForState support_for_states = 2 [(gogoproto.nullable) = false];
173196
}

pkg/kv/kvserver/storeliveness/support_manager.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,15 +121,15 @@ func (sm *SupportManager) SupportFor(id slpb.StoreIdent) (slpb.Epoch, bool) {
121121
}
122122

123123
// InspectSupportFrom implements the InspectFabric interface.
124-
func (sm *SupportManager) InspectSupportFrom() slpb.SupportStatesPerStore {
125-
supportStates := sm.requesterStateHandler.exportAllSupportFrom()
126-
return slpb.SupportStatesPerStore{StoreID: sm.storeID, SupportStates: supportStates}
124+
func (sm *SupportManager) InspectSupportFrom() slpb.InspectSupportFromStatesPerStore {
125+
supportFromStates := sm.requesterStateHandler.exportAllSupportFrom()
126+
return slpb.InspectSupportFromStatesPerStore{StoreID: sm.storeID, SupportFromStates: supportFromStates}
127127
}
128128

129129
// InspectSupportFor implements the InspectFabric interface.
130-
func (sm *SupportManager) InspectSupportFor() slpb.SupportStatesPerStore {
131-
supportStates := sm.supporterStateHandler.exportAllSupportFor()
132-
return slpb.SupportStatesPerStore{StoreID: sm.storeID, SupportStates: supportStates}
130+
func (sm *SupportManager) InspectSupportFor() slpb.InspectSupportForStatesPerStore {
131+
supportForStates := sm.supporterStateHandler.exportAllSupportFor()
132+
return slpb.InspectSupportForStatesPerStore{StoreID: sm.storeID, SupportForStates: supportForStates}
133133
}
134134

135135
// SupportFrom implements the Fabric interface. It delegates the response to the

pkg/kv/kvserver/storeliveness/supporter_state.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,16 +122,19 @@ func (ssh *supporterStateHandler) getNumSupportFor() int {
122122
return len(ssh.supporterState.supportFor)
123123
}
124124

125-
// exportAllSupportFor exports a copy of all SupportStates from the
125+
// exportAllSupportFor exports a copy of all InspectSupportForStates from the
126126
// supporterState.supportFor map.
127-
func (ssh *supporterStateHandler) exportAllSupportFor() []slpb.SupportState {
127+
func (ssh *supporterStateHandler) exportAllSupportFor() []slpb.InspectSupportForState {
128128
ssh.mu.RLock()
129129
defer ssh.mu.RUnlock()
130-
supportStates := make([]slpb.SupportState, 0, len(ssh.supporterState.supportFor))
130+
supportForStates := make([]slpb.InspectSupportForState, 0, len(ssh.supporterState.supportFor))
131131
for _, ss := range ssh.supporterState.supportFor {
132-
supportStates = append(supportStates, ss.SupportState)
132+
supportForStates = append(supportForStates, slpb.InspectSupportForState{
133+
SupportState: ss.SupportState,
134+
LastSupportWithdrawnTime: ss.lastSupportWithdrawnTime,
135+
})
133136
}
134-
return supportStates
137+
return supportForStates
135138
}
136139

137140
// Functions for handling supporterState updates.

pkg/kv/kvserver/stores_store_liveness.go

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import slpb "github.com/cockroachdb/cockroach/pkg/kv/kvserver/storeliveness/stor
1111
// Liveness state to be combined into a per-node view. It powers the inspectz
1212
// Store Liveness functionality.
1313
type InspectAllStoreLiveness interface {
14-
InspectAllSupportFrom() ([]slpb.SupportStatesPerStore, error)
15-
InspectAllSupportFor() ([]slpb.SupportStatesPerStore, error)
14+
InspectAllSupportFrom() ([]slpb.InspectSupportFromStatesPerStore, error)
15+
InspectAllSupportFor() ([]slpb.InspectSupportForStatesPerStore, error)
1616
}
1717

1818
// StoresForStoreLiveness is a wrapper around Stores that implements
@@ -27,29 +27,35 @@ func MakeStoresForStoreLiveness(stores *Stores) *StoresForStoreLiveness {
2727
}
2828

2929
// InspectAllSupportFrom implements the InspectAllStoreLiveness interface. It
30-
// iterates over all stores and aggregates their SupportFrom SupportStates.
31-
func (sfsl *StoresForStoreLiveness) InspectAllSupportFrom() ([]slpb.SupportStatesPerStore, error) {
30+
// iterates over all stores and aggregates their SupportFrom states.
31+
func (sfsl *StoresForStoreLiveness) InspectAllSupportFrom() (
32+
[]slpb.InspectSupportFromStatesPerStore,
33+
error,
34+
) {
3235
stores := (*Stores)(sfsl)
33-
var sspf []slpb.SupportStatesPerStore
36+
var sfsps []slpb.InspectSupportFromStatesPerStore
3437
err := stores.VisitStores(
3538
func(s *Store) error {
36-
sspf = append(sspf, s.storeLiveness.InspectSupportFrom())
39+
sfsps = append(sfsps, s.storeLiveness.InspectSupportFrom())
3740
return nil
3841
},
3942
)
40-
return sspf, err
43+
return sfsps, err
4144
}
4245

4346
// InspectAllSupportFor implements the InspectAllStoreLiveness interface. It
44-
// iterates over all stores and aggregates their SupportFor SupportStates.
45-
func (sfsl *StoresForStoreLiveness) InspectAllSupportFor() ([]slpb.SupportStatesPerStore, error) {
47+
// iterates over all stores and aggregates their SupportFor states.
48+
func (sfsl *StoresForStoreLiveness) InspectAllSupportFor() (
49+
[]slpb.InspectSupportForStatesPerStore,
50+
error,
51+
) {
4652
stores := (*Stores)(sfsl)
47-
var sspf []slpb.SupportStatesPerStore
53+
var sfsps []slpb.InspectSupportForStatesPerStore
4854
err := stores.VisitStores(
4955
func(s *Store) error {
50-
sspf = append(sspf, s.storeLiveness.InspectSupportFor())
56+
sfsps = append(sfsps, s.storeLiveness.InspectSupportFor())
5157
return nil
5258
},
5359
)
54-
return sspf, err
60+
return sfsps, err
5561
}

pkg/sql/crdb_internal.go

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9627,20 +9627,21 @@ CREATE TABLE crdb_internal.store_liveness_support_from (
96279627
if err != nil {
96289628
return err
96299629
}
9630-
return populateStoreLivenessSupportResponse(resp, addRow)
9630+
return populateStoreLivenessSupportFromResponse(resp, addRow)
96319631
},
96329632
}
96339633

96349634
var crdbInternalStoreLivenessSupportForTable = virtualSchemaTable{
96359635
comment: `node-level view of store liveness support for other stores`,
96369636
schema: `
96379637
CREATE TABLE crdb_internal.store_liveness_support_for (
9638-
node_id INT NOT NULL,
9639-
store_id INT NOT NULL,
9640-
support_for_node_id INT NOT NULL,
9641-
support_for_store_id INT NOT NULL,
9642-
support_epoch INT NOT NULL,
9643-
support_expiration TIMESTAMP NOT NULL
9638+
node_id INT NOT NULL,
9639+
store_id INT NOT NULL,
9640+
support_for_node_id INT NOT NULL,
9641+
support_for_store_id INT NOT NULL,
9642+
support_epoch INT NOT NULL,
9643+
support_expiration TIMESTAMP NOT NULL,
9644+
last_support_withdrawn_time TIMESTAMP NOT NULL
96449645
);`,
96459646
populate: func(ctx context.Context, p *planner, _ catalog.DatabaseDescriptor, addRow func(...tree.Datum) error) error {
96469647
hasRoleOption, _, err := p.HasViewActivityOrViewActivityRedactedRole(ctx)
@@ -9655,22 +9656,43 @@ CREATE TABLE crdb_internal.store_liveness_support_for (
96559656
if err != nil {
96569657
return err
96579658
}
9658-
return populateStoreLivenessSupportResponse(resp, addRow)
9659+
return populateStoreLivenessSupportForResponse(resp, addRow)
96599660
},
96609661
}
96619662

9662-
func populateStoreLivenessSupportResponse(
9663-
resp *slpb.InspectStoreLivenessResponse, addRow func(...tree.Datum) error,
9663+
func populateStoreLivenessSupportFromResponse(
9664+
resp *slpb.InspectSupportFromResponse, addRow func(...tree.Datum) error,
9665+
) error {
9666+
for _, sfsps := range resp.SupportFromStatesPerStore {
9667+
for _, sfs := range sfsps.SupportFromStates {
9668+
if err := addRow(
9669+
tree.NewDInt(tree.DInt(sfsps.StoreID.NodeID)),
9670+
tree.NewDInt(tree.DInt(sfsps.StoreID.StoreID)),
9671+
tree.NewDInt(tree.DInt(sfs.Target.NodeID)),
9672+
tree.NewDInt(tree.DInt(sfs.Target.StoreID)),
9673+
tree.NewDInt(tree.DInt(sfs.Epoch)),
9674+
eval.TimestampToInexactDTimestamp(sfs.Expiration),
9675+
); err != nil {
9676+
return err
9677+
}
9678+
}
9679+
}
9680+
return nil
9681+
}
9682+
9683+
func populateStoreLivenessSupportForResponse(
9684+
resp *slpb.InspectSupportForResponse, addRow func(...tree.Datum) error,
96649685
) error {
9665-
for _, ssps := range resp.SupportStatesPerStore {
9666-
for _, ss := range ssps.SupportStates {
9686+
for _, sfsps := range resp.SupportForStatesPerStore {
9687+
for _, sfs := range sfsps.SupportForStates {
96679688
if err := addRow(
9668-
tree.NewDInt(tree.DInt(ssps.StoreID.NodeID)),
9669-
tree.NewDInt(tree.DInt(ssps.StoreID.StoreID)),
9670-
tree.NewDInt(tree.DInt(ss.Target.NodeID)),
9671-
tree.NewDInt(tree.DInt(ss.Target.StoreID)),
9672-
tree.NewDInt(tree.DInt(ss.Epoch)),
9673-
eval.TimestampToInexactDTimestamp(ss.Expiration),
9689+
tree.NewDInt(tree.DInt(sfsps.StoreID.NodeID)),
9690+
tree.NewDInt(tree.DInt(sfsps.StoreID.StoreID)),
9691+
tree.NewDInt(tree.DInt(sfs.Target.NodeID)),
9692+
tree.NewDInt(tree.DInt(sfs.Target.StoreID)),
9693+
tree.NewDInt(tree.DInt(sfs.Epoch)),
9694+
eval.TimestampToInexactDTimestamp(sfs.Expiration),
9695+
eval.TimestampToInexactDTimestamp(sfs.LastSupportWithdrawnTime),
96749696
); err != nil {
96759697
return err
96769698
}

0 commit comments

Comments
 (0)