Skip to content

Commit d41137a

Browse files
committed
[Filestore] availability request names should match request names reported in user stats
1 parent 3aa9e97 commit d41137a

7 files changed

Lines changed: 132 additions & 194 deletions

File tree

cloud/filestore/libs/diagnostics/availability_counters.cpp

Lines changed: 46 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -27,38 +27,38 @@ constexpr TDuration DefaultIntervalDuration = TDuration::Minutes(2);
2727

2828
////////////////////////////////////////////////////////////////////////////////
2929

30-
const char* GetAvailabilityRequestTypeName(
31-
EFileStoreAvailabilityRequestType requestType)
30+
const char* GetAvailabilityRequestName(EFileStoreRequest requestType)
3231
{
33-
using EType = EFileStoreAvailabilityRequestType;
32+
using EType = EFileStoreRequest;
3433
switch (requestType) {
35-
case EType::Lookup: return "lookup";
36-
case EType::GetAttr: return "getattr";
37-
case EType::SetAttr: return "setattr";
34+
case EType::AccessNode: return "access";
35+
case EType::AcquireLock: return "acquirelock";
36+
case EType::AllocateData: return "fallocate";
37+
case EType::CreateHandle: return "open";
38+
case EType::CreateNode: return "createnode";
39+
case EType::DestroyHandle: return "release";
40+
case EType::GetNodeAttr: return "getattr";
41+
case EType::GetNodeXAttr: return "getxattr";
42+
case EType::ListNodeXAttr: return "listxattr";
43+
case EType::ListNodes: return "readdir";
44+
case EType::ReadData: return "read";
3845
case EType::ReadLink: return "readlink";
39-
case EType::MkDir: return "mkdir";
40-
case EType::RmDir: return "rmdir";
41-
case EType::Unlink: return "unlink";
42-
case EType::SymLink: return "symlink";
43-
case EType::Link: return "link";
44-
case EType::Rename: return "rename";
45-
case EType::Open: return "open";
46-
case EType::Create: return "create";
47-
case EType::Read: return "read";
48-
case EType::Write: return "write";
49-
case EType::WriteBuf: return "write_buf";
50-
case EType::Flush: return "flush";
51-
case EType::Fsync: return "fsync";
52-
case EType::Release: return "release";
53-
case EType::OpenDir: return "opendir";
54-
case EType::ReadDir: return "readdir";
55-
case EType::ReadDirPlus: return "readdirplus";
56-
case EType::ReleaseDir: return "releasedir";
57-
case EType::None:
58-
case EType::MAX:
59-
break;
46+
case EType::ReleaseLock: return "releaselock";
47+
case EType::RemoveNodeXAttr: return "removexattr";
48+
case EType::RenameNode: return "rename";
49+
case EType::SetNodeAttr: return "setattr";
50+
case EType::SetNodeXAttr: return "setxattr";
51+
case EType::StatFileStore: return "statfs";
52+
case EType::UnlinkNode: return "unlink";
53+
case EType::WriteData: return "write";
54+
default:
55+
return nullptr;
6056
}
61-
return "unknown";
57+
}
58+
59+
bool IsAvailabilityTrackedRequest(EFileStoreRequest requestType)
60+
{
61+
return GetAvailabilityRequestName(requestType) != nullptr;
6262
}
6363

6464
////////////////////////////////////////////////////////////////////////////////
@@ -101,13 +101,16 @@ void TAvailabilityCounters::EnableAndRegister(
101101
// No intervals have been reported yet - start as available.
102102
*LastIntervalAvailableCounter = 1;
103103

104-
// Index 0 is EFileStoreAvailabilityRequestType::None and stays unused.
105-
for (size_t i = 1; i < RequestTypeStates.size(); ++i) {
104+
// Only the tracked request types get per-type sensors.
105+
for (size_t i = 0; i < RequestTypeStates.size(); ++i) {
106+
const auto requestType = static_cast<EFileStoreRequest>(i);
107+
if (!IsAvailabilityTrackedRequest(requestType)) {
108+
continue;
109+
}
106110
auto& state = RequestTypeStates[i];
107111
auto requestCounters = counters.GetSubgroup(
108112
"request",
109-
GetAvailabilityRequestTypeName(
110-
static_cast<EFileStoreAvailabilityRequestType>(i)));
113+
GetAvailabilityRequestName(requestType));
111114

112115
state.AvailableIntervalsCounter = requestCounters->GetCounter(
113116
"Availability_AvailableIntervals",
@@ -133,14 +136,12 @@ void TAvailabilityCounters::RequestStarted(
133136
return;
134137
}
135138

136-
if (callContext.AvailabilityRequestType ==
137-
EFileStoreAvailabilityRequestType::None)
138-
{
139+
if (!IsAvailabilityTrackedRequest(callContext.RequestType)) {
139140
return;
140141
}
141142

142143
auto& state = RequestTypeStates[
143-
static_cast<size_t>(callContext.AvailabilityRequestType)];
144+
static_cast<size_t>(callContext.RequestType)];
144145

145146
for (;;) {
146147
// Assign the event to its actual wall-clock interval: roll the
@@ -174,7 +175,7 @@ void TAvailabilityCounters::DoRequestStarted(
174175
if (callContext.AvailabilityIntervalSeqNo != 0) {
175176
ReportAvailabilityCountersDoubleRegistration(
176177
TStringBuilder() << "request type: "
177-
<< static_cast<ui32>(callContext.AvailabilityRequestType));
178+
<< GetAvailabilityRequestName(callContext.RequestType));
178179
return;
179180
}
180181

@@ -192,14 +193,12 @@ void TAvailabilityCounters::RequestCompleted(
192193
return;
193194
}
194195

195-
if (callContext.AvailabilityRequestType ==
196-
EFileStoreAvailabilityRequestType::None)
197-
{
196+
if (!IsAvailabilityTrackedRequest(callContext.RequestType)) {
198197
return;
199198
}
200199

201200
auto& state = RequestTypeStates[
202-
static_cast<size_t>(callContext.AvailabilityRequestType)];
201+
static_cast<size_t>(callContext.RequestType)];
203202

204203
for (;;) {
205204
// Assign the event to its actual wall-clock interval: roll the
@@ -348,8 +347,11 @@ void TAvailabilityCounters::RollInterval(bool publishCounters)
348347
bool intervalAvailable = true;
349348
TStringBuilder unavailableRequestTypes;
350349

351-
// Index 0 is EFileStoreAvailabilityRequestType::None, stays unused.
352-
for (size_t i = 1; i < RequestTypeStates.size(); ++i) {
350+
for (size_t i = 0; i < RequestTypeStates.size(); ++i) {
351+
const auto requestType = static_cast<EFileStoreRequest>(i);
352+
if (!IsAvailabilityTrackedRequest(requestType)) {
353+
continue;
354+
}
353355
if (!RollRequestTypeStateAndReturnAvailability(
354356
RequestTypeStates[i],
355357
publishCounters))
@@ -358,8 +360,7 @@ void TAvailabilityCounters::RollInterval(bool publishCounters)
358360
// the request types.
359361
intervalAvailable = false;
360362
unavailableRequestTypes << " "
361-
<< GetAvailabilityRequestTypeName(
362-
static_cast<EFileStoreAvailabilityRequestType>(i));
363+
<< GetAvailabilityRequestName(requestType);
363364
}
364365
}
365366

cloud/filestore/libs/diagnostics/availability_counters.h

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ namespace NCloud::NFileStore {
2020
////////////////////////////////////////////////////////////////////////////////
2121

2222
// The value of the "request" label of the per-request-type availability
23-
// sensors: the FUSE request name in lower case, as listed in the SLA (e.g.
24-
// "lookup", "write_buf").
25-
const char* GetAvailabilityRequestTypeName(
26-
EFileStoreAvailabilityRequestType requestType);
23+
// sensors: the request name in lower case, as listed in the SLA (e.g.
24+
// "lookup", "write").
25+
const char* GetAvailabilityRequestName(EFileStoreRequest requestType);
26+
27+
// Whether the backend request type is subject to the availability SLA.
28+
bool IsAvailabilityTrackedRequest(EFileStoreRequest requestType);
2729

2830
////////////////////////////////////////////////////////////////////////////////
2931

@@ -49,12 +51,6 @@ const char* GetAvailabilityRequestTypeName(
4951
// A request is hung if it was outstanding for the entire duration of the N-minute
5052
// interval.
5153
//
52-
// Request type - an individual FUSE request type subject to the SLA, see
53-
// EFileStoreAvailabilityRequestType. Distinct FUSE request types are
54-
// accounted independently even when they map to the same backend request
55-
// type, and requests outside the SLA (AvailabilityRequestType == None) are
56-
// ignored entirely.
57-
//
5854
// The EIO classification is based on TCallContext::GuestReplyErrno - the
5955
// errno actually sent to the guest - because the internal request error does
6056
// not always match the guest-visible outcome.
@@ -68,7 +64,7 @@ const char* GetAvailabilityRequestTypeName(
6864
// interval was available, 0 otherwise;
6965
// Availability_{Available,Unavailable}Intervals and
7066
// Availability_LastIntervalAvailable are also published per availability
71-
// request type, on the "request=<type>" subgroup (e.g. request=lookup):
67+
// request type, on the "request=<type>" subgroup (e.g. request=read):
7268
// there an interval is available if that request type alone shows no
7369
// unavailability evidence.
7470
//
@@ -142,7 +138,7 @@ class TAvailabilityCounters
142138
// Assigned by EnableAndRegister().
143139
TDuration IntervalDuration;
144140

145-
std::array<TRequestTypeState, FileStoreAvailabilityRequestTypeCount>
141+
std::array<TRequestTypeState, FileStoreRequestCount>
146142
RequestTypeStates;
147143

148144
// Guarded by RollLock.

0 commit comments

Comments
 (0)