rpc_parameters_serialization.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  1. #include "rpc_parameters_serialization.h"
  2. #include <yt/cpp/mapreduce/common/helpers.h>
  3. #include <yt/cpp/mapreduce/interface/config.h>
  4. #include <yt/cpp/mapreduce/interface/client_method_options.h>
  5. #include <yt/cpp/mapreduce/interface/fluent.h>
  6. #include <yt/cpp/mapreduce/interface/operation.h>
  7. #include <yt/cpp/mapreduce/interface/serialize.h>
  8. #include <library/cpp/yson/node/node.h>
  9. #include <library/cpp/yson/node/node_io.h>
  10. #include <library/cpp/yson/node/node_builder.h>
  11. #include <util/generic/guid.h>
  12. #include <util/string/cast.h>
  13. namespace NYT::NDetail::NRawClient {
  14. using ::ToString;
  15. ////////////////////////////////////////////////////////////////////////////////
  16. static void SetTransactionIdParam(TNode* node, const TTransactionId& transactionId)
  17. {
  18. if (transactionId != TTransactionId()) {
  19. (*node)["transaction_id"] = GetGuidAsString(transactionId);
  20. }
  21. }
  22. static void SetOperationIdParam(TNode* node, const TOperationId& operationId)
  23. {
  24. (*node)["operation_id"] = GetGuidAsString(operationId);
  25. }
  26. static void SetAliasParam(TNode* node, const TString& alias)
  27. {
  28. (*node)["operation_alias"] = alias;
  29. }
  30. static void SetPathParam(TNode* node, const TString& pathPrefix, const TYPath& path)
  31. {
  32. TYPath updatedPath = AddPathPrefix(path, pathPrefix);
  33. // Translate "//" to "/"
  34. // Translate "//some/constom/prefix/from/config/" to "//some/constom/prefix/from/config"
  35. if (path.empty() && updatedPath.EndsWith('/')) {
  36. updatedPath.pop_back();
  37. }
  38. (*node)["path"] = std::move(updatedPath);
  39. }
  40. static TNode SerializeAttributeFilter(const TAttributeFilter& attributeFilter)
  41. {
  42. TNode result = TNode::CreateList();
  43. for (const auto& attribute : attributeFilter.Attributes_) {
  44. result.Add(attribute);
  45. }
  46. return result;
  47. }
  48. static TNode SerializeAttributeFilter(const TOperationAttributeFilter& attributeFilter)
  49. {
  50. TNode result = TNode::CreateList();
  51. for (const auto& attribute : attributeFilter.Attributes_) {
  52. result.Add(ToString(attribute));
  53. }
  54. return result;
  55. }
  56. template <typename TOptions>
  57. static void SetFirstLastTabletIndex(TNode* node, const TOptions& options)
  58. {
  59. if (options.FirstTabletIndex_) {
  60. (*node)["first_tablet_index"] = *options.FirstTabletIndex_;
  61. }
  62. if (options.LastTabletIndex_) {
  63. (*node)["last_tablet_index"] = *options.LastTabletIndex_;
  64. }
  65. }
  66. template <typename T>
  67. void SerializeMasterReadOptions(TNode* node, const TMasterReadOptions<T>& options)
  68. {
  69. if (options.ReadFrom_) {
  70. (*node)["read_from"] = ToString(*options.ReadFrom_);
  71. }
  72. }
  73. ////////////////////////////////////////////////////////////////////////////////
  74. TNode SerializeParamsForCreate(
  75. const TTransactionId& transactionId,
  76. const TString& pathPrefix,
  77. const TYPath& path,
  78. ENodeType type,
  79. const TCreateOptions& options)
  80. {
  81. TNode result;
  82. SetTransactionIdParam(&result, transactionId);
  83. SetPathParam(&result, pathPrefix, path);
  84. result["recursive"] = options.Recursive_;
  85. result["type"] = ToString(type);
  86. result["ignore_existing"] = options.IgnoreExisting_;
  87. result["force"] = options.Force_;
  88. if (options.Attributes_) {
  89. result["attributes"] = *options.Attributes_;
  90. }
  91. return result;
  92. }
  93. TNode SerializeParamsForRemove(
  94. const TTransactionId& transactionId,
  95. const TString& pathPrefix,
  96. const TYPath& path,
  97. const TRemoveOptions& options)
  98. {
  99. TNode result;
  100. SetTransactionIdParam(&result, transactionId);
  101. SetPathParam(&result, pathPrefix, path);
  102. result["recursive"] = options.Recursive_;
  103. result["force"] = options.Force_;
  104. return result;
  105. }
  106. TNode SerializeParamsForExists(
  107. const TTransactionId& transactionId,
  108. const TString& pathPrefix,
  109. const TYPath& path,
  110. const TExistsOptions& options)
  111. {
  112. TNode result;
  113. SetTransactionIdParam(&result, transactionId);
  114. SetPathParam(&result, pathPrefix, path);
  115. SerializeMasterReadOptions(&result, options);
  116. return result;
  117. }
  118. TNode SerializeParamsForGet(
  119. const TTransactionId& transactionId,
  120. const TString& pathPrefix,
  121. const TYPath& path,
  122. const TGetOptions& options)
  123. {
  124. TNode result;
  125. SetTransactionIdParam(&result, transactionId);
  126. SetPathParam(&result, pathPrefix, path);
  127. SerializeMasterReadOptions(&result, options);
  128. if (options.AttributeFilter_) {
  129. result["attributes"] = SerializeAttributeFilter(*options.AttributeFilter_);
  130. }
  131. if (options.MaxSize_) {
  132. result["max_size"] = *options.MaxSize_;
  133. }
  134. return result;
  135. }
  136. TNode SerializeParamsForSet(
  137. const TTransactionId& transactionId,
  138. const TString& pathPrefix,
  139. const TYPath& path,
  140. const TSetOptions& options)
  141. {
  142. TNode result;
  143. SetTransactionIdParam(&result, transactionId);
  144. SetPathParam(&result, pathPrefix, path);
  145. result["recursive"] = options.Recursive_;
  146. if (options.Force_) {
  147. result["force"] = *options.Force_;
  148. }
  149. return result;
  150. }
  151. TNode SerializeParamsForMultisetAttributes(
  152. const TTransactionId& transactionId,
  153. const TString& pathPrefix,
  154. const TYPath& path,
  155. const TMultisetAttributesOptions& options)
  156. {
  157. TNode result;
  158. SetTransactionIdParam(&result, transactionId);
  159. SetPathParam(&result, pathPrefix, path);
  160. if (options.Force_) {
  161. result["force"] = *options.Force_;
  162. }
  163. return result;
  164. }
  165. TNode SerializeParamsForList(
  166. const TTransactionId& transactionId,
  167. const TString& pathPrefix,
  168. const TYPath& path,
  169. const TListOptions& options)
  170. {
  171. TNode result;
  172. SetTransactionIdParam(&result, transactionId);
  173. SetPathParam(&result, pathPrefix, path);
  174. SerializeMasterReadOptions(&result, options);
  175. if (options.MaxSize_) {
  176. result["max_size"] = *options.MaxSize_;
  177. }
  178. if (options.AttributeFilter_) {
  179. result["attributes"] = SerializeAttributeFilter(*options.AttributeFilter_);
  180. }
  181. return result;
  182. }
  183. TNode SerializeParamsForCopy(
  184. const TTransactionId& transactionId,
  185. const TString& pathPrefix,
  186. const TYPath& sourcePath,
  187. const TYPath& destinationPath,
  188. const TCopyOptions& options)
  189. {
  190. TNode result;
  191. SetTransactionIdParam(&result, transactionId);
  192. result["source_path"] = AddPathPrefix(sourcePath, pathPrefix);
  193. result["destination_path"] = AddPathPrefix(destinationPath, pathPrefix);
  194. result["recursive"] = options.Recursive_;
  195. result["force"] = options.Force_;
  196. result["preserve_account"] = options.PreserveAccount_;
  197. if (options.PreserveExpirationTime_) {
  198. result["preserve_expiration_time"] = *options.PreserveExpirationTime_;
  199. }
  200. return result;
  201. }
  202. TNode SerializeParamsForMove(
  203. const TTransactionId& transactionId,
  204. const TString& pathPrefix,
  205. const TYPath& sourcePath,
  206. const TYPath& destinationPath,
  207. const TMoveOptions& options)
  208. {
  209. TNode result;
  210. SetTransactionIdParam(&result, transactionId);
  211. result["source_path"] = AddPathPrefix(sourcePath, pathPrefix);
  212. result["destination_path"] = AddPathPrefix(destinationPath, pathPrefix);
  213. result["recursive"] = options.Recursive_;
  214. result["force"] = options.Force_;
  215. result["preserve_account"] = options.PreserveAccount_;
  216. if (options.PreserveExpirationTime_) {
  217. result["preserve_expiration_time"] = *options.PreserveExpirationTime_;
  218. }
  219. return result;
  220. }
  221. TNode SerializeParamsForLink(
  222. const TTransactionId& transactionId,
  223. const TString& pathPrefix,
  224. const TYPath& targetPath,
  225. const TYPath& linkPath,
  226. const TLinkOptions& options)
  227. {
  228. TNode result;
  229. SetTransactionIdParam(&result, transactionId);
  230. result["target_path"] = AddPathPrefix(targetPath, pathPrefix);
  231. result["link_path"] = AddPathPrefix(linkPath, pathPrefix);
  232. result["recursive"] = options.Recursive_;
  233. result["ignore_existing"] = options.IgnoreExisting_;
  234. result["force"] = options.Force_;
  235. if (options.Attributes_) {
  236. result["attributes"] = *options.Attributes_;
  237. }
  238. return result;
  239. }
  240. TNode SerializeParamsForLock(
  241. const TTransactionId& transactionId,
  242. const TString& pathPrefix,
  243. const TYPath& path,
  244. ELockMode mode,
  245. const TLockOptions& options)
  246. {
  247. TNode result;
  248. SetTransactionIdParam(&result, transactionId);
  249. SetPathParam(&result, pathPrefix, path);
  250. result["mode"] = ToString(mode);
  251. result["waitable"] = options.Waitable_;
  252. if (options.AttributeKey_) {
  253. result["attribute_key"] = *options.AttributeKey_;
  254. }
  255. if (options.ChildKey_) {
  256. result["child_key"] = *options.ChildKey_;
  257. }
  258. return result;
  259. }
  260. TNode SerializeParamsForUnlock(
  261. const TTransactionId& transactionId,
  262. const TString& pathPrefix,
  263. const TYPath& path,
  264. const TUnlockOptions& /*options*/)
  265. {
  266. TNode result;
  267. SetTransactionIdParam(&result, transactionId);
  268. SetPathParam(&result, pathPrefix, path);
  269. return result;
  270. }
  271. TNode SerializeParamsForConcatenate(
  272. const TTransactionId& transactionId,
  273. const TString& pathPrefix,
  274. const TVector<TRichYPath>& sourcePaths,
  275. const TRichYPath& destinationPath,
  276. const TConcatenateOptions& options)
  277. {
  278. TNode result;
  279. SetTransactionIdParam(&result, transactionId);
  280. {
  281. auto actualDestination = destinationPath;
  282. actualDestination.Path(AddPathPrefix(actualDestination.Path_, pathPrefix));
  283. if (options.Append_) {
  284. actualDestination.Append(*options.Append_);
  285. }
  286. result["destination_path"] = PathToNode(actualDestination);
  287. }
  288. auto& sourcePathsNode = result["source_paths"];
  289. for (const auto& path : sourcePaths) {
  290. auto actualSource = path;
  291. actualSource.Path(AddPathPrefix(actualSource.Path_, pathPrefix));
  292. sourcePathsNode.Add(PathToNode(actualSource));
  293. }
  294. return result;
  295. }
  296. TNode SerializeParamsForPingTx(
  297. const TTransactionId& transactionId)
  298. {
  299. TNode result;
  300. SetTransactionIdParam(&result, transactionId);
  301. return result;
  302. }
  303. TNode SerializeParamsForListOperations(
  304. const TListOperationsOptions& options)
  305. {
  306. TNode result = TNode::CreateMap();
  307. if (options.FromTime_) {
  308. result["from_time"] = ToString(*options.FromTime_);
  309. }
  310. if (options.ToTime_) {
  311. result["to_time"] = ToString(*options.ToTime_);
  312. }
  313. if (options.CursorTime_) {
  314. result["cursor_time"] = ToString(*options.CursorTime_);
  315. }
  316. if (options.CursorDirection_) {
  317. result["cursor_direction"] = ToString(*options.CursorDirection_);
  318. }
  319. if (options.Pool_) {
  320. result["pool"] = *options.Pool_;
  321. }
  322. if (options.Filter_) {
  323. result["filter"] = *options.Filter_;
  324. }
  325. if (options.User_) {
  326. result["user"] = *options.User_;
  327. }
  328. if (options.State_) {
  329. result["state"] = ToString(options.State_);
  330. }
  331. if (options.Type_) {
  332. result["type"] = ToString(*options.Type_);
  333. }
  334. if (options.WithFailedJobs_) {
  335. result["with_failed_jobs"] = *options.WithFailedJobs_;
  336. }
  337. if (options.IncludeCounters_) {
  338. result["include_counters"] = *options.IncludeCounters_;
  339. }
  340. if (options.IncludeArchive_) {
  341. result["include_archive"] = *options.IncludeArchive_;
  342. }
  343. if (options.Limit_) {
  344. result["limit"] = *options.Limit_;
  345. }
  346. return result;
  347. }
  348. TNode SerializeParamsForStartOperation(
  349. const TTransactionId& transactionId,
  350. EOperationType type,
  351. const TNode& spec)
  352. {
  353. TNode result;
  354. SetTransactionIdParam(&result, transactionId);
  355. result["operation_type"] = ToString(type);
  356. result["spec"] = spec;
  357. return result;
  358. }
  359. TNode SerializeParamsForGetOperation(
  360. const std::variant<TString, TOperationId>& aliasOrOperationId,
  361. const TGetOperationOptions& options)
  362. {
  363. auto includeRuntime = options.IncludeRuntime_;
  364. TNode result;
  365. std::visit([&] (const auto& value) {
  366. using TValue = std::decay_t<decltype(value)>;
  367. if constexpr (std::is_same_v<TValue, TString>) {
  368. SetAliasParam(&result, value);
  369. if (includeRuntime.Empty()) {
  370. // Getting operation by operation alias requires enabling this option.
  371. // So enable it unless user explicitly set it.
  372. includeRuntime = true;
  373. }
  374. } else if constexpr (std::is_same_v<TValue, TOperationId>) {
  375. SetOperationIdParam(&result, value);
  376. } else {
  377. static_assert(std::is_same_v<TValue, void>, "unreachable");
  378. }
  379. }, aliasOrOperationId);
  380. if (options.AttributeFilter_) {
  381. result["attributes"] = SerializeAttributeFilter(*options.AttributeFilter_);
  382. }
  383. if (includeRuntime.Defined()) {
  384. result["include_runtime"] = *includeRuntime;
  385. }
  386. return result;
  387. }
  388. TNode SerializeParamsForAbortOperation(const TOperationId& operationId)
  389. {
  390. TNode result;
  391. SetOperationIdParam(&result, operationId);
  392. return result;
  393. }
  394. TNode SerializeParamsForCompleteOperation(const TOperationId& operationId)
  395. {
  396. TNode result;
  397. SetOperationIdParam(&result, operationId);
  398. return result;
  399. }
  400. TNode SerializeParamsForSuspendOperation(
  401. const TOperationId& operationId,
  402. const TSuspendOperationOptions& options)
  403. {
  404. TNode result;
  405. SetOperationIdParam(&result, operationId);
  406. if (options.AbortRunningJobs_) {
  407. result["abort_running_jobs"] = *options.AbortRunningJobs_;
  408. }
  409. if (options.Reason_) {
  410. result["reason"] = **options.Reason_;
  411. }
  412. return result;
  413. }
  414. TNode SerializeParamsForResumeOperation(
  415. const TOperationId& operationId,
  416. const TResumeOperationOptions& /*options*/)
  417. {
  418. TNode result;
  419. SetOperationIdParam(&result, operationId);
  420. return result;
  421. }
  422. TNode SerializeParamsForUpdateOperationParameters(
  423. const TOperationId& operationId,
  424. const TUpdateOperationParametersOptions& options)
  425. {
  426. TNode result;
  427. SetOperationIdParam(&result, operationId);
  428. TNode& parameters = result["parameters"];
  429. if (options.Pool_) {
  430. parameters["pool"] = *options.Pool_;
  431. }
  432. if (options.Weight_) {
  433. parameters["weight"] = *options.Weight_;
  434. }
  435. if (!options.Owners_.empty()) {
  436. parameters["owners"] = TNode::CreateList();
  437. for (const auto& owner : options.Owners_) {
  438. parameters["owners"].Add(owner);
  439. }
  440. }
  441. if (options.SchedulingOptionsPerPoolTree_) {
  442. parameters["scheduling_options_per_pool_tree"] = TNode::CreateMap();
  443. for (const auto& entry : options.SchedulingOptionsPerPoolTree_->Options_) {
  444. auto schedulingOptionsNode = TNode::CreateMap();
  445. const auto& schedulingOptions = entry.second;
  446. if (schedulingOptions.Pool_) {
  447. schedulingOptionsNode["pool"] = *schedulingOptions.Pool_;
  448. }
  449. if (schedulingOptions.Weight_) {
  450. schedulingOptionsNode["weight"] = *schedulingOptions.Weight_;
  451. }
  452. if (schedulingOptions.ResourceLimits_) {
  453. auto resourceLimitsNode = TNode::CreateMap();
  454. const auto& resourceLimits = *schedulingOptions.ResourceLimits_;
  455. if (resourceLimits.UserSlots_) {
  456. resourceLimitsNode["user_slots"] = *resourceLimits.UserSlots_;
  457. }
  458. if (resourceLimits.Memory_) {
  459. resourceLimitsNode["memory"] = *resourceLimits.Memory_;
  460. }
  461. if (resourceLimits.Cpu_) {
  462. resourceLimitsNode["cpu"] = *resourceLimits.Cpu_;
  463. }
  464. if (resourceLimits.Network_) {
  465. resourceLimitsNode["network"] = *resourceLimits.Network_;
  466. }
  467. schedulingOptionsNode["resource_limits"] = std::move(resourceLimitsNode);
  468. }
  469. parameters["scheduling_options_per_pool_tree"][entry.first] = std::move(schedulingOptionsNode);
  470. }
  471. }
  472. return result;
  473. }
  474. TNode SerializeParamsForGetJob(
  475. const TOperationId& operationId,
  476. const TJobId& jobId,
  477. const TGetJobOptions& /* options */)
  478. {
  479. TNode result;
  480. SetOperationIdParam(&result, operationId);
  481. result["job_id"] = GetGuidAsString(jobId);
  482. return result;
  483. }
  484. TNode SerializeParamsForGetJobTrace(
  485. const TOperationId& operationId,
  486. const TGetJobTraceOptions& /* options */)
  487. {
  488. TNode result;
  489. SetOperationIdParam(&result, operationId);
  490. return result;
  491. }
  492. TNode SerializeParamsForListJobs(
  493. const TOperationId& operationId,
  494. const TListJobsOptions& options)
  495. {
  496. TNode result;
  497. SetOperationIdParam(&result, operationId);
  498. if (options.Type_) {
  499. result["type"] = ToString(*options.Type_);
  500. }
  501. if (options.State_) {
  502. result["state"] = ToString(*options.State_);
  503. }
  504. if (options.Address_) {
  505. result["address"] = *options.Address_;
  506. }
  507. if (options.WithStderr_) {
  508. result["with_stderr"] = *options.WithStderr_;
  509. }
  510. if (options.WithSpec_) {
  511. result["with_spec"] = *options.WithSpec_;
  512. }
  513. if (options.WithFailContext_) {
  514. result["with_fail_context"] = *options.WithFailContext_;
  515. }
  516. if (options.WithMonitoringDescriptor_) {
  517. result["with_monitoring_descriptor"] = *options.WithMonitoringDescriptor_;
  518. }
  519. if (options.OperationIncarnation_) {
  520. result["operation_incarnation"] = *options.OperationIncarnation_;
  521. }
  522. if (options.FromTime_) {
  523. result["from_time"] = ToString(options.FromTime_);
  524. }
  525. if (options.ToTime_) {
  526. result["to_time"] = ToString(options.ToTime_);
  527. }
  528. if (options.ContinuationToken_) {
  529. result["continuation_token"] = *options.ContinuationToken_;
  530. }
  531. if (options.SortField_) {
  532. result["sort_field"] = ToString(*options.SortField_);
  533. }
  534. if (options.SortOrder_) {
  535. result["sort_order"] = ToString(*options.SortOrder_);
  536. }
  537. if (options.Offset_) {
  538. result["offset"] = *options.Offset_;
  539. }
  540. if (options.Limit_) {
  541. result["limit"] = *options.Limit_;
  542. }
  543. if (options.IncludeCypress_) {
  544. result["include_cypress"] = *options.IncludeCypress_;
  545. }
  546. if (options.IncludeArchive_) {
  547. result["include_archive"] = *options.IncludeArchive_;
  548. }
  549. if (options.IncludeControllerAgent_) {
  550. result["include_controller_agent"] = *options.IncludeControllerAgent_;
  551. }
  552. return result;
  553. }
  554. TNode SerializeParametersForInsertRows(
  555. const TString& pathPrefix,
  556. const TYPath& path,
  557. const TInsertRowsOptions& options)
  558. {
  559. TNode result;
  560. SetPathParam(&result, pathPrefix, path);
  561. if (options.Aggregate_) {
  562. result["aggregate"] = *options.Aggregate_;
  563. }
  564. if (options.Update_) {
  565. result["update"] = *options.Update_;
  566. }
  567. if (options.Atomicity_) {
  568. result["atomicity"] = ToString(*options.Atomicity_);
  569. }
  570. if (options.Durability_) {
  571. result["durability"] = ToString(*options.Durability_);
  572. }
  573. if (options.RequireSyncReplica_) {
  574. result["require_sync_replica"] = *options.RequireSyncReplica_;
  575. }
  576. return result;
  577. }
  578. TNode SerializeParametersForDeleteRows(
  579. const TString& pathPrefix,
  580. const TYPath& path,
  581. const TDeleteRowsOptions& options)
  582. {
  583. TNode result;
  584. SetPathParam(&result, pathPrefix, path);
  585. if (options.Atomicity_) {
  586. result["atomicity"] = ToString(*options.Atomicity_);
  587. }
  588. if (options.Durability_) {
  589. result["durability"] = ToString(*options.Durability_);
  590. }
  591. if (options.RequireSyncReplica_) {
  592. result["require_sync_replica"] = *options.RequireSyncReplica_;
  593. }
  594. return result;
  595. }
  596. TNode SerializeParametersForTrimRows(
  597. const TString& pathPrefix,
  598. const TYPath& path,
  599. const TTrimRowsOptions& /*options*/)
  600. {
  601. TNode result;
  602. SetPathParam(&result, pathPrefix, path);
  603. return result;
  604. }
  605. TNode SerializeParamsForReadTable(
  606. const TTransactionId& transactionId,
  607. const TTableReaderOptions& options)
  608. {
  609. TNode result;
  610. SetTransactionIdParam(&result, transactionId);
  611. result["control_attributes"] = BuildYsonNodeFluently()
  612. .BeginMap()
  613. .Item("enable_row_index").Value(options.ControlAttributes_.EnableRowIndex_)
  614. .Item("enable_range_index").Value(options.ControlAttributes_.EnableRangeIndex_)
  615. .EndMap();
  616. return result;
  617. }
  618. TNode SerializeParamsForReadBlobTable(
  619. const TTransactionId& transactionId,
  620. const TRichYPath& path,
  621. const TKey& key,
  622. const TBlobTableReaderOptions& options)
  623. {
  624. auto lowerLimitKey = key;
  625. lowerLimitKey.Parts_.push_back(options.StartPartIndex_);
  626. auto upperLimitKey = key;
  627. upperLimitKey.Parts_.push_back(std::numeric_limits<i64>::max());
  628. TNode result = PathToParamNode(
  629. TRichYPath(path).
  630. AddRange(TReadRange()
  631. .LowerLimit(TReadLimit().Key(lowerLimitKey))
  632. .UpperLimit(TReadLimit().Key(upperLimitKey))));
  633. SetTransactionIdParam(&result, transactionId);
  634. result["start_part_index"] = options.StartPartIndex_;
  635. result["offset"] = options.Offset_;
  636. if (options.PartIndexColumnName_) {
  637. result["part_index_column_name"] = *options.PartIndexColumnName_;
  638. }
  639. if (options.DataColumnName_) {
  640. result["data_column_name"] = *options.DataColumnName_;
  641. }
  642. result["part_size"] = options.PartSize_;
  643. return result;
  644. }
  645. TNode SerializeParamsForParseYPath(const TRichYPath& path)
  646. {
  647. TNode result;
  648. result["path"] = PathToNode(path);
  649. return result;
  650. }
  651. TNode SerializeParamsForEnableTableReplica(
  652. const TReplicaId& replicaId)
  653. {
  654. TNode result;
  655. result["replica_id"] = GetGuidAsString(replicaId);
  656. return result;
  657. }
  658. TNode SerializeParamsForDisableTableReplica(
  659. const TReplicaId& replicaId)
  660. {
  661. TNode result;
  662. result["replica_id"] = GetGuidAsString(replicaId);
  663. return result;
  664. }
  665. TNode SerializeParamsForAlterTableReplica(const TReplicaId& replicaId, const TAlterTableReplicaOptions& options)
  666. {
  667. TNode result;
  668. result["replica_id"] = GetGuidAsString(replicaId);
  669. if (options.Enabled_) {
  670. result["enabled"] = *options.Enabled_;
  671. }
  672. if (options.Mode_) {
  673. result["mode"] = ToString(*options.Mode_);
  674. }
  675. return result;
  676. }
  677. TNode SerializeParamsForFreezeTable(
  678. const TString& pathPrefix,
  679. const TYPath& path,
  680. const TFreezeTableOptions& options)
  681. {
  682. TNode result;
  683. SetPathParam(&result, pathPrefix, path);
  684. SetFirstLastTabletIndex(&result, options);
  685. return result;
  686. }
  687. TNode SerializeParamsForUnfreezeTable(
  688. const TString& pathPrefix,
  689. const TYPath& path,
  690. const TUnfreezeTableOptions& options)
  691. {
  692. TNode result;
  693. SetPathParam(&result, pathPrefix, path);
  694. SetFirstLastTabletIndex(&result, options);
  695. return result;
  696. }
  697. TNode SerializeParamsForAlterTable(
  698. const TTransactionId& transactionId,
  699. const TString& pathPrefix,
  700. const TYPath& path,
  701. const TAlterTableOptions& options)
  702. {
  703. TNode result;
  704. SetTransactionIdParam(&result, transactionId);
  705. SetPathParam(&result, pathPrefix, path);
  706. if (options.Dynamic_) {
  707. result["dynamic"] = *options.Dynamic_;
  708. }
  709. if (options.Schema_) {
  710. TNode schema;
  711. {
  712. TNodeBuilder builder(&schema);
  713. Serialize(*options.Schema_, &builder);
  714. }
  715. result["schema"] = schema;
  716. }
  717. if (options.UpstreamReplicaId_) {
  718. result["upstream_replica_id"] = GetGuidAsString(*options.UpstreamReplicaId_);
  719. }
  720. return result;
  721. }
  722. TNode SerializeParamsForGetTableColumnarStatistics(
  723. const TTransactionId& transactionId,
  724. const TVector<TRichYPath>& paths,
  725. const TGetTableColumnarStatisticsOptions& options)
  726. {
  727. TNode result;
  728. SetTransactionIdParam(&result, transactionId);
  729. for (const auto& path : paths) {
  730. result["paths"].Add(PathToNode(path));
  731. }
  732. if (options.FetcherMode_) {
  733. result["fetcher_mode"] = ToString(*options.FetcherMode_);
  734. }
  735. return result;
  736. }
  737. TNode SerializeParamsForGetTablePartitions(
  738. const TTransactionId& transactionId,
  739. const TVector<TRichYPath>& paths,
  740. const TGetTablePartitionsOptions& options)
  741. {
  742. TNode result;
  743. SetTransactionIdParam(&result, transactionId);
  744. for (const auto& path : paths) {
  745. result["paths"].Add(PathToNode(path));
  746. }
  747. result["partition_mode"] = ToString(options.PartitionMode_);
  748. result["data_weight_per_partition"] = options.DataWeightPerPartition_;
  749. if (options.MaxPartitionCount_) {
  750. result["max_partition_count"] = *options.MaxPartitionCount_;
  751. }
  752. result["adjust_data_weight_per_partition"] = options.AdjustDataWeightPerPartition_;
  753. return result;
  754. }
  755. TNode SerializeParamsForGetFileFromCache(
  756. const TTransactionId& transactionId,
  757. const TString& md5Signature,
  758. const TYPath& cachePath,
  759. const TGetFileFromCacheOptions&)
  760. {
  761. TNode result;
  762. SetTransactionIdParam(&result, transactionId);
  763. result["md5"] = md5Signature;
  764. result["cache_path"] = cachePath;
  765. return result;
  766. }
  767. TNode SerializeParamsForPutFileToCache(
  768. const TTransactionId& transactionId,
  769. const TString& pathPrefix,
  770. const TYPath& filePath,
  771. const TString& md5Signature,
  772. const TYPath& cachePath,
  773. const TPutFileToCacheOptions& options)
  774. {
  775. TNode result;
  776. SetTransactionIdParam(&result, transactionId);
  777. SetPathParam(&result, pathPrefix, filePath);
  778. result["md5"] = md5Signature;
  779. result["cache_path"] = cachePath;
  780. if (options.PreserveExpirationTimeout_) {
  781. result["preserve_expiration_timeout"] = *options.PreserveExpirationTimeout_;
  782. }
  783. return result;
  784. }
  785. TNode SerializeParamsForSkyShareTable(
  786. const TString& serverName,
  787. const TString& pathPrefix,
  788. const std::vector<TYPath>& tablePaths,
  789. const TSkyShareTableOptions& options)
  790. {
  791. TNode result;
  792. if (tablePaths.size() == 1) {
  793. SetPathParam(&result, pathPrefix, tablePaths[0]);
  794. } else {
  795. auto pathList = TNode::CreateList();
  796. for (const auto& p : tablePaths) {
  797. pathList.Add(AddPathPrefix(p, pathPrefix));
  798. }
  799. result["paths"] = pathList;
  800. }
  801. result["cluster"] = serverName;
  802. if (options.KeyColumns_) {
  803. auto keyColumnsList = TNode::CreateList();
  804. for (const auto& s : options.KeyColumns_->Parts_) {
  805. if (s.empty()) {
  806. continue;
  807. }
  808. keyColumnsList.Add(s);
  809. }
  810. result["key_columns"] = keyColumnsList;
  811. }
  812. if (options.EnableFastbone_) {
  813. result["enable_fastbone"] = *options.EnableFastbone_;
  814. }
  815. if (options.Pool_) {
  816. result["share_operation_options"] = BuildYsonNodeFluently()
  817. .BeginMap()
  818. .Item("pool").Value(*options.Pool_)
  819. .EndMap();
  820. }
  821. return result;
  822. }
  823. TNode SerializeParamsForCheckPermission(
  824. const TString& user,
  825. EPermission permission,
  826. const TString& pathPrefix,
  827. const TYPath& path,
  828. const TCheckPermissionOptions& options)
  829. {
  830. TNode result;
  831. SetPathParam(&result, pathPrefix, path);
  832. result["path"] = path;
  833. result["user"] = user;
  834. result["permission"] = ToString(permission);
  835. if (!options.Columns_.empty()) {
  836. result["columns"] = TNode::CreateList();
  837. result["columns"].AsList().assign(options.Columns_.begin(), options.Columns_.end());
  838. }
  839. return result;
  840. }
  841. TNode SerializeParamsForGetTabletInfos(
  842. const TString& pathPrefix,
  843. const TYPath& path,
  844. const TVector<int>& tabletIndexes,
  845. const TGetTabletInfosOptions& /*options*/)
  846. {
  847. TNode result;
  848. SetPathParam(&result, pathPrefix, path);
  849. result["tablet_indexes"] = TNode::CreateList();
  850. result["tablet_indexes"].AsList().assign(tabletIndexes.begin(), tabletIndexes.end());
  851. return result;
  852. }
  853. TNode SerializeParamsForAbortTransaction(const TTransactionId& transactionId)
  854. {
  855. TNode result;
  856. SetTransactionIdParam(&result, transactionId);
  857. return result;
  858. }
  859. TNode SerializeParamsForCommitTransaction(const TTransactionId& transactionId)
  860. {
  861. TNode result;
  862. SetTransactionIdParam(&result, transactionId);
  863. return result;
  864. }
  865. TNode SerializeParamsForStartTransaction(
  866. const TTransactionId& parentTransactionId,
  867. TDuration txTimeout,
  868. const TStartTransactionOptions& options)
  869. {
  870. TNode result;
  871. SetTransactionIdParam(&result, parentTransactionId);
  872. result["timeout"] = static_cast<i64>((options.Timeout_.GetOrElse(txTimeout).MilliSeconds()));
  873. if (options.Deadline_) {
  874. result["deadline"] = ToString(options.Deadline_);
  875. }
  876. if (options.PingAncestors_) {
  877. result["ping_ancestor_transactions"] = true;
  878. }
  879. if (options.Attributes_ && !options.Attributes_->IsMap()) {
  880. ythrow TApiUsageError() << "Attributes must be a Map node";
  881. }
  882. auto attributes = options.Attributes_.GetOrElse(TNode::CreateMap());
  883. if (options.Title_) {
  884. attributes["title"] = *options.Title_;
  885. } else if (!attributes.HasKey("title")) {
  886. attributes["title"] = GetDefaultTransactionTitle();
  887. }
  888. result["attributes"] = attributes;
  889. return result;
  890. }
  891. ////////////////////////////////////////////////////////////////////////////////
  892. } // namespace NYT::NDetail::NRawClient