Skip to content

Commit

Permalink
Fix VDisk log and chunk status flags logic (#4409)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexvru authored May 13, 2024
1 parent 9b4949f commit a421b6d
Show file tree
Hide file tree
Showing 9 changed files with 47 additions and 26 deletions.
6 changes: 5 additions & 1 deletion ydb/core/blobstorage/pdisk/blobstorage_pdisk.h
Original file line number Diff line number Diff line change
Expand Up @@ -1319,16 +1319,19 @@ struct TEvCheckSpaceResult : public TEventLocal<TEvCheckSpaceResult, TEvBlobStor
ui32 NumSlots; // number of VSlots over PDisk
double Occupancy = 0;
TString ErrorReason;
TStatusFlags LogStatusFlags;

TEvCheckSpaceResult(NKikimrProto::EReplyStatus status, TStatusFlags statusFlags, ui32 freeChunks,
ui32 totalChunks, ui32 usedChunks, ui32 numSlots, const TString &errorReason)
ui32 totalChunks, ui32 usedChunks, ui32 numSlots, const TString &errorReason,
TStatusFlags logStatusFlags = {})
: Status(status)
, StatusFlags(statusFlags)
, FreeChunks(freeChunks)
, TotalChunks(totalChunks)
, UsedChunks(usedChunks)
, NumSlots(numSlots)
, ErrorReason(errorReason)
, LogStatusFlags(logStatusFlags)
{}

TString ToString() const {
Expand All @@ -1340,6 +1343,7 @@ struct TEvCheckSpaceResult : public TEventLocal<TEvCheckSpaceResult, TEvBlobStor
str << " UsedChunks# " << UsedChunks;
str << " NumSlots# " << NumSlots;
str << " ErrorReason# \"" << ErrorReason << "\"";
str << " LogStatusFlags# " << StatusFlagsToString(LogStatusFlags);
str << "}";
return str.Str();
}
Expand Down
3 changes: 2 additions & 1 deletion ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2026,7 +2026,8 @@ void TPDisk::CheckSpace(TCheckSpace &evCheckSpace) {
GetTotalChunks(evCheckSpace.Owner, evCheckSpace.OwnerGroupType),
GetUsedChunks(evCheckSpace.Owner, evCheckSpace.OwnerGroupType),
AtomicGet(TotalOwners),
TString());
TString(),
GetStatusFlags(OwnerSystem, evCheckSpace.OwnerGroupType));
result->Occupancy = occupancy;
ActorSystem->Send(evCheckSpace.Sender, result.release());
Mon.CheckSpace.CountResponse();
Expand Down
3 changes: 1 addition & 2 deletions ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -946,8 +946,7 @@ void TPDisk::LogWrite(TLogWrite &evLog, TVector<ui32> &logChunksToCommit) {
}
Y_ABORT_UNLESS(CommonLogger->NextChunks.empty());

evLog.Result.Reset(new NPDisk::TEvLogResult(NKikimrProto::OK,
GetStatusFlags(evLog.Owner, evLog.OwnerGroupType), nullptr));
evLog.Result.Reset(new NPDisk::TEvLogResult(NKikimrProto::OK, GetStatusFlags(OwnerSystem, evLog.OwnerGroupType), nullptr));
Y_ABORT_UNLESS(evLog.Result.Get());
evLog.Result->Results.push_back(NPDisk::TEvLogResult::TRecord(evLog.Lsn, evLog.Cookie));
}
Expand Down
19 changes: 9 additions & 10 deletions ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_actions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2758,14 +2758,7 @@ void TTestRedZoneSurvivability::TestFSM(const TActorContext &ctx) {
case 30:
{
//TEST_RESPONSE(EvLogResult, ERROR);
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid)
| ui32(NKikimrBlobStorage::StatusDiskSpaceCyan)
| ui32(NKikimrBlobStorage::StatusDiskSpaceRed)
| ui32(NKikimrBlobStorage::StatusDiskSpaceOrange)
| ui32(NKikimrBlobStorage::StatusDiskSpacePreOrange)
| ui32(NKikimrBlobStorage::StatusDiskSpaceLightOrange)
| ui32(NKikimrBlobStorage::StatusDiskSpaceYellowStop)
| ui32(NKikimrBlobStorage::StatusDiskSpaceLightYellowMove));
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid));
VERBOSE_COUT(" Sending TEvLog to delete a chunk");
NPDisk::TCommitRecord commitRecord;
TRcBuf commitData = TRcBuf(TString("hello"));
Expand All @@ -2790,7 +2783,10 @@ void TTestRedZoneSurvivability::TestFSM(const TActorContext &ctx) {
case 50:
{
TEST_RESPONSE(EvLogResult, OK);
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid));
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid)
| ui32(NKikimrBlobStorage::StatusDiskSpaceCyan)
| ui32(NKikimrBlobStorage::StatusDiskSpaceLightYellowMove)
| ui32(NKikimrBlobStorage::StatusDiskSpaceYellowStop));

VERBOSE_COUT(" Sending TEvLog to log 3 * ChunkSize bytes");
TRcBuf largeData = TRcBuf(PrepareData(ChunkSize * 3));
Expand All @@ -2800,7 +2796,10 @@ void TTestRedZoneSurvivability::TestFSM(const TActorContext &ctx) {
case 60:
{
TEST_RESPONSE(EvLogResult, OK);
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid));
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid)
| ui32(NKikimrBlobStorage::StatusDiskSpaceCyan)
| ui32(NKikimrBlobStorage::StatusDiskSpaceLightYellowMove)
| ui32(NKikimrBlobStorage::StatusDiskSpaceYellowStop));

VERBOSE_COUT(" Sending TEvLog to cut log");
NPDisk::TCommitRecord commitRecord;
Expand Down
2 changes: 1 addition & 1 deletion ydb/core/blobstorage/vdisk/common/vdisk_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ namespace NKikimr {
case NKikimrProto::OK:
if constexpr (T::EventType != TEvBlobStorage::EvLogResult) {
// we have different semantics for TEvLogResult StatusFlags
OutOfSpaceState.UpdateLocal(ev.StatusFlags);
OutOfSpaceState.UpdateLocalChunk(ev.StatusFlags);
} else {
// update log space flags
OutOfSpaceState.UpdateLocalLog(ev.StatusFlags);
Expand Down
22 changes: 15 additions & 7 deletions ydb/core/blobstorage/vdisk/common/vdisk_outofspace.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,19 @@ namespace NKikimr {
return StatusFlagToSpaceColor(GetLocalStatusFlags());
}

ESpaceColor GetLocalLogColor() const {
return StatusFlagToSpaceColor(GetLocalLogStatusFlags());
}

// update state with flags received from local PDisk
void UpdateLocal(NPDisk::TStatusFlags flags) {
Update(SelfOrderNum, flags);
void UpdateLocalChunk(NPDisk::TStatusFlags flags) {
if (flags & NKikimrBlobStorage::StatusIsValid && flags != AtomicGet(ChunkFlags)) {
AtomicSet(ChunkFlags, flags);
Update(SelfOrderNum, flags | AtomicGet(LogFlags));
}
}

void UpdateLocalLog(NPDisk::TStatusFlags flags) {
AtomicSet(LogFlags, flags);
if (flags & NKikimrBlobStorage::StatusIsValid && flags != AtomicGet(LogFlags)) {
AtomicSet(LogFlags, flags);
Update(SelfOrderNum, flags | AtomicGet(ChunkFlags));
}
}

void UpdateLocalFreeSpaceShare(ui64 freeSpaceShare24bit) {
Expand All @@ -64,6 +66,10 @@ namespace NKikimr {
return static_cast<NPDisk::TStatusFlags>(AtomicGet(AllVDiskFlags[SelfOrderNum]));
}

NPDisk::TStatusFlags GetLocalChunkStatusFlags() const {
return static_cast<NPDisk::TStatusFlags>(AtomicGet(ChunkFlags));
}

NPDisk::TStatusFlags GetLocalLogStatusFlags() const {
return static_cast<NPDisk::TStatusFlags>(AtomicGet(LogFlags));
}
Expand All @@ -84,6 +90,8 @@ namespace NKikimr {
private:
// Log space flags.
TAtomic LogFlags = 0;
// Chunk space flags.
TAtomic ChunkFlags = 0;
// Flag for every VDisk in the BlobStorage group
TAtomic AllVDiskFlags[MaxVDisksInGroup];
// Cached global flags (obtained by merging AllVDiskFlags)
Expand Down
2 changes: 1 addition & 1 deletion ydb/core/blobstorage/vdisk/common/vdisk_outofspace_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ namespace NKikimr {
UNIT_ASSERT_EQUAL(state.GetGlobalColor(), TSpaceColor::GREEN);

NPDisk::TStatusFlags flags = NKikimrBlobStorage::StatusIsValid;
state.UpdateLocal(flags);
state.UpdateLocalChunk(flags);
UNIT_ASSERT_EQUAL(state.GetGlobalColor(), TSpaceColor::GREEN);
UNIT_ASSERT_EQUAL(state.GetLocalStatusFlags(), flags);
UNIT_ASSERT_EQUAL(state.GetGlobalStatusFlags().Flags, flags);
Expand Down
3 changes: 1 addition & 2 deletions ydb/core/blobstorage/vdisk/skeleton/skeleton_oos_logic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -268,8 +268,7 @@ namespace NKikimr {
ESpaceColor TOutOfSpaceLogic::GetSpaceColor() const {
auto& oos = VCtx->GetOutOfSpaceState();
const ESpaceColor global = oos.GetGlobalColor();
const ESpaceColor log = oos.GetLocalLogColor();
return Max(log, global >= TSpaceColor::ORANGE ? global : oos.GetLocalColor());
return global >= TSpaceColor::ORANGE ? global : oos.GetLocalColor();
}

} // NKikimr
Expand Down
13 changes: 12 additions & 1 deletion ydb/core/blobstorage/vdisk/skeleton/skeleton_oos_tracker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ namespace NKikimr {

TotalChunks = msg->TotalChunks;
FreeChunks = msg->FreeChunks;
VCtx->OutOfSpaceState.UpdateLocal(msg->StatusFlags);
VCtx->OutOfSpaceState.UpdateLocalChunk(msg->StatusFlags);
VCtx->OutOfSpaceState.UpdateLocalLog(msg->LogStatusFlags);
VCtx->OutOfSpaceState.UpdateLocalFreeSpaceShare(ui64(1 << 24) * (1.0 - msg->Occupancy));
VCtx->OutOfSpaceState.UpdateLocalUsedChunks(msg->UsedChunks);
MonGroup.DskTotalBytes() = msg->TotalChunks * PDiskCtx->Dsk->ChunkSize;
Expand Down Expand Up @@ -126,6 +127,16 @@ namespace NKikimr {
TABLED() {str << "Local Disk State";}
TABLED() {str << StatusFlagToSpaceColor(flags);}
}
TABLER() {
auto flags = VCtx->OutOfSpaceState.GetLocalChunkStatusFlags();
TABLED() {str << "Local Disk State (chunks)";}
TABLED() {str << StatusFlagToSpaceColor(flags);}
}
TABLER() {
auto flags = VCtx->OutOfSpaceState.GetLocalLogStatusFlags();
TABLED() {str << "Local Disk State (log)";}
TABLED() {str << StatusFlagToSpaceColor(flags);}
}
TABLER() {
TABLED() {str << "Global BlobStorage Group State";}
TABLED() {str << StatusFlagToSpaceColor(oosStatus.Flags);}
Expand Down

0 comments on commit a421b6d

Please sign in to comment.