Skip to content

Commit a421b6d

Browse files
authored
Fix VDisk log and chunk status flags logic (#4409)
1 parent 9b4949f commit a421b6d

File tree

9 files changed

+47
-26
lines changed

9 files changed

+47
-26
lines changed

ydb/core/blobstorage/pdisk/blobstorage_pdisk.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1319,16 +1319,19 @@ struct TEvCheckSpaceResult : public TEventLocal<TEvCheckSpaceResult, TEvBlobStor
13191319
ui32 NumSlots; // number of VSlots over PDisk
13201320
double Occupancy = 0;
13211321
TString ErrorReason;
1322+
TStatusFlags LogStatusFlags;
13221323

13231324
TEvCheckSpaceResult(NKikimrProto::EReplyStatus status, TStatusFlags statusFlags, ui32 freeChunks,
1324-
ui32 totalChunks, ui32 usedChunks, ui32 numSlots, const TString &errorReason)
1325+
ui32 totalChunks, ui32 usedChunks, ui32 numSlots, const TString &errorReason,
1326+
TStatusFlags logStatusFlags = {})
13251327
: Status(status)
13261328
, StatusFlags(statusFlags)
13271329
, FreeChunks(freeChunks)
13281330
, TotalChunks(totalChunks)
13291331
, UsedChunks(usedChunks)
13301332
, NumSlots(numSlots)
13311333
, ErrorReason(errorReason)
1334+
, LogStatusFlags(logStatusFlags)
13321335
{}
13331336

13341337
TString ToString() const {
@@ -1340,6 +1343,7 @@ struct TEvCheckSpaceResult : public TEventLocal<TEvCheckSpaceResult, TEvBlobStor
13401343
str << " UsedChunks# " << UsedChunks;
13411344
str << " NumSlots# " << NumSlots;
13421345
str << " ErrorReason# \"" << ErrorReason << "\"";
1346+
str << " LogStatusFlags# " << StatusFlagsToString(LogStatusFlags);
13431347
str << "}";
13441348
return str.Str();
13451349
}

ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2026,7 +2026,8 @@ void TPDisk::CheckSpace(TCheckSpace &evCheckSpace) {
20262026
GetTotalChunks(evCheckSpace.Owner, evCheckSpace.OwnerGroupType),
20272027
GetUsedChunks(evCheckSpace.Owner, evCheckSpace.OwnerGroupType),
20282028
AtomicGet(TotalOwners),
2029-
TString());
2029+
TString(),
2030+
GetStatusFlags(OwnerSystem, evCheckSpace.OwnerGroupType));
20302031
result->Occupancy = occupancy;
20312032
ActorSystem->Send(evCheckSpace.Sender, result.release());
20322033
Mon.CheckSpace.CountResponse();

ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -946,8 +946,7 @@ void TPDisk::LogWrite(TLogWrite &evLog, TVector<ui32> &logChunksToCommit) {
946946
}
947947
Y_ABORT_UNLESS(CommonLogger->NextChunks.empty());
948948

949-
evLog.Result.Reset(new NPDisk::TEvLogResult(NKikimrProto::OK,
950-
GetStatusFlags(evLog.Owner, evLog.OwnerGroupType), nullptr));
949+
evLog.Result.Reset(new NPDisk::TEvLogResult(NKikimrProto::OK, GetStatusFlags(OwnerSystem, evLog.OwnerGroupType), nullptr));
951950
Y_ABORT_UNLESS(evLog.Result.Get());
952951
evLog.Result->Results.push_back(NPDisk::TEvLogResult::TRecord(evLog.Lsn, evLog.Cookie));
953952
}

ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_actions.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2758,14 +2758,7 @@ void TTestRedZoneSurvivability::TestFSM(const TActorContext &ctx) {
27582758
case 30:
27592759
{
27602760
//TEST_RESPONSE(EvLogResult, ERROR);
2761-
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid)
2762-
| ui32(NKikimrBlobStorage::StatusDiskSpaceCyan)
2763-
| ui32(NKikimrBlobStorage::StatusDiskSpaceRed)
2764-
| ui32(NKikimrBlobStorage::StatusDiskSpaceOrange)
2765-
| ui32(NKikimrBlobStorage::StatusDiskSpacePreOrange)
2766-
| ui32(NKikimrBlobStorage::StatusDiskSpaceLightOrange)
2767-
| ui32(NKikimrBlobStorage::StatusDiskSpaceYellowStop)
2768-
| ui32(NKikimrBlobStorage::StatusDiskSpaceLightYellowMove));
2761+
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid));
27692762
VERBOSE_COUT(" Sending TEvLog to delete a chunk");
27702763
NPDisk::TCommitRecord commitRecord;
27712764
TRcBuf commitData = TRcBuf(TString("hello"));
@@ -2790,7 +2783,10 @@ void TTestRedZoneSurvivability::TestFSM(const TActorContext &ctx) {
27902783
case 50:
27912784
{
27922785
TEST_RESPONSE(EvLogResult, OK);
2793-
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid));
2786+
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid)
2787+
| ui32(NKikimrBlobStorage::StatusDiskSpaceCyan)
2788+
| ui32(NKikimrBlobStorage::StatusDiskSpaceLightYellowMove)
2789+
| ui32(NKikimrBlobStorage::StatusDiskSpaceYellowStop));
27942790

27952791
VERBOSE_COUT(" Sending TEvLog to log 3 * ChunkSize bytes");
27962792
TRcBuf largeData = TRcBuf(PrepareData(ChunkSize * 3));
@@ -2800,7 +2796,10 @@ void TTestRedZoneSurvivability::TestFSM(const TActorContext &ctx) {
28002796
case 60:
28012797
{
28022798
TEST_RESPONSE(EvLogResult, OK);
2803-
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid));
2799+
TEST_PDISK_STATUS(ui32(NKikimrBlobStorage::StatusIsValid)
2800+
| ui32(NKikimrBlobStorage::StatusDiskSpaceCyan)
2801+
| ui32(NKikimrBlobStorage::StatusDiskSpaceLightYellowMove)
2802+
| ui32(NKikimrBlobStorage::StatusDiskSpaceYellowStop));
28042803

28052804
VERBOSE_COUT(" Sending TEvLog to cut log");
28062805
NPDisk::TCommitRecord commitRecord;

ydb/core/blobstorage/vdisk/common/vdisk_context.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ namespace NKikimr {
119119
case NKikimrProto::OK:
120120
if constexpr (T::EventType != TEvBlobStorage::EvLogResult) {
121121
// we have different semantics for TEvLogResult StatusFlags
122-
OutOfSpaceState.UpdateLocal(ev.StatusFlags);
122+
OutOfSpaceState.UpdateLocalChunk(ev.StatusFlags);
123123
} else {
124124
// update log space flags
125125
OutOfSpaceState.UpdateLocalLog(ev.StatusFlags);

ydb/core/blobstorage/vdisk/common/vdisk_outofspace.h

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,19 @@ namespace NKikimr {
3939
return StatusFlagToSpaceColor(GetLocalStatusFlags());
4040
}
4141

42-
ESpaceColor GetLocalLogColor() const {
43-
return StatusFlagToSpaceColor(GetLocalLogStatusFlags());
44-
}
45-
4642
// update state with flags received from local PDisk
47-
void UpdateLocal(NPDisk::TStatusFlags flags) {
48-
Update(SelfOrderNum, flags);
43+
void UpdateLocalChunk(NPDisk::TStatusFlags flags) {
44+
if (flags & NKikimrBlobStorage::StatusIsValid && flags != AtomicGet(ChunkFlags)) {
45+
AtomicSet(ChunkFlags, flags);
46+
Update(SelfOrderNum, flags | AtomicGet(LogFlags));
47+
}
4948
}
5049

5150
void UpdateLocalLog(NPDisk::TStatusFlags flags) {
52-
AtomicSet(LogFlags, flags);
51+
if (flags & NKikimrBlobStorage::StatusIsValid && flags != AtomicGet(LogFlags)) {
52+
AtomicSet(LogFlags, flags);
53+
Update(SelfOrderNum, flags | AtomicGet(ChunkFlags));
54+
}
5355
}
5456

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

69+
NPDisk::TStatusFlags GetLocalChunkStatusFlags() const {
70+
return static_cast<NPDisk::TStatusFlags>(AtomicGet(ChunkFlags));
71+
}
72+
6773
NPDisk::TStatusFlags GetLocalLogStatusFlags() const {
6874
return static_cast<NPDisk::TStatusFlags>(AtomicGet(LogFlags));
6975
}
@@ -84,6 +90,8 @@ namespace NKikimr {
8490
private:
8591
// Log space flags.
8692
TAtomic LogFlags = 0;
93+
// Chunk space flags.
94+
TAtomic ChunkFlags = 0;
8795
// Flag for every VDisk in the BlobStorage group
8896
TAtomic AllVDiskFlags[MaxVDisksInGroup];
8997
// Cached global flags (obtained by merging AllVDiskFlags)

ydb/core/blobstorage/vdisk/common/vdisk_outofspace_ut.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace NKikimr {
1818
UNIT_ASSERT_EQUAL(state.GetGlobalColor(), TSpaceColor::GREEN);
1919

2020
NPDisk::TStatusFlags flags = NKikimrBlobStorage::StatusIsValid;
21-
state.UpdateLocal(flags);
21+
state.UpdateLocalChunk(flags);
2222
UNIT_ASSERT_EQUAL(state.GetGlobalColor(), TSpaceColor::GREEN);
2323
UNIT_ASSERT_EQUAL(state.GetLocalStatusFlags(), flags);
2424
UNIT_ASSERT_EQUAL(state.GetGlobalStatusFlags().Flags, flags);

ydb/core/blobstorage/vdisk/skeleton/skeleton_oos_logic.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,7 @@ namespace NKikimr {
268268
ESpaceColor TOutOfSpaceLogic::GetSpaceColor() const {
269269
auto& oos = VCtx->GetOutOfSpaceState();
270270
const ESpaceColor global = oos.GetGlobalColor();
271-
const ESpaceColor log = oos.GetLocalLogColor();
272-
return Max(log, global >= TSpaceColor::ORANGE ? global : oos.GetLocalColor());
271+
return global >= TSpaceColor::ORANGE ? global : oos.GetLocalColor();
273272
}
274273

275274
} // NKikimr

ydb/core/blobstorage/vdisk/skeleton/skeleton_oos_tracker.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ namespace NKikimr {
8686

8787
TotalChunks = msg->TotalChunks;
8888
FreeChunks = msg->FreeChunks;
89-
VCtx->OutOfSpaceState.UpdateLocal(msg->StatusFlags);
89+
VCtx->OutOfSpaceState.UpdateLocalChunk(msg->StatusFlags);
90+
VCtx->OutOfSpaceState.UpdateLocalLog(msg->LogStatusFlags);
9091
VCtx->OutOfSpaceState.UpdateLocalFreeSpaceShare(ui64(1 << 24) * (1.0 - msg->Occupancy));
9192
VCtx->OutOfSpaceState.UpdateLocalUsedChunks(msg->UsedChunks);
9293
MonGroup.DskTotalBytes() = msg->TotalChunks * PDiskCtx->Dsk->ChunkSize;
@@ -126,6 +127,16 @@ namespace NKikimr {
126127
TABLED() {str << "Local Disk State";}
127128
TABLED() {str << StatusFlagToSpaceColor(flags);}
128129
}
130+
TABLER() {
131+
auto flags = VCtx->OutOfSpaceState.GetLocalChunkStatusFlags();
132+
TABLED() {str << "Local Disk State (chunks)";}
133+
TABLED() {str << StatusFlagToSpaceColor(flags);}
134+
}
135+
TABLER() {
136+
auto flags = VCtx->OutOfSpaceState.GetLocalLogStatusFlags();
137+
TABLED() {str << "Local Disk State (log)";}
138+
TABLED() {str << StatusFlagToSpaceColor(flags);}
139+
}
129140
TABLER() {
130141
TABLED() {str << "Global BlobStorage Group State";}
131142
TABLED() {str << StatusFlagToSpaceColor(oosStatus.Flags);}

0 commit comments

Comments
 (0)