@@ -127,16 +127,16 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
127
127
const NKikimrConfig::TTableServiceConfig& tableServiceConfig,
128
128
NYql::NDq::IDqAsyncIoFactory::TPtr asyncIoFactory,
129
129
const TActorId& creator, const TIntrusivePtr<TUserRequestContext>& userRequestContext,
130
- const bool useEvWrite, ui32 statementResultIndex, const std::optional<TKqpFederatedQuerySetup>& federatedQuerySetup,
131
- const TGUCSettings::TPtr& GUCSettings, const TShardIdToTableInfoPtr& shardIdToTableInfo, const bool htapTx )
130
+ ui32 statementResultIndex, const std::optional<TKqpFederatedQuerySetup>& federatedQuerySetup,
131
+ const TGUCSettings::TPtr& GUCSettings, const TShardIdToTableInfoPtr& shardIdToTableInfo)
132
132
: TBase(std::move(request), database, userToken, counters, tableServiceConfig,
133
133
userRequestContext, statementResultIndex, TWilsonKqp::DataExecuter, " DataExecuter" , streamResult)
134
134
, AsyncIoFactory(std::move(asyncIoFactory))
135
- , UseEvWrite(useEvWrite)
135
+ , UseEvWriteForOltp(tableServiceConfig.GetEnableOltpSink())
136
+ , HtapTx(tableServiceConfig.GetEnableHtapTx())
136
137
, FederatedQuerySetup(federatedQuerySetup)
137
138
, GUCSettings(GUCSettings)
138
139
, ShardIdToTableInfo(shardIdToTableInfo)
139
- , HtapTx(htapTx)
140
140
{
141
141
Target = creator;
142
142
@@ -1487,7 +1487,7 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
1487
1487
auto & stage = stageInfo.Meta .GetStage (stageInfo.Id );
1488
1488
1489
1489
auto getShardTask = [&](ui64 shardId) -> TTask& {
1490
- YQL_ENSURE (!UseEvWrite );
1490
+ YQL_ENSURE (!UseEvWriteForOltp );
1491
1491
auto it = shardTasks.find (shardId);
1492
1492
if (it != shardTasks.end ()) {
1493
1493
return TasksGraph.GetTask (it->second );
@@ -1627,7 +1627,7 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
1627
1627
1628
1628
void ExecuteDatashardTransaction (ui64 shardId, NKikimrTxDataShard::TKqpTransaction& kqpTx, const bool isOlap)
1629
1629
{
1630
- YQL_ENSURE (!UseEvWrite );
1630
+ YQL_ENSURE (!UseEvWriteForOltp );
1631
1631
TShardState shardState;
1632
1632
shardState.State = ImmediateTx ? TShardState::EState::Executing : TShardState::EState::Preparing;
1633
1633
shardState.DatashardState .ConstructInPlace ();
@@ -2030,7 +2030,6 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
2030
2030
TDatashardTxs datashardTxs;
2031
2031
TEvWriteTxs evWriteTxs;
2032
2032
BuildDatashardTxs (datashardTasks, datashardTxs, evWriteTxs, topicTxs);
2033
- YQL_ENSURE (evWriteTxs.empty () || datashardTxs.empty ());
2034
2033
2035
2034
// Single-shard datashard transactions are always immediate
2036
2035
ImmediateTx = (datashardTxs.size () + evWriteTxs.size () + Request.TopicOperations .GetSize () + sourceScanPartitionsCount) <= 1
@@ -2261,7 +2260,7 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
2261
2260
YQL_ENSURE (!locksList.empty (), " unexpected empty locks list in DataShardLocks" );
2262
2261
NKikimrDataEvents::TKqpLocks* locks = nullptr ;
2263
2262
2264
- if (UseEvWrite ) {
2263
+ if (UseEvWriteForOltp || ShardIdToTableInfo-> Get (shardId). IsOlap ) {
2265
2264
if (auto it = evWriteTxs.find (shardId); it != evWriteTxs.end ()) {
2266
2265
locks = it->second ->MutableLocks ();
2267
2266
} else {
@@ -2333,15 +2332,17 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
2333
2332
// Note: currently persistent channels are never used
2334
2333
!HasPersistentChannels &&
2335
2334
// Can't use volatile transactions for EvWrite at current time
2336
- !UseEvWrite );
2335
+ evWriteTxs. empty () );
2337
2336
2338
2337
const bool useGenericReadSets = (
2339
2338
// Use generic readsets when feature is explicitly enabled
2340
2339
AppData ()->FeatureFlags .GetEnableDataShardGenericReadSets () ||
2341
2340
// Volatile transactions must always use generic readsets
2342
2341
VolatileTx ||
2343
2342
// Transactions with topics must always use generic readsets
2344
- !topicTxs.empty ());
2343
+ !topicTxs.empty () ||
2344
+ // HTAP transactions always use generic readsets
2345
+ !evWriteTxs.empty ());
2345
2346
2346
2347
if (!locksMap.empty () || VolatileTx ||
2347
2348
Request.TopicOperations .HasReadOperations () || Request.TopicOperations .HasWriteOperations ())
@@ -2463,12 +2464,23 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
2463
2464
std::sort (receivingShards.begin (), receivingShards.end ());
2464
2465
2465
2466
for (auto & [shardId, shardTx] : datashardTxs) {
2466
- AFL_ENSURE (!columnShardArbiter);
2467
2467
shardTx->MutableLocks ()->SetOp (NKikimrDataEvents::TKqpLocks::Commit);
2468
- *shardTx->MutableLocks ()->MutableSendingShards () = sendingShards;
2469
- *shardTx->MutableLocks ()->MutableReceivingShards () = receivingShards;
2470
- if (arbiter) {
2471
- shardTx->MutableLocks ()->SetArbiterShard (arbiter);
2468
+ if (columnShardArbiter) {
2469
+ shardTx->MutableLocks ()->AddSendingShards (*columnShardArbiter);
2470
+ shardTx->MutableLocks ()->AddReceivingShards (*columnShardArbiter);
2471
+ if (sendingShardsSet.contains (shardId)) {
2472
+ shardTx->MutableLocks ()->AddSendingShards (shardId);
2473
+ }
2474
+ if (receivingShardsSet.contains (shardId)) {
2475
+ shardTx->MutableLocks ()->AddReceivingShards (shardId);
2476
+ }
2477
+ AFL_ENSURE (!arbiter);
2478
+ } else {
2479
+ *shardTx->MutableLocks ()->MutableSendingShards () = sendingShards;
2480
+ *shardTx->MutableLocks ()->MutableReceivingShards () = receivingShards;
2481
+ if (arbiter) {
2482
+ shardTx->MutableLocks ()->SetArbiterShard (arbiter);
2483
+ }
2472
2484
}
2473
2485
}
2474
2486
@@ -2844,11 +2856,11 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
2844
2856
2845
2857
private:
2846
2858
NYql::NDq::IDqAsyncIoFactory::TPtr AsyncIoFactory;
2847
- bool UseEvWrite = false ;
2859
+ const bool UseEvWriteForOltp = false ;
2860
+ const bool HtapTx = false ;
2848
2861
const std::optional<TKqpFederatedQuerySetup> FederatedQuerySetup;
2849
2862
const TGUCSettings::TPtr GUCSettings;
2850
2863
TShardIdToTableInfoPtr ShardIdToTableInfo;
2851
- const bool HtapTx = false ;
2852
2864
2853
2865
bool HasExternalSources = false ;
2854
2866
bool SecretSnapshotRequired = false ;
@@ -2890,13 +2902,13 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
2890
2902
IActor* CreateKqpDataExecuter (IKqpGateway::TExecPhysicalRequest&& request, const TString& database, const TIntrusiveConstPtr<NACLib::TUserToken>& userToken,
2891
2903
TKqpRequestCounters::TPtr counters, bool streamResult, const NKikimrConfig::TTableServiceConfig& tableServiceConfig,
2892
2904
NYql::NDq::IDqAsyncIoFactory::TPtr asyncIoFactory, const TActorId& creator,
2893
- const TIntrusivePtr<TUserRequestContext>& userRequestContext, const bool useEvWrite, ui32 statementResultIndex,
2905
+ const TIntrusivePtr<TUserRequestContext>& userRequestContext, ui32 statementResultIndex,
2894
2906
const std::optional<TKqpFederatedQuerySetup>& federatedQuerySetup, const TGUCSettings::TPtr& GUCSettings,
2895
- const TShardIdToTableInfoPtr& shardIdToTableInfo, const bool htapTx )
2907
+ const TShardIdToTableInfoPtr& shardIdToTableInfo)
2896
2908
{
2897
2909
return new TKqpDataExecuter (std::move (request), database, userToken, counters, streamResult, tableServiceConfig,
2898
2910
std::move (asyncIoFactory), creator, userRequestContext,
2899
- useEvWrite, statementResultIndex, federatedQuerySetup, GUCSettings, shardIdToTableInfo, htapTx );
2911
+ statementResultIndex, federatedQuerySetup, GUCSettings, shardIdToTableInfo);
2900
2912
}
2901
2913
2902
2914
} // namespace NKqp
0 commit comments