|
| 1 | +#include "part_actor.h" |
| 2 | + |
| 3 | +#include <cloud/blockstore/libs/kikimr/helpers.h> |
| 4 | +#include <cloud/blockstore/libs/service/request_helpers.h> |
| 5 | +#include <cloud/blockstore/libs/storage/core/public.h> |
| 6 | + |
| 7 | +#include <cloud/storage/core/libs/common/alloc.h> |
| 8 | +#include <cloud/storage/core/libs/tablet/blob_id.h> |
| 9 | + |
| 10 | +#include <contrib/ydb/library/actors/core/actor_bootstrapped.h> |
| 11 | +#include <contrib/ydb/library/actors/core/hfunc.h> |
| 12 | + |
| 13 | +namespace NCloud::NBlockStore::NStorage::NPartition { |
| 14 | + |
| 15 | +using namespace NActors; |
| 16 | +using namespace NKikimr; |
| 17 | +using namespace NKikimr::NTabletFlatExecutor; |
| 18 | + |
| 19 | +//////////////////////////////////////////////////////////////////////////////// |
| 20 | + |
| 21 | +void TPartitionActor::EnqueueDeleteStalledUnconfirmedBlobsIfNeeded( |
| 22 | + const TActorContext& ctx) |
| 23 | +{ |
| 24 | + if (State->GetStalledUnconfirmedBlobsState().Status != |
| 25 | + EOperationStatus::Idle) |
| 26 | + { |
| 27 | + // already enqueued |
| 28 | + return; |
| 29 | + } |
| 30 | + |
| 31 | + if (State->GetStalledUnconfirmedBlobs().empty()) { |
| 32 | + // not ready |
| 33 | + return; |
| 34 | + } |
| 35 | + |
| 36 | + State->GetStalledUnconfirmedBlobsState().SetStatus( |
| 37 | + EOperationStatus::Enqueued); |
| 38 | + |
| 39 | + auto request = std::make_unique< |
| 40 | + TEvPartitionPrivate::TEvDeleteStalledUnconfirmedBlobsRequest>( |
| 41 | + MakeIntrusive<TCallContext>(CreateRequestId())); |
| 42 | + |
| 43 | + LOG_DEBUG( |
| 44 | + ctx, |
| 45 | + TBlockStoreComponents::PARTITION, |
| 46 | + "%s DeleteStalledUnconfirmedBlobs request sent: %lu", |
| 47 | + LogTitle.GetWithTime().c_str(), |
| 48 | + request->CallContext->RequestId); |
| 49 | + |
| 50 | + NCloud::Send(ctx, SelfId(), std::move(request)); |
| 51 | +} |
| 52 | + |
| 53 | +void TPartitionActor::HandleDeleteStalledUnconfirmedBlobs( |
| 54 | + const TEvPartitionPrivate::TEvDeleteStalledUnconfirmedBlobsRequest::TPtr& |
| 55 | + ev, |
| 56 | + const TActorContext& ctx) |
| 57 | +{ |
| 58 | + auto* msg = ev->Get(); |
| 59 | + |
| 60 | + auto requestInfo = |
| 61 | + CreateRequestInfo(ev->Sender, ev->Cookie, msg->CallContext); |
| 62 | + |
| 63 | + TRequestScope timer(*requestInfo); |
| 64 | + |
| 65 | + LWTRACK( |
| 66 | + RequestReceived_Partition, |
| 67 | + requestInfo->CallContext->LWOrbit, |
| 68 | + "DeleteStalledUnconfirmedBlobs", |
| 69 | + requestInfo->CallContext->RequestId); |
| 70 | + |
| 71 | + State->GetStalledUnconfirmedBlobsState().SetStatus( |
| 72 | + EOperationStatus::Started); |
| 73 | + |
| 74 | + AddTransaction<TEvPartitionPrivate::TDeleteStalledUnconfirmedBlobsMethod>( |
| 75 | + *requestInfo); |
| 76 | + |
| 77 | + ExecuteTx(ctx, CreateTx<TDeleteStalledUnconfirmedBlobs>(requestInfo)); |
| 78 | +} |
| 79 | + |
| 80 | +bool TPartitionActor::PrepareDeleteStalledUnconfirmedBlobs( |
| 81 | + const TActorContext& ctx, |
| 82 | + TTransactionContext& tx, |
| 83 | + TTxPartition::TDeleteStalledUnconfirmedBlobs& args) |
| 84 | +{ |
| 85 | + Y_UNUSED(ctx); |
| 86 | + Y_UNUSED(tx); |
| 87 | + Y_UNUSED(args); |
| 88 | + |
| 89 | + return true; |
| 90 | +} |
| 91 | + |
| 92 | +void TPartitionActor::ExecuteDeleteStalledUnconfirmedBlobs( |
| 93 | + const TActorContext& ctx, |
| 94 | + TTransactionContext& tx, |
| 95 | + TTxPartition::TDeleteStalledUnconfirmedBlobs& args) |
| 96 | +{ |
| 97 | + Y_UNUSED(ctx); |
| 98 | + Y_UNUSED(args); |
| 99 | + |
| 100 | + TPartitionDatabase db(tx.DB); |
| 101 | + |
| 102 | + const auto& stalledBlobs = State->GetStalledUnconfirmedBlobs(); |
| 103 | + |
| 104 | + for (const auto& [commitId, blobs]: stalledBlobs) { |
| 105 | + for (const auto& blob: blobs) { |
| 106 | + auto blobId = MakePartialBlobId(commitId, blob.UniqueId); |
| 107 | + db.DeleteUnconfirmedBlob(blobId); |
| 108 | + } |
| 109 | + |
| 110 | + // Release barriers for this commitId |
| 111 | + State->GetGarbageQueue().ReleaseBarrier(commitId); |
| 112 | + State->GetCommitQueue().ReleaseBarrier(commitId); |
| 113 | + } |
| 114 | + |
| 115 | + // Clear the stalled blobs structure |
| 116 | + State->ClearStalledUnconfirmedBlobs(); |
| 117 | +} |
| 118 | + |
| 119 | +void TPartitionActor::CompleteDeleteStalledUnconfirmedBlobs( |
| 120 | + const TActorContext& ctx, |
| 121 | + TTxPartition::TDeleteStalledUnconfirmedBlobs& args) |
| 122 | +{ |
| 123 | + TRequestScope timer(*args.RequestInfo); |
| 124 | + |
| 125 | + State->GetStalledUnconfirmedBlobsState().SetStatus(EOperationStatus::Idle); |
| 126 | + |
| 127 | + RemoveTransaction(*args.RequestInfo); |
| 128 | + |
| 129 | + UpdateCPUUsageStat(ctx.Now(), args.RequestInfo->GetExecCycles()); |
| 130 | + auto time = |
| 131 | + CyclesToDurationSafe(args.RequestInfo->GetTotalCycles()).MicroSeconds(); |
| 132 | + PartCounters->RequestCounters.DeleteStalledUnconfirmedBlobs.AddRequest( |
| 133 | + time); |
| 134 | + |
| 135 | + // Barriers were released in Execute, so process commit queue |
| 136 | + ProcessCommitQueue(ctx); |
| 137 | +} |
| 138 | + |
| 139 | +} // namespace NCloud::NBlockStore::NStorage::NPartition |
0 commit comments