diff --git a/cloud/blockstore/libs/storage/disk_agent/disk_agent_actor_monitoring.cpp b/cloud/blockstore/libs/storage/disk_agent/disk_agent_actor_monitoring.cpp index 2c483c9c5a5..e4e937924df 100644 --- a/cloud/blockstore/libs/storage/disk_agent/disk_agent_actor_monitoring.cpp +++ b/cloud/blockstore/libs/storage/disk_agent/disk_agent_actor_monitoring.cpp @@ -86,8 +86,9 @@ void TDiskAgentActor::RenderDevices(IOutputStream& out) const DumpDeviceState( out, config.GetState(), - false, - State->IsDeviceDisabled(uuid)); + State->IsDeviceDisabled(uuid) + ? EDeviceStateFlags::DISABLED + : EDeviceStateFlags::NONE); } TABLED() { if (config.GetStateTs()) { diff --git a/cloud/blockstore/libs/storage/disk_common/monitoring_utils.cpp b/cloud/blockstore/libs/storage/disk_common/monitoring_utils.cpp index af91e576778..5bd62bea3e3 100644 --- a/cloud/blockstore/libs/storage/disk_common/monitoring_utils.cpp +++ b/cloud/blockstore/libs/storage/disk_common/monitoring_utils.cpp @@ -47,8 +47,7 @@ IOutputStream& DumpDiskState( IOutputStream& DumpDeviceState( IOutputStream& out, NProto::EDeviceState state, - bool isFresh, - bool isDisabled, + EDeviceStateFlags flags, TString suffix) { switch (state) { @@ -67,11 +66,17 @@ IOutputStream& DumpDeviceState( << static_cast(state) << ")" << suffix; } - if (isFresh) { - out << " [Fresh]"; + if (flags & EDeviceStateFlags::FRESH) { + out << " [fresh]"; } - if (isDisabled) { - out << " [Disabled]"; + if (flags & EDeviceStateFlags::DISABLED) { + out << " [disabled]"; + } + if (flags & EDeviceStateFlags::DIRTY) { + out << " [dirty]"; + } + if (flags & EDeviceStateFlags::SUSPENDED) { + out << " [suspended]"; } return out; } diff --git a/cloud/blockstore/libs/storage/disk_common/monitoring_utils.h b/cloud/blockstore/libs/storage/disk_common/monitoring_utils.h index 61ebdb6d665..7f1fe9430d1 100644 --- a/cloud/blockstore/libs/storage/disk_common/monitoring_utils.h +++ b/cloud/blockstore/libs/storage/disk_common/monitoring_utils.h @@ -8,6 +8,28 @@ namespace NCloud::NBlockStore::NStorage { //////////////////////////////////////////////////////////////////////////////// +enum EDeviceStateFlags : uint16_t +{ + NONE = 0, + FRESH = 1 << 0, + DISABLED = 1 << 1, + DIRTY = 1 << 2, + SUSPENDED = 1 << 3, +}; + +inline EDeviceStateFlags operator|(EDeviceStateFlags a, EDeviceStateFlags b) +{ + return static_cast( + static_cast(a) | static_cast(b)); +} + +inline EDeviceStateFlags& operator|=(EDeviceStateFlags& a, EDeviceStateFlags b) +{ + return a = a | b; +} + +//////////////////////////////////////////////////////////////////////////////// + IOutputStream& DumpAgentState( IOutputStream& out, NProto::EAgentState state); @@ -19,8 +41,7 @@ IOutputStream& DumpDiskState( IOutputStream& DumpDeviceState( IOutputStream& out, NProto::EDeviceState state, - bool isFresh = false, - bool isDisabled = false, + EDeviceStateFlags flags = EDeviceStateFlags::NONE, TString suffix = ""); } // namespace NCloud::NBlockStore::NStorage diff --git a/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_monitoring.cpp b/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_monitoring.cpp index 5ba52c77c26..091e66f3ff9 100644 --- a/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_monitoring.cpp +++ b/cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_monitoring.cpp @@ -22,6 +22,20 @@ namespace { //////////////////////////////////////////////////////////////////////////////// +EDeviceStateFlags GetDeviceStateFlags( + const TDiskRegistryState& state, + const TString& deviceUUID) +{ + EDeviceStateFlags deviceStateFlags = EDeviceStateFlags::NONE; + if (state.IsDirtyDevice(deviceUUID)) { + deviceStateFlags |= EDeviceStateFlags::DIRTY; + } + if (state.IsSuspendedDevice(deviceUUID)) { + deviceStateFlags |= EDeviceStateFlags::SUSPENDED; + } + return deviceStateFlags; +} + void BuildVolumeReallocateButton( IOutputStream& out, ui64 tabletId, @@ -243,7 +257,14 @@ void TDiskRegistryActor::RenderDevicesWithDetails( } TABLED() { out << device.GetDeviceName(); } TABLED() { out << device.GetSerialNumber(); } - TABLED() { DumpDeviceState(out, device.GetState()); } + TABLED() { + DumpDeviceState( + out, + device.GetState(), + GetDeviceStateFlags( + *State, + device.GetDeviceUUID())); + } TABLED() { out << TInstant::MicroSeconds(device.GetStateTs()); } @@ -396,7 +417,13 @@ void TDiskRegistryActor::RenderDeviceHtmlInfo( out << device.GetRack(); } - DIV() { out << "State: "; DumpDeviceState(out, device.GetState()); } + DIV() { + out << "State: "; + DumpDeviceState( + out, + device.GetState(), + GetDeviceStateFlags(*State, id)); + } DIV() { out << "State Timestamp: " << TInstant::MicroSeconds(device.GetStateTs()); @@ -641,12 +668,16 @@ void TDiskRegistryActor::RenderDiskHtmlInfo( } } TABLED() { - const bool isFresh = - FindPtr( + EDeviceStateFlags flags = + GetDeviceStateFlags(*State, device.GetDeviceUUID()); + if (FindPtr( info.MasterDiskId ? masterDiskInfo.DeviceReplacementIds : info.DeviceReplacementIds, - device.GetDeviceUUID()) != nullptr; - DumpDeviceState(out, device.GetState(), isFresh); + device.GetDeviceUUID()) != nullptr) + { + flags |= EDeviceStateFlags::FRESH; + } + DumpDeviceState(out, device.GetState(), flags); } TABLED() { out << TInstant::MicroSeconds(device.GetStateTs()); @@ -1731,16 +1762,14 @@ void TDiskRegistryActor::RenderAgentList( DumpDeviceState( out, NProto::DEVICE_STATE_ONLINE, - false, - false, + EDeviceStateFlags::NONE, TStringBuilder() << " " << onlineDevs); if (warningDevs) { out << " / "; DumpDeviceState( out, NProto::DEVICE_STATE_WARNING, - false, - false, + EDeviceStateFlags::NONE, TStringBuilder() << " " << warningDevs); } if (errorDevs) { @@ -1748,8 +1777,7 @@ void TDiskRegistryActor::RenderAgentList( DumpDeviceState( out, NProto::DEVICE_STATE_ERROR, - false, - false, + EDeviceStateFlags::NONE, TStringBuilder() << " " << errorDevs); } }