@@ -480,10 +480,26 @@ func (i *Ingester) checkRunningOrStopping() error {
480480 return status .Error (codes .Unavailable , s .String ())
481481}
482482
483+ // Using block store, the ingester is only available when it is in a Running state. The ingester is not available
484+ // when stopping to prevent any read or writes to the TSDB after the ingester has closed them.
485+ func (i * Ingester ) checkRunning () error {
486+ s := i .State ()
487+ if s == services .Running {
488+ return nil
489+ }
490+ return status .Error (codes .Unavailable , s .String ())
491+ }
492+
483493// Push implements client.IngesterServer
484494func (i * Ingester ) Push (ctx context.Context , req * cortexpb.WriteRequest ) (* cortexpb.WriteResponse , error ) {
485- if err := i .checkRunningOrStopping (); err != nil {
486- return nil , err
495+ if i .cfg .BlocksStorageEnabled {
496+ if err := i .checkRunning (); err != nil {
497+ return nil , err
498+ }
499+ } else {
500+ if err := i .checkRunningOrStopping (); err != nil {
501+ return nil , err
502+ }
487503 }
488504
489505 // We will report *this* request in the error too.
@@ -762,14 +778,17 @@ func (i *Ingester) purgeUserMetricsMetadata() {
762778
763779// Query implements service.IngesterServer
764780func (i * Ingester ) Query (ctx context.Context , req * client.QueryRequest ) (* client.QueryResponse , error ) {
765- if err := i .checkRunningOrStopping (); err != nil {
766- return nil , err
767- }
768-
769781 if i .cfg .BlocksStorageEnabled {
782+ if err := i .checkRunning (); err != nil {
783+ return nil , err
784+ }
770785 return i .v2Query (ctx , req )
771786 }
772787
788+ if err := i .checkRunningOrStopping (); err != nil {
789+ return nil , err
790+ }
791+
773792 userID , err := tenant .TenantID (ctx )
774793 if err != nil {
775794 return nil , err
@@ -829,14 +848,17 @@ func (i *Ingester) Query(ctx context.Context, req *client.QueryRequest) (*client
829848
830849// QueryStream implements service.IngesterServer
831850func (i * Ingester ) QueryStream (req * client.QueryRequest , stream client.Ingester_QueryStreamServer ) error {
832- if err := i .checkRunningOrStopping (); err != nil {
833- return err
834- }
835-
836851 if i .cfg .BlocksStorageEnabled {
852+ if err := i .checkRunning (); err != nil {
853+ return err
854+ }
837855 return i .v2QueryStream (req , stream )
838856 }
839857
858+ if err := i .checkRunningOrStopping (); err != nil {
859+ return err
860+ }
861+
840862 spanLog , ctx := spanlogger .New (stream .Context (), "QueryStream" )
841863 defer spanLog .Finish ()
842864
@@ -926,14 +948,17 @@ func (i *Ingester) QueryExemplars(ctx context.Context, req *client.ExemplarQuery
926948
927949// LabelValues returns all label values that are associated with a given label name.
928950func (i * Ingester ) LabelValues (ctx context.Context , req * client.LabelValuesRequest ) (* client.LabelValuesResponse , error ) {
929- if err := i .checkRunningOrStopping (); err != nil {
930- return nil , err
931- }
932-
933951 if i .cfg .BlocksStorageEnabled {
952+ if err := i .checkRunning (); err != nil {
953+ return nil , err
954+ }
934955 return i .v2LabelValues (ctx , req )
935956 }
936957
958+ if err := i .checkRunningOrStopping (); err != nil {
959+ return nil , err
960+ }
961+
937962 i .userStatesMtx .RLock ()
938963 defer i .userStatesMtx .RUnlock ()
939964 state , ok , err := i .userStates .getViaContext (ctx )
@@ -951,14 +976,17 @@ func (i *Ingester) LabelValues(ctx context.Context, req *client.LabelValuesReque
951976
952977// LabelNames return all the label names.
953978func (i * Ingester ) LabelNames (ctx context.Context , req * client.LabelNamesRequest ) (* client.LabelNamesResponse , error ) {
954- if err := i .checkRunningOrStopping (); err != nil {
955- return nil , err
956- }
957-
958979 if i .cfg .BlocksStorageEnabled {
980+ if err := i .checkRunning (); err != nil {
981+ return nil , err
982+ }
959983 return i .v2LabelNames (ctx , req )
960984 }
961985
986+ if err := i .checkRunningOrStopping (); err != nil {
987+ return nil , err
988+ }
989+
962990 i .userStatesMtx .RLock ()
963991 defer i .userStatesMtx .RUnlock ()
964992 state , ok , err := i .userStates .getViaContext (ctx )
@@ -976,14 +1004,17 @@ func (i *Ingester) LabelNames(ctx context.Context, req *client.LabelNamesRequest
9761004
9771005// MetricsForLabelMatchers returns all the metrics which match a set of matchers.
9781006func (i * Ingester ) MetricsForLabelMatchers (ctx context.Context , req * client.MetricsForLabelMatchersRequest ) (* client.MetricsForLabelMatchersResponse , error ) {
979- if err := i .checkRunningOrStopping (); err != nil {
980- return nil , err
981- }
982-
9831007 if i .cfg .BlocksStorageEnabled {
1008+ if err := i .checkRunning (); err != nil {
1009+ return nil , err
1010+ }
9841011 return i .v2MetricsForLabelMatchers (ctx , req )
9851012 }
9861013
1014+ if err := i .checkRunningOrStopping (); err != nil {
1015+ return nil , err
1016+ }
1017+
9871018 i .userStatesMtx .RLock ()
9881019 defer i .userStatesMtx .RUnlock ()
9891020 state , ok , err := i .userStates .getViaContext (ctx )
@@ -1046,14 +1077,17 @@ func (i *Ingester) MetricsMetadata(ctx context.Context, req *client.MetricsMetad
10461077
10471078// UserStats returns ingestion statistics for the current user.
10481079func (i * Ingester ) UserStats (ctx context.Context , req * client.UserStatsRequest ) (* client.UserStatsResponse , error ) {
1049- if err := i .checkRunningOrStopping (); err != nil {
1050- return nil , err
1051- }
1052-
10531080 if i .cfg .BlocksStorageEnabled {
1081+ if err := i .checkRunning (); err != nil {
1082+ return nil , err
1083+ }
10541084 return i .v2UserStats (ctx , req )
10551085 }
10561086
1087+ if err := i .checkRunningOrStopping (); err != nil {
1088+ return nil , err
1089+ }
1090+
10571091 i .userStatesMtx .RLock ()
10581092 defer i .userStatesMtx .RUnlock ()
10591093 state , ok , err := i .userStates .getViaContext (ctx )
@@ -1075,14 +1109,17 @@ func (i *Ingester) UserStats(ctx context.Context, req *client.UserStatsRequest)
10751109
10761110// AllUserStats returns ingestion statistics for all users known to this ingester.
10771111func (i * Ingester ) AllUserStats (ctx context.Context , req * client.UserStatsRequest ) (* client.UsersStatsResponse , error ) {
1078- if err := i .checkRunningOrStopping (); err != nil {
1079- return nil , err
1080- }
1081-
10821112 if i .cfg .BlocksStorageEnabled {
1113+ if err := i .checkRunning (); err != nil {
1114+ return nil , err
1115+ }
10831116 return i .v2AllUserStats (ctx , req )
10841117 }
10851118
1119+ if err := i .checkRunningOrStopping (); err != nil {
1120+ return nil , err
1121+ }
1122+
10861123 i .userStatesMtx .RLock ()
10871124 defer i .userStatesMtx .RUnlock ()
10881125 users := i .userStates .cp ()
0 commit comments