Skip to content

Commit e3bc3bd

Browse files
Implement shred PDisk, #12483 (#14598)
1 parent d76499b commit e3bc3bd

17 files changed

+621
-159
lines changed

ydb/core/base/blobstorage.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,7 @@ struct TEvBlobStorage {
756756
EvListChunksResult,
757757
EvHugeQueryForbiddenChunks,
758758
EvHugeForbiddenChunks,
759+
EvContinueShred,
759760

760761
EvYardInitResult = EvPut + 9 * 512, /// 268 636 672
761762
EvLogResult,

ydb/core/blobstorage/pdisk/blobstorage_pdisk.h

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1673,30 +1673,20 @@ struct TEvShredVDiskResult : TEventLocal<TEvShredVDiskResult, TEvBlobStorage::Ev
16731673
}
16741674
};
16751675

1676-
// VDisk sends this message to PDisk to mark a single chunk as dirty
1677-
// No response is expected from PDisk as the operation has very high priority and always succeeds
1678-
struct TEvMarkDirty : TEventLocal<TEvMarkDirty, TEvBlobStorage::EvMarkDirty> {
1679-
TOwner Owner;
1680-
TOwnerRound OwnerRound;
1681-
TStackVec<TChunkIdx, 1> ChunksToMarkDirty;
1682-
1683-
TEvMarkDirty(TOwner owner, TOwnerRound ownerRound, TStackVec<TChunkIdx, 1> chunksToMarkDirty)
1684-
: Owner(owner)
1685-
, OwnerRound(ownerRound)
1686-
, ChunksToMarkDirty(chunksToMarkDirty)
1676+
// PDisk sends this message to itself
1677+
struct TEvContinueShred : TEventLocal<TEvContinueShred, TEvBlobStorage::EvContinueShred> {
1678+
TEvContinueShred()
16871679
{}
16881680

16891681
TString ToString() const {
16901682
TStringStream str;
1691-
str << "{EvMarkDirty OwnerId# " << (ui32)Owner
1692-
<< " OwnerRound# " << OwnerRound
1693-
<< " ChunkToMarkDirty# ";
1694-
FormatList(str, ChunksToMarkDirty);
1683+
str << "{EvContinueShred ";
16951684
str << "}";
16961685
return str.Str();
16971686
}
16981687
};
16991688

1689+
17001690
/*
17011691
* One common context in the PDisk's world.
17021692
* It should only contain things that are used in each of the PDisk's component.

ydb/core/blobstorage/pdisk/blobstorage_pdisk_actor.cpp

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -684,12 +684,11 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
684684
Y_UNUSED(ev);
685685
}
686686

687-
void InitHandle(NPDisk::TEvMarkDirty::TPtr &ev) {
688-
// Just ignore the event, can't mark dirty in this state.
687+
void InitHandle(NPDisk::TEvContinueShred::TPtr &ev) {
688+
// Just ignore the event, can't shred in this state.
689689
Y_UNUSED(ev);
690690
}
691691

692-
693692
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
694693
// Error state
695694

@@ -725,6 +724,10 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
725724
PDisk->Mon.WriteLog.CountResponse();
726725
}
727726

727+
void ErrorHandle(NPDisk::TEvLogResult::TPtr &ev) {
728+
Y_UNUSED(ev);
729+
}
730+
728731
void ErrorHandle(NPDisk::TEvMultiLog::TPtr &ev) {
729732
const NPDisk::TEvMultiLog &evMultiLog = *ev->Get();
730733
TStringStream str;
@@ -860,8 +863,8 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
860863
Y_UNUSED(ev);
861864
}
862865

863-
void ErrorHandle(NPDisk::TEvMarkDirty::TPtr &ev) {
864-
// Just ignore the event, can't mark dirty in this state.
866+
void ErrorHandle(NPDisk::TEvContinueShred::TPtr &ev) {
867+
// Just ignore the event, can't shred in this state.
865868
Y_UNUSED(ev);
866869
}
867870

@@ -878,24 +881,29 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
878881
PDisk->InputRequest(request);
879882
}
880883

881-
void CheckBurst(bool isSensitive, double burstMs) {
882-
Y_UNUSED(isSensitive);
883-
Y_UNUSED(burstMs);
884-
}
885-
886884
void Handle(NPDisk::TEvLog::TPtr &ev) {
887885
double burstMs;
888886
TLogWrite* request = PDisk->ReqCreator.CreateLogWrite(*ev->Get(), ev->Sender, burstMs, std::move(ev->TraceId));
889-
CheckBurst(request->IsSensitive, burstMs);
890887
request->Orbit = std::move(ev->Get()->Orbit);
891888
PDisk->InputRequest(request);
892889
}
893890

891+
void Handle(NPDisk::TEvLogResult::TPtr &ev) {
892+
if (PDisk->ShredLogPaddingInFlight) {
893+
PDisk->ShredLogPaddingInFlight--;
894+
}
895+
if (PDisk->ContinueShredsInFlight == 0) {
896+
TEvContinueShred evCont;
897+
TContinueShred* request = PDisk->ReqCreator.CreateFromEv<TContinueShred>(evCont, ev->Sender);
898+
PDisk->ContinueShredsInFlight++;
899+
PDisk->InputRequest(request);
900+
}
901+
}
902+
894903
void Handle(NPDisk::TEvMultiLog::TPtr &ev) {
895904
for (auto &[log, traceId] : ev->Get()->Logs) {
896905
double burstMs;
897906
TLogWrite* request = PDisk->ReqCreator.CreateLogWrite(*log, ev->Sender, burstMs, std::move(traceId));
898-
CheckBurst(request->IsSensitive, burstMs);
899907
request->Orbit = std::move(log->Orbit);
900908
PDisk->InputRequest(request);
901909
}
@@ -905,23 +913,20 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
905913
P_LOG(PRI_DEBUG, BSY01, "Got TEvReadLog", (Event, ev->Get()->ToString()));
906914
double burstMs;
907915
auto* request = PDisk->ReqCreator.CreateFromEvPtr<TLogRead>(ev, &burstMs);
908-
CheckBurst(request->IsSensitive, burstMs);
909916
PDisk->InputRequest(request);
910917
}
911918

912919
void Handle(NPDisk::TEvChunkWrite::TPtr &ev) {
913920
double burstMs;
914921
TChunkWrite* request = PDisk->ReqCreator.CreateChunkWrite(*ev->Get(), ev->Sender, burstMs, std::move(ev->TraceId));
915922
request->Orbit = std::move(ev->Get()->Orbit);
916-
CheckBurst(request->IsSensitive, burstMs);
917923
PDisk->InputRequest(request);
918924
}
919925

920926
void Handle(NPDisk::TEvChunkRead::TPtr &ev) {
921927
double burstMs;
922928
TChunkRead* request = PDisk->ReqCreator.CreateChunkRead(*ev->Get(), ev->Sender, burstMs, std::move(ev->TraceId));
923929
request->DebugInfoGenerator = PDisk->DebugInfoGenerator;
924-
CheckBurst(request->IsSensitive, burstMs);
925930
PDisk->InputRequest(request);
926931
}
927932

@@ -1078,8 +1083,8 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
10781083
PDisk->InputRequest(request);
10791084
}
10801085

1081-
void Handle(NPDisk::TEvMarkDirty::TPtr &ev) {
1082-
auto* request = PDisk->ReqCreator.CreateFromEv<TMarkDirty>(*ev->Get(), ev->Sender);
1086+
void Handle(NPDisk::TEvContinueShred::TPtr &ev) {
1087+
auto* request = PDisk->ReqCreator.CreateFromEv<TContinueShred>(*ev->Get(), ev->Sender);
10831088
PDisk->InputRequest(request);
10841089
}
10851090

@@ -1411,6 +1416,7 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
14111416
hFunc(NPDisk::TEvYardInit, InitHandle);
14121417
hFunc(NPDisk::TEvCheckSpace, ErrorHandle);
14131418
hFunc(NPDisk::TEvLog, ErrorHandle);
1419+
hFunc(NPDisk::TEvLogResult, ErrorHandle);
14141420
hFunc(NPDisk::TEvMultiLog, ErrorHandle);
14151421
hFunc(NPDisk::TEvReadLog, ErrorHandle);
14161422
hFunc(NPDisk::TEvChunkWrite, ErrorHandle);
@@ -1440,7 +1446,7 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
14401446
hFunc(NPDisk::TEvShredPDisk, InitHandle);
14411447
hFunc(NPDisk::TEvPreShredCompactVDiskResult, InitHandle);
14421448
hFunc(NPDisk::TEvShredVDiskResult, InitHandle);
1443-
hFunc(NPDisk::TEvMarkDirty, InitHandle);
1449+
hFunc(NPDisk::TEvContinueShred, InitHandle);
14441450

14451451
hFunc(TEvReadMetadata, Handle);
14461452
hFunc(TEvWriteMetadata, Handle);
@@ -1450,6 +1456,7 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
14501456
hFunc(NPDisk::TEvYardInit, Handle);
14511457
hFunc(NPDisk::TEvCheckSpace, Handle);
14521458
hFunc(NPDisk::TEvLog, Handle);
1459+
hFunc(NPDisk::TEvLogResult, Handle);
14531460
hFunc(NPDisk::TEvMultiLog, Handle);
14541461
hFunc(NPDisk::TEvReadLog, Handle);
14551462
hFunc(NPDisk::TEvChunkWrite, Handle);
@@ -1471,7 +1478,7 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
14711478
hFunc(NPDisk::TEvShredPDisk, Handle);
14721479
hFunc(NPDisk::TEvPreShredCompactVDiskResult, Handle);
14731480
hFunc(NPDisk::TEvShredVDiskResult, Handle);
1474-
hFunc(NPDisk::TEvMarkDirty, Handle);
1481+
hFunc(NPDisk::TEvContinueShred, Handle);
14751482

14761483
cFunc(NActors::TEvents::TSystem::PoisonPill, HandlePoison);
14771484
hFunc(NMon::TEvHttpInfo, Handle);
@@ -1487,6 +1494,7 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
14871494
hFunc(NPDisk::TEvYardInit, ErrorHandle);
14881495
hFunc(NPDisk::TEvCheckSpace, ErrorHandle);
14891496
hFunc(NPDisk::TEvLog, ErrorHandle);
1497+
hFunc(NPDisk::TEvLogResult, ErrorHandle);
14901498
hFunc(NPDisk::TEvMultiLog, ErrorHandle);
14911499
hFunc(NPDisk::TEvReadLog, ErrorHandle);
14921500
hFunc(NPDisk::TEvChunkWrite, ErrorHandle);
@@ -1505,7 +1513,7 @@ class TPDiskActor : public TActorBootstrapped<TPDiskActor> {
15051513
hFunc(NPDisk::TEvShredPDisk, ErrorHandle);
15061514
hFunc(NPDisk::TEvPreShredCompactVDiskResult, ErrorHandle);
15071515
hFunc(NPDisk::TEvShredVDiskResult, ErrorHandle);
1508-
hFunc(NPDisk::TEvMarkDirty, ErrorHandle);
1516+
hFunc(NPDisk::TEvContinueShred, ErrorHandle);
15091517

15101518
cFunc(NActors::TEvents::TSystem::PoisonPill, HandlePoison);
15111519
hFunc(NMon::TEvHttpInfo, Handle);

ydb/core/blobstorage/pdisk/blobstorage_pdisk_crypto.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,11 @@ class TPDiskStreamCypher {
7474

7575
TPDiskStreamCypher(bool encryption)
7676
: Impl()
77+
#ifdef DISABLE_PDISK_ENCRYPTION
78+
, EnableEncryption(false && encryption)
79+
#else
7780
, EnableEncryption(encryption)
81+
#endif
7882
{}
7983

8084
void SetKey(const ui64 &key) {

ydb/core/blobstorage/pdisk/blobstorage_pdisk_data.h

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,16 +277,24 @@ struct TCommitRecordFooter {
277277
ui64 FirstLsnToKeep;
278278
ui32 CommitCount;
279279
ui32 DeleteCount;
280+
#ifdef ENABLE_PDISK_SHRED
281+
ui32 DirtyCount;
282+
#endif
280283
bool IsStartingPoint;
281284

282-
TCommitRecordFooter(ui64 userDataSize, ui64 firstLsnToKeep, ui32 commitCount, ui32 deleteCount,
285+
TCommitRecordFooter(ui64 userDataSize, ui64 firstLsnToKeep, ui32 commitCount, ui32 deleteCount, ui32 dirtyCount,
283286
bool isStartingPoint)
284287
: UserDataSize(userDataSize)
285288
, FirstLsnToKeep(firstLsnToKeep)
286289
, CommitCount(commitCount)
287290
, DeleteCount(deleteCount)
291+
#ifdef ENABLE_PDISK_SHRED
292+
, DirtyCount(dirtyCount)
293+
#endif
288294
, IsStartingPoint(isStartingPoint)
289-
{}
295+
{
296+
Y_UNUSED(dirtyCount);
297+
}
290298
};
291299

292300
enum ENonce {
@@ -449,12 +457,36 @@ struct TMetadataFormatSector {
449457
#pragma pack(pop)
450458

451459
struct TChunkInfo {
452-
ui8 Version;
460+
ui8 VersionDirty; // 5 bit of version info, 3 bit of encoded dirtyness info
453461
TOwner OwnerId;
454462
ui64 Nonce;
455463

464+
ui32 GetVersion() const {
465+
return VersionDirty & 0x1f;
466+
}
467+
468+
bool IsDirty() const {
469+
return VersionDirty & 0x80;
470+
}
471+
472+
bool IsCurrentShredGeneration() const {
473+
return VersionDirty & 0x40;
474+
}
475+
476+
bool IsGenerationBitSet() const {
477+
return VersionDirty & 0x20;
478+
}
479+
480+
void SetDirty(bool isDirty, bool isCurrentShredGeneration) {
481+
VersionDirty = (VersionDirty & 0x3f) | (isDirty ? 0x80 : 0) | (isCurrentShredGeneration ? 0x40 : 0);
482+
}
483+
484+
void SetGenerationBit(bool isSet) {
485+
VersionDirty = (VersionDirty & ~0x20) | (isSet ? 0x20 : 0);
486+
}
487+
456488
TChunkInfo()
457-
: Version(PDISK_DATA_VERSION)
489+
: VersionDirty(PDISK_DATA_VERSION)
458490
, OwnerId(0)
459491
, Nonce(0)
460492
{}

0 commit comments

Comments
 (0)