rpc_parameters_serialization.cpp 27 KB

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