|
7 | 7 |
|
8 | 8 | namespace NKikimr::NEvWrite { |
9 | 9 |
|
10 | | - TWritersController::TWritersController(const ui32 writesCount, const NActors::TActorIdentity& longTxActorId, const NLongTxService::TLongTxId& longTxId) |
| 10 | + TWritersController::TWritersController(const ui32 writesCount, const NActors::TActorIdentity& longTxActorId, const NLongTxService::TLongTxId& longTxId, const bool immediateWrite) |
11 | 11 | : WritesCount(writesCount) |
12 | 12 | , LongTxActorId(longTxActorId) |
| 13 | + , ImmediateWrite(immediateWrite) |
13 | 14 | , LongTxId(longTxId) |
14 | 15 | { |
15 | 16 | Y_ABORT_UNLESS(writesCount); |
@@ -39,28 +40,62 @@ namespace NKikimr::NEvWrite { |
39 | 40 | } |
40 | 41 | } |
41 | 42 |
|
42 | | - TShardWriter::TShardWriter(const ui64 shardId, const ui64 tableId, const TString& dedupId, const IShardInfo::TPtr& data, |
43 | | - const NWilson::TProfileSpan& parentSpan, TWritersController::TPtr externalController, const ui32 writePartIdx, const EModificationType mType) |
| 43 | + TShardWriter::TShardWriter(const ui64 shardId, const ui64 tableId, const ui64 schemaVersion, const TString& dedupId, const IShardInfo::TPtr& data, |
| 44 | + const NWilson::TProfileSpan& parentSpan, TWritersController::TPtr externalController, const ui32 writePartIdx, const EModificationType mType, const bool immediateWrite) |
44 | 45 | : ShardId(shardId) |
45 | 46 | , WritePartIdx(writePartIdx) |
46 | 47 | , TableId(tableId) |
| 48 | + , SchemaVersion(schemaVersion) |
47 | 49 | , DedupId(dedupId) |
48 | 50 | , DataForShard(data) |
49 | 51 | , ExternalController(externalController) |
50 | 52 | , LeaderPipeCache(MakePipePerNodeCacheID(false)) |
51 | 53 | , ActorSpan(parentSpan.BuildChildrenSpan("ShardWriter")) |
52 | 54 | , ModificationType(mType) |
| 55 | + , ImmediateWrite(immediateWrite) |
53 | 56 | { |
54 | 57 | } |
55 | 58 |
|
| 59 | + void TShardWriter::SendWriteRequest() { |
| 60 | + if (ImmediateWrite) { |
| 61 | + auto ev = MakeHolder<NEvents::TDataEvents::TEvWrite>(NKikimrDataEvents::TEvWrite::MODE_IMMEDIATE); |
| 62 | + DataForShard->Serialize(*ev, TableId, SchemaVersion); |
| 63 | + SendToTablet(std::move(ev)); |
| 64 | + } else { |
| 65 | + auto ev = MakeHolder<TEvColumnShard::TEvWrite>(SelfId(), ExternalController->GetLongTxId(), TableId, DedupId, "", WritePartIdx, ModificationType); |
| 66 | + DataForShard->Serialize(*ev); |
| 67 | + SendToTablet(std::move(ev)); |
| 68 | + } |
| 69 | + } |
| 70 | + |
56 | 71 | void TShardWriter::Bootstrap() { |
57 | | - auto ev = MakeHolder<TEvWrite>(SelfId(), ExternalController->GetLongTxId(), TableId, DedupId, "", WritePartIdx, ModificationType); |
58 | | - DataForShard->Serialize(*ev); |
59 | | - SendToTablet(std::move(ev)); |
| 72 | + SendWriteRequest(); |
60 | 73 | Become(&TShardWriter::StateMain); |
61 | 74 | } |
62 | 75 |
|
63 | | - void TShardWriter::Handle(TEvWriteResult::TPtr& ev) { |
| 76 | + void TShardWriter::Handle(NEvents::TDataEvents::TEvWriteResult::TPtr& ev) { |
| 77 | + const auto* msg = ev->Get(); |
| 78 | + Y_ABORT_UNLESS(msg->Record.GetOrigin() == ShardId); |
| 79 | + |
| 80 | + const auto ydbStatus = msg->GetStatus(); |
| 81 | + if (ydbStatus == NKikimrDataEvents::TEvWriteResult::STATUS_OVERLOADED) { |
| 82 | + if (RetryWriteRequest(true)) { |
| 83 | + return; |
| 84 | + } |
| 85 | + } |
| 86 | + |
| 87 | + auto gPassAway = PassAwayGuard(); |
| 88 | + if (ydbStatus != NKikimrDataEvents::TEvWriteResult::STATUS_COMPLETED) { |
| 89 | + ExternalController->OnFail(Ydb::StatusIds::INTERNAL_ERROR, |
| 90 | + TStringBuilder() << "Cannot write data into shard " << ShardId << " in longTx " << |
| 91 | + ExternalController->GetLongTxId().ToString()); |
| 92 | + return; |
| 93 | + } |
| 94 | + |
| 95 | + ExternalController->OnSuccess(ShardId, 0, WritePartIdx); |
| 96 | + } |
| 97 | + |
| 98 | + void TShardWriter::Handle(TEvColumnShard::TEvWriteResult::TPtr& ev) { |
64 | 99 | const auto* msg = ev->Get(); |
65 | 100 | Y_ABORT_UNLESS(msg->Record.GetOrigin() == ShardId); |
66 | 101 |
|
@@ -113,9 +148,7 @@ namespace NKikimr::NEvWrite { |
113 | 148 | Schedule(OverloadTimeout(), new TEvents::TEvWakeup()); |
114 | 149 | } else { |
115 | 150 | ++NumRetries; |
116 | | - auto ev = MakeHolder<TEvWrite>(SelfId(), ExternalController->GetLongTxId(), TableId, DedupId, "", WritePartIdx, ModificationType); |
117 | | - DataForShard->Serialize(*ev); |
118 | | - SendToTablet(std::move(ev)); |
| 151 | + SendWriteRequest(); |
119 | 152 | } |
120 | 153 | return true; |
121 | 154 | } |
|
0 commit comments