summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorienkovich <[email protected]>2022-02-10 16:47:50 +0300
committerDaniil Cherednik <[email protected]>2022-02-10 16:47:50 +0300
commit0a579de32b745908473b2cea7c5cd5540bc801f0 (patch)
treec0748b5dcbade83af788c0abfa89c0383d6b779c
parent5bd76e73fa8dd777999be2668ff56928cc3dbecb (diff)
Restoring authorship annotation for <[email protected]>. Commit 2 of 2.
-rw-r--r--contrib/libs/c-ares/ares_library_init.c52
-rw-r--r--contrib/libs/c-ares/atomic.cpp26
-rw-r--r--contrib/libs/c-ares/atomic.h30
-rw-r--r--contrib/libs/c-ares/ya.make2
-rw-r--r--library/cpp/actors/core/hfunc.h6
-rw-r--r--library/cpp/actors/core/interconnect.h100
-rw-r--r--library/cpp/actors/core/log_settings.h4
-rw-r--r--library/cpp/actors/interconnect/interconnect_nameserver_table.cpp34
-rw-r--r--library/cpp/actors/testlib/test_runtime.cpp8
-rw-r--r--library/cpp/actors/testlib/test_runtime.h32
-rw-r--r--library/cpp/monlib/dynamic_counters/counters.cpp54
-rw-r--r--library/cpp/monlib/dynamic_counters/counters.h22
-rw-r--r--library/cpp/monlib/dynamic_counters/counters_ut.cpp248
-rw-r--r--library/cpp/monlib/service/service.cpp6
-rw-r--r--library/cpp/monlib/service/service.h2
-rw-r--r--library/cpp/packedtypes/zigzag.h4
-rw-r--r--ydb/core/base/appdata.h12
-rw-r--r--ydb/core/base/counters.cpp148
-rw-r--r--ydb/core/base/counters.h38
-rw-r--r--ydb/core/base/domain.h32
-rw-r--r--ydb/core/base/events.h14
-rw-r--r--ydb/core/base/localdb.cpp222
-rw-r--r--ydb/core/base/localdb.h108
-rw-r--r--ydb/core/base/location.h48
-rw-r--r--ydb/core/base/nameservice.h24
-rw-r--r--ydb/core/base/path.cpp64
-rw-r--r--ydb/core/base/path.h4
-rw-r--r--ydb/core/base/resource_profile.h128
-rw-r--r--ydb/core/base/shared_quota.h148
-rw-r--r--ydb/core/base/subdomain.cpp8
-rw-r--r--ydb/core/base/subdomain.h2
-rw-r--r--ydb/core/base/tablet.h32
-rw-r--r--ydb/core/base/tablet_types.h4
-rw-r--r--ydb/core/base/tabletid.h50
-rw-r--r--ydb/core/base/ya.make12
-rw-r--r--ydb/core/blobstorage/dsproxy/ut_fat/dsproxy_ut.cpp2
-rw-r--r--ydb/core/blobstorage/nodewarden/blobstorage_node_warden_ut.cpp2
-rw-r--r--ydb/core/blobstorage/vdisk/syncer/blobstorage_syncer_scheduler.cpp2
-rw-r--r--ydb/core/blobstorage/vdisk/synclog/blobstorage_synclogneighbors.cpp2
-rw-r--r--ydb/core/client/cancel_tx_ut.cpp2
-rw-r--r--ydb/core/client/flat_ut.cpp58
-rw-r--r--ydb/core/client/locks_ut.cpp192
-rw-r--r--ydb/core/client/minikql_compile/mkql_compile_service.cpp2
-rw-r--r--ydb/core/client/minikql_compile/yql_expr_minikql.cpp4
-rw-r--r--ydb/core/client/server/grpc_server.cpp112
-rw-r--r--ydb/core/client/server/grpc_server.h6
-rw-r--r--ydb/core/client/server/msgbus_http_server.cpp2
-rw-r--r--ydb/core/client/server/msgbus_server.cpp38
-rw-r--r--ydb/core/client/server/msgbus_server.h10
-rw-r--r--ydb/core/client/server/msgbus_server_cms.cpp558
-rw-r--r--ydb/core/client/server/msgbus_server_console.cpp648
-rw-r--r--ydb/core/client/server/msgbus_server_db.cpp4
-rw-r--r--ydb/core/client/server/msgbus_server_node_registration.cpp310
-rw-r--r--ydb/core/client/server/msgbus_server_proxy.h2
-rw-r--r--ydb/core/client/server/msgbus_server_request.cpp76
-rw-r--r--ydb/core/client/server/msgbus_server_request.h2
-rw-r--r--ydb/core/client/server/ya.make6
-rw-r--r--ydb/core/cms/base_handler.h34
-rw-r--r--ydb/core/cms/cluster_info.cpp1266
-rw-r--r--ydb/core/cms/cluster_info.h1388
-rw-r--r--ydb/core/cms/cluster_info_ut.cpp876
-rw-r--r--ydb/core/cms/cms.cpp2966
-rw-r--r--ydb/core/cms/cms.h528
-rw-r--r--ydb/core/cms/cms_impl.h722
-rw-r--r--ydb/core/cms/cms_state.h86
-rw-r--r--ydb/core/cms/cms_tenants_ut.cpp838
-rw-r--r--ydb/core/cms/cms_tx_get_log_tail.cpp130
-rw-r--r--ydb/core/cms/cms_tx_init_scheme.cpp74
-rw-r--r--ydb/core/cms/cms_tx_load_state.cpp364
-rw-r--r--ydb/core/cms/cms_tx_log_and_send.cpp88
-rw-r--r--ydb/core/cms/cms_tx_log_cleanup.cpp74
-rw-r--r--ydb/core/cms/cms_tx_process_notification.cpp122
-rw-r--r--ydb/core/cms/cms_tx_reject_notification.cpp124
-rw-r--r--ydb/core/cms/cms_tx_remove_expired_notifications.cpp148
-rw-r--r--ydb/core/cms/cms_tx_remove_permissions.cpp110
-rw-r--r--ydb/core/cms/cms_tx_remove_request.cpp94
-rw-r--r--ydb/core/cms/cms_tx_remove_walle_task.cpp88
-rw-r--r--ydb/core/cms/cms_tx_store_permissions.cpp162
-rw-r--r--ydb/core/cms/cms_tx_store_walle_task.cpp86
-rw-r--r--ydb/core/cms/cms_tx_update_config.cpp180
-rw-r--r--ydb/core/cms/cms_tx_update_downtimes.cpp78
-rw-r--r--ydb/core/cms/cms_ut.cpp1786
-rw-r--r--ydb/core/cms/cms_ut_common.cpp1894
-rw-r--r--ydb/core/cms/cms_ut_common.h702
-rw-r--r--ydb/core/cms/config.h184
-rw-r--r--ydb/core/cms/console/config_helpers.cpp766
-rw-r--r--ydb/core/cms/console/config_helpers.h142
-rw-r--r--ydb/core/cms/console/config_index.cpp1492
-rw-r--r--ydb/core/cms/console/config_index.h1304
-rw-r--r--ydb/core/cms/console/configs_config.cpp120
-rw-r--r--ydb/core/cms/console/configs_config.h68
-rw-r--r--ydb/core/cms/console/configs_dispatcher.cpp1416
-rw-r--r--ydb/core/cms/console/configs_dispatcher.h190
-rw-r--r--ydb/core/cms/console/configs_dispatcher_ut.cpp1064
-rw-r--r--ydb/core/cms/console/console.cpp332
-rw-r--r--ydb/core/cms/console/console.h424
-rw-r--r--ydb/core/cms/console/console__add_config_subscription.cpp208
-rw-r--r--ydb/core/cms/console/console__alter_tenant.cpp514
-rw-r--r--ydb/core/cms/console/console__cleanup_subscriptions.cpp136
-rw-r--r--ydb/core/cms/console/console__configure.cpp1036
-rw-r--r--ydb/core/cms/console/console__create_tenant.cpp256
-rw-r--r--ydb/core/cms/console/console__init_scheme.cpp74
-rw-r--r--ydb/core/cms/console/console__load_state.cpp172
-rw-r--r--ydb/core/cms/console/console__remove_computational_units.cpp118
-rw-r--r--ydb/core/cms/console/console__remove_config_subscription.cpp168
-rw-r--r--ydb/core/cms/console/console__remove_config_subscriptions.cpp144
-rw-r--r--ydb/core/cms/console/console__remove_tenant.cpp234
-rw-r--r--ydb/core/cms/console/console__remove_tenant_done.cpp108
-rw-r--r--ydb/core/cms/console/console__remove_tenant_failed.cpp126
-rw-r--r--ydb/core/cms/console/console__replace_config_subscriptions.cpp218
-rw-r--r--ydb/core/cms/console/console__scheme.h254
-rw-r--r--ydb/core/cms/console/console__set_config.cpp188
-rw-r--r--ydb/core/cms/console/console__toggle_config_validator.cpp236
-rw-r--r--ydb/core/cms/console/console__update_confirmed_subdomain.cpp142
-rw-r--r--ydb/core/cms/console/console__update_last_provided_config.cpp144
-rw-r--r--ydb/core/cms/console/console__update_pool_state.cpp214
-rw-r--r--ydb/core/cms/console/console__update_subdomain_key.cpp202
-rw-r--r--ydb/core/cms/console/console__update_tenant_state.cpp140
-rw-r--r--ydb/core/cms/console/console_configs_manager.cpp1174
-rw-r--r--ydb/core/cms/console/console_configs_manager.h380
-rw-r--r--ydb/core/cms/console/console_configs_provider.cpp1574
-rw-r--r--ydb/core/cms/console/console_configs_provider.h374
-rw-r--r--ydb/core/cms/console/console_impl.h306
-rw-r--r--ydb/core/cms/console/console_tenants_manager.cpp5628
-rw-r--r--ydb/core/cms/console/console_tenants_manager.h1892
-rw-r--r--ydb/core/cms/console/console_ut_configs.cpp6752
-rw-r--r--ydb/core/cms/console/console_ut_tenants.cpp3562
-rw-r--r--ydb/core/cms/console/defs.h2
-rw-r--r--ydb/core/cms/console/http.cpp184
-rw-r--r--ydb/core/cms/console/http.h92
-rw-r--r--ydb/core/cms/console/immediate_controls_configurator.cpp392
-rw-r--r--ydb/core/cms/console/immediate_controls_configurator.h36
-rw-r--r--ydb/core/cms/console/immediate_controls_configurator_ut.cpp516
-rw-r--r--ydb/core/cms/console/log_settings_configurator.cpp320
-rw-r--r--ydb/core/cms/console/log_settings_configurator.h28
-rw-r--r--ydb/core/cms/console/log_settings_configurator_ut.cpp686
-rw-r--r--ydb/core/cms/console/modifications_validator.cpp738
-rw-r--r--ydb/core/cms/console/modifications_validator.h130
-rw-r--r--ydb/core/cms/console/modifications_validator_ut.cpp3168
-rw-r--r--ydb/core/cms/console/tx_processor.cpp500
-rw-r--r--ydb/core/cms/console/tx_processor.h338
-rw-r--r--ydb/core/cms/console/ut/ya.make36
-rw-r--r--ydb/core/cms/console/ut_helpers.h820
-rw-r--r--ydb/core/cms/console/validators/core_validators.cpp32
-rw-r--r--ydb/core/cms/console/validators/core_validators.h18
-rw-r--r--ydb/core/cms/console/validators/registry.cpp364
-rw-r--r--ydb/core/cms/console/validators/registry.h154
-rw-r--r--ydb/core/cms/console/validators/registry_ut.cpp534
-rw-r--r--ydb/core/cms/console/validators/ut/ya.make34
-rw-r--r--ydb/core/cms/console/validators/validator.cpp28
-rw-r--r--ydb/core/cms/console/validators/validator.h246
-rw-r--r--ydb/core/cms/console/validators/validator_bootstrap.cpp364
-rw-r--r--ydb/core/cms/console/validators/validator_bootstrap.h52
-rw-r--r--ydb/core/cms/console/validators/validator_bootstrap_ut.cpp342
-rw-r--r--ydb/core/cms/console/validators/validator_nameservice.cpp328
-rw-r--r--ydb/core/cms/console/validators/validator_nameservice.h42
-rw-r--r--ydb/core/cms/console/validators/validator_nameservice_ut.cpp306
-rw-r--r--ydb/core/cms/console/validators/validator_ut_common.h332
-rw-r--r--ydb/core/cms/console/validators/ya.make48
-rw-r--r--ydb/core/cms/console/ya.make128
-rw-r--r--ydb/core/cms/defs.h24
-rw-r--r--ydb/core/cms/downtime.cpp584
-rw-r--r--ydb/core/cms/downtime.h256
-rw-r--r--ydb/core/cms/downtime_ut.cpp420
-rw-r--r--ydb/core/cms/http.cpp316
-rw-r--r--ydb/core/cms/http.h24
-rw-r--r--ydb/core/cms/info_collector.cpp208
-rw-r--r--ydb/core/cms/info_collector.h20
-rw-r--r--ydb/core/cms/json_proxy.h430
-rw-r--r--ydb/core/cms/json_proxy_config_items.h78
-rw-r--r--ydb/core/cms/json_proxy_config_updates.h92
-rw-r--r--ydb/core/cms/json_proxy_config_validators.h58
-rw-r--r--ydb/core/cms/json_proxy_log.h102
-rw-r--r--ydb/core/cms/json_proxy_operations.h354
-rw-r--r--ydb/core/cms/json_proxy_proto.h316
-rw-r--r--ydb/core/cms/json_proxy_toggle_config_validator.h78
-rw-r--r--ydb/core/cms/log_formatter.h306
-rw-r--r--ydb/core/cms/logger.cpp272
-rw-r--r--ydb/core/cms/logger.h78
-rw-r--r--ydb/core/cms/pdiskid.h128
-rw-r--r--ydb/core/cms/scheme.h244
-rw-r--r--ydb/core/cms/ui/cms.css142
-rw-r--r--ydb/core/cms/ui/cms.js68
-rw-r--r--ydb/core/cms/ui/cms_log.js234
-rw-r--r--ydb/core/cms/ui/common.css64
-rw-r--r--ydb/core/cms/ui/common.js170
-rw-r--r--ydb/core/cms/ui/config_forms.js2886
-rw-r--r--ydb/core/cms/ui/configs.js664
-rw-r--r--ydb/core/cms/ui/datashard.css94
-rw-r--r--ydb/core/cms/ui/datashard.js92
-rw-r--r--ydb/core/cms/ui/datashard_hist.js264
-rw-r--r--ydb/core/cms/ui/datashard_info.js370
-rw-r--r--ydb/core/cms/ui/datashard_op.js1758
-rw-r--r--ydb/core/cms/ui/datashard_ops_list.js260
-rw-r--r--ydb/core/cms/ui/datashard_rs.js442
-rw-r--r--ydb/core/cms/ui/datashard_slow_ops.js258
-rw-r--r--ydb/core/cms/ui/enums.js178
-rw-r--r--ydb/core/cms/ui/ext/bootstrap.bundle.min.js14
-rw-r--r--ydb/core/cms/ui/ext/bootstrap.min.css14
-rw-r--r--ydb/core/cms/ui/ext/theme.blue.css458
-rw-r--r--ydb/core/cms/ui/index.html174
-rw-r--r--ydb/core/cms/ui/proto_types.js140
-rw-r--r--ydb/core/cms/ui/validators.js466
-rw-r--r--ydb/core/cms/ut/ya.make26
-rw-r--r--ydb/core/cms/ut_helpers.h740
-rw-r--r--ydb/core/cms/walle.h64
-rw-r--r--ydb/core/cms/walle_api_handler.cpp552
-rw-r--r--ydb/core/cms/walle_check_task_adapter.cpp224
-rw-r--r--ydb/core/cms/walle_create_task_adapter.cpp358
-rw-r--r--ydb/core/cms/walle_list_tasks_adapter.cpp120
-rw-r--r--ydb/core/cms/walle_remove_task_adapter.cpp164
-rw-r--r--ydb/core/cms/ya.make178
-rw-r--r--ydb/core/control/immediate_control_board_actor.cpp2
-rw-r--r--ydb/core/control/immediate_control_board_actor_ut.cpp2
-rw-r--r--ydb/core/control/immediate_control_board_impl.cpp6
-rw-r--r--ydb/core/control/immediate_control_board_impl.h4
-rw-r--r--ydb/core/driver_lib/cli_base/cli_cmds_db.cpp232
-rw-r--r--ydb/core/driver_lib/cli_utils/cli_cmds.h30
-rw-r--r--ydb/core/driver_lib/cli_utils/cli_cmds_cms.cpp2028
-rw-r--r--ydb/core/driver_lib/cli_utils/cli_cmds_console.cpp1030
-rw-r--r--ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp698
-rw-r--r--ydb/core/driver_lib/cli_utils/cli_cmds_tenant.cpp1088
-rw-r--r--ydb/core/driver_lib/cli_utils/ya.make6
-rw-r--r--ydb/core/driver_lib/run/config.h8
-rw-r--r--ydb/core/driver_lib/run/driver.h2
-rw-r--r--ydb/core/driver_lib/run/kikimr_services_initializers.cpp260
-rw-r--r--ydb/core/driver_lib/run/kikimr_services_initializers.h70
-rw-r--r--ydb/core/driver_lib/run/main.cpp2
-rw-r--r--ydb/core/driver_lib/run/run.cpp140
-rw-r--r--ydb/core/engine/kikimr_program_builder.cpp18
-rw-r--r--ydb/core/engine/minikql/minikql_engine_host.cpp16
-rw-r--r--ydb/core/engine/mkql_engine_flat.cpp60
-rw-r--r--ydb/core/engine/mkql_engine_flat.h20
-rw-r--r--ydb/core/engine/mkql_engine_flat_extfunc.cpp24
-rw-r--r--ydb/core/engine/mkql_engine_flat_impl.h4
-rw-r--r--ydb/core/engine/mkql_keys.cpp20
-rw-r--r--ydb/core/engine/mkql_keys.h2
-rw-r--r--ydb/core/grpc_services/base/base.h14
-rw-r--r--ydb/core/grpc_services/grpc_request_proxy.h4
-rw-r--r--ydb/core/grpc_services/rpc_cms.cpp230
-rw-r--r--ydb/core/grpc_services/rpc_create_table.cpp76
-rw-r--r--ydb/core/grpc_services/rpc_describe_table_options.cpp340
-rw-r--r--ydb/core/grpc_services/rpc_get_operation.cpp80
-rw-r--r--ydb/core/grpc_services/rpc_read_table.cpp58
-rw-r--r--ydb/core/grpc_services/table_profiles.cpp556
-rw-r--r--ydb/core/grpc_services/table_profiles.h62
-rw-r--r--ydb/core/grpc_services/ya.make6
-rw-r--r--ydb/core/kqp/counters/kqp_counters.cpp2
-rw-r--r--ydb/core/kqp/kqp_ic_gateway.cpp6
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_provider.cpp16
-rw-r--r--ydb/core/kqp/proxy/kqp_proxy_service.cpp2
-rw-r--r--ydb/core/mind/dynamic_nameserver.cpp734
-rw-r--r--ydb/core/mind/dynamic_nameserver.h38
-rw-r--r--ydb/core/mind/dynamic_nameserver_impl.h416
-rw-r--r--ydb/core/mind/dynamic_nameserver_mon.cpp378
-rw-r--r--ydb/core/mind/hive/hive_impl.cpp26
-rw-r--r--ydb/core/mind/hive/hive_impl.h8
-rw-r--r--ydb/core/mind/hive/hive_ut.cpp22
-rw-r--r--ydb/core/mind/labels_maintainer.cpp584
-rw-r--r--ydb/core/mind/labels_maintainer.h18
-rw-r--r--ydb/core/mind/lease_holder.cpp476
-rw-r--r--ydb/core/mind/lease_holder.h34
-rw-r--r--ydb/core/mind/local.cpp752
-rw-r--r--ydb/core/mind/local.h230
-rw-r--r--ydb/core/mind/node_broker.cpp1482
-rw-r--r--ydb/core/mind/node_broker.h352
-rw-r--r--ydb/core/mind/node_broker__extend_lease.cpp194
-rw-r--r--ydb/core/mind/node_broker__init_scheme.cpp76
-rw-r--r--ydb/core/mind/node_broker__load_state.cpp110
-rw-r--r--ydb/core/mind/node_broker__register_node.cpp246
-rw-r--r--ydb/core/mind/node_broker__scheme.h90
-rw-r--r--ydb/core/mind/node_broker__update_config.cpp228
-rw-r--r--ydb/core/mind/node_broker__update_config_subscription.cpp108
-rw-r--r--ydb/core/mind/node_broker__update_epoch.cpp92
-rw-r--r--ydb/core/mind/node_broker_impl.h594
-rw-r--r--ydb/core/mind/node_broker_ut.cpp2116
-rw-r--r--ydb/core/mind/tenant_pool.cpp1676
-rw-r--r--ydb/core/mind/tenant_pool.h176
-rw-r--r--ydb/core/mind/tenant_slot_broker.cpp3454
-rw-r--r--ydb/core/mind/tenant_slot_broker.h110
-rw-r--r--ydb/core/mind/tenant_slot_broker__alter_tenant.cpp474
-rw-r--r--ydb/core/mind/tenant_slot_broker__assign_free_slots.cpp366
-rw-r--r--ydb/core/mind/tenant_slot_broker__check_slot_status.cpp158
-rw-r--r--ydb/core/mind/tenant_slot_broker__init_scheme.cpp74
-rw-r--r--ydb/core/mind/tenant_slot_broker__load_state.cpp386
-rw-r--r--ydb/core/mind/tenant_slot_broker__scheme.h186
-rw-r--r--ydb/core/mind/tenant_slot_broker__update_config.cpp130
-rw-r--r--ydb/core/mind/tenant_slot_broker__update_node_location.cpp136
-rw-r--r--ydb/core/mind/tenant_slot_broker__update_pool_status.cpp210
-rw-r--r--ydb/core/mind/tenant_slot_broker__update_slot_status.cpp290
-rw-r--r--ydb/core/mind/tenant_slot_broker_impl.h2292
-rw-r--r--ydb/core/mind/tenant_ut_broker.cpp2962
-rw-r--r--ydb/core/mind/tenant_ut_local.cpp330
-rw-r--r--ydb/core/mind/tenant_ut_pool.cpp2232
-rw-r--r--ydb/core/mind/ut/ya.make8
-rw-r--r--ydb/core/mind/ut_fat/blobstorage_node_warden_ut_fat.cpp2
-rw-r--r--ydb/core/mind/ya.make68
-rw-r--r--ydb/core/persqueue/percentile_counter.cpp2
-rw-r--r--ydb/core/persqueue/type_codecs_defs.cpp32
-rw-r--r--ydb/core/protos/cms.proto1056
-rw-r--r--ydb/core/protos/config.proto480
-rw-r--r--ydb/core/protos/console.proto48
-rw-r--r--ydb/core/protos/console_base.proto14
-rw-r--r--ydb/core/protos/console_config.proto890
-rw-r--r--ydb/core/protos/console_tenant.proto232
-rw-r--r--ydb/core/protos/counters.proto2
-rw-r--r--ydb/core/protos/counters_datashard.proto14
-rw-r--r--ydb/core/protos/flat_scheme_op.proto152
-rw-r--r--ydb/core/protos/grpc.proto30
-rw-r--r--ydb/core/protos/local.proto8
-rw-r--r--ydb/core/protos/msgbus.proto192
-rw-r--r--ydb/core/protos/node_broker.proto222
-rw-r--r--ydb/core/protos/resource_broker.proto78
-rw-r--r--ydb/core/protos/scheme_log.proto2
-rw-r--r--ydb/core/protos/services.proto24
-rw-r--r--ydb/core/protos/stream.proto38
-rw-r--r--ydb/core/protos/tablet.proto4
-rw-r--r--ydb/core/protos/tenant_pool.proto130
-rw-r--r--ydb/core/protos/tenant_slot_broker.proto156
-rw-r--r--ydb/core/protos/tx.proto98
-rw-r--r--ydb/core/protos/tx_datashard.proto670
-rw-r--r--ydb/core/protos/tx_proxy.proto50
-rw-r--r--ydb/core/protos/ya.make22
-rw-r--r--ydb/core/protos/ydb_result_set_old.proto2
-rw-r--r--ydb/core/scheme/scheme_tablecell.h78
-rw-r--r--ydb/core/scheme/scheme_tabledefs.cpp12
-rw-r--r--ydb/core/scheme/scheme_tabledefs.h68
-rw-r--r--ydb/core/scheme_types/scheme_type_registry.cpp10
-rw-r--r--ydb/core/scheme_types/scheme_types_defs.cpp14
-rw-r--r--ydb/core/scheme_types/scheme_types_defs.h48
-rw-r--r--ydb/core/tablet/bootstrapper.cpp2
-rw-r--r--ydb/core/tablet/node_tablet_monitor.cpp4
-rw-r--r--ydb/core/tablet/node_tablet_monitor.h2
-rw-r--r--ydb/core/tablet/node_whiteboard.cpp2
-rw-r--r--ydb/core/tablet/resource_broker.cpp1732
-rw-r--r--ydb/core/tablet/resource_broker.h362
-rw-r--r--ydb/core/tablet/resource_broker_impl.h764
-rw-r--r--ydb/core/tablet/resource_broker_ut.cpp1512
-rw-r--r--ydb/core/tablet/tablet_monitoring_proxy.cpp88
-rw-r--r--ydb/core/tablet/tablet_setup.h2
-rw-r--r--ydb/core/tablet/tablet_sys.cpp28
-rw-r--r--ydb/core/tablet/tablet_sys.h2
-rw-r--r--ydb/core/tablet/ut/ya.make2
-rw-r--r--ydb/core/tablet/ya.make6
-rw-r--r--ydb/core/tablet_flat/datetime_ut.cpp692
-rw-r--r--ydb/core/tablet_flat/decimal_ut.cpp836
-rw-r--r--ydb/core/tablet_flat/flat_cxx_database.h70
-rw-r--r--ydb/core/tablet_flat/flat_dbase_apply.cpp14
-rw-r--r--ydb/core/tablet_flat/flat_dbase_apply.h2
-rw-r--r--ydb/core/tablet_flat/flat_dbase_scheme.cpp8
-rw-r--r--ydb/core/tablet_flat/flat_dbase_scheme.h2
-rw-r--r--ydb/core/tablet_flat/flat_executor.cpp212
-rw-r--r--ydb/core/tablet_flat/flat_executor.h28
-rw-r--r--ydb/core/tablet_flat/flat_executor_compaction_logic.cpp198
-rw-r--r--ydb/core/tablet_flat/flat_executor_compaction_logic.h42
-rw-r--r--ydb/core/tablet_flat/flat_executor_counters.h10
-rw-r--r--ydb/core/tablet_flat/flat_executor_txloglogic.cpp40
-rw-r--r--ydb/core/tablet_flat/flat_executor_ut.cpp1270
-rw-r--r--ydb/core/tablet_flat/flat_sausagecache.cpp40
-rw-r--r--ydb/core/tablet_flat/flat_sausagecache.h4
-rw-r--r--ydb/core/tablet_flat/tablet_flat_executed.cpp10
-rw-r--r--ydb/core/tablet_flat/tablet_flat_executed.h18
-rw-r--r--ydb/core/tablet_flat/tablet_flat_executor.cpp2
-rw-r--r--ydb/core/tablet_flat/tablet_flat_executor.h280
-rw-r--r--ydb/core/tablet_flat/ut/ya.make4
-rw-r--r--ydb/core/testlib/tenant_helpers.h358
-rw-r--r--ydb/core/testlib/tenant_runtime.cpp1884
-rw-r--r--ydb/core/testlib/tenant_runtime.h414
-rw-r--r--ydb/core/testlib/test_client.cpp42
-rw-r--r--ydb/core/testlib/test_client.h20
-rw-r--r--ydb/core/testlib/ya.make4
-rw-r--r--ydb/core/tx/coordinator/coordinator_impl.cpp2
-rw-r--r--ydb/core/tx/datashard/alter_table_unit.cpp134
-rw-r--r--ydb/core/tx/datashard/backup_unit.cpp62
-rw-r--r--ydb/core/tx/datashard/build_and_wait_dependencies_unit.cpp184
-rw-r--r--ydb/core/tx/datashard/build_data_tx_out_rs_unit.cpp216
-rw-r--r--ydb/core/tx/datashard/build_kqp_data_tx_out_rs_unit.cpp78
-rw-r--r--ydb/core/tx/datashard/build_scheme_tx_out_rs_unit.cpp152
-rw-r--r--ydb/core/tx/datashard/check_data_tx_unit.cpp324
-rw-r--r--ydb/core/tx/datashard/check_scheme_tx_unit.cpp428
-rw-r--r--ydb/core/tx/datashard/complete_data_tx_unit.cpp212
-rw-r--r--ydb/core/tx/datashard/completed_operations_unit.cpp106
-rw-r--r--ydb/core/tx/datashard/const.h26
-rw-r--r--ydb/core/tx/datashard/create_table_unit.cpp134
-rw-r--r--ydb/core/tx/datashard/datashard.cpp1694
-rw-r--r--ydb/core/tx/datashard/datashard.h368
-rw-r--r--ydb/core/tx/datashard/datashard__cancel_tx_proposal.cpp70
-rw-r--r--ydb/core/tx/datashard/datashard__cleanup_in_rs.cpp274
-rw-r--r--ydb/core/tx/datashard/datashard__engine_host.cpp26
-rw-r--r--ydb/core/tx/datashard/datashard__engine_host.h4
-rw-r--r--ydb/core/tx/datashard/datashard__init.cpp42
-rw-r--r--ydb/core/tx/datashard/datashard__monitoring.cpp582
-rw-r--r--ydb/core/tx/datashard/datashard__plan_step.cpp6
-rw-r--r--ydb/core/tx/datashard/datashard__progress_tx.cpp92
-rw-r--r--ydb/core/tx/datashard/datashard__propose_tx_base.cpp134
-rw-r--r--ydb/core/tx/datashard/datashard__readset.cpp20
-rw-r--r--ydb/core/tx/datashard/datashard__s3.cpp2
-rw-r--r--ydb/core/tx/datashard/datashard__stats.cpp4
-rw-r--r--ydb/core/tx/datashard/datashard__store_table_path.cpp68
-rw-r--r--ydb/core/tx/datashard/datashard__undelivered.cpp118
-rw-r--r--ydb/core/tx/datashard/datashard_active_transaction.cpp602
-rw-r--r--ydb/core/tx/datashard/datashard_active_transaction.h436
-rw-r--r--ydb/core/tx/datashard/datashard_impl.h508
-rw-r--r--ydb/core/tx/datashard/datashard_kqp.cpp2
-rw-r--r--ydb/core/tx/datashard/datashard_kqp.h2
-rw-r--r--ydb/core/tx/datashard/datashard_kqp_upsert_rows.cpp4
-rw-r--r--ydb/core/tx/datashard/datashard_loans.cpp6
-rw-r--r--ydb/core/tx/datashard/datashard_locks.cpp36
-rw-r--r--ydb/core/tx/datashard/datashard_locks.h170
-rw-r--r--ydb/core/tx/datashard/datashard_pipeline.cpp1746
-rw-r--r--ydb/core/tx/datashard/datashard_pipeline.h434
-rw-r--r--ydb/core/tx/datashard/datashard_split_src.cpp4
-rw-r--r--ydb/core/tx/datashard/datashard_trans_queue.cpp130
-rw-r--r--ydb/core/tx/datashard/datashard_trans_queue.h76
-rw-r--r--ydb/core/tx/datashard/datashard_txs.h72
-rw-r--r--ydb/core/tx/datashard/datashard_user_table.cpp44
-rw-r--r--ydb/core/tx/datashard/datashard_user_table.h18
-rw-r--r--ydb/core/tx/datashard/datashard_ut_common.cpp454
-rw-r--r--ydb/core/tx/datashard/datashard_ut_common.h140
-rw-r--r--ydb/core/tx/datashard/datashard_ut_init.cpp214
-rw-r--r--ydb/core/tx/datashard/datashard_ut_locks.cpp278
-rw-r--r--ydb/core/tx/datashard/datashard_ut_minikql.cpp438
-rw-r--r--ydb/core/tx/datashard/datashard_ut_order.cpp480
-rw-r--r--ydb/core/tx/datashard/datashard_ut_rs.cpp630
-rw-r--r--ydb/core/tx/datashard/drop_table_unit.cpp136
-rw-r--r--ydb/core/tx/datashard/execute_data_tx_unit.cpp260
-rw-r--r--ydb/core/tx/datashard/execute_kqp_data_tx_unit.cpp112
-rw-r--r--ydb/core/tx/datashard/execution_unit.cpp176
-rw-r--r--ydb/core/tx/datashard/execution_unit.h238
-rw-r--r--ydb/core/tx/datashard/execution_unit_ctors.h14
-rw-r--r--ydb/core/tx/datashard/execution_unit_kind.h80
-rw-r--r--ydb/core/tx/datashard/finish_propose_unit.cpp312
-rw-r--r--ydb/core/tx/datashard/index.html618
-rw-r--r--ydb/core/tx/datashard/key_conflicts.cpp104
-rw-r--r--ydb/core/tx/datashard/key_conflicts.h20
-rw-r--r--ydb/core/tx/datashard/load_and_wait_in_rs_unit.cpp162
-rw-r--r--ydb/core/tx/datashard/load_tx_details_unit.cpp114
-rw-r--r--ydb/core/tx/datashard/make_scan_snapshot_unit.cpp114
-rw-r--r--ydb/core/tx/datashard/make_snapshot_unit.cpp150
-rw-r--r--ydb/core/tx/datashard/operation.cpp342
-rw-r--r--ydb/core/tx/datashard/operation.h1230
-rw-r--r--ydb/core/tx/datashard/plan_queue_unit.cpp224
-rw-r--r--ydb/core/tx/datashard/prepare_data_tx_in_rs_unit.cpp198
-rw-r--r--ydb/core/tx/datashard/prepare_kqp_data_tx_in_rs_unit.cpp72
-rw-r--r--ydb/core/tx/datashard/prepare_scheme_tx_in_rs_unit.cpp122
-rw-r--r--ydb/core/tx/datashard/read_table_scan.cpp1070
-rw-r--r--ydb/core/tx/datashard/read_table_scan.h34
-rw-r--r--ydb/core/tx/datashard/read_table_scan_unit.cpp308
-rw-r--r--ydb/core/tx/datashard/receive_snapshot_unit.cpp130
-rw-r--r--ydb/core/tx/datashard/setup_sys_locks.h56
-rw-r--r--ydb/core/tx/datashard/store_and_send_out_rs_unit.cpp156
-rw-r--r--ydb/core/tx/datashard/store_data_tx_unit.cpp120
-rw-r--r--ydb/core/tx/datashard/store_scheme_tx_unit.cpp138
-rw-r--r--ydb/core/tx/datashard/sys_tables.h4
-rw-r--r--ydb/core/tx/datashard/wait_for_plan_unit.cpp100
-rw-r--r--ydb/core/tx/datashard/wait_for_stream_clearance_unit.cpp396
-rw-r--r--ydb/core/tx/datashard/ya.make112
-rw-r--r--ydb/core/tx/mediator/tablet_queue.cpp2
-rw-r--r--ydb/core/tx/tx_allocator/txallocator_impl.cpp2
-rw-r--r--ydb/core/tx/tx_processing.h156
-rw-r--r--ydb/core/tx/tx_proxy/datareq.cpp1430
-rw-r--r--ydb/core/tx/tx_proxy/mon.cpp16
-rw-r--r--ydb/core/tx/tx_proxy/mon.h10
-rw-r--r--ydb/core/tx/tx_proxy/proxy.h4
-rw-r--r--ydb/core/tx/tx_proxy/proxy_impl.cpp2
-rw-r--r--ydb/core/viewer/content/viewer.js16
-rw-r--r--ydb/core/viewer/json_counters.h12
-rw-r--r--ydb/core/viewer/json_tenantinfo.h4
-rw-r--r--ydb/core/viewer/json_tenants.h4
-rw-r--r--ydb/core/ydb_convert/ydb_convert_ut.cpp4
-rw-r--r--ydb/library/aclib/aclib.h4
-rw-r--r--ydb/library/yql/minikql/aligned_page_pool.cpp40
-rw-r--r--ydb/library/yql/minikql/aligned_page_pool.h26
-rw-r--r--ydb/library/yql/minikql/computation/mkql_computation_node_pack.cpp10
-rw-r--r--ydb/library/yql/minikql/mkql_alloc.h16
-rw-r--r--ydb/library/yql/public/types/yql_types.proto2
-rw-r--r--ydb/public/api/grpc/ydb_cms_v1.proto24
-rw-r--r--ydb/public/api/grpc/ydb_table_v1.proto6
-rw-r--r--ydb/public/api/protos/ydb_cms.proto272
-rw-r--r--ydb/public/api/protos/ydb_status_codes.proto2
-rw-r--r--ydb/public/api/protos/ydb_table.proto248
-rw-r--r--ydb/public/lib/base/defs.h2
-rw-r--r--ydb/public/lib/base/msgbus.h50
-rw-r--r--ydb/public/lib/deprecated/client/grpc_client.cpp280
-rw-r--r--ydb/public/lib/deprecated/client/grpc_client.h50
-rw-r--r--ydb/public/lib/deprecated/kicli/configurator.cpp100
-rw-r--r--ydb/public/lib/deprecated/kicli/cpp_ut.cpp54
-rw-r--r--ydb/public/lib/deprecated/kicli/dynamic_node.cpp104
-rw-r--r--ydb/public/lib/deprecated/kicli/error.cpp2
-rw-r--r--ydb/public/lib/deprecated/kicli/kicli.h266
-rw-r--r--ydb/public/lib/deprecated/kicli/kikimr.cpp84
-rw-r--r--ydb/public/lib/deprecated/kicli/result.cpp288
-rw-r--r--ydb/public/lib/deprecated/kicli/ya.make6
-rw-r--r--ydb/public/lib/operation_id/operation_id.cpp4
-rw-r--r--ydb/public/lib/operation_id/protos/operation_id.proto2
-rw-r--r--ydb/public/lib/scheme_types/scheme_type_id.h22
-rw-r--r--ydb/public/lib/value/value.cpp320
-rw-r--r--ydb/public/lib/value/value.h22
-rw-r--r--ydb/public/sdk/cpp/client/ydb_value/value.h2
-rw-r--r--ydb/services/cms/cms_ut.cpp674
-rw-r--r--ydb/services/cms/grpc_service.cpp110
-rw-r--r--ydb/services/cms/grpc_service.h52
-rw-r--r--ydb/services/cms/ut/ya.make32
-rw-r--r--ydb/services/cms/ya.make24
-rw-r--r--ydb/services/ydb/ydb_common_ut.h12
-rw-r--r--ydb/services/ydb/ydb_table.cpp6
-rw-r--r--ydb/services/ydb/ydb_table_ut.cpp6
-rw-r--r--ydb/services/ydb/ydb_ut.cpp3498
-rw-r--r--ydb/tests/functional/tenants/test_dynamic_tenants.py28
-rw-r--r--ydb/tests/functional/tenants/ya.make2
-rw-r--r--ydb/tests/library/common/protobuf_console.py116
-rw-r--r--ydb/tests/library/common/types.py6
-rw-r--r--ydb/tests/library/harness/kikimr_config.py2
-rw-r--r--ydb/tests/library/harness/kikimr_runner.py100
514 files changed, 78549 insertions, 78549 deletions
diff --git a/contrib/libs/c-ares/ares_library_init.c b/contrib/libs/c-ares/ares_library_init.c
index f244d0bd429..3c7ad372006 100644
--- a/contrib/libs/c-ares/ares_library_init.c
+++ b/contrib/libs/c-ares/ares_library_init.c
@@ -21,8 +21,8 @@
#include "ares_library_init.h"
#include "ares_private.h"
-#include "atomic.h"
-
+#include "atomic.h"
+
/* library-private global and unique instance vars */
#ifdef USE_WINSOCK
@@ -38,7 +38,7 @@ fpGetBestRoute2_t ares_fpGetBestRoute2 = ZERO_NULL;
/* library-private global vars with source visibility restricted to this file */
-static atomic_t ares_init_lock;
+static atomic_t ares_init_lock;
static unsigned int ares_initialized;
static int ares_init_flags;
@@ -130,23 +130,23 @@ static void ares_win32_cleanup(void)
int ares_library_init(int flags)
{
- int res = ARES_SUCCESS;
+ int res = ARES_SUCCESS;
+
+ acquire_lock(&ares_init_lock);
- acquire_lock(&ares_init_lock);
-
- ares_initialized++;
- if (ares_initialized == 1)
+ ares_initialized++;
+ if (ares_initialized == 1)
{
- if (flags & ARES_LIB_INIT_WIN32)
- res = ares_win32_init();
+ if (flags & ARES_LIB_INIT_WIN32)
+ res = ares_win32_init();
- if (res == ARES_SUCCESS)
- ares_init_flags = flags;
+ if (res == ARES_SUCCESS)
+ ares_init_flags = flags;
}
- release_lock(&ares_init_lock);
+ release_lock(&ares_init_lock);
- return res;
+ return res;
}
int ares_library_init_mem(int flags,
@@ -166,28 +166,28 @@ int ares_library_init_mem(int flags,
void ares_library_cleanup(void)
{
- acquire_lock(&ares_init_lock);
-
+ acquire_lock(&ares_init_lock);
+
if (ares_initialized)
- {
- ares_initialized--;
- if (!ares_initialized)
- {
- if (ares_init_flags & ARES_LIB_INIT_WIN32)
- ares_win32_cleanup();
+ {
+ ares_initialized--;
+ if (!ares_initialized)
+ {
+ if (ares_init_flags & ARES_LIB_INIT_WIN32)
+ ares_win32_cleanup();
#if defined(ANDROID) || defined(__ANDROID__)
ares_library_cleanup_android();
#endif
- ares_init_flags = ARES_LIB_INIT_NONE;
+ ares_init_flags = ARES_LIB_INIT_NONE;
ares_malloc = malloc;
ares_realloc = realloc;
ares_free = free;
- }
- }
+ }
+ }
- release_lock(&ares_init_lock);
+ release_lock(&ares_init_lock);
}
diff --git a/contrib/libs/c-ares/atomic.cpp b/contrib/libs/c-ares/atomic.cpp
index 5f5ea36ebbb..e193a64b378 100644
--- a/contrib/libs/c-ares/atomic.cpp
+++ b/contrib/libs/c-ares/atomic.cpp
@@ -1,13 +1,13 @@
-#include <util/system/spinlock.h>
-
-#include "atomic.h"
-
-EXTERN_C void acquire_lock(atomic_t *lock)
-{
- AcquireAdaptiveLock(lock);
-}
-
-EXTERN_C void release_lock(atomic_t *lock)
-{
- ReleaseAdaptiveLock(lock);
-}
+#include <util/system/spinlock.h>
+
+#include "atomic.h"
+
+EXTERN_C void acquire_lock(atomic_t *lock)
+{
+ AcquireAdaptiveLock(lock);
+}
+
+EXTERN_C void release_lock(atomic_t *lock)
+{
+ ReleaseAdaptiveLock(lock);
+}
diff --git a/contrib/libs/c-ares/atomic.h b/contrib/libs/c-ares/atomic.h
index 2b09f5c5a1c..9b26bcdc0be 100644
--- a/contrib/libs/c-ares/atomic.h
+++ b/contrib/libs/c-ares/atomic.h
@@ -1,15 +1,15 @@
-#ifndef ATOMIC__H
-#define ATOMIC__H
-
-typedef volatile intptr_t atomic_t;
-
-#ifdef __cplusplus
- #define EXTERN_C extern "C"
-#else
- #define EXTERN_C
-#endif
-
-EXTERN_C void acquire_lock(atomic_t *lock);
-EXTERN_C void release_lock(atomic_t *lock);
-
-#endif
+#ifndef ATOMIC__H
+#define ATOMIC__H
+
+typedef volatile intptr_t atomic_t;
+
+#ifdef __cplusplus
+ #define EXTERN_C extern "C"
+#else
+ #define EXTERN_C
+#endif
+
+EXTERN_C void acquire_lock(atomic_t *lock);
+EXTERN_C void release_lock(atomic_t *lock);
+
+#endif
diff --git a/contrib/libs/c-ares/ya.make b/contrib/libs/c-ares/ya.make
index a3409a977f3..bd35762e44c 100644
--- a/contrib/libs/c-ares/ya.make
+++ b/contrib/libs/c-ares/ya.make
@@ -101,7 +101,7 @@ SRCS(
ares_timeout.c
ares_version.c
ares_writev.c
- atomic.cpp
+ atomic.cpp
bitncmp.c
inet_net_pton.c
inet_ntop.c
diff --git a/library/cpp/actors/core/hfunc.h b/library/cpp/actors/core/hfunc.h
index 618c641fffa..26f3c65013c 100644
--- a/library/cpp/actors/core/hfunc.h
+++ b/library/cpp/actors/core/hfunc.h
@@ -64,9 +64,9 @@
HandleFunc(ctx); \
break;
-#define cFunc(TEventType, HandleFunc) \
- case TEventType: \
- HandleFunc(); \
+#define cFunc(TEventType, HandleFunc) \
+ case TEventType: \
+ HandleFunc(); \
break;
#define FFunc(TEventType, HandleFunc) \
diff --git a/library/cpp/actors/core/interconnect.h b/library/cpp/actors/core/interconnect.h
index 662b22fdfc5..679a4b8cc6f 100644
--- a/library/cpp/actors/core/interconnect.h
+++ b/library/cpp/actors/core/interconnect.h
@@ -128,9 +128,9 @@ namespace NActors {
EvRegisterNodeResult,
EvListNodes,
EvNodesInfo,
- EvDisconnect,
- EvGetNode,
- EvNodeInfo,
+ EvDisconnect,
+ EvGetNode,
+ EvNodeInfo,
EvClosePeerSocket,
EvCloseInputSession,
EvPoisonSession,
@@ -146,7 +146,7 @@ namespace NActors {
static_assert(EvEnd < EventSpaceEnd(TEvents::ES_INTERCONNECT), "expect EvEnd < EventSpaceEnd(TEvents::ES_INTERCONNECT)");
struct TEvResolveNode;
- struct TEvNodeAddress;
+ struct TEvNodeAddress;
struct TEvConnectNode: public TEventBase<TEvConnectNode, EvConnectNode> {
DEFINE_SIMPLE_LOCAL_EVENT(TEvConnectNode, "TEvInterconnect::TEvConnectNode")
@@ -178,38 +178,38 @@ namespace NActors {
struct TEvListNodes: public TEventLocal<TEvListNodes, EvListNodes> {
};
- struct TNodeInfo {
- ui32 NodeId;
- TString Address;
- TString Host;
- TString ResolveHost;
- ui16 Port;
+ struct TNodeInfo {
+ ui32 NodeId;
+ TString Address;
+ TString Host;
+ TString ResolveHost;
+ ui16 Port;
TNodeLocation Location;
TNodeInfo() = default;
TNodeInfo(const TNodeInfo&) = default;
TNodeInfo& operator =(const TNodeInfo&) = default;
- TNodeInfo(ui32 nodeId,
- const TString& address,
- const TString& host,
- const TString& resolveHost,
- ui16 port,
+ TNodeInfo(ui32 nodeId,
+ const TString& address,
+ const TString& host,
+ const TString& resolveHost,
+ ui16 port,
const TNodeLocation& location)
- : NodeId(nodeId)
- , Address(address)
- , Host(host)
- , ResolveHost(resolveHost)
- , Port(port)
- , Location(location)
- {
- }
-
- operator ui32() const {
- return NodeId;
- }
- };
-
- struct TEvNodesInfo: public TEventLocal<TEvNodesInfo, EvNodesInfo> {
+ : NodeId(nodeId)
+ , Address(address)
+ , Host(host)
+ , ResolveHost(resolveHost)
+ , Port(port)
+ , Location(location)
+ {
+ }
+
+ operator ui32() const {
+ return NodeId;
+ }
+ };
+
+ struct TEvNodesInfo: public TEventLocal<TEvNodesInfo, EvNodesInfo> {
TVector<TNodeInfo> Nodes;
const TNodeInfo* GetNodeInfo(ui32 nodeId) const {
@@ -220,29 +220,29 @@ namespace NActors {
return nullptr;
}
};
-
- struct TEvDisconnect;
-
- struct TEvGetNode: public TEventLocal<TEvGetNode, EvGetNode> {
- ui32 NodeId;
+
+ struct TEvDisconnect;
+
+ struct TEvGetNode: public TEventLocal<TEvGetNode, EvGetNode> {
+ ui32 NodeId;
TInstant Deadline;
-
+
TEvGetNode(ui32 nodeId, TInstant deadline = TInstant::Max())
- : NodeId(nodeId)
+ : NodeId(nodeId)
, Deadline(deadline)
- {
- }
- };
-
- struct TEvNodeInfo: public TEventLocal<TEvNodeInfo, EvNodeInfo> {
- TEvNodeInfo(ui32 nodeId)
- : NodeId(nodeId)
- {
- }
-
- ui32 NodeId;
- THolder<TNodeInfo> Node;
- };
+ {
+ }
+ };
+
+ struct TEvNodeInfo: public TEventLocal<TEvNodeInfo, EvNodeInfo> {
+ TEvNodeInfo(ui32 nodeId)
+ : NodeId(nodeId)
+ {
+ }
+
+ ui32 NodeId;
+ THolder<TNodeInfo> Node;
+ };
struct TEvClosePeerSocket : TEventLocal<TEvClosePeerSocket, EvClosePeerSocket> {};
diff --git a/library/cpp/actors/core/log_settings.h b/library/cpp/actors/core/log_settings.h
index 4e2b45ae48a..7fe4504edd9 100644
--- a/library/cpp/actors/core/log_settings.h
+++ b/library/cpp/actors/core/log_settings.h
@@ -118,8 +118,8 @@ namespace NActors {
return func(static_cast<T>(c));
}
);
- }
-
+ }
+
inline bool Satisfies(EPriority priority, EComponent component, ui64 sampleBy = 0) const {
// by using Mask we don't get outside of array boundaries
TComponentSettings settings = GetComponentSettings(component);
diff --git a/library/cpp/actors/interconnect/interconnect_nameserver_table.cpp b/library/cpp/actors/interconnect/interconnect_nameserver_table.cpp
index 26e57f5156d..43419bf70d3 100644
--- a/library/cpp/actors/interconnect/interconnect_nameserver_table.cpp
+++ b/library/cpp/actors/interconnect/interconnect_nameserver_table.cpp
@@ -48,34 +48,34 @@ namespace NActors {
for (const auto& x : StaticNodeTable)
infos.push_back(&x.second);
- auto CompareAddressLambda =
+ auto CompareAddressLambda =
[](const TNodeInfo* left, const TNodeInfo* right) {
return left->Port == right->Port ? left->Address < right->Address : left->Port < right->Port;
};
- Sort(infos, CompareAddressLambda);
+ Sort(infos, CompareAddressLambda);
for (ui32 idx = 1, end = StaticNodeTable.size(); idx < end; ++idx) {
const TNodeInfo* left = infos[idx - 1];
const TNodeInfo* right = infos[idx];
- if (left->Address && left->Address == right->Address && left->Port == right->Port)
+ if (left->Address && left->Address == right->Address && left->Port == right->Port)
+ return false;
+ }
+
+ auto CompareHostLambda =
+ [](const TNodeInfo* left, const TNodeInfo* right) {
+ return left->Port == right->Port ? left->ResolveHost < right->ResolveHost : left->Port < right->Port;
+ };
+
+ Sort(infos, CompareHostLambda);
+
+ for (ui32 idx = 1, end = StaticNodeTable.size(); idx < end; ++idx) {
+ const TNodeInfo* left = infos[idx - 1];
+ const TNodeInfo* right = infos[idx];
+ if (left->ResolveHost == right->ResolveHost && left->Port == right->Port)
return false;
}
- auto CompareHostLambda =
- [](const TNodeInfo* left, const TNodeInfo* right) {
- return left->Port == right->Port ? left->ResolveHost < right->ResolveHost : left->Port < right->Port;
- };
-
- Sort(infos, CompareHostLambda);
-
- for (ui32 idx = 1, end = StaticNodeTable.size(); idx < end; ++idx) {
- const TNodeInfo* left = infos[idx - 1];
- const TNodeInfo* right = infos[idx];
- if (left->ResolveHost == right->ResolveHost && left->Port == right->Port)
- return false;
- }
-
return true;
}
diff --git a/library/cpp/actors/testlib/test_runtime.cpp b/library/cpp/actors/testlib/test_runtime.cpp
index 66b353d49df..6fa25b99656 100644
--- a/library/cpp/actors/testlib/test_runtime.cpp
+++ b/library/cpp/actors/testlib/test_runtime.cpp
@@ -815,9 +815,9 @@ namespace NActors {
}
void TTestActorRuntimeBase::AdvanceCurrentTime(TDuration duration) {
- UpdateCurrentTime(GetCurrentTime() + duration);
- }
-
+ UpdateCurrentTime(GetCurrentTime() + duration);
+ }
+
TIntrusivePtr<ITimeProvider> TTestActorRuntimeBase::GetTimeProvider() {
Y_VERIFY(!UseRealThreads);
return TimeProvider;
@@ -1650,7 +1650,7 @@ namespace NActors {
common.Reset(new TInterconnectProxyCommon);
common->NameserviceId = nameserviceId;
common->MonCounters = interconnectCounters;
- common->TechnicalSelfHostName = "::1";
+ common->TechnicalSelfHostName = "::1";
if (!UseRealThreads) {
common->Settings.DeadPeer = TDuration::Max();
diff --git a/library/cpp/actors/testlib/test_runtime.h b/library/cpp/actors/testlib/test_runtime.h
index b788acfb366..26e3b45c984 100644
--- a/library/cpp/actors/testlib/test_runtime.h
+++ b/library/cpp/actors/testlib/test_runtime.h
@@ -231,7 +231,7 @@ namespace NActors {
TIntrusivePtr<ITimeProvider> GetTimeProvider();
TInstant GetCurrentTime() const;
void UpdateCurrentTime(TInstant newTime);
- void AdvanceCurrentTime(TDuration duration);
+ void AdvanceCurrentTime(TDuration duration);
void AddLocalService(const TActorId& actorId, const TActorSetupCmd& cmd, ui32 nodeIndex = 0);
virtual void Initialize();
ui32 GetNodeId(ui32 index = 0) const;
@@ -269,21 +269,21 @@ namespace NActors {
bool IsScheduleForActorEnabled(const TActorId& actorId) const;
TIntrusivePtr<NMonitoring::TDynamicCounters> GetDynamicCounters(ui32 nodeIndex = 0);
void SetupMonitoring();
-
- template<typename T>
- void AppendToLogSettings(NLog::EComponent minVal, NLog::EComponent maxVal, T func) {
- Y_VERIFY(!IsInitialized);
-
- for (const auto& pair : Nodes) {
- pair.second->LogSettings->Append(minVal, maxVal, func);
- }
- }
-
- TIntrusivePtr<NLog::TSettings> GetLogSettings(ui32 nodeIdx)
- {
- return Nodes[FirstNodeId + nodeIdx]->LogSettings;
- }
-
+
+ template<typename T>
+ void AppendToLogSettings(NLog::EComponent minVal, NLog::EComponent maxVal, T func) {
+ Y_VERIFY(!IsInitialized);
+
+ for (const auto& pair : Nodes) {
+ pair.second->LogSettings->Append(minVal, maxVal, func);
+ }
+ }
+
+ TIntrusivePtr<NLog::TSettings> GetLogSettings(ui32 nodeIdx)
+ {
+ return Nodes[FirstNodeId + nodeIdx]->LogSettings;
+ }
+
TActorSystem* SingleSys() const;
TActorSystem* GetAnyNodeActorSystem();
TActorSystem* GetActorSystem(ui32 nodeId);
diff --git a/library/cpp/monlib/dynamic_counters/counters.cpp b/library/cpp/monlib/dynamic_counters/counters.cpp
index 9e7a9702672..3635d87d0d2 100644
--- a/library/cpp/monlib/dynamic_counters/counters.cpp
+++ b/library/cpp/monlib/dynamic_counters/counters.cpp
@@ -102,17 +102,17 @@ THistogramPtr TDynamicCounters::FindNamedHistogram(const TString& name,const TSt
return AsHistogramRef(FindNamedCounterImpl<THistogramCounter>(name, value));
}
-void TDynamicCounters::RemoveCounter(const TString &value) {
- RemoveNamedCounter("sensor", value);
-}
-
-void TDynamicCounters::RemoveNamedCounter(const TString& name, const TString &value) {
+void TDynamicCounters::RemoveCounter(const TString &value) {
+ RemoveNamedCounter("sensor", value);
+}
+
+void TDynamicCounters::RemoveNamedCounter(const TString& name, const TString &value) {
auto g = LockForUpdate("RemoveNamedCounter", name, value);
if (const auto it = Counters.find({name, value}); it != Counters.end() && AsCounter(it->second)) {
- Counters.erase(it);
+ Counters.erase(it);
}
-}
-
+}
+
TIntrusivePtr<TDynamicCounters> TDynamicCounters::GetSubgroup(const TString& name, const TString& value) {
auto res = FindSubgroup(name, value);
if (!res) {
@@ -134,21 +134,21 @@ TIntrusivePtr<TDynamicCounters> TDynamicCounters::FindSubgroup(const TString& na
return it != Counters.end() ? AsDynamicCounters(it->second) : nullptr;
}
-void TDynamicCounters::RemoveSubgroup(const TString& name, const TString& value) {
+void TDynamicCounters::RemoveSubgroup(const TString& name, const TString& value) {
auto g = LockForUpdate("RemoveSubgroup", name, value);
if (const auto it = Counters.find({name, value}); it != Counters.end() && AsDynamicCounters(it->second)) {
- Counters.erase(it);
+ Counters.erase(it);
}
-}
-
+}
+
void TDynamicCounters::ReplaceSubgroup(const TString& name, const TString& value, TIntrusivePtr<TDynamicCounters> subgroup) {
auto g = LockForUpdate("ReplaceSubgroup", name, value);
const auto it = Counters.find({name, value});
Y_VERIFY(it != Counters.end() && AsDynamicCounters(it->second));
it->second = std::move(subgroup);
-}
-
-void TDynamicCounters::MergeWithSubgroup(const TString& name, const TString& value) {
+}
+
+void TDynamicCounters::MergeWithSubgroup(const TString& name, const TString& value) {
auto g = LockForUpdate("MergeWithSubgroup", name, value);
auto it = Counters.find({name, value});
Y_VERIFY(it != Counters.end());
@@ -159,30 +159,30 @@ void TDynamicCounters::MergeWithSubgroup(const TString& name, const TString& val
AtomicAdd(ExpiringCount, AtomicSwap(&subgroup->ExpiringCount, 0));
}
-void TDynamicCounters::ResetCounters(bool derivOnly) {
+void TDynamicCounters::ResetCounters(bool derivOnly) {
TReadGuard g(Lock);
for (auto& [key, value] : Counters) {
if (auto counter = AsCounter(value)) {
if (!derivOnly || counter->ForDerivative()) {
- *counter = 0;
+ *counter = 0;
}
} else if (auto subgroup = AsDynamicCounters(value)) {
- subgroup->ResetCounters(derivOnly);
- }
- }
-}
-
+ subgroup->ResetCounters(derivOnly);
+ }
+ }
+}
+
void TDynamicCounters::RegisterCountable(const TString& name, const TString& value, TCountablePtr countable) {
Y_VERIFY(countable);
auto g = LockForUpdate("RegisterCountable", name, value);
const bool inserted = Counters.emplace(TChildId(name, value), std::move(countable)).second;
Y_VERIFY(inserted);
-}
-
-void TDynamicCounters::RegisterSubgroup(const TString& name, const TString& value, TIntrusivePtr<TDynamicCounters> subgroup) {
+}
+
+void TDynamicCounters::RegisterSubgroup(const TString& name, const TString& value, TIntrusivePtr<TDynamicCounters> subgroup) {
RegisterCountable(name, value, subgroup);
-}
-
+}
+
void TDynamicCounters::OutputHtml(IOutputStream& os) const {
HTML(os) {
PRE() {
diff --git a/library/cpp/monlib/dynamic_counters/counters.h b/library/cpp/monlib/dynamic_counters/counters.h
index 11787037868..dc178cfbe01 100644
--- a/library/cpp/monlib/dynamic_counters/counters.h
+++ b/library/cpp/monlib/dynamic_counters/counters.h
@@ -326,19 +326,19 @@ namespace NMonitoring {
THistogramPtr FindHistogram(const TString& value) const;
THistogramPtr FindNamedHistogram(const TString& name,const TString& value) const;
- void RemoveCounter(const TString &value);
- void RemoveNamedCounter(const TString& name, const TString &value);
+ void RemoveCounter(const TString &value);
+ void RemoveNamedCounter(const TString& name, const TString &value);
TIntrusivePtr<TDynamicCounters> GetSubgroup(const TString& name, const TString& value);
TIntrusivePtr<TDynamicCounters> FindSubgroup(const TString& name, const TString& value) const;
- void RemoveSubgroup(const TString& name, const TString& value);
- void ReplaceSubgroup(const TString& name, const TString& value, TIntrusivePtr<TDynamicCounters> subgroup);
-
- // Move all counters from specified subgroup and remove the subgroup.
- void MergeWithSubgroup(const TString& name, const TString& value);
- // Recursively reset all/deriv counters to 0.
- void ResetCounters(bool derivOnly = false);
-
+ void RemoveSubgroup(const TString& name, const TString& value);
+ void ReplaceSubgroup(const TString& name, const TString& value, TIntrusivePtr<TDynamicCounters> subgroup);
+
+ // Move all counters from specified subgroup and remove the subgroup.
+ void MergeWithSubgroup(const TString& name, const TString& value);
+ // Recursively reset all/deriv counters to 0.
+ void ResetCounters(bool derivOnly = false);
+
void RegisterSubgroup(const TString& name,
const TString& value,
TIntrusivePtr<TDynamicCounters> subgroup);
@@ -363,7 +363,7 @@ namespace NMonitoring {
void RegisterCountable(const TString& name, const TString& value, TCountablePtr countable);
void RemoveExpired() const;
-
+
template <bool expiring, class TCounterType, class... TArgs>
TCountablePtr GetNamedCounterImpl(const TString& name, const TString& value, TArgs&&... args);
diff --git a/library/cpp/monlib/dynamic_counters/counters_ut.cpp b/library/cpp/monlib/dynamic_counters/counters_ut.cpp
index dfbf76010b7..3591037e0a7 100644
--- a/library/cpp/monlib/dynamic_counters/counters_ut.cpp
+++ b/library/cpp/monlib/dynamic_counters/counters_ut.cpp
@@ -96,134 +96,134 @@ Y_UNIT_TEST_SUITE(TDynamicCountersTest) {
" users:count = 7\n"
"}\n");
}
-
+
Y_UNIT_TEST(MergeSubgroup) {
- TDynamicCounterPtr rootGroup(new TDynamicCounters());
-
- auto sensor1 = rootGroup->GetNamedCounter("sensor", "1");
- *sensor1 = 1;
-
- auto group1 = rootGroup->GetSubgroup("group", "1");
- auto sensor2 = group1->GetNamedCounter("sensor", "2");
- *sensor2 = 2;
-
- auto group2 = group1->GetSubgroup("group", "2");
- auto sensor3 = group2->GetNamedCounter("sensor", "3");
- *sensor3 = 3;
-
- rootGroup->MergeWithSubgroup("group", "1");
-
- TStringStream ss;
- TCountersPrinter printer(&ss);
- rootGroup->Accept("root", "counters", printer);
-
- UNIT_ASSERT_STRINGS_EQUAL(ss.Str(),
- "root:counters {\n"
- " group:2 {\n"
- " sensor:3 = 3\n"
- " }\n"
- " sensor:1 = 1\n"
- " sensor:2 = 2\n"
- "}\n");
- }
-
+ TDynamicCounterPtr rootGroup(new TDynamicCounters());
+
+ auto sensor1 = rootGroup->GetNamedCounter("sensor", "1");
+ *sensor1 = 1;
+
+ auto group1 = rootGroup->GetSubgroup("group", "1");
+ auto sensor2 = group1->GetNamedCounter("sensor", "2");
+ *sensor2 = 2;
+
+ auto group2 = group1->GetSubgroup("group", "2");
+ auto sensor3 = group2->GetNamedCounter("sensor", "3");
+ *sensor3 = 3;
+
+ rootGroup->MergeWithSubgroup("group", "1");
+
+ TStringStream ss;
+ TCountersPrinter printer(&ss);
+ rootGroup->Accept("root", "counters", printer);
+
+ UNIT_ASSERT_STRINGS_EQUAL(ss.Str(),
+ "root:counters {\n"
+ " group:2 {\n"
+ " sensor:3 = 3\n"
+ " }\n"
+ " sensor:1 = 1\n"
+ " sensor:2 = 2\n"
+ "}\n");
+ }
+
Y_UNIT_TEST(ResetCounters) {
- TDynamicCounterPtr rootGroup(new TDynamicCounters());
-
- auto sensor1 = rootGroup->GetNamedCounter("sensor", "1");
- *sensor1 = 1;
-
- auto group1 = rootGroup->GetSubgroup("group", "1");
- auto sensor2 = group1->GetNamedCounter("sensor", "2");
- *sensor2 = 2;
-
- auto group2 = group1->GetSubgroup("group", "2");
- auto sensor3 = group2->GetNamedCounter("sensor", "3", true);
- *sensor3 = 3;
-
- rootGroup->ResetCounters(true);
-
- TStringStream ss1;
- TCountersPrinter printer1(&ss1);
- rootGroup->Accept("root", "counters", printer1);
-
- UNIT_ASSERT_STRINGS_EQUAL(ss1.Str(),
- "root:counters {\n"
- " group:1 {\n"
- " group:2 {\n"
- " sensor:3 = 0\n"
- " }\n"
- " sensor:2 = 2\n"
- " }\n"
- " sensor:1 = 1\n"
- "}\n");
-
- rootGroup->ResetCounters();
-
- TStringStream ss2;
- TCountersPrinter printer2(&ss2);
- rootGroup->Accept("root", "counters", printer2);
-
- UNIT_ASSERT_STRINGS_EQUAL(ss2.Str(),
- "root:counters {\n"
- " group:1 {\n"
- " group:2 {\n"
- " sensor:3 = 0\n"
- " }\n"
- " sensor:2 = 0\n"
- " }\n"
- " sensor:1 = 0\n"
- "}\n");
- }
-
+ TDynamicCounterPtr rootGroup(new TDynamicCounters());
+
+ auto sensor1 = rootGroup->GetNamedCounter("sensor", "1");
+ *sensor1 = 1;
+
+ auto group1 = rootGroup->GetSubgroup("group", "1");
+ auto sensor2 = group1->GetNamedCounter("sensor", "2");
+ *sensor2 = 2;
+
+ auto group2 = group1->GetSubgroup("group", "2");
+ auto sensor3 = group2->GetNamedCounter("sensor", "3", true);
+ *sensor3 = 3;
+
+ rootGroup->ResetCounters(true);
+
+ TStringStream ss1;
+ TCountersPrinter printer1(&ss1);
+ rootGroup->Accept("root", "counters", printer1);
+
+ UNIT_ASSERT_STRINGS_EQUAL(ss1.Str(),
+ "root:counters {\n"
+ " group:1 {\n"
+ " group:2 {\n"
+ " sensor:3 = 0\n"
+ " }\n"
+ " sensor:2 = 2\n"
+ " }\n"
+ " sensor:1 = 1\n"
+ "}\n");
+
+ rootGroup->ResetCounters();
+
+ TStringStream ss2;
+ TCountersPrinter printer2(&ss2);
+ rootGroup->Accept("root", "counters", printer2);
+
+ UNIT_ASSERT_STRINGS_EQUAL(ss2.Str(),
+ "root:counters {\n"
+ " group:1 {\n"
+ " group:2 {\n"
+ " sensor:3 = 0\n"
+ " }\n"
+ " sensor:2 = 0\n"
+ " }\n"
+ " sensor:1 = 0\n"
+ "}\n");
+ }
+
Y_UNIT_TEST(RemoveCounter) {
- TDynamicCounterPtr rootGroup(new TDynamicCounters());
-
- rootGroup->GetNamedCounter("label", "1");
- rootGroup->GetCounter("2");
- rootGroup->GetCounter("3");
- rootGroup->GetSubgroup("group", "1");
-
- rootGroup->RemoveNamedCounter("label", "1");
- rootGroup->RemoveNamedCounter("label", "5");
- rootGroup->RemoveNamedCounter("group", "1");
- rootGroup->RemoveCounter("2");
- rootGroup->RemoveCounter("5");
-
- TStringStream ss;
- TCountersPrinter printer(&ss);
- rootGroup->Accept("root", "counters", printer);
-
- UNIT_ASSERT_STRINGS_EQUAL(ss.Str(),
- "root:counters {\n"
- " group:1 {\n"
- " }\n"
- " sensor:3 = 0\n"
- "}\n");
- }
-
+ TDynamicCounterPtr rootGroup(new TDynamicCounters());
+
+ rootGroup->GetNamedCounter("label", "1");
+ rootGroup->GetCounter("2");
+ rootGroup->GetCounter("3");
+ rootGroup->GetSubgroup("group", "1");
+
+ rootGroup->RemoveNamedCounter("label", "1");
+ rootGroup->RemoveNamedCounter("label", "5");
+ rootGroup->RemoveNamedCounter("group", "1");
+ rootGroup->RemoveCounter("2");
+ rootGroup->RemoveCounter("5");
+
+ TStringStream ss;
+ TCountersPrinter printer(&ss);
+ rootGroup->Accept("root", "counters", printer);
+
+ UNIT_ASSERT_STRINGS_EQUAL(ss.Str(),
+ "root:counters {\n"
+ " group:1 {\n"
+ " }\n"
+ " sensor:3 = 0\n"
+ "}\n");
+ }
+
Y_UNIT_TEST(RemoveSubgroup) {
- TDynamicCounterPtr rootGroup(new TDynamicCounters());
-
- rootGroup->GetSubgroup("group", "1");
- rootGroup->GetSubgroup("group", "2");
- rootGroup->GetCounter("2");
-
- rootGroup->RemoveSubgroup("group", "1");
- rootGroup->RemoveSubgroup("group", "3");
- rootGroup->RemoveSubgroup("sensor", "2");
-
- TStringStream ss;
- TCountersPrinter printer(&ss);
- rootGroup->Accept("root", "counters", printer);
-
- UNIT_ASSERT_STRINGS_EQUAL(ss.Str(),
- "root:counters {\n"
- " group:2 {\n"
- " }\n"
- " sensor:2 = 0\n"
- "}\n");
- }
+ TDynamicCounterPtr rootGroup(new TDynamicCounters());
+
+ rootGroup->GetSubgroup("group", "1");
+ rootGroup->GetSubgroup("group", "2");
+ rootGroup->GetCounter("2");
+
+ rootGroup->RemoveSubgroup("group", "1");
+ rootGroup->RemoveSubgroup("group", "3");
+ rootGroup->RemoveSubgroup("sensor", "2");
+
+ TStringStream ss;
+ TCountersPrinter printer(&ss);
+ rootGroup->Accept("root", "counters", printer);
+
+ UNIT_ASSERT_STRINGS_EQUAL(ss.Str(),
+ "root:counters {\n"
+ " group:2 {\n"
+ " }\n"
+ " sensor:2 = 0\n"
+ "}\n");
+ }
Y_UNIT_TEST(ExpiringCounters) {
TDynamicCounterPtr rootGroup{new TDynamicCounters()};
diff --git a/library/cpp/monlib/service/service.cpp b/library/cpp/monlib/service/service.cpp
index 365c9b4eef7..929efbf8162 100644
--- a/library/cpp/monlib/service/service.cpp
+++ b/library/cpp/monlib/service/service.cpp
@@ -71,9 +71,9 @@ namespace NMonitoring {
TStringBuf GetPostContent() const override {
return TStringBuf(PostContent.Buffer().Data(), PostContent.Buffer().Size());
}
- HTTP_METHOD GetMethod() const override {
- return (HTTP_METHOD)Header.http_method;
- }
+ HTTP_METHOD GetMethod() const override {
+ return (HTTP_METHOD)Header.http_method;
+ }
void ScanPostParams() {
PostParams.Scan(TStringBuf(PostContent.Buffer().data(), PostContent.Buffer().size()));
}
diff --git a/library/cpp/monlib/service/service.h b/library/cpp/monlib/service/service.h
index b1286450991..2f66dddaf87 100644
--- a/library/cpp/monlib/service/service.h
+++ b/library/cpp/monlib/service/service.h
@@ -22,7 +22,7 @@ namespace NMonitoring {
virtual const TCgiParameters& GetParams() const = 0;
virtual const TCgiParameters& GetPostParams() const = 0;
virtual TStringBuf GetPostContent() const = 0;
- virtual HTTP_METHOD GetMethod() const = 0;
+ virtual HTTP_METHOD GetMethod() const = 0;
virtual const THttpHeaders& GetHeaders() const = 0;
virtual TString GetRemoteAddr() const = 0;
};
diff --git a/library/cpp/packedtypes/zigzag.h b/library/cpp/packedtypes/zigzag.h
index ea160864b86..548403f8384 100644
--- a/library/cpp/packedtypes/zigzag.h
+++ b/library/cpp/packedtypes/zigzag.h
@@ -10,8 +10,8 @@
template <typename TSignedInt>
inline auto ZigZagEncode(TSignedInt n) -> std::make_unsigned_t<TSignedInt> {
static_assert(std::is_signed<TSignedInt>::value && std::is_integral<TSignedInt>::value, "Expected signed integral type.");
- auto un = static_cast<std::make_unsigned_t<TSignedInt>>(n);
- return (un << 1) ^ (n >> (CHAR_BIT * sizeof(TSignedInt) - 1));
+ auto un = static_cast<std::make_unsigned_t<TSignedInt>>(n);
+ return (un << 1) ^ (n >> (CHAR_BIT * sizeof(TSignedInt) - 1));
}
template <typename TUnsignedInt>
diff --git a/ydb/core/base/appdata.h b/ydb/core/base/appdata.h
index 777211ce897..c666f7468c0 100644
--- a/ydb/core/base/appdata.h
+++ b/ydb/core/base/appdata.h
@@ -4,9 +4,9 @@
#include "channel_profiles.h"
#include "domain.h"
#include "feature_flags.h"
-#include "nameservice.h"
+#include "nameservice.h"
#include "tablet_types.h"
-#include "resource_profile.h"
+#include "resource_profile.h"
#include "event_filter.h"
#include <ydb/core/control/immediate_control_board_impl.h>
@@ -18,7 +18,7 @@
#include <ydb/core/protos/pqconfig.pb.h>
#include <ydb/core/protos/stream.pb.h>
#include <ydb/library/pdisk_io/aio.h>
-
+
#include <library/cpp/actors/interconnect/poller_tcp.h>
#include <library/cpp/actors/core/executor_thread.h>
#include <library/cpp/actors/util/should_continue.h>
@@ -113,7 +113,7 @@ struct TAppData {
static TIntrusivePtr<ITimeProvider> TimeProvider;
TIntrusivePtr<TDomainsInfo> DomainsInfo;
TIntrusivePtr<TChannelProfiles> ChannelProfiles;
- TIntrusivePtr<TDynamicNameserviceConfig> DynamicNameserviceConfig;
+ TIntrusivePtr<TDynamicNameserviceConfig> DynamicNameserviceConfig;
ui64 ProxySchemeCacheNodes;
ui64 ProxySchemeCacheDistrNodes;
@@ -130,9 +130,9 @@ struct TAppData {
TIntrusivePtr<NInterconnect::TPollerThreads> PollerThreads;
THolder<NKikimrBlobStorage::TNodeWardenServiceSet> StaticBlobStorageConfig;
- THolder<NKikimrCms::TCmsConfig> DefaultCmsConfig;
+ THolder<NKikimrCms::TCmsConfig> DefaultCmsConfig;
- NKikimrStream::TStreamingConfig StreamingConfig;
+ NKikimrStream::TStreamingConfig StreamingConfig;
NKikimrPQ::TPQConfig PQConfig;
NKikimrPQ::TPQClusterDiscoveryConfig PQClusterDiscoveryConfig;
NKikimrNetClassifier::TNetClassifierConfig NetClassifierConfig;
diff --git a/ydb/core/base/counters.cpp b/ydb/core/base/counters.cpp
index bb31a6af0d1..b192fa36a1d 100644
--- a/ydb/core/base/counters.cpp
+++ b/ydb/core/base/counters.cpp
@@ -1,28 +1,28 @@
-#include "counters.h"
-
+#include "counters.h"
+
#include "monitoring_provider.h"
LWTRACE_DEFINE_PROVIDER(MONITORING_PROVIDER)
-namespace NKikimr {
-
-static const THashSet<TString> DATABASE_SERVICES
- = {{ TString("compile"),
- TString("coordinator"),
- TString("dsproxy"),
- TString("dsproxynode"),
- TString("dsproxy_overview"),
- TString("dsproxy_percentile"),
- TString("dsproxy_queue"),
- TString("grpc"),
- TString("interconnect"),
- TString("kqp"),
- TString("processing"),
- TString("proxy"),
+namespace NKikimr {
+
+static const THashSet<TString> DATABASE_SERVICES
+ = {{ TString("compile"),
+ TString("coordinator"),
+ TString("dsproxy"),
+ TString("dsproxynode"),
+ TString("dsproxy_overview"),
+ TString("dsproxy_percentile"),
+ TString("dsproxy_queue"),
+ TString("grpc"),
+ TString("interconnect"),
+ TString("kqp"),
+ TString("processing"),
+ TString("proxy"),
TString("followers"),
- TString("sqs"),
+ TString("sqs"),
TString("storage_pool_stat"),
- TString("tablets"),
+ TString("tablets"),
TString("utils"),
TString("auth"),
TString("ydb"),
@@ -39,25 +39,25 @@ static const THashSet<TString> DATABASE_SERVICES
TString("pqproxy|readSession"),
TString("pqproxy|schemecache"),
TString("pqproxy|mirrorWriteTimeLag"),
- }};
-
-
-static const THashSet<TString> DATABASE_ATTRIBUTE_SERVICES
- = {{ TString("ydb") }};
-
-static const THashSet<TString> DATABASE_ATTRIBUTE_LABELS
- = {{ TString("cloud_id"),
+ }};
+
+
+static const THashSet<TString> DATABASE_ATTRIBUTE_SERVICES
+ = {{ TString("ydb") }};
+
+static const THashSet<TString> DATABASE_ATTRIBUTE_LABELS
+ = {{ TString("cloud_id"),
TString("folder_id"),
TString("database_id")
- }};
-
-using NMonitoring::TDynamicCounters;
-
-const THashSet<TString> &GetDatabaseSensorServices()
-{
- return DATABASE_SERVICES;
-}
-
+ }};
+
+using NMonitoring::TDynamicCounters;
+
+const THashSet<TString> &GetDatabaseSensorServices()
+{
+ return DATABASE_SERVICES;
+}
+
void ReplaceSubgroup(TIntrusivePtr<TDynamicCounters> root, const TString &service)
{
auto serviceGroup = GetServiceCounters(root, service);
@@ -66,35 +66,35 @@ void ReplaceSubgroup(TIntrusivePtr<TDynamicCounters> root, const TString &servic
rt->ReplaceSubgroup(subSvc.empty() ? "counters" : "subsystem", subSvc.empty() ? svc : subSvc, serviceGroup);
}
-const THashSet<TString> &GetDatabaseAttributeSensorServices()
-{
- return DATABASE_ATTRIBUTE_SERVICES;
-}
-
-const THashSet<TString> &GetDatabaseAttributeLabels()
-{
- return DATABASE_ATTRIBUTE_LABELS;
-}
-
-static TIntrusivePtr<TDynamicCounters> SkipLabels(TIntrusivePtr<TDynamicCounters> counters,
- const THashSet<TString> &labels)
-{
- TString name, value;
- do {
- name = "";
- counters->EnumerateSubgroups([&name, &value, &labels](const TString &n, const TString &v) {
- if (labels.contains(n)) {
- name = n;
- value = v;
- }
- });
- if (name)
- counters = counters->GetSubgroup(name, value);
- } while (name);
-
- return counters;
-}
-
+const THashSet<TString> &GetDatabaseAttributeSensorServices()
+{
+ return DATABASE_ATTRIBUTE_SERVICES;
+}
+
+const THashSet<TString> &GetDatabaseAttributeLabels()
+{
+ return DATABASE_ATTRIBUTE_LABELS;
+}
+
+static TIntrusivePtr<TDynamicCounters> SkipLabels(TIntrusivePtr<TDynamicCounters> counters,
+ const THashSet<TString> &labels)
+{
+ TString name, value;
+ do {
+ name = "";
+ counters->EnumerateSubgroups([&name, &value, &labels](const TString &n, const TString &v) {
+ if (labels.contains(n)) {
+ name = n;
+ value = v;
+ }
+ });
+ if (name)
+ counters = counters->GetSubgroup(name, value);
+ } while (name);
+
+ return counters;
+}
+
void OnCounterLookup(const char *methodName, const TString &name, const TString &value) {
GLOBAL_LWPROBE(MONITORING_PROVIDER, MonitoringCounterLookup, methodName, name, value);
}
@@ -108,8 +108,8 @@ std::pair<TString, TString> ExtractSubServiceName(const TString &service)
}
TIntrusivePtr<TDynamicCounters> GetServiceCountersRoot(TIntrusivePtr<TDynamicCounters> root,
- const TString &service)
-{
+ const TString &service)
+{
auto pair = ExtractSubServiceName(service);
if (pair.second.empty())
return root;
@@ -140,15 +140,15 @@ TIntrusivePtr<TDynamicCounters> GetServiceCounters(TIntrusivePtr<TDynamicCounter
return res;
res = SkipLabels(res, SERVICE_COUNTERS_EXTRA_LABELS);
-
+
auto utils = root->GetSubgroup("counters", "utils");
utils = SkipLabels(utils, SERVICE_COUNTERS_EXTRA_LABELS);
auto lookupCounter = utils->GetSubgroup("component", service)->GetCounter("CounterLookups", true);
res->SetLookupCounter(lookupCounter);
res->SetOnLookup(OnCounterLookup);
-
- return res;
-}
-
-
-} // namespace NKikimr
+
+ return res;
+}
+
+
+} // namespace NKikimr
diff --git a/ydb/core/base/counters.h b/ydb/core/base/counters.h
index 92f58c6d3a1..01dc8c4c0f7 100644
--- a/ydb/core/base/counters.h
+++ b/ydb/core/base/counters.h
@@ -1,28 +1,28 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <library/cpp/monlib/dynamic_counters/counters.h>
-
-#include <util/generic/hash_set.h>
-
-namespace NKikimr {
- constexpr char DATABASE_LABEL[] = "database";
- constexpr char SLOT_LABEL[] = "slot";
+
+#include <util/generic/hash_set.h>
+
+namespace NKikimr {
+ constexpr char DATABASE_LABEL[] = "database";
+ constexpr char SLOT_LABEL[] = "slot";
constexpr char HOST_LABEL[] = "host";
-
- // Get counters group for specified service. Skip tenant and slot labels.
- TIntrusivePtr<NMonitoring::TDynamicCounters> GetServiceCounters(TIntrusivePtr<NMonitoring::TDynamicCounters> root,
+
+ // Get counters group for specified service. Skip tenant and slot labels.
+ TIntrusivePtr<NMonitoring::TDynamicCounters> GetServiceCounters(TIntrusivePtr<NMonitoring::TDynamicCounters> root,
const TString &service, bool skipAddedLabels = true);
// Get parent node for subsvc/svc if any. root->svc->subvc => svc, root->svc => root.
TIntrusivePtr<NMonitoring::TDynamicCounters> GetServiceCountersRoot(TIntrusivePtr<NMonitoring::TDynamicCounters> root,
- const TString &service);
+ const TString &service);
// Extract subservice name if any. aba|caba => aba, caba.
std::pair<TString, TString> ExtractSubServiceName(const TString &service);
- // Get list of services which use top-level database labels for own sensors.
- const THashSet<TString> &GetDatabaseSensorServices();
- // Get list of services which use top-level database attribute labels for own sensors.
- const THashSet<TString> &GetDatabaseAttributeSensorServices();
- const THashSet<TString> &GetDatabaseAttributeLabels();
+ // Get list of services which use top-level database labels for own sensors.
+ const THashSet<TString> &GetDatabaseSensorServices();
+ // Get list of services which use top-level database attribute labels for own sensors.
+ const THashSet<TString> &GetDatabaseAttributeSensorServices();
+ const THashSet<TString> &GetDatabaseAttributeLabels();
// Drop all extra labels.
void ReplaceSubgroup(TIntrusivePtr<NMonitoring::TDynamicCounters> root, const TString &service);
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/base/domain.h b/ydb/core/base/domain.h
index f400b5a5743..05346e474aa 100644
--- a/ydb/core/base/domain.h
+++ b/ydb/core/base/domain.h
@@ -2,9 +2,9 @@
#include "defs.h"
#include "tabletid.h"
#include "localdb.h"
-
+
#include <ydb/core/protos/blobstorage_config.pb.h>
-
+
#include <util/generic/map.h>
#include <util/generic/hash.h>
#include <util/generic/ptr.h>
@@ -17,8 +17,8 @@ struct TDomainsInfo : public TThrRefBase {
static const ui32 MaxUserTag = 0xFFFFF;
static const ui32 BadDomainId = 0xFFFFFFFFu;
static const ui64 BadTabletId = 0xFFFFFFFFFFFFFFFFull;
- static const ui32 DomainBits = 5;
- static const ui32 MaxDomainId = (1 << DomainBits) - 1;
+ static const ui32 DomainBits = 5;
+ static const ui32 MaxDomainId = (1 << DomainBits) - 1;
// it's very sad mistake
// MakeTabletID should be called with hiveUid == 0 for all domain's static tablets
@@ -73,10 +73,10 @@ struct TDomainsInfo : public TThrRefBase {
struct TDomain : public TThrRefBase {
using TPtr = TIntrusivePtr<TDomain>;
- using TVectorUi64 = TVector<ui64>;
- using TVectorUi32 = TVector<ui32>;
+ using TVectorUi64 = TVector<ui64>;
+ using TVectorUi32 = TVector<ui32>;
using TStoragePoolKinds = THashMap<TString, NKikimrBlobStorage::TDefineStoragePool>;
-
+
const ui32 DomainUid;
const ui32 DefaultStateStorageGroup;
const ui32 DefaultSchemeBoardGroup;
@@ -98,9 +98,9 @@ struct TDomainsInfo : public TThrRefBase {
TDomain(const TString &name, ui32 domainUid, ui64 schemeRootId,
ui32 defaultStateStorageGroup, ui32 defaultSchemeBoardGroup,
TVectorUi32 stateStorageGroup,
- TVectorUi64 coordinators, TVectorUi64 mediators, TVectorUi64 allocators,
- ui32 defaultHiveUid, TVectorUi32 hivesUids,
- ui64 domainPlanResolution, const TStoragePoolKinds &poolTypes)
+ TVectorUi64 coordinators, TVectorUi64 mediators, TVectorUi64 allocators,
+ ui32 defaultHiveUid, TVectorUi32 hivesUids,
+ ui64 domainPlanResolution, const TStoragePoolKinds &poolTypes)
: DomainUid(domainUid)
, DefaultStateStorageGroup(defaultStateStorageGroup)
, DefaultSchemeBoardGroup(defaultSchemeBoardGroup)
@@ -113,7 +113,7 @@ struct TDomainsInfo : public TThrRefBase {
, DefaultHiveUid(defaultHiveUid)
, HiveUids(std::move(hivesUids))
, DomainPlanResolution(domainPlanResolution)
- , StoragePoolTypes(poolTypes)
+ , StoragePoolTypes(poolTypes)
{}
public:
@@ -123,10 +123,10 @@ struct TDomainsInfo : public TThrRefBase {
ui32 defaultStateStorageGroup, ui32 defaultSchemeBoardGroup,
const TUidsContainerUi32 &stateStorageGroups,
ui32 defaultHiveUid,const TUidsContainerUi32 &hiveUids,
- ui64 planResolution,
- const TUidsContainerUi64 &coordinatorUids,
- const TUidsContainerUi64 &mediatorUids,
- const TUidsContainerUi64 &allocatorUids,
+ ui64 planResolution,
+ const TUidsContainerUi64 &coordinatorUids,
+ const TUidsContainerUi64 &mediatorUids,
+ const TUidsContainerUi64 &allocatorUids,
const TStoragePoolKinds &poolTypes = TStoragePoolKinds())
{
return new TDomain(name, domainUid, schemeRoot,
@@ -257,7 +257,7 @@ struct TDomainsInfo : public TThrRefBase {
}
void AddDomain(TDomain *domain) {
- Y_VERIFY(domain->DomainUid <= MaxDomainId);
+ Y_VERIFY(domain->DomainUid <= MaxDomainId);
Domains[domain->DomainUid] = domain;
DomainByName[domain->Name] = domain;
Y_VERIFY(Domains.size() == DomainByName.size());
diff --git a/ydb/core/base/events.h b/ydb/core/base/events.h
index 2dd48c7bf2f..f5fedfe19b2 100644
--- a/ydb/core/base/events.h
+++ b/ydb/core/base/events.h
@@ -70,31 +70,31 @@ struct TKikimrEvents : TEvents {
ES_SELF_PING,
ES_PIPECACHE,
ES_PQ_PROXY,
- ES_CMS,
- ES_NODE_BROKER,
+ ES_CMS,
+ ES_NODE_BROKER,
ES_TX_ALLOCATOR, //4152
// reserve event space for each RTMR process
ES_RTMR_STORAGE,
ES_RTMR_PROXY,
ES_RTMR_PUSHER,
ES_RTMR_HOST,
- ES_RESOURCE_BROKER,
+ ES_RESOURCE_BROKER,
ES_VIEWER,
ES_SUB_DOMAIN,
ES_GRPC_PROXY_STATUS, //OLD
ES_SQS,
- ES_BLOCKSTORE, //4162
+ ES_BLOCKSTORE, //4162
ES_RTMR_ICBUS,
- ES_TENANT_POOL,
+ ES_TENANT_POOL,
ES_USER_REGISTRY,
ES_TVM_SETTINGS_UPDATER,
ES_PQ_CLUSTERS_UPDATER,
- ES_TENANT_SLOT_BROKER,
+ ES_TENANT_SLOT_BROKER,
ES_GRPC_CALLS,
ES_CONSOLE,
ES_KESUS_PROXY,
ES_KESUS,
- ES_CONFIGS_DISPATCHER,
+ ES_CONFIGS_DISPATCHER,
ES_IAM_SERVICE,
ES_FOLDER_SERVICE,
ES_GRPC_MON,
diff --git a/ydb/core/base/localdb.cpp b/ydb/core/base/localdb.cpp
index ae0802cf276..d07ee26fc1f 100644
--- a/ydb/core/base/localdb.cpp
+++ b/ydb/core/base/localdb.cpp
@@ -2,64 +2,64 @@
#include "compile_time_flags.h"
#include <ydb/core/protos/resource_broker.pb.h>
-
+
namespace NKikimr {
namespace NLocalDb {
-TCompactionPolicy::TBackgroundPolicy::TBackgroundPolicy()
- : Threshold(101)
- , PriorityBase(100)
- , TimeFactor(1.0)
- , ResourceBrokerTask(BackgroundCompactionTaskName)
-{}
-
-TCompactionPolicy::TBackgroundPolicy::TBackgroundPolicy(ui32 threshold,
- ui32 priorityBase,
- double timeFactor,
- const TString &resourceBrokerTask)
- : Threshold(threshold)
- , PriorityBase(priorityBase)
- , TimeFactor(timeFactor)
- , ResourceBrokerTask(resourceBrokerTask)
-{}
-
+TCompactionPolicy::TBackgroundPolicy::TBackgroundPolicy()
+ : Threshold(101)
+ , PriorityBase(100)
+ , TimeFactor(1.0)
+ , ResourceBrokerTask(BackgroundCompactionTaskName)
+{}
+
+TCompactionPolicy::TBackgroundPolicy::TBackgroundPolicy(ui32 threshold,
+ ui32 priorityBase,
+ double timeFactor,
+ const TString &resourceBrokerTask)
+ : Threshold(threshold)
+ , PriorityBase(priorityBase)
+ , TimeFactor(timeFactor)
+ , ResourceBrokerTask(resourceBrokerTask)
+{}
+
TCompactionPolicy::TBackgroundPolicy::TBackgroundPolicy(const NKikimrSchemeOp::TCompactionPolicy::TBackgroundPolicy &policyPb)
: Threshold(policyPb.HasThreshold() ? policyPb.GetThreshold() : 101)
, PriorityBase(policyPb.HasPriorityBase() ? policyPb.GetPriorityBase() : 100)
, TimeFactor(policyPb.HasTimeFactor() ? policyPb.GetTimeFactor() : 1.0)
- , ResourceBrokerTask(policyPb.HasResourceBrokerTask() ? policyPb.GetResourceBrokerTask() : BackgroundCompactionTaskName)
-{}
-
+ , ResourceBrokerTask(policyPb.HasResourceBrokerTask() ? policyPb.GetResourceBrokerTask() : BackgroundCompactionTaskName)
+{}
+
void TCompactionPolicy::TBackgroundPolicy::Serialize(NKikimrSchemeOp::TCompactionPolicy::TBackgroundPolicy& policyPb) const
-{
- policyPb.SetThreshold(Threshold);
- policyPb.SetPriorityBase(PriorityBase);
- policyPb.SetTimeFactor(TimeFactor);
- policyPb.SetResourceBrokerTask(ResourceBrokerTask);
-}
-
-TCompactionPolicy::TGenerationPolicy::TGenerationPolicy(ui64 sizeToCompact,
- ui32 countToCompact,
- ui32 forceCountToCompact,
- ui64 forceSizeToCompact,
- const TString &resourceBrokerTask,
- bool keepInCache,
- const TBackgroundPolicy &backgroundCompactionPolicy)
- : SizeToCompact(sizeToCompact)
- , CountToCompact(countToCompact)
- , ForceCountToCompact(forceCountToCompact)
- , ForceSizeToCompact(forceSizeToCompact)
- , CompactionBrokerQueue(Max<ui32>())
- , ResourceBrokerTask(resourceBrokerTask)
- , KeepInCache(keepInCache)
- , BackgroundCompactionPolicy(backgroundCompactionPolicy)
+{
+ policyPb.SetThreshold(Threshold);
+ policyPb.SetPriorityBase(PriorityBase);
+ policyPb.SetTimeFactor(TimeFactor);
+ policyPb.SetResourceBrokerTask(ResourceBrokerTask);
+}
+
+TCompactionPolicy::TGenerationPolicy::TGenerationPolicy(ui64 sizeToCompact,
+ ui32 countToCompact,
+ ui32 forceCountToCompact,
+ ui64 forceSizeToCompact,
+ const TString &resourceBrokerTask,
+ bool keepInCache,
+ const TBackgroundPolicy &backgroundCompactionPolicy)
+ : SizeToCompact(sizeToCompact)
+ , CountToCompact(countToCompact)
+ , ForceCountToCompact(forceCountToCompact)
+ , ForceSizeToCompact(forceSizeToCompact)
+ , CompactionBrokerQueue(Max<ui32>())
+ , ResourceBrokerTask(resourceBrokerTask)
+ , KeepInCache(keepInCache)
+ , BackgroundCompactionPolicy(backgroundCompactionPolicy)
, ExtraCompactionPercent(10)
, ExtraCompactionExpPercent(110)
, ExtraCompactionMinSize(16384)
, ExtraCompactionExpMaxSize(sizeToCompact / countToCompact)
, UpliftPartSize(sizeToCompact / countToCompact)
-{}
-
+{}
+
TCompactionPolicy::TGenerationPolicy::TGenerationPolicy(const NKikimrSchemeOp::TCompactionPolicy::TGenerationPolicy &policyPb)
: SizeToCompact(policyPb.HasSizeToCompact() ? policyPb.GetSizeToCompact() : 0)
, CountToCompact(policyPb.HasCountToCompact() ? policyPb.GetCountToCompact() : 5)
@@ -74,44 +74,44 @@ TCompactionPolicy::TGenerationPolicy::TGenerationPolicy(const NKikimrSchemeOp::T
, ExtraCompactionMinSize(policyPb.HasExtraCompactionMinSize() ? policyPb.GetExtraCompactionMinSize() : 16384)
, ExtraCompactionExpMaxSize(policyPb.HasExtraCompactionExpMaxSize() ? policyPb.GetExtraCompactionExpMaxSize() : SizeToCompact / CountToCompact)
, UpliftPartSize(policyPb.HasUpliftPartSize() ? policyPb.GetUpliftPartSize() : SizeToCompact / CountToCompact)
-{
- if (!ResourceBrokerTask)
- ResourceBrokerTask = LegacyQueueIdToTaskName(CompactionBrokerQueue);
-}
-
+{
+ if (!ResourceBrokerTask)
+ ResourceBrokerTask = LegacyQueueIdToTaskName(CompactionBrokerQueue);
+}
+
void TCompactionPolicy::TGenerationPolicy::Serialize(NKikimrSchemeOp::TCompactionPolicy::TGenerationPolicy& policyPb) const
-{
- policyPb.SetSizeToCompact(SizeToCompact);
- policyPb.SetCountToCompact(CountToCompact);
- policyPb.SetForceCountToCompact(ForceCountToCompact);
- policyPb.SetForceSizeToCompact(ForceSizeToCompact);
- policyPb.SetCompactionBrokerQueue(CompactionBrokerQueue);
- policyPb.SetResourceBrokerTask(ResourceBrokerTask);
- policyPb.SetKeepInCache(KeepInCache);
- BackgroundCompactionPolicy.Serialize(*policyPb.MutableBackgroundCompactionPolicy());
+{
+ policyPb.SetSizeToCompact(SizeToCompact);
+ policyPb.SetCountToCompact(CountToCompact);
+ policyPb.SetForceCountToCompact(ForceCountToCompact);
+ policyPb.SetForceSizeToCompact(ForceSizeToCompact);
+ policyPb.SetCompactionBrokerQueue(CompactionBrokerQueue);
+ policyPb.SetResourceBrokerTask(ResourceBrokerTask);
+ policyPb.SetKeepInCache(KeepInCache);
+ BackgroundCompactionPolicy.Serialize(*policyPb.MutableBackgroundCompactionPolicy());
policyPb.SetExtraCompactionPercent(ExtraCompactionPercent);
policyPb.SetExtraCompactionMinSize(ExtraCompactionMinSize);
policyPb.SetExtraCompactionExpPercent(ExtraCompactionExpPercent);
policyPb.SetExtraCompactionExpMaxSize(ExtraCompactionExpMaxSize);
policyPb.SetUpliftPartSize(UpliftPartSize);
-}
-
+}
+
TCompactionPolicy::TCompactionPolicy()
: InMemSizeToSnapshot(4 * 1024 * 1024)
, InMemStepsToSnapshot(300)
, InMemForceStepsToSnapshot(500)
, InMemForceSizeToSnapshot(16 * 1024 * 1024)
- , InMemCompactionBrokerQueue(0)
- , InMemResourceBrokerTask(LegacyQueueIdToTaskName(0))
+ , InMemCompactionBrokerQueue(0)
+ , InMemResourceBrokerTask(LegacyQueueIdToTaskName(0))
, ReadAheadHiThreshold(64 * 1024 * 1024)
, ReadAheadLoThreshold(16 * 1024 * 1024)
, MinDataPageSize(7*1024)
- , SnapshotCompactionBrokerQueue(0)
- , SnapshotResourceBrokerTask(LegacyQueueIdToTaskName(0))
- , BackupCompactionBrokerQueue(1)
- , BackupResourceBrokerTask(ScanTaskName)
- , DefaultTaskPriority(5)
- , BackgroundSnapshotPolicy()
+ , SnapshotCompactionBrokerQueue(0)
+ , SnapshotResourceBrokerTask(LegacyQueueIdToTaskName(0))
+ , BackupCompactionBrokerQueue(1)
+ , BackupResourceBrokerTask(ScanTaskName)
+ , DefaultTaskPriority(5)
+ , BackgroundSnapshotPolicy()
, LogOverheadSizeToSnapshot(16 * 1024 * 1024)
, LogOverheadCountToSnapshot(500)
, DroppedRowsPercentToCompact(50)
@@ -132,7 +132,7 @@ TCompactionPolicy::TCompactionPolicy(const NKikimrSchemeOp::TCompactionPolicy& p
, SnapshotCompactionBrokerQueue(policyPb.HasSnapBrokerQueue() ? policyPb.GetSnapBrokerQueue() : 0)
, SnapshotResourceBrokerTask(policyPb.HasSnapshotResourceBrokerTask() ? policyPb.GetSnapshotResourceBrokerTask() : LegacyQueueIdToTaskName(0))
, BackupCompactionBrokerQueue(policyPb.HasBackupBrokerQueue() ? policyPb.GetBackupBrokerQueue() : 1)
- , BackupResourceBrokerTask(policyPb.HasBackupResourceBrokerTask() ? policyPb.GetBackupResourceBrokerTask() : ScanTaskName)
+ , BackupResourceBrokerTask(policyPb.HasBackupResourceBrokerTask() ? policyPb.GetBackupResourceBrokerTask() : ScanTaskName)
, DefaultTaskPriority(policyPb.HasDefaultTaskPriority() ? policyPb.GetDefaultTaskPriority() : 5)
, BackgroundSnapshotPolicy(policyPb.HasBackgroundSnapshotPolicy() ? policyPb.GetBackgroundSnapshotPolicy() : TBackgroundPolicy())
, LogOverheadSizeToSnapshot(policyPb.HasLogOverheadSizeToSnapshot() ? policyPb.GetLogOverheadSizeToSnapshot() : 16 * 1024 * 1024)
@@ -141,17 +141,17 @@ TCompactionPolicy::TCompactionPolicy(const NKikimrSchemeOp::TCompactionPolicy& p
, CompactionStrategy(policyPb.GetCompactionStrategy())
, KeepEraseMarkers(policyPb.HasKeepEraseMarkers() ? policyPb.GetKeepEraseMarkers() : false)
{
- if (!InMemResourceBrokerTask)
- InMemResourceBrokerTask = LegacyQueueIdToTaskName(InMemCompactionBrokerQueue);
- if (!SnapshotResourceBrokerTask)
- SnapshotResourceBrokerTask = LegacyQueueIdToTaskName(SnapshotCompactionBrokerQueue);
+ if (!InMemResourceBrokerTask)
+ InMemResourceBrokerTask = LegacyQueueIdToTaskName(InMemCompactionBrokerQueue);
+ if (!SnapshotResourceBrokerTask)
+ SnapshotResourceBrokerTask = LegacyQueueIdToTaskName(SnapshotCompactionBrokerQueue);
if (!BackupResourceBrokerTask || IsLegacyQueueIdTaskName(BackupResourceBrokerTask))
BackupResourceBrokerTask = ScanTaskName;
Generations.reserve(policyPb.GenerationSize());
for (ui32 i = 0; i < policyPb.GenerationSize(); ++i) {
const auto& g = policyPb.GetGeneration(i);
Y_VERIFY_DEBUG(g.GetGenerationId() == i);
- Generations.emplace_back(g);
+ Generations.emplace_back(g);
}
if (policyPb.HasShardPolicy()) {
ShardPolicy.CopyFrom(policyPb.GetShardPolicy());
@@ -163,17 +163,17 @@ void TCompactionPolicy::Serialize(NKikimrSchemeOp::TCompactionPolicy& policyPb)
policyPb.SetInMemStepsToSnapshot(InMemStepsToSnapshot);
policyPb.SetInMemForceStepsToSnapshot(InMemForceStepsToSnapshot);
policyPb.SetInMemForceSizeToSnapshot(InMemForceSizeToSnapshot);
- policyPb.SetInMemCompactionBrokerQueue(InMemCompactionBrokerQueue);
- policyPb.SetInMemResourceBrokerTask(InMemResourceBrokerTask);
+ policyPb.SetInMemCompactionBrokerQueue(InMemCompactionBrokerQueue);
+ policyPb.SetInMemResourceBrokerTask(InMemResourceBrokerTask);
policyPb.SetReadAheadHiThreshold(ReadAheadHiThreshold);
policyPb.SetReadAheadLoThreshold(ReadAheadLoThreshold);
policyPb.SetMinDataPageSize(MinDataPageSize);
- policyPb.SetSnapBrokerQueue(SnapshotCompactionBrokerQueue);
- policyPb.SetSnapshotResourceBrokerTask(SnapshotResourceBrokerTask);
- policyPb.SetBackupBrokerQueue(BackupCompactionBrokerQueue);
- policyPb.SetBackupResourceBrokerTask(BackupResourceBrokerTask);
- policyPb.SetDefaultTaskPriority(DefaultTaskPriority);
- BackgroundSnapshotPolicy.Serialize(*policyPb.MutableBackgroundSnapshotPolicy());
+ policyPb.SetSnapBrokerQueue(SnapshotCompactionBrokerQueue);
+ policyPb.SetSnapshotResourceBrokerTask(SnapshotResourceBrokerTask);
+ policyPb.SetBackupBrokerQueue(BackupCompactionBrokerQueue);
+ policyPb.SetBackupResourceBrokerTask(BackupResourceBrokerTask);
+ policyPb.SetDefaultTaskPriority(DefaultTaskPriority);
+ BackgroundSnapshotPolicy.Serialize(*policyPb.MutableBackgroundSnapshotPolicy());
policyPb.SetLogOverheadSizeToSnapshot(LogOverheadSizeToSnapshot);
policyPb.SetLogOverheadCountToSnapshot(LogOverheadCountToSnapshot);
policyPb.SetDroppedRowsPercentToCompact(DroppedRowsPercentToCompact);
@@ -188,9 +188,9 @@ void TCompactionPolicy::Serialize(NKikimrSchemeOp::TCompactionPolicy& policyPb)
}
for (ui32 i = 0; i < Generations.size(); ++i) {
- auto &g = *policyPb.AddGeneration();
+ auto &g = *policyPb.AddGeneration();
g.SetGenerationId(i);
- Generations[i].Serialize(g);
+ Generations[i].Serialize(g);
}
}
@@ -206,12 +206,12 @@ TCompactionPolicyPtr CreateDefaultTablePolicy() {
TCompactionPolicyPtr CreateDefaultUserTablePolicy() {
TCompactionPolicyPtr userPolicy = new TCompactionPolicy();
userPolicy->Generations.reserve(3);
- userPolicy->Generations.push_back({0, 8, 8, 128 * 1024 * 1024,
- LegacyQueueIdToTaskName(1), true});
+ userPolicy->Generations.push_back({0, 8, 8, 128 * 1024 * 1024,
+ LegacyQueueIdToTaskName(1), true});
userPolicy->Generations.push_back({40 * 1024 * 1024, 5, 16, 512 * 1024 * 1024,
- LegacyQueueIdToTaskName(2), false});
+ LegacyQueueIdToTaskName(2), false});
userPolicy->Generations.push_back({400 * 1024 * 1024, 5, 16, 16ull * 1024 * 1024 * 1024,
- LegacyQueueIdToTaskName(3), false});
+ LegacyQueueIdToTaskName(3), false});
#if KIKIMR_DEFAULT_SHARDED_COMPACTION
userPolicy->CompactionStrategy = NKikimrSchemeOp::CompactionStrategySharded;
#endif
@@ -227,22 +227,22 @@ bool ValidateCompactionPolicyChange(const TCompactionPolicy& oldPolicy, const TC
return true;
}
-TString LegacyQueueIdToTaskName(ui32 id)
-{
- switch (id) {
- case 0:
- return "compaction_gen0";
- case 1:
- return "compaction_gen1";
- case 2:
- return "compaction_gen2";
- case 3:
- return "compaction_gen3";
- default:
- return UnknownTaskName;
- };
-}
-
+TString LegacyQueueIdToTaskName(ui32 id)
+{
+ switch (id) {
+ case 0:
+ return "compaction_gen0";
+ case 1:
+ return "compaction_gen1";
+ case 2:
+ return "compaction_gen2";
+ case 3:
+ return "compaction_gen3";
+ default:
+ return UnknownTaskName;
+ };
+}
+
bool IsLegacyQueueIdTaskName(const TString& taskName)
{
if (taskName.size() == LegacyQueueIdTaskNamePrefix.size() + 1 &&
@@ -255,13 +255,13 @@ bool IsLegacyQueueIdTaskName(const TString& taskName)
return false;
}
-const TString DefaultQueueName = "queue_default";
-const TString UnknownTaskName = "unknown";
-const TString TransactionTaskName = "transaction";
-const TString ScanTaskName = "scan";
-const TString BackgroundCompactionTaskName = "background_compaction";
+const TString DefaultQueueName = "queue_default";
+const TString UnknownTaskName = "unknown";
+const TString TransactionTaskName = "transaction";
+const TString ScanTaskName = "scan";
+const TString BackgroundCompactionTaskName = "background_compaction";
const TString KqpResourceManagerTaskName = "kqp_query";
const TString KqpResourceManagerQueue = "queue_kqp_resource_manager";
const TString LegacyQueueIdTaskNamePrefix = "compaction_gen";
-
+
}}
diff --git a/ydb/core/base/localdb.h b/ydb/core/base/localdb.h
index 952e9f11b14..8679cb286fc 100644
--- a/ydb/core/base/localdb.h
+++ b/ydb/core/base/localdb.h
@@ -11,57 +11,57 @@ namespace NKikimr {
namespace NLocalDb {
struct TCompactionPolicy : public TThrRefBase {
- struct TBackgroundPolicy {
- ui32 Threshold;
- ui32 PriorityBase;
- double TimeFactor;
- TString ResourceBrokerTask;
-
- TBackgroundPolicy();
- TBackgroundPolicy(ui32 threshold, ui32 priorityBase, double timeFactor, const TString &resourceBrokerTask);
+ struct TBackgroundPolicy {
+ ui32 Threshold;
+ ui32 PriorityBase;
+ double TimeFactor;
+ TString ResourceBrokerTask;
+
+ TBackgroundPolicy();
+ TBackgroundPolicy(ui32 threshold, ui32 priorityBase, double timeFactor, const TString &resourceBrokerTask);
TBackgroundPolicy(const NKikimrSchemeOp::TCompactionPolicy::TBackgroundPolicy &policyPb);
-
+
void Serialize(NKikimrSchemeOp::TCompactionPolicy::TBackgroundPolicy& policyPb) const;
-
- bool operator ==(const TBackgroundPolicy& p) const {
- return (Threshold == p.Threshold
- && PriorityBase == p.PriorityBase
- && TimeFactor == p.TimeFactor
- && ResourceBrokerTask == p.ResourceBrokerTask);
- }
- };
-
+
+ bool operator ==(const TBackgroundPolicy& p) const {
+ return (Threshold == p.Threshold
+ && PriorityBase == p.PriorityBase
+ && TimeFactor == p.TimeFactor
+ && ResourceBrokerTask == p.ResourceBrokerTask);
+ }
+ };
+
struct TGenerationPolicy {
ui64 SizeToCompact;
ui32 CountToCompact;
ui32 ForceCountToCompact;
ui64 ForceSizeToCompact;
- ui32 CompactionBrokerQueue; // TODO: remove deprecated field
- TString ResourceBrokerTask;
+ ui32 CompactionBrokerQueue; // TODO: remove deprecated field
+ TString ResourceBrokerTask;
bool KeepInCache;
- TBackgroundPolicy BackgroundCompactionPolicy;
+ TBackgroundPolicy BackgroundCompactionPolicy;
ui32 ExtraCompactionPercent;
ui32 ExtraCompactionExpPercent;
ui64 ExtraCompactionMinSize;
ui64 ExtraCompactionExpMaxSize;
ui64 UpliftPartSize;
- TGenerationPolicy(ui64 sizeToCompact, ui32 countToCompact, ui32 forceCountToCompact,
- ui64 forceSizeToCompact, const TString &resourceBrokerTask,
- bool keepInCache,
- const TBackgroundPolicy &backgroundCompactionPolicy = TBackgroundPolicy());
+ TGenerationPolicy(ui64 sizeToCompact, ui32 countToCompact, ui32 forceCountToCompact,
+ ui64 forceSizeToCompact, const TString &resourceBrokerTask,
+ bool keepInCache,
+ const TBackgroundPolicy &backgroundCompactionPolicy = TBackgroundPolicy());
TGenerationPolicy(const NKikimrSchemeOp::TCompactionPolicy::TGenerationPolicy &policyPb);
-
+
void Serialize(NKikimrSchemeOp::TCompactionPolicy::TGenerationPolicy& policyPb) const;
-
+
bool operator ==(const TGenerationPolicy& p) const {
return SizeToCompact == p.SizeToCompact
&& CountToCompact == p.CountToCompact
&& ForceCountToCompact == p.ForceCountToCompact
&& ForceSizeToCompact == p.ForceSizeToCompact
- && CompactionBrokerQueue == p.CompactionBrokerQueue
- && ResourceBrokerTask == p.ResourceBrokerTask
- && KeepInCache == p.KeepInCache
+ && CompactionBrokerQueue == p.CompactionBrokerQueue
+ && ResourceBrokerTask == p.ResourceBrokerTask
+ && KeepInCache == p.KeepInCache
&& BackgroundCompactionPolicy == p.BackgroundCompactionPolicy
&& ExtraCompactionPercent == p.ExtraCompactionPercent
&& ExtraCompactionExpPercent == p.ExtraCompactionExpPercent
@@ -75,17 +75,17 @@ struct TCompactionPolicy : public TThrRefBase {
ui32 InMemStepsToSnapshot;
ui32 InMemForceStepsToSnapshot;
ui64 InMemForceSizeToSnapshot;
- ui32 InMemCompactionBrokerQueue; // TODO: remove deprecated field
- TString InMemResourceBrokerTask;
+ ui32 InMemCompactionBrokerQueue; // TODO: remove deprecated field
+ TString InMemResourceBrokerTask;
ui64 ReadAheadHiThreshold;
ui64 ReadAheadLoThreshold;
ui32 MinDataPageSize;
- ui32 SnapshotCompactionBrokerQueue; // TODO: remove deprecated field
- TString SnapshotResourceBrokerTask;
- ui32 BackupCompactionBrokerQueue; // TODO: remove deprecated field
- TString BackupResourceBrokerTask;
- ui32 DefaultTaskPriority;
- TBackgroundPolicy BackgroundSnapshotPolicy;
+ ui32 SnapshotCompactionBrokerQueue; // TODO: remove deprecated field
+ TString SnapshotResourceBrokerTask;
+ ui32 BackupCompactionBrokerQueue; // TODO: remove deprecated field
+ TString BackupResourceBrokerTask;
+ ui32 DefaultTaskPriority;
+ TBackgroundPolicy BackgroundSnapshotPolicy;
ui64 LogOverheadSizeToSnapshot;
ui32 LogOverheadCountToSnapshot;
ui32 DroppedRowsPercentToCompact;
@@ -105,17 +105,17 @@ struct TCompactionPolicy : public TThrRefBase {
&& InMemStepsToSnapshot == p.InMemStepsToSnapshot
&& InMemForceStepsToSnapshot == p.InMemForceStepsToSnapshot
&& InMemForceSizeToSnapshot == p.InMemForceSizeToSnapshot
- && InMemCompactionBrokerQueue == p.InMemCompactionBrokerQueue
- && InMemResourceBrokerTask == p.InMemResourceBrokerTask
+ && InMemCompactionBrokerQueue == p.InMemCompactionBrokerQueue
+ && InMemResourceBrokerTask == p.InMemResourceBrokerTask
&& ReadAheadHiThreshold == p.ReadAheadHiThreshold
&& ReadAheadLoThreshold == p.ReadAheadLoThreshold
&& MinDataPageSize == p.MinDataPageSize
&& Generations == p.Generations
- && SnapshotCompactionBrokerQueue == p.SnapshotCompactionBrokerQueue
- && SnapshotResourceBrokerTask == p.SnapshotResourceBrokerTask
- && BackupCompactionBrokerQueue == p.BackupCompactionBrokerQueue
- && BackupResourceBrokerTask == p.BackupResourceBrokerTask
- && DefaultTaskPriority == p.DefaultTaskPriority
+ && SnapshotCompactionBrokerQueue == p.SnapshotCompactionBrokerQueue
+ && SnapshotResourceBrokerTask == p.SnapshotResourceBrokerTask
+ && BackupCompactionBrokerQueue == p.BackupCompactionBrokerQueue
+ && BackupResourceBrokerTask == p.BackupResourceBrokerTask
+ && DefaultTaskPriority == p.DefaultTaskPriority
&& BackgroundSnapshotPolicy == p.BackgroundSnapshotPolicy
&& LogOverheadSizeToSnapshot == p.LogOverheadSizeToSnapshot
&& LogOverheadCountToSnapshot == p.LogOverheadCountToSnapshot
@@ -133,19 +133,19 @@ TCompactionPolicyPtr CreateDefaultUserTablePolicy();
bool ValidateCompactionPolicyChange(const TCompactionPolicy& oldPolicy, const TCompactionPolicy& newPolicy, TString& err);
-// Get Resource Broker task type name by Compaction Broker queue ID.
-TString LegacyQueueIdToTaskName(ui32 id);
-
+// Get Resource Broker task type name by Compaction Broker queue ID.
+TString LegacyQueueIdToTaskName(ui32 id);
+
// Check if Resource Broker task name is for a legacy queue ID.
bool IsLegacyQueueIdTaskName(const TString& taskName);
-extern const TString DefaultQueueName;
-extern const TString UnknownTaskName;
-extern const TString TransactionTaskName;
-extern const TString ScanTaskName;
-extern const TString BackgroundCompactionTaskName;
+extern const TString DefaultQueueName;
+extern const TString UnknownTaskName;
+extern const TString TransactionTaskName;
+extern const TString ScanTaskName;
+extern const TString BackgroundCompactionTaskName;
extern const TString KqpResourceManagerTaskName;
extern const TString KqpResourceManagerQueue;
extern const TString LegacyQueueIdTaskNamePrefix;
-
+
}}
diff --git a/ydb/core/base/location.h b/ydb/core/base/location.h
index 8d0a991d394..fa6e4ff00d6 100644
--- a/ydb/core/base/location.h
+++ b/ydb/core/base/location.h
@@ -1,27 +1,27 @@
-#pragma once
-#include "defs.h"
-
-#include <util/digest/murmur.h>
-#include <util/generic/string.h>
-
-namespace NKikimr {
- inline ui32 DataCenterFromString(const TString &dc)
- {
+#pragma once
+#include "defs.h"
+
+#include <util/digest/murmur.h>
+#include <util/generic/string.h>
+
+namespace NKikimr {
+ inline ui32 DataCenterFromString(const TString &dc)
+ {
ui32 res = 0;
strncpy(reinterpret_cast<char *>(&res), dc.data(), sizeof(res));
- return res;
- }
-
- inline TString DataCenterToString(ui32 dc)
- {
- char str[sizeof(dc) + 1];
- str[sizeof(dc)] = 0;
- strncpy(str, reinterpret_cast<char *>(&dc), sizeof(dc));
- return str;
- }
-
- inline ui32 RackFromString(const TString &rack)
- {
+ return res;
+ }
+
+ inline TString DataCenterToString(ui32 dc)
+ {
+ char str[sizeof(dc) + 1];
+ str[sizeof(dc)] = 0;
+ strncpy(str, reinterpret_cast<char *>(&dc), sizeof(dc));
+ return str;
+ }
+
+ inline ui32 RackFromString(const TString &rack)
+ {
return MurmurHash<ui32>(rack.data(), rack.size());
- }
-} // namespace NKikimr
+ }
+} // namespace NKikimr
diff --git a/ydb/core/base/nameservice.h b/ydb/core/base/nameservice.h
index 0587cb7ddef..dc023bc8ac1 100644
--- a/ydb/core/base/nameservice.h
+++ b/ydb/core/base/nameservice.h
@@ -1,12 +1,12 @@
-#pragma once
-
-#include "defs.h"
-
-namespace NKikimr {
-
-struct TDynamicNameserviceConfig : public TThrRefBase {
- ui32 MaxStaticNodeId;
- ui32 MaxDynamicNodeId;
-};
-
-} // NKikimr
+#pragma once
+
+#include "defs.h"
+
+namespace NKikimr {
+
+struct TDynamicNameserviceConfig : public TThrRefBase {
+ ui32 MaxStaticNodeId;
+ ui32 MaxDynamicNodeId;
+};
+
+} // NKikimr
diff --git a/ydb/core/base/path.cpp b/ydb/core/base/path.cpp
index 905da3a3403..0cfb16f99dc 100644
--- a/ydb/core/base/path.cpp
+++ b/ydb/core/base/path.cpp
@@ -1,8 +1,8 @@
#include "path.h"
#include <util/string/builder.h>
-#include <util/string/printf.h>
-
+#include <util/string/printf.h>
+
namespace NKikimr {
TVector<TString> SplitPath(TString path) {
@@ -47,15 +47,15 @@ TString JoinPath(const TVector<TString>& path) {
return result;
}
-TString CanonizePath(const TString &path)
-{
- if (!path)
+TString CanonizePath(const TString &path)
+{
+ if (!path)
return TString();
-
+
const auto parts = SplitPath(path);
return CanonizePath(parts);
-}
-
+}
+
TString CanonizePath(const TVector<TString>& path) {
if (path.empty())
return TString();
@@ -108,29 +108,29 @@ TString::const_iterator PathPartBrokenAt(const TString &part, const TStringBuf e
&& !basicSymbols.Contains(*it)
&& !extraSymbols.Contains(*it)) {
return it;
- }
- }
-
+ }
+ }
+
return part.end();
}
-
-bool CheckDbPath(const TString &path, const TString &domain, TString &error) {
- auto parts = SplitPath(path);
-
- if (parts.empty()) {
- error = "Database path cannot be empty or root";
- return false;
- }
-
- if (parts.front() != domain) {
+
+bool CheckDbPath(const TString &path, const TString &domain, TString &error) {
+ auto parts = SplitPath(path);
+
+ if (parts.empty()) {
+ error = "Database path cannot be empty or root";
+ return false;
+ }
+
+ if (parts.front() != domain) {
error = Sprintf("Database path should be in domain /%s", domain.data());
- return false;
- }
-
- for (auto &part : parts) {
+ return false;
+ }
+
+ for (auto &part : parts) {
if (!part) {
error = "Database names and path parts shouldn't be empty";
- return false;
+ return false;
}
auto brokenAt = PathPartBrokenAt(part);
@@ -138,11 +138,11 @@ bool CheckDbPath(const TString &path, const TString &domain, TString &error) {
error = Sprintf("Symbol '%c' is not allowed in database names and path parts ", *brokenAt);
return false;
}
- }
-
- return true;
-}
-
+ }
+
+ return true;
+}
+
TStringBuf ExtractParent(const TString &path) noexcept {
TStringBuf parent = TStringBuf(path);
@@ -150,7 +150,7 @@ TStringBuf ExtractParent(const TString &path) noexcept {
parent.ChopSuffix(TStringBuf("/"));
return parent.RBefore('/');
-}
+}
TStringBuf ExtractBase(const TString &path) noexcept {
TStringBuf parent = TStringBuf(path);
diff --git a/ydb/core/base/path.h b/ydb/core/base/path.h
index 62f9e296303..c2b93d2bafd 100644
--- a/ydb/core/base/path.h
+++ b/ydb/core/base/path.h
@@ -8,7 +8,7 @@ namespace NKikimr {
TVector<TString> SplitPath(TString path);
TString JoinPath(const TVector<TString>& path);
-TString CanonizePath(const TString &path);
+TString CanonizePath(const TString &path);
TString CanonizePath(const TVector<TString>& path);
ui32 CanonizedPathLen(const TVector<TString>& path);
TStringBuf ExtractDomain(const TString& path) noexcept;
@@ -17,7 +17,7 @@ TStringBuf ExtractBase(const TString& path) noexcept;
TStringBuf ExtractParent(const TString& path) noexcept;
bool IsEqualPaths(const TString& l, const TString& r) noexcept;
bool IsStartWithSlash(const TString& l);
-bool CheckDbPath(const TString &path, const TString &domain, TString &error);
+bool CheckDbPath(const TString &path, const TString &domain, TString &error);
TString::const_iterator PathPartBrokenAt(const TString &part, const TStringBuf extraSymbols = {});
bool TrySplitPathByDb(const TString& path, const TString& database,
std::pair<TString, TString>& result, TString& error);
diff --git a/ydb/core/base/resource_profile.h b/ydb/core/base/resource_profile.h
index 8b2477731c6..113b1dd65e3 100644
--- a/ydb/core/base/resource_profile.h
+++ b/ydb/core/base/resource_profile.h
@@ -1,74 +1,74 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <ydb/core/protos/flat_scheme_op.pb.h>
#include <ydb/core/protos/tablet.pb.h>
-
-#include <util/generic/hash.h>
-#include <util/generic/ptr.h>
-
-#include <memory>
-
-namespace NKikimr {
-
-class TResourceProfiles : public TThrRefBase {
-public:
+
+#include <util/generic/hash.h>
+#include <util/generic/ptr.h>
+
+#include <memory>
+
+namespace NKikimr {
+
+class TResourceProfiles : public TThrRefBase {
+public:
using TResourceProfile = NKikimrSchemeOp::TResourceProfile;
using TPtr = std::shared_ptr<TResourceProfile>;
-
-private:
- using TTabletType = NKikimrTabletBase::TTabletTypes::EType;
-
- using TKey = std::pair<TTabletType, TString>;
+
+private:
+ using TTabletType = NKikimrTabletBase::TTabletTypes::EType;
+
+ using TKey = std::pair<TTabletType, TString>;
using TProfiles = THashMap<TKey, TPtr>;
-
- TProfiles Profiles;
+
+ TProfiles Profiles;
const TPtr DefaultProfile = std::make_shared<TResourceProfile>();
-
- const TString DefaultProfileName = "default";
- const TTabletType DefaultTabletType = NKikimrTabletBase::TTabletTypes::Unknown;
-
-public:
- TResourceProfiles() {}
-
- void AddProfile(const TResourceProfile &profile)
- {
- auto key = std::make_pair(profile.GetTabletType(), profile.GetName());
- Profiles[key] = std::make_shared<TResourceProfile>(profile);
- }
-
+
+ const TString DefaultProfileName = "default";
+ const TTabletType DefaultTabletType = NKikimrTabletBase::TTabletTypes::Unknown;
+
+public:
+ TResourceProfiles() {}
+
+ void AddProfile(const TResourceProfile &profile)
+ {
+ auto key = std::make_pair(profile.GetTabletType(), profile.GetName());
+ Profiles[key] = std::make_shared<TResourceProfile>(profile);
+ }
+
const TPtr GetProfile(TTabletType type, const TString &name) const
- {
- auto it = Profiles.find(std::make_pair(type, name));
- if (it != Profiles.end())
- return it->second;
-
- if (name != DefaultProfileName) {
- it = Profiles.find(std::make_pair(type, DefaultProfileName));
- if (it != Profiles.end())
- return it->second;
- }
-
- if (type != DefaultTabletType)
- return GetProfile(DefaultTabletType, name);
-
- return DefaultProfile;
- }
-
- void StoreProfiles(::google::protobuf::RepeatedPtrField<TResourceProfile> &profiles) const {
- for (auto &entry : Profiles)
- profiles.Add()->CopyFrom(*entry.second);
- }
-
- void LoadProfiles(const ::google::protobuf::RepeatedPtrField<TResourceProfile> &profiles) {
- Profiles.clear();
- for (auto &profile : profiles)
- AddProfile(profile);
- }
-};
-
+ {
+ auto it = Profiles.find(std::make_pair(type, name));
+ if (it != Profiles.end())
+ return it->second;
+
+ if (name != DefaultProfileName) {
+ it = Profiles.find(std::make_pair(type, DefaultProfileName));
+ if (it != Profiles.end())
+ return it->second;
+ }
+
+ if (type != DefaultTabletType)
+ return GetProfile(DefaultTabletType, name);
+
+ return DefaultProfile;
+ }
+
+ void StoreProfiles(::google::protobuf::RepeatedPtrField<TResourceProfile> &profiles) const {
+ for (auto &entry : Profiles)
+ profiles.Add()->CopyFrom(*entry.second);
+ }
+
+ void LoadProfiles(const ::google::protobuf::RepeatedPtrField<TResourceProfile> &profiles) {
+ Profiles.clear();
+ for (auto &profile : profiles)
+ AddProfile(profile);
+ }
+};
+
using TResourceProfilesPtr = TIntrusivePtr<TResourceProfiles>;
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/base/shared_quota.h b/ydb/core/base/shared_quota.h
index 620c4eeb08e..a565954bb54 100644
--- a/ydb/core/base/shared_quota.h
+++ b/ydb/core/base/shared_quota.h
@@ -1,77 +1,77 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <library/cpp/monlib/dynamic_counters/counters.h>
-
-#include <util/generic/ptr.h>
-
-namespace NKikimr {
-
-class TSharedQuota : public TThrRefBase {
-public:
- TSharedQuota(NMonitoring::TDynamicCounters::TCounterPtr usedCounter,
- NMonitoring::TDynamicCounters::TCounterPtr sizeCounter,
- ui64 quota = 0)
- : Quota(quota)
- , FreeQuota(Quota)
- , UsedCounter(usedCounter)
- , SizeCounter(sizeCounter)
- {
- Y_VERIFY(UsedCounter);
- Y_VERIFY(SizeCounter);
- }
-
- bool TryCaptureQuota(ui64 quota)
- {
- i64 updatedQuota;
- i64 freeQuota;
- do {
- freeQuota = AtomicLoad(&FreeQuota);
- if (freeQuota < static_cast<i64>(quota))
- return false;
- updatedQuota = freeQuota - quota;
- } while (!AtomicCas(&FreeQuota, updatedQuota, freeQuota));
- *UsedCounter += quota;
- return true;
- }
-
- void ReleaseQuota(ui64 quota)
- {
- AtomicAdd(FreeQuota, quota);
- *UsedCounter -= quota;
- }
-
- ui64 GetFreeQuota() const
- {
- return AtomicLoad(&FreeQuota);
- }
-
- ui64 GetQuota() const
- {
- return AtomicLoad(&Quota);
- }
-
- ui64 ChangeQuota(i64 delta)
- {
- ui64 updatedQuota;
- ui64 quota;
- do {
- quota = AtomicLoad(&Quota);
- Y_VERIFY(delta > 0 || quota >= static_cast<ui64>(-delta));
- updatedQuota = quota + delta;
- } while (!AtomicCas(&Quota, updatedQuota, quota));
- AtomicAdd(FreeQuota, delta);
- *SizeCounter += delta;
- return updatedQuota;
- }
-
-private:
- volatile ui64 Quota;
- volatile i64 FreeQuota;
- NMonitoring::TDynamicCounters::TCounterPtr UsedCounter;
- NMonitoring::TDynamicCounters::TCounterPtr SizeCounter;
-};
-
+
+#include <util/generic/ptr.h>
+
+namespace NKikimr {
+
+class TSharedQuota : public TThrRefBase {
+public:
+ TSharedQuota(NMonitoring::TDynamicCounters::TCounterPtr usedCounter,
+ NMonitoring::TDynamicCounters::TCounterPtr sizeCounter,
+ ui64 quota = 0)
+ : Quota(quota)
+ , FreeQuota(Quota)
+ , UsedCounter(usedCounter)
+ , SizeCounter(sizeCounter)
+ {
+ Y_VERIFY(UsedCounter);
+ Y_VERIFY(SizeCounter);
+ }
+
+ bool TryCaptureQuota(ui64 quota)
+ {
+ i64 updatedQuota;
+ i64 freeQuota;
+ do {
+ freeQuota = AtomicLoad(&FreeQuota);
+ if (freeQuota < static_cast<i64>(quota))
+ return false;
+ updatedQuota = freeQuota - quota;
+ } while (!AtomicCas(&FreeQuota, updatedQuota, freeQuota));
+ *UsedCounter += quota;
+ return true;
+ }
+
+ void ReleaseQuota(ui64 quota)
+ {
+ AtomicAdd(FreeQuota, quota);
+ *UsedCounter -= quota;
+ }
+
+ ui64 GetFreeQuota() const
+ {
+ return AtomicLoad(&FreeQuota);
+ }
+
+ ui64 GetQuota() const
+ {
+ return AtomicLoad(&Quota);
+ }
+
+ ui64 ChangeQuota(i64 delta)
+ {
+ ui64 updatedQuota;
+ ui64 quota;
+ do {
+ quota = AtomicLoad(&Quota);
+ Y_VERIFY(delta > 0 || quota >= static_cast<ui64>(-delta));
+ updatedQuota = quota + delta;
+ } while (!AtomicCas(&Quota, updatedQuota, quota));
+ AtomicAdd(FreeQuota, delta);
+ *SizeCounter += delta;
+ return updatedQuota;
+ }
+
+private:
+ volatile ui64 Quota;
+ volatile i64 FreeQuota;
+ NMonitoring::TDynamicCounters::TCounterPtr UsedCounter;
+ NMonitoring::TDynamicCounters::TCounterPtr SizeCounter;
+};
+
using TSharedQuotaPtr = TIntrusivePtr<TSharedQuota>;
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/base/subdomain.cpp b/ydb/core/base/subdomain.cpp
index a245d9fe5fc..7725571666f 100644
--- a/ydb/core/base/subdomain.cpp
+++ b/ydb/core/base/subdomain.cpp
@@ -3,10 +3,10 @@
#include <ydb/core/base/defs.h>
namespace NKikimr {
-TSubDomainKey::TSubDomainKey(ui64 shardId, ui64 pathId)
- : TBase(shardId, pathId)
-{}
-
+TSubDomainKey::TSubDomainKey(ui64 shardId, ui64 pathId)
+ : TBase(shardId, pathId)
+{}
+
TSubDomainKey::TSubDomainKey(const NKikimrSubDomains::TDomainKey &domainKey)
: TBase(domainKey.GetSchemeShard(), domainKey.GetPathId())
{}
diff --git a/ydb/core/base/subdomain.h b/ydb/core/base/subdomain.h
index 992ac0bed44..0e1101bc781 100644
--- a/ydb/core/base/subdomain.h
+++ b/ydb/core/base/subdomain.h
@@ -13,7 +13,7 @@ struct TSubDomainKey : public std::pair<ui64, ui64> {
TSubDomainKey() = default;
TSubDomainKey(const TSubDomainKey&) = default;
TSubDomainKey(TSubDomainKey&&) = default;
- TSubDomainKey(ui64 shardId, ui64 pathId);
+ TSubDomainKey(ui64 shardId, ui64 pathId);
explicit TSubDomainKey(const NKikimrSubDomains::TDomainKey &domainKey);
TSubDomainKey& operator =(const TSubDomainKey&) = default;
diff --git a/ydb/core/base/tablet.h b/ydb/core/base/tablet.h
index 090a088fda5..602e39c6000 100644
--- a/ydb/core/base/tablet.h
+++ b/ydb/core/base/tablet.h
@@ -3,19 +3,19 @@
#include "defs.h"
#include "events.h"
#include "logoblob.h"
-#include "shared_quota.h"
-
+#include "shared_quota.h"
+
#include <ydb/core/base/resource_profile.h>
#include <ydb/core/protos/base.pb.h>
#include <ydb/core/protos/tablet.pb.h>
#include <ydb/core/protos/tablet_tx.pb.h>
#include <ydb/core/tablet/tablet_metrics.h>
-
+
#include <library/cpp/deprecated/enum_codegen/enum_codegen.h>
#include <util/generic/deque.h>
#include <util/generic/vector.h>
#include <util/datetime/base.h>
-
+
#include <functional>
namespace NKikimr {
@@ -51,7 +51,7 @@ struct TEvTablet {
EvFollowerGcApplied, // from leader to user tablet when all known followers reported consumed gc barrier
EvFollowerSyncComplete, // from leader to user tablet when all old followers are touched and synced
EvCutTabletHistory,
- EvUpdateConfig,
+ EvUpdateConfig,
EvCommit = EvBoot + 512,
EvAux,
@@ -205,8 +205,8 @@ struct TEvTablet {
, DependencyGraph(dependencyGraph)
, Launcher(launcher)
, TabletStorageInfo(info)
- , ResourceProfiles(profiles)
- , TxCacheQuota(txCacheQuota)
+ , ResourceProfiles(profiles)
+ , TxCacheQuota(txCacheQuota)
, GroupReadBytes(std::move(read))
, GroupReadOps(std::move(readOps))
{}
@@ -632,7 +632,7 @@ struct TEvTablet {
TResourceProfilesPtr ResourceProfiles;
TSharedQuotaPtr TxCacheQuota;
-
+
TEvFBoot(ui64 tabletID, ui32 followerID, ui32 generation, TActorId launcher, const TEvFollowerUpdate &upd,
TIntrusivePtr<TTabletStorageInfo> info, TResourceProfilesPtr profiles = nullptr,
TSharedQuotaPtr txCacheQuota = nullptr)
@@ -642,8 +642,8 @@ struct TEvTablet {
, Launcher(launcher)
, Update(new TFUpdateBody(upd))
, TabletStorageInfo(info)
- , ResourceProfiles(profiles)
- , TxCacheQuota(txCacheQuota)
+ , ResourceProfiles(profiles)
+ , TxCacheQuota(txCacheQuota)
{}
TEvFBoot(ui64 tabletID, ui32 followerID, ui32 generation, TActorId launcher, TDependencyGraph *dependencyGraph,
@@ -731,14 +731,14 @@ struct TEvTablet {
struct TEvCutTabletHistory : TEventPB<TEvCutTabletHistory, NKikimrTabletBase::TEvCutTabletHistory, EvCutTabletHistory> {
TEvCutTabletHistory() = default;
};
-
- struct TEvUpdateConfig : TEventLocal<TEvUpdateConfig, EvUpdateConfig> {
+
+ struct TEvUpdateConfig : TEventLocal<TEvUpdateConfig, EvUpdateConfig> {
TResourceProfilesPtr ResourceProfiles;
-
+
TEvUpdateConfig(TResourceProfilesPtr profiles)
- : ResourceProfiles(profiles)
- {}
- };
+ : ResourceProfiles(profiles)
+ {}
+ };
struct TEvFeatures : TEventLocal<TEvFeatures, EvFeatures> {
enum EFeatureFlags : ui32 {
diff --git a/ydb/core/base/tablet_types.h b/ydb/core/base/tablet_types.h
index d16a308694d..f585819299c 100644
--- a/ydb/core/base/tablet_types.h
+++ b/ydb/core/base/tablet_types.h
@@ -33,8 +33,8 @@ public:
static constexpr EType BLOCKSTORE_PARTITION = BlockStorePartition;
static constexpr EType BLOCKSTORE_PARTITION2 = BlockStorePartition2;
static constexpr EType BLOCKSTORE_DISK_REGISTRY = BlockStoreDiskRegistry;
- static constexpr EType TENANT_SLOT_BROKER = TenantSlotBroker;
- static constexpr EType CONSOLE = Console;
+ static constexpr EType TENANT_SLOT_BROKER = TenantSlotBroker;
+ static constexpr EType CONSOLE = Console;
static constexpr EType KESUS = Kesus;
static constexpr EType SYS_VIEW_PROCESSOR = SysViewProcessor;
static constexpr EType FILESTORE = FileStore;
diff --git a/ydb/core/base/tabletid.h b/ydb/core/base/tabletid.h
index fb4438c6a6d..cd0a7cb58f0 100644
--- a/ydb/core/base/tabletid.h
+++ b/ydb/core/base/tabletid.h
@@ -61,30 +61,30 @@ namespace NKikimr {
return MakeTabletID(stateStorageGroup, 0, 1);
}
- // cluster management system tablet (exactly one per domain in default state storage group)
- inline ui64 MakeCmsID(ui64 stateStorageGroup) {
- Y_VERIFY_DEBUG(stateStorageGroup < (1ull << 8ull));
- return MakeTabletID(stateStorageGroup, 0, 0x2000);
- }
-
- // node broker tablet (exactly one per domain in default state storage group)
- inline ui64 MakeNodeBrokerID(ui64 stateStorageGroup) {
- Y_VERIFY_DEBUG(stateStorageGroup < (1ull << 8ull));
- return MakeTabletID(stateStorageGroup, 0, 0x2001);
- }
-
- // tenant slot broker tablet (exactly one per domain in default state storage group)
- inline ui64 MakeTenantSlotBrokerID(ui64 stateStorageGroup) {
- Y_VERIFY_DEBUG(stateStorageGroup < (1ull << 8ull));
- return MakeTabletID(stateStorageGroup, 0, 0x2002);
- }
-
- // console tablet (exactly one per domain in default state storage group)
- inline ui64 MakeConsoleID(ui64 stateStorageGroup) {
- Y_VERIFY_DEBUG(stateStorageGroup < (1ull << 8ull));
- return MakeTabletID(stateStorageGroup, 0, 0x2003);
- }
-
+ // cluster management system tablet (exactly one per domain in default state storage group)
+ inline ui64 MakeCmsID(ui64 stateStorageGroup) {
+ Y_VERIFY_DEBUG(stateStorageGroup < (1ull << 8ull));
+ return MakeTabletID(stateStorageGroup, 0, 0x2000);
+ }
+
+ // node broker tablet (exactly one per domain in default state storage group)
+ inline ui64 MakeNodeBrokerID(ui64 stateStorageGroup) {
+ Y_VERIFY_DEBUG(stateStorageGroup < (1ull << 8ull));
+ return MakeTabletID(stateStorageGroup, 0, 0x2001);
+ }
+
+ // tenant slot broker tablet (exactly one per domain in default state storage group)
+ inline ui64 MakeTenantSlotBrokerID(ui64 stateStorageGroup) {
+ Y_VERIFY_DEBUG(stateStorageGroup < (1ull << 8ull));
+ return MakeTabletID(stateStorageGroup, 0, 0x2002);
+ }
+
+ // console tablet (exactly one per domain in default state storage group)
+ inline ui64 MakeConsoleID(ui64 stateStorageGroup) {
+ Y_VERIFY_DEBUG(stateStorageGroup < (1ull << 8ull));
+ return MakeTabletID(stateStorageGroup, 0, 0x2003);
+ }
+
// TODO: think about encoding scheme for sibling group hive
inline TActorId MakeStateStorageProxyID(ui64 stateStorageGroup) {
@@ -93,5 +93,5 @@ namespace NKikimr {
x[8] = (char)stateStorageGroup;
return TActorId(0, TStringBuf(x, 12));
}
-
+
}
diff --git a/ydb/core/base/ya.make b/ydb/core/base/ya.make
index ecdb04a7ebe..83db5825c3a 100644
--- a/ydb/core/base/ya.make
+++ b/ydb/core/base/ya.make
@@ -23,8 +23,8 @@ SRCS(
blobstorage.h
blobstorage.cpp
channel_profiles.h
- counters.cpp
- counters.h
+ counters.cpp
+ counters.h
defs.h
domain.h
event_filter.cpp
@@ -38,22 +38,22 @@ SRCS(
kikimr_issue.h
localdb.cpp
localdb.h
- location.h
+ location.h
logoblob.cpp
logoblob.h
- nameservice.h
+ nameservice.h
path.cpp
pathid.cpp
pool_stats_collector.cpp
pool_stats_collector.h
quoter.cpp
quoter.h
- resource_profile.h
+ resource_profile.h
row_version.cpp
row_version.h
services_assert.cpp
shared_data.cpp
- shared_quota.h
+ shared_quota.h
statestorage.cpp
statestorage.h
statestorage_event_filter.cpp
diff --git a/ydb/core/blobstorage/dsproxy/ut_fat/dsproxy_ut.cpp b/ydb/core/blobstorage/dsproxy/ut_fat/dsproxy_ut.cpp
index 7b32cfabb90..13b1bec3563 100644
--- a/ydb/core/blobstorage/dsproxy/ut_fat/dsproxy_ut.cpp
+++ b/ydb/core/blobstorage/dsproxy/ut_fat/dsproxy_ut.cpp
@@ -4263,7 +4263,7 @@ public:
setup1->LocalServices.push_back(std::pair<TActorId, TActorSetupCmd>(env->ProxyTestId, proxyTestSetup));
//////////////////////////////////////////////////////////////////////////////
- GetServiceCounters(counters, "utils");
+ GetServiceCounters(counters, "utils");
TIntrusivePtr<NActors::NLog::TSettings> logSettings1 = AddLoggerActor(setup1, *counters);
TIntrusivePtr<NActors::NLog::TSettings> logSettings2 = AddLoggerActor(setup2, *counters);
diff --git a/ydb/core/blobstorage/nodewarden/blobstorage_node_warden_ut.cpp b/ydb/core/blobstorage/nodewarden/blobstorage_node_warden_ut.cpp
index ee22c165525..e3c74cce7b4 100644
--- a/ydb/core/blobstorage/nodewarden/blobstorage_node_warden_ut.cpp
+++ b/ydb/core/blobstorage/nodewarden/blobstorage_node_warden_ut.cpp
@@ -127,7 +127,7 @@ void SetupServices(TTestActorRuntime &runtime, TString extraPath, TIntrusivePtr<
auto domain = TDomainsInfo::TDomain::ConstructDomainWithExplicitTabletIds("dc-1", domainId, 0,
domainId, domainId, TVector<ui32>{domainId},
domainId, TVector<ui32>{domainId},
- 100500,
+ 100500,
TVector<ui64>{},
TVector<ui64>{},
TVector<ui64>{},
diff --git a/ydb/core/blobstorage/vdisk/syncer/blobstorage_syncer_scheduler.cpp b/ydb/core/blobstorage/vdisk/syncer/blobstorage_syncer_scheduler.cpp
index 13d7ddc5466..92ae94e89f7 100644
--- a/ydb/core/blobstorage/vdisk/syncer/blobstorage_syncer_scheduler.cpp
+++ b/ydb/core/blobstorage/vdisk/syncer/blobstorage_syncer_scheduler.cpp
@@ -51,7 +51,7 @@ namespace NKikimr {
// output node info
TActorId aid = GInfo.GetActorId(it->VDiskIdShort);
ui32 nodeId = aid.NodeId();
- using TNodeInfo = TEvInterconnect::TNodeInfo;
+ using TNodeInfo = TEvInterconnect::TNodeInfo;
const TNodeInfo *info = NodesInfo->Get()->GetNodeInfo(nodeId);
if (!info) {
str << "Node: NameService Error<br>";
diff --git a/ydb/core/blobstorage/vdisk/synclog/blobstorage_synclogneighbors.cpp b/ydb/core/blobstorage/vdisk/synclog/blobstorage_synclogneighbors.cpp
index a3eadb41e22..b9cf5c78ee6 100644
--- a/ydb/core/blobstorage/vdisk/synclog/blobstorage_synclogneighbors.cpp
+++ b/ydb/core/blobstorage/vdisk/synclog/blobstorage_synclogneighbors.cpp
@@ -31,7 +31,7 @@ namespace NKikimr {
// output node info
TActorId aid = GInfo.GetActorId(it->VDiskIdShort);
ui32 nodeId = aid.NodeId();
- using TNodeInfo = TEvInterconnect::TNodeInfo;
+ using TNodeInfo = TEvInterconnect::TNodeInfo;
const TNodeInfo *info = NodesInfo->Get()->GetNodeInfo(nodeId);
if (!info) {
str << "Node: NameService Error<br>";
diff --git a/ydb/core/client/cancel_tx_ut.cpp b/ydb/core/client/cancel_tx_ut.cpp
index 3cf0f193e38..4544a3154fb 100644
--- a/ydb/core/client/cancel_tx_ut.cpp
+++ b/ydb/core/client/cancel_tx_ut.cpp
@@ -46,7 +46,7 @@ Y_UNIT_TEST_SUITE(TCancelTx) {
);
TAtomic prevVal;
- cleverServer.GetRuntime()->GetAppData().Icb->SetValue("DataShardControls.CanCancelROWithReadSets", allowCancelROwithReadsets ? 1 : 0 , prevVal);
+ cleverServer.GetRuntime()->GetAppData().Icb->SetValue("DataShardControls.CanCancelROWithReadSets", allowCancelROwithReadsets ? 1 : 0 , prevVal);
return cleverServer;
}
diff --git a/ydb/core/client/flat_ut.cpp b/ydb/core/client/flat_ut.cpp
index 2ed76e3e613..362c052aa11 100644
--- a/ydb/core/client/flat_ut.cpp
+++ b/ydb/core/client/flat_ut.cpp
@@ -1442,13 +1442,13 @@ Y_UNIT_TEST_SUITE(TFlatTest) {
diskParams.SectorSize = 512;
diskParams.ChunkSize = 50ull*1024*1024;
- NKikimrConfig::TImmediateControlsConfig controls;
- controls.MutableTxLimitControls()->SetPerRequestDataSizeLimit(1000000000);
- controls.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(1000000000);
- controls.MutableTxLimitControls()->SetPerShardReadSizeLimit(1000000000);
+ NKikimrConfig::TImmediateControlsConfig controls;
+ controls.MutableTxLimitControls()->SetPerRequestDataSizeLimit(1000000000);
+ controls.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(1000000000);
+ controls.MutableTxLimitControls()->SetPerShardReadSizeLimit(1000000000);
TServer cleverServer = TServer(TServerSettings(port)
- .SetControls(controls)
+ .SetControls(controls)
.SetCustomDiskParams(diskParams)
.SetEnableMockOnSingleNode(false));
@@ -1509,12 +1509,12 @@ Y_UNIT_TEST_SUITE(TFlatTest) {
UNIT_ASSERT_VALUES_EQUAL_C(status, NMsgBusProxy::MSTATUS_REJECTED, "Multi-shard read query should fail");
}
- void TestRejectByPerShardReadSize(const NKikimrConfig::TImmediateControlsConfig& controls,
- TString tableConfig) {
+ void TestRejectByPerShardReadSize(const NKikimrConfig::TImmediateControlsConfig& controls,
+ TString tableConfig) {
TPortManager pm;
ui16 port = pm.GetPort(2134);
- TServer cleverServer = TServer(TServerSettings(port)
- .SetControls(controls));
+ TServer cleverServer = TServer(TServerSettings(port)
+ .SetControls(controls));
TFlatMsgBusClient annoyingClient(port);
@@ -1558,34 +1558,34 @@ Y_UNIT_TEST_SUITE(TFlatTest) {
)"
), opts, response);
- UNIT_ASSERT_VALUES_EQUAL_C((NMsgBusProxy::EResponseStatus)status, NMsgBusProxy::MSTATUS_ERROR, "Big read should fail");
+ UNIT_ASSERT_VALUES_EQUAL_C((NMsgBusProxy::EResponseStatus)status, NMsgBusProxy::MSTATUS_ERROR, "Big read should fail");
}
Y_UNIT_TEST(RejectByPerShardReadSize) {
- NKikimrConfig::TImmediateControlsConfig controls;
- controls.MutableTxLimitControls()->SetPerRequestDataSizeLimit(1000000000);
- controls.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(1000000000);
- controls.MutableTxLimitControls()->SetPerShardReadSizeLimit(1000000000);
+ NKikimrConfig::TImmediateControlsConfig controls;
+ controls.MutableTxLimitControls()->SetPerRequestDataSizeLimit(1000000000);
+ controls.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(1000000000);
+ controls.MutableTxLimitControls()->SetPerShardReadSizeLimit(1000000000);
// Test per-table limit
- TestRejectByPerShardReadSize(controls, " PartitionConfig { TxReadSizeLimit: 10000 } ");
+ TestRejectByPerShardReadSize(controls, " PartitionConfig { TxReadSizeLimit: 10000 } ");
// Test per-domain limit
- controls.MutableTxLimitControls()->SetPerShardReadSizeLimit(10000);
- TestRejectByPerShardReadSize(controls, "");
+ controls.MutableTxLimitControls()->SetPerShardReadSizeLimit(10000);
+ TestRejectByPerShardReadSize(controls, "");
}
Y_UNIT_TEST(RejectByPerRequestSize) {
TPortManager pm;
ui16 port = pm.GetPort(2134);
- NKikimrConfig::TImmediateControlsConfig controls;
- controls.MutableTxLimitControls()->SetPerRequestDataSizeLimit(10000);
- controls.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(1000000000);
- controls.MutableTxLimitControls()->SetPerShardReadSizeLimit(1000000000);
+ NKikimrConfig::TImmediateControlsConfig controls;
+ controls.MutableTxLimitControls()->SetPerRequestDataSizeLimit(10000);
+ controls.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(1000000000);
+ controls.MutableTxLimitControls()->SetPerShardReadSizeLimit(1000000000);
- TServer cleverServer = TServer(TServerSettings(port)
- .SetControls(controls));
+ TServer cleverServer = TServer(TServerSettings(port)
+ .SetControls(controls));
TFlatMsgBusClient annoyingClient(port);
@@ -1651,13 +1651,13 @@ Y_UNIT_TEST_SUITE(TFlatTest) {
Y_UNIT_TEST(RejectByIncomingReadSetSize) {
TPortManager pm;
ui16 port = pm.GetPort(2134);
- NKikimrConfig::TImmediateControlsConfig controls;
- controls.MutableTxLimitControls()->SetPerRequestDataSizeLimit(100000000);
- controls.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(1000);
- controls.MutableTxLimitControls()->SetPerShardReadSizeLimit(100000000);
+ NKikimrConfig::TImmediateControlsConfig controls;
+ controls.MutableTxLimitControls()->SetPerRequestDataSizeLimit(100000000);
+ controls.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(1000);
+ controls.MutableTxLimitControls()->SetPerShardReadSizeLimit(100000000);
- TServer cleverServer = TServer(TServerSettings(port)
- .SetControls(controls));
+ TServer cleverServer = TServer(TServerSettings(port)
+ .SetControls(controls));
TFlatMsgBusClient annoyingClient(port);
diff --git a/ydb/core/client/locks_ut.cpp b/ydb/core/client/locks_ut.cpp
index fce1eaf14bd..47b7c3dfdd5 100644
--- a/ydb/core/client/locks_ut.cpp
+++ b/ydb/core/client/locks_ut.cpp
@@ -1910,109 +1910,109 @@ Y_UNIT_TEST(LocksLimit) {
LocksLimit<TLocksV2>();
}
-template <typename TLocksVer>
-static void ShardLocks() {
- TClientServer cs;
- NKikimrMiniKQL::TResult res;
- TClient::TFlatQueryOptions opts;
-
-
+template <typename TLocksVer>
+static void ShardLocks() {
+ TClientServer cs;
+ NKikimrMiniKQL::TResult res;
+ TClient::TFlatQueryOptions opts;
+
+
ui32 limit = NDataShard::TLockLocker::TLockLimiter::LockLimit();
- //const ui32 factor = 100;
-
- const char * setLock = R"___((
- (let range_ '('IncFrom 'IncTo '('key (Uint32 '%u) (Uint32 '%u))))
- (let cols_ '('key 'value))
- (return (AsList
- (SetResult 'res (SelectRange '/dc-1/Dir/A range_ cols_ '()))
- (AcquireLocks (Uint64 '%lu))
- ))
- ))___";
-
- // Attach lots of ranges to a single lock.
- TVector<NMiniKQL::IEngineFlat::TTxLock> locks;
- ui64 lockId = 0;
- for (ui32 i = 0; i < limit + 1; ++i) {
- cs.Client.FlatQuery(Sprintf(setLock, i * 10, i * 10 + 5, lockId), res);
- ExtractResultLocks<TLocksVer>(res, locks);
- lockId = locks.back().LockId;
- }
-
- // We now have too many rnages attached to locks and new lock
- // will be forced to be shard lock.
- cs.Client.FlatQuery(Sprintf(setLock, 0, 5, 0), res);
- ExtractResultLocks<TLocksVer>(res, locks);
-
- // Now check shard lock is ok.
- const char * checkLock = R"___((
- (let locksTable_ '%s)
- (let lockKey_ '(%s))
- (let lockCols_ '(%s))
- (return (AsList
- (SetResult 'Result (SelectRow locksTable_ lockKey_ lockCols_))
- ))
- ))___";
- {
- cs.Client.FlatQuery(Sprintf(checkLock,
- TLocksVer::TableName(),
+ //const ui32 factor = 100;
+
+ const char * setLock = R"___((
+ (let range_ '('IncFrom 'IncTo '('key (Uint32 '%u) (Uint32 '%u))))
+ (let cols_ '('key 'value))
+ (return (AsList
+ (SetResult 'res (SelectRange '/dc-1/Dir/A range_ cols_ '()))
+ (AcquireLocks (Uint64 '%lu))
+ ))
+ ))___";
+
+ // Attach lots of ranges to a single lock.
+ TVector<NMiniKQL::IEngineFlat::TTxLock> locks;
+ ui64 lockId = 0;
+ for (ui32 i = 0; i < limit + 1; ++i) {
+ cs.Client.FlatQuery(Sprintf(setLock, i * 10, i * 10 + 5, lockId), res);
+ ExtractResultLocks<TLocksVer>(res, locks);
+ lockId = locks.back().LockId;
+ }
+
+ // We now have too many rnages attached to locks and new lock
+ // will be forced to be shard lock.
+ cs.Client.FlatQuery(Sprintf(setLock, 0, 5, 0), res);
+ ExtractResultLocks<TLocksVer>(res, locks);
+
+ // Now check shard lock is ok.
+ const char * checkLock = R"___((
+ (let locksTable_ '%s)
+ (let lockKey_ '(%s))
+ (let lockCols_ '(%s))
+ (return (AsList
+ (SetResult 'Result (SelectRow locksTable_ lockKey_ lockCols_))
+ ))
+ ))___";
+ {
+ cs.Client.FlatQuery(Sprintf(checkLock,
+ TLocksVer::TableName(),
TLocksVer::Key(locks.back().LockId,
- locks.back().DataShard,
- locks.back().SchemeShard,
+ locks.back().DataShard,
+ locks.back().SchemeShard,
locks.back().PathId).data(),
- TLocksVer::Columns()), res);
- TValue result = TValue::Create(res.GetValue(), res.GetType());
- TValue xres = result["Result"];
- UNIT_ASSERT(xres.HaveValue());
- auto lock = ExtractRowLock<TLocksVer>(xres);
- UNIT_ASSERT_VALUES_EQUAL(lock.LockId, locks.back().LockId);
- UNIT_ASSERT_VALUES_EQUAL(lock.Generation, locks.back().Generation);
- UNIT_ASSERT_VALUES_EQUAL(lock.Counter, locks.back().Counter);
- }
-
- // Break locks by single row update.
- const char * lockUpdate = R"___((
- (let row0_ '('('key (Uint32 '42))))
- (let update_ '('('value (Uint32 '0))))
- (let ret_ (AsList
- (UpdateRow '/dc-1/Dir/A row0_ update_)
- ))
- (return ret_)
- ))___";
- cs.Client.FlatQuery(lockUpdate, opts, res);
-
- // Check locks are broken.
- {
- cs.Client.FlatQuery(Sprintf(checkLock,
- TLocksVer::TableName(),
+ TLocksVer::Columns()), res);
+ TValue result = TValue::Create(res.GetValue(), res.GetType());
+ TValue xres = result["Result"];
+ UNIT_ASSERT(xres.HaveValue());
+ auto lock = ExtractRowLock<TLocksVer>(xres);
+ UNIT_ASSERT_VALUES_EQUAL(lock.LockId, locks.back().LockId);
+ UNIT_ASSERT_VALUES_EQUAL(lock.Generation, locks.back().Generation);
+ UNIT_ASSERT_VALUES_EQUAL(lock.Counter, locks.back().Counter);
+ }
+
+ // Break locks by single row update.
+ const char * lockUpdate = R"___((
+ (let row0_ '('('key (Uint32 '42))))
+ (let update_ '('('value (Uint32 '0))))
+ (let ret_ (AsList
+ (UpdateRow '/dc-1/Dir/A row0_ update_)
+ ))
+ (return ret_)
+ ))___";
+ cs.Client.FlatQuery(lockUpdate, opts, res);
+
+ // Check locks are broken.
+ {
+ cs.Client.FlatQuery(Sprintf(checkLock,
+ TLocksVer::TableName(),
TLocksVer::Key(locks.back().LockId,
- locks.back().DataShard,
- locks.back().SchemeShard,
+ locks.back().DataShard,
+ locks.back().SchemeShard,
locks.back().PathId).data(),
- TLocksVer::Columns()), res);
- TValue result = TValue::Create(res.GetValue(), res.GetType());
- TValue xres = result["Result"];
- UNIT_ASSERT(!xres.HaveValue());
- }
-
- {
- cs.Client.FlatQuery(Sprintf(checkLock,
- TLocksVer::TableName(),
+ TLocksVer::Columns()), res);
+ TValue result = TValue::Create(res.GetValue(), res.GetType());
+ TValue xres = result["Result"];
+ UNIT_ASSERT(!xres.HaveValue());
+ }
+
+ {
+ cs.Client.FlatQuery(Sprintf(checkLock,
+ TLocksVer::TableName(),
TLocksVer::Key(locks[0].LockId,
- locks[0].DataShard,
- locks[0].SchemeShard,
+ locks[0].DataShard,
+ locks[0].SchemeShard,
locks[0].PathId).data(),
- TLocksVer::Columns()), res);
- TValue result = TValue::Create(res.GetValue(), res.GetType());
- TValue xres = result["Result"];
- UNIT_ASSERT(!xres.HaveValue());
- }
-}
-
-Y_UNIT_TEST(ShardLocks) {
- ShardLocks<TLocksV1>();
- ShardLocks<TLocksV2>();
-}
-
+ TLocksVer::Columns()), res);
+ TValue result = TValue::Create(res.GetValue(), res.GetType());
+ TValue xres = result["Result"];
+ UNIT_ASSERT(!xres.HaveValue());
+ }
+}
+
+Y_UNIT_TEST(ShardLocks) {
+ ShardLocks<TLocksV1>();
+ ShardLocks<TLocksV2>();
+}
+
} // TLocksFatTest
}}
diff --git a/ydb/core/client/minikql_compile/mkql_compile_service.cpp b/ydb/core/client/minikql_compile/mkql_compile_service.cpp
index a33ba895589..e01d61a22cc 100644
--- a/ydb/core/client/minikql_compile/mkql_compile_service.cpp
+++ b/ydb/core/client/minikql_compile/mkql_compile_service.cpp
@@ -71,7 +71,7 @@ public:
void Bootstrap(const TActorContext& ctx) {
- Counters = GetServiceCounters(AppData(ctx)->Counters, "compile")->GetSubgroup("subsystem", "cache");
+ Counters = GetServiceCounters(AppData(ctx)->Counters, "compile")->GetSubgroup("subsystem", "cache");
AllocPoolCounters = TAlignedPagePoolCounters(AppData(ctx)->Counters, "compile");
if (!DbSchemeResolver) {
diff --git a/ydb/core/client/minikql_compile/yql_expr_minikql.cpp b/ydb/core/client/minikql_compile/yql_expr_minikql.cpp
index 984f408b5ea..76f38bf35cb 100644
--- a/ydb/core/client/minikql_compile/yql_expr_minikql.cpp
+++ b/ydb/core/client/minikql_compile/yql_expr_minikql.cpp
@@ -386,7 +386,7 @@ private:
auto systemColumnType = KikimrSystemColumns().find(columnName);
if (systemColumnType != KikimrSystemColumns().end()) {
columnDataType = ctx.MakeType<TDataExprType>(systemColumnType->second);
- } else {
+ } else {
auto column = lookup->Columns.FindPtr(columnName);
YQL_ENSURE(column);
@@ -401,7 +401,7 @@ private:
TDataType::Create(column->Type, *MkqlCtx->TypeEnv),
ctx);
}
- }
+ }
auto columnOptType = ctx.MakeType<TOptionalExprType>(columnDataType);
resultItems.push_back(ctx.MakeType<TItemExprType>(columnName, columnOptType));
diff --git a/ydb/core/client/server/grpc_server.cpp b/ydb/core/client/server/grpc_server.cpp
index 98e9637131e..aa122da36a1 100644
--- a/ydb/core/client/server/grpc_server.cpp
+++ b/ydb/core/client/server/grpc_server.cpp
@@ -22,7 +22,7 @@
using grpc::Server;
using grpc::ServerContext;
using grpc::ServerAsyncResponseWriter;
-using grpc::ServerAsyncWriter;
+using grpc::ServerAsyncWriter;
using grpc::Status;
using grpc::StatusCode;
using grpc::ServerCompletionQueue;
@@ -70,10 +70,10 @@ public:
, ActorSystem(as)
, Name(name)
, Counters(std::move(counters))
- , Writer(new ServerAsyncResponseWriter<TOut>(&Context))
+ , Writer(new ServerAsyncResponseWriter<TOut>(&Context))
, StateFunc(&TSimpleRequest::RequestDone)
- , RequestSize(0)
- , ResponseSize(0)
+ , RequestSize(0)
+ , ResponseSize(0)
, ResponseStatus(0)
, InProgress_(false)
{
@@ -105,7 +105,7 @@ public:
//! Start another instance of request to grab next incoming query (only when the server is not shutting down)
void Clone() {
if (!Server->IsShuttingDown()) {
- if (RequestCallback)
+ if (RequestCallback)
(new TSimpleRequest(Server, Service, CQ, Cb, RequestCallback, ActorSystem, Name, Counters))->Start();
}
}
@@ -153,22 +153,22 @@ public:
}
}
- void Reply(const NKikimrClient::TNodeRegistrationResponse& resp) override {
- try {
+ void Reply(const NKikimrClient::TNodeRegistrationResponse& resp) override {
+ try {
Finish(dynamic_cast<const TOut&>(resp), 0);
- } catch (const std::bad_cast&) {
- Y_FAIL("unexpected response type generated");
- }
- }
-
- void Reply(const NKikimrClient::TCmsResponse& resp) override {
- try {
+ } catch (const std::bad_cast&) {
+ Y_FAIL("unexpected response type generated");
+ }
+ }
+
+ void Reply(const NKikimrClient::TCmsResponse& resp) override {
+ try {
Finish(dynamic_cast<const TOut&>(resp), 0);
- } catch (const std::bad_cast&) {
- Y_FAIL("unexpected response type generated");
- }
- }
-
+ } catch (const std::bad_cast&) {
+ Y_FAIL("unexpected response type generated");
+ }
+ }
+
void Reply(const NKikimrClient::TSqsResponse& resp) override {
try {
Finish(dynamic_cast<const TOut&>(resp), 0);
@@ -185,14 +185,14 @@ public:
}
}
- void Reply(const NKikimrClient::TConsoleResponse& resp) override {
- try {
+ void Reply(const NKikimrClient::TConsoleResponse& resp) override {
+ try {
Finish(dynamic_cast<const TOut&>(resp), 0);
- } catch (const std::bad_cast&) {
- Y_FAIL("unexpected response type generated");
- }
- }
-
+ } catch (const std::bad_cast&) {
+ Y_FAIL("unexpected response type generated");
+ }
+ }
+
//! Send error reply.
void ReplyError(const TString& reason) override {
TOut resp;
@@ -207,16 +207,16 @@ public:
}
}
- static void GenerateErrorResponse(NKikimrClient::TNodeRegistrationResponse& resp, const TString& reason) {
- resp.MutableStatus()->SetCode(NKikimrNodeBroker::TStatus::ERROR);
- resp.MutableStatus()->SetReason(reason);
- }
-
- static void GenerateErrorResponse(NKikimrClient::TCmsResponse& resp, const TString& reason) {
- resp.MutableStatus()->SetCode(NKikimrCms::TStatus::ERROR);
- resp.MutableStatus()->SetReason(reason);
- }
-
+ static void GenerateErrorResponse(NKikimrClient::TNodeRegistrationResponse& resp, const TString& reason) {
+ resp.MutableStatus()->SetCode(NKikimrNodeBroker::TStatus::ERROR);
+ resp.MutableStatus()->SetReason(reason);
+ }
+
+ static void GenerateErrorResponse(NKikimrClient::TCmsResponse& resp, const TString& reason) {
+ resp.MutableStatus()->SetCode(NKikimrCms::TStatus::ERROR);
+ resp.MutableStatus()->SetReason(reason);
+ }
+
static void GenerateErrorResponse(NKikimrClient::TJSON& resp, const TString& reason) {
NJson::TJsonValue json(NJson::JSON_MAP);
json["ErrorReason"] = reason;
@@ -231,10 +231,10 @@ public:
resp.SetDescription(reason);
}
- static void GenerateErrorResponse(NKikimrClient::TConsoleResponse& resp, const TString& reason) {
+ static void GenerateErrorResponse(NKikimrClient::TConsoleResponse& resp, const TString& reason) {
resp.MutableStatus()->SetCode(Ydb::StatusIds::GENERIC_ERROR);
- resp.MutableStatus()->SetReason(reason);
- }
+ resp.MutableStatus()->SetReason(reason);
+ }
NMsgBusProxy::TBusMessageContext BindBusContext(int type) override {
return BusContext.ConstructInPlace(this, type);
@@ -353,12 +353,12 @@ private:
const char* const Name;
NGrpc::ICounterBlockPtr Counters;
- THolder<ServerAsyncResponseWriter<TOut>> Writer;
+ THolder<ServerAsyncResponseWriter<TOut>> Writer;
TStateFunc StateFunc;
TIn Request;
- ui32 RequestSize;
- ui32 ResponseSize;
+ ui32 RequestSize;
+ ui32 ResponseSize;
ui32 ResponseStatus;
THPTimer RequestTimer;
@@ -467,18 +467,18 @@ void TGRpcService::SetupIncomingRequests() {
ADD_ACTOR_REQUEST(InterconnectDebug, TInterconnectDebug, MTYPE_CLIENT_INTERCONNECT_DEBUG)
ADD_ACTOR_REQUEST(TestShardControl, TTestShardControlRequest, MTYPE_CLIENT_TEST_SHARD_CONTROL)
- // dynamic node registration
- ADD_REQUEST(RegisterNode, TNodeRegistrationRequest, TNodeRegistrationResponse, {
- NMsgBusProxy::TBusMessageContext msg(ctx->BindBusContext(NMsgBusProxy::MTYPE_CLIENT_NODE_REGISTRATION_REQUEST));
+ // dynamic node registration
+ ADD_REQUEST(RegisterNode, TNodeRegistrationRequest, TNodeRegistrationResponse, {
+ NMsgBusProxy::TBusMessageContext msg(ctx->BindBusContext(NMsgBusProxy::MTYPE_CLIENT_NODE_REGISTRATION_REQUEST));
RegisterRequestActor(CreateMessageBusRegisterNode(msg));
- })
-
- // CMS request
- ADD_REQUEST(CmsRequest, TCmsRequest, TCmsResponse, {
- NMsgBusProxy::TBusMessageContext msg(ctx->BindBusContext(NMsgBusProxy::MTYPE_CLIENT_CMS_REQUEST));
+ })
+
+ // CMS request
+ ADD_REQUEST(CmsRequest, TCmsRequest, TCmsResponse, {
+ NMsgBusProxy::TBusMessageContext msg(ctx->BindBusContext(NMsgBusProxy::MTYPE_CLIENT_CMS_REQUEST));
RegisterRequestActor(CreateMessageBusCmsRequest(msg));
- })
-
+ })
+
// SQS request
ADD_REQUEST(SqsRequest, TSqsRequest, TSqsResponse, {
NMsgBusProxy::TBusMessageContext msg(ctx->BindBusContext(NMsgBusProxy::MTYPE_CLIENT_SQS_REQUEST));
@@ -491,11 +491,11 @@ void TGRpcService::SetupIncomingRequests() {
RegisterRequestActor(CreateMessageBusS3ListingRequest(msg));
})
- // Console request
- ADD_REQUEST(ConsoleRequest, TConsoleRequest, TConsoleResponse, {
- NMsgBusProxy::TBusMessageContext msg(ctx->BindBusContext(NMsgBusProxy::MTYPE_CLIENT_CONSOLE_REQUEST));
+ // Console request
+ ADD_REQUEST(ConsoleRequest, TConsoleRequest, TConsoleResponse, {
+ NMsgBusProxy::TBusMessageContext msg(ctx->BindBusContext(NMsgBusProxy::MTYPE_CLIENT_CONSOLE_REQUEST));
RegisterRequestActor(CreateMessageBusConsoleRequest(msg));
- })
+ })
#define ADD_PROXY_REQUEST_BASE(NAME, TYPE, RES_TYPE, EVENT_TYPE, MTYPE) \
ADD_REQUEST(NAME, TYPE, RES_TYPE, { \
diff --git a/ydb/core/client/server/grpc_server.h b/ydb/core/client/server/grpc_server.h
index d7b7fa23d16..2f2ae1da6b6 100644
--- a/ydb/core/client/server/grpc_server.h
+++ b/ydb/core/client/server/grpc_server.h
@@ -34,11 +34,11 @@ public:
virtual void Reply(const NKikimrClient::TResponse& resp) = 0;
virtual void Reply(const NKikimrClient::TBsTestLoadResponse& resp) = 0;
virtual void Reply(const NKikimrClient::TJSON& resp) = 0;
- virtual void Reply(const NKikimrClient::TNodeRegistrationResponse& resp) = 0;
- virtual void Reply(const NKikimrClient::TCmsResponse& resp) = 0;
+ virtual void Reply(const NKikimrClient::TNodeRegistrationResponse& resp) = 0;
+ virtual void Reply(const NKikimrClient::TCmsResponse& resp) = 0;
virtual void Reply(const NKikimrClient::TSqsResponse& resp) = 0;
virtual void Reply(const NKikimrClient::TS3ListingResponse& resp) = 0;
- virtual void Reply(const NKikimrClient::TConsoleResponse& resp) = 0;
+ virtual void Reply(const NKikimrClient::TConsoleResponse& resp) = 0;
//! Send error reply when request wasn't handled properly.
virtual void ReplyError(const TString& reason) = 0;
diff --git a/ydb/core/client/server/msgbus_http_server.cpp b/ydb/core/client/server/msgbus_http_server.cpp
index fea576155f5..e535ebe3350 100644
--- a/ydb/core/client/server/msgbus_http_server.cpp
+++ b/ydb/core/client/server/msgbus_http_server.cpp
@@ -145,7 +145,7 @@ TMessageBusHttpServer::TMessageBusHttpServer(TActorSystem* actorSystem, NBus::IB
, Monitor(actorSystem->AppData<TAppData>()->Mon)
, Config(config)
{
- HttpGroup = GetServiceCounters(Counters, "proxy")->GetSubgroup("subsystem", "http");
+ HttpGroup = GetServiceCounters(Counters, "proxy")->GetSubgroup("subsystem", "http");
RequestsActive = HttpGroup->GetCounter("Requests/Active", false);
RequestsCount = HttpGroup->GetCounter("Requests/Count", true);
InboundSize = HttpGroup->GetCounter("Requests/InboundSize", true);
diff --git a/ydb/core/client/server/msgbus_server.cpp b/ydb/core/client/server/msgbus_server.cpp
index a81b2535065..8a4d8a3bbd5 100644
--- a/ydb/core/client/server/msgbus_server.cpp
+++ b/ydb/core/client/server/msgbus_server.cpp
@@ -119,16 +119,16 @@ public:
MTYPE(TBusDbResponse)
MTYPE(TBusDbBatch)
MTYPE(TBusBlobStorageConfigRequest)
- MTYPE(TBusNodeRegistrationRequest)
- MTYPE(TBusCmsRequest)
+ MTYPE(TBusNodeRegistrationRequest)
+ MTYPE(TBusCmsRequest)
MTYPE(TBusChooseProxy)
MTYPE(TBusSqsRequest)
MTYPE(TBusWhoAmI)
- MTYPE(TBusStreamRequest)
+ MTYPE(TBusStreamRequest)
MTYPE(TBusS3ListingRequest)
MTYPE(TBusS3ListingResponse)
MTYPE(TBusInterconnectDebug)
- MTYPE(TBusConsoleRequest)
+ MTYPE(TBusConsoleRequest)
MTYPE(TBusResolveNode)
MTYPE(TBusFillNode)
MTYPE(TBusDrainNode)
@@ -172,11 +172,11 @@ public:
REPLY_OPTION(TBusResponse)
REPLY_OPTION(TBusDbResponse)
REPLY_OPTION(TBusBsTestLoadResponse)
- REPLY_OPTION(TBusNodeRegistrationResponse)
- REPLY_OPTION(TBusCmsResponse)
+ REPLY_OPTION(TBusNodeRegistrationResponse)
+ REPLY_OPTION(TBusCmsResponse)
REPLY_OPTION(TBusSqsResponse)
REPLY_OPTION(TBusS3ListingResponse)
- REPLY_OPTION(TBusConsoleResponse)
+ REPLY_OPTION(TBusConsoleResponse)
default:
Y_FAIL("unexpected response type %" PRIu32, type);
@@ -298,8 +298,8 @@ class TMessageBusSessionIdentHolder::TImplGRpc
public:
TImplGRpc(TIntrusivePtr<TBusMessageContext::TImplGRpc> context)
: Context(context)
- {
- }
+ {
+ }
~TImplGRpc() {
if (Context) {
@@ -308,16 +308,16 @@ public:
}
void SendReply(NBus::TBusMessage *resp) override {
- Y_VERIFY(Context);
- Context->SendReply(resp);
-
+ Y_VERIFY(Context);
+ Context->SendReply(resp);
+
auto context = std::move(Context);
}
void SendReplyMove(NBus::TBusMessageAutoPtr resp) override {
- Y_VERIFY(Context);
- Context->SendReplyMove(resp);
-
+ Y_VERIFY(Context);
+ Context->SendReplyMove(resp);
+
auto context = std::move(Context);
}
@@ -538,8 +538,8 @@ void TMessageBusServer::OnMessage(TBusMessageContext &msg) {
return ClientActorRequest(CreateMessageBusFillNode, msg);
case MTYPE_CLIENT_RESOLVE_NODE:
return ClientActorRequest(CreateMessageBusResolveNode, msg);
- case MTYPE_CLIENT_CMS_REQUEST:
- return ClientActorRequest(CreateMessageBusCmsRequest, msg);
+ case MTYPE_CLIENT_CMS_REQUEST:
+ return ClientActorRequest(CreateMessageBusCmsRequest, msg);
case MTYPE_CLIENT_SQS_REQUEST:
return ClientActorRequest(CreateMessageBusSqsRequest, msg);
case MTYPE_CLIENT_WHOAMI:
@@ -548,8 +548,8 @@ void TMessageBusServer::OnMessage(TBusMessageContext &msg) {
return ClientActorRequest(CreateMessageBusS3ListingRequest, msg);
case MTYPE_CLIENT_INTERCONNECT_DEBUG:
return ClientActorRequest(CreateMessageBusInterconnectDebug, msg);
- case MTYPE_CLIENT_CONSOLE_REQUEST:
- return ClientActorRequest(CreateMessageBusConsoleRequest, msg);
+ case MTYPE_CLIENT_CONSOLE_REQUEST:
+ return ClientActorRequest(CreateMessageBusConsoleRequest, msg);
case MTYPE_CLIENT_TEST_SHARD_CONTROL:
return ClientActorRequest(CreateMessageBusTestShardControl, msg);
default:
diff --git a/ydb/core/client/server/msgbus_server.h b/ydb/core/client/server/msgbus_server.h
index 12ba5057efa..3d40fc90017 100644
--- a/ydb/core/client/server/msgbus_server.h
+++ b/ydb/core/client/server/msgbus_server.h
@@ -102,10 +102,10 @@ struct TEvBusProxy {
EvDbBatch,
EvInitRoot,
EvChooseProxy,
-
+
EvStreamIsReadyNotUsed = EvRequest + 512,
EvStreamIsDeadNotUsed,
-
+
EvEnd
};
@@ -301,13 +301,13 @@ IActor* CreateMessageBusBlobStorageConfig(TBusMessageContext &msg);
IActor* CreateMessageBusDrainNode(TBusMessageContext &msg);
IActor* CreateMessageBusFillNode(TBusMessageContext &msg);
IActor* CreateMessageBusResolveNode(TBusMessageContext &msg);
-IActor* CreateMessageBusRegisterNode(TBusMessageContext &msg);
-IActor* CreateMessageBusCmsRequest(TBusMessageContext &msg);
+IActor* CreateMessageBusRegisterNode(TBusMessageContext &msg);
+IActor* CreateMessageBusCmsRequest(TBusMessageContext &msg);
IActor* CreateMessageBusSqsRequest(TBusMessageContext &msg);
IActor* CreateMessageBusWhoAmI(TBusMessageContext &msg);
IActor* CreateMessageBusS3ListingRequest(TBusMessageContext& msg);
IActor* CreateMessageBusInterconnectDebug(TBusMessageContext& msg);
-IActor* CreateMessageBusConsoleRequest(TBusMessageContext &msg);
+IActor* CreateMessageBusConsoleRequest(TBusMessageContext &msg);
IActor* CreateMessageBusTestShardControl(TBusMessageContext &msg);
TBusResponse* ProposeTransactionStatusToResponse(EResponseStatus status, const NKikimrTxUserProxy::TEvProposeTransactionStatus &result);
diff --git a/ydb/core/client/server/msgbus_server_cms.cpp b/ydb/core/client/server/msgbus_server_cms.cpp
index f8ea6d3900d..53ada2a3fad 100644
--- a/ydb/core/client/server/msgbus_server_cms.cpp
+++ b/ydb/core/client/server/msgbus_server_cms.cpp
@@ -1,307 +1,307 @@
#include "msgbus_server_request.h"
#include "msgbus_securereq.h"
-
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
#include <ydb/core/base/appdata.h>
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/cms/cms.h>
#include <ydb/core/base/ticket_parser.h>
-
-namespace NKikimr {
-namespace NMsgBusProxy {
-
-using namespace NKikimrCms;
-using namespace NCms;
-
-namespace {
-
+
+namespace NKikimr {
+namespace NMsgBusProxy {
+
+using namespace NKikimrCms;
+using namespace NCms;
+
+namespace {
+
class TCmsRequestActor : public TMessageBusSecureRequest<TMessageBusServerRequestBase<TCmsRequestActor>>
-{
- using TActorBase = TActorBootstrapped<TCmsRequestActor>;
+{
+ using TActorBase = TActorBootstrapped<TCmsRequestActor>;
using TBase = TMessageBusSecureRequest<TMessageBusServerRequestBase<TCmsRequestActor>>;
-
-public:
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::MSGBUS_COMMON;
}
- TCmsRequestActor(NKikimrClient::TCmsRequest &request, NMsgBusProxy::TBusMessageContext &msg)
+ TCmsRequestActor(NKikimrClient::TCmsRequest &request, NMsgBusProxy::TBusMessageContext &msg)
: TBase(msg)
- , Request(request)
- {
+ , Request(request)
+ {
TBase::SetSecurityToken(request.GetSecurityToken());
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- auto dinfo = AppData(ctx)->DomainsInfo;
-
- if (Request.HasDomainName()) {
- auto *domain = dinfo->GetDomainByName(Request.GetDomainName());
- if (!domain) {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ auto dinfo = AppData(ctx)->DomainsInfo;
+
+ if (Request.HasDomainName()) {
+ auto *domain = dinfo->GetDomainByName(Request.GetDomainName());
+ if (!domain) {
auto error = Sprintf("Unknown domain %s", Request.GetDomainName().data());
- ReplyWithErrorAndDie(error, ctx);
- return;
- }
- StateStorageGroup = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
- } else {
- if (dinfo->Domains.size() > 1) {
- auto error = "Ambiguous domain (use --domain option)";
- ReplyWithErrorAndDie(error, ctx);
- }
-
- auto domain = dinfo->Domains.begin()->second;
- StateStorageGroup = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
- }
-
+ ReplyWithErrorAndDie(error, ctx);
+ return;
+ }
+ StateStorageGroup = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
+ } else {
+ if (dinfo->Domains.size() > 1) {
+ auto error = "Ambiguous domain (use --domain option)";
+ ReplyWithErrorAndDie(error, ctx);
+ }
+
+ auto domain = dinfo->Domains.begin()->second;
+ StateStorageGroup = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
+ }
+
SendRequest(ctx);
Become(&TCmsRequestActor::MainState);
- }
-
- void SendRequest(const TActorContext &ctx)
- {
- NTabletPipe::TClientConfig pipeConfig;
+ }
+
+ void SendRequest(const TActorContext &ctx)
+ {
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = {.RetryLimitCount = 10};
- auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeCmsID(StateStorageGroup), pipeConfig);
+ auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeCmsID(StateStorageGroup), pipeConfig);
CmsPipe = ctx.RegisterWithSameMailbox(pipe);
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Forwarding CMS request: %s",
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Forwarding CMS request: %s",
Request.ShortDebugString().data());
-
- if (Request.HasClusterStateRequest()) {
- TAutoPtr<TEvCms::TEvClusterStateRequest> request
- = new TEvCms::TEvClusterStateRequest;
- request->Record.CopyFrom(Request.GetClusterStateRequest());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else if (Request.HasPermissionRequest()) {
- TAutoPtr<TEvCms::TEvPermissionRequest> request
- = new TEvCms::TEvPermissionRequest;
- request->Record.CopyFrom(Request.GetPermissionRequest());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else if (Request.HasManageRequestRequest()) {
- TAutoPtr<TEvCms::TEvManageRequestRequest> request
- = new TEvCms::TEvManageRequestRequest;
- request->Record.CopyFrom(Request.GetManageRequestRequest());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else if (Request.HasCheckRequest()) {
- TAutoPtr<TEvCms::TEvCheckRequest> request
- = new TEvCms::TEvCheckRequest;
- request->Record.CopyFrom(Request.GetCheckRequest());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else if (Request.HasManagePermissionRequest()) {
- TAutoPtr<TEvCms::TEvManagePermissionRequest> request
- = new TEvCms::TEvManagePermissionRequest;
- request->Record.CopyFrom(Request.GetManagePermissionRequest());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else if (Request.HasNotification()) {
- TAutoPtr<TEvCms::TEvNotification> request
- = new TEvCms::TEvNotification;
- request->Record.CopyFrom(Request.GetNotification());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else if (Request.HasManageNotificationRequest()) {
- TAutoPtr<TEvCms::TEvManageNotificationRequest> request
- = new TEvCms::TEvManageNotificationRequest;
- request->Record.CopyFrom(Request.GetManageNotificationRequest());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else if (Request.HasGetConfigRequest()) {
- TAutoPtr<TEvCms::TEvGetConfigRequest> request
- = new TEvCms::TEvGetConfigRequest;
- request->Record.CopyFrom(Request.GetGetConfigRequest());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else if (Request.HasGetLogTailRequest()) {
- TAutoPtr<TEvCms::TEvGetLogTailRequest> request
- = new TEvCms::TEvGetLogTailRequest;
- request->Record.CopyFrom(Request.GetGetLogTailRequest());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else if (Request.HasResetMarkerRequest()) {
- TAutoPtr<TEvCms::TEvResetMarkerRequest> request
- = new TEvCms::TEvResetMarkerRequest;
- request->Record.CopyFrom(Request.GetResetMarkerRequest());
+
+ if (Request.HasClusterStateRequest()) {
+ TAutoPtr<TEvCms::TEvClusterStateRequest> request
+ = new TEvCms::TEvClusterStateRequest;
+ request->Record.CopyFrom(Request.GetClusterStateRequest());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else if (Request.HasPermissionRequest()) {
+ TAutoPtr<TEvCms::TEvPermissionRequest> request
+ = new TEvCms::TEvPermissionRequest;
+ request->Record.CopyFrom(Request.GetPermissionRequest());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else if (Request.HasManageRequestRequest()) {
+ TAutoPtr<TEvCms::TEvManageRequestRequest> request
+ = new TEvCms::TEvManageRequestRequest;
+ request->Record.CopyFrom(Request.GetManageRequestRequest());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else if (Request.HasCheckRequest()) {
+ TAutoPtr<TEvCms::TEvCheckRequest> request
+ = new TEvCms::TEvCheckRequest;
+ request->Record.CopyFrom(Request.GetCheckRequest());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else if (Request.HasManagePermissionRequest()) {
+ TAutoPtr<TEvCms::TEvManagePermissionRequest> request
+ = new TEvCms::TEvManagePermissionRequest;
+ request->Record.CopyFrom(Request.GetManagePermissionRequest());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else if (Request.HasNotification()) {
+ TAutoPtr<TEvCms::TEvNotification> request
+ = new TEvCms::TEvNotification;
+ request->Record.CopyFrom(Request.GetNotification());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else if (Request.HasManageNotificationRequest()) {
+ TAutoPtr<TEvCms::TEvManageNotificationRequest> request
+ = new TEvCms::TEvManageNotificationRequest;
+ request->Record.CopyFrom(Request.GetManageNotificationRequest());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else if (Request.HasGetConfigRequest()) {
+ TAutoPtr<TEvCms::TEvGetConfigRequest> request
+ = new TEvCms::TEvGetConfigRequest;
+ request->Record.CopyFrom(Request.GetGetConfigRequest());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else if (Request.HasGetLogTailRequest()) {
+ TAutoPtr<TEvCms::TEvGetLogTailRequest> request
+ = new TEvCms::TEvGetLogTailRequest;
+ request->Record.CopyFrom(Request.GetGetLogTailRequest());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else if (Request.HasResetMarkerRequest()) {
+ TAutoPtr<TEvCms::TEvResetMarkerRequest> request
+ = new TEvCms::TEvResetMarkerRequest;
+ request->Record.CopyFrom(Request.GetResetMarkerRequest());
request->Record.SetUserToken(TBase::GetSerializedToken());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else if (Request.HasSetConfigRequest()) {
- TAutoPtr<TEvCms::TEvSetConfigRequest> request
- = new TEvCms::TEvSetConfigRequest;
- request->Record.CopyFrom(Request.GetSetConfigRequest());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else if (Request.HasSetMarkerRequest()) {
- TAutoPtr<TEvCms::TEvSetMarkerRequest> request
- = new TEvCms::TEvSetMarkerRequest;
- request->Record.CopyFrom(Request.GetSetMarkerRequest());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else if (Request.HasSetConfigRequest()) {
+ TAutoPtr<TEvCms::TEvSetConfigRequest> request
+ = new TEvCms::TEvSetConfigRequest;
+ request->Record.CopyFrom(Request.GetSetConfigRequest());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else if (Request.HasSetMarkerRequest()) {
+ TAutoPtr<TEvCms::TEvSetMarkerRequest> request
+ = new TEvCms::TEvSetMarkerRequest;
+ request->Record.CopyFrom(Request.GetSetMarkerRequest());
request->Record.SetUserToken(TBase::GetSerializedToken());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- } else {
- ReplyWithErrorAndDie("Unknown CMS request", ctx);
- }
- }
-
- void Handle(TEvCms::TEvClusterStateResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableClusterStateResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvCms::TEvPermissionResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutablePermissionResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvCms::TEvManageRequestResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableManageRequestResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvCms::TEvManagePermissionResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableManagePermissionResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvCms::TEvNotificationResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableNotificationResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvCms::TEvManageNotificationResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableManageNotificationResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvCms::TEvGetConfigResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableGetConfigResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvCms::TEvGetLogTailResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableGetLogTailResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvCms::TEvResetMarkerResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableResetMarkerResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvCms::TEvSetConfigResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableSetConfigResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvCms::TEvSetMarkerResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableSetMarkerResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Undelivered(const TActorContext &ctx) {
- ReplyWithErrorAndDie("CMS is unavailable", ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) noexcept
- {
- if (ev->Get()->Status != NKikimrProto::OK)
- Undelivered(ctx);
- }
-
- void Die(const TActorContext &ctx)
- {
- if (CmsPipe)
- NTabletPipe::CloseClient(ctx, CmsPipe);
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ } else {
+ ReplyWithErrorAndDie("Unknown CMS request", ctx);
+ }
+ }
+
+ void Handle(TEvCms::TEvClusterStateResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableClusterStateResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvCms::TEvPermissionResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutablePermissionResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvCms::TEvManageRequestResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableManageRequestResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvCms::TEvManagePermissionResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableManagePermissionResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvCms::TEvNotificationResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableNotificationResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvCms::TEvManageNotificationResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableManageNotificationResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvCms::TEvGetConfigResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableGetConfigResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvCms::TEvGetLogTailResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableGetLogTailResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvCms::TEvResetMarkerResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableResetMarkerResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvCms::TEvSetConfigResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableSetConfigResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvCms::TEvSetMarkerResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableSetMarkerResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Undelivered(const TActorContext &ctx) {
+ ReplyWithErrorAndDie("CMS is unavailable", ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ if (ev->Get()->Status != NKikimrProto::OK)
+ Undelivered(ctx);
+ }
+
+ void Die(const TActorContext &ctx)
+ {
+ if (CmsPipe)
+ NTabletPipe::CloseClient(ctx, CmsPipe);
TBase::Die(ctx);
- }
-
- void SendReplyAndDie(const TActorContext &ctx)
- {
- Y_VERIFY(Response.HasStatus());
-
- auto response = MakeHolder<TBusCmsResponse>();
- response->Record = std::move(Response);
- SendReplyMove(response.Release());
- Die(ctx);
- }
-
- void ReplyWithErrorAndDie(const TString &error, const TActorContext &ctx)
- {
- Response.MutableStatus()->SetCode(TStatus::ERROR);
- Response.MutableStatus()->SetReason(error);
- SendReplyAndDie(ctx);
- }
-
- void ReplyWithErrorAndDie(const TStatus &status, const TActorContext &ctx)
- {
- Response.MutableStatus()->CopyFrom(status);
- SendReplyAndDie(ctx);
- }
-
- STFUNC(MainState) {
- switch (ev->GetTypeRewrite()) {
- CFunc(TEvents::TEvUndelivered::EventType, Undelivered);
- HFunc(TEvCms::TEvClusterStateResponse, Handle);
- HFunc(TEvCms::TEvPermissionResponse, Handle);
- HFunc(TEvCms::TEvManageRequestResponse, Handle);
- HFunc(TEvCms::TEvManagePermissionResponse, Handle);
- HFunc(TEvCms::TEvNotificationResponse, Handle);
- HFunc(TEvCms::TEvManageNotificationResponse, Handle);
- HFunc(TEvCms::TEvGetConfigResponse, Handle);
- HFunc(TEvCms::TEvGetLogTailResponse, Handle);
- HFunc(TEvCms::TEvResetMarkerResponse, Handle);
- HFunc(TEvCms::TEvSetConfigResponse, Handle);
- HFunc(TEvCms::TEvSetMarkerResponse, Handle);
- CFunc(TEvTabletPipe::EvClientDestroyed, Undelivered);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- default:
- Y_FAIL("TCmsRequestActor::MainState unexpected event type: %" PRIx32 " event: %s",
- ev->GetTypeRewrite(),
+ }
+
+ void SendReplyAndDie(const TActorContext &ctx)
+ {
+ Y_VERIFY(Response.HasStatus());
+
+ auto response = MakeHolder<TBusCmsResponse>();
+ response->Record = std::move(Response);
+ SendReplyMove(response.Release());
+ Die(ctx);
+ }
+
+ void ReplyWithErrorAndDie(const TString &error, const TActorContext &ctx)
+ {
+ Response.MutableStatus()->SetCode(TStatus::ERROR);
+ Response.MutableStatus()->SetReason(error);
+ SendReplyAndDie(ctx);
+ }
+
+ void ReplyWithErrorAndDie(const TStatus &status, const TActorContext &ctx)
+ {
+ Response.MutableStatus()->CopyFrom(status);
+ SendReplyAndDie(ctx);
+ }
+
+ STFUNC(MainState) {
+ switch (ev->GetTypeRewrite()) {
+ CFunc(TEvents::TEvUndelivered::EventType, Undelivered);
+ HFunc(TEvCms::TEvClusterStateResponse, Handle);
+ HFunc(TEvCms::TEvPermissionResponse, Handle);
+ HFunc(TEvCms::TEvManageRequestResponse, Handle);
+ HFunc(TEvCms::TEvManagePermissionResponse, Handle);
+ HFunc(TEvCms::TEvNotificationResponse, Handle);
+ HFunc(TEvCms::TEvManageNotificationResponse, Handle);
+ HFunc(TEvCms::TEvGetConfigResponse, Handle);
+ HFunc(TEvCms::TEvGetLogTailResponse, Handle);
+ HFunc(TEvCms::TEvResetMarkerResponse, Handle);
+ HFunc(TEvCms::TEvSetConfigResponse, Handle);
+ HFunc(TEvCms::TEvSetMarkerResponse, Handle);
+ CFunc(TEvTabletPipe::EvClientDestroyed, Undelivered);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ default:
+ Y_FAIL("TCmsRequestActor::MainState unexpected event type: %" PRIx32 " event: %s",
+ ev->GetTypeRewrite(),
ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
-private:
- NKikimrClient::TCmsRequest Request;
- NKikimrClient::TCmsResponse Response;
+ }
+ }
+
+private:
+ NKikimrClient::TCmsRequest Request;
+ NKikimrClient::TCmsResponse Response;
ui32 StateStorageGroup = 0;
TActorId CmsPipe;
-};
-
-} // namespace
-
-IActor* CreateMessageBusCmsRequest(TBusMessageContext &msg)
-{
- NKikimrClient::TCmsRequest &record
- = static_cast<TBusCmsRequest*>(msg.GetMessage())->Record;
- return new TCmsRequestActor(record, msg);
-}
-
-} // namespace NMsgBusProxy
-} // namespace NKikimr
+};
+
+} // namespace
+
+IActor* CreateMessageBusCmsRequest(TBusMessageContext &msg)
+{
+ NKikimrClient::TCmsRequest &record
+ = static_cast<TBusCmsRequest*>(msg.GetMessage())->Record;
+ return new TCmsRequestActor(record, msg);
+}
+
+} // namespace NMsgBusProxy
+} // namespace NKikimr
diff --git a/ydb/core/client/server/msgbus_server_console.cpp b/ydb/core/client/server/msgbus_server_console.cpp
index 99ace70518b..66bc0b02ebe 100644
--- a/ydb/core/client/server/msgbus_server_console.cpp
+++ b/ydb/core/client/server/msgbus_server_console.cpp
@@ -1,363 +1,363 @@
#include "msgbus_server_request.h"
#include "msgbus_securereq.h"
-
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
#include <ydb/core/base/appdata.h>
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/cms/console/console.h>
#include <ydb/core/base/ticket_parser.h>
-
-namespace NKikimr {
-namespace NMsgBusProxy {
-
-using namespace NKikimrConsole;
-using namespace NConsole;
-
-namespace {
-
+
+namespace NKikimr {
+namespace NMsgBusProxy {
+
+using namespace NKikimrConsole;
+using namespace NConsole;
+
+namespace {
+
class TConsoleRequestActor : public TMessageBusSecureRequest<TMessageBusServerRequestBase<TConsoleRequestActor>>
-{
- using TActorBase = TActorBootstrapped<TConsoleRequestActor>;
+{
+ using TActorBase = TActorBootstrapped<TConsoleRequestActor>;
using TBase = TMessageBusSecureRequest<TMessageBusServerRequestBase<TConsoleRequestActor>>;
-
-public:
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::MSGBUS_COMMON;
}
- TConsoleRequestActor(NKikimrClient::TConsoleRequest &request, NMsgBusProxy::TBusMessageContext &msg)
+ TConsoleRequestActor(NKikimrClient::TConsoleRequest &request, NMsgBusProxy::TBusMessageContext &msg)
: TBase(msg)
- , Request(request)
- {
+ , Request(request)
+ {
TBase::SetSecurityToken(request.GetSecurityToken());
TBase::SetRequireAdminAccess(true);
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- auto dinfo = AppData(ctx)->DomainsInfo;
-
- if (Request.HasDomainName()) {
- auto *domain = dinfo->GetDomainByName(Request.GetDomainName());
- if (!domain) {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ auto dinfo = AppData(ctx)->DomainsInfo;
+
+ if (Request.HasDomainName()) {
+ auto *domain = dinfo->GetDomainByName(Request.GetDomainName());
+ if (!domain) {
auto error = Sprintf("Unknown domain %s", Request.GetDomainName().data());
- ReplyWithErrorAndDie(error, ctx);
- return;
- }
- StateStorageGroup = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
- } else {
- if (dinfo->Domains.size() > 1) {
- auto error = "Ambiguous domain (use --domain option)";
- ReplyWithErrorAndDie(error, ctx);
- return;
- }
-
- auto domain = dinfo->Domains.begin()->second;
- StateStorageGroup = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
- }
-
+ ReplyWithErrorAndDie(error, ctx);
+ return;
+ }
+ StateStorageGroup = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
+ } else {
+ if (dinfo->Domains.size() > 1) {
+ auto error = "Ambiguous domain (use --domain option)";
+ ReplyWithErrorAndDie(error, ctx);
+ return;
+ }
+
+ auto domain = dinfo->Domains.begin()->second;
+ StateStorageGroup = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
+ }
+
SendRequest(ctx);
TBase::Become(&TConsoleRequestActor::MainState);
- }
-
- void SendRequest(const TActorContext &ctx)
- {
- NTabletPipe::TClientConfig pipeConfig;
+ }
+
+ void SendRequest(const TActorContext &ctx)
+ {
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = {.RetryLimitCount = 10};
- auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeConsoleID(StateStorageGroup), pipeConfig);
+ auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeConsoleID(StateStorageGroup), pipeConfig);
ConsolePipe = ctx.RegisterWithSameMailbox(pipe);
-
- // Don't print security token.
- Request.ClearSecurityToken();
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Forwarding console request: %s",
+
+ // Don't print security token.
+ Request.ClearSecurityToken();
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Forwarding console request: %s",
Request.ShortDebugString().data());
-
- if (Request.HasCreateTenantRequest()) {
- auto request = MakeHolder<TEvConsole::TEvCreateTenantRequest>();
- request->Record.CopyFrom(Request.GetCreateTenantRequest());
+
+ if (Request.HasCreateTenantRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvCreateTenantRequest>();
+ request->Record.CopyFrom(Request.GetCreateTenantRequest());
request->Record.SetUserToken(TBase::GetSerializedToken());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasGetConfigRequest()) {
- auto request = MakeHolder<TEvConsole::TEvGetConfigRequest>();
- request->Record.CopyFrom(Request.GetGetConfigRequest());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasGetTenantStatusRequest()) {
- auto request = MakeHolder<TEvConsole::TEvGetTenantStatusRequest>();
- request->Record.CopyFrom(Request.GetGetTenantStatusRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasGetConfigRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvGetConfigRequest>();
+ request->Record.CopyFrom(Request.GetGetConfigRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasGetTenantStatusRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvGetTenantStatusRequest>();
+ request->Record.CopyFrom(Request.GetGetTenantStatusRequest());
request->Record.SetUserToken(TBase::GetSerializedToken());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasAlterTenantRequest()) {
- auto request = MakeHolder<TEvConsole::TEvAlterTenantRequest>();
- request->Record.CopyFrom(Request.GetAlterTenantRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasAlterTenantRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvAlterTenantRequest>();
+ request->Record.CopyFrom(Request.GetAlterTenantRequest());
request->Record.SetUserToken(TBase::GetSerializedToken());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasListTenantsRequest()) {
- auto request = MakeHolder<TEvConsole::TEvListTenantsRequest>();
- request->Record.CopyFrom(Request.GetListTenantsRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasListTenantsRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvListTenantsRequest>();
+ request->Record.CopyFrom(Request.GetListTenantsRequest());
request->Record.SetUserToken(TBase::GetSerializedToken());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasRemoveTenantRequest()) {
- auto request = MakeHolder<TEvConsole::TEvRemoveTenantRequest>();
- request->Record.CopyFrom(Request.GetRemoveTenantRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasRemoveTenantRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvRemoveTenantRequest>();
+ request->Record.CopyFrom(Request.GetRemoveTenantRequest());
request->Record.SetUserToken(TBase::GetSerializedToken());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasSetConfigRequest()) {
- auto request = MakeHolder<TEvConsole::TEvSetConfigRequest>();
- request->Record.CopyFrom(Request.GetSetConfigRequest());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasConfigureRequest()) {
- auto request = MakeHolder<TEvConsole::TEvConfigureRequest>();
- request->Record.CopyFrom(Request.GetConfigureRequest());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasGetConfigItemsRequest()) {
- auto request = MakeHolder<TEvConsole::TEvGetConfigItemsRequest>();
- request->Record.CopyFrom(Request.GetGetConfigItemsRequest());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasGetNodeConfigItemsRequest()) {
- auto request = MakeHolder<TEvConsole::TEvGetNodeConfigItemsRequest>();
- request->Record.CopyFrom(Request.GetGetNodeConfigItemsRequest());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasGetNodeConfigRequest()) {
- auto request = MakeHolder<TEvConsole::TEvGetNodeConfigRequest>();
- request->Record.CopyFrom(Request.GetGetNodeConfigRequest());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasGetOperationRequest()) {
- auto request = MakeHolder<TEvConsole::TEvGetOperationRequest>();
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasSetConfigRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvSetConfigRequest>();
+ request->Record.CopyFrom(Request.GetSetConfigRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasConfigureRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvConfigureRequest>();
+ request->Record.CopyFrom(Request.GetConfigureRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasGetConfigItemsRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvGetConfigItemsRequest>();
+ request->Record.CopyFrom(Request.GetGetConfigItemsRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasGetNodeConfigItemsRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvGetNodeConfigItemsRequest>();
+ request->Record.CopyFrom(Request.GetGetNodeConfigItemsRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasGetNodeConfigRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvGetNodeConfigRequest>();
+ request->Record.CopyFrom(Request.GetGetNodeConfigRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasGetOperationRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvGetOperationRequest>();
request->Record.MutableRequest()->CopyFrom(Request.GetGetOperationRequest());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasCheckConfigUpdatesRequest()) {
- auto request = MakeHolder<TEvConsole::TEvCheckConfigUpdatesRequest>();
- request->Record.CopyFrom(Request.GetCheckConfigUpdatesRequest());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasListConfigValidatorsRequest()) {
- auto request = MakeHolder<TEvConsole::TEvListConfigValidatorsRequest>();
- request->Record.CopyFrom(Request.GetListConfigValidatorsRequest());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else if (Request.HasToggleConfigValidatorRequest()) {
- auto request = MakeHolder<TEvConsole::TEvToggleConfigValidatorRequest>();
- request->Record.CopyFrom(Request.GetToggleConfigValidatorRequest());
- NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
- } else {
- ReplyWithErrorAndDie("Unknown console request", ctx);
- }
- }
-
- void Handle(TEvConsole::TEvAlterTenantResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- auto &resp = rec.GetResponse();
- Response.MutableStatus()->SetCode(resp.operation().status());
- if (resp.operation().issues_size())
- Response.MutableStatus()->SetReason(resp.operation().issues(0).message());
- Response.MutableAlterTenantResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvCheckConfigUpdatesResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableCheckConfigUpdatesResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvConfigureResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableConfigureResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvCreateTenantResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- auto &resp = rec.GetResponse();
- Response.MutableStatus()->SetCode(resp.operation().status());
- if (resp.operation().issues_size())
- Response.MutableStatus()->SetReason(resp.operation().issues(0).message());
- Response.MutableCreateTenantResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvGetConfigItemsResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableGetConfigItemsResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvGetConfigResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasCheckConfigUpdatesRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvCheckConfigUpdatesRequest>();
+ request->Record.CopyFrom(Request.GetCheckConfigUpdatesRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasListConfigValidatorsRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvListConfigValidatorsRequest>();
+ request->Record.CopyFrom(Request.GetListConfigValidatorsRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else if (Request.HasToggleConfigValidatorRequest()) {
+ auto request = MakeHolder<TEvConsole::TEvToggleConfigValidatorRequest>();
+ request->Record.CopyFrom(Request.GetToggleConfigValidatorRequest());
+ NTabletPipe::SendData(ctx, ConsolePipe, request.Release());
+ } else {
+ ReplyWithErrorAndDie("Unknown console request", ctx);
+ }
+ }
+
+ void Handle(TEvConsole::TEvAlterTenantResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ auto &resp = rec.GetResponse();
+ Response.MutableStatus()->SetCode(resp.operation().status());
+ if (resp.operation().issues_size())
+ Response.MutableStatus()->SetReason(resp.operation().issues(0).message());
+ Response.MutableAlterTenantResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvCheckConfigUpdatesResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableCheckConfigUpdatesResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvConfigureResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableConfigureResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvCreateTenantResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ auto &resp = rec.GetResponse();
+ Response.MutableStatus()->SetCode(resp.operation().status());
+ if (resp.operation().issues_size())
+ Response.MutableStatus()->SetReason(resp.operation().issues(0).message());
+ Response.MutableCreateTenantResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvGetConfigItemsResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableGetConfigItemsResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvGetConfigResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
Response.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
- Response.MutableGetConfigResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvGetOperationResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- auto &resp = rec.GetResponse();
- Response.MutableStatus()->SetCode(resp.operation().status());
- if (resp.operation().issues_size())
- Response.MutableStatus()->SetReason(resp.operation().issues(0).message());
+ Response.MutableGetConfigResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvGetOperationResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ auto &resp = rec.GetResponse();
+ Response.MutableStatus()->SetCode(resp.operation().status());
+ if (resp.operation().issues_size())
+ Response.MutableStatus()->SetReason(resp.operation().issues(0).message());
Response.MutableGetOperationResponse()->CopyFrom(resp);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvGetTenantStatusResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- auto &resp = rec.GetResponse();
- Response.MutableStatus()->SetCode(resp.operation().status());
- if (resp.operation().issues_size())
- Response.MutableStatus()->SetReason(resp.operation().issues(0).message());
- Response.MutableGetTenantStatusResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvListConfigValidatorsResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
- Response.MutableListConfigValidatorsResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvListTenantsResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvGetTenantStatusResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ auto &resp = rec.GetResponse();
+ Response.MutableStatus()->SetCode(resp.operation().status());
+ if (resp.operation().issues_size())
+ Response.MutableStatus()->SetReason(resp.operation().issues(0).message());
+ Response.MutableGetTenantStatusResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvListConfigValidatorsResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
Response.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
- Response.MutableListTenantsResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvGetNodeConfigItemsResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableGetNodeConfigItemsResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvGetNodeConfigResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableGetNodeConfigResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvRemoveTenantResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- auto &resp = rec.GetResponse();
- Response.MutableStatus()->SetCode(resp.operation().status());
- if (resp.operation().issues_size())
- Response.MutableStatus()->SetReason(resp.operation().issues(0).message());
- Response.MutableRemoveTenantResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvSetConfigResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableSetConfigResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Handle(TEvConsole::TEvToggleConfigValidatorResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
- Response.MutableStatus()->CopyFrom(rec.GetStatus());
- Response.MutableToggleConfigValidatorResponse()->CopyFrom(rec);
- SendReplyAndDie(ctx);
- }
-
- void Undelivered(const TActorContext &ctx) {
+ Response.MutableListConfigValidatorsResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvListTenantsResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+ Response.MutableListTenantsResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvGetNodeConfigItemsResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableGetNodeConfigItemsResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvGetNodeConfigResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableGetNodeConfigResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvRemoveTenantResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ auto &resp = rec.GetResponse();
+ Response.MutableStatus()->SetCode(resp.operation().status());
+ if (resp.operation().issues_size())
+ Response.MutableStatus()->SetReason(resp.operation().issues(0).message());
+ Response.MutableRemoveTenantResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvSetConfigResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableSetConfigResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Handle(TEvConsole::TEvToggleConfigValidatorResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+ Response.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response.MutableToggleConfigValidatorResponse()->CopyFrom(rec);
+ SendReplyAndDie(ctx);
+ }
+
+ void Undelivered(const TActorContext &ctx) {
ReplyWithErrorAndDie(Ydb::StatusIds::UNAVAILABLE, "Console is unavailable", ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) noexcept
- {
- if (ev->Get()->Status != NKikimrProto::OK)
- Undelivered(ctx);
- }
-
- void Die(const TActorContext &ctx)
- {
- NTabletPipe::CloseClient(ctx, ConsolePipe);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ if (ev->Get()->Status != NKikimrProto::OK)
+ Undelivered(ctx);
+ }
+
+ void Die(const TActorContext &ctx)
+ {
+ NTabletPipe::CloseClient(ctx, ConsolePipe);
TBase::Die(ctx);
- }
-
- void SendReplyAndDie(const TActorContext &ctx)
- {
- Y_VERIFY(Response.HasStatus());
-
- auto response = MakeHolder<TBusConsoleResponse>();
- response->Record = std::move(Response);
- SendReplyMove(response.Release());
- Die(ctx);
- }
-
- void ReplyWithErrorAndDie(const TString &error, const TActorContext &ctx)
- {
+ }
+
+ void SendReplyAndDie(const TActorContext &ctx)
+ {
+ Y_VERIFY(Response.HasStatus());
+
+ auto response = MakeHolder<TBusConsoleResponse>();
+ response->Record = std::move(Response);
+ SendReplyMove(response.Release());
+ Die(ctx);
+ }
+
+ void ReplyWithErrorAndDie(const TString &error, const TActorContext &ctx)
+ {
ReplyWithErrorAndDie(Ydb::StatusIds::GENERIC_ERROR, error, ctx);
- }
-
+ }
+
void ReplyWithErrorAndDie(Ydb::StatusIds::StatusCode code, const TString &error,
- const TActorContext &ctx)
- {
- Response.MutableStatus()->SetCode(code);
- Response.MutableStatus()->SetReason(error);
- SendReplyAndDie(ctx);
- }
-
- STFUNC(MainState) {
- switch (ev->GetTypeRewrite()) {
- CFunc(TEvents::TEvUndelivered::EventType, Undelivered);
- HFunc(TEvConsole::TEvAlterTenantResponse, Handle);
- HFunc(TEvConsole::TEvConfigureResponse, Handle);
- HFunc(TEvConsole::TEvCreateTenantResponse, Handle);
- HFunc(TEvConsole::TEvGetConfigItemsResponse, Handle);
- HFunc(TEvConsole::TEvGetConfigResponse, Handle);
- HFunc(TEvConsole::TEvGetOperationResponse, Handle);
- HFunc(TEvConsole::TEvGetTenantStatusResponse, Handle);
- HFunc(TEvConsole::TEvListConfigValidatorsResponse, Handle);
- HFunc(TEvConsole::TEvListTenantsResponse, Handle);
- HFunc(TEvConsole::TEvGetNodeConfigItemsResponse, Handle);
- HFunc(TEvConsole::TEvGetNodeConfigResponse, Handle);
- HFunc(TEvConsole::TEvRemoveTenantResponse, Handle);
- HFunc(TEvConsole::TEvSetConfigResponse, Handle);
- HFunc(TEvConsole::TEvToggleConfigValidatorResponse, Handle);
- CFunc(TEvTabletPipe::EvClientDestroyed, Undelivered);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- default:
- Y_FAIL("TConsoleRequestActor::MainState unexpected event type: %" PRIx32 " event: %s",
- ev->GetTypeRewrite(),
+ const TActorContext &ctx)
+ {
+ Response.MutableStatus()->SetCode(code);
+ Response.MutableStatus()->SetReason(error);
+ SendReplyAndDie(ctx);
+ }
+
+ STFUNC(MainState) {
+ switch (ev->GetTypeRewrite()) {
+ CFunc(TEvents::TEvUndelivered::EventType, Undelivered);
+ HFunc(TEvConsole::TEvAlterTenantResponse, Handle);
+ HFunc(TEvConsole::TEvConfigureResponse, Handle);
+ HFunc(TEvConsole::TEvCreateTenantResponse, Handle);
+ HFunc(TEvConsole::TEvGetConfigItemsResponse, Handle);
+ HFunc(TEvConsole::TEvGetConfigResponse, Handle);
+ HFunc(TEvConsole::TEvGetOperationResponse, Handle);
+ HFunc(TEvConsole::TEvGetTenantStatusResponse, Handle);
+ HFunc(TEvConsole::TEvListConfigValidatorsResponse, Handle);
+ HFunc(TEvConsole::TEvListTenantsResponse, Handle);
+ HFunc(TEvConsole::TEvGetNodeConfigItemsResponse, Handle);
+ HFunc(TEvConsole::TEvGetNodeConfigResponse, Handle);
+ HFunc(TEvConsole::TEvRemoveTenantResponse, Handle);
+ HFunc(TEvConsole::TEvSetConfigResponse, Handle);
+ HFunc(TEvConsole::TEvToggleConfigValidatorResponse, Handle);
+ CFunc(TEvTabletPipe::EvClientDestroyed, Undelivered);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ default:
+ Y_FAIL("TConsoleRequestActor::MainState unexpected event type: %" PRIx32 " event: %s",
+ ev->GetTypeRewrite(),
ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
-private:
- NKikimrClient::TConsoleRequest Request;
- NKikimrClient::TConsoleResponse Response;
+ }
+ }
+
+private:
+ NKikimrClient::TConsoleRequest Request;
+ NKikimrClient::TConsoleResponse Response;
ui32 StateStorageGroup = 0;
TActorId ConsolePipe;
-};
-
-} // namespace
-
-IActor* CreateMessageBusConsoleRequest(TBusMessageContext &msg)
-{
- NKikimrClient::TConsoleRequest &record
- = static_cast<TBusConsoleRequest*>(msg.GetMessage())->Record;
- return new TConsoleRequestActor(record, msg);
-}
-
-} // namespace NMsgBusProxy
-} // namespace NKikimr
+};
+
+} // namespace
+
+IActor* CreateMessageBusConsoleRequest(TBusMessageContext &msg)
+{
+ NKikimrClient::TConsoleRequest &record
+ = static_cast<TBusConsoleRequest*>(msg.GetMessage())->Record;
+ return new TConsoleRequestActor(record, msg);
+}
+
+} // namespace NMsgBusProxy
+} // namespace NKikimr
diff --git a/ydb/core/client/server/msgbus_server_db.cpp b/ydb/core/client/server/msgbus_server_db.cpp
index 6b22caea0c5..08f3d717864 100644
--- a/ydb/core/client/server/msgbus_server_db.cpp
+++ b/ydb/core/client/server/msgbus_server_db.cpp
@@ -280,7 +280,7 @@ protected:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ResolveError:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecError:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::DomainLocalityError:
- case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::WrongRequest:
+ case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::WrongRequest:
return ReplyWithResult(MSTATUS_ERROR, msg->Record, ctx);
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyShardNotAvailable:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyShardTryLater:
@@ -703,7 +703,7 @@ protected:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::EmptyAffectedSet:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ResolveError:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecError:
- case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::WrongRequest:
+ case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::WrongRequest:
return ReplyWithResult(MSTATUS_ERROR, msg->Record, ctx);
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyShardNotAvailable:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyShardTryLater:
diff --git a/ydb/core/client/server/msgbus_server_node_registration.cpp b/ydb/core/client/server/msgbus_server_node_registration.cpp
index c2e629fda43..a3dda6092d0 100644
--- a/ydb/core/client/server/msgbus_server_node_registration.cpp
+++ b/ydb/core/client/server/msgbus_server_node_registration.cpp
@@ -1,5 +1,5 @@
-#include "msgbus_servicereq.h"
-
+#include "msgbus_servicereq.h"
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
#include <library/cpp/actors/interconnect/interconnect.h>
@@ -7,89 +7,89 @@
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/mind/node_broker.h>
#include <ydb/core/kqp/kqp.h>
-
-namespace NKikimr {
-namespace NMsgBusProxy {
-
-using namespace NKikimrNodeBroker;
-using namespace NNodeBroker;
-
-namespace {
-
-class TNodeRegistrationActor : public TActorBootstrapped<TNodeRegistrationActor>, public TMessageBusSessionIdentHolder
-{
- using TActorBase = TActorBootstrapped<TNodeRegistrationActor>;
-
-public:
+
+namespace NKikimr {
+namespace NMsgBusProxy {
+
+using namespace NKikimrNodeBroker;
+using namespace NNodeBroker;
+
+namespace {
+
+class TNodeRegistrationActor : public TActorBootstrapped<TNodeRegistrationActor>, public TMessageBusSessionIdentHolder
+{
+ using TActorBase = TActorBootstrapped<TNodeRegistrationActor>;
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::MSGBUS_COMMON;
}
- TNodeRegistrationActor(NKikimrClient::TNodeRegistrationRequest &request, NMsgBusProxy::TBusMessageContext &msg)
- : TMessageBusSessionIdentHolder(msg)
- , Request(request)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- auto dinfo = AppData(ctx)->DomainsInfo;
- ui32 group;
-
- if (Request.GetDomainPath()) {
- auto *domain = dinfo->GetDomainByName(Request.GetDomainPath());
- if (!domain) {
+ TNodeRegistrationActor(NKikimrClient::TNodeRegistrationRequest &request, NMsgBusProxy::TBusMessageContext &msg)
+ : TMessageBusSessionIdentHolder(msg)
+ , Request(request)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ auto dinfo = AppData(ctx)->DomainsInfo;
+ ui32 group;
+
+ if (Request.GetDomainPath()) {
+ auto *domain = dinfo->GetDomainByName(Request.GetDomainPath());
+ if (!domain) {
auto error = Sprintf("Unknown domain %s", Request.GetDomainPath().data());
- ReplyWithErrorAndDie(error, ctx);
- return;
- }
- group = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
- } else {
- if (dinfo->Domains.size() > 1) {
- auto error = "Ambiguous domain (specify DomainPath in request)";
- ReplyWithErrorAndDie(error, ctx);
- return;
- }
-
- auto domain = dinfo->Domains.begin()->second;
- group = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
- }
-
- NTabletPipe::TClientConfig pipeConfig;
+ ReplyWithErrorAndDie(error, ctx);
+ return;
+ }
+ group = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
+ } else {
+ if (dinfo->Domains.size() > 1) {
+ auto error = "Ambiguous domain (specify DomainPath in request)";
+ ReplyWithErrorAndDie(error, ctx);
+ return;
+ }
+
+ auto domain = dinfo->Domains.begin()->second;
+ group = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
+ }
+
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = {.RetryLimitCount = 10};
- auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeNodeBrokerID(group), pipeConfig);
+ auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeNodeBrokerID(group), pipeConfig);
NodeBrokerPipe = ctx.RegisterWithSameMailbox(pipe);
-
- TAutoPtr<TEvNodeBroker::TEvRegistrationRequest> request
- = new TEvNodeBroker::TEvRegistrationRequest;
- request->Record.SetHost(Request.GetHost());
- request->Record.SetPort(Request.GetPort());
- request->Record.SetResolveHost(Request.GetResolveHost());
- request->Record.SetAddress(Request.GetAddress());
- request->Record.MutableLocation()->CopyFrom(Request.GetLocation());
- request->Record.SetFixedNodeId(Request.GetFixedNodeId());
+
+ TAutoPtr<TEvNodeBroker::TEvRegistrationRequest> request
+ = new TEvNodeBroker::TEvRegistrationRequest;
+ request->Record.SetHost(Request.GetHost());
+ request->Record.SetPort(Request.GetPort());
+ request->Record.SetResolveHost(Request.GetResolveHost());
+ request->Record.SetAddress(Request.GetAddress());
+ request->Record.MutableLocation()->CopyFrom(Request.GetLocation());
+ request->Record.SetFixedNodeId(Request.GetFixedNodeId());
if (Request.HasPath()) {
request->Record.SetPath(Request.GetPath());
}
- NTabletPipe::SendData(ctx, NodeBrokerPipe, request.Release());
-
- Become(&TNodeRegistrationActor::MainState);
- }
-
- void Handle(TEvNodeBroker::TEvRegistrationResponse::TPtr &ev, const TActorContext &ctx)
- {
- auto &rec = ev->Get()->Record;
-
- if (rec.GetStatus().GetCode() != TStatus::OK) {
- ReplyWithErrorAndDie(rec.GetStatus().GetReason(), ctx);
- return;
- }
-
- Response.SetNodeId(rec.GetNode().GetNodeId());
- Response.SetExpire(rec.GetNode().GetExpire());
- Response.SetDomainPath(Request.GetDomainPath());
- Response.AddNodes()->CopyFrom(rec.GetNode());
-
+ NTabletPipe::SendData(ctx, NodeBrokerPipe, request.Release());
+
+ Become(&TNodeRegistrationActor::MainState);
+ }
+
+ void Handle(TEvNodeBroker::TEvRegistrationResponse::TPtr &ev, const TActorContext &ctx)
+ {
+ auto &rec = ev->Get()->Record;
+
+ if (rec.GetStatus().GetCode() != TStatus::OK) {
+ ReplyWithErrorAndDie(rec.GetStatus().GetReason(), ctx);
+ return;
+ }
+
+ Response.SetNodeId(rec.GetNode().GetNodeId());
+ Response.SetExpire(rec.GetNode().GetExpire());
+ Response.SetDomainPath(Request.GetDomainPath());
+ Response.AddNodes()->CopyFrom(rec.GetNode());
+
if (rec.HasScopeTabletId()) {
Response.SetScopeTabletId(rec.GetScopeTabletId());
}
@@ -98,85 +98,85 @@ public:
}
const TActorId nameserviceId = GetNameserviceActorId();
- ctx.Send(nameserviceId, new TEvInterconnect::TEvListNodes());
- }
-
- void Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev, const TActorContext &ctx)
- {
- auto config = AppData(ctx)->DynamicNameserviceConfig;
-
- for (const auto &node : ev->Get()->Nodes) {
- // Copy static nodes only.
- if (!config || node.NodeId <= config->MaxStaticNodeId) {
- auto &info = *Response.AddNodes();
- info.SetNodeId(node.NodeId);
- info.SetHost(node.Host);
- info.SetAddress(node.Address);
- info.SetResolveHost(node.ResolveHost);
- info.SetPort(node.Port);
+ ctx.Send(nameserviceId, new TEvInterconnect::TEvListNodes());
+ }
+
+ void Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev, const TActorContext &ctx)
+ {
+ auto config = AppData(ctx)->DynamicNameserviceConfig;
+
+ for (const auto &node : ev->Get()->Nodes) {
+ // Copy static nodes only.
+ if (!config || node.NodeId <= config->MaxStaticNodeId) {
+ auto &info = *Response.AddNodes();
+ info.SetNodeId(node.NodeId);
+ info.SetHost(node.Host);
+ info.SetAddress(node.Address);
+ info.SetResolveHost(node.ResolveHost);
+ info.SetPort(node.Port);
node.Location.Serialize(info.MutableLocation());
- }
- }
-
- Response.MutableStatus()->SetCode(TStatus::OK);
-
- SendReplyAndDie(ctx);
- }
-
- void Undelivered(const TActorContext &ctx) {
- ReplyWithErrorAndDie("Node Broker is unavailable", ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) noexcept
- {
- if (ev->Get()->Status != NKikimrProto::OK)
- Undelivered(ctx);
- }
-
- void Die(const TActorContext &ctx)
- {
- NTabletPipe::CloseClient(ctx, NodeBrokerPipe);
- TActorBase::Die(ctx);
- }
-
- void SendReplyAndDie(const TActorContext &ctx)
- {
- auto response = MakeHolder<TBusNodeRegistrationResponse>();
- response->Record = std::move(Response);
- SendReplyMove(response.Release());
- Die(ctx);
- }
-
- void ReplyWithErrorAndDie(const TString &error, const TActorContext &ctx)
- {
- Response.MutableStatus()->SetCode(TStatus::ERROR);
- Response.MutableStatus()->SetReason(error);
- SendReplyAndDie(ctx);
- }
-
- STFUNC(MainState) {
- switch (ev->GetTypeRewrite()) {
- CFunc(TEvents::TEvUndelivered::EventType, Undelivered);
- HFunc(TEvNodeBroker::TEvRegistrationResponse, Handle);
- HFunc(TEvInterconnect::TEvNodesInfo, Handle);
- CFunc(TEvTabletPipe::EvClientDestroyed, Undelivered);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- }
- }
-
-private:
- NKikimrClient::TNodeRegistrationRequest Request;
- NKikimrClient::TNodeRegistrationResponse Response;
+ }
+ }
+
+ Response.MutableStatus()->SetCode(TStatus::OK);
+
+ SendReplyAndDie(ctx);
+ }
+
+ void Undelivered(const TActorContext &ctx) {
+ ReplyWithErrorAndDie("Node Broker is unavailable", ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ if (ev->Get()->Status != NKikimrProto::OK)
+ Undelivered(ctx);
+ }
+
+ void Die(const TActorContext &ctx)
+ {
+ NTabletPipe::CloseClient(ctx, NodeBrokerPipe);
+ TActorBase::Die(ctx);
+ }
+
+ void SendReplyAndDie(const TActorContext &ctx)
+ {
+ auto response = MakeHolder<TBusNodeRegistrationResponse>();
+ response->Record = std::move(Response);
+ SendReplyMove(response.Release());
+ Die(ctx);
+ }
+
+ void ReplyWithErrorAndDie(const TString &error, const TActorContext &ctx)
+ {
+ Response.MutableStatus()->SetCode(TStatus::ERROR);
+ Response.MutableStatus()->SetReason(error);
+ SendReplyAndDie(ctx);
+ }
+
+ STFUNC(MainState) {
+ switch (ev->GetTypeRewrite()) {
+ CFunc(TEvents::TEvUndelivered::EventType, Undelivered);
+ HFunc(TEvNodeBroker::TEvRegistrationResponse, Handle);
+ HFunc(TEvInterconnect::TEvNodesInfo, Handle);
+ CFunc(TEvTabletPipe::EvClientDestroyed, Undelivered);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ }
+ }
+
+private:
+ NKikimrClient::TNodeRegistrationRequest Request;
+ NKikimrClient::TNodeRegistrationResponse Response;
TActorId NodeBrokerPipe;
-};
-
-} // namespace
-
-IActor *CreateMessageBusRegisterNode(NMsgBusProxy::TBusMessageContext &msg) {
- NKikimrClient::TNodeRegistrationRequest &record
- = static_cast<TBusNodeRegistrationRequest*>(msg.GetMessage())->Record;
- return new TNodeRegistrationActor(record, msg);
-}
-
-} // namespace NMsgBusProxy
-} // namespace NKikimr
+};
+
+} // namespace
+
+IActor *CreateMessageBusRegisterNode(NMsgBusProxy::TBusMessageContext &msg) {
+ NKikimrClient::TNodeRegistrationRequest &record
+ = static_cast<TBusNodeRegistrationRequest*>(msg.GetMessage())->Record;
+ return new TNodeRegistrationActor(record, msg);
+}
+
+} // namespace NMsgBusProxy
+} // namespace NKikimr
diff --git a/ydb/core/client/server/msgbus_server_proxy.h b/ydb/core/client/server/msgbus_server_proxy.h
index bf1cc6a1d3c..cb9f9c19d38 100644
--- a/ydb/core/client/server/msgbus_server_proxy.h
+++ b/ydb/core/client/server/msgbus_server_proxy.h
@@ -19,7 +19,7 @@ struct TMessageBusDbOpsCounters : TAtomicRefCount<TMessageBusDbOpsCounters> {
NMon::THistogramCounterHelper RequestQueryTimeHistogram;
TMessageBusDbOpsCounters(const NMonitoring::TDynamicCounterPtr& counters) {
- DbOperationsCounters = GetServiceCounters(counters, "proxy")->GetSubgroup("subsystem", "db");
+ DbOperationsCounters = GetServiceCounters(counters, "proxy")->GetSubgroup("subsystem", "db");
RequestTotalTimeHistogram.Init(DbOperationsCounters.Get(), "RequestTotalTime", "ms", 1, 20);
RequestPrepareTimeHistogram.Init(DbOperationsCounters.Get(), "RequestPrepareTime", "ms", 1, 20);
RequestUpdateTimeHistogram.Init(DbOperationsCounters.Get(), "RequestUpdateTime", "ms", 1, 20);
diff --git a/ydb/core/client/server/msgbus_server_request.cpp b/ydb/core/client/server/msgbus_server_request.cpp
index 21446385969..9223bea9f1a 100644
--- a/ydb/core/client/server/msgbus_server_request.cpp
+++ b/ydb/core/client/server/msgbus_server_request.cpp
@@ -1,6 +1,6 @@
#include "msgbus_server_request.h"
#include "msgbus_securereq.h"
-
+
#include <ydb/core/actorlib_impl/async_destroyer.h>
#include <ydb/core/actorlib_impl/long_timer.h>
#include <ydb/core/client/minikql_compile/mkql_compile_service.h>
@@ -8,7 +8,7 @@
#include <ydb/core/base/ticket_parser.h>
#include <ydb/core/tx/datashard/datashard.h>
#include <ydb/core/tx/tx_processing.h>
-
+
#include <ydb/library/yql/minikql/mkql_node_serialization.h>
#include <ydb/library/yql/public/issue/yql_issue_message.h>
@@ -27,20 +27,20 @@ class TMessageBusServerRequest : public TMessageBusSecureRequest<TMessageBusServ
TString TextProgramForCompilation;
bool CompilationRetried;
- void ReplyWithResult(EResponseStatus status, NKikimrTxUserProxy::TEvProposeTransactionStatus &result,
+ void ReplyWithResult(EResponseStatus status, NKikimrTxUserProxy::TEvProposeTransactionStatus &result,
const TActorContext &ctx);
bool RetryResolve(const TActorContext &ctx);
- void FinishReply(const TActorContext &ctx);
- void TryToAllocateQuota(const TActorContext &ctx);
+ void FinishReply(const TActorContext &ctx);
+ void TryToAllocateQuota(const TActorContext &ctx);
void Handle(TMiniKQLCompileServiceEvents::TEvCompileStatus::TPtr &ev, const TActorContext &ctx);
void Handle(TEvTxUserProxy::TEvProposeTransactionStatus::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr &ev, const TActorContext &ctx);
bool AllRequestsCompleted(const TActorContext& ctx);
- bool AllRequestsCompletedMKQL(const TActorContext& ctx);
- bool AllRequestsCompletedReadTable(const TActorContext& ctx);
-
+ bool AllRequestsCompletedMKQL(const TActorContext& ctx);
+ bool AllRequestsCompletedReadTable(const TActorContext& ctx);
+
public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::FRONT_MKQL_REQUEST;
@@ -61,13 +61,13 @@ public:
switch (ev->GetTypeRewrite()) {
HFunc(TMiniKQLCompileServiceEvents::TEvCompileStatus, Handle);
HFunc(TEvTxUserProxy::TEvProposeTransactionStatus, Handle);
- HFunc(TEvDataShard::TEvGetReadTableStreamStateRequest, Handle);
+ HFunc(TEvDataShard::TEvGetReadTableStreamStateRequest, Handle);
}
}
void Bootstrap(const TActorContext &ctx) {
TBase::Become(&TMessageBusServerRequest::StateWork);
-
+
ProposalStatus.Reset(new NKikimrTxUserProxy::TEvProposeTransactionStatus());
Proposal.Reset(new TEvTxUserProxy::TEvProposeTransaction());
NKikimrTxUserProxy::TEvProposeTransaction &record = Proposal->Record;
@@ -89,7 +89,7 @@ public:
}
record.SetStreamResponse(false);
-
+
auto* transaction = record.MutableTransaction();
if (transaction->HasMiniKQLTransaction()) {
auto& mkqlTx = *transaction->MutableMiniKQLTransaction();
@@ -133,7 +133,7 @@ public:
AllRequestsCompleted(ctx);
}
return;
- } else if (transaction->HasReadTableTransaction()) {
+ } else if (transaction->HasReadTableTransaction()) {
NKikimrTxUserProxy::TEvProposeTransactionStatus status;
return ReplyWithResult(EResponseStatus::MSTATUS_ERROR, status, ctx);
}
@@ -155,18 +155,18 @@ bool TMessageBusServerRequest::RetryResolve(const TActorContext &ctx) {
return true;
}
-void TMessageBusServerRequest::ReplyWithResult(EResponseStatus status,
- NKikimrTxUserProxy::TEvProposeTransactionStatus &result,
+void TMessageBusServerRequest::ReplyWithResult(EResponseStatus status,
+ NKikimrTxUserProxy::TEvProposeTransactionStatus &result,
const TActorContext &ctx)
-{
+{
TAutoPtr<TBusResponse> response(ProposeTransactionStatusToResponse(status, result));
if (result.HasExecutionEngineEvaluatedResponse()) {
response->Record.MutableExecutionEngineEvaluatedResponse()->Swap(result.MutableExecutionEngineEvaluatedResponse());
}
- if (result.HasSerializedReadTableResponse()) {
- response->Record.SetSerializedReadTableResponse(result.GetSerializedReadTableResponse());
- }
+ if (result.HasSerializedReadTableResponse()) {
+ response->Record.SetSerializedReadTableResponse(result.GetSerializedReadTableResponse());
+ }
if (result.HasStatus()) {
response->Record.SetProxyErrorCode(result.GetStatus());
}
@@ -178,10 +178,10 @@ void TMessageBusServerRequest::ReplyWithResult(EResponseStatus status,
SendReplyAutoPtr(response);
FinishReply(ctx);
-}
-
-void TMessageBusServerRequest::FinishReply(const TActorContext &ctx)
-{
+}
+
+void TMessageBusServerRequest::FinishReply(const TActorContext &ctx)
+{
if (Proposal)
AsyncDestroy(Proposal, ctx, AppData(ctx)->UserPoolId);
@@ -232,14 +232,14 @@ void TMessageBusServerRequest::Handle(TMiniKQLCompileServiceEvents::TEvCompileSt
}
bool TMessageBusServerRequest::AllRequestsCompleted(const TActorContext& ctx) {
- auto &transaction = Proposal->Record.GetTransaction();
- if (transaction.HasMiniKQLTransaction())
- return AllRequestsCompletedMKQL(ctx);
- else
- Y_FAIL("Unexpected transaction type");
-}
-
-bool TMessageBusServerRequest::AllRequestsCompletedMKQL(const TActorContext& ctx) {
+ auto &transaction = Proposal->Record.GetTransaction();
+ if (transaction.HasMiniKQLTransaction())
+ return AllRequestsCompletedMKQL(ctx);
+ else
+ Y_FAIL("Unexpected transaction type");
+}
+
+bool TMessageBusServerRequest::AllRequestsCompletedMKQL(const TActorContext& ctx) {
auto* mkqlTx = Proposal->Record.MutableTransaction()->MutableMiniKQLTransaction();
const bool need2CompileProgram = mkqlTx->HasProgram() && mkqlTx->GetProgram().HasText();
const bool need2CompileParams = mkqlTx->HasParams() && mkqlTx->GetParams().HasText();
@@ -302,7 +302,7 @@ void TMessageBusServerRequest::Handle(TEvTxUserProxy::TEvProposeTransactionStatu
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::DomainLocalityError:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecResultUnavailable:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecCancelled:
- case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::WrongRequest:
+ case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::WrongRequest:
return ReplyWithResult(MSTATUS_ERROR, msg->Record, ctx);
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ResolveError:
if (!RetryResolve(ctx))
@@ -325,16 +325,16 @@ void TMessageBusServerRequest::Handle(TEvTxUserProxy::TEvProposeTransactionStatu
}
}
-void TMessageBusServerRequest::Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr &ev, const TActorContext &ctx) {
- auto *response = new TEvDataShard::TEvGetReadTableStreamStateResponse;
-
+void TMessageBusServerRequest::Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr &ev, const TActorContext &ctx) {
+ auto *response = new TEvDataShard::TEvGetReadTableStreamStateResponse;
+
response->Record.MutableStatus()->SetCode(Ydb::StatusIds::GENERIC_ERROR);
auto *issue = response->Record.MutableStatus()->AddIssues();
issue->set_severity(NYql::TSeverityIds::S_ERROR);
issue->set_message("request proxy is not streaming");
- ctx.Send(ev->Sender, response);
-}
-
+ ctx.Send(ev->Sender, response);
+}
+
void TMessageBusServerProxy::Handle(TEvBusProxy::TEvRequest::TPtr& ev, const TActorContext& ctx) {
ctx.Register(new TMessageBusServerRequest(ev->Get()));
}
diff --git a/ydb/core/client/server/msgbus_server_request.h b/ydb/core/client/server/msgbus_server_request.h
index 0fab6adf544..b77d50983e6 100644
--- a/ydb/core/client/server/msgbus_server_request.h
+++ b/ydb/core/client/server/msgbus_server_request.h
@@ -27,7 +27,7 @@ public:
response->Record.SetProxyErrorCode(proxyStatus);
SendReplyAutoPtr(response);
-
+
this->Die(ctx);
}
};
diff --git a/ydb/core/client/server/ya.make b/ydb/core/client/server/ya.make
index 7a325d968b3..8cbeec21b77 100644
--- a/ydb/core/client/server/ya.make
+++ b/ydb/core/client/server/ya.make
@@ -16,9 +16,9 @@ SRCS(
msgbus_http_server.cpp
msgbus_server.cpp
msgbus_server.h
- msgbus_server_cms.cpp
+ msgbus_server_cms.cpp
msgbus_server_configdummy.cpp
- msgbus_server_console.cpp
+ msgbus_server_console.cpp
msgbus_server_db.cpp
msgbus_server_drain_node.cpp
msgbus_server_fill_node.cpp
@@ -38,7 +38,7 @@ SRCS(
msgbus_server_local_enumerate_tablets.cpp
msgbus_server_local_minikql.cpp
msgbus_server_local_scheme_tx.cpp
- msgbus_server_node_registration.cpp
+ msgbus_server_node_registration.cpp
msgbus_server_proxy.cpp
msgbus_server_proxy.h
msgbus_server_request.cpp
diff --git a/ydb/core/cms/base_handler.h b/ydb/core/cms/base_handler.h
index 3b73a788074..b5aa12761b3 100644
--- a/ydb/core/cms/base_handler.h
+++ b/ydb/core/cms/base_handler.h
@@ -1,18 +1,18 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <library/cpp/actors/core/mon.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TApiMethodHandlerBase {
-public:
- virtual ~TApiMethodHandlerBase() = default;
-
- virtual IActor *CreateHandlerActor(NMon::TEvHttpInfo::TPtr &event) = 0;
-};
-
-} // NCms
-} // NKikimr
+
+namespace NKikimr {
+namespace NCms {
+
+class TApiMethodHandlerBase {
+public:
+ virtual ~TApiMethodHandlerBase() = default;
+
+ virtual IActor *CreateHandlerActor(NMon::TEvHttpInfo::TPtr &event) = 0;
+};
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cluster_info.cpp b/ydb/core/cms/cluster_info.cpp
index 592c4a77c10..a1dc8a0b95f 100644
--- a/ydb/core/cms/cluster_info.cpp
+++ b/ydb/core/cms/cluster_info.cpp
@@ -1,9 +1,9 @@
-#include "cluster_info.h"
-#include "cms_state.h"
-
+#include "cluster_info.h"
+#include "cms_state.h"
+
#include <util/string/builder.h>
-#include <util/system/hostname.h>
-
+#include <util/system/hostname.h>
+
#if defined BLOG_D || defined BLOG_I || defined BLOG_ERROR
#error log macro definition clash
#endif
@@ -11,138 +11,138 @@
#define BLOG_D(stream) LOG_DEBUG_S(*TlsActivationContext, NKikimrServices::CMS, stream)
#define BLOG_ERROR(stream) LOG_ERROR_S(*TlsActivationContext, NKikimrServices::CMS, stream)
-namespace NKikimr {
-namespace NCms {
-
-using namespace NNodeWhiteboard;
-using namespace NKikimrCms;
-
-bool TLockableItem::IsLocked(TErrorInfo &error, TDuration defaultRetryTime,
- TInstant now, TDuration duration) const
-{
- if (State == RESTART) {
- Y_VERIFY(Lock.Defined());
- error.Code = TStatus::DISALLOW_TEMP;
- error.Reason = Sprintf("%s is restarting (permission %s owned by %s)",
+namespace NKikimr {
+namespace NCms {
+
+using namespace NNodeWhiteboard;
+using namespace NKikimrCms;
+
+bool TLockableItem::IsLocked(TErrorInfo &error, TDuration defaultRetryTime,
+ TInstant now, TDuration duration) const
+{
+ if (State == RESTART) {
+ Y_VERIFY(Lock.Defined());
+ error.Code = TStatus::DISALLOW_TEMP;
+ error.Reason = Sprintf("%s is restarting (permission %s owned by %s)",
PrettyItemName().data(), Lock->PermissionId.data(), Lock->Owner.data());
- error.Deadline = Lock->ActionDeadline;
- return true;
- }
-
- if (Lock.Defined()) {
- error.Code = TStatus::DISALLOW_TEMP;
- error.Reason = Sprintf("%s has planned shutdown (permission %s owned by %s)",
+ error.Deadline = Lock->ActionDeadline;
+ return true;
+ }
+
+ if (Lock.Defined()) {
+ error.Code = TStatus::DISALLOW_TEMP;
+ error.Reason = Sprintf("%s has planned shutdown (permission %s owned by %s)",
PrettyItemName().data(), Lock->PermissionId.data(), Lock->Owner.data());
- error.Deadline = Lock->ActionDeadline;
- return true;
- }
-
- for (auto &lock : ExternalLocks) {
- // External locks are sorted by start time.
- if (lock.LockStart > now + duration)
- break;
-
- if (lock.LockDeadline < now)
- continue;
-
- error.Code = TStatus::DISALLOW_TEMP;
- error.Reason = Sprintf("%s has planned shutdown (notification %s owned by %s)",
+ error.Deadline = Lock->ActionDeadline;
+ return true;
+ }
+
+ for (auto &lock : ExternalLocks) {
+ // External locks are sorted by start time.
+ if (lock.LockStart > now + duration)
+ break;
+
+ if (lock.LockDeadline < now)
+ continue;
+
+ error.Code = TStatus::DISALLOW_TEMP;
+ error.Reason = Sprintf("%s has planned shutdown (notification %s owned by %s)",
PrettyItemName().data(), lock.NotificationId.data(), lock.Owner.data());
- error.Deadline = lock.LockDeadline;
- return true;
- }
-
- if (!ScheduledLocks.empty() && ScheduledLocks.begin()->Order < DeactivatedLocksOrder) {
- error.Code = TStatus::DISALLOW_TEMP;
- error.Reason = Sprintf("%s has scheduled action %s owned by %s (order %" PRIu64 " vs %" PRIu64 ")",
+ error.Deadline = lock.LockDeadline;
+ return true;
+ }
+
+ if (!ScheduledLocks.empty() && ScheduledLocks.begin()->Order < DeactivatedLocksOrder) {
+ error.Code = TStatus::DISALLOW_TEMP;
+ error.Reason = Sprintf("%s has scheduled action %s owned by %s (order %" PRIu64 " vs %" PRIu64 ")",
PrettyItemName().data(), ScheduledLocks.begin()->RequestId.data(),
ScheduledLocks.begin()->Owner.data(), ScheduledLocks.begin()->Order,
- DeactivatedLocksOrder);
- error.Deadline = now + defaultRetryTime;
- return true;
- }
-
- if (!TempLocks.empty()) {
- error.Code = TStatus::DISALLOW;
+ DeactivatedLocksOrder);
+ error.Deadline = now + defaultRetryTime;
+ return true;
+ }
+
+ if (!TempLocks.empty()) {
+ error.Code = TStatus::DISALLOW;
error.Reason = Sprintf("%s has temporary lock", PrettyItemName().data());
- error.Deadline = now + defaultRetryTime;
- error.RollbackPoint = TempLocks.back().RollbackPoint;
- return true;
- }
-
- return false;
-}
-
-bool TLockableItem::IsDown(TErrorInfo &error, TInstant defaultDeadline) const
-{
- if (State == RESTART) {
- Y_VERIFY(Lock.Defined());
- error.Code = TStatus::DISALLOW_TEMP;
- error.Reason = Sprintf("%s is restarting (permission %s owned by %s)",
+ error.Deadline = now + defaultRetryTime;
+ error.RollbackPoint = TempLocks.back().RollbackPoint;
+ return true;
+ }
+
+ return false;
+}
+
+bool TLockableItem::IsDown(TErrorInfo &error, TInstant defaultDeadline) const
+{
+ if (State == RESTART) {
+ Y_VERIFY(Lock.Defined());
+ error.Code = TStatus::DISALLOW_TEMP;
+ error.Reason = Sprintf("%s is restarting (permission %s owned by %s)",
PrettyItemName().data(), Lock->PermissionId.data(), Lock->Owner.data());
- error.Deadline = Lock->ActionDeadline;
- return true;
- }
-
- if (State != UP) {
- error.Code = TStatus::DISALLOW_TEMP;
+ error.Deadline = Lock->ActionDeadline;
+ return true;
+ }
+
+ if (State != UP) {
+ error.Code = TStatus::DISALLOW_TEMP;
error.Reason = Sprintf("%s is down", PrettyItemName().data());
- error.Deadline = defaultDeadline;
- return true;
- }
-
- return false;
-}
-
-void TLockableItem::RollbackLocks(ui64 point)
-{
- for (auto it = TempLocks.begin(); it != TempLocks.end(); ++it)
- if (it->RollbackPoint >= point) {
- TempLocks.erase(it, TempLocks.end());
- break;
- }
-}
-
-void TLockableItem::ReactivateScheduledLocks()
-{
- DeactivatedLocksOrder = Max<ui64>();
-}
-
-void TLockableItem::DeactivateScheduledLocks(ui64 order)
-{
- DeactivatedLocksOrder = order;
-}
-
-void TLockableItem::RemoveScheduledLocks(const TString &requestId)
-{
- ScheduledLocks.remove_if([&requestId](auto &lock) {
- return lock.RequestId == requestId;
- });
-}
-
+ error.Deadline = defaultDeadline;
+ return true;
+ }
+
+ return false;
+}
+
+void TLockableItem::RollbackLocks(ui64 point)
+{
+ for (auto it = TempLocks.begin(); it != TempLocks.end(); ++it)
+ if (it->RollbackPoint >= point) {
+ TempLocks.erase(it, TempLocks.end());
+ break;
+ }
+}
+
+void TLockableItem::ReactivateScheduledLocks()
+{
+ DeactivatedLocksOrder = Max<ui64>();
+}
+
+void TLockableItem::DeactivateScheduledLocks(ui64 order)
+{
+ DeactivatedLocksOrder = order;
+}
+
+void TLockableItem::RemoveScheduledLocks(const TString &requestId)
+{
+ ScheduledLocks.remove_if([&requestId](auto &lock) {
+ return lock.RequestId == requestId;
+ });
+}
+
void TLockableItem::MigrateOldInfo(const TLockableItem &old)
-{
- Downtime = old.Downtime;
- if (State != NKikimrCms::UP)
- Downtime.AddDowntime(old.Timestamp, Timestamp, "known downtime");
- Downtime.CleanupOldSegments(Timestamp);
-}
-
-void TLockableItem::DebugLocksDump(IOutputStream &ss, const TString &prefix) const
-{
- if (Lock.Defined())
- ss << prefix << "Locked by permission " << Lock->PermissionId << Endl;
-
- for (auto &lock : ExternalLocks)
- ss << prefix << "External lock by notifications " << lock.NotificationId;
-
- for (auto &lock : ScheduledLocks)
- ss << prefix << "Scheduled lock by request " << lock.RequestId;
-
- for (auto &lock : TempLocks)
- ss << prefix << "Temporary lock at point " << lock.RollbackPoint;
-}
-
+{
+ Downtime = old.Downtime;
+ if (State != NKikimrCms::UP)
+ Downtime.AddDowntime(old.Timestamp, Timestamp, "known downtime");
+ Downtime.CleanupOldSegments(Timestamp);
+}
+
+void TLockableItem::DebugLocksDump(IOutputStream &ss, const TString &prefix) const
+{
+ if (Lock.Defined())
+ ss << prefix << "Locked by permission " << Lock->PermissionId << Endl;
+
+ for (auto &lock : ExternalLocks)
+ ss << prefix << "External lock by notifications " << lock.NotificationId;
+
+ for (auto &lock : ScheduledLocks)
+ ss << prefix << "Scheduled lock by request " << lock.RequestId;
+
+ for (auto &lock : TempLocks)
+ ss << prefix << "Temporary lock at point " << lock.RollbackPoint;
+}
+
void TNodeInfo::MigrateOldInfo(const TLockableItem &old)
{
TLockableItem::MigrateOldInfo(old);
@@ -159,11 +159,11 @@ void TNodeInfo::MigrateOldInfo(const TLockableItem &old)
}
}
-TString TPDiskInfo::ItemName() const
-{
+TString TPDiskInfo::ItemName() const
+{
return Sprintf("PDisk %s", PDiskId.ToString().data());
-}
-
+}
+
TString TPDiskInfo::PrettyItemName() const
{
TStringBuilder name;
@@ -185,51 +185,51 @@ TString TPDiskInfo::PrettyItemName() const
return name;
}
-TString TPDiskInfo::GetDeviceName() const
-{
- return Sprintf("pdisk-%" PRIu32 "-%" PRIu32, PDiskId.NodeId, PDiskId.DiskId);
-}
-
-bool TPDiskInfo::NameToId(const TString &name, TPDiskID &id)
-{
- int size;
-
+TString TPDiskInfo::GetDeviceName() const
+{
+ return Sprintf("pdisk-%" PRIu32 "-%" PRIu32, PDiskId.NodeId, PDiskId.DiskId);
+}
+
+bool TPDiskInfo::NameToId(const TString &name, TPDiskID &id)
+{
+ int size;
+
if (sscanf(name.data(), "pdisk-%" SCNu32 "-%" SCNu32 "%n", &id.NodeId, &id.DiskId, &size) != 2)
- return false;
-
- if (size != static_cast<int>(name.size()))
- return false;
-
- return true;
-}
-
-bool TPDiskInfo::IsDeviceName(const TString &name)
-{
- TPDiskID id;
- return NameToId(name, id);
-}
-
-TPDiskID TPDiskInfo::NameToId(const TString &name)
-{
- TPDiskID id;
- NameToId(name, id);
- return id;
-}
-
+ return false;
+
+ if (size != static_cast<int>(name.size()))
+ return false;
+
+ return true;
+}
+
+bool TPDiskInfo::IsDeviceName(const TString &name)
+{
+ TPDiskID id;
+ return NameToId(name, id);
+}
+
+TPDiskID TPDiskInfo::NameToId(const TString &name)
+{
+ TPDiskID id;
+ NameToId(name, id);
+ return id;
+}
+
void TPDiskInfo::MigrateOldInfo(const TLockableItem &old)
-{
+{
TLockableItem::MigrateOldInfo(old);
- if (auto *oldPDisk = dynamic_cast<const TPDiskInfo *>(&old)) {
- if (!NodeId)
- NodeId = oldPDisk->NodeId;
- }
-}
-
-TString TVDiskInfo::ItemName() const
-{
+ if (auto *oldPDisk = dynamic_cast<const TPDiskInfo *>(&old)) {
+ if (!NodeId)
+ NodeId = oldPDisk->NodeId;
+ }
+}
+
+TString TVDiskInfo::ItemName() const
+{
return Sprintf("VDisk %s", VDiskId.ToString().data());
-}
-
+}
+
TString TVDiskInfo::PrettyItemName() const
{
TStringBuilder name;
@@ -251,74 +251,74 @@ TString TVDiskInfo::PrettyItemName() const
return name;
}
-TString TVDiskInfo::GetDeviceName() const
-{
- return Sprintf("vdisk-%u-%u-%u-%u-%u", VDiskId.GroupID, VDiskId.GroupGeneration,
- VDiskId.FailRealm, VDiskId.FailDomain, VDiskId.VDisk);
-}
-
-bool TVDiskInfo::NameToId(const TString &name, TVDiskID &id)
-{
- ui32 group, gen, ring, domain, vdisk;
- int size;
-
+TString TVDiskInfo::GetDeviceName() const
+{
+ return Sprintf("vdisk-%u-%u-%u-%u-%u", VDiskId.GroupID, VDiskId.GroupGeneration,
+ VDiskId.FailRealm, VDiskId.FailDomain, VDiskId.VDisk);
+}
+
+bool TVDiskInfo::NameToId(const TString &name, TVDiskID &id)
+{
+ ui32 group, gen, ring, domain, vdisk;
+ int size;
+
if (sscanf(name.data(), "vdisk-%" SCNu32 "-%" SCNu32 "-%" SCNu32 "-%" SCNu32 "-%" SCNu32 "%n",
- &group, &gen, &ring, &domain, &vdisk, &size) != 5)
- return false;
-
- if (size != static_cast<int>(name.size()))
- return false;
-
- id = TVDiskID(group, gen, ring, domain, vdisk);
-
- return true;
-}
-
-bool TVDiskInfo::IsDeviceName(const TString &name)
-{
- TVDiskID id;
- return NameToId(name, id);
-}
-
-TVDiskID TVDiskInfo::NameToId(const TString &name)
-{
- TVDiskID id;
- NameToId(name, id);
- return id;
-}
-
+ &group, &gen, &ring, &domain, &vdisk, &size) != 5)
+ return false;
+
+ if (size != static_cast<int>(name.size()))
+ return false;
+
+ id = TVDiskID(group, gen, ring, domain, vdisk);
+
+ return true;
+}
+
+bool TVDiskInfo::IsDeviceName(const TString &name)
+{
+ TVDiskID id;
+ return NameToId(name, id);
+}
+
+TVDiskID TVDiskInfo::NameToId(const TString &name)
+{
+ TVDiskID id;
+ NameToId(name, id);
+ return id;
+}
+
void TVDiskInfo::MigrateOldInfo(const TLockableItem &old)
-{
+{
TLockableItem::MigrateOldInfo(old);
- if (auto *oldVDisk = dynamic_cast<const TVDiskInfo *>(&old)) {
- if (!NodeId)
- NodeId = oldVDisk->NodeId;
- if (!PDiskId)
- PDiskId = oldVDisk->PDiskId;
- }
-}
-
-void TClusterInfo::SetTimestamp(TInstant timestamp)
-{
- Timestamp = timestamp;
- for (auto &entry : LockableItems)
- entry.second->Timestamp = timestamp;
-}
-
+ if (auto *oldVDisk = dynamic_cast<const TVDiskInfo *>(&old)) {
+ if (!NodeId)
+ NodeId = oldVDisk->NodeId;
+ if (!PDiskId)
+ PDiskId = oldVDisk->PDiskId;
+ }
+}
+
+void TClusterInfo::SetTimestamp(TInstant timestamp)
+{
+ Timestamp = timestamp;
+ for (auto &entry : LockableItems)
+ entry.second->Timestamp = timestamp;
+}
+
void TClusterInfo::AddNode(const TEvInterconnect::TNodeInfo &info, const TActorContext *ctx)
-{
- TNodeInfoPtr &node = Nodes[info.NodeId];
- if (!node)
- node = new TNodeInfo;
-
- TString oldHost = node->Host;
- node->NodeId = info.NodeId;
- node->Host = info.Host;
- node->Address = info.Address;
- node->IcPort = info.Port;
- node->Location = info.Location;
- node->State = NKikimrCms::UNKNOWN;
-
+{
+ TNodeInfoPtr &node = Nodes[info.NodeId];
+ if (!node)
+ node = new TNodeInfo;
+
+ TString oldHost = node->Host;
+ node->NodeId = info.NodeId;
+ node->Host = info.Host;
+ node->Address = info.Address;
+ node->IcPort = info.Port;
+ node->Location = info.Location;
+ node->State = NKikimrCms::UNKNOWN;
+
if (ctx) {
const auto maxStaticNodeId = AppData(*ctx)->DynamicNameserviceConfig->MaxStaticNodeId;
if (node->NodeId <= maxStaticNodeId) {
@@ -328,25 +328,25 @@ void TClusterInfo::AddNode(const TEvInterconnect::TNodeInfo &info, const TActorC
}
}
- auto range = HostNameToNodeId.equal_range(oldHost);
+ auto range = HostNameToNodeId.equal_range(oldHost);
for (auto it = range.first; it != range.second; ++it) {
- if (it->second == node->NodeId) {
- HostNameToNodeId.erase(it);
- break;
- }
+ if (it->second == node->NodeId) {
+ HostNameToNodeId.erase(it);
+ break;
+ }
}
- HostNameToNodeId.emplace(node->Host, node->NodeId);
- LockableItems[node->ItemName()] = node;
-}
-
+ HostNameToNodeId.emplace(node->Host, node->NodeId);
+ LockableItems[node->ItemName()] = node;
+}
+
void TClusterInfo::SetNodeState(ui32 nodeId, NKikimrCms::EState state, const NKikimrWhiteboard::TSystemStateInfo &info)
-{
- if (!HasNode(nodeId))
- return;
-
- auto &node = NodeRef(nodeId);
- node.State = state;
+{
+ if (!HasNode(nodeId))
+ return;
+
+ auto &node = NodeRef(nodeId);
+ node.State = state;
node.Version = info.GetVersion();
node.Services = TServices();
@@ -356,20 +356,20 @@ void TClusterInfo::SetNodeState(ui32 nodeId, NKikimrCms::EState state, const NKi
node.Services |= value;
}
}
-}
-
-void TClusterInfo::ClearNode(ui32 nodeId)
-{
- if (!HasNode(nodeId))
- return;
-
- auto &node = NodeRef(nodeId);
- for (auto tablet : node.Tablets)
- Tablets.erase(tablet);
- node.Tablets.clear();
- node.State = NKikimrCms::DOWN;
-}
-
+}
+
+void TClusterInfo::ClearNode(ui32 nodeId)
+{
+ if (!HasNode(nodeId))
+ return;
+
+ auto &node = NodeRef(nodeId);
+ for (auto tablet : node.Tablets)
+ Tablets.erase(tablet);
+ node.Tablets.clear();
+ node.State = NKikimrCms::DOWN;
+}
+
void TClusterInfo::ApplyInitialNodeTenants(const TActorContext& ctx, const THashMap<ui32, TString>& nodeTenants)
{
for (const auto& pr : nodeTenants) {
@@ -392,147 +392,147 @@ void TClusterInfo::ApplyInitialNodeTenants(const TActorContext& ctx, const THash
}
}
-void TClusterInfo::AddTablet(ui32 nodeId, const NKikimrWhiteboard::TTabletStateInfo &info)
-{
- if (!HasNode(nodeId))
- return;
-
- TTabletInfo &tablet = Tablets[info.GetTabletId()];
- tablet.TabletId = info.GetTabletId();
- tablet.Type = info.GetType();
- tablet.State = info.GetState();
+void TClusterInfo::AddTablet(ui32 nodeId, const NKikimrWhiteboard::TTabletStateInfo &info)
+{
+ if (!HasNode(nodeId))
+ return;
+
+ TTabletInfo &tablet = Tablets[info.GetTabletId()];
+ tablet.TabletId = info.GetTabletId();
+ tablet.Type = info.GetType();
+ tablet.State = info.GetState();
tablet.Leader = info.GetLeader();
- tablet.NodeId = nodeId;
-
- auto &node = NodeRef(nodeId);
- node.Tablets.insert(tablet.TabletId);
-}
-
-void TClusterInfo::AddPDisk(const NKikimrBlobStorage::TBaseConfig::TPDisk &info)
-{
- ui32 nodeId = info.GetNodeId();
- ui32 pdiskId = info.GetPDiskId();
- auto &path = info.GetPath();
-
- if (!HasNode(nodeId))
- return;
-
- TPDiskID id = {nodeId, pdiskId};
- TPDiskInfoPtr &pdisk = PDisks[id];
- if (!pdisk)
- pdisk = new TPDiskInfo;
-
- pdisk->PDiskId = id;
- pdisk->NodeId = nodeId;
- pdisk->Path = path;
-
- auto &node = NodeRef(nodeId);
+ tablet.NodeId = nodeId;
+
+ auto &node = NodeRef(nodeId);
+ node.Tablets.insert(tablet.TabletId);
+}
+
+void TClusterInfo::AddPDisk(const NKikimrBlobStorage::TBaseConfig::TPDisk &info)
+{
+ ui32 nodeId = info.GetNodeId();
+ ui32 pdiskId = info.GetPDiskId();
+ auto &path = info.GetPath();
+
+ if (!HasNode(nodeId))
+ return;
+
+ TPDiskID id = {nodeId, pdiskId};
+ TPDiskInfoPtr &pdisk = PDisks[id];
+ if (!pdisk)
+ pdisk = new TPDiskInfo;
+
+ pdisk->PDiskId = id;
+ pdisk->NodeId = nodeId;
+ pdisk->Path = path;
+
+ auto &node = NodeRef(nodeId);
pdisk->Host = node.Host;
- node.PDisks.insert(id);
-
- LockableItems[pdisk->ItemName()] = pdisk;
-}
-
-void TClusterInfo::UpdatePDiskState(const TPDiskID &id, const NKikimrWhiteboard::TPDiskStateInfo &info)
-{
- if (!HasPDisk(id)) {
+ node.PDisks.insert(id);
+
+ LockableItems[pdisk->ItemName()] = pdisk;
+}
+
+void TClusterInfo::UpdatePDiskState(const TPDiskID &id, const NKikimrWhiteboard::TPDiskStateInfo &info)
+{
+ if (!HasPDisk(id)) {
BLOG_ERROR("Cannot update state for unknown PDisk " << id.ToString());
- return;
- }
-
- auto &pdisk = PDiskRef(id);
+ return;
+ }
+
+ auto &pdisk = PDiskRef(id);
pdisk.State = info.GetState() == NKikimrBlobStorage::TPDiskState::Normal ? UP : DOWN;
-}
-
-void TClusterInfo::AddVDisk(const NKikimrBlobStorage::TBaseConfig::TVSlot &info)
-{
- ui32 nodeId = info.GetVSlotId().GetNodeId();
- Y_VERIFY_DEBUG(HasNode(nodeId));
- if (!HasNode(nodeId)) {
+}
+
+void TClusterInfo::AddVDisk(const NKikimrBlobStorage::TBaseConfig::TVSlot &info)
+{
+ ui32 nodeId = info.GetVSlotId().GetNodeId();
+ Y_VERIFY_DEBUG(HasNode(nodeId));
+ if (!HasNode(nodeId)) {
BLOG_ERROR("Got VDisk info from BSC base config for unknown node " << nodeId);
- return;
- }
-
- TVDiskID vdiskId(info.GetGroupId(),
- info.GetGroupGeneration(),
- info.GetFailRealmIdx(),
- info.GetFailDomainIdx(),
- info.GetVDiskIdx());
- TVDiskInfoPtr &vdisk = VDisks[vdiskId];
- if (!vdisk)
- vdisk = new TVDiskInfo;
-
- vdisk->VDiskId = vdiskId;
- vdisk->PDiskId = {nodeId, info.GetVSlotId().GetPDiskId()};
- vdisk->NodeId = nodeId;
- vdisk->SlotId = info.GetVSlotId().GetVSlotId();
-
- Y_VERIFY_DEBUG(HasPDisk(vdisk->PDiskId));
- if (!HasPDisk(vdisk->PDiskId)) {
+ return;
+ }
+
+ TVDiskID vdiskId(info.GetGroupId(),
+ info.GetGroupGeneration(),
+ info.GetFailRealmIdx(),
+ info.GetFailDomainIdx(),
+ info.GetVDiskIdx());
+ TVDiskInfoPtr &vdisk = VDisks[vdiskId];
+ if (!vdisk)
+ vdisk = new TVDiskInfo;
+
+ vdisk->VDiskId = vdiskId;
+ vdisk->PDiskId = {nodeId, info.GetVSlotId().GetPDiskId()};
+ vdisk->NodeId = nodeId;
+ vdisk->SlotId = info.GetVSlotId().GetVSlotId();
+
+ Y_VERIFY_DEBUG(HasPDisk(vdisk->PDiskId));
+ if (!HasPDisk(vdisk->PDiskId)) {
BLOG_ERROR("Got VDisk info from BSC base config for unknown PDisk " << vdisk->PDiskId.ToString());
- PDisks.emplace(vdisk->PDiskId, new TPDiskInfo(vdisk->PDiskId));
- }
-
- auto &pdisk = PDiskRef(vdisk->PDiskId);
+ PDisks.emplace(vdisk->PDiskId, new TPDiskInfo(vdisk->PDiskId));
+ }
+
+ auto &pdisk = PDiskRef(vdisk->PDiskId);
vdisk->Path = pdisk.Path;
- pdisk.VDisks.insert(vdisk->VDiskId);
- pdisk.VSlots[vdisk->SlotId] = vdisk->VDiskId;
-
- auto &node = NodeRef(nodeId);
+ pdisk.VDisks.insert(vdisk->VDiskId);
+ pdisk.VSlots[vdisk->SlotId] = vdisk->VDiskId;
+
+ auto &node = NodeRef(nodeId);
vdisk->Host = node.Host;
- node.VDisks.insert(vdisk->VDiskId);
-
- LockableItems[vdisk->ItemName()] = vdisk;
-}
-
-void TClusterInfo::UpdateVDiskState(const TVDiskID &id, const NKikimrWhiteboard::TVDiskStateInfo &info)
-{
- if (!HasVDisk(id)) {
+ node.VDisks.insert(vdisk->VDiskId);
+
+ LockableItems[vdisk->ItemName()] = vdisk;
+}
+
+void TClusterInfo::UpdateVDiskState(const TVDiskID &id, const NKikimrWhiteboard::TVDiskStateInfo &info)
+{
+ if (!HasVDisk(id)) {
if (IsStaticGroupVDisk(id)) {
return;
}
BLOG_ERROR("Cannot update state for unknown VDisk " << id.ToString());
- return;
- }
-
- auto &vdisk = VDiskRef(id);
- if (info.GetVDiskState() == NKikimrWhiteboard::OK && info.GetReplicated())
- vdisk.State = UP;
- else
- vdisk.State = DOWN;
-}
-
-void TClusterInfo::AddBSGroup(const NKikimrBlobStorage::TBaseConfig::TGroup &info)
-{
- TBSGroupInfo bsgroup;
- bsgroup.GroupId = info.GetGroupId();
- if (info.GetErasureSpecies())
- bsgroup.Erasure = {TErasureType::ErasureSpeciesByName(info.GetErasureSpecies())};
- for (const auto &vdisk : info.GetVSlotId()) {
- TPDiskID pdiskId = {vdisk.GetNodeId(), vdisk.GetPDiskId()};
- Y_VERIFY_DEBUG(HasPDisk(pdiskId));
- if (!HasPDisk(pdiskId)) {
+ return;
+ }
+
+ auto &vdisk = VDiskRef(id);
+ if (info.GetVDiskState() == NKikimrWhiteboard::OK && info.GetReplicated())
+ vdisk.State = UP;
+ else
+ vdisk.State = DOWN;
+}
+
+void TClusterInfo::AddBSGroup(const NKikimrBlobStorage::TBaseConfig::TGroup &info)
+{
+ TBSGroupInfo bsgroup;
+ bsgroup.GroupId = info.GetGroupId();
+ if (info.GetErasureSpecies())
+ bsgroup.Erasure = {TErasureType::ErasureSpeciesByName(info.GetErasureSpecies())};
+ for (const auto &vdisk : info.GetVSlotId()) {
+ TPDiskID pdiskId = {vdisk.GetNodeId(), vdisk.GetPDiskId()};
+ Y_VERIFY_DEBUG(HasPDisk(pdiskId));
+ if (!HasPDisk(pdiskId)) {
BLOG_ERROR("Group " << bsgroup.GroupId << " refers unknown pdisk " << pdiskId.ToString());
- return;
- }
-
- auto &pdisk = PDiskRef(pdiskId);
+ return;
+ }
+
+ auto &pdisk = PDiskRef(pdiskId);
Y_VERIFY_DEBUG(pdisk.VSlots.contains(vdisk.GetVSlotId()));
if (!pdisk.VSlots.contains(vdisk.GetVSlotId())) {
BLOG_ERROR("Group " << bsgroup.GroupId << " refers unknown slot " <<
- vdisk.GetVSlotId() << " in disk " << pdiskId.ToString());
- return;
- }
-
- bsgroup.VDisks.insert(pdisk.VSlots.at(vdisk.GetVSlotId()));
- }
-
- for (auto &vdisk : bsgroup.VDisks)
- VDiskRef(vdisk).BSGroups.insert(bsgroup.GroupId);
- BSGroups[bsgroup.GroupId] = std::move(bsgroup);
-}
-
+ vdisk.GetVSlotId() << " in disk " << pdiskId.ToString());
+ return;
+ }
+
+ bsgroup.VDisks.insert(pdisk.VSlots.at(vdisk.GetVSlotId()));
+ }
+
+ for (auto &vdisk : bsgroup.VDisks)
+ VDiskRef(vdisk).BSGroups.insert(bsgroup.GroupId);
+ BSGroups[bsgroup.GroupId] = std::move(bsgroup);
+}
+
void TClusterInfo::AddNodeTenants(ui32 nodeId, const NKikimrTenantPool::TTenantPoolStatus &info)
{
if (!HasNode(nodeId))
@@ -554,24 +554,24 @@ void TClusterInfo::AddNodeTenants(ui32 nodeId, const NKikimrTenantPool::TTenantP
TenantToNodeId.emplace(nodeTenant, nodeId);
}
-void TClusterInfo::AddNodeTempLock(ui32 nodeId, const NKikimrCms::TAction &action)
-{
- auto &node = NodeRef(nodeId);
- node.TempLocks.push_back({RollbackPoint, action});
-}
-
-void TClusterInfo::AddPDiskTempLock(TPDiskID pdiskId, const NKikimrCms::TAction &action)
-{
- auto &pdisk = PDiskRef(pdiskId);
- pdisk.TempLocks.push_back({RollbackPoint, action});
-}
-
-void TClusterInfo::AddVDiskTempLock(TVDiskID vdiskId, const NKikimrCms::TAction &action)
-{
- auto &vdisk = VDiskRef(vdiskId);
- vdisk.TempLocks.push_back({RollbackPoint, action});
-}
-
+void TClusterInfo::AddNodeTempLock(ui32 nodeId, const NKikimrCms::TAction &action)
+{
+ auto &node = NodeRef(nodeId);
+ node.TempLocks.push_back({RollbackPoint, action});
+}
+
+void TClusterInfo::AddPDiskTempLock(TPDiskID pdiskId, const NKikimrCms::TAction &action)
+{
+ auto &pdisk = PDiskRef(pdiskId);
+ pdisk.TempLocks.push_back({RollbackPoint, action});
+}
+
+void TClusterInfo::AddVDiskTempLock(TVDiskID vdiskId, const NKikimrCms::TAction &action)
+{
+ auto &vdisk = VDiskRef(vdiskId);
+ vdisk.TempLocks.push_back({RollbackPoint, action});
+}
+
static TServices MakeServices(const NKikimrCms::TAction &action) {
TServices services;
@@ -590,17 +590,17 @@ static TServices MakeServices(const NKikimrCms::TAction &action) {
}
TSet<TLockableItem *> TClusterInfo::FindLockedItems(const NKikimrCms::TAction &action,
- const TActorContext *ctx)
-{
+ const TActorContext *ctx)
+{
TSet<TLockableItem *> res;
-
- if (ActionRequiresHost(action) && !HasNode(action.GetHost())) {
- if (ctx)
- LOG_ERROR(*ctx, NKikimrServices::CMS, "FindLockedItems: unknown host %s",
+
+ if (ActionRequiresHost(action) && !HasNode(action.GetHost())) {
+ if (ctx)
+ LOG_ERROR(*ctx, NKikimrServices::CMS, "FindLockedItems: unknown host %s",
action.GetHost().data());
- return res;
- }
-
+ return res;
+ }
+
switch (action.GetType()) {
case TAction::RESTART_SERVICES:
case TAction::SHUTDOWN_HOST:
@@ -609,244 +609,244 @@ TSet<TLockableItem *> TClusterInfo::FindLockedItems(const NKikimrCms::TAction &a
res.insert(node);
}
} else if (ctx) {
- LOG_ERROR_S(*ctx, NKikimrServices::CMS,
- "FindLockedItems: unknown host " << action.GetHost());
+ LOG_ERROR_S(*ctx, NKikimrServices::CMS,
+ "FindLockedItems: unknown host " << action.GetHost());
}
break;
case TAction::REPLACE_DEVICES:
- for (const auto &device : action.GetDevices()) {
- TLockableItem *item = nullptr;
-
- if (HasPDisk(device))
- item = &PDiskRef(device);
- else if (HasVDisk(device))
- item = &VDiskRef(device);
-
- if (item)
- res.insert(item);
- else if (ctx)
+ for (const auto &device : action.GetDevices()) {
+ TLockableItem *item = nullptr;
+
+ if (HasPDisk(device))
+ item = &PDiskRef(device);
+ else if (HasVDisk(device))
+ item = &VDiskRef(device);
+
+ if (item)
+ res.insert(item);
+ else if (ctx)
LOG_ERROR(*ctx, NKikimrServices::CMS, "FindLockedItems: unknown device %s", device.data());
- }
+ }
break;
default:
if (ctx) {
- LOG_ERROR(*ctx, NKikimrServices::CMS, "FindLockedItems: action %s is not supported",
+ LOG_ERROR(*ctx, NKikimrServices::CMS, "FindLockedItems: action %s is not supported",
TAction::EType_Name(action.GetType()).data());
}
break;
- }
-
- return res;
-}
-
-ui64 TClusterInfo::AddLocks(const TPermissionInfo &permission, const TActorContext *ctx)
-{
- TInstant deadline(permission.Deadline);
+ }
+
+ return res;
+}
+
+ui64 TClusterInfo::AddLocks(const TPermissionInfo &permission, const TActorContext *ctx)
+{
+ TInstant deadline(permission.Deadline);
TDuration duration = TDuration::MicroSeconds(permission.Action.GetDuration());
Y_UNUSED(duration);
- auto items = FindLockedItems(permission.Action, ctx);
- ui64 locks = 0;
-
- for (auto item : items) {
- bool lock = false;
-
- if (deadline > Timestamp)
- lock = true;
-
- if (item->State == DOWN
- && (permission.Action.GetType() == TAction::RESTART_SERVICES
- || permission.Action.GetType() == TAction::SHUTDOWN_HOST
- || permission.Action.GetType() == TAction::REPLACE_DEVICES)) {
- item->State = RESTART;
- lock = true;;
- }
-
- if (lock) {
- if (ctx)
+ auto items = FindLockedItems(permission.Action, ctx);
+ ui64 locks = 0;
+
+ for (auto item : items) {
+ bool lock = false;
+
+ if (deadline > Timestamp)
+ lock = true;
+
+ if (item->State == DOWN
+ && (permission.Action.GetType() == TAction::RESTART_SERVICES
+ || permission.Action.GetType() == TAction::SHUTDOWN_HOST
+ || permission.Action.GetType() == TAction::REPLACE_DEVICES)) {
+ item->State = RESTART;
+ lock = true;;
+ }
+
+ if (lock) {
+ if (ctx)
LOG_INFO(*ctx, NKikimrServices::CMS, "Adding lock for %s (permission %s until %s)",
item->PrettyItemName().data(), permission.PermissionId.data(),
permission.Deadline.ToStringLocalUpToSeconds().data());
- item->AddLock(permission);
- ++locks;
- }
- }
-
- return locks;
-}
-
-ui64 TClusterInfo::AddExternalLocks(const TNotificationInfo &notification, const TActorContext *ctx)
-{
- ui64 locks = 0;
- for (const auto &action : notification.Notification.GetActions()) {
- auto items = FindLockedItems(action, ctx);
-
- for (auto item : items) {
- if (ctx)
+ item->AddLock(permission);
+ ++locks;
+ }
+ }
+
+ return locks;
+}
+
+ui64 TClusterInfo::AddExternalLocks(const TNotificationInfo &notification, const TActorContext *ctx)
+{
+ ui64 locks = 0;
+ for (const auto &action : notification.Notification.GetActions()) {
+ auto items = FindLockedItems(action, ctx);
+
+ for (auto item : items) {
+ if (ctx)
LOG_INFO(*ctx, NKikimrServices::CMS, "Adding external lock for %s",
item->PrettyItemName().data());
-
- item->AddExternalLock(notification, action);
- }
-
- locks += items.size();
- }
-
- return locks;
-}
-
-void TClusterInfo::ApplyDowntimes(const TDowntimes &downtimes)
-{
- for (auto &pr : downtimes.NodeDowntimes) {
- if (!HasNode(pr.first))
- continue;
- NodeRef(pr.first).Downtime = pr.second;
- }
- for (auto &pr : downtimes.PDiskDowntimes) {
- if (!HasPDisk(pr.first))
- continue;
- PDiskRef(pr.first).Downtime = pr.second;
- }
-}
-
+
+ item->AddExternalLock(notification, action);
+ }
+
+ locks += items.size();
+ }
+
+ return locks;
+}
+
+void TClusterInfo::ApplyDowntimes(const TDowntimes &downtimes)
+{
+ for (auto &pr : downtimes.NodeDowntimes) {
+ if (!HasNode(pr.first))
+ continue;
+ NodeRef(pr.first).Downtime = pr.second;
+ }
+ for (auto &pr : downtimes.PDiskDowntimes) {
+ if (!HasPDisk(pr.first))
+ continue;
+ PDiskRef(pr.first).Downtime = pr.second;
+ }
+}
+
void TClusterInfo::UpdateDowntimes(TDowntimes &downtimes, const TActorContext &ctx)
-{
- downtimes.CleanupOld(ctx.Now());
-
- for (auto &pr : Nodes) {
- if (pr.second->State != NKikimrCms::UP)
- downtimes.NodeDowntimes[pr.first] = pr.second->Downtime;
- }
- for (auto &pr : PDisks) {
- if (pr.second->State != NKikimrCms::UP)
- downtimes.PDiskDowntimes[pr.first] = pr.second->Downtime;
- }
-}
-
-ui64 TClusterInfo::AddTempLocks(const NKikimrCms::TAction &action, const TActorContext *ctx)
-{
- auto items = FindLockedItems(action, ctx);
-
- for (auto item : items)
- item->TempLocks.push_back({RollbackPoint, action});
-
- return items.size();
-}
-
-ui64 TClusterInfo::ScheduleActions(const TRequestInfo &request, const TActorContext *ctx)
-{
- ui64 locks = 0;
- for (const auto &action : request.Request.GetActions()) {
- auto items = FindLockedItems(action, ctx);
-
- for (auto item : items)
- item->ScheduleLock({action, request.Owner, request.RequestId, request.Order});
-
- locks += items.size();
- }
-
- return locks;
-}
-
-void TClusterInfo::UnscheduleActions(const TString &requestId)
-{
- for (auto &entry : LockableItems)
- entry.second->RemoveScheduledLocks(requestId);
-}
-
-void TClusterInfo::DeactivateScheduledLocks(ui64 order)
-{
- for (auto &entry : LockableItems)
- entry.second->DeactivateScheduledLocks(order);
-}
-
-void TClusterInfo::ReactivateScheduledLocks()
-{
- for (auto &entry : LockableItems)
- entry.second->ReactivateScheduledLocks();
-}
-
-void TClusterInfo::RollbackLocks(ui64 point)
-{
- if (!point || point > RollbackPoint)
- return;
-
- for (auto &entry : LockableItems)
- entry.second->RollbackLocks(point);
- RollbackPoint = point - 1;
-}
-
+{
+ downtimes.CleanupOld(ctx.Now());
+
+ for (auto &pr : Nodes) {
+ if (pr.second->State != NKikimrCms::UP)
+ downtimes.NodeDowntimes[pr.first] = pr.second->Downtime;
+ }
+ for (auto &pr : PDisks) {
+ if (pr.second->State != NKikimrCms::UP)
+ downtimes.PDiskDowntimes[pr.first] = pr.second->Downtime;
+ }
+}
+
+ui64 TClusterInfo::AddTempLocks(const NKikimrCms::TAction &action, const TActorContext *ctx)
+{
+ auto items = FindLockedItems(action, ctx);
+
+ for (auto item : items)
+ item->TempLocks.push_back({RollbackPoint, action});
+
+ return items.size();
+}
+
+ui64 TClusterInfo::ScheduleActions(const TRequestInfo &request, const TActorContext *ctx)
+{
+ ui64 locks = 0;
+ for (const auto &action : request.Request.GetActions()) {
+ auto items = FindLockedItems(action, ctx);
+
+ for (auto item : items)
+ item->ScheduleLock({action, request.Owner, request.RequestId, request.Order});
+
+ locks += items.size();
+ }
+
+ return locks;
+}
+
+void TClusterInfo::UnscheduleActions(const TString &requestId)
+{
+ for (auto &entry : LockableItems)
+ entry.second->RemoveScheduledLocks(requestId);
+}
+
+void TClusterInfo::DeactivateScheduledLocks(ui64 order)
+{
+ for (auto &entry : LockableItems)
+ entry.second->DeactivateScheduledLocks(order);
+}
+
+void TClusterInfo::ReactivateScheduledLocks()
+{
+ for (auto &entry : LockableItems)
+ entry.second->ReactivateScheduledLocks();
+}
+
+void TClusterInfo::RollbackLocks(ui64 point)
+{
+ if (!point || point > RollbackPoint)
+ return;
+
+ for (auto &entry : LockableItems)
+ entry.second->RollbackLocks(point);
+ RollbackPoint = point - 1;
+}
+
void TClusterInfo::MigrateOldInfo(TClusterInfoPtr old)
-{
- for (auto &entry : LockableItems) {
- auto it = old->LockableItems.find(entry.first);
- if (it != old->LockableItems.end())
+{
+ for (auto &entry : LockableItems) {
+ auto it = old->LockableItems.find(entry.first);
+ if (it != old->LockableItems.end())
entry.second->MigrateOldInfo(*it->second);
- }
-}
-
-void TClusterInfo::DebugDump(const TActorContext &ctx) const
-{
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "Timestamp: " << Timestamp.ToStringLocalUpToSeconds());
- for (auto &entry: Nodes) {
- TStringStream ss;
- auto &node = *entry.second;
- ss << "Node {" << Endl
- << " Id: " << (ui32)node.NodeId << Endl
- << " Host: " << node.Host << Endl
- << " Address: " << node.Address << Endl
- << " Version: " << node.Version << Endl
+ }
+}
+
+void TClusterInfo::DebugDump(const TActorContext &ctx) const
+{
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "Timestamp: " << Timestamp.ToStringLocalUpToSeconds());
+ for (auto &entry: Nodes) {
+ TStringStream ss;
+ auto &node = *entry.second;
+ ss << "Node {" << Endl
+ << " Id: " << (ui32)node.NodeId << Endl
+ << " Host: " << node.Host << Endl
+ << " Address: " << node.Address << Endl
+ << " Version: " << node.Version << Endl
<< " State: " << EState_Name(node.State) << Endl;
- for (auto pd : node.PDisks)
- ss << " PDisk: " << pd.NodeId << ":" << pd.DiskId << Endl;
- for (auto &vd : node.VDisks)
- ss << " VDisk: " << vd.ToString() << Endl;
- node.DebugLocksDump(ss, " ");
- ss << "}" << Endl;
- LOG_DEBUG(ctx, NKikimrServices::CMS, ss.Str());
- }
- for (auto &entry: PDisks) {
- TStringStream ss;
- auto &pdisk = *entry.second;
- ss << "PDisk {" << Endl
- << " Id: " << pdisk.PDiskId.NodeId << ":" << pdisk.PDiskId.DiskId << Endl
- << " NodeId: " << pdisk.NodeId << Endl
+ for (auto pd : node.PDisks)
+ ss << " PDisk: " << pd.NodeId << ":" << pd.DiskId << Endl;
+ for (auto &vd : node.VDisks)
+ ss << " VDisk: " << vd.ToString() << Endl;
+ node.DebugLocksDump(ss, " ");
+ ss << "}" << Endl;
+ LOG_DEBUG(ctx, NKikimrServices::CMS, ss.Str());
+ }
+ for (auto &entry: PDisks) {
+ TStringStream ss;
+ auto &pdisk = *entry.second;
+ ss << "PDisk {" << Endl
+ << " Id: " << pdisk.PDiskId.NodeId << ":" << pdisk.PDiskId.DiskId << Endl
+ << " NodeId: " << pdisk.NodeId << Endl
<< " State: " << EState_Name(pdisk.State) << Endl;
- pdisk.DebugLocksDump(ss, " ");
- ss << "}" << Endl;
- LOG_DEBUG(ctx, NKikimrServices::CMS, ss.Str());
- }
- for (auto &entry: VDisks) {
- TStringStream ss;
- auto &vdisk = *entry.second;
- ss << "VDisk {" << Endl
- << " Id: " << vdisk.VDiskId.ToString() << Endl
- << " NodeId: " << vdisk.NodeId << Endl
- << " State: " << EState_Name(vdisk.State) << Endl
+ pdisk.DebugLocksDump(ss, " ");
+ ss << "}" << Endl;
+ LOG_DEBUG(ctx, NKikimrServices::CMS, ss.Str());
+ }
+ for (auto &entry: VDisks) {
+ TStringStream ss;
+ auto &vdisk = *entry.second;
+ ss << "VDisk {" << Endl
+ << " Id: " << vdisk.VDiskId.ToString() << Endl
+ << " NodeId: " << vdisk.NodeId << Endl
+ << " State: " << EState_Name(vdisk.State) << Endl
<< " PDisk: " << vdisk.PDiskId.NodeId << ":" << vdisk.PDiskId.DiskId << Endl;
- for (auto id : vdisk.BSGroups)
- ss << " BSGroup: " << id << Endl;
- vdisk.DebugLocksDump(ss, " ");
- ss << "}" << Endl;
- LOG_DEBUG(ctx, NKikimrServices::CMS, ss.Str());
- }
- for (auto &entry: BSGroups) {
- TStringStream ss;
- auto &group = entry.second;
- ss << "BSGroup {" << Endl
- << " Id: " << (ui32)group.GroupId << Endl;
- if (group.Erasure.GetErasure() == TErasureType::ErasureSpeciesCount)
- ss << " Erasure: UNKNOWN" << Endl;
- else
- ss << " Erasure: " << group.Erasure.ToString() << Endl;
- for (auto &vd : group.VDisks)
- ss << " VDisk: " << vd.ToString() << Endl;
- ss << "}" << Endl;
- LOG_DEBUG(ctx, NKikimrServices::CMS, ss.Str());
- }
-}
-
-} // NCms
-} // NKikimr
+ for (auto id : vdisk.BSGroups)
+ ss << " BSGroup: " << id << Endl;
+ vdisk.DebugLocksDump(ss, " ");
+ ss << "}" << Endl;
+ LOG_DEBUG(ctx, NKikimrServices::CMS, ss.Str());
+ }
+ for (auto &entry: BSGroups) {
+ TStringStream ss;
+ auto &group = entry.second;
+ ss << "BSGroup {" << Endl
+ << " Id: " << (ui32)group.GroupId << Endl;
+ if (group.Erasure.GetErasure() == TErasureType::ErasureSpeciesCount)
+ ss << " Erasure: UNKNOWN" << Endl;
+ else
+ ss << " Erasure: " << group.Erasure.ToString() << Endl;
+ for (auto &vd : group.VDisks)
+ ss << " VDisk: " << vd.ToString() << Endl;
+ ss << "}" << Endl;
+ LOG_DEBUG(ctx, NKikimrServices::CMS, ss.Str());
+ }
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cluster_info.h b/ydb/core/cms/cluster_info.h
index 91f2e36c4ea..af5fe24af80 100644
--- a/ydb/core/cms/cluster_info.h
+++ b/ydb/core/cms/cluster_info.h
@@ -1,509 +1,509 @@
-#pragma once
-
-#include "defs.h"
-#include "config.h"
-#include "downtime.h"
+#pragma once
+
+#include "defs.h"
+#include "config.h"
+#include "downtime.h"
#include "services.h"
-
+
#include <library/cpp/actors/interconnect/interconnect.h>
#include <ydb/core/base/blobstorage.h>
#include <ydb/core/node_whiteboard/node_whiteboard.h>
#include <ydb/core/blobstorage/base/blobstorage_vdiskid.h>
#include <ydb/core/mind/tenant_pool.h>
#include <ydb/core/protos/cms.pb.h>
-
-#include <util/generic/hash.h>
-#include <util/generic/maybe.h>
-#include <util/generic/set.h>
-
-namespace NKikimr {
-namespace NCms {
-
-// Forward declarations.
-class TClusterInfo;
-using TClusterInfoPtr = TIntrusivePtr<TClusterInfo>;
-struct TCmsState;
-using TCmsStatePtr = TIntrusivePtr<TCmsState>;
-
-struct TErrorInfo {
- NKikimrCms::TStatus::ECode Code = NKikimrCms::TStatus::ALLOW;
- TString Reason;
- TInstant Deadline;
- ui64 RollbackPoint = 0;
-};
-
-/**
- * Structure to hold info about issued permission. A set of
- * all issued permissions is a part of CMS persistent state.
- * Info is used for permissions management and to identify
- * locked items (nodes and devices) in cluster.
- */
-struct TPermissionInfo {
- TPermissionInfo() = default;
- TPermissionInfo(const TPermissionInfo &other) = default;
- TPermissionInfo(TPermissionInfo &&other) = default;
-
- TPermissionInfo(const NKikimrCms::TPermission &permission, const TString &requestId,
- const TString &owner)
- : PermissionId(permission.GetId())
- , RequestId(requestId)
- , Owner(owner)
- , Action(permission.GetAction())
+
+#include <util/generic/hash.h>
+#include <util/generic/maybe.h>
+#include <util/generic/set.h>
+
+namespace NKikimr {
+namespace NCms {
+
+// Forward declarations.
+class TClusterInfo;
+using TClusterInfoPtr = TIntrusivePtr<TClusterInfo>;
+struct TCmsState;
+using TCmsStatePtr = TIntrusivePtr<TCmsState>;
+
+struct TErrorInfo {
+ NKikimrCms::TStatus::ECode Code = NKikimrCms::TStatus::ALLOW;
+ TString Reason;
+ TInstant Deadline;
+ ui64 RollbackPoint = 0;
+};
+
+/**
+ * Structure to hold info about issued permission. A set of
+ * all issued permissions is a part of CMS persistent state.
+ * Info is used for permissions management and to identify
+ * locked items (nodes and devices) in cluster.
+ */
+struct TPermissionInfo {
+ TPermissionInfo() = default;
+ TPermissionInfo(const TPermissionInfo &other) = default;
+ TPermissionInfo(TPermissionInfo &&other) = default;
+
+ TPermissionInfo(const NKikimrCms::TPermission &permission, const TString &requestId,
+ const TString &owner)
+ : PermissionId(permission.GetId())
+ , RequestId(requestId)
+ , Owner(owner)
+ , Action(permission.GetAction())
, Deadline(TInstant::MicroSeconds(permission.GetDeadline()))
- {
- }
-
- TPermissionInfo &operator=(const TPermissionInfo &other) = default;
- TPermissionInfo &operator=(TPermissionInfo &&other) = default;
-
- void CopyTo(NKikimrCms::TPermission &permission) const
- {
- permission.SetId(PermissionId);
- permission.MutableAction()->CopyFrom(Action);
- permission.SetDeadline(Deadline.GetValue());
- }
-
- TString PermissionId;
- TString RequestId;
- TString Owner;
- NKikimrCms::TAction Action;
- TInstant Deadline;
-};
-
-/**
- * Structure to hold information about scheduled request.
- */
-struct TRequestInfo {
- TRequestInfo() = default;
- TRequestInfo(const TRequestInfo &other) = default;
- TRequestInfo(TRequestInfo &&other) = default;
-
- TRequestInfo &operator=(const TRequestInfo &other) = default;
- TRequestInfo &operator=(TRequestInfo &&other) = default;
-
- void CopyTo(NKikimrCms::TManageRequestResponse::TScheduledRequest &request) const
- {
- request.SetRequestId(RequestId);
- request.SetOwner(Owner);
- request.MutableActions()->CopyFrom(Request.GetActions());
- request.SetPartialPermissionAllowed(Request.GetPartialPermissionAllowed());
- request.SetReason(Request.GetReason());
- }
-
- TString RequestId;
- TString Owner;
+ {
+ }
+
+ TPermissionInfo &operator=(const TPermissionInfo &other) = default;
+ TPermissionInfo &operator=(TPermissionInfo &&other) = default;
+
+ void CopyTo(NKikimrCms::TPermission &permission) const
+ {
+ permission.SetId(PermissionId);
+ permission.MutableAction()->CopyFrom(Action);
+ permission.SetDeadline(Deadline.GetValue());
+ }
+
+ TString PermissionId;
+ TString RequestId;
+ TString Owner;
+ NKikimrCms::TAction Action;
+ TInstant Deadline;
+};
+
+/**
+ * Structure to hold information about scheduled request.
+ */
+struct TRequestInfo {
+ TRequestInfo() = default;
+ TRequestInfo(const TRequestInfo &other) = default;
+ TRequestInfo(TRequestInfo &&other) = default;
+
+ TRequestInfo &operator=(const TRequestInfo &other) = default;
+ TRequestInfo &operator=(TRequestInfo &&other) = default;
+
+ void CopyTo(NKikimrCms::TManageRequestResponse::TScheduledRequest &request) const
+ {
+ request.SetRequestId(RequestId);
+ request.SetOwner(Owner);
+ request.MutableActions()->CopyFrom(Request.GetActions());
+ request.SetPartialPermissionAllowed(Request.GetPartialPermissionAllowed());
+ request.SetReason(Request.GetReason());
+ }
+
+ TString RequestId;
+ TString Owner;
ui64 Order = 0;
- NKikimrCms::TPermissionRequest Request;
-};
-
-/**
- * Structure to hold information about notification.
- */
-struct TNotificationInfo {
- TNotificationInfo() = default;
- TNotificationInfo(const TNotificationInfo &other) = default;
- TNotificationInfo(TNotificationInfo &&other) = default;
-
- TNotificationInfo &operator=(const TNotificationInfo &other) = default;
- TNotificationInfo &operator=(TNotificationInfo &&other) = default;
-
- void CopyTo(NKikimrCms::TManageNotificationResponse::TStoredNotification &notification) const
- {
- notification.SetNotificationId(NotificationId);
- notification.SetOwner(Owner);
- notification.MutableActions()->CopyFrom(Notification.GetActions());
- notification.SetTime(Notification.GetTime());
- notification.SetReason(Notification.GetReason());
- }
-
- TString NotificationId;
- TString Owner;
- NKikimrCms::TNotification Notification;
-};
-
-/**
- * Base class for entity which can be locked by CMS user. There are three
- * types of locks used.
- *
- * TLock - lock by issued permission. Only one such lock is possible per item.
- *
- * TExternalLock - lock caused by some external activity (not permitted by CMS)
- * reported via CMS notifications. This lock may have delayed effect which allows
- * to notify about some actions in the future.
- *
- * TScheduledLock - lock by scheduled request. Multiple scheduled locks are allowed.
- * Scheduled locks are ordered and request cannot get permission for an item if
- * it has a scheduled lock with lower order.
- *
- * TTemporaryLock - temporary lock used for action processing. Used to identify
- * conflicts within a single action and between actions in a single request.
- */
-class TLockableItem : public TThrRefBase {
-public:
- struct TBaseLock
- {
- TBaseLock(const TString &owner, const NKikimrCms::TAction &action)
- : Owner(owner)
- , Action(action)
- {
- }
- TBaseLock(const TBaseLock &other) = default;
- TBaseLock(TBaseLock &&other) = default;
-
- TBaseLock &operator=(const TBaseLock &other) = default;
- TBaseLock &operator=(TBaseLock &&other) = default;
-
- TString Owner;
- NKikimrCms::TAction Action;
- };
-
- struct TLock : public TBaseLock {
- TLock(const TPermissionInfo &permission)
- : TBaseLock(permission.Owner, permission.Action)
- {
- PermissionId = permission.PermissionId;
- LockDeadline = permission.Deadline;
+ NKikimrCms::TPermissionRequest Request;
+};
+
+/**
+ * Structure to hold information about notification.
+ */
+struct TNotificationInfo {
+ TNotificationInfo() = default;
+ TNotificationInfo(const TNotificationInfo &other) = default;
+ TNotificationInfo(TNotificationInfo &&other) = default;
+
+ TNotificationInfo &operator=(const TNotificationInfo &other) = default;
+ TNotificationInfo &operator=(TNotificationInfo &&other) = default;
+
+ void CopyTo(NKikimrCms::TManageNotificationResponse::TStoredNotification &notification) const
+ {
+ notification.SetNotificationId(NotificationId);
+ notification.SetOwner(Owner);
+ notification.MutableActions()->CopyFrom(Notification.GetActions());
+ notification.SetTime(Notification.GetTime());
+ notification.SetReason(Notification.GetReason());
+ }
+
+ TString NotificationId;
+ TString Owner;
+ NKikimrCms::TNotification Notification;
+};
+
+/**
+ * Base class for entity which can be locked by CMS user. There are three
+ * types of locks used.
+ *
+ * TLock - lock by issued permission. Only one such lock is possible per item.
+ *
+ * TExternalLock - lock caused by some external activity (not permitted by CMS)
+ * reported via CMS notifications. This lock may have delayed effect which allows
+ * to notify about some actions in the future.
+ *
+ * TScheduledLock - lock by scheduled request. Multiple scheduled locks are allowed.
+ * Scheduled locks are ordered and request cannot get permission for an item if
+ * it has a scheduled lock with lower order.
+ *
+ * TTemporaryLock - temporary lock used for action processing. Used to identify
+ * conflicts within a single action and between actions in a single request.
+ */
+class TLockableItem : public TThrRefBase {
+public:
+ struct TBaseLock
+ {
+ TBaseLock(const TString &owner, const NKikimrCms::TAction &action)
+ : Owner(owner)
+ , Action(action)
+ {
+ }
+ TBaseLock(const TBaseLock &other) = default;
+ TBaseLock(TBaseLock &&other) = default;
+
+ TBaseLock &operator=(const TBaseLock &other) = default;
+ TBaseLock &operator=(TBaseLock &&other) = default;
+
+ TString Owner;
+ NKikimrCms::TAction Action;
+ };
+
+ struct TLock : public TBaseLock {
+ TLock(const TPermissionInfo &permission)
+ : TBaseLock(permission.Owner, permission.Action)
+ {
+ PermissionId = permission.PermissionId;
+ LockDeadline = permission.Deadline;
ActionDeadline = LockDeadline + TDuration::MicroSeconds(Action.GetDuration());
- }
- TLock(const TLock &other) = default;
- TLock(TLock &&other) = default;
-
- TLock &operator=(const TLock &other) = default;
- TLock &operator=(TLock &&other) = default;
-
- TString PermissionId;
- TInstant LockDeadline;
- TInstant ActionDeadline;
- };
-
- struct TExternalLock : TBaseLock {
- TExternalLock(const TNotificationInfo &notification, const NKikimrCms::TAction &action)
- : TBaseLock(notification.Owner, action)
- {
- NotificationId = notification.NotificationId;
- if (notification.Notification.HasTime())
+ }
+ TLock(const TLock &other) = default;
+ TLock(TLock &&other) = default;
+
+ TLock &operator=(const TLock &other) = default;
+ TLock &operator=(TLock &&other) = default;
+
+ TString PermissionId;
+ TInstant LockDeadline;
+ TInstant ActionDeadline;
+ };
+
+ struct TExternalLock : TBaseLock {
+ TExternalLock(const TNotificationInfo &notification, const NKikimrCms::TAction &action)
+ : TBaseLock(notification.Owner, action)
+ {
+ NotificationId = notification.NotificationId;
+ if (notification.Notification.HasTime())
LockStart = TInstant::MicroSeconds(notification.Notification.GetTime());
- else
+ else
LockStart = TActivationContext::Now();
LockDeadline = LockStart + TDuration::MicroSeconds(action.GetDuration());
- }
-
- TString NotificationId;
- TInstant LockStart;
- TInstant LockDeadline;
- };
-
- struct TScheduledLock : TBaseLock {
- TScheduledLock(const NKikimrCms::TAction &action, const TString &owner, const TString &requestId, ui64 order)
- : TBaseLock(owner, action)
- , RequestId(requestId)
- , Order(order)
- {
- }
-
- TScheduledLock(const TScheduledLock &other) = default;
- TScheduledLock(TScheduledLock &&other) = default;
-
- TScheduledLock &operator=(const TScheduledLock &other) = default;
- TScheduledLock &operator=(TScheduledLock &&other) = default;
-
- TString RequestId;
- ui64 Order = 0;
- };
-
- struct TTemporaryLock : TBaseLock {
- TTemporaryLock(ui64 point, const NKikimrCms::TAction &action)
- : TBaseLock("", action)
- , RollbackPoint(point)
- {
- }
- TTemporaryLock(const TTemporaryLock &other) = default;
- TTemporaryLock(TTemporaryLock &&other) = default;
-
- TTemporaryLock &operator=(const TTemporaryLock &other) = default;
- TTemporaryLock &operator=(TTemporaryLock &&other) = default;
-
- ui64 RollbackPoint;
- };
-
- TLockableItem() = default;
- TLockableItem(NKikimrCms::EState state)
- : State(state)
- {
- }
-
- virtual ~TLockableItem()
- {
- }
-
- virtual TString ItemName() const = 0;
+ }
+
+ TString NotificationId;
+ TInstant LockStart;
+ TInstant LockDeadline;
+ };
+
+ struct TScheduledLock : TBaseLock {
+ TScheduledLock(const NKikimrCms::TAction &action, const TString &owner, const TString &requestId, ui64 order)
+ : TBaseLock(owner, action)
+ , RequestId(requestId)
+ , Order(order)
+ {
+ }
+
+ TScheduledLock(const TScheduledLock &other) = default;
+ TScheduledLock(TScheduledLock &&other) = default;
+
+ TScheduledLock &operator=(const TScheduledLock &other) = default;
+ TScheduledLock &operator=(TScheduledLock &&other) = default;
+
+ TString RequestId;
+ ui64 Order = 0;
+ };
+
+ struct TTemporaryLock : TBaseLock {
+ TTemporaryLock(ui64 point, const NKikimrCms::TAction &action)
+ : TBaseLock("", action)
+ , RollbackPoint(point)
+ {
+ }
+ TTemporaryLock(const TTemporaryLock &other) = default;
+ TTemporaryLock(TTemporaryLock &&other) = default;
+
+ TTemporaryLock &operator=(const TTemporaryLock &other) = default;
+ TTemporaryLock &operator=(TTemporaryLock &&other) = default;
+
+ ui64 RollbackPoint;
+ };
+
+ TLockableItem() = default;
+ TLockableItem(NKikimrCms::EState state)
+ : State(state)
+ {
+ }
+
+ virtual ~TLockableItem()
+ {
+ }
+
+ virtual TString ItemName() const = 0;
virtual TString PrettyItemName() const
{
return ItemName();
}
-
- void AddLock(const TPermissionInfo &permission)
- {
- Y_VERIFY(Lock.Empty());
- Lock.ConstructInPlace(permission);
- }
-
- void AddExternalLock(const TNotificationInfo &notification,
- const NKikimrCms::TAction &action)
- {
- TExternalLock lock(notification, action);
- auto pos = LowerBound(ExternalLocks.begin(), ExternalLocks.end(), lock, [](auto &l, auto &r) {
- return l.LockStart < r.LockStart;
- });
- ExternalLocks.insert(pos, std::move(lock));
- }
-
- void ScheduleLock(TScheduledLock &&lock)
- {
- auto pos = LowerBound(ScheduledLocks.begin(), ScheduledLocks.end(), lock, [](auto &l, auto &r) {
- return l.Order < r.Order;
- });
- ScheduledLocks.insert(pos, lock);
- }
-
- bool IsLocked(TErrorInfo &error, TDuration defaultRetryTime, TInstant no, TDuration durationw) const;
- bool IsDown(TErrorInfo &error, TInstant defaultDeadline) const;
-
- void RollbackLocks(ui64 point);
-
- void DeactivateScheduledLocks(ui64 order);
- void ReactivateScheduledLocks();
- void RemoveScheduledLocks(const TString &requestId);
-
- // Fill some item info (e.g. Downtime) basing on previous item state.
+
+ void AddLock(const TPermissionInfo &permission)
+ {
+ Y_VERIFY(Lock.Empty());
+ Lock.ConstructInPlace(permission);
+ }
+
+ void AddExternalLock(const TNotificationInfo &notification,
+ const NKikimrCms::TAction &action)
+ {
+ TExternalLock lock(notification, action);
+ auto pos = LowerBound(ExternalLocks.begin(), ExternalLocks.end(), lock, [](auto &l, auto &r) {
+ return l.LockStart < r.LockStart;
+ });
+ ExternalLocks.insert(pos, std::move(lock));
+ }
+
+ void ScheduleLock(TScheduledLock &&lock)
+ {
+ auto pos = LowerBound(ScheduledLocks.begin(), ScheduledLocks.end(), lock, [](auto &l, auto &r) {
+ return l.Order < r.Order;
+ });
+ ScheduledLocks.insert(pos, lock);
+ }
+
+ bool IsLocked(TErrorInfo &error, TDuration defaultRetryTime, TInstant no, TDuration durationw) const;
+ bool IsDown(TErrorInfo &error, TInstant defaultDeadline) const;
+
+ void RollbackLocks(ui64 point);
+
+ void DeactivateScheduledLocks(ui64 order);
+ void ReactivateScheduledLocks();
+ void RemoveScheduledLocks(const TString &requestId);
+
+ // Fill some item info (e.g. Downtime) basing on previous item state.
virtual void MigrateOldInfo(const TLockableItem &old);
-
- void DebugLocksDump(IOutputStream &ss, const TString &prefix = "") const;
-
- TInstant Timestamp;
- NKikimrCms::EState State = NKikimrCms::UNKNOWN;
- // Recent item downtimes.
- TDowntime Downtime = TDowntime(TDuration::Zero());
-
- TMaybe<TLock> Lock;
- std::list<TExternalLock> ExternalLocks;
- std::list<TScheduledLock> ScheduledLocks;
+
+ void DebugLocksDump(IOutputStream &ss, const TString &prefix = "") const;
+
+ TInstant Timestamp;
+ NKikimrCms::EState State = NKikimrCms::UNKNOWN;
+ // Recent item downtimes.
+ TDowntime Downtime = TDowntime(TDuration::Zero());
+
+ TMaybe<TLock> Lock;
+ std::list<TExternalLock> ExternalLocks;
+ std::list<TScheduledLock> ScheduledLocks;
TVector<TTemporaryLock> TempLocks;
- ui64 DeactivatedLocksOrder = Max<ui64>();
-};
-using TLockableItemPtr = TIntrusivePtr<TLockableItem>;
-
-/**
- * Structure to hold info and state for a single node. It holds basic
- * info received from NodeWhiteboard and references to tablet and
- * disk structures.
- */
-class TNodeInfo : public TLockableItem {
-public:
- TNodeInfo() = default;
- TNodeInfo(const TNodeInfo &other) = default;
- TNodeInfo(TNodeInfo &&other) = default;
-
- TNodeInfo &operator=(const TNodeInfo &other) = default;
- TNodeInfo &operator=(TNodeInfo &&other) = default;
-
- TString ItemName() const override
- {
+ ui64 DeactivatedLocksOrder = Max<ui64>();
+};
+using TLockableItemPtr = TIntrusivePtr<TLockableItem>;
+
+/**
+ * Structure to hold info and state for a single node. It holds basic
+ * info received from NodeWhiteboard and references to tablet and
+ * disk structures.
+ */
+class TNodeInfo : public TLockableItem {
+public:
+ TNodeInfo() = default;
+ TNodeInfo(const TNodeInfo &other) = default;
+ TNodeInfo(TNodeInfo &&other) = default;
+
+ TNodeInfo &operator=(const TNodeInfo &other) = default;
+ TNodeInfo &operator=(TNodeInfo &&other) = default;
+
+ TString ItemName() const override
+ {
return Sprintf("Host %s:%" PRIu16 " (%" PRIu32 ")", Host.data(), IcPort, NodeId);
- }
-
+ }
+
void MigrateOldInfo(const TLockableItem &old) override;
- ui32 NodeId = 0;
- TString Host;
- TString Address;
- ui16 IcPort = 0;
+ ui32 NodeId = 0;
+ TString Host;
+ TString Address;
+ ui16 IcPort = 0;
TNodeLocation Location;
- TString Version;
+ TString Version;
TSet<ui64> Tablets;
- TSet<TPDiskID> PDisks;
+ TSet<TPDiskID> PDisks;
TSet<TVDiskID> VDisks;
bool HasTenantInfo = false;
TString Tenant;
TString PreviousTenant;
TServices Services;
-};
-using TNodeInfoPtr = TIntrusivePtr<TNodeInfo>;
-
-/**
- * Structure to hold tablet info received from NodeWhiteboard.
- */
-struct TTabletInfo {
- using EState = NKikimrWhiteboard::TTabletStateInfo::ETabletState;
+};
+using TNodeInfoPtr = TIntrusivePtr<TNodeInfo>;
+
+/**
+ * Structure to hold tablet info received from NodeWhiteboard.
+ */
+struct TTabletInfo {
+ using EState = NKikimrWhiteboard::TTabletStateInfo::ETabletState;
using EType = TTabletTypes::EType;
-
- TTabletInfo() = default;
- TTabletInfo(const TTabletInfo &other) = default;
- TTabletInfo(TTabletInfo &&other) = default;
-
- TTabletInfo &operator=(const TTabletInfo &other) = default;
- TTabletInfo &operator=(TTabletInfo &&other) = default;
-
- ui64 TabletId = 0;
+
+ TTabletInfo() = default;
+ TTabletInfo(const TTabletInfo &other) = default;
+ TTabletInfo(TTabletInfo &&other) = default;
+
+ TTabletInfo &operator=(const TTabletInfo &other) = default;
+ TTabletInfo &operator=(TTabletInfo &&other) = default;
+
+ ui64 TabletId = 0;
EType Type = TTabletTypes::Unknown;
- EState State = NKikimrWhiteboard::TTabletStateInfo::Created;
+ EState State = NKikimrWhiteboard::TTabletStateInfo::Created;
bool Leader = false;
- ui32 NodeId = 0;
-};
-
-/**
- * Structure to describe PDisk state. Holds state received from
- * NodeWhiteboard and references to VDisk structures.
- */
-class TPDiskInfo : public TLockableItem {
-public:
- TPDiskInfo(TPDiskID id = TPDiskID())
- : TLockableItem(NKikimrCms::DOWN)
- , PDiskId(id)
- , NodeId(id.NodeId)
- , Path("")
- {
- }
-
- TPDiskInfo(const TPDiskInfo &other) = default;
- TPDiskInfo(TPDiskInfo &&other) = default;
-
- TPDiskInfo &operator=(const TPDiskInfo &other) = default;
- TPDiskInfo &operator=(TPDiskInfo &&other) = default;
-
- TString ItemName() const override;
+ ui32 NodeId = 0;
+};
+
+/**
+ * Structure to describe PDisk state. Holds state received from
+ * NodeWhiteboard and references to VDisk structures.
+ */
+class TPDiskInfo : public TLockableItem {
+public:
+ TPDiskInfo(TPDiskID id = TPDiskID())
+ : TLockableItem(NKikimrCms::DOWN)
+ , PDiskId(id)
+ , NodeId(id.NodeId)
+ , Path("")
+ {
+ }
+
+ TPDiskInfo(const TPDiskInfo &other) = default;
+ TPDiskInfo(TPDiskInfo &&other) = default;
+
+ TPDiskInfo &operator=(const TPDiskInfo &other) = default;
+ TPDiskInfo &operator=(TPDiskInfo &&other) = default;
+
+ TString ItemName() const override;
TString PrettyItemName() const override;
- TString GetDeviceName() const;
- static bool IsDeviceName(const TString &name);
- static TPDiskID NameToId(const TString &name);
-
+ TString GetDeviceName() const;
+ static bool IsDeviceName(const TString &name);
+ static TPDiskID NameToId(const TString &name);
+
void MigrateOldInfo(const TLockableItem &old) override;
-
- TPDiskID PDiskId;
- ui32 NodeId;
+
+ TPDiskID PDiskId;
+ ui32 NodeId;
TString Host;
- TString Path;
+ TString Path;
TSet<TVDiskID> VDisks;
- // SlotIdx -> VDiskID
- THashMap<ui32, TVDiskID> VSlots;
-
-private:
- static bool NameToId(const TString &name, TPDiskID &id);
-};
-using TPDiskInfoPtr = TIntrusivePtr<TPDiskInfo>;
-
-/**
- * Structure to describe VDisk state. Holds state received from
- * NodeWhiteboard and references to BSGroups VDisk is a part of.
- */
-class TVDiskInfo : public TLockableItem {
-public:
- TVDiskInfo(TVDiskID id = TVDiskID(), TPDiskID pdiskId = TPDiskID(), NKikimrCms::EState state = NKikimrCms::DOWN, ui32 nodeId = 0)
- : TLockableItem(state)
- , VDiskId(id)
- , PDiskId(pdiskId)
- , NodeId(nodeId)
+ // SlotIdx -> VDiskID
+ THashMap<ui32, TVDiskID> VSlots;
+
+private:
+ static bool NameToId(const TString &name, TPDiskID &id);
+};
+using TPDiskInfoPtr = TIntrusivePtr<TPDiskInfo>;
+
+/**
+ * Structure to describe VDisk state. Holds state received from
+ * NodeWhiteboard and references to BSGroups VDisk is a part of.
+ */
+class TVDiskInfo : public TLockableItem {
+public:
+ TVDiskInfo(TVDiskID id = TVDiskID(), TPDiskID pdiskId = TPDiskID(), NKikimrCms::EState state = NKikimrCms::DOWN, ui32 nodeId = 0)
+ : TLockableItem(state)
+ , VDiskId(id)
+ , PDiskId(pdiskId)
+ , NodeId(nodeId)
, SlotId(0)
- {
- }
-
- TVDiskInfo(const TVDiskInfo &other) = default;
- TVDiskInfo(TVDiskInfo &&other) = default;
-
- TVDiskInfo &operator=(const TVDiskInfo &other) = default;
- TVDiskInfo &operator=(TVDiskInfo &&other) = default;
-
- TString ItemName() const override;
+ {
+ }
+
+ TVDiskInfo(const TVDiskInfo &other) = default;
+ TVDiskInfo(TVDiskInfo &&other) = default;
+
+ TVDiskInfo &operator=(const TVDiskInfo &other) = default;
+ TVDiskInfo &operator=(TVDiskInfo &&other) = default;
+
+ TString ItemName() const override;
TString PrettyItemName() const override;
- TString GetDeviceName() const;
- static bool IsDeviceName(const TString &name);
- static TVDiskID NameToId(const TString &name);
-
+ TString GetDeviceName() const;
+ static bool IsDeviceName(const TString &name);
+ static TVDiskID NameToId(const TString &name);
+
void MigrateOldInfo(const TLockableItem &old) override;
-
- TVDiskID VDiskId;
- TPDiskID PDiskId;
+
+ TVDiskID VDiskId;
+ TPDiskID PDiskId;
TString Path;
- ui32 NodeId;
+ ui32 NodeId;
TString Host;
- ui32 SlotId;
+ ui32 SlotId;
TSet<ui32> BSGroups;
-
-private:
- static bool NameToId(const TString &name, TVDiskID &id);
-};
-using TVDiskInfoPtr = TIntrusivePtr<TVDiskInfo>;
-
-/**
- * Describes type and structure of BS group.
- */
-struct TBSGroupInfo {
- TBSGroupInfo() = default;
- TBSGroupInfo(const TBSGroupInfo &other) = default;
- TBSGroupInfo(TBSGroupInfo &&other) = default;
-
- TBSGroupInfo &operator=(const TBSGroupInfo &other) = default;
- TBSGroupInfo &operator=(TBSGroupInfo &&other) = default;
-
- ui32 GroupId = 0;
- TErasureType Erasure;
+
+private:
+ static bool NameToId(const TString &name, TVDiskID &id);
+};
+using TVDiskInfoPtr = TIntrusivePtr<TVDiskInfo>;
+
+/**
+ * Describes type and structure of BS group.
+ */
+struct TBSGroupInfo {
+ TBSGroupInfo() = default;
+ TBSGroupInfo(const TBSGroupInfo &other) = default;
+ TBSGroupInfo(TBSGroupInfo &&other) = default;
+
+ TBSGroupInfo &operator=(const TBSGroupInfo &other) = default;
+ TBSGroupInfo &operator=(TBSGroupInfo &&other) = default;
+
+ ui32 GroupId = 0;
+ TErasureType Erasure;
TSet<TVDiskID> VDisks;
-};
-
-/**
- * Main class to hold current cluster state.
- *
- * State is built by merging pieces of information from NodeWhiteboard through
- * AddNode/AddTablet/AddPDisk/AddVDisk/AddBSGroup methods.
- *
- * CMS state affects cluster state via locks added by
- * AddLocks/AddExternalLocks/AddTempLocks/ScheduleActions methods.
- */
-class TClusterInfo : public TThrRefBase {
-public:
+};
+
+/**
+ * Main class to hold current cluster state.
+ *
+ * State is built by merging pieces of information from NodeWhiteboard through
+ * AddNode/AddTablet/AddPDisk/AddVDisk/AddBSGroup methods.
+ *
+ * CMS state affects cluster state via locks added by
+ * AddLocks/AddExternalLocks/AddTempLocks/ScheduleActions methods.
+ */
+class TClusterInfo : public TThrRefBase {
+public:
using TNodes = THashMap<ui32, TNodeInfoPtr>;
using TTablets = THashMap<ui64, TTabletInfo>;
- using TPDisks = THashMap<TPDiskID, TPDiskInfoPtr, TPDiskIDHash>;
+ using TPDisks = THashMap<TPDiskID, TPDiskInfoPtr, TPDiskIDHash>;
using TVDisks = THashMap<TVDiskID, TVDiskInfoPtr>;
using TBSGroups = THashMap<ui32, TBSGroupInfo>;
-
- TClusterInfo() = default;
- TClusterInfo(const TClusterInfo &other) = default;
- TClusterInfo(TClusterInfo &&other) = default;
-
- TClusterInfo &operator=(const TClusterInfo &other) = default;
- TClusterInfo &operator=(TClusterInfo &&other) = default;
-
- bool HasNode(ui32 nodeId) const
- {
+
+ TClusterInfo() = default;
+ TClusterInfo(const TClusterInfo &other) = default;
+ TClusterInfo(TClusterInfo &&other) = default;
+
+ TClusterInfo &operator=(const TClusterInfo &other) = default;
+ TClusterInfo &operator=(TClusterInfo &&other) = default;
+
+ bool HasNode(ui32 nodeId) const
+ {
return Nodes.contains(nodeId);
- }
-
- bool HasNode(const TString &hostName) const
- {
- ui32 nodeId;
- if (TryFromString(hostName, nodeId))
- return HasNode(nodeId);
+ }
+
+ bool HasNode(const TString &hostName) const
+ {
+ ui32 nodeId;
+ if (TryFromString(hostName, nodeId))
+ return HasNode(nodeId);
return HostNameToNodeId.contains(hostName);
- }
-
- const TNodeInfo &Node(ui32 nodeId) const
- {
- Y_VERIFY(HasNode(nodeId));
- return *Nodes.find(nodeId)->second;
- }
-
+ }
+
+ const TNodeInfo &Node(ui32 nodeId) const
+ {
+ Y_VERIFY(HasNode(nodeId));
+ return *Nodes.find(nodeId)->second;
+ }
+
TVector<const TNodeInfo *> HostNodes(const TString &hostName) const
- {
+ {
TVector<const TNodeInfo *> nodes;
- ui32 nodeId;
+ ui32 nodeId;
if (TryFromString(hostName, nodeId)) {
- if (HasNode(nodeId))
- nodes.push_back(&NodeRef(nodeId));
+ if (HasNode(nodeId))
+ nodes.push_back(&NodeRef(nodeId));
return nodes;
}
-
+
auto pr = HostNameToNodeId.equal_range(hostName);
for (auto it = pr.first; it != pr.second; ++it) {
nodeId = it->second;
@@ -512,8 +512,8 @@ public:
}
return nodes;
- }
-
+ }
+
TVector<const TNodeInfo *> TenantNodes(const TString &tenant) const
{
TVector<const TNodeInfo *> nodes;
@@ -528,199 +528,199 @@ public:
return nodes;
}
- size_t NodesCount() const
- {
- return Nodes.size();
- }
-
- size_t NodesCount(const TString &hostName) const
- {
- ui32 nodeId;
- if (TryFromString(hostName, nodeId))
- return HasNode(nodeId) ? 1 : 0;
-
- return HostNameToNodeId.count(hostName);
- }
-
- const TNodes &AllNodes() const
- {
- return Nodes;
- }
-
- bool HasTablet(ui64 id) const
- {
+ size_t NodesCount() const
+ {
+ return Nodes.size();
+ }
+
+ size_t NodesCount(const TString &hostName) const
+ {
+ ui32 nodeId;
+ if (TryFromString(hostName, nodeId))
+ return HasNode(nodeId) ? 1 : 0;
+
+ return HostNameToNodeId.count(hostName);
+ }
+
+ const TNodes &AllNodes() const
+ {
+ return Nodes;
+ }
+
+ bool HasTablet(ui64 id) const
+ {
return Tablets.contains(id);
- }
-
- const TTabletInfo &Tablet(ui64 id) const
- {
- Y_VERIFY(HasTablet(id));
- return Tablets.find(id)->second;
- }
-
- const TTablets &AllTablets() const
- {
- return Tablets;
- }
-
- bool HasPDisk(TPDiskID pdId) const
- {
+ }
+
+ const TTabletInfo &Tablet(ui64 id) const
+ {
+ Y_VERIFY(HasTablet(id));
+ return Tablets.find(id)->second;
+ }
+
+ const TTablets &AllTablets() const
+ {
+ return Tablets;
+ }
+
+ bool HasPDisk(TPDiskID pdId) const
+ {
return PDisks.contains(pdId);
- }
-
- bool HasPDisk(const TString &name) const
- {
- if (!TPDiskInfo::IsDeviceName(name))
- return false;
- auto id = TPDiskInfo::NameToId(name);
+ }
+
+ bool HasPDisk(const TString &name) const
+ {
+ if (!TPDiskInfo::IsDeviceName(name))
+ return false;
+ auto id = TPDiskInfo::NameToId(name);
return PDisks.contains(id);
- }
-
+ }
+
bool HasPDisk(const TString &hostName, const TString &path) const
{
return !!HostNamePathToPDiskId(hostName, path);
}
- const TPDiskInfo &PDisk(TPDiskID pdId) const
- {
- Y_VERIFY(HasPDisk(pdId));
- return *PDisks.find(pdId)->second;
- }
-
- const TPDiskInfo &PDisk(const TString &name) const
- {
- auto id = TPDiskInfo::NameToId(name);
- return PDisk(id);
- }
-
+ const TPDiskInfo &PDisk(TPDiskID pdId) const
+ {
+ Y_VERIFY(HasPDisk(pdId));
+ return *PDisks.find(pdId)->second;
+ }
+
+ const TPDiskInfo &PDisk(const TString &name) const
+ {
+ auto id = TPDiskInfo::NameToId(name);
+ return PDisk(id);
+ }
+
const TPDiskInfo &PDisk(const TString &hostName, const TString &path) const
{
return PDisk(HostNamePathToPDiskId(hostName, path));
}
- size_t PDisksCount() const
- {
- return PDisks.size();
- }
-
- const TPDisks &AllPDisks() const
- {
- return PDisks;
- }
-
- bool HasVDisk(const TVDiskID &vdId) const
- {
+ size_t PDisksCount() const
+ {
+ return PDisks.size();
+ }
+
+ const TPDisks &AllPDisks() const
+ {
+ return PDisks;
+ }
+
+ bool HasVDisk(const TVDiskID &vdId) const
+ {
return VDisks.contains(vdId);
- }
-
- bool HasVDisk(const TString &name) const
- {
- if (!TVDiskInfo::IsDeviceName(name))
- return false;
- auto id = TVDiskInfo::NameToId(name);
+ }
+
+ bool HasVDisk(const TString &name) const
+ {
+ if (!TVDiskInfo::IsDeviceName(name))
+ return false;
+ auto id = TVDiskInfo::NameToId(name);
return VDisks.contains(id);
- }
-
- const TVDiskInfo &VDisk(const TVDiskID &vdId) const
- {
- Y_VERIFY(HasVDisk(vdId));
- return *VDisks.find(vdId)->second;
- }
-
- const TVDiskInfo &VDisk(const TString &name) const
- {
- auto id = TVDiskInfo::NameToId(name);
- return VDisk(id);
- }
-
- size_t VDisksCount() const
- {
- return VDisks.size();
- }
-
- const TVDisks &AllVDisks() const
- {
- return VDisks;
- }
-
- bool HasBSGroup(ui32 groupId) const
- {
+ }
+
+ const TVDiskInfo &VDisk(const TVDiskID &vdId) const
+ {
+ Y_VERIFY(HasVDisk(vdId));
+ return *VDisks.find(vdId)->second;
+ }
+
+ const TVDiskInfo &VDisk(const TString &name) const
+ {
+ auto id = TVDiskInfo::NameToId(name);
+ return VDisk(id);
+ }
+
+ size_t VDisksCount() const
+ {
+ return VDisks.size();
+ }
+
+ const TVDisks &AllVDisks() const
+ {
+ return VDisks;
+ }
+
+ bool HasBSGroup(ui32 groupId) const
+ {
return BSGroups.contains(groupId);
- }
-
- const TBSGroupInfo &BSGroup(ui32 groupId) const
- {
- Y_VERIFY(HasBSGroup(groupId));
- return BSGroups.find(groupId)->second;
- }
-
- size_t BSGroupsCount() const
- {
- return BSGroups.size();
- }
-
- const TBSGroups &AllBSGroups() const
- {
- return BSGroups;
- }
-
- TInstant GetTimestamp() const
- {
- return Timestamp;
- }
-
- void SetTimestamp(TInstant timestamp);
-
+ }
+
+ const TBSGroupInfo &BSGroup(ui32 groupId) const
+ {
+ Y_VERIFY(HasBSGroup(groupId));
+ return BSGroups.find(groupId)->second;
+ }
+
+ size_t BSGroupsCount() const
+ {
+ return BSGroups.size();
+ }
+
+ const TBSGroups &AllBSGroups() const
+ {
+ return BSGroups;
+ }
+
+ TInstant GetTimestamp() const
+ {
+ return Timestamp;
+ }
+
+ void SetTimestamp(TInstant timestamp);
+
void AddNode(const TEvInterconnect::TNodeInfo &info, const TActorContext *ctx);
void SetNodeState(ui32 nodeId, NKikimrCms::EState state, const NKikimrWhiteboard::TSystemStateInfo &info);
- void ClearNode(ui32 nodeId);
- void AddTablet(ui32 nodeId, const NKikimrWhiteboard::TTabletStateInfo &info);
- void AddPDisk(const NKikimrBlobStorage::TBaseConfig::TPDisk &info);
- void UpdatePDiskState(const TPDiskID &id, const NKikimrWhiteboard::TPDiskStateInfo &info);
- void AddVDisk(const NKikimrBlobStorage::TBaseConfig::TVSlot &info);
- void UpdateVDiskState(const TVDiskID &id, const NKikimrWhiteboard::TVDiskStateInfo &info);
- void AddBSGroup(const NKikimrBlobStorage::TBaseConfig::TGroup &info);
+ void ClearNode(ui32 nodeId);
+ void AddTablet(ui32 nodeId, const NKikimrWhiteboard::TTabletStateInfo &info);
+ void AddPDisk(const NKikimrBlobStorage::TBaseConfig::TPDisk &info);
+ void UpdatePDiskState(const TPDiskID &id, const NKikimrWhiteboard::TPDiskStateInfo &info);
+ void AddVDisk(const NKikimrBlobStorage::TBaseConfig::TVSlot &info);
+ void UpdateVDiskState(const TVDiskID &id, const NKikimrWhiteboard::TVDiskStateInfo &info);
+ void AddBSGroup(const NKikimrBlobStorage::TBaseConfig::TGroup &info);
void AddNodeTenants(ui32 nodeId, const NKikimrTenantPool::TTenantPoolStatus &info);
-
- void AddNodeTempLock(ui32 nodeId, const NKikimrCms::TAction &action);
- void AddPDiskTempLock(TPDiskID pdiskId, const NKikimrCms::TAction &action);
- void AddVDiskTempLock(TVDiskID vdiskId, const NKikimrCms::TAction &action);
-
- ui64 AddLocks(const TPermissionInfo &permission, const TActorContext *ctx);
-
- ui64 AddLocks(const NKikimrCms::TPermission &permission, const TString &requestId,
- const TString &owner, const TActorContext *ctx)
- {
- return AddLocks({permission, requestId, owner}, ctx);
- }
-
- ui64 AddExternalLocks(const TNotificationInfo &notification, const TActorContext *ctx);
-
- void ApplyDowntimes(const TDowntimes &downtimes);
+
+ void AddNodeTempLock(ui32 nodeId, const NKikimrCms::TAction &action);
+ void AddPDiskTempLock(TPDiskID pdiskId, const NKikimrCms::TAction &action);
+ void AddVDiskTempLock(TVDiskID vdiskId, const NKikimrCms::TAction &action);
+
+ ui64 AddLocks(const TPermissionInfo &permission, const TActorContext *ctx);
+
+ ui64 AddLocks(const NKikimrCms::TPermission &permission, const TString &requestId,
+ const TString &owner, const TActorContext *ctx)
+ {
+ return AddLocks({permission, requestId, owner}, ctx);
+ }
+
+ ui64 AddExternalLocks(const TNotificationInfo &notification, const TActorContext *ctx);
+
+ void ApplyDowntimes(const TDowntimes &downtimes);
void UpdateDowntimes(TDowntimes &downtimes, const TActorContext &ctx);
-
- ui64 AddTempLocks(const NKikimrCms::TAction &action, const TActorContext *ctx);
- ui64 ScheduleActions(const TRequestInfo &request, const TActorContext *ctx);
- void UnscheduleActions(const TString &requestId);
- void DeactivateScheduledLocks(ui64 order);
- void ReactivateScheduledLocks();
-
- void RollbackLocks(ui64 point);
- ui64 PushRollbackPoint()
- {
- return ++RollbackPoint;
- }
-
+
+ ui64 AddTempLocks(const NKikimrCms::TAction &action, const TActorContext *ctx);
+ ui64 ScheduleActions(const TRequestInfo &request, const TActorContext *ctx);
+ void UnscheduleActions(const TString &requestId);
+ void DeactivateScheduledLocks(ui64 order);
+ void ReactivateScheduledLocks();
+
+ void RollbackLocks(ui64 point);
+ ui64 PushRollbackPoint()
+ {
+ return ++RollbackPoint;
+ }
+
void MigrateOldInfo(TClusterInfoPtr old);
void ApplyInitialNodeTenants(const TActorContext& ctx, const THashMap<ui32, TString>& nodeTenants);
-
- void DebugDump(const TActorContext &ctx) const;
-
+
+ void DebugDump(const TActorContext &ctx) const;
+
void SetTenantsInfo(bool value) { HasTenantsInfo = value; }
- bool IsOutdated() const { return Outdated; }
- void SetOutdated(bool val) { Outdated = val; }
-
+ bool IsOutdated() const { return Outdated; }
+ void SetOutdated(bool val) { Outdated = val; }
+
static EGroupConfigurationType VDiskConfigurationType(const TVDiskID &vdId) {
return TGroupID(vdId.GroupID).ConfigurationType();
}
@@ -728,24 +728,24 @@ public:
static bool IsStaticGroupVDisk(const TVDiskID &vdId) { return GroupConfigurationTypeStatic == VDiskConfigurationType(vdId); }
static bool IsDynamicGroupVDisk(const TVDiskID &vdId) { return GroupConfigurationTypeDynamic == VDiskConfigurationType(vdId); }
-private:
+private:
TNodeInfo &NodeRef(ui32 nodeId) const
- {
- Y_VERIFY(HasNode(nodeId));
- return *Nodes.find(nodeId)->second;
- }
-
+ {
+ Y_VERIFY(HasNode(nodeId));
+ return *Nodes.find(nodeId)->second;
+ }
+
TVector<TNodeInfo *> NodePtrs(const TString &hostName, const TServices &filterByServices = {})
- {
+ {
TVector<TNodeInfo *> nodes;
- ui32 nodeId;
+ ui32 nodeId;
if (TryFromString(hostName, nodeId)) {
- if (HasNode(nodeId))
- nodes.push_back(&NodeRef(nodeId));
+ if (HasNode(nodeId))
+ nodes.push_back(&NodeRef(nodeId));
return nodes;
}
-
+
auto range = HostNameToNodeId.equal_range(hostName);
for (auto it = range.first; it != range.second; ++it) {
nodeId = it->second;
@@ -761,38 +761,38 @@ private:
}
return nodes;
- }
-
- TPDiskInfo &PDiskRef(TPDiskID pdId)
- {
- Y_VERIFY(HasPDisk(pdId));
- return *PDisks.find(pdId)->second;
- }
-
- TPDiskInfo &PDiskRef(const TString &name)
- {
- TPDiskID id = TPDiskInfo::NameToId(name);
- return PDiskRef(id);
- }
-
- TVDiskInfo &VDiskRef(const TVDiskID &vdId)
- {
- Y_VERIFY(HasVDisk(vdId));
- return *VDisks.find(vdId)->second;
- }
-
- TVDiskInfo &VDiskRef(const TString &name)
- {
- TVDiskID id = TVDiskInfo::NameToId(name);
- return VDiskRef(id);
- }
-
- TBSGroupInfo &BSGroupRef(ui32 groupId)
- {
- Y_VERIFY(HasBSGroup(groupId));
- return BSGroups.find(groupId)->second;
- }
-
+ }
+
+ TPDiskInfo &PDiskRef(TPDiskID pdId)
+ {
+ Y_VERIFY(HasPDisk(pdId));
+ return *PDisks.find(pdId)->second;
+ }
+
+ TPDiskInfo &PDiskRef(const TString &name)
+ {
+ TPDiskID id = TPDiskInfo::NameToId(name);
+ return PDiskRef(id);
+ }
+
+ TVDiskInfo &VDiskRef(const TVDiskID &vdId)
+ {
+ Y_VERIFY(HasVDisk(vdId));
+ return *VDisks.find(vdId)->second;
+ }
+
+ TVDiskInfo &VDiskRef(const TString &name)
+ {
+ TVDiskID id = TVDiskInfo::NameToId(name);
+ return VDiskRef(id);
+ }
+
+ TBSGroupInfo &BSGroupRef(ui32 groupId)
+ {
+ Y_VERIFY(HasBSGroup(groupId));
+ return BSGroups.find(groupId)->second;
+ }
+
TPDiskID HostNamePathToPDiskId(const TString &hostName, const TString &path) const {
auto pr = HostNameToNodeId.equal_range(hostName);
for (auto it = pr.first; it != pr.second; ++it) {
@@ -810,36 +810,36 @@ private:
}
TSet<TLockableItem *> FindLockedItems(const NKikimrCms::TAction &action, const TActorContext *ctx);
-
- TNodes Nodes;
- TTablets Tablets;
- TPDisks PDisks;
- TVDisks VDisks;
- TBSGroups BSGroups;
- TInstant Timestamp;
- ui64 RollbackPoint = 0;
+
+ TNodes Nodes;
+ TTablets Tablets;
+ TPDisks PDisks;
+ TVDisks VDisks;
+ TBSGroups BSGroups;
+ TInstant Timestamp;
+ ui64 RollbackPoint = 0;
bool HasTenantsInfo = false;
- bool Outdated = false;
-
- // Fast access structures.
+ bool Outdated = false;
+
+ // Fast access structures.
TMultiMap<TString, ui32> HostNameToNodeId;
TMultiMap<TString, ui32> TenantToNodeId;
THashMap<TString, TLockableItemPtr> LockableItems;
-};
-
-inline bool ActionRequiresHost(NKikimrCms::TAction::EType type)
-{
- return type != NKikimrCms::TAction::ADD_HOST
- && type != NKikimrCms::TAction::ADD_DEVICES
- && type != NKikimrCms::TAction::REPLACE_DEVICES
- && type != NKikimrCms::TAction::REMOVE_DEVICES;
-}
-
-inline bool ActionRequiresHost(const NKikimrCms::TAction &action)
-{
- return ActionRequiresHost(action.GetType());
-}
-
-
-} // NCms
-} // NKikimr
+};
+
+inline bool ActionRequiresHost(NKikimrCms::TAction::EType type)
+{
+ return type != NKikimrCms::TAction::ADD_HOST
+ && type != NKikimrCms::TAction::ADD_DEVICES
+ && type != NKikimrCms::TAction::REPLACE_DEVICES
+ && type != NKikimrCms::TAction::REMOVE_DEVICES;
+}
+
+inline bool ActionRequiresHost(const NKikimrCms::TAction &action)
+{
+ return ActionRequiresHost(action.GetType());
+}
+
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cluster_info_ut.cpp b/ydb/core/cms/cluster_info_ut.cpp
index 3caceeb0cd1..8b9d3b3d653 100644
--- a/ydb/core/cms/cluster_info_ut.cpp
+++ b/ydb/core/cms/cluster_info_ut.cpp
@@ -1,471 +1,471 @@
-#include "cluster_info.h"
-#include "ut_helpers.h"
-
+#include "cluster_info.h"
+#include "ut_helpers.h"
+
#include <library/cpp/actors/interconnect/interconnect.h>
#include <ydb/core/node_whiteboard/node_whiteboard.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-#include <util/system/hostname.h>
-
-namespace NKikimr {
-namespace NCmsTest {
-
-using namespace NCms;
-using namespace NNodeWhiteboard;
-using namespace NKikimrWhiteboard;
-using namespace NKikimrBlobStorage;
-using namespace NKikimrCms;
-
+
+#include <util/system/hostname.h>
+
+namespace NKikimr {
+namespace NCmsTest {
+
+using namespace NCms;
+using namespace NNodeWhiteboard;
+using namespace NKikimrWhiteboard;
+using namespace NKikimrBlobStorage;
+using namespace NKikimrCms;
+
TTabletStateInfo MakeTabletInfo(ui64 id, TTabletTypes::EType type,
TTabletStateInfo::ETabletState state, bool leader)
-{
- TTabletStateInfo tablet;
- tablet.SetTabletId(id);
- tablet.SetType(type);
- tablet.SetState(state);
+{
+ TTabletStateInfo tablet;
+ tablet.SetTabletId(id);
+ tablet.SetType(type);
+ tablet.SetState(state);
tablet.SetLeader(leader);
- return tablet;
-}
-
-TBaseConfig::TPDisk MakePDiskConfig(ui32 nodeId, ui32 id)
-{
- TBaseConfig::TPDisk pdisk;
- pdisk.SetNodeId(nodeId);
- pdisk.SetPDiskId(id);
- pdisk.SetPath(Sprintf("/pdisk%" PRIu32 ".data", id));
- pdisk.SetType(ROT);
- pdisk.SetGuid(id);
- return pdisk;
-}
-
-TPDiskStateInfo MakePDiskInfo(ui32 id)
-{
- auto now = Now();
- TPDiskStateInfo pdisk;
- pdisk.SetPDiskId(id);
- pdisk.SetCreateTime(now.GetValue());
- pdisk.SetChangeTime(now.GetValue());
- pdisk.SetPath(Sprintf("/pdisk%" PRIu32 ".data", id));
- pdisk.SetGuid(id);
- pdisk.SetAvailableSize(100ULL << 30);
- pdisk.SetTotalSize(100ULL << 30);
+ return tablet;
+}
+
+TBaseConfig::TPDisk MakePDiskConfig(ui32 nodeId, ui32 id)
+{
+ TBaseConfig::TPDisk pdisk;
+ pdisk.SetNodeId(nodeId);
+ pdisk.SetPDiskId(id);
+ pdisk.SetPath(Sprintf("/pdisk%" PRIu32 ".data", id));
+ pdisk.SetType(ROT);
+ pdisk.SetGuid(id);
+ return pdisk;
+}
+
+TPDiskStateInfo MakePDiskInfo(ui32 id)
+{
+ auto now = Now();
+ TPDiskStateInfo pdisk;
+ pdisk.SetPDiskId(id);
+ pdisk.SetCreateTime(now.GetValue());
+ pdisk.SetChangeTime(now.GetValue());
+ pdisk.SetPath(Sprintf("/pdisk%" PRIu32 ".data", id));
+ pdisk.SetGuid(id);
+ pdisk.SetAvailableSize(100ULL << 30);
+ pdisk.SetTotalSize(100ULL << 30);
pdisk.SetState(NKikimrBlobStorage::TPDiskState::Normal);
- return pdisk;
-}
-
-TBaseConfig::TVSlot MakeVSlotConfig(ui32 nodeId, const TVDiskID &id, ui32 pdisk, ui32 slot)
-{
- TBaseConfig::TVSlot vdisk;
- vdisk.MutableVSlotId()->SetNodeId(nodeId);
- vdisk.MutableVSlotId()->SetPDiskId(pdisk);
- vdisk.MutableVSlotId()->SetVSlotId(slot);
- vdisk.SetGroupId(id.GroupID);
- vdisk.SetGroupGeneration(id.GroupGeneration);
- vdisk.SetFailRealmIdx(id.FailRealm);
- vdisk.SetFailDomainIdx(id.FailDomain);
- vdisk.SetVDiskIdx(id.VDisk);
- return vdisk;
-}
-
-TVDiskStateInfo MakeVDiskInfo(const TVDiskID &id, ui32 pdisk, ui32 slot)
-{
- auto now = Now();
- TVDiskStateInfo vdisk;
- VDiskIDFromVDiskID(id, vdisk.MutableVDiskId());
- vdisk.SetCreateTime(now.GetValue());
- vdisk.SetChangeTime(now.GetValue());
- vdisk.SetPDiskId(pdisk);
- vdisk.SetVDiskSlotId(slot);
- vdisk.SetVDiskState(OK);
- vdisk.SetReplicated(true);
- return vdisk;
-}
-
-void AddVDisks(TBaseConfig::TGroup &group, ui32 nodeId, ui32 pdiskId, ui32 slotId)
-{
- auto &slot = *group.AddVSlotId();
- slot.SetNodeId(nodeId);
- slot.SetPDiskId(pdiskId);
- slot.SetVSlotId(slotId);
-}
-
-template<typename... Ts>
-void AddVDisks(TBaseConfig::TGroup &group, ui32 nodeId, ui32 pdiskId, ui32 slotId, Ts... vdisks)
-{
- AddVDisks(group, nodeId, pdiskId, slotId);
- AddVDisks(group, vdisks...);
-}
-
-template<typename... Ts>
-TBaseConfig::TGroup MakeBSGroup(ui32 id, const TString &erasure, Ts... vdisks)
-{
- TBaseConfig::TGroup group;
- group.SetGroupId(id);
- group.SetErasureSpecies(erasure);
- AddVDisks(group, vdisks...);
- return group;
-}
-
-void CheckNode(const TNodeInfo &node, ui32 id, const TString &host,
- const TString &address, NKikimrCms::EState state)
-{
- UNIT_ASSERT_VALUES_EQUAL(node.NodeId, id);
- UNIT_ASSERT_VALUES_EQUAL(node.Host, host);
- UNIT_ASSERT_VALUES_EQUAL(node.Address, address);
- UNIT_ASSERT_VALUES_EQUAL(node.State, state);
-}
-
-void CheckPDisk(const TPDiskInfo &pdisk, ui32 id, ui32 nodeId, NKikimrCms::EState state,
- size_t vdisks = 0)
-{
- UNIT_ASSERT_VALUES_EQUAL(pdisk.PDiskId.DiskId, id);
- UNIT_ASSERT_VALUES_EQUAL(pdisk.PDiskId.NodeId, nodeId);
- UNIT_ASSERT_VALUES_EQUAL(pdisk.NodeId, nodeId);
- UNIT_ASSERT_VALUES_EQUAL(pdisk.State, state);
- UNIT_ASSERT_VALUES_EQUAL(pdisk.VDisks.size(), vdisks);
-}
-
-void CheckVDiskGroups(const TVDiskInfo &vdisk, ui32 group)
-{
+ return pdisk;
+}
+
+TBaseConfig::TVSlot MakeVSlotConfig(ui32 nodeId, const TVDiskID &id, ui32 pdisk, ui32 slot)
+{
+ TBaseConfig::TVSlot vdisk;
+ vdisk.MutableVSlotId()->SetNodeId(nodeId);
+ vdisk.MutableVSlotId()->SetPDiskId(pdisk);
+ vdisk.MutableVSlotId()->SetVSlotId(slot);
+ vdisk.SetGroupId(id.GroupID);
+ vdisk.SetGroupGeneration(id.GroupGeneration);
+ vdisk.SetFailRealmIdx(id.FailRealm);
+ vdisk.SetFailDomainIdx(id.FailDomain);
+ vdisk.SetVDiskIdx(id.VDisk);
+ return vdisk;
+}
+
+TVDiskStateInfo MakeVDiskInfo(const TVDiskID &id, ui32 pdisk, ui32 slot)
+{
+ auto now = Now();
+ TVDiskStateInfo vdisk;
+ VDiskIDFromVDiskID(id, vdisk.MutableVDiskId());
+ vdisk.SetCreateTime(now.GetValue());
+ vdisk.SetChangeTime(now.GetValue());
+ vdisk.SetPDiskId(pdisk);
+ vdisk.SetVDiskSlotId(slot);
+ vdisk.SetVDiskState(OK);
+ vdisk.SetReplicated(true);
+ return vdisk;
+}
+
+void AddVDisks(TBaseConfig::TGroup &group, ui32 nodeId, ui32 pdiskId, ui32 slotId)
+{
+ auto &slot = *group.AddVSlotId();
+ slot.SetNodeId(nodeId);
+ slot.SetPDiskId(pdiskId);
+ slot.SetVSlotId(slotId);
+}
+
+template<typename... Ts>
+void AddVDisks(TBaseConfig::TGroup &group, ui32 nodeId, ui32 pdiskId, ui32 slotId, Ts... vdisks)
+{
+ AddVDisks(group, nodeId, pdiskId, slotId);
+ AddVDisks(group, vdisks...);
+}
+
+template<typename... Ts>
+TBaseConfig::TGroup MakeBSGroup(ui32 id, const TString &erasure, Ts... vdisks)
+{
+ TBaseConfig::TGroup group;
+ group.SetGroupId(id);
+ group.SetErasureSpecies(erasure);
+ AddVDisks(group, vdisks...);
+ return group;
+}
+
+void CheckNode(const TNodeInfo &node, ui32 id, const TString &host,
+ const TString &address, NKikimrCms::EState state)
+{
+ UNIT_ASSERT_VALUES_EQUAL(node.NodeId, id);
+ UNIT_ASSERT_VALUES_EQUAL(node.Host, host);
+ UNIT_ASSERT_VALUES_EQUAL(node.Address, address);
+ UNIT_ASSERT_VALUES_EQUAL(node.State, state);
+}
+
+void CheckPDisk(const TPDiskInfo &pdisk, ui32 id, ui32 nodeId, NKikimrCms::EState state,
+ size_t vdisks = 0)
+{
+ UNIT_ASSERT_VALUES_EQUAL(pdisk.PDiskId.DiskId, id);
+ UNIT_ASSERT_VALUES_EQUAL(pdisk.PDiskId.NodeId, nodeId);
+ UNIT_ASSERT_VALUES_EQUAL(pdisk.NodeId, nodeId);
+ UNIT_ASSERT_VALUES_EQUAL(pdisk.State, state);
+ UNIT_ASSERT_VALUES_EQUAL(pdisk.VDisks.size(), vdisks);
+}
+
+void CheckVDiskGroups(const TVDiskInfo &vdisk, ui32 group)
+{
UNIT_ASSERT(vdisk.BSGroups.contains(group));
-}
-
-template<typename... Ts>
-void CheckVDiskGroups(const TVDiskInfo &vdisk, ui32 group, Ts... groups)
-{
- CheckVDiskGroups(vdisk, group);
- CheckVDiskGroups(vdisk, groups...);
-}
-
-template<typename... Ts>
-void CheckVDisk(const TVDiskInfo &vdisk, size_t size, Ts... groups)
-{
- UNIT_ASSERT_VALUES_EQUAL(vdisk.BSGroups.size(), size);
- CheckVDiskGroups(vdisk, groups...);
-}
-
-void CheckVDisk(const TVDiskInfo &vdisk, TVDiskID id, ui32 nodeId, NKikimrCms::EState state,
- ui32 pdisk, size_t groups = 0)
-{
- UNIT_ASSERT_VALUES_EQUAL(vdisk.VDiskId, id);
- UNIT_ASSERT_VALUES_EQUAL(vdisk.NodeId, nodeId);
- UNIT_ASSERT_VALUES_EQUAL(vdisk.State, state);
- UNIT_ASSERT_VALUES_EQUAL(vdisk.PDiskId.NodeId, nodeId);
- UNIT_ASSERT_VALUES_EQUAL(vdisk.PDiskId.DiskId, pdisk);
- UNIT_ASSERT_VALUES_EQUAL(vdisk.BSGroups.size(), groups);
-}
-
-template<typename... Ts>
-void CheckVDisk(const TVDiskInfo &vdisk, TVDiskID id, ui32 nodeId, NKikimrCms::EState state,
- ui32 pdisk, size_t groupSize, Ts... groups)
-{
- CheckVDisk(vdisk, id, nodeId, state, pdisk, groupSize);
- CheckVDiskGroups(vdisk, groups...);
-}
-
-void CheckBSGroupVDisks(const TBSGroupInfo &group, TVDiskID vdisk)
-{
+}
+
+template<typename... Ts>
+void CheckVDiskGroups(const TVDiskInfo &vdisk, ui32 group, Ts... groups)
+{
+ CheckVDiskGroups(vdisk, group);
+ CheckVDiskGroups(vdisk, groups...);
+}
+
+template<typename... Ts>
+void CheckVDisk(const TVDiskInfo &vdisk, size_t size, Ts... groups)
+{
+ UNIT_ASSERT_VALUES_EQUAL(vdisk.BSGroups.size(), size);
+ CheckVDiskGroups(vdisk, groups...);
+}
+
+void CheckVDisk(const TVDiskInfo &vdisk, TVDiskID id, ui32 nodeId, NKikimrCms::EState state,
+ ui32 pdisk, size_t groups = 0)
+{
+ UNIT_ASSERT_VALUES_EQUAL(vdisk.VDiskId, id);
+ UNIT_ASSERT_VALUES_EQUAL(vdisk.NodeId, nodeId);
+ UNIT_ASSERT_VALUES_EQUAL(vdisk.State, state);
+ UNIT_ASSERT_VALUES_EQUAL(vdisk.PDiskId.NodeId, nodeId);
+ UNIT_ASSERT_VALUES_EQUAL(vdisk.PDiskId.DiskId, pdisk);
+ UNIT_ASSERT_VALUES_EQUAL(vdisk.BSGroups.size(), groups);
+}
+
+template<typename... Ts>
+void CheckVDisk(const TVDiskInfo &vdisk, TVDiskID id, ui32 nodeId, NKikimrCms::EState state,
+ ui32 pdisk, size_t groupSize, Ts... groups)
+{
+ CheckVDisk(vdisk, id, nodeId, state, pdisk, groupSize);
+ CheckVDiskGroups(vdisk, groups...);
+}
+
+void CheckBSGroupVDisks(const TBSGroupInfo &group, TVDiskID vdisk)
+{
UNIT_ASSERT(group.VDisks.contains(vdisk));
-}
-
-template<typename... Ts>
-void CheckBSGroupVDisks(const TBSGroupInfo &group, TVDiskID vdisk, Ts... vdisks)
-{
- CheckBSGroupVDisks(group, vdisk);
- CheckBSGroupVDisks(group, vdisks...);
-}
-
-template<typename... Ts>
-void CheckBSGroup(const TBSGroupInfo &group, ui32 id, TErasureType::EErasureSpecies erasure,
- size_t size, Ts... vdisks)
-{
- UNIT_ASSERT_VALUES_EQUAL(group.GroupId, id);
- UNIT_ASSERT_VALUES_EQUAL(group.Erasure.GetErasure(), erasure);
- UNIT_ASSERT_VALUES_EQUAL(group.VDisks.size(), size);
- CheckBSGroupVDisks(group, vdisks...);
-}
-
-void AddActions(TRequestInfo &request, const NKikimrCms::TAction &action)
-{
- request.Request.AddActions()->CopyFrom(action);
-}
-
-template<typename... Ts>
-void AddActions(TRequestInfo &request, const NKikimrCms::TAction &action, Ts... actions)
-{
- AddActions(request, action);
- AddActions(request, actions...);
-}
-
-template<typename... Ts>
-TRequestInfo MakeRequest(const TString &id, const TString &owner, ui64 order, Ts... actions)
-{
- TRequestInfo res;
- res.RequestId = id;
- res.Owner = owner;
- res.Order = order;
- AddActions(res, actions...);
- return res;
-}
-
-template<typename I>
-void CheckScheduledLocks(I pos, I end, const TString &id, const TString &owner, ui64 order)
-{
- UNIT_ASSERT(pos != end);
- UNIT_ASSERT_VALUES_EQUAL(pos->RequestId, id);
- UNIT_ASSERT_VALUES_EQUAL(pos->Owner, owner);
- UNIT_ASSERT_VALUES_EQUAL(pos->Order, order);
- UNIT_ASSERT(++pos == end);
-}
-
-template<typename I, typename... Ts>
-void CheckScheduledLocks(I pos, I end, const TString &id, const TString &owner, ui64 order, Ts... locks)
-{
- UNIT_ASSERT(pos != end);
- UNIT_ASSERT_VALUES_EQUAL(pos->RequestId, id);
- UNIT_ASSERT_VALUES_EQUAL(pos->Owner, owner);
- UNIT_ASSERT_VALUES_EQUAL(pos->Order, order);
- CheckScheduledLocks(++pos, end, locks...);
-}
-
-template<typename... Ts>
-void CheckScheduledLocks(const TLockableItem &item, Ts... locks)
-{
- CheckScheduledLocks(item.ScheduledLocks.begin(), item.ScheduledLocks.end(), locks...);
-}
-
+}
+
+template<typename... Ts>
+void CheckBSGroupVDisks(const TBSGroupInfo &group, TVDiskID vdisk, Ts... vdisks)
+{
+ CheckBSGroupVDisks(group, vdisk);
+ CheckBSGroupVDisks(group, vdisks...);
+}
+
+template<typename... Ts>
+void CheckBSGroup(const TBSGroupInfo &group, ui32 id, TErasureType::EErasureSpecies erasure,
+ size_t size, Ts... vdisks)
+{
+ UNIT_ASSERT_VALUES_EQUAL(group.GroupId, id);
+ UNIT_ASSERT_VALUES_EQUAL(group.Erasure.GetErasure(), erasure);
+ UNIT_ASSERT_VALUES_EQUAL(group.VDisks.size(), size);
+ CheckBSGroupVDisks(group, vdisks...);
+}
+
+void AddActions(TRequestInfo &request, const NKikimrCms::TAction &action)
+{
+ request.Request.AddActions()->CopyFrom(action);
+}
+
+template<typename... Ts>
+void AddActions(TRequestInfo &request, const NKikimrCms::TAction &action, Ts... actions)
+{
+ AddActions(request, action);
+ AddActions(request, actions...);
+}
+
+template<typename... Ts>
+TRequestInfo MakeRequest(const TString &id, const TString &owner, ui64 order, Ts... actions)
+{
+ TRequestInfo res;
+ res.RequestId = id;
+ res.Owner = owner;
+ res.Order = order;
+ AddActions(res, actions...);
+ return res;
+}
+
+template<typename I>
+void CheckScheduledLocks(I pos, I end, const TString &id, const TString &owner, ui64 order)
+{
+ UNIT_ASSERT(pos != end);
+ UNIT_ASSERT_VALUES_EQUAL(pos->RequestId, id);
+ UNIT_ASSERT_VALUES_EQUAL(pos->Owner, owner);
+ UNIT_ASSERT_VALUES_EQUAL(pos->Order, order);
+ UNIT_ASSERT(++pos == end);
+}
+
+template<typename I, typename... Ts>
+void CheckScheduledLocks(I pos, I end, const TString &id, const TString &owner, ui64 order, Ts... locks)
+{
+ UNIT_ASSERT(pos != end);
+ UNIT_ASSERT_VALUES_EQUAL(pos->RequestId, id);
+ UNIT_ASSERT_VALUES_EQUAL(pos->Owner, owner);
+ UNIT_ASSERT_VALUES_EQUAL(pos->Order, order);
+ CheckScheduledLocks(++pos, end, locks...);
+}
+
+template<typename... Ts>
+void CheckScheduledLocks(const TLockableItem &item, Ts... locks)
+{
+ CheckScheduledLocks(item.ScheduledLocks.begin(), item.ScheduledLocks.end(), locks...);
+}
+
Y_UNIT_TEST_SUITE(TClusterInfoTest) {
Y_UNIT_TEST(DeviceId) {
- UNIT_ASSERT(!TPDiskInfo::IsDeviceName("pdisk"));
- UNIT_ASSERT(!TPDiskInfo::IsDeviceName("disk-1"));
- UNIT_ASSERT(!TPDiskInfo::IsDeviceName("pdisk-"));
- UNIT_ASSERT(!TPDiskInfo::IsDeviceName("pdisk-1l"));
- UNIT_ASSERT(!TPDiskInfo::IsDeviceName("pdisk-1-1l"));
- UNIT_ASSERT(TPDiskInfo::IsDeviceName("pdisk-1-1"));
- UNIT_ASSERT(TPDiskInfo::NameToId("pdisk-1-1") == NCms::TPDiskID(1, 1));
-
- UNIT_ASSERT(!TVDiskInfo::IsDeviceName("vdisk"));
- UNIT_ASSERT(!TVDiskInfo::IsDeviceName("vdisk-1-2-3-4"));
- UNIT_ASSERT(!TVDiskInfo::IsDeviceName("disk-1-2-3-4-5"));
- UNIT_ASSERT(!TVDiskInfo::IsDeviceName("vdisk-1-2-3-4-5-6"));
- UNIT_ASSERT(TVDiskInfo::IsDeviceName("vdisk-1-2-3-4-5"));
- UNIT_ASSERT_VALUES_EQUAL(TVDiskInfo::NameToId("vdisk-1-2-3-4-5"), TVDiskID(1, 2, 3, 4, 5));
- }
-
+ UNIT_ASSERT(!TPDiskInfo::IsDeviceName("pdisk"));
+ UNIT_ASSERT(!TPDiskInfo::IsDeviceName("disk-1"));
+ UNIT_ASSERT(!TPDiskInfo::IsDeviceName("pdisk-"));
+ UNIT_ASSERT(!TPDiskInfo::IsDeviceName("pdisk-1l"));
+ UNIT_ASSERT(!TPDiskInfo::IsDeviceName("pdisk-1-1l"));
+ UNIT_ASSERT(TPDiskInfo::IsDeviceName("pdisk-1-1"));
+ UNIT_ASSERT(TPDiskInfo::NameToId("pdisk-1-1") == NCms::TPDiskID(1, 1));
+
+ UNIT_ASSERT(!TVDiskInfo::IsDeviceName("vdisk"));
+ UNIT_ASSERT(!TVDiskInfo::IsDeviceName("vdisk-1-2-3-4"));
+ UNIT_ASSERT(!TVDiskInfo::IsDeviceName("disk-1-2-3-4-5"));
+ UNIT_ASSERT(!TVDiskInfo::IsDeviceName("vdisk-1-2-3-4-5-6"));
+ UNIT_ASSERT(TVDiskInfo::IsDeviceName("vdisk-1-2-3-4-5"));
+ UNIT_ASSERT_VALUES_EQUAL(TVDiskInfo::NameToId("vdisk-1-2-3-4-5"), TVDiskID(1, 2, 3, 4, 5));
+ }
+
Y_UNIT_TEST(FillInfo) {
- TEvInterconnect::TNodeInfo node1 =
+ TEvInterconnect::TNodeInfo node1 =
{ 1, "::1", "test1", "test1", 1, TNodeLocation() };
- TEvInterconnect::TNodeInfo node2 =
+ TEvInterconnect::TNodeInfo node2 =
{ 1, "::1", "test2", "test2", 1, TNodeLocation() };
- TEvInterconnect::TNodeInfo node3 =
+ TEvInterconnect::TNodeInfo node3 =
{ 2, "::2", "localhost", "localhost", 1, TNodeLocation() };
- TEvInterconnect::TNodeInfo node4 =
+ TEvInterconnect::TNodeInfo node4 =
{ 3, "::2", "localhost", "localhost", 1, TNodeLocation() };
-
- TClusterInfo cluster;
+
+ TClusterInfo cluster;
cluster.AddNode(node1, nullptr);
- UNIT_ASSERT(cluster.HasNode(1));
- UNIT_ASSERT(!cluster.HasNode(2));
- UNIT_ASSERT(cluster.HasNode("test1"));
- UNIT_ASSERT(!cluster.HasNode("test2"));
+ UNIT_ASSERT(cluster.HasNode(1));
+ UNIT_ASSERT(!cluster.HasNode(2));
+ UNIT_ASSERT(cluster.HasNode("test1"));
+ UNIT_ASSERT(!cluster.HasNode("test2"));
UNIT_ASSERT_VALUES_EQUAL(cluster.HostNodes("test1").size(), 1);
- CheckNode(cluster.Node(1), 1, "test1", "::1", EState::UNKNOWN);
-
+ CheckNode(cluster.Node(1), 1, "test1", "::1", EState::UNKNOWN);
+
cluster.AddNode(node2, nullptr);
- UNIT_ASSERT(cluster.HasNode(1));
- UNIT_ASSERT(!cluster.HasNode("test1"));
- UNIT_ASSERT(cluster.HasNode("test2"));
+ UNIT_ASSERT(cluster.HasNode(1));
+ UNIT_ASSERT(!cluster.HasNode("test1"));
+ UNIT_ASSERT(cluster.HasNode("test2"));
UNIT_ASSERT_VALUES_EQUAL(cluster.HostNodes("test2").size(), 1);
- CheckNode(cluster.Node(1), 1, "test2", "::1", EState::UNKNOWN);
-
+ CheckNode(cluster.Node(1), 1, "test2", "::1", EState::UNKNOWN);
+
cluster.AddNode(node3, nullptr);
- UNIT_ASSERT(cluster.HasNode(2));
- UNIT_ASSERT(cluster.HasNode("localhost"));
- UNIT_ASSERT_VALUES_EQUAL(cluster.NodesCount("localhost"), 1);
- UNIT_ASSERT_VALUES_EQUAL(cluster.HostNodes("localhost").size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(cluster.HostNodes("localhost")[0]->NodeId, 2);
- CheckNode(cluster.Node(2), 2, "localhost", "::2", EState::UNKNOWN);
-
+ UNIT_ASSERT(cluster.HasNode(2));
+ UNIT_ASSERT(cluster.HasNode("localhost"));
+ UNIT_ASSERT_VALUES_EQUAL(cluster.NodesCount("localhost"), 1);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.HostNodes("localhost").size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.HostNodes("localhost")[0]->NodeId, 2);
+ CheckNode(cluster.Node(2), 2, "localhost", "::2", EState::UNKNOWN);
+
cluster.AddNode(node4, nullptr);
- UNIT_ASSERT(cluster.HasNode(3));
- UNIT_ASSERT_VALUES_EQUAL(cluster.NodesCount("localhost"), 2);
-
- cluster.AddPDisk(MakePDiskConfig(1, 1));
- cluster.UpdatePDiskState(NCms::TPDiskID(1, 1), MakePDiskInfo(1));
- UNIT_ASSERT(cluster.HasPDisk(NCms::TPDiskID(1, 1)));
- UNIT_ASSERT(!cluster.HasPDisk(NCms::TPDiskID(1, 2)));
- UNIT_ASSERT(!cluster.HasPDisk(NCms::TPDiskID(2, 1)));
- CheckPDisk(cluster.PDisk(NCms::TPDiskID(1, 1)), 1, 1, UP, 0);
+ UNIT_ASSERT(cluster.HasNode(3));
+ UNIT_ASSERT_VALUES_EQUAL(cluster.NodesCount("localhost"), 2);
+
+ cluster.AddPDisk(MakePDiskConfig(1, 1));
+ cluster.UpdatePDiskState(NCms::TPDiskID(1, 1), MakePDiskInfo(1));
+ UNIT_ASSERT(cluster.HasPDisk(NCms::TPDiskID(1, 1)));
+ UNIT_ASSERT(!cluster.HasPDisk(NCms::TPDiskID(1, 2)));
+ UNIT_ASSERT(!cluster.HasPDisk(NCms::TPDiskID(2, 1)));
+ CheckPDisk(cluster.PDisk(NCms::TPDiskID(1, 1)), 1, 1, UP, 0);
UNIT_ASSERT(cluster.Node(1).PDisks.contains(NCms::TPDiskID(1, 1)));
-
- cluster.AddVDisk(MakeVSlotConfig(1, {0, 1, 0, 0, 0}, 1, 0));
- cluster.UpdateVDiskState({0, 1, 0, 0, 0}, MakeVDiskInfo({0, 1, 0, 0, 0}, 1, 0));
- UNIT_ASSERT(cluster.HasVDisk({0, 1, 0, 0, 0}));
- UNIT_ASSERT(!cluster.HasVDisk({0, 1, 0, 1, 0}));
- CheckVDisk(cluster.VDisk({0, 1, 0, 0, 0}), {0, 1, 0, 0, 0}, 1, UP, 1, 0);
- UNIT_ASSERT_VALUES_EQUAL(cluster.PDisk(NCms::TPDiskID(1, 1)).VDisks.size(), 1);
+
+ cluster.AddVDisk(MakeVSlotConfig(1, {0, 1, 0, 0, 0}, 1, 0));
+ cluster.UpdateVDiskState({0, 1, 0, 0, 0}, MakeVDiskInfo({0, 1, 0, 0, 0}, 1, 0));
+ UNIT_ASSERT(cluster.HasVDisk({0, 1, 0, 0, 0}));
+ UNIT_ASSERT(!cluster.HasVDisk({0, 1, 0, 1, 0}));
+ CheckVDisk(cluster.VDisk({0, 1, 0, 0, 0}), {0, 1, 0, 0, 0}, 1, UP, 1, 0);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.PDisk(NCms::TPDiskID(1, 1)).VDisks.size(), 1);
UNIT_ASSERT(cluster.PDisk(NCms::TPDiskID(1, 1)).VDisks.contains(TVDiskID(0, 1, 0, 0, 0)));
-
- cluster.AddPDisk(MakePDiskConfig(2, 2));
- cluster.UpdatePDiskState(NCms::TPDiskID(2, 2), MakePDiskInfo(2));
- UNIT_ASSERT(cluster.HasPDisk(NCms::TPDiskID(2, 2)));
- CheckPDisk(cluster.PDisk(NCms::TPDiskID(2, 2)), 2, 2, UP, 0);
-
- cluster.AddVDisk(MakeVSlotConfig(2, {0, 1, 0, 1, 0}, 2, 0));
- cluster.UpdateVDiskState({0, 1, 0, 1, 0}, MakeVDiskInfo({0, 1, 0, 1, 0}, 2, 0));
- UNIT_ASSERT(cluster.HasVDisk({0, 1, 0, 1, 0}));
- UNIT_ASSERT(cluster.HasPDisk(NCms::TPDiskID(2, 2)));
- CheckPDisk(cluster.PDisk(NCms::TPDiskID(2, 2)), 2, 2, UP, 1);
+
+ cluster.AddPDisk(MakePDiskConfig(2, 2));
+ cluster.UpdatePDiskState(NCms::TPDiskID(2, 2), MakePDiskInfo(2));
+ UNIT_ASSERT(cluster.HasPDisk(NCms::TPDiskID(2, 2)));
+ CheckPDisk(cluster.PDisk(NCms::TPDiskID(2, 2)), 2, 2, UP, 0);
+
+ cluster.AddVDisk(MakeVSlotConfig(2, {0, 1, 0, 1, 0}, 2, 0));
+ cluster.UpdateVDiskState({0, 1, 0, 1, 0}, MakeVDiskInfo({0, 1, 0, 1, 0}, 2, 0));
+ UNIT_ASSERT(cluster.HasVDisk({0, 1, 0, 1, 0}));
+ UNIT_ASSERT(cluster.HasPDisk(NCms::TPDiskID(2, 2)));
+ CheckPDisk(cluster.PDisk(NCms::TPDiskID(2, 2)), 2, 2, UP, 1);
UNIT_ASSERT(cluster.PDisk(NCms::TPDiskID(2, 2)).VDisks.contains(TVDiskID(0, 1, 0, 1, 0)));
-
- cluster.AddBSGroup(MakeBSGroup(1, "none", 1, 1, 0, 2, 2, 0));
- UNIT_ASSERT(cluster.HasBSGroup(1));
- UNIT_ASSERT(!cluster.HasBSGroup(2));
- CheckBSGroup(cluster.BSGroup(1), 1, TErasureType::ErasureNone, 2,
- TVDiskID(0, 1, 0, 0, 0), TVDiskID(0, 1, 0, 1, 0));
- CheckVDisk(cluster.VDisk({0, 1, 0, 0, 0}), 1, 1);
- CheckVDisk(cluster.VDisk({0, 1, 0, 1, 0}), 1, 1);
-
- cluster.AddPDisk(MakePDiskConfig(3, 3));
- cluster.UpdatePDiskState(NCms::TPDiskID(3, 3), MakePDiskInfo(3));
- UNIT_ASSERT(cluster.HasPDisk(NCms::TPDiskID(3, 3)));
- CheckPDisk(cluster.PDisk(NCms::TPDiskID(3, 3)), 3, 3, UP, 0);
-
- cluster.AddVDisk(MakeVSlotConfig(3, {0, 1, 0, 2, 0}, 3, 0));
- cluster.UpdateVDiskState({0, 1, 0, 2, 0}, MakeVDiskInfo({0, 1, 0, 2, 0}, 3, 0));
- UNIT_ASSERT(cluster.HasVDisk({0, 1, 0, 2, 0}));
- CheckVDisk(cluster.VDisk({0, 1, 0, 2, 0}), TVDiskID(0, 1, 0, 2, 0), 3, UP, 3, 0);
-
- cluster.AddBSGroup(MakeBSGroup(2, "none", 1, 1, 0, 3, 3, 0));
- UNIT_ASSERT(cluster.HasBSGroup(2));
- CheckBSGroup(cluster.BSGroup(2), 2, TErasureType::ErasureNone, 2,
- TVDiskID(0, 1, 0, 0, 0), TVDiskID(0, 1, 0, 2, 0));
- CheckVDisk(cluster.VDisk({0, 1, 0, 0, 0}), 2, 1, 2);
- UNIT_ASSERT(cluster.HasVDisk({0, 1, 0, 2, 0}));
- CheckVDisk(cluster.VDisk({0, 1, 0, 2, 0}), TVDiskID(0, 1, 0, 2, 0), 3, UP, 3, 1, 2);
-
+
+ cluster.AddBSGroup(MakeBSGroup(1, "none", 1, 1, 0, 2, 2, 0));
+ UNIT_ASSERT(cluster.HasBSGroup(1));
+ UNIT_ASSERT(!cluster.HasBSGroup(2));
+ CheckBSGroup(cluster.BSGroup(1), 1, TErasureType::ErasureNone, 2,
+ TVDiskID(0, 1, 0, 0, 0), TVDiskID(0, 1, 0, 1, 0));
+ CheckVDisk(cluster.VDisk({0, 1, 0, 0, 0}), 1, 1);
+ CheckVDisk(cluster.VDisk({0, 1, 0, 1, 0}), 1, 1);
+
+ cluster.AddPDisk(MakePDiskConfig(3, 3));
+ cluster.UpdatePDiskState(NCms::TPDiskID(3, 3), MakePDiskInfo(3));
+ UNIT_ASSERT(cluster.HasPDisk(NCms::TPDiskID(3, 3)));
+ CheckPDisk(cluster.PDisk(NCms::TPDiskID(3, 3)), 3, 3, UP, 0);
+
+ cluster.AddVDisk(MakeVSlotConfig(3, {0, 1, 0, 2, 0}, 3, 0));
+ cluster.UpdateVDiskState({0, 1, 0, 2, 0}, MakeVDiskInfo({0, 1, 0, 2, 0}, 3, 0));
+ UNIT_ASSERT(cluster.HasVDisk({0, 1, 0, 2, 0}));
+ CheckVDisk(cluster.VDisk({0, 1, 0, 2, 0}), TVDiskID(0, 1, 0, 2, 0), 3, UP, 3, 0);
+
+ cluster.AddBSGroup(MakeBSGroup(2, "none", 1, 1, 0, 3, 3, 0));
+ UNIT_ASSERT(cluster.HasBSGroup(2));
+ CheckBSGroup(cluster.BSGroup(2), 2, TErasureType::ErasureNone, 2,
+ TVDiskID(0, 1, 0, 0, 0), TVDiskID(0, 1, 0, 2, 0));
+ CheckVDisk(cluster.VDisk({0, 1, 0, 0, 0}), 2, 1, 2);
+ UNIT_ASSERT(cluster.HasVDisk({0, 1, 0, 2, 0}));
+ CheckVDisk(cluster.VDisk({0, 1, 0, 2, 0}), TVDiskID(0, 1, 0, 2, 0), 3, UP, 3, 1, 2);
+
cluster.AddTablet(1, MakeTabletInfo(1, TTabletTypes::Hive, TTabletStateInfo::Active, true));
- UNIT_ASSERT(cluster.HasTablet(1));
- UNIT_ASSERT(!cluster.HasTablet(2));
- UNIT_ASSERT_VALUES_EQUAL(cluster.Node(1).Tablets.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(cluster.Tablet(1).TabletId, 1);
+ UNIT_ASSERT(cluster.HasTablet(1));
+ UNIT_ASSERT(!cluster.HasTablet(2));
+ UNIT_ASSERT_VALUES_EQUAL(cluster.Node(1).Tablets.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.Tablet(1).TabletId, 1);
UNIT_ASSERT_VALUES_EQUAL(cluster.Tablet(1).Type, TTabletTypes::Hive);
- UNIT_ASSERT_VALUES_EQUAL(cluster.Tablet(1).State, TTabletStateInfo::Active);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.Tablet(1).State, TTabletStateInfo::Active);
UNIT_ASSERT_VALUES_EQUAL(cluster.Tablet(1).Leader, true);
-
- auto now = Now();
- cluster.SetTimestamp(now);
- TPermissionInfo permission;
- permission.PermissionId = "1";
- permission.Owner = "user";
- permission.Action = MakeAction(TAction::SHUTDOWN_HOST, "test1", 60000000);
- permission.Deadline = now - TDuration::Seconds(61);
- UNIT_ASSERT_VALUES_EQUAL(cluster.AddLocks(permission, nullptr), 0);
-
- permission.Action.SetHost("test2");
- UNIT_ASSERT_VALUES_EQUAL(cluster.AddLocks(permission, nullptr), 0);
-
- permission.Deadline = now + TDuration::Seconds(60);
- UNIT_ASSERT_VALUES_EQUAL(cluster.AddLocks(permission, nullptr), 1);
+
+ auto now = Now();
+ cluster.SetTimestamp(now);
+ TPermissionInfo permission;
+ permission.PermissionId = "1";
+ permission.Owner = "user";
+ permission.Action = MakeAction(TAction::SHUTDOWN_HOST, "test1", 60000000);
+ permission.Deadline = now - TDuration::Seconds(61);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.AddLocks(permission, nullptr), 0);
+
+ permission.Action.SetHost("test2");
+ UNIT_ASSERT_VALUES_EQUAL(cluster.AddLocks(permission, nullptr), 0);
+
+ permission.Deadline = now + TDuration::Seconds(60);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.AddLocks(permission, nullptr), 1);
UNIT_ASSERT_VALUES_EQUAL(cluster.HostNodes("test2").size(), 1);
UNIT_ASSERT_VALUES_EQUAL(cluster.HostNodes("test2")[0]->Lock->Action.GetType(), TAction::SHUTDOWN_HOST);
UNIT_ASSERT_VALUES_EQUAL(cluster.HostNodes("test2")[0]->Lock->ActionDeadline, now + TDuration::Minutes(2));
-
- permission.Action.SetHost("2");
- permission.Deadline = now - TDuration::Seconds(30);
+
+ permission.Action.SetHost("2");
+ permission.Deadline = now - TDuration::Seconds(30);
cluster.SetNodeState(2, DOWN, MakeSystemStateInfo("1"));
- UNIT_ASSERT_VALUES_EQUAL(cluster.AddLocks(permission, nullptr), 1);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.AddLocks(permission, nullptr), 1);
UNIT_ASSERT_VALUES_EQUAL(cluster.Node(2).State, EState::RESTART);
- UNIT_ASSERT_VALUES_EQUAL(cluster.Node(2).Lock->ActionDeadline, now + TDuration::Seconds(30));
-
- cluster.ClearNode(1);
- UNIT_ASSERT(!cluster.HasTablet(1));
- UNIT_ASSERT_VALUES_EQUAL(cluster.Node(1).Tablets.size(), 0);
- UNIT_ASSERT_VALUES_EQUAL(cluster.Node(1).State, DOWN);
-
- auto point1 = cluster.PushRollbackPoint();
- auto action1 = MakeAction(TAction::SHUTDOWN_HOST, 3, 60000000);
- UNIT_ASSERT_VALUES_EQUAL(cluster.AddTempLocks(action1, nullptr), 1);
- UNIT_ASSERT_VALUES_EQUAL(cluster.Node(3).TempLocks.size(), 1);
-
- cluster.RollbackLocks(point1);
- UNIT_ASSERT_VALUES_EQUAL(cluster.Node(3).TempLocks.size(), 0);
-
- auto point2 = cluster.PushRollbackPoint();
- auto action2 = MakeAction(TAction::REPLACE_DEVICES, 3, 60000000,
- "pdisk-1-1", "vdisk-0-1-0-1-0");
- permission.Action = action2;
- permission.Deadline = now + TDuration::Seconds(60);
- UNIT_ASSERT(!cluster.PDisk(NCms::TPDiskID(1, 1)).Lock.Defined());
- UNIT_ASSERT(!cluster.VDisk(TVDiskID(0, 1, 0, 1, 0)).Lock.Defined());
- UNIT_ASSERT_VALUES_EQUAL(cluster.AddLocks(permission, nullptr), 2);
- UNIT_ASSERT(cluster.PDisk(NCms::TPDiskID(1, 1)).Lock.Defined());
- UNIT_ASSERT(cluster.VDisk(TVDiskID(0, 1, 0, 1, 0)).Lock.Defined());
- UNIT_ASSERT_VALUES_EQUAL(cluster.AddTempLocks(action2, nullptr), 2);
- UNIT_ASSERT_VALUES_EQUAL(cluster.PDisk(NCms::TPDiskID(1, 1)).TempLocks.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(cluster.VDisk(TVDiskID(0, 1, 0, 1, 0)).TempLocks.size(), 1);
- cluster.RollbackLocks(point2);
- UNIT_ASSERT(cluster.PDisk(NCms::TPDiskID(1, 1)).Lock.Defined());
- UNIT_ASSERT(cluster.VDisk(TVDiskID(0, 1, 0, 1, 0)).Lock.Defined());
- UNIT_ASSERT_VALUES_EQUAL(cluster.PDisk(NCms::TPDiskID(1, 1)).TempLocks.size(), 0);
- UNIT_ASSERT_VALUES_EQUAL(cluster.VDisk(TVDiskID(0, 1, 0, 1, 0)).TempLocks.size(), 0);
-
- auto request1 = MakeRequest("request-1", "user-1", 1,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
- "pdisk-1-1", "vdisk-0-1-0-1-0"),
- MakeAction(TAction::SHUTDOWN_HOST, 1, 60000000));
- auto request2 = MakeRequest("request-2", "user-2", 2,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
- "pdisk-1-1", "vdisk-0-1-0-1-0"),
- MakeAction(TAction::SHUTDOWN_HOST, 3, 60000000));
- auto request3 = MakeRequest("request-3", "user-3", 3,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
- "pdisk-1-1", "vdisk-0-1-0-1-0"));
- auto request4 = MakeRequest("request-4", "user-4", 4,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
- "pdisk-1-1", "vdisk-0-1-0-1-0"));
- UNIT_ASSERT_VALUES_EQUAL(cluster.ScheduleActions(request2, nullptr), 3);
- UNIT_ASSERT_VALUES_EQUAL(cluster.ScheduleActions(request4, nullptr), 2);
- UNIT_ASSERT_VALUES_EQUAL(cluster.ScheduleActions(request3, nullptr), 2);
- UNIT_ASSERT_VALUES_EQUAL(cluster.ScheduleActions(request1, nullptr), 3);
-
- CheckScheduledLocks(cluster.Node(1), "request-1", "user-1", 1);
- CheckScheduledLocks(cluster.Node(3), "request-2", "user-2", 2);
- CheckScheduledLocks(cluster.PDisk(NCms::TPDiskID(1, 1)), "request-1", "user-1", 1,
- "request-2", "user-2", 2,
- "request-3", "user-3", 3,
- "request-4", "user-4", 4);
- CheckScheduledLocks(cluster.VDisk({0, 1, 0, 1, 0}),
- "request-1", "user-1", 1,
- "request-2", "user-2", 2,
- "request-3", "user-3", 3,
- "request-4", "user-4", 4);
-
- cluster.DeactivateScheduledLocks(request2.Order);
-
- TErrorInfo error;
- UNIT_ASSERT(cluster.Node(1).IsLocked(error, TDuration(), Now(), TDuration()));
- UNIT_ASSERT(!cluster.Node(3).IsLocked(error, TDuration(), Now(), TDuration()));
-
- cluster.ReactivateScheduledLocks();
-
- UNIT_ASSERT(cluster.Node(1).IsLocked(error, TDuration(), Now(), TDuration()));
- UNIT_ASSERT(cluster.Node(3).IsLocked(error, TDuration(), Now(), TDuration()));
-
- cluster.UnscheduleActions(request3.RequestId);
- cluster.UnscheduleActions(request2.RequestId);
-
- CheckScheduledLocks(cluster.Node(1), "request-1", "user-1", 1);
- UNIT_ASSERT(cluster.Node(3).ScheduledLocks.empty());
- CheckScheduledLocks(cluster.PDisk(NCms::TPDiskID(1, 1)), "request-1", "user-1", 1,
- "request-4", "user-4", 4);
- CheckScheduledLocks(cluster.VDisk({0, 1, 0, 1, 0}),
- "request-1", "user-1", 1,
- "request-4", "user-4", 4);
-
- }
-}
-
-} // NCmsTest
-} // NKikimr
+ UNIT_ASSERT_VALUES_EQUAL(cluster.Node(2).Lock->ActionDeadline, now + TDuration::Seconds(30));
+
+ cluster.ClearNode(1);
+ UNIT_ASSERT(!cluster.HasTablet(1));
+ UNIT_ASSERT_VALUES_EQUAL(cluster.Node(1).Tablets.size(), 0);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.Node(1).State, DOWN);
+
+ auto point1 = cluster.PushRollbackPoint();
+ auto action1 = MakeAction(TAction::SHUTDOWN_HOST, 3, 60000000);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.AddTempLocks(action1, nullptr), 1);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.Node(3).TempLocks.size(), 1);
+
+ cluster.RollbackLocks(point1);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.Node(3).TempLocks.size(), 0);
+
+ auto point2 = cluster.PushRollbackPoint();
+ auto action2 = MakeAction(TAction::REPLACE_DEVICES, 3, 60000000,
+ "pdisk-1-1", "vdisk-0-1-0-1-0");
+ permission.Action = action2;
+ permission.Deadline = now + TDuration::Seconds(60);
+ UNIT_ASSERT(!cluster.PDisk(NCms::TPDiskID(1, 1)).Lock.Defined());
+ UNIT_ASSERT(!cluster.VDisk(TVDiskID(0, 1, 0, 1, 0)).Lock.Defined());
+ UNIT_ASSERT_VALUES_EQUAL(cluster.AddLocks(permission, nullptr), 2);
+ UNIT_ASSERT(cluster.PDisk(NCms::TPDiskID(1, 1)).Lock.Defined());
+ UNIT_ASSERT(cluster.VDisk(TVDiskID(0, 1, 0, 1, 0)).Lock.Defined());
+ UNIT_ASSERT_VALUES_EQUAL(cluster.AddTempLocks(action2, nullptr), 2);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.PDisk(NCms::TPDiskID(1, 1)).TempLocks.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.VDisk(TVDiskID(0, 1, 0, 1, 0)).TempLocks.size(), 1);
+ cluster.RollbackLocks(point2);
+ UNIT_ASSERT(cluster.PDisk(NCms::TPDiskID(1, 1)).Lock.Defined());
+ UNIT_ASSERT(cluster.VDisk(TVDiskID(0, 1, 0, 1, 0)).Lock.Defined());
+ UNIT_ASSERT_VALUES_EQUAL(cluster.PDisk(NCms::TPDiskID(1, 1)).TempLocks.size(), 0);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.VDisk(TVDiskID(0, 1, 0, 1, 0)).TempLocks.size(), 0);
+
+ auto request1 = MakeRequest("request-1", "user-1", 1,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
+ "pdisk-1-1", "vdisk-0-1-0-1-0"),
+ MakeAction(TAction::SHUTDOWN_HOST, 1, 60000000));
+ auto request2 = MakeRequest("request-2", "user-2", 2,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
+ "pdisk-1-1", "vdisk-0-1-0-1-0"),
+ MakeAction(TAction::SHUTDOWN_HOST, 3, 60000000));
+ auto request3 = MakeRequest("request-3", "user-3", 3,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
+ "pdisk-1-1", "vdisk-0-1-0-1-0"));
+ auto request4 = MakeRequest("request-4", "user-4", 4,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
+ "pdisk-1-1", "vdisk-0-1-0-1-0"));
+ UNIT_ASSERT_VALUES_EQUAL(cluster.ScheduleActions(request2, nullptr), 3);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.ScheduleActions(request4, nullptr), 2);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.ScheduleActions(request3, nullptr), 2);
+ UNIT_ASSERT_VALUES_EQUAL(cluster.ScheduleActions(request1, nullptr), 3);
+
+ CheckScheduledLocks(cluster.Node(1), "request-1", "user-1", 1);
+ CheckScheduledLocks(cluster.Node(3), "request-2", "user-2", 2);
+ CheckScheduledLocks(cluster.PDisk(NCms::TPDiskID(1, 1)), "request-1", "user-1", 1,
+ "request-2", "user-2", 2,
+ "request-3", "user-3", 3,
+ "request-4", "user-4", 4);
+ CheckScheduledLocks(cluster.VDisk({0, 1, 0, 1, 0}),
+ "request-1", "user-1", 1,
+ "request-2", "user-2", 2,
+ "request-3", "user-3", 3,
+ "request-4", "user-4", 4);
+
+ cluster.DeactivateScheduledLocks(request2.Order);
+
+ TErrorInfo error;
+ UNIT_ASSERT(cluster.Node(1).IsLocked(error, TDuration(), Now(), TDuration()));
+ UNIT_ASSERT(!cluster.Node(3).IsLocked(error, TDuration(), Now(), TDuration()));
+
+ cluster.ReactivateScheduledLocks();
+
+ UNIT_ASSERT(cluster.Node(1).IsLocked(error, TDuration(), Now(), TDuration()));
+ UNIT_ASSERT(cluster.Node(3).IsLocked(error, TDuration(), Now(), TDuration()));
+
+ cluster.UnscheduleActions(request3.RequestId);
+ cluster.UnscheduleActions(request2.RequestId);
+
+ CheckScheduledLocks(cluster.Node(1), "request-1", "user-1", 1);
+ UNIT_ASSERT(cluster.Node(3).ScheduledLocks.empty());
+ CheckScheduledLocks(cluster.PDisk(NCms::TPDiskID(1, 1)), "request-1", "user-1", 1,
+ "request-4", "user-4", 4);
+ CheckScheduledLocks(cluster.VDisk({0, 1, 0, 1, 0}),
+ "request-1", "user-1", 1,
+ "request-4", "user-4", 4);
+
+ }
+}
+
+} // NCmsTest
+} // NKikimr
diff --git a/ydb/core/cms/cms.cpp b/ydb/core/cms/cms.cpp
index 0b244908187..0a205024e3c 100644
--- a/ydb/core/cms/cms.cpp
+++ b/ydb/core/cms/cms.cpp
@@ -1,189 +1,189 @@
-#include "cms_impl.h"
-#include "info_collector.h"
+#include "cms_impl.h"
+#include "info_collector.h"
#include "scheme.h"
#include "sentinel.h"
-
+
#include <ydb/core/actorlib_impl/long_timer.h>
#include <ydb/core/base/appdata.h>
#include <ydb/core/cms/console/config_helpers.h>
#include <ydb/core/base/ticket_parser.h>
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
-
+
#include <library/cpp/actors/interconnect/interconnect.h>
-
+
#include <util/generic/serialized_enum.h>
-#include <util/string/join.h>
-#include <util/system/hostname.h>
-
-namespace NKikimr {
-namespace NCms {
-
-using namespace NNodeWhiteboard;
-using namespace NKikimrCms;
-
-void TCms::TNodeCounter::CountNode(const TNodeInfo &node,
- bool ignoreDownState)
-{
- ++Total;
- TErrorInfo error;
+#include <util/string/join.h>
+#include <util/system/hostname.h>
+
+namespace NKikimr {
+namespace NCms {
+
+using namespace NNodeWhiteboard;
+using namespace NKikimrCms;
+
+void TCms::TNodeCounter::CountNode(const TNodeInfo &node,
+ bool ignoreDownState)
+{
+ ++Total;
+ TErrorInfo error;
if (node.IsLocked(error, TDuration(), TActivationContext::Now(), TDuration())) {
- ++Locked;
- if (error.Code == TStatus::DISALLOW)
- Code = error.Code;
- } else if (!ignoreDownState && node.IsDown(error, TInstant())) {
- ++Down;
- }
-}
-
-bool TCms::TNodeCounter::CheckLimit(ui32 limit,
- EAvailabilityMode mode) const
-{
- // No limit is set.
- if (!limit)
- return true;
- // Limit is OK.
- if ((Down + Locked + 1) <= limit)
- return true;
- // Allow to restart at least one node for forced restart mode.
- return (mode == MODE_FORCE_RESTART
- && !Locked);
-}
-
-bool TCms::TNodeCounter::CheckRatio(ui32 ratio,
- EAvailabilityMode mode) const
-{
- // No limit is set.
- if (!ratio)
- return true;
- // Always allow at least one node to be locked.
- if (!Down && !Locked)
- return true;
- // Limit is OK.
- if (((Down + Locked + 1) * 100) <= (Total * ratio))
- return true;
- // Allow to restart at least one node for forced restart mode.
- return (mode == MODE_FORCE_RESTART
- && !Locked);
-}
-
-void TCms::TGroupCounter::CountVDisk(const TVDiskInfo &vdisk,
- TClusterInfoPtr info,
- TDuration retryTime,
- TDuration duration)
-{
- Y_VERIFY_DEBUG(vdisk.VDiskId != VDisk.VDiskId);
-
- // Check we received info for VDisk.
- if (!vdisk.NodeId || !vdisk.PDiskId) {
- ++Down;
- Errors.push_back(Sprintf("Missing info for %s in affected group %u",
+ ++Locked;
+ if (error.Code == TStatus::DISALLOW)
+ Code = error.Code;
+ } else if (!ignoreDownState && node.IsDown(error, TInstant())) {
+ ++Down;
+ }
+}
+
+bool TCms::TNodeCounter::CheckLimit(ui32 limit,
+ EAvailabilityMode mode) const
+{
+ // No limit is set.
+ if (!limit)
+ return true;
+ // Limit is OK.
+ if ((Down + Locked + 1) <= limit)
+ return true;
+ // Allow to restart at least one node for forced restart mode.
+ return (mode == MODE_FORCE_RESTART
+ && !Locked);
+}
+
+bool TCms::TNodeCounter::CheckRatio(ui32 ratio,
+ EAvailabilityMode mode) const
+{
+ // No limit is set.
+ if (!ratio)
+ return true;
+ // Always allow at least one node to be locked.
+ if (!Down && !Locked)
+ return true;
+ // Limit is OK.
+ if (((Down + Locked + 1) * 100) <= (Total * ratio))
+ return true;
+ // Allow to restart at least one node for forced restart mode.
+ return (mode == MODE_FORCE_RESTART
+ && !Locked);
+}
+
+void TCms::TGroupCounter::CountVDisk(const TVDiskInfo &vdisk,
+ TClusterInfoPtr info,
+ TDuration retryTime,
+ TDuration duration)
+{
+ Y_VERIFY_DEBUG(vdisk.VDiskId != VDisk.VDiskId);
+
+ // Check we received info for VDisk.
+ if (!vdisk.NodeId || !vdisk.PDiskId) {
+ ++Down;
+ Errors.push_back(Sprintf("Missing info for %s in affected group %u",
vdisk.ItemName().data(), GroupId));
- return;
- }
-
- const auto &node = info->Node(vdisk.NodeId);
- const auto &pdisk = info->PDisk(vdisk.PDiskId);
-
- // Check locks.
- TErrorInfo error;
+ return;
+ }
+
+ const auto &node = info->Node(vdisk.NodeId);
+ const auto &pdisk = info->PDisk(vdisk.PDiskId);
+
+ // Check locks.
+ TErrorInfo error;
if (node.IsLocked(error, retryTime, TActivationContext::Now(), duration)
|| pdisk.IsLocked(error, retryTime, TActivationContext::Now(), duration)
|| vdisk.IsLocked(error, retryTime, TActivationContext::Now(), duration)) {
- if (error.Code == TStatus::DISALLOW)
- Code = error.Code;
- ++Locked;
- Errors.push_back(Sprintf("Issue in affected group %u: %s",
+ if (error.Code == TStatus::DISALLOW)
+ Code = error.Code;
+ ++Locked;
+ Errors.push_back(Sprintf("Issue in affected group %u: %s",
GroupId, error.Reason.data()));
- Deadline = Max(Deadline, error.Deadline);
- return;
- }
-
- // Check we received info for PDisk.
- if (!pdisk.NodeId) {
- ++Down;
- Errors.push_back(Sprintf("Missing info for %s in affected group %u",
+ Deadline = Max(Deadline, error.Deadline);
+ return;
+ }
+
+ // Check we received info for PDisk.
+ if (!pdisk.NodeId) {
+ ++Down;
+ Errors.push_back(Sprintf("Missing info for %s in affected group %u",
pdisk.ItemName().data(), GroupId));
- return;
- }
-
- // Check if disk is down.
+ return;
+ }
+
+ // Check if disk is down.
auto defaultDeadline = TActivationContext::Now() + retryTime;
- if ((node.NodeId != VDisk.NodeId && node.IsDown(error, defaultDeadline))
- || (pdisk.PDiskId != VDisk.PDiskId && pdisk.IsDown(error, defaultDeadline))
- || vdisk.IsDown(error, defaultDeadline)) {
- ++Down;
- Errors.push_back(Sprintf("Issue in affected group %u: %s",
+ if ((node.NodeId != VDisk.NodeId && node.IsDown(error, defaultDeadline))
+ || (pdisk.PDiskId != VDisk.PDiskId && pdisk.IsDown(error, defaultDeadline))
+ || vdisk.IsDown(error, defaultDeadline)) {
+ ++Down;
+ Errors.push_back(Sprintf("Issue in affected group %u: %s",
GroupId, error.Reason.data()));
- Deadline = Max(Deadline, error.Deadline);
- return;
- }
-}
-
-void TCms::OnActivateExecutor(const TActorContext &ctx)
-{
- if (AppData(ctx)->DomainsInfo->Domains.size() > 1) {
- NotSupportedReason = "Multiple domains are not supported.";
- Become(&TThis::StateNotSupported);
- return;
- }
-
- State->CmsTabletId = TabletID();
- State->CmsActorId = SelfId();
-
- SubscribeForConfig(ctx);
-
- Execute(CreateTxInitScheme(), ctx);
-}
-
-void TCms::OnDetach(const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TCms::OnDetach");
-
- Die(ctx);
-}
-
-void TCms::OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev, const TActorContext &ctx)
-{
- Y_UNUSED(ev);
-
- LOG_INFO(ctx, NKikimrServices::CMS, "OnTabletDead: %" PRIu64, TabletID());
-
- Die(ctx);
-}
-
-void TCms::Enqueue(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
-{
- Y_UNUSED(ctx);
- InitQueue.push(ev);
-}
-
-void TCms::ProcessInitQueue(const TActorContext &ctx)
-{
- while (!InitQueue.empty()) {
- TAutoPtr<IEventHandle> &ev = InitQueue.front();
- ctx.Send(ev.Release());
- InitQueue.pop();
- }
-}
-
-void TCms::SubscribeForConfig(const TActorContext &ctx)
-{
- ctx.Register(NConsole::CreateConfigSubscriber(TabletID(),
- {(ui32)NKikimrConsole::TConfigItem::CmsConfigItem},
- "",
- ctx.SelfID));
-}
-
-void TCms::AdjustInfo(TClusterInfoPtr &info, const TActorContext &ctx) const
-{
- for (const auto &entry : State->Permissions)
- info->AddLocks(entry.second, &ctx);
- for (const auto &entry : State->ScheduledRequests)
- info->ScheduleActions(entry.second, &ctx);
- for (const auto &entry : State->Notifications)
- info->AddExternalLocks(entry.second, &ctx);
-}
-
+ Deadline = Max(Deadline, error.Deadline);
+ return;
+ }
+}
+
+void TCms::OnActivateExecutor(const TActorContext &ctx)
+{
+ if (AppData(ctx)->DomainsInfo->Domains.size() > 1) {
+ NotSupportedReason = "Multiple domains are not supported.";
+ Become(&TThis::StateNotSupported);
+ return;
+ }
+
+ State->CmsTabletId = TabletID();
+ State->CmsActorId = SelfId();
+
+ SubscribeForConfig(ctx);
+
+ Execute(CreateTxInitScheme(), ctx);
+}
+
+void TCms::OnDetach(const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TCms::OnDetach");
+
+ Die(ctx);
+}
+
+void TCms::OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev, const TActorContext &ctx)
+{
+ Y_UNUSED(ev);
+
+ LOG_INFO(ctx, NKikimrServices::CMS, "OnTabletDead: %" PRIu64, TabletID());
+
+ Die(ctx);
+}
+
+void TCms::Enqueue(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
+{
+ Y_UNUSED(ctx);
+ InitQueue.push(ev);
+}
+
+void TCms::ProcessInitQueue(const TActorContext &ctx)
+{
+ while (!InitQueue.empty()) {
+ TAutoPtr<IEventHandle> &ev = InitQueue.front();
+ ctx.Send(ev.Release());
+ InitQueue.pop();
+ }
+}
+
+void TCms::SubscribeForConfig(const TActorContext &ctx)
+{
+ ctx.Register(NConsole::CreateConfigSubscriber(TabletID(),
+ {(ui32)NKikimrConsole::TConfigItem::CmsConfigItem},
+ "",
+ ctx.SelfID));
+}
+
+void TCms::AdjustInfo(TClusterInfoPtr &info, const TActorContext &ctx) const
+{
+ for (const auto &entry : State->Permissions)
+ info->AddLocks(entry.second, &ctx);
+ for (const auto &entry : State->ScheduledRequests)
+ info->ScheduleActions(entry.second, &ctx);
+ for (const auto &entry : State->Notifications)
+ info->AddExternalLocks(entry.second, &ctx);
+}
+
namespace {
THashMap<NKikimrCms::TStatus::ECode, ui32> BuildCodesRateMap(std::initializer_list<NKikimrCms::TStatus::ECode> l) {
ui32 nextCodeRate = 0;
@@ -195,11 +195,11 @@ namespace {
}
}
-bool TCms::CheckPermissionRequest(const TPermissionRequest &request,
- TPermissionResponse &response,
- TPermissionRequest &scheduled,
- const TActorContext &ctx)
-{
+bool TCms::CheckPermissionRequest(const TPermissionRequest &request,
+ TPermissionResponse &response,
+ TPermissionRequest &scheduled,
+ const TActorContext &ctx)
+{
static THashMap<EStatusCode, ui32> CodesRate = BuildCodesRateMap({
TStatus::DISALLOW_TEMP,
TStatus::ERROR_TEMP,
@@ -212,38 +212,38 @@ bool TCms::CheckPermissionRequest(const TPermissionRequest &request,
TStatus::ALLOW,
TStatus::UNKNOWN,
});
- bool allowPartial = request.GetPartialPermissionAllowed();
- bool schedule = request.GetSchedule() && !request.GetDryRun();
-
- response.MutableStatus()->SetCode(TStatus::ALLOW);
- if (schedule) {
- scheduled.SetUser(request.GetUser());
- scheduled.SetPartialPermissionAllowed(allowPartial);
- scheduled.SetSchedule(true);
- scheduled.SetReason(request.GetReason());
- if (request.HasDuration())
- scheduled.SetDuration(request.GetDuration());
- scheduled.SetTenantPolicy(request.GetTenantPolicy());
- }
-
+ bool allowPartial = request.GetPartialPermissionAllowed();
+ bool schedule = request.GetSchedule() && !request.GetDryRun();
+
+ response.MutableStatus()->SetCode(TStatus::ALLOW);
+ if (schedule) {
+ scheduled.SetUser(request.GetUser());
+ scheduled.SetPartialPermissionAllowed(allowPartial);
+ scheduled.SetSchedule(true);
+ scheduled.SetReason(request.GetReason());
+ if (request.HasDuration())
+ scheduled.SetDuration(request.GetDuration());
+ scheduled.SetTenantPolicy(request.GetTenantPolicy());
+ }
+
LOG_INFO_S(ctx, NKikimrServices::CMS,
- "Check request: " << request.ShortDebugString());
-
+ "Check request: " << request.ShortDebugString());
+
switch (request.GetAvailabilityMode()) {
- case MODE_MAX_AVAILABILITY:
- case MODE_KEEP_AVAILABLE:
- case MODE_FORCE_RESTART:
- break;
- default:
- response.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
- response.MutableStatus()
- ->SetReason(Sprintf("Unsupported availability mode: %s",
+ case MODE_MAX_AVAILABILITY:
+ case MODE_KEEP_AVAILABLE:
+ case MODE_FORCE_RESTART:
+ break;
+ default:
+ response.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+ response.MutableStatus()
+ ->SetReason(Sprintf("Unsupported availability mode: %s",
EAvailabilityMode_Name(request.GetAvailabilityMode()).data()));
- return false;
- };
-
- auto point = ClusterInfo->PushRollbackPoint();
- for (const auto &action : request.GetActions()) {
+ return false;
+ };
+
+ auto point = ClusterInfo->PushRollbackPoint();
+ for (const auto &action : request.GetActions()) {
TDuration permissionDuration = State->Config.DefaultPermissionDuration;
if (request.HasDuration())
permissionDuration = TDuration::MicroSeconds(request.GetDuration());
@@ -254,111 +254,111 @@ bool TCms::CheckPermissionRequest(const TPermissionRequest &request,
opts.TenantPolicy = request.GetTenantPolicy();
opts.AvailabilityMode = request.GetAvailabilityMode();
- TErrorInfo error;
-
+ TErrorInfo error;
+
LOG_DEBUG(ctx, NKikimrServices::CMS, "Checking action: %s", action.ShortDebugString().data());
-
+
if (CheckAction(action, opts, error)) {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Result: ALLOW");
-
- auto *permission = response.AddPermissions();
- permission->MutableAction()->CopyFrom(action);
- permission->SetDeadline(error.Deadline.GetValue());
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Result: ALLOW");
+
+ auto *permission = response.AddPermissions();
+ permission->MutableAction()->CopyFrom(action);
+ permission->SetDeadline(error.Deadline.GetValue());
AddPermissionExtensions(action, *permission);
-
- ClusterInfo->AddTempLocks(action, &ctx);
- } else {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Result: %s (reason: %s)",
+
+ ClusterInfo->AddTempLocks(action, &ctx);
+ } else {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Result: %s (reason: %s)",
ToString(error.Code).data(), error.Reason.data());
-
- if (CodesRate[response.GetStatus().GetCode()] > CodesRate[error.Code]) {
- response.MutableStatus()->SetCode(error.Code);
- response.MutableStatus()->SetReason(error.Reason);
- if (error.Code == TStatus::DISALLOW_TEMP
- || error.Code == TStatus::ERROR_TEMP)
- response.SetDeadline(error.Deadline.GetValue());
- }
-
- if (!allowPartial)
- break;
-
- if (schedule)
- scheduled.AddActions()->CopyFrom(action);
- }
- }
- ClusterInfo->RollbackLocks(point);
-
- // Handle partial permission and reject cases. Partial permission requires
- // removal of rejected action status. Reject means we have to clear all
- // permissions.
- if (response.PermissionsSize() < request.ActionsSize()) {
- if (response.PermissionsSize() && allowPartial) {
- response.MutableStatus()->SetCode(TStatus::ALLOW_PARTIAL);
- response.MutableStatus()->ClearReason();
- response.ClearDeadline();
- } else {
- response.ClearPermissions();
- }
- }
-
- // Scheduled actions were collected in the actions check loop for partial
- // permissions only. Process other cases here: schedule all actions on
- // temporary errors and nothing on other errors.
- if (schedule && response.GetStatus().GetCode() != TStatus::ALLOW_PARTIAL) {
- if (response.GetStatus().GetCode() == TStatus::DISALLOW_TEMP
- || response.GetStatus().GetCode() == TStatus::ERROR_TEMP)
- scheduled.MutableActions()->CopyFrom(request.GetActions());
- else
- scheduled.ClearActions();
- }
-
- return response.GetStatus().GetCode() == TStatus::ALLOW
- || response.GetStatus().GetCode() == TStatus::ALLOW_PARTIAL;
-}
-
-bool TCms::IsActionHostValid(const TAction &action, TErrorInfo &error) const
-{
- if (!ClusterInfo->HasNode(action.GetHost())
- && ActionRequiresHost(action)) {
+
+ if (CodesRate[response.GetStatus().GetCode()] > CodesRate[error.Code]) {
+ response.MutableStatus()->SetCode(error.Code);
+ response.MutableStatus()->SetReason(error.Reason);
+ if (error.Code == TStatus::DISALLOW_TEMP
+ || error.Code == TStatus::ERROR_TEMP)
+ response.SetDeadline(error.Deadline.GetValue());
+ }
+
+ if (!allowPartial)
+ break;
+
+ if (schedule)
+ scheduled.AddActions()->CopyFrom(action);
+ }
+ }
+ ClusterInfo->RollbackLocks(point);
+
+ // Handle partial permission and reject cases. Partial permission requires
+ // removal of rejected action status. Reject means we have to clear all
+ // permissions.
+ if (response.PermissionsSize() < request.ActionsSize()) {
+ if (response.PermissionsSize() && allowPartial) {
+ response.MutableStatus()->SetCode(TStatus::ALLOW_PARTIAL);
+ response.MutableStatus()->ClearReason();
+ response.ClearDeadline();
+ } else {
+ response.ClearPermissions();
+ }
+ }
+
+ // Scheduled actions were collected in the actions check loop for partial
+ // permissions only. Process other cases here: schedule all actions on
+ // temporary errors and nothing on other errors.
+ if (schedule && response.GetStatus().GetCode() != TStatus::ALLOW_PARTIAL) {
+ if (response.GetStatus().GetCode() == TStatus::DISALLOW_TEMP
+ || response.GetStatus().GetCode() == TStatus::ERROR_TEMP)
+ scheduled.MutableActions()->CopyFrom(request.GetActions());
+ else
+ scheduled.ClearActions();
+ }
+
+ return response.GetStatus().GetCode() == TStatus::ALLOW
+ || response.GetStatus().GetCode() == TStatus::ALLOW_PARTIAL;
+}
+
+bool TCms::IsActionHostValid(const TAction &action, TErrorInfo &error) const
+{
+ if (!ClusterInfo->HasNode(action.GetHost())
+ && ActionRequiresHost(action)) {
error.Code = TStatus::NO_SUCH_HOST;
error.Reason = Sprintf("Unknown host '%s'", action.GetHost().data());
- return false;
- }
-
- if (ClusterInfo->HasNode(action.GetHost())
- && action.GetType() == TAction::ADD_HOST) {
- error.Code = TStatus::WRONG_REQUEST;
+ return false;
+ }
+
+ if (ClusterInfo->HasNode(action.GetHost())
+ && action.GetType() == TAction::ADD_HOST) {
+ error.Code = TStatus::WRONG_REQUEST;
error.Reason = Sprintf("Host '%s' already exists", action.GetHost().data());
- return false;
- }
+ return false;
+ }
#if 0
- if (ActionRequiresHost(action)
- && ClusterInfo->NodesCount(action.GetHost()) > 1) {
- error.Code = TStatus::WRONG_REQUEST;
- error.Reason = Sprintf("Multiple nodes on host '%s'", ~action.GetHost());
- return false;
- }
+ if (ActionRequiresHost(action)
+ && ClusterInfo->NodesCount(action.GetHost()) > 1) {
+ error.Code = TStatus::WRONG_REQUEST;
+ error.Reason = Sprintf("Multiple nodes on host '%s'", ~action.GetHost());
+ return false;
+ }
#endif
- return true;
-}
-
+ return true;
+}
+
bool TCms::ParseServices(const TAction &action, TServices &services, TErrorInfo &error) const {
- for (const auto &service : action.GetServices()) {
+ for (const auto &service : action.GetServices()) {
EService value;
if (!TryFromString(service, value)) {
- error.Code = TStatus::WRONG_REQUEST;
+ error.Code = TStatus::WRONG_REQUEST;
error.Reason = Sprintf("Invalid service '%s' (supported services: %s)",
service.data(), GetEnumAllNames<EService>().data());
- return false;
- }
+ return false;
+ }
services |= value;
- }
-
- return true;
-}
-
-void TCms::AddPermissionExtensions(const TAction& action, TPermission& perm) const
+ }
+
+ return true;
+}
+
+void TCms::AddPermissionExtensions(const TAction& action, TPermission& perm) const
{
switch (action.GetType()) {
case TAction::RESTART_SERVICES:
@@ -370,10 +370,10 @@ void TCms::AddPermissionExtensions(const TAction& action, TPermission& perm) con
}
}
-void TCms::AddHostExtensions(const TString& host, TPermission& perm) const
+void TCms::AddHostExtensions(const TString& host, TPermission& perm) const
{
auto * ext = perm.AddExtentions();
- ext->SetType(HostInfo);
+ ext->SetType(HostInfo);
for (const TNodeInfo * node : ClusterInfo->HostNodes(host)) {
auto * host = ext->AddHosts();
@@ -384,61 +384,61 @@ void TCms::AddHostExtensions(const TString& host, TPermission& perm) const
}
}
-bool TCms::CheckAccess(const TString &token,
- TStatus::ECode &code,
- TString &error,
- const TActorContext &ctx)
-{
- auto *appData = AppData(ctx);
-
- if (appData->AdministrationAllowedSIDs.empty())
- return true;
-
- if (token) {
- NACLib::TUserToken userToken(token);
- for (auto &sid : appData->AdministrationAllowedSIDs)
- if (userToken.IsExist(sid))
- return true;
- }
-
- code = TStatus::UNAUTHORIZED;
- error = "You don't have permission for this operation."
- " Contact service admin for cluster management operations.";
-
- return false;
-}
-
-bool TCms::CheckAction(const TAction &action,
+bool TCms::CheckAccess(const TString &token,
+ TStatus::ECode &code,
+ TString &error,
+ const TActorContext &ctx)
+{
+ auto *appData = AppData(ctx);
+
+ if (appData->AdministrationAllowedSIDs.empty())
+ return true;
+
+ if (token) {
+ NACLib::TUserToken userToken(token);
+ for (auto &sid : appData->AdministrationAllowedSIDs)
+ if (userToken.IsExist(sid))
+ return true;
+ }
+
+ code = TStatus::UNAUTHORIZED;
+ error = "You don't have permission for this operation."
+ " Contact service admin for cluster management operations.";
+
+ return false;
+}
+
+bool TCms::CheckAction(const TAction &action,
const TActionOptions &opts,
- TErrorInfo &error) const
-{
- if (!IsActionHostValid(action, error))
- return false;
-
- switch (action.GetType()) {
- case TAction::RESTART_SERVICES:
+ TErrorInfo &error) const
+{
+ if (!IsActionHostValid(action, error))
+ return false;
+
+ switch (action.GetType()) {
+ case TAction::RESTART_SERVICES:
return CheckActionRestartServices(action, opts, error);
- case TAction::SHUTDOWN_HOST:
+ case TAction::SHUTDOWN_HOST:
return CheckActionShutdownHost(action, opts, error);
- case TAction::REPLACE_DEVICES:
+ case TAction::REPLACE_DEVICES:
return CheckActionReplaceDevices(action, opts.PermissionDuration, error);
- case TAction::START_SERVICES:
- case TAction::STOP_SERVICES:
- case TAction::ADD_HOST:
- case TAction::DECOMMISSION_HOST:
- case TAction::ADD_DEVICES:
- case TAction::REMOVE_DEVICES:
- error.Code = TStatus::ERROR;
- error.Reason = Sprintf("Unsupported action action '%s'",
+ case TAction::START_SERVICES:
+ case TAction::STOP_SERVICES:
+ case TAction::ADD_HOST:
+ case TAction::DECOMMISSION_HOST:
+ case TAction::ADD_DEVICES:
+ case TAction::REMOVE_DEVICES:
+ error.Code = TStatus::ERROR;
+ error.Reason = Sprintf("Unsupported action action '%s'",
TAction::EType_Name(action.GetType()).data());
- return false;
- default:
- error.Code = TStatus::WRONG_REQUEST;
+ return false;
+ default:
+ error.Code = TStatus::WRONG_REQUEST;
error.Reason = Sprintf("Unknown action '%s'", TAction::EType_Name(action.GetType()).data());
- return false;
- }
-}
-
+ return false;
+ }
+}
+
bool TCms::CheckActionShutdownNode(const NKikimrCms::TAction &action,
const TActionOptions &opts,
const TNodeInfo &node,
@@ -455,20 +455,20 @@ bool TCms::CheckActionShutdownNode(const NKikimrCms::TAction &action,
return true;
}
-bool TCms::CheckActionRestartServices(const TAction &action,
+bool TCms::CheckActionRestartServices(const TAction &action,
const TActionOptions &opts,
- TErrorInfo &error) const
-{
- TServices services;
- if (!ParseServices(action, services, error))
- return false;
-
- if (!services) {
- error.Code = TStatus::WRONG_REQUEST;
- error.Reason = "Empty services list";
- return false;
- }
-
+ TErrorInfo &error) const
+{
+ TServices services;
+ if (!ParseServices(action, services, error))
+ return false;
+
+ if (!services) {
+ error.Code = TStatus::WRONG_REQUEST;
+ error.Reason = "Empty services list";
+ return false;
+ }
+
bool found = false;
for (const auto node : ClusterInfo->HostNodes(action.GetHost())) {
if (node->Services & services) {
@@ -488,12 +488,12 @@ bool TCms::CheckActionRestartServices(const TAction &action,
error.Deadline = TActivationContext::Now() + opts.PermissionDuration;
return true;
-}
-
-bool TCms::CheckActionShutdownHost(const TAction &action,
+}
+
+bool TCms::CheckActionShutdownHost(const TAction &action,
const TActionOptions &opts,
- TErrorInfo &error) const
-{
+ TErrorInfo &error) const
+{
for (const auto node : ClusterInfo->HostNodes(action.GetHost())) {
if (!CheckActionShutdownNode(action, opts, *node, error)) {
return false;
@@ -501,232 +501,232 @@ bool TCms::CheckActionShutdownHost(const TAction &action,
}
error.Deadline = TActivationContext::Now() + opts.PermissionDuration;
- return true;
-}
-
-bool TCms::TryToLockNode(const TAction& action,
- const TActionOptions& opts,
- const TNodeInfo& node,
- TErrorInfo& error) const
+ return true;
+}
+
+bool TCms::TryToLockNode(const TAction& action,
+ const TActionOptions& opts,
+ const TNodeInfo& node,
+ TErrorInfo& error) const
{
- TDuration duration = TDuration::MicroSeconds(action.GetDuration());
- duration += opts.PermissionDuration;
+ TDuration duration = TDuration::MicroSeconds(action.GetDuration());
+ duration += opts.PermissionDuration;
if (node.IsLocked(error, State->Config.DefaultRetryTime, TActivationContext::Now(), duration))
- return false;
-
- ui32 tenantLimit = State->Config.TenantLimits.GetDisabledNodesLimit();
- ui32 tenantRatioLimit = State->Config.TenantLimits.GetDisabledNodesRatioLimit();
- ui32 clusterLimit = State->Config.ClusterLimits.GetDisabledNodesLimit();
- ui32 clusterRatioLimit = State->Config.ClusterLimits.GetDisabledNodesRatioLimit();
-
- // Check if limits should be checked.
- if ((opts.TenantPolicy == NONE
- || !node.Tenant
- || (!tenantLimit && !tenantRatioLimit))
- && !clusterLimit
- && !clusterRatioLimit)
+ return false;
+
+ ui32 tenantLimit = State->Config.TenantLimits.GetDisabledNodesLimit();
+ ui32 tenantRatioLimit = State->Config.TenantLimits.GetDisabledNodesRatioLimit();
+ ui32 clusterLimit = State->Config.ClusterLimits.GetDisabledNodesLimit();
+ ui32 clusterRatioLimit = State->Config.ClusterLimits.GetDisabledNodesRatioLimit();
+
+ // Check if limits should be checked.
+ if ((opts.TenantPolicy == NONE
+ || !node.Tenant
+ || (!tenantLimit && !tenantRatioLimit))
+ && !clusterLimit
+ && !clusterRatioLimit)
return true;
- TNodeCounter tenantNodes;
- TNodeCounter clusterNodes;
+ TNodeCounter tenantNodes;
+ TNodeCounter clusterNodes;
for (const auto& pr : ClusterInfo->AllNodes()) {
const auto& otherNode = pr.second;
- bool ignoreDown = node.NodeId == otherNode->NodeId;
- clusterNodes.CountNode(*otherNode, ignoreDown);
- if (node.Tenant == otherNode->Tenant)
- tenantNodes.CountNode(*otherNode, ignoreDown);
- }
-
- if (opts.TenantPolicy == DEFAULT
- && node.Tenant) {
- if (!tenantNodes.CheckLimit(tenantLimit, opts.AvailabilityMode)) {
- error.Code = tenantNodes.Code;
- error.Reason = TStringBuilder() << "Too many locked nodes for " << node.Tenant
- << " locked: " << tenantNodes.Locked
- << " down: " << tenantNodes.Down
- << " total: " << tenantNodes.Total
- << " limit: " << tenantLimit;
+ bool ignoreDown = node.NodeId == otherNode->NodeId;
+ clusterNodes.CountNode(*otherNode, ignoreDown);
+ if (node.Tenant == otherNode->Tenant)
+ tenantNodes.CountNode(*otherNode, ignoreDown);
+ }
+
+ if (opts.TenantPolicy == DEFAULT
+ && node.Tenant) {
+ if (!tenantNodes.CheckLimit(tenantLimit, opts.AvailabilityMode)) {
+ error.Code = tenantNodes.Code;
+ error.Reason = TStringBuilder() << "Too many locked nodes for " << node.Tenant
+ << " locked: " << tenantNodes.Locked
+ << " down: " << tenantNodes.Down
+ << " total: " << tenantNodes.Total
+ << " limit: " << tenantLimit;
error.Deadline = TActivationContext::Now() + State->Config.DefaultRetryTime;
- return false;
+ return false;
}
- if (!tenantNodes.CheckRatio(tenantRatioLimit, opts.AvailabilityMode)) {
- error.Code = tenantNodes.Code;
- error.Reason = TStringBuilder() << "Too many locked nodes for " << node.Tenant
- << " locked: " << tenantNodes.Locked
- << " down: " << tenantNodes.Down
- << " total: " << tenantNodes.Total
- << " limit: " << tenantRatioLimit << "%";
+ if (!tenantNodes.CheckRatio(tenantRatioLimit, opts.AvailabilityMode)) {
+ error.Code = tenantNodes.Code;
+ error.Reason = TStringBuilder() << "Too many locked nodes for " << node.Tenant
+ << " locked: " << tenantNodes.Locked
+ << " down: " << tenantNodes.Down
+ << " total: " << tenantNodes.Total
+ << " limit: " << tenantRatioLimit << "%";
error.Deadline = TActivationContext::Now() + State->Config.DefaultRetryTime;
- return false;
- }
+ return false;
+ }
}
- if (!clusterNodes.CheckLimit(clusterLimit, opts.AvailabilityMode)) {
- error.Code = clusterNodes.Code;
- error.Reason = TStringBuilder() << "Too many locked nodes"
- << " locked: " << clusterNodes.Locked
- << " down: " << clusterNodes.Down
- << " total: " << clusterNodes.Total
- << " limit: " << clusterLimit;
+ if (!clusterNodes.CheckLimit(clusterLimit, opts.AvailabilityMode)) {
+ error.Code = clusterNodes.Code;
+ error.Reason = TStringBuilder() << "Too many locked nodes"
+ << " locked: " << clusterNodes.Locked
+ << " down: " << clusterNodes.Down
+ << " total: " << clusterNodes.Total
+ << " limit: " << clusterLimit;
error.Deadline = TActivationContext::Now() + State->Config.DefaultRetryTime;
return false;
}
- if (!clusterNodes.CheckRatio(clusterRatioLimit, opts.AvailabilityMode)) {
- error.Code = clusterNodes.Code;
- error.Reason = TStringBuilder() << "Too many locked nodes"
- << " locked: " << clusterNodes.Locked
- << " down: " << clusterNodes.Down
- << " total: " << clusterNodes.Total
- << " limit: " << clusterRatioLimit << "%";
+ if (!clusterNodes.CheckRatio(clusterRatioLimit, opts.AvailabilityMode)) {
+ error.Code = clusterNodes.Code;
+ error.Reason = TStringBuilder() << "Too many locked nodes"
+ << " locked: " << clusterNodes.Locked
+ << " down: " << clusterNodes.Down
+ << " total: " << clusterNodes.Total
+ << " limit: " << clusterRatioLimit << "%";
error.Deadline = TActivationContext::Now() + State->Config.DefaultRetryTime;
- return false;
- }
+ return false;
+ }
return true;
}
-bool TCms::TryToLockPDisk(const TAction &action,
- const TActionOptions& opts,
- const TPDiskInfo &pdisk,
- TErrorInfo &error) const
-{
- if (!TryToLockVDisks(action, opts, pdisk.VDisks, error))
- return false;
-
+bool TCms::TryToLockPDisk(const TAction &action,
+ const TActionOptions& opts,
+ const TPDiskInfo &pdisk,
+ TErrorInfo &error) const
+{
+ if (!TryToLockVDisks(action, opts, pdisk.VDisks, error))
+ return false;
+
error.Deadline = TActivationContext::Now() + opts.PermissionDuration;
- return true;
-}
-
-bool TCms::TryToLockVDisks(const TAction &action,
- const TActionOptions& opts,
+ return true;
+}
+
+bool TCms::TryToLockVDisks(const TAction &action,
+ const TActionOptions& opts,
const TSet<TVDiskID> &vdisks,
- TErrorInfo &error) const
-{
+ TErrorInfo &error) const
+{
TDuration duration = TDuration::MicroSeconds(action.GetDuration());
- duration += opts.PermissionDuration;
-
- auto res = true;
- auto point = ClusterInfo->PushRollbackPoint();
- for (const auto &vdId : vdisks) {
- const auto &vdisk = ClusterInfo->VDisk(vdId);
- if (TryToLockVDisk(opts, vdisk, duration, error)) {
- ClusterInfo->AddVDiskTempLock(vdId, action);
- } else {
- res = false;
- break;
- }
- }
- ClusterInfo->RollbackLocks(point);
-
- return res;
-}
-
-bool TCms::TryToLockVDisk(const TActionOptions& opts,
- const TVDiskInfo &vdisk,
- TDuration duration,
- TErrorInfo &error) const
-{
+ duration += opts.PermissionDuration;
+
+ auto res = true;
+ auto point = ClusterInfo->PushRollbackPoint();
+ for (const auto &vdId : vdisks) {
+ const auto &vdisk = ClusterInfo->VDisk(vdId);
+ if (TryToLockVDisk(opts, vdisk, duration, error)) {
+ ClusterInfo->AddVDiskTempLock(vdId, action);
+ } else {
+ res = false;
+ break;
+ }
+ }
+ ClusterInfo->RollbackLocks(point);
+
+ return res;
+}
+
+bool TCms::TryToLockVDisk(const TActionOptions& opts,
+ const TVDiskInfo &vdisk,
+ TDuration duration,
+ TErrorInfo &error) const
+{
if (vdisk.IsLocked(error, State->Config.DefaultRetryTime, TActivationContext::Now(), duration))
- return false;
-
- if (vdisk.NodeId
- && ClusterInfo->Node(vdisk.NodeId)
+ return false;
+
+ if (vdisk.NodeId
+ && ClusterInfo->Node(vdisk.NodeId)
.IsLocked(error, State->Config.DefaultRetryTime, TActivationContext::Now(), duration))
- return false;
-
- if (vdisk.PDiskId
- && ClusterInfo->PDisk(vdisk.PDiskId)
+ return false;
+
+ if (vdisk.PDiskId
+ && ClusterInfo->PDisk(vdisk.PDiskId)
.IsLocked(error, State->Config.DefaultRetryTime, TActivationContext::Now(), duration))
- return false;
-
- for (auto groupId : vdisk.BSGroups) {
- const auto &group = ClusterInfo->BSGroup(groupId);
+ return false;
+
+ for (auto groupId : vdisk.BSGroups) {
+ const auto &group = ClusterInfo->BSGroup(groupId);
TInstant defaultDeadline = TActivationContext::Now() + State->Config.DefaultRetryTime;
-
- if (group.Erasure.GetErasure() == TErasureType::ErasureSpeciesCount) {
- error.Code = TStatus::ERROR;
- error.Reason = Sprintf("Affected group %u has unknown erasure type", groupId);
- error.Deadline = defaultDeadline;
- return false;
- }
-
- if (opts.AvailabilityMode != MODE_FORCE_RESTART
- && !group.Erasure.ParityParts()) {
- error.Code = TStatus::DISALLOW;
- error.Reason = Sprintf("Affected group %u has no parity parts", groupId);
- error.Deadline = defaultDeadline;
- return false;
- }
-
- TGroupCounter counters(vdisk, groupId, defaultDeadline);
- for (const auto &vdId : group.VDisks) {
- if (vdId != vdisk.VDiskId)
- counters.CountVDisk(ClusterInfo->VDisk(vdId), ClusterInfo,
- State->Config.DefaultRetryTime, duration);
- }
-
- // Check if group already has locked disks.
+
+ if (group.Erasure.GetErasure() == TErasureType::ErasureSpeciesCount) {
+ error.Code = TStatus::ERROR;
+ error.Reason = Sprintf("Affected group %u has unknown erasure type", groupId);
+ error.Deadline = defaultDeadline;
+ return false;
+ }
+
+ if (opts.AvailabilityMode != MODE_FORCE_RESTART
+ && !group.Erasure.ParityParts()) {
+ error.Code = TStatus::DISALLOW;
+ error.Reason = Sprintf("Affected group %u has no parity parts", groupId);
+ error.Deadline = defaultDeadline;
+ return false;
+ }
+
+ TGroupCounter counters(vdisk, groupId, defaultDeadline);
+ for (const auto &vdId : group.VDisks) {
+ if (vdId != vdisk.VDiskId)
+ counters.CountVDisk(ClusterInfo->VDisk(vdId), ClusterInfo,
+ State->Config.DefaultRetryTime, duration);
+ }
+
+ // Check if group already has locked disks.
if (counters.Locked && counters.Code == TStatus::DISALLOW) {
- error.Code = counters.Code;
- error.Reason = JoinSeq("\n", counters.Errors);
- error.Deadline = counters.Deadline;
- return false;
- }
-
- switch (opts.AvailabilityMode) {
- case MODE_MAX_AVAILABILITY:
+ error.Code = counters.Code;
+ error.Reason = JoinSeq("\n", counters.Errors);
+ error.Deadline = counters.Deadline;
+ return false;
+ }
+
+ switch (opts.AvailabilityMode) {
+ case MODE_MAX_AVAILABILITY:
if ((counters.Down + counters.Locked) > 0) {
- Y_VERIFY(counters.Code == TStatus::DISALLOW_TEMP);
- error.Code = TStatus::DISALLOW_TEMP;
- error.Reason = JoinSeq("\n", counters.Errors);
- error.Deadline = counters.Deadline;
- return false;
- }
- break;
- case MODE_KEEP_AVAILABLE:
+ Y_VERIFY(counters.Code == TStatus::DISALLOW_TEMP);
+ error.Code = TStatus::DISALLOW_TEMP;
+ error.Reason = JoinSeq("\n", counters.Errors);
+ error.Deadline = counters.Deadline;
+ return false;
+ }
+ break;
+ case MODE_KEEP_AVAILABLE:
if ((counters.Down + counters.Locked) >= group.Erasure.ParityParts()) {
- Y_VERIFY(counters.Code == TStatus::DISALLOW_TEMP);
- error.Code = TStatus::DISALLOW_TEMP;
- error.Reason = JoinSeq("\n", counters.Errors);
- error.Deadline = counters.Deadline;
- return false;
- }
- break;
- case MODE_FORCE_RESTART:
- // Any number of down disks is OK for this mode.
- break;
- default:
- error.Code = TStatus::WRONG_REQUEST;
- error.Reason = Sprintf("Unknown availability mode: %s (%" PRIu32 ")",
+ Y_VERIFY(counters.Code == TStatus::DISALLOW_TEMP);
+ error.Code = TStatus::DISALLOW_TEMP;
+ error.Reason = JoinSeq("\n", counters.Errors);
+ error.Deadline = counters.Deadline;
+ return false;
+ }
+ break;
+ case MODE_FORCE_RESTART:
+ // Any number of down disks is OK for this mode.
+ break;
+ default:
+ error.Code = TStatus::WRONG_REQUEST;
+ error.Reason = Sprintf("Unknown availability mode: %s (%" PRIu32 ")",
EAvailabilityMode_Name(opts.AvailabilityMode).data(),
- static_cast<ui32>(opts.AvailabilityMode));
- error.Deadline = defaultDeadline;
- return false;
- }
- }
-
- return true;
-}
-
-bool TCms::CheckActionReplaceDevices(const TAction &action,
- const TActionOptions &opts,
- TErrorInfo &error) const
-{
- auto point = ClusterInfo->PushRollbackPoint();
- bool res = true;
+ static_cast<ui32>(opts.AvailabilityMode));
+ error.Deadline = defaultDeadline;
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool TCms::CheckActionReplaceDevices(const TAction &action,
+ const TActionOptions &opts,
+ TErrorInfo &error) const
+{
+ auto point = ClusterInfo->PushRollbackPoint();
+ bool res = true;
TDuration duration = TDuration::MicroSeconds(action.GetDuration());
- duration += opts.PermissionDuration;
-
- for (const auto &device : action.GetDevices()) {
- if (ClusterInfo->HasPDisk(device)) {
- const auto &pdisk = ClusterInfo->PDisk(device);
- if (TryToLockPDisk(action, opts, pdisk, error))
- ClusterInfo->AddPDiskTempLock(pdisk.PDiskId, action);
- else {
- res = false;
- break;
- }
+ duration += opts.PermissionDuration;
+
+ for (const auto &device : action.GetDevices()) {
+ if (ClusterInfo->HasPDisk(device)) {
+ const auto &pdisk = ClusterInfo->PDisk(device);
+ if (TryToLockPDisk(action, opts, pdisk, error))
+ ClusterInfo->AddPDiskTempLock(pdisk.PDiskId, action);
+ else {
+ res = false;
+ break;
+ }
} else if (ClusterInfo->HasPDisk(action.GetHost(), device)) {
const auto &pdisk = ClusterInfo->PDisk(action.GetHost(), device);
if (TryToLockPDisk(action, opts, pdisk, error))
@@ -735,37 +735,37 @@ bool TCms::CheckActionReplaceDevices(const TAction &action,
res = false;
break;
}
- } else if (ClusterInfo->HasVDisk(device)) {
- const auto &vdisk = ClusterInfo->VDisk(device);
- if (TryToLockVDisk(opts, vdisk, duration, error))
- ClusterInfo->AddVDiskTempLock(vdisk.VDiskId, action);
- else {
- res = false;
- break;
- }
- } else {
+ } else if (ClusterInfo->HasVDisk(device)) {
+ const auto &vdisk = ClusterInfo->VDisk(device);
+ if (TryToLockVDisk(opts, vdisk, duration, error))
+ ClusterInfo->AddVDiskTempLock(vdisk.VDiskId, action);
+ else {
+ res = false;
+ break;
+ }
+ } else {
error.Code = TStatus::NO_SUCH_DEVICE;
- error.Reason = Sprintf("Unknown device %s (use cluster state command"
+ error.Reason = Sprintf("Unknown device %s (use cluster state command"
" to get list of known devices)", device.data());
- res = false;
- }
- }
- ClusterInfo->RollbackLocks(point);
-
- if (res)
+ res = false;
+ }
+ }
+ ClusterInfo->RollbackLocks(point);
+
+ if (res)
error.Deadline = TActivationContext::Now() + opts.PermissionDuration;
-
- return res;
-}
-
-void TCms::AcceptPermissions(TPermissionResponse &resp, const TString &requestId,
+
+ return res;
+}
+
+void TCms::AcceptPermissions(TPermissionResponse &resp, const TString &requestId,
const TString &owner, const TActorContext &ctx, bool check)
-{
- for (size_t i = 0; i < resp.PermissionsSize(); ++i) {
- auto &permission = *resp.MutablePermissions(i);
- permission.SetId(owner + "-p-" + ToString(State->NextPermissionId++));
- State->Permissions.emplace(permission.GetId(), TPermissionInfo(permission, requestId, owner));
- ClusterInfo->AddLocks(permission, requestId, owner, &ctx);
+{
+ for (size_t i = 0; i < resp.PermissionsSize(); ++i) {
+ auto &permission = *resp.MutablePermissions(i);
+ permission.SetId(owner + "-p-" + ToString(State->NextPermissionId++));
+ State->Permissions.emplace(permission.GetId(), TPermissionInfo(permission, requestId, owner));
+ ClusterInfo->AddLocks(permission, requestId, owner, &ctx);
if (!check || owner != WALLE_CMS_USER) {
continue;
@@ -784,183 +784,183 @@ void TCms::AcceptPermissions(TPermissionResponse &resp, const TString &requestId
}
taskIt->second.Permissions.insert(permission.GetId());
- }
-}
-
+ }
+}
+
void TCms::ScheduleUpdateClusterInfo(const TActorContext &ctx, bool now)
{
ctx.Schedule(now ? TDuration::Zero() : TDuration::Minutes(1),
new TEvPrivate::TEvUpdateClusterInfo());
}
-void TCms::ScheduleCleanup(TInstant time, const TActorContext &ctx)
-{
- // Don't schedule event in the past or earlier then already
- // scheduled one. Also limit events rate.
- auto now = ctx.Now();
- time = Max(time, now + TDuration::Seconds(1));
- if (!ScheduledCleanups.empty()
- && ScheduledCleanups.top() <= (time + TDuration::Seconds(1)))
- return;
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS, "Schedule cleanup at " << time);
-
- ScheduledCleanups.push(time);
- ctx.Schedule(time - now, new TEvPrivate::TEvCleanupExpired);
-
-}
-
-void TCms::SchedulePermissionsCleanup(const TActorContext &ctx)
-{
- if (State->Permissions.empty())
- return;
-
- TInstant earliest = TInstant::Max();
- for (const auto &entry : State->Permissions) {
+void TCms::ScheduleCleanup(TInstant time, const TActorContext &ctx)
+{
+ // Don't schedule event in the past or earlier then already
+ // scheduled one. Also limit events rate.
+ auto now = ctx.Now();
+ time = Max(time, now + TDuration::Seconds(1));
+ if (!ScheduledCleanups.empty()
+ && ScheduledCleanups.top() <= (time + TDuration::Seconds(1)))
+ return;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS, "Schedule cleanup at " << time);
+
+ ScheduledCleanups.push(time);
+ ctx.Schedule(time - now, new TEvPrivate::TEvCleanupExpired);
+
+}
+
+void TCms::SchedulePermissionsCleanup(const TActorContext &ctx)
+{
+ if (State->Permissions.empty())
+ return;
+
+ TInstant earliest = TInstant::Max();
+ for (const auto &entry : State->Permissions) {
const TDuration duration = TDuration::MicroSeconds(entry.second.Action.GetDuration());
const TDuration doubleDuration = ((TDuration::Max() / 2) >= duration ? (2 * duration) : TDuration::Max());
const TInstant deadline = entry.second.Deadline;
earliest = Min(earliest, deadline + doubleDuration);
- }
-
- ScheduleCleanup(earliest, ctx);
-}
-
-void TCms::ScheduleNotificationsCleanup(const TActorContext &ctx)
-{
- if (State->Notifications.empty())
- return;
-
- TInstant earliest = TInstant::Max();
- for (const auto &entry : State->Notifications) {
+ }
+
+ ScheduleCleanup(earliest, ctx);
+}
+
+void TCms::ScheduleNotificationsCleanup(const TActorContext &ctx)
+{
+ if (State->Notifications.empty())
+ return;
+
+ TInstant earliest = TInstant::Max();
+ for (const auto &entry : State->Notifications) {
TInstant start = TInstant::MicroSeconds(entry.second.Notification.GetTime());
- for (const auto &action : entry.second.Notification.GetActions()) {
+ for (const auto &action : entry.second.Notification.GetActions()) {
TDuration duration = TDuration::MicroSeconds(action.GetDuration());
- Y_VERIFY(duration);
- earliest = Min(earliest, start + duration);
- }
- }
-
- ScheduleCleanup(earliest, ctx);
-}
-
-void TCms::CleanupLog(const TActorContext &ctx)
-{
- Execute(CreateTxLogCleanup(), ctx);
-}
-
-void TCms::ScheduleLogCleanup(const TActorContext &ctx)
-{
- LogCleanupTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
- CreateLongTimer(ctx, TDuration::Minutes(10),
- new IEventHandle(ctx.SelfID, ctx.SelfID, new TEvPrivate::TEvCleanupLog),
- AppData(ctx)->SystemPoolId,
- LogCleanupTimerCookieHolder.Get());
-}
-
-void TCms::CleanupExpired(const TActorContext &ctx)
-{
- DoPermissionsCleanup(ctx);
- Execute(CreateTxRemoveExpiredNotifications(), ctx);
-
- SchedulePermissionsCleanup(ctx);
- ScheduleNotificationsCleanup(ctx);
-}
-
-void TCms::DoPermissionsCleanup(const TActorContext &ctx)
-{
- ScheduledCleanups.pop();
-
+ Y_VERIFY(duration);
+ earliest = Min(earliest, start + duration);
+ }
+ }
+
+ ScheduleCleanup(earliest, ctx);
+}
+
+void TCms::CleanupLog(const TActorContext &ctx)
+{
+ Execute(CreateTxLogCleanup(), ctx);
+}
+
+void TCms::ScheduleLogCleanup(const TActorContext &ctx)
+{
+ LogCleanupTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
+ CreateLongTimer(ctx, TDuration::Minutes(10),
+ new IEventHandle(ctx.SelfID, ctx.SelfID, new TEvPrivate::TEvCleanupLog),
+ AppData(ctx)->SystemPoolId,
+ LogCleanupTimerCookieHolder.Get());
+}
+
+void TCms::CleanupExpired(const TActorContext &ctx)
+{
+ DoPermissionsCleanup(ctx);
+ Execute(CreateTxRemoveExpiredNotifications(), ctx);
+
+ SchedulePermissionsCleanup(ctx);
+ ScheduleNotificationsCleanup(ctx);
+}
+
+void TCms::DoPermissionsCleanup(const TActorContext &ctx)
+{
+ ScheduledCleanups.pop();
+
TVector<TString> ids;
- auto now = ctx.Now();
- for (const auto &entry : State->Permissions) {
+ auto now = ctx.Now();
+ for (const auto &entry : State->Permissions) {
const TDuration duration = TDuration::MicroSeconds(entry.second.Action.GetDuration());
const TDuration doubleDuration = ((TDuration::Max() / 2) >= duration ? (2 * duration) : TDuration::Max());
const TInstant deadline(entry.second.Deadline);
if ((deadline + doubleDuration) <= now)
- ids.push_back(entry.first);
- }
-
+ ids.push_back(entry.first);
+ }
+
Execute(CreateTxRemovePermissions(std::move(ids), nullptr, nullptr, true), ctx);
-}
-
-void TCms::CleanupWalleTasks(const TActorContext &ctx)
-{
- LOG_DEBUG_S(ctx, NKikimrServices::CMS, "Running CleanupWalleTasks");
-
- // Wall-E tasks are updated separately from its request and
- // permissions which means we might have some Wall-E requests
- // not attached to Wall-E tasks and Wall-E tasks with no
- // request and permissions. Cleanup the mess here.
+}
+
+void TCms::CleanupWalleTasks(const TActorContext &ctx)
+{
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS, "Running CleanupWalleTasks");
+
+ // Wall-E tasks are updated separately from its request and
+ // permissions which means we might have some Wall-E requests
+ // not attached to Wall-E tasks and Wall-E tasks with no
+ // request and permissions. Cleanup the mess here.
TVector<TString> requestsToRemove;
- for (const auto &entry : State->ScheduledRequests) {
- const auto &request = entry.second;
- if (request.Owner == WALLE_CMS_USER
+ for (const auto &entry : State->ScheduledRequests) {
+ const auto &request = entry.second;
+ if (request.Owner == WALLE_CMS_USER
&& !State->WalleRequests.contains(request.RequestId))
requestsToRemove.push_back(request.RequestId);
- }
-
+ }
+
for (const auto &requestId : requestsToRemove) {
Execute(CreateTxRemoveRequest(requestId, nullptr, nullptr), ctx);
}
TVector<TString> permissionsToRemove;
- for (const auto &entry : State->Permissions) {
- const auto &permission = entry.second;
- if (permission.Owner == WALLE_CMS_USER
+ for (const auto &entry : State->Permissions) {
+ const auto &permission = entry.second;
+ if (permission.Owner == WALLE_CMS_USER
&& !State->WalleRequests.contains(permission.RequestId))
permissionsToRemove.push_back(permission.PermissionId);
- }
-
+ }
+
if (!permissionsToRemove.empty())
Execute(CreateTxRemovePermissions(permissionsToRemove, nullptr, nullptr), ctx);
-
- RemoveEmptyWalleTasks(ctx);
-
- WalleCleanupTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
- CreateLongTimer(ctx, State->Config.DefaultWalleCleanupPeriod,
- new IEventHandle(ctx.SelfID, ctx.SelfID, new TEvPrivate::TEvCleanupWalle),
- AppData(ctx)->SystemPoolId,
- WalleCleanupTimerCookieHolder.Get());
-}
-
-void TCms::RemoveEmptyWalleTasks(const TActorContext &ctx)
-{
- TVector<TString> tasksToRemove;
- for (const auto &entry : State->WalleTasks) {
- const auto &task = entry.second;
+
+ RemoveEmptyWalleTasks(ctx);
+
+ WalleCleanupTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
+ CreateLongTimer(ctx, State->Config.DefaultWalleCleanupPeriod,
+ new IEventHandle(ctx.SelfID, ctx.SelfID, new TEvPrivate::TEvCleanupWalle),
+ AppData(ctx)->SystemPoolId,
+ WalleCleanupTimerCookieHolder.Get());
+}
+
+void TCms::RemoveEmptyWalleTasks(const TActorContext &ctx)
+{
+ TVector<TString> tasksToRemove;
+ for (const auto &entry : State->WalleTasks) {
+ const auto &task = entry.second;
if (!State->ScheduledRequests.contains(task.RequestId) && task.Permissions.empty()) {
LOG_DEBUG(ctx, NKikimrServices::CMS, "Found empty task %s", task.TaskId.data());
- tasksToRemove.push_back(task.TaskId);
- }
- }
-
- for (auto &id : tasksToRemove)
- Execute(CreateTxRemoveWalleTask(id), ctx);
-}
-
-void TCms::Cleanup(const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TCms::Cleanup");
-
+ tasksToRemove.push_back(task.TaskId);
+ }
+ }
+
+ for (auto &id : tasksToRemove)
+ Execute(CreateTxRemoveWalleTask(id), ctx);
+}
+
+void TCms::Cleanup(const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TCms::Cleanup");
+
if (State->Sentinel)
ctx.Send(State->Sentinel, new TEvents::TEvPoisonPill);
-}
-
-void TCms::Die(const TActorContext& ctx)
-{
- Cleanup(ctx);
- TActorBase::Die(ctx);
-}
-
-void TCms::AddHostState(const TNodeInfo &node, TClusterStateResponse &resp, TInstant timestamp)
-{
- auto *host = resp.MutableState()->AddHosts();
- host->SetName(node.Host);
- host->SetState(node.State);
- host->SetNodeId(node.NodeId);
- host->SetInterconnectPort(node.IcPort);
- host->SetTimestamp(timestamp.GetValue());
+}
+
+void TCms::Die(const TActorContext& ctx)
+{
+ Cleanup(ctx);
+ TActorBase::Die(ctx);
+}
+
+void TCms::AddHostState(const TNodeInfo &node, TClusterStateResponse &resp, TInstant timestamp)
+{
+ auto *host = resp.MutableState()->AddHosts();
+ host->SetName(node.Host);
+ host->SetState(node.State);
+ host->SetNodeId(node.NodeId);
+ host->SetInterconnectPort(node.IcPort);
+ host->SetTimestamp(timestamp.GetValue());
if (node.State == UP || node.VDisks || node.PDisks) {
for (const auto flag : GetEnumAllValues<EService>()) {
if (!(node.Services & flag)) {
@@ -975,306 +975,306 @@ void TCms::AddHostState(const TNodeInfo &node, TClusterStateResponse &resp, TIns
}
service->SetTimestamp(timestamp.GetValue());
}
-
- for (const auto &vdId : node.VDisks) {
- const auto &vdisk = ClusterInfo->VDisk(vdId);
- auto *device = host->AddDevices();
- device->SetName(vdisk.GetDeviceName());
- device->SetState(vdisk.State);
- device->SetTimestamp(timestamp.GetValue());
- }
-
- for (const auto &pdId : node.PDisks) {
- const auto &pdisk = ClusterInfo->PDisk(pdId);
- auto *device = host->AddDevices();
- device->SetName(pdisk.GetDeviceName());
- device->SetState(pdisk.State);
- device->SetTimestamp(timestamp.GetValue());
- }
- }
-}
-
-void TCms::GetPermission(TEvCms::TEvManagePermissionRequest::TPtr &ev, bool all, const TActorContext &ctx)
-{
- TAutoPtr<TEvCms::TEvManagePermissionResponse> resp = new TEvCms::TEvManagePermissionResponse;
- const auto &rec = ev->Get()->Record;
- const TString &user = rec.GetUser();
-
+
+ for (const auto &vdId : node.VDisks) {
+ const auto &vdisk = ClusterInfo->VDisk(vdId);
+ auto *device = host->AddDevices();
+ device->SetName(vdisk.GetDeviceName());
+ device->SetState(vdisk.State);
+ device->SetTimestamp(timestamp.GetValue());
+ }
+
+ for (const auto &pdId : node.PDisks) {
+ const auto &pdisk = ClusterInfo->PDisk(pdId);
+ auto *device = host->AddDevices();
+ device->SetName(pdisk.GetDeviceName());
+ device->SetState(pdisk.State);
+ device->SetTimestamp(timestamp.GetValue());
+ }
+ }
+}
+
+void TCms::GetPermission(TEvCms::TEvManagePermissionRequest::TPtr &ev, bool all, const TActorContext &ctx)
+{
+ TAutoPtr<TEvCms::TEvManagePermissionResponse> resp = new TEvCms::TEvManagePermissionResponse;
+ const auto &rec = ev->Get()->Record;
+ const TString &user = rec.GetUser();
+
LOG_INFO(ctx, NKikimrServices::CMS, "Get %s permissions for %s",
all ? "all" : "selected", user.data());
-
- resp->Record.MutableStatus()->SetCode(TStatus::OK);
- if (all) {
- for (const auto &entry : State->Permissions) {
- const auto &permission = entry.second;
- if (permission.Owner == user)
- permission.CopyTo(*resp->Record.AddPermissions());
- }
- } else {
- for (const auto &id : rec.GetPermissions()) {
- auto it = State->Permissions.find(id);
- if (it == State->Permissions.end()) {
- resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
- resp->Record.MutableStatus()->SetReason("Unknown permission " + id);
- resp->Record.ClearPermissions();
- break;
- }
-
- const auto &permission = it->second;
- if (permission.Owner != user) {
- resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+
+ resp->Record.MutableStatus()->SetCode(TStatus::OK);
+ if (all) {
+ for (const auto &entry : State->Permissions) {
+ const auto &permission = entry.second;
+ if (permission.Owner == user)
+ permission.CopyTo(*resp->Record.AddPermissions());
+ }
+ } else {
+ for (const auto &id : rec.GetPermissions()) {
+ auto it = State->Permissions.find(id);
+ if (it == State->Permissions.end()) {
+ resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+ resp->Record.MutableStatus()->SetReason("Unknown permission " + id);
+ resp->Record.ClearPermissions();
+ break;
+ }
+
+ const auto &permission = it->second;
+ if (permission.Owner != user) {
+ resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
resp->Record.MutableStatus()->SetReason(Sprintf("Permission %s doesn't belong to %s", id.data(), user.data()));
- resp->Record.ClearPermissions();
- break;
- }
-
- permission.CopyTo(*resp->Record.AddPermissions());
- }
- }
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Resulting status: %s %s",
+ resp->Record.ClearPermissions();
+ break;
+ }
+
+ permission.CopyTo(*resp->Record.AddPermissions());
+ }
+ }
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Resulting status: %s %s",
TStatus::ECode_Name(resp->Record.GetStatus().GetCode()).data(), resp->Record.GetStatus().GetReason().data());
-
+
Reply(ev, std::move(resp), ctx);
-}
-
-void TCms::RemovePermission(TEvCms::TEvManagePermissionRequest::TPtr &ev, bool done, const TActorContext &ctx)
-{
- TAutoPtr<TEvCms::TEvManagePermissionResponse> resp = new TEvCms::TEvManagePermissionResponse;
- const auto &rec = ev->Get()->Record;
- const TString &user = rec.GetUser();
-
+}
+
+void TCms::RemovePermission(TEvCms::TEvManagePermissionRequest::TPtr &ev, bool done, const TActorContext &ctx)
+{
+ TAutoPtr<TEvCms::TEvManagePermissionResponse> resp = new TEvCms::TEvManagePermissionResponse;
+ const auto &rec = ev->Get()->Record;
+ const TString &user = rec.GetUser();
+
LOG_INFO(ctx, NKikimrServices::CMS, "User %s %s permissions %s",
user.data(), done ? "is done with" : "rejected", ToString(rec.GetPermissions()).data());
-
+
TVector<TString> ids;
- resp->Record.MutableStatus()->SetCode(TStatus::OK);
- for (const auto &id : rec.GetPermissions()) {
- auto it = State->Permissions.find(id);
- if (it == State->Permissions.end()) {
- resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
- resp->Record.MutableStatus()->SetReason("Unknown permission " + id);
- break;
- }
-
- const auto &permission = it->second;
- if (permission.Owner != user) {
- resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+ resp->Record.MutableStatus()->SetCode(TStatus::OK);
+ for (const auto &id : rec.GetPermissions()) {
+ auto it = State->Permissions.find(id);
+ if (it == State->Permissions.end()) {
+ resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+ resp->Record.MutableStatus()->SetReason("Unknown permission " + id);
+ break;
+ }
+
+ const auto &permission = it->second;
+ if (permission.Owner != user) {
+ resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
resp->Record.MutableStatus()->SetReason(Sprintf("Permission %s doesn't belong to %s", id.data(), user.data()));
- break;
- }
-
- ids.push_back(id);
- }
-
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Resulting status: %s %s",
+ break;
+ }
+
+ ids.push_back(id);
+ }
+
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Resulting status: %s %s",
TStatus::ECode_Name(resp->Record.GetStatus().GetCode()).data(), resp->Record.GetStatus().GetReason().data());
-
+
if (!rec.GetDryRun() && resp->Record.GetStatus().GetCode() == TStatus::OK) {
auto handle = new IEventHandle(ev->Sender, SelfId(), resp.Release(), 0, ev->Cookie);
Execute(CreateTxRemovePermissions(std::move(ids), std::move(ev->Release()), handle), ctx);
- } else {
+ } else {
Reply(ev, std::move(resp), ctx);
- }
-}
-
-void TCms::GetRequest(TEvCms::TEvManageRequestRequest::TPtr &ev, bool all, const TActorContext &ctx)
-{
- TAutoPtr<TEvCms::TEvManageRequestResponse> resp = new TEvCms::TEvManageRequestResponse;
- const auto &rec = ev->Get()->Record;
- const TString &user = rec.GetUser();
-
+ }
+}
+
+void TCms::GetRequest(TEvCms::TEvManageRequestRequest::TPtr &ev, bool all, const TActorContext &ctx)
+{
+ TAutoPtr<TEvCms::TEvManageRequestResponse> resp = new TEvCms::TEvManageRequestResponse;
+ const auto &rec = ev->Get()->Record;
+ const TString &user = rec.GetUser();
+
LOG_INFO(ctx, NKikimrServices::CMS, "Get %s requests for %s",
all ? "all" : "selected", user.data());
-
- resp->Record.MutableStatus()->SetCode(TStatus::OK);
- if (all) {
- for (const auto &entry : State->ScheduledRequests) {
- const auto &request = entry.second;
- if (request.Owner == user)
- request.CopyTo(*resp->Record.AddRequests());
- }
- } else {
- auto &id = rec.GetRequestId();
- auto it = State->ScheduledRequests.find(id);
- if (it == State->ScheduledRequests.end()) {
- resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
- resp->Record.MutableStatus()->SetReason("Unknown request " + id);
- } else {
- const auto &request = it->second;
- if (request.Owner != user) {
- resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+
+ resp->Record.MutableStatus()->SetCode(TStatus::OK);
+ if (all) {
+ for (const auto &entry : State->ScheduledRequests) {
+ const auto &request = entry.second;
+ if (request.Owner == user)
+ request.CopyTo(*resp->Record.AddRequests());
+ }
+ } else {
+ auto &id = rec.GetRequestId();
+ auto it = State->ScheduledRequests.find(id);
+ if (it == State->ScheduledRequests.end()) {
+ resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+ resp->Record.MutableStatus()->SetReason("Unknown request " + id);
+ } else {
+ const auto &request = it->second;
+ if (request.Owner != user) {
+ resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
resp->Record.MutableStatus()->SetReason(Sprintf("Request %s doesn't belong to %s", id.data(), user.data()));
- } else
- request.CopyTo(*resp->Record.AddRequests());
- }
- }
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Resulting status: %s %s",
+ } else
+ request.CopyTo(*resp->Record.AddRequests());
+ }
+ }
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Resulting status: %s %s",
TStatus::ECode_Name(resp->Record.GetStatus().GetCode()).data(), resp->Record.GetStatus().GetReason().data());
-
+
Reply(ev, std::move(resp), ctx);
-}
-
-void TCms::RemoveRequest(TEvCms::TEvManageRequestRequest::TPtr &ev, const TActorContext &ctx)
-{
- TAutoPtr<TEvCms::TEvManageRequestResponse> resp = new TEvCms::TEvManageRequestResponse;
- const auto &rec = ev->Get()->Record;
- const TString &user = rec.GetUser();
- const TString &id = rec.GetRequestId();
-
+}
+
+void TCms::RemoveRequest(TEvCms::TEvManageRequestRequest::TPtr &ev, const TActorContext &ctx)
+{
+ TAutoPtr<TEvCms::TEvManageRequestResponse> resp = new TEvCms::TEvManageRequestResponse;
+ const auto &rec = ev->Get()->Record;
+ const TString &user = rec.GetUser();
+ const TString &id = rec.GetRequestId();
+
LOG_INFO(ctx, NKikimrServices::CMS, "User %s removes request %s", user.data(), id.data());
-
- resp->Record.MutableStatus()->SetCode(TStatus::OK);
- auto it = State->ScheduledRequests.find(id);
- if (it == State->ScheduledRequests.end()) {
- resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
- resp->Record.MutableStatus()->SetReason("Unknown request " + id);
- } else {
- const auto &request = it->second;
- if (request.Owner != user) {
- resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+
+ resp->Record.MutableStatus()->SetCode(TStatus::OK);
+ auto it = State->ScheduledRequests.find(id);
+ if (it == State->ScheduledRequests.end()) {
+ resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+ resp->Record.MutableStatus()->SetReason("Unknown request " + id);
+ } else {
+ const auto &request = it->second;
+ if (request.Owner != user) {
+ resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
resp->Record.MutableStatus()->SetReason(Sprintf("Request %s doesn't belong to %s", id.data(), user.data()));
- }
- }
-
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Resulting status: %s %s",
+ }
+ }
+
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Resulting status: %s %s",
TStatus::ECode_Name(resp->Record.GetStatus().GetCode()).data(), resp->Record.GetStatus().GetReason().data());
-
+
if (!rec.GetDryRun() && resp->Record.GetStatus().GetCode() == TStatus::OK) {
auto handle = new IEventHandle(ev->Sender, SelfId(), resp.Release(), 0, ev->Cookie);
Execute(CreateTxRemoveRequest(id, std::move(ev->Release()), handle), ctx);
- } else {
+ } else {
Reply(ev, std::move(resp), ctx);
- }
-}
-
-void TCms::GetNotifications(TEvCms::TEvManageNotificationRequest::TPtr &ev, bool all,
- const TActorContext &ctx)
-{
- TAutoPtr<TEvCms::TEvManageNotificationResponse> resp
- = new TEvCms::TEvManageNotificationResponse;
- const auto &rec = ev->Get()->Record;
- const TString &user = rec.GetUser();
-
+ }
+}
+
+void TCms::GetNotifications(TEvCms::TEvManageNotificationRequest::TPtr &ev, bool all,
+ const TActorContext &ctx)
+{
+ TAutoPtr<TEvCms::TEvManageNotificationResponse> resp
+ = new TEvCms::TEvManageNotificationResponse;
+ const auto &rec = ev->Get()->Record;
+ const TString &user = rec.GetUser();
+
LOG_INFO(ctx, NKikimrServices::CMS, "Get %s notifications for %s",
all ? "all" : "selected", user.data());
-
- resp->Record.MutableStatus()->SetCode(TStatus::OK);
- if (all) {
- for (const auto &entry : State->Notifications) {
- const auto &notification = entry.second;
- if (notification.Owner == user)
- notification.CopyTo(*resp->Record.AddNotifications());
- }
- } else {
- auto &id = rec.GetNotificationId();
- auto it = State->Notifications.find(id);
- if (it == State->Notifications.end()) {
- resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
- resp->Record.MutableStatus()->SetReason("Unknown notification " + id);
- } else {
- const auto &notification = it->second;
- if (notification.Owner != user) {
- resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+
+ resp->Record.MutableStatus()->SetCode(TStatus::OK);
+ if (all) {
+ for (const auto &entry : State->Notifications) {
+ const auto &notification = entry.second;
+ if (notification.Owner == user)
+ notification.CopyTo(*resp->Record.AddNotifications());
+ }
+ } else {
+ auto &id = rec.GetNotificationId();
+ auto it = State->Notifications.find(id);
+ if (it == State->Notifications.end()) {
+ resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+ resp->Record.MutableStatus()->SetReason("Unknown notification " + id);
+ } else {
+ const auto &notification = it->second;
+ if (notification.Owner != user) {
+ resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
resp->Record.MutableStatus()->SetReason(Sprintf("Notification %s doesn't belong to %s", id.data(), user.data()));
- } else
- notification.CopyTo(*resp->Record.AddNotifications());
- }
- }
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Resulting status: %s %s",
+ } else
+ notification.CopyTo(*resp->Record.AddNotifications());
+ }
+ }
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Resulting status: %s %s",
ToString(resp->Record.GetStatus().GetCode()).data(), resp->Record.GetStatus().GetReason().data());
-
+
Reply(ev, std::move(resp), ctx);
-}
-
-bool TCms::RemoveNotification(const TString &id, const TString &user, bool remove, TErrorInfo &error)
-{
- auto it = State->Notifications.find(id);
- if (it == State->Notifications.end()) {
- error.Code = TStatus::WRONG_REQUEST;
- error.Reason = "Unknown notification " + id;
- return false;
- }
-
- const auto &notification = it->second;
- if (notification.Owner != user) {
- error.Code = TStatus::WRONG_REQUEST;
+}
+
+bool TCms::RemoveNotification(const TString &id, const TString &user, bool remove, TErrorInfo &error)
+{
+ auto it = State->Notifications.find(id);
+ if (it == State->Notifications.end()) {
+ error.Code = TStatus::WRONG_REQUEST;
+ error.Reason = "Unknown notification " + id;
+ return false;
+ }
+
+ const auto &notification = it->second;
+ if (notification.Owner != user) {
+ error.Code = TStatus::WRONG_REQUEST;
error.Reason = Sprintf("Notification %s doesn't belong to %s", id.data(), user.data());
- return false;
- }
-
- if (remove)
- State->Notifications.erase(it);
-
- return true;
-}
-
-void TCms::EnqueueRequest(TAutoPtr<IEventHandle> ev, const TActorContext &ctx)
-{
- if (Queue.empty()) {
- auto collector = CreateInfoCollector(SelfId(), State->Config.InfoCollectionTimeout);
- ctx.ExecutorThread.RegisterActor(collector);
- }
-
- Queue.push(ev);
-}
-
-void TCms::CheckAndEnqueueRequest(TEvCms::TEvPermissionRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- if (!rec.GetUser()) {
+ return false;
+ }
+
+ if (remove)
+ State->Notifications.erase(it);
+
+ return true;
+}
+
+void TCms::EnqueueRequest(TAutoPtr<IEventHandle> ev, const TActorContext &ctx)
+{
+ if (Queue.empty()) {
+ auto collector = CreateInfoCollector(SelfId(), State->Config.InfoCollectionTimeout);
+ ctx.ExecutorThread.RegisterActor(collector);
+ }
+
+ Queue.push(ev);
+}
+
+void TCms::CheckAndEnqueueRequest(TEvCms::TEvPermissionRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ if (!rec.GetUser()) {
return ReplyWithError<TEvCms::TEvPermissionResponse>(
ev, TStatus::WRONG_REQUEST, "Missing user in request", ctx);
- }
-
- EnqueueRequest(ev.Release(), ctx);
-}
-
-void TCms::CheckAndEnqueueRequest(TEvCms::TEvCheckRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- if (!rec.GetUser()) {
+ }
+
+ EnqueueRequest(ev.Release(), ctx);
+}
+
+void TCms::CheckAndEnqueueRequest(TEvCms::TEvCheckRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ if (!rec.GetUser()) {
return ReplyWithError<TEvCms::TEvPermissionResponse>(
ev, TStatus::WRONG_REQUEST, "Missing user in request", ctx);
- }
-
- auto it = State->ScheduledRequests.find(rec.GetRequestId());
- if (it == State->ScheduledRequests.end()) {
+ }
+
+ auto it = State->ScheduledRequests.find(rec.GetRequestId());
+ if (it == State->ScheduledRequests.end()) {
auto reason = Sprintf("Unknown request %s", rec.GetRequestId().data());
return ReplyWithError<TEvCms::TEvPermissionResponse>(ev, TStatus::WRONG_REQUEST, reason, ctx);
- }
-
- if (it->second.Owner != rec.GetUser()) {
+ }
+
+ if (it->second.Owner != rec.GetUser()) {
auto reason = Sprintf("Request %s doesn't belong to %s", rec.GetRequestId().data(), rec.GetUser().data());
return ReplyWithError<TEvCms::TEvPermissionResponse>(ev, TStatus::WRONG_REQUEST, reason, ctx);
- }
-
- EnqueueRequest(ev.Release(), ctx);
-}
-
-void TCms::CheckAndEnqueueRequest(TEvCms::TEvConditionalPermissionRequest::TPtr &ev, const TActorContext &ctx)
-{
+ }
+
+ EnqueueRequest(ev.Release(), ctx);
+}
+
+void TCms::CheckAndEnqueueRequest(TEvCms::TEvConditionalPermissionRequest::TPtr &ev, const TActorContext &ctx)
+{
ReplyWithError<TEvCms::TEvPermissionResponse>(ev, TStatus::ERROR, "Not supported", ctx);
-}
-
-void TCms::CheckAndEnqueueRequest(TEvCms::TEvNotification::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- if (!rec.GetUser()) {
+}
+
+void TCms::CheckAndEnqueueRequest(TEvCms::TEvNotification::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ if (!rec.GetUser()) {
return ReplyWithError<TEvCms::TEvNotificationResponse>(
ev, TStatus::WRONG_REQUEST, "Missing user in request", ctx);
- }
-
- EnqueueRequest(ev.Release(), ctx);
-}
-
+ }
+
+ EnqueueRequest(ev.Release(), ctx);
+}
+
void TCms::PersistNodeTenants(TTransactionContext& txc, const TActorContext& ctx)
{
NIceDb::TNiceDb db(txc.DB);
@@ -1292,77 +1292,77 @@ void TCms::PersistNodeTenants(TTransactionContext& txc, const TActorContext& ctx
}
}
-void TCms::ProcessQueue(const TActorContext &ctx)
-{
- while (!Queue.empty()) {
- ProcessRequest(Queue.front(), ctx);
- Queue.pop();
- }
-}
-
-void TCms::ProcessRequest(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
-{
- TRACE_EVENT(NKikimrServices::CMS);
- switch (ev->GetTypeRewrite()) {
+void TCms::ProcessQueue(const TActorContext &ctx)
+{
+ while (!Queue.empty()) {
+ ProcessRequest(Queue.front(), ctx);
+ Queue.pop();
+ }
+}
+
+void TCms::ProcessRequest(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
+{
+ TRACE_EVENT(NKikimrServices::CMS);
+ switch (ev->GetTypeRewrite()) {
HFuncTraced(TEvPrivate::TEvUpdateClusterInfo, Handle);
- HFuncTraced(TEvCms::TEvClusterStateRequest, Handle);
- HFuncTraced(TEvCms::TEvPermissionRequest, Handle);
- HFuncTraced(TEvCms::TEvCheckRequest, Handle);
- HFuncTraced(TEvCms::TEvNotification, Handle);
- HFuncTraced(TEvCms::TEvResetMarkerRequest, Handle);
- HFuncTraced(TEvCms::TEvSetMarkerRequest, Handle);
-
- default:
- Y_FAIL("Unexpected request type");
- }
-}
-
-void TCms::OnBSCPipeDestroyed(const TActorContext &ctx)
-{
+ HFuncTraced(TEvCms::TEvClusterStateRequest, Handle);
+ HFuncTraced(TEvCms::TEvPermissionRequest, Handle);
+ HFuncTraced(TEvCms::TEvCheckRequest, Handle);
+ HFuncTraced(TEvCms::TEvNotification, Handle);
+ HFuncTraced(TEvCms::TEvResetMarkerRequest, Handle);
+ HFuncTraced(TEvCms::TEvSetMarkerRequest, Handle);
+
+ default:
+ Y_FAIL("Unexpected request type");
+ }
+}
+
+void TCms::OnBSCPipeDestroyed(const TActorContext &ctx)
+{
LOG_WARN(ctx, NKikimrServices::CMS, "BS Controller connection error");
-
- if (State->BSControllerPipe) {
- NTabletPipe::CloseClient(ctx, State->BSControllerPipe);
+
+ if (State->BSControllerPipe) {
+ NTabletPipe::CloseClient(ctx, State->BSControllerPipe);
State->BSControllerPipe = TActorId();
- }
-
+ }
+
if (State->Sentinel)
ctx.Send(State->Sentinel, new TEvSentinel::TEvBSCPipeDisconnected);
-}
-
-void TCms::Handle(TEvPrivate::TEvClusterInfo::TPtr &ev, const TActorContext &ctx)
-{
- if (!ev->Get()->Success) {
- LOG_NOTICE_S(ctx, NKikimrServices::CMS,
- "Couldn't collect cluster state.");
-
- if (!ClusterInfo) {
- State->ClusterInfo = new TClusterInfo;
- ClusterInfo = State->ClusterInfo;
- }
-
- ClusterInfo->SetOutdated(true);
- ProcessQueue(ctx);
- return;
- }
-
- auto info = ev->Get()->Info;
- info->SetOutdated(false);
-
- if (ClusterInfo) {
+}
+
+void TCms::Handle(TEvPrivate::TEvClusterInfo::TPtr &ev, const TActorContext &ctx)
+{
+ if (!ev->Get()->Success) {
+ LOG_NOTICE_S(ctx, NKikimrServices::CMS,
+ "Couldn't collect cluster state.");
+
+ if (!ClusterInfo) {
+ State->ClusterInfo = new TClusterInfo;
+ ClusterInfo = State->ClusterInfo;
+ }
+
+ ClusterInfo->SetOutdated(true);
+ ProcessQueue(ctx);
+ return;
+ }
+
+ auto info = ev->Get()->Info;
+ info->SetOutdated(false);
+
+ if (ClusterInfo) {
info->MigrateOldInfo(ClusterInfo);
- } else {
- info->ApplyDowntimes(State->Downtimes);
- }
-
- AdjustInfo(info, ctx);
-
- State->ClusterInfo = info;
- ClusterInfo = info;
-
+ } else {
+ info->ApplyDowntimes(State->Downtimes);
+ }
+
+ AdjustInfo(info, ctx);
+
+ State->ClusterInfo = info;
+ ClusterInfo = info;
+
ClusterInfo->UpdateDowntimes(State->Downtimes, ctx);
- Execute(CreateTxUpdateDowntimes(), ctx);
-
+ Execute(CreateTxUpdateDowntimes(), ctx);
+
if (State->InitialNodeTenants) {
ClusterInfo->ApplyInitialNodeTenants(ctx, State->InitialNodeTenants);
State->InitialNodeTenants.clear();
@@ -1371,16 +1371,16 @@ void TCms::Handle(TEvPrivate::TEvClusterInfo::TPtr &ev, const TActorContext &ctx
if (State->Config.SentinelConfig.Enable && !State->Sentinel)
State->Sentinel = RegisterWithSameMailbox(CreateSentinel(State));
- info->DebugDump(ctx);
-
- ProcessQueue(ctx);
-}
-
-void TCms::Handle(TEvPrivate::TEvLogAndSend::TPtr &ev, const TActorContext &ctx)
-{
- Execute(CreateTxLogAndSend(ev), ctx);
-}
-
+ info->DebugDump(ctx);
+
+ ProcessQueue(ctx);
+}
+
+void TCms::Handle(TEvPrivate::TEvLogAndSend::TPtr &ev, const TActorContext &ctx)
+{
+ Execute(CreateTxLogAndSend(ev), ctx);
+}
+
void TCms::Handle(TEvPrivate::TEvUpdateClusterInfo::TPtr &/*ev*/, const TActorContext &ctx)
{
if (State->ClusterInfo->IsOutdated()) {
@@ -1388,108 +1388,108 @@ void TCms::Handle(TEvPrivate::TEvUpdateClusterInfo::TPtr &/*ev*/, const TActorCo
}
}
-void TCms::Handle(TEvCms::TEvManageRequestRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- if (!rec.GetUser()) {
+void TCms::Handle(TEvCms::TEvManageRequestRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ if (!rec.GetUser()) {
return ReplyWithError<TEvCms::TEvManageRequestResponse>(
ev, TStatus::WRONG_REQUEST, "Missing user in request", ctx);
- }
-
- switch (rec.GetCommand()) {
- case TManageRequestRequest::LIST:
- GetRequest(ev, true, ctx);
- return;
- case TManageRequestRequest::GET:
- GetRequest(ev, false, ctx);
- return;
- case TManageRequestRequest::REJECT:
- RemoveRequest(ev, ctx);
- return;
- default:
+ }
+
+ switch (rec.GetCommand()) {
+ case TManageRequestRequest::LIST:
+ GetRequest(ev, true, ctx);
+ return;
+ case TManageRequestRequest::GET:
+ GetRequest(ev, false, ctx);
+ return;
+ case TManageRequestRequest::REJECT:
+ RemoveRequest(ev, ctx);
+ return;
+ default:
return ReplyWithError<TEvCms::TEvManageRequestResponse>(
ev, TStatus::WRONG_REQUEST, "Unknown command", ctx);
- }
-}
-
-void TCms::Handle(TEvCms::TEvManagePermissionRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- if (!rec.GetUser()) {
+ }
+}
+
+void TCms::Handle(TEvCms::TEvManagePermissionRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ if (!rec.GetUser()) {
return ReplyWithError<TEvCms::TEvManagePermissionResponse>(
ev, TStatus::WRONG_REQUEST, "Missing user in request", ctx);
- }
-
- switch (rec.GetCommand()) {
- case TManagePermissionRequest::LIST:
- GetPermission(ev, true, ctx);
- return;
- case TManagePermissionRequest::GET:
- GetPermission(ev, false, ctx);
- return;
- case TManagePermissionRequest::DONE:
- RemovePermission(ev, true, ctx);
- return;
- case TManagePermissionRequest::REJECT:
- RemovePermission(ev, false, ctx);
- return;
+ }
+
+ switch (rec.GetCommand()) {
+ case TManagePermissionRequest::LIST:
+ GetPermission(ev, true, ctx);
+ return;
+ case TManagePermissionRequest::GET:
+ GetPermission(ev, false, ctx);
+ return;
+ case TManagePermissionRequest::DONE:
+ RemovePermission(ev, true, ctx);
+ return;
+ case TManagePermissionRequest::REJECT:
+ RemovePermission(ev, false, ctx);
+ return;
case TManagePermissionRequest::EXTEND:
return ReplyWithError<TEvCms::TEvManagePermissionResponse>(
ev, TStatus::ERROR, "Not supported", ctx);
- default:
+ default:
return ReplyWithError<TEvCms::TEvManagePermissionResponse>(
ev, TStatus::WRONG_REQUEST, "Unknown command", ctx);
- }
-}
-
-void TCms::Handle(TEvCms::TEvClusterStateRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- if (ClusterInfo->IsOutdated()) {
+ }
+}
+
+void TCms::Handle(TEvCms::TEvClusterStateRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ if (ClusterInfo->IsOutdated()) {
return ReplyWithError<TEvCms::TEvClusterStateResponse>(
ev, TStatus::ERROR_TEMP, "Cannot collect cluster state", ctx);
- }
-
- TAutoPtr<TEvCms::TEvClusterStateResponse> resp = new TEvCms::TEvClusterStateResponse;
-
- auto &rec = ev->Get()->Record;
- if (rec.HostsSize() > 0) {
- for (const auto &host : rec.GetHosts()) {
+ }
+
+ TAutoPtr<TEvCms::TEvClusterStateResponse> resp = new TEvCms::TEvClusterStateResponse;
+
+ auto &rec = ev->Get()->Record;
+ if (rec.HostsSize() > 0) {
+ for (const auto &host : rec.GetHosts()) {
if (ClusterInfo->NodesCount(host) >= 1) {
for (const TNodeInfo *node : ClusterInfo->HostNodes(host)) {
AddHostState(*node, resp->Record, ClusterInfo->GetTimestamp());
}
- } else {
+ } else {
return ReplyWithError<TEvCms::TEvClusterStateResponse>(
ev, TStatus::NO_SUCH_HOST, "Unknown host " + host, ctx);
- }
- }
- } else {
- for (const auto &entry : ClusterInfo->AllNodes())
- AddHostState(*entry.second, resp->Record, ClusterInfo->GetTimestamp());
- }
-
- resp->Record.MutableStatus()->SetCode(TStatus::OK);
- resp->Record.MutableState()->SetTimestamp(ClusterInfo->GetTimestamp().GetValue());
-
+ }
+ }
+ } else {
+ for (const auto &entry : ClusterInfo->AllNodes())
+ AddHostState(*entry.second, resp->Record, ClusterInfo->GetTimestamp());
+ }
+
+ resp->Record.MutableStatus()->SetCode(TStatus::OK);
+ resp->Record.MutableState()->SetTimestamp(ClusterInfo->GetTimestamp().GetValue());
+
Reply(ev, std::move(resp), ctx);
-}
-
-void TCms::Handle(TEvCms::TEvPermissionRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- if (ClusterInfo->IsOutdated()) {
+}
+
+void TCms::Handle(TEvCms::TEvPermissionRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ if (ClusterInfo->IsOutdated()) {
return ReplyWithError<TEvCms::TEvPermissionResponse>(
ev, TStatus::ERROR_TEMP, "Cannot collect cluster state", ctx);
- }
-
- TAutoPtr<TEvCms::TEvPermissionResponse> resp = new TEvCms::TEvPermissionResponse;
- TRequestInfo scheduled;
- auto &rec = ev->Get()->Record;
- TString user = rec.GetUser();
-
+ }
+
+ TAutoPtr<TEvCms::TEvPermissionResponse> resp = new TEvCms::TEvPermissionResponse;
+ TRequestInfo scheduled;
+ auto &rec = ev->Get()->Record;
+ TString user = rec.GetUser();
+
auto actions(std::move(*rec.MutableActions()));
rec.ClearActions();
@@ -1511,406 +1511,406 @@ void TCms::Handle(TEvCms::TEvPermissionRequest::TPtr &ev,
}
}
- bool ok = CheckPermissionRequest(rec, resp->Record, scheduled.Request, ctx);
-
- // Schedule request if required.
- if (rec.GetDryRun()) {
+ bool ok = CheckPermissionRequest(rec, resp->Record, scheduled.Request, ctx);
+
+ // Schedule request if required.
+ if (rec.GetDryRun()) {
Reply(ev, std::move(resp), ctx);
- } else {
- auto reqId = user + "-r-" + ToString(State->NextRequestId++);
- resp->Record.SetRequestId(reqId);
-
- TAutoPtr<TRequestInfo> copy;
- if (scheduled.Request.ActionsSize()) {
- scheduled.Owner = user;
- scheduled.Order = State->NextRequestId - 1;
- scheduled.RequestId = reqId;
- ClusterInfo->ScheduleActions(scheduled, &ctx);
-
- copy = new TRequestInfo(scheduled);
- State->ScheduledRequests.emplace(reqId, std::move(scheduled));
+ } else {
+ auto reqId = user + "-r-" + ToString(State->NextRequestId++);
+ resp->Record.SetRequestId(reqId);
+
+ TAutoPtr<TRequestInfo> copy;
+ if (scheduled.Request.ActionsSize()) {
+ scheduled.Owner = user;
+ scheduled.Order = State->NextRequestId - 1;
+ scheduled.RequestId = reqId;
+ ClusterInfo->ScheduleActions(scheduled, &ctx);
+
+ copy = new TRequestInfo(scheduled);
+ State->ScheduledRequests.emplace(reqId, std::move(scheduled));
} else if (user == WALLE_CMS_USER) {
scheduled.Owner = user;
scheduled.RequestId = reqId;
copy = new TRequestInfo(scheduled);
- }
-
- if (ok)
- AcceptPermissions(resp->Record, reqId, user, ctx);
-
+ }
+
+ if (ok)
+ AcceptPermissions(resp->Record, reqId, user, ctx);
+
auto handle = new IEventHandle(ev->Sender, SelfId(), resp.Release(), 0, ev->Cookie);
Execute(CreateTxStorePermissions(std::move(ev->Release()), handle, user, std::move(copy)), ctx);
- }
-}
-
-void TCms::Handle(TEvCms::TEvCheckRequest::TPtr &ev, const TActorContext &ctx)
-{
- if (ClusterInfo->IsOutdated()) {
+ }
+}
+
+void TCms::Handle(TEvCms::TEvCheckRequest::TPtr &ev, const TActorContext &ctx)
+{
+ if (ClusterInfo->IsOutdated()) {
return ReplyWithError<TEvCms::TEvPermissionResponse>(
ev, TStatus::ERROR_TEMP, "Cannot collect cluster state", ctx);
- }
-
- auto &rec = ev->Get()->Record;
- auto it = State->ScheduledRequests.find(rec.GetRequestId());
-
- // Have to check request existence again because it could be
- // deleted after previous event check.
- if (it == State->ScheduledRequests.end()) {
+ }
+
+ auto &rec = ev->Get()->Record;
+ auto it = State->ScheduledRequests.find(rec.GetRequestId());
+
+ // Have to check request existence again because it could be
+ // deleted after previous event check.
+ if (it == State->ScheduledRequests.end()) {
auto reason = Sprintf("Unknown request %s", rec.GetRequestId().data());
return ReplyWithError<TEvCms::TEvPermissionResponse>(
ev, TStatus::WRONG_REQUEST, reason, ctx);
- }
-
- TString user = rec.GetUser();
- auto &request = it->second;
- TAutoPtr<TEvCms::TEvPermissionResponse> resp = new TEvCms::TEvPermissionResponse;
- TRequestInfo scheduled;
-
- // Deactivate locks of this and later requests to
- // avoid false conflicts.
- ClusterInfo->DeactivateScheduledLocks(request.Order);
- request.Request.SetAvailabilityMode(rec.GetAvailabilityMode());
- bool ok = CheckPermissionRequest(request.Request, resp->Record, scheduled.Request, ctx);
- ClusterInfo->ReactivateScheduledLocks();
-
- // Schedule request if required.
- if (rec.GetDryRun()) {
+ }
+
+ TString user = rec.GetUser();
+ auto &request = it->second;
+ TAutoPtr<TEvCms::TEvPermissionResponse> resp = new TEvCms::TEvPermissionResponse;
+ TRequestInfo scheduled;
+
+ // Deactivate locks of this and later requests to
+ // avoid false conflicts.
+ ClusterInfo->DeactivateScheduledLocks(request.Order);
+ request.Request.SetAvailabilityMode(rec.GetAvailabilityMode());
+ bool ok = CheckPermissionRequest(request.Request, resp->Record, scheduled.Request, ctx);
+ ClusterInfo->ReactivateScheduledLocks();
+
+ // Schedule request if required.
+ if (rec.GetDryRun()) {
Reply(ev, std::move(resp), ctx);
- } else {
- TAutoPtr<TRequestInfo> copy;
- auto order = request.Order;
-
- ClusterInfo->UnscheduleActions(request.RequestId);
- State->ScheduledRequests.erase(it);
- if (scheduled.Request.ActionsSize()) {
- scheduled.Owner = user;
- scheduled.Order = order;
- scheduled.RequestId = rec.GetRequestId();
- resp->Record.SetRequestId(scheduled.RequestId);
-
- ClusterInfo->ScheduleActions(scheduled, &ctx);
-
- copy = new TRequestInfo(scheduled);
- State->ScheduledRequests.emplace(scheduled.RequestId, std::move(scheduled));
- } else {
- scheduled.RequestId = rec.GetRequestId();
- scheduled.Owner = user;
- copy = new TRequestInfo(scheduled);
- }
-
- if (ok)
+ } else {
+ TAutoPtr<TRequestInfo> copy;
+ auto order = request.Order;
+
+ ClusterInfo->UnscheduleActions(request.RequestId);
+ State->ScheduledRequests.erase(it);
+ if (scheduled.Request.ActionsSize()) {
+ scheduled.Owner = user;
+ scheduled.Order = order;
+ scheduled.RequestId = rec.GetRequestId();
+ resp->Record.SetRequestId(scheduled.RequestId);
+
+ ClusterInfo->ScheduleActions(scheduled, &ctx);
+
+ copy = new TRequestInfo(scheduled);
+ State->ScheduledRequests.emplace(scheduled.RequestId, std::move(scheduled));
+ } else {
+ scheduled.RequestId = rec.GetRequestId();
+ scheduled.Owner = user;
+ copy = new TRequestInfo(scheduled);
+ }
+
+ if (ok)
AcceptPermissions(resp->Record, scheduled.RequestId, user, ctx, true);
-
+
auto handle = new IEventHandle(ev->Sender, SelfId(), resp.Release(), 0, ev->Cookie);
Execute(CreateTxStorePermissions(std::move(ev->Release()), handle, user, std::move(copy)), ctx);
- }
-}
-
-bool TCms::CheckNotificationDeadline(const TAction &action, TInstant time,
- TErrorInfo &error, const TActorContext &ctx) const
-{
+ }
+}
+
+bool TCms::CheckNotificationDeadline(const TAction &action, TInstant time,
+ TErrorInfo &error, const TActorContext &ctx) const
+{
if (time + TDuration::MicroSeconds(action.GetDuration()) < ctx.Now()) {
- error.Code = TStatus::WRONG_REQUEST;
- error.Reason = "Action already finished";
- return false;
- }
-
- return true;
-}
-
-bool TCms::CheckNotificationRestartServices(const TAction &action, TInstant time,
- TErrorInfo &error, const TActorContext &ctx) const
-{
- TServices services;
- if (!ParseServices(action, services, error))
- return false;
-
- if (!services) {
- error.Code = TStatus::WRONG_REQUEST;
- error.Reason = "Empty services list";
- return false;
- }
-
- if (!CheckNotificationDeadline(action, time, error, ctx))
- return false;
-
- return true;
-}
-
-bool TCms::CheckNotificationShutdownHost(const TAction &action, TInstant time,
- TErrorInfo &error, const TActorContext &ctx) const
-{
- if (!CheckNotificationDeadline(action, time, error, ctx))
- return false;
-
- return true;
-}
-
-bool TCms::CheckNotificationReplaceDevices(const TAction &action, TInstant time,
- TErrorInfo &error, const TActorContext &ctx) const
-{
- for (const auto &device : action.GetDevices()) {
+ error.Code = TStatus::WRONG_REQUEST;
+ error.Reason = "Action already finished";
+ return false;
+ }
+
+ return true;
+}
+
+bool TCms::CheckNotificationRestartServices(const TAction &action, TInstant time,
+ TErrorInfo &error, const TActorContext &ctx) const
+{
+ TServices services;
+ if (!ParseServices(action, services, error))
+ return false;
+
+ if (!services) {
+ error.Code = TStatus::WRONG_REQUEST;
+ error.Reason = "Empty services list";
+ return false;
+ }
+
+ if (!CheckNotificationDeadline(action, time, error, ctx))
+ return false;
+
+ return true;
+}
+
+bool TCms::CheckNotificationShutdownHost(const TAction &action, TInstant time,
+ TErrorInfo &error, const TActorContext &ctx) const
+{
+ if (!CheckNotificationDeadline(action, time, error, ctx))
+ return false;
+
+ return true;
+}
+
+bool TCms::CheckNotificationReplaceDevices(const TAction &action, TInstant time,
+ TErrorInfo &error, const TActorContext &ctx) const
+{
+ for (const auto &device : action.GetDevices()) {
if (!ClusterInfo->HasPDisk(device)
&& !ClusterInfo->HasPDisk(action.GetHost(), device)
&& !ClusterInfo->HasVDisk(device)) {
error.Code = TStatus::NO_SUCH_DEVICE;
- error.Reason = Sprintf("Unknown device %s (use cluster state command"
+ error.Reason = Sprintf("Unknown device %s (use cluster state command"
" to get list of known devices)", device.data());
- return false;
- }
- }
-
- if (!CheckNotificationDeadline(action, time, error, ctx))
- return false;
-
- return true;
-}
-
-bool TCms::IsValidNotificationAction(const TAction &action, TInstant time,
- TErrorInfo &error, const TActorContext &ctx) const
-{
- if (!IsActionHostValid(action, error))
- return false;
-
- switch (action.GetType()) {
- case TAction::RESTART_SERVICES:
- return CheckNotificationRestartServices(action, time, error, ctx);
- case TAction::SHUTDOWN_HOST:
- return CheckNotificationShutdownHost(action, time, error, ctx);
- case TAction::REPLACE_DEVICES:
- return CheckNotificationReplaceDevices(action, time, error, ctx);
- case TAction::START_SERVICES:
- case TAction::STOP_SERVICES:
- case TAction::ADD_HOST:
- case TAction::DECOMMISSION_HOST:
- case TAction::ADD_DEVICES:
- case TAction::REMOVE_DEVICES:
- error.Code = TStatus::ERROR;
- error.Reason = Sprintf("Unsupported action action '%s'",
+ return false;
+ }
+ }
+
+ if (!CheckNotificationDeadline(action, time, error, ctx))
+ return false;
+
+ return true;
+}
+
+bool TCms::IsValidNotificationAction(const TAction &action, TInstant time,
+ TErrorInfo &error, const TActorContext &ctx) const
+{
+ if (!IsActionHostValid(action, error))
+ return false;
+
+ switch (action.GetType()) {
+ case TAction::RESTART_SERVICES:
+ return CheckNotificationRestartServices(action, time, error, ctx);
+ case TAction::SHUTDOWN_HOST:
+ return CheckNotificationShutdownHost(action, time, error, ctx);
+ case TAction::REPLACE_DEVICES:
+ return CheckNotificationReplaceDevices(action, time, error, ctx);
+ case TAction::START_SERVICES:
+ case TAction::STOP_SERVICES:
+ case TAction::ADD_HOST:
+ case TAction::DECOMMISSION_HOST:
+ case TAction::ADD_DEVICES:
+ case TAction::REMOVE_DEVICES:
+ error.Code = TStatus::ERROR;
+ error.Reason = Sprintf("Unsupported action action '%s'",
TAction::EType_Name(action.GetType()).data());
- return false;
- default:
- error.Code = TStatus::WRONG_REQUEST;
+ return false;
+ default:
+ error.Code = TStatus::WRONG_REQUEST;
error.Reason = Sprintf("Unknown action '%s'", TAction::EType_Name(action.GetType()).data());
- return false;
- }
-}
-
-TString TCms::AcceptNotification(const TNotification &notification,
- const TActorContext &ctx)
-{
- TString id = notification.GetUser() + "-n-" + ToString(State->NextNotificationId++);
- TNotificationInfo info;
-
- info.NotificationId = id;
- info.Owner = notification.GetUser();
- info.Notification = notification;
-
- ClusterInfo->AddExternalLocks(info, &ctx);
- State->Notifications.emplace(id, std::move(info));
-
- return id;
-}
-
-bool TCms::CheckNotification(const TNotification &notification,
- TNotificationResponse &resp,
- const TActorContext &ctx) const
-{
+ return false;
+ }
+}
+
+TString TCms::AcceptNotification(const TNotification &notification,
+ const TActorContext &ctx)
+{
+ TString id = notification.GetUser() + "-n-" + ToString(State->NextNotificationId++);
+ TNotificationInfo info;
+
+ info.NotificationId = id;
+ info.Owner = notification.GetUser();
+ info.Notification = notification;
+
+ ClusterInfo->AddExternalLocks(info, &ctx);
+ State->Notifications.emplace(id, std::move(info));
+
+ return id;
+}
+
+bool TCms::CheckNotification(const TNotification &notification,
+ TNotificationResponse &resp,
+ const TActorContext &ctx) const
+{
TInstant time = TInstant::MicroSeconds(notification.GetTime());
-
- resp.MutableStatus()->SetCode(TStatus::OK);
- for (const auto &action : notification.GetActions()) {
- TErrorInfo error;
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Processing notification for action: %s",
+
+ resp.MutableStatus()->SetCode(TStatus::OK);
+ for (const auto &action : notification.GetActions()) {
+ TErrorInfo error;
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Processing notification for action: %s",
action.ShortDebugString().data());
-
- if (!IsValidNotificationAction(action, time, error, ctx)) {
- resp.MutableStatus()->SetCode(error.Code);
- resp.MutableStatus()->SetReason(error.Reason);
- break;
- }
- }
-
- return resp.GetStatus().GetCode() == TStatus::OK;
-}
-
-void TCms::Handle(TEvCms::TEvNotification::TPtr &ev, const TActorContext &ctx)
-{
- if (ClusterInfo->IsOutdated()) {
+
+ if (!IsValidNotificationAction(action, time, error, ctx)) {
+ resp.MutableStatus()->SetCode(error.Code);
+ resp.MutableStatus()->SetReason(error.Reason);
+ break;
+ }
+ }
+
+ return resp.GetStatus().GetCode() == TStatus::OK;
+}
+
+void TCms::Handle(TEvCms::TEvNotification::TPtr &ev, const TActorContext &ctx)
+{
+ if (ClusterInfo->IsOutdated()) {
return ReplyWithError<TEvCms::TEvNotificationResponse>(
ev, TStatus::ERROR_TEMP, "Cannot collect cluster state", ctx);
- }
-
- Execute(CreateTxProcessNotification(ev), ctx);
-}
-
-void TCms::Handle(TEvCms::TEvManageNotificationRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
+ }
+
+ Execute(CreateTxProcessNotification(ev), ctx);
+}
+
+void TCms::Handle(TEvCms::TEvManageNotificationRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
LOG_INFO(ctx, NKikimrServices::CMS, "Notification management request: %s",
rec.ShortDebugString().data());
-
- if (!rec.GetUser()) {
+
+ if (!rec.GetUser()) {
return ReplyWithError<TEvCms::TEvManageNotificationResponse>(
ev, TStatus::WRONG_REQUEST, "Missing user in request", ctx);
- }
-
- switch (rec.GetCommand()) {
- case TManageNotificationRequest::LIST:
- GetNotifications(ev, true, ctx);
- return;
- case TManageNotificationRequest::GET:
- GetNotifications(ev, false, ctx);
- return;
- case TManageNotificationRequest::REJECT:
- Execute(CreateTxRejectNotification(ev), ctx);
- return;
- default:
+ }
+
+ switch (rec.GetCommand()) {
+ case TManageNotificationRequest::LIST:
+ GetNotifications(ev, true, ctx);
+ return;
+ case TManageNotificationRequest::GET:
+ GetNotifications(ev, false, ctx);
+ return;
+ case TManageNotificationRequest::REJECT:
+ Execute(CreateTxRejectNotification(ev), ctx);
+ return;
+ default:
return ReplyWithError<TEvCms::TEvManageNotificationResponse>(
ev, TStatus::WRONG_REQUEST, "Unknown command", ctx);
- }
-}
-
-void TCms::Handle(TEvCms::TEvWalleCreateTaskRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto adapter = CreateWalleAdapter(ev, SelfId());
+ }
+}
+
+void TCms::Handle(TEvCms::TEvWalleCreateTaskRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto adapter = CreateWalleAdapter(ev, SelfId());
ctx.RegisterWithSameMailbox(adapter);
-}
-
-void TCms::Handle(TEvCms::TEvWalleListTasksRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto adapter = CreateWalleAdapter(ev, State);
+}
+
+void TCms::Handle(TEvCms::TEvWalleListTasksRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto adapter = CreateWalleAdapter(ev, State);
ctx.RegisterWithSameMailbox(adapter);
-}
-
-void TCms::Handle(TEvCms::TEvWalleCheckTaskRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto adapter = CreateWalleAdapter(ev, State, SelfId());
+}
+
+void TCms::Handle(TEvCms::TEvWalleCheckTaskRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto adapter = CreateWalleAdapter(ev, State, SelfId());
ctx.RegisterWithSameMailbox(adapter);
-}
-
-void TCms::Handle(TEvCms::TEvWalleRemoveTaskRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto adapter = CreateWalleAdapter(ev, State, SelfId());
+}
+
+void TCms::Handle(TEvCms::TEvWalleRemoveTaskRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto adapter = CreateWalleAdapter(ev, State, SelfId());
ctx.RegisterWithSameMailbox(adapter);
-}
-
-void TCms::Handle(TEvCms::TEvStoreWalleTask::TPtr &ev, const TActorContext &ctx)
-{
- auto event = ev->Get();
- State->WalleTasks.emplace(event->Task.TaskId, event->Task);
- State->WalleRequests.emplace(event->Task.RequestId, event->Task.TaskId);
-
+}
+
+void TCms::Handle(TEvCms::TEvStoreWalleTask::TPtr &ev, const TActorContext &ctx)
+{
+ auto event = ev->Get();
+ State->WalleTasks.emplace(event->Task.TaskId, event->Task);
+ State->WalleRequests.emplace(event->Task.RequestId, event->Task.TaskId);
+
auto handle = new IEventHandle(ev->Sender, SelfId(), new TEvCms::TEvWalleTaskStored(event->Task.TaskId), 0, ev->Cookie);
Execute(CreateTxStoreWalleTask(event->Task, std::move(ev->Release()), handle), ctx);
-}
-
-void TCms::Handle(TEvCms::TEvRemoveWalleTask::TPtr &ev, const TActorContext &ctx)
-{
- TString id = ev->Get()->TaskId;
- TAutoPtr<TEvCms::TEvWalleTaskRemoved> resp = new TEvCms::TEvWalleTaskRemoved(id);
-
+}
+
+void TCms::Handle(TEvCms::TEvRemoveWalleTask::TPtr &ev, const TActorContext &ctx)
+{
+ TString id = ev->Get()->TaskId;
+ TAutoPtr<TEvCms::TEvWalleTaskRemoved> resp = new TEvCms::TEvWalleTaskRemoved(id);
+
if (State->WalleTasks.contains(id)) {
- auto &task = State->WalleTasks.find(id)->second;
+ auto &task = State->WalleTasks.find(id)->second;
auto handle = new IEventHandle(ev->Sender, SelfId(), resp.Release(), 0, ev->Cookie);
if (State->ScheduledRequests.contains(task.RequestId)) {
Execute(CreateTxRemoveRequest(task.RequestId, std::move(ev->Release()), handle), ctx);
} else {
TVector<TString> ids(task.Permissions.begin(), task.Permissions.end());
Execute(CreateTxRemovePermissions(ids, std::move(ev->Release()), handle), ctx);
- }
- } else {
+ }
+ } else {
Reply(ev, std::move(resp), ctx);
- }
-}
-
-void TCms::Handle(TEvCms::TEvGetConfigRequest::TPtr &ev, const TActorContext &ctx)
-{
- TAutoPtr<TEvCms::TEvGetConfigResponse> response
- = new TEvCms::TEvGetConfigResponse;
- State->Config.Serialize(*response->Record.MutableConfig());
- response->Record.MutableStatus()->SetCode(TStatus::OK);
-
+ }
+}
+
+void TCms::Handle(TEvCms::TEvGetConfigRequest::TPtr &ev, const TActorContext &ctx)
+{
+ TAutoPtr<TEvCms::TEvGetConfigResponse> response
+ = new TEvCms::TEvGetConfigResponse;
+ State->Config.Serialize(*response->Record.MutableConfig());
+ response->Record.MutableStatus()->SetCode(TStatus::OK);
+
Reply(ev, std::move(response), ctx);
-}
-
-void TCms::Handle(TEvCms::TEvSetConfigRequest::TPtr &ev, const TActorContext &ctx)
-{
- Execute(CreateTxUpdateConfig(ev), ctx);
-}
-
-void TCms::Handle(TEvCms::TEvResetMarkerRequest::TPtr &ev, const TActorContext &ctx)
-{
+}
+
+void TCms::Handle(TEvCms::TEvSetConfigRequest::TPtr &ev, const TActorContext &ctx)
+{
+ Execute(CreateTxUpdateConfig(ev), ctx);
+}
+
+void TCms::Handle(TEvCms::TEvResetMarkerRequest::TPtr &ev, const TActorContext &ctx)
+{
return ReplyWithError<TEvCms::TEvResetMarkerResponse>(
ev, TStatus::ERROR, "Unsupported action", ctx);
-}
-
-void TCms::Handle(TEvCms::TEvSetMarkerRequest::TPtr &ev, const TActorContext &ctx)
-{
+}
+
+void TCms::Handle(TEvCms::TEvSetMarkerRequest::TPtr &ev, const TActorContext &ctx)
+{
return ReplyWithError<TEvCms::TEvSetMarkerResponse>(
ev, TStatus::ERROR, "Unsupported action", ctx);
-}
-
-void TCms::Handle(TEvCms::TEvGetLogTailRequest::TPtr &ev, const TActorContext &ctx)
-{
- Execute(CreateTxGetLogTail(ev), ctx);
-}
-
-void TCms::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- Execute(CreateTxUpdateConfig(ev), ctx);
-}
-
-void TCms::Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
- const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
- if (rec.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS,
- "Cannot subscribe for config updates: " << rec.GetStatus().GetCode()
- << " " << rec.GetStatus().GetReason());
-
- SubscribeForConfig(ctx);
- return;
- }
-
- ConfigSubscriptionId = rec.GetSubscriptionId();
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "Got config subscription id=" << ConfigSubscriptionId);
-}
-
-void TCms::Handle(TEvents::TEvPoisonPill::TPtr &ev,
- const TActorContext &ctx)
-{
- Y_UNUSED(ev);
- ctx.Send(Tablet(), new TEvents::TEvPoisonPill);
-}
-
-void TCms::Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev,
- const TActorContext &ctx)
-{
- auto *msg = ev->Get();
- if (msg->ClientId == State->BSControllerPipe)
- OnBSCPipeDestroyed(ctx);
-}
-
-void TCms::Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev,
- const TActorContext &ctx)
-{
- TEvTabletPipe::TEvClientConnected *msg = ev->Get();
- if (msg->ClientId == State->BSControllerPipe && msg->Status != NKikimrProto::OK)
- OnBSCPipeDestroyed(ctx);
-}
-
+}
+
+void TCms::Handle(TEvCms::TEvGetLogTailRequest::TPtr &ev, const TActorContext &ctx)
+{
+ Execute(CreateTxGetLogTail(ev), ctx);
+}
+
+void TCms::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ Execute(CreateTxUpdateConfig(ev), ctx);
+}
+
+void TCms::Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
+ const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+ if (rec.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS,
+ "Cannot subscribe for config updates: " << rec.GetStatus().GetCode()
+ << " " << rec.GetStatus().GetReason());
+
+ SubscribeForConfig(ctx);
+ return;
+ }
+
+ ConfigSubscriptionId = rec.GetSubscriptionId();
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "Got config subscription id=" << ConfigSubscriptionId);
+}
+
+void TCms::Handle(TEvents::TEvPoisonPill::TPtr &ev,
+ const TActorContext &ctx)
+{
+ Y_UNUSED(ev);
+ ctx.Send(Tablet(), new TEvents::TEvPoisonPill);
+}
+
+void TCms::Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev,
+ const TActorContext &ctx)
+{
+ auto *msg = ev->Get();
+ if (msg->ClientId == State->BSControllerPipe)
+ OnBSCPipeDestroyed(ctx);
+}
+
+void TCms::Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev,
+ const TActorContext &ctx)
+{
+ TEvTabletPipe::TEvClientConnected *msg = ev->Get();
+ if (msg->ClientId == State->BSControllerPipe && msg->Status != NKikimrProto::OK)
+ OnBSCPipeDestroyed(ctx);
+}
+
IActor *CreateCms(const TActorId &tablet, TTabletStorageInfo *info)
-{
- return new TCms(tablet, info);
-}
-
-} // NCms
-} // NKikimr
+{
+ return new TCms(tablet, info);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms.h b/ydb/core/cms/cms.h
index 2eaf8be654f..25cb8ef024b 100644
--- a/ydb/core/cms/cms.h
+++ b/ydb/core/cms/cms.h
@@ -1,293 +1,293 @@
-#pragma once
-
-#include "defs.h"
-#include "cluster_info.h"
-#include "cms_state.h"
-
+#pragma once
+
+#include "defs.h"
+#include "cluster_info.h"
+#include "cms_state.h"
+
#include <library/cpp/actors/interconnect/events_local.h>
#include <library/cpp/actors/core/actor.h>
#include <ydb/core/protos/cms.pb.h>
-
-/**
- * Here we declare interface for CMS (Cluster Management System) tablet whose intention
- * is to help with cluster maintenance. Primary CMS functionality includes:
- * - Grant permissions for maintenance actions (such as restart service or server,
- * replace disk etc.). Permission is given when requested action doesn't break
- * cluster availability. Current cluster status is collected from NodeWhiteboard
- * services at request processing time
- * - Manage issued permissions. Users may examine own permissions, extend and
- * reject them. Issued permissions affect cluster state and are taken into
- * account when other permission requests are processed
- * - Manage permission requests. If required action is temporarily disallowed
- * then user may put its request into requests queue and track its status.
- *
- * Currently CMS functionality doesn't include any manipulations with cluster. Thusly
- * it doesn't affect cluster state and configuration. Such functionality is planned
- * for the future though.
- *
- * More info about CMS may be found at:
- * https://wiki.yandex-team.ru/users/ienkovich/docs/ydb/cms/
- */
-
-namespace NKikimr {
-namespace NCms {
-
-struct TEvCms {
- enum EEv {
- EvClusterStateRequest = EventSpaceBegin(TKikimrEvents::ES_CMS),
- EvClusterStateResponse,
- EvPermissionRequest,
- EvCheckRequest,
- EvConditionalPermissionRequest,
- EvPermissionResponse,
- EvManageRequestRequest,
- EvManageRequestResponse,
- EvManagePermissionRequest,
- EvManagePermissionResponse,
- EvNotification,
- EvNotificationResponse,
- EvManageNotificationRequest,
- EvManageNotificationResponse,
- EvGetConfigRequest,
- EvSetConfigRequest,
- EvSetMarkerRequest,
- EvResetMarkerRequest,
- EvGetLogTailRequest,
- EvGetLogTailResponse,
-
- EvWalleCreateTaskRequest = EvClusterStateRequest + 512,
- EvWalleCreateTaskResponse,
- EvWalleListTasksRequest,
- EvWalleListTasksResponse,
- EvWalleCheckTaskRequest,
- EvWalleCheckTaskResponse,
- EvWalleRemoveTaskRequest,
- EvWalleRemoveTaskResponse,
- EvStoreWalleTask,
- EvWalleTaskStored,
- EvRemoveWalleTask,
- EvWalleTaskRemoved,
- EvGetConfigResponse,
- EvSetConfigResponse,
- EvSetMarkerResponse,
- EvResetMarkerResponse,
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_CMS), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_CMS)");
-
+
+/**
+ * Here we declare interface for CMS (Cluster Management System) tablet whose intention
+ * is to help with cluster maintenance. Primary CMS functionality includes:
+ * - Grant permissions for maintenance actions (such as restart service or server,
+ * replace disk etc.). Permission is given when requested action doesn't break
+ * cluster availability. Current cluster status is collected from NodeWhiteboard
+ * services at request processing time
+ * - Manage issued permissions. Users may examine own permissions, extend and
+ * reject them. Issued permissions affect cluster state and are taken into
+ * account when other permission requests are processed
+ * - Manage permission requests. If required action is temporarily disallowed
+ * then user may put its request into requests queue and track its status.
+ *
+ * Currently CMS functionality doesn't include any manipulations with cluster. Thusly
+ * it doesn't affect cluster state and configuration. Such functionality is planned
+ * for the future though.
+ *
+ * More info about CMS may be found at:
+ * https://wiki.yandex-team.ru/users/ienkovich/docs/ydb/cms/
+ */
+
+namespace NKikimr {
+namespace NCms {
+
+struct TEvCms {
+ enum EEv {
+ EvClusterStateRequest = EventSpaceBegin(TKikimrEvents::ES_CMS),
+ EvClusterStateResponse,
+ EvPermissionRequest,
+ EvCheckRequest,
+ EvConditionalPermissionRequest,
+ EvPermissionResponse,
+ EvManageRequestRequest,
+ EvManageRequestResponse,
+ EvManagePermissionRequest,
+ EvManagePermissionResponse,
+ EvNotification,
+ EvNotificationResponse,
+ EvManageNotificationRequest,
+ EvManageNotificationResponse,
+ EvGetConfigRequest,
+ EvSetConfigRequest,
+ EvSetMarkerRequest,
+ EvResetMarkerRequest,
+ EvGetLogTailRequest,
+ EvGetLogTailResponse,
+
+ EvWalleCreateTaskRequest = EvClusterStateRequest + 512,
+ EvWalleCreateTaskResponse,
+ EvWalleListTasksRequest,
+ EvWalleListTasksResponse,
+ EvWalleCheckTaskRequest,
+ EvWalleCheckTaskResponse,
+ EvWalleRemoveTaskRequest,
+ EvWalleRemoveTaskResponse,
+ EvStoreWalleTask,
+ EvWalleTaskStored,
+ EvRemoveWalleTask,
+ EvWalleTaskRemoved,
+ EvGetConfigResponse,
+ EvSetConfigResponse,
+ EvSetMarkerResponse,
+ EvResetMarkerResponse,
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_CMS), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_CMS)");
+
template <typename TEv, typename TRecord, ui32 TEventType>
using TEventPB = TEventShortDebugPB<TEv, TRecord, TEventType>;
- struct TEvClusterStateRequest : public TEventPB<TEvClusterStateRequest,
- NKikimrCms::TClusterStateRequest,
+ struct TEvClusterStateRequest : public TEventPB<TEvClusterStateRequest,
+ NKikimrCms::TClusterStateRequest,
EvClusterStateRequest> {
- };
-
- struct TEvClusterStateResponse : public TEventPB<TEvClusterStateResponse,
- NKikimrCms::TClusterStateResponse,
+ };
+
+ struct TEvClusterStateResponse : public TEventPB<TEvClusterStateResponse,
+ NKikimrCms::TClusterStateResponse,
EvClusterStateResponse> {
- };
-
- struct TEvPermissionRequest : public TEventPB<TEvPermissionRequest,
- NKikimrCms::TPermissionRequest,
+ };
+
+ struct TEvPermissionRequest : public TEventPB<TEvPermissionRequest,
+ NKikimrCms::TPermissionRequest,
EvPermissionRequest> {
- };
-
- struct TEvCheckRequest : public TEventPB<TEvCheckRequest,
- NKikimrCms::TCheckRequest,
+ };
+
+ struct TEvCheckRequest : public TEventPB<TEvCheckRequest,
+ NKikimrCms::TCheckRequest,
EvCheckRequest> {
- };
-
- struct TEvConditionalPermissionRequest : public TEventPB<TEvConditionalPermissionRequest,
- NKikimrCms::TConditionalPermissionRequest,
+ };
+
+ struct TEvConditionalPermissionRequest : public TEventPB<TEvConditionalPermissionRequest,
+ NKikimrCms::TConditionalPermissionRequest,
EvConditionalPermissionRequest> {
- };
-
- struct TEvPermissionResponse : public TEventPB<TEvPermissionResponse,
- NKikimrCms::TPermissionResponse,
+ };
+
+ struct TEvPermissionResponse : public TEventPB<TEvPermissionResponse,
+ NKikimrCms::TPermissionResponse,
EvPermissionResponse> {
- };
-
- struct TEvManageRequestRequest : public TEventPB<TEvManageRequestRequest,
- NKikimrCms::TManageRequestRequest,
+ };
+
+ struct TEvManageRequestRequest : public TEventPB<TEvManageRequestRequest,
+ NKikimrCms::TManageRequestRequest,
EvManageRequestRequest> {
- };
-
- struct TEvManageRequestResponse : public TEventPB<TEvManageRequestResponse,
- NKikimrCms::TManageRequestResponse,
+ };
+
+ struct TEvManageRequestResponse : public TEventPB<TEvManageRequestResponse,
+ NKikimrCms::TManageRequestResponse,
EvManageRequestResponse> {
- };
-
- struct TEvManagePermissionRequest : public TEventPB<TEvManagePermissionRequest,
- NKikimrCms::TManagePermissionRequest,
+ };
+
+ struct TEvManagePermissionRequest : public TEventPB<TEvManagePermissionRequest,
+ NKikimrCms::TManagePermissionRequest,
EvManagePermissionRequest> {
- };
-
- struct TEvManagePermissionResponse : public TEventPB<TEvManagePermissionResponse,
- NKikimrCms::TManagePermissionResponse,
+ };
+
+ struct TEvManagePermissionResponse : public TEventPB<TEvManagePermissionResponse,
+ NKikimrCms::TManagePermissionResponse,
EvManagePermissionResponse> {
- };
-
- struct TEvNotification : public TEventPB<TEvNotification,
- NKikimrCms::TNotification,
+ };
+
+ struct TEvNotification : public TEventPB<TEvNotification,
+ NKikimrCms::TNotification,
EvNotification> {
- };
-
- struct TEvNotificationResponse : public TEventPB<TEvNotificationResponse,
- NKikimrCms::TNotificationResponse,
+ };
+
+ struct TEvNotificationResponse : public TEventPB<TEvNotificationResponse,
+ NKikimrCms::TNotificationResponse,
EvNotificationResponse> {
- };
-
- struct TEvManageNotificationRequest : public TEventPB<TEvManageNotificationRequest,
- NKikimrCms::TManageNotificationRequest,
+ };
+
+ struct TEvManageNotificationRequest : public TEventPB<TEvManageNotificationRequest,
+ NKikimrCms::TManageNotificationRequest,
EvManageNotificationRequest> {
- };
-
- struct TEvManageNotificationResponse : public TEventPB<TEvManageNotificationResponse,
- NKikimrCms::TManageNotificationResponse,
+ };
+
+ struct TEvManageNotificationResponse : public TEventPB<TEvManageNotificationResponse,
+ NKikimrCms::TManageNotificationResponse,
EvManageNotificationResponse> {
- };
-
- struct TEvWalleCreateTaskRequest : public TEventPB<TEvWalleCreateTaskRequest,
- NKikimrCms::TWalleCreateTaskRequest,
- EvWalleCreateTaskRequest> {
- };
-
- struct TEvWalleCreateTaskResponse : public TEventPB<TEvWalleCreateTaskResponse,
- NKikimrCms::TWalleCreateTaskResponse,
- EvWalleCreateTaskResponse> {
- };
-
- struct TEvWalleListTasksRequest : public TEventPB<TEvWalleListTasksRequest,
- NKikimrCms::TWalleListTasksRequest,
- EvWalleListTasksRequest> {
- };
-
- struct TEvWalleListTasksResponse : public TEventPB<TEvWalleListTasksResponse,
- NKikimrCms::TWalleListTasksResponse,
- EvWalleListTasksResponse> {
- };
-
- struct TEvWalleCheckTaskRequest : public TEventPB<TEvWalleCheckTaskRequest,
- NKikimrCms::TWalleCheckTaskRequest,
- EvWalleCheckTaskRequest> {
- };
-
- struct TEvWalleCheckTaskResponse : public TEventPB<TEvWalleCheckTaskResponse,
- NKikimrCms::TWalleCheckTaskResponse,
- EvWalleCheckTaskResponse> {
- };
-
- struct TEvWalleRemoveTaskRequest : public TEventPB<TEvWalleRemoveTaskRequest,
- NKikimrCms::TWalleRemoveTaskRequest,
- EvWalleRemoveTaskRequest> {
- };
-
- struct TEvWalleRemoveTaskResponse : public TEventPB<TEvWalleRemoveTaskResponse,
- NKikimrCms::TWalleRemoveTaskResponse,
- EvWalleRemoveTaskResponse> {
- };
-
- struct TEvStoreWalleTask : public TEventLocal<TEvStoreWalleTask, EvStoreWalleTask> {
- TWalleTaskInfo Task;
-
- TString ToString() const override
- {
+ };
+
+ struct TEvWalleCreateTaskRequest : public TEventPB<TEvWalleCreateTaskRequest,
+ NKikimrCms::TWalleCreateTaskRequest,
+ EvWalleCreateTaskRequest> {
+ };
+
+ struct TEvWalleCreateTaskResponse : public TEventPB<TEvWalleCreateTaskResponse,
+ NKikimrCms::TWalleCreateTaskResponse,
+ EvWalleCreateTaskResponse> {
+ };
+
+ struct TEvWalleListTasksRequest : public TEventPB<TEvWalleListTasksRequest,
+ NKikimrCms::TWalleListTasksRequest,
+ EvWalleListTasksRequest> {
+ };
+
+ struct TEvWalleListTasksResponse : public TEventPB<TEvWalleListTasksResponse,
+ NKikimrCms::TWalleListTasksResponse,
+ EvWalleListTasksResponse> {
+ };
+
+ struct TEvWalleCheckTaskRequest : public TEventPB<TEvWalleCheckTaskRequest,
+ NKikimrCms::TWalleCheckTaskRequest,
+ EvWalleCheckTaskRequest> {
+ };
+
+ struct TEvWalleCheckTaskResponse : public TEventPB<TEvWalleCheckTaskResponse,
+ NKikimrCms::TWalleCheckTaskResponse,
+ EvWalleCheckTaskResponse> {
+ };
+
+ struct TEvWalleRemoveTaskRequest : public TEventPB<TEvWalleRemoveTaskRequest,
+ NKikimrCms::TWalleRemoveTaskRequest,
+ EvWalleRemoveTaskRequest> {
+ };
+
+ struct TEvWalleRemoveTaskResponse : public TEventPB<TEvWalleRemoveTaskResponse,
+ NKikimrCms::TWalleRemoveTaskResponse,
+ EvWalleRemoveTaskResponse> {
+ };
+
+ struct TEvStoreWalleTask : public TEventLocal<TEvStoreWalleTask, EvStoreWalleTask> {
+ TWalleTaskInfo Task;
+
+ TString ToString() const override
+ {
return Sprintf("%s { Task: %s }", ToStringHeader().data(), Task.ToString().data());
- }
- };
-
- struct TEvWalleTaskStored : public TEventLocal<TEvWalleTaskStored, EvWalleTaskStored> {
- TString TaskId;
-
- TEvWalleTaskStored(TString id)
- : TaskId(id)
- {
- }
-
- TString ToString() const override
- {
+ }
+ };
+
+ struct TEvWalleTaskStored : public TEventLocal<TEvWalleTaskStored, EvWalleTaskStored> {
+ TString TaskId;
+
+ TEvWalleTaskStored(TString id)
+ : TaskId(id)
+ {
+ }
+
+ TString ToString() const override
+ {
return Sprintf("%s { TaskId: %s }", ToStringHeader().data(), TaskId.data());
- }
- };
-
- struct TEvRemoveWalleTask : public TEventLocal<TEvRemoveWalleTask, EvRemoveWalleTask> {
- TString TaskId;
-
- TString ToString() const override
- {
+ }
+ };
+
+ struct TEvRemoveWalleTask : public TEventLocal<TEvRemoveWalleTask, EvRemoveWalleTask> {
+ TString TaskId;
+
+ TString ToString() const override
+ {
return Sprintf("%s { TaskId: %s }", ToStringHeader().data(), TaskId.data());
- }
- };
-
- struct TEvWalleTaskRemoved : public TEventLocal<TEvWalleTaskRemoved, EvWalleTaskRemoved> {
- TString TaskId;
-
- TEvWalleTaskRemoved(TString id)
- : TaskId(id)
- {
- }
-
- TString ToString() const override
- {
+ }
+ };
+
+ struct TEvWalleTaskRemoved : public TEventLocal<TEvWalleTaskRemoved, EvWalleTaskRemoved> {
+ TString TaskId;
+
+ TEvWalleTaskRemoved(TString id)
+ : TaskId(id)
+ {
+ }
+
+ TString ToString() const override
+ {
return Sprintf("%s { TaskId: %s }", ToStringHeader().data(), TaskId.data());
- }
- };
-
- struct TEvGetConfigRequest : public TEventPB<TEvGetConfigRequest,
- NKikimrCms::TGetConfigRequest,
+ }
+ };
+
+ struct TEvGetConfigRequest : public TEventPB<TEvGetConfigRequest,
+ NKikimrCms::TGetConfigRequest,
EvGetConfigRequest> {
- };
-
- struct TEvGetConfigResponse : public TEventPB<TEvGetConfigResponse,
- NKikimrCms::TGetConfigResponse,
+ };
+
+ struct TEvGetConfigResponse : public TEventPB<TEvGetConfigResponse,
+ NKikimrCms::TGetConfigResponse,
EvGetConfigResponse> {
- };
-
- struct TEvSetConfigRequest : public TEventPB<TEvSetConfigRequest,
- NKikimrCms::TSetConfigRequest,
+ };
+
+ struct TEvSetConfigRequest : public TEventPB<TEvSetConfigRequest,
+ NKikimrCms::TSetConfigRequest,
EvSetConfigRequest> {
- };
-
- struct TEvSetConfigResponse : public TEventPB<TEvSetConfigResponse,
- NKikimrCms::TSetConfigResponse,
+ };
+
+ struct TEvSetConfigResponse : public TEventPB<TEvSetConfigResponse,
+ NKikimrCms::TSetConfigResponse,
EvSetConfigResponse> {
- };
-
- struct TEvSetMarkerRequest : public TEventPB<TEvSetMarkerRequest,
- NKikimrCms::TSetMarkerRequest,
- EvSetMarkerRequest> {
- };
-
- struct TEvSetMarkerResponse : public TEventPB<TEvSetMarkerResponse,
- NKikimrCms::TSetMarkerResponse,
- EvSetMarkerResponse> {
- };
-
- struct TEvResetMarkerRequest : public TEventPB<TEvResetMarkerRequest,
- NKikimrCms::TResetMarkerRequest,
- EvResetMarkerRequest> {
- };
-
- struct TEvResetMarkerResponse : public TEventPB<TEvResetMarkerResponse,
- NKikimrCms::TResetMarkerResponse,
- EvResetMarkerResponse> {
- };
-
- struct TEvGetLogTailRequest : public TEventPB<TEvGetLogTailRequest,
- NKikimrCms::TGetLogTailRequest,
- EvGetLogTailRequest> {
- };
-
- struct TEvGetLogTailResponse : public TEventPB<TEvGetLogTailResponse,
- NKikimrCms::TGetLogTailResponse,
- EvGetLogTailResponse> {
- };
-};
-
+ };
+
+ struct TEvSetMarkerRequest : public TEventPB<TEvSetMarkerRequest,
+ NKikimrCms::TSetMarkerRequest,
+ EvSetMarkerRequest> {
+ };
+
+ struct TEvSetMarkerResponse : public TEventPB<TEvSetMarkerResponse,
+ NKikimrCms::TSetMarkerResponse,
+ EvSetMarkerResponse> {
+ };
+
+ struct TEvResetMarkerRequest : public TEventPB<TEvResetMarkerRequest,
+ NKikimrCms::TResetMarkerRequest,
+ EvResetMarkerRequest> {
+ };
+
+ struct TEvResetMarkerResponse : public TEventPB<TEvResetMarkerResponse,
+ NKikimrCms::TResetMarkerResponse,
+ EvResetMarkerResponse> {
+ };
+
+ struct TEvGetLogTailRequest : public TEventPB<TEvGetLogTailRequest,
+ NKikimrCms::TGetLogTailRequest,
+ EvGetLogTailRequest> {
+ };
+
+ struct TEvGetLogTailResponse : public TEventPB<TEvGetLogTailResponse,
+ NKikimrCms::TGetLogTailResponse,
+ EvGetLogTailResponse> {
+ };
+};
+
IActor *CreateCms(const TActorId &tablet, TTabletStorageInfo *info);
-
-} // NCms
-} // NKikimr
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_impl.h b/ydb/core/cms/cms_impl.h
index 3dfa8b91111..48138884907 100644
--- a/ydb/core/cms/cms_impl.h
+++ b/ydb/core/cms/cms_impl.h
@@ -1,447 +1,447 @@
-#pragma once
-
+#pragma once
+
#include "audit_log.h"
-#include "cms.h"
-#include "config.h"
-#include "logger.h"
+#include "cms.h"
+#include "config.h"
+#include "logger.h"
#include "services.h"
-#include "walle.h"
-
+#include "walle.h"
+
#include <library/cpp/actors/core/hfunc.h>
#include <library/cpp/actors/core/interconnect.h>
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/cms/console/console.h>
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
#include <ydb/core/engine/minikql/flat_local_tx_factory.h>
-
-#include <util/generic/stack.h>
+
+#include <util/generic/stack.h>
#include <util/generic/queue.h>
-
-namespace NKikimr {
-namespace NCms {
-
-using NConsole::TEvConsole;
-using NTabletFlatExecutor::TTabletExecutedFlat;
-using NTabletFlatExecutor::ITransaction;
-using NTabletFlatExecutor::TTransactionBase;
-using NTabletFlatExecutor::TTransactionContext;
-
-class TCms : public TActor<TCms>, public TTabletExecutedFlat {
-public:
- struct TEvPrivate {
- enum EEv {
- EvClusterInfo = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
+
+namespace NKikimr {
+namespace NCms {
+
+using NConsole::TEvConsole;
+using NTabletFlatExecutor::TTabletExecutedFlat;
+using NTabletFlatExecutor::ITransaction;
+using NTabletFlatExecutor::TTransactionBase;
+using NTabletFlatExecutor::TTransactionContext;
+
+class TCms : public TActor<TCms>, public TTabletExecutedFlat {
+public:
+ struct TEvPrivate {
+ enum EEv {
+ EvClusterInfo = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
EvUpdateClusterInfo,
- EvCleanupExpired,
- EvCleanupWalle,
- EvLogAndSend,
- EvCleanupLog,
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
-
- struct TEvClusterInfo : public TEventLocal<TEvClusterInfo, EvClusterInfo> {
- bool Success = true;
- TClusterInfoPtr Info;
-
- TString ToString() const override
- {
- return "TEvClusterInfo";
- }
- };
-
+ EvCleanupExpired,
+ EvCleanupWalle,
+ EvLogAndSend,
+ EvCleanupLog,
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
+
+ struct TEvClusterInfo : public TEventLocal<TEvClusterInfo, EvClusterInfo> {
+ bool Success = true;
+ TClusterInfoPtr Info;
+
+ TString ToString() const override
+ {
+ return "TEvClusterInfo";
+ }
+ };
+
struct TEvUpdateClusterInfo : public TEventLocal<TEvUpdateClusterInfo, EvUpdateClusterInfo> {};
- struct TEvCleanupExpired : public TEventLocal<TEvCleanupExpired, EvCleanupExpired> {};
-
- struct TEvCleanupWalle : public TEventLocal<TEvCleanupWalle, EvCleanupWalle> {};
-
- struct TEvLogAndSend : public TEventLocal<TEvLogAndSend, EvLogAndSend> {
- NKikimrCms::TLogRecordData LogData;
- THolder<IEventHandle> Event;
- };
-
- struct TEvCleanupLog : public TEventLocal<TEvCleanupLog, EvCleanupLog> {};
- };
-
+ struct TEvCleanupExpired : public TEventLocal<TEvCleanupExpired, EvCleanupExpired> {};
+
+ struct TEvCleanupWalle : public TEventLocal<TEvCleanupWalle, EvCleanupWalle> {};
+
+ struct TEvLogAndSend : public TEventLocal<TEvLogAndSend, EvLogAndSend> {
+ NKikimrCms::TLogRecordData LogData;
+ THolder<IEventHandle> Event;
+ };
+
+ struct TEvCleanupLog : public TEventLocal<TEvCleanupLog, EvCleanupLog> {};
+ };
+
void PersistNodeTenants(TTransactionContext& txc, const TActorContext& ctx);
-private:
- using TActorBase = TActor<TCms>;
- using EStatusCode = NKikimrCms::TStatus::ECode;
-
- class TTxGetLogTail;
- class TTxInitScheme;
- class TTxLoadState;
- class TTxLogAndSend;
- class TTxLogCleanup;
- class TTxProcessNotification;
- class TTxRejectNotification;
- class TTxRemoveExpiredNotifications;
- class TTxRemoveRequest;
- class TTxRemovePermissions;
- class TTxRemoveWalleTask;
- class TTxStorePermissions;
- class TTxStoreWalleTask;
- class TTxUpdateConfig;
- class TTxUpdateDowntimes;
-
+private:
+ using TActorBase = TActor<TCms>;
+ using EStatusCode = NKikimrCms::TStatus::ECode;
+
+ class TTxGetLogTail;
+ class TTxInitScheme;
+ class TTxLoadState;
+ class TTxLogAndSend;
+ class TTxLogCleanup;
+ class TTxProcessNotification;
+ class TTxRejectNotification;
+ class TTxRemoveExpiredNotifications;
+ class TTxRemoveRequest;
+ class TTxRemovePermissions;
+ class TTxRemoveWalleTask;
+ class TTxStorePermissions;
+ class TTxStoreWalleTask;
+ class TTxUpdateConfig;
+ class TTxUpdateDowntimes;
+
struct TActionOptions {
TDuration PermissionDuration;
NKikimrCms::ETenantPolicy TenantPolicy;
- NKikimrCms::EAvailabilityMode AvailabilityMode;
+ NKikimrCms::EAvailabilityMode AvailabilityMode;
TActionOptions(TDuration dur)
: PermissionDuration(dur)
- , TenantPolicy(NKikimrCms::DEFAULT)
- , AvailabilityMode(NKikimrCms::MODE_MAX_AVAILABILITY)
+ , TenantPolicy(NKikimrCms::DEFAULT)
+ , AvailabilityMode(NKikimrCms::MODE_MAX_AVAILABILITY)
{}
};
- struct TNodeCounter {
- ui32 Total = 0;
- ui32 Down = 0;
- ui32 Locked = 0;
- NKikimrCms::TStatus::ECode Code = NKikimrCms::TStatus::DISALLOW_TEMP;
-
- void CountNode(const TNodeInfo &node, bool ignoreDownState);
- // Check if we can lock one more node and stay in lock limits.
- bool CheckLimit(ui32 limit, NKikimrCms::EAvailabilityMode mode) const;
- // Check if we can lock one more node and stay in lock ration limits.
- bool CheckRatio(ui32 ratio, NKikimrCms::EAvailabilityMode mode) const;
- };
-
- // Used to count down and locked disks in a group
- // excluding one them. It allows to check if excluded
- // disk may be locked.
- struct TGroupCounter {
- ui32 Down;
- ui32 Locked;
- const TVDiskInfo &VDisk;
- ui32 GroupId;
- NKikimrCms::TStatus::ECode Code;
- TVector<TString> Errors;
- TInstant Deadline;
-
- TGroupCounter(const TVDiskInfo &vdisk,
- ui32 groupId,
- TInstant defaultDeadline)
- : Down(0)
- , Locked(0)
- , VDisk(vdisk)
- , GroupId(groupId)
- , Code(NKikimrCms::TStatus::DISALLOW_TEMP)
- , Deadline(defaultDeadline)
- {
- }
-
- void CountVDisk(const TVDiskInfo &vdisk,
- TClusterInfoPtr info,
- TDuration retryTime,
- TDuration duration);
- };
-
- ITransaction *CreateTxGetLogTail(TEvCms::TEvGetLogTailRequest::TPtr &ev);
- ITransaction *CreateTxInitScheme();
- ITransaction *CreateTxLoadState();
- ITransaction *CreateTxLogAndSend(TEvPrivate::TEvLogAndSend::TPtr &ev);
- ITransaction *CreateTxLogCleanup();
- ITransaction *CreateTxProcessNotification(TEvCms::TEvNotification::TPtr &ev);
- ITransaction *CreateTxRejectNotification(TEvCms::TEvManageNotificationRequest::TPtr &ev);
- ITransaction *CreateTxRemoveExpiredNotifications();
+ struct TNodeCounter {
+ ui32 Total = 0;
+ ui32 Down = 0;
+ ui32 Locked = 0;
+ NKikimrCms::TStatus::ECode Code = NKikimrCms::TStatus::DISALLOW_TEMP;
+
+ void CountNode(const TNodeInfo &node, bool ignoreDownState);
+ // Check if we can lock one more node and stay in lock limits.
+ bool CheckLimit(ui32 limit, NKikimrCms::EAvailabilityMode mode) const;
+ // Check if we can lock one more node and stay in lock ration limits.
+ bool CheckRatio(ui32 ratio, NKikimrCms::EAvailabilityMode mode) const;
+ };
+
+ // Used to count down and locked disks in a group
+ // excluding one them. It allows to check if excluded
+ // disk may be locked.
+ struct TGroupCounter {
+ ui32 Down;
+ ui32 Locked;
+ const TVDiskInfo &VDisk;
+ ui32 GroupId;
+ NKikimrCms::TStatus::ECode Code;
+ TVector<TString> Errors;
+ TInstant Deadline;
+
+ TGroupCounter(const TVDiskInfo &vdisk,
+ ui32 groupId,
+ TInstant defaultDeadline)
+ : Down(0)
+ , Locked(0)
+ , VDisk(vdisk)
+ , GroupId(groupId)
+ , Code(NKikimrCms::TStatus::DISALLOW_TEMP)
+ , Deadline(defaultDeadline)
+ {
+ }
+
+ void CountVDisk(const TVDiskInfo &vdisk,
+ TClusterInfoPtr info,
+ TDuration retryTime,
+ TDuration duration);
+ };
+
+ ITransaction *CreateTxGetLogTail(TEvCms::TEvGetLogTailRequest::TPtr &ev);
+ ITransaction *CreateTxInitScheme();
+ ITransaction *CreateTxLoadState();
+ ITransaction *CreateTxLogAndSend(TEvPrivate::TEvLogAndSend::TPtr &ev);
+ ITransaction *CreateTxLogCleanup();
+ ITransaction *CreateTxProcessNotification(TEvCms::TEvNotification::TPtr &ev);
+ ITransaction *CreateTxRejectNotification(TEvCms::TEvManageNotificationRequest::TPtr &ev);
+ ITransaction *CreateTxRemoveExpiredNotifications();
ITransaction *CreateTxRemoveRequest(const TString &id, THolder<IEventBase> req, TAutoPtr<IEventHandle> resp);
ITransaction *CreateTxRemovePermissions(TVector<TString> ids, THolder<IEventBase> req, TAutoPtr<IEventHandle> resp, bool expired = false);
ITransaction *CreateTxRemoveWalleTask(const TString &id);
ITransaction *CreateTxStorePermissions(THolder<IEventBase> req, TAutoPtr<IEventHandle> resp,
const TString &owner, TAutoPtr<TRequestInfo> scheduled);
ITransaction *CreateTxStoreWalleTask(const TWalleTaskInfo &task, THolder<IEventBase> req, TAutoPtr<IEventHandle> resp);
- ITransaction *CreateTxUpdateConfig(TEvCms::TEvSetConfigRequest::TPtr &ev);
- ITransaction *CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev);
- ITransaction *CreateTxUpdateDowntimes();
-
+ ITransaction *CreateTxUpdateConfig(TEvCms::TEvSetConfigRequest::TPtr &ev);
+ ITransaction *CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev);
+ ITransaction *CreateTxUpdateDowntimes();
+
static void AuditLog(const TActorContext& ctx, const TString& message) {
NCms::AuditLog("CMS tablet", message, ctx);
}
-
+
static void AuditLog(const IEventBase* request, const IEventBase* response, const TActorContext& ctx) {
return AuditLog(ctx, TStringBuilder() << "Reply"
<< ": request# " << request->ToString()
<< ", response# " << response->ToString());
}
-
+
static void Reply(const IEventBase* request, TAutoPtr<IEventHandle> response, const TActorContext& ctx) {
AuditLog(request, response->GetBase(), ctx);
ctx.Send(response);
- }
-
+ }
+
template <typename TEvRequestPtr>
static void Reply(TEvRequestPtr& request, THolder<IEventBase> response, const TActorContext& ctx) {
AuditLog(request->Get(), response.Get(), ctx);
ctx.Send(request->Sender, response.Release(), 0, request->Cookie);
}
-
+
template <typename TEvResponse, typename TEvRequestPtr>
static void ReplyWithError(TEvRequestPtr& ev, EStatusCode code, const TString& reason, const TActorContext& ctx) {
auto response = MakeHolder<TEvResponse>();
response->Record.MutableStatus()->SetCode(code);
response->Record.MutableStatus()->SetReason(reason);
-
+
Reply<TEvRequestPtr>(ev, std::move(response), ctx);
- }
-
- STFUNC(StateInit)
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "StateInit event type: %" PRIx32 " event: %s",
+ }
+
+ STFUNC(StateInit)
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "StateInit event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- StateInitImpl(ev, ctx);
- }
-
+ StateInitImpl(ev, ctx);
+ }
+
template <typename TEvRequest, typename TEvResponse>
void HandleNotSupported(typename TEvRequest::TPtr& ev, const TActorContext& ctx) {
ReplyWithError<TEvResponse, typename TEvRequest::TPtr>(ev, NKikimrCms::TStatus::ERROR, NotSupportedReason, ctx);
- }
-
- STFUNC(StateNotSupported)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvCms::TEvClusterStateRequest, (HandleNotSupported<TEvCms::TEvClusterStateRequest,
- TEvCms::TEvClusterStateResponse>));
- HFunc(TEvCms::TEvPermissionRequest, (HandleNotSupported<TEvCms::TEvPermissionRequest,
- TEvCms::TEvPermissionResponse>));
- HFunc(TEvCms::TEvManageRequestRequest, (HandleNotSupported<TEvCms::TEvManageRequestRequest,
- TEvCms::TEvManageRequestResponse>));
- HFunc(TEvCms::TEvCheckRequest, (HandleNotSupported<TEvCms::TEvCheckRequest,
- TEvCms::TEvPermissionResponse>));
- HFunc(TEvCms::TEvManagePermissionRequest, (HandleNotSupported<TEvCms::TEvManagePermissionRequest,
- TEvCms::TEvManagePermissionResponse>));
- HFunc(TEvCms::TEvConditionalPermissionRequest, (HandleNotSupported<TEvCms::TEvConditionalPermissionRequest,
- TEvCms::TEvPermissionResponse>));
- HFunc(TEvCms::TEvNotification, (HandleNotSupported<TEvCms::TEvNotification,
- TEvCms::TEvNotificationResponse>));
- HFunc(TEvCms::TEvManageNotificationRequest, (HandleNotSupported<TEvCms::TEvManageNotificationRequest,
- TEvCms::TEvManageNotificationResponse>));
- IgnoreFunc(TEvTabletPipe::TEvServerConnected);
- IgnoreFunc(TEvTabletPipe::TEvServerDisconnected);
-
- default:
- if (!HandleDefaultEvents(ev, ctx)) {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "StateNotSupported unexpected event type: %" PRIx32 " event: %s",
+ }
+
+ STFUNC(StateNotSupported)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvCms::TEvClusterStateRequest, (HandleNotSupported<TEvCms::TEvClusterStateRequest,
+ TEvCms::TEvClusterStateResponse>));
+ HFunc(TEvCms::TEvPermissionRequest, (HandleNotSupported<TEvCms::TEvPermissionRequest,
+ TEvCms::TEvPermissionResponse>));
+ HFunc(TEvCms::TEvManageRequestRequest, (HandleNotSupported<TEvCms::TEvManageRequestRequest,
+ TEvCms::TEvManageRequestResponse>));
+ HFunc(TEvCms::TEvCheckRequest, (HandleNotSupported<TEvCms::TEvCheckRequest,
+ TEvCms::TEvPermissionResponse>));
+ HFunc(TEvCms::TEvManagePermissionRequest, (HandleNotSupported<TEvCms::TEvManagePermissionRequest,
+ TEvCms::TEvManagePermissionResponse>));
+ HFunc(TEvCms::TEvConditionalPermissionRequest, (HandleNotSupported<TEvCms::TEvConditionalPermissionRequest,
+ TEvCms::TEvPermissionResponse>));
+ HFunc(TEvCms::TEvNotification, (HandleNotSupported<TEvCms::TEvNotification,
+ TEvCms::TEvNotificationResponse>));
+ HFunc(TEvCms::TEvManageNotificationRequest, (HandleNotSupported<TEvCms::TEvManageNotificationRequest,
+ TEvCms::TEvManageNotificationResponse>));
+ IgnoreFunc(TEvTabletPipe::TEvServerConnected);
+ IgnoreFunc(TEvTabletPipe::TEvServerDisconnected);
+
+ default:
+ if (!HandleDefaultEvents(ev, ctx)) {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "StateNotSupported unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
- }
-
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvPrivate::TEvClusterInfo, Handle);
- HFunc(TEvPrivate::TEvLogAndSend, Handle);
+ }
+ }
+ }
+
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvPrivate::TEvClusterInfo, Handle);
+ HFunc(TEvPrivate::TEvLogAndSend, Handle);
FFunc(TEvPrivate::EvUpdateClusterInfo, EnqueueRequest);
- CFunc(TEvPrivate::EvCleanupExpired, CleanupExpired);
- CFunc(TEvPrivate::EvCleanupLog, CleanupLog);
- CFunc(TEvPrivate::EvCleanupWalle, CleanupWalleTasks);
- FFunc(TEvCms::EvClusterStateRequest, EnqueueRequest);
- HFunc(TEvCms::TEvPermissionRequest, CheckAndEnqueueRequest);
- HFunc(TEvCms::TEvManageRequestRequest, Handle);
- HFunc(TEvCms::TEvCheckRequest, CheckAndEnqueueRequest);
- HFunc(TEvCms::TEvManagePermissionRequest, Handle);
- HFunc(TEvCms::TEvConditionalPermissionRequest, CheckAndEnqueueRequest);
- HFunc(TEvCms::TEvNotification, CheckAndEnqueueRequest);
- HFunc(TEvCms::TEvManageNotificationRequest, Handle);
- HFunc(TEvCms::TEvWalleCreateTaskRequest, Handle);
- HFunc(TEvCms::TEvWalleListTasksRequest, Handle);
- HFunc(TEvCms::TEvWalleCheckTaskRequest, Handle);
- HFunc(TEvCms::TEvWalleRemoveTaskRequest, Handle);
- HFunc(TEvCms::TEvStoreWalleTask, Handle);
- HFunc(TEvCms::TEvRemoveWalleTask, Handle);
- HFunc(TEvCms::TEvGetConfigRequest, Handle);
- HFunc(TEvCms::TEvSetConfigRequest, Handle);
+ CFunc(TEvPrivate::EvCleanupExpired, CleanupExpired);
+ CFunc(TEvPrivate::EvCleanupLog, CleanupLog);
+ CFunc(TEvPrivate::EvCleanupWalle, CleanupWalleTasks);
+ FFunc(TEvCms::EvClusterStateRequest, EnqueueRequest);
+ HFunc(TEvCms::TEvPermissionRequest, CheckAndEnqueueRequest);
+ HFunc(TEvCms::TEvManageRequestRequest, Handle);
+ HFunc(TEvCms::TEvCheckRequest, CheckAndEnqueueRequest);
+ HFunc(TEvCms::TEvManagePermissionRequest, Handle);
+ HFunc(TEvCms::TEvConditionalPermissionRequest, CheckAndEnqueueRequest);
+ HFunc(TEvCms::TEvNotification, CheckAndEnqueueRequest);
+ HFunc(TEvCms::TEvManageNotificationRequest, Handle);
+ HFunc(TEvCms::TEvWalleCreateTaskRequest, Handle);
+ HFunc(TEvCms::TEvWalleListTasksRequest, Handle);
+ HFunc(TEvCms::TEvWalleCheckTaskRequest, Handle);
+ HFunc(TEvCms::TEvWalleRemoveTaskRequest, Handle);
+ HFunc(TEvCms::TEvStoreWalleTask, Handle);
+ HFunc(TEvCms::TEvRemoveWalleTask, Handle);
+ HFunc(TEvCms::TEvGetConfigRequest, Handle);
+ HFunc(TEvCms::TEvSetConfigRequest, Handle);
HFunc(TEvCms::TEvResetMarkerRequest, Handle);
HFunc(TEvCms::TEvSetMarkerRequest, Handle);
- HFunc(TEvCms::TEvGetLogTailRequest, Handle);
- HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
- HFunc(TEvConsole::TEvReplaceConfigSubscriptionsResponse, Handle);
- HFunc(TEvents::TEvPoisonPill, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- IgnoreFunc(TEvTabletPipe::TEvServerConnected);
- IgnoreFunc(TEvTabletPipe::TEvServerDisconnected);
-
- default:
- if (!HandleDefaultEvents(ev, ctx)) {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "StateWork unexpected event type: %" PRIx32 " event: %s",
+ HFunc(TEvCms::TEvGetLogTailRequest, Handle);
+ HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
+ HFunc(TEvConsole::TEvReplaceConfigSubscriptionsResponse, Handle);
+ HFunc(TEvents::TEvPoisonPill, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ IgnoreFunc(TEvTabletPipe::TEvServerConnected);
+ IgnoreFunc(TEvTabletPipe::TEvServerDisconnected);
+
+ default:
+ if (!HandleDefaultEvents(ev, ctx)) {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "StateWork unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
- }
-
- void OnActivateExecutor(const TActorContext &ctx) override;
- void OnDetach(const TActorContext &ctx) override;
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev, const TActorContext &ctx) override;
-
- void Enqueue(TAutoPtr<IEventHandle> &ev,
- const TActorContext &ctx) override;
- void ProcessInitQueue(const TActorContext &ctx);
-
- void SubscribeForConfig(const TActorContext &ctx);
- void AdjustInfo(TClusterInfoPtr &info, const TActorContext &ctx) const;
- bool CheckPermissionRequest(const NKikimrCms::TPermissionRequest &request,
- NKikimrCms::TPermissionResponse &response,
- NKikimrCms::TPermissionRequest &scheduled,
- const TActorContext &ctx);
- bool IsActionHostValid(const NKikimrCms::TAction &action, TErrorInfo &error) const;
- bool ParseServices(const NKikimrCms::TAction &action, TServices &services,
- TErrorInfo &error) const;
-
- bool CheckAccess(const TString &token,
- NKikimrCms::TStatus::ECode &code,
- TString &error,
- const TActorContext &ctx);
+ }
+ }
+ }
+
+ void OnActivateExecutor(const TActorContext &ctx) override;
+ void OnDetach(const TActorContext &ctx) override;
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev, const TActorContext &ctx) override;
+
+ void Enqueue(TAutoPtr<IEventHandle> &ev,
+ const TActorContext &ctx) override;
+ void ProcessInitQueue(const TActorContext &ctx);
+
+ void SubscribeForConfig(const TActorContext &ctx);
+ void AdjustInfo(TClusterInfoPtr &info, const TActorContext &ctx) const;
+ bool CheckPermissionRequest(const NKikimrCms::TPermissionRequest &request,
+ NKikimrCms::TPermissionResponse &response,
+ NKikimrCms::TPermissionRequest &scheduled,
+ const TActorContext &ctx);
+ bool IsActionHostValid(const NKikimrCms::TAction &action, TErrorInfo &error) const;
+ bool ParseServices(const NKikimrCms::TAction &action, TServices &services,
+ TErrorInfo &error) const;
+
+ bool CheckAccess(const TString &token,
+ NKikimrCms::TStatus::ECode &code,
+ TString &error,
+ const TActorContext &ctx);
bool CheckAction(const NKikimrCms::TAction &action, const TActionOptions &options,
- TErrorInfo &error) const;
+ TErrorInfo &error) const;
bool CheckActionShutdownNode(const NKikimrCms::TAction &action,
const TActionOptions &options,
const TNodeInfo &node,
TErrorInfo &error) const;
- bool CheckActionRestartServices(const NKikimrCms::TAction &action,
+ bool CheckActionRestartServices(const NKikimrCms::TAction &action,
const TActionOptions &options,
- TErrorInfo &error) const;
- bool CheckActionShutdownHost(const NKikimrCms::TAction &action,
+ TErrorInfo &error) const;
+ bool CheckActionShutdownHost(const NKikimrCms::TAction &action,
const TActionOptions &options,
- TErrorInfo &error) const;
- bool CheckActionReplaceDevices(const NKikimrCms::TAction &action,
+ TErrorInfo &error) const;
+ bool CheckActionReplaceDevices(const NKikimrCms::TAction &action,
const TActionOptions &options,
- TErrorInfo &error) const;
+ TErrorInfo &error) const;
bool TryToLockNode(const NKikimrCms::TAction &action,
const TActionOptions &options,
const TNodeInfo &node,
- TErrorInfo& error) const;
- bool TryToLockPDisk(const NKikimrCms::TAction &action,
+ TErrorInfo& error) const;
+ bool TryToLockPDisk(const NKikimrCms::TAction &action,
const TActionOptions &options,
- const TPDiskInfo &pdisk,
- TErrorInfo &error) const;
- bool TryToLockVDisks(const NKikimrCms::TAction &action,
+ const TPDiskInfo &pdisk,
+ TErrorInfo &error) const;
+ bool TryToLockVDisks(const NKikimrCms::TAction &action,
const TActionOptions &options,
- const TSet<TVDiskID> &vdisks,
- TErrorInfo &error) const;
+ const TSet<TVDiskID> &vdisks,
+ TErrorInfo &error) const;
bool TryToLockVDisk(const TActionOptions &options,
- const TVDiskInfo &vdisk,
- TDuration duration,
- TErrorInfo &error) const;
- void AcceptPermissions(NKikimrCms::TPermissionResponse &resp, const TString &requestId,
+ const TVDiskInfo &vdisk,
+ TDuration duration,
+ TErrorInfo &error) const;
+ void AcceptPermissions(NKikimrCms::TPermissionResponse &resp, const TString &requestId,
const TString &owner, const TActorContext &ctx, bool check = false);
void ScheduleUpdateClusterInfo(const TActorContext &ctx, bool now = false);
- void ScheduleCleanup(TInstant time, const TActorContext &ctx);
- void SchedulePermissionsCleanup(const TActorContext &ctx);
- void ScheduleNotificationsCleanup(const TActorContext &ctx);
- void CleanupExpired(const TActorContext &ctx);
- void CleanupLog(const TActorContext &ctx);
- void ScheduleLogCleanup(const TActorContext &ctx);
- void DoPermissionsCleanup(const TActorContext &ctx);
- void CleanupWalleTasks(const TActorContext &ctx);
- void RemoveEmptyWalleTasks(const TActorContext &ctx);
- bool CheckNotificationDeadline(const NKikimrCms::TAction &action, TInstant time,
- TErrorInfo &error, const TActorContext &ctx) const;
- bool CheckNotificationRestartServices(const NKikimrCms::TAction &action, TInstant time,
- TErrorInfo &error, const TActorContext &ctx) const;
- bool CheckNotificationShutdownHost(const NKikimrCms::TAction &action, TInstant time,
- TErrorInfo &error, const TActorContext &ctx) const;
- bool CheckNotificationReplaceDevices(const NKikimrCms::TAction &action, TInstant time,
- TErrorInfo &error, const TActorContext &ctx) const;
- bool IsValidNotificationAction(const NKikimrCms::TAction &action, TInstant time,
- TErrorInfo &error, const TActorContext &ctx) const;
- TString AcceptNotification(const NKikimrCms::TNotification &notification,
- const TActorContext &ctx);
- bool CheckNotification(const NKikimrCms::TNotification &notification,
- NKikimrCms::TNotificationResponse &resp,
- const TActorContext &ctx) const;
-
- void Cleanup(const TActorContext &ctx);
- void Die(const TActorContext& ctx) override;
-
- void AddHostState(const TNodeInfo &node, NKikimrCms::TClusterStateResponse &resp, TInstant timestamp);
- void GetPermission(TEvCms::TEvManagePermissionRequest::TPtr &ev, bool all, const TActorContext &ctx);
- void RemovePermission(TEvCms::TEvManagePermissionRequest::TPtr &ev, bool done, const TActorContext &ctx);
- void GetRequest(TEvCms::TEvManageRequestRequest::TPtr &ev, bool all, const TActorContext &ctx);
- void RemoveRequest(TEvCms::TEvManageRequestRequest::TPtr &ev, const TActorContext &ctx);
- void GetNotifications(TEvCms::TEvManageNotificationRequest::TPtr &ev, bool all,
- const TActorContext &ctx);
- bool RemoveNotification(const TString &id, const TString &user, bool remove, TErrorInfo &error);
-
- void EnqueueRequest(TAutoPtr<IEventHandle> ev, const TActorContext &ctx);
- void CheckAndEnqueueRequest(TEvCms::TEvPermissionRequest::TPtr &ev, const TActorContext &ctx);
- void CheckAndEnqueueRequest(TEvCms::TEvCheckRequest::TPtr &ev, const TActorContext &ctx);
- void CheckAndEnqueueRequest(TEvCms::TEvConditionalPermissionRequest::TPtr &ev, const TActorContext &ctx);
- void CheckAndEnqueueRequest(TEvCms::TEvNotification::TPtr &ev, const TActorContext &ctx);
- void ProcessQueue(const TActorContext &ctx);
- void ProcessRequest(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx);
-
+ void ScheduleCleanup(TInstant time, const TActorContext &ctx);
+ void SchedulePermissionsCleanup(const TActorContext &ctx);
+ void ScheduleNotificationsCleanup(const TActorContext &ctx);
+ void CleanupExpired(const TActorContext &ctx);
+ void CleanupLog(const TActorContext &ctx);
+ void ScheduleLogCleanup(const TActorContext &ctx);
+ void DoPermissionsCleanup(const TActorContext &ctx);
+ void CleanupWalleTasks(const TActorContext &ctx);
+ void RemoveEmptyWalleTasks(const TActorContext &ctx);
+ bool CheckNotificationDeadline(const NKikimrCms::TAction &action, TInstant time,
+ TErrorInfo &error, const TActorContext &ctx) const;
+ bool CheckNotificationRestartServices(const NKikimrCms::TAction &action, TInstant time,
+ TErrorInfo &error, const TActorContext &ctx) const;
+ bool CheckNotificationShutdownHost(const NKikimrCms::TAction &action, TInstant time,
+ TErrorInfo &error, const TActorContext &ctx) const;
+ bool CheckNotificationReplaceDevices(const NKikimrCms::TAction &action, TInstant time,
+ TErrorInfo &error, const TActorContext &ctx) const;
+ bool IsValidNotificationAction(const NKikimrCms::TAction &action, TInstant time,
+ TErrorInfo &error, const TActorContext &ctx) const;
+ TString AcceptNotification(const NKikimrCms::TNotification &notification,
+ const TActorContext &ctx);
+ bool CheckNotification(const NKikimrCms::TNotification &notification,
+ NKikimrCms::TNotificationResponse &resp,
+ const TActorContext &ctx) const;
+
+ void Cleanup(const TActorContext &ctx);
+ void Die(const TActorContext& ctx) override;
+
+ void AddHostState(const TNodeInfo &node, NKikimrCms::TClusterStateResponse &resp, TInstant timestamp);
+ void GetPermission(TEvCms::TEvManagePermissionRequest::TPtr &ev, bool all, const TActorContext &ctx);
+ void RemovePermission(TEvCms::TEvManagePermissionRequest::TPtr &ev, bool done, const TActorContext &ctx);
+ void GetRequest(TEvCms::TEvManageRequestRequest::TPtr &ev, bool all, const TActorContext &ctx);
+ void RemoveRequest(TEvCms::TEvManageRequestRequest::TPtr &ev, const TActorContext &ctx);
+ void GetNotifications(TEvCms::TEvManageNotificationRequest::TPtr &ev, bool all,
+ const TActorContext &ctx);
+ bool RemoveNotification(const TString &id, const TString &user, bool remove, TErrorInfo &error);
+
+ void EnqueueRequest(TAutoPtr<IEventHandle> ev, const TActorContext &ctx);
+ void CheckAndEnqueueRequest(TEvCms::TEvPermissionRequest::TPtr &ev, const TActorContext &ctx);
+ void CheckAndEnqueueRequest(TEvCms::TEvCheckRequest::TPtr &ev, const TActorContext &ctx);
+ void CheckAndEnqueueRequest(TEvCms::TEvConditionalPermissionRequest::TPtr &ev, const TActorContext &ctx);
+ void CheckAndEnqueueRequest(TEvCms::TEvNotification::TPtr &ev, const TActorContext &ctx);
+ void ProcessQueue(const TActorContext &ctx);
+ void ProcessRequest(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx);
+
void AddPermissionExtensions(const NKikimrCms::TAction& action, NKikimrCms::TPermission& perm) const;
void AddHostExtensions(const TString& host, NKikimrCms::TPermission& perm) const;
- void OnBSCPipeDestroyed(const TActorContext &ctx);
-
- void Handle(TEvPrivate::TEvClusterInfo::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvLogAndSend::TPtr &ev, const TActorContext &ctx);
+ void OnBSCPipeDestroyed(const TActorContext &ctx);
+
+ void Handle(TEvPrivate::TEvClusterInfo::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvLogAndSend::TPtr &ev, const TActorContext &ctx);
void Handle(TEvPrivate::TEvUpdateClusterInfo::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvManageRequestRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvManagePermissionRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvClusterStateRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvPermissionRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvCheckRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvNotification::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvManageNotificationRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvWalleCreateTaskRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvWalleListTasksRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvWalleCheckTaskRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvWalleRemoveTaskRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvStoreWalleTask::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvRemoveWalleTask::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvGetConfigRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvSetConfigRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvResetMarkerRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvSetMarkerRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvCms::TEvGetLogTailRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvents::TEvPoisonPill::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx);
-
-private:
+ void Handle(TEvCms::TEvManageRequestRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvManagePermissionRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvClusterStateRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvPermissionRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvCheckRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvNotification::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvManageNotificationRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvWalleCreateTaskRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvWalleListTasksRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvWalleCheckTaskRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvWalleRemoveTaskRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvStoreWalleTask::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvRemoveWalleTask::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvGetConfigRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvSetConfigRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvResetMarkerRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvSetMarkerRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvCms::TEvGetLogTailRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvents::TEvPoisonPill::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx);
+
+private:
TStack<TInstant> ScheduledCleanups;
- TString NotSupportedReason;
- TQueue<TAutoPtr<IEventHandle>> InitQueue;
+ TString NotSupportedReason;
+ TQueue<TAutoPtr<IEventHandle>> InitQueue;
TQueue<TAutoPtr<IEventHandle>> Queue;
- TCmsStatePtr State;
- TLogger Logger;
- // Shortcut to State->ClusterInfo.
- TClusterInfoPtr ClusterInfo;
- ui64 ConfigSubscriptionId;
- TSchedulerCookieHolder WalleCleanupTimerCookieHolder;
- TSchedulerCookieHolder LogCleanupTimerCookieHolder;
-
-public:
+ TCmsStatePtr State;
+ TLogger Logger;
+ // Shortcut to State->ClusterInfo.
+ TClusterInfoPtr ClusterInfo;
+ ui64 ConfigSubscriptionId;
+ TSchedulerCookieHolder WalleCleanupTimerCookieHolder;
+ TSchedulerCookieHolder LogCleanupTimerCookieHolder;
+
+public:
TCms(const TActorId &tablet, TTabletStorageInfo *info)
- : TActor(&TThis::StateInit)
+ : TActor(&TThis::StateInit)
, TTabletExecutedFlat(info, tablet, new NMiniKQL::TMiniKQLFactory)
- , State(new TCmsState)
- , Logger(State)
- , ConfigSubscriptionId(0)
- {
- }
-
+ , State(new TCmsState)
+ , Logger(State)
+ , ConfigSubscriptionId(0)
+ {
+ }
+
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_SERVICE;
- }
-
-};
-
-} // NCms
-} // NKikimr
+ }
+
+};
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_state.h b/ydb/core/cms/cms_state.h
index fe2161488d7..5f0b6ff2e21 100644
--- a/ydb/core/cms/cms_state.h
+++ b/ydb/core/cms/cms_state.h
@@ -1,19 +1,19 @@
-#pragma once
-
-#include "cluster_info.h"
-#include "config.h"
-
-#include <util/generic/set.h>
-#include <util/generic/string.h>
+#pragma once
+
+#include "cluster_info.h"
+#include "config.h"
+
+#include <util/generic/set.h>
+#include <util/generic/string.h>
#include <util/string/builder.h>
#include <util/string/join.h>
-
-namespace NKikimr {
-namespace NCms {
-
-struct TWalleTaskInfo {
- TString TaskId;
- TString RequestId;
+
+namespace NKikimr {
+namespace NCms {
+
+struct TWalleTaskInfo {
+ TString TaskId;
+ TString RequestId;
TSet<TString> Permissions;
TString ToString() const {
@@ -23,41 +23,41 @@ struct TWalleTaskInfo {
<< " Permissions: [" << JoinSeq(", ", Permissions) << "]"
<< " }";
}
-};
-
-struct TCmsState : public TAtomicRefCount<TCmsState> {
- // Main state.
+};
+
+struct TCmsState : public TAtomicRefCount<TCmsState> {
+ // Main state.
THashMap<TString, TPermissionInfo> Permissions;
THashMap<TString, TRequestInfo> ScheduledRequests;
THashMap<TString, TNotificationInfo> Notifications;
- TDowntimes Downtimes;
- ui64 NextPermissionId = 0;
- ui64 NextRequestId = 0;
- ui64 NextNotificationId = 0;
- ui64 LastLogRecordTimestamp = 0;
-
- // State of Wall-E tasks.
+ TDowntimes Downtimes;
+ ui64 NextPermissionId = 0;
+ ui64 NextRequestId = 0;
+ ui64 NextNotificationId = 0;
+ ui64 LastLogRecordTimestamp = 0;
+
+ // State of Wall-E tasks.
THashMap<TString, TWalleTaskInfo> WalleTasks;
THashMap<TString, TString> WalleRequests;
-
- // CMS config.
- TCmsConfig Config;
- // Cluster info. It's not initialized on state creation.
- // Updated by event from info collector by rewritting
- // pointer. Therefore pointer shouldnt be preserved
- // in local structures and should be accessed through
- // pointer to CMS state.
- TClusterInfoPtr ClusterInfo;
+
+ // CMS config.
+ TCmsConfig Config;
+ // Cluster info. It's not initialized on state creation.
+ // Updated by event from info collector by rewritting
+ // pointer. Therefore pointer shouldnt be preserved
+ // in local structures and should be accessed through
+ // pointer to CMS state.
+ TClusterInfoPtr ClusterInfo;
THashMap<ui32, TString> InitialNodeTenants; // would be applyed to ClusterInfo at first update
-
- // Static info.
- ui64 CmsTabletId = 0;
+
+ // Static info.
+ ui64 CmsTabletId = 0;
TActorId CmsActorId;
TActorId BSControllerPipe;
TActorId Sentinel;
-};
-
-using TCmsStatePtr = TIntrusivePtr<TCmsState>;
-
-} // NCms
-} // NKikimr
+};
+
+using TCmsStatePtr = TIntrusivePtr<TCmsState>;
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tenants_ut.cpp b/ydb/core/cms/cms_tenants_ut.cpp
index 9bd34b0332b..e14fe4dd574 100644
--- a/ydb/core/cms/cms_tenants_ut.cpp
+++ b/ydb/core/cms/cms_tenants_ut.cpp
@@ -12,7 +12,7 @@
#include <util/system/hostname.h>
namespace NKikimr {
-namespace NCmsTest {
+namespace NCmsTest {
using namespace NCms;
using namespace NKikimrCms;
@@ -20,27 +20,27 @@ using namespace NKikimrCms;
Y_UNIT_TEST_SUITE(TCmsTenatsTest) {
Y_UNIT_TEST(CollectInfo)
{
- TCmsTestEnv env(8, 1);
+ TCmsTestEnv env(8, 1);
- env.Register(CreateInfoCollector(env.GetSender(), TDuration::Minutes(1)));
+ env.Register(CreateInfoCollector(env.GetSender(), TDuration::Minutes(1)));
TAutoPtr<IEventHandle> handle;
- auto reply = env.GrabEdgeEventRethrow<TCms::TEvPrivate::TEvClusterInfo>(handle);
+ auto reply = env.GrabEdgeEventRethrow<TCms::TEvPrivate::TEvClusterInfo>(handle);
UNIT_ASSERT(reply);
const auto &info = *reply->Info;
- UNIT_ASSERT_VALUES_EQUAL(info.NodesCount(), env.GetNodeCount());
- UNIT_ASSERT_VALUES_EQUAL(info.PDisksCount(), env.GetNodeCount());
- UNIT_ASSERT_VALUES_EQUAL(info.VDisksCount(), env.GetNodeCount() * 4);
+ UNIT_ASSERT_VALUES_EQUAL(info.NodesCount(), env.GetNodeCount());
+ UNIT_ASSERT_VALUES_EQUAL(info.PDisksCount(), env.GetNodeCount());
+ UNIT_ASSERT_VALUES_EQUAL(info.VDisksCount(), env.GetNodeCount() * 4);
UNIT_ASSERT_VALUES_EQUAL(info.BSGroupsCount(), 4);
- for (ui32 nodeIndex = 0; nodeIndex < env.GetNodeCount(); ++nodeIndex) {
- ui32 nodeId = env.GetNodeId(nodeIndex);
+ for (ui32 nodeIndex = 0; nodeIndex < env.GetNodeCount(); ++nodeIndex) {
+ ui32 nodeId = env.GetNodeId(nodeIndex);
UNIT_ASSERT(info.HasNode(nodeId));
const auto &node = info.Node(nodeId);
UNIT_ASSERT_VALUES_EQUAL(node.NodeId, nodeId);
- UNIT_ASSERT_VALUES_EQUAL(node.Host, "::1");
+ UNIT_ASSERT_VALUES_EQUAL(node.Host, "::1");
UNIT_ASSERT_VALUES_EQUAL(node.State, NKikimrCms::UP);
UNIT_ASSERT_VALUES_EQUAL(node.PDisks.size(), 1);
UNIT_ASSERT(node.PDisks.contains(NCms::TPDiskID(nodeId, nodeId)));
@@ -53,9 +53,9 @@ Y_UNIT_TEST_SUITE(TCmsTenatsTest) {
UNIT_ASSERT(info.HasPDisk(NCms::TPDiskID(nodeId, nodeId)));
UNIT_ASSERT(info.HasVDisk(TVDiskID(0, 1, 0, nodeIndex, 0)));
- UNIT_ASSERT(info.HasVDisk(TVDiskID(1, 1, 0, nodeIndex, 0)));
- UNIT_ASSERT(info.HasVDisk(TVDiskID(2, 1, 0, nodeIndex, 0)));
- UNIT_ASSERT(info.HasVDisk(TVDiskID(3, 1, 0, nodeIndex, 0)));
+ UNIT_ASSERT(info.HasVDisk(TVDiskID(1, 1, 0, nodeIndex, 0)));
+ UNIT_ASSERT(info.HasVDisk(TVDiskID(2, 1, 0, nodeIndex, 0)));
+ UNIT_ASSERT(info.HasVDisk(TVDiskID(3, 1, 0, nodeIndex, 0)));
}
for (ui32 groupId = 0; groupId < 4; ++groupId) {
@@ -73,305 +73,305 @@ Y_UNIT_TEST_SUITE(TCmsTenatsTest) {
}
}
- Y_UNIT_TEST(TestNoneTenantPolicy)
+ Y_UNIT_TEST(TestNoneTenantPolicy)
{
- TNodeTenantsMap staticTenants;
- for (ui32 i = 0; i < 8; ++i)
- staticTenants[i].push_back("user0");
-
- TCmsTestEnv env(8, staticTenants);
-
- env.SetLimits(0, 10, 0, 0);
-
- for (ui32 i = 0; i < 8; ++i)
- env.CheckPermissionRequest("user", false, false, false, false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(i), 60000000));
- }
-
- Y_UNIT_TEST(TestTenantLimit)
- {
- TNodeTenantsMap staticTenants;
- for (ui32 i = 0; i < 8; ++i)
- staticTenants[i].push_back("user0");
-
- TCmsTestEnv env(8, staticTenants);
-
- env.SetLimits(2, 0, 0, 0);
-
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
-
- env.SetLimits(4, 0, 0, 0);
-
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000));
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(4), 60000000));
- }
-
- Y_UNIT_TEST(TestDefaultTenantPolicyWithSingleTenantHost)
- {
- TNodeTenantsMap staticTenants;
+ TNodeTenantsMap staticTenants;
+ for (ui32 i = 0; i < 8; ++i)
+ staticTenants[i].push_back("user0");
+
+ TCmsTestEnv env(8, staticTenants);
+
+ env.SetLimits(0, 10, 0, 0);
+
+ for (ui32 i = 0; i < 8; ++i)
+ env.CheckPermissionRequest("user", false, false, false, false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(i), 60000000));
+ }
+
+ Y_UNIT_TEST(TestTenantLimit)
+ {
+ TNodeTenantsMap staticTenants;
+ for (ui32 i = 0; i < 8; ++i)
+ staticTenants[i].push_back("user0");
+
+ TCmsTestEnv env(8, staticTenants);
+
+ env.SetLimits(2, 0, 0, 0);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
+
+ env.SetLimits(4, 0, 0, 0);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000));
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(4), 60000000));
+ }
+
+ Y_UNIT_TEST(TestDefaultTenantPolicyWithSingleTenantHost)
+ {
+ TNodeTenantsMap staticTenants;
staticTenants[0] = {"user0"};
- TCmsTestEnv env(8, staticTenants);
-
- env.SetLimits(0, 10, 0, 0);
-
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
- }
-
- Y_UNIT_TEST(TestTenantRatioLimit)
- {
- TNodeTenantsMap staticTenants;
- for (ui32 i = 0; i < 8; ++i)
- staticTenants[i].push_back("user0");
-
- TCmsTestEnv env(8, staticTenants);
-
- env.SetLimits(0, 10, 0, 0);
-
- auto res1 = env.ExtractPermissions
- (env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000)));
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
-
- env.SetLimits(0, 20, 0, 0);
-
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
-
- env.SetLimits(0, 30, 0, 0);
-
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
-
- env.CheckDonePermission("user", res1.second[0]);
-
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
-
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
-
- env.SetLimits(0, 0, 0, 0);
-
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+ TCmsTestEnv env(8, staticTenants);
+
+ env.SetLimits(0, 10, 0, 0);
+
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+ }
+
+ Y_UNIT_TEST(TestTenantRatioLimit)
+ {
+ TNodeTenantsMap staticTenants;
+ for (ui32 i = 0; i < 8; ++i)
+ staticTenants[i].push_back("user0");
+
+ TCmsTestEnv env(8, staticTenants);
+
+ env.SetLimits(0, 10, 0, 0);
+
+ auto res1 = env.ExtractPermissions
+ (env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000)));
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+
+ env.SetLimits(0, 20, 0, 0);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+
+ env.SetLimits(0, 30, 0, 0);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
+
+ env.CheckDonePermission("user", res1.second[0]);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
+
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+
+ env.SetLimits(0, 0, 0, 0);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+ }
+
+ Y_UNIT_TEST(TestClusterLimit)
+ {
+ TNodeTenantsMap staticTenants;
+ for (ui32 i = 0; i < 8; ++i)
+ staticTenants[i].push_back("user0");
+
+ TCmsTestEnv env(8, staticTenants);
+
+ env.SetLimits(0, 0, 2, 0);
+
+ auto res1 = env.ExtractPermissions
+ (env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000)));
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
+
+ env.SetLimits(0, 0, 3, 0);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000));
+
+ env.CheckDonePermission("user", res1.second[0]);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000));
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+
+ env.SetLimits(0, 0, 0, 0);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+ }
+
+ Y_UNIT_TEST(TestClusterRatioLimit)
+ {
+ TNodeTenantsMap staticTenants;
+ for (ui32 i = 0; i < 8; ++i)
+ staticTenants[i].push_back("user0");
+
+ TCmsTestEnv env(8, staticTenants);
+ env.SetLimits(0, 0, 0, 10);
+
+ auto res1 = env.ExtractPermissions
+ (env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000)));
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+
+ env.SetLimits(0, 0, 0, 20);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+
+ env.SetLimits(0, 0, 0, 30);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
+
+ env.CheckDonePermission("user", res1.second[0]);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
+
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+
+ env.SetLimits(0, 0, 0, 0);
+
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+ }
+
+ Y_UNIT_TEST(TestLimitsWithDownNode)
+ {
+ TNodeTenantsMap staticTenants;
+ for (ui32 i = 0; i < 8; ++i)
+ staticTenants[i].push_back("user0");
+
+ TCmsTestEnv env(8, staticTenants);
+ env.SetLimits(1, 10, 1, 10);
+
+ // Mark node as down and try to lock it.
+ TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = false;
+
+ env.CheckPermissionRequest("user", false, false, false,
+ false, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+
+ // Now node is locked and we cannot lock this or another node.
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+ env.CheckPermissionRequest("user", false, false, false,
+ true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ }
+
+ void TestScheduledPermission(bool defaultPolicy)
+ {
+ TNodeTenantsMap staticTenants;
+ for (ui32 i = 0; i < 8; ++i)
+ staticTenants[i].push_back("user0");
+
+ TCmsTestEnv env(8, staticTenants);
+
+ env.SetLimits(0, defaultPolicy ? 30 : 10, defaultPolicy ? 0 : 2, 0);
+
+ auto res1 = env.ExtractPermissions
+ (env.CheckPermissionRequest("user", true, false, true,
+ defaultPolicy, TStatus::ALLOW_PARTIAL,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(4), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(5), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(6), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(7), 60000000)));
+ UNIT_ASSERT_VALUES_EQUAL(res1.second.size(), 2);
+
+ env.CheckRequest("user", res1.first, false, TStatus::DISALLOW_TEMP);
+
+ env.CheckDonePermission("user", res1.second[0]);
+ env.CheckDonePermission("user", res1.second[1]);
+
+ env.CheckRequest("user", res1.first, false, TStatus::ALLOW_PARTIAL, 2);
+
+ env.SetLimits(0, defaultPolicy ? 0 : 10, 0, 0);
+
+ env.CheckRequest("user", res1.first, false, TStatus::ALLOW, 4);
}
- Y_UNIT_TEST(TestClusterLimit)
+ Y_UNIT_TEST(TestScheduledPermissionWithNonePolicy)
{
- TNodeTenantsMap staticTenants;
- for (ui32 i = 0; i < 8; ++i)
- staticTenants[i].push_back("user0");
-
- TCmsTestEnv env(8, staticTenants);
-
- env.SetLimits(0, 0, 2, 0);
-
- auto res1 = env.ExtractPermissions
- (env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000)));
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
-
- env.SetLimits(0, 0, 3, 0);
-
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000));
-
- env.CheckDonePermission("user", res1.second[0]);
-
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000));
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
-
- env.SetLimits(0, 0, 0, 0);
-
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
- }
-
- Y_UNIT_TEST(TestClusterRatioLimit)
- {
- TNodeTenantsMap staticTenants;
- for (ui32 i = 0; i < 8; ++i)
- staticTenants[i].push_back("user0");
-
- TCmsTestEnv env(8, staticTenants);
- env.SetLimits(0, 0, 0, 10);
-
- auto res1 = env.ExtractPermissions
- (env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000)));
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
-
- env.SetLimits(0, 0, 0, 20);
-
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
-
- env.SetLimits(0, 0, 0, 30);
-
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
-
- env.CheckDonePermission("user", res1.second[0]);
-
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
-
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
-
- env.SetLimits(0, 0, 0, 0);
-
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+ TestScheduledPermission(false);
+ }
+
+ Y_UNIT_TEST(TestScheduledPermissionWithDefaultPolicy)
+ {
+ TestScheduledPermission(true);
}
- Y_UNIT_TEST(TestLimitsWithDownNode)
- {
- TNodeTenantsMap staticTenants;
- for (ui32 i = 0; i < 8; ++i)
- staticTenants[i].push_back("user0");
-
- TCmsTestEnv env(8, staticTenants);
- env.SetLimits(1, 10, 1, 10);
-
- // Mark node as down and try to lock it.
- TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = false;
-
- env.CheckPermissionRequest("user", false, false, false,
- false, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
-
- // Now node is locked and we cannot lock this or another node.
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
- env.CheckPermissionRequest("user", false, false, false,
- true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
- }
-
- void TestScheduledPermission(bool defaultPolicy)
- {
- TNodeTenantsMap staticTenants;
- for (ui32 i = 0; i < 8; ++i)
- staticTenants[i].push_back("user0");
-
- TCmsTestEnv env(8, staticTenants);
-
- env.SetLimits(0, defaultPolicy ? 30 : 10, defaultPolicy ? 0 : 2, 0);
-
- auto res1 = env.ExtractPermissions
- (env.CheckPermissionRequest("user", true, false, true,
- defaultPolicy, TStatus::ALLOW_PARTIAL,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(4), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(5), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(6), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(7), 60000000)));
- UNIT_ASSERT_VALUES_EQUAL(res1.second.size(), 2);
-
- env.CheckRequest("user", res1.first, false, TStatus::DISALLOW_TEMP);
-
- env.CheckDonePermission("user", res1.second[0]);
- env.CheckDonePermission("user", res1.second[1]);
-
- env.CheckRequest("user", res1.first, false, TStatus::ALLOW_PARTIAL, 2);
-
- env.SetLimits(0, defaultPolicy ? 0 : 10, 0, 0);
-
- env.CheckRequest("user", res1.first, false, TStatus::ALLOW, 4);
- }
-
- Y_UNIT_TEST(TestScheduledPermissionWithNonePolicy)
- {
- TestScheduledPermission(false);
- }
-
- Y_UNIT_TEST(TestScheduledPermissionWithDefaultPolicy)
- {
- TestScheduledPermission(true);
- }
-
void TestShutdownHost(bool usePolicy)
- {
- TNodeTenantsMap staticTenants;
- staticTenants[0].push_back("user0");
- staticTenants[8].push_back("user0");
-
+ {
+ TNodeTenantsMap staticTenants;
+ staticTenants[0].push_back("user0");
+ staticTenants[8].push_back("user0");
+
TCmsTestEnv env(16, 1, staticTenants);
-
- env.SetLimits(0, 10, 0, 0);
-
+
+ env.SetLimits(0, 10, 0, 0);
+
env.CheckPermissionRequest("user", false, false, false, usePolicy,
TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
-
- env.CheckPermissionRequest("user", false, false, false, usePolicy,
- usePolicy ? TStatus::DISALLOW_TEMP : TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(8), 60000000));
-
- env.CheckPermissionRequest("user", false, false, false, usePolicy,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+
+ env.CheckPermissionRequest("user", false, false, false, usePolicy,
+ usePolicy ? TStatus::DISALLOW_TEMP : TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(8), 60000000));
+
+ env.CheckPermissionRequest("user", false, false, false, usePolicy,
TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(15), 60000000));
- }
-
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(15), 60000000));
+ }
+
Y_UNIT_TEST(RequestShutdownHost) {
TestShutdownHost(false);
}
@@ -379,7 +379,7 @@ Y_UNIT_TEST_SUITE(TCmsTenatsTest) {
Y_UNIT_TEST(RequestShutdownHostWithTenantPolicy) {
TestShutdownHost(true);
}
-
+
Y_UNIT_TEST(RequestRestartServices) {
TCmsTestEnv env(16, 1, TNodeTenantsMap{
{8, {"user0"}},
@@ -425,125 +425,125 @@ Y_UNIT_TEST_SUITE(TCmsTenatsTest) {
MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(1), 60000000, "storage"));
}
- void TestLimitForceRestartMode(bool tenant, bool ratio)
- {
- TNodeTenantsMap staticTenants;
- for (ui32 i = 0; i < 8; ++i)
- staticTenants[i].push_back("user0");
-
- TCmsTestEnv env(8, staticTenants);
-
- env.SetLimits(tenant && !ratio ? 1 : 0,
- tenant && ratio ? 20 : 0,
- !tenant && !ratio ? 1 : 0,
- !tenant && ratio ? 20 : 0);
-
- auto res1 = env.ExtractPermissions
- (env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000)));
- // Limit should work for any mode because we are restarting one node already.
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
- env.CheckPermissionRequest("user", false, false, false, true,
- MODE_KEEP_AVAILABLE, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
- env.CheckPermissionRequest("user", false, false, false, true,
- MODE_FORCE_RESTART, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
-
- env.CheckDonePermission("user", res1.second[0]);
-
- // Now shutdown one node and try various modes again. Only MODE_FORCE_RESTART
- // should allow to restart another node.
- {
- TGuard<TMutex> guard(TFakeNodeWhiteboardService::Mutex);
- TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = false;
- }
-
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
- env.CheckPermissionRequest("user", false, false, false, true,
- MODE_KEEP_AVAILABLE, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
- env.CheckPermissionRequest("user", false, false, false, true,
- MODE_FORCE_RESTART, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
- }
-
- Y_UNIT_TEST(TestTenantLimitForceRestartMode) {
- TestLimitForceRestartMode(true, false);
- }
-
- Y_UNIT_TEST(TestTenantRatioLimitForceRestartMode) {
- TestLimitForceRestartMode(true, true);
- }
-
- Y_UNIT_TEST(TestClusterLimitForceRestartMode) {
- TestLimitForceRestartMode(false, false);
- }
-
- Y_UNIT_TEST(TestClusterRatioLimitForceRestartMode) {
- TestLimitForceRestartMode(false, true);
- }
-
- void TestLimitForceRestartModeScheduled(bool tenant, bool ratio)
- {
- TNodeTenantsMap staticTenants;
- for (ui32 i = 0; i < 8; ++i)
- staticTenants[i].push_back("user0");
-
- TCmsTestEnv env(8, staticTenants);
-
- env.SetLimits(tenant && !ratio ? 1 : 0,
- tenant && ratio ? 20 : 0,
- !tenant && !ratio ? 1 : 0,
- !tenant && ratio ? 20 : 0);
-
- auto res1 = env.ExtractPermissions
- (env.CheckPermissionRequest("user", true, false, true, true, TStatus::ALLOW_PARTIAL,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000)));
- UNIT_ASSERT_VALUES_EQUAL(res1.second.size(), 1);
- // Limit should work for any mode because we are restarting one node already.
- env.CheckRequest("user", res1.first, false, TStatus::DISALLOW_TEMP, 0);
- env.CheckRequest("user", res1.first, false, MODE_KEEP_AVAILABLE, TStatus::DISALLOW_TEMP, 0);
- env.CheckRequest("user", res1.first, false, MODE_FORCE_RESTART, TStatus::DISALLOW_TEMP, 0);
-
- env.CheckDonePermission("user", res1.second[0]);
-
- auto res2 = env.ExtractPermissions
- (env.CheckRequest("user", res1.first, false, MODE_FORCE_RESTART, TStatus::ALLOW_PARTIAL, 1));
-
- env.CheckDonePermission("user", res2.second[0]);
-
- // Now shutdown one node and try various modes again. Only MODE_FORCE_RESTART
- // should allow to restart another node.
- {
- TGuard<TMutex> guard(TFakeNodeWhiteboardService::Mutex);
- TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = false;
- }
- env.CheckRequest("user", res1.first, false, TStatus::DISALLOW_TEMP, 0);
- env.CheckRequest("user", res1.first, false, MODE_KEEP_AVAILABLE, TStatus::DISALLOW_TEMP, 0);
- env.CheckRequest("user", res1.first, false, MODE_FORCE_RESTART, TStatus::ALLOW, 1);
- }
-
- Y_UNIT_TEST(TestTenantLimitForceRestartModeScheduled) {
- TestLimitForceRestartModeScheduled(true, false);
- }
-
- Y_UNIT_TEST(TestTenantRatioLimitForceRestartModeScheduled) {
- TestLimitForceRestartModeScheduled(true, true);
- }
-
- Y_UNIT_TEST(TestClusterLimitForceRestartModeScheduled) {
- TestLimitForceRestartModeScheduled(false, false);
- }
-
- Y_UNIT_TEST(TestClusterRatioLimitForceRestartModeScheduled) {
- TestLimitForceRestartModeScheduled(false, true);
- }
+ void TestLimitForceRestartMode(bool tenant, bool ratio)
+ {
+ TNodeTenantsMap staticTenants;
+ for (ui32 i = 0; i < 8; ++i)
+ staticTenants[i].push_back("user0");
+
+ TCmsTestEnv env(8, staticTenants);
+
+ env.SetLimits(tenant && !ratio ? 1 : 0,
+ tenant && ratio ? 20 : 0,
+ !tenant && !ratio ? 1 : 0,
+ !tenant && ratio ? 20 : 0);
+
+ auto res1 = env.ExtractPermissions
+ (env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000)));
+ // Limit should work for any mode because we are restarting one node already.
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ env.CheckPermissionRequest("user", false, false, false, true,
+ MODE_KEEP_AVAILABLE, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ env.CheckPermissionRequest("user", false, false, false, true,
+ MODE_FORCE_RESTART, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+
+ env.CheckDonePermission("user", res1.second[0]);
+
+ // Now shutdown one node and try various modes again. Only MODE_FORCE_RESTART
+ // should allow to restart another node.
+ {
+ TGuard<TMutex> guard(TFakeNodeWhiteboardService::Mutex);
+ TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = false;
+ }
+
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ env.CheckPermissionRequest("user", false, false, false, true,
+ MODE_KEEP_AVAILABLE, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ env.CheckPermissionRequest("user", false, false, false, true,
+ MODE_FORCE_RESTART, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ }
+
+ Y_UNIT_TEST(TestTenantLimitForceRestartMode) {
+ TestLimitForceRestartMode(true, false);
+ }
+
+ Y_UNIT_TEST(TestTenantRatioLimitForceRestartMode) {
+ TestLimitForceRestartMode(true, true);
+ }
+
+ Y_UNIT_TEST(TestClusterLimitForceRestartMode) {
+ TestLimitForceRestartMode(false, false);
+ }
+
+ Y_UNIT_TEST(TestClusterRatioLimitForceRestartMode) {
+ TestLimitForceRestartMode(false, true);
+ }
+
+ void TestLimitForceRestartModeScheduled(bool tenant, bool ratio)
+ {
+ TNodeTenantsMap staticTenants;
+ for (ui32 i = 0; i < 8; ++i)
+ staticTenants[i].push_back("user0");
+
+ TCmsTestEnv env(8, staticTenants);
+
+ env.SetLimits(tenant && !ratio ? 1 : 0,
+ tenant && ratio ? 20 : 0,
+ !tenant && !ratio ? 1 : 0,
+ !tenant && ratio ? 20 : 0);
+
+ auto res1 = env.ExtractPermissions
+ (env.CheckPermissionRequest("user", true, false, true, true, TStatus::ALLOW_PARTIAL,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000)));
+ UNIT_ASSERT_VALUES_EQUAL(res1.second.size(), 1);
+ // Limit should work for any mode because we are restarting one node already.
+ env.CheckRequest("user", res1.first, false, TStatus::DISALLOW_TEMP, 0);
+ env.CheckRequest("user", res1.first, false, MODE_KEEP_AVAILABLE, TStatus::DISALLOW_TEMP, 0);
+ env.CheckRequest("user", res1.first, false, MODE_FORCE_RESTART, TStatus::DISALLOW_TEMP, 0);
+
+ env.CheckDonePermission("user", res1.second[0]);
+
+ auto res2 = env.ExtractPermissions
+ (env.CheckRequest("user", res1.first, false, MODE_FORCE_RESTART, TStatus::ALLOW_PARTIAL, 1));
+
+ env.CheckDonePermission("user", res2.second[0]);
+
+ // Now shutdown one node and try various modes again. Only MODE_FORCE_RESTART
+ // should allow to restart another node.
+ {
+ TGuard<TMutex> guard(TFakeNodeWhiteboardService::Mutex);
+ TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = false;
+ }
+ env.CheckRequest("user", res1.first, false, TStatus::DISALLOW_TEMP, 0);
+ env.CheckRequest("user", res1.first, false, MODE_KEEP_AVAILABLE, TStatus::DISALLOW_TEMP, 0);
+ env.CheckRequest("user", res1.first, false, MODE_FORCE_RESTART, TStatus::ALLOW, 1);
+ }
+
+ Y_UNIT_TEST(TestTenantLimitForceRestartModeScheduled) {
+ TestLimitForceRestartModeScheduled(true, false);
+ }
+
+ Y_UNIT_TEST(TestTenantRatioLimitForceRestartModeScheduled) {
+ TestLimitForceRestartModeScheduled(true, true);
+ }
+
+ Y_UNIT_TEST(TestClusterLimitForceRestartModeScheduled) {
+ TestLimitForceRestartModeScheduled(false, false);
+ }
+
+ Y_UNIT_TEST(TestClusterRatioLimitForceRestartModeScheduled) {
+ TestLimitForceRestartModeScheduled(false, true);
+ }
}
-} // NCmsTest
+} // NCmsTest
} // NKikimr
diff --git a/ydb/core/cms/cms_tx_get_log_tail.cpp b/ydb/core/cms/cms_tx_get_log_tail.cpp
index da984a82bb7..8477e1d21ac 100644
--- a/ydb/core/cms/cms_tx_get_log_tail.cpp
+++ b/ydb/core/cms/cms_tx_get_log_tail.cpp
@@ -1,66 +1,66 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
-namespace NKikimr {
-namespace NCms {
-
-using namespace NKikimrCms;
-
-class TCms::TTxGetLogTail : public TTransactionBase<TCms> {
-public:
- TTxGetLogTail(TCms *self,
- TEvCms::TEvGetLogTailRequest::TPtr &ev)
- : TBase(self)
- , Request(std::move(ev))
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- auto &req = Request->Get()->Record;
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "TTxGetLogTail Execute " << req.ShortDebugString());
-
- TVector<NKikimrCms::TLogRecord> records;
- if (!Self->Logger.DbLoadLogTail(req.GetLogFilter(), records, txc))
- return false;
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "TTxGetLogTail found " << records.size()
- << " matching log records");
-
+#include "cms_impl.h"
+#include "scheme.h"
+
+namespace NKikimr {
+namespace NCms {
+
+using namespace NKikimrCms;
+
+class TCms::TTxGetLogTail : public TTransactionBase<TCms> {
+public:
+ TTxGetLogTail(TCms *self,
+ TEvCms::TEvGetLogTailRequest::TPtr &ev)
+ : TBase(self)
+ , Request(std::move(ev))
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ auto &req = Request->Get()->Record;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "TTxGetLogTail Execute " << req.ShortDebugString());
+
+ TVector<NKikimrCms::TLogRecord> records;
+ if (!Self->Logger.DbLoadLogTail(req.GetLogFilter(), records, txc))
+ return false;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "TTxGetLogTail found " << records.size()
+ << " matching log records");
+
Response = MakeHolder<TEvCms::TEvGetLogTailResponse>();
- auto &rec = Response->Record;
- rec.MutableStatus()->SetCode(TStatus::OK);
- for (auto it = records.rbegin(); it != records.rend(); ++it) {
- auto &entry = *rec.AddLogRecords();
- entry.Swap(&*it);
- if (req.GetTextFormat() != TEXT_FORMAT_NONE)
- entry.SetMessage(Self->Logger.GetLogMessage(entry, req.GetTextFormat()));
- if (!req.GetIncludeData())
- entry.ClearData();
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxGetLogTail Complete");
-
- ctx.Send(Request->Sender, Response.Release());
- }
-
-private:
- TEvCms::TEvGetLogTailRequest::TPtr Request;
- THolder<TEvCms::TEvGetLogTailResponse> Response;
-};
-
-ITransaction *TCms::CreateTxGetLogTail(TEvCms::TEvGetLogTailRequest::TPtr &ev)
-{
- return new TTxGetLogTail(this, ev);
-}
-
-} // NCms
-} // NKikimr
+ auto &rec = Response->Record;
+ rec.MutableStatus()->SetCode(TStatus::OK);
+ for (auto it = records.rbegin(); it != records.rend(); ++it) {
+ auto &entry = *rec.AddLogRecords();
+ entry.Swap(&*it);
+ if (req.GetTextFormat() != TEXT_FORMAT_NONE)
+ entry.SetMessage(Self->Logger.GetLogMessage(entry, req.GetTextFormat()));
+ if (!req.GetIncludeData())
+ entry.ClearData();
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxGetLogTail Complete");
+
+ ctx.Send(Request->Sender, Response.Release());
+ }
+
+private:
+ TEvCms::TEvGetLogTailRequest::TPtr Request;
+ THolder<TEvCms::TEvGetLogTailResponse> Response;
+};
+
+ITransaction *TCms::CreateTxGetLogTail(TEvCms::TEvGetLogTailRequest::TPtr &ev)
+{
+ return new TTxGetLogTail(this, ev);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_init_scheme.cpp b/ydb/core/cms/cms_tx_init_scheme.cpp
index 721087a6ce0..796b6063962 100644
--- a/ydb/core/cms/cms_tx_init_scheme.cpp
+++ b/ydb/core/cms/cms_tx_init_scheme.cpp
@@ -1,37 +1,37 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxInitScheme : public TTransactionBase<TCms> {
-public:
- TTxInitScheme(TCms *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxInitScheme Execute");
-
- NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxInitScheme Complete");
-
- Self->Execute(Self->CreateTxLoadState(), ctx);
- }
-};
-
-ITransaction* TCms::CreateTxInitScheme()
-{
- return new TTxInitScheme(this);
-}
-
-} // NCms
-} // NKikimr
+#include "cms_impl.h"
+#include "scheme.h"
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxInitScheme : public TTransactionBase<TCms> {
+public:
+ TTxInitScheme(TCms *self)
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxInitScheme Execute");
+
+ NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxInitScheme Complete");
+
+ Self->Execute(Self->CreateTxLoadState(), ctx);
+ }
+};
+
+ITransaction* TCms::CreateTxInitScheme()
+{
+ return new TTxInitScheme(this);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_load_state.cpp b/ydb/core/cms/cms_tx_load_state.cpp
index 631f63d9809..eb144dc0def 100644
--- a/ydb/core/cms/cms_tx_load_state.cpp
+++ b/ydb/core/cms/cms_tx_load_state.cpp
@@ -1,162 +1,162 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
+#include "cms_impl.h"
+#include "scheme.h"
+
#include <google/protobuf/text_format.h>
-
+
#include <library/cpp/svnversion/svnversion.h>
-
-#include <util/system/hostname.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxLoadState : public TTransactionBase<TCms> {
-public:
- TTxLoadState(TCms *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxLoadState Execute");
-
- auto state = Self->State;
- NIceDb::TNiceDb db(txc.DB);
-
- if (!db.Precharge<Schema>())
- return false;
-
- auto paramRow = db.Table<Schema::Param>().Key(1).Select<Schema::Param::TColumns>();
- auto permissionRowset = db.Table<Schema::Permission>().Range().Select<Schema::Permission::TColumns>();
- auto requestRowset = db.Table<Schema::Request>().Range().Select<Schema::Request::TColumns>();
- auto walleTaskRowset = db.Table<Schema::WalleTask>().Range().Select<Schema::WalleTask::TColumns>();
- auto notificationRowset = db.Table<Schema::Notification>().Range().Select<Schema::Notification::TColumns>();
+
+#include <util/system/hostname.h>
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxLoadState : public TTransactionBase<TCms> {
+public:
+ TTxLoadState(TCms *self)
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxLoadState Execute");
+
+ auto state = Self->State;
+ NIceDb::TNiceDb db(txc.DB);
+
+ if (!db.Precharge<Schema>())
+ return false;
+
+ auto paramRow = db.Table<Schema::Param>().Key(1).Select<Schema::Param::TColumns>();
+ auto permissionRowset = db.Table<Schema::Permission>().Range().Select<Schema::Permission::TColumns>();
+ auto requestRowset = db.Table<Schema::Request>().Range().Select<Schema::Request::TColumns>();
+ auto walleTaskRowset = db.Table<Schema::WalleTask>().Range().Select<Schema::WalleTask::TColumns>();
+ auto notificationRowset = db.Table<Schema::Notification>().Range().Select<Schema::Notification::TColumns>();
auto nodeTenantRowset = db.Table<Schema::NodeTenant>().Range().Select<Schema::NodeTenant::TColumns>();
- auto logRowset = db.Table<Schema::LogRecords>().Range().Select<Schema::LogRecords::Timestamp>();
-
- if (!paramRow.IsReady() || !permissionRowset.IsReady()
- || !requestRowset.IsReady() || !walleTaskRowset.IsReady()
+ auto logRowset = db.Table<Schema::LogRecords>().Range().Select<Schema::LogRecords::Timestamp>();
+
+ if (!paramRow.IsReady() || !permissionRowset.IsReady()
+ || !requestRowset.IsReady() || !walleTaskRowset.IsReady()
|| !notificationRowset.IsReady() || !logRowset.IsReady())
- return false;
-
- NKikimrCms::TCmsConfig config;
- if (paramRow.IsValid()) {
- state->NextPermissionId = paramRow.GetValueOrDefault<Schema::Param::NextPermissionID>(1);
- state->NextRequestId = paramRow.GetValueOrDefault<Schema::Param::NextRequestID>(1);
- state->NextNotificationId = paramRow.GetValueOrDefault<Schema::Param::NextNotificationID>(1);
- config = paramRow.GetValueOrDefault<Schema::Param::Config>(NKikimrCms::TCmsConfig());
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "Loaded config: " << config.ShortDebugString());
- } else {
- state->NextPermissionId = 1;
- state->NextRequestId = 1;
- state->NextNotificationId = 1;
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "Using default config");
- }
- state->Config.Deserialize(config);
-
- if (!logRowset.EndOfSet())
- state->LastLogRecordTimestamp
- = Max<ui64>() - logRowset.GetValue<Schema::LogRecords::Timestamp>();
-
- state->WalleTasks.clear();
- state->WalleRequests.clear();
- state->Permissions.clear();
- state->ScheduledRequests.clear();
- state->Notifications.clear();
-
- while (!requestRowset.EndOfSet()) {
- TString id = requestRowset.GetValue<Schema::Request::ID>();
- TString owner = requestRowset.GetValue<Schema::Request::Owner>();
- ui64 order = requestRowset.GetValue<Schema::Request::Order>();
- TString requestStr = requestRowset.GetValue<Schema::Request::Content>();
-
- TRequestInfo request;
- request.RequestId = id;
- request.Owner = owner;
- request.Order = order;
- google::protobuf::TextFormat::ParseFromString(requestStr, &request.Request);
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Loaded request %s owned by %s: %s",
+ return false;
+
+ NKikimrCms::TCmsConfig config;
+ if (paramRow.IsValid()) {
+ state->NextPermissionId = paramRow.GetValueOrDefault<Schema::Param::NextPermissionID>(1);
+ state->NextRequestId = paramRow.GetValueOrDefault<Schema::Param::NextRequestID>(1);
+ state->NextNotificationId = paramRow.GetValueOrDefault<Schema::Param::NextNotificationID>(1);
+ config = paramRow.GetValueOrDefault<Schema::Param::Config>(NKikimrCms::TCmsConfig());
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "Loaded config: " << config.ShortDebugString());
+ } else {
+ state->NextPermissionId = 1;
+ state->NextRequestId = 1;
+ state->NextNotificationId = 1;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "Using default config");
+ }
+ state->Config.Deserialize(config);
+
+ if (!logRowset.EndOfSet())
+ state->LastLogRecordTimestamp
+ = Max<ui64>() - logRowset.GetValue<Schema::LogRecords::Timestamp>();
+
+ state->WalleTasks.clear();
+ state->WalleRequests.clear();
+ state->Permissions.clear();
+ state->ScheduledRequests.clear();
+ state->Notifications.clear();
+
+ while (!requestRowset.EndOfSet()) {
+ TString id = requestRowset.GetValue<Schema::Request::ID>();
+ TString owner = requestRowset.GetValue<Schema::Request::Owner>();
+ ui64 order = requestRowset.GetValue<Schema::Request::Order>();
+ TString requestStr = requestRowset.GetValue<Schema::Request::Content>();
+
+ TRequestInfo request;
+ request.RequestId = id;
+ request.Owner = owner;
+ request.Order = order;
+ google::protobuf::TextFormat::ParseFromString(requestStr, &request.Request);
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Loaded request %s owned by %s: %s",
id.data(), owner.data(), requestStr.data());
-
- state->ScheduledRequests.emplace(id, request);
-
- if (!requestRowset.Next())
- return false;
- }
-
- while (!walleTaskRowset.EndOfSet()) {
- TString taskId = walleTaskRowset.GetValue<Schema::WalleTask::TaskID>();
- TString requestId = walleTaskRowset.GetValue<Schema::WalleTask::RequestID>();
-
- TWalleTaskInfo task;
- task.TaskId = taskId;
- task.RequestId = requestId;
- state->WalleRequests.emplace(requestId, taskId);
- state->WalleTasks.emplace(taskId, task);
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Loaded Wall-E task %s mapped to request %s",
+
+ state->ScheduledRequests.emplace(id, request);
+
+ if (!requestRowset.Next())
+ return false;
+ }
+
+ while (!walleTaskRowset.EndOfSet()) {
+ TString taskId = walleTaskRowset.GetValue<Schema::WalleTask::TaskID>();
+ TString requestId = walleTaskRowset.GetValue<Schema::WalleTask::RequestID>();
+
+ TWalleTaskInfo task;
+ task.TaskId = taskId;
+ task.RequestId = requestId;
+ state->WalleRequests.emplace(requestId, taskId);
+ state->WalleTasks.emplace(taskId, task);
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Loaded Wall-E task %s mapped to request %s",
taskId.data(), requestId.data());
-
- if (!walleTaskRowset.Next())
- return false;
- }
-
- while (!permissionRowset.EndOfSet()) {
- TString id = permissionRowset.GetValue<Schema::Permission::ID>();
- TString requestId = permissionRowset.GetValue<Schema::Permission::RequestID>();
- TString owner = permissionRowset.GetValue<Schema::Permission::Owner>();
- TString actionStr = permissionRowset.GetValue<Schema::Permission::Action>();
- ui64 deadline = permissionRowset.GetValue<Schema::Permission::Deadline>();
-
- TPermissionInfo permission;
- permission.PermissionId = id;
- permission.RequestId = requestId;
- permission.Owner = owner;
- google::protobuf::TextFormat::ParseFromString(actionStr, &permission.Action);
+
+ if (!walleTaskRowset.Next())
+ return false;
+ }
+
+ while (!permissionRowset.EndOfSet()) {
+ TString id = permissionRowset.GetValue<Schema::Permission::ID>();
+ TString requestId = permissionRowset.GetValue<Schema::Permission::RequestID>();
+ TString owner = permissionRowset.GetValue<Schema::Permission::Owner>();
+ TString actionStr = permissionRowset.GetValue<Schema::Permission::Action>();
+ ui64 deadline = permissionRowset.GetValue<Schema::Permission::Deadline>();
+
+ TPermissionInfo permission;
+ permission.PermissionId = id;
+ permission.RequestId = requestId;
+ permission.Owner = owner;
+ google::protobuf::TextFormat::ParseFromString(actionStr, &permission.Action);
permission.Deadline = TInstant::MicroSeconds(deadline);
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Loaded permission %s owned by %s valid until %s: %s",
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Loaded permission %s owned by %s valid until %s: %s",
id.data(), owner.data(), TInstant::MicroSeconds(deadline).ToStringLocalUpToSeconds().data(), actionStr.data());
-
- state->Permissions.emplace(id, permission);
-
+
+ state->Permissions.emplace(id, permission);
+
if (state->WalleRequests.contains(requestId)) {
- const auto &taskId = state->WalleRequests[requestId];
- state->WalleTasks[taskId].Permissions.insert(id);
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Added permission %s to Wall-E task %s",
+ const auto &taskId = state->WalleRequests[requestId];
+ state->WalleTasks[taskId].Permissions.insert(id);
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Added permission %s to Wall-E task %s",
id.data(), taskId.data());
- }
-
- if (!permissionRowset.Next())
- return false;
- }
-
- while (!notificationRowset.EndOfSet()) {
- TString id = notificationRowset.GetValue<Schema::Notification::ID>();
- TString owner = notificationRowset.GetValue<Schema::Notification::Owner>();
- TString notificationStr = notificationRowset.GetValue<Schema::Notification::NotificationProto>();
-
- TNotificationInfo notification;
- notification.NotificationId = id;
- notification.Owner = owner;
- google::protobuf::TextFormat::ParseFromString(notificationStr, &notification.Notification);
-
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Loaded notification %s owned by %s: %s",
+ }
+
+ if (!permissionRowset.Next())
+ return false;
+ }
+
+ while (!notificationRowset.EndOfSet()) {
+ TString id = notificationRowset.GetValue<Schema::Notification::ID>();
+ TString owner = notificationRowset.GetValue<Schema::Notification::Owner>();
+ TString notificationStr = notificationRowset.GetValue<Schema::Notification::NotificationProto>();
+
+ TNotificationInfo notification;
+ notification.NotificationId = id;
+ notification.Owner = owner;
+ google::protobuf::TextFormat::ParseFromString(notificationStr, &notification.Notification);
+
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Loaded notification %s owned by %s: %s",
id.data(), owner.data(), notificationStr.data());
-
- state->Notifications.emplace(id, notification);
-
- if (!notificationRowset.Next())
- return false;
- }
-
+
+ state->Notifications.emplace(id, notification);
+
+ if (!notificationRowset.Next())
+ return false;
+ }
+
while (!nodeTenantRowset.EndOfSet()) {
ui32 nodeId = nodeTenantRowset.GetValue<Schema::NodeTenant::NodeId>();
TString tenant = nodeTenantRowset.GetValue<Schema::NodeTenant::Tenant>();
@@ -170,38 +170,38 @@ public:
return false;
}
- if (!state->Downtimes.DbLoadState(txc, ctx))
- return false;
-
- Self->CleanupWalleTasks(ctx);
-
- NKikimrCms::TLogRecordData data;
- data.SetRecordType(NKikimrCms::TLogRecordData::CMS_LOADED);
- auto &rec = *data.MutableCmsLoaded();
- rec.SetHost(FQDNHostName());
- rec.SetNodeId(Self->SelfId().NodeId());
- rec.SetVersion(Sprintf("%s:%s", GetArcadiaSourceUrl(), GetArcadiaLastChange()));
- Self->Logger.DbLogData(data, txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxLoadState Complete");
- Self->Become(&TCms::StateWork);
- Self->SchedulePermissionsCleanup(ctx);
- Self->ScheduleNotificationsCleanup(ctx);
- Self->ScheduleLogCleanup(ctx);
+ if (!state->Downtimes.DbLoadState(txc, ctx))
+ return false;
+
+ Self->CleanupWalleTasks(ctx);
+
+ NKikimrCms::TLogRecordData data;
+ data.SetRecordType(NKikimrCms::TLogRecordData::CMS_LOADED);
+ auto &rec = *data.MutableCmsLoaded();
+ rec.SetHost(FQDNHostName());
+ rec.SetNodeId(Self->SelfId().NodeId());
+ rec.SetVersion(Sprintf("%s:%s", GetArcadiaSourceUrl(), GetArcadiaLastChange()));
+ Self->Logger.DbLogData(data, txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxLoadState Complete");
+ Self->Become(&TCms::StateWork);
+ Self->SchedulePermissionsCleanup(ctx);
+ Self->ScheduleNotificationsCleanup(ctx);
+ Self->ScheduleLogCleanup(ctx);
Self->ScheduleUpdateClusterInfo(ctx, true);
- Self->ProcessInitQueue(ctx);
- }
-};
-
-ITransaction* TCms::CreateTxLoadState()
-{
- return new TTxLoadState(this);
-}
-
-} // NCms
-} // NKikimr
+ Self->ProcessInitQueue(ctx);
+ }
+};
+
+ITransaction* TCms::CreateTxLoadState()
+{
+ return new TTxLoadState(this);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_log_and_send.cpp b/ydb/core/cms/cms_tx_log_and_send.cpp
index f111a3fe5d6..f713d28755e 100644
--- a/ydb/core/cms/cms_tx_log_and_send.cpp
+++ b/ydb/core/cms/cms_tx_log_and_send.cpp
@@ -1,44 +1,44 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxLogAndSend : public TTransactionBase<TCms> {
-public:
- TTxLogAndSend(TCms *self,
- TEvPrivate::TEvLogAndSend::TPtr &ev)
- : TBase(self)
- , Event(std::move(ev))
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "TTxLogAndSend Execute");
-
- Self->Logger.DbLogData(Event->Get()->LogData, txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxLogAndSend Complete");
-
- if (Event->Get()->Event)
- ctx.Send(Event->Get()->Event.Release());
- }
-
-private:
- TEvPrivate::TEvLogAndSend::TPtr Event;
-};
-
-ITransaction *TCms::CreateTxLogAndSend(TEvPrivate::TEvLogAndSend::TPtr &ev)
-{
- return new TTxLogAndSend(this, ev);
-}
-
-} // NCms
-} // NKikimr
+#include "cms_impl.h"
+#include "scheme.h"
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxLogAndSend : public TTransactionBase<TCms> {
+public:
+ TTxLogAndSend(TCms *self,
+ TEvPrivate::TEvLogAndSend::TPtr &ev)
+ : TBase(self)
+ , Event(std::move(ev))
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "TTxLogAndSend Execute");
+
+ Self->Logger.DbLogData(Event->Get()->LogData, txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxLogAndSend Complete");
+
+ if (Event->Get()->Event)
+ ctx.Send(Event->Get()->Event.Release());
+ }
+
+private:
+ TEvPrivate::TEvLogAndSend::TPtr Event;
+};
+
+ITransaction *TCms::CreateTxLogAndSend(TEvPrivate::TEvLogAndSend::TPtr &ev)
+{
+ return new TTxLogAndSend(this, ev);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_log_cleanup.cpp b/ydb/core/cms/cms_tx_log_cleanup.cpp
index 5080191fa0d..933b67a93f1 100644
--- a/ydb/core/cms/cms_tx_log_cleanup.cpp
+++ b/ydb/core/cms/cms_tx_log_cleanup.cpp
@@ -1,37 +1,37 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxLogCleanup : public TTransactionBase<TCms> {
-public:
- TTxLogCleanup(TCms *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "TTxLogCleanup Execute");
-
- return Self->Logger.DbCleanupLog(txc, ctx);
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxLogCleanup Complete");
- Self->ScheduleLogCleanup(ctx);
- }
-
-private:
-};
-
-ITransaction *TCms::CreateTxLogCleanup()
-{
- return new TTxLogCleanup(this);
-}
-
-} // NCms
-} // NKikimr
+#include "cms_impl.h"
+#include "scheme.h"
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxLogCleanup : public TTransactionBase<TCms> {
+public:
+ TTxLogCleanup(TCms *self)
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "TTxLogCleanup Execute");
+
+ return Self->Logger.DbCleanupLog(txc, ctx);
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxLogCleanup Complete");
+ Self->ScheduleLogCleanup(ctx);
+ }
+
+private:
+};
+
+ITransaction *TCms::CreateTxLogCleanup()
+{
+ return new TTxLogCleanup(this);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_process_notification.cpp b/ydb/core/cms/cms_tx_process_notification.cpp
index 09b96e04f4e..2174a82f171 100644
--- a/ydb/core/cms/cms_tx_process_notification.cpp
+++ b/ydb/core/cms/cms_tx_process_notification.cpp
@@ -1,71 +1,71 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
+#include "cms_impl.h"
+#include "scheme.h"
+
#include <google/protobuf/text_format.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxProcessNotification : public TTransactionBase<TCms> {
-public:
- TTxProcessNotification(TCms *self, TEvCms::TEvNotification::TPtr ev)
- : TBase(self)
- , Event(ev)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxProcessNotification Execute");
-
- auto &rec = Event->Get()->Record;
- Response = new TEvCms::TEvNotificationResponse;
-
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxProcessNotification : public TTransactionBase<TCms> {
+public:
+ TTxProcessNotification(TCms *self, TEvCms::TEvNotification::TPtr ev)
+ : TBase(self)
+ , Event(ev)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxProcessNotification Execute");
+
+ auto &rec = Event->Get()->Record;
+ Response = new TEvCms::TEvNotificationResponse;
+
LOG_INFO(ctx, NKikimrServices::CMS, "Processing notification from %s (time=%s reason='%s')",
rec.GetUser().data(), TInstant::MicroSeconds(rec.GetTime()).ToStringLocalUpToSeconds().data(),
rec.GetReason().data());
-
- if (Self->CheckNotification(rec, Response->Record, ctx)) {
- TString id = Self->AcceptNotification(rec, ctx);
- Response->Record.SetNotificationId(id);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Param>().Key(1)
- .Update(NIceDb::TUpdate<Schema::Param::NextNotificationID>(Self->State->NextNotificationId));
-
- TString notificationStr;
- google::protobuf::TextFormat::PrintToString(rec, &notificationStr);
-
- auto row = db.Table<Schema::Notification>().Key(id);
- row.Update(NIceDb::TUpdate<Schema::Notification::Owner>(rec.GetUser()),
- NIceDb::TUpdate<Schema::Notification::NotificationProto>(notificationStr));
+
+ if (Self->CheckNotification(rec, Response->Record, ctx)) {
+ TString id = Self->AcceptNotification(rec, ctx);
+ Response->Record.SetNotificationId(id);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Param>().Key(1)
+ .Update(NIceDb::TUpdate<Schema::Param::NextNotificationID>(Self->State->NextNotificationId));
+
+ TString notificationStr;
+ google::protobuf::TextFormat::PrintToString(rec, &notificationStr);
+
+ auto row = db.Table<Schema::Notification>().Key(id);
+ row.Update(NIceDb::TUpdate<Schema::Notification::Owner>(rec.GetUser()),
+ NIceDb::TUpdate<Schema::Notification::NotificationProto>(notificationStr));
Self->AuditLog(ctx, TStringBuilder() << "Store notification"
<< ": id# " << id
<< ", body# " << notificationStr);
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxProcessNotification complete with response: %s",
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxProcessNotification complete with response: %s",
Response->Record.ShortDebugString().data());
-
+
Self->Reply(Event, std::move(Response), ctx);
- Self->ScheduleNotificationsCleanup(ctx);
- }
-
-private:
- TEvCms::TEvNotification::TPtr Event;
- TAutoPtr<TEvCms::TEvNotificationResponse> Response;
-};
-
-ITransaction* TCms::CreateTxProcessNotification(TEvCms::TEvNotification::TPtr &ev)
-{
- return new TTxProcessNotification(this, ev.Release());
-}
-
-} // NCms
-} // NKikimr
+ Self->ScheduleNotificationsCleanup(ctx);
+ }
+
+private:
+ TEvCms::TEvNotification::TPtr Event;
+ TAutoPtr<TEvCms::TEvNotificationResponse> Response;
+};
+
+ITransaction* TCms::CreateTxProcessNotification(TEvCms::TEvNotification::TPtr &ev)
+{
+ return new TTxProcessNotification(this, ev.Release());
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_reject_notification.cpp b/ydb/core/cms/cms_tx_reject_notification.cpp
index 9f13af805d3..5612dd9fbb1 100644
--- a/ydb/core/cms/cms_tx_reject_notification.cpp
+++ b/ydb/core/cms/cms_tx_reject_notification.cpp
@@ -1,70 +1,70 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
+#include "cms_impl.h"
+#include "scheme.h"
+
#include <google/protobuf/text_format.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxRejectNotification : public TTransactionBase<TCms> {
-public:
- TTxRejectNotification(TCms *self, TEvCms::TEvManageNotificationRequest::TPtr ev)
- : TBase(self)
- , Event(ev)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRejectNotification Execute");
-
- auto &rec = Event->Get()->Record;
- Response = new TEvCms::TEvManageNotificationResponse;
-
- auto &id = rec.GetNotificationId();
- const TString &user = rec.GetUser();
- bool dry = rec.GetDryRun();
-
- TErrorInfo error;
- if (Self->RemoveNotification(id, user, !dry, error)) {
- if (!dry) {
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxRejectNotification : public TTransactionBase<TCms> {
+public:
+ TTxRejectNotification(TCms *self, TEvCms::TEvManageNotificationRequest::TPtr ev)
+ : TBase(self)
+ , Event(ev)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRejectNotification Execute");
+
+ auto &rec = Event->Get()->Record;
+ Response = new TEvCms::TEvManageNotificationResponse;
+
+ auto &id = rec.GetNotificationId();
+ const TString &user = rec.GetUser();
+ bool dry = rec.GetDryRun();
+
+ TErrorInfo error;
+ if (Self->RemoveNotification(id, user, !dry, error)) {
+ if (!dry) {
Self->AuditLog(ctx, TStringBuilder() << "Remove notification"
<< ": id# " << id
<< ", reason# " << "explicit remove");
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Notification>().Key(id).Delete();
- }
-
- Response->Record.MutableStatus()->SetCode(NKikimrCms::TStatus::OK);
- } else {
- Response->Record.MutableStatus()->SetCode(error.Code);
- Response->Record.MutableStatus()->SetReason(error.Reason);
- }
-
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Notification>().Key(id).Delete();
+ }
+
+ Response->Record.MutableStatus()->SetCode(NKikimrCms::TStatus::OK);
+ } else {
+ Response->Record.MutableStatus()->SetCode(error.Code);
+ Response->Record.MutableStatus()->SetReason(error.Reason);
+ }
+
LOG_INFO(ctx, NKikimrServices::CMS, "Response status: %s %s",
ToString(Response->Record.GetStatus().GetCode()).data(),
Response->Record.GetStatus().GetReason().data());
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRejectNotification Complete");
-
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRejectNotification Complete");
+
Self->Reply(Event, std::move(Response), ctx);
- }
-
-private:
- TEvCms::TEvManageNotificationRequest::TPtr Event;
- TAutoPtr<TEvCms::TEvManageNotificationResponse> Response;
-};
-
-ITransaction *TCms::CreateTxRejectNotification(TEvCms::TEvManageNotificationRequest::TPtr &ev)
-{
- return new TTxRejectNotification(this, ev.Release());
-}
-
-} // NCms
-} // NKikimr
+ }
+
+private:
+ TEvCms::TEvManageNotificationRequest::TPtr Event;
+ TAutoPtr<TEvCms::TEvManageNotificationResponse> Response;
+};
+
+ITransaction *TCms::CreateTxRejectNotification(TEvCms::TEvManageNotificationRequest::TPtr &ev)
+{
+ return new TTxRejectNotification(this, ev.Release());
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_remove_expired_notifications.cpp b/ydb/core/cms/cms_tx_remove_expired_notifications.cpp
index 12990de0121..6235b7f8f0f 100644
--- a/ydb/core/cms/cms_tx_remove_expired_notifications.cpp
+++ b/ydb/core/cms/cms_tx_remove_expired_notifications.cpp
@@ -1,85 +1,85 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
+#include "cms_impl.h"
+#include "scheme.h"
+
#include <google/protobuf/text_format.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxRemoveExpiredNotifications : public TTransactionBase<TCms> {
-public:
- TTxRemoveExpiredNotifications(TCms *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveExpiredNotifications Execute");
-
- TInstant now = ctx.Now();
- for (auto entry = Self->State->Notifications.begin(); entry != Self->State->Notifications.end();) {
- auto &info = entry->second;
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxRemoveExpiredNotifications : public TTransactionBase<TCms> {
+public:
+ TTxRemoveExpiredNotifications(TCms *self)
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveExpiredNotifications Execute");
+
+ TInstant now = ctx.Now();
+ for (auto entry = Self->State->Notifications.begin(); entry != Self->State->Notifications.end();) {
+ auto &info = entry->second;
TInstant time = TInstant::MicroSeconds(info.Notification.GetTime());
- bool modified = false;
-
- auto next = entry;
- ++next;
-
- auto *actions = info.Notification.MutableActions();
- for (auto i = actions->begin(); i != actions->end(); ) {
+ bool modified = false;
+
+ auto next = entry;
+ ++next;
+
+ auto *actions = info.Notification.MutableActions();
+ for (auto i = actions->begin(); i != actions->end(); ) {
TInstant deadline = time + TDuration::MicroSeconds(i->GetDuration());
-
- if (deadline <= now) {
+
+ if (deadline <= now) {
LOG_INFO(ctx, NKikimrServices::CMS, "Removing expired action from notification %s: %s",
info.NotificationId.data(), i->ShortDebugString().data());
-
- i = actions->erase(i);
- modified = true;
- } else
- ++i;
- }
-
- if (actions->empty()) {
+
+ i = actions->erase(i);
+ modified = true;
+ } else
+ ++i;
+ }
+
+ if (actions->empty()) {
Self->AuditLog(ctx, TStringBuilder() << "Remove notification"
<< ": id# " << info.NotificationId
<< ", reason# " << "scheduled cleanup");
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Notification>().Key(info.NotificationId).Delete();
-
- Self->State->Notifications.erase(entry);
- } else if (modified) {
- TString notificationStr;
- google::protobuf::TextFormat::PrintToString(info.Notification, &notificationStr);
-
- NIceDb::TNiceDb db(txc.DB);
- auto row = db.Table<Schema::Notification>().Key(info.NotificationId);
- row.Update(NIceDb::TUpdate<Schema::Notification::NotificationProto>(notificationStr));
-
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Notification>().Key(info.NotificationId).Delete();
+
+ Self->State->Notifications.erase(entry);
+ } else if (modified) {
+ TString notificationStr;
+ google::protobuf::TextFormat::PrintToString(info.Notification, &notificationStr);
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto row = db.Table<Schema::Notification>().Key(info.NotificationId);
+ row.Update(NIceDb::TUpdate<Schema::Notification::NotificationProto>(notificationStr));
+
Self->AuditLog(ctx, TStringBuilder() << "Update notification"
<< ": id# " << info.NotificationId
<< ", body# " << notificationStr);
- }
-
- entry = next;
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveExpiredNotifications Complete");
- }
-
-private:
-};
-
-ITransaction *TCms::CreateTxRemoveExpiredNotifications()
-{
- return new TTxRemoveExpiredNotifications(this);
-}
-
-} // NCms
-} // NKikimr
+ }
+
+ entry = next;
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveExpiredNotifications Complete");
+ }
+
+private:
+};
+
+ITransaction *TCms::CreateTxRemoveExpiredNotifications()
+{
+ return new TTxRemoveExpiredNotifications(this);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_remove_permissions.cpp b/ydb/core/cms/cms_tx_remove_permissions.cpp
index cf9e19a0d0d..6e638c72ffb 100644
--- a/ydb/core/cms/cms_tx_remove_permissions.cpp
+++ b/ydb/core/cms/cms_tx_remove_permissions.cpp
@@ -1,35 +1,35 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
+#include "cms_impl.h"
+#include "scheme.h"
+
#include <google/protobuf/text_format.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxRemovePermissions : public TTransactionBase<TCms> {
-public:
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxRemovePermissions : public TTransactionBase<TCms> {
+public:
TTxRemovePermissions(TCms *self, TVector<TString> &&ids, THolder<IEventBase> req, TAutoPtr<IEventHandle> resp, bool expired)
- : TBase(self)
+ : TBase(self)
, Request(std::move(req))
- , Response(resp)
- , Ids(ids)
+ , Response(resp)
+ , Ids(ids)
, Expired(expired)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemovePermissions Execute");
-
- NIceDb::TNiceDb db(txc.DB);
- for (auto id : Ids) {
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemovePermissions Execute");
+
+ NIceDb::TNiceDb db(txc.DB);
+ for (auto id : Ids) {
if (!Self->State->Permissions.contains(id))
- continue;
-
- auto requestId = Self->State->Permissions.find(id)->second.RequestId;
- Self->State->Permissions.erase(id);
- db.Table<Schema::Permission>().Key(id).Delete();
-
+ continue;
+
+ auto requestId = Self->State->Permissions.find(id)->second.RequestId;
+ Self->State->Permissions.erase(id);
+ db.Table<Schema::Permission>().Key(id).Delete();
+
if (Expired && Self->State->ScheduledRequests.contains(requestId)) {
Self->State->ScheduledRequests.erase(requestId);
db.Table<Schema::Request>().Key(requestId).Delete();
@@ -40,41 +40,41 @@ public:
}
if (Self->State->WalleRequests.contains(requestId)) {
- auto taskId = Self->State->WalleRequests.find(requestId)->second;
- Self->State->WalleTasks.find(taskId)->second.Permissions.erase(id);
- }
-
+ auto taskId = Self->State->WalleRequests.find(requestId)->second;
+ Self->State->WalleTasks.find(taskId)->second.Permissions.erase(id);
+ }
+
Self->AuditLog(ctx, TStringBuilder() << "Remove permission"
<< ": id# " << id
<< ", reason# " << (Request ? "explicit remove" : "scheduled cleanup"));
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemovePermissions Complete");
-
- if (Response) {
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemovePermissions Complete");
+
+ if (Response) {
Y_VERIFY(Request);
Self->Reply(Request.Get(), Response, ctx);
- }
-
- Self->RemoveEmptyWalleTasks(ctx);
- }
-
-private:
+ }
+
+ Self->RemoveEmptyWalleTasks(ctx);
+ }
+
+private:
THolder<IEventBase> Request;
- TAutoPtr<IEventHandle> Response;
+ TAutoPtr<IEventHandle> Response;
TVector<TString> Ids;
bool Expired;
-};
-
+};
+
ITransaction* TCms::CreateTxRemovePermissions(TVector<TString> ids, THolder<IEventBase> req, TAutoPtr<IEventHandle> resp, bool expired)
-{
+{
return new TTxRemovePermissions(this, std::move(ids), std::move(req), std::move(resp), expired);
-}
-
-} // NCms
-} // NKikimr
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_remove_request.cpp b/ydb/core/cms/cms_tx_remove_request.cpp
index e4f4bf5fe38..fab8144cfe3 100644
--- a/ydb/core/cms/cms_tx_remove_request.cpp
+++ b/ydb/core/cms/cms_tx_remove_request.cpp
@@ -1,58 +1,58 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
+#include "cms_impl.h"
+#include "scheme.h"
+
#include <google/protobuf/text_format.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxRemoveRequest : public TTransactionBase<TCms> {
-public:
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxRemoveRequest : public TTransactionBase<TCms> {
+public:
TTxRemoveRequest(TCms *self, const TString &id, THolder<IEventBase> req, TAutoPtr<IEventHandle> resp)
- : TBase(self)
+ : TBase(self)
, Request(std::move(req))
- , Response(resp)
- , Id(id)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveRequest Execute");
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Request>().Key(Id).Delete();
- Self->State->ScheduledRequests.erase(Id);
-
+ , Response(resp)
+ , Id(id)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveRequest Execute");
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Request>().Key(Id).Delete();
+ Self->State->ScheduledRequests.erase(Id);
+
Self->AuditLog(ctx, TStringBuilder() << "Remove request"
<< ": id# " << Id
<< ", reason# " << (Request ? "explicit remove" : "scheduled cleanup"));
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveRequest Complete");
-
- if (Response) {
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveRequest Complete");
+
+ if (Response) {
Y_VERIFY(Request);
Self->Reply(Request.Get(), Response, ctx);
- }
-
- Self->RemoveEmptyWalleTasks(ctx);
- }
-
-private:
+ }
+
+ Self->RemoveEmptyWalleTasks(ctx);
+ }
+
+private:
THolder<IEventBase> Request;
- TAutoPtr<IEventHandle> Response;
- TString Id;
-};
-
+ TAutoPtr<IEventHandle> Response;
+ TString Id;
+};
+
ITransaction* TCms::CreateTxRemoveRequest(const TString &id, THolder<IEventBase> req, TAutoPtr<IEventHandle> resp)
-{
+{
return new TTxRemoveRequest(this, id, std::move(req), std::move(resp));
-}
-
-} // NCms
-} // NKikimr
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_remove_walle_task.cpp b/ydb/core/cms/cms_tx_remove_walle_task.cpp
index aa175d045dc..d9e099f0db7 100644
--- a/ydb/core/cms/cms_tx_remove_walle_task.cpp
+++ b/ydb/core/cms/cms_tx_remove_walle_task.cpp
@@ -1,53 +1,53 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
+#include "cms_impl.h"
+#include "scheme.h"
+
#include <google/protobuf/text_format.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxRemoveWalleTask : public TTransactionBase<TCms> {
-public:
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxRemoveWalleTask : public TTransactionBase<TCms> {
+public:
TTxRemoveWalleTask(TCms *self, const TString &id)
- : TBase(self)
- , Id(id)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveWalleTask Execute");
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::WalleTask>().Key(Id).Delete();
-
- auto it = Self->State->WalleTasks.find(Id);
- if (it != Self->State->WalleTasks.end()) {
- Self->State->WalleRequests.erase(it->second.RequestId);
- Self->State->WalleTasks.erase(it);
-
+ : TBase(self)
+ , Id(id)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveWalleTask Execute");
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::WalleTask>().Key(Id).Delete();
+
+ auto it = Self->State->WalleTasks.find(Id);
+ if (it != Self->State->WalleTasks.end()) {
+ Self->State->WalleRequests.erase(it->second.RequestId);
+ Self->State->WalleTasks.erase(it);
+
Self->AuditLog(ctx, TStringBuilder() << "Remove wall-e task"
<< ": id# " << Id);
} else {
LOG_ERROR(ctx, NKikimrServices::CMS, "Can't find Wall-E task %s", Id.data());
}
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveWalleTask Complete");
- }
-
-private:
- TString Id;
-};
-
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxRemoveWalleTask Complete");
+ }
+
+private:
+ TString Id;
+};
+
ITransaction* TCms::CreateTxRemoveWalleTask(const TString &id)
-{
+{
return new TTxRemoveWalleTask(this, id);
-}
-
-} // NCms
-} // NKikimr
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_store_permissions.cpp b/ydb/core/cms/cms_tx_store_permissions.cpp
index 25dda549227..fc5bc54e3e6 100644
--- a/ydb/core/cms/cms_tx_store_permissions.cpp
+++ b/ydb/core/cms/cms_tx_store_permissions.cpp
@@ -1,107 +1,107 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
+#include "cms_impl.h"
+#include "scheme.h"
+
#include <google/protobuf/text_format.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxStorePermissions : public TTransactionBase<TCms> {
-public:
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxStorePermissions : public TTransactionBase<TCms> {
+public:
TTxStorePermissions(TCms *self, THolder<IEventBase> req, TAutoPtr<IEventHandle> resp,
const TString &owner, TAutoPtr<TRequestInfo> scheduled)
- : TBase(self)
+ : TBase(self)
, Request(std::move(req))
, Response(std::move(resp))
- , Owner(owner)
- , Scheduled(scheduled)
- , NextPermissionId(self->State->NextPermissionId)
- , NextRequestId(self->State->NextRequestId)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxStorePermissions Execute");
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Param>().Key(1).Update(NIceDb::TUpdate<Schema::Param::NextPermissionID>(NextPermissionId),
- NIceDb::TUpdate<Schema::Param::NextRequestID>(NextRequestId));
-
+ , Owner(owner)
+ , Scheduled(scheduled)
+ , NextPermissionId(self->State->NextPermissionId)
+ , NextRequestId(self->State->NextRequestId)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxStorePermissions Execute");
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Param>().Key(1).Update(NIceDb::TUpdate<Schema::Param::NextPermissionID>(NextPermissionId),
+ NIceDb::TUpdate<Schema::Param::NextRequestID>(NextRequestId));
+
const auto& rec = Response->Get<TEvCms::TEvPermissionResponse>()->Record;
for (const auto &permission : rec.GetPermissions()) {
- const auto &id = permission.GetId();
- const auto &requestId = Scheduled ? Scheduled->RequestId : "";
- ui64 deadline = permission.GetDeadline();
- TString actionStr;
- google::protobuf::TextFormat::PrintToString(permission.GetAction(), &actionStr);
-
- auto row = db.Table<Schema::Permission>().Key(id);
- row.Update(NIceDb::TUpdate<Schema::Permission::Owner>(Owner),
- NIceDb::TUpdate<Schema::Permission::Action>(actionStr),
- NIceDb::TUpdate<Schema::Permission::Deadline>(deadline),
- NIceDb::TUpdate<Schema::Permission::RequestID>(requestId));
-
+ const auto &id = permission.GetId();
+ const auto &requestId = Scheduled ? Scheduled->RequestId : "";
+ ui64 deadline = permission.GetDeadline();
+ TString actionStr;
+ google::protobuf::TextFormat::PrintToString(permission.GetAction(), &actionStr);
+
+ auto row = db.Table<Schema::Permission>().Key(id);
+ row.Update(NIceDb::TUpdate<Schema::Permission::Owner>(Owner),
+ NIceDb::TUpdate<Schema::Permission::Action>(actionStr),
+ NIceDb::TUpdate<Schema::Permission::Deadline>(deadline),
+ NIceDb::TUpdate<Schema::Permission::RequestID>(requestId));
+
Self->AuditLog(ctx, TStringBuilder() << "Store permission"
<< ": id# " << id
<< ", validity# " << TInstant::MicroSeconds(deadline)
<< ", action# " << actionStr);
- }
-
- if (Scheduled) {
- auto &id = Scheduled->RequestId;
- auto &owner = Scheduled->Owner;
-
- if (Scheduled->Request.ActionsSize()) {
- ui64 order = Scheduled->Order;
- TString requestStr;
- google::protobuf::TextFormat::PrintToString(Scheduled->Request, &requestStr);
-
- auto row = db.Table<Schema::Request>().Key(id);
- row.Update(NIceDb::TUpdate<Schema::Request::Owner>(owner),
- NIceDb::TUpdate<Schema::Request::Order>(order),
- NIceDb::TUpdate<Schema::Request::Content>(requestStr));
-
+ }
+
+ if (Scheduled) {
+ auto &id = Scheduled->RequestId;
+ auto &owner = Scheduled->Owner;
+
+ if (Scheduled->Request.ActionsSize()) {
+ ui64 order = Scheduled->Order;
+ TString requestStr;
+ google::protobuf::TextFormat::PrintToString(Scheduled->Request, &requestStr);
+
+ auto row = db.Table<Schema::Request>().Key(id);
+ row.Update(NIceDb::TUpdate<Schema::Request::Owner>(owner),
+ NIceDb::TUpdate<Schema::Request::Order>(order),
+ NIceDb::TUpdate<Schema::Request::Content>(requestStr));
+
Self->AuditLog(ctx, TStringBuilder() << "Store request"
<< ": id# " << id
<< ", owner# " << owner
<< ", order# " << order
<< ", body# " << requestStr);
- } else {
- db.Table<Schema::Request>().Key(id).Delete();
-
+ } else {
+ db.Table<Schema::Request>().Key(id).Delete();
+
Self->AuditLog(ctx, TStringBuilder() << "Remove request"
<< ": id# " << id
<< ", owner# " << owner);
- }
- }
-
+ }
+ }
+
Self->PersistNodeTenants(txc, ctx);
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxStorePermissions complete");
-
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxStorePermissions complete");
+
Self->Reply(Request.Get(), Response, ctx);
- Self->SchedulePermissionsCleanup(ctx);
- }
-
-private:
+ Self->SchedulePermissionsCleanup(ctx);
+ }
+
+private:
THolder<IEventBase> Request;
TAutoPtr<IEventHandle> Response;
- TString Owner;
- TAutoPtr<TRequestInfo> Scheduled;
- ui64 NextPermissionId;
- ui64 NextRequestId;
-};
-
+ TString Owner;
+ TAutoPtr<TRequestInfo> Scheduled;
+ ui64 NextPermissionId;
+ ui64 NextRequestId;
+};
+
ITransaction* TCms::CreateTxStorePermissions(THolder<IEventBase> req, TAutoPtr<IEventHandle> resp,
const TString &owner, TAutoPtr<TRequestInfo> scheduled)
-{
+{
return new TTxStorePermissions(this, std::move(req), std::move(resp), owner, std::move(scheduled));
-}
-
-} // NCms
-} // NKikimr
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_store_walle_task.cpp b/ydb/core/cms/cms_tx_store_walle_task.cpp
index 8028615b038..f05828477a4 100644
--- a/ydb/core/cms/cms_tx_store_walle_task.cpp
+++ b/ydb/core/cms/cms_tx_store_walle_task.cpp
@@ -1,56 +1,56 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
+#include "cms_impl.h"
+#include "scheme.h"
+
#include <google/protobuf/text_format.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxStoreWalleTask : public TTransactionBase<TCms> {
-public:
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxStoreWalleTask : public TTransactionBase<TCms> {
+public:
TTxStoreWalleTask(TCms *self, const TWalleTaskInfo &task, THolder<IEventBase> req, TAutoPtr<IEventHandle> resp)
- : TBase(self)
- , TaskId(task.TaskId)
- , RequestId(task.RequestId)
+ : TBase(self)
+ , TaskId(task.TaskId)
+ , RequestId(task.RequestId)
, Request(std::move(req))
- , Response(std::move(resp))
- {
+ , Response(std::move(resp))
+ {
Y_VERIFY(Request);
Y_VERIFY(Response);
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxStoreWalleTask Execute");
-
- NIceDb::TNiceDb db(txc.DB);
- auto row = db.Table<Schema::WalleTask>().Key(TaskId);
- row.Update(NIceDb::TUpdate<Schema::WalleTask::RequestID>(RequestId));
-
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxStoreWalleTask Execute");
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto row = db.Table<Schema::WalleTask>().Key(TaskId);
+ row.Update(NIceDb::TUpdate<Schema::WalleTask::RequestID>(RequestId));
+
Self->AuditLog(ctx, TStringBuilder() << "Store wall-e task"
<< ": id# " << TaskId
<< ", requestId# " << RequestId);
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxStoreWalleTask Complete");
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxStoreWalleTask Complete");
Self->Reply(Request.Get(), Response, ctx);
- }
-
-private:
- TString TaskId;
- TString RequestId;
+ }
+
+private:
+ TString TaskId;
+ TString RequestId;
THolder<IEventBase> Request;
- TAutoPtr<IEventHandle> Response;
-};
-
+ TAutoPtr<IEventHandle> Response;
+};
+
ITransaction *TCms::CreateTxStoreWalleTask(const TWalleTaskInfo &task, THolder<IEventBase> req, TAutoPtr<IEventHandle> resp)
-{
+{
return new TTxStoreWalleTask(this, task, std::move(req), std::move(resp));
-}
-
-} // NCms
-} // NKikimr
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_update_config.cpp b/ydb/core/cms/cms_tx_update_config.cpp
index 2e47992109b..59f962b3e2c 100644
--- a/ydb/core/cms/cms_tx_update_config.cpp
+++ b/ydb/core/cms/cms_tx_update_config.cpp
@@ -1,58 +1,58 @@
-#include "cms_impl.h"
-#include "scheme.h"
+#include "cms_impl.h"
+#include "scheme.h"
#include "sentinel.h"
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxUpdateConfig : public TTransactionBase<TCms> {
-public:
- TTxUpdateConfig(TCms *self,
- const NKikimrCms::TCmsConfig &config,
- TAutoPtr<IEventHandle> response,
- ui64 subscriptionId = 0)
- : TBase(self)
- , Config(config)
- , Response(response)
- , SubscriptionId(subscriptionId)
- , Modify(false)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "TTxUpdateConfig Execute");
-
- if (SubscriptionId != Self->ConfigSubscriptionId) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS,
- "Config subscription id mismatch (" << SubscriptionId
- << " vs expected " << Self->ConfigSubscriptionId << ")");
- return true;
- }
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Param>().Key(1)
- .Update<Schema::Param::Config>(Config);
-
- Modify = true;
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxUpdateConfig Complete");
-
- if (Modify) {
- Self->State->Config.Deserialize(Config);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "Updated config: " << Config.ShortDebugString());
-
- ctx.Send(Response.Release());
- }
-
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxUpdateConfig : public TTransactionBase<TCms> {
+public:
+ TTxUpdateConfig(TCms *self,
+ const NKikimrCms::TCmsConfig &config,
+ TAutoPtr<IEventHandle> response,
+ ui64 subscriptionId = 0)
+ : TBase(self)
+ , Config(config)
+ , Response(response)
+ , SubscriptionId(subscriptionId)
+ , Modify(false)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "TTxUpdateConfig Execute");
+
+ if (SubscriptionId != Self->ConfigSubscriptionId) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS,
+ "Config subscription id mismatch (" << SubscriptionId
+ << " vs expected " << Self->ConfigSubscriptionId << ")");
+ return true;
+ }
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Param>().Key(1)
+ .Update<Schema::Param::Config>(Config);
+
+ Modify = true;
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxUpdateConfig Complete");
+
+ if (Modify) {
+ Self->State->Config.Deserialize(Config);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "Updated config: " << Config.ShortDebugString());
+
+ ctx.Send(Response.Release());
+ }
+
if (Self->State->Config.SentinelConfig.Enable) {
if (!Self->State->Sentinel) {
Self->State->Sentinel = Self->RegisterWithSameMailbox(CreateSentinel(Self->State));
@@ -63,39 +63,39 @@ public:
Self->State->Sentinel = TActorId();
}
}
- }
-
-private:
- NKikimrCms::TCmsConfig Config;
- TAutoPtr<IEventHandle> Response;
- ui64 SubscriptionId;
- bool Modify;
-};
-
-ITransaction *TCms::CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev)
-{
- auto &rec = ev->Get()->Record;
-
- auto response = MakeHolder<TEvConsole::TEvConfigNotificationResponse>();
- response->Record.SetSubscriptionId(rec.GetSubscriptionId());
- response->Record.MutableConfigId()->CopyFrom(rec.GetConfigId());
-
- return new TTxUpdateConfig(this, rec.GetConfig().GetCmsConfig(),
- new IEventHandle(ev->Sender, ev->Recipient,
- response.Release(), 0, ev->Cookie),
- rec.GetSubscriptionId());
-}
-
-ITransaction *TCms::CreateTxUpdateConfig(TEvCms::TEvSetConfigRequest::TPtr &ev)
-{
- TAutoPtr<TEvCms::TEvSetConfigResponse> response
- = new TEvCms::TEvSetConfigResponse;
- response->Record.MutableStatus()->SetCode(NKikimrCms::TStatus::OK);
- return new TTxUpdateConfig(this, ev->Get()->Record.GetConfig(),
- new IEventHandle(ev->Sender, ev->Recipient,
- response.Release(), 0, ev->Cookie),
- ConfigSubscriptionId);
-}
-
-} // NCms
-} // NKikimr
+ }
+
+private:
+ NKikimrCms::TCmsConfig Config;
+ TAutoPtr<IEventHandle> Response;
+ ui64 SubscriptionId;
+ bool Modify;
+};
+
+ITransaction *TCms::CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev)
+{
+ auto &rec = ev->Get()->Record;
+
+ auto response = MakeHolder<TEvConsole::TEvConfigNotificationResponse>();
+ response->Record.SetSubscriptionId(rec.GetSubscriptionId());
+ response->Record.MutableConfigId()->CopyFrom(rec.GetConfigId());
+
+ return new TTxUpdateConfig(this, rec.GetConfig().GetCmsConfig(),
+ new IEventHandle(ev->Sender, ev->Recipient,
+ response.Release(), 0, ev->Cookie),
+ rec.GetSubscriptionId());
+}
+
+ITransaction *TCms::CreateTxUpdateConfig(TEvCms::TEvSetConfigRequest::TPtr &ev)
+{
+ TAutoPtr<TEvCms::TEvSetConfigResponse> response
+ = new TEvCms::TEvSetConfigResponse;
+ response->Record.MutableStatus()->SetCode(NKikimrCms::TStatus::OK);
+ return new TTxUpdateConfig(this, ev->Get()->Record.GetConfig(),
+ new IEventHandle(ev->Sender, ev->Recipient,
+ response.Release(), 0, ev->Cookie),
+ ConfigSubscriptionId);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_tx_update_downtimes.cpp b/ydb/core/cms/cms_tx_update_downtimes.cpp
index 57412464b7f..d4641d8c263 100644
--- a/ydb/core/cms/cms_tx_update_downtimes.cpp
+++ b/ydb/core/cms/cms_tx_update_downtimes.cpp
@@ -1,39 +1,39 @@
-#include "cms_impl.h"
-#include "scheme.h"
-
-namespace NKikimr {
-namespace NCms {
-
-class TCms::TTxUpdateDowntimes : public TTransactionBase<TCms> {
-public:
- TTxUpdateDowntimes(TCms *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "TTxUpdateDowntimes Execute");
-
- Self->State->Downtimes.DbStoreState(txc, ctx);
- Self->State->Downtimes.CleanupEmpty();
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxUpdateDowntimes Complete");
- }
-
-private:
-};
-
-ITransaction *TCms::CreateTxUpdateDowntimes()
-{
- return new TTxUpdateDowntimes(this);
-}
-
-} // NCms
-} // NKikimr
+#include "cms_impl.h"
+#include "scheme.h"
+
+namespace NKikimr {
+namespace NCms {
+
+class TCms::TTxUpdateDowntimes : public TTransactionBase<TCms> {
+public:
+ TTxUpdateDowntimes(TCms *self)
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "TTxUpdateDowntimes Execute");
+
+ Self->State->Downtimes.DbStoreState(txc, ctx);
+ Self->State->Downtimes.CleanupEmpty();
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TTxUpdateDowntimes Complete");
+ }
+
+private:
+};
+
+ITransaction *TCms::CreateTxUpdateDowntimes()
+{
+ return new TTxUpdateDowntimes(this);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/cms_ut.cpp b/ydb/core/cms/cms_ut.cpp
index a03d00f0178..9842fb71567 100644
--- a/ydb/core/cms/cms_ut.cpp
+++ b/ydb/core/cms/cms_ut.cpp
@@ -1,93 +1,93 @@
-#include "cms_impl.h"
-#include "info_collector.h"
-#include "ut_helpers.h"
-#include "walle.h"
+#include "cms_impl.h"
+#include "info_collector.h"
+#include "ut_helpers.h"
+#include "walle.h"
#include "cms_ut_common.h"
-
+
#include <ydb/core/blobstorage/base/blobstorage_events.h>
#include <ydb/core/base/ticket_parser.h>
#include <ydb/core/testlib/tablet_helpers.h>
-
+
#include <library/cpp/svnversion/svnversion.h>
#include <library/cpp/testing/unittest/registar.h>
-
-#include <util/system/hostname.h>
-
-namespace NKikimr {
-namespace NCmsTest {
-
-using namespace NCms;
-using namespace NNodeWhiteboard;
-using namespace NKikimrWhiteboard;
-using namespace NKikimrCms;
+
+#include <util/system/hostname.h>
+
+namespace NKikimr {
+namespace NCmsTest {
+
+using namespace NCms;
+using namespace NNodeWhiteboard;
+using namespace NKikimrWhiteboard;
+using namespace NKikimrCms;
using namespace NKikimrBlobStorage;
-
-namespace {
-
-void CheckLoadLogRecord(const NKikimrCms::TLogRecord &rec,
- const TString &host,
- ui32 nodeId,
- const TString &version)
-{
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetRecordType(), TLogRecordData::CMS_LOADED);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetData().GetRecordType(), TLogRecordData::CMS_LOADED);
- auto &data = rec.GetData().GetCmsLoaded();
- UNIT_ASSERT_VALUES_EQUAL(data.GetHost(), host);
- UNIT_ASSERT_VALUES_EQUAL(data.GetNodeId(), nodeId);
- UNIT_ASSERT_VALUES_EQUAL(data.GetVersion(), version);
-}
-
-} // anonymous namespace
-
+
+namespace {
+
+void CheckLoadLogRecord(const NKikimrCms::TLogRecord &rec,
+ const TString &host,
+ ui32 nodeId,
+ const TString &version)
+{
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetRecordType(), TLogRecordData::CMS_LOADED);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetData().GetRecordType(), TLogRecordData::CMS_LOADED);
+ auto &data = rec.GetData().GetCmsLoaded();
+ UNIT_ASSERT_VALUES_EQUAL(data.GetHost(), host);
+ UNIT_ASSERT_VALUES_EQUAL(data.GetNodeId(), nodeId);
+ UNIT_ASSERT_VALUES_EQUAL(data.GetVersion(), version);
+}
+
+} // anonymous namespace
+
Y_UNIT_TEST_SUITE(TCmsTest) {
Y_UNIT_TEST(CollectInfo)
- {
- TCmsTestEnv env(8);
-
- auto before = env.GetCurrentTime();
- env.Register(CreateInfoCollector(env.GetSender(), TDuration::Minutes(1)));
-
- TAutoPtr<IEventHandle> handle;
- auto reply = env.GrabEdgeEventRethrow<TCms::TEvPrivate::TEvClusterInfo>(handle);
- UNIT_ASSERT(reply);
- const auto &info = *reply->Info;
-
- auto after = env.GetCurrentTime();
- UNIT_ASSERT_VALUES_EQUAL(info.NodesCount(), env.GetNodeCount());
- UNIT_ASSERT_VALUES_EQUAL(info.PDisksCount(), env.GetNodeCount());
- UNIT_ASSERT_VALUES_EQUAL(info.VDisksCount(), env.GetNodeCount() * 4);
- UNIT_ASSERT_VALUES_EQUAL(info.BSGroupsCount(), 4);
- UNIT_ASSERT(info.GetTimestamp() >= before && info.GetTimestamp() <= after);
-
- for (ui32 nodeIndex = 0; nodeIndex < env.GetNodeCount(); ++nodeIndex) {
- ui32 nodeId = env.GetNodeId(nodeIndex);
- UNIT_ASSERT(info.HasNode(nodeId));
- const auto &node = info.Node(nodeId);
-
- UNIT_ASSERT_VALUES_EQUAL(node.NodeId, nodeId);
- UNIT_ASSERT_VALUES_EQUAL(node.Host, "::1");
- UNIT_ASSERT_VALUES_EQUAL(node.State, NKikimrCms::UP);
- UNIT_ASSERT_VALUES_EQUAL(node.PDisks.size(), 1);
+ {
+ TCmsTestEnv env(8);
+
+ auto before = env.GetCurrentTime();
+ env.Register(CreateInfoCollector(env.GetSender(), TDuration::Minutes(1)));
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = env.GrabEdgeEventRethrow<TCms::TEvPrivate::TEvClusterInfo>(handle);
+ UNIT_ASSERT(reply);
+ const auto &info = *reply->Info;
+
+ auto after = env.GetCurrentTime();
+ UNIT_ASSERT_VALUES_EQUAL(info.NodesCount(), env.GetNodeCount());
+ UNIT_ASSERT_VALUES_EQUAL(info.PDisksCount(), env.GetNodeCount());
+ UNIT_ASSERT_VALUES_EQUAL(info.VDisksCount(), env.GetNodeCount() * 4);
+ UNIT_ASSERT_VALUES_EQUAL(info.BSGroupsCount(), 4);
+ UNIT_ASSERT(info.GetTimestamp() >= before && info.GetTimestamp() <= after);
+
+ for (ui32 nodeIndex = 0; nodeIndex < env.GetNodeCount(); ++nodeIndex) {
+ ui32 nodeId = env.GetNodeId(nodeIndex);
+ UNIT_ASSERT(info.HasNode(nodeId));
+ const auto &node = info.Node(nodeId);
+
+ UNIT_ASSERT_VALUES_EQUAL(node.NodeId, nodeId);
+ UNIT_ASSERT_VALUES_EQUAL(node.Host, "::1");
+ UNIT_ASSERT_VALUES_EQUAL(node.State, NKikimrCms::UP);
+ UNIT_ASSERT_VALUES_EQUAL(node.PDisks.size(), 1);
UNIT_ASSERT(node.PDisks.contains(NCms::TPDiskID(nodeId, nodeId)));
- UNIT_ASSERT_VALUES_EQUAL(node.VDisks.size(), 4);
+ UNIT_ASSERT_VALUES_EQUAL(node.VDisks.size(), 4);
UNIT_ASSERT(node.VDisks.contains(TVDiskID(0, 1, 0, nodeIndex, 0)));
UNIT_ASSERT(node.VDisks.contains(TVDiskID(1, 1, 0, nodeIndex, 0)));
UNIT_ASSERT(node.VDisks.contains(TVDiskID(2, 1, 0, nodeIndex, 0)));
UNIT_ASSERT(node.VDisks.contains(TVDiskID(3, 1, 0, nodeIndex, 0)));
-
- UNIT_ASSERT(info.HasPDisk(NCms::TPDiskID(nodeId, nodeId)));
-
- UNIT_ASSERT(info.HasVDisk(TVDiskID(0, 1, 0, nodeIndex, 0)));
- UNIT_ASSERT(info.HasVDisk(TVDiskID(1, 1, 0, nodeIndex, 0)));
- UNIT_ASSERT(info.HasVDisk(TVDiskID(2, 1, 0, nodeIndex, 0)));
- UNIT_ASSERT(info.HasVDisk(TVDiskID(3, 1, 0, nodeIndex, 0)));
- }
-
- for (ui32 groupId = 0; groupId < 4; ++groupId) {
- UNIT_ASSERT(info.HasBSGroup(groupId));
- const auto &group = info.BSGroup(groupId);
- UNIT_ASSERT_VALUES_EQUAL(group.VDisks.size(), 8);
+
+ UNIT_ASSERT(info.HasPDisk(NCms::TPDiskID(nodeId, nodeId)));
+
+ UNIT_ASSERT(info.HasVDisk(TVDiskID(0, 1, 0, nodeIndex, 0)));
+ UNIT_ASSERT(info.HasVDisk(TVDiskID(1, 1, 0, nodeIndex, 0)));
+ UNIT_ASSERT(info.HasVDisk(TVDiskID(2, 1, 0, nodeIndex, 0)));
+ UNIT_ASSERT(info.HasVDisk(TVDiskID(3, 1, 0, nodeIndex, 0)));
+ }
+
+ for (ui32 groupId = 0; groupId < 4; ++groupId) {
+ UNIT_ASSERT(info.HasBSGroup(groupId));
+ const auto &group = info.BSGroup(groupId);
+ UNIT_ASSERT_VALUES_EQUAL(group.VDisks.size(), 8);
UNIT_ASSERT(group.VDisks.contains(TVDiskID(groupId, 1, 0, 0, 0)));
UNIT_ASSERT(group.VDisks.contains(TVDiskID(groupId, 1, 0, 1, 0)));
UNIT_ASSERT(group.VDisks.contains(TVDiskID(groupId, 1, 0, 2, 0)));
@@ -96,62 +96,62 @@ Y_UNIT_TEST_SUITE(TCmsTest) {
UNIT_ASSERT(group.VDisks.contains(TVDiskID(groupId, 1, 0, 5, 0)));
UNIT_ASSERT(group.VDisks.contains(TVDiskID(groupId, 1, 0, 6, 0)));
UNIT_ASSERT(group.VDisks.contains(TVDiskID(groupId, 1, 0, 7, 0)));
- }
- }
-
+ }
+ }
+
Y_UNIT_TEST(StateRequest)
- {
- TCmsTestEnv env(8);
- auto before = env.GetCurrentTime();
- auto state = env.RequestState();
-
- auto after = env.GetCurrentTime();
- UNIT_ASSERT_VALUES_EQUAL(state.HostsSize(), 8);
- UNIT_ASSERT(state.GetTimestamp() >= before.GetValue()
- && state.GetTimestamp() <= after.GetValue());
- for (const auto &host : state.GetHosts()) {
- UNIT_ASSERT_VALUES_EQUAL(host.GetName(), "::1");
- UNIT_ASSERT_VALUES_EQUAL(host.GetState(), UP);
- UNIT_ASSERT(host.GetTimestamp() >= before.GetValue()
- && host.GetTimestamp() <= after.GetValue());
-
- UNIT_ASSERT_VALUES_EQUAL(host.ServicesSize(), 1);
- const auto &service = host.GetServices(0);
- UNIT_ASSERT_VALUES_EQUAL(service.GetName(), "storage");
- UNIT_ASSERT_VALUES_EQUAL(service.GetState(), UP);
- UNIT_ASSERT_VALUES_EQUAL(service.GetVersion(), ToString(GetProgramSvnRevision()));
- UNIT_ASSERT(service.GetTimestamp() >= before.GetValue()
- && service.GetTimestamp() <= after.GetValue());
-
- UNIT_ASSERT_VALUES_EQUAL(host.DevicesSize(), 5);
- int pdisks = 1;
- int vdisks = 4;
- for (size_t i = 0; i < host.DevicesSize(); ++i) {
- const auto &device = host.GetDevices(i);
- UNIT_ASSERT_VALUES_EQUAL(device.GetState(), UP);
- UNIT_ASSERT(device.GetTimestamp() >= before.GetValue()
- && device.GetTimestamp() <= after.GetValue());
-
- if (device.GetName().StartsWith("vdisk-"))
- --vdisks;
- else if (device.GetName().StartsWith("pdisk-"))
- --pdisks;
- else
- UNIT_FAIL("bad device name");
- }
- UNIT_ASSERT(!vdisks && !pdisks);
- }
- }
-
+ {
+ TCmsTestEnv env(8);
+ auto before = env.GetCurrentTime();
+ auto state = env.RequestState();
+
+ auto after = env.GetCurrentTime();
+ UNIT_ASSERT_VALUES_EQUAL(state.HostsSize(), 8);
+ UNIT_ASSERT(state.GetTimestamp() >= before.GetValue()
+ && state.GetTimestamp() <= after.GetValue());
+ for (const auto &host : state.GetHosts()) {
+ UNIT_ASSERT_VALUES_EQUAL(host.GetName(), "::1");
+ UNIT_ASSERT_VALUES_EQUAL(host.GetState(), UP);
+ UNIT_ASSERT(host.GetTimestamp() >= before.GetValue()
+ && host.GetTimestamp() <= after.GetValue());
+
+ UNIT_ASSERT_VALUES_EQUAL(host.ServicesSize(), 1);
+ const auto &service = host.GetServices(0);
+ UNIT_ASSERT_VALUES_EQUAL(service.GetName(), "storage");
+ UNIT_ASSERT_VALUES_EQUAL(service.GetState(), UP);
+ UNIT_ASSERT_VALUES_EQUAL(service.GetVersion(), ToString(GetProgramSvnRevision()));
+ UNIT_ASSERT(service.GetTimestamp() >= before.GetValue()
+ && service.GetTimestamp() <= after.GetValue());
+
+ UNIT_ASSERT_VALUES_EQUAL(host.DevicesSize(), 5);
+ int pdisks = 1;
+ int vdisks = 4;
+ for (size_t i = 0; i < host.DevicesSize(); ++i) {
+ const auto &device = host.GetDevices(i);
+ UNIT_ASSERT_VALUES_EQUAL(device.GetState(), UP);
+ UNIT_ASSERT(device.GetTimestamp() >= before.GetValue()
+ && device.GetTimestamp() <= after.GetValue());
+
+ if (device.GetName().StartsWith("vdisk-"))
+ --vdisks;
+ else if (device.GetName().StartsWith("pdisk-"))
+ --pdisks;
+ else
+ UNIT_FAIL("bad device name");
+ }
+ UNIT_ASSERT(!vdisks && !pdisks);
+ }
+ }
+
Y_UNIT_TEST(StateRequestNode)
- {
+ {
TCmsTestEnv env(8, TNodeTenantsMap{{1, {"user0"}}});
-
+
THashMap<ui32, TString> nodeIdxToServiceName = {
{0, "storage"},
{1, "dynnode"},
};
-
+
for (const auto& [nodeIdx, serviceName] : nodeIdxToServiceName) {
NKikimrCms::TClusterStateRequest request;
request.AddHosts(ToString(env.GetNodeId(nodeIdx)));
@@ -167,534 +167,534 @@ Y_UNIT_TEST_SUITE(TCmsTest) {
UNIT_ASSERT_VALUES_EQUAL(service.GetState(), UP);
UNIT_ASSERT_VALUES_EQUAL(service.GetVersion(), ToString(GetProgramSvnRevision()));
}
- }
-
+ }
+
Y_UNIT_TEST(StateRequestUnknownNode)
- {
- TCmsTestEnv env(8);
-
- NKikimrCms::TClusterStateRequest request;
- request.AddHosts("0");
+ {
+ TCmsTestEnv env(8);
+
+ NKikimrCms::TClusterStateRequest request;
+ request.AddHosts("0");
env.RequestState(request, TStatus::NO_SUCH_HOST);
- }
-
+ }
+
Y_UNIT_TEST(StateRequestUnknownMultipleNodes)
- {
- TCmsTestEnv env(8);
-
- NKikimrCms::TClusterStateRequest request;
- request.AddHosts(FQDNHostName() + ".com");
+ {
+ TCmsTestEnv env(8);
+
+ NKikimrCms::TClusterStateRequest request;
+ request.AddHosts(FQDNHostName() + ".com");
env.RequestState(request, TStatus::NO_SUCH_HOST);
- }
-
+ }
+
Y_UNIT_TEST(RequestRestartServicesOk)
- {
- TCmsTestEnv env(8);
-
- auto rec = env.CheckPermissionRequest
- ("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
- UNIT_ASSERT_VALUES_EQUAL(rec.PermissionsSize(), 1);
-
- const auto &action1 = rec.GetPermissions(0).GetAction();
- UNIT_ASSERT_VALUES_EQUAL(action1.GetType(), TAction::RESTART_SERVICES);
- UNIT_ASSERT_VALUES_EQUAL(action1.GetHost(), ToString(env.GetNodeId(0)));
- UNIT_ASSERT_VALUES_EQUAL(action1.ServicesSize(), 1);
- UNIT_ASSERT_VALUES_EQUAL(action1.GetServices(0), "storage");
- UNIT_ASSERT_VALUES_EQUAL(action1.GetDuration(), 60000000);
- }
-
+ {
+ TCmsTestEnv env(8);
+
+ auto rec = env.CheckPermissionRequest
+ ("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
+ UNIT_ASSERT_VALUES_EQUAL(rec.PermissionsSize(), 1);
+
+ const auto &action1 = rec.GetPermissions(0).GetAction();
+ UNIT_ASSERT_VALUES_EQUAL(action1.GetType(), TAction::RESTART_SERVICES);
+ UNIT_ASSERT_VALUES_EQUAL(action1.GetHost(), ToString(env.GetNodeId(0)));
+ UNIT_ASSERT_VALUES_EQUAL(action1.ServicesSize(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(action1.GetServices(0), "storage");
+ UNIT_ASSERT_VALUES_EQUAL(action1.GetDuration(), 60000000);
+ }
+
Y_UNIT_TEST(RequestRestartServicesReject)
- {
- TCmsTestEnv env(8);
-
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"),
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(1), 60000000, "storage"));
- }
-
+ {
+ TCmsTestEnv env(8);
+
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"),
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(1), 60000000, "storage"));
+ }
+
Y_UNIT_TEST(RequestRestartServicesPartial)
- {
- TCmsTestEnv env(8);
-
- auto rec = env.CheckPermissionRequest
- ("user", true, false, false, true, TStatus::ALLOW_PARTIAL,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"),
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(1), 60000000, "storage"));
- UNIT_ASSERT_VALUES_EQUAL(rec.PermissionsSize(), 1);
-
- const auto &action1 = rec.GetPermissions(0).GetAction();
- UNIT_ASSERT_VALUES_EQUAL(action1.GetType(), TAction::RESTART_SERVICES);
- UNIT_ASSERT(action1.GetHost() == ToString(env.GetNodeId(0))
- || action1.GetHost() == ToString(env.GetNodeId(1)));
- UNIT_ASSERT_VALUES_EQUAL(action1.ServicesSize(), 1);
- UNIT_ASSERT_VALUES_EQUAL(action1.GetServices(0), "storage");
- UNIT_ASSERT_VALUES_EQUAL(action1.GetDuration(), 60000000);
- }
-
+ {
+ TCmsTestEnv env(8);
+
+ auto rec = env.CheckPermissionRequest
+ ("user", true, false, false, true, TStatus::ALLOW_PARTIAL,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"),
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(1), 60000000, "storage"));
+ UNIT_ASSERT_VALUES_EQUAL(rec.PermissionsSize(), 1);
+
+ const auto &action1 = rec.GetPermissions(0).GetAction();
+ UNIT_ASSERT_VALUES_EQUAL(action1.GetType(), TAction::RESTART_SERVICES);
+ UNIT_ASSERT(action1.GetHost() == ToString(env.GetNodeId(0))
+ || action1.GetHost() == ToString(env.GetNodeId(1)));
+ UNIT_ASSERT_VALUES_EQUAL(action1.ServicesSize(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(action1.GetServices(0), "storage");
+ UNIT_ASSERT_VALUES_EQUAL(action1.GetDuration(), 60000000);
+ }
+
Y_UNIT_TEST(RequestRestartServicesRejectSecond)
- {
- TCmsTestEnv env(8);
-
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(1), 60000000, "storage"));
- }
-
+ {
+ TCmsTestEnv env(8);
+
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(1), 60000000, "storage"));
+ }
+
Y_UNIT_TEST(RequestRestartServicesWrongHost)
- {
- TCmsTestEnv env(8);
-
+ {
+ TCmsTestEnv env(8);
+
env.CheckPermissionRequest("user", false, false, false, true, TStatus::NO_SUCH_HOST,
- MakeAction(TAction::RESTART_SERVICES, "host", 60000000, "storage"));
- }
-
+ MakeAction(TAction::RESTART_SERVICES, "host", 60000000, "storage"));
+ }
+
Y_UNIT_TEST(RequestRestartServicesMultipleNodes)
- {
- TCmsTestEnv env(8);
-
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::RESTART_SERVICES, "::1", 60000000, "storage"));
- }
-
+ {
+ TCmsTestEnv env(8);
+
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::RESTART_SERVICES, "::1", 60000000, "storage"));
+ }
+
Y_UNIT_TEST(RequestRestartServicesNoUser)
- {
- TCmsTestEnv env(8);
-
- env.CheckPermissionRequest("", false, false, false, true, TStatus::WRONG_REQUEST,
- MakeAction(TAction::RESTART_SERVICES, "::1", 60000000, "storage"));
- }
-
+ {
+ TCmsTestEnv env(8);
+
+ env.CheckPermissionRequest("", false, false, false, true, TStatus::WRONG_REQUEST,
+ MakeAction(TAction::RESTART_SERVICES, "::1", 60000000, "storage"));
+ }
+
Y_UNIT_TEST(RequestRestartServicesDryRun)
- {
- TCmsTestEnv env(8);
-
- auto rec1 = env.CheckPermissionRequest
- ("user", false, true, false, true, TStatus::ALLOW,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
- UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1);
- UNIT_ASSERT_VALUES_EQUAL(rec1.GetPermissions(0).GetId(), "");
-
- auto rec2 = env.CheckPermissionRequest
- ("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(1), 60000000, "storage"));
- UNIT_ASSERT_VALUES_EQUAL(rec2.PermissionsSize(), 1);
- }
-
+ {
+ TCmsTestEnv env(8);
+
+ auto rec1 = env.CheckPermissionRequest
+ ("user", false, true, false, true, TStatus::ALLOW,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
+ UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(rec1.GetPermissions(0).GetId(), "");
+
+ auto rec2 = env.CheckPermissionRequest
+ ("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(1), 60000000, "storage"));
+ UNIT_ASSERT_VALUES_EQUAL(rec2.PermissionsSize(), 1);
+ }
+
Y_UNIT_TEST(ManagePermissions)
- {
- TCmsTestEnv env(8);
-
- auto rec1 = env.CheckPermissionRequest
- ("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
- UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1);
-
- TString id = rec1.GetPermissions(0).GetId();
- ui64 deadline = rec1.GetPermissions(0).GetDeadline();
-
- // Get by ID.
- auto rec2 = env.CheckGetPermission("user", id);
- UNIT_ASSERT_VALUES_EQUAL(rec2.PermissionsSize(), 1);
- UNIT_ASSERT_VALUES_EQUAL(rec2.GetPermissions(0).GetId(), id);
- UNIT_ASSERT_VALUES_EQUAL(rec2.GetPermissions(0).GetDeadline(), deadline);
- const auto &action = rec2.GetPermissions(0).GetAction();
- UNIT_ASSERT_VALUES_EQUAL(action.GetType(), TAction::RESTART_SERVICES);
- UNIT_ASSERT_VALUES_EQUAL(action.GetHost(), ToString(env.GetNodeId(0)));
- UNIT_ASSERT_VALUES_EQUAL(action.ServicesSize(), 1);
- UNIT_ASSERT_VALUES_EQUAL(action.GetServices(0), "storage");
- UNIT_ASSERT_VALUES_EQUAL(action.GetDuration(), 60000000);
-
- // List all.
- env.CheckListPermissions("user", 1);
- env.CheckListPermissions("user2", 0);
-
- // Done with permission.
- env.CheckDonePermission("user", id);
-
- // List all expecting empty list.
- env.CheckListPermissions("user", 0);
-
- // Get permission again.
- auto rec3 = env.CheckPermissionRequest
- ("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
- UNIT_ASSERT_VALUES_EQUAL(rec3.PermissionsSize(), 1);
- UNIT_ASSERT_VALUES_UNEQUAL(rec3.GetPermissions(0).GetId(), id);
-
- id = rec3.GetPermissions(0).GetId();
-
- // Reject permission.
- env.CheckRejectPermission("user", id);
-
- // List all expecting empty list.
- env.CheckListPermissions("user", 0);
-
- // Get permission again.
- auto rec4 = env.CheckPermissionRequest
- ("user", false, false, false, false, TStatus::ALLOW,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
- UNIT_ASSERT_VALUES_EQUAL(rec4.PermissionsSize(), 1);
- UNIT_ASSERT_VALUES_UNEQUAL(rec4.GetPermissions(0).GetId(), id);
-
- id = rec4.GetPermissions(0).GetId();
-
- // Done with permission dry run.
- env.CheckDonePermission("user", id, true);
-
- // Reject permission dry run.
- env.CheckRejectPermission("user", id, true);
-
- // Get unmodified permission.
- auto rec5 = env.CheckGetPermission("user", id, true);
- UNIT_ASSERT_VALUES_EQUAL(rec5.PermissionsSize(), 1);
- }
-
+ {
+ TCmsTestEnv env(8);
+
+ auto rec1 = env.CheckPermissionRequest
+ ("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
+ UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1);
+
+ TString id = rec1.GetPermissions(0).GetId();
+ ui64 deadline = rec1.GetPermissions(0).GetDeadline();
+
+ // Get by ID.
+ auto rec2 = env.CheckGetPermission("user", id);
+ UNIT_ASSERT_VALUES_EQUAL(rec2.PermissionsSize(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(rec2.GetPermissions(0).GetId(), id);
+ UNIT_ASSERT_VALUES_EQUAL(rec2.GetPermissions(0).GetDeadline(), deadline);
+ const auto &action = rec2.GetPermissions(0).GetAction();
+ UNIT_ASSERT_VALUES_EQUAL(action.GetType(), TAction::RESTART_SERVICES);
+ UNIT_ASSERT_VALUES_EQUAL(action.GetHost(), ToString(env.GetNodeId(0)));
+ UNIT_ASSERT_VALUES_EQUAL(action.ServicesSize(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(action.GetServices(0), "storage");
+ UNIT_ASSERT_VALUES_EQUAL(action.GetDuration(), 60000000);
+
+ // List all.
+ env.CheckListPermissions("user", 1);
+ env.CheckListPermissions("user2", 0);
+
+ // Done with permission.
+ env.CheckDonePermission("user", id);
+
+ // List all expecting empty list.
+ env.CheckListPermissions("user", 0);
+
+ // Get permission again.
+ auto rec3 = env.CheckPermissionRequest
+ ("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
+ UNIT_ASSERT_VALUES_EQUAL(rec3.PermissionsSize(), 1);
+ UNIT_ASSERT_VALUES_UNEQUAL(rec3.GetPermissions(0).GetId(), id);
+
+ id = rec3.GetPermissions(0).GetId();
+
+ // Reject permission.
+ env.CheckRejectPermission("user", id);
+
+ // List all expecting empty list.
+ env.CheckListPermissions("user", 0);
+
+ // Get permission again.
+ auto rec4 = env.CheckPermissionRequest
+ ("user", false, false, false, false, TStatus::ALLOW,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
+ UNIT_ASSERT_VALUES_EQUAL(rec4.PermissionsSize(), 1);
+ UNIT_ASSERT_VALUES_UNEQUAL(rec4.GetPermissions(0).GetId(), id);
+
+ id = rec4.GetPermissions(0).GetId();
+
+ // Done with permission dry run.
+ env.CheckDonePermission("user", id, true);
+
+ // Reject permission dry run.
+ env.CheckRejectPermission("user", id, true);
+
+ // Get unmodified permission.
+ auto rec5 = env.CheckGetPermission("user", id, true);
+ UNIT_ASSERT_VALUES_EQUAL(rec5.PermissionsSize(), 1);
+ }
+
Y_UNIT_TEST(ManagePermissionWrongRequest)
- {
- TCmsTestEnv env(8);
-
- auto rec1 = env.CheckPermissionRequest
- ("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
- TString id = rec1.GetPermissions(0).GetId();
-
- // No user.
- env.CheckGetPermission("", id, false, TStatus::WRONG_REQUEST);
-
- // Wrong owner for GET.
- env.CheckGetPermission("user2", id, false, TStatus::WRONG_REQUEST);
-
- // Wrong owner for DONE.
- env.CheckDonePermission("user2", id, false, TStatus::WRONG_REQUEST);
-
- // Wrong owner for REJECT.
- env.CheckRejectPermission("user2", id, false, TStatus::WRONG_REQUEST);
-
- // Wrong ID for GET.
- env.CheckGetPermission("user", id + "-bad", false, TStatus::WRONG_REQUEST);
-
- // Wrong ID for DONE.
- env.CheckDonePermission("user", id + "-bad", false, TStatus::WRONG_REQUEST);
-
- // Wrong ID for REJECT.
- env.CheckRejectPermission("user", id + "-bad", false, TStatus::WRONG_REQUEST);
- }
-
+ {
+ TCmsTestEnv env(8);
+
+ auto rec1 = env.CheckPermissionRequest
+ ("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
+ TString id = rec1.GetPermissions(0).GetId();
+
+ // No user.
+ env.CheckGetPermission("", id, false, TStatus::WRONG_REQUEST);
+
+ // Wrong owner for GET.
+ env.CheckGetPermission("user2", id, false, TStatus::WRONG_REQUEST);
+
+ // Wrong owner for DONE.
+ env.CheckDonePermission("user2", id, false, TStatus::WRONG_REQUEST);
+
+ // Wrong owner for REJECT.
+ env.CheckRejectPermission("user2", id, false, TStatus::WRONG_REQUEST);
+
+ // Wrong ID for GET.
+ env.CheckGetPermission("user", id + "-bad", false, TStatus::WRONG_REQUEST);
+
+ // Wrong ID for DONE.
+ env.CheckDonePermission("user", id + "-bad", false, TStatus::WRONG_REQUEST);
+
+ // Wrong ID for REJECT.
+ env.CheckRejectPermission("user", id + "-bad", false, TStatus::WRONG_REQUEST);
+ }
+
Y_UNIT_TEST(RequestReplaceDevices)
- {
- TCmsTestEnv env(8);
-
+ {
+ TCmsTestEnv env(8);
+
env.CheckPermissionRequest("user", false, false, false, true, TStatus::NO_SUCH_DEVICE,
MakeAction(TAction::REPLACE_DEVICES, "::1", 60000000, "/dev/bad/device/path"));
- auto rec1 = env.CheckPermissionRequest
- ("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)));
- UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1);
- auto id1 = rec1.GetPermissions(0).GetId();
-
- // Disallow conflicting PDisk.
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(1)));
-
- // Disallow locked PDisk.
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)));
-
- // Disallow VDisk on locked PDisk.
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, "vdisk-1-1-0-0-0"));
-
- // Disallow conflicting VDisk.
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, "vdisk-1-1-0-1-0"));
-
- // Unlock PDisk.
- env.CheckDonePermission("user", id1);
-
- // Lock VDisks.
- auto rec2 = env.CheckPermissionRequest
- ("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
- "vdisk-0-1-0-0-0", "vdisk-1-1-0-1-0", "vdisk-2-1-0-2-0"));
- UNIT_ASSERT_VALUES_EQUAL(rec2.PermissionsSize(), 1);
- id1 = rec2.GetPermissions(0).GetId();
-
- // Disallow conflicting VDisk.
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, "vdisk-1-1-0-3-0"));
-
- // Disallow locked VDisk.
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, "vdisk-1-1-0-1-0"));
-
- // Disallow conflicting PDisk.
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)));
-
- // Lock VDisks.
- auto rec3 = env.CheckPermissionRequest
- ("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, "vdisk-3-1-0-1-0"));
- UNIT_ASSERT_VALUES_EQUAL(rec3.PermissionsSize(), 1);
- auto id2 = rec3.GetPermissions(0).GetId();
-
- // Unlock VDisks.
- env.CheckDonePermission("user", false, TStatus::OK, id1, id2);
-
- // Impossible action.
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
- env.PDiskName(0), env.PDiskName(1)));
-
- // Impossible action.
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
- env.PDiskName(0), "vdisk-3-1-0-1-0"));
-
- // Impossible action.
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
- "vdisk-3-1-0-1-0", "vdisk-3-1-0-5-0"));
- }
-
+ auto rec1 = env.CheckPermissionRequest
+ ("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)));
+ UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1);
+ auto id1 = rec1.GetPermissions(0).GetId();
+
+ // Disallow conflicting PDisk.
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(1)));
+
+ // Disallow locked PDisk.
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)));
+
+ // Disallow VDisk on locked PDisk.
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, "vdisk-1-1-0-0-0"));
+
+ // Disallow conflicting VDisk.
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, "vdisk-1-1-0-1-0"));
+
+ // Unlock PDisk.
+ env.CheckDonePermission("user", id1);
+
+ // Lock VDisks.
+ auto rec2 = env.CheckPermissionRequest
+ ("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
+ "vdisk-0-1-0-0-0", "vdisk-1-1-0-1-0", "vdisk-2-1-0-2-0"));
+ UNIT_ASSERT_VALUES_EQUAL(rec2.PermissionsSize(), 1);
+ id1 = rec2.GetPermissions(0).GetId();
+
+ // Disallow conflicting VDisk.
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, "vdisk-1-1-0-3-0"));
+
+ // Disallow locked VDisk.
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, "vdisk-1-1-0-1-0"));
+
+ // Disallow conflicting PDisk.
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)));
+
+ // Lock VDisks.
+ auto rec3 = env.CheckPermissionRequest
+ ("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, "vdisk-3-1-0-1-0"));
+ UNIT_ASSERT_VALUES_EQUAL(rec3.PermissionsSize(), 1);
+ auto id2 = rec3.GetPermissions(0).GetId();
+
+ // Unlock VDisks.
+ env.CheckDonePermission("user", false, TStatus::OK, id1, id2);
+
+ // Impossible action.
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
+ env.PDiskName(0), env.PDiskName(1)));
+
+ // Impossible action.
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
+ env.PDiskName(0), "vdisk-3-1-0-1-0"));
+
+ // Impossible action.
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::DISALLOW,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000,
+ "vdisk-3-1-0-1-0", "vdisk-3-1-0-5-0"));
+ }
+
Y_UNIT_TEST(RequestReplaceBrokenDevices)
- {
- TCmsTestEnv env(8);
-
- // PDisk-0 on node-0 is down.
- auto &node = TFakeNodeWhiteboardService::Info[env.GetNodeId(0)];
+ {
+ TCmsTestEnv env(8);
+
+ // PDisk-0 on node-0 is down.
+ auto &node = TFakeNodeWhiteboardService::Info[env.GetNodeId(0)];
node.PDiskStateInfo[env.PDiskId(0).DiskId].SetState(NKikimrBlobStorage::TPDiskState::Initial);
-
- // OK to restart broken PDisk.
- env.CheckPermissionRequest("user", false, true, false, true, TStatus::ALLOW,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)));
-
- // Not OK to replace PDisk from damaged group.
- env.CheckPermissionRequest("user", false, true, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(1)));
- }
-
+
+ // OK to restart broken PDisk.
+ env.CheckPermissionRequest("user", false, true, false, true, TStatus::ALLOW,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)));
+
+ // Not OK to replace PDisk from damaged group.
+ env.CheckPermissionRequest("user", false, true, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(1)));
+ }
+
Y_UNIT_TEST(ManageRequestsWrong)
- {
- TCmsTestEnv env(8);
-
- auto res1 = env.ExtractPermissions
- (env.CheckPermissionRequest("user", true, false, true, true, TStatus::ALLOW_PARTIAL,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)),
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(1))));
- UNIT_ASSERT_VALUES_EQUAL(res1.second.size(), 1);
- UNIT_ASSERT(res1.first);
- auto id1 = res1.second[0];
-
- env.CheckGetRequest("", id1, false, TStatus::WRONG_REQUEST);
- env.CheckGetRequest("user", id1 + "-bad", false, TStatus::WRONG_REQUEST);
- env.CheckGetRequest("user1", id1, false, TStatus::WRONG_REQUEST);
- }
-
+ {
+ TCmsTestEnv env(8);
+
+ auto res1 = env.ExtractPermissions
+ (env.CheckPermissionRequest("user", true, false, true, true, TStatus::ALLOW_PARTIAL,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)),
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(1))));
+ UNIT_ASSERT_VALUES_EQUAL(res1.second.size(), 1);
+ UNIT_ASSERT(res1.first);
+ auto id1 = res1.second[0];
+
+ env.CheckGetRequest("", id1, false, TStatus::WRONG_REQUEST);
+ env.CheckGetRequest("user", id1 + "-bad", false, TStatus::WRONG_REQUEST);
+ env.CheckGetRequest("user1", id1, false, TStatus::WRONG_REQUEST);
+ }
+
Y_UNIT_TEST(ManageRequestsDry)
- {
- TCmsTestEnv env(8);
-
- auto rec1 = env.CheckPermissionRequest
- ("user", true, false, true, true, TStatus::ALLOW_PARTIAL,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)),
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(1)));
- UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1);
- auto pid1 = rec1.GetPermissions(0).GetId();
- auto rid1 = rec1.GetRequestId();
-
- env.CheckGetRequest("user", rid1, true);
- env.CheckRejectRequest("user", rid1, true);
- env.CheckGetRequest("user", rid1);
- env.CheckDonePermission("user", pid1);
- env.CheckRequest("user", rid1, true, TStatus::ALLOW, 1);
- env.CheckGetRequest("user", rid1);
- env.CheckRequest("user", rid1, false, TStatus::ALLOW, 1);
- env.CheckGetRequest("user", rid1, false, TStatus::WRONG_REQUEST);
- }
-
+ {
+ TCmsTestEnv env(8);
+
+ auto rec1 = env.CheckPermissionRequest
+ ("user", true, false, true, true, TStatus::ALLOW_PARTIAL,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)),
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(1)));
+ UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1);
+ auto pid1 = rec1.GetPermissions(0).GetId();
+ auto rid1 = rec1.GetRequestId();
+
+ env.CheckGetRequest("user", rid1, true);
+ env.CheckRejectRequest("user", rid1, true);
+ env.CheckGetRequest("user", rid1);
+ env.CheckDonePermission("user", pid1);
+ env.CheckRequest("user", rid1, true, TStatus::ALLOW, 1);
+ env.CheckGetRequest("user", rid1);
+ env.CheckRequest("user", rid1, false, TStatus::ALLOW, 1);
+ env.CheckGetRequest("user", rid1, false, TStatus::WRONG_REQUEST);
+ }
+
Y_UNIT_TEST(ManageRequests)
- {
- TCmsTestEnv env(8, 4);
-
- // Schedule request-1.
- auto rec1 = env.CheckPermissionRequest
- ("user", true, false, true, true, TStatus::ALLOW_PARTIAL,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000));
- UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1);
- auto pid1 = rec1.GetPermissions(0).GetId();
- auto rid1 = rec1.GetRequestId();
-
- // Schedule request-2.
- auto rec2 = env.CheckPermissionRequest
- ("user", true, false, true, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::REPLACE_DEVICES, 0, 60000000,
- env.PDiskName(0, 0), env.PDiskName(0, 1)),
- MakeAction(TAction::REPLACE_DEVICES, 0, 60000000,
- env.PDiskName(1, 2)));
- auto rid2 = rec2.GetRequestId();
-
- // List 2 events for user.
- env.CheckListRequests("user", 2);
- // List 0 requests for user1.
- env.CheckListRequests("user1", 0);
-
- // Get scheduled request-2.
- auto rec3 = env.CheckGetRequest("user", rid2);
- UNIT_ASSERT_VALUES_EQUAL(rec3.RequestsSize(), 1);
- UNIT_ASSERT_VALUES_EQUAL(rec3.GetRequests(0).GetRequestId(), rid2);
- UNIT_ASSERT_VALUES_EQUAL(rec3.GetRequests(0).GetOwner(), "user");
- UNIT_ASSERT_VALUES_EQUAL(rec3.GetRequests(0).ActionsSize(), 2);
- UNIT_ASSERT_VALUES_EQUAL(rec3.GetRequests(0).GetPartialPermissionAllowed(), true);
-
- // Done with permission-1.
- env.CheckDonePermission("user", pid1);
- // Retry request-2 and get reject (conflict with request-1).
- env.CheckRequest("user", rid2, false, TStatus::DISALLOW_TEMP);
- // Get permission-2 for request-1.
- auto rec4 = env.CheckRequest("user", rid1, false, TStatus::ALLOW_PARTIAL, 1);
- auto pid2 = rec4.GetPermissions(0).GetId();
-
- // Get request-1 expecting 2 remaining actions.
- auto rec5 = env.CheckGetRequest("user", rid1);
- UNIT_ASSERT_VALUES_EQUAL(rec5.RequestsSize(), 1);
- UNIT_ASSERT_VALUES_EQUAL(rec5.GetRequests(0).ActionsSize(), 2);
-
- // Schedule request-3.
- auto rec6 = env.CheckPermissionRequest
- ("user1", true, false, true, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
- auto rid3 = rec6.GetRequestId();
-
- // Schedule request-4.
- auto rec7 = env.CheckPermissionRequest
- ("user1", true, false, true, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000,
- env.PDiskName(1, 3)));
- auto rid4 = rec7.GetRequestId();
-
- // List 2 requests of user1.
- env.CheckListRequests("user1", 2);
- // Reject request-1.
- env.CheckRejectRequest("user", rid1);
- // Retry request-2 and get reject (conflict with permission-2).
- env.CheckRequest("user", rid2, false, TStatus::DISALLOW_TEMP);
- // Done with permission-2.
- env.CheckDonePermission("user", pid2);
- // Retry request-3 and get reject (conflict with request-2).
- env.CheckRequest("user1", rid3, false, TStatus::DISALLOW_TEMP);
- // Retry request-4 and get reject (conflict with request-3).
- env.CheckRequest("user1", rid4, false, TStatus::DISALLOW_TEMP);
- // List 1 request of user.
- auto rec9 = env.CheckListRequests("user", 1);
- UNIT_ASSERT_VALUES_EQUAL(rec9.GetRequests(0).GetRequestId(), rid2);
- // Reject request-3.
- env.CheckRejectRequest("user1", rid3);
- // Retry request-4.
- auto rec8 = env.CheckRequest("user1", rid4, false, TStatus::ALLOW, 1);
- auto pid3 = rec8.GetPermissions(0).GetId();
-
- // Restart CMS tablet.
- env.RestartCms();
-
- // Check there are no permissions for user.
- env.CheckListPermissions("user", 0);
- // Check permission of user1 is restored.
- auto rec10 = env.CheckListPermissions("user1", 1);
- UNIT_ASSERT_VALUES_EQUAL(rec10.GetPermissions(0).GetId(), pid3);
- // Check request for user is restored.
- auto rec11 = env.CheckListRequests( "user", 1);
- UNIT_ASSERT_VALUES_EQUAL(rec11.GetRequests(0).GetRequestId(), rid2);
- // Check there are no requests for user1.
- env.CheckListRequests("user1", 0);
- // Retry request-2.
- env.CheckRequest( "user", rid2, false, TStatus::ALLOW, 2);
- // Check there are no requests for user.
- env.CheckListRequests( "user", 0);
- }
-
+ {
+ TCmsTestEnv env(8, 4);
+
+ // Schedule request-1.
+ auto rec1 = env.CheckPermissionRequest
+ ("user", true, false, true, true, TStatus::ALLOW_PARTIAL,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000));
+ UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1);
+ auto pid1 = rec1.GetPermissions(0).GetId();
+ auto rid1 = rec1.GetRequestId();
+
+ // Schedule request-2.
+ auto rec2 = env.CheckPermissionRequest
+ ("user", true, false, true, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::REPLACE_DEVICES, 0, 60000000,
+ env.PDiskName(0, 0), env.PDiskName(0, 1)),
+ MakeAction(TAction::REPLACE_DEVICES, 0, 60000000,
+ env.PDiskName(1, 2)));
+ auto rid2 = rec2.GetRequestId();
+
+ // List 2 events for user.
+ env.CheckListRequests("user", 2);
+ // List 0 requests for user1.
+ env.CheckListRequests("user1", 0);
+
+ // Get scheduled request-2.
+ auto rec3 = env.CheckGetRequest("user", rid2);
+ UNIT_ASSERT_VALUES_EQUAL(rec3.RequestsSize(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(rec3.GetRequests(0).GetRequestId(), rid2);
+ UNIT_ASSERT_VALUES_EQUAL(rec3.GetRequests(0).GetOwner(), "user");
+ UNIT_ASSERT_VALUES_EQUAL(rec3.GetRequests(0).ActionsSize(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(rec3.GetRequests(0).GetPartialPermissionAllowed(), true);
+
+ // Done with permission-1.
+ env.CheckDonePermission("user", pid1);
+ // Retry request-2 and get reject (conflict with request-1).
+ env.CheckRequest("user", rid2, false, TStatus::DISALLOW_TEMP);
+ // Get permission-2 for request-1.
+ auto rec4 = env.CheckRequest("user", rid1, false, TStatus::ALLOW_PARTIAL, 1);
+ auto pid2 = rec4.GetPermissions(0).GetId();
+
+ // Get request-1 expecting 2 remaining actions.
+ auto rec5 = env.CheckGetRequest("user", rid1);
+ UNIT_ASSERT_VALUES_EQUAL(rec5.RequestsSize(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(rec5.GetRequests(0).ActionsSize(), 2);
+
+ // Schedule request-3.
+ auto rec6 = env.CheckPermissionRequest
+ ("user1", true, false, true, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+ auto rid3 = rec6.GetRequestId();
+
+ // Schedule request-4.
+ auto rec7 = env.CheckPermissionRequest
+ ("user1", true, false, true, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000,
+ env.PDiskName(1, 3)));
+ auto rid4 = rec7.GetRequestId();
+
+ // List 2 requests of user1.
+ env.CheckListRequests("user1", 2);
+ // Reject request-1.
+ env.CheckRejectRequest("user", rid1);
+ // Retry request-2 and get reject (conflict with permission-2).
+ env.CheckRequest("user", rid2, false, TStatus::DISALLOW_TEMP);
+ // Done with permission-2.
+ env.CheckDonePermission("user", pid2);
+ // Retry request-3 and get reject (conflict with request-2).
+ env.CheckRequest("user1", rid3, false, TStatus::DISALLOW_TEMP);
+ // Retry request-4 and get reject (conflict with request-3).
+ env.CheckRequest("user1", rid4, false, TStatus::DISALLOW_TEMP);
+ // List 1 request of user.
+ auto rec9 = env.CheckListRequests("user", 1);
+ UNIT_ASSERT_VALUES_EQUAL(rec9.GetRequests(0).GetRequestId(), rid2);
+ // Reject request-3.
+ env.CheckRejectRequest("user1", rid3);
+ // Retry request-4.
+ auto rec8 = env.CheckRequest("user1", rid4, false, TStatus::ALLOW, 1);
+ auto pid3 = rec8.GetPermissions(0).GetId();
+
+ // Restart CMS tablet.
+ env.RestartCms();
+
+ // Check there are no permissions for user.
+ env.CheckListPermissions("user", 0);
+ // Check permission of user1 is restored.
+ auto rec10 = env.CheckListPermissions("user1", 1);
+ UNIT_ASSERT_VALUES_EQUAL(rec10.GetPermissions(0).GetId(), pid3);
+ // Check request for user is restored.
+ auto rec11 = env.CheckListRequests( "user", 1);
+ UNIT_ASSERT_VALUES_EQUAL(rec11.GetRequests(0).GetRequestId(), rid2);
+ // Check there are no requests for user1.
+ env.CheckListRequests("user1", 0);
+ // Retry request-2.
+ env.CheckRequest( "user", rid2, false, TStatus::ALLOW, 2);
+ // Check there are no requests for user.
+ env.CheckListRequests( "user", 0);
+ }
+
Y_UNIT_TEST(WalleTasks)
- {
- TCmsTestEnv env(24, 4);
-
- // Prepare existing hosts.
- env.CheckWalleCreateTask("task-1", "prepare", false, TStatus::OK,
- env.GetNodeId(0), env.GetNodeId(1), env.GetNodeId(2));
- // Deactivate existing host.
- env.CheckWalleCreateTask("task-2", "deactivate", false, TStatus::OK,
- env.GetNodeId(2));
- // Prepare unknown host.
- env.CheckWalleCreateTask("task-3", "prepare", false, TStatus::WRONG_REQUEST,
- "host1");
- // Deactivate Unknown host.
- env.CheckWalleCreateTask("task-4", "deactivate", false, TStatus::WRONG_REQUEST,
- "host1");
- // Lock node-0 for reboot.
- env.CheckWalleCreateTask("task-5", "change-disk", false, TStatus::ALLOW,
- env.GetNodeId(0));
- // List tasks.
- env.CheckWalleListTasks("task-5", "ok", env.GetNodeId(0));
- // Schedule node-1 reboot.
- env.CheckWalleCreateTask("task-6", "reboot", false, TStatus::DISALLOW_TEMP,
- env.GetNodeId(1));
- // List tasks.
- env.CheckWalleListTasks(2);
- // Check task.
- env.CheckWalleCheckTask("task-5", TStatus::ALLOW, env.GetNodeId(0));
- // Check scheduled task.
- env.CheckWalleCheckTask("task-6", TStatus::DISALLOW_TEMP, env.GetNodeId(1));
- // Check unknown task.
- env.CheckWalleCheckTask("task-7", TStatus::WRONG_REQUEST);
- // Check permissions for Wall-E user.
- env.CheckListPermissions(WALLE_CMS_USER, 1);
- // Try dry run creation.
- env.CheckWalleCreateTask("task-7", "reboot", true, TStatus::DISALLOW_TEMP,
- env.GetNodeId(1));
- // Tasks list shouldn't grow.
- env.CheckWalleListTasks(2);
- // Finish allowed task.
- env.CheckWalleRemoveTask("task-5");
- // Remove unknown task.
- env.CheckWalleRemoveTask("task-5", TStatus::WRONG_REQUEST);
- // Check modified tasks list.
- env.CheckWalleListTasks("task-6", "in-process", env.GetNodeId(1));
- // New task should be queued because of task-6.
- env.CheckWalleCreateTask("task-8", "change-disk", false, TStatus::DISALLOW_TEMP,
- env.GetNodeId(0));
- // Check tasks list.
- env.CheckWalleListTasks(2);
- // Task-8 still cannot be executed.
- env.CheckWalleCheckTask("task-8", TStatus::DISALLOW_TEMP, env.GetNodeId(0));
- // Task-6 is allowed now.
- env.CheckWalleCheckTask("task-6", TStatus::ALLOW, env.GetNodeId(1));
-
- // Kill CMS tablet to check Wall-E tasks are preserved correctly.
- env.RestartCms();
-
- // Check tasks list.
- env.CheckWalleListTasks(2);
- // Task-6 is allowed.
- env.CheckWalleCheckTask("task-6", TStatus::ALLOW, env.GetNodeId(1));
- // Task-8 is waiting.
- env.CheckWalleCheckTask("task-8", TStatus::DISALLOW_TEMP, env.GetNodeId(0));
- // Remove task-8.
- env.CheckWalleRemoveTask("task-8");
- // Check modified tasks list.
- env.CheckWalleListTasks("task-6", "ok", env.GetNodeId(1));
- // Remove task-6.
- env.CheckWalleRemoveTask("task-6");
- // Try task which should be rejected.
- env.CheckWalleCreateTask("task-9", "reboot", false, TStatus::DISALLOW,
- env.GetNodeId(0), env.GetNodeId(1));
- env.CheckWalleListTasks(0);
- }
-
+ {
+ TCmsTestEnv env(24, 4);
+
+ // Prepare existing hosts.
+ env.CheckWalleCreateTask("task-1", "prepare", false, TStatus::OK,
+ env.GetNodeId(0), env.GetNodeId(1), env.GetNodeId(2));
+ // Deactivate existing host.
+ env.CheckWalleCreateTask("task-2", "deactivate", false, TStatus::OK,
+ env.GetNodeId(2));
+ // Prepare unknown host.
+ env.CheckWalleCreateTask("task-3", "prepare", false, TStatus::WRONG_REQUEST,
+ "host1");
+ // Deactivate Unknown host.
+ env.CheckWalleCreateTask("task-4", "deactivate", false, TStatus::WRONG_REQUEST,
+ "host1");
+ // Lock node-0 for reboot.
+ env.CheckWalleCreateTask("task-5", "change-disk", false, TStatus::ALLOW,
+ env.GetNodeId(0));
+ // List tasks.
+ env.CheckWalleListTasks("task-5", "ok", env.GetNodeId(0));
+ // Schedule node-1 reboot.
+ env.CheckWalleCreateTask("task-6", "reboot", false, TStatus::DISALLOW_TEMP,
+ env.GetNodeId(1));
+ // List tasks.
+ env.CheckWalleListTasks(2);
+ // Check task.
+ env.CheckWalleCheckTask("task-5", TStatus::ALLOW, env.GetNodeId(0));
+ // Check scheduled task.
+ env.CheckWalleCheckTask("task-6", TStatus::DISALLOW_TEMP, env.GetNodeId(1));
+ // Check unknown task.
+ env.CheckWalleCheckTask("task-7", TStatus::WRONG_REQUEST);
+ // Check permissions for Wall-E user.
+ env.CheckListPermissions(WALLE_CMS_USER, 1);
+ // Try dry run creation.
+ env.CheckWalleCreateTask("task-7", "reboot", true, TStatus::DISALLOW_TEMP,
+ env.GetNodeId(1));
+ // Tasks list shouldn't grow.
+ env.CheckWalleListTasks(2);
+ // Finish allowed task.
+ env.CheckWalleRemoveTask("task-5");
+ // Remove unknown task.
+ env.CheckWalleRemoveTask("task-5", TStatus::WRONG_REQUEST);
+ // Check modified tasks list.
+ env.CheckWalleListTasks("task-6", "in-process", env.GetNodeId(1));
+ // New task should be queued because of task-6.
+ env.CheckWalleCreateTask("task-8", "change-disk", false, TStatus::DISALLOW_TEMP,
+ env.GetNodeId(0));
+ // Check tasks list.
+ env.CheckWalleListTasks(2);
+ // Task-8 still cannot be executed.
+ env.CheckWalleCheckTask("task-8", TStatus::DISALLOW_TEMP, env.GetNodeId(0));
+ // Task-6 is allowed now.
+ env.CheckWalleCheckTask("task-6", TStatus::ALLOW, env.GetNodeId(1));
+
+ // Kill CMS tablet to check Wall-E tasks are preserved correctly.
+ env.RestartCms();
+
+ // Check tasks list.
+ env.CheckWalleListTasks(2);
+ // Task-6 is allowed.
+ env.CheckWalleCheckTask("task-6", TStatus::ALLOW, env.GetNodeId(1));
+ // Task-8 is waiting.
+ env.CheckWalleCheckTask("task-8", TStatus::DISALLOW_TEMP, env.GetNodeId(0));
+ // Remove task-8.
+ env.CheckWalleRemoveTask("task-8");
+ // Check modified tasks list.
+ env.CheckWalleListTasks("task-6", "ok", env.GetNodeId(1));
+ // Remove task-6.
+ env.CheckWalleRemoveTask("task-6");
+ // Try task which should be rejected.
+ env.CheckWalleCreateTask("task-9", "reboot", false, TStatus::DISALLOW,
+ env.GetNodeId(0), env.GetNodeId(1));
+ env.CheckWalleListTasks(0);
+ }
+
Y_UNIT_TEST(WalleTasksWithNodeLimit)
{
TCmsTestEnv env(24, 4);
@@ -719,159 +719,159 @@ Y_UNIT_TEST_SUITE(TCmsTest) {
}
Y_UNIT_TEST(Notifications)
- {
- TCmsTestEnv env(8);
- env.AdvanceCurrentTime(TDuration::Minutes(20));
-
- // User is not specified.
- env.CheckNotification(TStatus::WRONG_REQUEST, "", env.GetCurrentTime(),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
- // Too old.
- env.CheckNotification(TStatus::WRONG_REQUEST, "user", env.GetCurrentTime() - TDuration::Minutes(10),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
- // Store notification user-1.
- auto id1 = env.CheckNotification
- (TStatus::OK, "user", env.GetCurrentTime() + TDuration::Minutes(10),
- MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(1, 0)));
-
- // OK to replace the same device before notification start time.
- env.CheckPermissionRequest("user", false, true, true, true, TStatus::ALLOW,
- MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(1, 0)));
-
- // Intersects with notification.
- env.CheckPermissionRequest("user", false, true, true, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 10 * 60000000, env.PDiskName(1, 0)));
-
- // Store notification user-2.
- auto id2 = env.CheckNotification(TStatus::OK, "user", env.GetCurrentTime(),
- MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(2, 0)));
- // Store notificaiton user1-3.
- auto id3 = env.CheckNotification(TStatus::OK, "user1", env.GetCurrentTime(),
- MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(3, 0)));
- // Get notification with no user.
- env.CheckGetNotification("", id1, TStatus::WRONG_REQUEST);
- // Get user-1.
- env.CheckGetNotification("user", id1, TStatus::OK);
- // Get with wrong user.
- env.CheckGetNotification("user1", id1, TStatus::WRONG_REQUEST);
- // Get with wrong id.
- env.CheckGetNotification("user", "wrong-id", TStatus::WRONG_REQUEST);
- // List notifications for user.
- env.CheckListNotifications("user", TStatus::OK, 2);
- // List notifications for user1.
- env.CheckListNotifications("user1", TStatus::OK, 1);
- // List with no user.
- env.CheckListNotifications("", TStatus::WRONG_REQUEST, 0);
- // Reject notification with no user.
- env.CheckRejectNotification("", id1, TStatus::WRONG_REQUEST);
- // Reject notification with wrong user.
- env.CheckRejectNotification("user1", id1, TStatus::WRONG_REQUEST);
- // Reject user-1 (dry run)
- env.CheckRejectNotification("user", id1, TStatus::OK, true);
- // Get user-1.
- env.CheckGetNotification("user", id1, TStatus::OK);
- // Reject user1-3.
- env.CheckRejectNotification("user1", id3, TStatus::OK);
- // Reject user-2.
- env.CheckRejectNotification("user", id2, TStatus::OK);
- // List notifications for user.
- env.CheckListNotifications("user", TStatus::OK, 1);
- // List notifications for user1.
- env.CheckListNotifications("user1", TStatus::OK, 0);
- // Get rejected user1-3.
- env.CheckGetNotification("user1", id3, TStatus::WRONG_REQUEST);
- // Get rejected user-2.
- env.CheckGetNotification("user", id2, TStatus::WRONG_REQUEST);
- // Get user-1.
- env.CheckGetNotification("user", id1, TStatus::OK);
- }
-
+ {
+ TCmsTestEnv env(8);
+ env.AdvanceCurrentTime(TDuration::Minutes(20));
+
+ // User is not specified.
+ env.CheckNotification(TStatus::WRONG_REQUEST, "", env.GetCurrentTime(),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+ // Too old.
+ env.CheckNotification(TStatus::WRONG_REQUEST, "user", env.GetCurrentTime() - TDuration::Minutes(10),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000));
+ // Store notification user-1.
+ auto id1 = env.CheckNotification
+ (TStatus::OK, "user", env.GetCurrentTime() + TDuration::Minutes(10),
+ MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(1, 0)));
+
+ // OK to replace the same device before notification start time.
+ env.CheckPermissionRequest("user", false, true, true, true, TStatus::ALLOW,
+ MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(1, 0)));
+
+ // Intersects with notification.
+ env.CheckPermissionRequest("user", false, true, true, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 10 * 60000000, env.PDiskName(1, 0)));
+
+ // Store notification user-2.
+ auto id2 = env.CheckNotification(TStatus::OK, "user", env.GetCurrentTime(),
+ MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(2, 0)));
+ // Store notificaiton user1-3.
+ auto id3 = env.CheckNotification(TStatus::OK, "user1", env.GetCurrentTime(),
+ MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(3, 0)));
+ // Get notification with no user.
+ env.CheckGetNotification("", id1, TStatus::WRONG_REQUEST);
+ // Get user-1.
+ env.CheckGetNotification("user", id1, TStatus::OK);
+ // Get with wrong user.
+ env.CheckGetNotification("user1", id1, TStatus::WRONG_REQUEST);
+ // Get with wrong id.
+ env.CheckGetNotification("user", "wrong-id", TStatus::WRONG_REQUEST);
+ // List notifications for user.
+ env.CheckListNotifications("user", TStatus::OK, 2);
+ // List notifications for user1.
+ env.CheckListNotifications("user1", TStatus::OK, 1);
+ // List with no user.
+ env.CheckListNotifications("", TStatus::WRONG_REQUEST, 0);
+ // Reject notification with no user.
+ env.CheckRejectNotification("", id1, TStatus::WRONG_REQUEST);
+ // Reject notification with wrong user.
+ env.CheckRejectNotification("user1", id1, TStatus::WRONG_REQUEST);
+ // Reject user-1 (dry run)
+ env.CheckRejectNotification("user", id1, TStatus::OK, true);
+ // Get user-1.
+ env.CheckGetNotification("user", id1, TStatus::OK);
+ // Reject user1-3.
+ env.CheckRejectNotification("user1", id3, TStatus::OK);
+ // Reject user-2.
+ env.CheckRejectNotification("user", id2, TStatus::OK);
+ // List notifications for user.
+ env.CheckListNotifications("user", TStatus::OK, 1);
+ // List notifications for user1.
+ env.CheckListNotifications("user1", TStatus::OK, 0);
+ // Get rejected user1-3.
+ env.CheckGetNotification("user1", id3, TStatus::WRONG_REQUEST);
+ // Get rejected user-2.
+ env.CheckGetNotification("user", id2, TStatus::WRONG_REQUEST);
+ // Get user-1.
+ env.CheckGetNotification("user", id1, TStatus::OK);
+ }
+
Y_UNIT_TEST(PermissionDuration) {
- TCmsTestEnv env(8);
-
- // Store notification user-1.
- auto id1 = env.CheckNotification
- (TStatus::OK, "user", env.GetCurrentTime() + TDuration::Minutes(10),
- MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(1, 0)));
-
- // Intersects with notification.
+ TCmsTestEnv env(8);
+
+ // Store notification user-1.
+ auto id1 = env.CheckNotification
+ (TStatus::OK, "user", env.GetCurrentTime() + TDuration::Minutes(10),
+ MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(1, 0)));
+
+ // Intersects with notification.
const TDuration _10minutes = TDuration::Minutes(10);
env.CheckPermissionRequest("user", false, true, true, true, _10minutes, TStatus::DISALLOW_TEMP,
MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), _10minutes.MicroSeconds(), env.PDiskName(1, 0)));
-
- // OK with default duration.
- env.CheckPermissionRequest("user", false, true, true, true, TStatus::ALLOW,
- MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(1, 0)));
- }
-
+
+ // OK with default duration.
+ env.CheckPermissionRequest("user", false, true, true, true, TStatus::ALLOW,
+ MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(1, 0)));
+ }
+
Y_UNIT_TEST(ActionWithZeroDuration) {
- TCmsTestEnv env(8);
-
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 0, env.PDiskName(1, 0)));
-
- env.AdvanceCurrentTime(TDuration::Minutes(10));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TCms::TEvPrivate::EvCleanupExpired);
- env.DispatchEvents(options);
- }
-
+ TCmsTestEnv env(8);
+
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 0, env.PDiskName(1, 0)));
+
+ env.AdvanceCurrentTime(TDuration::Minutes(10));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TCms::TEvPrivate::EvCleanupExpired);
+ env.DispatchEvents(options);
+ }
+
Y_UNIT_TEST(DynamicConfig)
- {
- TCmsTestEnv env(1);
-
- NKikimrCms::TCmsConfig config;
- config.SetDefaultRetryTime(TDuration::Minutes(10).GetValue());
- config.SetDefaultPermissionDuration(TDuration::Minutes(11).GetValue());
- config.MutableTenantLimits()->SetDisabledNodesLimit(1);
- config.MutableTenantLimits()->SetDisabledNodesRatioLimit(10);
- config.MutableClusterLimits()->SetDisabledNodesLimit(2);
- config.MutableClusterLimits()->SetDisabledNodesRatioLimit(20);
- config.SetInfoCollectionTimeout(TDuration::Minutes(1).GetValue());
- env.SetCmsConfig(config);
-
- auto res = env.GetCmsConfig();
- UNIT_ASSERT_VALUES_EQUAL(res.GetDefaultRetryTime(), TDuration::Minutes(10).GetValue());
- UNIT_ASSERT_VALUES_EQUAL(res.GetDefaultPermissionDuration(), TDuration::Minutes(11).GetValue());
- UNIT_ASSERT_VALUES_EQUAL(res.GetTenantLimits().GetDisabledNodesLimit(), 1);
- UNIT_ASSERT_VALUES_EQUAL(res.GetTenantLimits().GetDisabledNodesRatioLimit(), 10);
- UNIT_ASSERT_VALUES_EQUAL(res.GetClusterLimits().GetDisabledNodesLimit(), 2);
- UNIT_ASSERT_VALUES_EQUAL(res.GetClusterLimits().GetDisabledNodesRatioLimit(), 20);
- UNIT_ASSERT_VALUES_EQUAL(res.GetInfoCollectionTimeout(), TDuration::Minutes(1).GetValue());
- }
-
- Y_UNIT_TEST(RestartNodeInDownState)
- {
- TCmsTestEnv env(8);
-
- TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = false;
-
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
- }
-
+ {
+ TCmsTestEnv env(1);
+
+ NKikimrCms::TCmsConfig config;
+ config.SetDefaultRetryTime(TDuration::Minutes(10).GetValue());
+ config.SetDefaultPermissionDuration(TDuration::Minutes(11).GetValue());
+ config.MutableTenantLimits()->SetDisabledNodesLimit(1);
+ config.MutableTenantLimits()->SetDisabledNodesRatioLimit(10);
+ config.MutableClusterLimits()->SetDisabledNodesLimit(2);
+ config.MutableClusterLimits()->SetDisabledNodesRatioLimit(20);
+ config.SetInfoCollectionTimeout(TDuration::Minutes(1).GetValue());
+ env.SetCmsConfig(config);
+
+ auto res = env.GetCmsConfig();
+ UNIT_ASSERT_VALUES_EQUAL(res.GetDefaultRetryTime(), TDuration::Minutes(10).GetValue());
+ UNIT_ASSERT_VALUES_EQUAL(res.GetDefaultPermissionDuration(), TDuration::Minutes(11).GetValue());
+ UNIT_ASSERT_VALUES_EQUAL(res.GetTenantLimits().GetDisabledNodesLimit(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.GetTenantLimits().GetDisabledNodesRatioLimit(), 10);
+ UNIT_ASSERT_VALUES_EQUAL(res.GetClusterLimits().GetDisabledNodesLimit(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(res.GetClusterLimits().GetDisabledNodesRatioLimit(), 20);
+ UNIT_ASSERT_VALUES_EQUAL(res.GetInfoCollectionTimeout(), TDuration::Minutes(1).GetValue());
+ }
+
+ Y_UNIT_TEST(RestartNodeInDownState)
+ {
+ TCmsTestEnv env(8);
+
+ TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = false;
+
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
+ }
+
void TestAvailabilityMode(EAvailabilityMode mode, bool disconnectNodes)
- {
- Y_VERIFY(mode == MODE_KEEP_AVAILABLE
- || mode == MODE_FORCE_RESTART);
-
- TCmsTestEnv env(8);
-
- auto res1 = env.ExtractPermissions
- (env.CheckPermissionRequest("user", false, false, false,
- true, mode, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000)));
+ {
+ Y_VERIFY(mode == MODE_KEEP_AVAILABLE
+ || mode == MODE_FORCE_RESTART);
+
+ TCmsTestEnv env(8);
+
+ auto res1 = env.ExtractPermissions
+ (env.CheckPermissionRequest("user", false, false, false,
+ true, mode, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000)));
if (disconnectNodes) {
TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = false;
}
- env.CheckPermissionRequest("user", false, false, false,
+ env.CheckPermissionRequest("user", false, false, false,
true, mode, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
if (disconnectNodes) {
TFakeNodeWhiteboardService::Info[env.GetNodeId(1)].Connected = false;
}
-
+
env.CheckPermissionRequest("user", false, false, false,
true, mode, mode == MODE_KEEP_AVAILABLE ? TStatus::DISALLOW_TEMP : TStatus::ALLOW,
MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000));
@@ -879,34 +879,34 @@ Y_UNIT_TEST_SUITE(TCmsTest) {
return;
}
- env.CheckDonePermission("user", res1.second[0]);
-
- env.CheckPermissionRequest("user", false, false, false,
+ env.CheckDonePermission("user", res1.second[0]);
+
+ env.CheckPermissionRequest("user", false, false, false,
true, mode, disconnectNodes ? TStatus::DISALLOW_TEMP: TStatus::ALLOW,
MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000));
if (!disconnectNodes) {
return;
}
-
+
TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = true;
-
- env.CheckPermissionRequest("user", false, false, false,
+
+ env.CheckPermissionRequest("user", false, false, false,
true, mode, TStatus::ALLOW,
MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(3), 60000000));
- }
-
- Y_UNIT_TEST(TestKeepAvailableMode)
- {
+ }
+
+ Y_UNIT_TEST(TestKeepAvailableMode)
+ {
TestAvailabilityMode(MODE_KEEP_AVAILABLE, false);
- }
-
- Y_UNIT_TEST(TestForceRestartMode)
- {
+ }
+
+ Y_UNIT_TEST(TestForceRestartMode)
+ {
TestAvailabilityMode(MODE_FORCE_RESTART, false);
- }
-
+ }
+
Y_UNIT_TEST(TestKeepAvailableModeDisconnects)
- {
+ {
TestAvailabilityMode(MODE_KEEP_AVAILABLE, true);
}
@@ -917,57 +917,57 @@ Y_UNIT_TEST_SUITE(TCmsTest) {
void TestAvailabilityModeScheduled(EAvailabilityMode mode, bool disconnectNodes)
{
- Y_VERIFY(mode == MODE_KEEP_AVAILABLE
- || mode == MODE_FORCE_RESTART);
-
- TCmsTestEnv env(8);
-
- auto res1 = env.ExtractPermissions
- (env.CheckPermissionRequest("user", true, false, true,
- true, mode, TStatus::ALLOW_PARTIAL,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000),
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000)));
+ Y_VERIFY(mode == MODE_KEEP_AVAILABLE
+ || mode == MODE_FORCE_RESTART);
+
+ TCmsTestEnv env(8);
+
+ auto res1 = env.ExtractPermissions
+ (env.CheckPermissionRequest("user", true, false, true,
+ true, mode, TStatus::ALLOW_PARTIAL,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(0), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000),
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(2), 60000000)));
if (disconnectNodes) {
TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = false;
}
-
+
env.CheckRequest("user", res1.first, false, mode, TStatus::ALLOW_PARTIAL, 1);
if (disconnectNodes) {
TFakeNodeWhiteboardService::Info[env.GetNodeId(1)].Connected = false;
}
-
+
env.CheckRequest("user", res1.first, false, mode,
mode == MODE_KEEP_AVAILABLE ? TStatus::DISALLOW_TEMP : TStatus::ALLOW,
mode == MODE_KEEP_AVAILABLE ? 0 : 1);
if (mode != MODE_KEEP_AVAILABLE) {
return;
}
-
+
env.CheckDonePermission("user", res1.second[0]);
-
+
env.CheckRequest("user", res1.first, false, mode,
disconnectNodes ? TStatus::DISALLOW_TEMP : TStatus::ALLOW,
disconnectNodes ? 0 : 1);
if (!disconnectNodes) {
return;
}
-
+
TFakeNodeWhiteboardService::Info[env.GetNodeId(0)].Connected = true;
-
+
env.CheckRequest("user", res1.first, false, mode, TStatus::ALLOW, 1);
- }
-
- Y_UNIT_TEST(TestKeepAvailableModeScheduled)
- {
+ }
+
+ Y_UNIT_TEST(TestKeepAvailableModeScheduled)
+ {
TestAvailabilityModeScheduled(MODE_KEEP_AVAILABLE, false);
- }
-
- Y_UNIT_TEST(TestForceRestartModeScheduled)
- {
+ }
+
+ Y_UNIT_TEST(TestForceRestartModeScheduled)
+ {
TestAvailabilityModeScheduled(MODE_FORCE_RESTART, false);
- }
-
+ }
+
Y_UNIT_TEST(TestKeepAvailableModeScheduledDisconnects)
{
TestAvailabilityModeScheduled(MODE_KEEP_AVAILABLE, true);
@@ -978,88 +978,88 @@ Y_UNIT_TEST_SUITE(TCmsTest) {
TestAvailabilityModeScheduled(MODE_FORCE_RESTART, true);
}
- Y_UNIT_TEST(TestOutdatedState)
- {
- TCmsTestEnv env(8);
-
- env.DisableBSBaseConfig();
-
- env.RequestState({}, TStatus::ERROR_TEMP);
- env.CheckPermissionRequest("user", false, false, false, true, TStatus::ERROR_TEMP,
- MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
- env.CheckNotification(TStatus::ERROR_TEMP, "user", env.GetCurrentTime() + TDuration::Minutes(10),
- MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(1, 0)));
-
- env.EnableBSBaseConfig();
-
- auto rec1 = env.CheckPermissionRequest
- ("user", true, false, true, true, TStatus::ALLOW_PARTIAL,
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)),
- MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(1)));
- auto rid1 = rec1.GetRequestId();
-
- env.DisableBSBaseConfig();
-
- env.CheckRequest("user", rid1, true, TStatus::ERROR_TEMP);
- }
-
- Y_UNIT_TEST(TestSetResetMarkers)
- {
- TCmsTestEnv env(8, 4);
-
+ Y_UNIT_TEST(TestOutdatedState)
+ {
+ TCmsTestEnv env(8);
+
+ env.DisableBSBaseConfig();
+
+ env.RequestState({}, TStatus::ERROR_TEMP);
+ env.CheckPermissionRequest("user", false, false, false, true, TStatus::ERROR_TEMP,
+ MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 60000000, "storage"));
+ env.CheckNotification(TStatus::ERROR_TEMP, "user", env.GetCurrentTime() + TDuration::Minutes(10),
+ MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), 60000000, env.PDiskName(1, 0)));
+
+ env.EnableBSBaseConfig();
+
+ auto rec1 = env.CheckPermissionRequest
+ ("user", true, false, true, true, TStatus::ALLOW_PARTIAL,
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(0)),
+ MakeAction(TAction::REPLACE_DEVICES, 1, 60000000, env.PDiskName(1)));
+ auto rid1 = rec1.GetRequestId();
+
+ env.DisableBSBaseConfig();
+
+ env.CheckRequest("user", rid1, true, TStatus::ERROR_TEMP);
+ }
+
+ Y_UNIT_TEST(TestSetResetMarkers)
+ {
+ TCmsTestEnv env(8, 4);
+
env.CheckSetMarker(MARKER_DISK_BROKEN, "", TStatus::ERROR,
- "::1",
- env.PDiskId(0, 0),
- env.PDiskId(1, 1),
- env.PDiskId(2, 2),
- env.PDiskId(3, 3));
-
+ "::1",
+ env.PDiskId(0, 0),
+ env.PDiskId(1, 1),
+ env.PDiskId(2, 2),
+ env.PDiskId(3, 3));
+
env.CheckResetMarker(MARKER_DISK_BROKEN, "", TStatus::ERROR,
- "::1",
- env.PDiskId(0, 0),
- env.PDiskId(1, 1));
- }
-
- Y_UNIT_TEST(TestLoadLog)
- {
- TCmsTestEnv env(1);
-
- ui64 ts[11];
- ts[0] = 0;
- for (size_t i = 0; i < 10; ++i) {
- auto log = env.GetLogTail();
- UNIT_ASSERT_VALUES_EQUAL(log.LogRecordsSize(), i + 1);
- ts[i + 1] = env.GetCurrentTime().GetValue();
- for (size_t j = 0; j <= i; ++j) {
- auto &rec = log.GetLogRecords(j);
- UNIT_ASSERT(rec.GetTimestamp() >= ts[j]);
- UNIT_ASSERT(rec.GetTimestamp() <= ts[j+1]);
- CheckLoadLogRecord(rec, FQDNHostName(), env.GetNodeId(0),
- Sprintf("%s:%s", GetArcadiaSourceUrl(),
- GetArcadiaLastChange()));
- }
- env.AdvanceCurrentTime(TDuration::Seconds(1));
- env.RestartCms();
- }
- }
-
- Y_UNIT_TEST(CheckUnreplicatedDiskPreventsRestart)
- {
- TCmsTestEnv env(8);
-
- // OK to restart node-1.
- env.CheckPermissionRequest("user", false, true, false, true, TStatus::ALLOW,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
-
- // Some VDisk on node-0 is not replicated.
- auto &node = TFakeNodeWhiteboardService::Info[env.GetNodeId(0)];
- node.VDiskStateInfo.begin()->second.SetReplicated(false);
-
- // Not OK to restart node-1.
- env.CheckPermissionRequest("user", false, true, false, true, TStatus::DISALLOW_TEMP,
- MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
- }
-}
-
-} // NCmsTest
-} // NKikimr
+ "::1",
+ env.PDiskId(0, 0),
+ env.PDiskId(1, 1));
+ }
+
+ Y_UNIT_TEST(TestLoadLog)
+ {
+ TCmsTestEnv env(1);
+
+ ui64 ts[11];
+ ts[0] = 0;
+ for (size_t i = 0; i < 10; ++i) {
+ auto log = env.GetLogTail();
+ UNIT_ASSERT_VALUES_EQUAL(log.LogRecordsSize(), i + 1);
+ ts[i + 1] = env.GetCurrentTime().GetValue();
+ for (size_t j = 0; j <= i; ++j) {
+ auto &rec = log.GetLogRecords(j);
+ UNIT_ASSERT(rec.GetTimestamp() >= ts[j]);
+ UNIT_ASSERT(rec.GetTimestamp() <= ts[j+1]);
+ CheckLoadLogRecord(rec, FQDNHostName(), env.GetNodeId(0),
+ Sprintf("%s:%s", GetArcadiaSourceUrl(),
+ GetArcadiaLastChange()));
+ }
+ env.AdvanceCurrentTime(TDuration::Seconds(1));
+ env.RestartCms();
+ }
+ }
+
+ Y_UNIT_TEST(CheckUnreplicatedDiskPreventsRestart)
+ {
+ TCmsTestEnv env(8);
+
+ // OK to restart node-1.
+ env.CheckPermissionRequest("user", false, true, false, true, TStatus::ALLOW,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+
+ // Some VDisk on node-0 is not replicated.
+ auto &node = TFakeNodeWhiteboardService::Info[env.GetNodeId(0)];
+ node.VDiskStateInfo.begin()->second.SetReplicated(false);
+
+ // Not OK to restart node-1.
+ env.CheckPermissionRequest("user", false, true, false, true, TStatus::DISALLOW_TEMP,
+ MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(1), 60000000));
+ }
+}
+
+} // NCmsTest
+} // NKikimr
diff --git a/ydb/core/cms/cms_ut_common.cpp b/ydb/core/cms/cms_ut_common.cpp
index f2ef6f86559..b458fe672ce 100644
--- a/ydb/core/cms/cms_ut_common.cpp
+++ b/ydb/core/cms/cms_ut_common.cpp
@@ -1,7 +1,7 @@
-#include "cms_impl.h"
-#include "cms_ut_common.h"
-#include "ut_helpers.h"
-
+#include "cms_impl.h"
+#include "cms_ut_common.h"
+#include "ut_helpers.h"
+
#include <ydb/core/blobstorage/crypto/default.h>
#include <ydb/core/mind/bscontroller/bsc.h>
#include <ydb/core/testlib/basics/appdata.h>
@@ -9,241 +9,241 @@
#include <ydb/core/testlib/basics/runtime.h>
#include <ydb/core/testlib/basics/storage.h>
#include <ydb/core/testlib/tablet_helpers.h>
-
+
#include <google/protobuf/text_format.h>
#include <library/cpp/malloc/api/malloc.h>
#include <library/cpp/svnversion/svnversion.h>
#include <library/cpp/testing/unittest/registar.h>
-
-#include <util/string/subst.h>
-
-const bool STRAND_PDISK = true;
-
-#ifndef NDEBUG
-const bool ENABLE_DETAILED_CMS_LOG = true;
-#else
-const bool ENABLE_DETAILED_CMS_LOG = false;
-#endif
-
-namespace NKikimr {
-namespace NCmsTest {
-
-using namespace NCms;
-using namespace NNodeWhiteboard;
-using namespace NKikimrWhiteboard;
-using namespace NKikimrCms;
-using namespace NKikimrBlobStorage;
-
-void TFakeNodeWhiteboardService::Handle(TEvBlobStorage::TEvControllerConfigRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- TGuard<TMutex> guard(Mutex);
- auto &rec = ev->Get()->Record;
- auto *resp = new TEvBlobStorage::TEvControllerConfigResponse;
- if (rec.GetRequest().CommandSize() && rec.GetRequest().GetCommand(0).HasQueryBaseConfig()) {
- resp->Record.CopyFrom(Config);
- } else if (rec.GetRequest().CommandSize() && rec.GetRequest().GetCommand(0).HasReadDriveStatus()) {
- auto &drive = rec.GetRequest().GetCommand(0).GetReadDriveStatus();
- auto &status = *resp->Record.MutableResponse()->AddStatus();
- resp->Record.MutableResponse()->SetSuccess(true);
- status.SetSuccess(true);
- auto &driveStatus = *status.AddDriveStatus();
- driveStatus.MutableHostKey()->SetFqdn(drive.GetHostKey().GetFqdn());
- driveStatus.MutableHostKey()->SetIcPort(drive.GetHostKey().GetIcPort());
- driveStatus.SetPath(drive.GetPath());
- driveStatus.SetStatus(NKikimrBlobStorage::ACTIVE);
- } else if (rec.GetRequest().CommandSize() && rec.GetRequest().GetCommand(0).HasUpdateDriveStatus()) {
- resp->Record.MutableResponse()->AddStatus()->SetSuccess(true);
+
+#include <util/string/subst.h>
+
+const bool STRAND_PDISK = true;
+
+#ifndef NDEBUG
+const bool ENABLE_DETAILED_CMS_LOG = true;
+#else
+const bool ENABLE_DETAILED_CMS_LOG = false;
+#endif
+
+namespace NKikimr {
+namespace NCmsTest {
+
+using namespace NCms;
+using namespace NNodeWhiteboard;
+using namespace NKikimrWhiteboard;
+using namespace NKikimrCms;
+using namespace NKikimrBlobStorage;
+
+void TFakeNodeWhiteboardService::Handle(TEvBlobStorage::TEvControllerConfigRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ TGuard<TMutex> guard(Mutex);
+ auto &rec = ev->Get()->Record;
+ auto *resp = new TEvBlobStorage::TEvControllerConfigResponse;
+ if (rec.GetRequest().CommandSize() && rec.GetRequest().GetCommand(0).HasQueryBaseConfig()) {
+ resp->Record.CopyFrom(Config);
+ } else if (rec.GetRequest().CommandSize() && rec.GetRequest().GetCommand(0).HasReadDriveStatus()) {
+ auto &drive = rec.GetRequest().GetCommand(0).GetReadDriveStatus();
+ auto &status = *resp->Record.MutableResponse()->AddStatus();
resp->Record.MutableResponse()->SetSuccess(true);
- }
- ctx.Send(ev->Sender, resp, 0, ev->Cookie);
-}
-
-void TFakeNodeWhiteboardService::Handle(TEvWhiteboard::TEvTabletStateRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- TGuard<TMutex> guard(Mutex);
- const auto &node = Info[ctx.SelfID.NodeId()];
- if (!node.Connected) {
- ctx.Send(ev->Sender, new TEvents::TEvUndelivered(ev->GetTypeRewrite(), TEvents::TEvUndelivered::Disconnected), 0, ev->Cookie);
- return;
- }
- TAutoPtr<TEvWhiteboard::TEvTabletStateResponse> response = new TEvWhiteboard::TEvTabletStateResponse();
- auto& record = response->Record;
- for (const auto& pr : node.TabletStateInfo) {
- NKikimrWhiteboard::TTabletStateInfo &tabletStateInfo = *record.AddTabletStateInfo();
- tabletStateInfo.CopyFrom(pr.second);
- }
- response->Record.SetResponseTime(ctx.Now().MilliSeconds());
- ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
-}
-
-void TFakeNodeWhiteboardService::Handle(TEvWhiteboard::TEvNodeStateRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- TGuard<TMutex> guard(Mutex);
- const auto &node = Info[ctx.SelfID.NodeId()];
- if (!node.Connected) {
- ctx.Send(ev->Sender, new TEvents::TEvUndelivered(ev->GetTypeRewrite(), TEvents::TEvUndelivered::Disconnected), 0, ev->Cookie);
- return;
- }
- TAutoPtr<TEvWhiteboard::TEvNodeStateResponse> response = new TEvWhiteboard::TEvNodeStateResponse();
- auto& record = response->Record;
- for (const auto& pr : node.NodeStateInfo) {
- NKikimrWhiteboard::TNodeStateInfo &nodeStateInfo = *record.AddNodeStateInfo();
- nodeStateInfo.CopyFrom(pr.second);
- }
- response->Record.SetResponseTime(ctx.Now().MilliSeconds());
- ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
-}
-
-void TFakeNodeWhiteboardService::Handle(TEvWhiteboard::TEvPDiskStateRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- TGuard<TMutex> guard(Mutex);
- const auto &node = Info[ctx.SelfID.NodeId()];
- if (!node.Connected) {
- ctx.Send(ev->Sender, new TEvents::TEvUndelivered(ev->GetTypeRewrite(), TEvents::TEvUndelivered::Disconnected), 0, ev->Cookie);
- return;
- }
- TAutoPtr<TEvWhiteboard::TEvPDiskStateResponse> response = new TEvWhiteboard::TEvPDiskStateResponse();
- auto& record = response->Record;
- for (const auto& pr : node.PDiskStateInfo) {
- NKikimrWhiteboard::TPDiskStateInfo &pDiskStateInfo = *record.AddPDiskStateInfo();
- pDiskStateInfo.CopyFrom(pr.second);
- }
- response->Record.SetResponseTime(ctx.Now().MilliSeconds());
- ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
-}
-
-void TFakeNodeWhiteboardService::Handle(TEvWhiteboard::TEvVDiskStateRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- TGuard<TMutex> guard(Mutex);
- const auto &node = Info[ctx.SelfID.NodeId()];
- if (!node.Connected) {
- ctx.Send(ev->Sender, new TEvents::TEvUndelivered(ev->GetTypeRewrite(), TEvents::TEvUndelivered::Disconnected), 0, ev->Cookie);
- return;
- }
- TAutoPtr<TEvWhiteboard::TEvVDiskStateResponse> response = new TEvWhiteboard::TEvVDiskStateResponse();
- auto& record = response->Record;
- for (const auto& pr : node.VDiskStateInfo) {
- NKikimrWhiteboard::TVDiskStateInfo &vDiskStateInfo = *record.AddVDiskStateInfo();
- vDiskStateInfo.CopyFrom(pr.second);
- }
- response->Record.SetResponseTime(ctx.Now().MilliSeconds());
- ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
-}
-
-void TFakeNodeWhiteboardService::Handle(TEvWhiteboard::TEvSystemStateRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- TGuard<TMutex> guard(Mutex);
- const auto &node = Info[ctx.SelfID.NodeId()];
- if (!node.Connected) {
- ctx.Send(ev->Sender, new TEvents::TEvUndelivered(ev->GetTypeRewrite(), TEvents::TEvUndelivered::Disconnected), 0, ev->Cookie);
- return;
- }
- TAutoPtr<TEvWhiteboard::TEvSystemStateResponse> response = new TEvWhiteboard::TEvSystemStateResponse();
- auto& record = response->Record;
- NKikimrWhiteboard::TSystemStateInfo &systemStateInfo = *record.AddSystemStateInfo();
- systemStateInfo.CopyFrom(node.SystemStateInfo);
- response->Record.SetResponseTime(ctx.Now().MilliSeconds());
- ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
-}
-
-NKikimrBlobStorage::TEvControllerConfigResponse TFakeNodeWhiteboardService::Config;
-THashMap<ui32, TFakeNodeInfo> TFakeNodeWhiteboardService::Info;
-TMutex TFakeNodeWhiteboardService::Mutex;
-
-namespace {
-
-struct TFakeNodeInfo {
- struct TVDiskIDComparator {
- bool operator ()(const TVDiskID& a, const TVDiskID& b) const {
- return std::make_tuple(a.GroupID, a.FailRealm, a.FailDomain, a.VDisk)
- < std::make_tuple(b.GroupID, b.FailRealm, b.FailDomain, b.VDisk);
- }
- };
-
- TMap<TTabletId, NKikimrWhiteboard::TTabletStateInfo> TabletStateInfo;
- TMap<TString, NKikimrWhiteboard::TNodeStateInfo> NodeStateInfo;
- TMap<ui32, NKikimrWhiteboard::TPDiskStateInfo> PDiskStateInfo;
- TMap<TVDiskID, NKikimrWhiteboard::TVDiskStateInfo, TVDiskIDComparator> VDiskStateInfo;
- TMap<ui32, NKikimrWhiteboard::TBSGroupStateInfo> BSGroupStateInfo;
- NKikimrWhiteboard::TSystemStateInfo SystemStateInfo;
- bool Connected = true;
-};
-
-class TFakeTenantPool : public TActorBootstrapped<TFakeTenantPool> {
-public:
- TVector<TString> Tenants;
-
- TFakeTenantPool(const TVector<TString> &tenants)
- : Tenants(tenants)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- Y_UNUSED(ctx);
- Become(&TFakeTenantPool::StateWork);
- }
-
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvTenantPool::TEvGetStatus, Handle);
- }
- }
-
- void Handle(TEvTenantPool::TEvGetStatus::TPtr &ev, const TActorContext &ctx)
- {
- auto *resp = new TEvTenantPool::TEvTenantPoolStatus;
- for (auto tenant : Tenants) {
- NKikimrTenantPool::TSlotStatus& slotStatus = *resp->Record.AddSlots();
- slotStatus.SetId("slot-1");
- slotStatus.SetType("static");
- slotStatus.SetAssignedTenant(tenant);
- slotStatus.SetLabel("static");
- }
- ctx.Send(ev->Sender, resp, 0, ev->Cookie);
- }
-};
-
+ status.SetSuccess(true);
+ auto &driveStatus = *status.AddDriveStatus();
+ driveStatus.MutableHostKey()->SetFqdn(drive.GetHostKey().GetFqdn());
+ driveStatus.MutableHostKey()->SetIcPort(drive.GetHostKey().GetIcPort());
+ driveStatus.SetPath(drive.GetPath());
+ driveStatus.SetStatus(NKikimrBlobStorage::ACTIVE);
+ } else if (rec.GetRequest().CommandSize() && rec.GetRequest().GetCommand(0).HasUpdateDriveStatus()) {
+ resp->Record.MutableResponse()->AddStatus()->SetSuccess(true);
+ resp->Record.MutableResponse()->SetSuccess(true);
+ }
+ ctx.Send(ev->Sender, resp, 0, ev->Cookie);
+}
+
+void TFakeNodeWhiteboardService::Handle(TEvWhiteboard::TEvTabletStateRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ TGuard<TMutex> guard(Mutex);
+ const auto &node = Info[ctx.SelfID.NodeId()];
+ if (!node.Connected) {
+ ctx.Send(ev->Sender, new TEvents::TEvUndelivered(ev->GetTypeRewrite(), TEvents::TEvUndelivered::Disconnected), 0, ev->Cookie);
+ return;
+ }
+ TAutoPtr<TEvWhiteboard::TEvTabletStateResponse> response = new TEvWhiteboard::TEvTabletStateResponse();
+ auto& record = response->Record;
+ for (const auto& pr : node.TabletStateInfo) {
+ NKikimrWhiteboard::TTabletStateInfo &tabletStateInfo = *record.AddTabletStateInfo();
+ tabletStateInfo.CopyFrom(pr.second);
+ }
+ response->Record.SetResponseTime(ctx.Now().MilliSeconds());
+ ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
+}
+
+void TFakeNodeWhiteboardService::Handle(TEvWhiteboard::TEvNodeStateRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ TGuard<TMutex> guard(Mutex);
+ const auto &node = Info[ctx.SelfID.NodeId()];
+ if (!node.Connected) {
+ ctx.Send(ev->Sender, new TEvents::TEvUndelivered(ev->GetTypeRewrite(), TEvents::TEvUndelivered::Disconnected), 0, ev->Cookie);
+ return;
+ }
+ TAutoPtr<TEvWhiteboard::TEvNodeStateResponse> response = new TEvWhiteboard::TEvNodeStateResponse();
+ auto& record = response->Record;
+ for (const auto& pr : node.NodeStateInfo) {
+ NKikimrWhiteboard::TNodeStateInfo &nodeStateInfo = *record.AddNodeStateInfo();
+ nodeStateInfo.CopyFrom(pr.second);
+ }
+ response->Record.SetResponseTime(ctx.Now().MilliSeconds());
+ ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
+}
+
+void TFakeNodeWhiteboardService::Handle(TEvWhiteboard::TEvPDiskStateRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ TGuard<TMutex> guard(Mutex);
+ const auto &node = Info[ctx.SelfID.NodeId()];
+ if (!node.Connected) {
+ ctx.Send(ev->Sender, new TEvents::TEvUndelivered(ev->GetTypeRewrite(), TEvents::TEvUndelivered::Disconnected), 0, ev->Cookie);
+ return;
+ }
+ TAutoPtr<TEvWhiteboard::TEvPDiskStateResponse> response = new TEvWhiteboard::TEvPDiskStateResponse();
+ auto& record = response->Record;
+ for (const auto& pr : node.PDiskStateInfo) {
+ NKikimrWhiteboard::TPDiskStateInfo &pDiskStateInfo = *record.AddPDiskStateInfo();
+ pDiskStateInfo.CopyFrom(pr.second);
+ }
+ response->Record.SetResponseTime(ctx.Now().MilliSeconds());
+ ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
+}
+
+void TFakeNodeWhiteboardService::Handle(TEvWhiteboard::TEvVDiskStateRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ TGuard<TMutex> guard(Mutex);
+ const auto &node = Info[ctx.SelfID.NodeId()];
+ if (!node.Connected) {
+ ctx.Send(ev->Sender, new TEvents::TEvUndelivered(ev->GetTypeRewrite(), TEvents::TEvUndelivered::Disconnected), 0, ev->Cookie);
+ return;
+ }
+ TAutoPtr<TEvWhiteboard::TEvVDiskStateResponse> response = new TEvWhiteboard::TEvVDiskStateResponse();
+ auto& record = response->Record;
+ for (const auto& pr : node.VDiskStateInfo) {
+ NKikimrWhiteboard::TVDiskStateInfo &vDiskStateInfo = *record.AddVDiskStateInfo();
+ vDiskStateInfo.CopyFrom(pr.second);
+ }
+ response->Record.SetResponseTime(ctx.Now().MilliSeconds());
+ ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
+}
+
+void TFakeNodeWhiteboardService::Handle(TEvWhiteboard::TEvSystemStateRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ TGuard<TMutex> guard(Mutex);
+ const auto &node = Info[ctx.SelfID.NodeId()];
+ if (!node.Connected) {
+ ctx.Send(ev->Sender, new TEvents::TEvUndelivered(ev->GetTypeRewrite(), TEvents::TEvUndelivered::Disconnected), 0, ev->Cookie);
+ return;
+ }
+ TAutoPtr<TEvWhiteboard::TEvSystemStateResponse> response = new TEvWhiteboard::TEvSystemStateResponse();
+ auto& record = response->Record;
+ NKikimrWhiteboard::TSystemStateInfo &systemStateInfo = *record.AddSystemStateInfo();
+ systemStateInfo.CopyFrom(node.SystemStateInfo);
+ response->Record.SetResponseTime(ctx.Now().MilliSeconds());
+ ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
+}
+
+NKikimrBlobStorage::TEvControllerConfigResponse TFakeNodeWhiteboardService::Config;
+THashMap<ui32, TFakeNodeInfo> TFakeNodeWhiteboardService::Info;
+TMutex TFakeNodeWhiteboardService::Mutex;
+
+namespace {
+
+struct TFakeNodeInfo {
+ struct TVDiskIDComparator {
+ bool operator ()(const TVDiskID& a, const TVDiskID& b) const {
+ return std::make_tuple(a.GroupID, a.FailRealm, a.FailDomain, a.VDisk)
+ < std::make_tuple(b.GroupID, b.FailRealm, b.FailDomain, b.VDisk);
+ }
+ };
+
+ TMap<TTabletId, NKikimrWhiteboard::TTabletStateInfo> TabletStateInfo;
+ TMap<TString, NKikimrWhiteboard::TNodeStateInfo> NodeStateInfo;
+ TMap<ui32, NKikimrWhiteboard::TPDiskStateInfo> PDiskStateInfo;
+ TMap<TVDiskID, NKikimrWhiteboard::TVDiskStateInfo, TVDiskIDComparator> VDiskStateInfo;
+ TMap<ui32, NKikimrWhiteboard::TBSGroupStateInfo> BSGroupStateInfo;
+ NKikimrWhiteboard::TSystemStateInfo SystemStateInfo;
+ bool Connected = true;
+};
+
+class TFakeTenantPool : public TActorBootstrapped<TFakeTenantPool> {
+public:
+ TVector<TString> Tenants;
+
+ TFakeTenantPool(const TVector<TString> &tenants)
+ : Tenants(tenants)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ Y_UNUSED(ctx);
+ Become(&TFakeTenantPool::StateWork);
+ }
+
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvTenantPool::TEvGetStatus, Handle);
+ }
+ }
+
+ void Handle(TEvTenantPool::TEvGetStatus::TPtr &ev, const TActorContext &ctx)
+ {
+ auto *resp = new TEvTenantPool::TEvTenantPoolStatus;
+ for (auto tenant : Tenants) {
+ NKikimrTenantPool::TSlotStatus& slotStatus = *resp->Record.AddSlots();
+ slotStatus.SetId("slot-1");
+ slotStatus.SetType("static");
+ slotStatus.SetAssignedTenant(tenant);
+ slotStatus.SetLabel("static");
+ }
+ ctx.Send(ev->Sender, resp, 0, ev->Cookie);
+ }
+};
+
void GenerateExtendedInfo(TTestActorRuntime &runtime, NKikimrBlobStorage::TBaseConfig *config,
ui32 pdisks, ui32 vdiskPerPdisk = 4, const TNodeTenantsMap &tenants = {})
-{
- TGuard<TMutex> guard(TFakeNodeWhiteboardService::Mutex);
- ui32 numNodes = runtime.GetNodeCount();
- ui32 numNodeGroups = pdisks * vdiskPerPdisk;
- ui32 numGroups;
-
- if (numNodes >= 8)
- numGroups = numNodes * numNodeGroups / 8;
- else
- numGroups = numNodes * numNodeGroups;
-
- auto now = Now();
- for (ui32 groupId = 0; groupId < numGroups; ++groupId) {
+{
+ TGuard<TMutex> guard(TFakeNodeWhiteboardService::Mutex);
+ ui32 numNodes = runtime.GetNodeCount();
+ ui32 numNodeGroups = pdisks * vdiskPerPdisk;
+ ui32 numGroups;
+
+ if (numNodes >= 8)
+ numGroups = numNodes * numNodeGroups / 8;
+ else
+ numGroups = numNodes * numNodeGroups;
+
+ auto now = Now();
+ for (ui32 groupId = 0; groupId < numGroups; ++groupId) {
auto &group = *config->AddGroup();
- group.SetGroupId(groupId);
- group.SetGroupGeneration(1);
- if (numNodes >= 8)
- group.SetErasureSpecies("block-4-2");
- else
- group.SetErasureSpecies("none");
- }
-
- TFakeNodeWhiteboardService::Info.clear();
- for (ui32 nodeIndex = 0; nodeIndex < numNodes; ++nodeIndex) {
- ui32 nodeId = runtime.GetNodeId(nodeIndex);
-
- auto &node = TFakeNodeWhiteboardService::Info[nodeId];
- node.SystemStateInfo.SetVersion(ToString(GetProgramSvnRevision()));
- node.SystemStateInfo.SetStartTime(now.GetValue());
- node.SystemStateInfo.SetChangeTime(now.GetValue());
-
+ group.SetGroupId(groupId);
+ group.SetGroupGeneration(1);
+ if (numNodes >= 8)
+ group.SetErasureSpecies("block-4-2");
+ else
+ group.SetErasureSpecies("none");
+ }
+
+ TFakeNodeWhiteboardService::Info.clear();
+ for (ui32 nodeIndex = 0; nodeIndex < numNodes; ++nodeIndex) {
+ ui32 nodeId = runtime.GetNodeId(nodeIndex);
+
+ auto &node = TFakeNodeWhiteboardService::Info[nodeId];
+ node.SystemStateInfo.SetVersion(ToString(GetProgramSvnRevision()));
+ node.SystemStateInfo.SetStartTime(now.GetValue());
+ node.SystemStateInfo.SetChangeTime(now.GetValue());
+
if (tenants.contains(nodeIndex)) {
node.SystemStateInfo.AddRoles("Tenant");
continue;
@@ -255,756 +255,756 @@ void GenerateExtendedInfo(TTestActorRuntime &runtime, NKikimrBlobStorage::TBaseC
if (numNodes < 8)
groupShift = nodeIndex * numNodeGroups;
- for (ui32 pdiskIndex = 0; pdiskIndex < pdisks; ++pdiskIndex) {
- auto pdiskId = nodeId * pdisks + pdiskIndex;
- auto &pdisk = node.PDiskStateInfo[pdiskId];
- pdisk.SetPDiskId(pdiskId);
- pdisk.SetCreateTime(now.GetValue());
- pdisk.SetChangeTime(now.GetValue());
- pdisk.SetPath("/pdisk.data");
- pdisk.SetGuid(1);
- pdisk.SetAvailableSize(100ULL << 30);
- pdisk.SetTotalSize(200ULL << 30);
+ for (ui32 pdiskIndex = 0; pdiskIndex < pdisks; ++pdiskIndex) {
+ auto pdiskId = nodeId * pdisks + pdiskIndex;
+ auto &pdisk = node.PDiskStateInfo[pdiskId];
+ pdisk.SetPDiskId(pdiskId);
+ pdisk.SetCreateTime(now.GetValue());
+ pdisk.SetChangeTime(now.GetValue());
+ pdisk.SetPath("/pdisk.data");
+ pdisk.SetGuid(1);
+ pdisk.SetAvailableSize(100ULL << 30);
+ pdisk.SetTotalSize(200ULL << 30);
pdisk.SetState(NKikimrBlobStorage::TPDiskState::Normal);
-
+
auto &pdiskConfig = *config->AddPDisk();
- pdiskConfig.SetNodeId(nodeId);
- pdiskConfig.SetPDiskId(pdiskId);
- pdiskConfig.SetPath("/pdisk.data");
- pdiskConfig.SetGuid(1);
+ pdiskConfig.SetNodeId(nodeId);
+ pdiskConfig.SetPDiskId(pdiskId);
+ pdiskConfig.SetPath("/pdisk.data");
+ pdiskConfig.SetGuid(1);
pdiskConfig.SetDriveStatus(NKikimrBlobStorage::ACTIVE);
-
- for (ui8 vdiskIndex = 0; vdiskIndex < vdiskPerPdisk; ++vdiskIndex) {
- ui32 vdiskId = pdiskIndex * vdiskPerPdisk + vdiskIndex;
- ui32 groupId = groupShift + vdiskId;
- TVDiskID id = {(ui8)groupId, 1, 0, (ui8)(nodeIndex % 8), (ui8)0};
-
- auto &vdisk = node.VDiskStateInfo[id];
- VDiskIDFromVDiskID(id, vdisk.MutableVDiskId());
- vdisk.SetCreateTime(now.GetValue());
- vdisk.SetChangeTime(now.GetValue());
- vdisk.SetPDiskId(pdiskId);
- vdisk.SetVDiskSlotId(vdiskIndex);
- vdisk.SetVDiskState(NKikimrWhiteboard::OK);
- vdisk.SetReplicated(true);
-
+
+ for (ui8 vdiskIndex = 0; vdiskIndex < vdiskPerPdisk; ++vdiskIndex) {
+ ui32 vdiskId = pdiskIndex * vdiskPerPdisk + vdiskIndex;
+ ui32 groupId = groupShift + vdiskId;
+ TVDiskID id = {(ui8)groupId, 1, 0, (ui8)(nodeIndex % 8), (ui8)0};
+
+ auto &vdisk = node.VDiskStateInfo[id];
+ VDiskIDFromVDiskID(id, vdisk.MutableVDiskId());
+ vdisk.SetCreateTime(now.GetValue());
+ vdisk.SetChangeTime(now.GetValue());
+ vdisk.SetPDiskId(pdiskId);
+ vdisk.SetVDiskSlotId(vdiskIndex);
+ vdisk.SetVDiskState(NKikimrWhiteboard::OK);
+ vdisk.SetReplicated(true);
+
auto &vdiskConfig = *config->AddVSlot();
- vdiskConfig.MutableVSlotId()->SetNodeId(nodeId);
- vdiskConfig.MutableVSlotId()->SetPDiskId(pdiskId);
- vdiskConfig.MutableVSlotId()->SetVSlotId(1000 + vdiskIndex);
- vdiskConfig.SetGroupId(groupId);
- vdiskConfig.SetGroupGeneration(1);
- vdiskConfig.SetFailDomainIdx(nodeIndex % 8);
-
+ vdiskConfig.MutableVSlotId()->SetNodeId(nodeId);
+ vdiskConfig.MutableVSlotId()->SetPDiskId(pdiskId);
+ vdiskConfig.MutableVSlotId()->SetVSlotId(1000 + vdiskIndex);
+ vdiskConfig.SetGroupId(groupId);
+ vdiskConfig.SetGroupGeneration(1);
+ vdiskConfig.SetFailDomainIdx(nodeIndex % 8);
+
config->MutableGroup(groupId)->AddVSlotId()
- ->CopyFrom(vdiskConfig.GetVSlotId());
- }
- }
- }
-}
-
-IActor *CreateFakeNodeWhiteboardService()
-{
- return new TFakeNodeWhiteboardService;
-}
-
-static bool IsTabletActiveEvent(IEventHandle& ev) {
- if (ev.GetTypeRewrite() == NNodeWhiteboard::TEvWhiteboard::EvTabletStateUpdate) {
- if (ev.Get<NNodeWhiteboard::TEvWhiteboard::TEvTabletStateUpdate>()->Record.GetState()
- == NKikimrWhiteboard::TTabletStateInfo::Active) {
- return true;
- }
- }
- return false;
-}
-
-static void SetupServices(TTestActorRuntime &runtime,
- const TNodeTenantsMap &tenants)
-{
- const ui32 domainsNum = 1;
- const ui32 disksInDomain = 1;
-
- TAppPrepare app;
-
- { // setup domain info
- app.ClearDomainsAndHive();
- app.AddDomain(TDomainsInfo::TDomain::ConstructEmptyDomain("dc-1").Release());
- }
- { // setup channel profiles
- TIntrusivePtr<TChannelProfiles> channelProfiles = new TChannelProfiles;
- channelProfiles->Profiles.emplace_back();
+ ->CopyFrom(vdiskConfig.GetVSlotId());
+ }
+ }
+ }
+}
+
+IActor *CreateFakeNodeWhiteboardService()
+{
+ return new TFakeNodeWhiteboardService;
+}
+
+static bool IsTabletActiveEvent(IEventHandle& ev) {
+ if (ev.GetTypeRewrite() == NNodeWhiteboard::TEvWhiteboard::EvTabletStateUpdate) {
+ if (ev.Get<NNodeWhiteboard::TEvWhiteboard::TEvTabletStateUpdate>()->Record.GetState()
+ == NKikimrWhiteboard::TTabletStateInfo::Active) {
+ return true;
+ }
+ }
+ return false;
+}
+
+static void SetupServices(TTestActorRuntime &runtime,
+ const TNodeTenantsMap &tenants)
+{
+ const ui32 domainsNum = 1;
+ const ui32 disksInDomain = 1;
+
+ TAppPrepare app;
+
+ { // setup domain info
+ app.ClearDomainsAndHive();
+ app.AddDomain(TDomainsInfo::TDomain::ConstructEmptyDomain("dc-1").Release());
+ }
+ { // setup channel profiles
+ TIntrusivePtr<TChannelProfiles> channelProfiles = new TChannelProfiles;
+ channelProfiles->Profiles.emplace_back();
TChannelProfiles::TProfile &profile = channelProfiles->Profiles.back();
- for (ui32 channelIdx = 0; channelIdx < 3; ++channelIdx) {
- profile.Channels.push_back(
- TChannelProfiles::TProfile::TChannel(TBlobStorageGroupType::ErasureNone, 0, NKikimrBlobStorage::TVDiskKind::Default));
- }
- app.SetChannels(std::move(channelProfiles));
- }
-
- for (ui32 nodeIndex = 0; nodeIndex < runtime.GetNodeCount(); ++nodeIndex) {
- SetupStateStorage(runtime, nodeIndex);
-
- TString staticConfig("AvailabilityDomains: 0 "
- "PDisks { NodeID: $Node1 PDiskID: 0 PDiskGuid: 1 Path: \"pdisk0.dat\" }"
- "VDisks { VDiskID { GroupID: 0 GroupGeneration: 1 Ring: 0 Domain: 0 VDisk: 0 }"
- " VDiskLocation { NodeID: $Node1 PDiskID: 0 PDiskGuid: 1 VDiskSlotID: 0 }"
- "}"
- "Groups { GroupID: 0 GroupGeneration: 1 ErasureSpecies: 0 "// None
- " Rings {"
- " FailDomains { VDiskLocations { NodeID: $Node1 PDiskID: 0 VDiskSlotID: 0 PDiskGuid: 1 } }"
- " }"
- "}");
-
- SubstGlobal(staticConfig, "$Node1", Sprintf("%" PRIu32, runtime.GetNodeId(0)));
-
- TIntrusivePtr<TNodeWardenConfig> nodeWardenConfig =
- new TNodeWardenConfig(STRAND_PDISK && !runtime.IsRealThreads()
- ? static_cast<IPDiskServiceFactory*>(new TStrandedPDiskServiceFactory(runtime))
- : static_cast<IPDiskServiceFactory*>(new TRealPDiskServiceFactory()));
- google::protobuf::TextFormat::ParseFromString(staticConfig, &nodeWardenConfig->ServiceSet);
-
- if (nodeIndex == 0) {
- TString pDiskPath;
+ for (ui32 channelIdx = 0; channelIdx < 3; ++channelIdx) {
+ profile.Channels.push_back(
+ TChannelProfiles::TProfile::TChannel(TBlobStorageGroupType::ErasureNone, 0, NKikimrBlobStorage::TVDiskKind::Default));
+ }
+ app.SetChannels(std::move(channelProfiles));
+ }
+
+ for (ui32 nodeIndex = 0; nodeIndex < runtime.GetNodeCount(); ++nodeIndex) {
+ SetupStateStorage(runtime, nodeIndex);
+
+ TString staticConfig("AvailabilityDomains: 0 "
+ "PDisks { NodeID: $Node1 PDiskID: 0 PDiskGuid: 1 Path: \"pdisk0.dat\" }"
+ "VDisks { VDiskID { GroupID: 0 GroupGeneration: 1 Ring: 0 Domain: 0 VDisk: 0 }"
+ " VDiskLocation { NodeID: $Node1 PDiskID: 0 PDiskGuid: 1 VDiskSlotID: 0 }"
+ "}"
+ "Groups { GroupID: 0 GroupGeneration: 1 ErasureSpecies: 0 "// None
+ " Rings {"
+ " FailDomains { VDiskLocations { NodeID: $Node1 PDiskID: 0 VDiskSlotID: 0 PDiskGuid: 1 } }"
+ " }"
+ "}");
+
+ SubstGlobal(staticConfig, "$Node1", Sprintf("%" PRIu32, runtime.GetNodeId(0)));
+
+ TIntrusivePtr<TNodeWardenConfig> nodeWardenConfig =
+ new TNodeWardenConfig(STRAND_PDISK && !runtime.IsRealThreads()
+ ? static_cast<IPDiskServiceFactory*>(new TStrandedPDiskServiceFactory(runtime))
+ : static_cast<IPDiskServiceFactory*>(new TRealPDiskServiceFactory()));
+ google::protobuf::TextFormat::ParseFromString(staticConfig, &nodeWardenConfig->ServiceSet);
+
+ if (nodeIndex == 0) {
+ TString pDiskPath;
TIntrusivePtr<NPDisk::TSectorMap> sectorMap;
ui64 pDiskSize = 32ull << 30ull;
- ui64 pDiskChunkSize = 32u << 20u;
- if (true /*in memory*/) {
- pDiskPath = "/TString/pdisk0.dat";
+ ui64 pDiskChunkSize = 32u << 20u;
+ if (true /*in memory*/) {
+ pDiskPath = "/TString/pdisk0.dat";
auto& existing = nodeWardenConfig->SectorMaps[pDiskPath];
if (existing && existing->DeviceSize == pDiskSize) {
sectorMap = existing;
- } else {
+ } else {
sectorMap.Reset(new NPDisk::TSectorMap(pDiskSize));
nodeWardenConfig->SectorMaps[pDiskPath] = sectorMap;
- }
- } else {
- static TTempDir tempDir;
- pDiskPath = tempDir() + "/pdisk0.dat";
- }
- nodeWardenConfig->ServiceSet.MutablePDisks(0)->SetPath(pDiskPath);
- ui64 pDiskGuid = 1;
- static ui64 iteration = 0;
- ++iteration;
- FormatPDisk(pDiskPath,
- pDiskSize,
- 4 << 10,
- pDiskChunkSize,
- pDiskGuid,
+ }
+ } else {
+ static TTempDir tempDir;
+ pDiskPath = tempDir() + "/pdisk0.dat";
+ }
+ nodeWardenConfig->ServiceSet.MutablePDisks(0)->SetPath(pDiskPath);
+ ui64 pDiskGuid = 1;
+ static ui64 iteration = 0;
+ ++iteration;
+ FormatPDisk(pDiskPath,
+ pDiskSize,
+ 4 << 10,
+ pDiskChunkSize,
+ pDiskGuid,
0x1234567890 + iteration,
0x4567890123 + iteration,
0x7890123456 + iteration,
NPDisk::YdbDefaultPDiskSequence,
- TString(""),
- false,
+ TString(""),
+ false,
false,
sectorMap
);
- }
-
- SetupBSNodeWarden(runtime, nodeIndex, nodeWardenConfig);
- SetupTabletResolver(runtime, nodeIndex);
-
- // fake NodeWhiteBoard
- runtime.AddLocalService(NNodeWhiteboard::MakeNodeWhiteboardServiceId(runtime.GetNodeId(nodeIndex)),
- TActorSetupCmd(CreateFakeNodeWhiteboardService(), TMailboxType::Simple, 0), nodeIndex);
- TVector<TString> nodeTenants;
+ }
+
+ SetupBSNodeWarden(runtime, nodeIndex, nodeWardenConfig);
+ SetupTabletResolver(runtime, nodeIndex);
+
+ // fake NodeWhiteBoard
+ runtime.AddLocalService(NNodeWhiteboard::MakeNodeWhiteboardServiceId(runtime.GetNodeId(nodeIndex)),
+ TActorSetupCmd(CreateFakeNodeWhiteboardService(), TMailboxType::Simple, 0), nodeIndex);
+ TVector<TString> nodeTenants;
if (tenants.contains(nodeIndex))
- nodeTenants = tenants.at(nodeIndex);
- runtime.AddLocalService(MakeTenantPoolID(runtime.GetNodeId(nodeIndex)),
- TActorSetupCmd(new TFakeTenantPool(nodeTenants), TMailboxType::Simple, 0), nodeIndex);
- }
-
- runtime.Initialize(app.Unwrap());
-
+ nodeTenants = tenants.at(nodeIndex);
+ runtime.AddLocalService(MakeTenantPoolID(runtime.GetNodeId(nodeIndex)),
+ TActorSetupCmd(new TFakeTenantPool(nodeTenants), TMailboxType::Simple, 0), nodeIndex);
+ }
+
+ runtime.Initialize(app.Unwrap());
+
auto dnsConfig = new TDynamicNameserviceConfig();
dnsConfig->MaxStaticNodeId = 1000;
dnsConfig->MaxDynamicNodeId = 2000;
runtime.GetAppData().DynamicNameserviceConfig = dnsConfig;
- if (!runtime.IsRealThreads()) {
- TDispatchOptions options;
- options.FinalEvents.push_back(TDispatchOptions::TFinalEventCondition(TEvBlobStorage::EvLocalRecoveryDone,
- domainsNum * disksInDomain));
- runtime.DispatchEvents(options);
- }
-
+ if (!runtime.IsRealThreads()) {
+ TDispatchOptions options;
+ options.FinalEvents.push_back(TDispatchOptions::TFinalEventCondition(TEvBlobStorage::EvLocalRecoveryDone,
+ domainsNum * disksInDomain));
+ runtime.DispatchEvents(options);
+ }
+
CreateTestBootstrapper(runtime, CreateTestTabletInfo(MakeBSControllerID(0), TTabletTypes::FLAT_BS_CONTROLLER),
- &CreateFlatBsController);
-
+ &CreateFlatBsController);
+
auto aid = CreateTestBootstrapper(runtime, CreateTestTabletInfo(MakeCmsID(0), TTabletTypes::CMS), &CreateCms);
- runtime.EnableScheduleForActor(aid, true);
-}
-
-} // anonymous namespace
-
-TCmsTestEnv::TCmsTestEnv(ui32 nodeCount,
- ui32 pdisks,
- const TNodeTenantsMap &tenants)
- : TTestBasicRuntime(nodeCount, false)
- , CmsId(MakeCmsID(0))
-{
- TFakeNodeWhiteboardService::Config.MutableResponse()->SetSuccess(true);
- TFakeNodeWhiteboardService::Config.MutableResponse()->ClearStatus();
- auto &status = *TFakeNodeWhiteboardService::Config.MutableResponse()->AddStatus();
- status.SetSuccess(true);
+ runtime.EnableScheduleForActor(aid, true);
+}
+
+} // anonymous namespace
+
+TCmsTestEnv::TCmsTestEnv(ui32 nodeCount,
+ ui32 pdisks,
+ const TNodeTenantsMap &tenants)
+ : TTestBasicRuntime(nodeCount, false)
+ , CmsId(MakeCmsID(0))
+{
+ TFakeNodeWhiteboardService::Config.MutableResponse()->SetSuccess(true);
+ TFakeNodeWhiteboardService::Config.MutableResponse()->ClearStatus();
+ auto &status = *TFakeNodeWhiteboardService::Config.MutableResponse()->AddStatus();
+ status.SetSuccess(true);
auto *config = status.MutableBaseConfig();
-
+
GenerateExtendedInfo(*this, config, pdisks, 4, tenants);
-
- // Set observer to pass fake base blobstorage config.
+
+ // Set observer to pass fake base blobstorage config.
auto redirectConfigRequest = [](TTestActorRuntimeBase&,
- TAutoPtr<IEventHandle> &event) -> auto {
- if (event->GetTypeRewrite() == TEvBlobStorage::EvControllerConfigRequest) {
- auto fakeId = NNodeWhiteboard::MakeNodeWhiteboardServiceId(event->Recipient.NodeId());
- if (event->Recipient != fakeId)
- event = event->Forward(fakeId);
- }
- return TTestActorRuntime::EEventAction::PROCESS;
- };
- SetObserverFunc(redirectConfigRequest);
-
- using namespace NMalloc;
- TMallocInfo mallocInfo = MallocInfo();
- mallocInfo.SetParam("FillMemoryOnAllocation", "false");
- SetupLogging();
- SetupServices(*this, tenants);
-
- Sender = AllocateEdgeActor();
-
+ TAutoPtr<IEventHandle> &event) -> auto {
+ if (event->GetTypeRewrite() == TEvBlobStorage::EvControllerConfigRequest) {
+ auto fakeId = NNodeWhiteboard::MakeNodeWhiteboardServiceId(event->Recipient.NodeId());
+ if (event->Recipient != fakeId)
+ event = event->Forward(fakeId);
+ }
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+ SetObserverFunc(redirectConfigRequest);
+
+ using namespace NMalloc;
+ TMallocInfo mallocInfo = MallocInfo();
+ mallocInfo.SetParam("FillMemoryOnAllocation", "false");
+ SetupLogging();
+ SetupServices(*this, tenants);
+
+ Sender = AllocateEdgeActor();
+
NKikimrCms::TCmsConfig cmsConfig;
cmsConfig.MutableTenantLimits()->SetDisabledNodesRatioLimit(0);
cmsConfig.MutableClusterLimits()->SetDisabledNodesRatioLimit(0);
SetCmsConfig(cmsConfig);
-}
-
-TCmsTestEnv::TCmsTestEnv(ui32 nodeCount,
- const TNodeTenantsMap &tenants)
+}
+
+TCmsTestEnv::TCmsTestEnv(ui32 nodeCount,
+ const TNodeTenantsMap &tenants)
: TCmsTestEnv(nodeCount, 0, tenants)
-{
-}
-
-void TCmsTestEnv::SetupLogging()
-{
- NActors::NLog::EPriority priority = ENABLE_DETAILED_CMS_LOG ? NLog::PRI_DEBUG : NLog::PRI_ERROR;
-
- SetLogPriority(NKikimrServices::CMS, priority);
-}
-
-NCms::TPDiskID TCmsTestEnv::PDiskId(ui32 nodeIndex, ui32 pdiskIndex)
-{
- auto pdisks = TFakeNodeWhiteboardService::Info.begin()->second.PDiskStateInfo.size();
- return NCms::TPDiskID(GetNodeId(nodeIndex), GetNodeId(nodeIndex) * pdisks + pdiskIndex);
-}
-
-TString TCmsTestEnv::PDiskName(ui32 nodeIndex, ui32 pdiskIndex)
-{
- auto id = PDiskId(nodeIndex, pdiskIndex);
- return Sprintf("pdisk-%" PRIu32 "-%" PRIu32, id.NodeId, id.DiskId);
-}
-
-void TCmsTestEnv::RestartCms()
-{
- Register(CreateTabletKiller(CmsId));
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- DispatchEvents(options);
-}
-
-void TCmsTestEnv::SendRestartCms()
-{
- Register(CreateTabletKiller(CmsId));
-}
-
-void TCmsTestEnv::SendToCms(IEventBase *event)
-{
- SendToPipe(CmsId, Sender, event, 0, GetPipeConfigWithRetries());
-}
-
-NKikimrCms::TCmsConfig TCmsTestEnv::GetCmsConfig()
-{
- auto *request = new TEvCms::TEvGetConfigRequest;
- SendToPipe(CmsId, Sender, request, 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvGetConfigResponse>(handle);
- UNIT_ASSERT(reply);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), TStatus::OK);
-
- return reply->Record.GetConfig();
-}
-
-void TCmsTestEnv::SendCmsConfig(const NKikimrCms::TCmsConfig &config)
-{
- auto *request = new TEvCms::TEvSetConfigRequest;
- request->Record.MutableConfig()->CopyFrom(config);
- SendToPipe(CmsId, Sender, request, 0, GetPipeConfigWithRetries());
-}
-
-void TCmsTestEnv::SetCmsConfig(const NKikimrCms::TCmsConfig &config)
-{
- SendCmsConfig(config);
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvSetConfigResponse>(handle);
- UNIT_ASSERT(reply);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), TStatus::OK);
-}
-
-void TCmsTestEnv::SetLimits(ui32 tenantLimit,
- ui32 tenantRatioLimit,
- ui32 clusterLimit,
- ui32 clusterRatioLimit)
-{
- NKikimrCms::TCmsConfig config = GetCmsConfig();
- config.MutableTenantLimits()->SetDisabledNodesLimit(tenantLimit);
- config.MutableTenantLimits()->SetDisabledNodesRatioLimit(tenantRatioLimit);
- config.MutableClusterLimits()->SetDisabledNodesLimit(clusterLimit);
- config.MutableClusterLimits()->SetDisabledNodesRatioLimit(clusterRatioLimit);
- SetCmsConfig(config);
-}
-
-NKikimrCms::TClusterState
-TCmsTestEnv::RequestState(const NKikimrCms::TClusterStateRequest &request,
- NKikimrCms::TStatus::ECode code)
-{
- TAutoPtr<TEvCms::TEvClusterStateRequest> event = new TEvCms::TEvClusterStateRequest;
- event->Record.CopyFrom(request);
- SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvClusterStateResponse>(handle);
- UNIT_ASSERT(reply);
-
- const auto &rec = reply->Record;
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
-
- return rec.GetState();
-}
-
-std::pair<TString, TVector<TString>>
-TCmsTestEnv::ExtractPermissions(const NKikimrCms::TPermissionResponse &response)
-{
- TVector<TString> ids;
- for (auto &perm : response.GetPermissions())
- ids.push_back(perm.GetId());
-
- return std::make_pair(response.GetRequestId(), ids);
-}
-
-NKikimrCms::TPermissionResponse
-TCmsTestEnv::CheckPermissionRequest(TAutoPtr<NCms::TEvCms::TEvPermissionRequest> req,
- NKikimrCms::TStatus::ECode code)
-{
- SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvPermissionResponse>(handle);
- const auto &rec = reply->Record;
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
- return rec;
-}
-
-NKikimrCms::TManagePermissionResponse
-TCmsTestEnv::CheckManagePermissionRequest(const TString &user,
- NKikimrCms::TManagePermissionRequest::ECommand cmd,
- bool dry,
- NKikimrCms::TStatus::ECode code)
-{
- auto req = MakeManagePermissionRequest(user, cmd, dry);
- return CheckManagePermissionRequest(req, code);
-}
-
-NKikimrCms::TManagePermissionResponse
-TCmsTestEnv::CheckManagePermissionRequest(TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest> req,
- NKikimrCms::TStatus::ECode code)
-{
- SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvManagePermissionResponse>(handle);
- const auto &rec = reply->Record;
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
- return rec;
-}
-
-NKikimrCms::TManageRequestResponse
-TCmsTestEnv::CheckManageRequestRequest(TAutoPtr<NCms::TEvCms::TEvManageRequestRequest> req,
- NKikimrCms::TStatus::ECode code)
-{
- SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvManageRequestResponse>(handle);
- const auto &rec = reply->Record;
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
- return rec;
-}
-
-NKikimrCms::TManagePermissionResponse
-TCmsTestEnv::CheckListPermissions(const TString &user, ui64 count)
-{
- auto rec = CheckManagePermissionRequest(user, TManagePermissionRequest::LIST);
- UNIT_ASSERT_VALUES_EQUAL(rec.PermissionsSize(), count);
- return rec;
-}
-
-void TCmsTestEnv::CheckDonePermission(const TString &user,
- const TString &id,
- bool dry,
- NKikimrCms::TStatus::ECode code)
-{
- CheckManagePermissionRequest(user, TManagePermissionRequest::DONE, dry, code, id);
-}
-
-void TCmsTestEnv::CheckRejectPermission(const TString &user,
- const TString &id,
- bool dry,
- NKikimrCms::TStatus::ECode code)
-{
- CheckManagePermissionRequest(user, TManagePermissionRequest::REJECT, dry, code, id);
-}
-
-NKikimrCms::TManagePermissionResponse
-TCmsTestEnv::CheckGetPermission(const TString &user,
- const TString &id,
- bool dry,
- NKikimrCms::TStatus::ECode code)
-{
- return CheckManagePermissionRequest(user, TManagePermissionRequest::GET, dry, code, id);
-}
-
-NKikimrCms::TManageRequestResponse
-TCmsTestEnv::CheckGetRequest(const TString &user,
- const TString &id,
- bool dry,
- NKikimrCms::TStatus::ECode code)
-{
- auto req = MakeManageRequestRequest(user, TManageRequestRequest::GET, id, dry);
- return CheckManageRequestRequest(req, code);
-}
-
-void TCmsTestEnv::CheckRejectRequest(const TString &user,
- const TString &id,
- bool dry,
- NKikimrCms::TStatus::ECode code)
-{
- auto req = MakeManageRequestRequest(user, TManageRequestRequest::REJECT, id, dry);
- CheckManageRequestRequest(req, code);
-}
-
-NKikimrCms::TManageRequestResponse
-TCmsTestEnv::CheckListRequests(const TString &user,
- ui64 count)
-{
- auto req = MakeManageRequestRequest(user, TManageRequestRequest::LIST, false);
- auto rec = CheckManageRequestRequest(req, TStatus::OK);
- UNIT_ASSERT_VALUES_EQUAL(rec.RequestsSize(), count);
- return rec;
-}
-
-NKikimrCms::TPermissionResponse
-TCmsTestEnv::CheckRequest(const TString &user,
- TString id,
- bool dry,
- NKikimrCms::EAvailabilityMode availabilityMode,
- TStatus::ECode res,
- size_t count)
-{
- auto request = MakeCheckRequest(user, id, dry, availabilityMode);
- SendToPipe(CmsId, Sender, request.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvPermissionResponse>(handle);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), res);
- UNIT_ASSERT_VALUES_EQUAL(rec.PermissionsSize(), count);
-
- return rec;
-}
-
-void TCmsTestEnv::CheckWalleCreateTask(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> req,
- NKikimrCms::TStatus::ECode code)
-{
- auto id = req->Record.GetTaskId();
- TSet<TString> hosts;
- for (auto &host : req->Record.GetHosts())
- hosts.insert(host);
- SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleCreateTaskResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- if (rec.GetStatus().GetCode() == TStatus::ERROR_TEMP && rec.GetStatus().GetReason() == "Timeout")
- return CheckWalleCreateTask(req, code);
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetTaskId(), id);
- UNIT_ASSERT_VALUES_EQUAL(rec.HostsSize(), hosts.size());
- for (auto &host : rec.GetHosts())
+{
+}
+
+void TCmsTestEnv::SetupLogging()
+{
+ NActors::NLog::EPriority priority = ENABLE_DETAILED_CMS_LOG ? NLog::PRI_DEBUG : NLog::PRI_ERROR;
+
+ SetLogPriority(NKikimrServices::CMS, priority);
+}
+
+NCms::TPDiskID TCmsTestEnv::PDiskId(ui32 nodeIndex, ui32 pdiskIndex)
+{
+ auto pdisks = TFakeNodeWhiteboardService::Info.begin()->second.PDiskStateInfo.size();
+ return NCms::TPDiskID(GetNodeId(nodeIndex), GetNodeId(nodeIndex) * pdisks + pdiskIndex);
+}
+
+TString TCmsTestEnv::PDiskName(ui32 nodeIndex, ui32 pdiskIndex)
+{
+ auto id = PDiskId(nodeIndex, pdiskIndex);
+ return Sprintf("pdisk-%" PRIu32 "-%" PRIu32, id.NodeId, id.DiskId);
+}
+
+void TCmsTestEnv::RestartCms()
+{
+ Register(CreateTabletKiller(CmsId));
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ DispatchEvents(options);
+}
+
+void TCmsTestEnv::SendRestartCms()
+{
+ Register(CreateTabletKiller(CmsId));
+}
+
+void TCmsTestEnv::SendToCms(IEventBase *event)
+{
+ SendToPipe(CmsId, Sender, event, 0, GetPipeConfigWithRetries());
+}
+
+NKikimrCms::TCmsConfig TCmsTestEnv::GetCmsConfig()
+{
+ auto *request = new TEvCms::TEvGetConfigRequest;
+ SendToPipe(CmsId, Sender, request, 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvGetConfigResponse>(handle);
+ UNIT_ASSERT(reply);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), TStatus::OK);
+
+ return reply->Record.GetConfig();
+}
+
+void TCmsTestEnv::SendCmsConfig(const NKikimrCms::TCmsConfig &config)
+{
+ auto *request = new TEvCms::TEvSetConfigRequest;
+ request->Record.MutableConfig()->CopyFrom(config);
+ SendToPipe(CmsId, Sender, request, 0, GetPipeConfigWithRetries());
+}
+
+void TCmsTestEnv::SetCmsConfig(const NKikimrCms::TCmsConfig &config)
+{
+ SendCmsConfig(config);
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvSetConfigResponse>(handle);
+ UNIT_ASSERT(reply);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), TStatus::OK);
+}
+
+void TCmsTestEnv::SetLimits(ui32 tenantLimit,
+ ui32 tenantRatioLimit,
+ ui32 clusterLimit,
+ ui32 clusterRatioLimit)
+{
+ NKikimrCms::TCmsConfig config = GetCmsConfig();
+ config.MutableTenantLimits()->SetDisabledNodesLimit(tenantLimit);
+ config.MutableTenantLimits()->SetDisabledNodesRatioLimit(tenantRatioLimit);
+ config.MutableClusterLimits()->SetDisabledNodesLimit(clusterLimit);
+ config.MutableClusterLimits()->SetDisabledNodesRatioLimit(clusterRatioLimit);
+ SetCmsConfig(config);
+}
+
+NKikimrCms::TClusterState
+TCmsTestEnv::RequestState(const NKikimrCms::TClusterStateRequest &request,
+ NKikimrCms::TStatus::ECode code)
+{
+ TAutoPtr<TEvCms::TEvClusterStateRequest> event = new TEvCms::TEvClusterStateRequest;
+ event->Record.CopyFrom(request);
+ SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvClusterStateResponse>(handle);
+ UNIT_ASSERT(reply);
+
+ const auto &rec = reply->Record;
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+
+ return rec.GetState();
+}
+
+std::pair<TString, TVector<TString>>
+TCmsTestEnv::ExtractPermissions(const NKikimrCms::TPermissionResponse &response)
+{
+ TVector<TString> ids;
+ for (auto &perm : response.GetPermissions())
+ ids.push_back(perm.GetId());
+
+ return std::make_pair(response.GetRequestId(), ids);
+}
+
+NKikimrCms::TPermissionResponse
+TCmsTestEnv::CheckPermissionRequest(TAutoPtr<NCms::TEvCms::TEvPermissionRequest> req,
+ NKikimrCms::TStatus::ECode code)
+{
+ SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvPermissionResponse>(handle);
+ const auto &rec = reply->Record;
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+ return rec;
+}
+
+NKikimrCms::TManagePermissionResponse
+TCmsTestEnv::CheckManagePermissionRequest(const TString &user,
+ NKikimrCms::TManagePermissionRequest::ECommand cmd,
+ bool dry,
+ NKikimrCms::TStatus::ECode code)
+{
+ auto req = MakeManagePermissionRequest(user, cmd, dry);
+ return CheckManagePermissionRequest(req, code);
+}
+
+NKikimrCms::TManagePermissionResponse
+TCmsTestEnv::CheckManagePermissionRequest(TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest> req,
+ NKikimrCms::TStatus::ECode code)
+{
+ SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvManagePermissionResponse>(handle);
+ const auto &rec = reply->Record;
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+ return rec;
+}
+
+NKikimrCms::TManageRequestResponse
+TCmsTestEnv::CheckManageRequestRequest(TAutoPtr<NCms::TEvCms::TEvManageRequestRequest> req,
+ NKikimrCms::TStatus::ECode code)
+{
+ SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvManageRequestResponse>(handle);
+ const auto &rec = reply->Record;
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+ return rec;
+}
+
+NKikimrCms::TManagePermissionResponse
+TCmsTestEnv::CheckListPermissions(const TString &user, ui64 count)
+{
+ auto rec = CheckManagePermissionRequest(user, TManagePermissionRequest::LIST);
+ UNIT_ASSERT_VALUES_EQUAL(rec.PermissionsSize(), count);
+ return rec;
+}
+
+void TCmsTestEnv::CheckDonePermission(const TString &user,
+ const TString &id,
+ bool dry,
+ NKikimrCms::TStatus::ECode code)
+{
+ CheckManagePermissionRequest(user, TManagePermissionRequest::DONE, dry, code, id);
+}
+
+void TCmsTestEnv::CheckRejectPermission(const TString &user,
+ const TString &id,
+ bool dry,
+ NKikimrCms::TStatus::ECode code)
+{
+ CheckManagePermissionRequest(user, TManagePermissionRequest::REJECT, dry, code, id);
+}
+
+NKikimrCms::TManagePermissionResponse
+TCmsTestEnv::CheckGetPermission(const TString &user,
+ const TString &id,
+ bool dry,
+ NKikimrCms::TStatus::ECode code)
+{
+ return CheckManagePermissionRequest(user, TManagePermissionRequest::GET, dry, code, id);
+}
+
+NKikimrCms::TManageRequestResponse
+TCmsTestEnv::CheckGetRequest(const TString &user,
+ const TString &id,
+ bool dry,
+ NKikimrCms::TStatus::ECode code)
+{
+ auto req = MakeManageRequestRequest(user, TManageRequestRequest::GET, id, dry);
+ return CheckManageRequestRequest(req, code);
+}
+
+void TCmsTestEnv::CheckRejectRequest(const TString &user,
+ const TString &id,
+ bool dry,
+ NKikimrCms::TStatus::ECode code)
+{
+ auto req = MakeManageRequestRequest(user, TManageRequestRequest::REJECT, id, dry);
+ CheckManageRequestRequest(req, code);
+}
+
+NKikimrCms::TManageRequestResponse
+TCmsTestEnv::CheckListRequests(const TString &user,
+ ui64 count)
+{
+ auto req = MakeManageRequestRequest(user, TManageRequestRequest::LIST, false);
+ auto rec = CheckManageRequestRequest(req, TStatus::OK);
+ UNIT_ASSERT_VALUES_EQUAL(rec.RequestsSize(), count);
+ return rec;
+}
+
+NKikimrCms::TPermissionResponse
+TCmsTestEnv::CheckRequest(const TString &user,
+ TString id,
+ bool dry,
+ NKikimrCms::EAvailabilityMode availabilityMode,
+ TStatus::ECode res,
+ size_t count)
+{
+ auto request = MakeCheckRequest(user, id, dry, availabilityMode);
+ SendToPipe(CmsId, Sender, request.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvPermissionResponse>(handle);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), res);
+ UNIT_ASSERT_VALUES_EQUAL(rec.PermissionsSize(), count);
+
+ return rec;
+}
+
+void TCmsTestEnv::CheckWalleCreateTask(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> req,
+ NKikimrCms::TStatus::ECode code)
+{
+ auto id = req->Record.GetTaskId();
+ TSet<TString> hosts;
+ for (auto &host : req->Record.GetHosts())
+ hosts.insert(host);
+ SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleCreateTaskResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ if (rec.GetStatus().GetCode() == TStatus::ERROR_TEMP && rec.GetStatus().GetReason() == "Timeout")
+ return CheckWalleCreateTask(req, code);
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetTaskId(), id);
+ UNIT_ASSERT_VALUES_EQUAL(rec.HostsSize(), hosts.size());
+ for (auto &host : rec.GetHosts())
UNIT_ASSERT(hosts.contains(host));
-}
-
-void TCmsTestEnv::CheckTasksEqual(const NKikimrCms::TWalleTaskInfo &l,
- const NKikimrCms::TWalleTaskInfo &r)
-{
- UNIT_ASSERT_VALUES_EQUAL(l.GetTaskId(), r.GetTaskId());
- UNIT_ASSERT_VALUES_EQUAL(l.GetStatus(), r.GetStatus());
- UNIT_ASSERT_VALUES_EQUAL(l.HostsSize(), r.HostsSize());
- TSet<TString> lh;
- TSet<TString> rh;
- for (auto &host : l.GetHosts())
- lh.insert(host);
- for (auto &host : r.GetHosts())
- rh.insert(host);
- UNIT_ASSERT_VALUES_EQUAL(lh, rh);
-}
-
-void TCmsTestEnv::CheckWalleListTasks(const NKikimrCms::TWalleTaskInfo &task)
-{
- TAutoPtr<TEvCms::TEvWalleListTasksRequest> event
- = new TEvCms::TEvWalleListTasksRequest;
- SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleListTasksResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.TasksSize(), 1);
- CheckTasksEqual(rec.GetTasks(0), task);
-}
-
-ui64 TCmsTestEnv::CountWalleTasks()
-{
- TAutoPtr<TEvCms::TEvWalleListTasksRequest> event
- = new TEvCms::TEvWalleListTasksRequest;
- SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleListTasksResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- return rec.TasksSize();
-}
-
-void TCmsTestEnv::CheckWalleListTasks(size_t count)
-{
- UNIT_ASSERT_VALUES_EQUAL(CountWalleTasks(), count);
-}
-
-void TCmsTestEnv::CheckWalleCheckTask(const TString &id,
- TStatus::ECode code,
- NKikimrCms::TWalleTaskInfo task)
-{
- TAutoPtr<TEvCms::TEvWalleCheckTaskRequest> event
- = new TEvCms::TEvWalleCheckTaskRequest;
- event->Record.SetTaskId(id);
- SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleCheckTaskResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
- task.SetStatus(rec.GetTask().GetStatus());
- CheckTasksEqual(rec.GetTask(), task);
-}
-
-void TCmsTestEnv::CheckWalleCheckTask(const TString &id,
- TStatus::ECode code)
-{
- TAutoPtr<TEvCms::TEvWalleCheckTaskRequest> event
- = new TEvCms::TEvWalleCheckTaskRequest;
- event->Record.SetTaskId(id);
- SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleCheckTaskResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
-}
-
-void TCmsTestEnv::CheckWalleRemoveTask(const TString &id,
- TStatus::ECode code)
-{
- TAutoPtr<TEvCms::TEvWalleRemoveTaskRequest> event
- = new TEvCms::TEvWalleRemoveTaskRequest;
- event->Record.SetTaskId(id);
- SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleRemoveTaskResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
-}
-
-TString TCmsTestEnv::CheckNotification(TAutoPtr<TEvCms::TEvNotification> req,
- TStatus::ECode code)
-{
- SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvNotificationResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
-
- return rec.GetNotificationId();
-}
-
-void TCmsTestEnv::CheckSetMarker(TAutoPtr<NCms::TEvCms::TEvSetMarkerRequest> req,
- NKikimrCms::TStatus::ECode code)
-{
- SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvSetMarkerResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
-}
-
-void TCmsTestEnv::CheckResetMarker(TAutoPtr<NCms::TEvCms::TEvResetMarkerRequest> req,
- NKikimrCms::TStatus::ECode code)
-{
- SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvResetMarkerResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
-}
-
-void TCmsTestEnv::CheckGetNotification(const TString &user,
- const TString &id,
- TStatus::ECode code)
-{
- TAutoPtr<TEvCms::TEvManageNotificationRequest> event
- = new TEvCms::TEvManageNotificationRequest;
- event->Record.SetCommand(TManageNotificationRequest::GET);
- if (user)
- event->Record.SetUser(user);
- if (id)
- event->Record.SetNotificationId(id);
-
- SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvManageNotificationResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
-}
-
-void TCmsTestEnv::CheckListNotifications(const TString &user,
- TStatus::ECode code,
- ui32 count)
-{
- TAutoPtr<TEvCms::TEvManageNotificationRequest> event
- = new TEvCms::TEvManageNotificationRequest;
- event->Record.SetCommand(TManageNotificationRequest::LIST);
- if (user)
- event->Record.SetUser(user);
-
- SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvManageNotificationResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
- UNIT_ASSERT_VALUES_EQUAL(rec.NotificationsSize(), count);
-}
-
-void TCmsTestEnv::CheckRejectNotification(const TString &user,
- const TString &id,
- TStatus::ECode code,
- bool dry)
-{
- TAutoPtr<TEvCms::TEvManageNotificationRequest> event
- = new TEvCms::TEvManageNotificationRequest;
- event->Record.SetCommand(TManageNotificationRequest::REJECT);
- if (user)
- event->Record.SetUser(user);
- if (id)
- event->Record.SetNotificationId(id);
- if (dry)
- event->Record.SetDryRun(dry);
-
- SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvManageNotificationResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
-}
-
-void TCmsTestEnv::WaitUpdatDiskStatus(ui32 statusEventsCount,
- NKikimrBlobStorage::EDriveStatus newStatus)
-{
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TIsUpdateStatusConfigRequest(newStatus), statusEventsCount);
- UNIT_ASSERT(DispatchEvents(options));
-}
-
-void TCmsTestEnv::EnableBSBaseConfig()
-{
- TFakeNodeWhiteboardService::Config.MutableResponse()->SetSuccess(true);
- if (TFakeNodeWhiteboardService::Config.MutableResponse()->StatusSize())
- TFakeNodeWhiteboardService::Config.MutableResponse()->MutableStatus(0)->SetSuccess(true);
-}
-
-void TCmsTestEnv::DisableBSBaseConfig()
-{
- TFakeNodeWhiteboardService::Config.MutableResponse()->SetSuccess(false);
- if (TFakeNodeWhiteboardService::Config.MutableResponse()->StatusSize())
- TFakeNodeWhiteboardService::Config.MutableResponse()->MutableStatus(0)->SetSuccess(false);
-}
-
-NKikimrCms::TGetLogTailResponse TCmsTestEnv::GetLogTail(ui32 type,
- TInstant from,
- TInstant to,
- ui32 limit,
- ui32 offset)
-{
- TAutoPtr<TEvCms::TEvGetLogTailRequest> event
- = new TEvCms::TEvGetLogTailRequest;
- event->Record.SetIncludeData(true);
- auto &filter = *event->Record.MutableLogFilter();
- filter.SetRecordType(type);
- filter.SetMinTimestamp(from.GetValue());
- filter.SetMaxTimestamp(to.GetValue());
- filter.SetLimit(limit);
- filter.SetOffset(offset);
-
- SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvCms::TEvGetLogTailResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), TStatus::OK);
-
- return rec;
-}
-
-
-} // namespace NCmsTest
-} // namespace NKikimr
+}
+
+void TCmsTestEnv::CheckTasksEqual(const NKikimrCms::TWalleTaskInfo &l,
+ const NKikimrCms::TWalleTaskInfo &r)
+{
+ UNIT_ASSERT_VALUES_EQUAL(l.GetTaskId(), r.GetTaskId());
+ UNIT_ASSERT_VALUES_EQUAL(l.GetStatus(), r.GetStatus());
+ UNIT_ASSERT_VALUES_EQUAL(l.HostsSize(), r.HostsSize());
+ TSet<TString> lh;
+ TSet<TString> rh;
+ for (auto &host : l.GetHosts())
+ lh.insert(host);
+ for (auto &host : r.GetHosts())
+ rh.insert(host);
+ UNIT_ASSERT_VALUES_EQUAL(lh, rh);
+}
+
+void TCmsTestEnv::CheckWalleListTasks(const NKikimrCms::TWalleTaskInfo &task)
+{
+ TAutoPtr<TEvCms::TEvWalleListTasksRequest> event
+ = new TEvCms::TEvWalleListTasksRequest;
+ SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleListTasksResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.TasksSize(), 1);
+ CheckTasksEqual(rec.GetTasks(0), task);
+}
+
+ui64 TCmsTestEnv::CountWalleTasks()
+{
+ TAutoPtr<TEvCms::TEvWalleListTasksRequest> event
+ = new TEvCms::TEvWalleListTasksRequest;
+ SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleListTasksResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ return rec.TasksSize();
+}
+
+void TCmsTestEnv::CheckWalleListTasks(size_t count)
+{
+ UNIT_ASSERT_VALUES_EQUAL(CountWalleTasks(), count);
+}
+
+void TCmsTestEnv::CheckWalleCheckTask(const TString &id,
+ TStatus::ECode code,
+ NKikimrCms::TWalleTaskInfo task)
+{
+ TAutoPtr<TEvCms::TEvWalleCheckTaskRequest> event
+ = new TEvCms::TEvWalleCheckTaskRequest;
+ event->Record.SetTaskId(id);
+ SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleCheckTaskResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+ task.SetStatus(rec.GetTask().GetStatus());
+ CheckTasksEqual(rec.GetTask(), task);
+}
+
+void TCmsTestEnv::CheckWalleCheckTask(const TString &id,
+ TStatus::ECode code)
+{
+ TAutoPtr<TEvCms::TEvWalleCheckTaskRequest> event
+ = new TEvCms::TEvWalleCheckTaskRequest;
+ event->Record.SetTaskId(id);
+ SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleCheckTaskResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+}
+
+void TCmsTestEnv::CheckWalleRemoveTask(const TString &id,
+ TStatus::ECode code)
+{
+ TAutoPtr<TEvCms::TEvWalleRemoveTaskRequest> event
+ = new TEvCms::TEvWalleRemoveTaskRequest;
+ event->Record.SetTaskId(id);
+ SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvWalleRemoveTaskResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+}
+
+TString TCmsTestEnv::CheckNotification(TAutoPtr<TEvCms::TEvNotification> req,
+ TStatus::ECode code)
+{
+ SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvNotificationResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+
+ return rec.GetNotificationId();
+}
+
+void TCmsTestEnv::CheckSetMarker(TAutoPtr<NCms::TEvCms::TEvSetMarkerRequest> req,
+ NKikimrCms::TStatus::ECode code)
+{
+ SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvSetMarkerResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+}
+
+void TCmsTestEnv::CheckResetMarker(TAutoPtr<NCms::TEvCms::TEvResetMarkerRequest> req,
+ NKikimrCms::TStatus::ECode code)
+{
+ SendToPipe(CmsId, Sender, req.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvResetMarkerResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+}
+
+void TCmsTestEnv::CheckGetNotification(const TString &user,
+ const TString &id,
+ TStatus::ECode code)
+{
+ TAutoPtr<TEvCms::TEvManageNotificationRequest> event
+ = new TEvCms::TEvManageNotificationRequest;
+ event->Record.SetCommand(TManageNotificationRequest::GET);
+ if (user)
+ event->Record.SetUser(user);
+ if (id)
+ event->Record.SetNotificationId(id);
+
+ SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvManageNotificationResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+}
+
+void TCmsTestEnv::CheckListNotifications(const TString &user,
+ TStatus::ECode code,
+ ui32 count)
+{
+ TAutoPtr<TEvCms::TEvManageNotificationRequest> event
+ = new TEvCms::TEvManageNotificationRequest;
+ event->Record.SetCommand(TManageNotificationRequest::LIST);
+ if (user)
+ event->Record.SetUser(user);
+
+ SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvManageNotificationResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+ UNIT_ASSERT_VALUES_EQUAL(rec.NotificationsSize(), count);
+}
+
+void TCmsTestEnv::CheckRejectNotification(const TString &user,
+ const TString &id,
+ TStatus::ECode code,
+ bool dry)
+{
+ TAutoPtr<TEvCms::TEvManageNotificationRequest> event
+ = new TEvCms::TEvManageNotificationRequest;
+ event->Record.SetCommand(TManageNotificationRequest::REJECT);
+ if (user)
+ event->Record.SetUser(user);
+ if (id)
+ event->Record.SetNotificationId(id);
+ if (dry)
+ event->Record.SetDryRun(dry);
+
+ SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvManageNotificationResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+}
+
+void TCmsTestEnv::WaitUpdatDiskStatus(ui32 statusEventsCount,
+ NKikimrBlobStorage::EDriveStatus newStatus)
+{
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TIsUpdateStatusConfigRequest(newStatus), statusEventsCount);
+ UNIT_ASSERT(DispatchEvents(options));
+}
+
+void TCmsTestEnv::EnableBSBaseConfig()
+{
+ TFakeNodeWhiteboardService::Config.MutableResponse()->SetSuccess(true);
+ if (TFakeNodeWhiteboardService::Config.MutableResponse()->StatusSize())
+ TFakeNodeWhiteboardService::Config.MutableResponse()->MutableStatus(0)->SetSuccess(true);
+}
+
+void TCmsTestEnv::DisableBSBaseConfig()
+{
+ TFakeNodeWhiteboardService::Config.MutableResponse()->SetSuccess(false);
+ if (TFakeNodeWhiteboardService::Config.MutableResponse()->StatusSize())
+ TFakeNodeWhiteboardService::Config.MutableResponse()->MutableStatus(0)->SetSuccess(false);
+}
+
+NKikimrCms::TGetLogTailResponse TCmsTestEnv::GetLogTail(ui32 type,
+ TInstant from,
+ TInstant to,
+ ui32 limit,
+ ui32 offset)
+{
+ TAutoPtr<TEvCms::TEvGetLogTailRequest> event
+ = new TEvCms::TEvGetLogTailRequest;
+ event->Record.SetIncludeData(true);
+ auto &filter = *event->Record.MutableLogFilter();
+ filter.SetRecordType(type);
+ filter.SetMinTimestamp(from.GetValue());
+ filter.SetMaxTimestamp(to.GetValue());
+ filter.SetLimit(limit);
+ filter.SetOffset(offset);
+
+ SendToPipe(CmsId, Sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvCms::TEvGetLogTailResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), TStatus::OK);
+
+ return rec;
+}
+
+
+} // namespace NCmsTest
+} // namespace NKikimr
diff --git a/ydb/core/cms/cms_ut_common.h b/ydb/core/cms/cms_ut_common.h
index d4cd8b4e83a..f1f9c1a74db 100644
--- a/ydb/core/cms/cms_ut_common.h
+++ b/ydb/core/cms/cms_ut_common.h
@@ -1,369 +1,369 @@
#pragma once
-#include "cms.h"
-#include "ut_helpers.h"
-
+#include "cms.h"
+#include "ut_helpers.h"
+
#include <ydb/core/base/counters.h>
#include <ydb/core/node_whiteboard/node_whiteboard.h>
#include <ydb/core/mind/tenant_pool.h>
#include <ydb/core/testlib/basics/helpers.h>
#include <ydb/core/testlib/basics/runtime.h>
-
-#include <util/system/mutex.h>
-
-namespace NKikimr {
-namespace NCmsTest {
-
-using TNodeTenantsMap = THashMap<ui32, TVector<TString>>;
-
-struct TFakeNodeInfo {
- struct TVDiskIDComparator {
- bool operator ()(const TVDiskID& a, const TVDiskID& b) const {
- return std::make_tuple(a.GroupID, a.FailRealm, a.FailDomain, a.VDisk)
- < std::make_tuple(b.GroupID, b.FailRealm, b.FailDomain, b.VDisk);
- }
- };
-
+
+#include <util/system/mutex.h>
+
+namespace NKikimr {
+namespace NCmsTest {
+
+using TNodeTenantsMap = THashMap<ui32, TVector<TString>>;
+
+struct TFakeNodeInfo {
+ struct TVDiskIDComparator {
+ bool operator ()(const TVDiskID& a, const TVDiskID& b) const {
+ return std::make_tuple(a.GroupID, a.FailRealm, a.FailDomain, a.VDisk)
+ < std::make_tuple(b.GroupID, b.FailRealm, b.FailDomain, b.VDisk);
+ }
+ };
+
TMap<TTabletId, NKikimrWhiteboard::TTabletStateInfo> TabletStateInfo;
TMap<TString, NKikimrWhiteboard::TNodeStateInfo> NodeStateInfo;
TMap<ui32, NKikimrWhiteboard::TPDiskStateInfo> PDiskStateInfo;
TMap<TVDiskID, NKikimrWhiteboard::TVDiskStateInfo, TVDiskIDComparator> VDiskStateInfo;
NKikimrWhiteboard::TSystemStateInfo SystemStateInfo;
- bool Connected = true;
-};
-
-class TFakeNodeWhiteboardService : public TActorBootstrapped<TFakeNodeWhiteboardService> {
-public:
+ bool Connected = true;
+};
+
+class TFakeNodeWhiteboardService : public TActorBootstrapped<TFakeNodeWhiteboardService> {
+public:
using TEvWhiteboard = NNodeWhiteboard::TEvWhiteboard;
- static NKikimrBlobStorage::TEvControllerConfigResponse Config;
+ static NKikimrBlobStorage::TEvControllerConfigResponse Config;
static THashMap<ui32, TFakeNodeInfo> Info;
- static TMutex Mutex;
-
- void Bootstrap(const TActorContext &ctx)
- {
- Y_UNUSED(ctx);
- Become(&TFakeNodeWhiteboardService::StateWork);
- }
-
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvBlobStorage::TEvControllerConfigRequest, Handle);
- HFunc(TEvWhiteboard::TEvTabletStateRequest, Handle);
- HFunc(TEvWhiteboard::TEvNodeStateRequest, Handle);
- HFunc(TEvWhiteboard::TEvPDiskStateRequest, Handle);
- HFunc(TEvWhiteboard::TEvVDiskStateRequest, Handle);
- HFunc(TEvWhiteboard::TEvSystemStateRequest, Handle);
- }
- }
-
- void Handle(TEvBlobStorage::TEvControllerConfigRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvWhiteboard::TEvTabletStateRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvWhiteboard::TEvNodeStateRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvWhiteboard::TEvPDiskStateRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvWhiteboard::TEvVDiskStateRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvWhiteboard::TEvSystemStateRequest::TPtr &ev, const TActorContext &ctx);
-};
-
-class TCmsTestEnv : public TTestBasicRuntime {
-public:
- TCmsTestEnv(ui32 nodeCount,
- ui32 vdisks = 1,
- const TNodeTenantsMap &tenants = TNodeTenantsMap());
- TCmsTestEnv(ui32 nodeCount,
- const TNodeTenantsMap &tenants);
-
+ static TMutex Mutex;
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ Y_UNUSED(ctx);
+ Become(&TFakeNodeWhiteboardService::StateWork);
+ }
+
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvBlobStorage::TEvControllerConfigRequest, Handle);
+ HFunc(TEvWhiteboard::TEvTabletStateRequest, Handle);
+ HFunc(TEvWhiteboard::TEvNodeStateRequest, Handle);
+ HFunc(TEvWhiteboard::TEvPDiskStateRequest, Handle);
+ HFunc(TEvWhiteboard::TEvVDiskStateRequest, Handle);
+ HFunc(TEvWhiteboard::TEvSystemStateRequest, Handle);
+ }
+ }
+
+ void Handle(TEvBlobStorage::TEvControllerConfigRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvWhiteboard::TEvTabletStateRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvWhiteboard::TEvNodeStateRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvWhiteboard::TEvPDiskStateRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvWhiteboard::TEvVDiskStateRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvWhiteboard::TEvSystemStateRequest::TPtr &ev, const TActorContext &ctx);
+};
+
+class TCmsTestEnv : public TTestBasicRuntime {
+public:
+ TCmsTestEnv(ui32 nodeCount,
+ ui32 vdisks = 1,
+ const TNodeTenantsMap &tenants = TNodeTenantsMap());
+ TCmsTestEnv(ui32 nodeCount,
+ const TNodeTenantsMap &tenants);
+
TActorId GetSender() { return Sender; }
-
- NCms::TPDiskID PDiskId(ui32 nodeIndex, ui32 pdiskIndex = 0);
- TString PDiskName(ui32 nodeIndex, ui32 pdiskIndex = 0);
-
- void RestartCms();
- void SendRestartCms();
- void SendToCms(IEventBase *event);
-
- NKikimrCms::TCmsConfig GetCmsConfig();
- void SendCmsConfig(const NKikimrCms::TCmsConfig &config);
- void SetCmsConfig(const NKikimrCms::TCmsConfig &config);
- void SetLimits(ui32 tenantLimit,
- ui32 tenantRatioLimit,
- ui32 clusterLimit,
- ui32 clusterRatioLimit);
-
- NKikimrCms::TClusterState
- RequestState(const NKikimrCms::TClusterStateRequest &request = {},
- NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
-
- std::pair<TString, TVector<TString>>
- ExtractPermissions(const NKikimrCms::TPermissionResponse &response);
-
- template<typename... Ts>
- NKikimrCms::TPermissionResponse
- CheckPermissionRequest(const TString &user,
- bool partial,
- bool dry,
- bool schedule,
- bool defaultTenantPolicy,
- TDuration duration,
- NKikimrCms::EAvailabilityMode availabilityMode,
- NKikimrCms::TStatus::ECode code,
- Ts... actions)
- {
- auto req = MakePermissionRequest(user, partial, dry, schedule, actions...);
- if (!defaultTenantPolicy)
- req->Record.SetTenantPolicy(NKikimrCms::NONE);
- if (duration)
- req->Record.SetDuration(duration.GetValue());
- req->Record.SetAvailabilityMode(availabilityMode);
- return CheckPermissionRequest(req, code);
- }
- template<typename... Ts>
- NKikimrCms::TPermissionResponse
- CheckPermissionRequest(const TString &user,
- bool partial,
- bool dry,
- bool schedule,
- bool defaultTenantPolicy,
- NKikimrCms::EAvailabilityMode availabilityMode,
- NKikimrCms::TStatus::ECode code,
- Ts... actions)
- {
- return CheckPermissionRequest(user, partial, dry, schedule,
- defaultTenantPolicy, TDuration::Zero(),
- availabilityMode,
- code, actions...);
- }
- template<typename... Ts>
- NKikimrCms::TPermissionResponse
- CheckPermissionRequest(const TString &user,
- bool partial,
- bool dry,
- bool schedule,
- bool defaultTenantPolicy,
- TDuration duration,
- NKikimrCms::TStatus::ECode code,
- Ts... actions)
- {
- return CheckPermissionRequest(user, partial, dry, schedule,
- defaultTenantPolicy, duration,
- NKikimrCms::MODE_MAX_AVAILABILITY,
- code, actions...);
- }
- template<typename... Ts>
- NKikimrCms::TPermissionResponse
- CheckPermissionRequest(const TString &user,
- bool partial,
- bool dry,
- bool schedule,
- bool defaultTenantPolicy,
- NKikimrCms::TStatus::ECode code,
- Ts... actions)
- {
- return CheckPermissionRequest(user, partial, dry, schedule,
- defaultTenantPolicy,
- NKikimrCms::MODE_MAX_AVAILABILITY,
- code, actions...);
- }
-
- NKikimrCms::TManagePermissionResponse
- CheckManagePermissionRequest(const TString &user,
- NKikimrCms::TManagePermissionRequest::ECommand cmd,
- bool dry = false,
- NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
- template<typename... Ts>
- NKikimrCms::TManagePermissionResponse
- CheckManagePermissionRequest(const TString &user,
- NKikimrCms::TManagePermissionRequest::ECommand cmd,
- bool dry,
- NKikimrCms::TStatus::ECode code,
- Ts... ids )
- {
- auto req = MakeManagePermissionRequest(user, cmd, dry, ids...);
- return CheckManagePermissionRequest(req, code);
- }
-
- template<typename... Ts>
- void CheckDonePermission(const TString &user,
- bool dry,
- NKikimrCms::TStatus::ECode code,
- Ts... ids)
- {
- CheckManagePermissionRequest(user, NKikimrCms::TManagePermissionRequest::DONE, dry, code, ids...);
- }
-
- NKikimrCms::TManagePermissionResponse
- CheckListPermissions(const TString &user,
- ui64 count);
- void CheckDonePermission(const TString &user,
- const TString &id,
- bool dry = false,
- NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
- void CheckRejectPermission(const TString &user,
- const TString &id,
- bool dry = false,
- NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
- NKikimrCms::TManagePermissionResponse
- CheckGetPermission(const TString &user,
- const TString &id,
- bool dry = false,
- NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
-
- NKikimrCms::TManageRequestResponse
- CheckGetRequest(const TString &user,
- const TString &id,
- bool dry = false,
- NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
- void CheckRejectRequest(const TString &user,
- const TString &id,
- bool dry = false,
- NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
- NKikimrCms::TManageRequestResponse
- CheckListRequests(const TString &user,
- ui64 count);
-
- NKikimrCms::TPermissionResponse
- CheckRequest(const TString &user,
- TString id,
- bool dry,
- NKikimrCms::EAvailabilityMode availabilityMode,
- NKikimrCms::TStatus::ECode res,
- size_t count = 0);
- NKikimrCms::TPermissionResponse
- CheckRequest(const TString &user,
- TString id,
- bool dry,
- NKikimrCms::TStatus::ECode res,
- size_t count = 0)
- {
- return CheckRequest(user, id, dry, NKikimrCms::MODE_MAX_AVAILABILITY, res, count);
- }
-
- template<typename... Ts>
- void CheckWalleCreateTask(const TString &id,
- const TString &action,
- bool dry,
- NKikimrCms::TStatus::ECode code,
- Ts... nodes)
- {
- auto req = MakeWalleCreateRequest(id, action, dry, nodes...);
- CheckWalleCreateTask(req, code);
- }
-
- template<typename... Ts>
- void CheckWalleListTasks(const TString &id,
- const TString &status,
- Ts... nodes)
- {
- auto task = MakeTaskInfo(id, status, nodes...);
- CheckWalleListTasks(task);
- }
-
- template<typename... Ts>
- void CheckWalleCheckTask(const TString &id,
- NKikimrCms::TStatus::ECode code,
- Ts... nodes)
- {
- auto task = MakeTaskInfo(id, "", nodes...);
- CheckWalleCheckTask(id, code, task);
- }
-
- void CheckWalleCheckTask(const TString &id,
- NKikimrCms::TStatus::ECode code);
-
- ui64 CountWalleTasks();
-
- void CheckWalleListTasks(size_t count);
-
- void CheckWalleRemoveTask(const TString &id,
- NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
-
- template<typename... Ts>
- TString CheckNotification(NKikimrCms::TStatus::ECode code,
- const TString &user,
- TInstant when,
- Ts... actions)
- {
- auto req = MakeNotification(user, when, actions...);
- return CheckNotification(req, code);
+
+ NCms::TPDiskID PDiskId(ui32 nodeIndex, ui32 pdiskIndex = 0);
+ TString PDiskName(ui32 nodeIndex, ui32 pdiskIndex = 0);
+
+ void RestartCms();
+ void SendRestartCms();
+ void SendToCms(IEventBase *event);
+
+ NKikimrCms::TCmsConfig GetCmsConfig();
+ void SendCmsConfig(const NKikimrCms::TCmsConfig &config);
+ void SetCmsConfig(const NKikimrCms::TCmsConfig &config);
+ void SetLimits(ui32 tenantLimit,
+ ui32 tenantRatioLimit,
+ ui32 clusterLimit,
+ ui32 clusterRatioLimit);
+
+ NKikimrCms::TClusterState
+ RequestState(const NKikimrCms::TClusterStateRequest &request = {},
+ NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
+
+ std::pair<TString, TVector<TString>>
+ ExtractPermissions(const NKikimrCms::TPermissionResponse &response);
+
+ template<typename... Ts>
+ NKikimrCms::TPermissionResponse
+ CheckPermissionRequest(const TString &user,
+ bool partial,
+ bool dry,
+ bool schedule,
+ bool defaultTenantPolicy,
+ TDuration duration,
+ NKikimrCms::EAvailabilityMode availabilityMode,
+ NKikimrCms::TStatus::ECode code,
+ Ts... actions)
+ {
+ auto req = MakePermissionRequest(user, partial, dry, schedule, actions...);
+ if (!defaultTenantPolicy)
+ req->Record.SetTenantPolicy(NKikimrCms::NONE);
+ if (duration)
+ req->Record.SetDuration(duration.GetValue());
+ req->Record.SetAvailabilityMode(availabilityMode);
+ return CheckPermissionRequest(req, code);
+ }
+ template<typename... Ts>
+ NKikimrCms::TPermissionResponse
+ CheckPermissionRequest(const TString &user,
+ bool partial,
+ bool dry,
+ bool schedule,
+ bool defaultTenantPolicy,
+ NKikimrCms::EAvailabilityMode availabilityMode,
+ NKikimrCms::TStatus::ECode code,
+ Ts... actions)
+ {
+ return CheckPermissionRequest(user, partial, dry, schedule,
+ defaultTenantPolicy, TDuration::Zero(),
+ availabilityMode,
+ code, actions...);
+ }
+ template<typename... Ts>
+ NKikimrCms::TPermissionResponse
+ CheckPermissionRequest(const TString &user,
+ bool partial,
+ bool dry,
+ bool schedule,
+ bool defaultTenantPolicy,
+ TDuration duration,
+ NKikimrCms::TStatus::ECode code,
+ Ts... actions)
+ {
+ return CheckPermissionRequest(user, partial, dry, schedule,
+ defaultTenantPolicy, duration,
+ NKikimrCms::MODE_MAX_AVAILABILITY,
+ code, actions...);
+ }
+ template<typename... Ts>
+ NKikimrCms::TPermissionResponse
+ CheckPermissionRequest(const TString &user,
+ bool partial,
+ bool dry,
+ bool schedule,
+ bool defaultTenantPolicy,
+ NKikimrCms::TStatus::ECode code,
+ Ts... actions)
+ {
+ return CheckPermissionRequest(user, partial, dry, schedule,
+ defaultTenantPolicy,
+ NKikimrCms::MODE_MAX_AVAILABILITY,
+ code, actions...);
+ }
+
+ NKikimrCms::TManagePermissionResponse
+ CheckManagePermissionRequest(const TString &user,
+ NKikimrCms::TManagePermissionRequest::ECommand cmd,
+ bool dry = false,
+ NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
+ template<typename... Ts>
+ NKikimrCms::TManagePermissionResponse
+ CheckManagePermissionRequest(const TString &user,
+ NKikimrCms::TManagePermissionRequest::ECommand cmd,
+ bool dry,
+ NKikimrCms::TStatus::ECode code,
+ Ts... ids )
+ {
+ auto req = MakeManagePermissionRequest(user, cmd, dry, ids...);
+ return CheckManagePermissionRequest(req, code);
+ }
+
+ template<typename... Ts>
+ void CheckDonePermission(const TString &user,
+ bool dry,
+ NKikimrCms::TStatus::ECode code,
+ Ts... ids)
+ {
+ CheckManagePermissionRequest(user, NKikimrCms::TManagePermissionRequest::DONE, dry, code, ids...);
+ }
+
+ NKikimrCms::TManagePermissionResponse
+ CheckListPermissions(const TString &user,
+ ui64 count);
+ void CheckDonePermission(const TString &user,
+ const TString &id,
+ bool dry = false,
+ NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
+ void CheckRejectPermission(const TString &user,
+ const TString &id,
+ bool dry = false,
+ NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
+ NKikimrCms::TManagePermissionResponse
+ CheckGetPermission(const TString &user,
+ const TString &id,
+ bool dry = false,
+ NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
+
+ NKikimrCms::TManageRequestResponse
+ CheckGetRequest(const TString &user,
+ const TString &id,
+ bool dry = false,
+ NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
+ void CheckRejectRequest(const TString &user,
+ const TString &id,
+ bool dry = false,
+ NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
+ NKikimrCms::TManageRequestResponse
+ CheckListRequests(const TString &user,
+ ui64 count);
+
+ NKikimrCms::TPermissionResponse
+ CheckRequest(const TString &user,
+ TString id,
+ bool dry,
+ NKikimrCms::EAvailabilityMode availabilityMode,
+ NKikimrCms::TStatus::ECode res,
+ size_t count = 0);
+ NKikimrCms::TPermissionResponse
+ CheckRequest(const TString &user,
+ TString id,
+ bool dry,
+ NKikimrCms::TStatus::ECode res,
+ size_t count = 0)
+ {
+ return CheckRequest(user, id, dry, NKikimrCms::MODE_MAX_AVAILABILITY, res, count);
+ }
+
+ template<typename... Ts>
+ void CheckWalleCreateTask(const TString &id,
+ const TString &action,
+ bool dry,
+ NKikimrCms::TStatus::ECode code,
+ Ts... nodes)
+ {
+ auto req = MakeWalleCreateRequest(id, action, dry, nodes...);
+ CheckWalleCreateTask(req, code);
+ }
+
+ template<typename... Ts>
+ void CheckWalleListTasks(const TString &id,
+ const TString &status,
+ Ts... nodes)
+ {
+ auto task = MakeTaskInfo(id, status, nodes...);
+ CheckWalleListTasks(task);
+ }
+
+ template<typename... Ts>
+ void CheckWalleCheckTask(const TString &id,
+ NKikimrCms::TStatus::ECode code,
+ Ts... nodes)
+ {
+ auto task = MakeTaskInfo(id, "", nodes...);
+ CheckWalleCheckTask(id, code, task);
}
- void CheckGetNotification(const TString &user,
- const TString &id,
- NKikimrCms::TStatus::ECode code);
- void CheckListNotifications(const TString &user,
- NKikimrCms::TStatus::ECode code,
- ui32 count);
- void CheckRejectNotification(const TString &user,
- const TString &id,
- NKikimrCms::TStatus::ECode code,
- bool dry = false);
-
- void WaitUpdatDiskStatus(ui32 statusEventsCount,
- NKikimrBlobStorage::EDriveStatus newStatus = NKikimrBlobStorage::ACTIVE);
-
- template <typename... Ts>
- void CheckSetMarker(NKikimrCms::EMarker marker,
- const TString &userToken,
- NKikimrCms::TStatus::ECode code,
- Ts ...args)
- {
- auto req = MakeSetMarkerRequest(marker, userToken, args...);
- return CheckSetMarker(req, code);
- }
-
- template <typename... Ts>
- void CheckResetMarker(NKikimrCms::EMarker marker,
- const TString &userToken,
- NKikimrCms::TStatus::ECode code,
- Ts ...args)
- {
- auto req = MakeResetMarkerRequest(marker, userToken, args...);
- return CheckResetMarker(req, code);
- }
-
- void EnableBSBaseConfig();
- void DisableBSBaseConfig();
-
- NKikimrCms::TGetLogTailResponse GetLogTail(ui32 type = 0,
- TInstant from = TInstant::Zero(),
- TInstant to = TInstant::Zero(),
- ui32 limit = 100,
- ui32 offset = 0);
-
- const ui64 CmsId;
-
-private:
- void SetupLogging();
-
- NKikimrCms::TPermissionResponse
- CheckPermissionRequest(TAutoPtr<NCms::TEvCms::TEvPermissionRequest> req,
- NKikimrCms::TStatus::ECode code);
- NKikimrCms::TManagePermissionResponse
- CheckManagePermissionRequest(TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest> req,
- NKikimrCms::TStatus::ECode code);
- NKikimrCms::TManageRequestResponse
- CheckManageRequestRequest(TAutoPtr<NCms::TEvCms::TEvManageRequestRequest> req,
- NKikimrCms::TStatus::ECode code);
-
- void CheckWalleCreateTask(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> req,
- NKikimrCms::TStatus::ECode code);
- void CheckTasksEqual(const NKikimrCms::TWalleTaskInfo &l,
- const NKikimrCms::TWalleTaskInfo &r);
- void CheckWalleListTasks(const NKikimrCms::TWalleTaskInfo &task);
- void CheckWalleCheckTask(const TString &id,
- NKikimrCms::TStatus::ECode code,
- NKikimrCms::TWalleTaskInfo task);
-
- TString CheckNotification(TAutoPtr<NCms::TEvCms::TEvNotification> req,
- NKikimrCms::TStatus::ECode code);
-
- void CheckSetMarker(TAutoPtr<NCms::TEvCms::TEvSetMarkerRequest> req,
- NKikimrCms::TStatus::ECode code);
- void CheckResetMarker(TAutoPtr<NCms::TEvCms::TEvResetMarkerRequest> req,
- NKikimrCms::TStatus::ECode code);
-
+ void CheckWalleCheckTask(const TString &id,
+ NKikimrCms::TStatus::ECode code);
+
+ ui64 CountWalleTasks();
+
+ void CheckWalleListTasks(size_t count);
+
+ void CheckWalleRemoveTask(const TString &id,
+ NKikimrCms::TStatus::ECode code = NKikimrCms::TStatus::OK);
+
+ template<typename... Ts>
+ TString CheckNotification(NKikimrCms::TStatus::ECode code,
+ const TString &user,
+ TInstant when,
+ Ts... actions)
+ {
+ auto req = MakeNotification(user, when, actions...);
+ return CheckNotification(req, code);
+ }
+
+ void CheckGetNotification(const TString &user,
+ const TString &id,
+ NKikimrCms::TStatus::ECode code);
+ void CheckListNotifications(const TString &user,
+ NKikimrCms::TStatus::ECode code,
+ ui32 count);
+ void CheckRejectNotification(const TString &user,
+ const TString &id,
+ NKikimrCms::TStatus::ECode code,
+ bool dry = false);
+
+ void WaitUpdatDiskStatus(ui32 statusEventsCount,
+ NKikimrBlobStorage::EDriveStatus newStatus = NKikimrBlobStorage::ACTIVE);
+
+ template <typename... Ts>
+ void CheckSetMarker(NKikimrCms::EMarker marker,
+ const TString &userToken,
+ NKikimrCms::TStatus::ECode code,
+ Ts ...args)
+ {
+ auto req = MakeSetMarkerRequest(marker, userToken, args...);
+ return CheckSetMarker(req, code);
+ }
+
+ template <typename... Ts>
+ void CheckResetMarker(NKikimrCms::EMarker marker,
+ const TString &userToken,
+ NKikimrCms::TStatus::ECode code,
+ Ts ...args)
+ {
+ auto req = MakeResetMarkerRequest(marker, userToken, args...);
+ return CheckResetMarker(req, code);
+ }
+
+ void EnableBSBaseConfig();
+ void DisableBSBaseConfig();
+
+ NKikimrCms::TGetLogTailResponse GetLogTail(ui32 type = 0,
+ TInstant from = TInstant::Zero(),
+ TInstant to = TInstant::Zero(),
+ ui32 limit = 100,
+ ui32 offset = 0);
+
+ const ui64 CmsId;
+
+private:
+ void SetupLogging();
+
+ NKikimrCms::TPermissionResponse
+ CheckPermissionRequest(TAutoPtr<NCms::TEvCms::TEvPermissionRequest> req,
+ NKikimrCms::TStatus::ECode code);
+ NKikimrCms::TManagePermissionResponse
+ CheckManagePermissionRequest(TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest> req,
+ NKikimrCms::TStatus::ECode code);
+ NKikimrCms::TManageRequestResponse
+ CheckManageRequestRequest(TAutoPtr<NCms::TEvCms::TEvManageRequestRequest> req,
+ NKikimrCms::TStatus::ECode code);
+
+ void CheckWalleCreateTask(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> req,
+ NKikimrCms::TStatus::ECode code);
+ void CheckTasksEqual(const NKikimrCms::TWalleTaskInfo &l,
+ const NKikimrCms::TWalleTaskInfo &r);
+ void CheckWalleListTasks(const NKikimrCms::TWalleTaskInfo &task);
+ void CheckWalleCheckTask(const TString &id,
+ NKikimrCms::TStatus::ECode code,
+ NKikimrCms::TWalleTaskInfo task);
+
+ TString CheckNotification(TAutoPtr<NCms::TEvCms::TEvNotification> req,
+ NKikimrCms::TStatus::ECode code);
+
+ void CheckSetMarker(TAutoPtr<NCms::TEvCms::TEvSetMarkerRequest> req,
+ NKikimrCms::TStatus::ECode code);
+ void CheckResetMarker(TAutoPtr<NCms::TEvCms::TEvResetMarkerRequest> req,
+ NKikimrCms::TStatus::ECode code);
+
TActorId Sender;
-};
-
-} // NCmsTest
-} // NKikimr
+};
+
+} // NCmsTest
+} // NKikimr
diff --git a/ydb/core/cms/config.h b/ydb/core/cms/config.h
index 9fa6c9b251b..471880e34f6 100644
--- a/ydb/core/cms/config.h
+++ b/ydb/core/cms/config.h
@@ -1,16 +1,16 @@
-#pragma once
-
+#pragma once
+
#include "pdisk_state.h"
#include <ydb/core/protos/cms.pb.h>
-
-#include <util/datetime/base.h>
-#include <util/generic/hash.h>
+
+#include <util/datetime/base.h>
+#include <util/generic/hash.h>
#include <util/generic/map.h>
-
-namespace NKikimr {
-namespace NCms {
-
+
+namespace NKikimr {
+namespace NCms {
+
struct TCmsSentinelConfig {
bool Enable = false;
bool DryRun = false;
@@ -137,94 +137,94 @@ struct TCmsSentinelConfig {
}
};
-struct TCmsLogConfig {
- THashMap<ui32, bool> RecordLevels;
- bool EnabledByDefault = true;
- TDuration TTL;
-
- void Serialize(NKikimrCms::TCmsConfig::TLogConfig &config) const
- {
- config.SetDefaultLevel(EnabledByDefault
- ? NKikimrCms::TCmsConfig::TLogConfig::ENABLED
- : NKikimrCms::TCmsConfig::TLogConfig::DISABLED);
- for (auto pr : RecordLevels) {
- auto &entry = *config.AddComponentLevels();
- entry.SetRecordType(pr.first);
- entry.SetLevel(pr.second
- ? NKikimrCms::TCmsConfig::TLogConfig::ENABLED
- : NKikimrCms::TCmsConfig::TLogConfig::DISABLED);
- }
- config.SetTTL(TTL.GetValue());
- }
-
- void Deserialize(const NKikimrCms::TCmsConfig::TLogConfig &config)
- {
- RecordLevels.clear();
-
- EnabledByDefault = (config.GetDefaultLevel()
- == NKikimrCms::TCmsConfig::TLogConfig::ENABLED);
- for (auto &entry : config.GetComponentLevels()) {
- RecordLevels[entry.GetRecordType()]
- = entry.GetLevel() == NKikimrCms::TCmsConfig::TLogConfig::ENABLED;
- }
- TTL = TDuration::FromValue(config.GetTTL());
- }
-
- bool IsLogEnabled(ui32 recordType) const
- {
+struct TCmsLogConfig {
+ THashMap<ui32, bool> RecordLevels;
+ bool EnabledByDefault = true;
+ TDuration TTL;
+
+ void Serialize(NKikimrCms::TCmsConfig::TLogConfig &config) const
+ {
+ config.SetDefaultLevel(EnabledByDefault
+ ? NKikimrCms::TCmsConfig::TLogConfig::ENABLED
+ : NKikimrCms::TCmsConfig::TLogConfig::DISABLED);
+ for (auto pr : RecordLevels) {
+ auto &entry = *config.AddComponentLevels();
+ entry.SetRecordType(pr.first);
+ entry.SetLevel(pr.second
+ ? NKikimrCms::TCmsConfig::TLogConfig::ENABLED
+ : NKikimrCms::TCmsConfig::TLogConfig::DISABLED);
+ }
+ config.SetTTL(TTL.GetValue());
+ }
+
+ void Deserialize(const NKikimrCms::TCmsConfig::TLogConfig &config)
+ {
+ RecordLevels.clear();
+
+ EnabledByDefault = (config.GetDefaultLevel()
+ == NKikimrCms::TCmsConfig::TLogConfig::ENABLED);
+ for (auto &entry : config.GetComponentLevels()) {
+ RecordLevels[entry.GetRecordType()]
+ = entry.GetLevel() == NKikimrCms::TCmsConfig::TLogConfig::ENABLED;
+ }
+ TTL = TDuration::FromValue(config.GetTTL());
+ }
+
+ bool IsLogEnabled(ui32 recordType) const
+ {
if (RecordLevels.contains(recordType))
- return RecordLevels.at(recordType);
- return EnabledByDefault;
- }
-};
-
-struct TCmsConfig {
- TDuration DefaultRetryTime;
- TDuration DefaultPermissionDuration;
- TDuration DefaultWalleCleanupPeriod = TDuration::Minutes(1);
- TDuration InfoCollectionTimeout;
- NKikimrCms::TLimits TenantLimits;
- NKikimrCms::TLimits ClusterLimits;
+ return RecordLevels.at(recordType);
+ return EnabledByDefault;
+ }
+};
+
+struct TCmsConfig {
+ TDuration DefaultRetryTime;
+ TDuration DefaultPermissionDuration;
+ TDuration DefaultWalleCleanupPeriod = TDuration::Minutes(1);
+ TDuration InfoCollectionTimeout;
+ NKikimrCms::TLimits TenantLimits;
+ NKikimrCms::TLimits ClusterLimits;
TCmsSentinelConfig SentinelConfig;
- TCmsLogConfig LogConfig;
-
- TCmsConfig()
- {
- Deserialize(NKikimrCms::TCmsConfig());
- }
-
- TCmsConfig(const NKikimrCms::TCmsConfig &config)
- {
- Deserialize(config);
- }
-
- void Serialize(NKikimrCms::TCmsConfig &config) const
- {
- config.SetDefaultRetryTime(DefaultRetryTime.GetValue());
- config.SetDefaultPermissionDuration(DefaultPermissionDuration.GetValue());
+ TCmsLogConfig LogConfig;
+
+ TCmsConfig()
+ {
+ Deserialize(NKikimrCms::TCmsConfig());
+ }
+
+ TCmsConfig(const NKikimrCms::TCmsConfig &config)
+ {
+ Deserialize(config);
+ }
+
+ void Serialize(NKikimrCms::TCmsConfig &config) const
+ {
+ config.SetDefaultRetryTime(DefaultRetryTime.GetValue());
+ config.SetDefaultPermissionDuration(DefaultPermissionDuration.GetValue());
config.SetInfoCollectionTimeout(InfoCollectionTimeout.GetValue());
- config.MutableTenantLimits()->CopyFrom(TenantLimits);
- config.MutableClusterLimits()->CopyFrom(ClusterLimits);
+ config.MutableTenantLimits()->CopyFrom(TenantLimits);
+ config.MutableClusterLimits()->CopyFrom(ClusterLimits);
SentinelConfig.Serialize(*config.MutableSentinelConfig());
- LogConfig.Serialize(*config.MutableLogConfig());
- }
-
- void Deserialize(const NKikimrCms::TCmsConfig &config)
- {
+ LogConfig.Serialize(*config.MutableLogConfig());
+ }
+
+ void Deserialize(const NKikimrCms::TCmsConfig &config)
+ {
DefaultRetryTime = TDuration::MicroSeconds(config.GetDefaultRetryTime());
DefaultPermissionDuration = TDuration::MicroSeconds(config.GetDefaultPermissionDuration());
InfoCollectionTimeout = TDuration::MicroSeconds(config.GetInfoCollectionTimeout());
- TenantLimits.CopyFrom(config.GetTenantLimits());
- ClusterLimits.CopyFrom(config.GetClusterLimits());
+ TenantLimits.CopyFrom(config.GetTenantLimits());
+ ClusterLimits.CopyFrom(config.GetClusterLimits());
SentinelConfig.Deserialize(config.GetSentinelConfig());
- LogConfig.Deserialize(config.GetLogConfig());
- }
-
- bool IsLogEnabled(ui32 recordType) const
- {
- return LogConfig.IsLogEnabled(recordType);
- }
-};
-
-} // NCms
-} // NKikimr
+ LogConfig.Deserialize(config.GetLogConfig());
+ }
+
+ bool IsLogEnabled(ui32 recordType) const
+ {
+ return LogConfig.IsLogEnabled(recordType);
+ }
+};
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/console/config_helpers.cpp b/ydb/core/cms/console/config_helpers.cpp
index 08a590f8164..6d5a81beaf0 100644
--- a/ydb/core/cms/console/config_helpers.cpp
+++ b/ydb/core/cms/console/config_helpers.cpp
@@ -1,33 +1,33 @@
-#include "config_helpers.h"
-#include "console.h"
+#include "config_helpers.h"
+#include "console.h"
#include "util.h"
-
+
#include <ydb/core/base/appdata.h>
#include <ydb/core/base/counters.h>
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/mind/tenant_pool.h>
-
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
-
-#include <util/string/join.h>
-#include <util/system/hostname.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-namespace {
-
-enum class EAction {
- GET_NODE_CONFIG,
- REPLACE_SUBSCRIPTION,
- ADD_SUBSCRIPTION,
- REMOVE_SUBSCRIPTION
-};
-
-class TConfigHelper : public TActorBootstrapped<TConfigHelper> {
-private:
- using TBase = TActorBootstrapped<TConfigHelper>;
-
+
+#include <util/string/join.h>
+#include <util/system/hostname.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+namespace {
+
+enum class EAction {
+ GET_NODE_CONFIG,
+ REPLACE_SUBSCRIPTION,
+ ADD_SUBSCRIPTION,
+ REMOVE_SUBSCRIPTION
+};
+
+class TConfigHelper : public TActorBootstrapped<TConfigHelper> {
+private:
+ using TBase = TActorBootstrapped<TConfigHelper>;
+
struct TEvPrivate {
enum EEv {
EvRetryPoolStatus = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
@@ -38,294 +38,294 @@ private:
};
};
- ui64 TabletId;
+ ui64 TabletId;
TActorId ServiceId;
- TString Tenant;
- bool DetectTenant;
- TString NodeType;
- TVector<ui32> ConfigItemKinds;
- ui64 SubscriptionId;
- EAction Action;
+ TString Tenant;
+ bool DetectTenant;
+ TString NodeType;
+ TVector<ui32> ConfigItemKinds;
+ ui64 SubscriptionId;
+ EAction Action;
TActorId OwnerId;
TActorId Pipe;
- ui64 Cookie;
-
-public:
+ ui64 Cookie;
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_CONFIGS_SUBSCRIBER;
- }
-
- // Add/replace subscription.
- TConfigHelper(ui64 tabletId,
+ }
+
+ // Add/replace subscription.
+ TConfigHelper(ui64 tabletId,
TActorId serviceId,
- const TVector<ui32> &configItemKinds,
- const TString &tenant,
+ const TVector<ui32> &configItemKinds,
+ const TString &tenant,
TActorId ownerId,
- bool replace,
- ui64 cookie)
- : TabletId(tabletId)
- , ServiceId(serviceId)
- , Tenant(tenant)
- , DetectTenant(false)
- , ConfigItemKinds(configItemKinds)
- , SubscriptionId(0)
- , Action(replace ? EAction::REPLACE_SUBSCRIPTION : EAction::ADD_SUBSCRIPTION)
- , OwnerId(ownerId)
- , Cookie(cookie)
- {
- }
-
- // Add/replace subscription.
- TConfigHelper(ui64 tabletId,
+ bool replace,
+ ui64 cookie)
+ : TabletId(tabletId)
+ , ServiceId(serviceId)
+ , Tenant(tenant)
+ , DetectTenant(false)
+ , ConfigItemKinds(configItemKinds)
+ , SubscriptionId(0)
+ , Action(replace ? EAction::REPLACE_SUBSCRIPTION : EAction::ADD_SUBSCRIPTION)
+ , OwnerId(ownerId)
+ , Cookie(cookie)
+ {
+ }
+
+ // Add/replace subscription.
+ TConfigHelper(ui64 tabletId,
TActorId serviceId,
- const TVector<ui32> &configItemKinds,
+ const TVector<ui32> &configItemKinds,
TActorId ownerId,
- bool replace,
- ui64 cookie)
- : TabletId(tabletId)
- , ServiceId(serviceId)
- , DetectTenant(true)
- , ConfigItemKinds(configItemKinds)
- , SubscriptionId(0)
- , Action(replace ? EAction::REPLACE_SUBSCRIPTION : EAction::ADD_SUBSCRIPTION)
- , OwnerId(ownerId)
- , Cookie(cookie)
- {
- }
-
- // Remove subscription.
- TConfigHelper(ui64 subscriptionId,
+ bool replace,
+ ui64 cookie)
+ : TabletId(tabletId)
+ , ServiceId(serviceId)
+ , DetectTenant(true)
+ , ConfigItemKinds(configItemKinds)
+ , SubscriptionId(0)
+ , Action(replace ? EAction::REPLACE_SUBSCRIPTION : EAction::ADD_SUBSCRIPTION)
+ , OwnerId(ownerId)
+ , Cookie(cookie)
+ {
+ }
+
+ // Remove subscription.
+ TConfigHelper(ui64 subscriptionId,
TActorId ownerId,
- ui64 cookie)
- : TabletId(0)
- , DetectTenant(false)
- , SubscriptionId(subscriptionId)
- , Action(EAction::REMOVE_SUBSCRIPTION)
- , OwnerId(ownerId)
- , Cookie(cookie)
- {
- }
-
- // Get node config.
- TConfigHelper(const TVector<ui32> &configItemKinds,
+ ui64 cookie)
+ : TabletId(0)
+ , DetectTenant(false)
+ , SubscriptionId(subscriptionId)
+ , Action(EAction::REMOVE_SUBSCRIPTION)
+ , OwnerId(ownerId)
+ , Cookie(cookie)
+ {
+ }
+
+ // Get node config.
+ TConfigHelper(const TVector<ui32> &configItemKinds,
TActorId ownerId,
- ui64 cookie)
- : TabletId(0)
- , DetectTenant(true)
- , ConfigItemKinds(configItemKinds)
+ ui64 cookie)
+ : TabletId(0)
+ , DetectTenant(true)
+ , ConfigItemKinds(configItemKinds)
, SubscriptionId(0)
- , Action(EAction::GET_NODE_CONFIG)
- , OwnerId(ownerId)
- , Cookie(cookie)
- {
- }
-
- // Get node config.
- TConfigHelper(const TVector<ui32> &configItemKinds,
- const TString &tenant,
+ , Action(EAction::GET_NODE_CONFIG)
+ , OwnerId(ownerId)
+ , Cookie(cookie)
+ {
+ }
+
+ // Get node config.
+ TConfigHelper(const TVector<ui32> &configItemKinds,
+ const TString &tenant,
TActorId ownerId,
- ui64 cookie)
- : TabletId(0)
- , Tenant(tenant)
- , DetectTenant(false)
- , ConfigItemKinds(configItemKinds)
+ ui64 cookie)
+ : TabletId(0)
+ , Tenant(tenant)
+ , DetectTenant(false)
+ , ConfigItemKinds(configItemKinds)
, SubscriptionId(0)
- , Action(EAction::GET_NODE_CONFIG)
- , OwnerId(ownerId)
- , Cookie(cookie)
- {
- }
-
- void Die(const TActorContext &ctx) override
- {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigHelper Die");
-
- if (Pipe)
- NTabletPipe::CloseClient(ctx, Pipe);
- TBase::Die(ctx);
- }
-
- void OnPipeDestroyed(const TActorContext &ctx)
- {
- if (Pipe) {
- NTabletPipe::CloseClient(ctx, Pipe);
+ , Action(EAction::GET_NODE_CONFIG)
+ , OwnerId(ownerId)
+ , Cookie(cookie)
+ {
+ }
+
+ void Die(const TActorContext &ctx) override
+ {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigHelper Die");
+
+ if (Pipe)
+ NTabletPipe::CloseClient(ctx, Pipe);
+ TBase::Die(ctx);
+ }
+
+ void OnPipeDestroyed(const TActorContext &ctx)
+ {
+ if (Pipe) {
+ NTabletPipe::CloseClient(ctx, Pipe);
Pipe = TActorId();
- }
-
- SendSubscriptionRequest(ctx);
- }
-
- void OpenPipe(const TActorContext &ctx)
- {
- auto domains = AppData(ctx)->DomainsInfo;
- Y_VERIFY(domains->Domains.size() == 1, "multiple domains are not supported by TConfigHelper");
- auto domain = domains->Domains.begin()->second;
- auto group = domains->GetDefaultStateStorageGroup(domain->DomainUid);
- auto console = MakeConsoleID(group);
-
- NTabletPipe::TClientConfig pipeConfig;
+ }
+
+ SendSubscriptionRequest(ctx);
+ }
+
+ void OpenPipe(const TActorContext &ctx)
+ {
+ auto domains = AppData(ctx)->DomainsInfo;
+ Y_VERIFY(domains->Domains.size() == 1, "multiple domains are not supported by TConfigHelper");
+ auto domain = domains->Domains.begin()->second;
+ auto group = domains->GetDefaultStateStorageGroup(domain->DomainUid);
+ auto console = MakeConsoleID(group);
+
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = FastConnectRetryPolicy();
- auto pipe = NTabletPipe::CreateClient(ctx.SelfID, console, pipeConfig);
- Pipe = ctx.ExecutorThread.RegisterActor(pipe);
- }
-
- void SendPoolStatusRequest(const TActorContext &ctx)
- {
- auto domains = AppData(ctx)->DomainsInfo;
- Y_VERIFY(domains->Domains.size() == 1, "multiple domains are not supported by TConfigHelper");
- auto tenantPool = MakeTenantPoolID(ctx.SelfID.NodeId(), domains->Domains.begin()->second->DomainUid);
+ auto pipe = NTabletPipe::CreateClient(ctx.SelfID, console, pipeConfig);
+ Pipe = ctx.ExecutorThread.RegisterActor(pipe);
+ }
+
+ void SendPoolStatusRequest(const TActorContext &ctx)
+ {
+ auto domains = AppData(ctx)->DomainsInfo;
+ Y_VERIFY(domains->Domains.size() == 1, "multiple domains are not supported by TConfigHelper");
+ auto tenantPool = MakeTenantPoolID(ctx.SelfID.NodeId(), domains->Domains.begin()->second->DomainUid);
ctx.Send(tenantPool, new TEvTenantPool::TEvGetStatus(true), IEventHandle::FlagTrackDelivery);
- }
-
- void BuildSubscription(NKikimrConsole::TSubscription &subscription)
- {
- if (TabletId)
- subscription.MutableSubscriber()->SetTabletId(TabletId);
- else
+ }
+
+ void BuildSubscription(NKikimrConsole::TSubscription &subscription)
+ {
+ if (TabletId)
+ subscription.MutableSubscriber()->SetTabletId(TabletId);
+ else
ActorIdToProto(ServiceId,
- subscription.MutableSubscriber()->MutableServiceId());
- subscription.MutableOptions()->SetNodeId(SelfId().NodeId());
- subscription.MutableOptions()->SetHost(FQDNHostName());
- subscription.MutableOptions()->SetTenant(Tenant);
- subscription.MutableOptions()->SetNodeType(NodeType);
- for (auto &kind : ConfigItemKinds)
- subscription.AddConfigItemKinds(kind);
- }
-
- void SendSubscriptionRequest(const TActorContext &ctx)
- {
- if (!Pipe)
- OpenPipe(ctx);
-
- if (Action == EAction::REPLACE_SUBSCRIPTION) {
- auto request = MakeHolder<TEvConsole::TEvReplaceConfigSubscriptionsRequest>();
- BuildSubscription(*request->Record.MutableSubscription());
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigHelper send TEvReplaceConfigSubscriptionsRequest: "
- << request->Record.ShortDebugString());
-
- NTabletPipe::SendData(ctx, Pipe, request.Release(), Cookie);
- } else if (Action == EAction::ADD_SUBSCRIPTION) {
- auto request = MakeHolder<TEvConsole::TEvAddConfigSubscriptionRequest>();
- BuildSubscription(*request->Record.MutableSubscription());
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigHelper send TEvAddConfigSubscriptionRequest: "
- << request->Record.ShortDebugString());
-
- NTabletPipe::SendData(ctx, Pipe, request.Release(), Cookie);
- } else if (Action == EAction::REMOVE_SUBSCRIPTION) {
- auto request = MakeHolder<TEvConsole::TEvRemoveConfigSubscriptionRequest>();
- request->Record.SetSubscriptionId(SubscriptionId);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigHelper send TEvRemoveConfigSubscriptionRequest: "
- << request->Record.ShortDebugString());
-
- NTabletPipe::SendData(ctx, Pipe, request.Release(), Cookie);
- } else if (Action == EAction::GET_NODE_CONFIG) {
- auto request = MakeHolder<TEvConsole::TEvGetNodeConfigRequest>();
- request->Record.MutableNode()->SetNodeId(SelfId().NodeId());
- request->Record.MutableNode()->SetHost(FQDNHostName());
- request->Record.MutableNode()->SetTenant(Tenant);
- request->Record.MutableNode()->SetNodeType(NodeType);
- for (auto &kind : ConfigItemKinds)
- request->Record.AddItemKinds(kind);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigHelper send TEvGetNodeConfigRequest: "
- << request->Record.ShortDebugString());
-
- NTabletPipe::SendData(ctx, Pipe, request.Release(), Cookie);
- } else {
- Y_FAIL("unknown action");
- }
- }
-
- void Bootstrap(const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigHelper Bootstrap"
- << " tabletid=" << TabletId
- << " serviceid=" << ServiceId
- << " subscriptionid=" << SubscriptionId
- << " action=" << (ui32)Action
- << " tenant=" << Tenant
- << " detecttenant=" << DetectTenant
- << " kinds=" << JoinSeq(",", ConfigItemKinds));
- Become(&TThis::StateWork);
- if (Action == EAction::REPLACE_SUBSCRIPTION
- || Action == EAction::ADD_SUBSCRIPTION
- || Action == EAction::GET_NODE_CONFIG)
- SendPoolStatusRequest(ctx);
- else if (Action == EAction::REMOVE_SUBSCRIPTION)
- SendSubscriptionRequest(ctx);
- else
- Y_FAIL("unknown action");
- }
-
- void Handle(TEvConsole::TEvAddConfigSubscriptionResponse::TPtr &ev, const TActorContext &ctx) {
- ctx.Send(ev->Forward(OwnerId));
- Die(ctx);
- }
-
- void Handle(TEvConsole::TEvGetNodeConfigResponse::TPtr &ev, const TActorContext &ctx) {
- ctx.Send(ev->Forward(OwnerId));
- Die(ctx);
- }
-
- void Handle(TEvConsole::TEvRemoveConfigSubscriptionResponse::TPtr &ev, const TActorContext &ctx) {
- if (OwnerId)
- ctx.Send(ev->Forward(OwnerId));
- Die(ctx);
- }
-
- void Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev, const TActorContext &ctx) {
- ctx.Send(ev->Forward(OwnerId));
- Die(ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigHelper connection "
- << ((ev->Get()->Status == NKikimrProto::OK) ? "established" : "failed"));
-
- if (ev->Get()->Status != NKikimrProto::OK) {
- OnPipeDestroyed(ctx);
- }
- }
-
- void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &/*ev*/, const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigHelper TEvTabletPipe::TEvClientDestroyed");
- OnPipeDestroyed(ctx);
- }
-
+ subscription.MutableSubscriber()->MutableServiceId());
+ subscription.MutableOptions()->SetNodeId(SelfId().NodeId());
+ subscription.MutableOptions()->SetHost(FQDNHostName());
+ subscription.MutableOptions()->SetTenant(Tenant);
+ subscription.MutableOptions()->SetNodeType(NodeType);
+ for (auto &kind : ConfigItemKinds)
+ subscription.AddConfigItemKinds(kind);
+ }
+
+ void SendSubscriptionRequest(const TActorContext &ctx)
+ {
+ if (!Pipe)
+ OpenPipe(ctx);
+
+ if (Action == EAction::REPLACE_SUBSCRIPTION) {
+ auto request = MakeHolder<TEvConsole::TEvReplaceConfigSubscriptionsRequest>();
+ BuildSubscription(*request->Record.MutableSubscription());
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigHelper send TEvReplaceConfigSubscriptionsRequest: "
+ << request->Record.ShortDebugString());
+
+ NTabletPipe::SendData(ctx, Pipe, request.Release(), Cookie);
+ } else if (Action == EAction::ADD_SUBSCRIPTION) {
+ auto request = MakeHolder<TEvConsole::TEvAddConfigSubscriptionRequest>();
+ BuildSubscription(*request->Record.MutableSubscription());
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigHelper send TEvAddConfigSubscriptionRequest: "
+ << request->Record.ShortDebugString());
+
+ NTabletPipe::SendData(ctx, Pipe, request.Release(), Cookie);
+ } else if (Action == EAction::REMOVE_SUBSCRIPTION) {
+ auto request = MakeHolder<TEvConsole::TEvRemoveConfigSubscriptionRequest>();
+ request->Record.SetSubscriptionId(SubscriptionId);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigHelper send TEvRemoveConfigSubscriptionRequest: "
+ << request->Record.ShortDebugString());
+
+ NTabletPipe::SendData(ctx, Pipe, request.Release(), Cookie);
+ } else if (Action == EAction::GET_NODE_CONFIG) {
+ auto request = MakeHolder<TEvConsole::TEvGetNodeConfigRequest>();
+ request->Record.MutableNode()->SetNodeId(SelfId().NodeId());
+ request->Record.MutableNode()->SetHost(FQDNHostName());
+ request->Record.MutableNode()->SetTenant(Tenant);
+ request->Record.MutableNode()->SetNodeType(NodeType);
+ for (auto &kind : ConfigItemKinds)
+ request->Record.AddItemKinds(kind);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigHelper send TEvGetNodeConfigRequest: "
+ << request->Record.ShortDebugString());
+
+ NTabletPipe::SendData(ctx, Pipe, request.Release(), Cookie);
+ } else {
+ Y_FAIL("unknown action");
+ }
+ }
+
+ void Bootstrap(const TActorContext &ctx) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigHelper Bootstrap"
+ << " tabletid=" << TabletId
+ << " serviceid=" << ServiceId
+ << " subscriptionid=" << SubscriptionId
+ << " action=" << (ui32)Action
+ << " tenant=" << Tenant
+ << " detecttenant=" << DetectTenant
+ << " kinds=" << JoinSeq(",", ConfigItemKinds));
+ Become(&TThis::StateWork);
+ if (Action == EAction::REPLACE_SUBSCRIPTION
+ || Action == EAction::ADD_SUBSCRIPTION
+ || Action == EAction::GET_NODE_CONFIG)
+ SendPoolStatusRequest(ctx);
+ else if (Action == EAction::REMOVE_SUBSCRIPTION)
+ SendSubscriptionRequest(ctx);
+ else
+ Y_FAIL("unknown action");
+ }
+
+ void Handle(TEvConsole::TEvAddConfigSubscriptionResponse::TPtr &ev, const TActorContext &ctx) {
+ ctx.Send(ev->Forward(OwnerId));
+ Die(ctx);
+ }
+
+ void Handle(TEvConsole::TEvGetNodeConfigResponse::TPtr &ev, const TActorContext &ctx) {
+ ctx.Send(ev->Forward(OwnerId));
+ Die(ctx);
+ }
+
+ void Handle(TEvConsole::TEvRemoveConfigSubscriptionResponse::TPtr &ev, const TActorContext &ctx) {
+ if (OwnerId)
+ ctx.Send(ev->Forward(OwnerId));
+ Die(ctx);
+ }
+
+ void Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev, const TActorContext &ctx) {
+ ctx.Send(ev->Forward(OwnerId));
+ Die(ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigHelper connection "
+ << ((ev->Get()->Status == NKikimrProto::OK) ? "established" : "failed"));
+
+ if (ev->Get()->Status != NKikimrProto::OK) {
+ OnPipeDestroyed(ctx);
+ }
+ }
+
+ void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &/*ev*/, const TActorContext &ctx) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigHelper TEvTabletPipe::TEvClientDestroyed");
+ OnPipeDestroyed(ctx);
+ }
+
void Handle(TEvPrivate::TEvRetryPoolStatus::TPtr &, const TActorContext &ctx) {
SendPoolStatusRequest(ctx);
}
- void Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev, const TActorContext &ctx) {
- auto &rec = ev->Get()->Record;
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigHelper got status from TenantPool: "
- << rec.ShortDebugString());
-
- NodeType = rec.GetNodeType();
- if (DetectTenant) {
- THashSet<TString> tenants;
- for (auto &slot : rec.GetSlots())
- tenants.insert(slot.GetAssignedTenant());
- if (tenants.empty())
- Tenant = "<none>";
- else if (tenants.size() == 1) {
- Tenant = CanonizePath(*tenants.begin());
- } else
- Tenant = "<multiple>";
- }
-
- SendSubscriptionRequest(ctx);
- }
-
+ void Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev, const TActorContext &ctx) {
+ auto &rec = ev->Get()->Record;
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigHelper got status from TenantPool: "
+ << rec.ShortDebugString());
+
+ NodeType = rec.GetNodeType();
+ if (DetectTenant) {
+ THashSet<TString> tenants;
+ for (auto &slot : rec.GetSlots())
+ tenants.insert(slot.GetAssignedTenant());
+ if (tenants.empty())
+ Tenant = "<none>";
+ else if (tenants.size() == 1) {
+ Tenant = CanonizePath(*tenants.begin());
+ } else
+ Tenant = "<multiple>";
+ }
+
+ SendSubscriptionRequest(ctx);
+ }
+
void Handle(TEvents::TEvUndelivered::TPtr &ev, const TActorContext &ctx) {
switch (ev->Get()->SourceType) {
case TEvTenantPool::TEvGetStatus::EventType: {
@@ -337,115 +337,115 @@ public:
}
}
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConsole::TEvAddConfigSubscriptionResponse, Handle);
- HFunc(TEvConsole::TEvGetNodeConfigResponse, Handle);
- HFunc(TEvConsole::TEvRemoveConfigSubscriptionResponse, Handle);
- HFunc(TEvConsole::TEvReplaceConfigSubscriptionsResponse, Handle);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConsole::TEvAddConfigSubscriptionResponse, Handle);
+ HFunc(TEvConsole::TEvGetNodeConfigResponse, Handle);
+ HFunc(TEvConsole::TEvRemoveConfigSubscriptionResponse, Handle);
+ HFunc(TEvConsole::TEvReplaceConfigSubscriptionsResponse, Handle);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
HFunc(TEvPrivate::TEvRetryPoolStatus, Handle);
HFunc(TEvTenantPool::TEvTenantPoolStatus, Handle);
HFunc(TEvents::TEvUndelivered, Handle);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-};
-
-} // anonymous namespace
-
+ break;
+ }
+ }
+};
+
+} // anonymous namespace
+
IActor *CreateNodeConfigCourier(TActorId owner,
- ui64 cookie)
-{
- return new TConfigHelper(TVector<ui32>(), owner, cookie);
-}
-
-IActor *CreateNodeConfigCourier(ui32 configItemKind,
+ ui64 cookie)
+{
+ return new TConfigHelper(TVector<ui32>(), owner, cookie);
+}
+
+IActor *CreateNodeConfigCourier(ui32 configItemKind,
TActorId owner,
- ui64 cookie)
-{
- return new TConfigHelper(TVector<ui32>({configItemKind}), owner, cookie);
-}
-
-IActor *CreateNodeConfigCourier(const TVector<ui32> &configItemKinds,
+ ui64 cookie)
+{
+ return new TConfigHelper(TVector<ui32>({configItemKind}), owner, cookie);
+}
+
+IActor *CreateNodeConfigCourier(const TVector<ui32> &configItemKinds,
TActorId owner,
- ui64 cookie)
-{
- return new TConfigHelper(configItemKinds, owner, cookie);
-}
-
-IActor *CreateNodeConfigCourier(const TString &tenant,
+ ui64 cookie)
+{
+ return new TConfigHelper(configItemKinds, owner, cookie);
+}
+
+IActor *CreateNodeConfigCourier(const TString &tenant,
TActorId owner,
- ui64 cookie)
-{
- return new TConfigHelper(TVector<ui32>({}), tenant, owner, cookie);
-}
-
-IActor *CreateNodeConfigCourier(ui32 configItemKind,
- const TString &tenant,
+ ui64 cookie)
+{
+ return new TConfigHelper(TVector<ui32>({}), tenant, owner, cookie);
+}
+
+IActor *CreateNodeConfigCourier(ui32 configItemKind,
+ const TString &tenant,
TActorId owner,
- ui64 cookie)
-{
- return new TConfigHelper(TVector<ui32>({configItemKind}), tenant, owner, cookie);
-}
-
-IActor *CreateNodeConfigCourier(const TVector<ui32> &configItemKinds,
- const TString &tenant,
+ ui64 cookie)
+{
+ return new TConfigHelper(TVector<ui32>({configItemKind}), tenant, owner, cookie);
+}
+
+IActor *CreateNodeConfigCourier(const TVector<ui32> &configItemKinds,
+ const TString &tenant,
TActorId owner,
- ui64 cookie)
-{
- return new TConfigHelper(configItemKinds, tenant, owner, cookie);
-}
-
-IActor *CreateConfigSubscriber(ui64 tabletId,
- const TVector<ui32> &configItemKinds,
+ ui64 cookie)
+{
+ return new TConfigHelper(configItemKinds, tenant, owner, cookie);
+}
+
+IActor *CreateConfigSubscriber(ui64 tabletId,
+ const TVector<ui32> &configItemKinds,
TActorId owner,
- bool replace,
- ui64 cookie)
-{
+ bool replace,
+ ui64 cookie)
+{
return new TConfigHelper(tabletId, TActorId(), configItemKinds, owner, replace, cookie);
-}
-
-IActor *CreateConfigSubscriber(ui64 tabletId,
- const TVector<ui32> &configItemKinds,
- const TString &tenant,
+}
+
+IActor *CreateConfigSubscriber(ui64 tabletId,
+ const TVector<ui32> &configItemKinds,
+ const TString &tenant,
TActorId owner,
- bool replace,
- ui64 cookie)
-{
+ bool replace,
+ ui64 cookie)
+{
return new TConfigHelper(tabletId, TActorId(), configItemKinds, tenant, owner, replace, cookie);
-}
-
+}
+
IActor *CreateConfigSubscriber(TActorId serviceId,
- const TVector<ui32> &configItemKinds,
+ const TVector<ui32> &configItemKinds,
TActorId owner,
- bool replace,
- ui64 cookie)
-{
- return new TConfigHelper(0, serviceId, configItemKinds, owner, replace, cookie);
-}
-
+ bool replace,
+ ui64 cookie)
+{
+ return new TConfigHelper(0, serviceId, configItemKinds, owner, replace, cookie);
+}
+
IActor *CreateConfigSubscriber(TActorId serviceId,
- const TVector<ui32> &configItemKinds,
- const TString &tenant,
+ const TVector<ui32> &configItemKinds,
+ const TString &tenant,
TActorId owner,
- bool replace,
- ui64 cookie)
-{
- return new TConfigHelper(0, serviceId, configItemKinds, tenant, owner, replace, cookie);
-}
-
-IActor *CreateSubscriptionEraser(ui64 subscriptionId,
+ bool replace,
+ ui64 cookie)
+{
+ return new TConfigHelper(0, serviceId, configItemKinds, tenant, owner, replace, cookie);
+}
+
+IActor *CreateSubscriptionEraser(ui64 subscriptionId,
TActorId owner,
- ui64 cookie)
-{
- return new TConfigHelper(subscriptionId, owner, cookie);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ ui64 cookie)
+{
+ return new TConfigHelper(subscriptionId, owner, cookie);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/config_helpers.h b/ydb/core/cms/console/config_helpers.h
index df9c1355b2f..b45b4ed5df3 100644
--- a/ydb/core/cms/console/config_helpers.h
+++ b/ydb/core/cms/console/config_helpers.h
@@ -1,84 +1,84 @@
-#pragma once
-#include "defs.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-/**
- * Node config courier is used to get full or partial node config from
- * Console. You can specify tenant to get config for. If tenant is
- * not specified then current tenant is received from Tenant Pool.
- * Node type is always received from Tenant Pool.
- *
- * Courier forwards TEvConsole::TEvGetNodeConfigResponse event to the
- * owner.
- */
+#pragma once
+#include "defs.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+/**
+ * Node config courier is used to get full or partial node config from
+ * Console. You can specify tenant to get config for. If tenant is
+ * not specified then current tenant is received from Tenant Pool.
+ * Node type is always received from Tenant Pool.
+ *
+ * Courier forwards TEvConsole::TEvGetNodeConfigResponse event to the
+ * owner.
+ */
IActor *CreateNodeConfigCourier(TActorId owner,
- ui64 cookie = 0);
-IActor *CreateNodeConfigCourier(ui32 configItemKind,
+ ui64 cookie = 0);
+IActor *CreateNodeConfigCourier(ui32 configItemKind,
TActorId owner,
- ui64 cookie = 0);
-IActor *CreateNodeConfigCourier(const TVector<ui32> &configItemKinds,
+ ui64 cookie = 0);
+IActor *CreateNodeConfigCourier(const TVector<ui32> &configItemKinds,
TActorId owner,
- ui64 cookie = 0);
-IActor *CreateNodeConfigCourier(const TString &tenant,
+ ui64 cookie = 0);
+IActor *CreateNodeConfigCourier(const TString &tenant,
TActorId owner,
- ui64 cookie = 0);
-IActor *CreateNodeConfigCourier(ui32 configItemKind,
- const TString &tenant,
+ ui64 cookie = 0);
+IActor *CreateNodeConfigCourier(ui32 configItemKind,
+ const TString &tenant,
TActorId owner,
- ui64 cookie = 0);
-IActor *CreateNodeConfigCourier(const TVector<ui32> &configItemKinds,
- const TString &tenant,
+ ui64 cookie = 0);
+IActor *CreateNodeConfigCourier(const TVector<ui32> &configItemKinds,
+ const TString &tenant,
TActorId owner,
- ui64 cookie = 0);
-
-/*
- * Config subscriber is used to add/refresh config subscription in Console
- * using TEvConsole::TEvReplaceSubscriptionsRequest. This helper actor
- * should be used by tablets and services which use only single config
- * subscription.
- * You can pass subscription tenant to subscriber or let subscriber get it
- * from Tenant Pool. Node type is always received from Tenant Pool.
- * If replace option is set TEvConsole::TEvReplaceConfigSubscriptionsRequest
- * is used for subscription and all existing subscriber's subscriptions
- * are removed. Otherwise TEvConsole::TEvAddConfigSubscriptionRequest
- * is used.
- *
- * Subscriber forwards TEvConsole::TEvAddConfigSubscriptionResponse and
- * TEvConsole::TEvReplaceConfigSubscriptionsResponse event to the owner.
- */
-IActor *CreateConfigSubscriber(ui64 tabletId,
- const TVector<ui32> &configItemKinds,
+ ui64 cookie = 0);
+
+/*
+ * Config subscriber is used to add/refresh config subscription in Console
+ * using TEvConsole::TEvReplaceSubscriptionsRequest. This helper actor
+ * should be used by tablets and services which use only single config
+ * subscription.
+ * You can pass subscription tenant to subscriber or let subscriber get it
+ * from Tenant Pool. Node type is always received from Tenant Pool.
+ * If replace option is set TEvConsole::TEvReplaceConfigSubscriptionsRequest
+ * is used for subscription and all existing subscriber's subscriptions
+ * are removed. Otherwise TEvConsole::TEvAddConfigSubscriptionRequest
+ * is used.
+ *
+ * Subscriber forwards TEvConsole::TEvAddConfigSubscriptionResponse and
+ * TEvConsole::TEvReplaceConfigSubscriptionsResponse event to the owner.
+ */
+IActor *CreateConfigSubscriber(ui64 tabletId,
+ const TVector<ui32> &configItemKinds,
TActorId owner,
- bool replace = true,
- ui64 cookie = 0);
-IActor *CreateConfigSubscriber(ui64 tabletId,
- const TVector<ui32> &configItemKinds,
- const TString &tenant,
+ bool replace = true,
+ ui64 cookie = 0);
+IActor *CreateConfigSubscriber(ui64 tabletId,
+ const TVector<ui32> &configItemKinds,
+ const TString &tenant,
TActorId owner,
- bool replace = true,
- ui64 cookie = 0);
+ bool replace = true,
+ ui64 cookie = 0);
IActor *CreateConfigSubscriber(TActorId serviceId,
- const TVector<ui32> &configItemKinds,
+ const TVector<ui32> &configItemKinds,
TActorId owner,
- bool replace = true,
- ui64 cookie = 0);
+ bool replace = true,
+ ui64 cookie = 0);
IActor *CreateConfigSubscriber(TActorId serviceId,
- const TVector<ui32> &configItemKinds,
- const TString &tenant,
+ const TVector<ui32> &configItemKinds,
+ const TString &tenant,
TActorId owner,
- bool replace = true,
- ui64 cookie = 0);
-
-/**
- * Subscription eraser is used to remove config subscriptions by ID. If owner is
- * specified then TEvConsole::TEvRemoveConfigSubscriptionRepsonse event is
- * forwared to it.
- */
-IActor *CreateSubscriptionEraser(ui64 subscriptionId,
+ bool replace = true,
+ ui64 cookie = 0);
+
+/**
+ * Subscription eraser is used to remove config subscriptions by ID. If owner is
+ * specified then TEvConsole::TEvRemoveConfigSubscriptionRepsonse event is
+ * forwared to it.
+ */
+IActor *CreateSubscriptionEraser(ui64 subscriptionId,
TActorId owner = TActorId(),
- ui64 cookie = 0);
-
-} // namespace NConsole
-} // namespace NKikimr
+ ui64 cookie = 0);
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/config_index.cpp b/ydb/core/cms/console/config_index.cpp
index 0aee7f7315d..98ede70c6fe 100644
--- a/ydb/core/cms/console/config_index.cpp
+++ b/ydb/core/cms/console/config_index.cpp
@@ -1,235 +1,235 @@
-#include "config_index.h"
-
-#include <util/string/builder.h>
-#include <util/string/join.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-TUsageScope::TUsageScope()
- : Order(0)
-{
-}
-
-TUsageScope::TUsageScope(const NKikimrConsole::TUsageScope &scope,
- ui32 order)
- : Order(order)
-{
- switch (scope.GetFilterCase()) {
- case NKikimrConsole::TUsageScope::kNodeFilter:
- for (auto &id : scope.GetNodeFilter().GetNodes())
- NodeIds.insert(id);
- break;
- case NKikimrConsole::TUsageScope::kHostFilter:
- for (auto &host : scope.GetHostFilter().GetHosts())
- Hosts.insert(host);
- break;
- case NKikimrConsole::TUsageScope::kTenantAndNodeTypeFilter:
- Tenant = scope.GetTenantAndNodeTypeFilter().GetTenant();
- NodeType = scope.GetTenantAndNodeTypeFilter().GetNodeType();
- break;
- case NKikimrConsole::TUsageScope::FILTER_NOT_SET:
- break;
- default:
- Y_FAIL("unexpected usage scope filter");
- }
-}
-
-int TUsageScope::GetPriority() const
-{
- if (!NodeIds.empty())
- return 1;
- if (!Hosts.empty())
- return 2;
- if (Tenant && NodeType)
- return 3;
- if (Tenant)
- return 4;
- if (NodeType)
- return 5;
- return 6;
-}
-
-void TUsageScope::Serialize(NKikimrConsole::TUsageScope &scope) const
-{
- for (auto id : NodeIds)
- scope.MutableNodeFilter()->AddNodes(id);
- for (auto &host : Hosts)
- scope.MutableHostFilter()->AddHosts(host);
- if (Tenant || NodeType) {
- scope.MutableTenantAndNodeTypeFilter()->SetTenant(Tenant);
- scope.MutableTenantAndNodeTypeFilter()->SetNodeType(NodeType);
- }
-}
-
-bool TUsageScope::IsSameScope(const NKikimrConsole::TUsageScope &scope) const
-{
- return (*this == TUsageScope(scope, Order));
-}
-
-bool TUsageScope::HasConflict(const TUsageScope &other,
- bool ignoreOrder) const
-{
- if (GetPriority() != other.GetPriority())
- return false;
-
- if (!ignoreOrder && Order != other.Order)
- return false;
-
- if (!NodeIds.empty()) {
- for (auto id : NodeIds)
+#include "config_index.h"
+
+#include <util/string/builder.h>
+#include <util/string/join.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+TUsageScope::TUsageScope()
+ : Order(0)
+{
+}
+
+TUsageScope::TUsageScope(const NKikimrConsole::TUsageScope &scope,
+ ui32 order)
+ : Order(order)
+{
+ switch (scope.GetFilterCase()) {
+ case NKikimrConsole::TUsageScope::kNodeFilter:
+ for (auto &id : scope.GetNodeFilter().GetNodes())
+ NodeIds.insert(id);
+ break;
+ case NKikimrConsole::TUsageScope::kHostFilter:
+ for (auto &host : scope.GetHostFilter().GetHosts())
+ Hosts.insert(host);
+ break;
+ case NKikimrConsole::TUsageScope::kTenantAndNodeTypeFilter:
+ Tenant = scope.GetTenantAndNodeTypeFilter().GetTenant();
+ NodeType = scope.GetTenantAndNodeTypeFilter().GetNodeType();
+ break;
+ case NKikimrConsole::TUsageScope::FILTER_NOT_SET:
+ break;
+ default:
+ Y_FAIL("unexpected usage scope filter");
+ }
+}
+
+int TUsageScope::GetPriority() const
+{
+ if (!NodeIds.empty())
+ return 1;
+ if (!Hosts.empty())
+ return 2;
+ if (Tenant && NodeType)
+ return 3;
+ if (Tenant)
+ return 4;
+ if (NodeType)
+ return 5;
+ return 6;
+}
+
+void TUsageScope::Serialize(NKikimrConsole::TUsageScope &scope) const
+{
+ for (auto id : NodeIds)
+ scope.MutableNodeFilter()->AddNodes(id);
+ for (auto &host : Hosts)
+ scope.MutableHostFilter()->AddHosts(host);
+ if (Tenant || NodeType) {
+ scope.MutableTenantAndNodeTypeFilter()->SetTenant(Tenant);
+ scope.MutableTenantAndNodeTypeFilter()->SetNodeType(NodeType);
+ }
+}
+
+bool TUsageScope::IsSameScope(const NKikimrConsole::TUsageScope &scope) const
+{
+ return (*this == TUsageScope(scope, Order));
+}
+
+bool TUsageScope::HasConflict(const TUsageScope &other,
+ bool ignoreOrder) const
+{
+ if (GetPriority() != other.GetPriority())
+ return false;
+
+ if (!ignoreOrder && Order != other.Order)
+ return false;
+
+ if (!NodeIds.empty()) {
+ for (auto id : NodeIds)
if (other.NodeIds.contains(id))
- return true;
- } else if (!Hosts.empty()) {
- for (auto &host : Hosts)
+ return true;
+ } else if (!Hosts.empty()) {
+ for (auto &host : Hosts)
if (other.Hosts.contains(host))
- return true;
- } else if (Tenant == other.Tenant && NodeType == other.NodeType)
- return true;
-
- return false;
-}
-
-TString TUsageScope::ToString() const
-{
- TStringBuilder str;
- if (!NodeIds.empty()) {
- str << "node(s)";
- for (auto id : NodeIds)
- str << " #" << id;
- str << " ";
- }
- else if (!Hosts.empty()) {
- str << "host(s)";
- for (auto &host : Hosts)
- str << " '" << host << "'";
- str << " ";
- } else {
- if (Tenant)
- str << "tenant " << Tenant << " ";
- if (NodeType)
- str << "node type " << NodeType << " ";
- if (!Tenant && !NodeType)
- str << "domain ";
- }
- str << "order " << Order;
- return str;
-}
-
-int TUsageScope::ComparePriority(const TUsageScope &lhs,
- const TUsageScope &rhs)
-{
- int lhp = lhs.GetPriority();
- int rhp = rhs.GetPriority();
- if (lhp < rhp)
- return 1;
- if (lhp > rhp)
- return -1;
- if (lhs.Order > rhs.Order)
- return 1;
- if (lhs.Order < rhs.Order)
- return -1;
- return 0;
-}
-
-TConfigItem::TConfigItem()
- : Kind(0)
-{
-}
-
-TConfigItem::TConfigItem(const NKikimrConsole::TConfigItem &item)
- : Id(item.GetId().GetId())
- , Generation(item.GetId().GetGeneration())
- , Kind(item.GetKind())
- , UsageScope(item.GetUsageScope(), item.GetOrder())
- , MergeStrategy(item.GetMergeStrategy())
- , Config(item.GetConfig())
- , Cookie(item.GetCookie())
-{
-}
-
-void TConfigItem::Serialize(NKikimrConsole::TConfigItem &item) const
-{
- item.MutableId()->SetId(Id);
- item.MutableId()->SetGeneration(Generation);
- item.SetKind(Kind);
- item.MutableConfig()->CopyFrom(Config);
- UsageScope.Serialize(*item.MutableUsageScope());
- item.SetOrder(UsageScope.Order);
- item.SetMergeStrategy(MergeStrategy);
- item.SetCookie(Cookie);
-}
-
-TString TConfigItem::KindName(ui32 kind)
-{
- if (NKikimrConsole::TConfigItem::EKind_IsValid(static_cast<int>(kind)))
- return NKikimrConsole::TConfigItem::EKind_Name(static_cast<NKikimrConsole::TConfigItem::EKind>(kind));
- return Sprintf("<unknown item kind (%" PRIu32 ")>", kind);
-}
-
-TString TConfigItem::KindName() const
-{
- return KindName(Kind);
-}
-
-TString TConfigItem::MergeStrategyName(ui32 merge)
-{
- if (NKikimrConsole::TConfigItem::EMergeStrategy_IsValid(static_cast<int>(merge)))
- return NKikimrConsole::TConfigItem::EMergeStrategy_Name(static_cast<NKikimrConsole::TConfigItem::EMergeStrategy>(merge));
- return Sprintf("<unknown merge strategy (%" PRIu32 ")>", merge);
-}
-
-TString TConfigItem::MergeStrategyName() const
-{
- return MergeStrategyName(MergeStrategy);
-}
-
-TString TConfigItem::ToString() const
-{
- TStringBuilder str;
- str << "item #" << Id << " kind=" << KindName()
- << " scope='" << UsageScope.ToString() << "'"
- << " merge=" << MergeStrategyName()
- << " config=" << Config.ShortDebugString()
- << " cookie=" << Cookie;
-
- return str;
-}
-
-void ClearOverwrittenRepeated(::google::protobuf::Message &to,
- ::google::protobuf::Message &from)
-{
- auto *desc = to.GetDescriptor();
- auto *reflection = to.GetReflection();
- for (int i = 0; i < desc->field_count(); ++i) {
- auto *field = desc->field(i);
- if (field->is_repeated()) {
- if (reflection->FieldSize(from, field))
- reflection->ClearField(&to, field);
- } else if (field->type() == ::google::protobuf::FieldDescriptor::TYPE_MESSAGE) {
- if (reflection->HasField(to, field) && reflection->HasField(from, field))
- ClearOverwrittenRepeated(*reflection->MutableMessage(&to, field),
- *reflection->MutableMessage(&from, field));
- }
- }
-}
-
-void MergeMessageOverwriteRepeated(::google::protobuf::Message &to,
- ::google::protobuf::Message &from)
-{
- ClearOverwrittenRepeated(to, from);
- to.MergeFrom(from);
-}
-
+ return true;
+ } else if (Tenant == other.Tenant && NodeType == other.NodeType)
+ return true;
+
+ return false;
+}
+
+TString TUsageScope::ToString() const
+{
+ TStringBuilder str;
+ if (!NodeIds.empty()) {
+ str << "node(s)";
+ for (auto id : NodeIds)
+ str << " #" << id;
+ str << " ";
+ }
+ else if (!Hosts.empty()) {
+ str << "host(s)";
+ for (auto &host : Hosts)
+ str << " '" << host << "'";
+ str << " ";
+ } else {
+ if (Tenant)
+ str << "tenant " << Tenant << " ";
+ if (NodeType)
+ str << "node type " << NodeType << " ";
+ if (!Tenant && !NodeType)
+ str << "domain ";
+ }
+ str << "order " << Order;
+ return str;
+}
+
+int TUsageScope::ComparePriority(const TUsageScope &lhs,
+ const TUsageScope &rhs)
+{
+ int lhp = lhs.GetPriority();
+ int rhp = rhs.GetPriority();
+ if (lhp < rhp)
+ return 1;
+ if (lhp > rhp)
+ return -1;
+ if (lhs.Order > rhs.Order)
+ return 1;
+ if (lhs.Order < rhs.Order)
+ return -1;
+ return 0;
+}
+
+TConfigItem::TConfigItem()
+ : Kind(0)
+{
+}
+
+TConfigItem::TConfigItem(const NKikimrConsole::TConfigItem &item)
+ : Id(item.GetId().GetId())
+ , Generation(item.GetId().GetGeneration())
+ , Kind(item.GetKind())
+ , UsageScope(item.GetUsageScope(), item.GetOrder())
+ , MergeStrategy(item.GetMergeStrategy())
+ , Config(item.GetConfig())
+ , Cookie(item.GetCookie())
+{
+}
+
+void TConfigItem::Serialize(NKikimrConsole::TConfigItem &item) const
+{
+ item.MutableId()->SetId(Id);
+ item.MutableId()->SetGeneration(Generation);
+ item.SetKind(Kind);
+ item.MutableConfig()->CopyFrom(Config);
+ UsageScope.Serialize(*item.MutableUsageScope());
+ item.SetOrder(UsageScope.Order);
+ item.SetMergeStrategy(MergeStrategy);
+ item.SetCookie(Cookie);
+}
+
+TString TConfigItem::KindName(ui32 kind)
+{
+ if (NKikimrConsole::TConfigItem::EKind_IsValid(static_cast<int>(kind)))
+ return NKikimrConsole::TConfigItem::EKind_Name(static_cast<NKikimrConsole::TConfigItem::EKind>(kind));
+ return Sprintf("<unknown item kind (%" PRIu32 ")>", kind);
+}
+
+TString TConfigItem::KindName() const
+{
+ return KindName(Kind);
+}
+
+TString TConfigItem::MergeStrategyName(ui32 merge)
+{
+ if (NKikimrConsole::TConfigItem::EMergeStrategy_IsValid(static_cast<int>(merge)))
+ return NKikimrConsole::TConfigItem::EMergeStrategy_Name(static_cast<NKikimrConsole::TConfigItem::EMergeStrategy>(merge));
+ return Sprintf("<unknown merge strategy (%" PRIu32 ")>", merge);
+}
+
+TString TConfigItem::MergeStrategyName() const
+{
+ return MergeStrategyName(MergeStrategy);
+}
+
+TString TConfigItem::ToString() const
+{
+ TStringBuilder str;
+ str << "item #" << Id << " kind=" << KindName()
+ << " scope='" << UsageScope.ToString() << "'"
+ << " merge=" << MergeStrategyName()
+ << " config=" << Config.ShortDebugString()
+ << " cookie=" << Cookie;
+
+ return str;
+}
+
+void ClearOverwrittenRepeated(::google::protobuf::Message &to,
+ ::google::protobuf::Message &from)
+{
+ auto *desc = to.GetDescriptor();
+ auto *reflection = to.GetReflection();
+ for (int i = 0; i < desc->field_count(); ++i) {
+ auto *field = desc->field(i);
+ if (field->is_repeated()) {
+ if (reflection->FieldSize(from, field))
+ reflection->ClearField(&to, field);
+ } else if (field->type() == ::google::protobuf::FieldDescriptor::TYPE_MESSAGE) {
+ if (reflection->HasField(to, field) && reflection->HasField(from, field))
+ ClearOverwrittenRepeated(*reflection->MutableMessage(&to, field),
+ *reflection->MutableMessage(&from, field));
+ }
+ }
+}
+
+void MergeMessageOverwriteRepeated(::google::protobuf::Message &to,
+ ::google::protobuf::Message &from)
+{
+ ClearOverwrittenRepeated(to, from);
+ to.MergeFrom(from);
+}
+
void TScopedConfig::ComputeConfig(NKikimrConfig::TAppConfig &config, bool addVersion) const
-{
- for (auto &pr : ConfigItems) {
- NKikimrConfig::TAppConfig mergeResult;
+{
+ for (auto &pr : ConfigItems) {
+ NKikimrConfig::TAppConfig mergeResult;
MergeItems(pr.second, mergeResult, addVersion);
- config.MergeFrom(mergeResult);
- }
-}
-
+ config.MergeFrom(mergeResult);
+ }
+}
+
void TScopedConfig::ComputeConfig(const THashSet<ui32> &kinds, NKikimrConfig::TAppConfig &config, bool addVersion) const
{
for (auto &pr : ConfigItems) {
@@ -241,24 +241,24 @@ void TScopedConfig::ComputeConfig(const THashSet<ui32> &kinds, NKikimrConfig::TA
}
}
-void TScopedConfig::MergeItems(const TOrderedConfigItems &items,
+void TScopedConfig::MergeItems(const TOrderedConfigItems &items,
NKikimrConfig::TAppConfig &config, bool addVersion) const
-{
- for (auto &item : items)
+{
+ for (auto &item : items)
MergeItem(item, config, addVersion);
-}
-
-void TScopedConfig::MergeItem(TConfigItem::TPtr item,
+}
+
+void TScopedConfig::MergeItem(TConfigItem::TPtr item,
NKikimrConfig::TAppConfig &config, bool addVersion) const
-{
- if (item->MergeStrategy == NKikimrConsole::TConfigItem::OVERWRITE)
- config.CopyFrom(item->Config);
- else if (item->MergeStrategy == NKikimrConsole::TConfigItem::MERGE)
- config.MergeFrom(item->Config);
- else if (item->MergeStrategy == NKikimrConsole::TConfigItem::MERGE_OVERWRITE_REPEATED)
- MergeMessageOverwriteRepeated(config, item->Config);
- else
- Y_FAIL("unexpected merge strategy %d", static_cast<int>(item->MergeStrategy));
+{
+ if (item->MergeStrategy == NKikimrConsole::TConfigItem::OVERWRITE)
+ config.CopyFrom(item->Config);
+ else if (item->MergeStrategy == NKikimrConsole::TConfigItem::MERGE)
+ config.MergeFrom(item->Config);
+ else if (item->MergeStrategy == NKikimrConsole::TConfigItem::MERGE_OVERWRITE_REPEATED)
+ MergeMessageOverwriteRepeated(config, item->Config);
+ else
+ Y_FAIL("unexpected merge strategy %d", static_cast<int>(item->MergeStrategy));
if (addVersion) {
auto vItem = config.MutableVersion()->AddItems();
@@ -266,429 +266,429 @@ void TScopedConfig::MergeItem(TConfigItem::TPtr item,
vItem->SetId(item->Id);
vItem->SetGeneration(item->Generation);
}
-}
-
-TConfigItem::TPtr TConfigIndex::GetItem(ui64 id) const
-{
- auto it = ConfigItems.find(id);
- if (it != ConfigItems.end())
- return it->second;
- return nullptr;
-}
-
-void TConfigIndex::AddItem(TConfigItem::TPtr item)
-{
+}
+
+TConfigItem::TPtr TConfigIndex::GetItem(ui64 id) const
+{
+ auto it = ConfigItems.find(id);
+ if (it != ConfigItems.end())
+ return it->second;
+ return nullptr;
+}
+
+void TConfigIndex::AddItem(TConfigItem::TPtr item)
+{
Y_VERIFY(!ConfigItems.contains(item->Id));
- ConfigItems.emplace(item->Id, item);
-
- if (!item->UsageScope.NodeIds.empty()) {
- for (auto nodeId : item->UsageScope.NodeIds)
- AddToIndex(item, nodeId, ConfigItemsByNodeId);
- } else if (!item->UsageScope.Hosts.empty()) {
- for (auto &host : item->UsageScope.Hosts)
- AddToIndex(item, host, ConfigItemsByHost);
- } else {
- if (item->UsageScope.Tenant)
- AddToIndex(item, item->UsageScope.Tenant, ConfigItemsByTenant);
- if (item->UsageScope.NodeType)
- AddToIndex(item, item->UsageScope.NodeType, ConfigItemsByNodeType);
- AddToIndex(item, TTenantAndNodeType(item->UsageScope.Tenant, item->UsageScope.NodeType),
- ConfigItemsByTenantAndNodeType);
- }
- AddToIndex(item, item->Cookie, ConfigItemsByCookie);
-}
-
-void TConfigIndex::RemoveItem(ui64 id)
-{
- auto item = GetItem(id);
- Y_VERIFY(item);
-
- if (!item->UsageScope.NodeIds.empty()) {
- for (auto nodeId : item->UsageScope.NodeIds)
- RemoveFromIndex(item, nodeId, ConfigItemsByNodeId);
- } else if (!item->UsageScope.Hosts.empty()) {
- for (auto &host : item->UsageScope.Hosts)
- RemoveFromIndex(item, host, ConfigItemsByHost);
- } else {
- if (item->UsageScope.Tenant)
- RemoveFromIndex(item, item->UsageScope.Tenant, ConfigItemsByTenant);
- if (item->UsageScope.NodeType)
- RemoveFromIndex(item, item->UsageScope.NodeType, ConfigItemsByNodeType);
- RemoveFromIndex(item, TTenantAndNodeType(item->UsageScope.Tenant, item->UsageScope.NodeType),
- ConfigItemsByTenantAndNodeType);
- }
- RemoveFromIndex(item, item->Cookie, ConfigItemsByCookie);
-
- ConfigItems.erase(id);
-}
-
-void TConfigIndex::Clear()
-{
- ConfigItems.clear();
- ConfigItemsByNodeId.clear();
- ConfigItemsByHost.clear();
- ConfigItemsByTenant.clear();
- ConfigItemsByNodeType.clear();
- ConfigItemsByTenantAndNodeType.clear();
- ConfigItemsByCookie.clear();
-}
-
-void TConfigIndex::CollectItemsByScope(const NKikimrConsole::TUsageScope &scope,
- const THashSet<ui32> &kinds,
- TConfigItems &items) const
-{
- TConfigItems candidates;
-
- switch (scope.GetFilterCase()) {
- case NKikimrConsole::TUsageScope::kNodeFilter:
- {
- auto &filter = scope.GetNodeFilter();
- if (filter.NodesSize())
- CollectItemsByNodeId(filter.GetNodes(0), kinds, candidates);
- }
- break;
- case NKikimrConsole::TUsageScope::kHostFilter:
- {
- auto &filter = scope.GetHostFilter();
- if (filter.HostsSize())
- CollectItemsByHost(filter.GetHosts(0), kinds, candidates);
- }
- break;
- case NKikimrConsole::TUsageScope::kTenantAndNodeTypeFilter:
- {
- auto &filter = scope.GetTenantAndNodeTypeFilter();
- CollectItemsByTenantAndNodeType(filter.GetTenant(), filter.GetNodeType(), kinds, candidates);
- }
- break;
- case NKikimrConsole::TUsageScope::FILTER_NOT_SET:
- CollectItemsByTenantAndNodeType("", "", kinds, candidates);
- break;
- default:
- Y_FAIL("unsupported filter case");
- }
-
- for (auto &item : candidates)
- if (item->UsageScope.IsSameScope(scope))
- items.insert(item);
-}
-
-void TConfigIndex::CollectItemsByScope(const TUsageScope &scope,
- const THashSet<ui32> &kinds,
- TConfigItems &items) const
-{
- TConfigItems candidates;
-
- if (!scope.NodeIds.empty())
- CollectItemsByNodeId(*scope.NodeIds.begin(), kinds, candidates);
- else if (!scope.Hosts.empty())
- CollectItemsByHost(*scope.Hosts.begin(), kinds, candidates);
- else
- CollectItemsByTenantAndNodeType(scope.Tenant, scope.NodeType, kinds, candidates);
-
- for (auto &item : candidates)
- if (item->UsageScope == scope)
- items.insert(item);
-}
-
-void TConfigIndex::CollectItemsByConflictingScope(const TUsageScope &scope,
- const THashSet<ui32> &kinds,
- bool ignoreOrder,
- TConfigItems &items) const
-{
- TConfigItems candidates;
-
- if (!scope.NodeIds.empty()) {
- for (auto id : scope.NodeIds)
- CollectItemsByNodeId(id, kinds, candidates);
- } else if (!scope.Hosts.empty()) {
- for (auto &host : scope.Hosts)
- CollectItemsByHost(host, kinds, candidates);
- } else
- CollectItemsByTenantAndNodeType(scope.Tenant, scope.NodeType, kinds, candidates);
-
- if (ignoreOrder)
- items.insert(candidates.begin(), candidates.end());
- else {
- for (auto &item : candidates) {
- if (item->UsageScope.Order == scope.Order)
- items.insert(item);
- }
- }
-}
-
-void TConfigIndex::CollectItemsForNode(const NKikimrConsole::TNodeAttributes &attrs,
- const THashSet<ui32> &kinds,
- TConfigItems &items) const
-{
- CollectItemsByNodeId(attrs.GetNodeId(), kinds, items);
- CollectItemsByHost(attrs.GetHost(), kinds, items);
- CollectItemsByTenantAndNodeType(attrs.GetTenant(), attrs.GetNodeType(), kinds, items);
- if (attrs.GetTenant())
- CollectItemsByTenantAndNodeType("", attrs.GetNodeType(), kinds, items);
- if (attrs.GetNodeType())
- CollectItemsByTenantAndNodeType(attrs.GetTenant(), "", kinds, items);
- if (attrs.GetTenant() && attrs.GetNodeType())
- CollectItemsByTenantAndNodeType("", "", kinds, items);
-}
-
-void TConfigIndex::CollectItemsFromMap(const TConfigItemsMap &map,
- const THashSet<ui32> &kinds,
- TConfigItems &items) const
-{
- if (kinds.empty()) {
- for (auto &pr : map)
- items.insert(pr.second.begin(), pr.second.end());
- } else {
- for (auto kind : kinds) {
- auto it = map.find(kind);
- if (it != map.end())
- items.insert(it->second.begin(), it->second.end());
- }
- }
-}
-
-void TConfigIndex::CollectItemsFromMap(const TConfigItemsMap &map,
- const THashSet<ui32> &kinds,
- TOrderedConfigItemsMap &items) const
-{
- if (kinds.empty()) {
- for (auto &pr : map)
- items[pr.first].insert(pr.second.begin(), pr.second.end());
- } else {
- for (auto kind : kinds) {
- auto it = map.find(kind);
- if (it != map.end())
- items[kind].insert(it->second.begin(), it->second.end());
- }
- }
-}
-
-void TConfigIndex::CollectItemsFromMap(const TConfigItemsMap &map,
- const TDynBitMap &kinds,
- TConfigItems &items) const
-{
- if (kinds.Empty()) {
- for (auto &pr : map)
- items.insert(pr.second.begin(), pr.second.end());
- } else {
- Y_FOR_EACH_BIT(kind, kinds) {
- auto it = map.find(static_cast<ui32>(kind));
- if (it != map.end())
- items.insert(it->second.begin(), it->second.end());
- }
- }
-}
-
-void TConfigIndex::CollectItemsFromMap(const TConfigItemsMap &map,
- const TDynBitMap &kinds,
- TOrderedConfigItemsMap &items) const
-{
- if (kinds.Empty()) {
- for (auto &pr : map)
- items[pr.first].insert(pr.second.begin(), pr.second.end());
- } else {
- Y_FOR_EACH_BIT(kind, kinds) {
- auto it = map.find(static_cast<ui32>(kind));
- if (it != map.end())
- items[kind].insert(it->second.begin(), it->second.end());
- }
- }
-}
-
-TDynBitMap TConfigIndex::ItemKindsWithDomainScope() const
-{
- TDynBitMap result;
- auto it = ConfigItemsByTenantAndNodeType.find(TTenantAndNodeType(TString(), TString()));
- if (it != ConfigItemsByTenantAndNodeType.end()) {
- for (auto &pr : it->second)
- result.Set(pr.first);
- }
- return result;
-}
-
-TDynBitMap TConfigIndex::ItemKindsWithTenantScope() const
-{
- TDynBitMap result;
- for (auto &pr1 : ConfigItemsByTenant) {
- for (auto &pr2 : pr1.second)
- result.Set(pr2.first);
- }
- return result;
-}
-
-TDynBitMap TConfigIndex::ItemKindsWithNodeTypeScope() const
-{
- TDynBitMap result;
- for (auto &pr1 : ConfigItemsByNodeType) {
- for (auto &pr2 : pr1.second)
- result.Set(pr2.first);
- }
- return result;
-}
-
-void TConfigIndex::CollectTenantAndNodeTypeUsageScopes(const TDynBitMap &kinds,
- THashSet<TString> &tenants,
- THashSet<TString> &types,
- THashSet<TTenantAndNodeType> &tenantAndNodeTypes) const
-{
- for (auto &pr : ConfigItemsByTenantAndNodeType) {
- if (!kinds.Empty()) {
- bool found = false;
- Y_FOR_EACH_BIT(kind, kinds) {
+ ConfigItems.emplace(item->Id, item);
+
+ if (!item->UsageScope.NodeIds.empty()) {
+ for (auto nodeId : item->UsageScope.NodeIds)
+ AddToIndex(item, nodeId, ConfigItemsByNodeId);
+ } else if (!item->UsageScope.Hosts.empty()) {
+ for (auto &host : item->UsageScope.Hosts)
+ AddToIndex(item, host, ConfigItemsByHost);
+ } else {
+ if (item->UsageScope.Tenant)
+ AddToIndex(item, item->UsageScope.Tenant, ConfigItemsByTenant);
+ if (item->UsageScope.NodeType)
+ AddToIndex(item, item->UsageScope.NodeType, ConfigItemsByNodeType);
+ AddToIndex(item, TTenantAndNodeType(item->UsageScope.Tenant, item->UsageScope.NodeType),
+ ConfigItemsByTenantAndNodeType);
+ }
+ AddToIndex(item, item->Cookie, ConfigItemsByCookie);
+}
+
+void TConfigIndex::RemoveItem(ui64 id)
+{
+ auto item = GetItem(id);
+ Y_VERIFY(item);
+
+ if (!item->UsageScope.NodeIds.empty()) {
+ for (auto nodeId : item->UsageScope.NodeIds)
+ RemoveFromIndex(item, nodeId, ConfigItemsByNodeId);
+ } else if (!item->UsageScope.Hosts.empty()) {
+ for (auto &host : item->UsageScope.Hosts)
+ RemoveFromIndex(item, host, ConfigItemsByHost);
+ } else {
+ if (item->UsageScope.Tenant)
+ RemoveFromIndex(item, item->UsageScope.Tenant, ConfigItemsByTenant);
+ if (item->UsageScope.NodeType)
+ RemoveFromIndex(item, item->UsageScope.NodeType, ConfigItemsByNodeType);
+ RemoveFromIndex(item, TTenantAndNodeType(item->UsageScope.Tenant, item->UsageScope.NodeType),
+ ConfigItemsByTenantAndNodeType);
+ }
+ RemoveFromIndex(item, item->Cookie, ConfigItemsByCookie);
+
+ ConfigItems.erase(id);
+}
+
+void TConfigIndex::Clear()
+{
+ ConfigItems.clear();
+ ConfigItemsByNodeId.clear();
+ ConfigItemsByHost.clear();
+ ConfigItemsByTenant.clear();
+ ConfigItemsByNodeType.clear();
+ ConfigItemsByTenantAndNodeType.clear();
+ ConfigItemsByCookie.clear();
+}
+
+void TConfigIndex::CollectItemsByScope(const NKikimrConsole::TUsageScope &scope,
+ const THashSet<ui32> &kinds,
+ TConfigItems &items) const
+{
+ TConfigItems candidates;
+
+ switch (scope.GetFilterCase()) {
+ case NKikimrConsole::TUsageScope::kNodeFilter:
+ {
+ auto &filter = scope.GetNodeFilter();
+ if (filter.NodesSize())
+ CollectItemsByNodeId(filter.GetNodes(0), kinds, candidates);
+ }
+ break;
+ case NKikimrConsole::TUsageScope::kHostFilter:
+ {
+ auto &filter = scope.GetHostFilter();
+ if (filter.HostsSize())
+ CollectItemsByHost(filter.GetHosts(0), kinds, candidates);
+ }
+ break;
+ case NKikimrConsole::TUsageScope::kTenantAndNodeTypeFilter:
+ {
+ auto &filter = scope.GetTenantAndNodeTypeFilter();
+ CollectItemsByTenantAndNodeType(filter.GetTenant(), filter.GetNodeType(), kinds, candidates);
+ }
+ break;
+ case NKikimrConsole::TUsageScope::FILTER_NOT_SET:
+ CollectItemsByTenantAndNodeType("", "", kinds, candidates);
+ break;
+ default:
+ Y_FAIL("unsupported filter case");
+ }
+
+ for (auto &item : candidates)
+ if (item->UsageScope.IsSameScope(scope))
+ items.insert(item);
+}
+
+void TConfigIndex::CollectItemsByScope(const TUsageScope &scope,
+ const THashSet<ui32> &kinds,
+ TConfigItems &items) const
+{
+ TConfigItems candidates;
+
+ if (!scope.NodeIds.empty())
+ CollectItemsByNodeId(*scope.NodeIds.begin(), kinds, candidates);
+ else if (!scope.Hosts.empty())
+ CollectItemsByHost(*scope.Hosts.begin(), kinds, candidates);
+ else
+ CollectItemsByTenantAndNodeType(scope.Tenant, scope.NodeType, kinds, candidates);
+
+ for (auto &item : candidates)
+ if (item->UsageScope == scope)
+ items.insert(item);
+}
+
+void TConfigIndex::CollectItemsByConflictingScope(const TUsageScope &scope,
+ const THashSet<ui32> &kinds,
+ bool ignoreOrder,
+ TConfigItems &items) const
+{
+ TConfigItems candidates;
+
+ if (!scope.NodeIds.empty()) {
+ for (auto id : scope.NodeIds)
+ CollectItemsByNodeId(id, kinds, candidates);
+ } else if (!scope.Hosts.empty()) {
+ for (auto &host : scope.Hosts)
+ CollectItemsByHost(host, kinds, candidates);
+ } else
+ CollectItemsByTenantAndNodeType(scope.Tenant, scope.NodeType, kinds, candidates);
+
+ if (ignoreOrder)
+ items.insert(candidates.begin(), candidates.end());
+ else {
+ for (auto &item : candidates) {
+ if (item->UsageScope.Order == scope.Order)
+ items.insert(item);
+ }
+ }
+}
+
+void TConfigIndex::CollectItemsForNode(const NKikimrConsole::TNodeAttributes &attrs,
+ const THashSet<ui32> &kinds,
+ TConfigItems &items) const
+{
+ CollectItemsByNodeId(attrs.GetNodeId(), kinds, items);
+ CollectItemsByHost(attrs.GetHost(), kinds, items);
+ CollectItemsByTenantAndNodeType(attrs.GetTenant(), attrs.GetNodeType(), kinds, items);
+ if (attrs.GetTenant())
+ CollectItemsByTenantAndNodeType("", attrs.GetNodeType(), kinds, items);
+ if (attrs.GetNodeType())
+ CollectItemsByTenantAndNodeType(attrs.GetTenant(), "", kinds, items);
+ if (attrs.GetTenant() && attrs.GetNodeType())
+ CollectItemsByTenantAndNodeType("", "", kinds, items);
+}
+
+void TConfigIndex::CollectItemsFromMap(const TConfigItemsMap &map,
+ const THashSet<ui32> &kinds,
+ TConfigItems &items) const
+{
+ if (kinds.empty()) {
+ for (auto &pr : map)
+ items.insert(pr.second.begin(), pr.second.end());
+ } else {
+ for (auto kind : kinds) {
+ auto it = map.find(kind);
+ if (it != map.end())
+ items.insert(it->second.begin(), it->second.end());
+ }
+ }
+}
+
+void TConfigIndex::CollectItemsFromMap(const TConfigItemsMap &map,
+ const THashSet<ui32> &kinds,
+ TOrderedConfigItemsMap &items) const
+{
+ if (kinds.empty()) {
+ for (auto &pr : map)
+ items[pr.first].insert(pr.second.begin(), pr.second.end());
+ } else {
+ for (auto kind : kinds) {
+ auto it = map.find(kind);
+ if (it != map.end())
+ items[kind].insert(it->second.begin(), it->second.end());
+ }
+ }
+}
+
+void TConfigIndex::CollectItemsFromMap(const TConfigItemsMap &map,
+ const TDynBitMap &kinds,
+ TConfigItems &items) const
+{
+ if (kinds.Empty()) {
+ for (auto &pr : map)
+ items.insert(pr.second.begin(), pr.second.end());
+ } else {
+ Y_FOR_EACH_BIT(kind, kinds) {
+ auto it = map.find(static_cast<ui32>(kind));
+ if (it != map.end())
+ items.insert(it->second.begin(), it->second.end());
+ }
+ }
+}
+
+void TConfigIndex::CollectItemsFromMap(const TConfigItemsMap &map,
+ const TDynBitMap &kinds,
+ TOrderedConfigItemsMap &items) const
+{
+ if (kinds.Empty()) {
+ for (auto &pr : map)
+ items[pr.first].insert(pr.second.begin(), pr.second.end());
+ } else {
+ Y_FOR_EACH_BIT(kind, kinds) {
+ auto it = map.find(static_cast<ui32>(kind));
+ if (it != map.end())
+ items[kind].insert(it->second.begin(), it->second.end());
+ }
+ }
+}
+
+TDynBitMap TConfigIndex::ItemKindsWithDomainScope() const
+{
+ TDynBitMap result;
+ auto it = ConfigItemsByTenantAndNodeType.find(TTenantAndNodeType(TString(), TString()));
+ if (it != ConfigItemsByTenantAndNodeType.end()) {
+ for (auto &pr : it->second)
+ result.Set(pr.first);
+ }
+ return result;
+}
+
+TDynBitMap TConfigIndex::ItemKindsWithTenantScope() const
+{
+ TDynBitMap result;
+ for (auto &pr1 : ConfigItemsByTenant) {
+ for (auto &pr2 : pr1.second)
+ result.Set(pr2.first);
+ }
+ return result;
+}
+
+TDynBitMap TConfigIndex::ItemKindsWithNodeTypeScope() const
+{
+ TDynBitMap result;
+ for (auto &pr1 : ConfigItemsByNodeType) {
+ for (auto &pr2 : pr1.second)
+ result.Set(pr2.first);
+ }
+ return result;
+}
+
+void TConfigIndex::CollectTenantAndNodeTypeUsageScopes(const TDynBitMap &kinds,
+ THashSet<TString> &tenants,
+ THashSet<TString> &types,
+ THashSet<TTenantAndNodeType> &tenantAndNodeTypes) const
+{
+ for (auto &pr : ConfigItemsByTenantAndNodeType) {
+ if (!kinds.Empty()) {
+ bool found = false;
+ Y_FOR_EACH_BIT(kind, kinds) {
if (pr.second.contains(kind)) {
- found = true;
- break;
- }
- }
- if (!found)
- continue;
- }
-
- if (pr.first.Tenant && pr.first.NodeType)
- tenantAndNodeTypes.insert(pr.first);
- else if (pr.first.Tenant)
- tenants.insert(pr.first.Tenant);
- else if (pr.first.NodeType)
- types.insert(pr.first.NodeType);
- }
-}
-
-TScopedConfig::TPtr TConfigIndex::GetNodeConfig(const NKikimrConsole::TNodeAttributes &attrs,
- const THashSet<ui32> &kinds) const
-{
- return BuildConfig(attrs.GetNodeId(), attrs.GetHost(), attrs.GetTenant(),
- attrs.GetNodeType(), kinds);
-}
-
-void TConfigModifications::Clear()
-{
- AddedItems.clear();
- ModifiedItems.clear();
- RemovedItems.clear();
-}
-
-bool TConfigModifications::IsEmpty() const
-{
- return AddedItems.empty() && ModifiedItems.empty() && RemovedItems.empty();
-}
-
-void TConfigModifications::DeepCopyFrom(const TConfigModifications &other)
-{
- for (auto item : other.AddedItems)
- AddedItems.push_back(new TConfigItem(*item));
- for (auto &pr : other.ModifiedItems)
- ModifiedItems.emplace(pr.first, new TConfigItem(*pr.second));
- RemovedItems = other.RemovedItems;
-}
-
-void TConfigModifications::ApplyTo(TConfigIndex &index) const
-{
- for (auto id : RemovedItems)
- index.RemoveItem(id);
- for (auto &pr : ModifiedItems)
- index.RemoveItem(pr.first);
- for (auto &pr : ModifiedItems)
- index.AddItem(pr.second);
- for (auto item : AddedItems)
- index.AddItem(item);
-}
-
-void TSubscription::Load(const NKikimrConsole::TSubscription &subscription)
-{
- Id = subscription.GetId();
- if (subscription.GetSubscriber().HasTabletId())
- Subscriber.TabletId = subscription.GetSubscriber().GetTabletId();
- else if (subscription.GetSubscriber().HasServiceId())
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ continue;
+ }
+
+ if (pr.first.Tenant && pr.first.NodeType)
+ tenantAndNodeTypes.insert(pr.first);
+ else if (pr.first.Tenant)
+ tenants.insert(pr.first.Tenant);
+ else if (pr.first.NodeType)
+ types.insert(pr.first.NodeType);
+ }
+}
+
+TScopedConfig::TPtr TConfigIndex::GetNodeConfig(const NKikimrConsole::TNodeAttributes &attrs,
+ const THashSet<ui32> &kinds) const
+{
+ return BuildConfig(attrs.GetNodeId(), attrs.GetHost(), attrs.GetTenant(),
+ attrs.GetNodeType(), kinds);
+}
+
+void TConfigModifications::Clear()
+{
+ AddedItems.clear();
+ ModifiedItems.clear();
+ RemovedItems.clear();
+}
+
+bool TConfigModifications::IsEmpty() const
+{
+ return AddedItems.empty() && ModifiedItems.empty() && RemovedItems.empty();
+}
+
+void TConfigModifications::DeepCopyFrom(const TConfigModifications &other)
+{
+ for (auto item : other.AddedItems)
+ AddedItems.push_back(new TConfigItem(*item));
+ for (auto &pr : other.ModifiedItems)
+ ModifiedItems.emplace(pr.first, new TConfigItem(*pr.second));
+ RemovedItems = other.RemovedItems;
+}
+
+void TConfigModifications::ApplyTo(TConfigIndex &index) const
+{
+ for (auto id : RemovedItems)
+ index.RemoveItem(id);
+ for (auto &pr : ModifiedItems)
+ index.RemoveItem(pr.first);
+ for (auto &pr : ModifiedItems)
+ index.AddItem(pr.second);
+ for (auto item : AddedItems)
+ index.AddItem(item);
+}
+
+void TSubscription::Load(const NKikimrConsole::TSubscription &subscription)
+{
+ Id = subscription.GetId();
+ if (subscription.GetSubscriber().HasTabletId())
+ Subscriber.TabletId = subscription.GetSubscriber().GetTabletId();
+ else if (subscription.GetSubscriber().HasServiceId())
Subscriber.ServiceId = ActorIdFromProto(subscription.GetSubscriber().GetServiceId());
- NodeId = subscription.GetOptions().GetNodeId();
- Host = subscription.GetOptions().GetHost();
- Tenant = subscription.GetOptions().GetTenant();
- NodeType = subscription.GetOptions().GetNodeType();
- for (auto &kind : subscription.GetConfigItemKinds())
- ItemKinds.insert(kind);
-}
-
-void TSubscription::Serialize(NKikimrConsole::TSubscription &subscription)
-{
- subscription.SetId(Id);
- Subscriber.Serialize(*subscription.MutableSubscriber());
- subscription.MutableOptions()->SetNodeId(NodeId);
- subscription.MutableOptions()->SetHost(Host);
- subscription.MutableOptions()->SetTenant(Tenant);
- subscription.MutableOptions()->SetNodeType(NodeType);
- for (auto &kind : ItemKinds)
- subscription.AddConfigItemKinds(kind);
-}
-
-bool TSubscription::IsEqual(const TSubscription &other) const
-{
- return (Subscriber == other.Subscriber
- && NodeId == other.NodeId
- && Host == other.Host
- && Tenant == other.Tenant
- && NodeType == other.NodeType
- && ItemKinds == other.ItemKinds);
-}
-
-TString TSubscription::ToString() const
-{
- TStringStream ss;
- ss << "id=" << Id
- << " tabletid=" << Subscriber.TabletId
- << " serviceid=" << Subscriber.ServiceId
- << " nodeid=" << NodeId
- << " host=" << Host
- << " tenant=" << Tenant
- << " nodetype=" << NodeType
- << " kinds=" << JoinSeq(",", ItemKinds)
- << " lastprovidedconfig=" << LastProvidedConfig.ToString();
- return ss.Str();
-}
-
-TSubscription::TPtr TSubscriptionIndex::GetSubscription(ui64 id) const
-{
- auto it = Subscriptions.find(id);
- if (it != Subscriptions.end())
- return it->second;
- return nullptr;
-}
-
-const TSubscriptionSet &TSubscriptionIndex::GetSubscriptions(TSubscriberId id) const
-{
- auto it = SubscriptionsBySubscriber.find(id);
- if (it != SubscriptionsBySubscriber.end())
- return it->second;
- return EmptySubscriptionsSet;
-}
-
-const THashMap<ui64, TSubscription::TPtr> &TSubscriptionIndex::GetSubscriptions() const
-{
- return Subscriptions;
-}
-
-void TSubscriptionIndex::AddSubscription(TSubscription::TPtr subscription)
-{
+ NodeId = subscription.GetOptions().GetNodeId();
+ Host = subscription.GetOptions().GetHost();
+ Tenant = subscription.GetOptions().GetTenant();
+ NodeType = subscription.GetOptions().GetNodeType();
+ for (auto &kind : subscription.GetConfigItemKinds())
+ ItemKinds.insert(kind);
+}
+
+void TSubscription::Serialize(NKikimrConsole::TSubscription &subscription)
+{
+ subscription.SetId(Id);
+ Subscriber.Serialize(*subscription.MutableSubscriber());
+ subscription.MutableOptions()->SetNodeId(NodeId);
+ subscription.MutableOptions()->SetHost(Host);
+ subscription.MutableOptions()->SetTenant(Tenant);
+ subscription.MutableOptions()->SetNodeType(NodeType);
+ for (auto &kind : ItemKinds)
+ subscription.AddConfigItemKinds(kind);
+}
+
+bool TSubscription::IsEqual(const TSubscription &other) const
+{
+ return (Subscriber == other.Subscriber
+ && NodeId == other.NodeId
+ && Host == other.Host
+ && Tenant == other.Tenant
+ && NodeType == other.NodeType
+ && ItemKinds == other.ItemKinds);
+}
+
+TString TSubscription::ToString() const
+{
+ TStringStream ss;
+ ss << "id=" << Id
+ << " tabletid=" << Subscriber.TabletId
+ << " serviceid=" << Subscriber.ServiceId
+ << " nodeid=" << NodeId
+ << " host=" << Host
+ << " tenant=" << Tenant
+ << " nodetype=" << NodeType
+ << " kinds=" << JoinSeq(",", ItemKinds)
+ << " lastprovidedconfig=" << LastProvidedConfig.ToString();
+ return ss.Str();
+}
+
+TSubscription::TPtr TSubscriptionIndex::GetSubscription(ui64 id) const
+{
+ auto it = Subscriptions.find(id);
+ if (it != Subscriptions.end())
+ return it->second;
+ return nullptr;
+}
+
+const TSubscriptionSet &TSubscriptionIndex::GetSubscriptions(TSubscriberId id) const
+{
+ auto it = SubscriptionsBySubscriber.find(id);
+ if (it != SubscriptionsBySubscriber.end())
+ return it->second;
+ return EmptySubscriptionsSet;
+}
+
+const THashMap<ui64, TSubscription::TPtr> &TSubscriptionIndex::GetSubscriptions() const
+{
+ return Subscriptions;
+}
+
+void TSubscriptionIndex::AddSubscription(TSubscription::TPtr subscription)
+{
Y_VERIFY(!Subscriptions.contains(subscription->Id));
- Subscriptions.emplace(subscription->Id, subscription);
- SubscriptionsBySubscriber[subscription->Subscriber].insert(subscription);
- SubscriptionsByNodeId[subscription->NodeId].insert(subscription);
- SubscriptionsByHost[subscription->Host].insert(subscription);
- SubscriptionsByTenant[subscription->Tenant].insert(subscription);
- SubscriptionsByNodeType[subscription->NodeType].insert(subscription);
-}
-
-void TSubscriptionIndex::RemoveSubscription(ui64 id)
-{
- auto subscription = GetSubscription(id);
- Y_VERIFY(subscription);
- RemoveFromIndex(subscription, subscription->Subscriber, SubscriptionsBySubscriber);
- RemoveFromIndex(subscription, subscription->NodeId, SubscriptionsByNodeId);
- RemoveFromIndex(subscription, subscription->Host, SubscriptionsByHost);
- RemoveFromIndex(subscription, subscription->Tenant, SubscriptionsByTenant);
- RemoveFromIndex(subscription, subscription->NodeType, SubscriptionsByNodeType);
- Subscriptions.erase(id);
-}
-
+ Subscriptions.emplace(subscription->Id, subscription);
+ SubscriptionsBySubscriber[subscription->Subscriber].insert(subscription);
+ SubscriptionsByNodeId[subscription->NodeId].insert(subscription);
+ SubscriptionsByHost[subscription->Host].insert(subscription);
+ SubscriptionsByTenant[subscription->Tenant].insert(subscription);
+ SubscriptionsByNodeType[subscription->NodeType].insert(subscription);
+}
+
+void TSubscriptionIndex::RemoveSubscription(ui64 id)
+{
+ auto subscription = GetSubscription(id);
+ Y_VERIFY(subscription);
+ RemoveFromIndex(subscription, subscription->Subscriber, SubscriptionsBySubscriber);
+ RemoveFromIndex(subscription, subscription->NodeId, SubscriptionsByNodeId);
+ RemoveFromIndex(subscription, subscription->Host, SubscriptionsByHost);
+ RemoveFromIndex(subscription, subscription->Tenant, SubscriptionsByTenant);
+ RemoveFromIndex(subscription, subscription->NodeType, SubscriptionsByNodeType);
+ Subscriptions.erase(id);
+}
+
TInMemorySubscription::TPtr TInMemorySubscriptionIndex::GetSubscription(const TActorId &subscriber)
{
auto it = Subscriptions.find(subscriber);
@@ -781,91 +781,91 @@ void TInMemorySubscriptionIndex::CollectAffectedSubscriptions(const TUsageScope
}
}
-void TSubscriptionIndex::CollectAffectedSubscriptions(const TUsageScope &scope,
- ui32 kind,
- TSubscriptionSet &subscriptions) const
-{
- if (subscriptions.size() == Subscriptions.size())
- return;
-
- bool hasFilter = false;
-
- for (ui32 nodeId : scope.NodeIds) {
- auto it = SubscriptionsByNodeId.find(nodeId);
- if (it != SubscriptionsByNodeId.end()) {
- for (auto & subscription : it->second)
+void TSubscriptionIndex::CollectAffectedSubscriptions(const TUsageScope &scope,
+ ui32 kind,
+ TSubscriptionSet &subscriptions) const
+{
+ if (subscriptions.size() == Subscriptions.size())
+ return;
+
+ bool hasFilter = false;
+
+ for (ui32 nodeId : scope.NodeIds) {
+ auto it = SubscriptionsByNodeId.find(nodeId);
+ if (it != SubscriptionsByNodeId.end()) {
+ for (auto & subscription : it->second)
if (subscription->ItemKinds.contains(kind))
- subscriptions.insert(subscription);
- }
- hasFilter = true;
- }
-
- for (auto &host : scope.Hosts) {
- auto it = SubscriptionsByHost.find(host);
- if (it != SubscriptionsByHost.end()) {
- for (auto & subscription : it->second)
+ subscriptions.insert(subscription);
+ }
+ hasFilter = true;
+ }
+
+ for (auto &host : scope.Hosts) {
+ auto it = SubscriptionsByHost.find(host);
+ if (it != SubscriptionsByHost.end()) {
+ for (auto & subscription : it->second)
if (subscription->ItemKinds.contains(kind))
- subscriptions.insert(subscription);
- }
- hasFilter = true;
- }
-
- if (scope.Tenant) {
- auto it = SubscriptionsByTenant.find(scope.Tenant);
- if (it != SubscriptionsByTenant.end()) {
- for (auto & subscription : it->second)
+ subscriptions.insert(subscription);
+ }
+ hasFilter = true;
+ }
+
+ if (scope.Tenant) {
+ auto it = SubscriptionsByTenant.find(scope.Tenant);
+ if (it != SubscriptionsByTenant.end()) {
+ for (auto & subscription : it->second)
if (subscription->ItemKinds.contains(kind))
- subscriptions.insert(subscription);
- }
- hasFilter = true;
- }
-
- if (scope.NodeType) {
- auto it = SubscriptionsByNodeType.find(scope.NodeType);
- if (it != SubscriptionsByNodeType.end()) {
- for (auto & subscription : it->second)
+ subscriptions.insert(subscription);
+ }
+ hasFilter = true;
+ }
+
+ if (scope.NodeType) {
+ auto it = SubscriptionsByNodeType.find(scope.NodeType);
+ if (it != SubscriptionsByNodeType.end()) {
+ for (auto & subscription : it->second)
if (subscription->ItemKinds.contains(kind))
- subscriptions.insert(subscription);
- }
- hasFilter = true;
- }
-
- if (!hasFilter) {
- for (auto &pr : Subscriptions)
- subscriptions.insert(pr.second);
- }
-}
-
-void TSubscriptionIndex::Clear()
-{
- Subscriptions.clear();
- SubscriptionsBySubscriber.clear();
-}
-
-void TSubscriptionModifications::Clear()
-{
- RemovedSubscriptions.clear();
- AddedSubscriptions.clear();
- ModifiedLastProvided.clear();
- ModifiedCookies.clear();
-}
-
-bool TSubscriptionModifications::IsEmpty() const
-{
- return (RemovedSubscriptions.empty()
- && AddedSubscriptions.empty()
- && ModifiedLastProvided.empty()
- && ModifiedCookies.empty());
-}
-
-void TSubscriptionModifications::DeepCopyFrom(const TSubscriptionModifications &other)
-{
- RemovedSubscriptions = other.RemovedSubscriptions;
- for (auto &subscription : other.AddedSubscriptions)
- AddedSubscriptions.push_back(new TSubscription(*subscription));
- ModifiedLastProvided = other.ModifiedLastProvided;
- ModifiedCookies = other.ModifiedCookies;
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ subscriptions.insert(subscription);
+ }
+ hasFilter = true;
+ }
+
+ if (!hasFilter) {
+ for (auto &pr : Subscriptions)
+ subscriptions.insert(pr.second);
+ }
+}
+
+void TSubscriptionIndex::Clear()
+{
+ Subscriptions.clear();
+ SubscriptionsBySubscriber.clear();
+}
+
+void TSubscriptionModifications::Clear()
+{
+ RemovedSubscriptions.clear();
+ AddedSubscriptions.clear();
+ ModifiedLastProvided.clear();
+ ModifiedCookies.clear();
+}
+
+bool TSubscriptionModifications::IsEmpty() const
+{
+ return (RemovedSubscriptions.empty()
+ && AddedSubscriptions.empty()
+ && ModifiedLastProvided.empty()
+ && ModifiedCookies.empty());
+}
+
+void TSubscriptionModifications::DeepCopyFrom(const TSubscriptionModifications &other)
+{
+ RemovedSubscriptions = other.RemovedSubscriptions;
+ for (auto &subscription : other.AddedSubscriptions)
+ AddedSubscriptions.push_back(new TSubscription(*subscription));
+ ModifiedLastProvided = other.ModifiedLastProvided;
+ ModifiedCookies = other.ModifiedCookies;
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/config_index.h b/ydb/core/cms/console/config_index.h
index 596c9bfad92..b332b90b8ff 100644
--- a/ydb/core/cms/console/config_index.h
+++ b/ydb/core/cms/console/config_index.h
@@ -1,652 +1,652 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <ydb/core/protos/console_config.pb.h>
-
-#include <util/generic/bitmap.h>
-#include <util/generic/hash.h>
-#include <util/generic/hash_set.h>
-#include <util/generic/ptr.h>
-#include <util/generic/set.h>
-#include <util/stream/str.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-struct TTenantAndNodeType {
- TTenantAndNodeType() = default;
- TTenantAndNodeType(const TTenantAndNodeType &other) = default;
- TTenantAndNodeType(TTenantAndNodeType &&other) = default;
-
- TTenantAndNodeType(const TString &tenant,
- const TString nodeType)
- : Tenant(tenant)
- , NodeType(nodeType)
- {
- }
-
- TTenantAndNodeType &operator=(const TTenantAndNodeType &other) = default;
- TTenantAndNodeType &operator=(TTenantAndNodeType &&other) = default;
-
- bool operator==(const NKikimr::NConsole::TTenantAndNodeType &other) const
- {
- return (Tenant == other.Tenant
- && NodeType == other.NodeType);
- };
-
- bool operator!=(const NKikimr::NConsole::TTenantAndNodeType &other) const
- {
- return !(*this == other);
- };
-
- TString Tenant;
- TString NodeType;
-};
-
-/**
- * Structure to describe configs subscriber which is
- * either tablet or service.
- */
-struct TSubscriberId {
- TSubscriberId()
- : TabletId(0)
- {
- }
-
- TSubscriberId(const NKikimrConsole::TSubscriber &proto)
- : TabletId(0)
- {
- if (proto.HasTabletId())
- TabletId = proto.GetTabletId();
- else if (proto.HasServiceId())
+
+#include <util/generic/bitmap.h>
+#include <util/generic/hash.h>
+#include <util/generic/hash_set.h>
+#include <util/generic/ptr.h>
+#include <util/generic/set.h>
+#include <util/stream/str.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+struct TTenantAndNodeType {
+ TTenantAndNodeType() = default;
+ TTenantAndNodeType(const TTenantAndNodeType &other) = default;
+ TTenantAndNodeType(TTenantAndNodeType &&other) = default;
+
+ TTenantAndNodeType(const TString &tenant,
+ const TString nodeType)
+ : Tenant(tenant)
+ , NodeType(nodeType)
+ {
+ }
+
+ TTenantAndNodeType &operator=(const TTenantAndNodeType &other) = default;
+ TTenantAndNodeType &operator=(TTenantAndNodeType &&other) = default;
+
+ bool operator==(const NKikimr::NConsole::TTenantAndNodeType &other) const
+ {
+ return (Tenant == other.Tenant
+ && NodeType == other.NodeType);
+ };
+
+ bool operator!=(const NKikimr::NConsole::TTenantAndNodeType &other) const
+ {
+ return !(*this == other);
+ };
+
+ TString Tenant;
+ TString NodeType;
+};
+
+/**
+ * Structure to describe configs subscriber which is
+ * either tablet or service.
+ */
+struct TSubscriberId {
+ TSubscriberId()
+ : TabletId(0)
+ {
+ }
+
+ TSubscriberId(const NKikimrConsole::TSubscriber &proto)
+ : TabletId(0)
+ {
+ if (proto.HasTabletId())
+ TabletId = proto.GetTabletId();
+ else if (proto.HasServiceId())
ServiceId = ActorIdFromProto(proto.GetServiceId());
- }
-
- void Serialize(NKikimrConsole::TSubscriber &proto) const
- {
- if (TabletId)
- proto.SetTabletId(TabletId);
- else
+ }
+
+ void Serialize(NKikimrConsole::TSubscriber &proto) const
+ {
+ if (TabletId)
+ proto.SetTabletId(TabletId);
+ else
ActorIdToProto(ServiceId, proto.MutableServiceId());
- }
-
- bool operator==(const TSubscriberId &other) const
- {
- return (TabletId == other.TabletId
- && ServiceId == other.ServiceId);
- }
-
- ui64 TabletId = 0;
+ }
+
+ bool operator==(const TSubscriberId &other) const
+ {
+ return (TabletId == other.TabletId
+ && ServiceId == other.ServiceId);
+ }
+
+ ui64 TabletId = 0;
TActorId ServiceId;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
-
-template<>
-struct THash<NKikimr::NConsole::TSubscriberId> {
- inline size_t operator()(const NKikimr::NConsole::TSubscriberId &id) const {
- auto pair = std::make_pair(id.TabletId, id.ServiceId);
- return THash<decltype(pair)>()(pair);
- }
-};
-/*
-bool operator ==(const NKikimr::NConsole::TTenantAndNodeType &lhs,
- const NKikimr::NConsole::TTenantAndNodeType &rhs)
-{
- return (lhs.Tenant == rhs.Tenant
- && lhs.NodeType == rhs.NodeType);
-};
-*/
-template<>
-struct THash<NKikimr::NConsole::TTenantAndNodeType> {
- inline size_t operator()(const NKikimr::NConsole::TTenantAndNodeType &val) const {
- auto pair = std::make_pair(val.Tenant, val.NodeType);
- return THash<decltype(pair)>()(pair);
- }
-};
-
-namespace NKikimr {
-namespace NConsole {
-
-/**
- * Structre to hold config usage scope. For config items it is used similar
- * to NKikimrConsole::TUsageScope but also includes item's order.
- */
-struct TUsageScope {
- THashSet<ui32> NodeIds;
- THashSet<TString> Hosts;
- TString Tenant;
- TString NodeType;
- ui32 Order;
-
- TUsageScope();
- TUsageScope(const TUsageScope &other) = default;
- TUsageScope(const NKikimrConsole::TUsageScope &scope, ui32 order = 0);
-
- bool operator==(const TUsageScope &rhs) const {
- return (NodeIds == rhs.NodeIds
- && Hosts == rhs.Hosts
- && Tenant == rhs.Tenant
- && NodeType == rhs.NodeType
- && Order == rhs.Order);
- }
-
- bool operator!=(const TUsageScope &rhs) const {
- return !(*this == rhs);
- }
-
- /**
- * Get scope priority basing on node filters (i.e. ignoring Order).
- * Lesser value means mor prioritized scope.
- */
- int GetPriority() const;
-
- void Serialize(NKikimrConsole::TUsageScope &scope) const;
-
- bool IsSameScope(const NKikimrConsole::TUsageScope &scope) const;
-
- bool HasConflict(const TUsageScope &other,
- bool ignoreOrder = false) const;
-
- TString ToString() const;
-
- // Compare scope priorities.
- // -1 - lhs is less prioritized
- // 0 - scopes has equal priorities
- // 1 - lhs is more prioritized
- static int ComparePriority(const TUsageScope &lhs,
- const TUsageScope &rhs);
-};
-
-/**
- * Structure used to identify config. It holds ids and generations
- * of all config items used to build config.
- */
-struct TConfigId {
- TConfigId()
- {
- }
- TConfigId(const NKikimrConsole::TConfigId &id)
- {
- Load(id);
- }
- TConfigId(const TConfigId &other) = default;
- TConfigId(TConfigId &&other) = default;
-
- TConfigId &operator=(const TConfigId &other) = default;
- TConfigId &operator=(TConfigId &&other) = default;
-
- void Load(const NKikimrConsole::TConfigId &id)
- {
- Clear();
- for (auto &item : id.GetItemIds())
- ItemIds.push_back(std::make_pair(item.GetId(), item.GetGeneration()));
- }
-
- void Serialize(NKikimrConsole::TConfigId &id) const
- {
- for (auto &pr : ItemIds) {
- auto &item = *id.AddItemIds();
- item.SetId(pr.first);
- item.SetGeneration(pr.second);
- }
- }
-
- void Clear()
- {
- ItemIds.clear();
- }
-
- bool operator==(const TConfigId &other)
- {
- return ItemIds == other.ItemIds;
- }
-
- bool operator!=(const TConfigId &other)
- {
- return !(*this == other);
- }
-
- TString ToString() const
- {
- TStringStream ss;
- for (size_t i = 0; i < ItemIds.size(); ++i) {
- if (i)
- ss << ", ";
- ss << ItemIds[i].first << "." << ItemIds[i].second;
- }
- return ss.Str();
- }
-
- TVector<std::pair<ui64, ui64>> ItemIds;
-};
-
-/**
- * Cluster config atom wich holds a part of config. Multiple
- * config items are merged to build config.
- */
-struct TConfigItem : public TThrRefBase {
- using TPtr = TIntrusivePtr<TConfigItem>;
-
- TConfigItem();
- TConfigItem(const TConfigItem &other) = default;
- TConfigItem(const NKikimrConsole::TConfigItem &item);
-
- void Serialize(NKikimrConsole::TConfigItem &item) const;
-
- static TString KindName(ui32 kind);
- TString KindName() const;
-
- static TString MergeStrategyName(ui32 merge);
- TString MergeStrategyName() const;
-
- TString ToString() const;
-
- ui64 Id;
- ui64 Generation;
- ui32 Kind;
- TUsageScope UsageScope;
- ui32 MergeStrategy;
- NKikimrConfig::TAppConfig Config;
- TString Cookie;
-};
-
-struct TConfigItemPriorityLess {
- bool operator()(const TConfigItem::TPtr &lhs,
- const TConfigItem::TPtr &rhs) const
- {
- return TUsageScope::ComparePriority(lhs->UsageScope, rhs->UsageScope) < 0;
- }
-};
-
-void ClearOverwrittenRepeated(::google::protobuf::Message &to,
- ::google::protobuf::Message &from);
-void MergeMessageOverwriteRepeated(::google::protobuf::Message &to,
- ::google::protobuf::Message &from);
-
-// Generic set of config items.
-using TConfigItems = THashSet<TConfigItem::TPtr, TPtrHash>;
-// Config items grouped by kind.
-using TConfigItemsMap = THashMap<ui32, TConfigItems>;
-// Used to store config items of the same kind ordered by priority.
-using TOrderedConfigItems = TSet<TConfigItem::TPtr, TConfigItemPriorityLess>;
-// Ordered config items grouped by kind.
-using TOrderedConfigItemsMap = THashMap<ui32, TOrderedConfigItems>;
-
-/**
- * Collection of items with the same or intersecting scopes.
- * This is built to compute config for particular node.
- */
-class TScopedConfig : public TThrRefBase {
-public:
- using TPtr = TIntrusivePtr<TScopedConfig>;
-
- // Merge all config items into resulting config.
+};
+
+} // namespace NConsole
+} // namespace NKikimr
+
+template<>
+struct THash<NKikimr::NConsole::TSubscriberId> {
+ inline size_t operator()(const NKikimr::NConsole::TSubscriberId &id) const {
+ auto pair = std::make_pair(id.TabletId, id.ServiceId);
+ return THash<decltype(pair)>()(pair);
+ }
+};
+/*
+bool operator ==(const NKikimr::NConsole::TTenantAndNodeType &lhs,
+ const NKikimr::NConsole::TTenantAndNodeType &rhs)
+{
+ return (lhs.Tenant == rhs.Tenant
+ && lhs.NodeType == rhs.NodeType);
+};
+*/
+template<>
+struct THash<NKikimr::NConsole::TTenantAndNodeType> {
+ inline size_t operator()(const NKikimr::NConsole::TTenantAndNodeType &val) const {
+ auto pair = std::make_pair(val.Tenant, val.NodeType);
+ return THash<decltype(pair)>()(pair);
+ }
+};
+
+namespace NKikimr {
+namespace NConsole {
+
+/**
+ * Structre to hold config usage scope. For config items it is used similar
+ * to NKikimrConsole::TUsageScope but also includes item's order.
+ */
+struct TUsageScope {
+ THashSet<ui32> NodeIds;
+ THashSet<TString> Hosts;
+ TString Tenant;
+ TString NodeType;
+ ui32 Order;
+
+ TUsageScope();
+ TUsageScope(const TUsageScope &other) = default;
+ TUsageScope(const NKikimrConsole::TUsageScope &scope, ui32 order = 0);
+
+ bool operator==(const TUsageScope &rhs) const {
+ return (NodeIds == rhs.NodeIds
+ && Hosts == rhs.Hosts
+ && Tenant == rhs.Tenant
+ && NodeType == rhs.NodeType
+ && Order == rhs.Order);
+ }
+
+ bool operator!=(const TUsageScope &rhs) const {
+ return !(*this == rhs);
+ }
+
+ /**
+ * Get scope priority basing on node filters (i.e. ignoring Order).
+ * Lesser value means mor prioritized scope.
+ */
+ int GetPriority() const;
+
+ void Serialize(NKikimrConsole::TUsageScope &scope) const;
+
+ bool IsSameScope(const NKikimrConsole::TUsageScope &scope) const;
+
+ bool HasConflict(const TUsageScope &other,
+ bool ignoreOrder = false) const;
+
+ TString ToString() const;
+
+ // Compare scope priorities.
+ // -1 - lhs is less prioritized
+ // 0 - scopes has equal priorities
+ // 1 - lhs is more prioritized
+ static int ComparePriority(const TUsageScope &lhs,
+ const TUsageScope &rhs);
+};
+
+/**
+ * Structure used to identify config. It holds ids and generations
+ * of all config items used to build config.
+ */
+struct TConfigId {
+ TConfigId()
+ {
+ }
+ TConfigId(const NKikimrConsole::TConfigId &id)
+ {
+ Load(id);
+ }
+ TConfigId(const TConfigId &other) = default;
+ TConfigId(TConfigId &&other) = default;
+
+ TConfigId &operator=(const TConfigId &other) = default;
+ TConfigId &operator=(TConfigId &&other) = default;
+
+ void Load(const NKikimrConsole::TConfigId &id)
+ {
+ Clear();
+ for (auto &item : id.GetItemIds())
+ ItemIds.push_back(std::make_pair(item.GetId(), item.GetGeneration()));
+ }
+
+ void Serialize(NKikimrConsole::TConfigId &id) const
+ {
+ for (auto &pr : ItemIds) {
+ auto &item = *id.AddItemIds();
+ item.SetId(pr.first);
+ item.SetGeneration(pr.second);
+ }
+ }
+
+ void Clear()
+ {
+ ItemIds.clear();
+ }
+
+ bool operator==(const TConfigId &other)
+ {
+ return ItemIds == other.ItemIds;
+ }
+
+ bool operator!=(const TConfigId &other)
+ {
+ return !(*this == other);
+ }
+
+ TString ToString() const
+ {
+ TStringStream ss;
+ for (size_t i = 0; i < ItemIds.size(); ++i) {
+ if (i)
+ ss << ", ";
+ ss << ItemIds[i].first << "." << ItemIds[i].second;
+ }
+ return ss.Str();
+ }
+
+ TVector<std::pair<ui64, ui64>> ItemIds;
+};
+
+/**
+ * Cluster config atom wich holds a part of config. Multiple
+ * config items are merged to build config.
+ */
+struct TConfigItem : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TConfigItem>;
+
+ TConfigItem();
+ TConfigItem(const TConfigItem &other) = default;
+ TConfigItem(const NKikimrConsole::TConfigItem &item);
+
+ void Serialize(NKikimrConsole::TConfigItem &item) const;
+
+ static TString KindName(ui32 kind);
+ TString KindName() const;
+
+ static TString MergeStrategyName(ui32 merge);
+ TString MergeStrategyName() const;
+
+ TString ToString() const;
+
+ ui64 Id;
+ ui64 Generation;
+ ui32 Kind;
+ TUsageScope UsageScope;
+ ui32 MergeStrategy;
+ NKikimrConfig::TAppConfig Config;
+ TString Cookie;
+};
+
+struct TConfigItemPriorityLess {
+ bool operator()(const TConfigItem::TPtr &lhs,
+ const TConfigItem::TPtr &rhs) const
+ {
+ return TUsageScope::ComparePriority(lhs->UsageScope, rhs->UsageScope) < 0;
+ }
+};
+
+void ClearOverwrittenRepeated(::google::protobuf::Message &to,
+ ::google::protobuf::Message &from);
+void MergeMessageOverwriteRepeated(::google::protobuf::Message &to,
+ ::google::protobuf::Message &from);
+
+// Generic set of config items.
+using TConfigItems = THashSet<TConfigItem::TPtr, TPtrHash>;
+// Config items grouped by kind.
+using TConfigItemsMap = THashMap<ui32, TConfigItems>;
+// Used to store config items of the same kind ordered by priority.
+using TOrderedConfigItems = TSet<TConfigItem::TPtr, TConfigItemPriorityLess>;
+// Ordered config items grouped by kind.
+using TOrderedConfigItemsMap = THashMap<ui32, TOrderedConfigItems>;
+
+/**
+ * Collection of items with the same or intersecting scopes.
+ * This is built to compute config for particular node.
+ */
+class TScopedConfig : public TThrRefBase {
+public:
+ using TPtr = TIntrusivePtr<TScopedConfig>;
+
+ // Merge all config items into resulting config.
void ComputeConfig(NKikimrConfig::TAppConfig &config, bool addVersion = false) const;
-
+
// Merge config items with given kinds into resulting config.
void ComputeConfig(const THashSet<ui32> &kinds, NKikimrConfig::TAppConfig &config, bool addVersion = false) const;
-private:
- void MergeItems(const TOrderedConfigItems &items,
+private:
+ void MergeItems(const TOrderedConfigItems &items,
NKikimrConfig::TAppConfig &config, bool addVersion) const;
- void MergeItem(TConfigItem::TPtr item,
+ void MergeItem(TConfigItem::TPtr item,
NKikimrConfig::TAppConfig &config, bool addVersion) const;
-
-public:
- // Here all config items included into the scope are listed.
- // Sorted by priority in ascending order.
- TOrderedConfigItemsMap ConfigItems;
-};
-
-class TConfigIndex {
-public:
- TConfigItem::TPtr GetItem(ui64 id) const;
- void AddItem(TConfigItem::TPtr item);
- void RemoveItem(ui64 id);
-
- const THashMap<ui64, TConfigItem::TPtr> &GetConfigItems() const
- {
- return ConfigItems;
- }
-
- void Clear();
-
- template <typename TIndexMap, typename TKey, typename TItemsStorage, typename TKinds>
- void CollectItemsByIndex(const TKey &key,
- const TIndexMap &index,
- const TKinds &kinds,
- TItemsStorage &items) const
- {
- auto it = index.find(key);
- if (it != index.end())
- CollectItemsFromMap(it->second, kinds, items);
- }
-
- template <typename TItemsStorage, typename TKinds>
- void CollectItemsByNodeId(ui32 nodeId,
- const TKinds &kinds,
- TItemsStorage &items) const
- {
- CollectItemsByIndex(nodeId, ConfigItemsByNodeId, kinds, items);
- }
-
- template <typename TItemsStorage, typename TKinds>
- void CollectItemsByHost(const TString &host,
- const TKinds &kinds,
- TItemsStorage &items) const
- {
- CollectItemsByIndex(host, ConfigItemsByHost, kinds, items);
- }
-
- template <typename TItemsStorage, typename TKinds>
- void CollectItemsByTenant(const TString &tenant,
- const TKinds &kinds,
- TItemsStorage &items) const
- {
- CollectItemsByIndex(tenant, ConfigItemsByTenant, kinds, items);
- }
-
- template <typename TItemsStorage, typename TKinds>
- void CollectItemsByNodeType(const TString &type,
- const TKinds &kinds,
- TItemsStorage &items) const
- {
- CollectItemsByIndex(type, ConfigItemsByNodeType, kinds, items);
- }
-
- template <typename TItemsStorage, typename TKinds>
- void CollectItemsByTenantAndNodeType(const TString &tenant,
- const TString &type,
- const TKinds &kinds,
- TItemsStorage &items) const
- {
- CollectItemsByIndex(TTenantAndNodeType(tenant, type), ConfigItemsByTenantAndNodeType, kinds, items);
- }
-
- template <typename TItemsStorage>
- void CollectItemsByCookie(const TString &cookie,
- const THashSet<ui32> &kinds,
- TItemsStorage &items) const
- {
- CollectItemsByIndex(cookie, ConfigItemsByCookie, kinds, items);
- }
-
- template <typename TItemsStorage>
- void CollectItemsWithNodeIdScope(const THashSet<ui32> &kinds,
- TItemsStorage &items) const
- {
- for (auto &pr : ConfigItemsByNodeId)
- CollectItemsFromMap(pr.second, kinds, items);
- }
-
- template <typename TItemsStorage>
- void CollectItemsWithHostScope(const THashSet<ui32> &kinds,
- TItemsStorage &items) const
- {
- for (auto &pr : ConfigItemsByHost)
- CollectItemsFromMap(pr.second, kinds, items);
- }
-
- template <typename TItemsStorage>
- void CollectItemsWithTenantScope(const THashSet<ui32> &kinds,
- TItemsStorage &items) const
- {
- for (auto &pr : ConfigItemsByTenant)
- CollectItemsFromMap(pr.second, kinds, items);
- }
-
- template <typename TItemsStorage>
- void CollectItemsWithPureTenantScope(const THashSet<ui32> &kinds,
- TItemsStorage &items) const
- {
- for (auto &pr : ConfigItemsByTenant)
- CollectItemsByTenantAndNodeType(pr.first, "", kinds, items);
- }
-
- template <typename TItemsStorage>
- void CollectItemsWithNodeTypeScope(const THashSet<ui32> &kinds,
- TItemsStorage &items) const
- {
- for (auto &pr : ConfigItemsByNodeType)
- CollectItemsFromMap(pr.second, kinds, items);
- }
-
- template <typename TItemsStorage>
- void CollectItemsWithTenantAndNodeTypeScope(const THashSet<ui32> &kinds,
- TItemsStorage &items) const
- {
- for (auto &pr : ConfigItemsByTenantAndNodeType)
- if (pr.first.Tenant && pr.first.NodeType)
- CollectItemsFromMap(pr.second, kinds, items);
- }
-
- void CollectItemsByScope(const NKikimrConsole::TUsageScope &scope,
- const THashSet<ui32> &kinds,
- TConfigItems &items) const;
- void CollectItemsByScope(const TUsageScope &scope,
- const THashSet<ui32> &kinds,
- TConfigItems &items) const;
- void CollectItemsByConflictingScope(const TUsageScope &scope,
- const THashSet<ui32> &kinds,
- bool ignoreOrder,
- TConfigItems &items) const;
- void CollectItemsForNode(const NKikimrConsole::TNodeAttributes &attrs,
- const THashSet<ui32> &kinds,
- TConfigItems &items) const;
-
- TScopedConfig::TPtr GetNodeConfig(const NKikimrConsole::TNodeAttributes &attrs,
- const THashSet<ui32> &kinds) const;
-
- template <typename TKinds>
- TScopedConfig::TPtr BuildConfig(ui32 nodeId,
- const TString &host,
- const TString &tenant,
- const TString &nodeType,
- const TKinds &kinds) const
- {
- TScopedConfig::TPtr config = new TScopedConfig;
- CollectItemsByNodeId(nodeId, kinds, config->ConfigItems);
- CollectItemsByHost(host, kinds, config->ConfigItems);
- CollectItemsByTenantAndNodeType(tenant, nodeType, kinds, config->ConfigItems);
- if (tenant)
- CollectItemsByTenantAndNodeType("", nodeType, kinds, config->ConfigItems);
- if (nodeType)
- CollectItemsByTenantAndNodeType(tenant, "", kinds, config->ConfigItems);
- if (tenant && nodeType)
- CollectItemsByTenantAndNodeType("", "", kinds, config->ConfigItems);
- return config;
- }
-
- void CollectItemsFromMap(const TConfigItemsMap &map,
- const THashSet<ui32> &kinds,
- TConfigItems &items) const;
-
- void CollectItemsFromMap(const TConfigItemsMap &map,
- const THashSet<ui32> &kinds,
- TOrderedConfigItemsMap &items) const;
-
- void CollectItemsFromMap(const TConfigItemsMap &map,
- const TDynBitMap &kinds,
- TConfigItems &items) const;
-
- void CollectItemsFromMap(const TConfigItemsMap &map,
- const TDynBitMap &kinds,
- TOrderedConfigItemsMap &items) const;
-
- TDynBitMap ItemKindsWithDomainScope() const;
- TDynBitMap ItemKindsWithTenantScope() const;
- TDynBitMap ItemKindsWithNodeTypeScope() const;
-
- void CollectTenantAndNodeTypeUsageScopes(const TDynBitMap &kinds,
- THashSet<TString> &tenants,
- THashSet<TString> &types,
- THashSet<TTenantAndNodeType> &tenantAndNodeTypes) const;
-
- bool IsEmpty() const
- {
- return ConfigItems.empty();
- }
-
-private:
- template <typename TIndexMap, typename TKey, bool forced = true>
- void AddToIndex(TConfigItem::TPtr item,
- const TKey &key,
- TIndexMap &map)
- {
- auto &set = map[key][item->Kind];
+
+public:
+ // Here all config items included into the scope are listed.
+ // Sorted by priority in ascending order.
+ TOrderedConfigItemsMap ConfigItems;
+};
+
+class TConfigIndex {
+public:
+ TConfigItem::TPtr GetItem(ui64 id) const;
+ void AddItem(TConfigItem::TPtr item);
+ void RemoveItem(ui64 id);
+
+ const THashMap<ui64, TConfigItem::TPtr> &GetConfigItems() const
+ {
+ return ConfigItems;
+ }
+
+ void Clear();
+
+ template <typename TIndexMap, typename TKey, typename TItemsStorage, typename TKinds>
+ void CollectItemsByIndex(const TKey &key,
+ const TIndexMap &index,
+ const TKinds &kinds,
+ TItemsStorage &items) const
+ {
+ auto it = index.find(key);
+ if (it != index.end())
+ CollectItemsFromMap(it->second, kinds, items);
+ }
+
+ template <typename TItemsStorage, typename TKinds>
+ void CollectItemsByNodeId(ui32 nodeId,
+ const TKinds &kinds,
+ TItemsStorage &items) const
+ {
+ CollectItemsByIndex(nodeId, ConfigItemsByNodeId, kinds, items);
+ }
+
+ template <typename TItemsStorage, typename TKinds>
+ void CollectItemsByHost(const TString &host,
+ const TKinds &kinds,
+ TItemsStorage &items) const
+ {
+ CollectItemsByIndex(host, ConfigItemsByHost, kinds, items);
+ }
+
+ template <typename TItemsStorage, typename TKinds>
+ void CollectItemsByTenant(const TString &tenant,
+ const TKinds &kinds,
+ TItemsStorage &items) const
+ {
+ CollectItemsByIndex(tenant, ConfigItemsByTenant, kinds, items);
+ }
+
+ template <typename TItemsStorage, typename TKinds>
+ void CollectItemsByNodeType(const TString &type,
+ const TKinds &kinds,
+ TItemsStorage &items) const
+ {
+ CollectItemsByIndex(type, ConfigItemsByNodeType, kinds, items);
+ }
+
+ template <typename TItemsStorage, typename TKinds>
+ void CollectItemsByTenantAndNodeType(const TString &tenant,
+ const TString &type,
+ const TKinds &kinds,
+ TItemsStorage &items) const
+ {
+ CollectItemsByIndex(TTenantAndNodeType(tenant, type), ConfigItemsByTenantAndNodeType, kinds, items);
+ }
+
+ template <typename TItemsStorage>
+ void CollectItemsByCookie(const TString &cookie,
+ const THashSet<ui32> &kinds,
+ TItemsStorage &items) const
+ {
+ CollectItemsByIndex(cookie, ConfigItemsByCookie, kinds, items);
+ }
+
+ template <typename TItemsStorage>
+ void CollectItemsWithNodeIdScope(const THashSet<ui32> &kinds,
+ TItemsStorage &items) const
+ {
+ for (auto &pr : ConfigItemsByNodeId)
+ CollectItemsFromMap(pr.second, kinds, items);
+ }
+
+ template <typename TItemsStorage>
+ void CollectItemsWithHostScope(const THashSet<ui32> &kinds,
+ TItemsStorage &items) const
+ {
+ for (auto &pr : ConfigItemsByHost)
+ CollectItemsFromMap(pr.second, kinds, items);
+ }
+
+ template <typename TItemsStorage>
+ void CollectItemsWithTenantScope(const THashSet<ui32> &kinds,
+ TItemsStorage &items) const
+ {
+ for (auto &pr : ConfigItemsByTenant)
+ CollectItemsFromMap(pr.second, kinds, items);
+ }
+
+ template <typename TItemsStorage>
+ void CollectItemsWithPureTenantScope(const THashSet<ui32> &kinds,
+ TItemsStorage &items) const
+ {
+ for (auto &pr : ConfigItemsByTenant)
+ CollectItemsByTenantAndNodeType(pr.first, "", kinds, items);
+ }
+
+ template <typename TItemsStorage>
+ void CollectItemsWithNodeTypeScope(const THashSet<ui32> &kinds,
+ TItemsStorage &items) const
+ {
+ for (auto &pr : ConfigItemsByNodeType)
+ CollectItemsFromMap(pr.second, kinds, items);
+ }
+
+ template <typename TItemsStorage>
+ void CollectItemsWithTenantAndNodeTypeScope(const THashSet<ui32> &kinds,
+ TItemsStorage &items) const
+ {
+ for (auto &pr : ConfigItemsByTenantAndNodeType)
+ if (pr.first.Tenant && pr.first.NodeType)
+ CollectItemsFromMap(pr.second, kinds, items);
+ }
+
+ void CollectItemsByScope(const NKikimrConsole::TUsageScope &scope,
+ const THashSet<ui32> &kinds,
+ TConfigItems &items) const;
+ void CollectItemsByScope(const TUsageScope &scope,
+ const THashSet<ui32> &kinds,
+ TConfigItems &items) const;
+ void CollectItemsByConflictingScope(const TUsageScope &scope,
+ const THashSet<ui32> &kinds,
+ bool ignoreOrder,
+ TConfigItems &items) const;
+ void CollectItemsForNode(const NKikimrConsole::TNodeAttributes &attrs,
+ const THashSet<ui32> &kinds,
+ TConfigItems &items) const;
+
+ TScopedConfig::TPtr GetNodeConfig(const NKikimrConsole::TNodeAttributes &attrs,
+ const THashSet<ui32> &kinds) const;
+
+ template <typename TKinds>
+ TScopedConfig::TPtr BuildConfig(ui32 nodeId,
+ const TString &host,
+ const TString &tenant,
+ const TString &nodeType,
+ const TKinds &kinds) const
+ {
+ TScopedConfig::TPtr config = new TScopedConfig;
+ CollectItemsByNodeId(nodeId, kinds, config->ConfigItems);
+ CollectItemsByHost(host, kinds, config->ConfigItems);
+ CollectItemsByTenantAndNodeType(tenant, nodeType, kinds, config->ConfigItems);
+ if (tenant)
+ CollectItemsByTenantAndNodeType("", nodeType, kinds, config->ConfigItems);
+ if (nodeType)
+ CollectItemsByTenantAndNodeType(tenant, "", kinds, config->ConfigItems);
+ if (tenant && nodeType)
+ CollectItemsByTenantAndNodeType("", "", kinds, config->ConfigItems);
+ return config;
+ }
+
+ void CollectItemsFromMap(const TConfigItemsMap &map,
+ const THashSet<ui32> &kinds,
+ TConfigItems &items) const;
+
+ void CollectItemsFromMap(const TConfigItemsMap &map,
+ const THashSet<ui32> &kinds,
+ TOrderedConfigItemsMap &items) const;
+
+ void CollectItemsFromMap(const TConfigItemsMap &map,
+ const TDynBitMap &kinds,
+ TConfigItems &items) const;
+
+ void CollectItemsFromMap(const TConfigItemsMap &map,
+ const TDynBitMap &kinds,
+ TOrderedConfigItemsMap &items) const;
+
+ TDynBitMap ItemKindsWithDomainScope() const;
+ TDynBitMap ItemKindsWithTenantScope() const;
+ TDynBitMap ItemKindsWithNodeTypeScope() const;
+
+ void CollectTenantAndNodeTypeUsageScopes(const TDynBitMap &kinds,
+ THashSet<TString> &tenants,
+ THashSet<TString> &types,
+ THashSet<TTenantAndNodeType> &tenantAndNodeTypes) const;
+
+ bool IsEmpty() const
+ {
+ return ConfigItems.empty();
+ }
+
+private:
+ template <typename TIndexMap, typename TKey, bool forced = true>
+ void AddToIndex(TConfigItem::TPtr item,
+ const TKey &key,
+ TIndexMap &map)
+ {
+ auto &set = map[key][item->Kind];
Y_VERIFY(!forced || !set.contains(item));
- set.insert(item);
- }
-
- template <typename TIndexMap, typename TKey, bool forced = true>
- void RemoveFromIndex(TConfigItem::TPtr item,
- const TKey &key,
- TIndexMap &map)
- {
- auto mapIt = map.find(key);
- if (mapIt == map.end()) {
- Y_VERIFY(!forced);
- return;
- }
- auto kindIt = mapIt->second.find(item->Kind);
- if (kindIt == mapIt->second.end()) {
- Y_VERIFY(!forced);
- return;
- }
- auto itemIt = kindIt->second.find(item);
- if (itemIt == kindIt->second.end()) {
- Y_VERIFY(!forced);
- return;
- }
- kindIt->second.erase(itemIt);
- if (kindIt->second.empty()) {
- mapIt->second.erase(kindIt);
- if (mapIt->second.empty())
- map.erase(mapIt);
- }
- }
-
- THashMap<ui64, TConfigItem::TPtr> ConfigItems;
- THashMap<ui32, TConfigItemsMap> ConfigItemsByNodeId;
- THashMap<TString, TConfigItemsMap> ConfigItemsByHost;
- THashMap<TString, TConfigItemsMap> ConfigItemsByTenant;
- THashMap<TString, TConfigItemsMap> ConfigItemsByNodeType;
- THashMap<TTenantAndNodeType, TConfigItemsMap> ConfigItemsByTenantAndNodeType;
- THashMap<TString, TConfigItemsMap> ConfigItemsByCookie;
-};
-
-struct TConfigModifications {
- void Clear();
- bool IsEmpty() const;
- void DeepCopyFrom(const TConfigModifications &other);
-
- void ApplyTo(TConfigIndex &index) const;
-
- TVector<TConfigItem::TPtr> AddedItems;
- THashMap<ui64, TConfigItem::TPtr> ModifiedItems;
- THashSet<ui64> RemovedItems;
-};
-
-struct TSubscription : public TThrRefBase {
- using TPtr = TIntrusivePtr<TSubscription>;
-
- TSubscription()
- : Id(0)
- , NodeId(0)
- , Cookie(0)
- {
- }
-
- TSubscription(const NKikimrConsole::TSubscription &subscription)
- : Cookie(0)
- {
- Load(subscription);
- }
-
- TSubscription(const TSubscription &other) = default;
- TSubscription(TSubscription &&other) = default;
-
- TSubscription &operator=(const TSubscription &other) = default;
- TSubscription &operator=(TSubscription &&other) = default;
-
- void Load(const NKikimrConsole::TSubscription &subscription);
- void Serialize(NKikimrConsole::TSubscription &subscription);
-
- // LastProvidedConfig and Id are ignored in comparison.
- bool IsEqual(const TSubscription &other) const;
-
- TString ToString() const;
-
- ui64 Id;
- TSubscriberId Subscriber;
- ui32 NodeId;
- TString Host;
- TString Tenant;
- TString NodeType;
- THashSet<ui32> ItemKinds;
- TConfigId LastProvidedConfig;
- TConfigId CurrentConfigId;
- NKikimrConfig::TAppConfig CurrentConfig;
+ set.insert(item);
+ }
+
+ template <typename TIndexMap, typename TKey, bool forced = true>
+ void RemoveFromIndex(TConfigItem::TPtr item,
+ const TKey &key,
+ TIndexMap &map)
+ {
+ auto mapIt = map.find(key);
+ if (mapIt == map.end()) {
+ Y_VERIFY(!forced);
+ return;
+ }
+ auto kindIt = mapIt->second.find(item->Kind);
+ if (kindIt == mapIt->second.end()) {
+ Y_VERIFY(!forced);
+ return;
+ }
+ auto itemIt = kindIt->second.find(item);
+ if (itemIt == kindIt->second.end()) {
+ Y_VERIFY(!forced);
+ return;
+ }
+ kindIt->second.erase(itemIt);
+ if (kindIt->second.empty()) {
+ mapIt->second.erase(kindIt);
+ if (mapIt->second.empty())
+ map.erase(mapIt);
+ }
+ }
+
+ THashMap<ui64, TConfigItem::TPtr> ConfigItems;
+ THashMap<ui32, TConfigItemsMap> ConfigItemsByNodeId;
+ THashMap<TString, TConfigItemsMap> ConfigItemsByHost;
+ THashMap<TString, TConfigItemsMap> ConfigItemsByTenant;
+ THashMap<TString, TConfigItemsMap> ConfigItemsByNodeType;
+ THashMap<TTenantAndNodeType, TConfigItemsMap> ConfigItemsByTenantAndNodeType;
+ THashMap<TString, TConfigItemsMap> ConfigItemsByCookie;
+};
+
+struct TConfigModifications {
+ void Clear();
+ bool IsEmpty() const;
+ void DeepCopyFrom(const TConfigModifications &other);
+
+ void ApplyTo(TConfigIndex &index) const;
+
+ TVector<TConfigItem::TPtr> AddedItems;
+ THashMap<ui64, TConfigItem::TPtr> ModifiedItems;
+ THashSet<ui64> RemovedItems;
+};
+
+struct TSubscription : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TSubscription>;
+
+ TSubscription()
+ : Id(0)
+ , NodeId(0)
+ , Cookie(0)
+ {
+ }
+
+ TSubscription(const NKikimrConsole::TSubscription &subscription)
+ : Cookie(0)
+ {
+ Load(subscription);
+ }
+
+ TSubscription(const TSubscription &other) = default;
+ TSubscription(TSubscription &&other) = default;
+
+ TSubscription &operator=(const TSubscription &other) = default;
+ TSubscription &operator=(TSubscription &&other) = default;
+
+ void Load(const NKikimrConsole::TSubscription &subscription);
+ void Serialize(NKikimrConsole::TSubscription &subscription);
+
+ // LastProvidedConfig and Id are ignored in comparison.
+ bool IsEqual(const TSubscription &other) const;
+
+ TString ToString() const;
+
+ ui64 Id;
+ TSubscriberId Subscriber;
+ ui32 NodeId;
+ TString Host;
+ TString Tenant;
+ TString NodeType;
+ THashSet<ui32> ItemKinds;
+ TConfigId LastProvidedConfig;
+ TConfigId CurrentConfigId;
+ NKikimrConfig::TAppConfig CurrentConfig;
TActorId Worker;
- // Cookie allows to identify whether TEvConfigNotificationResponse
- // still holds actual data. If Cookie doesn't match the one carried
- // in an event then this event is ignored. Cookie is defined when
- // subscription is created/loaded and modified only for service
- // clients which renew subscription with TEvReplaceSubscriptionRequest.
- // Thusly TEvConfigNotificationResponse is ignored for died service
- // but not ignored for died tablets which are assumed to preserve their
- // configs.
- ui64 Cookie;
-};
-
-using TSubscriptionSet = THashSet<TSubscription::TPtr, TPtrHash>;
-
-class TSubscriptionIndex {
-public:
- TSubscription::TPtr GetSubscription(ui64 id) const;
- const TSubscriptionSet &GetSubscriptions(TSubscriberId id) const;
- const THashMap<ui64, TSubscription::TPtr> &GetSubscriptions() const;
-
- void AddSubscription(TSubscription::TPtr subscription);
- void RemoveSubscription(ui64 id);
-
- void CollectAffectedSubscriptions(const TUsageScope &scope,
- ui32 kind,
- TSubscriptionSet &subscriptions) const;
-
- bool IsEmpty() const
- {
- return Subscriptions.empty();
- }
-
- void Clear();
-
-private:
- template <typename TKey>
- void RemoveFromIndex(TSubscription::TPtr subscription,
- const TKey &key,
- THashMap<TKey, TSubscriptionSet> &index)
- {
- auto it = index.find(key);
- Y_VERIFY(it != index.end());
+ // Cookie allows to identify whether TEvConfigNotificationResponse
+ // still holds actual data. If Cookie doesn't match the one carried
+ // in an event then this event is ignored. Cookie is defined when
+ // subscription is created/loaded and modified only for service
+ // clients which renew subscription with TEvReplaceSubscriptionRequest.
+ // Thusly TEvConfigNotificationResponse is ignored for died service
+ // but not ignored for died tablets which are assumed to preserve their
+ // configs.
+ ui64 Cookie;
+};
+
+using TSubscriptionSet = THashSet<TSubscription::TPtr, TPtrHash>;
+
+class TSubscriptionIndex {
+public:
+ TSubscription::TPtr GetSubscription(ui64 id) const;
+ const TSubscriptionSet &GetSubscriptions(TSubscriberId id) const;
+ const THashMap<ui64, TSubscription::TPtr> &GetSubscriptions() const;
+
+ void AddSubscription(TSubscription::TPtr subscription);
+ void RemoveSubscription(ui64 id);
+
+ void CollectAffectedSubscriptions(const TUsageScope &scope,
+ ui32 kind,
+ TSubscriptionSet &subscriptions) const;
+
+ bool IsEmpty() const
+ {
+ return Subscriptions.empty();
+ }
+
+ void Clear();
+
+private:
+ template <typename TKey>
+ void RemoveFromIndex(TSubscription::TPtr subscription,
+ const TKey &key,
+ THashMap<TKey, TSubscriptionSet> &index)
+ {
+ auto it = index.find(key);
+ Y_VERIFY(it != index.end());
Y_VERIFY(it->second.contains(subscription));
- it->second.erase(subscription);
- if (it->second.empty())
- index.erase(it);
- }
-
- THashMap<ui64, TSubscription::TPtr> Subscriptions;
- THashMap<TSubscriberId, TSubscriptionSet> SubscriptionsBySubscriber;
- THashMap<ui32, TSubscriptionSet> SubscriptionsByNodeId;
- THashMap<TString, TSubscriptionSet> SubscriptionsByHost;
- THashMap<TString, TSubscriptionSet> SubscriptionsByTenant;
- THashMap<TString, TSubscriptionSet> SubscriptionsByNodeType;
- TSubscriptionSet EmptySubscriptionsSet;
-};
-
+ it->second.erase(subscription);
+ if (it->second.empty())
+ index.erase(it);
+ }
+
+ THashMap<ui64, TSubscription::TPtr> Subscriptions;
+ THashMap<TSubscriberId, TSubscriptionSet> SubscriptionsBySubscriber;
+ THashMap<ui32, TSubscriptionSet> SubscriptionsByNodeId;
+ THashMap<TString, TSubscriptionSet> SubscriptionsByHost;
+ THashMap<TString, TSubscriptionSet> SubscriptionsByTenant;
+ THashMap<TString, TSubscriptionSet> SubscriptionsByNodeType;
+ TSubscriptionSet EmptySubscriptionsSet;
+};
+
struct TInMemorySubscription : public TThrRefBase {
using TPtr = TIntrusivePtr<TInMemorySubscription>;
@@ -700,19 +700,19 @@ private:
THashMap<TString, TInMemorySubscriptionSet> SubscriptionsByNodeType;
};
-struct TSubscriptionModifications {
- TSubscriptionModifications() = default;
- TSubscriptionModifications(const TSubscriptionModifications &other) = default;
-
- void Clear();
- bool IsEmpty() const;
- void DeepCopyFrom(const TSubscriptionModifications &other);
-
- THashSet<ui64> RemovedSubscriptions;
- TVector<TSubscription::TPtr> AddedSubscriptions;
- THashMap<ui64, TConfigId> ModifiedLastProvided;
- THashMap<ui64, ui64> ModifiedCookies;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
+struct TSubscriptionModifications {
+ TSubscriptionModifications() = default;
+ TSubscriptionModifications(const TSubscriptionModifications &other) = default;
+
+ void Clear();
+ bool IsEmpty() const;
+ void DeepCopyFrom(const TSubscriptionModifications &other);
+
+ THashSet<ui64> RemovedSubscriptions;
+ TVector<TSubscription::TPtr> AddedSubscriptions;
+ THashMap<ui64, TConfigId> ModifiedLastProvided;
+ THashMap<ui64, ui64> ModifiedCookies;
+};
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/configs_config.cpp b/ydb/core/cms/console/configs_config.cpp
index dd0d1535c42..562bd1979fb 100644
--- a/ydb/core/cms/console/configs_config.cpp
+++ b/ydb/core/cms/console/configs_config.cpp
@@ -1,60 +1,60 @@
-#include "configs_config.h"
-
-#include <util/string/printf.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-TConfigsConfig::TConfigsConfig(const NKikimrConsole::TConfigsConfig &config)
-{
- Parse(config);
-}
-
-void TConfigsConfig::Clear()
-{
- AllowedNodeIdScopeKinds.clear();
- AllowedHostScopeKinds.clear();
- AllowedTenantScopeKinds.clear();
- AllowedNodeTypeScopeKinds.clear();
- DisallowedDomainScopeKinds.clear();
-}
-
-void TConfigsConfig::Parse(const NKikimrConsole::TConfigsConfig &config)
-{
- Clear();
-
- for (auto &kind : config.GetUsageScopeRestrictions().GetAllowedNodeIdUsageScopeKinds())
- AllowedNodeIdScopeKinds.insert(kind);
- for (auto &kind : config.GetUsageScopeRestrictions().GetAllowedHostUsageScopeKinds())
- AllowedHostScopeKinds.insert(kind);
- for (auto &kind : config.GetUsageScopeRestrictions().GetAllowedTenantUsageScopeKinds())
- AllowedTenantScopeKinds.insert(kind);
- for (auto &kind : config.GetUsageScopeRestrictions().GetAllowedNodeTypeUsageScopeKinds())
- AllowedNodeTypeScopeKinds.insert(kind);
- for (auto &kind : config.GetUsageScopeRestrictions().GetDisallowedDomainUsageScopeKinds())
- DisallowedDomainScopeKinds.insert(kind);
-
- ValidationLevel = config.GetValidationOptions().GetValidationLevel();
- MaxConfigChecksPerModification = config.GetValidationOptions().GetMaxConfigChecksPerModification();
- FailOnExceededConfigChecksLimit = config.GetValidationOptions().GetFailOnExceededConfigChecksLimit();
- EnableValidationOnNodeConfigRequest = config.GetValidationOptions().GetEnableValidationOnNodeConfigRequest();
- TreatWarningAsError = config.GetValidationOptions().GetTreatWarningAsError();
-}
-
-bool TConfigsConfig::Check(const NKikimrConsole::TConfigsConfig &config,
- TString &error)
-{
- TConfigsConfig newConfig(config);
-
- if (newConfig.MaxConfigChecksPerModification > MAX_CONFIG_CHECKS_LIMIT) {
- error = Sprintf("MaxConfigChecksPerModification exceeds limit value %" PRIu64,
- MAX_CONFIG_CHECKS_LIMIT);
- return false;
- }
-
- return true;
-}
-
-
-} // namespace NConsole
-} // namespace NKikimr
+#include "configs_config.h"
+
+#include <util/string/printf.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+TConfigsConfig::TConfigsConfig(const NKikimrConsole::TConfigsConfig &config)
+{
+ Parse(config);
+}
+
+void TConfigsConfig::Clear()
+{
+ AllowedNodeIdScopeKinds.clear();
+ AllowedHostScopeKinds.clear();
+ AllowedTenantScopeKinds.clear();
+ AllowedNodeTypeScopeKinds.clear();
+ DisallowedDomainScopeKinds.clear();
+}
+
+void TConfigsConfig::Parse(const NKikimrConsole::TConfigsConfig &config)
+{
+ Clear();
+
+ for (auto &kind : config.GetUsageScopeRestrictions().GetAllowedNodeIdUsageScopeKinds())
+ AllowedNodeIdScopeKinds.insert(kind);
+ for (auto &kind : config.GetUsageScopeRestrictions().GetAllowedHostUsageScopeKinds())
+ AllowedHostScopeKinds.insert(kind);
+ for (auto &kind : config.GetUsageScopeRestrictions().GetAllowedTenantUsageScopeKinds())
+ AllowedTenantScopeKinds.insert(kind);
+ for (auto &kind : config.GetUsageScopeRestrictions().GetAllowedNodeTypeUsageScopeKinds())
+ AllowedNodeTypeScopeKinds.insert(kind);
+ for (auto &kind : config.GetUsageScopeRestrictions().GetDisallowedDomainUsageScopeKinds())
+ DisallowedDomainScopeKinds.insert(kind);
+
+ ValidationLevel = config.GetValidationOptions().GetValidationLevel();
+ MaxConfigChecksPerModification = config.GetValidationOptions().GetMaxConfigChecksPerModification();
+ FailOnExceededConfigChecksLimit = config.GetValidationOptions().GetFailOnExceededConfigChecksLimit();
+ EnableValidationOnNodeConfigRequest = config.GetValidationOptions().GetEnableValidationOnNodeConfigRequest();
+ TreatWarningAsError = config.GetValidationOptions().GetTreatWarningAsError();
+}
+
+bool TConfigsConfig::Check(const NKikimrConsole::TConfigsConfig &config,
+ TString &error)
+{
+ TConfigsConfig newConfig(config);
+
+ if (newConfig.MaxConfigChecksPerModification > MAX_CONFIG_CHECKS_LIMIT) {
+ error = Sprintf("MaxConfigChecksPerModification exceeds limit value %" PRIu64,
+ MAX_CONFIG_CHECKS_LIMIT);
+ return false;
+ }
+
+ return true;
+}
+
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/configs_config.h b/ydb/core/cms/console/configs_config.h
index 1ab8dbced6b..ed1f5858c71 100644
--- a/ydb/core/cms/console/configs_config.h
+++ b/ydb/core/cms/console/configs_config.h
@@ -1,35 +1,35 @@
-#pragma once
-
+#pragma once
+
#include <ydb/core/protos/console_config.pb.h>
-
-#include <util/generic/hash_set.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-struct TConfigsConfig {
- static constexpr ui64 MAX_CONFIG_CHECKS_LIMIT = 100000;
-
- TConfigsConfig(const NKikimrConsole::TConfigsConfig &config = {});
-
- void Clear();
- void Parse(const NKikimrConsole::TConfigsConfig &config);
-
- static bool Check(const NKikimrConsole::TConfigsConfig &config,
- TString &error);
-
- THashSet<ui32> AllowedNodeIdScopeKinds;
- THashSet<ui32> AllowedHostScopeKinds;
- THashSet<ui32> AllowedTenantScopeKinds;
- THashSet<ui32> AllowedNodeTypeScopeKinds;
- THashSet<ui32> DisallowedDomainScopeKinds;
-
- NKikimrConsole::EValidationLevel ValidationLevel;
- ui32 MaxConfigChecksPerModification;
- bool FailOnExceededConfigChecksLimit;
- bool EnableValidationOnNodeConfigRequest;
- bool TreatWarningAsError;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
+
+#include <util/generic/hash_set.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+struct TConfigsConfig {
+ static constexpr ui64 MAX_CONFIG_CHECKS_LIMIT = 100000;
+
+ TConfigsConfig(const NKikimrConsole::TConfigsConfig &config = {});
+
+ void Clear();
+ void Parse(const NKikimrConsole::TConfigsConfig &config);
+
+ static bool Check(const NKikimrConsole::TConfigsConfig &config,
+ TString &error);
+
+ THashSet<ui32> AllowedNodeIdScopeKinds;
+ THashSet<ui32> AllowedHostScopeKinds;
+ THashSet<ui32> AllowedTenantScopeKinds;
+ THashSet<ui32> AllowedNodeTypeScopeKinds;
+ THashSet<ui32> DisallowedDomainScopeKinds;
+
+ NKikimrConsole::EValidationLevel ValidationLevel;
+ ui32 MaxConfigChecksPerModification;
+ bool FailOnExceededConfigChecksLimit;
+ bool EnableValidationOnNodeConfigRequest;
+ bool TreatWarningAsError;
+};
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/configs_dispatcher.cpp b/ydb/core/cms/console/configs_dispatcher.cpp
index c72bd8354b6..8e507542392 100644
--- a/ydb/core/cms/console/configs_dispatcher.cpp
+++ b/ydb/core/cms/console/configs_dispatcher.cpp
@@ -1,19 +1,19 @@
-#include "config_helpers.h"
-#include "config_index.h"
-#include "configs_dispatcher.h"
-#include "console.h"
-#include "http.h"
-
+#include "config_helpers.h"
+#include "config_index.h"
+#include "configs_dispatcher.h"
+#include "console.h"
+#include "http.h"
+
#include <ydb/core/mind/tenant_pool.h>
#include <ydb/core/mon/mon.h>
-
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/mon.h>
-
-#include <util/generic/bitmap.h>
-#include <util/generic/ptr.h>
-#include <util/string/join.h>
-
+
+#include <util/generic/bitmap.h>
+#include <util/generic/ptr.h>
+#include <util/string/join.h>
+
#if defined BLOG_D || defined BLOG_I || defined BLOG_ERROR || defined BLOG_TRACE
#error log macro definition clash
#endif
@@ -25,137 +25,137 @@
#define BLOG_ERROR(stream) LOG_ERROR_S(*TlsActivationContext, NKikimrServices::CONFIGS_DISPATCHER, stream)
#define BLOG_TRACE(stream) LOG_TRACE_S(*TlsActivationContext, NKikimrServices::CONFIGS_DISPATCHER, stream)
-namespace NKikimr {
-namespace NConsole {
-
-namespace {
-
-class TConfigsDispatcher : public TActorBootstrapped<TConfigsDispatcher> {
-private:
- using TBase = TActorBootstrapped<TConfigsDispatcher>;
-
- struct TConfig {
- TConfigId ConfigId;
- NKikimrConfig::TAppConfig Config;
- };
-
- /**
- * Structure to describe configs subscription shared by multiple
- * dispatcher subscribers.
- */
- struct TSubscription : public TThrRefBase {
- using TPtr = TIntrusivePtr<TSubscription>;
-
- // ID of corresponding subscription in CMS. Zero value means
- // we haven't received subscription confirmation from CMS yet.
- ui64 SubscriptionId = 0;
- TDynBitMap Kinds;
+namespace NKikimr {
+namespace NConsole {
+
+namespace {
+
+class TConfigsDispatcher : public TActorBootstrapped<TConfigsDispatcher> {
+private:
+ using TBase = TActorBootstrapped<TConfigsDispatcher>;
+
+ struct TConfig {
+ TConfigId ConfigId;
+ NKikimrConfig::TAppConfig Config;
+ };
+
+ /**
+ * Structure to describe configs subscription shared by multiple
+ * dispatcher subscribers.
+ */
+ struct TSubscription : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TSubscription>;
+
+ // ID of corresponding subscription in CMS. Zero value means
+ // we haven't received subscription confirmation from CMS yet.
+ ui64 SubscriptionId = 0;
+ TDynBitMap Kinds;
THashSet<TActorId> Subscribers;
- // Set to true if there were no config update notifications
- // processed for this subscription.
- bool FirstUpdate = true;
- // Last config which was delivered to all subscribers.
- TConfig CurrentConfig;
- // Config update which is currently delivered to subscribers.
- TEvConsole::TEvConfigNotificationRequest::TPtr UpdateInProcess;
- // Subscribers who didn't respond yet to the latest config update.
+ // Set to true if there were no config update notifications
+ // processed for this subscription.
+ bool FirstUpdate = true;
+ // Last config which was delivered to all subscribers.
+ TConfig CurrentConfig;
+ // Config update which is currently delivered to subscribers.
+ TEvConsole::TEvConfigNotificationRequest::TPtr UpdateInProcess;
+ // Subscribers who didn't respond yet to the latest config update.
THashSet<TActorId> SubscribersToUpdate;
- };
-
- /**
- * Structure to describe subscribers. Subscriber can have multiple
- * subscriptions but we allow only single subscription per external
- * client. The only client who can have multiple subscriptions is
- * dispatcher itself.
- */
- struct TSubscriber : public TThrRefBase {
- using TPtr = TIntrusivePtr<TSubscriber>;
-
+ };
+
+ /**
+ * Structure to describe subscribers. Subscriber can have multiple
+ * subscriptions but we allow only single subscription per external
+ * client. The only client who can have multiple subscriptions is
+ * dispatcher itself.
+ */
+ struct TSubscriber : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TSubscriber>;
+
TActorId Subscriber;
- THashSet<TSubscription::TPtr> Subscriptions;
- TConfigId CurrentConfigId;
- };
-
-public:
+ THashSet<TSubscription::TPtr> Subscriptions;
+ TConfigId CurrentConfigId;
+ };
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CONFIGS_DISPATCHER_ACTOR;
- }
-
- TConfigsDispatcher(const NKikimrConfig::TAppConfig &config);
-
+ }
+
+ TConfigsDispatcher(const NKikimrConfig::TAppConfig &config);
+
void Bootstrap();
-
+
void EnqueueEvent(TAutoPtr<IEventHandle> &ev);
void ProcessEnqueuedEvents();
-
- TDynBitMap KindsToBitMap(const TVector<ui32> &kinds) const;
- TString KindsToString(const TDynBitMap &kinds) const;
- TVector<ui32> KindsToVector(const TDynBitMap &kinds) const;
-
- /**
- * Overwrite specified protobuf fields with values from
- * another protobuf. It's assumed that source config doesn't
- * have fields not listed in kinds.
- */
+
+ TDynBitMap KindsToBitMap(const TVector<ui32> &kinds) const;
+ TString KindsToString(const TDynBitMap &kinds) const;
+ TVector<ui32> KindsToVector(const TDynBitMap &kinds) const;
+
+ /**
+ * Overwrite specified protobuf fields with values from
+ * another protobuf. It's assumed that source config doesn't
+ * have fields not listed in kinds.
+ */
void ReplaceConfigItems(const NKikimrConfig::TAppConfig &from, NKikimrConfig::TAppConfig &to, const TDynBitMap &kinds) const;
bool CompareConfigs(const NKikimrConfig::TAppConfig &lhs, const NKikimrConfig::TAppConfig &rhs);
-
- TSubscription::TPtr FindSubscription(ui64 id);
- TSubscription::TPtr FindSubscription(const TDynBitMap &kinds);
-
+
+ TSubscription::TPtr FindSubscription(ui64 id);
+ TSubscription::TPtr FindSubscription(const TDynBitMap &kinds);
+
TSubscriber::TPtr FindSubscriber(TActorId aid);
-
+
void SendNotificationResponse(TEvConsole::TEvConfigNotificationRequest::TPtr &ev);
void MaybeSendNotificationResponse(TSubscription::TPtr subscription);
-
+
void CreateSubscriberActor(ui32 kind, bool replace);
void CreateSubscriberActor(const TDynBitMap &kinds, bool replace);
- /**
- * Send config notification to a subscriber. Called for subscriptions
- * having config update being processed.
- */
+ /**
+ * Send config notification to a subscriber. Called for subscriptions
+ * having config update being processed.
+ */
void SendUpdateToSubscriber(TSubscription::TPtr subscription, TActorId subscriber);
- /**
- * Remove subscriber and all his subscriptions.
- */
+ /**
+ * Remove subscriber and all his subscriptions.
+ */
void RemoveSubscriber(TSubscriber::TPtr subscriber);
- /**
- * Remove subscription from own data and CMS. It should be called
- * for confirmed CMS subscriptions which have no more local
- * subscribers.
- */
+ /**
+ * Remove subscription from own data and CMS. It should be called
+ * for confirmed CMS subscriptions which have no more local
+ * subscribers.
+ */
void RemoveSubscription(TSubscription::TPtr subscription);
- /**
- * Create subscription for subscriber. If subscription with similar
- * config kinds already exists then just re-use it. Otherwise
- * create a new one. If existing subscription has some config received
- * then deliver it to the new subscriber.
- */
+ /**
+ * Create subscription for subscriber. If subscription with similar
+ * config kinds already exists then just re-use it. Otherwise
+ * create a new one. If existing subscription has some config received
+ * then deliver it to the new subscriber.
+ */
void AddSubscription(TActorId subscriber, const TDynBitMap &kinds, bool replace);
- /**
- * This is called on start and on tenant change to clean up old config
- * subscriptions. It also adds subscription for own config.
- */
+ /**
+ * This is called on start and on tenant change to clean up old config
+ * subscriptions. It also adds subscription for own config.
+ */
void CleanUpSubscriptions();
- /**
- * Process successfull subscription registration in CMS. Send
- * corresponsing notifications to subscribers. If no more subscribers
- * left for this subscription then remove it.
- */
+ /**
+ * Process successfull subscription registration in CMS. Send
+ * corresponsing notifications to subscribers. If no more subscribers
+ * left for this subscription then remove it.
+ */
void ProcessAddedSubscription(TSubscription::TPtr subscription, ui64 id);
- /**
- * This method is used to process notifications sent to self.
- */
+ /**
+ * This method is used to process notifications sent to self.
+ */
void ProcessLocalCacheUpdate(TEvConsole::TEvConfigNotificationRequest::TPtr &ev);
-
+
void Handle(NMon::TEvHttpInfo::TPtr &ev);
void Handle(TEvConfigsDispatcher::TEvGetConfigRequest::TPtr &ev);
void Handle(TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest::TPtr &ev);
@@ -165,46 +165,46 @@ public:
void Handle(TEvConsole::TEvGetNodeConfigResponse::TPtr &ev);
void Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev);
void Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev);
-
- /**
- * Initial state when we just get status from tenant pool to collect assigned
- * tenants. It's possible we start before tenant pool and therefore might have
- * to retry request.
- */
+
+ /**
+ * Initial state when we just get status from tenant pool to collect assigned
+ * tenants. It's possible we start before tenant pool and therefore might have
+ * to retry request.
+ */
STATEFN(StateInit) {
- TRACE_EVENT(NKikimrServices::CONFIGS_DISPATCHER);
- switch (ev->GetTypeRewrite()) {
+ TRACE_EVENT(NKikimrServices::CONFIGS_DISPATCHER);
+ switch (ev->GetTypeRewrite()) {
hFuncTraced(NMon::TEvHttpInfo, Handle);
hFuncTraced(TEvTenantPool::TEvTenantPoolStatus, Handle);
-
- default:
+
+ default:
EnqueueEvent(ev);
- break;
- }
- }
-
- /**
- * In this state we remove all old service subscriptions and install a new
- * one for own config.
- */
+ break;
+ }
+ }
+
+ /**
+ * In this state we remove all old service subscriptions and install a new
+ * one for own config.
+ */
STATEFN(StateConfigure) {
- TRACE_EVENT(NKikimrServices::CONFIGS_DISPATCHER);
- switch (ev->GetTypeRewrite()) {
+ TRACE_EVENT(NKikimrServices::CONFIGS_DISPATCHER);
+ switch (ev->GetTypeRewrite()) {
hFuncTraced(NMon::TEvHttpInfo, Handle);
hFuncTraced(TEvConsole::TEvReplaceConfigSubscriptionsResponse, Handle);
-
- default:
+
+ default:
EnqueueEvent(ev);
- break;
- }
- }
-
- /**
- * Primary state for subscriptions and notifications processing.
- */
+ break;
+ }
+ }
+
+ /**
+ * Primary state for subscriptions and notifications processing.
+ */
STATEFN(StateWork) {
- TRACE_EVENT(NKikimrServices::CONFIGS_DISPATCHER);
- switch (ev->GetTypeRewrite()) {
+ TRACE_EVENT(NKikimrServices::CONFIGS_DISPATCHER);
+ switch (ev->GetTypeRewrite()) {
hFuncTraced(NMon::TEvHttpInfo, Handle);
hFuncTraced(TEvConfigsDispatcher::TEvGetConfigRequest, Handle);
hFuncTraced(TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest, Handle);
@@ -213,150 +213,150 @@ public:
hFuncTraced(TEvConsole::TEvConfigNotificationRequest, Handle);
hFuncTraced(TEvConsole::TEvGetNodeConfigResponse, Handle);
hFuncTraced(TEvTenantPool::TEvTenantPoolStatus, Handle);
- IgnoreFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ IgnoreFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-
-private:
- TDeque<TAutoPtr<IEventHandle>> EventsQueue;
- NKikimrConfig::TAppConfig InitialConfig;
- NKikimrConfig::TAppConfig CurrentConfig;
- THashSet<TSubscription::TPtr> Subscriptions;
- THashMap<ui64, TSubscription::TPtr> SubscriptionsById;
- THashMap<TDynBitMap, TSubscription::TPtr> SubscriptionsByKinds;
+ break;
+ }
+ }
+
+private:
+ TDeque<TAutoPtr<IEventHandle>> EventsQueue;
+ NKikimrConfig::TAppConfig InitialConfig;
+ NKikimrConfig::TAppConfig CurrentConfig;
+ THashSet<TSubscription::TPtr> Subscriptions;
+ THashMap<ui64, TSubscription::TPtr> SubscriptionsById;
+ THashMap<TDynBitMap, TSubscription::TPtr> SubscriptionsByKinds;
THashMap<TActorId, TSubscriber::TPtr> Subscribers;
// Messages that had an unknown subscription id at the time they are received
THashMap<ui64, TEvConsole::TEvConfigNotificationRequest::TPtr> OutOfOrderConfigNotifications;
- // Cookies are used to tie CMS requests to kinds they were generated for.
- THashMap<ui64, TDynBitMap> RequestCookies;
- ui64 NextRequestCookie;
- THashSet<TString> CurrentTenants;
+ // Cookies are used to tie CMS requests to kinds they were generated for.
+ THashMap<ui64, TDynBitMap> RequestCookies;
+ ui64 NextRequestCookie;
+ THashSet<TString> CurrentTenants;
- // Structures to process config requests.
- THashMap<ui64, THolder<IEventHandle>> ConfigRequests;
+ // Structures to process config requests.
+ THashMap<ui64, THolder<IEventHandle>> ConfigRequests;
THashMap<TDynBitMap, std::shared_ptr<NKikimrConfig::TAppConfig>> ConfigsCache;
-};
-
-TConfigsDispatcher::TConfigsDispatcher(const NKikimrConfig::TAppConfig &config)
- : InitialConfig(config)
- , CurrentConfig(config)
- , NextRequestCookie(Now().GetValue())
-{
-}
-
+};
+
+TConfigsDispatcher::TConfigsDispatcher(const NKikimrConfig::TAppConfig &config)
+ : InitialConfig(config)
+ , CurrentConfig(config)
+ , NextRequestCookie(Now().GetValue())
+{
+}
+
void TConfigsDispatcher::Bootstrap()
-{
+{
BLOG_D("TConfigsDispatcher Bootstrap");
-
+
NActors::TMon *mon = AppData()->Mon;
- if (mon) {
- NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors");
+ if (mon) {
+ NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors");
mon->RegisterActorPage(actorsMonPage, "configs_dispatcher", "Configs Dispatcher", false, TlsActivationContext->ExecutorThread.ActorSystem, SelfId());
- }
-
- Become(&TThis::StateInit);
- Send(MakeTenantPoolRootID(), new TEvents::TEvSubscribe);
-}
-
+ }
+
+ Become(&TThis::StateInit);
+ Send(MakeTenantPoolRootID(), new TEvents::TEvSubscribe);
+}
+
void TConfigsDispatcher::EnqueueEvent(TAutoPtr<IEventHandle> &ev)
-{
+{
BLOG_D("Enqueue event type: " << ev->GetTypeRewrite());
- EventsQueue.push_back(ev);
-}
-
+ EventsQueue.push_back(ev);
+}
+
void TConfigsDispatcher::ProcessEnqueuedEvents()
-{
- while (!EventsQueue.empty()) {
- TAutoPtr<IEventHandle> &ev = EventsQueue.front();
+{
+ while (!EventsQueue.empty()) {
+ TAutoPtr<IEventHandle> &ev = EventsQueue.front();
BLOG_D("Dequeue event type: " << ev->GetTypeRewrite());
TlsActivationContext->Send(ev.Release());
- EventsQueue.pop_front();
- }
-}
-
-TDynBitMap TConfigsDispatcher::KindsToBitMap(const TVector<ui32> &kinds) const
-{
- TDynBitMap result;
- for (auto &kind : kinds)
- result.Set(kind);
- return result;
-}
-
-TString TConfigsDispatcher::KindsToString(const TDynBitMap &kinds) const
-{
- TStringStream ss;
- bool first = true;
- Y_FOR_EACH_BIT(kind, kinds) {
- ss << (first ? "" : ", ") << static_cast<NKikimrConsole::TConfigItem::EKind>(kind);
- first = false;
- }
- return ss.Str();
-}
-
-TVector<ui32> TConfigsDispatcher::KindsToVector(const TDynBitMap &kinds) const
-{
- TVector<ui32> res;
- Y_FOR_EACH_BIT(kind, kinds) {
- res.push_back(kind);
- }
- return res;
-}
-
-void TConfigsDispatcher::ReplaceConfigItems(const NKikimrConfig::TAppConfig &from,
- NKikimrConfig::TAppConfig &to,
- const TDynBitMap &kinds) const
-{
- auto *desc = to.GetDescriptor();
- auto *reflection = to.GetReflection();
-
- Y_FOR_EACH_BIT(kind, kinds) {
- auto *field = desc->FindFieldByNumber(kind);
- if (field && reflection->HasField(to, field))
- reflection->ClearField(&to, field);
- }
-
- to.MergeFrom(from);
-}
-
+ EventsQueue.pop_front();
+ }
+}
+
+TDynBitMap TConfigsDispatcher::KindsToBitMap(const TVector<ui32> &kinds) const
+{
+ TDynBitMap result;
+ for (auto &kind : kinds)
+ result.Set(kind);
+ return result;
+}
+
+TString TConfigsDispatcher::KindsToString(const TDynBitMap &kinds) const
+{
+ TStringStream ss;
+ bool first = true;
+ Y_FOR_EACH_BIT(kind, kinds) {
+ ss << (first ? "" : ", ") << static_cast<NKikimrConsole::TConfigItem::EKind>(kind);
+ first = false;
+ }
+ return ss.Str();
+}
+
+TVector<ui32> TConfigsDispatcher::KindsToVector(const TDynBitMap &kinds) const
+{
+ TVector<ui32> res;
+ Y_FOR_EACH_BIT(kind, kinds) {
+ res.push_back(kind);
+ }
+ return res;
+}
+
+void TConfigsDispatcher::ReplaceConfigItems(const NKikimrConfig::TAppConfig &from,
+ NKikimrConfig::TAppConfig &to,
+ const TDynBitMap &kinds) const
+{
+ auto *desc = to.GetDescriptor();
+ auto *reflection = to.GetReflection();
+
+ Y_FOR_EACH_BIT(kind, kinds) {
+ auto *field = desc->FindFieldByNumber(kind);
+ if (field && reflection->HasField(to, field))
+ reflection->ClearField(&to, field);
+ }
+
+ to.MergeFrom(from);
+}
+
bool TConfigsDispatcher::CompareConfigs(const NKikimrConfig::TAppConfig &lhs, const NKikimrConfig::TAppConfig &rhs)
-{
- TString str1, str2;
+{
+ TString str1, str2;
Y_PROTOBUF_SUPPRESS_NODISCARD lhs.SerializeToString(&str1);
Y_PROTOBUF_SUPPRESS_NODISCARD rhs.SerializeToString(&str2);
return (str1 == str2);
-}
-
-TConfigsDispatcher::TSubscription::TPtr TConfigsDispatcher::FindSubscription(ui64 id)
-{
- auto it = SubscriptionsById.find(id);
- if (it == SubscriptionsById.end())
- return nullptr;
- return it->second;
-}
-
-TConfigsDispatcher::TSubscription::TPtr TConfigsDispatcher::FindSubscription(const TDynBitMap &kinds)
-{
- auto it = SubscriptionsByKinds.find(kinds);
- if (it == SubscriptionsByKinds.end())
- return nullptr;
- return it->second;
-}
-
+}
+
+TConfigsDispatcher::TSubscription::TPtr TConfigsDispatcher::FindSubscription(ui64 id)
+{
+ auto it = SubscriptionsById.find(id);
+ if (it == SubscriptionsById.end())
+ return nullptr;
+ return it->second;
+}
+
+TConfigsDispatcher::TSubscription::TPtr TConfigsDispatcher::FindSubscription(const TDynBitMap &kinds)
+{
+ auto it = SubscriptionsByKinds.find(kinds);
+ if (it == SubscriptionsByKinds.end())
+ return nullptr;
+ return it->second;
+}
+
TConfigsDispatcher::TSubscriber::TPtr TConfigsDispatcher::FindSubscriber(TActorId aid)
-{
- auto it = Subscribers.find(aid);
- if (it == Subscribers.end())
- return nullptr;
- return it->second;
-}
-
+{
+ auto it = Subscribers.find(aid);
+ if (it == Subscribers.end())
+ return nullptr;
+ return it->second;
+}
+
void TConfigsDispatcher::SendNotificationResponse(TEvConsole::TEvConfigNotificationRequest::TPtr &ev)
{
const auto &rec = ev->Get()->Record;
@@ -368,209 +368,209 @@ void TConfigsDispatcher::SendNotificationResponse(TEvConsole::TEvConfigNotificat
}
void TConfigsDispatcher::MaybeSendNotificationResponse(TSubscription::TPtr subscription)
-{
+{
if (!subscription->UpdateInProcess || !subscription->SubscribersToUpdate.empty())
- return;
-
- auto &rec = subscription->UpdateInProcess->Get()->Record;
- subscription->CurrentConfig.Config.Swap(rec.MutableConfig());
- subscription->CurrentConfig.ConfigId.Load(rec.GetConfigId());
-
+ return;
+
+ auto &rec = subscription->UpdateInProcess->Get()->Record;
+ subscription->CurrentConfig.Config.Swap(rec.MutableConfig());
+ subscription->CurrentConfig.ConfigId.Load(rec.GetConfigId());
+
ReplaceConfigItems(subscription->CurrentConfig.Config, CurrentConfig, subscription->Kinds);
-
+
BLOG_D("Got all confirmations for config update"
- << " subscriptionid=" << subscription->SubscriptionId
- << " configid=" << TConfigId(rec.GetConfigId()).ToString());
-
+ << " subscriptionid=" << subscription->SubscriptionId
+ << " configid=" << TConfigId(rec.GetConfigId()).ToString());
+
SendNotificationResponse(subscription->UpdateInProcess);
-
- subscription->UpdateInProcess = nullptr;
-}
-
+
+ subscription->UpdateInProcess = nullptr;
+}
+
void TConfigsDispatcher::CreateSubscriberActor(ui32 kind, bool replace)
-{
- TDynBitMap kinds;
- kinds.Set(kind);
+{
+ TDynBitMap kinds;
+ kinds.Set(kind);
CreateSubscriberActor(kinds, replace);
-}
-
+}
+
void TConfigsDispatcher::CreateSubscriberActor(const TDynBitMap &kinds, bool replace)
-{
+{
BLOG_D("Create new subscriber kinds=" << KindsToString(kinds));
-
+
auto *subscriber = CreateConfigSubscriber(MakeConfigsDispatcherID(SelfId().NodeId()),
- KindsToVector(kinds),
+ KindsToVector(kinds),
SelfId(),
- replace,
- NextRequestCookie);
+ replace,
+ NextRequestCookie);
Register(subscriber);
- RequestCookies[NextRequestCookie] = kinds;
- ++NextRequestCookie;
-}
-
+ RequestCookies[NextRequestCookie] = kinds;
+ ++NextRequestCookie;
+}
+
void TConfigsDispatcher::SendUpdateToSubscriber(TSubscription::TPtr subscription, TActorId subscriber)
-{
- Y_VERIFY(subscription->SubscriptionId);
- Y_VERIFY(subscription->UpdateInProcess);
-
- subscription->SubscribersToUpdate.insert(subscriber);
-
- auto notification = MakeHolder<TEvConsole::TEvConfigNotificationRequest>();
- notification->Record.CopyFrom(subscription->UpdateInProcess->Get()->Record);
-
+{
+ Y_VERIFY(subscription->SubscriptionId);
+ Y_VERIFY(subscription->UpdateInProcess);
+
+ subscription->SubscribersToUpdate.insert(subscriber);
+
+ auto notification = MakeHolder<TEvConsole::TEvConfigNotificationRequest>();
+ notification->Record.CopyFrom(subscription->UpdateInProcess->Get()->Record);
+
BLOG_TRACE("Send TEvConsole::TEvConfigNotificationRequest to " << subscriber
- << ": " << notification->Record.ShortDebugString());
-
+ << ": " << notification->Record.ShortDebugString());
+
Send(subscriber, notification.Release(), 0, subscription->UpdateInProcess->Cookie);
-}
-
+}
+
void TConfigsDispatcher::RemoveSubscriber(TSubscriber::TPtr subscriber)
-{
+{
BLOG_D("Remove subscriber " << subscriber->Subscriber);
-
- for (auto subscription : subscriber->Subscriptions) {
+
+ for (auto subscription : subscriber->Subscriptions) {
Y_VERIFY(subscription->Subscribers.contains(subscriber->Subscriber));
- subscription->Subscribers.erase(subscriber->Subscriber);
-
- if (subscription->UpdateInProcess) {
- subscription->SubscribersToUpdate.erase(subscriber->Subscriber);
+ subscription->Subscribers.erase(subscriber->Subscriber);
+
+ if (subscription->UpdateInProcess) {
+ subscription->SubscribersToUpdate.erase(subscriber->Subscriber);
MaybeSendNotificationResponse(subscription);
- }
-
- // If there are no more subscribers using this subscription then
- // it can be removed. Don't remove subscriptions which are not
- // yet confirmed by CMS.
- if (subscription->Subscribers.empty() && subscription->SubscriptionId)
+ }
+
+ // If there are no more subscribers using this subscription then
+ // it can be removed. Don't remove subscriptions which are not
+ // yet confirmed by CMS.
+ if (subscription->Subscribers.empty() && subscription->SubscriptionId)
RemoveSubscription(subscription);
- }
-
- Subscribers.erase(subscriber->Subscriber);
-}
-
+ }
+
+ Subscribers.erase(subscriber->Subscriber);
+}
+
void TConfigsDispatcher::RemoveSubscription(TSubscription::TPtr subscription)
-{
- Subscriptions.erase(subscription);
- SubscriptionsById.erase(subscription->SubscriptionId);
- SubscriptionsByKinds.erase(subscription->Kinds);
-
+{
+ Subscriptions.erase(subscription);
+ SubscriptionsById.erase(subscription->SubscriptionId);
+ SubscriptionsByKinds.erase(subscription->Kinds);
+
BLOG_D("Remove subscription id=" << subscription->SubscriptionId
- << " kinds=" << KindsToString(subscription->Kinds));
-
+ << " kinds=" << KindsToString(subscription->Kinds));
+
Register(CreateSubscriptionEraser(subscription->SubscriptionId));
-}
-
+}
+
void TConfigsDispatcher::AddSubscription(TActorId subscriber,
- const TDynBitMap &kinds,
+ const TDynBitMap &kinds,
bool replace)
-{
+{
BLOG_D("Add subscription for " << subscriber << " kinds=" << KindsToString(kinds));
-
- // If there is a subscription for required config kinds then
- // re-use it for new subscriber. Otherwise create a new one.
- auto subscription = FindSubscription(kinds);
- if (!subscription) {
- subscription = new TSubscription;
- subscription->Kinds = kinds;
-
- Subscriptions.insert(subscription);
- SubscriptionsByKinds.emplace(kinds, subscription);
-
+
+ // If there is a subscription for required config kinds then
+ // re-use it for new subscriber. Otherwise create a new one.
+ auto subscription = FindSubscription(kinds);
+ if (!subscription) {
+ subscription = new TSubscription;
+ subscription->Kinds = kinds;
+
+ Subscriptions.insert(subscription);
+ SubscriptionsByKinds.emplace(kinds, subscription);
+
CreateSubscriberActor(kinds, replace);
- }
- subscription->Subscribers.insert(subscriber);
-
- auto s = FindSubscriber(subscriber);
- if (!s) {
- s = new TSubscriber;
- s->Subscriber = subscriber;
- Subscribers.emplace(subscriber, s);
- }
- s->Subscriptions.insert(subscription);
-
- // Non-zero subscription ID means there is an active CMS
- // subscription and therefore we can respond to the subscriber
- // immediately. Otherwise we should wait until CMS
- // subscription request is complete.
- if (subscription->SubscriptionId) {
- Y_VERIFY(!replace);
- auto resp = MakeHolder<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>();
-
+ }
+ subscription->Subscribers.insert(subscriber);
+
+ auto s = FindSubscriber(subscriber);
+ if (!s) {
+ s = new TSubscriber;
+ s->Subscriber = subscriber;
+ Subscribers.emplace(subscriber, s);
+ }
+ s->Subscriptions.insert(subscription);
+
+ // Non-zero subscription ID means there is an active CMS
+ // subscription and therefore we can respond to the subscriber
+ // immediately. Otherwise we should wait until CMS
+ // subscription request is complete.
+ if (subscription->SubscriptionId) {
+ Y_VERIFY(!replace);
+ auto resp = MakeHolder<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>();
+
BLOG_TRACE("Send TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse to "
- << subscriber);
-
+ << subscriber);
+
Send(subscriber, resp.Release());
- }
-
- // If there is an ongoing config update then include new subscriber into
- // the process.
- if (subscription->UpdateInProcess) {
- Y_VERIFY(!replace);
+ }
+
+ // If there is an ongoing config update then include new subscriber into
+ // the process.
+ if (subscription->UpdateInProcess) {
+ Y_VERIFY(!replace);
SendUpdateToSubscriber(subscription, subscriber);
- } else if (!subscription->FirstUpdate) {
- // If subscription already had an update notification then send corresponding
- // notification to the subscriber using current config.
- Y_VERIFY(!replace);
- Y_VERIFY(subscription->SubscriptionId);
- auto notification = MakeHolder<TEvConsole::TEvConfigNotificationRequest>();
- notification->Record.SetSubscriptionId(subscription->SubscriptionId);
- subscription->CurrentConfig.ConfigId.Serialize(*notification->Record.MutableConfigId());
- notification->Record.MutableConfig()->CopyFrom(subscription->CurrentConfig.Config);
-
+ } else if (!subscription->FirstUpdate) {
+ // If subscription already had an update notification then send corresponding
+ // notification to the subscriber using current config.
+ Y_VERIFY(!replace);
+ Y_VERIFY(subscription->SubscriptionId);
+ auto notification = MakeHolder<TEvConsole::TEvConfigNotificationRequest>();
+ notification->Record.SetSubscriptionId(subscription->SubscriptionId);
+ subscription->CurrentConfig.ConfigId.Serialize(*notification->Record.MutableConfigId());
+ notification->Record.MutableConfig()->CopyFrom(subscription->CurrentConfig.Config);
+
BLOG_TRACE("Send TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse to "<< subscriber);
-
+
Send(subscriber, notification.Release());
- }
-}
-
+ }
+}
+
void TConfigsDispatcher::CleanUpSubscriptions()
-{
+{
BLOG_N("Cleaning up all current subscriptions");
-
- // If there are active subscriptions then we should
- // mark them as removed by reseting their IDs
- // and configs.
- for (auto &subscription : Subscriptions) {
- subscription->SubscriptionId = 0;
- subscription->SubscribersToUpdate.clear();
- subscription->UpdateInProcess = nullptr;
- subscription->FirstUpdate = true;
- }
- SubscriptionsById.clear();
- RequestCookies.clear();
+
+ // If there are active subscriptions then we should
+ // mark them as removed by reseting their IDs
+ // and configs.
+ for (auto &subscription : Subscriptions) {
+ subscription->SubscriptionId = 0;
+ subscription->SubscribersToUpdate.clear();
+ subscription->UpdateInProcess = nullptr;
+ subscription->FirstUpdate = true;
+ }
+ SubscriptionsById.clear();
+ RequestCookies.clear();
OutOfOrderConfigNotifications.clear();
-
- // We should invalidate configs cache to avoid its usage until
- // updated configs are received.
- ConfigsCache.clear();
-
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::ConfigsDispatcherConfigItem);
- auto subscription = FindSubscription(kinds);
- if (subscription) {
+
+ // We should invalidate configs cache to avoid its usage until
+ // updated configs are received.
+ ConfigsCache.clear();
+
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::ConfigsDispatcherConfigItem);
+ auto subscription = FindSubscription(kinds);
+ if (subscription) {
CreateSubscriberActor(kinds, true);
- } else {
+ } else {
AddSubscription(SelfId(), kinds, true);
- }
-
- Become(&TThis::StateConfigure);
-}
-
+ }
+
+ Become(&TThis::StateConfigure);
+}
+
void TConfigsDispatcher::ProcessAddedSubscription(TSubscription::TPtr subscription, ui64 id)
-{
+{
BLOG_N("Confirmed CMS subscription"
- << " kinds=" << KindsToString(subscription->Kinds)
- << " id=" << id);
-
- Y_VERIFY(!subscription->SubscriptionId);
- subscription->SubscriptionId = id;
- SubscriptionsById[id] = subscription;
-
- for (auto &subscriber : subscription->Subscribers) {
+ << " kinds=" << KindsToString(subscription->Kinds)
+ << " id=" << id);
+
+ Y_VERIFY(!subscription->SubscriptionId);
+ subscription->SubscriptionId = id;
+ SubscriptionsById[id] = subscription;
+
+ for (auto &subscriber : subscription->Subscribers) {
BLOG_TRACE("Send TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse to " << subscriber);
-
+
Send(subscriber, new TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
- }
-
+ }
+
auto it = OutOfOrderConfigNotifications.find(id);
if (it != OutOfOrderConfigNotifications.end()) {
auto ev = std::move(it->second);
@@ -585,248 +585,248 @@ void TConfigsDispatcher::ProcessAddedSubscription(TSubscription::TPtr subscripti
SendNotificationResponse(ev);
}
- // Probably there are no more subscribers for this subscription.
- // In that case it should be removed.
- if (subscription->Subscribers.empty())
+ // Probably there are no more subscribers for this subscription.
+ // In that case it should be removed.
+ if (subscription->Subscribers.empty())
RemoveSubscription(subscription);
-}
-
+}
+
void TConfigsDispatcher::ProcessLocalCacheUpdate(TEvConsole::TEvConfigNotificationRequest::TPtr &ev)
-{
- auto &rec = ev->Get()->Record;
+{
+ auto &rec = ev->Get()->Record;
BLOG_D("Got new config: " << rec.ShortDebugString());
-
- auto subscription = FindSubscription(rec.GetSubscriptionId());
- if (!subscription) {
+
+ auto subscription = FindSubscription(rec.GetSubscriptionId());
+ if (!subscription) {
BLOG_ERROR("Cannot find subscription for configs cache update subscriptionid=" << rec.GetSubscriptionId());
- return;
- }
-
+ return;
+ }
+
BLOG_D("Update local cache for kinds=" << KindsToString(subscription->Kinds)
- << " config='" << rec.GetConfig().ShortDebugString() << "'");
-
+ << " config='" << rec.GetConfig().ShortDebugString() << "'");
+
ConfigsCache[subscription->Kinds].reset(new NKikimrConfig::TAppConfig(rec.GetConfig()));
-
- auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
-
+
+ auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
+
BLOG_TRACE("Send TEvConsole::TEvConfigNotificationResponse to self: " << resp->Record.ShortDebugString());
-
+
Send(ev->Sender, resp.Release(), 0, ev->Cookie);
-}
-
+}
+
void TConfigsDispatcher::Handle(NMon::TEvHttpInfo::TPtr &ev)
-{
- TStringStream str;
- str << NMonitoring::HTTPOKHTML;
- HTML(str) {
- NHttp::OutputStaticPart(str);
- PRE() {
- str << "Maintained tenant: " << JoinSeq(", ", CurrentTenants);
- }
- DIV_CLASS("tab-left") {
- COLLAPSED_REF_CONTENT("current-config", "Current config") {
- NHttp::OutputConfigHTML(str, CurrentConfig);
- }
- str << "<br />" << Endl;
- COLLAPSED_REF_CONTENT("initial-config", "Initial config") {
- NHttp::OutputConfigHTML(str, InitialConfig);
- }
- str << "<br />" << Endl;
- COLLAPSED_REF_CONTENT("subscriptions", "Subscriptions") {
- PRE() {
- for (auto subscription : Subscriptions) {
- str << " - ID: " << subscription->SubscriptionId << Endl
- << " Kinds: " << KindsToString(subscription->Kinds) << Endl
- << " Subscribers:";
- for (auto &id : subscription->Subscribers)
- str << " " << id;
- str << Endl
- << " FirstUpdate: " << subscription->FirstUpdate << Endl
- << " CurrentConfigId: " << subscription->CurrentConfig.ConfigId.ToString() << Endl
- << " CurrentConfig: " << subscription->CurrentConfig.Config.ShortDebugString() << Endl;
- if (subscription->UpdateInProcess) {
- str << " UpdateInProcess: " << subscription->UpdateInProcess->Get()->Record.ShortDebugString() << Endl
- << " SubscribersToUpdate:";
- for (auto &id : subscription->SubscribersToUpdate)
- str << " " << id;
- str << Endl;
- }
- }
- }
- }
- str << "<br />" << Endl;
- COLLAPSED_REF_CONTENT("subscribers", "Subscribers") {
- PRE() {
- for (auto &pr : Subscribers) {
- str << " - Subscriber: " << pr.second->Subscriber << Endl
- << " Subscriptions:";
- for (auto subscription : pr.second->Subscriptions)
- str << " " << subscription->SubscriptionId;
- str << Endl
- << " CurrentConfigId: " << pr.second->CurrentConfigId.ToString() << Endl;
- }
- }
- }
- str << "<br />" << Endl;
- COLLAPSED_REF_CONTENT("cache", "Configs cache") {
- DIV_CLASS("tab-left") {
- ui32 id = 1;
- for (auto &pr : ConfigsCache) {
- TString kinds = KindsToString(pr.first);
- str << "<br />" << Endl;
- COLLAPSED_REF_CONTENT("cache-" + ToString(id++), kinds) {
- DIV_CLASS("tab-left") {
- PRE() {
- str << pr.second->DebugString() << Endl;
- }
- }
- }
- }
- }
- }
- }
- }
-
+{
+ TStringStream str;
+ str << NMonitoring::HTTPOKHTML;
+ HTML(str) {
+ NHttp::OutputStaticPart(str);
+ PRE() {
+ str << "Maintained tenant: " << JoinSeq(", ", CurrentTenants);
+ }
+ DIV_CLASS("tab-left") {
+ COLLAPSED_REF_CONTENT("current-config", "Current config") {
+ NHttp::OutputConfigHTML(str, CurrentConfig);
+ }
+ str << "<br />" << Endl;
+ COLLAPSED_REF_CONTENT("initial-config", "Initial config") {
+ NHttp::OutputConfigHTML(str, InitialConfig);
+ }
+ str << "<br />" << Endl;
+ COLLAPSED_REF_CONTENT("subscriptions", "Subscriptions") {
+ PRE() {
+ for (auto subscription : Subscriptions) {
+ str << " - ID: " << subscription->SubscriptionId << Endl
+ << " Kinds: " << KindsToString(subscription->Kinds) << Endl
+ << " Subscribers:";
+ for (auto &id : subscription->Subscribers)
+ str << " " << id;
+ str << Endl
+ << " FirstUpdate: " << subscription->FirstUpdate << Endl
+ << " CurrentConfigId: " << subscription->CurrentConfig.ConfigId.ToString() << Endl
+ << " CurrentConfig: " << subscription->CurrentConfig.Config.ShortDebugString() << Endl;
+ if (subscription->UpdateInProcess) {
+ str << " UpdateInProcess: " << subscription->UpdateInProcess->Get()->Record.ShortDebugString() << Endl
+ << " SubscribersToUpdate:";
+ for (auto &id : subscription->SubscribersToUpdate)
+ str << " " << id;
+ str << Endl;
+ }
+ }
+ }
+ }
+ str << "<br />" << Endl;
+ COLLAPSED_REF_CONTENT("subscribers", "Subscribers") {
+ PRE() {
+ for (auto &pr : Subscribers) {
+ str << " - Subscriber: " << pr.second->Subscriber << Endl
+ << " Subscriptions:";
+ for (auto subscription : pr.second->Subscriptions)
+ str << " " << subscription->SubscriptionId;
+ str << Endl
+ << " CurrentConfigId: " << pr.second->CurrentConfigId.ToString() << Endl;
+ }
+ }
+ }
+ str << "<br />" << Endl;
+ COLLAPSED_REF_CONTENT("cache", "Configs cache") {
+ DIV_CLASS("tab-left") {
+ ui32 id = 1;
+ for (auto &pr : ConfigsCache) {
+ TString kinds = KindsToString(pr.first);
+ str << "<br />" << Endl;
+ COLLAPSED_REF_CONTENT("cache-" + ToString(id++), kinds) {
+ DIV_CLASS("tab-left") {
+ PRE() {
+ str << pr.second->DebugString() << Endl;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str(), 0, NMon::IEvHttpInfoRes::EContentType::Custom));
-}
-
+}
+
void TConfigsDispatcher::Handle(TEvConfigsDispatcher::TEvGetConfigRequest::TPtr &ev)
-{
- auto kinds = KindsToBitMap(ev->Get()->ConfigItemKinds);
-
- if (ev->Get()->Cache && !kinds.Empty()) {
- auto subscription = FindSubscription(kinds);
+{
+ auto kinds = KindsToBitMap(ev->Get()->ConfigItemKinds);
+
+ if (ev->Get()->Cache && !kinds.Empty()) {
+ auto subscription = FindSubscription(kinds);
if (!subscription || !subscription->Subscribers.contains(SelfId())) {
BLOG_D("Add subscription for local cache kinds=" << KindsToString(kinds));
AddSubscription(SelfId(), kinds, false);
- }
- }
-
+ }
+ }
+
if (ConfigsCache.contains(kinds)) {
- auto resp = MakeHolder<TEvConfigsDispatcher::TEvGetConfigResponse>();
- resp->Config = ConfigsCache.at(kinds);
-
+ auto resp = MakeHolder<TEvConfigsDispatcher::TEvGetConfigResponse>();
+ resp->Config = ConfigsCache.at(kinds);
+
BLOG_TRACE("Send TEvConfigsDispatcher::TEvGetConfigResponse"
" to " << ev->Sender << ": " << resp->Config->ShortDebugString());
-
+
Send(ev->Sender, std::move(resp), 0, ev->Cookie);
- } else {
+ } else {
Register(CreateNodeConfigCourier(ev->Get()->ConfigItemKinds, SelfId(), NextRequestCookie));
ConfigRequests[NextRequestCookie++] = THolder<IEventHandle>(ev.Release());
- }
-}
-
+ }
+}
+
void TConfigsDispatcher::Handle(TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest::TPtr &ev)
-{
- auto kinds = KindsToBitMap(ev->Get()->ConfigItemKinds);
- auto subscriber = FindSubscriber(ev->Sender);
-
- if (subscriber) {
- Y_VERIFY(subscriber->Subscriptions.size() == 1);
- auto subscription = *subscriber->Subscriptions.begin();
-
- if (subscription->Kinds == kinds) {
+{
+ auto kinds = KindsToBitMap(ev->Get()->ConfigItemKinds);
+ auto subscriber = FindSubscriber(ev->Sender);
+
+ if (subscriber) {
+ Y_VERIFY(subscriber->Subscriptions.size() == 1);
+ auto subscription = *subscriber->Subscriptions.begin();
+
+ if (subscription->Kinds == kinds) {
BLOG_D("Nothing to change for " << subscriber->Subscriber);
BLOG_TRACE("Send TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse to " << subscriber->Subscriber);
Send(subscriber->Subscriber, new TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
- return;
- }
-
+ return;
+ }
+
// something changed so refresh subscription
RemoveSubscriber(subscriber);
- }
-
+ }
+
if (!kinds.Empty()) {
AddSubscription(ev->Sender, kinds, false);
} else {
BLOG_TRACE("Send TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse to " << ev->Sender);
-
+
Send(ev->Sender, new TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
- }
-}
-
+ }
+}
+
void TConfigsDispatcher::Handle(TEvConsole::TEvAddConfigSubscriptionResponse::TPtr &ev)
-{
- auto it = RequestCookies.find(ev->Cookie);
- if (it == RequestCookies.end()) {
+{
+ auto it = RequestCookies.find(ev->Cookie);
+ if (it == RequestCookies.end()) {
BLOG_I("Cookie mismatch for TEvAddConfigSubscriptionResponse");
- return;
- }
- auto kinds = it->second;
- RequestCookies.erase(it);
-
- auto &rec = ev->Get()->Record;
- if (rec.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
+ return;
+ }
+ auto kinds = it->second;
+ RequestCookies.erase(it);
+
+ auto &rec = ev->Get()->Record;
+ if (rec.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
LOG_CRIT_S(*TlsActivationContext, NKikimrServices::CONFIGS_DISPATCHER,
- "Cannot get config subscription for " << KindsToString(kinds)
- << " code=" << rec.GetStatus().GetCode()
- << " reason= " << rec.GetStatus().GetReason());
+ "Cannot get config subscription for " << KindsToString(kinds)
+ << " code=" << rec.GetStatus().GetCode()
+ << " reason= " << rec.GetStatus().GetReason());
CreateSubscriberActor(kinds, false);
- return;
- }
-
- auto subscription = FindSubscription(kinds);
- Y_VERIFY(subscription);
-
+ return;
+ }
+
+ auto subscription = FindSubscription(kinds);
+ Y_VERIFY(subscription);
+
ProcessAddedSubscription(subscription, rec.GetSubscriptionId());
-}
-
+}
+
void TConfigsDispatcher::Handle(TEvConsole::TEvConfigNotificationResponse::TPtr &ev)
-{
- auto rec = ev->Get()->Record;
- auto subscription = FindSubscription(rec.GetSubscriptionId());
-
- // Probably subscription was cleared up due to tenant's change.
- if (!subscription) {
+{
+ auto rec = ev->Get()->Record;
+ auto subscription = FindSubscription(rec.GetSubscriptionId());
+
+ // Probably subscription was cleared up due to tenant's change.
+ if (!subscription) {
BLOG_I("Got notification response for unknown subscription " << rec.GetSubscriptionId());
- return;
- }
-
- if (!subscription->UpdateInProcess) {
+ return;
+ }
+
+ if (!subscription->UpdateInProcess) {
BLOG_D("Notification was ignored for subscription "
- << rec.GetSubscriptionId());
- return;
- }
-
- if (ev->Cookie != subscription->UpdateInProcess->Cookie) {
+ << rec.GetSubscriptionId());
+ return;
+ }
+
+ if (ev->Cookie != subscription->UpdateInProcess->Cookie) {
BLOG_ERROR("Notification cookie mismatch for subscription " << rec.GetSubscriptionId());
- return;
- }
-
- TConfigId id1(subscription->UpdateInProcess->Get()->Record.GetConfigId());
- TConfigId id2(rec.GetConfigId());
- // This might be outdated notification response.
- if (id1 != id2) {
+ return;
+ }
+
+ TConfigId id1(subscription->UpdateInProcess->Get()->Record.GetConfigId());
+ TConfigId id2(rec.GetConfigId());
+ // This might be outdated notification response.
+ if (id1 != id2) {
BLOG_I("Config id mismatch in notification response for subscription " << rec.GetSubscriptionId());
- return;
- }
-
+ return;
+ }
+
if (!subscription->SubscribersToUpdate.contains(ev->Sender)) {
BLOG_ERROR("Notification from unexpected subscriber for subscription " << rec.GetSubscriptionId());
- return;
- }
-
- Subscribers.at(ev->Sender)->CurrentConfigId = id1;
-
- // If all subscribers responded then send response to CMS.
- subscription->SubscribersToUpdate.erase(ev->Sender);
+ return;
+ }
+
+ Subscribers.at(ev->Sender)->CurrentConfigId = id1;
+
+ // If all subscribers responded then send response to CMS.
+ subscription->SubscribersToUpdate.erase(ev->Sender);
MaybeSendNotificationResponse(subscription);
-}
-
+}
+
void TConfigsDispatcher::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev)
-{
- // Process local update sent by own local subscription.
+{
+ // Process local update sent by own local subscription.
if (ev->Sender == SelfId()) {
ProcessLocalCacheUpdate(ev);
- return;
- }
-
- auto &rec = ev->Get()->Record;
- auto subscription = FindSubscription(rec.GetSubscriptionId());
- if (!subscription) {
+ return;
+ }
+
+ auto &rec = ev->Get()->Record;
+ auto subscription = FindSubscription(rec.GetSubscriptionId());
+ if (!subscription) {
BLOG_W("Got notification for unknown subscription id=" << rec.GetSubscriptionId());
-
+
if (SubscriptionsById.size() < Subscriptions.size()) {
// There are subscriptions that don't have an id yet
// Delay processing until we know ids of all subscriptions
@@ -837,110 +837,110 @@ void TConfigsDispatcher::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &
prev = ev;
return;
}
-
+
SendNotificationResponse(ev);
- return;
- }
-
- if (subscription->UpdateInProcess) {
+ return;
+ }
+
+ if (subscription->UpdateInProcess) {
BLOG_D("Drop previous unfinished notification for subscription id="
- << subscription->SubscriptionId);
- subscription->UpdateInProcess = nullptr;
- subscription->SubscribersToUpdate.clear();
- }
-
- subscription->UpdateInProcess = std::move(ev);
-
- /**
- * Avoid notifications in case only config id changed and
- * config body is equal to currently used one.
- */
+ << subscription->SubscriptionId);
+ subscription->UpdateInProcess = nullptr;
+ subscription->SubscribersToUpdate.clear();
+ }
+
+ subscription->UpdateInProcess = std::move(ev);
+
+ /**
+ * Avoid notifications in case only config id changed and
+ * config body is equal to currently used one.
+ */
if (subscription->FirstUpdate || !CompareConfigs(subscription->CurrentConfig.Config, rec.GetConfig())) {
- for (auto &subscriber : subscription->Subscribers)
+ for (auto &subscriber : subscription->Subscribers)
SendUpdateToSubscriber(subscription, subscriber);
- } else {
+ } else {
MaybeSendNotificationResponse(subscription);
- }
-
- subscription->FirstUpdate = false;
-}
-
+ }
+
+ subscription->FirstUpdate = false;
+}
+
void TConfigsDispatcher::Handle(TEvConsole::TEvGetNodeConfigResponse::TPtr &ev)
-{
- auto it = ConfigRequests.find(ev->Cookie);
-
- if (it == ConfigRequests.end()) {
+{
+ auto it = ConfigRequests.find(ev->Cookie);
+
+ if (it == ConfigRequests.end()) {
BLOG_ERROR("Node config response for unknown request cookie=" << ev->Cookie);
- return;
- }
-
- auto resp = MakeHolder<TEvConfigsDispatcher::TEvGetConfigResponse>();
+ return;
+ }
+
+ auto resp = MakeHolder<TEvConfigsDispatcher::TEvGetConfigResponse>();
resp->Config.reset(new NKikimrConfig::TAppConfig(ev->Get()->Record.GetConfig()));
-
+
BLOG_TRACE("Send TEvConfigsDispatcher::TEvGetConfigResponse"
" to " << ev->Sender
<< ": " << resp->Config->ShortDebugString());
-
+
Send(it->second->Sender, resp.Release(), 0, it->second->Cookie);
-
- ConfigRequests.erase(it);
-}
-
+
+ ConfigRequests.erase(it);
+}
+
void TConfigsDispatcher::Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev)
-{
- auto it = RequestCookies.find(ev->Cookie);
- if (it == RequestCookies.end()) {
+{
+ auto it = RequestCookies.find(ev->Cookie);
+ if (it == RequestCookies.end()) {
BLOG_ERROR("Cookie mismatch for TEvReplaceConfigSubscriptionsResponse");
- return;
- }
-
- auto &rec = ev->Get()->Record;
- if (rec.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
+ return;
+ }
+
+ auto &rec = ev->Get()->Record;
+ if (rec.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
LOG_CRIT_S(*TlsActivationContext, NKikimrServices::CONFIGS_DISPATCHER,
- "Cannot initialize subscription: " << rec.GetStatus().GetReason());
+ "Cannot initialize subscription: " << rec.GetStatus().GetReason());
CleanUpSubscriptions();
- return;
- }
-
- auto subscription = FindSubscription(it->second);
- Y_VERIFY(subscription);
+ return;
+ }
+
+ auto subscription = FindSubscription(it->second);
+ Y_VERIFY(subscription);
ProcessAddedSubscription(subscription, rec.GetSubscriptionId());
-
- // Register other subscriptions in CMS.
- for (auto subscription : Subscriptions)
- if (!subscription->SubscriptionId)
+
+ // Register other subscriptions in CMS.
+ for (auto subscription : Subscriptions)
+ if (!subscription->SubscriptionId)
CreateSubscriberActor(subscription->Kinds, false);
-
- Become(&TThis::StateWork);
+
+ Become(&TThis::StateWork);
ProcessEnqueuedEvents();
-}
-
+}
+
void TConfigsDispatcher::Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev)
-{
- auto &rec = ev->Get()->Record;
-
- THashSet<TString> tenants;
- for (auto &slot : rec.GetSlots())
- tenants.insert(slot.GetAssignedTenant());
-
- // If we are in initial state then subscriptions set is empty
- // and we should start initialization. Otherwise we should
- // re-initialize if tenants set changed.
- if (CurrentTenants != tenants || Subscriptions.empty()) {
- CurrentTenants = tenants;
-
+{
+ auto &rec = ev->Get()->Record;
+
+ THashSet<TString> tenants;
+ for (auto &slot : rec.GetSlots())
+ tenants.insert(slot.GetAssignedTenant());
+
+ // If we are in initial state then subscriptions set is empty
+ // and we should start initialization. Otherwise we should
+ // re-initialize if tenants set changed.
+ if (CurrentTenants != tenants || Subscriptions.empty()) {
+ CurrentTenants = tenants;
+
BLOG_N("Update list of assigned tenants: " << JoinSeq(", ", CurrentTenants));
-
+
CleanUpSubscriptions();
- }
-}
-
-} // anonymous namespace
-
-IActor *CreateConfigsDispatcher(const NKikimrConfig::TAppConfig &config)
-{
- return new TConfigsDispatcher(config);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ }
+}
+
+} // anonymous namespace
+
+IActor *CreateConfigsDispatcher(const NKikimrConfig::TAppConfig &config)
+{
+ return new TConfigsDispatcher(config);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/configs_dispatcher.h b/ydb/core/cms/console/configs_dispatcher.h
index c5464763ea0..160d1ebac9c 100644
--- a/ydb/core/cms/console/configs_dispatcher.h
+++ b/ydb/core/cms/console/configs_dispatcher.h
@@ -1,99 +1,99 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <ydb/core/protos/config.pb.h>
-
-#include <util/generic/vector.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-/**
- * Configs Dispatcher is used as a broker for subscriptions for
- * config updates and as a local configs cache. It's recommended
- * to use Configs Dispatcher by all actors to spread CMS load
- * between local services and use direct subscriptions in CMS
- * for tablets only.
- *
- * Actor may have only one subscription in Configs Dispatcher.
- * Use subscription request with zero item kinds to unsusbscribe
- * from updates. Subscription response means subscription was
- * registered in dispatcher and carries no additional info.
- *
- * Subscribers receive TEvConsole::TEvConfigNotificationRequest
- * as if they were subscribed in CMS and should process this
- * event accordingly (TEvConsole::TEvConfigNotificationResponse
- * event should be send in response with proper SubscriptionId,
- * ConfigId filled in and request Cookie used for response).
- */
-
-struct TEvConfigsDispatcher {
- enum EEv {
- EvSetConfigSubscriptionRequest = EventSpaceBegin(TKikimrEvents::ES_CONFIGS_DISPATCHER),
- EvSetConfigSubscriptionResponse,
- EvGetConfigRequest,
- EvGetConfigResponse,
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_CONFIGS_DISPATCHER),
- "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_CONFIGS_DISPATCHER)");
-
- struct TEvSetConfigSubscriptionRequest : public TEventLocal<TEvSetConfigSubscriptionRequest, EvSetConfigSubscriptionRequest> {
- TEvSetConfigSubscriptionRequest()
- {
- }
-
- TEvSetConfigSubscriptionRequest(ui32 kind)
- : ConfigItemKinds({kind})
- {
- }
-
- TEvSetConfigSubscriptionRequest(std::initializer_list<ui32> kinds)
- : ConfigItemKinds(kinds)
- {
- }
-
- TVector<ui32> ConfigItemKinds;
- };
-
- struct TEvSetConfigSubscriptionResponse : public TEventLocal<TEvSetConfigSubscriptionResponse, EvSetConfigSubscriptionResponse> {
- };
-
- struct TEvGetConfigRequest : public TEventLocal<TEvGetConfigRequest, EvGetConfigRequest> {
- TEvGetConfigRequest(ui32 kind, bool cache = true)
- : ConfigItemKinds({kind})
- , Cache(cache)
- {
- }
-
- TEvGetConfigRequest(TVector<ui32> kinds, bool cache = true)
- : ConfigItemKinds(std::move(kinds))
- , Cache(cache)
- {
- }
-
- TVector<ui32> ConfigItemKinds;
- bool Cache;
- };
-
- struct TEvGetConfigResponse : public TEventLocal<TEvGetConfigResponse, EvGetConfigResponse> {
+
+#include <util/generic/vector.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+/**
+ * Configs Dispatcher is used as a broker for subscriptions for
+ * config updates and as a local configs cache. It's recommended
+ * to use Configs Dispatcher by all actors to spread CMS load
+ * between local services and use direct subscriptions in CMS
+ * for tablets only.
+ *
+ * Actor may have only one subscription in Configs Dispatcher.
+ * Use subscription request with zero item kinds to unsusbscribe
+ * from updates. Subscription response means subscription was
+ * registered in dispatcher and carries no additional info.
+ *
+ * Subscribers receive TEvConsole::TEvConfigNotificationRequest
+ * as if they were subscribed in CMS and should process this
+ * event accordingly (TEvConsole::TEvConfigNotificationResponse
+ * event should be send in response with proper SubscriptionId,
+ * ConfigId filled in and request Cookie used for response).
+ */
+
+struct TEvConfigsDispatcher {
+ enum EEv {
+ EvSetConfigSubscriptionRequest = EventSpaceBegin(TKikimrEvents::ES_CONFIGS_DISPATCHER),
+ EvSetConfigSubscriptionResponse,
+ EvGetConfigRequest,
+ EvGetConfigResponse,
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_CONFIGS_DISPATCHER),
+ "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_CONFIGS_DISPATCHER)");
+
+ struct TEvSetConfigSubscriptionRequest : public TEventLocal<TEvSetConfigSubscriptionRequest, EvSetConfigSubscriptionRequest> {
+ TEvSetConfigSubscriptionRequest()
+ {
+ }
+
+ TEvSetConfigSubscriptionRequest(ui32 kind)
+ : ConfigItemKinds({kind})
+ {
+ }
+
+ TEvSetConfigSubscriptionRequest(std::initializer_list<ui32> kinds)
+ : ConfigItemKinds(kinds)
+ {
+ }
+
+ TVector<ui32> ConfigItemKinds;
+ };
+
+ struct TEvSetConfigSubscriptionResponse : public TEventLocal<TEvSetConfigSubscriptionResponse, EvSetConfigSubscriptionResponse> {
+ };
+
+ struct TEvGetConfigRequest : public TEventLocal<TEvGetConfigRequest, EvGetConfigRequest> {
+ TEvGetConfigRequest(ui32 kind, bool cache = true)
+ : ConfigItemKinds({kind})
+ , Cache(cache)
+ {
+ }
+
+ TEvGetConfigRequest(TVector<ui32> kinds, bool cache = true)
+ : ConfigItemKinds(std::move(kinds))
+ , Cache(cache)
+ {
+ }
+
+ TVector<ui32> ConfigItemKinds;
+ bool Cache;
+ };
+
+ struct TEvGetConfigResponse : public TEventLocal<TEvGetConfigResponse, EvGetConfigResponse> {
std::shared_ptr<const NKikimrConfig::TAppConfig> Config;
- };
-};
-
-/**
- * Initial config is used to initilize Configs Dispatcher. All received configs
- * are compared to the current one and notifications are not sent to local
- * subscribers if there is no config modification detected.
- */
-IActor *CreateConfigsDispatcher(const NKikimrConfig::TAppConfig &config);
-
+ };
+};
+
+/**
+ * Initial config is used to initilize Configs Dispatcher. All received configs
+ * are compared to the current one and notifications are not sent to local
+ * subscribers if there is no config modification detected.
+ */
+IActor *CreateConfigsDispatcher(const NKikimrConfig::TAppConfig &config);
+
inline TActorId MakeConfigsDispatcherID(ui32 node = 0) {
- char x[12] = { 'c', 'o', 'n', 'f', 'i', 'g', 's', 'd', 'i', 's', 'p' };
+ char x[12] = { 'c', 'o', 'n', 'f', 'i', 'g', 's', 'd', 'i', 's', 'p' };
return TActorId(node, TStringBuf(x, 12));
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/configs_dispatcher_ut.cpp b/ydb/core/cms/console/configs_dispatcher_ut.cpp
index a5fd2fabba5..997d1ba4514 100644
--- a/ydb/core/cms/console/configs_dispatcher_ut.cpp
+++ b/ydb/core/cms/console/configs_dispatcher_ut.cpp
@@ -1,556 +1,556 @@
-#include "configs_dispatcher.h"
-#include "ut_helpers.h"
-
+#include "configs_dispatcher.h"
+#include "ut_helpers.h"
+
#include <ydb/core/node_whiteboard/node_whiteboard.h>
#include <ydb/core/tablet/bootstrapper.h>
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
#include <ydb/core/testlib/tablet_helpers.h>
-
-#include <util/system/hostname.h>
-
-namespace NKikimr {
-
-using namespace NConsole;
-using namespace NConsole::NUT;
-
-namespace {
-
-TTenantTestConfig::TTenantPoolConfig TenantTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {"slot", "default", DOMAIN1_NAME, "", {1, 1, 1}} }},
- // NodeType
- "type1"
- };
- return res;
-}
-
-TTenantTestConfig DefaultConsoleTestConfig()
-{
- TTenantTestConfig res = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- false,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {TenantTenantPoolConfig()},
- }},
- // DataCenterCount
- 1,
- // CreateConfigsDispatcher
- true
- };
- return res;
-}
-
-NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_1;
-NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_2;
-
+
+#include <util/system/hostname.h>
+
+namespace NKikimr {
+
+using namespace NConsole;
+using namespace NConsole::NUT;
+
+namespace {
+
+TTenantTestConfig::TTenantPoolConfig TenantTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {"slot", "default", DOMAIN1_NAME, "", {1, 1, 1}} }},
+ // NodeType
+ "type1"
+ };
+ return res;
+}
+
+TTenantTestConfig DefaultConsoleTestConfig()
+{
+ TTenantTestConfig res = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ false,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {TenantTenantPoolConfig()},
+ }},
+ // DataCenterCount
+ 1,
+ // CreateConfigsDispatcher
+ true
+ };
+ return res;
+}
+
+NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_1;
+NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_2;
+
TActorId InitConfigsDispatcher(TTenantTestRuntime &runtime)
-{
- ITEM_DOMAIN_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_DOMAIN_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 2,
- NKikimrConsole::TConfigItem::MERGE, "");
-
+{
+ ITEM_DOMAIN_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_DOMAIN_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 2,
+ NKikimrConsole::TConfigItem::MERGE, "");
+
CheckCreateTenant(runtime, Ydb::StatusIds::SUCCESS,
TCreateTenantRequest(TENANT1_1_NAME)
.WithPools({{"hdd", 1}}));
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
- {{"hdd", 1, 1}}, {});
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
+ {{"hdd", 1, 1}}, {});
CheckCreateTenant(runtime, Ydb::StatusIds::SUCCESS,
TCreateTenantRequest(TENANT1_2_NAME)
.WithPools({{"hdd", 1}}));
- CheckTenantStatus(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
- {{"hdd", 1, 1}}, {});
-
- ChangeTenant(runtime, TENANT1_1_NAME);
-
- return MakeConfigsDispatcherID(runtime.GetNodeId(0));
-}
-
-struct CatchReplaceConfigResult {
- CatchReplaceConfigResult(ui64 &id)
- : Id(id)
- {
- }
-
- bool operator()(IEventHandle &ev) {
- if (ev.GetTypeRewrite() == TEvConsole::EvReplaceConfigSubscriptionsResponse) {
- auto *x = ev.Get<TEvConsole::TEvReplaceConfigSubscriptionsResponse>();
- UNIT_ASSERT_VALUES_EQUAL(x->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
- Id = x->Record.GetSubscriptionId();
- return true;
- }
- return false;
- }
-
- ui64 &Id;
-};
-
-struct TEvPrivate {
- enum EEv {
- EvHoldResponse = EventSpaceBegin(NKikimr::TKikimrEvents::ES_PRIVATE),
- EvSetSubscription,
- EvGotNotification,
- EvComplete,
- EvEnd
- };
-
- struct TEvHoldResponse : public TEventLocal<TEvHoldResponse, EvHoldResponse> {
- TEvHoldResponse(bool hold)
- : Hold(hold)
- {}
-
- bool Hold;
- };
-
- struct TEvSetSubscription : public TEventLocal<TEvSetSubscription, EvSetSubscription> {
- TEvSetSubscription()
- {
- }
-
- TEvSetSubscription(ui32 kind)
- : ConfigItemKinds({kind})
- {
- }
-
- TEvSetSubscription(std::initializer_list<ui32> kinds)
- : ConfigItemKinds(kinds)
- {
- }
-
- TEvSetSubscription(TVector<ui32> kinds)
- : ConfigItemKinds(kinds)
- {
- }
-
- TVector<ui32> ConfigItemKinds;
- };
-
- struct TEvGotNotification : public TEventLocal<TEvGotNotification, EvGotNotification> {
- TConfigId ConfigId;
- };
-
- struct TEvComplete : public TEventLocal<TEvComplete, EvComplete> {};
-};
-
-class TTestSubscriber : public TActorBootstrapped<TTestSubscriber> {
-public:
+ CheckTenantStatus(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
+ {{"hdd", 1, 1}}, {});
+
+ ChangeTenant(runtime, TENANT1_1_NAME);
+
+ return MakeConfigsDispatcherID(runtime.GetNodeId(0));
+}
+
+struct CatchReplaceConfigResult {
+ CatchReplaceConfigResult(ui64 &id)
+ : Id(id)
+ {
+ }
+
+ bool operator()(IEventHandle &ev) {
+ if (ev.GetTypeRewrite() == TEvConsole::EvReplaceConfigSubscriptionsResponse) {
+ auto *x = ev.Get<TEvConsole::TEvReplaceConfigSubscriptionsResponse>();
+ UNIT_ASSERT_VALUES_EQUAL(x->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
+ Id = x->Record.GetSubscriptionId();
+ return true;
+ }
+ return false;
+ }
+
+ ui64 &Id;
+};
+
+struct TEvPrivate {
+ enum EEv {
+ EvHoldResponse = EventSpaceBegin(NKikimr::TKikimrEvents::ES_PRIVATE),
+ EvSetSubscription,
+ EvGotNotification,
+ EvComplete,
+ EvEnd
+ };
+
+ struct TEvHoldResponse : public TEventLocal<TEvHoldResponse, EvHoldResponse> {
+ TEvHoldResponse(bool hold)
+ : Hold(hold)
+ {}
+
+ bool Hold;
+ };
+
+ struct TEvSetSubscription : public TEventLocal<TEvSetSubscription, EvSetSubscription> {
+ TEvSetSubscription()
+ {
+ }
+
+ TEvSetSubscription(ui32 kind)
+ : ConfigItemKinds({kind})
+ {
+ }
+
+ TEvSetSubscription(std::initializer_list<ui32> kinds)
+ : ConfigItemKinds(kinds)
+ {
+ }
+
+ TEvSetSubscription(TVector<ui32> kinds)
+ : ConfigItemKinds(kinds)
+ {
+ }
+
+ TVector<ui32> ConfigItemKinds;
+ };
+
+ struct TEvGotNotification : public TEventLocal<TEvGotNotification, EvGotNotification> {
+ TConfigId ConfigId;
+ };
+
+ struct TEvComplete : public TEventLocal<TEvComplete, EvComplete> {};
+};
+
+class TTestSubscriber : public TActorBootstrapped<TTestSubscriber> {
+public:
TTestSubscriber(TActorId sink, TVector<ui32> kinds, bool hold)
- : Sink(sink)
- , Kinds(std::move(kinds))
- , HoldResponse(hold)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- if (!Kinds.empty())
- SendSubscriptionRequest(ctx);
- Become(&TTestSubscriber::StateWork);
- }
-
- void SendSubscriptionRequest(const TActorContext &ctx)
- {
- auto *req = new TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest;
- req->ConfigItemKinds = Kinds;
- ctx.Send(MakeConfigsDispatcherID(ctx.SelfID.NodeId()), req);
- }
-
- void EnqueueEvent(TAutoPtr<IEventHandle> ev)
- {
- EventsQueue.push_back(std::move(ev));
- }
-
- void ProcessEnqueuedEvents(const TActorContext &ctx)
- {
- while (!EventsQueue.empty()) {
- TAutoPtr<IEventHandle> &ev = EventsQueue.front();
- LOG_DEBUG_S(ctx, NKikimrServices::CONFIGS_DISPATCHER,
- "Dequeue event type: " << ev->GetTypeRewrite());
- ctx.ExecutorThread.Send(ev.Release());
- EventsQueue.pop_front();
- }
- }
-
- void Handle(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse::TPtr &ev, const TActorContext &ctx)
- {
- if (Sink)
- ctx.Send(ev->Forward(Sink));
- }
-
- void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev, const TActorContext &ctx)
- {
- auto &rec = ev->Get()->Record;
- if (Sink) {
- auto *event = new TEvPrivate::TEvGotNotification;
- event->ConfigId.Load(rec.GetConfigId());
- ctx.Send(Sink, event);
- }
-
- if (HoldResponse) {
- EnqueueEvent(ev.Release());
- return;
- }
-
- auto *resp = new TEvConsole::TEvConfigNotificationResponse;
- resp->Record.SetSubscriptionId(rec.GetSubscriptionId());
- resp->Record.MutableConfigId()->CopyFrom(rec.GetConfigId());
- ctx.Send(ev->Sender, resp, 0, ev->Cookie);
- }
-
- void Handle(TEvPrivate::TEvHoldResponse::TPtr &ev, const TActorContext &ctx)
- {
- HoldResponse = ev->Get()->Hold;
- if (!HoldResponse)
- ProcessEnqueuedEvents(ctx);
- ctx.Send(ev->Sender, new TEvPrivate::TEvComplete);
- }
-
- void Handle(TEvPrivate::TEvSetSubscription::TPtr &ev, const TActorContext &ctx)
- {
- if (ev->Get()->ConfigItemKinds == Kinds)
- return;
-
- Kinds = ev->Get()->ConfigItemKinds;
- SendSubscriptionRequest(ctx);
- }
-
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse, Handle);
- HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
- HFunc(TEvPrivate::TEvHoldResponse, Handle);
- HFunc(TEvPrivate::TEvSetSubscription, Handle);
- }
- }
-
-private:
+ : Sink(sink)
+ , Kinds(std::move(kinds))
+ , HoldResponse(hold)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ if (!Kinds.empty())
+ SendSubscriptionRequest(ctx);
+ Become(&TTestSubscriber::StateWork);
+ }
+
+ void SendSubscriptionRequest(const TActorContext &ctx)
+ {
+ auto *req = new TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest;
+ req->ConfigItemKinds = Kinds;
+ ctx.Send(MakeConfigsDispatcherID(ctx.SelfID.NodeId()), req);
+ }
+
+ void EnqueueEvent(TAutoPtr<IEventHandle> ev)
+ {
+ EventsQueue.push_back(std::move(ev));
+ }
+
+ void ProcessEnqueuedEvents(const TActorContext &ctx)
+ {
+ while (!EventsQueue.empty()) {
+ TAutoPtr<IEventHandle> &ev = EventsQueue.front();
+ LOG_DEBUG_S(ctx, NKikimrServices::CONFIGS_DISPATCHER,
+ "Dequeue event type: " << ev->GetTypeRewrite());
+ ctx.ExecutorThread.Send(ev.Release());
+ EventsQueue.pop_front();
+ }
+ }
+
+ void Handle(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse::TPtr &ev, const TActorContext &ctx)
+ {
+ if (Sink)
+ ctx.Send(ev->Forward(Sink));
+ }
+
+ void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev, const TActorContext &ctx)
+ {
+ auto &rec = ev->Get()->Record;
+ if (Sink) {
+ auto *event = new TEvPrivate::TEvGotNotification;
+ event->ConfigId.Load(rec.GetConfigId());
+ ctx.Send(Sink, event);
+ }
+
+ if (HoldResponse) {
+ EnqueueEvent(ev.Release());
+ return;
+ }
+
+ auto *resp = new TEvConsole::TEvConfigNotificationResponse;
+ resp->Record.SetSubscriptionId(rec.GetSubscriptionId());
+ resp->Record.MutableConfigId()->CopyFrom(rec.GetConfigId());
+ ctx.Send(ev->Sender, resp, 0, ev->Cookie);
+ }
+
+ void Handle(TEvPrivate::TEvHoldResponse::TPtr &ev, const TActorContext &ctx)
+ {
+ HoldResponse = ev->Get()->Hold;
+ if (!HoldResponse)
+ ProcessEnqueuedEvents(ctx);
+ ctx.Send(ev->Sender, new TEvPrivate::TEvComplete);
+ }
+
+ void Handle(TEvPrivate::TEvSetSubscription::TPtr &ev, const TActorContext &ctx)
+ {
+ if (ev->Get()->ConfigItemKinds == Kinds)
+ return;
+
+ Kinds = ev->Get()->ConfigItemKinds;
+ SendSubscriptionRequest(ctx);
+ }
+
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse, Handle);
+ HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
+ HFunc(TEvPrivate::TEvHoldResponse, Handle);
+ HFunc(TEvPrivate::TEvSetSubscription, Handle);
+ }
+ }
+
+private:
TActorId Sink;
- TVector<ui32> Kinds;
- bool HoldResponse;
- TDeque<TAutoPtr<IEventHandle>> EventsQueue;
-};
-
+ TVector<ui32> Kinds;
+ bool HoldResponse;
+ TDeque<TAutoPtr<IEventHandle>> EventsQueue;
+};
+
TActorId AddSubscriber(TTenantTestRuntime &runtime, TVector<ui32> kinds, bool hold = false)
-{
- auto aid = runtime.Register(new TTestSubscriber(runtime.Sender, std::move(kinds), hold));
- runtime.EnableScheduleForActor(aid, true);
- return aid;
-}
-
-NKikimrConfig::TAppConfig GetConfig(TTenantTestRuntime &runtime, TVector<ui32> kinds, bool cache = true)
-{
- TAutoPtr<IEventHandle> handle;
- runtime.Send(new IEventHandle(MakeConfigsDispatcherID(runtime.GetNodeId(0)),
- runtime.Sender,
- new TEvConfigsDispatcher::TEvGetConfigRequest(kinds, cache)));
- return *runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvGetConfigResponse>(handle)->Config;
-}
-
+{
+ auto aid = runtime.Register(new TTestSubscriber(runtime.Sender, std::move(kinds), hold));
+ runtime.EnableScheduleForActor(aid, true);
+ return aid;
+}
+
+NKikimrConfig::TAppConfig GetConfig(TTenantTestRuntime &runtime, TVector<ui32> kinds, bool cache = true)
+{
+ TAutoPtr<IEventHandle> handle;
+ runtime.Send(new IEventHandle(MakeConfigsDispatcherID(runtime.GetNodeId(0)),
+ runtime.Sender,
+ new TEvConfigsDispatcher::TEvGetConfigRequest(kinds, cache)));
+ return *runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvGetConfigResponse>(handle)->Config;
+}
+
void HoldSubscriber(TTenantTestRuntime &runtime, TActorId aid)
-{
- TAutoPtr<IEventHandle> handle;
- runtime.Send(new IEventHandle(aid, runtime.Sender, new TEvPrivate::TEvHoldResponse(true)));
- runtime.GrabEdgeEventRethrow<TEvPrivate::TEvComplete>(handle);
-}
-
+{
+ TAutoPtr<IEventHandle> handle;
+ runtime.Send(new IEventHandle(aid, runtime.Sender, new TEvPrivate::TEvHoldResponse(true)));
+ runtime.GrabEdgeEventRethrow<TEvPrivate::TEvComplete>(handle);
+}
+
void UnholdSubscriber(TTenantTestRuntime &runtime, TActorId aid)
-{
- runtime.Send(new IEventHandle(aid, runtime.Sender, new TEvPrivate::TEvHoldResponse(false)));
-}
-
+{
+ runtime.Send(new IEventHandle(aid, runtime.Sender, new TEvPrivate::TEvHoldResponse(false)));
+}
+
void SetSubscriptions(TTenantTestRuntime &runtime, TActorId aid, TVector<ui32> kinds)
-{
- runtime.Send(new IEventHandle(aid, runtime.Sender, new TEvPrivate::TEvSetSubscription(kinds)));
-}
-
-} // anonymous namespace
-
-Y_UNIT_TEST_SUITE(TConfigsDispatcherTests) {
- Y_UNIT_TEST(TestSelfSubscription) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- auto serviceId = InitConfigsDispatcher(runtime);
-
- ui64 id;
- TDispatchOptions options;
- options.FinalEvents.emplace_back(CatchReplaceConfigResult(id), 1);
- runtime.DispatchEvents(options);
-
- CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, serviceId,
- id, runtime.GetNodeId(0), FQDNHostName(), TENANT1_1_NAME, "type1",
- 0, serviceId,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ConfigsDispatcherConfigItem}));
- }
-
- Y_UNIT_TEST(TestSubscriptionNotification) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- TAutoPtr<IEventHandle> handle;
- InitConfigsDispatcher(runtime);
-
- AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
- AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
-
- // Subscribers get notification.
- runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
- runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
-
- SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_1));
-
- // Expect two responses from subscribers and one from dispatcher.
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 3);
- runtime.DispatchEvents(options);
- }
-
- Y_UNIT_TEST(TestSubscriptionNotificationForNewSubscriberAfterUpdate) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- TAutoPtr<IEventHandle> handle;
- InitConfigsDispatcher(runtime);
-
- auto s1 = AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
- runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
- HoldSubscriber(runtime, s1);
-
- SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_1));
-
-
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
- auto configId1 = reply1->ConfigId;
-
- UnholdSubscriber(runtime, s1);
-
- // Expect response from subscriber and from dispatcher.
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 2);
- runtime.DispatchEvents(options);
-
- // New subscriber should get notification.
- AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
-
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
- auto configId2 = reply2->ConfigId;
- UNIT_ASSERT_VALUES_EQUAL(configId1.ToString(), configId2.ToString());
- }
-
- Y_UNIT_TEST(TestSubscriptionNotificationForNewSubscriberDuringUpdate) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- TAutoPtr<IEventHandle> handle;
- InitConfigsDispatcher(runtime);
-
- auto s1 = AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
- runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
- HoldSubscriber(runtime, s1);
-
- SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_1));
-
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
- auto configId1 = reply1->ConfigId;
-
- // New subscriber should get notification.
- AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
-
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
- auto configId2 = reply2->ConfigId;
- UNIT_ASSERT_VALUES_EQUAL(configId1.ToString(), configId2.ToString());
-
- UnholdSubscriber(runtime, s1);
-
- // Expect response from unhold subscriber and from dispatcher.
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 2);
- runtime.DispatchEvents(options);
- }
-
- Y_UNIT_TEST(TestRemoveSubscription) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- TAutoPtr<IEventHandle> handle;
- InitConfigsDispatcher(runtime);
-
- auto s1 = AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
- runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
-
- // Subscriber removal should cause CMS subscription removal.
- SetSubscriptions(runtime, s1, {});
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvConsole::EvRemoveConfigSubscriptionResponse, 1);
- runtime.DispatchEvents(options);
-
- runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
- }
-
- Y_UNIT_TEST(TestRemoveSubscriptionWhileUpdateInProcess) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- TAutoPtr<IEventHandle> handle;
- InitConfigsDispatcher(runtime);
-
- auto s1 = AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
- runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
- HoldSubscriber(runtime, s1);
-
- AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
- runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
-
- SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_1));
-
- TDispatchOptions options1;
- options1.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 1);
- runtime.DispatchEvents(options1);
-
- // Subscriber removal should cause config notification response.
- SetSubscriptions(runtime, s1, {});
-
- TDispatchOptions options2;
- options2.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 1);
- runtime.DispatchEvents(options2);
- }
-
- Y_UNIT_TEST(TestChangeTenant) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- TAutoPtr<IEventHandle> handle;
- InitConfigsDispatcher(runtime);
-
- AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
- AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
-
- // Subscribers get notification.
- TDispatchOptions options1;
- options1.FinalEvents.emplace_back(TEvConfigsDispatcher::EvSetConfigSubscriptionResponse, 2);
- runtime.DispatchEvents(options1);
-
- SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_1));
-
- // Expect two responses from subscribers and one from dispatcher.
- TDispatchOptions options2;
- options2.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 3);
- runtime.DispatchEvents(options2);
-
- // Change tenant and expect new notifications.
- ChangeTenant(runtime, TENANT1_2_NAME, 0, false);
-
- TDispatchOptions options3;
- options3.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 3);
- runtime.DispatchEvents(options3);
- }
-
- Y_UNIT_TEST(TestGetCachedConfig) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- TAutoPtr<IEventHandle> handle;
- InitConfigsDispatcher(runtime);
-
- ui64 nodeConfigRequests = 0;
+{
+ runtime.Send(new IEventHandle(aid, runtime.Sender, new TEvPrivate::TEvSetSubscription(kinds)));
+}
+
+} // anonymous namespace
+
+Y_UNIT_TEST_SUITE(TConfigsDispatcherTests) {
+ Y_UNIT_TEST(TestSelfSubscription) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ auto serviceId = InitConfigsDispatcher(runtime);
+
+ ui64 id;
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(CatchReplaceConfigResult(id), 1);
+ runtime.DispatchEvents(options);
+
+ CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, serviceId,
+ id, runtime.GetNodeId(0), FQDNHostName(), TENANT1_1_NAME, "type1",
+ 0, serviceId,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ConfigsDispatcherConfigItem}));
+ }
+
+ Y_UNIT_TEST(TestSubscriptionNotification) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TAutoPtr<IEventHandle> handle;
+ InitConfigsDispatcher(runtime);
+
+ AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+ AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+
+ // Subscribers get notification.
+ runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
+ runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
+
+ SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_1));
+
+ // Expect two responses from subscribers and one from dispatcher.
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 3);
+ runtime.DispatchEvents(options);
+ }
+
+ Y_UNIT_TEST(TestSubscriptionNotificationForNewSubscriberAfterUpdate) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TAutoPtr<IEventHandle> handle;
+ InitConfigsDispatcher(runtime);
+
+ auto s1 = AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+ runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
+ HoldSubscriber(runtime, s1);
+
+ SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_1));
+
+
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
+ auto configId1 = reply1->ConfigId;
+
+ UnholdSubscriber(runtime, s1);
+
+ // Expect response from subscriber and from dispatcher.
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 2);
+ runtime.DispatchEvents(options);
+
+ // New subscriber should get notification.
+ AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
+ auto configId2 = reply2->ConfigId;
+ UNIT_ASSERT_VALUES_EQUAL(configId1.ToString(), configId2.ToString());
+ }
+
+ Y_UNIT_TEST(TestSubscriptionNotificationForNewSubscriberDuringUpdate) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TAutoPtr<IEventHandle> handle;
+ InitConfigsDispatcher(runtime);
+
+ auto s1 = AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+ runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
+ HoldSubscriber(runtime, s1);
+
+ SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_1));
+
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
+ auto configId1 = reply1->ConfigId;
+
+ // New subscriber should get notification.
+ AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
+ auto configId2 = reply2->ConfigId;
+ UNIT_ASSERT_VALUES_EQUAL(configId1.ToString(), configId2.ToString());
+
+ UnholdSubscriber(runtime, s1);
+
+ // Expect response from unhold subscriber and from dispatcher.
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 2);
+ runtime.DispatchEvents(options);
+ }
+
+ Y_UNIT_TEST(TestRemoveSubscription) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TAutoPtr<IEventHandle> handle;
+ InitConfigsDispatcher(runtime);
+
+ auto s1 = AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+ runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
+
+ // Subscriber removal should cause CMS subscription removal.
+ SetSubscriptions(runtime, s1, {});
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvConsole::EvRemoveConfigSubscriptionResponse, 1);
+ runtime.DispatchEvents(options);
+
+ runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
+ }
+
+ Y_UNIT_TEST(TestRemoveSubscriptionWhileUpdateInProcess) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TAutoPtr<IEventHandle> handle;
+ InitConfigsDispatcher(runtime);
+
+ auto s1 = AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+ runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
+ HoldSubscriber(runtime, s1);
+
+ AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+ runtime.GrabEdgeEventRethrow<TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse>(handle);
+
+ SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_1));
+
+ TDispatchOptions options1;
+ options1.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 1);
+ runtime.DispatchEvents(options1);
+
+ // Subscriber removal should cause config notification response.
+ SetSubscriptions(runtime, s1, {});
+
+ TDispatchOptions options2;
+ options2.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 1);
+ runtime.DispatchEvents(options2);
+ }
+
+ Y_UNIT_TEST(TestChangeTenant) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TAutoPtr<IEventHandle> handle;
+ InitConfigsDispatcher(runtime);
+
+ AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+ AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+
+ // Subscribers get notification.
+ TDispatchOptions options1;
+ options1.FinalEvents.emplace_back(TEvConfigsDispatcher::EvSetConfigSubscriptionResponse, 2);
+ runtime.DispatchEvents(options1);
+
+ SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_1));
+
+ // Expect two responses from subscribers and one from dispatcher.
+ TDispatchOptions options2;
+ options2.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 3);
+ runtime.DispatchEvents(options2);
+
+ // Change tenant and expect new notifications.
+ ChangeTenant(runtime, TENANT1_2_NAME, 0, false);
+
+ TDispatchOptions options3;
+ options3.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 3);
+ runtime.DispatchEvents(options3);
+ }
+
+ Y_UNIT_TEST(TestGetCachedConfig) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TAutoPtr<IEventHandle> handle;
+ InitConfigsDispatcher(runtime);
+
+ ui64 nodeConfigRequests = 0;
auto observer = [&nodeConfigRequests](TTestActorRuntimeBase&, TAutoPtr<IEventHandle> &ev) -> TTenantTestRuntime::EEventAction {
- switch (ev->GetTypeRewrite()) {
- case TEvConsole::EvGetNodeConfigRequest:
- ++nodeConfigRequests;
- break;
- }
- return TTestActorRuntime::EEventAction::PROCESS;
- };
-
- ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetClusterName("cluster2");
-
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1));
-
- NKikimrConfig::TAppConfig config;
- config.MutableLogConfig()->SetClusterName("cluster1");
-
- runtime.SetObserverFunc(observer);
-
- // Config should be requested from CMS.
- auto config1 = GetConfig(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem}, false);
+ switch (ev->GetTypeRewrite()) {
+ case TEvConsole::EvGetNodeConfigRequest:
+ ++nodeConfigRequests;
+ break;
+ }
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+
+ ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetClusterName("cluster2");
+
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+
+ NKikimrConfig::TAppConfig config;
+ config.MutableLogConfig()->SetClusterName("cluster1");
+
+ runtime.SetObserverFunc(observer);
+
+ // Config should be requested from CMS.
+ auto config1 = GetConfig(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem}, false);
CheckEqualsIgnoringVersion(config, config1);
- UNIT_ASSERT(nodeConfigRequests > 0);
-
- // We didn't ask to cache, so config should still be requested from CMS.
- // This time ask to cache config.
- nodeConfigRequests = 0;
- auto config2 = GetConfig(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem}, true);
+ UNIT_ASSERT(nodeConfigRequests > 0);
+
+ // We didn't ask to cache, so config should still be requested from CMS.
+ // This time ask to cache config.
+ nodeConfigRequests = 0;
+ auto config2 = GetConfig(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem}, true);
CheckEqualsIgnoringVersion(config, config2);
- UNIT_ASSERT(nodeConfigRequests > 0);
-
- // Make sure subscription is online by using it with another subscriber.
- AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
- runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
-
- // This time we should get config with no requests to CMS.
- nodeConfigRequests = 0;
- auto config3 = GetConfig(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem}, true);
+ UNIT_ASSERT(nodeConfigRequests > 0);
+
+ // Make sure subscription is online by using it with another subscriber.
+ AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+ runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
+
+ // This time we should get config with no requests to CMS.
+ nodeConfigRequests = 0;
+ auto config3 = GetConfig(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem}, true);
CheckEqualsIgnoringVersion(config, config3);
- UNIT_ASSERT_VALUES_EQUAL(nodeConfigRequests, 0);
-
- // Change config and expect dispatcher to process notification.
- SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_2));
- runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
-
- // Now we should get new config with no requests to CMS.
- config.MutableLogConfig()->SetClusterName("cluster2");
- auto config4 = GetConfig(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem}, true);
+ UNIT_ASSERT_VALUES_EQUAL(nodeConfigRequests, 0);
+
+ // Change config and expect dispatcher to process notification.
+ SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_2));
+ runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
+
+ // Now we should get new config with no requests to CMS.
+ config.MutableLogConfig()->SetClusterName("cluster2");
+ auto config4 = GetConfig(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem}, true);
CheckEqualsIgnoringVersion(config, config4);
- UNIT_ASSERT_VALUES_EQUAL(nodeConfigRequests, 0);
- }
-
- Y_UNIT_TEST(TestEmptyChangeCausesNoNotification) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- TAutoPtr<IEventHandle> handle;
- InitConfigsDispatcher(runtime);
-
- ui64 notifications = 0;
+ UNIT_ASSERT_VALUES_EQUAL(nodeConfigRequests, 0);
+ }
+
+ Y_UNIT_TEST(TestEmptyChangeCausesNoNotification) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TAutoPtr<IEventHandle> handle;
+ InitConfigsDispatcher(runtime);
+
+ ui64 notifications = 0;
TActorId subscriber;
auto observer = [&notifications,&subscriber,recipient=runtime.Sender](TTestActorRuntimeBase&, TAutoPtr<IEventHandle> &ev) -> TTenantTestRuntime::EEventAction {
- if (ev->Recipient == recipient && ev->Sender == subscriber) {
- switch (ev->GetTypeRewrite()) {
- case TEvPrivate::EvGotNotification:
- ++notifications;
- break;
- }
- }
- return TTestActorRuntime::EEventAction::PROCESS;
- };
-
- ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
-
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1));
-
- runtime.SetObserverFunc(observer);
-
- // Add subscriber and get config via notification.
- subscriber = AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
- runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
- UNIT_ASSERT(notifications > 0);
-
- // Now add another element which doesn't change config body.
- // It should cause notification to dispatcher but not test subscriber.
- SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_2));
- notifications = 0;
- TDispatchOptions options1;
- options1.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 1);
- runtime.DispatchEvents(options1);
- UNIT_ASSERT_VALUES_EQUAL(notifications, 0);
- }
-}
-
-} // namespace NKikimr
+ if (ev->Recipient == recipient && ev->Sender == subscriber) {
+ switch (ev->GetTypeRewrite()) {
+ case TEvPrivate::EvGotNotification:
+ ++notifications;
+ break;
+ }
+ }
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+
+ ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+
+ runtime.SetObserverFunc(observer);
+
+ // Add subscriber and get config via notification.
+ subscriber = AddSubscriber(runtime, {(ui32)NKikimrConsole::TConfigItem::LogConfigItem});
+ runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle);
+ UNIT_ASSERT(notifications > 0);
+
+ // Now add another element which doesn't change config body.
+ // It should cause notification to dispatcher but not test subscriber.
+ SendConfigure(runtime, MakeAddAction(ITEM_DOMAIN_LOG_2));
+ notifications = 0;
+ TDispatchOptions options1;
+ options1.FinalEvents.emplace_back(TEvConsole::EvConfigNotificationResponse, 1);
+ runtime.DispatchEvents(options1);
+ UNIT_ASSERT_VALUES_EQUAL(notifications, 0);
+ }
+}
+
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console.cpp b/ydb/core/cms/console/console.cpp
index 3d55e1f65ab..fe477202af5 100644
--- a/ydb/core/cms/console/console.cpp
+++ b/ydb/core/cms/console/console.cpp
@@ -1,191 +1,191 @@
-#include "console_impl.h"
-#include "console_configs_manager.h"
-#include "console_tenants_manager.h"
-#include "http.h"
-
+#include "console_impl.h"
+#include "console_configs_manager.h"
+#include "console_tenants_manager.h"
+#include "http.h"
+
#include "net_classifier_updater.h"
#include <ydb/core/base/counters.h>
#include <ydb/core/cms/console/validators/registry.h>
-
+
#include <library/cpp/monlib/service/pages/templates.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-void TConsole::OnActivateExecutor(const TActorContext &ctx)
-{
- auto domains = AppData(ctx)->DomainsInfo;
- auto domainId = domains->GetDomainUidByTabletId(TabletID());
- Y_VERIFY(domainId != TDomainsInfo::BadDomainId);
-
- auto tabletsCounters = GetServiceCounters(AppData(ctx)->Counters, "tablets");
- tabletsCounters->RemoveSubgroup("type", "CONSOLE");
- Counters = tabletsCounters->GetSubgroup("type", "CONSOLE");
-
- TValidatorsRegistry::Instance()->LockValidators();
-
- ConfigsManager = new TConfigsManager(*this);
+
+namespace NKikimr {
+namespace NConsole {
+
+void TConsole::OnActivateExecutor(const TActorContext &ctx)
+{
+ auto domains = AppData(ctx)->DomainsInfo;
+ auto domainId = domains->GetDomainUidByTabletId(TabletID());
+ Y_VERIFY(domainId != TDomainsInfo::BadDomainId);
+
+ auto tabletsCounters = GetServiceCounters(AppData(ctx)->Counters, "tablets");
+ tabletsCounters->RemoveSubgroup("type", "CONSOLE");
+ Counters = tabletsCounters->GetSubgroup("type", "CONSOLE");
+
+ TValidatorsRegistry::Instance()->LockValidators();
+
+ ConfigsManager = new TConfigsManager(*this);
ctx.RegisterWithSameMailbox(ConfigsManager);
-
- TenantsManager = new TTenantsManager(*this, domains->Domains.at(domainId),
+
+ TenantsManager = new TTenantsManager(*this, domains->Domains.at(domainId),
Counters,
AppData()->FeatureFlags);
ctx.RegisterWithSameMailbox(TenantsManager);
-
+
if (AppData(ctx)->NetClassifierConfig.GetUpdaterConfig().GetNetDataSourceUrl()) {
NetClassifierUpdaterId = ctx.Register(NNetClassifierUpdater::MakeNetClassifierUpdaterActor(SelfId()));
}
- TxProcessor->ProcessTx(CreateTxInitScheme(), ctx);
-}
-
-void TConsole::OnDetach(const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::OnDetach");
- Die(ctx);
-}
-
-void TConsole::OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx)
-{
- LOG_INFO(ctx, NKikimrServices::CMS, "TConsole::OnTabletDead: %" PRIu64, TabletID());
-
- if (Counters)
- Counters->ResetCounters();
-
- Die(ctx);
-}
-
-void TConsole::Enqueue(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::CMS,
- "TConsole::Enqueue: %" PRIu64 ", event type: %" PRIu32 " event: %s",
+ TxProcessor->ProcessTx(CreateTxInitScheme(), ctx);
+}
+
+void TConsole::OnDetach(const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::OnDetach");
+ Die(ctx);
+}
+
+void TConsole::OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx)
+{
+ LOG_INFO(ctx, NKikimrServices::CMS, "TConsole::OnTabletDead: %" PRIu64, TabletID());
+
+ if (Counters)
+ Counters->ResetCounters();
+
+ Die(ctx);
+}
+
+void TConsole::Enqueue(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::CMS,
+ "TConsole::Enqueue: %" PRIu64 ", event type: %" PRIu32 " event: %s",
TabletID(), ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- InitQueue.push_back(ev);
-}
-
-bool TConsole::OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev, const TActorContext &ctx)
-{
- if (!ev)
- return true;
-
- auto domains = AppData(ctx)->DomainsInfo;
- auto domain = domains->Domains.at(domains->GetDomainUidByTabletId(TabletID()));
-
- TStringStream str;
- HTML(str) {
- NHttp::OutputStyles(str);
- PRE() {
- str << "Served domain: " << domain->Name << Endl;
- }
-
- COLLAPSED_REF_CONTENT("tenants-div", "Tenants") {
- DIV_CLASS("tab-left") {
- TenantsManager->DumpStateHTML(str);
- }
- }
- str << "<br/>" << Endl;
- COLLAPSED_REF_CONTENT("configs-div", "Configs") {
- DIV_CLASS("tab-left") {
- ConfigsManager->DumpStateHTML(str);
- }
- }
- }
- ctx.Send(ev->Sender, new NMon::TEvRemoteHttpInfoRes(str.Str()));
- return true;
-}
-
-void TConsole::Cleanup(const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::Cleanup");
-
- if (ConfigsManager) {
- ConfigsManager->Detach();
- ConfigsManager = nullptr;
- }
-
- if (TenantsManager) {
- TenantsManager->Detach();
- TenantsManager = nullptr;
- }
-
+ InitQueue.push_back(ev);
+}
+
+bool TConsole::OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev, const TActorContext &ctx)
+{
+ if (!ev)
+ return true;
+
+ auto domains = AppData(ctx)->DomainsInfo;
+ auto domain = domains->Domains.at(domains->GetDomainUidByTabletId(TabletID()));
+
+ TStringStream str;
+ HTML(str) {
+ NHttp::OutputStyles(str);
+ PRE() {
+ str << "Served domain: " << domain->Name << Endl;
+ }
+
+ COLLAPSED_REF_CONTENT("tenants-div", "Tenants") {
+ DIV_CLASS("tab-left") {
+ TenantsManager->DumpStateHTML(str);
+ }
+ }
+ str << "<br/>" << Endl;
+ COLLAPSED_REF_CONTENT("configs-div", "Configs") {
+ DIV_CLASS("tab-left") {
+ ConfigsManager->DumpStateHTML(str);
+ }
+ }
+ }
+ ctx.Send(ev->Sender, new NMon::TEvRemoteHttpInfoRes(str.Str()));
+ return true;
+}
+
+void TConsole::Cleanup(const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::Cleanup");
+
+ if (ConfigsManager) {
+ ConfigsManager->Detach();
+ ConfigsManager = nullptr;
+ }
+
+ if (TenantsManager) {
+ TenantsManager->Detach();
+ TenantsManager = nullptr;
+ }
+
if (NetClassifierUpdaterId) {
Send(NetClassifierUpdaterId, new TEvents::TEvPoisonPill);
NetClassifierUpdaterId = {};
}
- TxProcessor->Clear();
-}
-
-void TConsole::Die(const TActorContext &ctx)
-{
- Cleanup(ctx);
- TActorBase::Die(ctx);
-}
-
-void TConsole::LoadConfigFromProto(const NKikimrConsole::TConfig &config)
-{
- Config = config;
- TenantsManager->SetConfig(config.GetTenantsConfig());
- ConfigsManager->SetConfig(config.GetConfigsConfig());
-}
-
-void TConsole::ProcessEnqueuedEvents(const TActorContext &ctx)
-{
- while (!InitQueue.empty()) {
- TAutoPtr<IEventHandle> &ev = InitQueue.front();
- LOG_DEBUG(ctx, NKikimrServices::CMS,
- "TConsole::Dequeue: %" PRIu64 ", event type: %" PRIu32 " event: %s",
+ TxProcessor->Clear();
+}
+
+void TConsole::Die(const TActorContext &ctx)
+{
+ Cleanup(ctx);
+ TActorBase::Die(ctx);
+}
+
+void TConsole::LoadConfigFromProto(const NKikimrConsole::TConfig &config)
+{
+ Config = config;
+ TenantsManager->SetConfig(config.GetTenantsConfig());
+ ConfigsManager->SetConfig(config.GetConfigsConfig());
+}
+
+void TConsole::ProcessEnqueuedEvents(const TActorContext &ctx)
+{
+ while (!InitQueue.empty()) {
+ TAutoPtr<IEventHandle> &ev = InitQueue.front();
+ LOG_DEBUG(ctx, NKikimrServices::CMS,
+ "TConsole::Dequeue: %" PRIu64 ", event type: %" PRIu32 " event: %s",
TabletID(), ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- ctx.ExecutorThread.Send(ev.Release());
- InitQueue.pop_front();
- }
-}
-
-void TConsole::ClearState()
-{
- Config.Clear();
+ ctx.ExecutorThread.Send(ev.Release());
+ InitQueue.pop_front();
+ }
+}
+
+void TConsole::ClearState()
+{
+ Config.Clear();
if (ConfigsManager) {
- ConfigsManager->ClearState();
+ ConfigsManager->ClearState();
}
if (TenantsManager) {
- TenantsManager->ClearState();
+ TenantsManager->ClearState();
}
-
- Counters->ResetCounters();
-}
-
-void TConsole::ForwardToConfigsManager(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
-{
- ctx.Send(ev->Forward(ConfigsManager->SelfId()));
-}
-
-void TConsole::ForwardToTenantsManager(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
-{
- ctx.Send(ev->Forward(TenantsManager->SelfId()));
-}
-
-void TConsole::Handle(TEvConsole::TEvGetConfigRequest::TPtr &ev, const TActorContext &ctx)
-{
- ctx.Send(ev->Sender, new TEvConsole::TEvGetConfigResponse(Config));
-}
-
-void TConsole::Handle(TEvConsole::TEvSetConfigRequest::TPtr &ev, const TActorContext &ctx)
-{
- TxProcessor->ProcessTx(CreateTxSetConfig(ev), ctx);
-}
-
-void TConsole::Handle(TEvents::TEvPoisonPill::TPtr &ev,
- const TActorContext &ctx)
-{
- Y_UNUSED(ev);
- ctx.Send(Tablet(), new TEvents::TEvPoisonPill);
-}
-
+
+ Counters->ResetCounters();
+}
+
+void TConsole::ForwardToConfigsManager(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
+{
+ ctx.Send(ev->Forward(ConfigsManager->SelfId()));
+}
+
+void TConsole::ForwardToTenantsManager(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
+{
+ ctx.Send(ev->Forward(TenantsManager->SelfId()));
+}
+
+void TConsole::Handle(TEvConsole::TEvGetConfigRequest::TPtr &ev, const TActorContext &ctx)
+{
+ ctx.Send(ev->Sender, new TEvConsole::TEvGetConfigResponse(Config));
+}
+
+void TConsole::Handle(TEvConsole::TEvSetConfigRequest::TPtr &ev, const TActorContext &ctx)
+{
+ TxProcessor->ProcessTx(CreateTxSetConfig(ev), ctx);
+}
+
+void TConsole::Handle(TEvents::TEvPoisonPill::TPtr &ev,
+ const TActorContext &ctx)
+{
+ Y_UNUSED(ev);
+ ctx.Send(Tablet(), new TEvents::TEvPoisonPill);
+}
+
IActor *CreateConsole(const TActorId &tablet, TTabletStorageInfo *info)
-{
- return new TConsole(tablet, info);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+{
+ return new TConsole(tablet, info);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console.h b/ydb/core/cms/console/console.h
index a310dbcc209..934d4e97e45 100644
--- a/ydb/core/cms/console/console.h
+++ b/ydb/core/cms/console/console.h
@@ -1,193 +1,193 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <ydb/core/base/blobstorage.h>
#include <ydb/core/protos/console.pb.h>
#include <ydb/core/protos/console_config.pb.h>
#include <ydb/core/protos/console_tenant.pb.h>
#include <ydb/public/api/protos/ydb_cms.pb.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-struct TEvConsole {
- enum EEv {
- // requests
- EvCreateTenantRequest = EventSpaceBegin(TKikimrEvents::ES_CONSOLE),
- EvAlterTenantRequest,
- EvGetTenantStatusRequest,
- EvListTenantsRequest,
- EvGetConfigRequest,
- EvSetConfigRequest,
- EvConfigureRequest,
- EvGetConfigItemsRequest,
- EvGetNodeConfigItemsRequest,
- EvGetNodeConfigRequest,
- EvRemoveTenantRequest,
- EvGetOperationRequest,
- EvAddConfigSubscriptionRequest,
- EvGetConfigSubscriptionRequest,
- EvListConfigSubscriptionsRequest,
- EvRemoveConfigSubscriptionRequest,
- EvRemoveConfigSubscriptionsRequest,
- EvReplaceConfigSubscriptionsRequest,
- EvConfigNotificationRequest,
- EvNotifyOperationCompletionRequest,
- EvDescribeTenantOptionsRequest,
- EvCheckConfigUpdatesRequest,
- EvListConfigValidatorsRequest,
- EvToggleConfigValidatorRequest,
+
+namespace NKikimr {
+namespace NConsole {
+
+struct TEvConsole {
+ enum EEv {
+ // requests
+ EvCreateTenantRequest = EventSpaceBegin(TKikimrEvents::ES_CONSOLE),
+ EvAlterTenantRequest,
+ EvGetTenantStatusRequest,
+ EvListTenantsRequest,
+ EvGetConfigRequest,
+ EvSetConfigRequest,
+ EvConfigureRequest,
+ EvGetConfigItemsRequest,
+ EvGetNodeConfigItemsRequest,
+ EvGetNodeConfigRequest,
+ EvRemoveTenantRequest,
+ EvGetOperationRequest,
+ EvAddConfigSubscriptionRequest,
+ EvGetConfigSubscriptionRequest,
+ EvListConfigSubscriptionsRequest,
+ EvRemoveConfigSubscriptionRequest,
+ EvRemoveConfigSubscriptionsRequest,
+ EvReplaceConfigSubscriptionsRequest,
+ EvConfigNotificationRequest,
+ EvNotifyOperationCompletionRequest,
+ EvDescribeTenantOptionsRequest,
+ EvCheckConfigUpdatesRequest,
+ EvListConfigValidatorsRequest,
+ EvToggleConfigValidatorRequest,
EvConfigSubscriptionRequest,
EvConfigSubscriptionCanceled,
EvConfigSubscriptionNotification,
-
- // responses
- EvCreateTenantResponse = EvCreateTenantRequest + 1024,
- EvAlterTenantResponse,
- EvGetTenantStatusResponse,
- EvListTenantsResponse,
- EvGetConfigResponse,
- EvSetConfigResponse,
- EvConfigureResponse,
- EvGetConfigItemsResponse,
- EvGetNodeConfigItemsResponse,
- EvGetNodeConfigResponse,
- EvRemoveTenantResponse,
- EvGetOperationResponse,
- EvAddConfigSubscriptionResponse,
- EvGetConfigSubscriptionResponse,
- EvListConfigSubscriptionsResponse,
- EvRemoveConfigSubscriptionResponse,
- EvRemoveConfigSubscriptionsResponse,
- EvReplaceConfigSubscriptionsResponse,
- EvConfigNotificationResponse,
- EvNotifyOperationCompletionResponse,
- EvOperationCompletionNotification,
- EvDescribeTenantOptionsResponse,
- EvCheckConfigUpdatesResponse,
- EvListConfigValidatorsResponse,
- EvToggleConfigValidatorResponse,
+
+ // responses
+ EvCreateTenantResponse = EvCreateTenantRequest + 1024,
+ EvAlterTenantResponse,
+ EvGetTenantStatusResponse,
+ EvListTenantsResponse,
+ EvGetConfigResponse,
+ EvSetConfigResponse,
+ EvConfigureResponse,
+ EvGetConfigItemsResponse,
+ EvGetNodeConfigItemsResponse,
+ EvGetNodeConfigResponse,
+ EvRemoveTenantResponse,
+ EvGetOperationResponse,
+ EvAddConfigSubscriptionResponse,
+ EvGetConfigSubscriptionResponse,
+ EvListConfigSubscriptionsResponse,
+ EvRemoveConfigSubscriptionResponse,
+ EvRemoveConfigSubscriptionsResponse,
+ EvReplaceConfigSubscriptionsResponse,
+ EvConfigNotificationResponse,
+ EvNotifyOperationCompletionResponse,
+ EvOperationCompletionNotification,
+ EvDescribeTenantOptionsResponse,
+ EvCheckConfigUpdatesResponse,
+ EvListConfigValidatorsResponse,
+ EvToggleConfigValidatorResponse,
EvConfigSubscriptionResponse,
EvConfigSubscriptionError,
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_CONSOLE),
- "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_CONSOLE)");
-
- //////////////////////////////////////////////////
- // TENANTS MANAGEMENT
- //////////////////////////////////////////////////
- struct TEvCreateTenantRequest : public TEventShortDebugPB<TEvCreateTenantRequest, NKikimrConsole::TCreateTenantRequest, EvCreateTenantRequest> {};
-
- struct TEvCreateTenantResponse : public TEventShortDebugPB<TEvCreateTenantResponse, NKikimrConsole::TCreateTenantResponse, EvCreateTenantResponse> {};
-
- struct TEvAlterTenantRequest : public TEventShortDebugPB<TEvAlterTenantRequest, NKikimrConsole::TAlterTenantRequest, EvAlterTenantRequest> {};
-
- struct TEvAlterTenantResponse : public TEventShortDebugPB<TEvAlterTenantResponse, NKikimrConsole::TAlterTenantResponse, EvAlterTenantResponse> {};
-
- struct TEvGetTenantStatusRequest : public TEventShortDebugPB<TEvGetTenantStatusRequest, NKikimrConsole::TGetTenantStatusRequest, EvGetTenantStatusRequest> {};
-
- struct TEvGetTenantStatusResponse : public TEventShortDebugPB<TEvGetTenantStatusResponse, NKikimrConsole::TGetTenantStatusResponse, EvGetTenantStatusResponse> {};
-
- struct TEvListTenantsRequest : public TEventShortDebugPB<TEvListTenantsRequest, NKikimrConsole::TListTenantsRequest, EvListTenantsRequest> {};
-
- struct TEvListTenantsResponse : public TEventShortDebugPB<TEvListTenantsResponse, NKikimrConsole::TListTenantsResponse, EvListTenantsResponse> {};
-
- struct TEvRemoveTenantRequest : public TEventShortDebugPB<TEvRemoveTenantRequest, NKikimrConsole::TRemoveTenantRequest, EvRemoveTenantRequest> {};
-
- struct TEvRemoveTenantResponse : public TEventShortDebugPB<TEvRemoveTenantResponse, NKikimrConsole::TRemoveTenantResponse, EvRemoveTenantResponse> {};
-
- struct TEvGetOperationRequest : public TEventShortDebugPB<TEvGetOperationRequest, NKikimrConsole::TGetOperationRequest, EvGetOperationRequest> {};
-
- struct TEvGetOperationResponse : public TEventShortDebugPB<TEvGetOperationResponse, NKikimrConsole::TGetOperationResponse, EvGetOperationResponse> {};
-
- struct TEvDescribeTenantOptionsRequest : public TEventShortDebugPB<TEvDescribeTenantOptionsRequest, NKikimrConsole::TDescribeTenantOptionsRequest, EvDescribeTenantOptionsRequest> {};
-
- struct TEvDescribeTenantOptionsResponse : public TEventShortDebugPB<TEvDescribeTenantOptionsResponse, NKikimrConsole::TDescribeTenantOptionsResponse, EvDescribeTenantOptionsResponse> {};
-
- //////////////////////////////////////////////////
- // CONFIGS MANAGEMENT
- //////////////////////////////////////////////////
- struct TEvConfigureRequest : public TEventShortDebugPB<TEvConfigureRequest, NKikimrConsole::TConfigureRequest, EvConfigureRequest> {};
-
- struct TEvConfigureResponse : public TEventShortDebugPB<TEvConfigureResponse, NKikimrConsole::TConfigureResponse, EvConfigureResponse> {};
-
- struct TEvGetConfigItemsRequest : public TEventShortDebugPB<TEvGetConfigItemsRequest, NKikimrConsole::TGetConfigItemsRequest, EvGetConfigItemsRequest> {};
-
- struct TEvGetConfigItemsResponse : public TEventShortDebugPB<TEvGetConfigItemsResponse, NKikimrConsole::TGetConfigItemsResponse, EvGetConfigItemsResponse> {};
-
- struct TEvGetNodeConfigItemsRequest : public TEventShortDebugPB<TEvGetNodeConfigItemsRequest, NKikimrConsole::TGetNodeConfigItemsRequest, EvGetNodeConfigItemsRequest> {};
-
- struct TEvGetNodeConfigItemsResponse : public TEventShortDebugPB<TEvGetNodeConfigItemsResponse, NKikimrConsole::TGetNodeConfigItemsResponse, EvGetNodeConfigItemsResponse> {};
-
- struct TEvGetNodeConfigRequest : public TEventShortDebugPB<TEvGetNodeConfigRequest, NKikimrConsole::TGetNodeConfigRequest, EvGetNodeConfigRequest> {};
-
- struct TEvGetNodeConfigResponse : public TEventShortDebugPB<TEvGetNodeConfigResponse, NKikimrConsole::TGetNodeConfigResponse, EvGetNodeConfigResponse> {};
-
- //////////////////////////////////////////////////
- // CMS MANAGEMENT
- //////////////////////////////////////////////////
- struct TEvGetConfigRequest : public TEventShortDebugPB<TEvGetConfigRequest, NKikimrConsole::TGetConfigRequest, EvGetConfigRequest> {};
-
- struct TEvGetConfigResponse : public TEventShortDebugPB<TEvGetConfigResponse, NKikimrConsole::TGetConfigResponse, EvGetConfigResponse> {
- TEvGetConfigResponse(const NKikimrConsole::TConfig &config = NKikimrConsole::TConfig())
- {
- Record.MutableConfig()->CopyFrom(config);
- }
- };
-
- struct TEvSetConfigRequest : public TEventShortDebugPB<TEvSetConfigRequest, NKikimrConsole::TSetConfigRequest, EvSetConfigRequest> {
- TEvSetConfigRequest(const NKikimrConsole::TConfig &config = NKikimrConsole::TConfig(),
- NKikimrConsole::TConfigItem::EMergeStrategy merge = NKikimrConsole::TConfigItem::OVERWRITE)
- {
- Record.MutableConfig()->CopyFrom(config);
- Record.SetMerge(merge);
- }
- };
-
- struct TEvSetConfigResponse : public TEventShortDebugPB<TEvSetConfigResponse, NKikimrConsole::TSetConfigResponse, EvSetConfigResponse> {};
-
- //////////////////////////////////////////////////
- // SUBSCRIPTIONS MANAGEMENT
- //////////////////////////////////////////////////
- struct TEvAddConfigSubscriptionRequest : public TEventShortDebugPB<TEvAddConfigSubscriptionRequest, NKikimrConsole::TAddConfigSubscriptionRequest, EvAddConfigSubscriptionRequest> {};
-
- struct TEvAddConfigSubscriptionResponse : public TEventShortDebugPB<TEvAddConfigSubscriptionResponse, NKikimrConsole::TAddConfigSubscriptionResponse, EvAddConfigSubscriptionResponse> {};
-
- struct TEvGetConfigSubscriptionRequest : public TEventShortDebugPB<TEvGetConfigSubscriptionRequest, NKikimrConsole::TGetConfigSubscriptionRequest, EvGetConfigSubscriptionRequest> {};
-
- struct TEvGetConfigSubscriptionResponse : public TEventShortDebugPB<TEvGetConfigSubscriptionResponse, NKikimrConsole::TGetConfigSubscriptionResponse, EvGetConfigSubscriptionResponse> {};
-
- struct TEvListConfigSubscriptionsRequest : public TEventShortDebugPB<TEvListConfigSubscriptionsRequest, NKikimrConsole::TListConfigSubscriptionsRequest, EvListConfigSubscriptionsRequest> {};
-
- struct TEvListConfigSubscriptionsResponse : public TEventShortDebugPB<TEvListConfigSubscriptionsResponse, NKikimrConsole::TListConfigSubscriptionsResponse, EvListConfigSubscriptionsResponse> {};
-
- struct TEvRemoveConfigSubscriptionRequest : public TEventShortDebugPB<TEvRemoveConfigSubscriptionRequest, NKikimrConsole::TRemoveConfigSubscriptionRequest, EvRemoveConfigSubscriptionRequest> {};
-
- struct TEvRemoveConfigSubscriptionResponse : public TEventShortDebugPB<TEvRemoveConfigSubscriptionResponse, NKikimrConsole::TRemoveConfigSubscriptionResponse, EvRemoveConfigSubscriptionResponse> {};
-
- struct TEvRemoveConfigSubscriptionsRequest : public TEventShortDebugPB<TEvRemoveConfigSubscriptionsRequest, NKikimrConsole::TRemoveConfigSubscriptionsRequest, EvRemoveConfigSubscriptionsRequest> {};
-
- struct TEvRemoveConfigSubscriptionsResponse : public TEventShortDebugPB<TEvRemoveConfigSubscriptionsResponse, NKikimrConsole::TRemoveConfigSubscriptionsResponse, EvRemoveConfigSubscriptionsResponse> {};
-
- struct TEvReplaceConfigSubscriptionsRequest : public TEventShortDebugPB<TEvReplaceConfigSubscriptionsRequest, NKikimrConsole::TReplaceConfigSubscriptionsRequest, EvReplaceConfigSubscriptionsRequest> {};
-
- struct TEvReplaceConfigSubscriptionsResponse : public TEventShortDebugPB<TEvReplaceConfigSubscriptionsResponse, NKikimrConsole::TReplaceConfigSubscriptionsResponse, EvReplaceConfigSubscriptionsResponse> {};
-
- struct TEvConfigNotificationRequest : public TEventShortDebugPB<TEvConfigNotificationRequest, NKikimrConsole::TConfigNotificationRequest, EvConfigNotificationRequest> {};
-
- struct TEvConfigNotificationResponse : public TEventShortDebugPB<TEvConfigNotificationResponse, NKikimrConsole::TConfigNotificationResponse, EvConfigNotificationResponse> {
- TEvConfigNotificationResponse() {}
-
- TEvConfigNotificationResponse(const NKikimrConsole::TConfigNotificationRequest &request)
- {
- Record.SetSubscriptionId(request.GetSubscriptionId());
- Record.MutableConfigId()->CopyFrom(request.GetConfigId());
- }
- };
-
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_CONSOLE),
+ "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_CONSOLE)");
+
+ //////////////////////////////////////////////////
+ // TENANTS MANAGEMENT
+ //////////////////////////////////////////////////
+ struct TEvCreateTenantRequest : public TEventShortDebugPB<TEvCreateTenantRequest, NKikimrConsole::TCreateTenantRequest, EvCreateTenantRequest> {};
+
+ struct TEvCreateTenantResponse : public TEventShortDebugPB<TEvCreateTenantResponse, NKikimrConsole::TCreateTenantResponse, EvCreateTenantResponse> {};
+
+ struct TEvAlterTenantRequest : public TEventShortDebugPB<TEvAlterTenantRequest, NKikimrConsole::TAlterTenantRequest, EvAlterTenantRequest> {};
+
+ struct TEvAlterTenantResponse : public TEventShortDebugPB<TEvAlterTenantResponse, NKikimrConsole::TAlterTenantResponse, EvAlterTenantResponse> {};
+
+ struct TEvGetTenantStatusRequest : public TEventShortDebugPB<TEvGetTenantStatusRequest, NKikimrConsole::TGetTenantStatusRequest, EvGetTenantStatusRequest> {};
+
+ struct TEvGetTenantStatusResponse : public TEventShortDebugPB<TEvGetTenantStatusResponse, NKikimrConsole::TGetTenantStatusResponse, EvGetTenantStatusResponse> {};
+
+ struct TEvListTenantsRequest : public TEventShortDebugPB<TEvListTenantsRequest, NKikimrConsole::TListTenantsRequest, EvListTenantsRequest> {};
+
+ struct TEvListTenantsResponse : public TEventShortDebugPB<TEvListTenantsResponse, NKikimrConsole::TListTenantsResponse, EvListTenantsResponse> {};
+
+ struct TEvRemoveTenantRequest : public TEventShortDebugPB<TEvRemoveTenantRequest, NKikimrConsole::TRemoveTenantRequest, EvRemoveTenantRequest> {};
+
+ struct TEvRemoveTenantResponse : public TEventShortDebugPB<TEvRemoveTenantResponse, NKikimrConsole::TRemoveTenantResponse, EvRemoveTenantResponse> {};
+
+ struct TEvGetOperationRequest : public TEventShortDebugPB<TEvGetOperationRequest, NKikimrConsole::TGetOperationRequest, EvGetOperationRequest> {};
+
+ struct TEvGetOperationResponse : public TEventShortDebugPB<TEvGetOperationResponse, NKikimrConsole::TGetOperationResponse, EvGetOperationResponse> {};
+
+ struct TEvDescribeTenantOptionsRequest : public TEventShortDebugPB<TEvDescribeTenantOptionsRequest, NKikimrConsole::TDescribeTenantOptionsRequest, EvDescribeTenantOptionsRequest> {};
+
+ struct TEvDescribeTenantOptionsResponse : public TEventShortDebugPB<TEvDescribeTenantOptionsResponse, NKikimrConsole::TDescribeTenantOptionsResponse, EvDescribeTenantOptionsResponse> {};
+
+ //////////////////////////////////////////////////
+ // CONFIGS MANAGEMENT
+ //////////////////////////////////////////////////
+ struct TEvConfigureRequest : public TEventShortDebugPB<TEvConfigureRequest, NKikimrConsole::TConfigureRequest, EvConfigureRequest> {};
+
+ struct TEvConfigureResponse : public TEventShortDebugPB<TEvConfigureResponse, NKikimrConsole::TConfigureResponse, EvConfigureResponse> {};
+
+ struct TEvGetConfigItemsRequest : public TEventShortDebugPB<TEvGetConfigItemsRequest, NKikimrConsole::TGetConfigItemsRequest, EvGetConfigItemsRequest> {};
+
+ struct TEvGetConfigItemsResponse : public TEventShortDebugPB<TEvGetConfigItemsResponse, NKikimrConsole::TGetConfigItemsResponse, EvGetConfigItemsResponse> {};
+
+ struct TEvGetNodeConfigItemsRequest : public TEventShortDebugPB<TEvGetNodeConfigItemsRequest, NKikimrConsole::TGetNodeConfigItemsRequest, EvGetNodeConfigItemsRequest> {};
+
+ struct TEvGetNodeConfigItemsResponse : public TEventShortDebugPB<TEvGetNodeConfigItemsResponse, NKikimrConsole::TGetNodeConfigItemsResponse, EvGetNodeConfigItemsResponse> {};
+
+ struct TEvGetNodeConfigRequest : public TEventShortDebugPB<TEvGetNodeConfigRequest, NKikimrConsole::TGetNodeConfigRequest, EvGetNodeConfigRequest> {};
+
+ struct TEvGetNodeConfigResponse : public TEventShortDebugPB<TEvGetNodeConfigResponse, NKikimrConsole::TGetNodeConfigResponse, EvGetNodeConfigResponse> {};
+
+ //////////////////////////////////////////////////
+ // CMS MANAGEMENT
+ //////////////////////////////////////////////////
+ struct TEvGetConfigRequest : public TEventShortDebugPB<TEvGetConfigRequest, NKikimrConsole::TGetConfigRequest, EvGetConfigRequest> {};
+
+ struct TEvGetConfigResponse : public TEventShortDebugPB<TEvGetConfigResponse, NKikimrConsole::TGetConfigResponse, EvGetConfigResponse> {
+ TEvGetConfigResponse(const NKikimrConsole::TConfig &config = NKikimrConsole::TConfig())
+ {
+ Record.MutableConfig()->CopyFrom(config);
+ }
+ };
+
+ struct TEvSetConfigRequest : public TEventShortDebugPB<TEvSetConfigRequest, NKikimrConsole::TSetConfigRequest, EvSetConfigRequest> {
+ TEvSetConfigRequest(const NKikimrConsole::TConfig &config = NKikimrConsole::TConfig(),
+ NKikimrConsole::TConfigItem::EMergeStrategy merge = NKikimrConsole::TConfigItem::OVERWRITE)
+ {
+ Record.MutableConfig()->CopyFrom(config);
+ Record.SetMerge(merge);
+ }
+ };
+
+ struct TEvSetConfigResponse : public TEventShortDebugPB<TEvSetConfigResponse, NKikimrConsole::TSetConfigResponse, EvSetConfigResponse> {};
+
+ //////////////////////////////////////////////////
+ // SUBSCRIPTIONS MANAGEMENT
+ //////////////////////////////////////////////////
+ struct TEvAddConfigSubscriptionRequest : public TEventShortDebugPB<TEvAddConfigSubscriptionRequest, NKikimrConsole::TAddConfigSubscriptionRequest, EvAddConfigSubscriptionRequest> {};
+
+ struct TEvAddConfigSubscriptionResponse : public TEventShortDebugPB<TEvAddConfigSubscriptionResponse, NKikimrConsole::TAddConfigSubscriptionResponse, EvAddConfigSubscriptionResponse> {};
+
+ struct TEvGetConfigSubscriptionRequest : public TEventShortDebugPB<TEvGetConfigSubscriptionRequest, NKikimrConsole::TGetConfigSubscriptionRequest, EvGetConfigSubscriptionRequest> {};
+
+ struct TEvGetConfigSubscriptionResponse : public TEventShortDebugPB<TEvGetConfigSubscriptionResponse, NKikimrConsole::TGetConfigSubscriptionResponse, EvGetConfigSubscriptionResponse> {};
+
+ struct TEvListConfigSubscriptionsRequest : public TEventShortDebugPB<TEvListConfigSubscriptionsRequest, NKikimrConsole::TListConfigSubscriptionsRequest, EvListConfigSubscriptionsRequest> {};
+
+ struct TEvListConfigSubscriptionsResponse : public TEventShortDebugPB<TEvListConfigSubscriptionsResponse, NKikimrConsole::TListConfigSubscriptionsResponse, EvListConfigSubscriptionsResponse> {};
+
+ struct TEvRemoveConfigSubscriptionRequest : public TEventShortDebugPB<TEvRemoveConfigSubscriptionRequest, NKikimrConsole::TRemoveConfigSubscriptionRequest, EvRemoveConfigSubscriptionRequest> {};
+
+ struct TEvRemoveConfigSubscriptionResponse : public TEventShortDebugPB<TEvRemoveConfigSubscriptionResponse, NKikimrConsole::TRemoveConfigSubscriptionResponse, EvRemoveConfigSubscriptionResponse> {};
+
+ struct TEvRemoveConfigSubscriptionsRequest : public TEventShortDebugPB<TEvRemoveConfigSubscriptionsRequest, NKikimrConsole::TRemoveConfigSubscriptionsRequest, EvRemoveConfigSubscriptionsRequest> {};
+
+ struct TEvRemoveConfigSubscriptionsResponse : public TEventShortDebugPB<TEvRemoveConfigSubscriptionsResponse, NKikimrConsole::TRemoveConfigSubscriptionsResponse, EvRemoveConfigSubscriptionsResponse> {};
+
+ struct TEvReplaceConfigSubscriptionsRequest : public TEventShortDebugPB<TEvReplaceConfigSubscriptionsRequest, NKikimrConsole::TReplaceConfigSubscriptionsRequest, EvReplaceConfigSubscriptionsRequest> {};
+
+ struct TEvReplaceConfigSubscriptionsResponse : public TEventShortDebugPB<TEvReplaceConfigSubscriptionsResponse, NKikimrConsole::TReplaceConfigSubscriptionsResponse, EvReplaceConfigSubscriptionsResponse> {};
+
+ struct TEvConfigNotificationRequest : public TEventShortDebugPB<TEvConfigNotificationRequest, NKikimrConsole::TConfigNotificationRequest, EvConfigNotificationRequest> {};
+
+ struct TEvConfigNotificationResponse : public TEventShortDebugPB<TEvConfigNotificationResponse, NKikimrConsole::TConfigNotificationResponse, EvConfigNotificationResponse> {
+ TEvConfigNotificationResponse() {}
+
+ TEvConfigNotificationResponse(const NKikimrConsole::TConfigNotificationRequest &request)
+ {
+ Record.SetSubscriptionId(request.GetSubscriptionId());
+ Record.MutableConfigId()->CopyFrom(request.GetConfigId());
+ }
+ };
+
struct TEvConfigSubscriptionRequest : public TEventShortDebugPB<TEvConfigSubscriptionRequest, NKikimrConsole::TConfigSubscriptionRequest, EvConfigSubscriptionRequest> {};
struct TEvConfigSubscriptionResponse : public TEventShortDebugPB<TEvConfigSubscriptionResponse, NKikimrConsole::TConfigSubscriptionResponse, EvConfigSubscriptionResponse> {
@@ -240,36 +240,36 @@ struct TEvConsole {
}
};
- /**
- * If operation is unknown then TEvNotifyOperationCompletionResponse
- * is sent with NOT_FOUND status error.
- * If operation is not ready then subscription is stored in DB and
- * TEvNotifyOperationCompletionResponse with 'not ready' status is
- * sent. Later TEvOperationCompletionNotification is send upon
- * operation completion.
- * If operation is ready then TEvOperationCompletionNotification is
- * sent with no preceding TEvNotifyOperationCompletionResponse.
- */
- struct TEvNotifyOperationCompletionRequest : public TEventShortDebugPB<TEvNotifyOperationCompletionRequest, NKikimrConsole::TGetOperationRequest, EvNotifyOperationCompletionRequest> {};
-
- struct TEvNotifyOperationCompletionResponse : public TEventShortDebugPB<TEvNotifyOperationCompletionResponse, NKikimrConsole::TGetOperationResponse, EvNotifyOperationCompletionResponse> {};
-
- struct TEvOperationCompletionNotification : public TEventShortDebugPB<TEvOperationCompletionNotification, NKikimrConsole::TGetOperationResponse, EvOperationCompletionNotification> {};
-
- struct TEvCheckConfigUpdatesRequest : public TEventShortDebugPB<TEvCheckConfigUpdatesRequest, NKikimrConsole::TCheckConfigUpdatesRequest, EvCheckConfigUpdatesRequest> {};
-
- struct TEvCheckConfigUpdatesResponse : public TEventShortDebugPB<TEvCheckConfigUpdatesResponse, NKikimrConsole::TCheckConfigUpdatesResponse, EvCheckConfigUpdatesResponse> {};
-
- struct TEvListConfigValidatorsRequest : public TEventShortDebugPB<TEvListConfigValidatorsRequest, NKikimrConsole::TListConfigValidatorsRequest, EvListConfigValidatorsRequest> {};
-
- struct TEvListConfigValidatorsResponse : public TEventShortDebugPB<TEvListConfigValidatorsResponse, NKikimrConsole::TListConfigValidatorsResponse, EvListConfigValidatorsResponse> {};
-
- struct TEvToggleConfigValidatorRequest : public TEventShortDebugPB<TEvToggleConfigValidatorRequest, NKikimrConsole::TToggleConfigValidatorRequest, EvToggleConfigValidatorRequest> {};
-
- struct TEvToggleConfigValidatorResponse : public TEventShortDebugPB<TEvToggleConfigValidatorResponse, NKikimrConsole::TToggleConfigValidatorResponse, EvToggleConfigValidatorResponse> {};
-};
-
+ /**
+ * If operation is unknown then TEvNotifyOperationCompletionResponse
+ * is sent with NOT_FOUND status error.
+ * If operation is not ready then subscription is stored in DB and
+ * TEvNotifyOperationCompletionResponse with 'not ready' status is
+ * sent. Later TEvOperationCompletionNotification is send upon
+ * operation completion.
+ * If operation is ready then TEvOperationCompletionNotification is
+ * sent with no preceding TEvNotifyOperationCompletionResponse.
+ */
+ struct TEvNotifyOperationCompletionRequest : public TEventShortDebugPB<TEvNotifyOperationCompletionRequest, NKikimrConsole::TGetOperationRequest, EvNotifyOperationCompletionRequest> {};
+
+ struct TEvNotifyOperationCompletionResponse : public TEventShortDebugPB<TEvNotifyOperationCompletionResponse, NKikimrConsole::TGetOperationResponse, EvNotifyOperationCompletionResponse> {};
+
+ struct TEvOperationCompletionNotification : public TEventShortDebugPB<TEvOperationCompletionNotification, NKikimrConsole::TGetOperationResponse, EvOperationCompletionNotification> {};
+
+ struct TEvCheckConfigUpdatesRequest : public TEventShortDebugPB<TEvCheckConfigUpdatesRequest, NKikimrConsole::TCheckConfigUpdatesRequest, EvCheckConfigUpdatesRequest> {};
+
+ struct TEvCheckConfigUpdatesResponse : public TEventShortDebugPB<TEvCheckConfigUpdatesResponse, NKikimrConsole::TCheckConfigUpdatesResponse, EvCheckConfigUpdatesResponse> {};
+
+ struct TEvListConfigValidatorsRequest : public TEventShortDebugPB<TEvListConfigValidatorsRequest, NKikimrConsole::TListConfigValidatorsRequest, EvListConfigValidatorsRequest> {};
+
+ struct TEvListConfigValidatorsResponse : public TEventShortDebugPB<TEvListConfigValidatorsResponse, NKikimrConsole::TListConfigValidatorsResponse, EvListConfigValidatorsResponse> {};
+
+ struct TEvToggleConfigValidatorRequest : public TEventShortDebugPB<TEvToggleConfigValidatorRequest, NKikimrConsole::TToggleConfigValidatorRequest, EvToggleConfigValidatorRequest> {};
+
+ struct TEvToggleConfigValidatorResponse : public TEventShortDebugPB<TEvToggleConfigValidatorResponse, NKikimrConsole::TToggleConfigValidatorResponse, EvToggleConfigValidatorResponse> {};
+};
+
IActor *CreateConsole(const TActorId &tablet, TTabletStorageInfo *info);
-
-} // namespace NConsole
-} // namespace NKikimr
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__add_config_subscription.cpp b/ydb/core/cms/console/console__add_config_subscription.cpp
index cb0bc25c1bf..3bb64227929 100644
--- a/ydb/core/cms/console/console__add_config_subscription.cpp
+++ b/ydb/core/cms/console/console__add_config_subscription.cpp
@@ -1,107 +1,107 @@
-#include "console_configs_manager.h"
-
-#include <util/random/random.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConfigsManager::TTxAddConfigSubscription : public TTransactionBase<TConfigsManager> {
-public:
- TTxAddConfigSubscription(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr ev,
- TConfigsManager *self)
- : TBase(self)
- , Request(std::move(ev))
- {
- }
-
+#include "console_configs_manager.h"
+
+#include <util/random/random.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConfigsManager::TTxAddConfigSubscription : public TTransactionBase<TConfigsManager> {
+public:
+ TTxAddConfigSubscription(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr ev,
+ TConfigsManager *self)
+ : TBase(self)
+ , Request(std::move(ev))
+ {
+ }
+
bool Error(Ydb::StatusIds::StatusCode code,
- const TString &error,
- const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Cannot add subscription: " << error);
-
- Response->Record.MutableStatus()->SetCode(code);
- Response->Record.MutableStatus()->SetReason(error);
-
- Self->PendingSubscriptionModifications.Clear();
-
- return true;
- }
-
- bool Execute(TTransactionContext &txc,
- const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- auto &rec = Request->Get()->Record;
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxAddConfigSubscription Execute: " << rec.ShortDebugString());
-
- Y_VERIFY(Self->PendingSubscriptionModifications.IsEmpty());
-
- Response = new TEvConsole::TEvAddConfigSubscriptionResponse;
-
- TSubscription::TPtr subscription = new TSubscription(rec.GetSubscription());
+ const TString &error,
+ const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Cannot add subscription: " << error);
+
+ Response->Record.MutableStatus()->SetCode(code);
+ Response->Record.MutableStatus()->SetReason(error);
+
+ Self->PendingSubscriptionModifications.Clear();
+
+ return true;
+ }
+
+ bool Execute(TTransactionContext &txc,
+ const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ auto &rec = Request->Get()->Record;
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxAddConfigSubscription Execute: " << rec.ShortDebugString());
+
+ Y_VERIFY(Self->PendingSubscriptionModifications.IsEmpty());
+
+ Response = new TEvConsole::TEvAddConfigSubscriptionResponse;
+
+ TSubscription::TPtr subscription = new TSubscription(rec.GetSubscription());
Ydb::StatusIds::StatusCode code;
- TString error;
- if (!Self->MakeNewSubscriptionChecks(subscription, code, error))
- return Error(code, error, ctx);
-
- // Check if existing subscription should be returned.
- for (auto existingSubscription : Self->SubscriptionIndex.GetSubscriptions(subscription->Subscriber)) {
- if (subscription->IsEqual(*existingSubscription)) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Added subscription is similar to existing one, "
- "return existing subscription id=: " << existingSubscription->Id);
-
- Response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
- Response->Record.SetSubscriptionId(existingSubscription->Id);
- return true;
- }
- }
-
- subscription->Id = Self->NextSubscriptionId++;
- subscription->Cookie = RandomNumber<ui64>();
+ TString error;
+ if (!Self->MakeNewSubscriptionChecks(subscription, code, error))
+ return Error(code, error, ctx);
+
+ // Check if existing subscription should be returned.
+ for (auto existingSubscription : Self->SubscriptionIndex.GetSubscriptions(subscription->Subscriber)) {
+ if (subscription->IsEqual(*existingSubscription)) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Added subscription is similar to existing one, "
+ "return existing subscription id=: " << existingSubscription->Id);
+
+ Response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+ Response->Record.SetSubscriptionId(existingSubscription->Id);
+ return true;
+ }
+ }
+
+ subscription->Id = Self->NextSubscriptionId++;
+ subscription->Cookie = RandomNumber<ui64>();
Response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
- Response->Record.SetSubscriptionId(subscription->Id);
-
- Self->PendingSubscriptionModifications.AddedSubscriptions.push_back(subscription);
-
- // Update database.
- Self->DbApplyPendingSubscriptionModifications(txc, ctx);
- Self->DbUpdateNextSubscriptionId(txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxAddConfigSubscription Complete");
-
- Y_VERIFY(Response);
- if (!Self->PendingSubscriptionModifications.IsEmpty()) {
- TAutoPtr<IEventHandle> ev = new IEventHandle(Request->Sender,
- Self->SelfId(),
- Response.Release(), 0,
- Request->Cookie);
- Self->ApplyPendingSubscriptionModifications(ctx, ev);
- } else {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvAddConfigSubscriptionResponse: " << Response->Record.ShortDebugString());
- ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TEvConsole::TEvAddConfigSubscriptionRequest::TPtr Request;
- TAutoPtr<TEvConsole::TEvAddConfigSubscriptionResponse> Response;
-};
-
-ITransaction *TConfigsManager::CreateTxAddConfigSubscription(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr &ev)
-{
- return new TTxAddConfigSubscription(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ Response->Record.SetSubscriptionId(subscription->Id);
+
+ Self->PendingSubscriptionModifications.AddedSubscriptions.push_back(subscription);
+
+ // Update database.
+ Self->DbApplyPendingSubscriptionModifications(txc, ctx);
+ Self->DbUpdateNextSubscriptionId(txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxAddConfigSubscription Complete");
+
+ Y_VERIFY(Response);
+ if (!Self->PendingSubscriptionModifications.IsEmpty()) {
+ TAutoPtr<IEventHandle> ev = new IEventHandle(Request->Sender,
+ Self->SelfId(),
+ Response.Release(), 0,
+ Request->Cookie);
+ Self->ApplyPendingSubscriptionModifications(ctx, ev);
+ } else {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvAddConfigSubscriptionResponse: " << Response->Record.ShortDebugString());
+ ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvConsole::TEvAddConfigSubscriptionRequest::TPtr Request;
+ TAutoPtr<TEvConsole::TEvAddConfigSubscriptionResponse> Response;
+};
+
+ITransaction *TConfigsManager::CreateTxAddConfigSubscription(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr &ev)
+{
+ return new TTxAddConfigSubscription(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__alter_tenant.cpp b/ydb/core/cms/console/console__alter_tenant.cpp
index a6817692310..dc44c250828 100644
--- a/ydb/core/cms/console/console__alter_tenant.cpp
+++ b/ydb/core/cms/console/console__alter_tenant.cpp
@@ -1,62 +1,62 @@
-#include "console_tenants_manager.h"
-#include "console_impl.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TTenantsManager::TTxAlterTenant : public TTransactionBase<TTenantsManager> {
-public:
- TTxAlterTenant(TEvConsole::TEvAlterTenantRequest::TPtr ev, TTenantsManager *self)
- : TBase(self)
- , Path(CanonizePath(ev->Get()->Record.GetRequest().path()))
- , Request(std::move(ev))
- , ComputationalUnitsModified(false)
- {
- }
-
+#include "console_tenants_manager.h"
+#include "console_impl.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TTenantsManager::TTxAlterTenant : public TTransactionBase<TTenantsManager> {
+public:
+ TTxAlterTenant(TEvConsole::TEvAlterTenantRequest::TPtr ev, TTenantsManager *self)
+ : TBase(self)
+ , Path(CanonizePath(ev->Get()->Record.GetRequest().path()))
+ , Request(std::move(ev))
+ , ComputationalUnitsModified(false)
+ {
+ }
+
bool Error(Ydb::StatusIds::StatusCode code, const TString &error,
- const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "Cannot alter tenant: " << error);
-
- auto &operation = *Response->Record.MutableResponse()->mutable_operation();
- operation.set_ready(true);
- operation.set_status(code);
- auto issue = operation.add_issues();
+ const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "Cannot alter tenant: " << error);
+
+ auto &operation = *Response->Record.MutableResponse()->mutable_operation();
+ operation.set_ready(true);
+ operation.set_status(code);
+ auto issue = operation.add_issues();
issue->set_severity(NYql::TSeverityIds::S_ERROR);
issue->set_message(error);
-
- Tenant = nullptr;
-
- return true;
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
+
+ Tenant = nullptr;
+
+ return true;
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
Ydb::StatusIds::StatusCode code;
- TString error;
-
- auto &rec = Request->Get()->Record.GetRequest();
- auto &token = Request->Get()->Record.GetUserToken();
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "TTxAlterTenant: "
- << Request->Get()->Record.ShortDebugString());
-
- Response = new TEvConsole::TEvAlterTenantResponse;
-
- if (!Self->CheckAccess(token, code, error, ctx))
- return Error(code, error, ctx);
-
- auto path = CanonizePath(rec.path());
- Tenant = Self->GetTenant(path);
- if (!Tenant)
+ TString error;
+
+ auto &rec = Request->Get()->Record.GetRequest();
+ auto &token = Request->Get()->Record.GetUserToken();
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "TTxAlterTenant: "
+ << Request->Get()->Record.ShortDebugString());
+
+ Response = new TEvConsole::TEvAlterTenantResponse;
+
+ if (!Self->CheckAccess(token, code, error, ctx))
+ return Error(code, error, ctx);
+
+ auto path = CanonizePath(rec.path());
+ Tenant = Self->GetTenant(path);
+ if (!Tenant)
return Error(Ydb::StatusIds::NOT_FOUND,
Sprintf("Database '%s' doesn't exist", path.data()), ctx);
-
- if (!Tenant->IsRunning() && !Tenant->IsConfiguring())
+
+ if (!Tenant->IsRunning() && !Tenant->IsConfiguring())
return Error(Ydb::StatusIds::UNAVAILABLE,
Sprintf("Database '%s' is busy", path.data()), ctx);
-
+
// Check idempotency key
if (rec.idempotency_key() && Tenant->AlterIdempotencyKey == rec.idempotency_key()) {
LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "Returning success due to idempotency key match");
@@ -67,58 +67,58 @@ public:
return true;
}
- // Check generation.
- if (rec.generation() && rec.generation() != Tenant->Generation)
- return Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "Tenant generation (" << Tenant->Generation
- << ") doesn't match requested (" << rec.generation() << ")",
- ctx);
-
- // Check added computational units.
- NewComputationalUnits = Tenant->ComputationalUnits;
- for (auto &unit : rec.computational_units_to_add()) {
+ // Check generation.
+ if (rec.generation() && rec.generation() != Tenant->Generation)
+ return Error(Ydb::StatusIds::BAD_REQUEST,
+ TStringBuilder() << "Tenant generation (" << Tenant->Generation
+ << ") doesn't match requested (" << rec.generation() << ")",
+ ctx);
+
+ // Check added computational units.
+ NewComputationalUnits = Tenant->ComputationalUnits;
+ for (auto &unit : rec.computational_units_to_add()) {
if (Tenant->SharedDomainId)
return Error(Ydb::StatusIds::BAD_REQUEST,
Sprintf("Database '%s' is serverless, cannot add computational units", path.data()), ctx);
- auto &kind = unit.unit_kind();
- auto &zone = unit.availability_zone();
- ui64 count = unit.count();
-
- if (!Self->MakeBasicComputationalUnitCheck(kind, zone, code, error))
- return Error(code, error, ctx);
-
- NewComputationalUnits[std::make_pair(kind, zone)] += count;
- }
-
- // Check removed computational units.
- for (auto &unit : rec.computational_units_to_remove()) {
+ auto &kind = unit.unit_kind();
+ auto &zone = unit.availability_zone();
+ ui64 count = unit.count();
+
+ if (!Self->MakeBasicComputationalUnitCheck(kind, zone, code, error))
+ return Error(code, error, ctx);
+
+ NewComputationalUnits[std::make_pair(kind, zone)] += count;
+ }
+
+ // Check removed computational units.
+ for (auto &unit : rec.computational_units_to_remove()) {
if (Tenant->SharedDomainId)
return Error(Ydb::StatusIds::BAD_REQUEST,
Sprintf("Database '%s' is serverless, cannot remove computational units", path.data()), ctx);
- auto &kind = unit.unit_kind();
- auto &zone = unit.availability_zone();
- ui64 count = unit.count();
-
- if (!Self->MakeBasicComputationalUnitCheck(kind, zone, code, error))
- return Error(code, error, ctx);
-
- auto key = std::make_pair(kind, zone);
- if (count > NewComputationalUnits[key])
+ auto &kind = unit.unit_kind();
+ auto &zone = unit.availability_zone();
+ ui64 count = unit.count();
+
+ if (!Self->MakeBasicComputationalUnitCheck(kind, zone, code, error))
+ return Error(code, error, ctx);
+
+ auto key = std::make_pair(kind, zone);
+ if (count > NewComputationalUnits[key])
return Error(Ydb::StatusIds::BAD_REQUEST,
- Sprintf("Not enough units of kind '%s' in zone '%s' to remove",
- kind.data(), zone.data()),
- ctx);
- else if (count == NewComputationalUnits[key])
- NewComputationalUnits.erase(key);
- else
- NewComputationalUnits[key] -= count;
- }
-
- // Check added storage resource units.
- ui64 newGroups = 0;
- for (auto &unit : rec.storage_units_to_add()) {
+ Sprintf("Not enough units of kind '%s' in zone '%s' to remove",
+ kind.data(), zone.data()),
+ ctx);
+ else if (count == NewComputationalUnits[key])
+ NewComputationalUnits.erase(key);
+ else
+ NewComputationalUnits[key] -= count;
+ }
+
+ // Check added storage resource units.
+ ui64 newGroups = 0;
+ for (auto &unit : rec.storage_units_to_add()) {
auto &kind = unit.unit_kind();
if (Tenant->AreResourcesShared && !Tenant->StoragePools.contains(kind))
@@ -129,65 +129,65 @@ public:
return Error(Ydb::StatusIds::BAD_REQUEST,
Sprintf("Database '%s' is serverless, cannot add storage units", path.data()), ctx);
- auto size = unit.count();
-
- if (!Self->MakeBasicPoolCheck(kind, size, code, error))
- return Error(code, error, ctx);
-
- PoolsToAdd[kind] += size;
- newGroups += size;
- }
-
- // Check deregistered computational units.
- for (auto &unit : rec.computational_units_to_deregister()) {
+ auto size = unit.count();
+
+ if (!Self->MakeBasicPoolCheck(kind, size, code, error))
+ return Error(code, error, ctx);
+
+ PoolsToAdd[kind] += size;
+ newGroups += size;
+ }
+
+ // Check deregistered computational units.
+ for (auto &unit : rec.computational_units_to_deregister()) {
if (Tenant->SharedDomainId)
return Error(Ydb::StatusIds::BAD_REQUEST,
Sprintf("Database '%s' is serverless, cannot deregister computational units", path.data()), ctx);
- auto key = std::make_pair(unit.host(), unit.port());
- auto it = Tenant->RegisteredComputationalUnits.find(key);
- if (it == Tenant->RegisteredComputationalUnits.end())
+ auto key = std::make_pair(unit.host(), unit.port());
+ auto it = Tenant->RegisteredComputationalUnits.find(key);
+ if (it == Tenant->RegisteredComputationalUnits.end())
return Error(Ydb::StatusIds::BAD_REQUEST,
- Sprintf("Cannot deregister unknown unit %s:%" PRIu32,
+ Sprintf("Cannot deregister unknown unit %s:%" PRIu32,
key.first.data(), key.second),
- ctx);
- UnitsToDeregister.insert(key);
- }
-
- // Check registered computational units.
- for (auto &unit : rec.computational_units_to_register()) {
+ ctx);
+ UnitsToDeregister.insert(key);
+ }
+
+ // Check registered computational units.
+ for (auto &unit : rec.computational_units_to_register()) {
if (Tenant->SharedDomainId)
return Error(Ydb::StatusIds::BAD_REQUEST,
Sprintf("Database '%s' is serverless, cannot register computational units", path.data()), ctx);
- auto key = std::make_pair(unit.host(), unit.port());
- auto it1 = Tenant->RegisteredComputationalUnits.find(key);
- if (it1 != Tenant->RegisteredComputationalUnits.end()) {
- if (it1->second.Kind != unit.unit_kind())
- return Error(Ydb::StatusIds::BAD_REQUEST,
- Sprintf("Computational unit %s:%" PRIu32 " is already registered with another kind",
+ auto key = std::make_pair(unit.host(), unit.port());
+ auto it1 = Tenant->RegisteredComputationalUnits.find(key);
+ if (it1 != Tenant->RegisteredComputationalUnits.end()) {
+ if (it1->second.Kind != unit.unit_kind())
+ return Error(Ydb::StatusIds::BAD_REQUEST,
+ Sprintf("Computational unit %s:%" PRIu32 " is already registered with another kind",
key.first.data(), key.second),
- ctx);
- } else {
- auto it2 = UnitsToRegister.find(key);
- if (it2 != UnitsToRegister.end()
- && it2->second.Kind != unit.unit_kind())
- return Error(Ydb::StatusIds::BAD_REQUEST,
- Sprintf("Computational unit %s:%" PRIu32 " is registered with different kind",
+ ctx);
+ } else {
+ auto it2 = UnitsToRegister.find(key);
+ if (it2 != UnitsToRegister.end()
+ && it2->second.Kind != unit.unit_kind())
+ return Error(Ydb::StatusIds::BAD_REQUEST,
+ Sprintf("Computational unit %s:%" PRIu32 " is registered with different kind",
key.first.data(), key.second),
- ctx);
- UnitsToRegister[key] = TAllocatedComputationalUnit{key.first, key.second, unit.unit_kind()};
- }
- }
-
- // Check quotas.
- if (rec.computational_units_to_add_size()
- && (!Tenant->CheckComputationalUnitsQuota(NewComputationalUnits, code, error)
- || !Self->CheckComputationalUnitsQuota(NewComputationalUnits, Tenant, code, error)))
- return Error(code, error, ctx);
- if (newGroups && !Tenant->CheckStorageUnitsQuota(code, error, newGroups))
- return Error(code, error, ctx);
-
+ ctx);
+ UnitsToRegister[key] = TAllocatedComputationalUnit{key.first, key.second, unit.unit_kind()};
+ }
+ }
+
+ // Check quotas.
+ if (rec.computational_units_to_add_size()
+ && (!Tenant->CheckComputationalUnitsQuota(NewComputationalUnits, code, error)
+ || !Self->CheckComputationalUnitsQuota(NewComputationalUnits, Tenant, code, error)))
+ return Error(code, error, ctx);
+ if (newGroups && !Tenant->CheckStorageUnitsQuota(code, error, newGroups))
+ return Error(code, error, ctx);
+
// Check database quotas.
if (rec.has_database_quotas()) {
const auto& quotas = rec.database_quotas();
@@ -218,42 +218,42 @@ public:
"Unexpected duplicate attribute found in CMS local db", ctx);
}
- // Apply computational units changes.
- if (rec.computational_units_to_add_size() || rec.computational_units_to_remove_size()) {
- ComputationalUnitsModified = true;
- for (auto &pr : Tenant->ComputationalUnits) {
+ // Apply computational units changes.
+ if (rec.computational_units_to_add_size() || rec.computational_units_to_remove_size()) {
+ ComputationalUnitsModified = true;
+ for (auto &pr : Tenant->ComputationalUnits) {
if (!NewComputationalUnits.contains(pr.first))
- Self->DbRemoveComputationalUnit(Tenant, pr.first.first, pr.first.second, txc, ctx);
- }
- for (auto &pr : NewComputationalUnits)
- Self->DbUpdateComputationalUnit(Tenant, pr.first.first, pr.first.second, pr.second, txc, ctx);
- }
-
- // Apply storage units changes.
- for (auto &pr : PoolsToAdd) {
- TStoragePool::TPtr pool;
- auto &kind = pr.first;
- auto size = pr.second;
+ Self->DbRemoveComputationalUnit(Tenant, pr.first.first, pr.first.second, txc, ctx);
+ }
+ for (auto &pr : NewComputationalUnits)
+ Self->DbUpdateComputationalUnit(Tenant, pr.first.first, pr.first.second, pr.second, txc, ctx);
+ }
+
+ // Apply storage units changes.
+ for (auto &pr : PoolsToAdd) {
+ TStoragePool::TPtr pool;
+ auto &kind = pr.first;
+ auto size = pr.second;
if (Tenant->StoragePools.contains(kind)) {
- pool = new TStoragePool(*Tenant->StoragePools.at(kind));
- pool->AddRequiredGroups(size);
- pool->State = TStoragePool::NOT_UPDATED;
- } else {
+ pool = new TStoragePool(*Tenant->StoragePools.at(kind));
+ pool->AddRequiredGroups(size);
+ pool->State = TStoragePool::NOT_UPDATED;
+ } else {
Y_VERIFY(!Tenant->AreResourcesShared);
- pool = Self->MakeStoragePool(Tenant, kind, size);
- }
-
- Self->DbUpdatePool(Tenant, pool, txc, ctx);
- }
-
- // Apply registered units changes.
- for (auto &key : UnitsToDeregister)
- Self->DbRemoveRegisteredUnit(Tenant, key.first, key.second, txc, ctx);
- for (auto &pr : UnitsToRegister) {
- auto &unit = pr.second;
- Self->DbUpdateRegisteredUnit(Tenant, unit.Host, unit.Port, unit.Kind, txc, ctx);
- }
-
+ pool = Self->MakeStoragePool(Tenant, kind, size);
+ }
+
+ Self->DbUpdatePool(Tenant, pool, txc, ctx);
+ }
+
+ // Apply registered units changes.
+ for (auto &key : UnitsToDeregister)
+ Self->DbRemoveRegisteredUnit(Tenant, key.first, key.second, txc, ctx);
+ for (auto &pr : UnitsToRegister) {
+ auto &unit = pr.second;
+ Self->DbUpdateRegisteredUnit(Tenant, unit.Host, unit.Port, unit.Kind, txc, ctx);
+ }
+
bool updateSubdomainVersion = false;
if (rec.has_schema_operation_quotas()) {
@@ -299,62 +299,62 @@ public:
Self->DbUpdateSubdomainVersion(Tenant, *SubdomainVersion, txc, ctx);
}
- Self->DbUpdateTenantGeneration(Tenant, Tenant->Generation + 1, txc, ctx);
-
- auto &operation = *Response->Record.MutableResponse()->mutable_operation();
- operation.set_ready(true);
- operation.set_status(Ydb::StatusIds::SUCCESS);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "TTxAlterTenant Complete");
-
- Y_VERIFY(Response);
- Self->Counters.Inc(Response->Record.GetResponse().operation().status(),
- COUNTER_ALTER_RESPONSES);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS, "Send: " << Response->ToString());
- ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
-
- if (Tenant) {
- if (ComputationalUnitsModified) {
- Self->SlotStats.DeallocateSlots(Tenant->Slots);
- Self->Counters.RemoveUnits(Tenant->ComputationalUnits);
-
- Tenant->ComputationalUnits = NewComputationalUnits;
- Tenant->ParseComputationalUnits(Self->Config);
-
- Self->SlotStats.AllocateSlots(Tenant->Slots);
- Self->Counters.AddUnits(Tenant->ComputationalUnits);
- }
- for (auto &key : UnitsToDeregister) {
- Self->Counters.Dec(Tenant->RegisteredComputationalUnits.at(key).Kind,
- COUNTER_REGISTERED_UNITS);
- Tenant->RegisteredComputationalUnits.erase(key);
- }
- for (auto &pr : UnitsToRegister) {
- Self->Counters.Inc(pr.second.Kind, COUNTER_REGISTERED_UNITS);
- Tenant->RegisteredComputationalUnits[pr.first] = pr.second;
- }
- for (auto &pr : PoolsToAdd) {
- TStoragePool::TPtr pool;
- auto &kind = pr.first;
- auto size = pr.second;
+ Self->DbUpdateTenantGeneration(Tenant, Tenant->Generation + 1, txc, ctx);
+
+ auto &operation = *Response->Record.MutableResponse()->mutable_operation();
+ operation.set_ready(true);
+ operation.set_status(Ydb::StatusIds::SUCCESS);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "TTxAlterTenant Complete");
+
+ Y_VERIFY(Response);
+ Self->Counters.Inc(Response->Record.GetResponse().operation().status(),
+ COUNTER_ALTER_RESPONSES);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS, "Send: " << Response->ToString());
+ ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
+
+ if (Tenant) {
+ if (ComputationalUnitsModified) {
+ Self->SlotStats.DeallocateSlots(Tenant->Slots);
+ Self->Counters.RemoveUnits(Tenant->ComputationalUnits);
+
+ Tenant->ComputationalUnits = NewComputationalUnits;
+ Tenant->ParseComputationalUnits(Self->Config);
+
+ Self->SlotStats.AllocateSlots(Tenant->Slots);
+ Self->Counters.AddUnits(Tenant->ComputationalUnits);
+ }
+ for (auto &key : UnitsToDeregister) {
+ Self->Counters.Dec(Tenant->RegisteredComputationalUnits.at(key).Kind,
+ COUNTER_REGISTERED_UNITS);
+ Tenant->RegisteredComputationalUnits.erase(key);
+ }
+ for (auto &pr : UnitsToRegister) {
+ Self->Counters.Inc(pr.second.Kind, COUNTER_REGISTERED_UNITS);
+ Tenant->RegisteredComputationalUnits[pr.first] = pr.second;
+ }
+ for (auto &pr : PoolsToAdd) {
+ TStoragePool::TPtr pool;
+ auto &kind = pr.first;
+ auto size = pr.second;
if (Tenant->StoragePools.contains(kind)) {
- pool = Tenant->StoragePools.at(kind);
- pool->AddRequiredGroups(size);
- pool->State = TStoragePool::NOT_UPDATED;
- } else {
- pool = Self->MakeStoragePool(Tenant, kind, size);
- Tenant->StoragePools.emplace(std::make_pair(kind, pool));
- }
-
- Self->Counters.Inc(kind, COUNTER_REQUESTED_STORAGE_UNITS, size);
- }
+ pool = Tenant->StoragePools.at(kind);
+ pool->AddRequiredGroups(size);
+ pool->State = TStoragePool::NOT_UPDATED;
+ } else {
+ pool = Self->MakeStoragePool(Tenant, kind, size);
+ Tenant->StoragePools.emplace(std::make_pair(kind, pool));
+ }
+
+ Self->Counters.Inc(kind, COUNTER_REQUESTED_STORAGE_UNITS, size);
+ }
if (SchemaOperationQuotas) {
Tenant->SchemaOperationQuotas.ConstructInPlace(*SchemaOperationQuotas);
}
@@ -364,34 +364,34 @@ public:
if (SubdomainVersion) {
Tenant->SubdomainVersion = *SubdomainVersion;
}
-
- ++Tenant->Generation;
-
- Self->ProcessTenantActions(Tenant, ctx);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TString Path;
- TEvConsole::TEvAlterTenantRequest::TPtr Request;
- TAutoPtr<TEvConsole::TEvAlterTenantResponse> Response;
- THashMap<std::pair<TString, TString>, ui64> NewComputationalUnits;
- THashMap<std::pair<TString, ui32>, TAllocatedComputationalUnit> UnitsToRegister;
- THashSet<std::pair<TString, ui32>> UnitsToDeregister;
- THashMap<TString, ui64> PoolsToAdd;
+
+ ++Tenant->Generation;
+
+ Self->ProcessTenantActions(Tenant, ctx);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TString Path;
+ TEvConsole::TEvAlterTenantRequest::TPtr Request;
+ TAutoPtr<TEvConsole::TEvAlterTenantResponse> Response;
+ THashMap<std::pair<TString, TString>, ui64> NewComputationalUnits;
+ THashMap<std::pair<TString, ui32>, TAllocatedComputationalUnit> UnitsToRegister;
+ THashSet<std::pair<TString, ui32>> UnitsToDeregister;
+ THashMap<TString, ui64> PoolsToAdd;
TMaybe<Ydb::Cms::SchemaOperationQuotas> SchemaOperationQuotas;
TMaybe<Ydb::Cms::DatabaseQuotas> DatabaseQuotas;
TMaybe<ui64> SubdomainVersion;
- bool ComputationalUnitsModified;
- TTenant::TPtr Tenant;
-};
-
-ITransaction *TTenantsManager::CreateTxAlterTenant(TEvConsole::TEvAlterTenantRequest::TPtr &ev)
-{
- return new TTxAlterTenant(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ bool ComputationalUnitsModified;
+ TTenant::TPtr Tenant;
+};
+
+ITransaction *TTenantsManager::CreateTxAlterTenant(TEvConsole::TEvAlterTenantRequest::TPtr &ev)
+{
+ return new TTxAlterTenant(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__cleanup_subscriptions.cpp b/ydb/core/cms/console/console__cleanup_subscriptions.cpp
index 1031c360669..c07d7a3a9d7 100644
--- a/ydb/core/cms/console/console__cleanup_subscriptions.cpp
+++ b/ydb/core/cms/console/console__cleanup_subscriptions.cpp
@@ -1,70 +1,70 @@
-#include "config_index.h"
-#include "console_impl.h"
-#include "console_configs_manager.h"
-#include "console_tenants_manager.h"
-
+#include "config_index.h"
+#include "console_impl.h"
+#include "console_configs_manager.h"
+#include "console_tenants_manager.h"
+
#include <ydb/core/base/path.h>
#include <ydb/core/cms/console/validators/registry.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConfigsManager::TTxCleanupSubscriptions : public TTransactionBase<TConfigsManager> {
-public:
- TTxCleanupSubscriptions(TEvInterconnect::TEvNodesInfo::TPtr &ev,
- TConfigsManager *self)
- : TBase(self)
- , Nodes(ev)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConsole::TTxCleanupSubscriptions");
-
- THashSet<ui32> nodes;
- for (auto &node : Nodes->Get()->Nodes)
- nodes.insert(node.NodeId);
-
- for (auto pr : Self->SubscriptionIndex.GetSubscriptions()) {
- auto nodeId = pr.second->Subscriber.ServiceId.NodeId();
- if (nodeId && !nodes.contains(nodeId)) {
- Self->PendingSubscriptionModifications.RemovedSubscriptions.insert(pr.first);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Subscription " << pr.first << " has subscriber from unknown node "
- << nodeId << " and will be removed");
- }
- }
-
- // Update database.
- Self->DbApplyPendingSubscriptionModifications(txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS,
- "TConsole::TTxCleanupSubscriptions Complete");
-
- if (!Self->PendingSubscriptionModifications.IsEmpty())
- Self->ApplyPendingSubscriptionModifications(ctx);
- Self->ScheduleSubscriptionsCleanup(ctx);
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TEvInterconnect::TEvNodesInfo::TPtr Nodes;
-};
-
-ITransaction *TConfigsManager::CreateTxCleanupSubscriptions(TEvInterconnect::TEvNodesInfo::TPtr &ev)
-{
- return new TTxCleanupSubscriptions(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConfigsManager::TTxCleanupSubscriptions : public TTransactionBase<TConfigsManager> {
+public:
+ TTxCleanupSubscriptions(TEvInterconnect::TEvNodesInfo::TPtr &ev,
+ TConfigsManager *self)
+ : TBase(self)
+ , Nodes(ev)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConsole::TTxCleanupSubscriptions");
+
+ THashSet<ui32> nodes;
+ for (auto &node : Nodes->Get()->Nodes)
+ nodes.insert(node.NodeId);
+
+ for (auto pr : Self->SubscriptionIndex.GetSubscriptions()) {
+ auto nodeId = pr.second->Subscriber.ServiceId.NodeId();
+ if (nodeId && !nodes.contains(nodeId)) {
+ Self->PendingSubscriptionModifications.RemovedSubscriptions.insert(pr.first);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Subscription " << pr.first << " has subscriber from unknown node "
+ << nodeId << " and will be removed");
+ }
+ }
+
+ // Update database.
+ Self->DbApplyPendingSubscriptionModifications(txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConsole::TTxCleanupSubscriptions Complete");
+
+ if (!Self->PendingSubscriptionModifications.IsEmpty())
+ Self->ApplyPendingSubscriptionModifications(ctx);
+ Self->ScheduleSubscriptionsCleanup(ctx);
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvInterconnect::TEvNodesInfo::TPtr Nodes;
+};
+
+ITransaction *TConfigsManager::CreateTxCleanupSubscriptions(TEvInterconnect::TEvNodesInfo::TPtr &ev)
+{
+ return new TTxCleanupSubscriptions(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__configure.cpp b/ydb/core/cms/console/console__configure.cpp
index 4a88b8184b9..f28417e7600 100644
--- a/ydb/core/cms/console/console__configure.cpp
+++ b/ydb/core/cms/console/console__configure.cpp
@@ -1,410 +1,410 @@
-#include "console_configs_manager.h"
-#include "modifications_validator.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConfigsManager::TTxConfigure : public TTransactionBase<TConfigsManager> {
-public:
- TTxConfigure(TEvConsole::TEvConfigureRequest::TPtr ev,
- TConfigsManager *self)
- : TBase(self)
- , Request(std::move(ev))
- {
- }
-
+#include "console_configs_manager.h"
+#include "modifications_validator.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConfigsManager::TTxConfigure : public TTransactionBase<TConfigsManager> {
+public:
+ TTxConfigure(TEvConsole::TEvConfigureRequest::TPtr ev,
+ TConfigsManager *self)
+ : TBase(self)
+ , Request(std::move(ev))
+ {
+ }
+
bool Error(Ydb::StatusIds::StatusCode code,
- const TString &error,
- const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Cannot modify config: " << error);
-
- Response->Record.MutableStatus()->SetCode(code);
- Response->Record.MutableStatus()->SetReason(error);
-
- Self->PendingConfigModifications.Clear();
-
- return true;
- }
-
- bool IsGenerationOk(TConfigItem::TPtr item,
- ui64 generation,
- const TActorContext &ctx)
- {
- if (item->Generation != generation) {
+ const TString &error,
+ const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Cannot modify config: " << error);
+
+ Response->Record.MutableStatus()->SetCode(code);
+ Response->Record.MutableStatus()->SetReason(error);
+
+ Self->PendingConfigModifications.Clear();
+
+ return true;
+ }
+
+ bool IsGenerationOk(TConfigItem::TPtr item,
+ ui64 generation,
+ const TActorContext &ctx)
+ {
+ if (item->Generation != generation) {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "wrong generation for config item #" << item->Id,
- ctx);
- return false;
- }
-
- return true;
- }
-
- bool IsConfigKindOk(const NKikimrConfig::TAppConfig &config,
- ui32 kind,
- const TActorContext &ctx)
- {
- if (!kind) {
+ TStringBuilder() << "wrong generation for config item #" << item->Id,
+ ctx);
+ return false;
+ }
+
+ return true;
+ }
+
+ bool IsConfigKindOk(const NKikimrConfig::TAppConfig &config,
+ ui32 kind,
+ const TActorContext &ctx)
+ {
+ if (!kind) {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "zero kind value is not allowed for config items",
- ctx);
- return false;
- }
-
- std::vector<const ::google::protobuf::FieldDescriptor*> fields;
- auto *reflection = config.GetReflection();
- reflection->ListFields(config, &fields);
- for (auto field : fields) {
- if (field->number() != static_cast<int>(kind)) {
+ TStringBuilder() << "zero kind value is not allowed for config items",
+ ctx);
+ return false;
+ }
+
+ std::vector<const ::google::protobuf::FieldDescriptor*> fields;
+ auto *reflection = config.GetReflection();
+ reflection->ListFields(config, &fields);
+ for (auto field : fields) {
+ if (field->number() != static_cast<int>(kind)) {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "wrong config item: field '" << field->name()
- << "' shouldn't be set for confg item "
- << TConfigItem::KindName(kind) << " (" << kind << ")",
- ctx);
- return false;
- }
- }
- return true;
- }
-
- ui32 DetectConfigItemKind(const NKikimrConsole::TConfigItem &item)
- {
- std::vector<const ::google::protobuf::FieldDescriptor*> fields;
- auto *reflection = item.GetConfig().GetReflection();
- reflection->ListFields(item.GetConfig(), &fields);
- if (fields.size() != 1)
- return 0;
- return fields[0]->number();
- }
-
- void SplitConfigItem(const NKikimrConsole::TConfigItem &item,
- TVector<TConfigItem::TPtr> &newItems,
- const TActorContext &ctx)
- {
- NKikimrConfig::TAppConfig config;
- config.CopyFrom(item.GetConfig());
- NKikimrConsole::TConfigItem base;
- base.CopyFrom(item);
- base.ClearConfig();
-
- std::vector<const ::google::protobuf::FieldDescriptor*> fields;
- auto *reflection = config.GetReflection();
- reflection->ListFields(config, &fields);
- for (auto field : fields) {
- NKikimrConsole::TConfigItem copy;
- copy.CopyFrom(base);
- reflection->SwapFields(&config, copy.MutableConfig(), {field});
- TConfigItem::TPtr newItem = new TConfigItem(copy);
- newItem->Kind = field->number();
- newItems.push_back(newItem);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Split config item: " << copy.ShortDebugString());
- }
- }
-
- bool IsAddConfigItemActionOk(const NKikimrConsole::TAddConfigItem &action,
- const TActorContext &ctx)
- {
- TVector<TConfigItem::TPtr> newItems;
- auto &item = action.GetConfigItem();
-
- if (item.HasId()) {
+ TStringBuilder() << "wrong config item: field '" << field->name()
+ << "' shouldn't be set for confg item "
+ << TConfigItem::KindName(kind) << " (" << kind << ")",
+ ctx);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ ui32 DetectConfigItemKind(const NKikimrConsole::TConfigItem &item)
+ {
+ std::vector<const ::google::protobuf::FieldDescriptor*> fields;
+ auto *reflection = item.GetConfig().GetReflection();
+ reflection->ListFields(item.GetConfig(), &fields);
+ if (fields.size() != 1)
+ return 0;
+ return fields[0]->number();
+ }
+
+ void SplitConfigItem(const NKikimrConsole::TConfigItem &item,
+ TVector<TConfigItem::TPtr> &newItems,
+ const TActorContext &ctx)
+ {
+ NKikimrConfig::TAppConfig config;
+ config.CopyFrom(item.GetConfig());
+ NKikimrConsole::TConfigItem base;
+ base.CopyFrom(item);
+ base.ClearConfig();
+
+ std::vector<const ::google::protobuf::FieldDescriptor*> fields;
+ auto *reflection = config.GetReflection();
+ reflection->ListFields(config, &fields);
+ for (auto field : fields) {
+ NKikimrConsole::TConfigItem copy;
+ copy.CopyFrom(base);
+ reflection->SwapFields(&config, copy.MutableConfig(), {field});
+ TConfigItem::TPtr newItem = new TConfigItem(copy);
+ newItem->Kind = field->number();
+ newItems.push_back(newItem);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Split config item: " << copy.ShortDebugString());
+ }
+ }
+
+ bool IsAddConfigItemActionOk(const NKikimrConsole::TAddConfigItem &action,
+ const TActorContext &ctx)
+ {
+ TVector<TConfigItem::TPtr> newItems;
+ auto &item = action.GetConfigItem();
+
+ if (item.HasId()) {
Error(Ydb::StatusIds::BAD_REQUEST,
- "cannot add config item: new items should have empty id",
- ctx);
- return false;
- }
-
- if (!Self->IsSupportedMergeStrategy(item.GetMergeStrategy())) {
- Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "unsupported merge strategy ("
- << item.GetMergeStrategy() << ")",
- ctx);
- return false;
- }
-
- if (item.GetKind() == NKikimrConsole::TConfigItem::Auto) {
- ui32 kind = DetectConfigItemKind(item);
- if (kind) {
- TConfigItem::TPtr newItem = new TConfigItem(item);
- newItem->Kind = kind;
- newItems.push_back(newItem);
- } else {
- if (action.GetEnableAutoSplit()) {
- SplitConfigItem(item, newItems, ctx);
- if (newItems.empty()) {
+ "cannot add config item: new items should have empty id",
+ ctx);
+ return false;
+ }
+
+ if (!Self->IsSupportedMergeStrategy(item.GetMergeStrategy())) {
+ Error(Ydb::StatusIds::BAD_REQUEST,
+ TStringBuilder() << "unsupported merge strategy ("
+ << item.GetMergeStrategy() << ")",
+ ctx);
+ return false;
+ }
+
+ if (item.GetKind() == NKikimrConsole::TConfigItem::Auto) {
+ ui32 kind = DetectConfigItemKind(item);
+ if (kind) {
+ TConfigItem::TPtr newItem = new TConfigItem(item);
+ newItem->Kind = kind;
+ newItems.push_back(newItem);
+ } else {
+ if (action.GetEnableAutoSplit()) {
+ SplitConfigItem(item, newItems, ctx);
+ if (newItems.empty()) {
Error(Ydb::StatusIds::BAD_REQUEST,
- "cannot detect kind for new item with empty config",
- ctx);
- return false;
- }
- } else {
+ "cannot detect kind for new item with empty config",
+ ctx);
+ return false;
+ }
+ } else {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "cannot detect kind for config item"
- << " (auto split is disabled): " << item.ShortDebugString(),
- ctx);
- return false;
- }
- }
- } else {
- if (!IsConfigKindOk(item.GetConfig(), item.GetKind(), ctx))
- return false;
-
- newItems.push_back(new TConfigItem(item));
- }
-
- for (auto &newItem : newItems) {
- if (!Self->IsConfigItemScopeAllowed(newItem)) {
- Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "chosen usage scope for new item is disallowed: "
- << newItem->ToString(),
- ctx);
- return false;
- }
- }
-
- for (auto &newItem : newItems) {
- if (!newItem->UsageScope.Order)
- OrderingQueue.push_back(newItem);
- Self->PendingConfigModifications.AddedItems.push_back(newItem);
- }
-
- return true;
- }
-
- bool IsRemoveConfigItemActionOk(const NKikimrConsole::TRemoveConfigItem &action,
- const TActorContext &ctx)
- {
- TConfigItem::TPtr item = Self->ConfigIndex.GetItem(action.GetConfigItemId().GetId());
- if (!item) {
+ TStringBuilder() << "cannot detect kind for config item"
+ << " (auto split is disabled): " << item.ShortDebugString(),
+ ctx);
+ return false;
+ }
+ }
+ } else {
+ if (!IsConfigKindOk(item.GetConfig(), item.GetKind(), ctx))
+ return false;
+
+ newItems.push_back(new TConfigItem(item));
+ }
+
+ for (auto &newItem : newItems) {
+ if (!Self->IsConfigItemScopeAllowed(newItem)) {
+ Error(Ydb::StatusIds::BAD_REQUEST,
+ TStringBuilder() << "chosen usage scope for new item is disallowed: "
+ << newItem->ToString(),
+ ctx);
+ return false;
+ }
+ }
+
+ for (auto &newItem : newItems) {
+ if (!newItem->UsageScope.Order)
+ OrderingQueue.push_back(newItem);
+ Self->PendingConfigModifications.AddedItems.push_back(newItem);
+ }
+
+ return true;
+ }
+
+ bool IsRemoveConfigItemActionOk(const NKikimrConsole::TRemoveConfigItem &action,
+ const TActorContext &ctx)
+ {
+ TConfigItem::TPtr item = Self->ConfigIndex.GetItem(action.GetConfigItemId().GetId());
+ if (!item) {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "cannot remove unknown config item #" << action.GetConfigItemId().GetId(),
- ctx);
- return false;
- }
-
- if (!IsGenerationOk(item, action.GetConfigItemId().GetGeneration(), ctx))
- return false;
-
+ TStringBuilder() << "cannot remove unknown config item #" << action.GetConfigItemId().GetId(),
+ ctx);
+ return false;
+ }
+
+ if (!IsGenerationOk(item, action.GetConfigItemId().GetGeneration(), ctx))
+ return false;
+
if (Self->PendingConfigModifications.ModifiedItems.contains(item->Id)) {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "removal action for config item #"
- << item->Id << " conflicts with its modification",
- ctx);
- return false;
- }
-
- Self->PendingConfigModifications.RemovedItems.insert(item->Id);
-
- return true;
- }
-
- bool IsRemoveConfigItemsByCookieActionOk(const NKikimrConsole::TCookies &cookies,
- const TActorContext &/*ctx*/)
- {
- TConfigItems items;
- for (auto &cookie : cookies.GetCookies())
- Self->ConfigIndex.CollectItemsByCookie(cookie, THashSet<ui32>(), items);
- for (auto &item : items)
- Self->PendingConfigModifications.RemovedItems.insert(item->Id);
- return true;
- }
-
- bool IsRemoveConfigItemsActionOk(const NKikimrConsole::TRemoveConfigItems &action,
- const TActorContext &ctx)
- {
- switch (action.GetFilterCase()) {
- case NKikimrConsole::TRemoveConfigItems::kCookieFilter:
- return IsRemoveConfigItemsByCookieActionOk(action.GetCookieFilter(), ctx);
+ TStringBuilder() << "removal action for config item #"
+ << item->Id << " conflicts with its modification",
+ ctx);
+ return false;
+ }
+
+ Self->PendingConfigModifications.RemovedItems.insert(item->Id);
+
+ return true;
+ }
+
+ bool IsRemoveConfigItemsByCookieActionOk(const NKikimrConsole::TCookies &cookies,
+ const TActorContext &/*ctx*/)
+ {
+ TConfigItems items;
+ for (auto &cookie : cookies.GetCookies())
+ Self->ConfigIndex.CollectItemsByCookie(cookie, THashSet<ui32>(), items);
+ for (auto &item : items)
+ Self->PendingConfigModifications.RemovedItems.insert(item->Id);
+ return true;
+ }
+
+ bool IsRemoveConfigItemsActionOk(const NKikimrConsole::TRemoveConfigItems &action,
+ const TActorContext &ctx)
+ {
+ switch (action.GetFilterCase()) {
+ case NKikimrConsole::TRemoveConfigItems::kCookieFilter:
+ return IsRemoveConfigItemsByCookieActionOk(action.GetCookieFilter(), ctx);
case NKikimrConsole::TRemoveConfigItems::FILTER_NOT_SET:
- Error(Ydb::StatusIds::BAD_REQUEST, "empty filter in remove config items action", ctx);
- return false;
- default:
- Error(Ydb::StatusIds::BAD_REQUEST,
+ Error(Ydb::StatusIds::BAD_REQUEST, "empty filter in remove config items action", ctx);
+ return false;
+ default:
+ Error(Ydb::StatusIds::BAD_REQUEST,
Sprintf("unsupported filter in action (%s)", action.ShortDebugString().data()),
- ctx);
- return false;
- }
- }
-
- bool IsModifyConfigItemActionOk(const NKikimrConsole::TModifyConfigItem &action,
- const TActorContext &ctx)
- {
- auto &newItem = action.GetConfigItem();
- TConfigItem::TPtr item = Self->ConfigIndex.GetItem(newItem.GetId().GetId());
- if (!item) {
+ ctx);
+ return false;
+ }
+ }
+
+ bool IsModifyConfigItemActionOk(const NKikimrConsole::TModifyConfigItem &action,
+ const TActorContext &ctx)
+ {
+ auto &newItem = action.GetConfigItem();
+ TConfigItem::TPtr item = Self->ConfigIndex.GetItem(newItem.GetId().GetId());
+ if (!item) {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "cannot modify unknown config item #" << newItem.GetId().GetId(),
- ctx);
- return false;
- }
-
- if (!IsGenerationOk(item, newItem.GetId().GetGeneration(), ctx))
- return false;
-
- if (newItem.HasKind() && newItem.GetKind() != item->Kind) {
+ TStringBuilder() << "cannot modify unknown config item #" << newItem.GetId().GetId(),
+ ctx);
+ return false;
+ }
+
+ if (!IsGenerationOk(item, newItem.GetId().GetGeneration(), ctx))
+ return false;
+
+ if (newItem.HasKind() && newItem.GetKind() != item->Kind) {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "cannot modify kind for config item #" << item->Id,
- ctx);
- return false;
- }
-
- if (!Self->IsSupportedMergeStrategy(newItem.GetMergeStrategy())) {
- Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "unsupported merge strategy ("
- << newItem.GetMergeStrategy() << ")",
- ctx);
- return false;
- }
-
- if (!IsConfigKindOk(newItem.GetConfig(), newItem.GetKind(), ctx))
- return false;
-
+ TStringBuilder() << "cannot modify kind for config item #" << item->Id,
+ ctx);
+ return false;
+ }
+
+ if (!Self->IsSupportedMergeStrategy(newItem.GetMergeStrategy())) {
+ Error(Ydb::StatusIds::BAD_REQUEST,
+ TStringBuilder() << "unsupported merge strategy ("
+ << newItem.GetMergeStrategy() << ")",
+ ctx);
+ return false;
+ }
+
+ if (!IsConfigKindOk(newItem.GetConfig(), newItem.GetKind(), ctx))
+ return false;
+
if (Self->PendingConfigModifications.ModifiedItems.contains(item->Id)) {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "multiple modification actions for config item #"
- << item->Id << " are not allowed",
- ctx);
- return false;
+ TStringBuilder() << "multiple modification actions for config item #"
+ << item->Id << " are not allowed",
+ ctx);
+ return false;
} else if (Self->PendingConfigModifications.RemovedItems.contains(item->Id)) {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "modification action conflicts with removal action"
- " for config item #" << item->Id,
- ctx);
- return false;
- }
-
- TConfigItem::TPtr newItemPtr = new TConfigItem(newItem);
- if (!Self->IsConfigItemScopeAllowed(newItemPtr)) {
- Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "modified usage scope for item #" << item->Id
- << " is disallowed",
- ctx);
- return false;
- }
-
- if (!newItemPtr->UsageScope.Order)
- OrderingQueue.push_back(newItemPtr);
- Self->PendingConfigModifications.ModifiedItems.emplace(item->Id, newItemPtr);
-
- return true;
- }
-
- bool IsActionOk(const NKikimrConsole::TConfigureAction &action,
- const TActorContext &ctx)
- {
- switch (action.GetActionCase()) {
- case NKikimrConsole::TConfigureAction::kAddConfigItem:
- return IsAddConfigItemActionOk(action.GetAddConfigItem(), ctx);
- case NKikimrConsole::TConfigureAction::kRemoveConfigItem:
- return IsRemoveConfigItemActionOk(action.GetRemoveConfigItem(), ctx);
- case NKikimrConsole::TConfigureAction::kModifyConfigItem:
- return IsModifyConfigItemActionOk(action.GetModifyConfigItem(), ctx);
- case NKikimrConsole::TConfigureAction::kRemoveConfigItems:
- return IsRemoveConfigItemsActionOk(action.GetRemoveConfigItems(), ctx);
- case NKikimrConsole::TConfigureAction::ACTION_NOT_SET:
+ TStringBuilder() << "modification action conflicts with removal action"
+ " for config item #" << item->Id,
+ ctx);
+ return false;
+ }
+
+ TConfigItem::TPtr newItemPtr = new TConfigItem(newItem);
+ if (!Self->IsConfigItemScopeAllowed(newItemPtr)) {
+ Error(Ydb::StatusIds::BAD_REQUEST,
+ TStringBuilder() << "modified usage scope for item #" << item->Id
+ << " is disallowed",
+ ctx);
+ return false;
+ }
+
+ if (!newItemPtr->UsageScope.Order)
+ OrderingQueue.push_back(newItemPtr);
+ Self->PendingConfigModifications.ModifiedItems.emplace(item->Id, newItemPtr);
+
+ return true;
+ }
+
+ bool IsActionOk(const NKikimrConsole::TConfigureAction &action,
+ const TActorContext &ctx)
+ {
+ switch (action.GetActionCase()) {
+ case NKikimrConsole::TConfigureAction::kAddConfigItem:
+ return IsAddConfigItemActionOk(action.GetAddConfigItem(), ctx);
+ case NKikimrConsole::TConfigureAction::kRemoveConfigItem:
+ return IsRemoveConfigItemActionOk(action.GetRemoveConfigItem(), ctx);
+ case NKikimrConsole::TConfigureAction::kModifyConfigItem:
+ return IsModifyConfigItemActionOk(action.GetModifyConfigItem(), ctx);
+ case NKikimrConsole::TConfigureAction::kRemoveConfigItems:
+ return IsRemoveConfigItemsActionOk(action.GetRemoveConfigItems(), ctx);
+ case NKikimrConsole::TConfigureAction::ACTION_NOT_SET:
Error(Ydb::StatusIds::BAD_REQUEST, "empty action", ctx);
- return false;
- default:
+ return false;
+ default:
Error(Ydb::StatusIds::BAD_REQUEST,
Sprintf("unsupported configure action (%s)", action.ShortDebugString().data()),
- ctx);
- return false;
- }
- }
-
- TString ItemName(TConfigItem::TPtr item)
- {
- if (item->Id)
- return Sprintf("modified config item #%" PRIu64, item->Id);
- return "added config item";
- }
-
- bool CheckItemOrderConflict(TConfigItem::TPtr item,
- TConfigItemsMap &newItems,
- const TActorContext &ctx)
- {
- TConfigItems conflicts;
- Self->ConfigIndex.CollectItemsByConflictingScope(item->UsageScope, {item->Kind}, false, conflicts);
- for (auto &conflictItem : conflicts) {
+ ctx);
+ return false;
+ }
+ }
+
+ TString ItemName(TConfigItem::TPtr item)
+ {
+ if (item->Id)
+ return Sprintf("modified config item #%" PRIu64, item->Id);
+ return "added config item";
+ }
+
+ bool CheckItemOrderConflict(TConfigItem::TPtr item,
+ TConfigItemsMap &newItems,
+ const TActorContext &ctx)
+ {
+ TConfigItems conflicts;
+ Self->ConfigIndex.CollectItemsByConflictingScope(item->UsageScope, {item->Kind}, false, conflicts);
+ for (auto &conflictItem : conflicts) {
if (!Self->PendingConfigModifications.ModifiedItems.contains(conflictItem->Id)
&& !Self->PendingConfigModifications.RemovedItems.contains(conflictItem->Id)) {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << ItemName(item) << " (scope: " << item->UsageScope.ToString()
- << ") has order conflict with config item #" << conflictItem->Id
- << " (scope: " << conflictItem->UsageScope.ToString() << ")",
- ctx);
- return false;
- }
- }
-
- for (auto &conflictItem : newItems[item->Kind]) {
- if (!conflictItem->UsageScope.HasConflict(item->UsageScope))
- continue;
-
- if (!conflictItem->Id && !item->Id)
+ TStringBuilder() << ItemName(item) << " (scope: " << item->UsageScope.ToString()
+ << ") has order conflict with config item #" << conflictItem->Id
+ << " (scope: " << conflictItem->UsageScope.ToString() << ")",
+ ctx);
+ return false;
+ }
+ }
+
+ for (auto &conflictItem : newItems[item->Kind]) {
+ if (!conflictItem->UsageScope.HasConflict(item->UsageScope))
+ continue;
+
+ if (!conflictItem->Id && !item->Id)
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "two added items conflict by order (scope1: "
- << item->UsageScope.ToString() << " scope2: "
- << conflictItem->UsageScope.ToString() << ")",
- ctx);
- else
+ TStringBuilder() << "two added items conflict by order (scope1: "
+ << item->UsageScope.ToString() << " scope2: "
+ << conflictItem->UsageScope.ToString() << ")",
+ ctx);
+ else
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << ItemName(item) << " (scope: " << item->UsageScope.ToString()
- << ") has order conflict with " << ItemName(conflictItem) << " (scope: "
- << conflictItem->UsageScope.ToString() << ")",
- ctx);
- return false;
- }
-
- newItems[item->Kind].insert(item);
- return true;
- }
-
- bool DefineItemOrder(TConfigItem::TPtr item, const TActorContext &ctx)
- {
- Y_VERIFY(!item->UsageScope.Order);
-
- TConfigItems conflicts;
- Self->ConfigIndex.CollectItemsByConflictingScope(item->UsageScope, {item->Kind}, true, conflicts);
- ui32 maxOrder = 0;
- for (auto &conflictItem : conflicts) {
+ TStringBuilder() << ItemName(item) << " (scope: " << item->UsageScope.ToString()
+ << ") has order conflict with " << ItemName(conflictItem) << " (scope: "
+ << conflictItem->UsageScope.ToString() << ")",
+ ctx);
+ return false;
+ }
+
+ newItems[item->Kind].insert(item);
+ return true;
+ }
+
+ bool DefineItemOrder(TConfigItem::TPtr item, const TActorContext &ctx)
+ {
+ Y_VERIFY(!item->UsageScope.Order);
+
+ TConfigItems conflicts;
+ Self->ConfigIndex.CollectItemsByConflictingScope(item->UsageScope, {item->Kind}, true, conflicts);
+ ui32 maxOrder = 0;
+ for (auto &conflictItem : conflicts) {
if (!Self->PendingConfigModifications.ModifiedItems.contains(conflictItem->Id)
&& !Self->PendingConfigModifications.RemovedItems.contains(conflictItem->Id))
- maxOrder = Max(maxOrder, conflictItem->UsageScope.Order);
- }
-
- for (auto &conflictItem : Self->PendingConfigModifications.AddedItems)
- if (conflictItem->UsageScope.Order
- && conflictItem->Kind == item->Kind
- && conflictItem->UsageScope.HasConflict(item->UsageScope, true))
- maxOrder = Max(maxOrder, conflictItem->UsageScope.Order);
-
- for (auto &pr : Self->PendingConfigModifications.ModifiedItems)
- if (pr.second->UsageScope.Order
- && pr.second->Kind == item->Kind
- && pr.second->UsageScope.HasConflict(item->UsageScope, true))
- maxOrder = Max(maxOrder, pr.second->UsageScope.Order);
-
- if (maxOrder == Max<ui32>()) {
+ maxOrder = Max(maxOrder, conflictItem->UsageScope.Order);
+ }
+
+ for (auto &conflictItem : Self->PendingConfigModifications.AddedItems)
+ if (conflictItem->UsageScope.Order
+ && conflictItem->Kind == item->Kind
+ && conflictItem->UsageScope.HasConflict(item->UsageScope, true))
+ maxOrder = Max(maxOrder, conflictItem->UsageScope.Order);
+
+ for (auto &pr : Self->PendingConfigModifications.ModifiedItems)
+ if (pr.second->UsageScope.Order
+ && pr.second->Kind == item->Kind
+ && pr.second->UsageScope.HasConflict(item->UsageScope, true))
+ maxOrder = Max(maxOrder, pr.second->UsageScope.Order);
+
+ if (maxOrder == Max<ui32>()) {
Error(Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "Cannot auto order " << ItemName(item) << " (scope: "
- << item->UsageScope.ToString() << " because max order value is used"
- " by one of intersecting usage scopes.",
- ctx);
- return false;
- }
-
- if (maxOrder <= (Max<ui32>() - 10))
- item->UsageScope.Order = maxOrder + 10;
- else
- item->UsageScope.Order = maxOrder + 1;
-
- return true;
- }
-
+ TStringBuilder() << "Cannot auto order " << ItemName(item) << " (scope: "
+ << item->UsageScope.ToString() << " because max order value is used"
+ " by one of intersecting usage scopes.",
+ ctx);
+ return false;
+ }
+
+ if (maxOrder <= (Max<ui32>() - 10))
+ item->UsageScope.Order = maxOrder + 10;
+ else
+ item->UsageScope.Order = maxOrder + 1;
+
+ return true;
+ }
+
TDynBitMap GetAffectedKinds(const ::google::protobuf::RepeatedPtrField<NKikimrConsole::TConfigureAction>& actions) {
TDynBitMap kinds;
@@ -424,146 +424,146 @@ public:
return kinds;
}
- bool ProcessAutoOrdering(const TActorContext &ctx)
- {
- for (auto &item : OrderingQueue)
- if (!DefineItemOrder(item, ctx))
- return false;
-
- OrderingQueue.clear();
-
- return true;
- }
-
- bool CheckOrderConflicts(const TActorContext &ctx)
- {
- TConfigItemsMap newItems;
-
- for (auto item : Self->PendingConfigModifications.AddedItems)
- if (!CheckItemOrderConflict(item, newItems, ctx))
- return false;
-
- for (auto &pr : Self->PendingConfigModifications.ModifiedItems)
- if (!CheckItemOrderConflict(pr.second, newItems, ctx))
- return false;
-
- return true;
- }
-
- bool Execute(TTransactionContext &txc,
- const TActorContext &ctx) override
- {
- TString error;
- auto &rec = Request->Get()->Record;
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxConfigure: " << rec.ShortDebugString());
-
- Y_VERIFY(Self->PendingConfigModifications.IsEmpty());
-
- Response = new TEvConsole::TEvConfigureResponse;
-
- if (!rec.ActionsSize())
+ bool ProcessAutoOrdering(const TActorContext &ctx)
+ {
+ for (auto &item : OrderingQueue)
+ if (!DefineItemOrder(item, ctx))
+ return false;
+
+ OrderingQueue.clear();
+
+ return true;
+ }
+
+ bool CheckOrderConflicts(const TActorContext &ctx)
+ {
+ TConfigItemsMap newItems;
+
+ for (auto item : Self->PendingConfigModifications.AddedItems)
+ if (!CheckItemOrderConflict(item, newItems, ctx))
+ return false;
+
+ for (auto &pr : Self->PendingConfigModifications.ModifiedItems)
+ if (!CheckItemOrderConflict(pr.second, newItems, ctx))
+ return false;
+
+ return true;
+ }
+
+ bool Execute(TTransactionContext &txc,
+ const TActorContext &ctx) override
+ {
+ TString error;
+ auto &rec = Request->Get()->Record;
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxConfigure: " << rec.ShortDebugString());
+
+ Y_VERIFY(Self->PendingConfigModifications.IsEmpty());
+
+ Response = new TEvConsole::TEvConfigureResponse;
+
+ if (!rec.ActionsSize())
return Error(Ydb::StatusIds::BAD_REQUEST,
- "no actions specified", ctx);
-
- for (auto &action : rec.GetActions()) {
- if (!IsActionOk(action, ctx))
- return true;
- }
-
- if (!ProcessAutoOrdering(ctx))
- return true;
-
- if (!CheckOrderConflicts(ctx))
- return true;
-
- TModificationsValidator validator(Self->ConfigIndex,
- Self->PendingConfigModifications,
- Self->Config);
- if (!validator.ApplyValidators())
- return Error(Ydb::StatusIds::BAD_REQUEST,
- validator.GetErrorMessage(), ctx);
-
- // Now configure command is known to be OK and we start to apply it.
+ "no actions specified", ctx);
+
+ for (auto &action : rec.GetActions()) {
+ if (!IsActionOk(action, ctx))
+ return true;
+ }
+
+ if (!ProcessAutoOrdering(ctx))
+ return true;
+
+ if (!CheckOrderConflicts(ctx))
+ return true;
+
+ TModificationsValidator validator(Self->ConfigIndex,
+ Self->PendingConfigModifications,
+ Self->Config);
+ if (!validator.ApplyValidators())
+ return Error(Ydb::StatusIds::BAD_REQUEST,
+ validator.GetErrorMessage(), ctx);
+
+ // Now configure command is known to be OK and we start to apply it.
Response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- // Fill affected configs.
- TConfigsConfig config(Self->Config);
- config.ValidationLevel = NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES;
- TModificationsValidator affectedChecker(Self->ConfigIndex,
- Self->PendingConfigModifications,
- config);
+
+ // Fill affected configs.
+ TConfigsConfig config(Self->Config);
+ config.ValidationLevel = NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES;
+ TModificationsValidator affectedChecker(Self->ConfigIndex,
+ Self->PendingConfigModifications,
+ config);
auto affected = affectedChecker.ComputeAffectedConfigs(GetAffectedKinds(rec.GetActions()), false);
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "affected.size() = " << affected.size());
- for (auto &item : affected) {
- auto &entry = *Response->Record.AddAffectedConfigs();
- entry.SetTenant(item.Tenant);
- entry.SetNodeType(item.NodeType);
-
- if (rec.GetFillAffectedConfigs())
- affectedChecker.BuildConfigs(TDynBitMap(),
- item.Tenant,
- item.NodeType,
- *entry.MutableOldConfig(),
- *entry.MutableNewConfig());
- }
-
- // Dry run stops here. Further processing modifies internal state.
- if (rec.GetDryRun()) {
- Self->PendingConfigModifications.Clear();
- return true;
- }
-
- // Assign ids to new items.
- for (auto item : Self->PendingConfigModifications.AddedItems) {
- item->Id = Self->NextConfigItemId++;
- item->Generation = 1;
- Response->Record.AddAddedItemIds(item->Id);
- }
-
- // Increment generation for modified items.
- for (auto &pr : Self->PendingConfigModifications.ModifiedItems)
- ++pr.second->Generation;
-
- // Update database.
- Self->DbApplyPendingConfigModifications(txc, ctx);
- Self->DbUpdateNextConfigItemId(txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxConfigure Complete");
-
- Y_VERIFY(Response);
-
- if (!Self->PendingConfigModifications.IsEmpty()) {
- TAutoPtr<IEventHandle> ev = new IEventHandle(Request->Sender,
- Self->SelfId(),
- Response.Release(), 0,
- Request->Cookie);
- Self->ApplyPendingConfigModifications(ctx, ev);
- } else {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvConfigureResponse: " << Response->Record.ShortDebugString());
- ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TEvConsole::TEvConfigureRequest::TPtr Request;
- TAutoPtr<TEvConsole::TEvConfigureResponse> Response;
- TVector<TConfigItem::TPtr> OrderingQueue;
-};
-
-ITransaction *TConfigsManager::CreateTxConfigure(TEvConsole::TEvConfigureRequest::TPtr &ev)
-{
- return new TTxConfigure(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "affected.size() = " << affected.size());
+ for (auto &item : affected) {
+ auto &entry = *Response->Record.AddAffectedConfigs();
+ entry.SetTenant(item.Tenant);
+ entry.SetNodeType(item.NodeType);
+
+ if (rec.GetFillAffectedConfigs())
+ affectedChecker.BuildConfigs(TDynBitMap(),
+ item.Tenant,
+ item.NodeType,
+ *entry.MutableOldConfig(),
+ *entry.MutableNewConfig());
+ }
+
+ // Dry run stops here. Further processing modifies internal state.
+ if (rec.GetDryRun()) {
+ Self->PendingConfigModifications.Clear();
+ return true;
+ }
+
+ // Assign ids to new items.
+ for (auto item : Self->PendingConfigModifications.AddedItems) {
+ item->Id = Self->NextConfigItemId++;
+ item->Generation = 1;
+ Response->Record.AddAddedItemIds(item->Id);
+ }
+
+ // Increment generation for modified items.
+ for (auto &pr : Self->PendingConfigModifications.ModifiedItems)
+ ++pr.second->Generation;
+
+ // Update database.
+ Self->DbApplyPendingConfigModifications(txc, ctx);
+ Self->DbUpdateNextConfigItemId(txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxConfigure Complete");
+
+ Y_VERIFY(Response);
+
+ if (!Self->PendingConfigModifications.IsEmpty()) {
+ TAutoPtr<IEventHandle> ev = new IEventHandle(Request->Sender,
+ Self->SelfId(),
+ Response.Release(), 0,
+ Request->Cookie);
+ Self->ApplyPendingConfigModifications(ctx, ev);
+ } else {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvConfigureResponse: " << Response->Record.ShortDebugString());
+ ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvConsole::TEvConfigureRequest::TPtr Request;
+ TAutoPtr<TEvConsole::TEvConfigureResponse> Response;
+ TVector<TConfigItem::TPtr> OrderingQueue;
+};
+
+ITransaction *TConfigsManager::CreateTxConfigure(TEvConsole::TEvConfigureRequest::TPtr &ev)
+{
+ return new TTxConfigure(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__create_tenant.cpp b/ydb/core/cms/console/console__create_tenant.cpp
index cb53cc56202..77d8166d547 100644
--- a/ydb/core/cms/console/console__create_tenant.cpp
+++ b/ydb/core/cms/console/console__create_tenant.cpp
@@ -1,11 +1,11 @@
-#include "console_tenants_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
+#include "console_tenants_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
using namespace NOperationId;
-
-class TTenantsManager::TTxCreateTenant : public TTransactionBase<TTenantsManager> {
+
+class TTenantsManager::TTxCreateTenant : public TTransactionBase<TTenantsManager> {
static const Ydb::Cms::Resources& GetResources(const Ydb::Cms::CreateDatabaseRequest& request) {
switch (request.resources_kind_case()) {
case Ydb::Cms::CreateDatabaseRequest::kResources:
@@ -17,31 +17,31 @@ class TTenantsManager::TTxCreateTenant : public TTransactionBase<TTenantsManager
}
}
-public:
- TTxCreateTenant(TEvConsole::TEvCreateTenantRequest::TPtr ev, TTenantsManager *self)
- : TBase(self)
- , Path(CanonizePath(ev->Get()->Record.GetRequest().path()))
- , Request(std::move(ev))
- {
- }
-
+public:
+ TTxCreateTenant(TEvConsole::TEvCreateTenantRequest::TPtr ev, TTenantsManager *self)
+ : TBase(self)
+ , Path(CanonizePath(ev->Get()->Record.GetRequest().path()))
+ , Request(std::move(ev))
+ {
+ }
+
bool Error(Ydb::StatusIds::StatusCode code, const TString &error,
- const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "Cannot create tenant: " << error);
-
- auto &operation = *Response->Record.MutableResponse()->mutable_operation();
- operation.set_ready(true);
- operation.set_status(code);
- auto issue = operation.add_issues();
+ const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "Cannot create tenant: " << error);
+
+ auto &operation = *Response->Record.MutableResponse()->mutable_operation();
+ operation.set_ready(true);
+ operation.set_status(code);
+ auto issue = operation.add_issues();
issue->set_severity(NYql::TSeverityIds::S_ERROR);
issue->set_message(error);
-
- Tenant = nullptr;
-
- return true;
- }
-
+
+ Tenant = nullptr;
+
+ return true;
+ }
+
bool Pending(const TTenant::TPtr& tenant) {
Ydb::TOperationId id = Self->MakeOperationId(tenant, TTenant::CREATE);
auto &operation = *Response->Record.MutableResponse()->mutable_operation();
@@ -58,27 +58,27 @@ public:
return true;
}
- bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
+ bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
Ydb::StatusIds::StatusCode code;
- TString error;
-
- auto &rec = Request->Get()->Record.GetRequest();
- auto &token = Request->Get()->Record.GetUserToken();
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "TTxCreateTenant: "
- << Request->Get()->Record.ShortDebugString());
-
- Response = new TEvConsole::TEvCreateTenantResponse;
-
- if (!Self->CheckAccess(token, code, error, ctx))
- return Error(code, error, ctx);
-
- auto path = rec.path();
- if (!CheckDbPath(path, Self->Domain->Name, error))
- return Error(Ydb::StatusIds::BAD_REQUEST, error, ctx);
- path = CanonizePath(path);
-
+ TString error;
+
+ auto &rec = Request->Get()->Record.GetRequest();
+ auto &token = Request->Get()->Record.GetUserToken();
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "TTxCreateTenant: "
+ << Request->Get()->Record.ShortDebugString());
+
+ Response = new TEvConsole::TEvCreateTenantResponse;
+
+ if (!Self->CheckAccess(token, code, error, ctx))
+ return Error(code, error, ctx);
+
+ auto path = rec.path();
+ if (!CheckDbPath(path, Self->Domain->Name, error))
+ return Error(Ydb::StatusIds::BAD_REQUEST, error, ctx);
+ path = CanonizePath(path);
+
if (auto tenant = Self->GetTenant(path)) {
if (rec.idempotency_key() && tenant->CreateIdempotencyKey == rec.idempotency_key()) {
return Pending(tenant);
@@ -90,7 +90,7 @@ public:
Sprintf("Database '%s' already exists", path.data()), ctx);
}
}
-
+
if (auto it = Self->RemovedTenants.find(path); it != Self->RemovedTenants.end()) {
if (rec.idempotency_key() && it->second.CreateIdempotencyKey == rec.idempotency_key()) {
return Pending(path, it->second.TxId);
@@ -107,22 +107,22 @@ public:
"Tenants quota is exceeded", ctx);
}
- // Check attributes.
- THashSet<TString> attrNames;
+ // Check attributes.
+ THashSet<TString> attrNames;
for (const auto& [key, value] : rec.attributes()) {
if (!key)
- return Error(Ydb::StatusIds::BAD_REQUEST,
- "Attribute name shouldn't be empty", ctx);
+ return Error(Ydb::StatusIds::BAD_REQUEST,
+ "Attribute name shouldn't be empty", ctx);
if (!value)
- return Error(Ydb::StatusIds::BAD_REQUEST,
- "Attribute value shouldn't be empty", ctx);
+ return Error(Ydb::StatusIds::BAD_REQUEST,
+ "Attribute value shouldn't be empty", ctx);
if (attrNames.contains(key))
- return Error(Ydb::StatusIds::BAD_REQUEST,
+ return Error(Ydb::StatusIds::BAD_REQUEST,
Sprintf("Multiple attributes with name '%s'", key.data()), ctx);
attrNames.insert(key);
- }
-
- Tenant = new TTenant(path, TTenant::CREATING_POOLS, token);
+ }
+
+ Tenant = new TTenant(path, TTenant::CREATING_POOLS, token);
Tenant->IsExternalSubdomain = Self->FeatureFlags.GetEnableExternalSubdomains();
Tenant->IsExternalHive = Self->FeatureFlags.GetEnableExternalHive();
@@ -136,39 +136,39 @@ public:
Tenant->PlanResolution = rec.options().plan_resolution();
}
- if (rec.options().disable_tx_service()) {
- Tenant->Coordinators = 0;
- Tenant->Mediators = 0;
- Tenant->PlanResolution = 0;
- Tenant->TimeCastBucketsPerMediator = 0;
+ if (rec.options().disable_tx_service()) {
+ Tenant->Coordinators = 0;
+ Tenant->Mediators = 0;
+ Tenant->PlanResolution = 0;
+ Tenant->TimeCastBucketsPerMediator = 0;
Tenant->IsExternalSubdomain = false;
Tenant->IsExternalHive = false;
Tenant->IsExternalSysViewProcessor = false;
- }
+ }
Tenant->IsExternalHive &= Tenant->IsExternalSubdomain; // external hive without external sub domain is pointless
Tenant->IsExternalSysViewProcessor &= Tenant->IsExternalSubdomain;
- Tenant->StorageUnitsQuota = Self->Config.DefaultStorageUnitsQuota;
- Tenant->ComputationalUnitsQuota = Self->Config.DefaultComputationalUnitsQuota;
+ Tenant->StorageUnitsQuota = Self->Config.DefaultStorageUnitsQuota;
+ Tenant->ComputationalUnitsQuota = Self->Config.DefaultComputationalUnitsQuota;
for (const auto& [key, value] : rec.attributes()) {
- auto &r = *Tenant->Attributes.AddUserAttributes();
+ auto &r = *Tenant->Attributes.AddUserAttributes();
r.SetKey(key);
r.SetValue(value);
- }
-
+ }
+
switch (rec.resources_kind_case()) {
case Ydb::Cms::CreateDatabaseRequest::kSharedResources:
if (rec.options().disable_tx_service()) {
return Error(Ydb::StatusIds::BAD_REQUEST,
"Cannot create shared database with no tx service enabled", ctx);
}
-
+
Tenant->AreResourcesShared = true;
// fallthrough to normal resources handling
[[fallthrough]];
-
+
case Ydb::Cms::CreateDatabaseRequest::kResources:
for (auto &unit : GetResources(rec).storage_units()) {
auto &kind = unit.unit_kind();
@@ -186,17 +186,17 @@ public:
TStoragePool::TPtr pool = new TStoragePool(poolName, kind, size, config);
Tenant->StoragePools.emplace(std::make_pair(kind, pool));
}
- }
-
+ }
+
if (Tenant->StoragePools.empty())
return Error(Ydb::StatusIds::BAD_REQUEST,
"No storage units specified.", ctx);
-
+
for (auto &unit : GetResources(rec).computational_units()) {
auto &kind = unit.unit_kind();
auto &zone = unit.availability_zone();
ui64 count = unit.count();
-
+
if (!Self->MakeBasicComputationalUnitCheck(kind, zone, code, error))
return Error(code, error, ctx);
@@ -205,21 +205,21 @@ public:
// Check tenant quotas.
if (!Tenant->CheckQuota(code, error))
- return Error(code, error, ctx);
-
+ return Error(code, error, ctx);
+
// Check cluster quotas.
if (!Self->CheckComputationalUnitsQuota(Tenant->ComputationalUnits, code, error))
return Error(code, error, ctx);
-
+
Tenant->ParseComputationalUnits(Self->Config);
break;
-
+
case Ydb::Cms::CreateDatabaseRequest::kServerlessResources:
if (!Tenant->IsExternalSubdomain) {
return Error(Ydb::StatusIds::PRECONDITION_FAILED,
"Cannot create serverless database unless external subdomain is enabled", ctx);
}
-
+
if (rec.options().disable_tx_service()) {
return Error(Ydb::StatusIds::BAD_REQUEST,
"Cannot create serverless database with no tx service enabled", ctx);
@@ -275,50 +275,50 @@ public:
Tenant->CreateIdempotencyKey = rec.idempotency_key();
}
- Tenant->TxId = ctx.Now().GetValue();
- Tenant->Generation = 1;
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "Add tenant " << path << " (txid = " << Tenant->TxId << ")");
-
- Self->DbAddTenant(Tenant, txc, ctx);
-
+ Tenant->TxId = ctx.Now().GetValue();
+ Tenant->Generation = 1;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Add tenant " << path << " (txid = " << Tenant->TxId << ")");
+
+ Self->DbAddTenant(Tenant, txc, ctx);
+
return Pending(Tenant);
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "TTxCreateTenant Complete");
-
- Y_VERIFY(Response);
-
- if (Response->Record.GetResponse().operation().status())
- Self->Counters.Inc(Response->Record.GetResponse().operation().status(),
- COUNTER_CREATE_RESPONSES);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS, "Send: " << Response->ToString());
- ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
-
- if (Tenant) {
- Self->AddTenant(Tenant);
- Self->ProcessTenantActions(Tenant, ctx);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TString Path;
- TEvConsole::TEvCreateTenantRequest::TPtr Request;
- TAutoPtr<TEvConsole::TEvCreateTenantResponse> Response;
- TTenant::TPtr Tenant;
-};
-
-ITransaction *TTenantsManager::CreateTxCreateTenant(TEvConsole::TEvCreateTenantRequest::TPtr &ev)
-{
- return new TTxCreateTenant(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "TTxCreateTenant Complete");
+
+ Y_VERIFY(Response);
+
+ if (Response->Record.GetResponse().operation().status())
+ Self->Counters.Inc(Response->Record.GetResponse().operation().status(),
+ COUNTER_CREATE_RESPONSES);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS, "Send: " << Response->ToString());
+ ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
+
+ if (Tenant) {
+ Self->AddTenant(Tenant);
+ Self->ProcessTenantActions(Tenant, ctx);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TString Path;
+ TEvConsole::TEvCreateTenantRequest::TPtr Request;
+ TAutoPtr<TEvConsole::TEvCreateTenantResponse> Response;
+ TTenant::TPtr Tenant;
+};
+
+ITransaction *TTenantsManager::CreateTxCreateTenant(TEvConsole::TEvCreateTenantRequest::TPtr &ev)
+{
+ return new TTxCreateTenant(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__init_scheme.cpp b/ydb/core/cms/console/console__init_scheme.cpp
index da41f35c21e..2ed31127b11 100644
--- a/ydb/core/cms/console/console__init_scheme.cpp
+++ b/ydb/core/cms/console/console__init_scheme.cpp
@@ -1,37 +1,37 @@
-#include "console_impl.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConsole::TTxInitScheme : public TTransactionBase<TConsole> {
-public:
- TTxInitScheme(TConsole *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::TTxInitScheme Execute");
-
- NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::TTxInitScheme Complete");
-
- Self->TxProcessor->ProcessTx(Self->CreateTxLoadState(), ctx);
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-};
-
-ITransaction *TConsole::CreateTxInitScheme()
-{
- return new TTxInitScheme(this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+#include "console_impl.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConsole::TTxInitScheme : public TTransactionBase<TConsole> {
+public:
+ TTxInitScheme(TConsole *self)
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::TTxInitScheme Execute");
+
+ NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::TTxInitScheme Complete");
+
+ Self->TxProcessor->ProcessTx(Self->CreateTxLoadState(), ctx);
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+};
+
+ITransaction *TConsole::CreateTxInitScheme()
+{
+ return new TTxInitScheme(this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__load_state.cpp b/ydb/core/cms/console/console__load_state.cpp
index 9c48822ecf6..05c05910067 100644
--- a/ydb/core/cms/console/console__load_state.cpp
+++ b/ydb/core/cms/console/console__load_state.cpp
@@ -1,87 +1,87 @@
-#include "console_configs_manager.h"
-#include "console_impl.h"
-#include "console_tenants_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConsole::TTxLoadState : public TTransactionBase<TConsole> {
-public:
- TTxLoadState(TConsole *self)
- : TBase(self)
- {
- }
-
- template <typename T>
- bool IsReady(T &t)
- {
- return t.IsReady();
- }
-
- template <typename T, typename ...Ts>
- bool IsReady(T &t, Ts &...args)
- {
- return t.IsReady() && IsReady(args...);
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::TTxLoadState Execute");
-
- NIceDb::TNiceDb db(txc.DB);
- auto configRow = db.Table<Schema::Config>().Key(ConfigKeyConfig).Select<Schema::Config::Value>();
-
- if (!db.Precharge<Schema>())
- return false;
-
- Self->ClearState();
-
- if (!configRow.IsReady())
- return false;
-
- if (configRow.IsValid()) {
- auto configString = configRow.GetValue<Schema::Config::Value>();
- NKikimrConsole::TConfig config;
+#include "console_configs_manager.h"
+#include "console_impl.h"
+#include "console_tenants_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConsole::TTxLoadState : public TTransactionBase<TConsole> {
+public:
+ TTxLoadState(TConsole *self)
+ : TBase(self)
+ {
+ }
+
+ template <typename T>
+ bool IsReady(T &t)
+ {
+ return t.IsReady();
+ }
+
+ template <typename T, typename ...Ts>
+ bool IsReady(T &t, Ts &...args)
+ {
+ return t.IsReady() && IsReady(args...);
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::TTxLoadState Execute");
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto configRow = db.Table<Schema::Config>().Key(ConfigKeyConfig).Select<Schema::Config::Value>();
+
+ if (!db.Precharge<Schema>())
+ return false;
+
+ Self->ClearState();
+
+ if (!configRow.IsReady())
+ return false;
+
+ if (configRow.IsValid()) {
+ auto configString = configRow.GetValue<Schema::Config::Value>();
+ NKikimrConsole::TConfig config;
Y_PROTOBUF_SUPPRESS_NODISCARD config.ParseFromArray(configString.data(), configString.size());
- Self->LoadConfigFromProto(config);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "Loaded config:" << Endl << config.DebugString());
- } else {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "Using default config.");
-
- Self->LoadConfigFromProto(NKikimrConsole::TConfig());
- }
-
- if (!Self->TenantsManager->DbLoadState(txc, ctx))
- return false;
-
- if (!Self->ConfigsManager->DbLoadState(txc, ctx))
- return false;
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::TTxLoadState Complete");
-
- Self->Become(&TConsole::StateWork);
-
- ctx.Send(Self->TenantsManager->SelfId(), new TTenantsManager::TEvPrivate::TEvStateLoaded);
- ctx.Send(Self->ConfigsManager->SelfId(), new TConfigsManager::TEvPrivate::TEvStateLoaded);
- Self->ProcessEnqueuedEvents(ctx);
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
-};
-
-ITransaction *TConsole::CreateTxLoadState()
-{
- return new TTxLoadState(this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ Self->LoadConfigFromProto(config);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "Loaded config:" << Endl << config.DebugString());
+ } else {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "Using default config.");
+
+ Self->LoadConfigFromProto(NKikimrConsole::TConfig());
+ }
+
+ if (!Self->TenantsManager->DbLoadState(txc, ctx))
+ return false;
+
+ if (!Self->ConfigsManager->DbLoadState(txc, ctx))
+ return false;
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::TTxLoadState Complete");
+
+ Self->Become(&TConsole::StateWork);
+
+ ctx.Send(Self->TenantsManager->SelfId(), new TTenantsManager::TEvPrivate::TEvStateLoaded);
+ ctx.Send(Self->ConfigsManager->SelfId(), new TConfigsManager::TEvPrivate::TEvStateLoaded);
+ Self->ProcessEnqueuedEvents(ctx);
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+};
+
+ITransaction *TConsole::CreateTxLoadState()
+{
+ return new TTxLoadState(this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__remove_computational_units.cpp b/ydb/core/cms/console/console__remove_computational_units.cpp
index f74d57b6963..699c1b5c2af 100644
--- a/ydb/core/cms/console/console__remove_computational_units.cpp
+++ b/ydb/core/cms/console/console__remove_computational_units.cpp
@@ -1,60 +1,60 @@
-#include "console_tenants_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
+#include "console_tenants_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
using namespace NOperationId;
-
-class TTenantsManager::TTxRemoveComputationalUnits : public TTransactionBase<TTenantsManager> {
-public:
- TTxRemoveComputationalUnits(TTenant::TPtr tenant, TTenantsManager *self)
- : TBase(self)
- , Tenant(tenant)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxRemoveComputationalUnits Execute " << Tenant->Path);
-
- Y_VERIFY(Tenant->State == TTenant::REMOVING_SUBDOMAIN);
-
- Self->DbUpdateTenantState(Tenant, TTenant::REMOVING_UNITS, txc, ctx);
- Self->DbRemoveComputationalUnits(Tenant, txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxRemoveComputationalUnits Complete " << Tenant->Path);
-
- Self->SlotStats.DeallocateSlots(Tenant->Slots);
- Self->Counters.RemoveUnits(Tenant->ComputationalUnits);
- for (auto &pr : Tenant->RegisteredComputationalUnits)
- Self->Counters.Dec(pr.second.Kind, COUNTER_REGISTERED_UNITS);
-
- Tenant->State = TTenant::REMOVING_UNITS;
- Tenant->RemoveComputationalUnits();
-
- Self->ProcessTenantActions(Tenant, ctx);
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TTenant::TPtr Tenant;
-};
-
-ITransaction *TTenantsManager::CreateTxRemoveComputationalUnits(TTenant::TPtr tenant)
-{
- return new TTxRemoveComputationalUnits(tenant, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+
+class TTenantsManager::TTxRemoveComputationalUnits : public TTransactionBase<TTenantsManager> {
+public:
+ TTxRemoveComputationalUnits(TTenant::TPtr tenant, TTenantsManager *self)
+ : TBase(self)
+ , Tenant(tenant)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxRemoveComputationalUnits Execute " << Tenant->Path);
+
+ Y_VERIFY(Tenant->State == TTenant::REMOVING_SUBDOMAIN);
+
+ Self->DbUpdateTenantState(Tenant, TTenant::REMOVING_UNITS, txc, ctx);
+ Self->DbRemoveComputationalUnits(Tenant, txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxRemoveComputationalUnits Complete " << Tenant->Path);
+
+ Self->SlotStats.DeallocateSlots(Tenant->Slots);
+ Self->Counters.RemoveUnits(Tenant->ComputationalUnits);
+ for (auto &pr : Tenant->RegisteredComputationalUnits)
+ Self->Counters.Dec(pr.second.Kind, COUNTER_REGISTERED_UNITS);
+
+ Tenant->State = TTenant::REMOVING_UNITS;
+ Tenant->RemoveComputationalUnits();
+
+ Self->ProcessTenantActions(Tenant, ctx);
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TTenant::TPtr Tenant;
+};
+
+ITransaction *TTenantsManager::CreateTxRemoveComputationalUnits(TTenant::TPtr tenant)
+{
+ return new TTxRemoveComputationalUnits(tenant, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__remove_config_subscription.cpp b/ydb/core/cms/console/console__remove_config_subscription.cpp
index 59a633f76ca..ae24deb1a87 100644
--- a/ydb/core/cms/console/console__remove_config_subscription.cpp
+++ b/ydb/core/cms/console/console__remove_config_subscription.cpp
@@ -1,87 +1,87 @@
-#include "console_configs_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConfigsManager::TTxRemoveConfigSubscription : public TTransactionBase<TConfigsManager> {
-public:
- TTxRemoveConfigSubscription(TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr ev,
- TConfigsManager *self)
- : TBase(self)
- , Request(std::move(ev))
- {
- }
-
+#include "console_configs_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConfigsManager::TTxRemoveConfigSubscription : public TTransactionBase<TConfigsManager> {
+public:
+ TTxRemoveConfigSubscription(TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr ev,
+ TConfigsManager *self)
+ : TBase(self)
+ , Request(std::move(ev))
+ {
+ }
+
bool Error(Ydb::StatusIds::StatusCode code,
- const TString &error,
- const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Cannot remove subscription: " << error);
-
- Response->Record.MutableStatus()->SetCode(code);
- Response->Record.MutableStatus()->SetReason(error);
-
- Self->PendingSubscriptionModifications.Clear();
-
- return true;
- }
-
- bool Execute(TTransactionContext &txc,
- const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- auto &rec = Request->Get()->Record;
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxRemoveConfigSubscription Execute: " << rec.ShortDebugString());
-
- Y_VERIFY(Self->PendingSubscriptionModifications.IsEmpty());
-
- Response = new TEvConsole::TEvRemoveConfigSubscriptionResponse;
-
- ui64 id = rec.GetSubscriptionId();
- if (!Self->SubscriptionIndex.GetSubscription(id))
+ const TString &error,
+ const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Cannot remove subscription: " << error);
+
+ Response->Record.MutableStatus()->SetCode(code);
+ Response->Record.MutableStatus()->SetReason(error);
+
+ Self->PendingSubscriptionModifications.Clear();
+
+ return true;
+ }
+
+ bool Execute(TTransactionContext &txc,
+ const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ auto &rec = Request->Get()->Record;
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxRemoveConfigSubscription Execute: " << rec.ShortDebugString());
+
+ Y_VERIFY(Self->PendingSubscriptionModifications.IsEmpty());
+
+ Response = new TEvConsole::TEvRemoveConfigSubscriptionResponse;
+
+ ui64 id = rec.GetSubscriptionId();
+ if (!Self->SubscriptionIndex.GetSubscription(id))
return Error(Ydb::StatusIds::NOT_FOUND,
- Sprintf("cannot find subscription %" PRIu64, id), ctx);
-
+ Sprintf("cannot find subscription %" PRIu64, id), ctx);
+
Response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- Self->PendingSubscriptionModifications.RemovedSubscriptions.insert(id);
-
- // Update database.
- Self->DbApplyPendingSubscriptionModifications(txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxRemoveConfigSubscription Complete");
-
- Y_VERIFY(Response);
- if (!Self->PendingSubscriptionModifications.IsEmpty()) {
- TAutoPtr<IEventHandle> ev = new IEventHandle(Request->Sender,
- Self->SelfId(),
- Response.Release(), 0,
- Request->Cookie);
- Self->ApplyPendingSubscriptionModifications(ctx, ev);
- } else {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvRemoveConfigSubscriptionResponse: " << Response->Record.ShortDebugString());
- ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr Request;
- TAutoPtr<TEvConsole::TEvRemoveConfigSubscriptionResponse> Response;
-};
-
-ITransaction *TConfigsManager::CreateTxRemoveConfigSubscription(TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr &ev)
-{
- return new TTxRemoveConfigSubscription(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+
+ Self->PendingSubscriptionModifications.RemovedSubscriptions.insert(id);
+
+ // Update database.
+ Self->DbApplyPendingSubscriptionModifications(txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxRemoveConfigSubscription Complete");
+
+ Y_VERIFY(Response);
+ if (!Self->PendingSubscriptionModifications.IsEmpty()) {
+ TAutoPtr<IEventHandle> ev = new IEventHandle(Request->Sender,
+ Self->SelfId(),
+ Response.Release(), 0,
+ Request->Cookie);
+ Self->ApplyPendingSubscriptionModifications(ctx, ev);
+ } else {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvRemoveConfigSubscriptionResponse: " << Response->Record.ShortDebugString());
+ ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr Request;
+ TAutoPtr<TEvConsole::TEvRemoveConfigSubscriptionResponse> Response;
+};
+
+ITransaction *TConfigsManager::CreateTxRemoveConfigSubscription(TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr &ev)
+{
+ return new TTxRemoveConfigSubscription(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__remove_config_subscriptions.cpp b/ydb/core/cms/console/console__remove_config_subscriptions.cpp
index 1c42b90e290..584b427cdc1 100644
--- a/ydb/core/cms/console/console__remove_config_subscriptions.cpp
+++ b/ydb/core/cms/console/console__remove_config_subscriptions.cpp
@@ -1,73 +1,73 @@
-#include "console_configs_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConfigsManager::TTxRemoveConfigSubscriptions : public TTransactionBase<TConfigsManager> {
-public:
- TTxRemoveConfigSubscriptions(TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr ev,
- TConfigsManager *self)
- : TBase(self)
- , Request(std::move(ev))
- {
- }
-
- bool Execute(TTransactionContext &txc,
- const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- auto &rec = Request->Get()->Record;
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxRemoveConfigSubscriptions Execute: " << rec.ShortDebugString());
-
- Y_VERIFY(Self->PendingSubscriptionModifications.IsEmpty());
-
- Response = new TEvConsole::TEvRemoveConfigSubscriptionsResponse;
+#include "console_configs_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConfigsManager::TTxRemoveConfigSubscriptions : public TTransactionBase<TConfigsManager> {
+public:
+ TTxRemoveConfigSubscriptions(TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr ev,
+ TConfigsManager *self)
+ : TBase(self)
+ , Request(std::move(ev))
+ {
+ }
+
+ bool Execute(TTransactionContext &txc,
+ const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ auto &rec = Request->Get()->Record;
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxRemoveConfigSubscriptions Execute: " << rec.ShortDebugString());
+
+ Y_VERIFY(Self->PendingSubscriptionModifications.IsEmpty());
+
+ Response = new TEvConsole::TEvRemoveConfigSubscriptionsResponse;
Response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- TSubscriberId subscriber(rec.GetSubscriber());
- auto &subscriptions = Self->SubscriptionIndex.GetSubscriptions(subscriber);
- if (subscriptions.empty())
- return true;
-
- for (auto &subscription : subscriptions)
- Self->PendingSubscriptionModifications.RemovedSubscriptions.insert(subscription->Id);
-
- // Update database.
- Self->DbApplyPendingSubscriptionModifications(txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxRemoveConfigSubscriptions Complete");
-
- Y_VERIFY(Response);
- if (!Self->PendingSubscriptionModifications.IsEmpty()) {
- TAutoPtr<IEventHandle> ev = new IEventHandle(Request->Sender,
- Self->SelfId(),
- Response.Release(), 0,
- Request->Cookie);
- Self->ApplyPendingSubscriptionModifications(ctx, ev);
- } else {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvRemoveConfigSubscriptionsResponse: " << Response->Record.ShortDebugString());
- ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr Request;
- TAutoPtr<TEvConsole::TEvRemoveConfigSubscriptionsResponse> Response;
-};
-
-ITransaction *TConfigsManager::CreateTxRemoveConfigSubscriptions(TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr &ev)
-{
- return new TTxRemoveConfigSubscriptions(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+
+ TSubscriberId subscriber(rec.GetSubscriber());
+ auto &subscriptions = Self->SubscriptionIndex.GetSubscriptions(subscriber);
+ if (subscriptions.empty())
+ return true;
+
+ for (auto &subscription : subscriptions)
+ Self->PendingSubscriptionModifications.RemovedSubscriptions.insert(subscription->Id);
+
+ // Update database.
+ Self->DbApplyPendingSubscriptionModifications(txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxRemoveConfigSubscriptions Complete");
+
+ Y_VERIFY(Response);
+ if (!Self->PendingSubscriptionModifications.IsEmpty()) {
+ TAutoPtr<IEventHandle> ev = new IEventHandle(Request->Sender,
+ Self->SelfId(),
+ Response.Release(), 0,
+ Request->Cookie);
+ Self->ApplyPendingSubscriptionModifications(ctx, ev);
+ } else {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvRemoveConfigSubscriptionsResponse: " << Response->Record.ShortDebugString());
+ ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr Request;
+ TAutoPtr<TEvConsole::TEvRemoveConfigSubscriptionsResponse> Response;
+};
+
+ITransaction *TConfigsManager::CreateTxRemoveConfigSubscriptions(TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr &ev)
+{
+ return new TTxRemoveConfigSubscriptions(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__remove_tenant.cpp b/ydb/core/cms/console/console__remove_tenant.cpp
index e7a1038b687..14bf4e19f36 100644
--- a/ydb/core/cms/console/console__remove_tenant.cpp
+++ b/ydb/core/cms/console/console__remove_tenant.cpp
@@ -1,128 +1,128 @@
-#include "console_tenants_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
+#include "console_tenants_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
using namespace NOperationId;
-
-class TTenantsManager::TTxRemoveTenant : public TTransactionBase<TTenantsManager> {
-public:
- TTxRemoveTenant(TEvConsole::TEvRemoveTenantRequest::TPtr ev, TTenantsManager *self)
- : TBase(self)
- , Path(CanonizePath(ev->Get()->Record.GetRequest().path()))
- , Request(std::move(ev))
- {
- }
-
+
+class TTenantsManager::TTxRemoveTenant : public TTransactionBase<TTenantsManager> {
+public:
+ TTxRemoveTenant(TEvConsole::TEvRemoveTenantRequest::TPtr ev, TTenantsManager *self)
+ : TBase(self)
+ , Path(CanonizePath(ev->Get()->Record.GetRequest().path()))
+ , Request(std::move(ev))
+ {
+ }
+
bool Error(Ydb::StatusIds::StatusCode code, const TString &error,
- const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "Cannot remove tenant: " << error);
-
- auto &operation = *Response->Record.MutableResponse()->mutable_operation();
- operation.set_ready(true);
- operation.set_status(code);
- auto issue = operation.add_issues();
- issue->set_severity(NYql::TSeverityIds::S_ERROR);
- issue->set_message(error);
-
- Tenant = nullptr;
-
- return true;
- }
-
- void FillTenantResponse()
- {
- Y_VERIFY(Tenant);
+ const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "Cannot remove tenant: " << error);
+
+ auto &operation = *Response->Record.MutableResponse()->mutable_operation();
+ operation.set_ready(true);
+ operation.set_status(code);
+ auto issue = operation.add_issues();
+ issue->set_severity(NYql::TSeverityIds::S_ERROR);
+ issue->set_message(error);
+
+ Tenant = nullptr;
+
+ return true;
+ }
+
+ void FillTenantResponse()
+ {
+ Y_VERIFY(Tenant);
Ydb::TOperationId id = Self->MakeOperationId(Tenant, TTenant::REMOVE);
- auto &operation = *Response->Record.MutableResponse()->mutable_operation();
- operation.set_ready(false);
- operation.set_id(ProtoToString(id));
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- Ydb::StatusIds::StatusCode code;
- TString error;
-
- auto &rec = Request->Get()->Record.GetRequest();
- auto &token = Request->Get()->Record.GetUserToken();
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "TTxRemoveTenant: "
- << Request->Get()->Record.ShortDebugString());
-
- Response = new TEvConsole::TEvRemoveTenantResponse;
-
- if (!Self->CheckAccess(token, code, error, ctx))
- return Error(code, error, ctx);
-
- auto path = CanonizePath(rec.path());
- Tenant = Self->GetTenant(path);
- if (!Tenant)
+ auto &operation = *Response->Record.MutableResponse()->mutable_operation();
+ operation.set_ready(false);
+ operation.set_id(ProtoToString(id));
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ Ydb::StatusIds::StatusCode code;
+ TString error;
+
+ auto &rec = Request->Get()->Record.GetRequest();
+ auto &token = Request->Get()->Record.GetUserToken();
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "TTxRemoveTenant: "
+ << Request->Get()->Record.ShortDebugString());
+
+ Response = new TEvConsole::TEvRemoveTenantResponse;
+
+ if (!Self->CheckAccess(token, code, error, ctx))
+ return Error(code, error, ctx);
+
+ auto path = CanonizePath(rec.path());
+ Tenant = Self->GetTenant(path);
+ if (!Tenant)
return Error(Ydb::StatusIds::NOT_FOUND,
Sprintf("Database '%s' doesn't exist", path.data()), ctx);
-
- if (Tenant->IsRemoving()) {
- FillTenantResponse();
- // Set null to avoid removal actions trigger.
- Tenant = nullptr;
- return true;
- } else if (!Tenant->IsConfiguring() && !Tenant->IsRunning()) {
+
+ if (Tenant->IsRemoving()) {
+ FillTenantResponse();
+ // Set null to avoid removal actions trigger.
+ Tenant = nullptr;
+ return true;
+ } else if (!Tenant->IsConfiguring() && !Tenant->IsRunning()) {
return Error(Ydb::StatusIds::UNAVAILABLE,
Sprintf("Database '%s' is busy", path.data()), ctx);
} else if (Tenant->HostedTenants) {
return Error(Ydb::StatusIds::PRECONDITION_FAILED,
Sprintf("Database '%s' has serverless databases. Remove all of them first", path.data()), ctx);
- }
-
- Tenant->TxId = ctx.Now().GetValue();
- FillTenantResponse();
-
- Self->DbUpdateTenantState(Tenant, TTenant::REMOVING_SUBDOMAIN, txc, ctx);
- Self->DbUpdateTenantUserToken(Tenant, token, txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "TTxRemoveTenant Complete");
-
- Y_VERIFY(Response);
- if (Response->Record.GetResponse().operation().status())
- Self->Counters.Inc(Response->Record.GetResponse().operation().status(),
- COUNTER_REMOVE_RESPONSES);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS, "Send: " << Response->ToString());
- ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
-
- if (Tenant) {
- if (Tenant->IsCreating())
- Self->SendTenantNotifications(Tenant, TTenant::CREATE,
- Ydb::StatusIds::ABORTED, ctx);
-
- Self->ChangeTenantState(Tenant, TTenant::REMOVING_SUBDOMAIN, ctx);
- Tenant->UserToken = Request->Get()->Record.GetUserToken();
+ }
+
+ Tenant->TxId = ctx.Now().GetValue();
+ FillTenantResponse();
+
+ Self->DbUpdateTenantState(Tenant, TTenant::REMOVING_SUBDOMAIN, txc, ctx);
+ Self->DbUpdateTenantUserToken(Tenant, token, txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "TTxRemoveTenant Complete");
+
+ Y_VERIFY(Response);
+ if (Response->Record.GetResponse().operation().status())
+ Self->Counters.Inc(Response->Record.GetResponse().operation().status(),
+ COUNTER_REMOVE_RESPONSES);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS, "Send: " << Response->ToString());
+ ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
+
+ if (Tenant) {
+ if (Tenant->IsCreating())
+ Self->SendTenantNotifications(Tenant, TTenant::CREATE,
+ Ydb::StatusIds::ABORTED, ctx);
+
+ Self->ChangeTenantState(Tenant, TTenant::REMOVING_SUBDOMAIN, ctx);
+ Tenant->UserToken = Request->Get()->Record.GetUserToken();
Tenant->Worker = TActorId();
-
- Self->ProcessTenantActions(Tenant, ctx);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TString Path;
- TEvConsole::TEvRemoveTenantRequest::TPtr Request;
- TAutoPtr<TEvConsole::TEvRemoveTenantResponse> Response;
- TTenant::TPtr Tenant;
-};
-
-ITransaction *TTenantsManager::CreateTxRemoveTenant(TEvConsole::TEvRemoveTenantRequest::TPtr &ev)
-{
- return new TTxRemoveTenant(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+
+ Self->ProcessTenantActions(Tenant, ctx);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TString Path;
+ TEvConsole::TEvRemoveTenantRequest::TPtr Request;
+ TAutoPtr<TEvConsole::TEvRemoveTenantResponse> Response;
+ TTenant::TPtr Tenant;
+};
+
+ITransaction *TTenantsManager::CreateTxRemoveTenant(TEvConsole::TEvRemoveTenantRequest::TPtr &ev)
+{
+ return new TTxRemoveTenant(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__remove_tenant_done.cpp b/ydb/core/cms/console/console__remove_tenant_done.cpp
index 4458d6b3899..406b3d473ae 100644
--- a/ydb/core/cms/console/console__remove_tenant_done.cpp
+++ b/ydb/core/cms/console/console__remove_tenant_done.cpp
@@ -1,55 +1,55 @@
-#include "console_tenants_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
+#include "console_tenants_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
using namespace NOperationId;
-
-class TTenantsManager::TTxRemoveTenantDone : public TTransactionBase<TTenantsManager> {
-public:
- TTxRemoveTenantDone(TTenant::TPtr tenant, TTenantsManager *self)
- : TBase(self)
- , Tenant(tenant)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- Y_VERIFY(Tenant->State == TTenant::REMOVING_POOLS);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxRemoveTenantDone for tenant " << Tenant->Path
- << " txid=" << Tenant->TxId);
-
- Self->DbRemoveComputationalUnits(Tenant, txc, ctx);
- Self->DbRemoveTenantAndPools(Tenant, txc, ctx);
- Self->DbUpdateRemovedTenant(Tenant, Ydb::StatusIds::SUCCESS, txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "TTxRemoveTenantDone Complete");
-
- Self->SendTenantNotifications(Tenant, TTenant::REMOVE, Ydb::StatusIds::SUCCESS, ctx);
- Self->Counters.Inc(Ydb::StatusIds::SUCCESS, COUNTER_REMOVE_RESPONSES);
-
- Self->RemoveTenant(Tenant);
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TTenant::TPtr Tenant;
-};
-
-ITransaction *TTenantsManager::CreateTxRemoveTenantDone(TTenant::TPtr tenant)
-{
- return new TTxRemoveTenantDone(tenant, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+
+class TTenantsManager::TTxRemoveTenantDone : public TTransactionBase<TTenantsManager> {
+public:
+ TTxRemoveTenantDone(TTenant::TPtr tenant, TTenantsManager *self)
+ : TBase(self)
+ , Tenant(tenant)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ Y_VERIFY(Tenant->State == TTenant::REMOVING_POOLS);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxRemoveTenantDone for tenant " << Tenant->Path
+ << " txid=" << Tenant->TxId);
+
+ Self->DbRemoveComputationalUnits(Tenant, txc, ctx);
+ Self->DbRemoveTenantAndPools(Tenant, txc, ctx);
+ Self->DbUpdateRemovedTenant(Tenant, Ydb::StatusIds::SUCCESS, txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "TTxRemoveTenantDone Complete");
+
+ Self->SendTenantNotifications(Tenant, TTenant::REMOVE, Ydb::StatusIds::SUCCESS, ctx);
+ Self->Counters.Inc(Ydb::StatusIds::SUCCESS, COUNTER_REMOVE_RESPONSES);
+
+ Self->RemoveTenant(Tenant);
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TTenant::TPtr Tenant;
+};
+
+ITransaction *TTenantsManager::CreateTxRemoveTenantDone(TTenant::TPtr tenant)
+{
+ return new TTxRemoveTenantDone(tenant, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__remove_tenant_failed.cpp b/ydb/core/cms/console/console__remove_tenant_failed.cpp
index 34de3535e15..541bb5d5936 100644
--- a/ydb/core/cms/console/console__remove_tenant_failed.cpp
+++ b/ydb/core/cms/console/console__remove_tenant_failed.cpp
@@ -1,64 +1,64 @@
-#include "console_tenants_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
+#include "console_tenants_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
using namespace NOperationId;
-
-class TTenantsManager::TTxRemoveTenantFailed : public TTransactionBase<TTenantsManager> {
-public:
- TTxRemoveTenantFailed(TTenant::TPtr tenant,
- Ydb::StatusIds::StatusCode code,
- TTenantsManager *self)
- : TBase(self)
- , Tenant(tenant)
- , Code(code)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- // We can cancel tenant removal only if the first stage
- // (subdomain removal) fails.
- Y_VERIFY(Tenant->State == TTenant::REMOVING_SUBDOMAIN);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxRemoveTenantFailed for tenant " << Tenant->Path
- << " txid=" << Tenant->TxId);
-
- Self->DbUpdateTenantState(Tenant, TTenant::RUNNING, txc, ctx);
- Self->DbUpdateRemovedTenant(Tenant, Code, txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "TTxRemoveTenantFailed Complete");
-
- Self->SendTenantNotifications(Tenant, TTenant::REMOVE, Code, ctx);
- Self->Counters.Inc(Ydb::StatusIds::SUCCESS, COUNTER_REMOVE_RESPONSES);
-
- Tenant->State = TTenant::RUNNING;
-
- Self->RemoveTenantFailed(Tenant, Code);
- Self->ProcessTenantActions(Tenant, ctx);
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TTenant::TPtr Tenant;
- Ydb::StatusIds::StatusCode Code;
-};
-
-ITransaction *TTenantsManager::CreateTxRemoveTenantFailed(TTenant::TPtr tenant,
- Ydb::StatusIds::StatusCode code)
-{
- return new TTxRemoveTenantFailed(tenant, code, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+
+class TTenantsManager::TTxRemoveTenantFailed : public TTransactionBase<TTenantsManager> {
+public:
+ TTxRemoveTenantFailed(TTenant::TPtr tenant,
+ Ydb::StatusIds::StatusCode code,
+ TTenantsManager *self)
+ : TBase(self)
+ , Tenant(tenant)
+ , Code(code)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ // We can cancel tenant removal only if the first stage
+ // (subdomain removal) fails.
+ Y_VERIFY(Tenant->State == TTenant::REMOVING_SUBDOMAIN);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxRemoveTenantFailed for tenant " << Tenant->Path
+ << " txid=" << Tenant->TxId);
+
+ Self->DbUpdateTenantState(Tenant, TTenant::RUNNING, txc, ctx);
+ Self->DbUpdateRemovedTenant(Tenant, Code, txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "TTxRemoveTenantFailed Complete");
+
+ Self->SendTenantNotifications(Tenant, TTenant::REMOVE, Code, ctx);
+ Self->Counters.Inc(Ydb::StatusIds::SUCCESS, COUNTER_REMOVE_RESPONSES);
+
+ Tenant->State = TTenant::RUNNING;
+
+ Self->RemoveTenantFailed(Tenant, Code);
+ Self->ProcessTenantActions(Tenant, ctx);
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TTenant::TPtr Tenant;
+ Ydb::StatusIds::StatusCode Code;
+};
+
+ITransaction *TTenantsManager::CreateTxRemoveTenantFailed(TTenant::TPtr tenant,
+ Ydb::StatusIds::StatusCode code)
+{
+ return new TTxRemoveTenantFailed(tenant, code, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__replace_config_subscriptions.cpp b/ydb/core/cms/console/console__replace_config_subscriptions.cpp
index bee54c705fc..eabed14288d 100644
--- a/ydb/core/cms/console/console__replace_config_subscriptions.cpp
+++ b/ydb/core/cms/console/console__replace_config_subscriptions.cpp
@@ -1,112 +1,112 @@
-#include "console_configs_manager.h"
-
-#include <util/random/random.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConfigsManager::TTxReplaceConfigSubscriptions : public TTransactionBase<TConfigsManager> {
-public:
- TTxReplaceConfigSubscriptions(TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr ev,
- TConfigsManager *self)
- : TBase(self)
- , Request(std::move(ev))
- {
- }
-
+#include "console_configs_manager.h"
+
+#include <util/random/random.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConfigsManager::TTxReplaceConfigSubscriptions : public TTransactionBase<TConfigsManager> {
+public:
+ TTxReplaceConfigSubscriptions(TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr ev,
+ TConfigsManager *self)
+ : TBase(self)
+ , Request(std::move(ev))
+ {
+ }
+
bool Error(Ydb::StatusIds::StatusCode code,
- const TString &error,
- const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Cannot replace subscriptions: " << error);
-
- Response->Record.MutableStatus()->SetCode(code);
- Response->Record.MutableStatus()->SetReason(error);
-
- Self->PendingSubscriptionModifications.Clear();
-
- return true;
- }
-
- bool Execute(TTransactionContext &txc,
- const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- auto &rec = Request->Get()->Record;
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxReplaceConfigSubscriptions Execute: " << rec.ShortDebugString());
-
- Y_VERIFY(Self->PendingSubscriptionModifications.IsEmpty());
-
- Response = new TEvConsole::TEvReplaceConfigSubscriptionsResponse;
-
- TSubscription::TPtr subscription = new TSubscription(rec.GetSubscription());
+ const TString &error,
+ const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Cannot replace subscriptions: " << error);
+
+ Response->Record.MutableStatus()->SetCode(code);
+ Response->Record.MutableStatus()->SetReason(error);
+
+ Self->PendingSubscriptionModifications.Clear();
+
+ return true;
+ }
+
+ bool Execute(TTransactionContext &txc,
+ const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ auto &rec = Request->Get()->Record;
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxReplaceConfigSubscriptions Execute: " << rec.ShortDebugString());
+
+ Y_VERIFY(Self->PendingSubscriptionModifications.IsEmpty());
+
+ Response = new TEvConsole::TEvReplaceConfigSubscriptionsResponse;
+
+ TSubscription::TPtr subscription = new TSubscription(rec.GetSubscription());
Ydb::StatusIds::StatusCode code;
- TString error;
- if (!Self->MakeNewSubscriptionChecks(subscription, code, error))
- return Error(code, error, ctx);
-
- for (auto existingSubscription : Self->SubscriptionIndex.GetSubscriptions(subscription->Subscriber)) {
- if (!subscription->Id && subscription->IsEqual(*existingSubscription)) {
- subscription->Id = existingSubscription->Id;
- // For services we assume replacement
- if (subscription->Subscriber.ServiceId) {
- existingSubscription->Cookie = RandomNumber<ui64>();
- Self->PendingSubscriptionModifications.ModifiedLastProvided
- .emplace(existingSubscription->Id, TConfigId());
- Self->PendingSubscriptionModifications.ModifiedCookies
- .emplace(existingSubscription->Id, existingSubscription->Cookie);
- }
- } else {
- Self->PendingSubscriptionModifications.RemovedSubscriptions.insert(existingSubscription->Id);
- }
- }
-
- if (!subscription->Id) {
- subscription->Id = Self->NextSubscriptionId++;
- subscription->Cookie = RandomNumber<ui64>();
- Self->PendingSubscriptionModifications.AddedSubscriptions.push_back(subscription);
- }
-
+ TString error;
+ if (!Self->MakeNewSubscriptionChecks(subscription, code, error))
+ return Error(code, error, ctx);
+
+ for (auto existingSubscription : Self->SubscriptionIndex.GetSubscriptions(subscription->Subscriber)) {
+ if (!subscription->Id && subscription->IsEqual(*existingSubscription)) {
+ subscription->Id = existingSubscription->Id;
+ // For services we assume replacement
+ if (subscription->Subscriber.ServiceId) {
+ existingSubscription->Cookie = RandomNumber<ui64>();
+ Self->PendingSubscriptionModifications.ModifiedLastProvided
+ .emplace(existingSubscription->Id, TConfigId());
+ Self->PendingSubscriptionModifications.ModifiedCookies
+ .emplace(existingSubscription->Id, existingSubscription->Cookie);
+ }
+ } else {
+ Self->PendingSubscriptionModifications.RemovedSubscriptions.insert(existingSubscription->Id);
+ }
+ }
+
+ if (!subscription->Id) {
+ subscription->Id = Self->NextSubscriptionId++;
+ subscription->Cookie = RandomNumber<ui64>();
+ Self->PendingSubscriptionModifications.AddedSubscriptions.push_back(subscription);
+ }
+
Response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
- Response->Record.SetSubscriptionId(subscription->Id);
-
- // Update database.
- Self->DbApplyPendingSubscriptionModifications(txc, ctx);
- Self->DbUpdateNextSubscriptionId(txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxReplaceConfigSubscriptions Complete");
-
- Y_VERIFY(Response);
- if (!Self->PendingSubscriptionModifications.IsEmpty()) {
- TAutoPtr<IEventHandle> ev = new IEventHandle(Request->Sender,
- Self->SelfId(),
- Response.Release(), 0,
- Request->Cookie);
- Self->ApplyPendingSubscriptionModifications(ctx, ev);
- } else {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvReplaceConfigSubscriptionsResponse: " << Response->Record.ShortDebugString());
- ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr Request;
- TAutoPtr<TEvConsole::TEvReplaceConfigSubscriptionsResponse> Response;
-};
-
-ITransaction *TConfigsManager::CreateTxReplaceConfigSubscriptions(TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr &ev)
-{
- return new TTxReplaceConfigSubscriptions(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ Response->Record.SetSubscriptionId(subscription->Id);
+
+ // Update database.
+ Self->DbApplyPendingSubscriptionModifications(txc, ctx);
+ Self->DbUpdateNextSubscriptionId(txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxReplaceConfigSubscriptions Complete");
+
+ Y_VERIFY(Response);
+ if (!Self->PendingSubscriptionModifications.IsEmpty()) {
+ TAutoPtr<IEventHandle> ev = new IEventHandle(Request->Sender,
+ Self->SelfId(),
+ Response.Release(), 0,
+ Request->Cookie);
+ Self->ApplyPendingSubscriptionModifications(ctx, ev);
+ } else {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvReplaceConfigSubscriptionsResponse: " << Response->Record.ShortDebugString());
+ ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr Request;
+ TAutoPtr<TEvConsole::TEvReplaceConfigSubscriptionsResponse> Response;
+};
+
+ITransaction *TConfigsManager::CreateTxReplaceConfigSubscriptions(TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr &ev)
+{
+ return new TTxReplaceConfigSubscriptions(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__scheme.h b/ydb/core/cms/console/console__scheme.h
index 79284234b2a..29eb6c3035a 100644
--- a/ydb/core/cms/console/console__scheme.h
+++ b/ydb/core/cms/console/console__scheme.h
@@ -1,41 +1,41 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <ydb/core/scheme/scheme_types_defs.h>
#include <ydb/core/tablet_flat/flat_cxx_database.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-struct Schema : NIceDb::Schema {
- struct Config : Table<1> {
- struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
- struct Value : Column<2, NScheme::NTypeIds::Utf8> {};
-
- using TKey = TableKey<Key>;
- using TColumns = TableColumns<Key, Value>;
- };
-
- struct Tenants : Table<2> {
- struct Path : Column<1, NScheme::NTypeIds::Utf8> {};
- struct State : Column<2, NScheme::NTypeIds::Uint32> {};
- struct Coordinators : Column<3, NScheme::NTypeIds::Uint64> {};
- struct Mediators : Column<4, NScheme::NTypeIds::Uint64> {};
- struct PlanResolution : Column<5, NScheme::NTypeIds::Uint64> {};
- struct Issue : Column<6, NScheme::NTypeIds::Utf8> {};
- struct TxId : Column<7, NScheme::NTypeIds::Uint64> {};
- struct UserToken : Column<8, NScheme::NTypeIds::Utf8> {};
- struct SubdomainVersion : Column<10, NScheme::NTypeIds::Uint64> {};
- struct ConfirmedSubdomain : Column<11, NScheme::NTypeIds::Uint64> {};
- struct TimeCastBucketsPerMediator : Column<12, NScheme::NTypeIds::Uint32> {};
+
+namespace NKikimr {
+namespace NConsole {
+
+struct Schema : NIceDb::Schema {
+ struct Config : Table<1> {
+ struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct Value : Column<2, NScheme::NTypeIds::Utf8> {};
+
+ using TKey = TableKey<Key>;
+ using TColumns = TableColumns<Key, Value>;
+ };
+
+ struct Tenants : Table<2> {
+ struct Path : Column<1, NScheme::NTypeIds::Utf8> {};
+ struct State : Column<2, NScheme::NTypeIds::Uint32> {};
+ struct Coordinators : Column<3, NScheme::NTypeIds::Uint64> {};
+ struct Mediators : Column<4, NScheme::NTypeIds::Uint64> {};
+ struct PlanResolution : Column<5, NScheme::NTypeIds::Uint64> {};
+ struct Issue : Column<6, NScheme::NTypeIds::Utf8> {};
+ struct TxId : Column<7, NScheme::NTypeIds::Uint64> {};
+ struct UserToken : Column<8, NScheme::NTypeIds::Utf8> {};
+ struct SubdomainVersion : Column<10, NScheme::NTypeIds::Uint64> {};
+ struct ConfirmedSubdomain : Column<11, NScheme::NTypeIds::Uint64> {};
+ struct TimeCastBucketsPerMediator : Column<12, NScheme::NTypeIds::Uint32> {};
struct Attributes : Column<13, NScheme::NTypeIds::String> { using Type = NKikimrSchemeOp::TAlterUserAttributes; };
- struct Generation : Column<14, NScheme::NTypeIds::Uint64> {};
+ struct Generation : Column<14, NScheme::NTypeIds::Uint64> {};
// DomainId {
- struct SchemeShardId : Column<15, NScheme::NTypeIds::Uint64> {};
- struct PathId : Column<16, NScheme::NTypeIds::Uint64> {};
+ struct SchemeShardId : Column<15, NScheme::NTypeIds::Uint64> {};
+ struct PathId : Column<16, NScheme::NTypeIds::Uint64> {};
// } // DomainId
- struct ErrorCode : Column<17, NScheme::NTypeIds::Uint32> {};
+ struct ErrorCode : Column<17, NScheme::NTypeIds::Uint32> {};
struct IsExternalSubDomain : Column<18, NScheme::NTypeIds::Bool> {};
struct IsExternalHive : Column<19, NScheme::NTypeIds::Bool> {};
struct AreResourcesShared : Column<20, NScheme::NTypeIds::Bool> {};
@@ -48,104 +48,104 @@ struct Schema : NIceDb::Schema {
struct CreateIdempotencyKey : Column<25, NScheme::NTypeIds::Utf8> {};
struct AlterIdempotencyKey : Column<26, NScheme::NTypeIds::Utf8> {};
struct DatabaseQuotas : Column<27, NScheme::NTypeIds::String> {};
-
- using TKey = TableKey<Path>;
+
+ using TKey = TableKey<Path>;
using TColumns = TableColumns<Path, State, Coordinators, Mediators, PlanResolution,
Issue, TxId, UserToken, SubdomainVersion, ConfirmedSubdomain, TimeCastBucketsPerMediator,
Attributes, Generation, SchemeShardId, PathId, ErrorCode, IsExternalSubDomain, IsExternalHive,
AreResourcesShared, SharedDomainSchemeShardId, SharedDomainPathId, IsExternalSysViewProcessor,
SchemaOperationQuotas, CreateIdempotencyKey, AlterIdempotencyKey, DatabaseQuotas>;
- };
-
- struct TenantPools : Table<3> {
- struct Tenant : Column<1, NScheme::NTypeIds::Utf8> {};
- struct PoolType : Column<2, NScheme::NTypeIds::Utf8> {};
- struct Config : Column<3, NScheme::NTypeIds::Utf8> {};
- struct AllocatedNumGroups : Column<4, NScheme::NTypeIds::Uint32> {};
- struct State : Column<5, NScheme::NTypeIds::Uint32> {};
-
- using TKey = TableKey<Tenant, PoolType>;
- using TColumns = TableColumns<Tenant, PoolType, Config, AllocatedNumGroups, State>;
- };
-
- struct TenantUnits : Table<4> {
- struct Tenant : Column<1, NScheme::NTypeIds::Utf8> {};
- struct UnitKind : Column<2, NScheme::NTypeIds::Utf8> {};
- struct AvailabilityZone : Column<3, NScheme::NTypeIds::Utf8> {};
- struct Count : Column<4, NScheme::NTypeIds::Uint64> {};
-
- using TKey = TableKey<Tenant, UnitKind, AvailabilityZone>;
- using TColumns = TableColumns<Tenant, UnitKind, AvailabilityZone, Count>;
- };
-
- struct RemovedTenants : Table<5> {
- struct Path : Column<1, NScheme::NTypeIds::Utf8> {};
- struct TxId : Column<2, NScheme::NTypeIds::Uint64> {};
- struct Issue : Column<3, NScheme::NTypeIds::Utf8> {};
- struct Code : Column<4, NScheme::NTypeIds::Uint32> {};
- struct ErrorCode : Column<17, NScheme::NTypeIds::Uint32> {};
+ };
+
+ struct TenantPools : Table<3> {
+ struct Tenant : Column<1, NScheme::NTypeIds::Utf8> {};
+ struct PoolType : Column<2, NScheme::NTypeIds::Utf8> {};
+ struct Config : Column<3, NScheme::NTypeIds::Utf8> {};
+ struct AllocatedNumGroups : Column<4, NScheme::NTypeIds::Uint32> {};
+ struct State : Column<5, NScheme::NTypeIds::Uint32> {};
+
+ using TKey = TableKey<Tenant, PoolType>;
+ using TColumns = TableColumns<Tenant, PoolType, Config, AllocatedNumGroups, State>;
+ };
+
+ struct TenantUnits : Table<4> {
+ struct Tenant : Column<1, NScheme::NTypeIds::Utf8> {};
+ struct UnitKind : Column<2, NScheme::NTypeIds::Utf8> {};
+ struct AvailabilityZone : Column<3, NScheme::NTypeIds::Utf8> {};
+ struct Count : Column<4, NScheme::NTypeIds::Uint64> {};
+
+ using TKey = TableKey<Tenant, UnitKind, AvailabilityZone>;
+ using TColumns = TableColumns<Tenant, UnitKind, AvailabilityZone, Count>;
+ };
+
+ struct RemovedTenants : Table<5> {
+ struct Path : Column<1, NScheme::NTypeIds::Utf8> {};
+ struct TxId : Column<2, NScheme::NTypeIds::Uint64> {};
+ struct Issue : Column<3, NScheme::NTypeIds::Utf8> {};
+ struct Code : Column<4, NScheme::NTypeIds::Uint32> {};
+ struct ErrorCode : Column<17, NScheme::NTypeIds::Uint32> {};
struct CreateIdempotencyKey : Column<25, NScheme::NTypeIds::Utf8> {};
-
- using TKey = TableKey<Path>;
+
+ using TKey = TableKey<Path>;
using TColumns = TableColumns<Path, TxId, Issue, Code, ErrorCode, CreateIdempotencyKey>;
- };
-
- struct RegisteredUnits : Table<6> {
- struct Tenant : Column<1, NScheme::NTypeIds::Utf8> {};
- struct Host : Column<2, NScheme::NTypeIds::Utf8> {};
- struct Port : Column<3, NScheme::NTypeIds::Uint32> {};
- struct Kind : Column<4, NScheme::NTypeIds::Utf8> {};
-
- using TKey = TableKey<Tenant, Host, Port>;
- using TColumns = TableColumns<Tenant, Host, Port, Kind>;
- };
-
- struct ConfigItems : Table<100> {
- struct Id : Column<1, NScheme::NTypeIds::Uint64> {};
- struct Generation : Column<2, NScheme::NTypeIds::Uint64> {};
- struct Kind : Column<3, NScheme::NTypeIds::Uint32> {};
- struct NodeIds : Column<4, NScheme::NTypeIds::String> { using Type = TVector<ui32>; };
- struct Hosts : Column<5, NScheme::NTypeIds::String> {};
- struct Tenant : Column<6, NScheme::NTypeIds::Utf8> {};
- struct NodeType : Column<7, NScheme::NTypeIds::Utf8> {};
- struct Order : Column<8, NScheme::NTypeIds::Uint32> {};
- struct Merge : Column<9, NScheme::NTypeIds::Uint32> {};
- struct Config : Column<10, NScheme::NTypeIds::String> {};
- struct Cookie : Column<11, NScheme::NTypeIds::String> {};
-
-
- using TKey = TableKey<Id>;
- using TColumns = TableColumns<Id, Generation, Kind, NodeIds, Hosts, Tenant, NodeType, Order, Merge, Config, Cookie>;
- };
-
- struct ConfigSubscriptions : Table<101> {
- struct Id : Column<1, NScheme::NTypeIds::Uint64> {};
- struct TabletId : Column<2, NScheme::NTypeIds::Uint64> {};
- struct ServiceId : Column<3, NScheme::NTypeIds::ActorId> {};
- struct NodeId : Column<4, NScheme::NTypeIds::Uint32> {};
- struct Host : Column<5, NScheme::NTypeIds::Utf8> {};
- struct Tenant : Column<6, NScheme::NTypeIds::Utf8> {};
- struct NodeType : Column<7, NScheme::NTypeIds::Utf8> {};
- struct ItemKinds : Column<8, NScheme::NTypeIds::String> { using Type = TVector<ui32>; };
- struct LastProvidedConfig : Column<9, NScheme::NTypeIds::String> { using Type = TVector<std::pair<ui64, ui64>>; };
-
-
- using TKey = TableKey<Id>;
- using TColumns = TableColumns<Id, TabletId, ServiceId, NodeId, Host, Tenant, NodeType, ItemKinds, LastProvidedConfig>;
- };
-
- struct DisabledValidators : Table<102> {
- struct Name : Column<1, NScheme::NTypeIds::Utf8> {};
-
- using TKey = TableKey<Name>;
- using TColumns = TableColumns<Name>;
- };
-
- using TTables = SchemaTables<Config, Tenants, TenantPools, TenantUnits, RemovedTenants,
- RegisteredUnits, ConfigItems, ConfigSubscriptions, DisabledValidators>;
- using TSettings = SchemaSettings<ExecutorLogBatching<true>,
- ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
+ };
+
+ struct RegisteredUnits : Table<6> {
+ struct Tenant : Column<1, NScheme::NTypeIds::Utf8> {};
+ struct Host : Column<2, NScheme::NTypeIds::Utf8> {};
+ struct Port : Column<3, NScheme::NTypeIds::Uint32> {};
+ struct Kind : Column<4, NScheme::NTypeIds::Utf8> {};
+
+ using TKey = TableKey<Tenant, Host, Port>;
+ using TColumns = TableColumns<Tenant, Host, Port, Kind>;
+ };
+
+ struct ConfigItems : Table<100> {
+ struct Id : Column<1, NScheme::NTypeIds::Uint64> {};
+ struct Generation : Column<2, NScheme::NTypeIds::Uint64> {};
+ struct Kind : Column<3, NScheme::NTypeIds::Uint32> {};
+ struct NodeIds : Column<4, NScheme::NTypeIds::String> { using Type = TVector<ui32>; };
+ struct Hosts : Column<5, NScheme::NTypeIds::String> {};
+ struct Tenant : Column<6, NScheme::NTypeIds::Utf8> {};
+ struct NodeType : Column<7, NScheme::NTypeIds::Utf8> {};
+ struct Order : Column<8, NScheme::NTypeIds::Uint32> {};
+ struct Merge : Column<9, NScheme::NTypeIds::Uint32> {};
+ struct Config : Column<10, NScheme::NTypeIds::String> {};
+ struct Cookie : Column<11, NScheme::NTypeIds::String> {};
+
+
+ using TKey = TableKey<Id>;
+ using TColumns = TableColumns<Id, Generation, Kind, NodeIds, Hosts, Tenant, NodeType, Order, Merge, Config, Cookie>;
+ };
+
+ struct ConfigSubscriptions : Table<101> {
+ struct Id : Column<1, NScheme::NTypeIds::Uint64> {};
+ struct TabletId : Column<2, NScheme::NTypeIds::Uint64> {};
+ struct ServiceId : Column<3, NScheme::NTypeIds::ActorId> {};
+ struct NodeId : Column<4, NScheme::NTypeIds::Uint32> {};
+ struct Host : Column<5, NScheme::NTypeIds::Utf8> {};
+ struct Tenant : Column<6, NScheme::NTypeIds::Utf8> {};
+ struct NodeType : Column<7, NScheme::NTypeIds::Utf8> {};
+ struct ItemKinds : Column<8, NScheme::NTypeIds::String> { using Type = TVector<ui32>; };
+ struct LastProvidedConfig : Column<9, NScheme::NTypeIds::String> { using Type = TVector<std::pair<ui64, ui64>>; };
+
+
+ using TKey = TableKey<Id>;
+ using TColumns = TableColumns<Id, TabletId, ServiceId, NodeId, Host, Tenant, NodeType, ItemKinds, LastProvidedConfig>;
+ };
+
+ struct DisabledValidators : Table<102> {
+ struct Name : Column<1, NScheme::NTypeIds::Utf8> {};
+
+ using TKey = TableKey<Name>;
+ using TColumns = TableColumns<Name>;
+ };
+
+ using TTables = SchemaTables<Config, Tenants, TenantPools, TenantUnits, RemovedTenants,
+ RegisteredUnits, ConfigItems, ConfigSubscriptions, DisabledValidators>;
+ using TSettings = SchemaSettings<ExecutorLogBatching<true>,
+ ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
+};
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__set_config.cpp b/ydb/core/cms/console/console__set_config.cpp
index 2965fe16c6b..8cea3abba2e 100644
--- a/ydb/core/cms/console/console__set_config.cpp
+++ b/ydb/core/cms/console/console__set_config.cpp
@@ -1,99 +1,99 @@
-#include "config_index.h"
-#include "console_impl.h"
-#include "console_configs_manager.h"
-#include "console_tenants_manager.h"
-
+#include "config_index.h"
+#include "console_impl.h"
+#include "console_configs_manager.h"
+#include "console_tenants_manager.h"
+
#include <ydb/core/base/path.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConsole::TTxSetConfig : public TTransactionBase<TConsole> {
-public:
- TTxSetConfig(TEvConsole::TEvSetConfigRequest::TPtr ev, TConsole *self)
- : TBase(self)
- , Request(std::move(ev))
- , ModifyConfig(false)
- {
- }
-
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConsole::TTxSetConfig : public TTransactionBase<TConsole> {
+public:
+ TTxSetConfig(TEvConsole::TEvSetConfigRequest::TPtr ev, TConsole *self)
+ : TBase(self)
+ , Request(std::move(ev))
+ , ModifyConfig(false)
+ {
+ }
+
bool Error(Ydb::StatusIds::StatusCode code, const TString &error,
- const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS, "Cannot set config: " << error);
-
- Response->Record.MutableStatus()->SetCode(code);
- Response->Record.MutableStatus()->SetReason(error);
-
- return true;
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- auto &rec = Request->Get()->Record;
- LOG_DEBUG_S(ctx, NKikimrServices::CMS, "TConsole::TTxSetConfig: " << rec.ShortDebugString());
-
- Response = new TEvConsole::TEvSetConfigResponse;
-
- if (rec.GetMerge() == NKikimrConsole::TConfigItem::OVERWRITE) {
- NewConfig = rec.GetConfig();
- } else if (rec.GetMerge() == NKikimrConsole::TConfigItem::MERGE) {
- NewConfig = Self->Config;
- NewConfig.MergeFrom(rec.GetConfig());
- } else if (rec.GetMerge() == NKikimrConsole::TConfigItem::MERGE_OVERWRITE_REPEATED) {
- NewConfig = Self->Config;
- MergeMessageOverwriteRepeated(NewConfig, *rec.MutableConfig());
- } else {
- return Error(Ydb::StatusIds::BAD_REQUEST,
- "Unsupported merge strategy", ctx);
- }
-
+ const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS, "Cannot set config: " << error);
+
+ Response->Record.MutableStatus()->SetCode(code);
+ Response->Record.MutableStatus()->SetReason(error);
+
+ return true;
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ auto &rec = Request->Get()->Record;
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS, "TConsole::TTxSetConfig: " << rec.ShortDebugString());
+
+ Response = new TEvConsole::TEvSetConfigResponse;
+
+ if (rec.GetMerge() == NKikimrConsole::TConfigItem::OVERWRITE) {
+ NewConfig = rec.GetConfig();
+ } else if (rec.GetMerge() == NKikimrConsole::TConfigItem::MERGE) {
+ NewConfig = Self->Config;
+ NewConfig.MergeFrom(rec.GetConfig());
+ } else if (rec.GetMerge() == NKikimrConsole::TConfigItem::MERGE_OVERWRITE_REPEATED) {
+ NewConfig = Self->Config;
+ MergeMessageOverwriteRepeated(NewConfig, *rec.MutableConfig());
+ } else {
+ return Error(Ydb::StatusIds::BAD_REQUEST,
+ "Unsupported merge strategy", ctx);
+ }
+
Ydb::StatusIds::StatusCode code;
- TString error;
- if (!Self->TenantsManager->CheckTenantsConfig(NewConfig.GetTenantsConfig(), code, error))
- return Error(code, error, ctx);
- if (!Self->ConfigsManager->CheckConfig(NewConfig.GetConfigsConfig(), code, error))
- return Error(code, error, ctx);
-
- ModifyConfig = true;
-
- // Modify state.
- NIceDb::TNiceDb db(txc.DB);
- TString config;
+ TString error;
+ if (!Self->TenantsManager->CheckTenantsConfig(NewConfig.GetTenantsConfig(), code, error))
+ return Error(code, error, ctx);
+ if (!Self->ConfigsManager->CheckConfig(NewConfig.GetConfigsConfig(), code, error))
+ return Error(code, error, ctx);
+
+ ModifyConfig = true;
+
+ // Modify state.
+ NIceDb::TNiceDb db(txc.DB);
+ TString config;
Y_PROTOBUF_SUPPRESS_NODISCARD NewConfig.SerializeToString(&config);
- db.Table<Schema::Config>().Key(ConfigKeyConfig)
- .Update(NIceDb::TUpdate<Schema::Config::Value>(config));
-
+ db.Table<Schema::Config>().Key(ConfigKeyConfig)
+ .Update(NIceDb::TUpdate<Schema::Config::Value>(config));
+
Response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::TTxSetConfig Complete");
-
- if (ModifyConfig)
- Self->LoadConfigFromProto(NewConfig);
-
- Y_VERIFY(Response);
- LOG_TRACE_S(ctx, NKikimrServices::CMS, "Send: " << Response->ToString());
- ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TEvConsole::TEvSetConfigRequest::TPtr Request;
- TAutoPtr<TEvConsole::TEvSetConfigResponse> Response;
- NKikimrConsole::TConfig NewConfig;
- bool ModifyConfig;
-};
-
-ITransaction *TConsole::CreateTxSetConfig(TEvConsole::TEvSetConfigRequest::TPtr &ev)
-{
- return new TTxSetConfig(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TConsole::TTxSetConfig Complete");
+
+ if (ModifyConfig)
+ Self->LoadConfigFromProto(NewConfig);
+
+ Y_VERIFY(Response);
+ LOG_TRACE_S(ctx, NKikimrServices::CMS, "Send: " << Response->ToString());
+ ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvConsole::TEvSetConfigRequest::TPtr Request;
+ TAutoPtr<TEvConsole::TEvSetConfigResponse> Response;
+ NKikimrConsole::TConfig NewConfig;
+ bool ModifyConfig;
+};
+
+ITransaction *TConsole::CreateTxSetConfig(TEvConsole::TEvSetConfigRequest::TPtr &ev)
+{
+ return new TTxSetConfig(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__toggle_config_validator.cpp b/ydb/core/cms/console/console__toggle_config_validator.cpp
index 910472f122f..26f0b6bc857 100644
--- a/ydb/core/cms/console/console__toggle_config_validator.cpp
+++ b/ydb/core/cms/console/console__toggle_config_validator.cpp
@@ -1,120 +1,120 @@
-#include "config_index.h"
-#include "console_impl.h"
-#include "console_configs_manager.h"
-#include "console_tenants_manager.h"
-
+#include "config_index.h"
+#include "console_impl.h"
+#include "console_configs_manager.h"
+#include "console_tenants_manager.h"
+
#include <ydb/core/base/path.h>
#include <ydb/core/cms/console/validators/registry.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConfigsManager::TTxToggleConfigValidator : public TTransactionBase<TConfigsManager> {
-public:
- TTxToggleConfigValidator(TEvConsole::TEvToggleConfigValidatorRequest::TPtr ev,
- TConfigsManager *self)
- : TBase(self)
- , Request(std::move(ev))
- , Modify(false)
- {
- }
-
- bool Error(Ydb::StatusIds::StatusCode code, const TString &error,
- const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Cannot toggle validator: " << error);
-
- Response->Record.MutableStatus()->SetCode(code);
- Response->Record.MutableStatus()->SetReason(error);
-
- return true;
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- auto &rec = Request->Get()->Record;
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConsole::TTxToggleConfigValidator: " << rec.ShortDebugString());
-
- Response = MakeHolder<TEvConsole::TEvToggleConfigValidatorResponse>();
-
- const TString &name = rec.GetName();
- bool disable = rec.GetDisable();
- auto registry = TValidatorsRegistry::Instance();
-
- if (!registry->GetValidator(name))
- return Error(Ydb::StatusIds::NOT_FOUND, "Unknown validator: " + rec.GetName(), ctx);
-
- Response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- if (disable) {
- if (Self->DisabledValidators.contains(name))
- return true;
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::DisabledValidators>().Key(rec.GetName()).Update();
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Add disabled validator to local database name=" << rec.GetName());
- } else {
- if (!Self->DisabledValidators.contains(name))
- return true;
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::DisabledValidators>().Key(rec.GetName()).Delete();
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Remove disabled validator from local database name=" << rec.GetName());
- }
-
- Modify = true;
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS,
- "TConsole::TTxToggleConfigValidator Complete");
-
- if (Modify) {
- auto &rec = Request->Get()->Record;
- auto registry = TValidatorsRegistry::Instance();
-
- if (rec.GetDisable()) {
- registry->DisableValidator(rec.GetName());
- Self->DisabledValidators.insert(rec.GetName());
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Disable validator " << rec.GetName());
- } else {
- registry->EnableValidator(rec.GetName());
- Self->DisabledValidators.erase(rec.GetName());
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Enable validator " << rec.GetName());
- }
- }
-
- Y_VERIFY(Response);
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send: " << Response->ToString());
- ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TEvConsole::TEvToggleConfigValidatorRequest::TPtr Request;
- TAutoPtr<TEvConsole::TEvToggleConfigValidatorResponse> Response;
- bool Modify;
-};
-
-ITransaction *TConfigsManager::CreateTxToggleConfigValidator(TEvConsole::TEvToggleConfigValidatorRequest::TPtr &ev)
-{
- return new TTxToggleConfigValidator(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConfigsManager::TTxToggleConfigValidator : public TTransactionBase<TConfigsManager> {
+public:
+ TTxToggleConfigValidator(TEvConsole::TEvToggleConfigValidatorRequest::TPtr ev,
+ TConfigsManager *self)
+ : TBase(self)
+ , Request(std::move(ev))
+ , Modify(false)
+ {
+ }
+
+ bool Error(Ydb::StatusIds::StatusCode code, const TString &error,
+ const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Cannot toggle validator: " << error);
+
+ Response->Record.MutableStatus()->SetCode(code);
+ Response->Record.MutableStatus()->SetReason(error);
+
+ return true;
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ auto &rec = Request->Get()->Record;
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConsole::TTxToggleConfigValidator: " << rec.ShortDebugString());
+
+ Response = MakeHolder<TEvConsole::TEvToggleConfigValidatorResponse>();
+
+ const TString &name = rec.GetName();
+ bool disable = rec.GetDisable();
+ auto registry = TValidatorsRegistry::Instance();
+
+ if (!registry->GetValidator(name))
+ return Error(Ydb::StatusIds::NOT_FOUND, "Unknown validator: " + rec.GetName(), ctx);
+
+ Response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+
+ if (disable) {
+ if (Self->DisabledValidators.contains(name))
+ return true;
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::DisabledValidators>().Key(rec.GetName()).Update();
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Add disabled validator to local database name=" << rec.GetName());
+ } else {
+ if (!Self->DisabledValidators.contains(name))
+ return true;
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::DisabledValidators>().Key(rec.GetName()).Delete();
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Remove disabled validator from local database name=" << rec.GetName());
+ }
+
+ Modify = true;
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConsole::TTxToggleConfigValidator Complete");
+
+ if (Modify) {
+ auto &rec = Request->Get()->Record;
+ auto registry = TValidatorsRegistry::Instance();
+
+ if (rec.GetDisable()) {
+ registry->DisableValidator(rec.GetName());
+ Self->DisabledValidators.insert(rec.GetName());
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Disable validator " << rec.GetName());
+ } else {
+ registry->EnableValidator(rec.GetName());
+ Self->DisabledValidators.erase(rec.GetName());
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Enable validator " << rec.GetName());
+ }
+ }
+
+ Y_VERIFY(Response);
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send: " << Response->ToString());
+ ctx.Send(Request->Sender, Response.Release(), 0, Request->Cookie);
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvConsole::TEvToggleConfigValidatorRequest::TPtr Request;
+ TAutoPtr<TEvConsole::TEvToggleConfigValidatorResponse> Response;
+ bool Modify;
+};
+
+ITransaction *TConfigsManager::CreateTxToggleConfigValidator(TEvConsole::TEvToggleConfigValidatorRequest::TPtr &ev)
+{
+ return new TTxToggleConfigValidator(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__update_confirmed_subdomain.cpp b/ydb/core/cms/console/console__update_confirmed_subdomain.cpp
index a40da7084dc..bf7e4a49fc9 100644
--- a/ydb/core/cms/console/console__update_confirmed_subdomain.cpp
+++ b/ydb/core/cms/console/console__update_confirmed_subdomain.cpp
@@ -1,75 +1,75 @@
-#include "console_tenants_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TTenantsManager::TTxUpdateConfirmedSubdomain : public TTransactionBase<TTenantsManager> {
-public:
- TTxUpdateConfirmedSubdomain(TTenantsManager *self,
- const TString &path,
- ui64 version,
+#include "console_tenants_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TTenantsManager::TTxUpdateConfirmedSubdomain : public TTransactionBase<TTenantsManager> {
+public:
+ TTxUpdateConfirmedSubdomain(TTenantsManager *self,
+ const TString &path,
+ ui64 version,
TActorId worker)
- : TBase(self)
- , Path(path)
- , Version(version)
- , Worker(worker)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdateConfirmedSubdomain for tenant " << Path << " to " << Version);
-
- Tenant = Self->GetTenant(Path);
- if (!Tenant) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdateConfirmedSubdomain cannot find tenant " << Path);
- return true;
- }
-
- if (Tenant->State == TTenant::CONFIGURING_SUBDOMAIN)
- Self->DbUpdateTenantState(Tenant, TTenant::RUNNING, txc, ctx);
- Self->DbUpdateConfirmedSubdomain(Tenant, Version, txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdateConfirmedSubdomain complete for " << Path);
-
- if (Tenant) {
- if (Tenant->Worker == Worker)
+ : TBase(self)
+ , Path(path)
+ , Version(version)
+ , Worker(worker)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdateConfirmedSubdomain for tenant " << Path << " to " << Version);
+
+ Tenant = Self->GetTenant(Path);
+ if (!Tenant) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdateConfirmedSubdomain cannot find tenant " << Path);
+ return true;
+ }
+
+ if (Tenant->State == TTenant::CONFIGURING_SUBDOMAIN)
+ Self->DbUpdateTenantState(Tenant, TTenant::RUNNING, txc, ctx);
+ Self->DbUpdateConfirmedSubdomain(Tenant, Version, txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdateConfirmedSubdomain complete for " << Path);
+
+ if (Tenant) {
+ if (Tenant->Worker == Worker)
Tenant->Worker = TActorId();
- Tenant->ConfirmedSubdomain = Version;
- if (Tenant->State == TTenant::CONFIGURING_SUBDOMAIN) {
- Tenant->State = TTenant::RUNNING;
- Self->SendTenantNotifications(Tenant, TTenant::CREATE,
- Ydb::StatusIds::SUCCESS, ctx);
- }
- Self->ProcessTenantActions(Tenant, ctx);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TTenant::TPtr Tenant;
- TString Path;
- ui64 Version;
+ Tenant->ConfirmedSubdomain = Version;
+ if (Tenant->State == TTenant::CONFIGURING_SUBDOMAIN) {
+ Tenant->State = TTenant::RUNNING;
+ Self->SendTenantNotifications(Tenant, TTenant::CREATE,
+ Ydb::StatusIds::SUCCESS, ctx);
+ }
+ Self->ProcessTenantActions(Tenant, ctx);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TTenant::TPtr Tenant;
+ TString Path;
+ ui64 Version;
TActorId Worker;
-};
-
-ITransaction *TTenantsManager::CreateTxUpdateConfirmedSubdomain(const TString &path,
- ui64 version,
+};
+
+ITransaction *TTenantsManager::CreateTxUpdateConfirmedSubdomain(const TString &path,
+ ui64 version,
TActorId worker)
-{
- return new TTxUpdateConfirmedSubdomain(this, path, version, worker);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+{
+ return new TTxUpdateConfirmedSubdomain(this, path, version, worker);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__update_last_provided_config.cpp b/ydb/core/cms/console/console__update_last_provided_config.cpp
index dc0c07ab919..fdfd093b5e5 100644
--- a/ydb/core/cms/console/console__update_last_provided_config.cpp
+++ b/ydb/core/cms/console/console__update_last_provided_config.cpp
@@ -1,72 +1,72 @@
-#include "console_configs_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConfigsManager::TTxUpdateLastProvidedConfig : public TTransactionBase<TConfigsManager> {
-public:
- TTxUpdateLastProvidedConfig(TEvConsole::TEvConfigNotificationResponse::TPtr ev,
- TConfigsManager *self)
- : TBase(self)
- , Request(std::move(ev))
- {
- }
-
- bool Execute(TTransactionContext &txc,
- const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- auto &rec = Request->Get()->Record;
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxUpdateLastProvidedConfig Execute: " << rec.ShortDebugString());
-
- Y_VERIFY(Self->PendingSubscriptionModifications.IsEmpty());
-
- auto subscription = Self->SubscriptionIndex.GetSubscription(rec.GetSubscriptionId());
- if (!subscription) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Config notification response for missing subscription id="
- << rec.GetSubscriptionId());
- return true;
- }
- if (Request->Cookie != subscription->Cookie) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Config notification response cookie mismatch for"
- << " subscription id=" << rec.GetSubscriptionId());
- Y_VERIFY(subscription->Subscriber.ServiceId,
- "%s ==> %s",
- rec.ShortDebugString().c_str(),
- subscription->ToString().c_str());
- return true;
- }
-
- Self->PendingSubscriptionModifications.ModifiedLastProvided
- .emplace(subscription->Id, TConfigId(rec.GetConfigId()));
-
- // Update database.
- Self->DbApplyPendingSubscriptionModifications(txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxUpdateLastProvidedConfig Complete");
-
- if (!Self->PendingSubscriptionModifications.IsEmpty())
- Self->ApplyPendingSubscriptionModifications(ctx);
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TEvConsole::TEvConfigNotificationResponse::TPtr Request;
-};
-
-ITransaction *TConfigsManager::CreateTxUpdateLastProvidedConfig(TEvConsole::TEvConfigNotificationResponse::TPtr &ev)
-{
- return new TTxUpdateLastProvidedConfig(ev, this);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+#include "console_configs_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConfigsManager::TTxUpdateLastProvidedConfig : public TTransactionBase<TConfigsManager> {
+public:
+ TTxUpdateLastProvidedConfig(TEvConsole::TEvConfigNotificationResponse::TPtr ev,
+ TConfigsManager *self)
+ : TBase(self)
+ , Request(std::move(ev))
+ {
+ }
+
+ bool Execute(TTransactionContext &txc,
+ const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ auto &rec = Request->Get()->Record;
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "TTxUpdateLastProvidedConfig Execute: " << rec.ShortDebugString());
+
+ Y_VERIFY(Self->PendingSubscriptionModifications.IsEmpty());
+
+ auto subscription = Self->SubscriptionIndex.GetSubscription(rec.GetSubscriptionId());
+ if (!subscription) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Config notification response for missing subscription id="
+ << rec.GetSubscriptionId());
+ return true;
+ }
+ if (Request->Cookie != subscription->Cookie) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Config notification response cookie mismatch for"
+ << " subscription id=" << rec.GetSubscriptionId());
+ Y_VERIFY(subscription->Subscriber.ServiceId,
+ "%s ==> %s",
+ rec.ShortDebugString().c_str(),
+ subscription->ToString().c_str());
+ return true;
+ }
+
+ Self->PendingSubscriptionModifications.ModifiedLastProvided
+ .emplace(subscription->Id, TConfigId(rec.GetConfigId()));
+
+ // Update database.
+ Self->DbApplyPendingSubscriptionModifications(txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxUpdateLastProvidedConfig Complete");
+
+ if (!Self->PendingSubscriptionModifications.IsEmpty())
+ Self->ApplyPendingSubscriptionModifications(ctx);
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvConsole::TEvConfigNotificationResponse::TPtr Request;
+};
+
+ITransaction *TConfigsManager::CreateTxUpdateLastProvidedConfig(TEvConsole::TEvConfigNotificationResponse::TPtr &ev)
+{
+ return new TTxUpdateLastProvidedConfig(ev, this);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__update_pool_state.cpp b/ydb/core/cms/console/console__update_pool_state.cpp
index 5bbfe4a2238..1f12ff0e0d7 100644
--- a/ydb/core/cms/console/console__update_pool_state.cpp
+++ b/ydb/core/cms/console/console__update_pool_state.cpp
@@ -1,115 +1,115 @@
-#include "console_tenants_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TTenantsManager::TTxUpdatePoolState : public TTransactionBase<TTenantsManager> {
-public:
- TTxUpdatePoolState(TTenantsManager *self,
- TTenant::TPtr tenant,
- TStoragePool::TPtr pool,
+#include "console_tenants_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TTenantsManager::TTxUpdatePoolState : public TTransactionBase<TTenantsManager> {
+public:
+ TTxUpdatePoolState(TTenantsManager *self,
+ TTenant::TPtr tenant,
+ TStoragePool::TPtr pool,
TActorId worker,
- TStoragePool::EState state)
- : TBase(self)
- , Tenant(tenant)
- , Pool(pool)
- , Worker(worker)
- , State(state)
- , SubdomainVersion(Tenant->SubdomainVersion)
- , AllocatedNumGroups(pool->AllocatedNumGroups)
- , Update(false)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdatePoolState for pool " << Pool->Config.GetName() << " of " << Tenant->Path
- << " state=" << State);
-
- if (Tenant != Self->GetTenant(Tenant->Path)) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdatePoolState tenant " << Tenant->Path << " mismatch");
- return true;
- }
-
+ TStoragePool::EState state)
+ : TBase(self)
+ , Tenant(tenant)
+ , Pool(pool)
+ , Worker(worker)
+ , State(state)
+ , SubdomainVersion(Tenant->SubdomainVersion)
+ , AllocatedNumGroups(pool->AllocatedNumGroups)
+ , Update(false)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdatePoolState for pool " << Pool->Config.GetName() << " of " << Tenant->Path
+ << " state=" << State);
+
+ if (Tenant != Self->GetTenant(Tenant->Path)) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdatePoolState tenant " << Tenant->Path << " mismatch");
+ return true;
+ }
+
if (!Tenant->StoragePools.contains(Pool->Kind)
- || Pool != Tenant->StoragePools.at(Pool->Kind)) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdatePoolState pool " << Pool->Config.GetName() << " mismatch");
- return true;
- }
-
- if (Pool->Worker != Worker) {
- LOG_NOTICE_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdatePoolState pool " << Pool->Config.GetName() << " worker mismatch");
- return true;
- }
-
- if (State == TStoragePool::ALLOCATED)
- AllocatedNumGroups = Pool->Config.GetNumGroups();
- else if (State == TStoragePool::DELETED)
- AllocatedNumGroups = 0;
-
- Self->DbUpdatePoolState(Tenant, Pool, State, AllocatedNumGroups, txc, ctx);
-
- // If new pool was added then subdomain version should be incremented.
+ || Pool != Tenant->StoragePools.at(Pool->Kind)) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdatePoolState pool " << Pool->Config.GetName() << " mismatch");
+ return true;
+ }
+
+ if (Pool->Worker != Worker) {
+ LOG_NOTICE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdatePoolState pool " << Pool->Config.GetName() << " worker mismatch");
+ return true;
+ }
+
+ if (State == TStoragePool::ALLOCATED)
+ AllocatedNumGroups = Pool->Config.GetNumGroups();
+ else if (State == TStoragePool::DELETED)
+ AllocatedNumGroups = 0;
+
+ Self->DbUpdatePoolState(Tenant, Pool, State, AllocatedNumGroups, txc, ctx);
+
+ // If new pool was added then subdomain version should be incremented.
if (Pool->State == TStoragePool::NOT_ALLOCATED && AllocatedNumGroups > 0 ||
Pool->State == TStoragePool::NOT_UPDATED && AllocatedNumGroups > 0 && Pool->AllocatedNumGroups == 0)
{
- ++SubdomainVersion;
- Self->DbUpdateSubdomainVersion(Tenant, SubdomainVersion, txc, ctx);
- }
-
- Update = true;
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdatePoolState complete for " << Pool->Config.GetName());
-
- if (Update) {
- Self->Counters.Inc(Pool->Kind, COUNTER_ALLOCATED_STORAGE_UNITS,
- AllocatedNumGroups - Pool->AllocatedNumGroups);
-
+ ++SubdomainVersion;
+ Self->DbUpdateSubdomainVersion(Tenant, SubdomainVersion, txc, ctx);
+ }
+
+ Update = true;
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdatePoolState complete for " << Pool->Config.GetName());
+
+ if (Update) {
+ Self->Counters.Inc(Pool->Kind, COUNTER_ALLOCATED_STORAGE_UNITS,
+ AllocatedNumGroups - Pool->AllocatedNumGroups);
+
Pool->Worker = TActorId();
- Pool->State = State;
- Pool->AllocatedNumGroups = AllocatedNumGroups;
- Tenant->SubdomainVersion = SubdomainVersion;
-
- if (Tenant->State == TTenant::CREATING_POOLS && !Tenant->HasPoolsToCreate())
- Self->TxProcessor->ProcessTx(Self->CreateTxUpdateTenantState(Tenant->Path, TTenant::CREATING_SUBDOMAIN), ctx);
- else if (Tenant->State == TTenant::REMOVING_POOLS && !Tenant->HasPoolsToDelete())
- Self->TxProcessor->ProcessTx(Self->CreateTxRemoveTenantDone(Tenant), ctx);
- else if (Tenant->State == TTenant::RUNNING)
- Self->ProcessTenantActions(Tenant, ctx);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TTenant::TPtr Tenant;
- TStoragePool::TPtr Pool;
+ Pool->State = State;
+ Pool->AllocatedNumGroups = AllocatedNumGroups;
+ Tenant->SubdomainVersion = SubdomainVersion;
+
+ if (Tenant->State == TTenant::CREATING_POOLS && !Tenant->HasPoolsToCreate())
+ Self->TxProcessor->ProcessTx(Self->CreateTxUpdateTenantState(Tenant->Path, TTenant::CREATING_SUBDOMAIN), ctx);
+ else if (Tenant->State == TTenant::REMOVING_POOLS && !Tenant->HasPoolsToDelete())
+ Self->TxProcessor->ProcessTx(Self->CreateTxRemoveTenantDone(Tenant), ctx);
+ else if (Tenant->State == TTenant::RUNNING)
+ Self->ProcessTenantActions(Tenant, ctx);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TTenant::TPtr Tenant;
+ TStoragePool::TPtr Pool;
TActorId Worker;
- TStoragePool::EState State;
- ui64 SubdomainVersion;
- ui64 AllocatedNumGroups;
- bool Update;
-};
-
-ITransaction *TTenantsManager::CreateTxUpdatePoolState(TTenant::TPtr tenant,
- TStoragePool::TPtr pool,
+ TStoragePool::EState State;
+ ui64 SubdomainVersion;
+ ui64 AllocatedNumGroups;
+ bool Update;
+};
+
+ITransaction *TTenantsManager::CreateTxUpdatePoolState(TTenant::TPtr tenant,
+ TStoragePool::TPtr pool,
TActorId worker,
- TStoragePool::EState state)
-{
- return new TTxUpdatePoolState(this, tenant, pool, worker, state);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ TStoragePool::EState state)
+{
+ return new TTxUpdatePoolState(this, tenant, pool, worker, state);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__update_subdomain_key.cpp b/ydb/core/cms/console/console__update_subdomain_key.cpp
index 3dde5c7c991..6a9fcba8cb7 100644
--- a/ydb/core/cms/console/console__update_subdomain_key.cpp
+++ b/ydb/core/cms/console/console__update_subdomain_key.cpp
@@ -1,113 +1,113 @@
-#include "console_tenants_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TTenantsManager::TTxUpdateSubDomainKey : public TTransactionBase<TTenantsManager> {
-public:
- TTxUpdateSubDomainKey(TTenantsManager *self,
- const TString &path,
- ui64 schemeShardId,
- ui64 pathId,
+#include "console_tenants_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TTenantsManager::TTxUpdateSubDomainKey : public TTransactionBase<TTenantsManager> {
+public:
+ TTxUpdateSubDomainKey(TTenantsManager *self,
+ const TString &path,
+ ui64 schemeShardId,
+ ui64 pathId,
TActorId worker)
- : TBase(self)
- , Path(path)
- , SchemeShardId(schemeShardId)
- , PathId(pathId)
- , Worker(worker)
- {
- Y_VERIFY(SchemeShardId && PathId);
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdateSubDomainKey for tenant " << Path
- << " schemeshardid=" << SchemeShardId
- << " pathid=" << PathId);
-
- Tenant = Self->GetTenant(Path);
- if (!Tenant) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdateSubDomainKey cannot find tenant " << Path);
- return true;
- }
-
- // We are probably already removing this tenant.
- if (Tenant->IsRemoving()) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdateSubDomainKey found tenant " << Path
- << " in wrong state " << Tenant->State);
- Tenant = nullptr;
- return true;
- }
-
- Self->DbUpdateTenantSubdomain(Tenant, SchemeShardId, PathId, txc, ctx);
- if (Tenant->State == TTenant::CREATING_SUBDOMAIN)
- Self->DbUpdateTenantState(Tenant, TTenant::CONFIGURING_SUBDOMAIN, txc, ctx);
-
- for (auto &pr : Tenant->StoragePools) {
- auto config = pr.second->Config;
- TStoragePool::SetScopeId(config, SchemeShardId, PathId);
- Self->DbUpdatePoolConfig(Tenant, pr.second, config, txc, ctx);
-
- if (pr.second->State == TStoragePool::ALLOCATED)
- Self->DbUpdatePoolState(Tenant, pr.second, TStoragePool::NOT_UPDATED, txc, ctx);
- }
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdateSubDomainKey complete for " << Path);
-
- if (Tenant) {
+ : TBase(self)
+ , Path(path)
+ , SchemeShardId(schemeShardId)
+ , PathId(pathId)
+ , Worker(worker)
+ {
+ Y_VERIFY(SchemeShardId && PathId);
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdateSubDomainKey for tenant " << Path
+ << " schemeshardid=" << SchemeShardId
+ << " pathid=" << PathId);
+
+ Tenant = Self->GetTenant(Path);
+ if (!Tenant) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdateSubDomainKey cannot find tenant " << Path);
+ return true;
+ }
+
+ // We are probably already removing this tenant.
+ if (Tenant->IsRemoving()) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdateSubDomainKey found tenant " << Path
+ << " in wrong state " << Tenant->State);
+ Tenant = nullptr;
+ return true;
+ }
+
+ Self->DbUpdateTenantSubdomain(Tenant, SchemeShardId, PathId, txc, ctx);
+ if (Tenant->State == TTenant::CREATING_SUBDOMAIN)
+ Self->DbUpdateTenantState(Tenant, TTenant::CONFIGURING_SUBDOMAIN, txc, ctx);
+
+ for (auto &pr : Tenant->StoragePools) {
+ auto config = pr.second->Config;
+ TStoragePool::SetScopeId(config, SchemeShardId, PathId);
+ Self->DbUpdatePoolConfig(Tenant, pr.second, config, txc, ctx);
+
+ if (pr.second->State == TStoragePool::ALLOCATED)
+ Self->DbUpdatePoolState(Tenant, pr.second, TStoragePool::NOT_UPDATED, txc, ctx);
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdateSubDomainKey complete for " << Path);
+
+ if (Tenant) {
if (Tenant->DomainId) {
Self->TenantIdToName.erase(Tenant->DomainId);
}
Tenant->DomainId = TDomainId(SchemeShardId, PathId);
-
+
Y_VERIFY(!Self->TenantIdToName.contains(Tenant->DomainId));
Self->TenantIdToName[Tenant->DomainId] = Tenant->Path;
- if (Tenant->Worker == Worker)
+ if (Tenant->Worker == Worker)
Tenant->Worker = TActorId();
-
- for (auto &pr : Tenant->StoragePools) {
- pr.second->SetScopeId(SchemeShardId, PathId);
- if (pr.second->State == TStoragePool::ALLOCATED)
- pr.second->State = TStoragePool::NOT_UPDATED;
- }
-
- if (Tenant->State == TTenant::CREATING_SUBDOMAIN)
- Self->ChangeTenantState(Tenant, TTenant::CONFIGURING_SUBDOMAIN, ctx);
-
- Self->ProcessTenantActions(Tenant, ctx);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TTenant::TPtr Tenant;
- TString Path;
- ui64 SchemeShardId;
- ui64 PathId;
+
+ for (auto &pr : Tenant->StoragePools) {
+ pr.second->SetScopeId(SchemeShardId, PathId);
+ if (pr.second->State == TStoragePool::ALLOCATED)
+ pr.second->State = TStoragePool::NOT_UPDATED;
+ }
+
+ if (Tenant->State == TTenant::CREATING_SUBDOMAIN)
+ Self->ChangeTenantState(Tenant, TTenant::CONFIGURING_SUBDOMAIN, ctx);
+
+ Self->ProcessTenantActions(Tenant, ctx);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TTenant::TPtr Tenant;
+ TString Path;
+ ui64 SchemeShardId;
+ ui64 PathId;
TActorId Worker;
-};
-
-ITransaction *TTenantsManager::CreateTxUpdateSubDomainKey(const TString &path,
- ui64 schemeShardId,
- ui64 pathId,
+};
+
+ITransaction *TTenantsManager::CreateTxUpdateSubDomainKey(const TString &path,
+ ui64 schemeShardId,
+ ui64 pathId,
TActorId worker)
-{
- return new TTxUpdateSubDomainKey(this, path, schemeShardId, pathId, worker);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+{
+ return new TTxUpdateSubDomainKey(this, path, schemeShardId, pathId, worker);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console__update_tenant_state.cpp b/ydb/core/cms/console/console__update_tenant_state.cpp
index 6d1764e9274..ea916bcfd6d 100644
--- a/ydb/core/cms/console/console__update_tenant_state.cpp
+++ b/ydb/core/cms/console/console__update_tenant_state.cpp
@@ -1,74 +1,74 @@
-#include "console_tenants_manager.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TTenantsManager::TTxUpdateTenantState : public TTransactionBase<TTenantsManager> {
-public:
- TTxUpdateTenantState(TTenantsManager *self,
- const TString &path,
- TTenant::EState state,
+#include "console_tenants_manager.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TTenantsManager::TTxUpdateTenantState : public TTransactionBase<TTenantsManager> {
+public:
+ TTxUpdateTenantState(TTenantsManager *self,
+ const TString &path,
+ TTenant::EState state,
TActorId worker)
- : TBase(self)
- , Path(path)
- , State(state)
- , PrevState(state)
- , Worker(worker)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdateTenantState for tenant " << Path << " to " << State);
-
- Tenant = Self->GetTenant(Path);
- if (!Tenant) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdateTenantState cannot find tenant " << Path);
- return true;
- }
-
- PrevState = Tenant->State;
- if (Tenant->State == State)
- return true;
-
- Self->DbUpdateTenantState(Tenant, State, txc, ctx);
-
- return true;
- }
-
- void Complete(const TActorContext &executorCtx) override
- {
- auto ctx = executorCtx.MakeFor(Self->SelfId());
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "TTxUpdateTenantState complete for " << Path);
-
- if (Tenant && PrevState != State) {
- if (Tenant->Worker == Worker)
+ : TBase(self)
+ , Path(path)
+ , State(state)
+ , PrevState(state)
+ , Worker(worker)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdateTenantState for tenant " << Path << " to " << State);
+
+ Tenant = Self->GetTenant(Path);
+ if (!Tenant) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdateTenantState cannot find tenant " << Path);
+ return true;
+ }
+
+ PrevState = Tenant->State;
+ if (Tenant->State == State)
+ return true;
+
+ Self->DbUpdateTenantState(Tenant, State, txc, ctx);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &executorCtx) override
+ {
+ auto ctx = executorCtx.MakeFor(Self->SelfId());
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "TTxUpdateTenantState complete for " << Path);
+
+ if (Tenant && PrevState != State) {
+ if (Tenant->Worker == Worker)
Tenant->Worker = TActorId();
- Self->ChangeTenantState(Tenant, State, ctx);
- Self->ProcessTenantActions(Tenant, ctx);
- }
-
- Self->TxProcessor->TxCompleted(this, ctx);
- }
-
-private:
- TTenant::TPtr Tenant;
- TString Path;
- TTenant::EState State;
- TTenant::EState PrevState;
+ Self->ChangeTenantState(Tenant, State, ctx);
+ Self->ProcessTenantActions(Tenant, ctx);
+ }
+
+ Self->TxProcessor->TxCompleted(this, ctx);
+ }
+
+private:
+ TTenant::TPtr Tenant;
+ TString Path;
+ TTenant::EState State;
+ TTenant::EState PrevState;
TActorId Worker;
-};
-
-ITransaction *TTenantsManager::CreateTxUpdateTenantState(const TString &path,
- TTenant::EState state,
+};
+
+ITransaction *TTenantsManager::CreateTxUpdateTenantState(const TString &path,
+ TTenant::EState state,
TActorId worker)
-{
- return new TTxUpdateTenantState(this, path, state, worker);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+{
+ return new TTxUpdateTenantState(this, path, state, worker);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console_configs_manager.cpp b/ydb/core/cms/console/console_configs_manager.cpp
index 9be3b2a540e..a0415de947b 100644
--- a/ydb/core/cms/console/console_configs_manager.cpp
+++ b/ydb/core/cms/console/console_configs_manager.cpp
@@ -1,607 +1,607 @@
-#include "console_configs_manager.h"
-#include "console_configs_provider.h"
-#include "console_impl.h"
-#include "http.h"
-
+#include "console_configs_manager.h"
+#include "console_configs_provider.h"
+#include "console_impl.h"
+#include "http.h"
+
#include <ydb/core/cms/console/validators/registry.h>
-
+
#include <ydb/library/yql/public/issue/protos/issue_severity.pb.h>
-
-#include <util/generic/bitmap.h>
-#include <util/random/random.h>
+
+#include <util/generic/bitmap.h>
+#include <util/random/random.h>
#include <util/string/split.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-void TConfigsManager::ClearState()
-{
- ConfigIndex.Clear();
-}
-
-void TConfigsManager::SetConfig(const NKikimrConsole::TConfigsConfig &config)
-{
- Config.Parse(config);
- if (ConfigsProvider)
- Send(ConfigsProvider, new TConfigsProvider::TEvPrivate::TEvSetConfig(Config));
-}
-
-bool TConfigsManager::CheckConfig(const NKikimrConsole::TConfigsConfig &config,
- Ydb::StatusIds::StatusCode &code,
- TString &error)
-{
- if (!TConfigsConfig::Check(config, error)) {
- code = Ydb::StatusIds::BAD_REQUEST;
- return false;
- }
-
- TConfigsConfig newConfig;
- newConfig.Parse(config);
- for (auto &pr : ConfigIndex.GetConfigItems()) {
- if (!IsConfigItemScopeAllowed(pr.second, newConfig)) {
- code = Ydb::StatusIds::BAD_REQUEST;
- error = "config conflicts with usage scope of " + pr.second->ToString();
- return false;
- }
- }
-
- return true;
-}
-
-void TConfigsManager::Bootstrap(const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsManager::Bootstrap");
- Become(&TThis::StateWork);
-
- TxProcessor = Self.GetTxProcessor()->GetSubProcessor("configs",
- ctx,
- false,
- NKikimrServices::CMS_CONFIGS);
- ConfigsProvider = ctx.Register(new TConfigsProvider(ctx.SelfID));
-}
-
-void TConfigsManager::Detach()
-{
- Send(ConfigsProvider, new TEvents::TEvPoisonPill);
- PassAway();
-}
-
-void TConfigsManager::ApplyPendingConfigModifications(const TActorContext &ctx,
- TAutoPtr<IEventHandle> ev)
-{
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "Applying pending config modifications");
-
- for (auto id : PendingConfigModifications.RemovedItems)
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Remove " << ConfigIndex.GetItem(id)->ToString());
- for (auto &pr : PendingConfigModifications.ModifiedItems)
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Remove modified " << pr.second->ToString());
- for (auto &pr : PendingConfigModifications.ModifiedItems)
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Add modified " << pr.second->ToString());
- for (auto item : PendingConfigModifications.AddedItems)
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Add new " << item->ToString());
-
- PendingConfigModifications.ApplyTo(ConfigIndex);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Send configs update to configs provider.");
- auto req = MakeHolder<TConfigsProvider::TEvPrivate::TEvUpdateConfigs>(PendingConfigModifications, ev);
- ctx.Send(ConfigsProvider, req.Release());
-
- PendingConfigModifications.Clear();
-}
-
-void TConfigsManager::ApplyPendingSubscriptionModifications(const TActorContext &ctx,
- TAutoPtr<IEventHandle> ev)
-{
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "Applying pending subscription midifications");
-
- for (auto &id : PendingSubscriptionModifications.RemovedSubscriptions) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Remove subscription " << SubscriptionIndex.GetSubscription(id)->ToString());
- SubscriptionIndex.RemoveSubscription(id);
- }
- for (auto &subscription : PendingSubscriptionModifications.AddedSubscriptions) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Add subscription " << subscription->ToString());
- SubscriptionIndex.AddSubscription(subscription);
- }
- for (auto &pr : PendingSubscriptionModifications.ModifiedLastProvided) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Modify last provided config for subscription id=" << pr.first
- << " lastprovidedconfig=" << pr.second.ToString());
- SubscriptionIndex.GetSubscription(pr.first)->LastProvidedConfig = pr.second;
- }
- for (auto &pr : PendingSubscriptionModifications.ModifiedCookies) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Modify cookie for subscription id=" << pr.first
- << " cookie=" << pr.second);
- SubscriptionIndex.GetSubscription(pr.first)->Cookie = pr.second;
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Send subscriptions update to configs provider.");
- auto req = MakeHolder<TConfigsProvider::TEvPrivate::TEvUpdateSubscriptions>(PendingSubscriptionModifications, ev);
- ctx.Send(ConfigsProvider, req.Release());
-
- PendingSubscriptionModifications.Clear();
-}
-
-bool TConfigsManager::MakeNewSubscriptionChecks(TSubscription::TPtr subscription,
+
+namespace NKikimr {
+namespace NConsole {
+
+void TConfigsManager::ClearState()
+{
+ ConfigIndex.Clear();
+}
+
+void TConfigsManager::SetConfig(const NKikimrConsole::TConfigsConfig &config)
+{
+ Config.Parse(config);
+ if (ConfigsProvider)
+ Send(ConfigsProvider, new TConfigsProvider::TEvPrivate::TEvSetConfig(Config));
+}
+
+bool TConfigsManager::CheckConfig(const NKikimrConsole::TConfigsConfig &config,
+ Ydb::StatusIds::StatusCode &code,
+ TString &error)
+{
+ if (!TConfigsConfig::Check(config, error)) {
+ code = Ydb::StatusIds::BAD_REQUEST;
+ return false;
+ }
+
+ TConfigsConfig newConfig;
+ newConfig.Parse(config);
+ for (auto &pr : ConfigIndex.GetConfigItems()) {
+ if (!IsConfigItemScopeAllowed(pr.second, newConfig)) {
+ code = Ydb::StatusIds::BAD_REQUEST;
+ error = "config conflicts with usage scope of " + pr.second->ToString();
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void TConfigsManager::Bootstrap(const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsManager::Bootstrap");
+ Become(&TThis::StateWork);
+
+ TxProcessor = Self.GetTxProcessor()->GetSubProcessor("configs",
+ ctx,
+ false,
+ NKikimrServices::CMS_CONFIGS);
+ ConfigsProvider = ctx.Register(new TConfigsProvider(ctx.SelfID));
+}
+
+void TConfigsManager::Detach()
+{
+ Send(ConfigsProvider, new TEvents::TEvPoisonPill);
+ PassAway();
+}
+
+void TConfigsManager::ApplyPendingConfigModifications(const TActorContext &ctx,
+ TAutoPtr<IEventHandle> ev)
+{
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "Applying pending config modifications");
+
+ for (auto id : PendingConfigModifications.RemovedItems)
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Remove " << ConfigIndex.GetItem(id)->ToString());
+ for (auto &pr : PendingConfigModifications.ModifiedItems)
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Remove modified " << pr.second->ToString());
+ for (auto &pr : PendingConfigModifications.ModifiedItems)
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Add modified " << pr.second->ToString());
+ for (auto item : PendingConfigModifications.AddedItems)
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Add new " << item->ToString());
+
+ PendingConfigModifications.ApplyTo(ConfigIndex);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Send configs update to configs provider.");
+ auto req = MakeHolder<TConfigsProvider::TEvPrivate::TEvUpdateConfigs>(PendingConfigModifications, ev);
+ ctx.Send(ConfigsProvider, req.Release());
+
+ PendingConfigModifications.Clear();
+}
+
+void TConfigsManager::ApplyPendingSubscriptionModifications(const TActorContext &ctx,
+ TAutoPtr<IEventHandle> ev)
+{
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "Applying pending subscription midifications");
+
+ for (auto &id : PendingSubscriptionModifications.RemovedSubscriptions) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Remove subscription " << SubscriptionIndex.GetSubscription(id)->ToString());
+ SubscriptionIndex.RemoveSubscription(id);
+ }
+ for (auto &subscription : PendingSubscriptionModifications.AddedSubscriptions) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Add subscription " << subscription->ToString());
+ SubscriptionIndex.AddSubscription(subscription);
+ }
+ for (auto &pr : PendingSubscriptionModifications.ModifiedLastProvided) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Modify last provided config for subscription id=" << pr.first
+ << " lastprovidedconfig=" << pr.second.ToString());
+ SubscriptionIndex.GetSubscription(pr.first)->LastProvidedConfig = pr.second;
+ }
+ for (auto &pr : PendingSubscriptionModifications.ModifiedCookies) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Modify cookie for subscription id=" << pr.first
+ << " cookie=" << pr.second);
+ SubscriptionIndex.GetSubscription(pr.first)->Cookie = pr.second;
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Send subscriptions update to configs provider.");
+ auto req = MakeHolder<TConfigsProvider::TEvPrivate::TEvUpdateSubscriptions>(PendingSubscriptionModifications, ev);
+ ctx.Send(ConfigsProvider, req.Release());
+
+ PendingSubscriptionModifications.Clear();
+}
+
+bool TConfigsManager::MakeNewSubscriptionChecks(TSubscription::TPtr subscription,
Ydb::StatusIds::StatusCode &code,
- TString &error)
-{
- if (subscription->Id) {
+ TString &error)
+{
+ if (subscription->Id) {
code = Ydb::StatusIds::BAD_REQUEST;
- error = "subscription id shouldn't be defined";
- return false;
- }
-
- if (!subscription->Subscriber.TabletId && !subscription->Subscriber.ServiceId) {
+ error = "subscription id shouldn't be defined";
+ return false;
+ }
+
+ if (!subscription->Subscriber.TabletId && !subscription->Subscriber.ServiceId) {
code = Ydb::StatusIds::BAD_REQUEST;
- error = "no subscriber specified";
- return false;
- }
-
- if (subscription->Subscriber.ServiceId && !subscription->Subscriber.ServiceId.IsService()) {
+ error = "no subscriber specified";
+ return false;
+ }
+
+ if (subscription->Subscriber.ServiceId && !subscription->Subscriber.ServiceId.IsService()) {
code = Ydb::StatusIds::BAD_REQUEST;
- error = "wrong service id";
- return false;
- }
-
- if (subscription->ItemKinds.empty()) {
+ error = "wrong service id";
+ return false;
+ }
+
+ if (subscription->ItemKinds.empty()) {
code = Ydb::StatusIds::BAD_REQUEST;
- error = "no item kinds specified";
- return false;
- }
-
- return true;
-}
-
-bool TConfigsManager::IsConfigItemScopeAllowed(TConfigItem::TPtr item)
-{
- return IsConfigItemScopeAllowed(item, Config);
-}
-
-bool TConfigsManager::IsConfigItemScopeAllowed(TConfigItem::TPtr item,
- const TConfigsConfig &config)
-{
- if (item->UsageScope.NodeIds.size())
+ error = "no item kinds specified";
+ return false;
+ }
+
+ return true;
+}
+
+bool TConfigsManager::IsConfigItemScopeAllowed(TConfigItem::TPtr item)
+{
+ return IsConfigItemScopeAllowed(item, Config);
+}
+
+bool TConfigsManager::IsConfigItemScopeAllowed(TConfigItem::TPtr item,
+ const TConfigsConfig &config)
+{
+ if (item->UsageScope.NodeIds.size())
return config.AllowedNodeIdScopeKinds.contains(item->Kind);
- if (item->UsageScope.Hosts.size()) {
- for (auto &host : item->UsageScope.Hosts)
- if (host.find(' ') != TString::npos)
- return false;
+ if (item->UsageScope.Hosts.size()) {
+ for (auto &host : item->UsageScope.Hosts)
+ if (host.find(' ') != TString::npos)
+ return false;
return config.AllowedHostScopeKinds.contains(item->Kind);
- }
- if (item->UsageScope.Tenant && item->UsageScope.NodeType)
+ }
+ if (item->UsageScope.Tenant && item->UsageScope.NodeType)
return (config.AllowedTenantScopeKinds.contains(item->Kind)
&& config.AllowedNodeTypeScopeKinds.contains(item->Kind));
- if (item->UsageScope.Tenant)
+ if (item->UsageScope.Tenant)
return config.AllowedTenantScopeKinds.contains(item->Kind);
- if (item->UsageScope.NodeType)
+ if (item->UsageScope.NodeType)
return config.AllowedNodeTypeScopeKinds.contains(item->Kind);
return !config.DisallowedDomainScopeKinds.contains(item->Kind);
-}
-
-bool TConfigsManager::IsSupportedMergeStrategy(ui32 value) const
-{
- return NKikimrConsole::TConfigItem::EMergeStrategy_IsValid(value);
-}
-
-void TConfigsManager::DumpStateHTML(IOutputStream &os) const
-{
- HTML(os) {
- PRE() {
- os << "Used config:" << Endl
- << Self.GetConfig().GetConfigsConfig().DebugString() << Endl;
- }
- COLLAPSED_REF_CONTENT("configs-items-div", "Config items by kind") {
- DIV_CLASS("tab-left") {
- TOrderedConfigItemsMap itemsByKind;
- TSet<ui32> kinds;
- for (auto &pr : ConfigIndex.GetConfigItems()) {
- itemsByKind[pr.second->Kind].insert(pr.second);
- kinds.insert(pr.second->Kind);
- }
- for (auto kind : kinds) {
- auto &items = itemsByKind.at(kind);
- TString id = TStringBuilder() << "configs-items-" << kind;
- COLLAPSED_REF_CONTENT(id, TConfigItem::KindName(kind) + "s") {
- DIV_CLASS("tab-left") {
- for (auto item : items) {
- PRE() {
- os << "#" << item->Id << Endl
- << "Scope: " << item->UsageScope.ToString() << Endl
- << "Merge: " << item->MergeStrategyName() << Endl
- << "Cookie: " << item->Cookie << Endl
- << "Config: " << Endl
- << item->Config.DebugString();
- }
- }
- }
- }
- os << "<br/>" << Endl;
- }
- }
- }
- os << "<br/>" << Endl;
- COLLAPSED_REF_CONTENT("subscriptions-div", "Subscriptions") {
- DIV_CLASS("tab-left") {
- THashMap<TDynBitMap, TSubscriptionSet> subscriptionsByKind;
- for (auto &pr : SubscriptionIndex.GetSubscriptions()) {
- TDynBitMap kinds;
- for (auto &kind : pr.second->ItemKinds)
- kinds.Set(kind);
- subscriptionsByKind[kinds].insert(pr.second);
- }
-
- for (auto &pr : subscriptionsByKind) {
- TString kinds;
- bool first = true;
- Y_FOR_EACH_BIT(kind, pr.first) {
- kinds += (first ? TString() : TString(", ")) + TConfigItem::KindName(kind);
- first = false;
- }
- TString id = TStringBuilder() << "subscriptions-" << (void*)&pr.second;
- COLLAPSED_REF_CONTENT(id, kinds) {
- DIV_CLASS("tab-left") {
- for (auto subscription : pr.second) {
- PRE() {
- os << "#" << subscription->Id << Endl
- << "Subscriber: ";
- if (subscription->Subscriber.TabletId)
- os << "tablet " << subscription->Subscriber.TabletId << Endl;
- else
- os << "service " << subscription->Subscriber.ServiceId << Endl;
- os << "Config node ID: " << subscription->NodeId << Endl
- << "Config host: " << subscription->Host << Endl
- << "Config tenant: " << subscription->Tenant << Endl
- << "Config node type: " << subscription->NodeType << Endl
- << "LastProvidedConfig: " << subscription->LastProvidedConfig.ToString() << Endl
- << "CurrentConfigId: " << subscription->CurrentConfigId.ToString() << Endl
- << "Worker: " << subscription->Worker << Endl
- << "Cookie: " << subscription->Cookie << Endl
- << "Current config:" << Endl
- << subscription->CurrentConfig.DebugString();
- }
- }
- }
- }
- os << "<br/>" << Endl;
- }
- }
- }
- }
-}
-
-void TConfigsManager::DbApplyPendingConfigModifications(TTransactionContext &txc,
- const TActorContext &ctx) const
-{
- for (auto item : PendingConfigModifications.AddedItems)
- DbUpdateItem(item, txc, ctx);
- for (auto &pr : PendingConfigModifications.ModifiedItems)
- DbUpdateItem(pr.second, txc, ctx);
- for (auto id : PendingConfigModifications.RemovedItems)
- DbRemoveItem(id, txc, ctx);
-}
-
-void TConfigsManager::DbApplyPendingSubscriptionModifications(TTransactionContext &txc,
- const TActorContext &ctx) const
-{
- for (auto &id : PendingSubscriptionModifications.RemovedSubscriptions)
- DbRemoveSubscription(id, txc, ctx);
- for (auto &subscription : PendingSubscriptionModifications.AddedSubscriptions)
- DbUpdateSubscription(subscription, txc, ctx);
- for (auto &pr : PendingSubscriptionModifications.ModifiedLastProvided)
- DbUpdateSubscriptionLastProvidedConfig(pr.first, pr.second, txc, ctx);
-}
-
-bool TConfigsManager::DbLoadState(TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "Loading configs state");
-
- NIceDb::TNiceDb db(txc.DB);
- auto nextConfigItemIdRow = db.Table<Schema::Config>().Key(TConsole::ConfigKeyNextConfigItemId).Select<Schema::Config::Value>();
- auto nextSubscriptionIdRow = db.Table<Schema::Config>().Key(TConsole::ConfigKeyNextSubscriptionId).Select<Schema::Config::Value>();
- auto configItemRowset = db.Table<Schema::ConfigItems>().Range().Select<Schema::ConfigItems::TColumns>();
- auto subscriptionRowset = db.Table<Schema::ConfigSubscriptions>().Range().Select<Schema::ConfigSubscriptions::TColumns>();
- auto validatorsRowset = db.Table<Schema::DisabledValidators>().Range().Select<Schema::DisabledValidators::TColumns>();
-
- if (!configItemRowset.IsReady()
- || !nextConfigItemIdRow.IsReady()
- || !nextSubscriptionIdRow.IsReady()
- || !subscriptionRowset.IsReady()
- || !validatorsRowset.IsReady())
- return false;
-
- if (nextConfigItemIdRow.IsValid()) {
- TString value = nextConfigItemIdRow.GetValue<Schema::Config::Value>();
- NextConfigItemId = FromString<ui64>(value);
- } else {
- NextConfigItemId = 1;
- }
-
- if (nextSubscriptionIdRow.IsValid()) {
- TString value = nextSubscriptionIdRow.GetValue<Schema::Config::Value>();
- NextSubscriptionId = FromString<ui64>(value);
- } else {
- NextSubscriptionId = 1;
- }
-
- while (!configItemRowset.EndOfSet()) {
- ui64 id = configItemRowset.GetValue<Schema::ConfigItems::Id>();
- ui64 generation = configItemRowset.GetValue<Schema::ConfigItems::Generation>();
- ui32 kind = configItemRowset.GetValue<Schema::ConfigItems::Kind>();
- TVector<ui32> nodes = configItemRowset.GetValue<Schema::ConfigItems::NodeIds>();
- TString hostsVal = configItemRowset.GetValue<Schema::ConfigItems::Hosts>();
- TVector<TString> hosts = StringSplitter(hostsVal).Split(' ').SkipEmpty().ToList<TString>();
- TString tenant = configItemRowset.GetValue<Schema::ConfigItems::Tenant>();
- TString nodeType = configItemRowset.GetValue<Schema::ConfigItems::NodeType>();
- ui32 order = configItemRowset.GetValue<Schema::ConfigItems::Order>();
- ui32 merge = configItemRowset.GetValue<Schema::ConfigItems::Merge>();
- TString config = configItemRowset.GetValue<Schema::ConfigItems::Config>();
- TString cookie = configItemRowset.GetValue<Schema::ConfigItems::Cookie>();
-
- TConfigItem::TPtr item = new TConfigItem;
- item->Id = id;
- item->Generation = generation;
- item->Kind = kind;
- for (auto id : nodes)
- item->UsageScope.NodeIds.insert(id);
- for (auto &host : hosts)
- item->UsageScope.Hosts.insert(host);
- item->UsageScope.Tenant = tenant;
- item->UsageScope.NodeType = nodeType;
- item->UsageScope.Order = order;
- item->MergeStrategy = merge;
+}
+
+bool TConfigsManager::IsSupportedMergeStrategy(ui32 value) const
+{
+ return NKikimrConsole::TConfigItem::EMergeStrategy_IsValid(value);
+}
+
+void TConfigsManager::DumpStateHTML(IOutputStream &os) const
+{
+ HTML(os) {
+ PRE() {
+ os << "Used config:" << Endl
+ << Self.GetConfig().GetConfigsConfig().DebugString() << Endl;
+ }
+ COLLAPSED_REF_CONTENT("configs-items-div", "Config items by kind") {
+ DIV_CLASS("tab-left") {
+ TOrderedConfigItemsMap itemsByKind;
+ TSet<ui32> kinds;
+ for (auto &pr : ConfigIndex.GetConfigItems()) {
+ itemsByKind[pr.second->Kind].insert(pr.second);
+ kinds.insert(pr.second->Kind);
+ }
+ for (auto kind : kinds) {
+ auto &items = itemsByKind.at(kind);
+ TString id = TStringBuilder() << "configs-items-" << kind;
+ COLLAPSED_REF_CONTENT(id, TConfigItem::KindName(kind) + "s") {
+ DIV_CLASS("tab-left") {
+ for (auto item : items) {
+ PRE() {
+ os << "#" << item->Id << Endl
+ << "Scope: " << item->UsageScope.ToString() << Endl
+ << "Merge: " << item->MergeStrategyName() << Endl
+ << "Cookie: " << item->Cookie << Endl
+ << "Config: " << Endl
+ << item->Config.DebugString();
+ }
+ }
+ }
+ }
+ os << "<br/>" << Endl;
+ }
+ }
+ }
+ os << "<br/>" << Endl;
+ COLLAPSED_REF_CONTENT("subscriptions-div", "Subscriptions") {
+ DIV_CLASS("tab-left") {
+ THashMap<TDynBitMap, TSubscriptionSet> subscriptionsByKind;
+ for (auto &pr : SubscriptionIndex.GetSubscriptions()) {
+ TDynBitMap kinds;
+ for (auto &kind : pr.second->ItemKinds)
+ kinds.Set(kind);
+ subscriptionsByKind[kinds].insert(pr.second);
+ }
+
+ for (auto &pr : subscriptionsByKind) {
+ TString kinds;
+ bool first = true;
+ Y_FOR_EACH_BIT(kind, pr.first) {
+ kinds += (first ? TString() : TString(", ")) + TConfigItem::KindName(kind);
+ first = false;
+ }
+ TString id = TStringBuilder() << "subscriptions-" << (void*)&pr.second;
+ COLLAPSED_REF_CONTENT(id, kinds) {
+ DIV_CLASS("tab-left") {
+ for (auto subscription : pr.second) {
+ PRE() {
+ os << "#" << subscription->Id << Endl
+ << "Subscriber: ";
+ if (subscription->Subscriber.TabletId)
+ os << "tablet " << subscription->Subscriber.TabletId << Endl;
+ else
+ os << "service " << subscription->Subscriber.ServiceId << Endl;
+ os << "Config node ID: " << subscription->NodeId << Endl
+ << "Config host: " << subscription->Host << Endl
+ << "Config tenant: " << subscription->Tenant << Endl
+ << "Config node type: " << subscription->NodeType << Endl
+ << "LastProvidedConfig: " << subscription->LastProvidedConfig.ToString() << Endl
+ << "CurrentConfigId: " << subscription->CurrentConfigId.ToString() << Endl
+ << "Worker: " << subscription->Worker << Endl
+ << "Cookie: " << subscription->Cookie << Endl
+ << "Current config:" << Endl
+ << subscription->CurrentConfig.DebugString();
+ }
+ }
+ }
+ }
+ os << "<br/>" << Endl;
+ }
+ }
+ }
+ }
+}
+
+void TConfigsManager::DbApplyPendingConfigModifications(TTransactionContext &txc,
+ const TActorContext &ctx) const
+{
+ for (auto item : PendingConfigModifications.AddedItems)
+ DbUpdateItem(item, txc, ctx);
+ for (auto &pr : PendingConfigModifications.ModifiedItems)
+ DbUpdateItem(pr.second, txc, ctx);
+ for (auto id : PendingConfigModifications.RemovedItems)
+ DbRemoveItem(id, txc, ctx);
+}
+
+void TConfigsManager::DbApplyPendingSubscriptionModifications(TTransactionContext &txc,
+ const TActorContext &ctx) const
+{
+ for (auto &id : PendingSubscriptionModifications.RemovedSubscriptions)
+ DbRemoveSubscription(id, txc, ctx);
+ for (auto &subscription : PendingSubscriptionModifications.AddedSubscriptions)
+ DbUpdateSubscription(subscription, txc, ctx);
+ for (auto &pr : PendingSubscriptionModifications.ModifiedLastProvided)
+ DbUpdateSubscriptionLastProvidedConfig(pr.first, pr.second, txc, ctx);
+}
+
+bool TConfigsManager::DbLoadState(TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "Loading configs state");
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto nextConfigItemIdRow = db.Table<Schema::Config>().Key(TConsole::ConfigKeyNextConfigItemId).Select<Schema::Config::Value>();
+ auto nextSubscriptionIdRow = db.Table<Schema::Config>().Key(TConsole::ConfigKeyNextSubscriptionId).Select<Schema::Config::Value>();
+ auto configItemRowset = db.Table<Schema::ConfigItems>().Range().Select<Schema::ConfigItems::TColumns>();
+ auto subscriptionRowset = db.Table<Schema::ConfigSubscriptions>().Range().Select<Schema::ConfigSubscriptions::TColumns>();
+ auto validatorsRowset = db.Table<Schema::DisabledValidators>().Range().Select<Schema::DisabledValidators::TColumns>();
+
+ if (!configItemRowset.IsReady()
+ || !nextConfigItemIdRow.IsReady()
+ || !nextSubscriptionIdRow.IsReady()
+ || !subscriptionRowset.IsReady()
+ || !validatorsRowset.IsReady())
+ return false;
+
+ if (nextConfigItemIdRow.IsValid()) {
+ TString value = nextConfigItemIdRow.GetValue<Schema::Config::Value>();
+ NextConfigItemId = FromString<ui64>(value);
+ } else {
+ NextConfigItemId = 1;
+ }
+
+ if (nextSubscriptionIdRow.IsValid()) {
+ TString value = nextSubscriptionIdRow.GetValue<Schema::Config::Value>();
+ NextSubscriptionId = FromString<ui64>(value);
+ } else {
+ NextSubscriptionId = 1;
+ }
+
+ while (!configItemRowset.EndOfSet()) {
+ ui64 id = configItemRowset.GetValue<Schema::ConfigItems::Id>();
+ ui64 generation = configItemRowset.GetValue<Schema::ConfigItems::Generation>();
+ ui32 kind = configItemRowset.GetValue<Schema::ConfigItems::Kind>();
+ TVector<ui32> nodes = configItemRowset.GetValue<Schema::ConfigItems::NodeIds>();
+ TString hostsVal = configItemRowset.GetValue<Schema::ConfigItems::Hosts>();
+ TVector<TString> hosts = StringSplitter(hostsVal).Split(' ').SkipEmpty().ToList<TString>();
+ TString tenant = configItemRowset.GetValue<Schema::ConfigItems::Tenant>();
+ TString nodeType = configItemRowset.GetValue<Schema::ConfigItems::NodeType>();
+ ui32 order = configItemRowset.GetValue<Schema::ConfigItems::Order>();
+ ui32 merge = configItemRowset.GetValue<Schema::ConfigItems::Merge>();
+ TString config = configItemRowset.GetValue<Schema::ConfigItems::Config>();
+ TString cookie = configItemRowset.GetValue<Schema::ConfigItems::Cookie>();
+
+ TConfigItem::TPtr item = new TConfigItem;
+ item->Id = id;
+ item->Generation = generation;
+ item->Kind = kind;
+ for (auto id : nodes)
+ item->UsageScope.NodeIds.insert(id);
+ for (auto &host : hosts)
+ item->UsageScope.Hosts.insert(host);
+ item->UsageScope.Tenant = tenant;
+ item->UsageScope.NodeType = nodeType;
+ item->UsageScope.Order = order;
+ item->MergeStrategy = merge;
Y_PROTOBUF_SUPPRESS_NODISCARD item->Config.ParseFromArray(config.data(), config.size());
- item->Cookie = cookie;
- ConfigIndex.AddItem(item);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Loaded " << item->ToString());
-
- if (!configItemRowset.Next())
- return false;
- }
-
- while (!subscriptionRowset.EndOfSet()) {
- ui64 id = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::Id>();
- ui64 tabletId = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::TabletId>();
+ item->Cookie = cookie;
+ ConfigIndex.AddItem(item);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS, "Loaded " << item->ToString());
+
+ if (!configItemRowset.Next())
+ return false;
+ }
+
+ while (!subscriptionRowset.EndOfSet()) {
+ ui64 id = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::Id>();
+ ui64 tabletId = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::TabletId>();
TActorId serviceId = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::ServiceId>();
- ui32 nodeId = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::NodeId>();
- TString host = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::Host>();
- TString tenant = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::Tenant>();
- TString nodeType = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::NodeType>();
- TVector<ui32> kinds = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::ItemKinds>();
- TVector<std::pair<ui64, ui64>> configId = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::LastProvidedConfig>();
-
- TSubscription::TPtr subscription = new TSubscription;
- subscription->Id = id;
- subscription->Subscriber.TabletId = tabletId;
- subscription->Subscriber.ServiceId = serviceId;
- subscription->NodeId = nodeId;
- subscription->Host = host;
- subscription->Tenant = tenant;
- subscription->NodeType = nodeType;
- subscription->ItemKinds.insert(kinds.begin(), kinds.end());
- subscription->LastProvidedConfig.ItemIds = std::move(configId);
- subscription->Cookie = RandomNumber<ui64>();
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Loaded subscription: " << subscription->ToString());
-
- SubscriptionIndex.AddSubscription(subscription);
-
- if (!subscriptionRowset.Next())
- return false;
- }
-
- auto registry = TValidatorsRegistry::Instance();
- registry->EnableValidators();
- DisabledValidators.clear();
-
- while (!validatorsRowset.EndOfSet()) {
- TString name = validatorsRowset.GetValue<Schema::DisabledValidators::Name>();
-
- DisabledValidators.insert(name);
- registry->DisableValidator(name);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Disable validator " << name);
-
- if (!validatorsRowset.Next())
- return false;
- }
-
- return true;
-}
-
-void TConfigsManager::DbRemoveItem(ui64 id,
- TTransactionContext &txc,
- const TActorContext &ctx) const
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Database: removing config item #" << id);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::ConfigItems>().Key(id).Delete();
-}
-
-void TConfigsManager::DbRemoveSubscription(ui64 id,
- TTransactionContext &txc,
- const TActorContext &ctx) const
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Database: removing subscription id=" << id);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::ConfigSubscriptions>().Key(id).Delete();
-}
-
-void TConfigsManager::DbUpdateItem(TConfigItem::TPtr item,
- TTransactionContext &txc,
- const TActorContext &ctx) const
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Database: "
- << (ConfigIndex.GetItem(item->Id) ? "updating " : "adding ") << item->ToString());
-
- TString config;
+ ui32 nodeId = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::NodeId>();
+ TString host = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::Host>();
+ TString tenant = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::Tenant>();
+ TString nodeType = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::NodeType>();
+ TVector<ui32> kinds = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::ItemKinds>();
+ TVector<std::pair<ui64, ui64>> configId = subscriptionRowset.GetValue<Schema::ConfigSubscriptions::LastProvidedConfig>();
+
+ TSubscription::TPtr subscription = new TSubscription;
+ subscription->Id = id;
+ subscription->Subscriber.TabletId = tabletId;
+ subscription->Subscriber.ServiceId = serviceId;
+ subscription->NodeId = nodeId;
+ subscription->Host = host;
+ subscription->Tenant = tenant;
+ subscription->NodeType = nodeType;
+ subscription->ItemKinds.insert(kinds.begin(), kinds.end());
+ subscription->LastProvidedConfig.ItemIds = std::move(configId);
+ subscription->Cookie = RandomNumber<ui64>();
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Loaded subscription: " << subscription->ToString());
+
+ SubscriptionIndex.AddSubscription(subscription);
+
+ if (!subscriptionRowset.Next())
+ return false;
+ }
+
+ auto registry = TValidatorsRegistry::Instance();
+ registry->EnableValidators();
+ DisabledValidators.clear();
+
+ while (!validatorsRowset.EndOfSet()) {
+ TString name = validatorsRowset.GetValue<Schema::DisabledValidators::Name>();
+
+ DisabledValidators.insert(name);
+ registry->DisableValidator(name);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Disable validator " << name);
+
+ if (!validatorsRowset.Next())
+ return false;
+ }
+
+ return true;
+}
+
+void TConfigsManager::DbRemoveItem(ui64 id,
+ TTransactionContext &txc,
+ const TActorContext &ctx) const
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Database: removing config item #" << id);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::ConfigItems>().Key(id).Delete();
+}
+
+void TConfigsManager::DbRemoveSubscription(ui64 id,
+ TTransactionContext &txc,
+ const TActorContext &ctx) const
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Database: removing subscription id=" << id);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::ConfigSubscriptions>().Key(id).Delete();
+}
+
+void TConfigsManager::DbUpdateItem(TConfigItem::TPtr item,
+ TTransactionContext &txc,
+ const TActorContext &ctx) const
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Database: "
+ << (ConfigIndex.GetItem(item->Id) ? "updating " : "adding ") << item->ToString());
+
+ TString config;
Y_PROTOBUF_SUPPRESS_NODISCARD item->Config.SerializeToString(&config);
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::ConfigItems>().Key(item->Id)
- .Update(NIceDb::TUpdate<Schema::ConfigItems::Generation>(item->Generation))
- .Update(NIceDb::TUpdate<Schema::ConfigItems::Kind>(item->Kind))
- .Update(NIceDb::TUpdate<Schema::ConfigItems::NodeIds>({item->UsageScope.NodeIds.begin(), item->UsageScope.NodeIds.end()}))
- .Update(NIceDb::TUpdate<Schema::ConfigItems::Hosts>(JoinSeq(" ", item->UsageScope.Hosts)))
- .Update(NIceDb::TUpdate<Schema::ConfigItems::Tenant>(item->UsageScope.Tenant))
- .Update(NIceDb::TUpdate<Schema::ConfigItems::NodeType>(item->UsageScope.NodeType))
- .Update(NIceDb::TUpdate<Schema::ConfigItems::Order>(item->UsageScope.Order))
- .Update(NIceDb::TUpdate<Schema::ConfigItems::Merge>(item->MergeStrategy))
- .Update(NIceDb::TUpdate<Schema::ConfigItems::Config>(config))
- .Update(NIceDb::TUpdate<Schema::ConfigItems::Cookie>(item->Cookie));
-}
-
-void TConfigsManager::DbUpdateNextConfigItemId(TTransactionContext &txc,
- const TActorContext &ctx) const
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Database: update NextConfigItemId: " << NextConfigItemId);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Config>().Key(TConsole::ConfigKeyNextConfigItemId)
- .Update(NIceDb::TUpdate<Schema::Config::Value>(ToString(NextConfigItemId)));
-}
-
-void TConfigsManager::DbUpdateNextSubscriptionId(TTransactionContext &txc,
- const TActorContext &ctx) const
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Database: update NextSubscriptionId: " << NextSubscriptionId);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Config>().Key(TConsole::ConfigKeyNextSubscriptionId)
- .Update(NIceDb::TUpdate<Schema::Config::Value>(ToString(NextSubscriptionId)));
-}
-
-void TConfigsManager::DbUpdateSubscription(TSubscription::TPtr subscription,
- TTransactionContext &txc,
- const TActorContext &ctx) const
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Database: update subscription:" << subscription->ToString());
-
- TVector<ui32> kinds(subscription->ItemKinds.begin(), subscription->ItemKinds.end());
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::ConfigSubscriptions>().Key(subscription->Id)
- .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::TabletId>(subscription->Subscriber.TabletId))
- .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::ServiceId>(subscription->Subscriber.ServiceId))
- .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::NodeId>(subscription->NodeId))
- .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::Host>(subscription->Host))
- .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::Tenant>(subscription->Tenant))
- .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::NodeType>(subscription->NodeType))
- .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::ItemKinds>(kinds))
- .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::LastProvidedConfig>(subscription->LastProvidedConfig.ItemIds));
-}
-
-void TConfigsManager::DbUpdateSubscriptionLastProvidedConfig(ui64 id,
- const TConfigId &configId,
- TTransactionContext &txc,
- const TActorContext &ctx) const
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Database: "
- << "update last provided config for subscription"
- << " id=" << id
- << " lastprovidedconfig=" << configId.ToString());
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::ConfigSubscriptions>().Key(id)
- .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::LastProvidedConfig>(configId.ItemIds));
-}
-
-void TConfigsManager::Handle(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx)
-{
- TxProcessor->ProcessTx(CreateTxAddConfigSubscription(ev), ctx);
-}
-
-void TConfigsManager::Handle(TEvConsole::TEvConfigNotificationResponse::TPtr &ev, const TActorContext &ctx)
-{
- TxProcessor->ProcessTx(CreateTxUpdateLastProvidedConfig(ev), ctx);
-}
-
-void TConfigsManager::Handle(TEvConsole::TEvConfigureRequest::TPtr &ev, const TActorContext &ctx)
-{
- TxProcessor->ProcessTx(CreateTxConfigure(ev), ctx);
-}
-
-void TConfigsManager::Handle(TEvConsole::TEvListConfigValidatorsRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto response = MakeHolder<TEvConsole::TEvListConfigValidatorsResponse>();
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- auto registry = TValidatorsRegistry::Instance();
- for (auto &pr : registry->GetValidators()) {
- auto &entry = *response->Record.AddValidators();
- entry.SetName(pr.first);
- entry.SetDescription(pr.second->GetDescription());
- for (auto kind : pr.second->GetCheckedConfigItemKinds())
- entry.AddCheckedItemKinds(kind);
- entry.SetEnabled(pr.second->IsEnabled());
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvListConfigValidatorsResponse: " << response->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
-}
-
-void TConfigsManager::Handle(TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx)
-{
- TxProcessor->ProcessTx(CreateTxRemoveConfigSubscription(ev), ctx);
-}
-
-void TConfigsManager::Handle(TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx)
-{
- TxProcessor->ProcessTx(CreateTxRemoveConfigSubscriptions(ev), ctx);
-}
-
-void TConfigsManager::Handle(TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx)
-{
- TxProcessor->ProcessTx(CreateTxReplaceConfigSubscriptions(ev), ctx);
-}
-
-void TConfigsManager::Handle(TEvConsole::TEvToggleConfigValidatorRequest::TPtr &ev, const TActorContext &ctx)
-{
- TxProcessor->ProcessTx(CreateTxToggleConfigValidator(ev), ctx);
-}
-
-void TConfigsManager::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev, const TActorContext &ctx)
-{
- TxProcessor->ProcessTx(CreateTxCleanupSubscriptions(ev), ctx);
-}
-
-void TConfigsManager::Handle(TEvPrivate::TEvStateLoaded::TPtr &/*ev*/, const TActorContext &ctx)
-{
- ctx.Send(ConfigsProvider, new TConfigsProvider::TEvPrivate::TEvSetConfigs(ConfigIndex.GetConfigItems()));
- ctx.Send(ConfigsProvider, new TConfigsProvider::TEvPrivate::TEvSetSubscriptions(SubscriptionIndex.GetSubscriptions()));
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::ConfigItems>().Key(item->Id)
+ .Update(NIceDb::TUpdate<Schema::ConfigItems::Generation>(item->Generation))
+ .Update(NIceDb::TUpdate<Schema::ConfigItems::Kind>(item->Kind))
+ .Update(NIceDb::TUpdate<Schema::ConfigItems::NodeIds>({item->UsageScope.NodeIds.begin(), item->UsageScope.NodeIds.end()}))
+ .Update(NIceDb::TUpdate<Schema::ConfigItems::Hosts>(JoinSeq(" ", item->UsageScope.Hosts)))
+ .Update(NIceDb::TUpdate<Schema::ConfigItems::Tenant>(item->UsageScope.Tenant))
+ .Update(NIceDb::TUpdate<Schema::ConfigItems::NodeType>(item->UsageScope.NodeType))
+ .Update(NIceDb::TUpdate<Schema::ConfigItems::Order>(item->UsageScope.Order))
+ .Update(NIceDb::TUpdate<Schema::ConfigItems::Merge>(item->MergeStrategy))
+ .Update(NIceDb::TUpdate<Schema::ConfigItems::Config>(config))
+ .Update(NIceDb::TUpdate<Schema::ConfigItems::Cookie>(item->Cookie));
+}
+
+void TConfigsManager::DbUpdateNextConfigItemId(TTransactionContext &txc,
+ const TActorContext &ctx) const
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Database: update NextConfigItemId: " << NextConfigItemId);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Config>().Key(TConsole::ConfigKeyNextConfigItemId)
+ .Update(NIceDb::TUpdate<Schema::Config::Value>(ToString(NextConfigItemId)));
+}
+
+void TConfigsManager::DbUpdateNextSubscriptionId(TTransactionContext &txc,
+ const TActorContext &ctx) const
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Database: update NextSubscriptionId: " << NextSubscriptionId);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Config>().Key(TConsole::ConfigKeyNextSubscriptionId)
+ .Update(NIceDb::TUpdate<Schema::Config::Value>(ToString(NextSubscriptionId)));
+}
+
+void TConfigsManager::DbUpdateSubscription(TSubscription::TPtr subscription,
+ TTransactionContext &txc,
+ const TActorContext &ctx) const
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Database: update subscription:" << subscription->ToString());
+
+ TVector<ui32> kinds(subscription->ItemKinds.begin(), subscription->ItemKinds.end());
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::ConfigSubscriptions>().Key(subscription->Id)
+ .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::TabletId>(subscription->Subscriber.TabletId))
+ .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::ServiceId>(subscription->Subscriber.ServiceId))
+ .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::NodeId>(subscription->NodeId))
+ .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::Host>(subscription->Host))
+ .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::Tenant>(subscription->Tenant))
+ .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::NodeType>(subscription->NodeType))
+ .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::ItemKinds>(kinds))
+ .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::LastProvidedConfig>(subscription->LastProvidedConfig.ItemIds));
+}
+
+void TConfigsManager::DbUpdateSubscriptionLastProvidedConfig(ui64 id,
+ const TConfigId &configId,
+ TTransactionContext &txc,
+ const TActorContext &ctx) const
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "Database: "
+ << "update last provided config for subscription"
+ << " id=" << id
+ << " lastprovidedconfig=" << configId.ToString());
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::ConfigSubscriptions>().Key(id)
+ .Update(NIceDb::TUpdate<Schema::ConfigSubscriptions::LastProvidedConfig>(configId.ItemIds));
+}
+
+void TConfigsManager::Handle(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx)
+{
+ TxProcessor->ProcessTx(CreateTxAddConfigSubscription(ev), ctx);
+}
+
+void TConfigsManager::Handle(TEvConsole::TEvConfigNotificationResponse::TPtr &ev, const TActorContext &ctx)
+{
+ TxProcessor->ProcessTx(CreateTxUpdateLastProvidedConfig(ev), ctx);
+}
+
+void TConfigsManager::Handle(TEvConsole::TEvConfigureRequest::TPtr &ev, const TActorContext &ctx)
+{
+ TxProcessor->ProcessTx(CreateTxConfigure(ev), ctx);
+}
+
+void TConfigsManager::Handle(TEvConsole::TEvListConfigValidatorsRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto response = MakeHolder<TEvConsole::TEvListConfigValidatorsResponse>();
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+
+ auto registry = TValidatorsRegistry::Instance();
+ for (auto &pr : registry->GetValidators()) {
+ auto &entry = *response->Record.AddValidators();
+ entry.SetName(pr.first);
+ entry.SetDescription(pr.second->GetDescription());
+ for (auto kind : pr.second->GetCheckedConfigItemKinds())
+ entry.AddCheckedItemKinds(kind);
+ entry.SetEnabled(pr.second->IsEnabled());
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvListConfigValidatorsResponse: " << response->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
+}
+
+void TConfigsManager::Handle(TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx)
+{
+ TxProcessor->ProcessTx(CreateTxRemoveConfigSubscription(ev), ctx);
+}
+
+void TConfigsManager::Handle(TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx)
+{
+ TxProcessor->ProcessTx(CreateTxRemoveConfigSubscriptions(ev), ctx);
+}
+
+void TConfigsManager::Handle(TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx)
+{
+ TxProcessor->ProcessTx(CreateTxReplaceConfigSubscriptions(ev), ctx);
+}
+
+void TConfigsManager::Handle(TEvConsole::TEvToggleConfigValidatorRequest::TPtr &ev, const TActorContext &ctx)
+{
+ TxProcessor->ProcessTx(CreateTxToggleConfigValidator(ev), ctx);
+}
+
+void TConfigsManager::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev, const TActorContext &ctx)
+{
+ TxProcessor->ProcessTx(CreateTxCleanupSubscriptions(ev), ctx);
+}
+
+void TConfigsManager::Handle(TEvPrivate::TEvStateLoaded::TPtr &/*ev*/, const TActorContext &ctx)
+{
+ ctx.Send(ConfigsProvider, new TConfigsProvider::TEvPrivate::TEvSetConfigs(ConfigIndex.GetConfigItems()));
+ ctx.Send(ConfigsProvider, new TConfigsProvider::TEvPrivate::TEvSetSubscriptions(SubscriptionIndex.GetSubscriptions()));
ctx.Send(GetNameserviceActorId(), new TEvInterconnect::TEvListNodes());
-}
-
-void TConfigsManager::Handle(TEvPrivate::TEvCleanupSubscriptions::TPtr &/*ev*/, const TActorContext &ctx)
-{
+}
+
+void TConfigsManager::Handle(TEvPrivate::TEvCleanupSubscriptions::TPtr &/*ev*/, const TActorContext &ctx)
+{
ctx.Send(GetNameserviceActorId(), new TEvInterconnect::TEvListNodes());
-}
-
-void TConfigsManager::ForwardToConfigsProvider(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
-{
- ctx.Send(ev->Forward(ConfigsProvider));
-}
-
-void TConfigsManager::ScheduleSubscriptionsCleanup(const TActorContext &ctx)
-{
- auto *event = new TConfigsManager::TEvPrivate::TEvCleanupSubscriptions;
- SubscriptionsCleanupTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
- CreateLongTimer(ctx, TDuration::Minutes(5),
- new IEventHandle(SelfId(), SelfId(), event),
- AppData(ctx)->SystemPoolId,
- SubscriptionsCleanupTimerCookieHolder.Get());
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+}
+
+void TConfigsManager::ForwardToConfigsProvider(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx)
+{
+ ctx.Send(ev->Forward(ConfigsProvider));
+}
+
+void TConfigsManager::ScheduleSubscriptionsCleanup(const TActorContext &ctx)
+{
+ auto *event = new TConfigsManager::TEvPrivate::TEvCleanupSubscriptions;
+ SubscriptionsCleanupTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
+ CreateLongTimer(ctx, TDuration::Minutes(5),
+ new IEventHandle(SelfId(), SelfId(), event),
+ AppData(ctx)->SystemPoolId,
+ SubscriptionsCleanupTimerCookieHolder.Get());
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console_configs_manager.h b/ydb/core/cms/console/console_configs_manager.h
index 764df3fb3e0..2dca13be264 100644
--- a/ydb/core/cms/console/console_configs_manager.h
+++ b/ydb/core/cms/console/console_configs_manager.h
@@ -1,202 +1,202 @@
-#pragma once
-
-#include "defs.h"
-
-#include "config_index.h"
-#include "configs_config.h"
-#include "console.h"
-#include "tx_processor.h"
-
+#pragma once
+
+#include "defs.h"
+
+#include "config_index.h"
+#include "configs_config.h"
+#include "console.h"
+#include "tx_processor.h"
+
#include <ydb/core/actorlib_impl/long_timer.h>
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
-
+
#include <library/cpp/actors/core/hfunc.h>
#include <library/cpp/actors/interconnect/interconnect.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-using NTabletFlatExecutor::ITransaction;
-using NTabletFlatExecutor::TTransactionBase;
-using NTabletFlatExecutor::TTransactionContext;
-
-class TConsole;
-
-class TConfigsManager : public TActorBootstrapped<TConfigsManager> {
-private:
- using TBase = TActorBootstrapped<TConfigsManager>;
-
-public:
- struct TEvPrivate {
- enum EEv {
- EvStateLoaded = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
- EvCleanupSubscriptions,
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
-
- struct TEvStateLoaded : public TEventLocal<TEvStateLoaded, EvStateLoaded> {};
-
- struct TEvCleanupSubscriptions : public TEventLocal<TEvCleanupSubscriptions, EvCleanupSubscriptions> {};
- };
-
-public:
- void ClearState();
- void SetConfig(const NKikimrConsole::TConfigsConfig &config);
- // Check if specified config may be applied to configs manager.
- bool CheckConfig(const NKikimrConsole::TConfigsConfig &config,
- Ydb::StatusIds::StatusCode &code,
- TString &error);
-
- void ApplyPendingConfigModifications(const TActorContext &ctx,
- TAutoPtr<IEventHandle> ev = nullptr);
- void ApplyPendingSubscriptionModifications(const TActorContext &ctx,
- TAutoPtr<IEventHandle> ev = nullptr);
-
- bool MakeNewSubscriptionChecks(TSubscription::TPtr subscription,
+
+namespace NKikimr {
+namespace NConsole {
+
+using NTabletFlatExecutor::ITransaction;
+using NTabletFlatExecutor::TTransactionBase;
+using NTabletFlatExecutor::TTransactionContext;
+
+class TConsole;
+
+class TConfigsManager : public TActorBootstrapped<TConfigsManager> {
+private:
+ using TBase = TActorBootstrapped<TConfigsManager>;
+
+public:
+ struct TEvPrivate {
+ enum EEv {
+ EvStateLoaded = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
+ EvCleanupSubscriptions,
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
+
+ struct TEvStateLoaded : public TEventLocal<TEvStateLoaded, EvStateLoaded> {};
+
+ struct TEvCleanupSubscriptions : public TEventLocal<TEvCleanupSubscriptions, EvCleanupSubscriptions> {};
+ };
+
+public:
+ void ClearState();
+ void SetConfig(const NKikimrConsole::TConfigsConfig &config);
+ // Check if specified config may be applied to configs manager.
+ bool CheckConfig(const NKikimrConsole::TConfigsConfig &config,
+ Ydb::StatusIds::StatusCode &code,
+ TString &error);
+
+ void ApplyPendingConfigModifications(const TActorContext &ctx,
+ TAutoPtr<IEventHandle> ev = nullptr);
+ void ApplyPendingSubscriptionModifications(const TActorContext &ctx,
+ TAutoPtr<IEventHandle> ev = nullptr);
+
+ bool MakeNewSubscriptionChecks(TSubscription::TPtr subscription,
Ydb::StatusIds::StatusCode &code,
- TString &error);
-
- bool IsConfigItemScopeAllowed(TConfigItem::TPtr item);
- bool IsConfigItemScopeAllowed(TConfigItem::TPtr item,
- const TConfigsConfig &config);
- bool IsSupportedMergeStrategy(ui32 value) const;
-
- void DumpStateHTML(IOutputStream &os) const;
-
- // Database functions
- void DbApplyPendingConfigModifications(TTransactionContext &txc,
- const TActorContext &ctx) const;
- void DbApplyPendingSubscriptionModifications(TTransactionContext &txc,
- const TActorContext &ctx) const;
- bool DbLoadState(TTransactionContext &txc,
- const TActorContext &ctx);
- void DbRemoveItem(ui64 id,
- TTransactionContext &txc,
- const TActorContext &ctx) const;
- void DbRemoveSubscription(ui64 id,
- TTransactionContext &txc,
- const TActorContext &ctx) const;
- void DbUpdateItem(TConfigItem::TPtr item,
- TTransactionContext &txc,
- const TActorContext &ctx) const;
- void DbUpdateNextConfigItemId(TTransactionContext &txc,
- const TActorContext &ctx) const;
- void DbUpdateNextSubscriptionId(TTransactionContext &txc,
- const TActorContext &ctx) const;
- void DbUpdateSubscription(TSubscription::TPtr subscription,
- TTransactionContext &txc,
- const TActorContext &ctx) const;
- void DbUpdateSubscriptionLastProvidedConfig(ui64 id,
- const TConfigId &configId,
- TTransactionContext &txc,
- const TActorContext &ctx) const;
-
-private:
- class TTxAddConfigSubscription;
- class TTxCleanupSubscriptions;
- class TTxConfigure;
- class TTxRemoveConfigSubscription;
- class TTxRemoveConfigSubscriptions;
- class TTxReplaceConfigSubscriptions;
- class TTxToggleConfigValidator;
- class TTxUpdateLastProvidedConfig;
-
- ITransaction *CreateTxAddConfigSubscription(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr &ev);
- ITransaction *CreateTxCleanupSubscriptions(TEvInterconnect::TEvNodesInfo::TPtr &ev);
- ITransaction *CreateTxConfigure(TEvConsole::TEvConfigureRequest::TPtr &ev);
- ITransaction *CreateTxRemoveConfigSubscription(TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr &ev);
- ITransaction *CreateTxRemoveConfigSubscriptions(TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr &ev);
- ITransaction *CreateTxReplaceConfigSubscriptions(TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr &ev);
- ITransaction *CreateTxToggleConfigValidator(TEvConsole::TEvToggleConfigValidatorRequest::TPtr &ev);
- ITransaction *CreateTxUpdateLastProvidedConfig(TEvConsole::TEvConfigNotificationResponse::TPtr &ev);
-
- void Handle(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvConfigNotificationResponse::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvConfigureRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvListConfigValidatorsRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvToggleConfigValidatorRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvStateLoaded::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvCleanupSubscriptions::TPtr &ev, const TActorContext &ctx);
-
- void ForwardToConfigsProvider(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx);
-
- void ScheduleSubscriptionsCleanup(const TActorContext &ctx);
-
- STFUNC(StateWork)
- {
- TRACE_EVENT(NKikimrServices::CMS_CONFIGS);
- switch (ev->GetTypeRewrite()) {
- HFuncTraced(TEvConsole::TEvAddConfigSubscriptionRequest, Handle);
- FFunc(TEvConsole::EvCheckConfigUpdatesRequest, ForwardToConfigsProvider);
- HFuncTraced(TEvConsole::TEvConfigNotificationResponse, Handle);
- HFuncTraced(TEvConsole::TEvConfigureRequest, Handle);
- FFunc(TEvConsole::EvGetConfigItemsRequest, ForwardToConfigsProvider);
- FFunc(TEvConsole::EvGetConfigSubscriptionRequest, ForwardToConfigsProvider);
- FFunc(TEvConsole::EvGetNodeConfigItemsRequest, ForwardToConfigsProvider);
- FFunc(TEvConsole::EvGetNodeConfigRequest, ForwardToConfigsProvider);
- FFunc(TEvConsole::EvListConfigSubscriptionsRequest, ForwardToConfigsProvider);
- HFuncTraced(TEvConsole::TEvListConfigValidatorsRequest, Handle);
- HFuncTraced(TEvConsole::TEvRemoveConfigSubscriptionRequest, Handle);
- HFuncTraced(TEvConsole::TEvRemoveConfigSubscriptionsRequest, Handle);
- HFuncTraced(TEvConsole::TEvReplaceConfigSubscriptionsRequest, Handle);
- HFuncTraced(TEvConsole::TEvToggleConfigValidatorRequest, Handle);
- HFuncTraced(TEvInterconnect::TEvNodesInfo, Handle);
- HFuncTraced(TEvPrivate::TEvCleanupSubscriptions, Handle);
- HFuncTraced(TEvPrivate::TEvStateLoaded, Handle);
+ TString &error);
+
+ bool IsConfigItemScopeAllowed(TConfigItem::TPtr item);
+ bool IsConfigItemScopeAllowed(TConfigItem::TPtr item,
+ const TConfigsConfig &config);
+ bool IsSupportedMergeStrategy(ui32 value) const;
+
+ void DumpStateHTML(IOutputStream &os) const;
+
+ // Database functions
+ void DbApplyPendingConfigModifications(TTransactionContext &txc,
+ const TActorContext &ctx) const;
+ void DbApplyPendingSubscriptionModifications(TTransactionContext &txc,
+ const TActorContext &ctx) const;
+ bool DbLoadState(TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbRemoveItem(ui64 id,
+ TTransactionContext &txc,
+ const TActorContext &ctx) const;
+ void DbRemoveSubscription(ui64 id,
+ TTransactionContext &txc,
+ const TActorContext &ctx) const;
+ void DbUpdateItem(TConfigItem::TPtr item,
+ TTransactionContext &txc,
+ const TActorContext &ctx) const;
+ void DbUpdateNextConfigItemId(TTransactionContext &txc,
+ const TActorContext &ctx) const;
+ void DbUpdateNextSubscriptionId(TTransactionContext &txc,
+ const TActorContext &ctx) const;
+ void DbUpdateSubscription(TSubscription::TPtr subscription,
+ TTransactionContext &txc,
+ const TActorContext &ctx) const;
+ void DbUpdateSubscriptionLastProvidedConfig(ui64 id,
+ const TConfigId &configId,
+ TTransactionContext &txc,
+ const TActorContext &ctx) const;
+
+private:
+ class TTxAddConfigSubscription;
+ class TTxCleanupSubscriptions;
+ class TTxConfigure;
+ class TTxRemoveConfigSubscription;
+ class TTxRemoveConfigSubscriptions;
+ class TTxReplaceConfigSubscriptions;
+ class TTxToggleConfigValidator;
+ class TTxUpdateLastProvidedConfig;
+
+ ITransaction *CreateTxAddConfigSubscription(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr &ev);
+ ITransaction *CreateTxCleanupSubscriptions(TEvInterconnect::TEvNodesInfo::TPtr &ev);
+ ITransaction *CreateTxConfigure(TEvConsole::TEvConfigureRequest::TPtr &ev);
+ ITransaction *CreateTxRemoveConfigSubscription(TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr &ev);
+ ITransaction *CreateTxRemoveConfigSubscriptions(TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr &ev);
+ ITransaction *CreateTxReplaceConfigSubscriptions(TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr &ev);
+ ITransaction *CreateTxToggleConfigValidator(TEvConsole::TEvToggleConfigValidatorRequest::TPtr &ev);
+ ITransaction *CreateTxUpdateLastProvidedConfig(TEvConsole::TEvConfigNotificationResponse::TPtr &ev);
+
+ void Handle(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvConfigNotificationResponse::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvConfigureRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvListConfigValidatorsRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvRemoveConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvRemoveConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvToggleConfigValidatorRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvStateLoaded::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvCleanupSubscriptions::TPtr &ev, const TActorContext &ctx);
+
+ void ForwardToConfigsProvider(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx);
+
+ void ScheduleSubscriptionsCleanup(const TActorContext &ctx);
+
+ STFUNC(StateWork)
+ {
+ TRACE_EVENT(NKikimrServices::CMS_CONFIGS);
+ switch (ev->GetTypeRewrite()) {
+ HFuncTraced(TEvConsole::TEvAddConfigSubscriptionRequest, Handle);
+ FFunc(TEvConsole::EvCheckConfigUpdatesRequest, ForwardToConfigsProvider);
+ HFuncTraced(TEvConsole::TEvConfigNotificationResponse, Handle);
+ HFuncTraced(TEvConsole::TEvConfigureRequest, Handle);
+ FFunc(TEvConsole::EvGetConfigItemsRequest, ForwardToConfigsProvider);
+ FFunc(TEvConsole::EvGetConfigSubscriptionRequest, ForwardToConfigsProvider);
+ FFunc(TEvConsole::EvGetNodeConfigItemsRequest, ForwardToConfigsProvider);
+ FFunc(TEvConsole::EvGetNodeConfigRequest, ForwardToConfigsProvider);
+ FFunc(TEvConsole::EvListConfigSubscriptionsRequest, ForwardToConfigsProvider);
+ HFuncTraced(TEvConsole::TEvListConfigValidatorsRequest, Handle);
+ HFuncTraced(TEvConsole::TEvRemoveConfigSubscriptionRequest, Handle);
+ HFuncTraced(TEvConsole::TEvRemoveConfigSubscriptionsRequest, Handle);
+ HFuncTraced(TEvConsole::TEvReplaceConfigSubscriptionsRequest, Handle);
+ HFuncTraced(TEvConsole::TEvToggleConfigValidatorRequest, Handle);
+ HFuncTraced(TEvInterconnect::TEvNodesInfo, Handle);
+ HFuncTraced(TEvPrivate::TEvCleanupSubscriptions, Handle);
+ HFuncTraced(TEvPrivate::TEvStateLoaded, Handle);
FFunc(TEvConsole::EvConfigSubscriptionRequest, ForwardToConfigsProvider);
FFunc(TEvConsole::EvConfigSubscriptionCanceled, ForwardToConfigsProvider);
-
- default:
- Y_FAIL("TConfigsManager::StateWork unexpected event type: %" PRIx32 " event: %s",
+
+ default:
+ Y_FAIL("TConfigsManager::StateWork unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
-public:
- TConfigsManager(TConsole &self)
- : Self(self)
- {
- }
-
- ~TConfigsManager()
- {
- ClearState();
- }
-
+ }
+ }
+
+public:
+ TConfigsManager(TConsole &self)
+ : Self(self)
+ {
+ }
+
+ ~TConfigsManager()
+ {
+ ClearState();
+ }
+
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_CONFIGS_MANAGER;
- }
-
- void Bootstrap(const TActorContext &ctx);
- void Detach();
-
-private:
- TConsole &Self;
- TConfigsConfig Config;
- // All config items by id.
- TConfigIndex ConfigIndex;
- ui64 NextConfigItemId;
- TConfigModifications PendingConfigModifications;
- // Validators state.
- THashSet<TString> DisabledValidators;
- // Subscriptions.
- TSubscriptionIndex SubscriptionIndex;
- THashMap<TSubscriberId, THashSet<ui64>> SubscriptionsBySubscriber;
- ui64 NextSubscriptionId;
- TSubscriptionModifications PendingSubscriptionModifications;
- TSchedulerCookieHolder SubscriptionsCleanupTimerCookieHolder;
-
+ }
+
+ void Bootstrap(const TActorContext &ctx);
+ void Detach();
+
+private:
+ TConsole &Self;
+ TConfigsConfig Config;
+ // All config items by id.
+ TConfigIndex ConfigIndex;
+ ui64 NextConfigItemId;
+ TConfigModifications PendingConfigModifications;
+ // Validators state.
+ THashSet<TString> DisabledValidators;
+ // Subscriptions.
+ TSubscriptionIndex SubscriptionIndex;
+ THashMap<TSubscriberId, THashSet<ui64>> SubscriptionsBySubscriber;
+ ui64 NextSubscriptionId;
+ TSubscriptionModifications PendingSubscriptionModifications;
+ TSchedulerCookieHolder SubscriptionsCleanupTimerCookieHolder;
+
TActorId ConfigsProvider;
- TTxProcessor::TPtr TxProcessor;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
+ TTxProcessor::TPtr TxProcessor;
+};
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console_configs_provider.cpp b/ydb/core/cms/console/console_configs_provider.cpp
index 6268bde09fb..4ba6f460338 100644
--- a/ydb/core/cms/console/console_configs_provider.cpp
+++ b/ydb/core/cms/console/console_configs_provider.cpp
@@ -1,293 +1,293 @@
-#include "console_configs_provider.h"
+#include "console_configs_provider.h"
#include "util.h"
-
+
#include <ydb/core/actorlib_impl/long_timer.h>
#include <ydb/core/base/appdata.h>
#include <ydb/core/cms/console/validators/registry.h>
-
+
#include <library/cpp/actors/core/interconnect.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-namespace {
-
-class TTabletConfigSender : public TActorBootstrapped<TTabletConfigSender> {
-private:
- using TBase = TActorBootstrapped<TTabletConfigSender>;
-
- TSubscription::TPtr Subscription;
+
+namespace NKikimr {
+namespace NConsole {
+
+namespace {
+
+class TTabletConfigSender : public TActorBootstrapped<TTabletConfigSender> {
+private:
+ using TBase = TActorBootstrapped<TTabletConfigSender>;
+
+ TSubscription::TPtr Subscription;
TActorId OwnerId;
TActorId Pipe;
- TSchedulerCookieHolder TimeoutTimerCookieHolder;
-
-public:
+ TSchedulerCookieHolder TimeoutTimerCookieHolder;
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_CONFIGS_PROVIDER;
- }
-
+ }
+
TTabletConfigSender(TSubscription::TPtr subscription, TActorId ownerId)
- : Subscription(subscription)
- , OwnerId(ownerId)
- {
- }
-
- void Die(const TActorContext &ctx) override
- {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TTabletConfigSender(" << Subscription->Id << ") Die");
-
- if (Pipe)
- NTabletPipe::CloseClient(ctx, Pipe);
- TBase::Die(ctx);
- }
-
- void OnPipeDestroyed(const TActorContext &ctx)
- {
- if (Pipe) {
- NTabletPipe::CloseClient(ctx, Pipe);
+ : Subscription(subscription)
+ , OwnerId(ownerId)
+ {
+ }
+
+ void Die(const TActorContext &ctx) override
+ {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TTabletConfigSender(" << Subscription->Id << ") Die");
+
+ if (Pipe)
+ NTabletPipe::CloseClient(ctx, Pipe);
+ TBase::Die(ctx);
+ }
+
+ void OnPipeDestroyed(const TActorContext &ctx)
+ {
+ if (Pipe) {
+ NTabletPipe::CloseClient(ctx, Pipe);
Pipe = TActorId();
- }
-
- SendNotifyRequest(ctx);
- }
-
- void OpenPipe(const TActorContext &ctx)
- {
- Y_VERIFY(Subscription->Subscriber.TabletId);
- NTabletPipe::TClientConfig pipeConfig;
+ }
+
+ SendNotifyRequest(ctx);
+ }
+
+ void OpenPipe(const TActorContext &ctx)
+ {
+ Y_VERIFY(Subscription->Subscriber.TabletId);
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = FastConnectRetryPolicy();
- auto pipe = NTabletPipe::CreateClient(ctx.SelfID, Subscription->Subscriber.TabletId, pipeConfig);
- Pipe = ctx.ExecutorThread.RegisterActor(pipe);
- }
-
- void SendNotifyRequest(const TActorContext &ctx)
- {
- if (!Pipe)
- OpenPipe(ctx);
-
- auto request = MakeHolder<TEvConsole::TEvConfigNotificationRequest>();
- request->Record.SetSubscriptionId(Subscription->Id);
- Subscription->CurrentConfigId.Serialize(*request->Record.MutableConfigId());
- request->Record.MutableConfig()->CopyFrom(Subscription->CurrentConfig);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TTabletConfigSender(" << Subscription->Id << ") send TEvConfigNotificationRequest: "
- << request->Record.ShortDebugString());
-
- NTabletPipe::SendData(ctx, Pipe, request.Release(), Subscription->Cookie);
- }
-
- void Bootstrap(const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TTabletConfigSender(" << Subscription->Id << ") Bootstrap");
- Become(&TThis::StateWork);
-
- SendNotifyRequest(ctx);
-
- TimeoutTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
- auto event = new TConfigsProvider::TEvPrivate::TEvNotificationTimeout(Subscription);
- CreateLongTimer(ctx, TDuration::Minutes(10),
- new IEventHandle(SelfId(), SelfId(), event),
- AppData(ctx)->SystemPoolId,
- TimeoutTimerCookieHolder.Get());
- }
-
- void Handle(TEvConsole::TEvConfigNotificationResponse::TPtr& ev, const TActorContext& ctx) {
- ctx.Send(ev->Forward(OwnerId));
- Die(ctx);
- }
-
- void Handle(TEvents::TEvPoisonPill::TPtr &/*ev*/, const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TTabletConfigSender(" << Subscription->Id << ") die to poison pill");
- ctx.Send(OwnerId, new TConfigsProvider::TEvPrivate::TEvSenderDied(Subscription));
- Die(ctx);
- }
-
- void Handle(TConfigsProvider::TEvPrivate::TEvNotificationTimeout::TPtr &/*ev*/, const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TTabletConfigSender(" << Subscription->Id << ") die to timeout");
- ctx.Send(OwnerId, new TConfigsProvider::TEvPrivate::TEvNotificationTimeout(Subscription));
- Die(ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev, const TActorContext& ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TTabletConfigSender(" << Subscription->Id << ") connection "
- << ((ev->Get()->Status == NKikimrProto::OK) ? "established" : "failed"));
-
- if (ev->Get()->Status != NKikimrProto::OK) {
- OnPipeDestroyed(ctx);
- }
- }
-
- void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr& /*ev*/, const TActorContext& ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TTabletConfigSender(" << Subscription->Id << ") TEvTabletPipe::TEvClientDestroyed");
-
- OnPipeDestroyed(ctx);
- }
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConsole::TEvConfigNotificationResponse, Handle);
- HFunc(TEvents::TEvPoisonPill, Handle);
- HFunc(TConfigsProvider::TEvPrivate::TEvNotificationTimeout, Handle);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ auto pipe = NTabletPipe::CreateClient(ctx.SelfID, Subscription->Subscriber.TabletId, pipeConfig);
+ Pipe = ctx.ExecutorThread.RegisterActor(pipe);
+ }
+
+ void SendNotifyRequest(const TActorContext &ctx)
+ {
+ if (!Pipe)
+ OpenPipe(ctx);
+
+ auto request = MakeHolder<TEvConsole::TEvConfigNotificationRequest>();
+ request->Record.SetSubscriptionId(Subscription->Id);
+ Subscription->CurrentConfigId.Serialize(*request->Record.MutableConfigId());
+ request->Record.MutableConfig()->CopyFrom(Subscription->CurrentConfig);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TTabletConfigSender(" << Subscription->Id << ") send TEvConfigNotificationRequest: "
+ << request->Record.ShortDebugString());
+
+ NTabletPipe::SendData(ctx, Pipe, request.Release(), Subscription->Cookie);
+ }
+
+ void Bootstrap(const TActorContext &ctx) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TTabletConfigSender(" << Subscription->Id << ") Bootstrap");
+ Become(&TThis::StateWork);
+
+ SendNotifyRequest(ctx);
+
+ TimeoutTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
+ auto event = new TConfigsProvider::TEvPrivate::TEvNotificationTimeout(Subscription);
+ CreateLongTimer(ctx, TDuration::Minutes(10),
+ new IEventHandle(SelfId(), SelfId(), event),
+ AppData(ctx)->SystemPoolId,
+ TimeoutTimerCookieHolder.Get());
+ }
+
+ void Handle(TEvConsole::TEvConfigNotificationResponse::TPtr& ev, const TActorContext& ctx) {
+ ctx.Send(ev->Forward(OwnerId));
+ Die(ctx);
+ }
+
+ void Handle(TEvents::TEvPoisonPill::TPtr &/*ev*/, const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TTabletConfigSender(" << Subscription->Id << ") die to poison pill");
+ ctx.Send(OwnerId, new TConfigsProvider::TEvPrivate::TEvSenderDied(Subscription));
+ Die(ctx);
+ }
+
+ void Handle(TConfigsProvider::TEvPrivate::TEvNotificationTimeout::TPtr &/*ev*/, const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TTabletConfigSender(" << Subscription->Id << ") die to timeout");
+ ctx.Send(OwnerId, new TConfigsProvider::TEvPrivate::TEvNotificationTimeout(Subscription));
+ Die(ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev, const TActorContext& ctx) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TTabletConfigSender(" << Subscription->Id << ") connection "
+ << ((ev->Get()->Status == NKikimrProto::OK) ? "established" : "failed"));
+
+ if (ev->Get()->Status != NKikimrProto::OK) {
+ OnPipeDestroyed(ctx);
+ }
+ }
+
+ void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr& /*ev*/, const TActorContext& ctx) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TTabletConfigSender(" << Subscription->Id << ") TEvTabletPipe::TEvClientDestroyed");
+
+ OnPipeDestroyed(ctx);
+ }
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConsole::TEvConfigNotificationResponse, Handle);
+ HFunc(TEvents::TEvPoisonPill, Handle);
+ HFunc(TConfigsProvider::TEvPrivate::TEvNotificationTimeout, Handle);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-};
-
-class TServiceConfigSender : public TActorBootstrapped<TServiceConfigSender> {
-private:
- using TBase = TActorBootstrapped<TServiceConfigSender>;
-
- TSubscription::TPtr Subscription;
+ break;
+ }
+ }
+};
+
+class TServiceConfigSender : public TActorBootstrapped<TServiceConfigSender> {
+private:
+ using TBase = TActorBootstrapped<TServiceConfigSender>;
+
+ TSubscription::TPtr Subscription;
TActorId OwnerId;
- TDuration RetryInterval;
- TSchedulerCookieHolder TimeoutTimerCookieHolder;
- bool ScheduledRetry;
-
-public:
+ TDuration RetryInterval;
+ TSchedulerCookieHolder TimeoutTimerCookieHolder;
+ bool ScheduledRetry;
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_CONFIGS_PROVIDER;
- }
-
+ }
+
TServiceConfigSender(TSubscription::TPtr subscription, TActorId ownerId)
- : Subscription(subscription)
- , OwnerId(ownerId)
- , RetryInterval(TDuration::Seconds(5))
- , ScheduledRetry(false)
- {
- }
-
- void Die(const TActorContext &ctx) override
- {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TServiceConfigSender(" << Subscription->Id << ") Die");
-
- auto nodeId = Subscription->Subscriber.ServiceId.NodeId();
+ : Subscription(subscription)
+ , OwnerId(ownerId)
+ , RetryInterval(TDuration::Seconds(5))
+ , ScheduledRetry(false)
+ {
+ }
+
+ void Die(const TActorContext &ctx) override
+ {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TServiceConfigSender(" << Subscription->Id << ") Die");
+
+ auto nodeId = Subscription->Subscriber.ServiceId.NodeId();
ctx.Send(TActivationContext::InterconnectProxy(nodeId),
- new TEvents::TEvUnsubscribe);
- TBase::Die(ctx);
- }
-
- void SendNotifyRequest(const TActorContext &ctx)
- {
- auto request = MakeHolder<TEvConsole::TEvConfigNotificationRequest>();
- request->Record.SetSubscriptionId(Subscription->Id);
- Subscription->CurrentConfigId.Serialize(*request->Record.MutableConfigId());
- request->Record.MutableConfig()->CopyFrom(Subscription->CurrentConfig);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TServiceConfigSender(" << Subscription->Id << ") send TEvConfigNotificationRequest: "
- << request->Record.ShortDebugString());
-
- ctx.Send(Subscription->Subscriber.ServiceId, request.Release(),
- IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession,
- Subscription->Cookie);
-
- ScheduledRetry = false;
- }
-
- void Bootstrap(const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TServiceConfigSender(" << Subscription->Id << ") Bootstrap");
- Become(&TThis::StateWork);
-
- SendNotifyRequest(ctx);
-
- TimeoutTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
- auto event = new TConfigsProvider::TEvPrivate::TEvNotificationTimeout(Subscription);
- CreateLongTimer(ctx, TDuration::Minutes(10),
- new IEventHandle(SelfId(), SelfId(), event),
- AppData(ctx)->SystemPoolId,
- TimeoutTimerCookieHolder.Get());
- }
-
- void Handle(TEvConsole::TEvConfigNotificationResponse::TPtr& ev, const TActorContext& ctx) {
- ctx.Send(ev->Forward(OwnerId));
- Die(ctx);
- }
-
- void Handle(TEvents::TEvPoisonPill::TPtr &/*ev*/, const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TServiceConfigSender(" << Subscription->Id
- << ") die to poison pill");
- ctx.Send(OwnerId, new TConfigsProvider::TEvPrivate::TEvSenderDied(Subscription));
- Die(ctx);
- }
-
- void Handle(TEvents::TEvUndelivered::TPtr &/*ev*/, const TActorContext &ctx)
- {
- RetryInterval += RetryInterval;
- RetryInterval = Min(RetryInterval, TDuration::Minutes(1));
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TServiceConfigSender(" << Subscription->Id
- << ") undelivered notification (retry in "
- << RetryInterval.Seconds() << " seconds)");
-
- if (!ScheduledRetry) {
- ctx.Schedule(RetryInterval, new TEvents::TEvWakeup);
- ScheduledRetry = true;
- }
- }
-
- void Handle(TEvInterconnect::TEvNodeDisconnected::TPtr &/*ev*/, const TActorContext &ctx)
- {
- RetryInterval += RetryInterval;
- RetryInterval = Min(RetryInterval, TDuration::Minutes(1));
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TServiceConfigSender(" << Subscription->Id
- << ") disconnected (retry in "
- << RetryInterval.Seconds() << " seconds)");
-
- if (!ScheduledRetry) {
- ctx.Schedule(RetryInterval, new TEvents::TEvWakeup);
- ScheduledRetry = true;
- }
- }
-
- void Handle(TConfigsProvider::TEvPrivate::TEvNotificationTimeout::TPtr &/*ev*/, const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TServiceConfigSender(" << Subscription->Id << ") die to timeout");
- ctx.Send(OwnerId, new TConfigsProvider::TEvPrivate::TEvNotificationTimeout(Subscription));
- Die(ctx);
- }
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConsole::TEvConfigNotificationResponse, Handle);
- HFunc(TEvents::TEvPoisonPill, Handle);
- HFunc(TEvents::TEvUndelivered, Handle);
- CFunc(TEvents::TSystem::Wakeup, SendNotifyRequest);
- HFunc(TEvInterconnect::TEvNodeDisconnected, Handle);
- HFunc(TConfigsProvider::TEvPrivate::TEvNotificationTimeout, Handle);
- IgnoreFunc(TEvInterconnect::TEvNodeConnected);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ new TEvents::TEvUnsubscribe);
+ TBase::Die(ctx);
+ }
+
+ void SendNotifyRequest(const TActorContext &ctx)
+ {
+ auto request = MakeHolder<TEvConsole::TEvConfigNotificationRequest>();
+ request->Record.SetSubscriptionId(Subscription->Id);
+ Subscription->CurrentConfigId.Serialize(*request->Record.MutableConfigId());
+ request->Record.MutableConfig()->CopyFrom(Subscription->CurrentConfig);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TServiceConfigSender(" << Subscription->Id << ") send TEvConfigNotificationRequest: "
+ << request->Record.ShortDebugString());
+
+ ctx.Send(Subscription->Subscriber.ServiceId, request.Release(),
+ IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession,
+ Subscription->Cookie);
+
+ ScheduledRetry = false;
+ }
+
+ void Bootstrap(const TActorContext &ctx) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TServiceConfigSender(" << Subscription->Id << ") Bootstrap");
+ Become(&TThis::StateWork);
+
+ SendNotifyRequest(ctx);
+
+ TimeoutTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
+ auto event = new TConfigsProvider::TEvPrivate::TEvNotificationTimeout(Subscription);
+ CreateLongTimer(ctx, TDuration::Minutes(10),
+ new IEventHandle(SelfId(), SelfId(), event),
+ AppData(ctx)->SystemPoolId,
+ TimeoutTimerCookieHolder.Get());
+ }
+
+ void Handle(TEvConsole::TEvConfigNotificationResponse::TPtr& ev, const TActorContext& ctx) {
+ ctx.Send(ev->Forward(OwnerId));
+ Die(ctx);
+ }
+
+ void Handle(TEvents::TEvPoisonPill::TPtr &/*ev*/, const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TServiceConfigSender(" << Subscription->Id
+ << ") die to poison pill");
+ ctx.Send(OwnerId, new TConfigsProvider::TEvPrivate::TEvSenderDied(Subscription));
+ Die(ctx);
+ }
+
+ void Handle(TEvents::TEvUndelivered::TPtr &/*ev*/, const TActorContext &ctx)
+ {
+ RetryInterval += RetryInterval;
+ RetryInterval = Min(RetryInterval, TDuration::Minutes(1));
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TServiceConfigSender(" << Subscription->Id
+ << ") undelivered notification (retry in "
+ << RetryInterval.Seconds() << " seconds)");
+
+ if (!ScheduledRetry) {
+ ctx.Schedule(RetryInterval, new TEvents::TEvWakeup);
+ ScheduledRetry = true;
+ }
+ }
+
+ void Handle(TEvInterconnect::TEvNodeDisconnected::TPtr &/*ev*/, const TActorContext &ctx)
+ {
+ RetryInterval += RetryInterval;
+ RetryInterval = Min(RetryInterval, TDuration::Minutes(1));
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TServiceConfigSender(" << Subscription->Id
+ << ") disconnected (retry in "
+ << RetryInterval.Seconds() << " seconds)");
+
+ if (!ScheduledRetry) {
+ ctx.Schedule(RetryInterval, new TEvents::TEvWakeup);
+ ScheduledRetry = true;
+ }
+ }
+
+ void Handle(TConfigsProvider::TEvPrivate::TEvNotificationTimeout::TPtr &/*ev*/, const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TServiceConfigSender(" << Subscription->Id << ") die to timeout");
+ ctx.Send(OwnerId, new TConfigsProvider::TEvPrivate::TEvNotificationTimeout(Subscription));
+ Die(ctx);
+ }
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConsole::TEvConfigNotificationResponse, Handle);
+ HFunc(TEvents::TEvPoisonPill, Handle);
+ HFunc(TEvents::TEvUndelivered, Handle);
+ CFunc(TEvents::TSystem::Wakeup, SendNotifyRequest);
+ HFunc(TEvInterconnect::TEvNodeDisconnected, Handle);
+ HFunc(TConfigsProvider::TEvPrivate::TEvNotificationTimeout, Handle);
+ IgnoreFunc(TEvInterconnect::TEvNodeConnected);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-};
-
+ break;
+ }
+ }
+};
+
class TSubscriptionClientSender : public TActorBootstrapped<TSubscriptionClientSender> {
using TBase = TActorBootstrapped<TSubscriptionClientSender>;
@@ -378,136 +378,136 @@ protected:
TBase::Die(ctx);
}
};
-} // anonymous namespace
-
-void TConfigsProvider::Bootstrap(const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider::Bootstrap");
- Become(&TThis::StateWork);
-}
-
-void TConfigsProvider::Die(const TActorContext &ctx)
-{
+} // anonymous namespace
+
+void TConfigsProvider::Bootstrap(const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider::Bootstrap");
+ Become(&TThis::StateWork);
+}
+
+void TConfigsProvider::Die(const TActorContext &ctx)
+{
for (auto &it : InMemoryIndex.GetSubscriptions()) {
Send(it.second->Subscriber, new TEvConsole::TEvConfigSubscriptionCanceled(it.second->Generation));
Send(it.second->Worker, new TEvents::TEvPoisonPill());
}
- TBase::Die(ctx);
-}
-
-void TConfigsProvider::ClearState()
-{
- ConfigIndex.Clear();
- SubscriptionIndex.Clear();
-}
-
-void TConfigsProvider::ApplyConfigModifications(const TConfigModifications &modifications,
- const TActorContext &ctx)
-{
- LOG_TRACE(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: applying config midifications");
-
- TSubscriptionSet subscriptions;
+ TBase::Die(ctx);
+}
+
+void TConfigsProvider::ClearState()
+{
+ ConfigIndex.Clear();
+ SubscriptionIndex.Clear();
+}
+
+void TConfigsProvider::ApplyConfigModifications(const TConfigModifications &modifications,
+ const TActorContext &ctx)
+{
+ LOG_TRACE(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: applying config midifications");
+
+ TSubscriptionSet subscriptions;
TInMemorySubscriptionSet inMemorySubscriptions;
-
- for (auto id : modifications.RemovedItems) {
- auto item = ConfigIndex.GetItem(id);
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: remove " << item->ToString());
- ConfigIndex.RemoveItem(id);
- SubscriptionIndex.CollectAffectedSubscriptions(item->UsageScope, item->Kind, subscriptions);
+
+ for (auto id : modifications.RemovedItems) {
+ auto item = ConfigIndex.GetItem(id);
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: remove " << item->ToString());
+ ConfigIndex.RemoveItem(id);
+ SubscriptionIndex.CollectAffectedSubscriptions(item->UsageScope, item->Kind, subscriptions);
InMemoryIndex.CollectAffectedSubscriptions(item->UsageScope, item->Kind, inMemorySubscriptions);
- }
- for (auto &pr : modifications.ModifiedItems) {
- auto item = ConfigIndex.GetItem(pr.first);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: remove modified " << item->ToString());
- ConfigIndex.RemoveItem(pr.first);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: add modified " << pr.second->ToString());
- ConfigIndex.AddItem(pr.second);
-
- SubscriptionIndex.CollectAffectedSubscriptions(item->UsageScope, item->Kind, subscriptions);
+ }
+ for (auto &pr : modifications.ModifiedItems) {
+ auto item = ConfigIndex.GetItem(pr.first);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: remove modified " << item->ToString());
+ ConfigIndex.RemoveItem(pr.first);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: add modified " << pr.second->ToString());
+ ConfigIndex.AddItem(pr.second);
+
+ SubscriptionIndex.CollectAffectedSubscriptions(item->UsageScope, item->Kind, subscriptions);
InMemoryIndex.CollectAffectedSubscriptions(item->UsageScope, item->Kind, inMemorySubscriptions);
if (item->UsageScope != pr.second->UsageScope) {
- SubscriptionIndex.CollectAffectedSubscriptions(pr.second->UsageScope, item->Kind, subscriptions);
+ SubscriptionIndex.CollectAffectedSubscriptions(pr.second->UsageScope, item->Kind, subscriptions);
InMemoryIndex.CollectAffectedSubscriptions(pr.second->UsageScope, item->Kind, inMemorySubscriptions);
}
- }
- for (auto item : modifications.AddedItems) {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: add new " << item->ToString());
- ConfigIndex.AddItem(item);
- SubscriptionIndex.CollectAffectedSubscriptions(item->UsageScope, item->Kind, subscriptions);
+ }
+ for (auto item : modifications.AddedItems) {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: add new " << item->ToString());
+ ConfigIndex.AddItem(item);
+ SubscriptionIndex.CollectAffectedSubscriptions(item->UsageScope, item->Kind, subscriptions);
InMemoryIndex.CollectAffectedSubscriptions(item->UsageScope, item->Kind, inMemorySubscriptions);
- }
-
- CheckSubscriptions(subscriptions, ctx);
+ }
+
+ CheckSubscriptions(subscriptions, ctx);
CheckSubscriptions(inMemorySubscriptions, ctx);
-}
-
-void TConfigsProvider::ApplySubscriptionModifications(const TSubscriptionModifications &modifications,
- const TActorContext &ctx)
-{
- LOG_TRACE(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: applying subscription midifications");
-
- TSubscriptionSet subscriptions;
-
- for (auto &id : modifications.RemovedSubscriptions) {
- auto subscription = SubscriptionIndex.GetSubscription(id);
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigsProvider: remove subscription " << subscription->ToString());
- if (subscription->Worker) {
- ctx.Send(subscription->Worker, new TEvents::TEvPoisonPill);
+}
+
+void TConfigsProvider::ApplySubscriptionModifications(const TSubscriptionModifications &modifications,
+ const TActorContext &ctx)
+{
+ LOG_TRACE(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider: applying subscription midifications");
+
+ TSubscriptionSet subscriptions;
+
+ for (auto &id : modifications.RemovedSubscriptions) {
+ auto subscription = SubscriptionIndex.GetSubscription(id);
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigsProvider: remove subscription " << subscription->ToString());
+ if (subscription->Worker) {
+ ctx.Send(subscription->Worker, new TEvents::TEvPoisonPill);
subscription->Worker = TActorId();
- }
- SubscriptionIndex.RemoveSubscription(id);
- }
- for (auto &subscription : modifications.AddedSubscriptions) {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigsProvider: add subscription " << subscription->ToString());
- SubscriptionIndex.AddSubscription(subscription);
- subscriptions.insert(subscription);
- }
- for (auto &pr : modifications.ModifiedLastProvided) {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigsProvider: update last provided config for subscription"
- << " id=" << pr.first
- << " lastprovidedconfig=" << pr.second.ToString());
- auto subscription = SubscriptionIndex.GetSubscription(pr.first);
- subscription->LastProvidedConfig = pr.second;
- subscriptions.insert(subscription);
- }
- for (auto &pr : modifications.ModifiedCookies) {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigsProvider: update cookie for subscription"
- << " id=" << pr.first
- << " cookie=" << pr.second);
- auto subscription = SubscriptionIndex.GetSubscription(pr.first);
- subscription->Cookie = pr.second;
- if (subscription->Worker) {
- ctx.Send(subscription->Worker, new TEvents::TEvPoisonPill);
+ }
+ SubscriptionIndex.RemoveSubscription(id);
+ }
+ for (auto &subscription : modifications.AddedSubscriptions) {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigsProvider: add subscription " << subscription->ToString());
+ SubscriptionIndex.AddSubscription(subscription);
+ subscriptions.insert(subscription);
+ }
+ for (auto &pr : modifications.ModifiedLastProvided) {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigsProvider: update last provided config for subscription"
+ << " id=" << pr.first
+ << " lastprovidedconfig=" << pr.second.ToString());
+ auto subscription = SubscriptionIndex.GetSubscription(pr.first);
+ subscription->LastProvidedConfig = pr.second;
+ subscriptions.insert(subscription);
+ }
+ for (auto &pr : modifications.ModifiedCookies) {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigsProvider: update cookie for subscription"
+ << " id=" << pr.first
+ << " cookie=" << pr.second);
+ auto subscription = SubscriptionIndex.GetSubscription(pr.first);
+ subscription->Cookie = pr.second;
+ if (subscription->Worker) {
+ ctx.Send(subscription->Worker, new TEvents::TEvPoisonPill);
subscription->Worker = TActorId();
- }
- subscriptions.insert(subscription);
- }
-
- CheckSubscriptions(subscriptions, ctx);
-}
-
-void TConfigsProvider::CheckAllSubscriptions(const TActorContext &ctx)
-{
- TSubscriptionSet subscriptions;
- for (auto &pr : SubscriptionIndex.GetSubscriptions())
- subscriptions.insert(pr.second);
- CheckSubscriptions(subscriptions, ctx);
-}
-
-void TConfigsProvider::CheckSubscriptions(const TSubscriptionSet &subscriptions,
- const TActorContext &ctx)
-{
- for (auto &subscription : subscriptions)
- CheckSubscription(subscription, ctx);
-}
-
+ }
+ subscriptions.insert(subscription);
+ }
+
+ CheckSubscriptions(subscriptions, ctx);
+}
+
+void TConfigsProvider::CheckAllSubscriptions(const TActorContext &ctx)
+{
+ TSubscriptionSet subscriptions;
+ for (auto &pr : SubscriptionIndex.GetSubscriptions())
+ subscriptions.insert(pr.second);
+ CheckSubscriptions(subscriptions, ctx);
+}
+
+void TConfigsProvider::CheckSubscriptions(const TSubscriptionSet &subscriptions,
+ const TActorContext &ctx)
+{
+ for (auto &subscription : subscriptions)
+ CheckSubscription(subscription, ctx);
+}
+
void TConfigsProvider::CheckSubscriptions(const TInMemorySubscriptionSet &subscriptions,
const TActorContext &ctx)
{
@@ -515,64 +515,64 @@ void TConfigsProvider::CheckSubscriptions(const TInMemorySubscriptionSet &subscr
CheckSubscription(subscription, ctx);
}
-void TConfigsProvider::CheckSubscription(TSubscription::TPtr subscription,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigsProvider: check if update is required for subscription"
- << " id=" << subscription->Id);
-
- auto config = ConfigIndex.BuildConfig(subscription->NodeId, subscription->Host,
- subscription->Tenant, subscription->NodeType,
- subscription->ItemKinds);
- TConfigId configId;
- for (auto kind : subscription->ItemKinds) {
- auto it = config->ConfigItems.find(kind);
- if (it == config->ConfigItems.end())
- continue;
-
- for (auto &item : it->second)
- configId.ItemIds.push_back(std::make_pair(item->Id, item->Generation));
- }
-
- if (subscription->LastProvidedConfig == configId) {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigsProvider: no changes found for subscription"
- << " id=" << subscription->Id);
- return;
- }
-
- if (configId != subscription->CurrentConfigId) {
- if (subscription->Worker) {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigsProvider: killing outdated worker for subscription"
- << " id=" << subscription->Id);
- ctx.Send(subscription->Worker, new TEvents::TEvPoisonPill);
- return;
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigsProvider: new config found for subscription"
- << " id=" << subscription->Id
- << " configid=" << configId.ToString());
-
- subscription->CurrentConfigId = std::move(configId);
- subscription->CurrentConfig.Clear();
- config->ComputeConfig(subscription->CurrentConfig);
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigsProvider: create new worker to update config for subscription"
- << " id=" << subscription->Id);
-
- IActor *worker;
- if (subscription->Subscriber.ServiceId)
- worker = new TServiceConfigSender(subscription, ctx.SelfID);
- else
- worker = new TTabletConfigSender(subscription, ctx.SelfID);
+void TConfigsProvider::CheckSubscription(TSubscription::TPtr subscription,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigsProvider: check if update is required for subscription"
+ << " id=" << subscription->Id);
+
+ auto config = ConfigIndex.BuildConfig(subscription->NodeId, subscription->Host,
+ subscription->Tenant, subscription->NodeType,
+ subscription->ItemKinds);
+ TConfigId configId;
+ for (auto kind : subscription->ItemKinds) {
+ auto it = config->ConfigItems.find(kind);
+ if (it == config->ConfigItems.end())
+ continue;
+
+ for (auto &item : it->second)
+ configId.ItemIds.push_back(std::make_pair(item->Id, item->Generation));
+ }
+
+ if (subscription->LastProvidedConfig == configId) {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigsProvider: no changes found for subscription"
+ << " id=" << subscription->Id);
+ return;
+ }
+
+ if (configId != subscription->CurrentConfigId) {
+ if (subscription->Worker) {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigsProvider: killing outdated worker for subscription"
+ << " id=" << subscription->Id);
+ ctx.Send(subscription->Worker, new TEvents::TEvPoisonPill);
+ return;
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigsProvider: new config found for subscription"
+ << " id=" << subscription->Id
+ << " configid=" << configId.ToString());
+
+ subscription->CurrentConfigId = std::move(configId);
+ subscription->CurrentConfig.Clear();
+ config->ComputeConfig(subscription->CurrentConfig);
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigsProvider: create new worker to update config for subscription"
+ << " id=" << subscription->Id);
+
+ IActor *worker;
+ if (subscription->Subscriber.ServiceId)
+ worker = new TServiceConfigSender(subscription, ctx.SelfID);
+ else
+ worker = new TTabletConfigSender(subscription, ctx.SelfID);
subscription->Worker = ctx.RegisterWithSameMailbox(worker);
-}
-
+}
+
void TConfigsProvider::CheckSubscription(TInMemorySubscription::TPtr subscription,
const TActorContext &ctx)
{
@@ -731,359 +731,359 @@ void TConfigsProvider::Handle(TEvPrivate::TEvWorkerDisconnected::TPtr &ev, const
}
}
-void TConfigsProvider::Handle(TEvConsole::TEvCheckConfigUpdatesRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- auto response = MakeHolder<TEvConsole::TEvCheckConfigUpdatesResponse>();
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- THashSet<ui64> base;
- for (auto &baseItem : rec.GetBaseItemIds()) {
- auto item = ConfigIndex.GetItem(baseItem.GetId());
- if (item && item->Generation != baseItem.GetGeneration()) {
- auto &entry = *response->Record.AddUpdatedItems();
- entry.SetId(item->Id);
- entry.SetGeneration(item->Generation);
- } else if (!item) {
- response->Record.AddRemovedItems()->CopyFrom(baseItem);
- }
-
- base.insert(baseItem.GetId());
- }
-
- for (auto &pr : ConfigIndex.GetConfigItems()) {
- if (!base.contains(pr.first)) {
- auto &entry = *response->Record.AddAddedItems();
- entry.SetId(pr.first);
- entry.SetGeneration(pr.second->Generation);
- }
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvCheckConfigUpdatesResponse: " << response->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
-}
-
-void TConfigsProvider::Handle(TEvConsole::TEvGetConfigItemsRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- auto response = MakeHolder<TEvConsole::TEvGetConfigItemsResponse>();
+void TConfigsProvider::Handle(TEvConsole::TEvCheckConfigUpdatesRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ auto response = MakeHolder<TEvConsole::TEvCheckConfigUpdatesResponse>();
response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- THashSet<ui32> kinds;
- for (auto &kind : rec.GetItemKinds())
- kinds.insert(kind);
-
- TConfigItems items;
- bool hasFilter = false;
- if (rec.ItemIdsSize()) {
- for (ui64 id : rec.GetItemIds()) {
- auto item = ConfigIndex.GetItem(id);
+
+ THashSet<ui64> base;
+ for (auto &baseItem : rec.GetBaseItemIds()) {
+ auto item = ConfigIndex.GetItem(baseItem.GetId());
+ if (item && item->Generation != baseItem.GetGeneration()) {
+ auto &entry = *response->Record.AddUpdatedItems();
+ entry.SetId(item->Id);
+ entry.SetGeneration(item->Generation);
+ } else if (!item) {
+ response->Record.AddRemovedItems()->CopyFrom(baseItem);
+ }
+
+ base.insert(baseItem.GetId());
+ }
+
+ for (auto &pr : ConfigIndex.GetConfigItems()) {
+ if (!base.contains(pr.first)) {
+ auto &entry = *response->Record.AddAddedItems();
+ entry.SetId(pr.first);
+ entry.SetGeneration(pr.second->Generation);
+ }
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvCheckConfigUpdatesResponse: " << response->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
+}
+
+void TConfigsProvider::Handle(TEvConsole::TEvGetConfigItemsRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ auto response = MakeHolder<TEvConsole::TEvGetConfigItemsResponse>();
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+
+ THashSet<ui32> kinds;
+ for (auto &kind : rec.GetItemKinds())
+ kinds.insert(kind);
+
+ TConfigItems items;
+ bool hasFilter = false;
+ if (rec.ItemIdsSize()) {
+ for (ui64 id : rec.GetItemIds()) {
+ auto item = ConfigIndex.GetItem(id);
if (item && (kinds.empty() || kinds.contains(item->Kind)))
- items.insert(item);
- }
- hasFilter = true;
- }
- if (rec.HasNodeFilter()) {
- if (rec.GetNodeFilter().NodesSize()) {
- for (ui32 nodeId : rec.GetNodeFilter().GetNodes())
- ConfigIndex.CollectItemsByNodeId(nodeId, kinds, items);
- } else {
- ConfigIndex.CollectItemsWithNodeIdScope(kinds, items);
- }
- hasFilter = true;
- }
- if (rec.HasHostFilter()) {
- if (rec.GetHostFilter().HostsSize()) {
- for (const TString &host : rec.GetHostFilter().GetHosts())
- ConfigIndex.CollectItemsByHost(host, kinds, items);
- } else {
- ConfigIndex.CollectItemsWithHostScope(kinds, items);
- }
- hasFilter = true;
- }
- if (rec.HasTenantFilter()) {
- if (rec.GetTenantFilter().TenantsSize()) {
- for (const TString &tenant : rec.GetTenantFilter().GetTenants())
- ConfigIndex.CollectItemsByTenant(tenant, kinds, items);
- } else {
- ConfigIndex.CollectItemsWithTenantScope(kinds, items);
- }
- hasFilter = true;
- }
- if (rec.HasNodeTypeFilter()) {
- if (rec.GetNodeTypeFilter().NodeTypesSize()) {
- for (const TString &nodeType : rec.GetNodeTypeFilter().GetNodeTypes())
- ConfigIndex.CollectItemsByNodeType(nodeType, kinds, items);
- } else {
- ConfigIndex.CollectItemsWithNodeTypeScope(kinds, items);
- }
- hasFilter = true;
- }
- if (rec.HasTenantAndNodeTypeFilter()) {
- if (rec.GetTenantAndNodeTypeFilter().TenantAndNodeTypesSize()) {
- for (auto &filter : rec.GetTenantAndNodeTypeFilter().GetTenantAndNodeTypes())
- ConfigIndex.CollectItemsByTenantAndNodeType(filter.GetTenant(),
- filter.GetNodeType(),
- kinds, items);
- } else {
- ConfigIndex.CollectItemsWithTenantAndNodeTypeScope(kinds, items);
- }
- hasFilter = true;
- }
- if (rec.UsageScopesSize()) {
- for (auto &usageScope : rec.GetUsageScopes())
- ConfigIndex.CollectItemsByScope(usageScope, kinds, items);
- hasFilter = true;
- }
- if (rec.HasCookieFilter()) {
- for (auto &cookie : rec.GetCookieFilter().GetCookies())
- ConfigIndex.CollectItemsByCookie(cookie, kinds, items);
- hasFilter = true;
- }
- if (!hasFilter) {
- for (auto &pr : ConfigIndex.GetConfigItems())
+ items.insert(item);
+ }
+ hasFilter = true;
+ }
+ if (rec.HasNodeFilter()) {
+ if (rec.GetNodeFilter().NodesSize()) {
+ for (ui32 nodeId : rec.GetNodeFilter().GetNodes())
+ ConfigIndex.CollectItemsByNodeId(nodeId, kinds, items);
+ } else {
+ ConfigIndex.CollectItemsWithNodeIdScope(kinds, items);
+ }
+ hasFilter = true;
+ }
+ if (rec.HasHostFilter()) {
+ if (rec.GetHostFilter().HostsSize()) {
+ for (const TString &host : rec.GetHostFilter().GetHosts())
+ ConfigIndex.CollectItemsByHost(host, kinds, items);
+ } else {
+ ConfigIndex.CollectItemsWithHostScope(kinds, items);
+ }
+ hasFilter = true;
+ }
+ if (rec.HasTenantFilter()) {
+ if (rec.GetTenantFilter().TenantsSize()) {
+ for (const TString &tenant : rec.GetTenantFilter().GetTenants())
+ ConfigIndex.CollectItemsByTenant(tenant, kinds, items);
+ } else {
+ ConfigIndex.CollectItemsWithTenantScope(kinds, items);
+ }
+ hasFilter = true;
+ }
+ if (rec.HasNodeTypeFilter()) {
+ if (rec.GetNodeTypeFilter().NodeTypesSize()) {
+ for (const TString &nodeType : rec.GetNodeTypeFilter().GetNodeTypes())
+ ConfigIndex.CollectItemsByNodeType(nodeType, kinds, items);
+ } else {
+ ConfigIndex.CollectItemsWithNodeTypeScope(kinds, items);
+ }
+ hasFilter = true;
+ }
+ if (rec.HasTenantAndNodeTypeFilter()) {
+ if (rec.GetTenantAndNodeTypeFilter().TenantAndNodeTypesSize()) {
+ for (auto &filter : rec.GetTenantAndNodeTypeFilter().GetTenantAndNodeTypes())
+ ConfigIndex.CollectItemsByTenantAndNodeType(filter.GetTenant(),
+ filter.GetNodeType(),
+ kinds, items);
+ } else {
+ ConfigIndex.CollectItemsWithTenantAndNodeTypeScope(kinds, items);
+ }
+ hasFilter = true;
+ }
+ if (rec.UsageScopesSize()) {
+ for (auto &usageScope : rec.GetUsageScopes())
+ ConfigIndex.CollectItemsByScope(usageScope, kinds, items);
+ hasFilter = true;
+ }
+ if (rec.HasCookieFilter()) {
+ for (auto &cookie : rec.GetCookieFilter().GetCookies())
+ ConfigIndex.CollectItemsByCookie(cookie, kinds, items);
+ hasFilter = true;
+ }
+ if (!hasFilter) {
+ for (auto &pr : ConfigIndex.GetConfigItems())
if (kinds.empty() || kinds.contains(pr.second->Kind))
- items.insert(pr.second);
- }
-
- for (auto &item : items)
- item->Serialize(*response->Record.AddConfigItems());
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvGetConfigItemsResponse: " << response->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
-}
-
-void TConfigsProvider::Handle(TEvConsole::TEvConfigNotificationResponse::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
- auto subscription = SubscriptionIndex.GetSubscription(rec.GetSubscriptionId());
- // Subscription was removed
- if (!subscription) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Config notification response for missing subscription id="
- << rec.GetSubscriptionId());
- return;
- }
- // Service was restarted.
- if (ev->Cookie != subscription->Cookie) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Config notification response cookie mismatch for"
- << " subscription id=" << rec.GetSubscriptionId());
- Y_VERIFY(subscription->Subscriber.ServiceId);
- return;
- }
- // Actually it's possible cookie was changed in configs manager
- // and update is on its way. We ignore it here and update last
- // provided config anyway because cookie update always come with
- // last provided update.
- subscription->LastProvidedConfig.Load(rec.GetConfigId());
+ items.insert(pr.second);
+ }
+
+ for (auto &item : items)
+ item->Serialize(*response->Record.AddConfigItems());
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvGetConfigItemsResponse: " << response->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
+}
+
+void TConfigsProvider::Handle(TEvConsole::TEvConfigNotificationResponse::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+ auto subscription = SubscriptionIndex.GetSubscription(rec.GetSubscriptionId());
+ // Subscription was removed
+ if (!subscription) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Config notification response for missing subscription id="
+ << rec.GetSubscriptionId());
+ return;
+ }
+ // Service was restarted.
+ if (ev->Cookie != subscription->Cookie) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Config notification response cookie mismatch for"
+ << " subscription id=" << rec.GetSubscriptionId());
+ Y_VERIFY(subscription->Subscriber.ServiceId);
+ return;
+ }
+ // Actually it's possible cookie was changed in configs manager
+ // and update is on its way. We ignore it here and update last
+ // provided config anyway because cookie update always come with
+ // last provided update.
+ subscription->LastProvidedConfig.Load(rec.GetConfigId());
subscription->Worker = TActorId();
-
- ctx.Send(ev->Forward(ConfigsManager));
-}
-
-void TConfigsProvider::Handle(TEvConsole::TEvGetConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx)
-{
- ui64 id = ev->Get()->Record.GetSubscriptionId();
- auto resp = MakeHolder<TEvConsole::TEvGetConfigSubscriptionResponse>();
- auto subscription = SubscriptionIndex.GetSubscription(id);
- if (subscription) {
+
+ ctx.Send(ev->Forward(ConfigsManager));
+}
+
+void TConfigsProvider::Handle(TEvConsole::TEvGetConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx)
+{
+ ui64 id = ev->Get()->Record.GetSubscriptionId();
+ auto resp = MakeHolder<TEvConsole::TEvGetConfigSubscriptionResponse>();
+ auto subscription = SubscriptionIndex.GetSubscription(id);
+ if (subscription) {
resp->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
- subscription->Serialize(*resp->Record.MutableSubscription());
- } else {
+ subscription->Serialize(*resp->Record.MutableSubscription());
+ } else {
resp->Record.MutableStatus()->SetCode(Ydb::StatusIds::NOT_FOUND);
- resp->Record.MutableSubscription()->SetId(id);
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvGetConfigSubscriptionResponse: " << resp->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
-}
-
-void TConfigsProvider::Handle(TEvConsole::TEvGetNodeConfigItemsRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- auto response = MakeHolder<TEvConsole::TEvGetNodeConfigItemsResponse>();
+ resp->Record.MutableSubscription()->SetId(id);
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvGetConfigSubscriptionResponse: " << resp->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+}
+
+void TConfigsProvider::Handle(TEvConsole::TEvGetNodeConfigItemsRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ auto response = MakeHolder<TEvConsole::TEvGetNodeConfigItemsResponse>();
response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- THashSet<ui32> kinds;
- for (auto &kind : rec.GetItemKinds())
- kinds.insert(kind);
-
- TConfigItems items;
- ConfigIndex.CollectItemsForNode(rec.GetNode(), kinds, items);
-
- for (auto &item : items)
- item->Serialize(*response->Record.AddConfigItems());
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvGetNodeConfigItemsResponse: " << response->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
-}
-
-void TConfigsProvider::Handle(TEvConsole::TEvGetNodeConfigRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- auto response = MakeHolder<TEvConsole::TEvGetNodeConfigResponse>();
+
+ THashSet<ui32> kinds;
+ for (auto &kind : rec.GetItemKinds())
+ kinds.insert(kind);
+
+ TConfigItems items;
+ ConfigIndex.CollectItemsForNode(rec.GetNode(), kinds, items);
+
+ for (auto &item : items)
+ item->Serialize(*response->Record.AddConfigItems());
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvGetNodeConfigItemsResponse: " << response->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
+}
+
+void TConfigsProvider::Handle(TEvConsole::TEvGetNodeConfigRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ auto response = MakeHolder<TEvConsole::TEvGetNodeConfigResponse>();
response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- THashSet<ui32> kinds;
- for (auto &kind : rec.GetItemKinds())
- kinds.insert(kind);
-
- auto config = ConfigIndex.GetNodeConfig(rec.GetNode(), kinds);
+
+ THashSet<ui32> kinds;
+ for (auto &kind : rec.GetItemKinds())
+ kinds.insert(kind);
+
+ auto config = ConfigIndex.GetNodeConfig(rec.GetNode(), kinds);
config->ComputeConfig(*response->Record.MutableConfig(), true);
-
- if (Config.EnableValidationOnNodeConfigRequest) {
- auto registry = TValidatorsRegistry::Instance();
- TVector<Ydb::Issue::IssueMessage> issues;
- if (!registry->CheckConfig({}, response->Record.GetConfig(), issues)) {
- response->Record.ClearConfig();
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::PRECONDITION_FAILED);
- for (auto &issue : issues) {
- if (issue.severity() == NYql::TSeverityIds::S_ERROR
- || issue.severity() == NYql::TSeverityIds::S_FATAL) {
- response->Record.MutableStatus()
- ->SetReason("Config validation failure: " + issue.message());
- break;
- }
- }
- }
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvGetNodeConfigResponse: " << response->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
-}
-
-void TConfigsProvider::Handle(TEvConsole::TEvListConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- auto response = MakeHolder<TEvConsole::TEvListConfigSubscriptionsResponse>();
+
+ if (Config.EnableValidationOnNodeConfigRequest) {
+ auto registry = TValidatorsRegistry::Instance();
+ TVector<Ydb::Issue::IssueMessage> issues;
+ if (!registry->CheckConfig({}, response->Record.GetConfig(), issues)) {
+ response->Record.ClearConfig();
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::PRECONDITION_FAILED);
+ for (auto &issue : issues) {
+ if (issue.severity() == NYql::TSeverityIds::S_ERROR
+ || issue.severity() == NYql::TSeverityIds::S_FATAL) {
+ response->Record.MutableStatus()
+ ->SetReason("Config validation failure: " + issue.message());
+ break;
+ }
+ }
+ }
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvGetNodeConfigResponse: " << response->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
+}
+
+void TConfigsProvider::Handle(TEvConsole::TEvListConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ auto response = MakeHolder<TEvConsole::TEvListConfigSubscriptionsResponse>();
response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- if (rec.HasSubscriber()) {
- TSubscriberId subscriber(rec.GetSubscriber());
- auto &subscriptions = SubscriptionIndex.GetSubscriptions(subscriber);
- for (auto subscription : subscriptions)
- subscription->Serialize(*response->Record.AddSubscriptions());
- } else {
- for (auto &pr : SubscriptionIndex.GetSubscriptions())
- pr.second->Serialize(*response->Record.AddSubscriptions());
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Send TEvListConfigSubscriptionsResponse: " << response->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
-}
-
-void TConfigsProvider::Handle(TEvPrivate::TEvNotificationTimeout::TPtr &ev, const TActorContext &ctx)
-{
- auto subscription = ev->Get()->Subscription;
-
- LOG_ERROR_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Couldn't deliver config notification for subscription "
- << subscription->ToString() );
-
- // Subscription was removed
- if (!SubscriptionIndex.GetSubscription(subscription->Id)) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Config notification timeout for missing subscription id="
- << subscription->Id);
- return;
- }
- // Worker has changed.
- if (ev->Sender != subscription->Worker) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Config notification timeout from unexpected worker for"
- << " subscription id=" << subscription->Id);
- return;
- }
+
+ if (rec.HasSubscriber()) {
+ TSubscriberId subscriber(rec.GetSubscriber());
+ auto &subscriptions = SubscriptionIndex.GetSubscriptions(subscriber);
+ for (auto subscription : subscriptions)
+ subscription->Serialize(*response->Record.AddSubscriptions());
+ } else {
+ for (auto &pr : SubscriptionIndex.GetSubscriptions())
+ pr.second->Serialize(*response->Record.AddSubscriptions());
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Send TEvListConfigSubscriptionsResponse: " << response->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, response.Release(), 0, ev->Cookie);
+}
+
+void TConfigsProvider::Handle(TEvPrivate::TEvNotificationTimeout::TPtr &ev, const TActorContext &ctx)
+{
+ auto subscription = ev->Get()->Subscription;
+
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Couldn't deliver config notification for subscription "
+ << subscription->ToString() );
+
+ // Subscription was removed
+ if (!SubscriptionIndex.GetSubscription(subscription->Id)) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Config notification timeout for missing subscription id="
+ << subscription->Id);
+ return;
+ }
+ // Worker has changed.
+ if (ev->Sender != subscription->Worker) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Config notification timeout from unexpected worker for"
+ << " subscription id=" << subscription->Id);
+ return;
+ }
subscription->Worker = TActorId();
- CheckSubscription(subscription, ctx);
-}
-
-void TConfigsProvider::Handle(TEvPrivate::TEvSenderDied::TPtr &ev, const TActorContext &ctx)
-{
- auto subscription = ev->Get()->Subscription;
- // Subscription was removed
- if (!SubscriptionIndex.GetSubscription(subscription->Id)) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Config sender died for missing subscription id="
- << subscription->Id);
- return;
- }
- // Worker has changed.
- if (ev->Sender != subscription->Worker) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_CONFIGS,
- "Unexpected config sender died for"
- << " subscription id=" << subscription->Id);
- return;
- }
+ CheckSubscription(subscription, ctx);
+}
+
+void TConfigsProvider::Handle(TEvPrivate::TEvSenderDied::TPtr &ev, const TActorContext &ctx)
+{
+ auto subscription = ev->Get()->Subscription;
+ // Subscription was removed
+ if (!SubscriptionIndex.GetSubscription(subscription->Id)) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Config sender died for missing subscription id="
+ << subscription->Id);
+ return;
+ }
+ // Worker has changed.
+ if (ev->Sender != subscription->Worker) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "Unexpected config sender died for"
+ << " subscription id=" << subscription->Id);
+ return;
+ }
subscription->Worker = TActorId();
- CheckSubscription(subscription, ctx);
-}
-
-void TConfigsProvider::Handle(TEvPrivate::TEvSetConfig::TPtr &ev, const TActorContext &ctx)
-{
- Y_UNUSED(ctx);
- Config = std::move(ev->Get()->Config);
-}
-
-void TConfigsProvider::Handle(TEvPrivate::TEvSetConfigs::TPtr &ev, const TActorContext &ctx)
-{
- Y_UNUSED(ctx);
- Y_VERIFY(ConfigIndex.IsEmpty());
- for (auto &pr : ev->Get()->ConfigItems)
- ConfigIndex.AddItem(pr.second);
- CheckAllSubscriptions(ctx);
-}
-
-void TConfigsProvider::Handle(TEvPrivate::TEvSetSubscriptions::TPtr &ev, const TActorContext &ctx)
-{
- Y_UNUSED(ctx);
- Y_VERIFY(SubscriptionIndex.IsEmpty());
- for (auto &pr : ev->Get()->Subscriptions)
- SubscriptionIndex.AddSubscription(pr.second);
- CheckAllSubscriptions(ctx);
-}
-
-void TConfigsProvider::Handle(TEvPrivate::TEvUpdateConfigs::TPtr &ev, const TActorContext &ctx)
-{
- auto &event = ev->Get()->Event;
- if (event) {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigsProvider send: " << event->GetBase()->ToString());
- ctx.Send(event);
- }
-
- ApplyConfigModifications(ev->Get()->Modifications, ctx);
-}
-
-void TConfigsProvider::Handle(TEvPrivate::TEvUpdateSubscriptions::TPtr &ev, const TActorContext &ctx)
-{
- auto &event = ev->Get()->Event;
- if (event) {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TConfigsProvider send: " << event->GetBase()->ToString());
- ctx.Send(event);
- }
-
- ApplySubscriptionModifications(ev->Get()->Modifications, ctx);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ CheckSubscription(subscription, ctx);
+}
+
+void TConfigsProvider::Handle(TEvPrivate::TEvSetConfig::TPtr &ev, const TActorContext &ctx)
+{
+ Y_UNUSED(ctx);
+ Config = std::move(ev->Get()->Config);
+}
+
+void TConfigsProvider::Handle(TEvPrivate::TEvSetConfigs::TPtr &ev, const TActorContext &ctx)
+{
+ Y_UNUSED(ctx);
+ Y_VERIFY(ConfigIndex.IsEmpty());
+ for (auto &pr : ev->Get()->ConfigItems)
+ ConfigIndex.AddItem(pr.second);
+ CheckAllSubscriptions(ctx);
+}
+
+void TConfigsProvider::Handle(TEvPrivate::TEvSetSubscriptions::TPtr &ev, const TActorContext &ctx)
+{
+ Y_UNUSED(ctx);
+ Y_VERIFY(SubscriptionIndex.IsEmpty());
+ for (auto &pr : ev->Get()->Subscriptions)
+ SubscriptionIndex.AddSubscription(pr.second);
+ CheckAllSubscriptions(ctx);
+}
+
+void TConfigsProvider::Handle(TEvPrivate::TEvUpdateConfigs::TPtr &ev, const TActorContext &ctx)
+{
+ auto &event = ev->Get()->Event;
+ if (event) {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigsProvider send: " << event->GetBase()->ToString());
+ ctx.Send(event);
+ }
+
+ ApplyConfigModifications(ev->Get()->Modifications, ctx);
+}
+
+void TConfigsProvider::Handle(TEvPrivate::TEvUpdateSubscriptions::TPtr &ev, const TActorContext &ctx)
+{
+ auto &event = ev->Get()->Event;
+ if (event) {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TConfigsProvider send: " << event->GetBase()->ToString());
+ ctx.Send(event);
+ }
+
+ ApplySubscriptionModifications(ev->Get()->Modifications, ctx);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console_configs_provider.h b/ydb/core/cms/console/console_configs_provider.h
index 98ab7c92d59..ddb74d52d48 100644
--- a/ydb/core/cms/console/console_configs_provider.h
+++ b/ydb/core/cms/console/console_configs_provider.h
@@ -1,55 +1,55 @@
-#pragma once
-
-#include "defs.h"
-
-#include "configs_config.h"
-#include "config_index.h"
-#include "console.h"
-
+#pragma once
+
+#include "defs.h"
+
+#include "configs_config.h"
+#include "config_index.h"
+#include "console.h"
+
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
-
+
#include <library/cpp/actors/core/hfunc.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-class TConfigsProvider : public TActorBootstrapped<TConfigsProvider> {
-public:
- struct TEvPrivate {
- enum EEv {
- EvNotificationTimeout = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
- EvSenderDied,
- EvSetConfig,
- EvSetConfigs,
- EvSetSubscriptions,
- EvUpdateConfigs,
- EvUpdateSubscriptions,
+
+namespace NKikimr {
+namespace NConsole {
+
+class TConfigsProvider : public TActorBootstrapped<TConfigsProvider> {
+public:
+ struct TEvPrivate {
+ enum EEv {
+ EvNotificationTimeout = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
+ EvSenderDied,
+ EvSetConfig,
+ EvSetConfigs,
+ EvSetSubscriptions,
+ EvUpdateConfigs,
+ EvUpdateSubscriptions,
EvWorkerDisconnected,
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
-
- struct TEvNotificationTimeout : public TEventLocal<TEvNotificationTimeout, EvNotificationTimeout> {
- TEvNotificationTimeout(TSubscription::TPtr subscription)
- : Subscription(subscription)
- {
- }
-
- TSubscription::TPtr Subscription;
- };
-
- struct TEvSenderDied : public TEventLocal<TEvSenderDied, EvSenderDied> {
- TEvSenderDied(TSubscription::TPtr subscription)
- : Subscription(subscription)
- {
- }
-
- TSubscription::TPtr Subscription;
- };
-
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
+
+ struct TEvNotificationTimeout : public TEventLocal<TEvNotificationTimeout, EvNotificationTimeout> {
+ TEvNotificationTimeout(TSubscription::TPtr subscription)
+ : Subscription(subscription)
+ {
+ }
+
+ TSubscription::TPtr Subscription;
+ };
+
+ struct TEvSenderDied : public TEventLocal<TEvSenderDied, EvSenderDied> {
+ TEvSenderDied(TSubscription::TPtr subscription)
+ : Subscription(subscription)
+ {
+ }
+
+ TSubscription::TPtr Subscription;
+ };
+
struct TEvWorkerDisconnected : public TEventLocal<TEvWorkerDisconnected, EvWorkerDisconnected> {
explicit TEvWorkerDisconnected(TInMemorySubscription::TPtr subscription)
: Subscription(subscription)
@@ -59,158 +59,158 @@ public:
TInMemorySubscription::TPtr Subscription;
};
- struct TEvSetConfig : public TEventLocal<TEvSetConfig, EvSetConfig> {
- TEvSetConfig(const TConfigsConfig &config)
- : Config(config)
- {
- }
-
- TConfigsConfig Config;
- };
-
- struct TEvSetConfigs : public TEventLocal<TEvSetConfigs, EvSetConfigs> {
- TEvSetConfigs(const THashMap<ui64, TConfigItem::TPtr> &items)
- {
- for (auto &pr : items)
- ConfigItems.emplace(pr.first, new TConfigItem(*pr.second));
- }
-
- THashMap<ui64, TConfigItem::TPtr> ConfigItems;
- };
-
- struct TEvSetSubscriptions : public TEventLocal<TEvSetSubscriptions, EvSetSubscriptions> {
- TEvSetSubscriptions(const THashMap<ui64, TSubscription::TPtr> &subscriptions)
- {
- for (auto &pr : subscriptions)
- Subscriptions.emplace(pr.first, new TSubscription(*pr.second));
- }
-
- THashMap<ui64, TSubscription::TPtr> Subscriptions;
- };
-
- struct TEvUpdateConfigs : public TEventLocal<TEvUpdateConfigs, EvUpdateConfigs> {
- TEvUpdateConfigs(const TConfigModifications &mod, TAutoPtr<IEventHandle> ev)
- : Event(ev)
- {
- Modifications.DeepCopyFrom(mod);
- }
-
- TConfigModifications Modifications;
- TAutoPtr<IEventHandle> Event;
- };
-
- struct TEvUpdateSubscriptions : public TEventLocal<TEvUpdateSubscriptions, EvUpdateSubscriptions> {
- TEvUpdateSubscriptions(const TSubscriptionModifications &mod, TAutoPtr<IEventHandle> ev)
- : Event(ev)
- {
- Modifications.DeepCopyFrom(mod);
- }
-
- TSubscriptionModifications Modifications;
- TAutoPtr<IEventHandle> Event;
- };
- };
-
-private:
- using TBase = TActorBootstrapped<TConfigsProvider>;
-
- void ClearState();
-
- void ApplyConfigModifications(const TConfigModifications &modifications,
- const TActorContext &ctx);
- void ApplySubscriptionModifications(const TSubscriptionModifications &modifications,
- const TActorContext &ctx);
-
- void CheckAllSubscriptions(const TActorContext &ctx);
- void CheckSubscriptions(const TSubscriptionSet &subscriptions,
- const TActorContext &ctx);
+ struct TEvSetConfig : public TEventLocal<TEvSetConfig, EvSetConfig> {
+ TEvSetConfig(const TConfigsConfig &config)
+ : Config(config)
+ {
+ }
+
+ TConfigsConfig Config;
+ };
+
+ struct TEvSetConfigs : public TEventLocal<TEvSetConfigs, EvSetConfigs> {
+ TEvSetConfigs(const THashMap<ui64, TConfigItem::TPtr> &items)
+ {
+ for (auto &pr : items)
+ ConfigItems.emplace(pr.first, new TConfigItem(*pr.second));
+ }
+
+ THashMap<ui64, TConfigItem::TPtr> ConfigItems;
+ };
+
+ struct TEvSetSubscriptions : public TEventLocal<TEvSetSubscriptions, EvSetSubscriptions> {
+ TEvSetSubscriptions(const THashMap<ui64, TSubscription::TPtr> &subscriptions)
+ {
+ for (auto &pr : subscriptions)
+ Subscriptions.emplace(pr.first, new TSubscription(*pr.second));
+ }
+
+ THashMap<ui64, TSubscription::TPtr> Subscriptions;
+ };
+
+ struct TEvUpdateConfigs : public TEventLocal<TEvUpdateConfigs, EvUpdateConfigs> {
+ TEvUpdateConfigs(const TConfigModifications &mod, TAutoPtr<IEventHandle> ev)
+ : Event(ev)
+ {
+ Modifications.DeepCopyFrom(mod);
+ }
+
+ TConfigModifications Modifications;
+ TAutoPtr<IEventHandle> Event;
+ };
+
+ struct TEvUpdateSubscriptions : public TEventLocal<TEvUpdateSubscriptions, EvUpdateSubscriptions> {
+ TEvUpdateSubscriptions(const TSubscriptionModifications &mod, TAutoPtr<IEventHandle> ev)
+ : Event(ev)
+ {
+ Modifications.DeepCopyFrom(mod);
+ }
+
+ TSubscriptionModifications Modifications;
+ TAutoPtr<IEventHandle> Event;
+ };
+ };
+
+private:
+ using TBase = TActorBootstrapped<TConfigsProvider>;
+
+ void ClearState();
+
+ void ApplyConfigModifications(const TConfigModifications &modifications,
+ const TActorContext &ctx);
+ void ApplySubscriptionModifications(const TSubscriptionModifications &modifications,
+ const TActorContext &ctx);
+
+ void CheckAllSubscriptions(const TActorContext &ctx);
+ void CheckSubscriptions(const TSubscriptionSet &subscriptions,
+ const TActorContext &ctx);
void CheckSubscriptions(const TInMemorySubscriptionSet &subscriptions,
const TActorContext &ctx);
- void CheckSubscription(TSubscription::TPtr subscriptions,
- const TActorContext &ctx);
+ void CheckSubscription(TSubscription::TPtr subscriptions,
+ const TActorContext &ctx);
void CheckSubscription(TInMemorySubscription::TPtr subscriptions,
const TActorContext &ctx);
-
+
void Handle(TEvConsole::TEvConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx);
void Handle(TEvConsole::TEvConfigSubscriptionCanceled::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvCheckConfigUpdatesRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvConfigNotificationResponse::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvGetConfigItemsRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvGetConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvGetNodeConfigItemsRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvGetNodeConfigRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvListConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvCheckConfigUpdatesRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvConfigNotificationResponse::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvGetConfigItemsRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvGetConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvGetNodeConfigItemsRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvGetNodeConfigRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvListConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx);
void Handle(TEvPrivate::TEvWorkerDisconnected::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvNotificationTimeout::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvSenderDied::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvSetConfig::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvSetConfigs::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvSetSubscriptions::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvUpdateConfigs::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvUpdateSubscriptions::TPtr &ev, const TActorContext &ctx);
-
- void HandlePoison(const TActorContext &ctx)
- {
- LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider::HandlePoison");
-
- Die(ctx);
- }
-
- STFUNC(StateWork) {
- TRACE_EVENT(NKikimrServices::CMS_CONFIGS);
- switch (ev->GetTypeRewrite()) {
+ void Handle(TEvPrivate::TEvNotificationTimeout::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvSenderDied::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvSetConfig::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvSetConfigs::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvSetSubscriptions::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvUpdateConfigs::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvUpdateSubscriptions::TPtr &ev, const TActorContext &ctx);
+
+ void HandlePoison(const TActorContext &ctx)
+ {
+ LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TConfigsProvider::HandlePoison");
+
+ Die(ctx);
+ }
+
+ STFUNC(StateWork) {
+ TRACE_EVENT(NKikimrServices::CMS_CONFIGS);
+ switch (ev->GetTypeRewrite()) {
HFuncTraced(TEvConsole::TEvConfigSubscriptionRequest, Handle);
HFuncTraced(TEvConsole::TEvConfigSubscriptionCanceled, Handle);
- HFuncTraced(TEvConsole::TEvCheckConfigUpdatesRequest, Handle);
- HFuncTraced(TEvConsole::TEvConfigNotificationResponse, Handle);
- HFuncTraced(TEvConsole::TEvGetConfigItemsRequest, Handle);
- HFuncTraced(TEvConsole::TEvGetConfigSubscriptionRequest, Handle);
- HFuncTraced(TEvConsole::TEvGetNodeConfigItemsRequest, Handle);
- HFuncTraced(TEvConsole::TEvGetNodeConfigRequest, Handle);
- HFuncTraced(TEvConsole::TEvListConfigSubscriptionsRequest, Handle);
+ HFuncTraced(TEvConsole::TEvCheckConfigUpdatesRequest, Handle);
+ HFuncTraced(TEvConsole::TEvConfigNotificationResponse, Handle);
+ HFuncTraced(TEvConsole::TEvGetConfigItemsRequest, Handle);
+ HFuncTraced(TEvConsole::TEvGetConfigSubscriptionRequest, Handle);
+ HFuncTraced(TEvConsole::TEvGetNodeConfigItemsRequest, Handle);
+ HFuncTraced(TEvConsole::TEvGetNodeConfigRequest, Handle);
+ HFuncTraced(TEvConsole::TEvListConfigSubscriptionsRequest, Handle);
HFuncTraced(TEvPrivate::TEvWorkerDisconnected, Handle);
- HFuncTraced(TEvPrivate::TEvNotificationTimeout, Handle);
- HFuncTraced(TEvPrivate::TEvSenderDied, Handle);
- HFuncTraced(TEvPrivate::TEvSetConfig, Handle);
- HFuncTraced(TEvPrivate::TEvSetConfigs, Handle);
- HFuncTraced(TEvPrivate::TEvSetSubscriptions, Handle);
- HFuncTraced(TEvPrivate::TEvUpdateConfigs, Handle);
- HFuncTraced(TEvPrivate::TEvUpdateSubscriptions, Handle);
- CFunc(TEvents::TSystem::PoisonPill, HandlePoison);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ HFuncTraced(TEvPrivate::TEvNotificationTimeout, Handle);
+ HFuncTraced(TEvPrivate::TEvSenderDied, Handle);
+ HFuncTraced(TEvPrivate::TEvSetConfig, Handle);
+ HFuncTraced(TEvPrivate::TEvSetConfigs, Handle);
+ HFuncTraced(TEvPrivate::TEvSetSubscriptions, Handle);
+ HFuncTraced(TEvPrivate::TEvUpdateConfigs, Handle);
+ HFuncTraced(TEvPrivate::TEvUpdateSubscriptions, Handle);
+ CFunc(TEvents::TSystem::PoisonPill, HandlePoison);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-
-public:
+ break;
+ }
+ }
+
+public:
TConfigsProvider(TActorId ownerId)
- : ConfigsManager(ownerId)
- {
- }
-
- ~TConfigsProvider()
- {
- ClearState();
- }
-
+ : ConfigsManager(ownerId)
+ {
+ }
+
+ ~TConfigsProvider()
+ {
+ ClearState();
+ }
+
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_CONFIGS_PROVIDER;
- }
-
- void Bootstrap(const TActorContext &ctx);
- void Die(const TActorContext &ctx) override;
-
-private:
+ }
+
+ void Bootstrap(const TActorContext &ctx);
+ void Die(const TActorContext &ctx) override;
+
+private:
TActorId ConfigsManager;
- TConfigsConfig Config;
- TConfigIndex ConfigIndex;
- TSubscriptionIndex SubscriptionIndex;
+ TConfigsConfig Config;
+ TConfigIndex ConfigIndex;
+ TSubscriptionIndex SubscriptionIndex;
TInMemorySubscriptionIndex InMemoryIndex;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
+};
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console_impl.h b/ydb/core/cms/console/console_impl.h
index f8ea684ff3d..0894337c3ec 100644
--- a/ydb/core/cms/console/console_impl.h
+++ b/ydb/core/cms/console/console_impl.h
@@ -1,9 +1,9 @@
-#pragma once
-
-#include "console.h"
-#include "console__scheme.h"
-#include "tx_processor.h"
-
+#pragma once
+
+#include "console.h"
+#include "console__scheme.h"
+#include "tx_processor.h"
+
#include <ydb/core/base/blobstorage.h>
#include <ydb/core/base/location.h>
#include <ydb/core/base/tablet_pipe.h>
@@ -12,161 +12,161 @@
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
#include <ydb/core/tx/schemeshard/schemeshard.h>
#include <ydb/core/tx/tx_proxy/proxy.h>
-
+
#include <ydb/library/yql/public/issue/protos/issue_severity.pb.h>
-
+
#include <library/cpp/actors/core/hfunc.h>
-
-#include <util/generic/set.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-using NTabletFlatExecutor::ITransaction;
-using NTabletFlatExecutor::TTransactionBase;
-using NTabletFlatExecutor::TTabletExecutedFlat;
-using NMonitoring::TDynamicCounterPtr;
-
-class TConfigsManager;
-class TTenantsManager;
-
-class TConsole : public TActor<TConsole>
- , public TTabletExecutedFlat
- , public ITxExecutor {
- using TActorBase = TActor<TConsole>;
-
-public:
- enum EConfigKey {
- ConfigKeyConfig = 1,
- ConfigKeyVersion,
- ConfigKeyNextConfigItemId,
- ConfigKeyNextTxId,
- ConfigKeyNextSubscriptionId,
- };
-
-private:
- class TTxInitScheme;
- class TTxLoadState;
- class TTxSetConfig;
-
- ITransaction *CreateTxInitScheme();
- ITransaction *CreateTxLoadState();
- ITransaction *CreateTxSetConfig(TEvConsole::TEvSetConfigRequest::TPtr &ev);
-
- void OnActivateExecutor(const TActorContext &ctx) override;
- void OnDetach(const TActorContext &ctx) override;
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev, const TActorContext &ctx) override;
- void Enqueue(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx) override;
- bool OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev, const TActorContext &ctx) override;
-
- void Cleanup(const TActorContext &ctx);
- void Die(const TActorContext &ctx) override;
-
- void LoadConfigFromProto(const NKikimrConsole::TConfig &config);
- void ProcessEnqueuedEvents(const TActorContext &ctx);
-
- void ClearState();
-
- void ForwardToConfigsManager(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx);
- void ForwardToTenantsManager(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvGetConfigRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvSetConfigRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvents::TEvPoisonPill::TPtr &ev,
- const TActorContext &ctx);
-
- STFUNC(StateInit)
- {
- StateInitImpl(ev, ctx);
- }
-
- STFUNC(StateWork)
- {
- TRACE_EVENT(NKikimrServices::CMS);
- switch (ev->GetTypeRewrite()) {
+
+#include <util/generic/set.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+using NTabletFlatExecutor::ITransaction;
+using NTabletFlatExecutor::TTransactionBase;
+using NTabletFlatExecutor::TTabletExecutedFlat;
+using NMonitoring::TDynamicCounterPtr;
+
+class TConfigsManager;
+class TTenantsManager;
+
+class TConsole : public TActor<TConsole>
+ , public TTabletExecutedFlat
+ , public ITxExecutor {
+ using TActorBase = TActor<TConsole>;
+
+public:
+ enum EConfigKey {
+ ConfigKeyConfig = 1,
+ ConfigKeyVersion,
+ ConfigKeyNextConfigItemId,
+ ConfigKeyNextTxId,
+ ConfigKeyNextSubscriptionId,
+ };
+
+private:
+ class TTxInitScheme;
+ class TTxLoadState;
+ class TTxSetConfig;
+
+ ITransaction *CreateTxInitScheme();
+ ITransaction *CreateTxLoadState();
+ ITransaction *CreateTxSetConfig(TEvConsole::TEvSetConfigRequest::TPtr &ev);
+
+ void OnActivateExecutor(const TActorContext &ctx) override;
+ void OnDetach(const TActorContext &ctx) override;
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev, const TActorContext &ctx) override;
+ void Enqueue(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx) override;
+ bool OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev, const TActorContext &ctx) override;
+
+ void Cleanup(const TActorContext &ctx);
+ void Die(const TActorContext &ctx) override;
+
+ void LoadConfigFromProto(const NKikimrConsole::TConfig &config);
+ void ProcessEnqueuedEvents(const TActorContext &ctx);
+
+ void ClearState();
+
+ void ForwardToConfigsManager(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx);
+ void ForwardToTenantsManager(TAutoPtr<IEventHandle> &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvGetConfigRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvSetConfigRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvents::TEvPoisonPill::TPtr &ev,
+ const TActorContext &ctx);
+
+ STFUNC(StateInit)
+ {
+ StateInitImpl(ev, ctx);
+ }
+
+ STFUNC(StateWork)
+ {
+ TRACE_EVENT(NKikimrServices::CMS);
+ switch (ev->GetTypeRewrite()) {
FFunc(TEvConsole::EvConfigSubscriptionRequest, ForwardToConfigsManager);
FFunc(TEvConsole::EvConfigSubscriptionCanceled, ForwardToConfigsManager);
- FFunc(TEvConsole::EvAddConfigSubscriptionRequest, ForwardToConfigsManager);
- FFunc(TEvConsole::EvAlterTenantRequest, ForwardToTenantsManager);
- FFunc(TEvConsole::EvCheckConfigUpdatesRequest, ForwardToConfigsManager);
- FFunc(TEvConsole::EvConfigNotificationResponse, ForwardToConfigsManager);
- FFunc(TEvConsole::EvConfigureRequest, ForwardToConfigsManager);
- FFunc(TEvConsole::EvCreateTenantRequest, ForwardToTenantsManager);
- FFunc(TEvConsole::EvDescribeTenantOptionsRequest, ForwardToTenantsManager);
- FFunc(TEvConsole::EvGetConfigItemsRequest, ForwardToConfigsManager);
- HFuncTraced(TEvConsole::TEvGetConfigRequest, Handle);
- FFunc(TEvConsole::EvGetConfigSubscriptionRequest, ForwardToConfigsManager);
- FFunc(TEvConsole::EvGetNodeConfigItemsRequest, ForwardToConfigsManager);
- FFunc(TEvConsole::EvGetNodeConfigRequest, ForwardToConfigsManager);
- FFunc(TEvConsole::EvGetOperationRequest, ForwardToTenantsManager);
- FFunc(TEvConsole::EvGetTenantStatusRequest, ForwardToTenantsManager);
- FFunc(TEvConsole::EvListConfigSubscriptionsRequest, ForwardToConfigsManager);
- FFunc(TEvConsole::EvListConfigValidatorsRequest, ForwardToConfigsManager);
- FFunc(TEvConsole::EvListTenantsRequest, ForwardToTenantsManager);
- FFunc(TEvConsole::EvNotifyOperationCompletionRequest, ForwardToTenantsManager);
- FFunc(TEvConsole::EvRemoveConfigSubscriptionRequest, ForwardToConfigsManager);
- FFunc(TEvConsole::EvRemoveConfigSubscriptionsRequest, ForwardToConfigsManager);
- FFunc(TEvConsole::EvRemoveTenantRequest, ForwardToTenantsManager);
- FFunc(TEvConsole::EvReplaceConfigSubscriptionsRequest, ForwardToConfigsManager);
- HFuncTraced(TEvConsole::TEvSetConfigRequest, Handle);
- FFunc(TEvConsole::EvToggleConfigValidatorRequest, ForwardToConfigsManager);
- HFuncTraced(TEvents::TEvPoisonPill, Handle);
- IgnoreFunc(TEvTabletPipe::TEvServerConnected);
- IgnoreFunc(TEvTabletPipe::TEvServerDisconnected);
-
- default:
- if (!HandleDefaultEvents(ev, ctx)) {
- LOG_CRIT_S(ctx, NKikimrServices::CMS,
- "TConsole::StateWork unexpected event type: " << ev->GetTypeRewrite()
- << " event: " << (ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?"));
- }
- }
- }
-
-public:
+ FFunc(TEvConsole::EvAddConfigSubscriptionRequest, ForwardToConfigsManager);
+ FFunc(TEvConsole::EvAlterTenantRequest, ForwardToTenantsManager);
+ FFunc(TEvConsole::EvCheckConfigUpdatesRequest, ForwardToConfigsManager);
+ FFunc(TEvConsole::EvConfigNotificationResponse, ForwardToConfigsManager);
+ FFunc(TEvConsole::EvConfigureRequest, ForwardToConfigsManager);
+ FFunc(TEvConsole::EvCreateTenantRequest, ForwardToTenantsManager);
+ FFunc(TEvConsole::EvDescribeTenantOptionsRequest, ForwardToTenantsManager);
+ FFunc(TEvConsole::EvGetConfigItemsRequest, ForwardToConfigsManager);
+ HFuncTraced(TEvConsole::TEvGetConfigRequest, Handle);
+ FFunc(TEvConsole::EvGetConfigSubscriptionRequest, ForwardToConfigsManager);
+ FFunc(TEvConsole::EvGetNodeConfigItemsRequest, ForwardToConfigsManager);
+ FFunc(TEvConsole::EvGetNodeConfigRequest, ForwardToConfigsManager);
+ FFunc(TEvConsole::EvGetOperationRequest, ForwardToTenantsManager);
+ FFunc(TEvConsole::EvGetTenantStatusRequest, ForwardToTenantsManager);
+ FFunc(TEvConsole::EvListConfigSubscriptionsRequest, ForwardToConfigsManager);
+ FFunc(TEvConsole::EvListConfigValidatorsRequest, ForwardToConfigsManager);
+ FFunc(TEvConsole::EvListTenantsRequest, ForwardToTenantsManager);
+ FFunc(TEvConsole::EvNotifyOperationCompletionRequest, ForwardToTenantsManager);
+ FFunc(TEvConsole::EvRemoveConfigSubscriptionRequest, ForwardToConfigsManager);
+ FFunc(TEvConsole::EvRemoveConfigSubscriptionsRequest, ForwardToConfigsManager);
+ FFunc(TEvConsole::EvRemoveTenantRequest, ForwardToTenantsManager);
+ FFunc(TEvConsole::EvReplaceConfigSubscriptionsRequest, ForwardToConfigsManager);
+ HFuncTraced(TEvConsole::TEvSetConfigRequest, Handle);
+ FFunc(TEvConsole::EvToggleConfigValidatorRequest, ForwardToConfigsManager);
+ HFuncTraced(TEvents::TEvPoisonPill, Handle);
+ IgnoreFunc(TEvTabletPipe::TEvServerConnected);
+ IgnoreFunc(TEvTabletPipe::TEvServerDisconnected);
+
+ default:
+ if (!HandleDefaultEvents(ev, ctx)) {
+ LOG_CRIT_S(ctx, NKikimrServices::CMS,
+ "TConsole::StateWork unexpected event type: " << ev->GetTypeRewrite()
+ << " event: " << (ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?"));
+ }
+ }
+ }
+
+public:
TConsole(const TActorId &tablet, TTabletStorageInfo *info)
- : TActor(&TThis::StateInit)
- , TTabletExecutedFlat(info, tablet, new NMiniKQL::TMiniKQLFactory)
- , TxProcessor(new TTxProcessor(*this, "console", NKikimrServices::CMS))
- , ConfigsManager(nullptr)
- , TenantsManager(nullptr)
- {
- }
-
- ~TConsole()
- {
- TxProcessor->Clear();
- }
-
+ : TActor(&TThis::StateInit)
+ , TTabletExecutedFlat(info, tablet, new NMiniKQL::TMiniKQLFactory)
+ , TxProcessor(new TTxProcessor(*this, "console", NKikimrServices::CMS))
+ , ConfigsManager(nullptr)
+ , TenantsManager(nullptr)
+ {
+ }
+
+ ~TConsole()
+ {
+ TxProcessor->Clear();
+ }
+
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::CMS_SERVICE;
- }
-
- void Execute(ITransaction *transaction, const TActorContext &ctx) override
- {
- TTabletExecutedFlat::Execute(transaction, ctx);
- }
-
- TTxProcessor::TPtr GetTxProcessor() const
- {
- return TxProcessor;
- }
-
- const NKikimrConsole::TConfig &GetConfig() const
- {
- return Config;
- }
-
-private:
- TDeque<TAutoPtr<IEventHandle>> InitQueue;
- NKikimrConsole::TConfig Config;
- TTxProcessor::TPtr TxProcessor;
- TDynamicCounterPtr Counters;
-
+ }
+
+ void Execute(ITransaction *transaction, const TActorContext &ctx) override
+ {
+ TTabletExecutedFlat::Execute(transaction, ctx);
+ }
+
+ TTxProcessor::TPtr GetTxProcessor() const
+ {
+ return TxProcessor;
+ }
+
+ const NKikimrConsole::TConfig &GetConfig() const
+ {
+ return Config;
+ }
+
+private:
+ TDeque<TAutoPtr<IEventHandle>> InitQueue;
+ NKikimrConsole::TConfig Config;
+ TTxProcessor::TPtr TxProcessor;
+ TDynamicCounterPtr Counters;
+
TConfigsManager* ConfigsManager;
TTenantsManager* TenantsManager;
TActorId NetClassifierUpdaterId;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
+};
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console_tenants_manager.cpp b/ydb/core/cms/console/console_tenants_manager.cpp
index af3cd3f3a5d..0db3f5dceda 100644
--- a/ydb/core/cms/console/console_tenants_manager.cpp
+++ b/ydb/core/cms/console/console_tenants_manager.cpp
@@ -1,14 +1,14 @@
-#include "console_tenants_manager.h"
-#include "console_impl.h"
-#include "http.h"
+#include "console_tenants_manager.h"
+#include "console_impl.h"
+#include "http.h"
#include "util.h"
-
+
#include <ydb/core/base/path.h>
#include <ydb/core/blobstorage/base/blobstorage_events.h>
#include <ydb/core/protos/msgbus.pb.h>
#include <ydb/core/util/pb.h>
#include <ydb/public/lib/operation_id/operation_id.h>
-
+
#if defined BLOG_D || defined BLOG_I || defined BLOG_ERROR || defined BLOG_NOTICE
#error log macro definition clash
#endif
@@ -20,433 +20,433 @@
#define BLOG_CRIT(stream) LOG_CRIT_S(*TlsActivationContext, NKikimrServices::CMS_TENANTS, stream)
-namespace NKikimr {
-namespace NConsole {
-
+namespace NKikimr {
+namespace NConsole {
+
using namespace NOperationId;
-using namespace NTenantSlotBroker;
-
-namespace {
-
-class TPoolManip : public TActorBootstrapped<TPoolManip> {
-public:
- enum EAction {
- ALLOCATE,
- DEALLOCATE
- };
-
-private:
- using TBase = TActorBootstrapped<TPoolManip>;
-
+using namespace NTenantSlotBroker;
+
+namespace {
+
+class TPoolManip : public TActorBootstrapped<TPoolManip> {
+public:
+ enum EAction {
+ ALLOCATE,
+ DEALLOCATE
+ };
+
+private:
+ using TBase = TActorBootstrapped<TPoolManip>;
+
TActorId OwnerId;
- TDomainsInfo::TDomain::TPtr Domain;
- TTenantsManager::TTenant::TPtr Tenant;
- TTenantsManager::TStoragePool::TPtr Pool;
+ TDomainsInfo::TDomain::TPtr Domain;
+ TTenantsManager::TTenant::TPtr Tenant;
+ TTenantsManager::TStoragePool::TPtr Pool;
TActorId BSControllerPipe;
- bool PoolStateAcquired;
- EAction Action;
- ui64 PoolId;
- TString LogPrefix;
-
-public:
+ bool PoolStateAcquired;
+ EAction Action;
+ ui64 PoolId;
+ TString LogPrefix;
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_TENANTS_MANAGER;
- }
-
+ }
+
TPoolManip(TActorId ownerId, TDomainsInfo::TDomain::TPtr domain,
- TTenantsManager::TTenant::TPtr tenant, TTenantsManager::TStoragePool::TPtr pool,
- EAction action)
- : OwnerId(ownerId)
- , Domain(domain)
- , Tenant(tenant)
- , Pool(pool)
- , PoolStateAcquired(false)
- , Action(action)
- , PoolId(0)
- {
+ TTenantsManager::TTenant::TPtr tenant, TTenantsManager::TStoragePool::TPtr pool,
+ EAction action)
+ : OwnerId(ownerId)
+ , Domain(domain)
+ , Tenant(tenant)
+ , Pool(pool)
+ , PoolStateAcquired(false)
+ , Action(action)
+ , PoolId(0)
+ {
LogPrefix = Sprintf("TPoolManip(%s) ", Pool->Config.GetName().data());
- }
-
- void OpenPipe(const TActorContext &ctx)
- {
- NTabletPipe::TClientConfig pipeConfig;
+ }
+
+ void OpenPipe(const TActorContext &ctx)
+ {
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = FastConnectRetryPolicy();
- auto tid = MakeBSControllerID(Domain->DefaultStateStorageGroup);
- auto pipe = NTabletPipe::CreateClient(ctx.SelfID, tid, pipeConfig);
- BSControllerPipe = ctx.ExecutorThread.RegisterActor(pipe);
- }
-
- void OnPipeDestroyed(const TActorContext &ctx)
- {
+ auto tid = MakeBSControllerID(Domain->DefaultStateStorageGroup);
+ auto pipe = NTabletPipe::CreateClient(ctx.SelfID, tid, pipeConfig);
+ BSControllerPipe = ctx.ExecutorThread.RegisterActor(pipe);
+ }
+
+ void OnPipeDestroyed(const TActorContext &ctx)
+ {
BLOG_D(LogPrefix << "pipe destroyed");
-
- if (BSControllerPipe) {
- NTabletPipe::CloseClient(ctx, BSControllerPipe);
+
+ if (BSControllerPipe) {
+ NTabletPipe::CloseClient(ctx, BSControllerPipe);
BSControllerPipe = TActorId();
- }
-
- DoWork(ctx);
- }
-
- void DoWork(const TActorContext &ctx)
- {
- if (!BSControllerPipe)
- OpenPipe(ctx);
-
- if (!PoolStateAcquired)
- ReadPoolState(ctx);
- else if (Action == ALLOCATE)
- AllocatePool(ctx);
- else {
- Y_VERIFY(Action == DEALLOCATE);
- DeletePool(ctx);
- }
- }
-
- void ReadPoolState(const TActorContext &ctx)
- {
+ }
+
+ DoWork(ctx);
+ }
+
+ void DoWork(const TActorContext &ctx)
+ {
+ if (!BSControllerPipe)
+ OpenPipe(ctx);
+
+ if (!PoolStateAcquired)
+ ReadPoolState(ctx);
+ else if (Action == ALLOCATE)
+ AllocatePool(ctx);
+ else {
+ Y_VERIFY(Action == DEALLOCATE);
+ DeletePool(ctx);
+ }
+ }
+
+ void ReadPoolState(const TActorContext &ctx)
+ {
auto request = MakeHolder<TEvBlobStorage::TEvControllerConfigRequest>();
- auto &read = *request->Record.MutableRequest()->AddCommand()->MutableReadStoragePool();
- read.SetBoxId(Pool->Config.GetBoxId());
- read.AddName(Pool->Config.GetName());
-
+ auto &read = *request->Record.MutableRequest()->AddCommand()->MutableReadStoragePool();
+ read.SetBoxId(Pool->Config.GetBoxId());
+ read.AddName(Pool->Config.GetName());
+
BLOG_D(LogPrefix << "read pool state: " << request->Record.ShortDebugString());
-
- NTabletPipe::SendData(ctx, BSControllerPipe, request.Release());
- }
-
- void AllocatePool(const TActorContext &ctx)
- {
+
+ NTabletPipe::SendData(ctx, BSControllerPipe, request.Release());
+ }
+
+ void AllocatePool(const TActorContext &ctx)
+ {
auto request = MakeHolder<TEvBlobStorage::TEvControllerConfigRequest>();
- request->Record.MutableRequest()->AddCommand()->MutableDefineStoragePool()->CopyFrom(Pool->Config);
-
+ request->Record.MutableRequest()->AddCommand()->MutableDefineStoragePool()->CopyFrom(Pool->Config);
+
BLOG_D(LogPrefix << "send pool request: " << request->Record.ShortDebugString());
-
- NTabletPipe::SendData(ctx, BSControllerPipe, request.Release());
- }
-
- void DeletePool(const TActorContext &ctx)
- {
- if (!PoolId) {
+
+ NTabletPipe::SendData(ctx, BSControllerPipe, request.Release());
+ }
+
+ void DeletePool(const TActorContext &ctx)
+ {
+ if (!PoolId) {
BLOG_D(LogPrefix << "cannot delete missing pool " << Pool->Config.GetName());
- ctx.Send(OwnerId, new TTenantsManager::TEvPrivate::TEvPoolDeleted(Tenant, Pool));
- Die(ctx);
- return;
- }
-
+ ctx.Send(OwnerId, new TTenantsManager::TEvPrivate::TEvPoolDeleted(Tenant, Pool));
+ Die(ctx);
+ return;
+ }
+
auto request = MakeHolder<TEvBlobStorage::TEvControllerConfigRequest>();
- auto &del = *request->Record.MutableRequest()->AddCommand()->MutableDeleteStoragePool();
- del.SetBoxId(Pool->Config.GetBoxId());
- del.SetStoragePoolId(PoolId);
- del.SetItemConfigGeneration(Pool->Config.GetItemConfigGeneration());
-
+ auto &del = *request->Record.MutableRequest()->AddCommand()->MutableDeleteStoragePool();
+ del.SetBoxId(Pool->Config.GetBoxId());
+ del.SetStoragePoolId(PoolId);
+ del.SetItemConfigGeneration(Pool->Config.GetItemConfigGeneration());
+
BLOG_D(LogPrefix << "send pool request: " << request->Record.ShortDebugString());
-
- NTabletPipe::SendData(ctx, BSControllerPipe, request.Release());
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
+
+ NTabletPipe::SendData(ctx, BSControllerPipe, request.Release());
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
BLOG_D(LogPrefix << "Bootstrap");
-
- Become(&TThis::StateRead);
-
- DoWork(ctx);
- }
-
- void ReplyAndDie(IEventBase *resp,
- const TActorContext &ctx)
- {
+
+ Become(&TThis::StateRead);
+
+ DoWork(ctx);
+ }
+
+ void ReplyAndDie(IEventBase *resp,
+ const TActorContext &ctx)
+ {
BLOG_D(LogPrefix << "reply with " << resp->ToString());
- ctx.Send(OwnerId, resp);
- Die(ctx);
- }
-
- void Die(const TActorContext &ctx) override
- {
- if (BSControllerPipe)
- NTabletPipe::CloseClient(ctx, BSControllerPipe);
- TBase::Die(ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx)
- {
- TEvTabletPipe::TEvClientConnected *msg = ev->Get();
- if (msg->ClientId == BSControllerPipe && msg->Status != NKikimrProto::OK)
- OnPipeDestroyed(ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx)
- {
- TEvTabletPipe::TEvClientDestroyed *msg = ev->Get();
- if (msg->ClientId == BSControllerPipe)
- OnPipeDestroyed(ctx);
- }
-
- void HandleRead(TEvBlobStorage::TEvControllerConfigResponse::TPtr& ev, const TActorContext& ctx)
- {
- auto &rec = ev->Get()->Record.GetResponse();
-
+ ctx.Send(OwnerId, resp);
+ Die(ctx);
+ }
+
+ void Die(const TActorContext &ctx) override
+ {
+ if (BSControllerPipe)
+ NTabletPipe::CloseClient(ctx, BSControllerPipe);
+ TBase::Die(ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx)
+ {
+ TEvTabletPipe::TEvClientConnected *msg = ev->Get();
+ if (msg->ClientId == BSControllerPipe && msg->Status != NKikimrProto::OK)
+ OnPipeDestroyed(ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx)
+ {
+ TEvTabletPipe::TEvClientDestroyed *msg = ev->Get();
+ if (msg->ClientId == BSControllerPipe)
+ OnPipeDestroyed(ctx);
+ }
+
+ void HandleRead(TEvBlobStorage::TEvControllerConfigResponse::TPtr& ev, const TActorContext& ctx)
+ {
+ auto &rec = ev->Get()->Record.GetResponse();
+
BLOG_D(LogPrefix << "got read response: " << rec.ShortDebugString());
-
+
if (!CheckReadStatus(rec)) {
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, Pool->Issue), ctx);
- return;
- }
-
- PoolStateAcquired = true;
- if (rec.GetStatus(0).StoragePoolSize()) {
- auto &pool = rec.GetStatus(0).GetStoragePool(0);
- auto gen = pool.GetItemConfigGeneration();
- Pool->Config.SetItemConfigGeneration(gen);
- PoolId = pool.GetStoragePoolId();
- } else {
- Pool->Config.SetItemConfigGeneration(0);
- }
-
- if (Action == ALLOCATE)
- Become(&TThis::StateAllocate);
- else {
- Y_VERIFY(Action == DEALLOCATE);
- Become(&TThis::StateDelete);
- }
- DoWork(ctx);
- }
-
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, Pool->Issue), ctx);
+ return;
+ }
+
+ PoolStateAcquired = true;
+ if (rec.GetStatus(0).StoragePoolSize()) {
+ auto &pool = rec.GetStatus(0).GetStoragePool(0);
+ auto gen = pool.GetItemConfigGeneration();
+ Pool->Config.SetItemConfigGeneration(gen);
+ PoolId = pool.GetStoragePoolId();
+ } else {
+ Pool->Config.SetItemConfigGeneration(0);
+ }
+
+ if (Action == ALLOCATE)
+ Become(&TThis::StateAllocate);
+ else {
+ Y_VERIFY(Action == DEALLOCATE);
+ Become(&TThis::StateDelete);
+ }
+ DoWork(ctx);
+ }
+
bool CheckReadStatus(const NKikimrBlobStorage::TConfigResponse &resp)
- {
- if (!resp.GetSuccess() || !resp.GetStatus(0).GetSuccess()) {
- TString error = resp.GetErrorDescription();
- if (resp.StatusSize() && resp.GetStatus(0).GetErrorDescription())
- error = resp.GetStatus(0).GetErrorDescription();
-
+ {
+ if (!resp.GetSuccess() || !resp.GetStatus(0).GetSuccess()) {
+ TString error = resp.GetErrorDescription();
+ if (resp.StatusSize() && resp.GetStatus(0).GetErrorDescription())
+ error = resp.GetStatus(0).GetErrorDescription();
+
BLOG_D(LogPrefix << "cannot read pool '" << Pool->Config.GetName() << "' ("
- << Pool->Config.GetStoragePoolId() << "): " << error);
- Pool->Issue = error;
- return false;
- }
-
- return true;
- }
-
- void HandleAllocate(TEvBlobStorage::TEvControllerConfigResponse::TPtr& ev, const TActorContext& ctx)
- {
- auto &rec = ev->Get()->Record.GetResponse();
-
+ << Pool->Config.GetStoragePoolId() << "): " << error);
+ Pool->Issue = error;
+ return false;
+ }
+
+ return true;
+ }
+
+ void HandleAllocate(TEvBlobStorage::TEvControllerConfigResponse::TPtr& ev, const TActorContext& ctx)
+ {
+ auto &rec = ev->Get()->Record.GetResponse();
+
BLOG_D(LogPrefix << "got config response: " << rec.ShortDebugString());
-
- if (!rec.GetSuccess() || !rec.GetStatus(0).GetSuccess()) {
- TString error = rec.GetErrorDescription();
- if (rec.StatusSize() && rec.GetStatus(0).GetErrorDescription())
- error = rec.GetStatus(0).GetErrorDescription();
-
+
+ if (!rec.GetSuccess() || !rec.GetStatus(0).GetSuccess()) {
+ TString error = rec.GetErrorDescription();
+ if (rec.StatusSize() && rec.GetStatus(0).GetErrorDescription())
+ error = rec.GetStatus(0).GetErrorDescription();
+
BLOG_ERROR(LogPrefix << "cannot create pool '" << Pool->Config.GetName() << "' ("
- << Pool->Config.GetStoragePoolId() << "): " << error);
- Pool->Issue = error;
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, error), ctx);
- return;
- }
-
- // Check state is required to support rolling update.
- // Older versions of BSC might ignore scope ID field
- // and in this case pool cannot be considered as
- // created/updated. Check should be done only if
- // pool has scope id specified.
- if (Pool->Config.HasScopeId()) {
- Become(&TThis::StateCheck);
- ReadPoolState(ctx);
- } else {
- Pool->Issue.clear();
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolAllocated(Tenant, Pool), ctx);
- }
- }
-
- void HandleCheck(TEvBlobStorage::TEvControllerConfigResponse::TPtr& ev, const TActorContext& ctx)
- {
- auto &rec = ev->Get()->Record.GetResponse();
-
+ << Pool->Config.GetStoragePoolId() << "): " << error);
+ Pool->Issue = error;
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, error), ctx);
+ return;
+ }
+
+ // Check state is required to support rolling update.
+ // Older versions of BSC might ignore scope ID field
+ // and in this case pool cannot be considered as
+ // created/updated. Check should be done only if
+ // pool has scope id specified.
+ if (Pool->Config.HasScopeId()) {
+ Become(&TThis::StateCheck);
+ ReadPoolState(ctx);
+ } else {
+ Pool->Issue.clear();
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolAllocated(Tenant, Pool), ctx);
+ }
+ }
+
+ void HandleCheck(TEvBlobStorage::TEvControllerConfigResponse::TPtr& ev, const TActorContext& ctx)
+ {
+ auto &rec = ev->Get()->Record.GetResponse();
+
BLOG_D(LogPrefix << "got check response: " << rec.ShortDebugString());
-
+
if (!CheckReadStatus(rec)) {
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, Pool->Issue), ctx);
- return;
- }
-
- if (rec.GetStatus(0).StoragePoolSize() == 0) {
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, Pool->Issue), ctx);
+ return;
+ }
+
+ if (rec.GetStatus(0).StoragePoolSize() == 0) {
BLOG_ERROR(LogPrefix << "check response misses pool status");
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, Pool->Issue), ctx);
- return;
- }
-
- const auto &scope = rec.GetStatus(0).GetStoragePool(0).GetScopeId();
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, Pool->Issue), ctx);
+ return;
+ }
+
+ const auto &scope = rec.GetStatus(0).GetStoragePool(0).GetScopeId();
if (TTenantsManager::TDomainId(scope.GetX1(), scope.GetX2()) != Tenant->DomainId) {
BLOG_ERROR(LogPrefix << "scope id check failure "
<< Tenant->DomainId
- << " vs " << scope.ShortDebugString());
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, Pool->Issue), ctx);
- return;
- }
-
- Pool->Issue.clear();
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolAllocated(Tenant, Pool), ctx);
- }
-
- void HandleDelete(TEvBlobStorage::TEvControllerConfigResponse::TPtr& ev, const TActorContext& ctx)
- {
- auto &rec = ev->Get()->Record.GetResponse();
-
+ << " vs " << scope.ShortDebugString());
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, Pool->Issue), ctx);
+ return;
+ }
+
+ Pool->Issue.clear();
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvPoolAllocated(Tenant, Pool), ctx);
+ }
+
+ void HandleDelete(TEvBlobStorage::TEvControllerConfigResponse::TPtr& ev, const TActorContext& ctx)
+ {
+ auto &rec = ev->Get()->Record.GetResponse();
+
BLOG_D(LogPrefix << "got config response: " << rec.ShortDebugString());
-
- if (!rec.GetSuccess() || !rec.GetStatus(0).GetSuccess()) {
- TString error = rec.GetErrorDescription();
- if (rec.StatusSize() && rec.GetStatus(0).GetErrorDescription())
- error = rec.GetStatus(0).GetErrorDescription();
-
+
+ if (!rec.GetSuccess() || !rec.GetStatus(0).GetSuccess()) {
+ TString error = rec.GetErrorDescription();
+ if (rec.StatusSize() && rec.GetStatus(0).GetErrorDescription())
+ error = rec.GetStatus(0).GetErrorDescription();
+
BLOG_ERROR(LogPrefix << "cannot delete pool '"
- << Pool->Config.GetName() << "' ("
- << Pool->Config.GetStoragePoolId() << "): " << error);
- Pool->Issue = error;
- ctx.Send(OwnerId, new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, error));
- Die(ctx);
- return;
- }
-
- Pool->Issue.clear();
- ctx.Send(OwnerId, new TTenantsManager::TEvPrivate::TEvPoolDeleted(Tenant, Pool));
- Die(ctx);
- }
-
- STFUNC(StateRead) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvBlobStorage::TEvControllerConfigResponse, HandleRead);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ << Pool->Config.GetName() << "' ("
+ << Pool->Config.GetStoragePoolId() << "): " << error);
+ Pool->Issue = error;
+ ctx.Send(OwnerId, new TTenantsManager::TEvPrivate::TEvPoolFailed(Tenant, Pool, error));
+ Die(ctx);
+ return;
+ }
+
+ Pool->Issue.clear();
+ ctx.Send(OwnerId, new TTenantsManager::TEvPrivate::TEvPoolDeleted(Tenant, Pool));
+ Die(ctx);
+ }
+
+ STFUNC(StateRead) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvBlobStorage::TEvControllerConfigResponse, HandleRead);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
+ break;
+ }
+ }
+
+ STFUNC(StateAllocate) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvBlobStorage::TEvControllerConfigResponse, HandleAllocate);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-
- STFUNC(StateAllocate) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvBlobStorage::TEvControllerConfigResponse, HandleAllocate);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ break;
+ }
+ }
+
+ STFUNC(StateCheck) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvBlobStorage::TEvControllerConfigResponse, HandleCheck);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-
- STFUNC(StateCheck) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvBlobStorage::TEvControllerConfigResponse, HandleCheck);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
- ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-
- STFUNC(StateDelete) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvBlobStorage::TEvControllerConfigResponse, HandleDelete);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ break;
+ }
+ }
+
+ STFUNC(StateDelete) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvBlobStorage::TEvControllerConfigResponse, HandleDelete);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-};
-
-class TSubDomainManip : public TActorBootstrapped<TSubDomainManip> {
-public:
- enum EAction {
- CREATE,
- CONFIGURE,
+ break;
+ }
+ }
+};
+
+class TSubDomainManip : public TActorBootstrapped<TSubDomainManip> {
+public:
+ enum EAction {
+ CREATE,
+ CONFIGURE,
CONFIGURE_ATTR,
- GET_KEY,
- REMOVE
- };
-
-private:
- using TBase = TActorBootstrapped<TSubDomainManip>;
-
+ GET_KEY,
+ REMOVE
+ };
+
+private:
+ using TBase = TActorBootstrapped<TSubDomainManip>;
+
TActorId OwnerId;
- TTenantsManager::TTenant::TPtr Tenant;
+ TTenantsManager::TTenant::TPtr Tenant;
TTenantsManager::TTenant::TPtr SharedTenant;
- EAction Action;
+ EAction Action;
// Pair of <WorkDir, DirToCreate>
- std::pair<TString, TString> Subdomain;
- ui64 TxId;
- ui64 TabletId;
- ui64 Version;
+ std::pair<TString, TString> Subdomain;
+ ui64 TxId;
+ ui64 TabletId;
+ ui64 Version;
TActorId Pipe;
- // For CREATE/GET_KEY action SchemeshardId and PathId will hold subdomain key.
- ui64 SchemeshardId;
- ui64 PathId;
-
- static THashMap<ui64, TString> IssuesMap;
-
-public:
+ // For CREATE/GET_KEY action SchemeshardId and PathId will hold subdomain key.
+ ui64 SchemeshardId;
+ ui64 PathId;
+
+ static THashMap<ui64, TString> IssuesMap;
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_TENANTS_MANAGER;
- }
-
+ }
+
TSubDomainManip(TActorId ownerId, TTenantsManager::TTenant::TPtr tenant, EAction action,
TTenantsManager::TTenant::TPtr sharedTenant = nullptr)
- : OwnerId(ownerId)
- , Tenant(tenant)
+ : OwnerId(ownerId)
+ , Tenant(tenant)
, SharedTenant(sharedTenant)
- , Action(action)
- , TxId(0)
- , TabletId(0)
- , Version(tenant->SubdomainVersion)
- , SchemeshardId(0)
- , PathId(0)
- {
+ , Action(action)
+ , TxId(0)
+ , TabletId(0)
+ , Version(tenant->SubdomainVersion)
+ , SchemeshardId(0)
+ , PathId(0)
+ {
if (Action == CREATE) {
TVector<TString> parts = SplitPath(Tenant->Path);
TString workDir;
TString pathToCreate;
-
+
for (size_t i = 0; i < parts.size(); ++i) {
if (i == 0) {
workDir = "/" + parts[i];
- } else {
+ } else {
if (pathToCreate) {
pathToCreate += "/";
}
pathToCreate += parts[i];
- }
- }
+ }
+ }
Subdomain = std::make_pair(workDir, pathToCreate);
} else {
Subdomain = std::make_pair(ExtractParent(Tenant->Path), ExtractBase(Tenant->Path));
- }
-
- if (IssuesMap.empty()) {
- auto &opts = NKikimrClient::TResponse::descriptor()->FindFieldByNumber(5)->options().
- GetExtension(NKikimrClient::EnumValueHint);
- Y_VERIFY(opts.HintsSize());
- for (auto &rec : opts.GetHints())
- IssuesMap[rec.GetValue()] = TStringBuilder() << rec.GetName() << ": " << rec.GetMan();
- }
- }
-
+ }
+
+ if (IssuesMap.empty()) {
+ auto &opts = NKikimrClient::TResponse::descriptor()->FindFieldByNumber(5)->options().
+ GetExtension(NKikimrClient::EnumValueHint);
+ Y_VERIFY(opts.HintsSize());
+ for (auto &rec : opts.GetHints())
+ IssuesMap[rec.GetValue()] = TStringBuilder() << rec.GetName() << ": " << rec.GetMan();
+ }
+ }
+
void FillSubdomainCreationInfo(NKikimrSubDomains::TSubDomainSettings &subdomain)
{
subdomain.SetName(Subdomain.second);
@@ -469,15 +469,15 @@ public:
}
void FillSubdomainAlterInfo(NKikimrSubDomains::TSubDomainSettings &subdomain,
- bool tablets)
- {
- subdomain.SetName(Subdomain.second);
- if (tablets) {
- subdomain.SetCoordinators(Tenant->Coordinators);
- subdomain.SetMediators(Tenant->Mediators);
- subdomain.SetPlanResolution(Tenant->PlanResolution);
- subdomain.SetTimeCastBucketsPerMediator(Tenant->TimeCastBucketsPerMediator);
- }
+ bool tablets)
+ {
+ subdomain.SetName(Subdomain.second);
+ if (tablets) {
+ subdomain.SetCoordinators(Tenant->Coordinators);
+ subdomain.SetMediators(Tenant->Mediators);
+ subdomain.SetPlanResolution(Tenant->PlanResolution);
+ subdomain.SetTimeCastBucketsPerMediator(Tenant->TimeCastBucketsPerMediator);
+ }
if (Tenant->IsExternalSubdomain) {
subdomain.SetExternalSchemeShard(true);
if (Tenant->IsExternalHive) {
@@ -493,11 +493,11 @@ public:
if (pr.second->State != TTenantsManager::TStoragePool::NOT_ALLOCATED &&
pr.second->AllocatedNumGroups > 0)
{
- auto &pool = *subdomain.AddStoragePools();
- pool.SetName(pr.second->Config.GetName());
- pool.SetKind(pr.second->Kind);
- }
- }
+ auto &pool = *subdomain.AddStoragePools();
+ pool.SetName(pr.second->Config.GetName());
+ pool.SetKind(pr.second->Kind);
+ }
+ }
if (Tenant->SchemaOperationQuotas) {
auto* dstQuotas = subdomain.MutableDeclaredSchemeQuotas();
@@ -511,8 +511,8 @@ public:
if (Tenant->DatabaseQuotas) {
subdomain.MutableDatabaseQuotas()->CopyFrom(*Tenant->DatabaseQuotas);
}
- }
-
+ }
+
void AlterUserAttribute(const TActorContext &ctx) {
BLOG_D("TSubDomainManip(" << Tenant->Path << ") alter user attribute ");
auto request = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
@@ -537,18 +537,18 @@ public:
ctx.Send(MakeTxProxyID(), request.Release());
}
- void AlterSubdomain(const TActorContext &ctx)
- {
+ void AlterSubdomain(const TActorContext &ctx)
+ {
BLOG_D("TSubDomainManip(" << Tenant->Path << ") alter subdomain version " << Version);
-
- auto request = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
+
+ auto request = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
request->Record.SetDatabaseName(TString(ExtractDomain(Subdomain.first)));
- request->Record.SetExecTimeoutPeriod(Max<ui64>());
+ request->Record.SetExecTimeoutPeriod(Max<ui64>());
- if (Tenant->UserToken.GetUserSID())
- request->Record.SetUserToken(Tenant->UserToken.SerializeAsString());
+ if (Tenant->UserToken.GetUserSID())
+ request->Record.SetUserToken(Tenant->UserToken.SerializeAsString());
- auto &tx = *request->Record.MutableTransaction()->MutableModifyScheme();
+ auto &tx = *request->Record.MutableTransaction()->MutableModifyScheme();
tx.SetWorkingDir(Subdomain.first);
FillSubdomainAlterInfo(*tx.MutableSubDomain(), true);
@@ -558,257 +558,257 @@ public:
} else {
tx.SetOperationType(NKikimrSchemeOp::ESchemeOpAlterSubDomain);
}
-
+
BLOG_TRACE("TSubdomainManip(" << Tenant->Path << ") send alter subdomain cmd: "
- << request->ToString());
-
- ctx.Send(MakeTxProxyID(), request.Release());
- }
-
- void CreateSubdomain(const TActorContext &ctx)
- {
+ << request->ToString());
+
+ ctx.Send(MakeTxProxyID(), request.Release());
+ }
+
+ void CreateSubdomain(const TActorContext &ctx)
+ {
BLOG_D("TSubDomainManip(" << Tenant->Path << ") create subdomain");
-
- auto request = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
+
+ auto request = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
request->Record.SetDatabaseName(TString(ExtractDomain(Subdomain.first)));
- request->Record.SetExecTimeoutPeriod(Max<ui64>());
- if (Tenant->UserToken.GetUserSID())
- request->Record.SetUserToken(Tenant->UserToken.SerializeAsString());
- auto &tx = *request->Record.MutableTransaction()->MutableModifyScheme();
+ request->Record.SetExecTimeoutPeriod(Max<ui64>());
+ if (Tenant->UserToken.GetUserSID())
+ request->Record.SetUserToken(Tenant->UserToken.SerializeAsString());
+ auto &tx = *request->Record.MutableTransaction()->MutableModifyScheme();
if (Tenant->IsExternalSubdomain) {
tx.SetOperationType(NKikimrSchemeOp::ESchemeOpCreateExtSubDomain);
} else {
tx.SetOperationType(NKikimrSchemeOp::ESchemeOpCreateSubDomain);
}
- tx.SetWorkingDir(Subdomain.first);
+ tx.SetWorkingDir(Subdomain.first);
FillSubdomainCreationInfo(*tx.MutableSubDomain());
- if (Tenant->Attributes.UserAttributesSize())
- tx.MutableAlterUserAttributes()->CopyFrom(Tenant->Attributes);
-
+ if (Tenant->Attributes.UserAttributesSize())
+ tx.MutableAlterUserAttributes()->CopyFrom(Tenant->Attributes);
+
BLOG_TRACE("TSubdomainManip(" << Tenant->Path << ") send subdomain creation cmd: "
- << request->ToString());
-
- ctx.Send(MakeTxProxyID(), request.Release());
- }
-
- void DropSubdomain(const TActorContext &ctx)
- {
+ << request->ToString());
+
+ ctx.Send(MakeTxProxyID(), request.Release());
+ }
+
+ void DropSubdomain(const TActorContext &ctx)
+ {
BLOG_D("TSubDomainManip(" << Tenant->Path << ") drop subdomain");
-
- auto request = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
+
+ auto request = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
request->Record.SetDatabaseName(TString(ExtractDomain(Subdomain.first)));
- request->Record.SetExecTimeoutPeriod(Max<ui64>());
- if (Tenant->UserToken.GetUserSID())
- request->Record.SetUserToken(Tenant->UserToken.SerializeAsString());
- auto &tx = *request->Record.MutableTransaction()->MutableModifyScheme();
+ request->Record.SetExecTimeoutPeriod(Max<ui64>());
+ if (Tenant->UserToken.GetUserSID())
+ request->Record.SetUserToken(Tenant->UserToken.SerializeAsString());
+ auto &tx = *request->Record.MutableTransaction()->MutableModifyScheme();
if (Tenant->IsExternalSubdomain) {
tx.SetOperationType(NKikimrSchemeOp::ESchemeOpForceDropExtSubDomain);
} else {
tx.SetOperationType(NKikimrSchemeOp::ESchemeOpForceDropSubDomain);
}
- tx.SetWorkingDir(Subdomain.first);
- tx.MutableDrop()->SetName(Subdomain.second);
-
+ tx.SetWorkingDir(Subdomain.first);
+ tx.MutableDrop()->SetName(Subdomain.second);
+
BLOG_TRACE("TSubdomainManip(" << Tenant->Path << ") send subdomain drop cmd: "
- << request->ToString());
-
- ctx.Send(MakeTxProxyID(), request.Release());
- }
-
- void ReadSubdomainKey(const TActorContext &ctx)
- {
- auto *domain = AppData(ctx)->DomainsInfo->GetDomainByName(ExtractDomain(Tenant->Path));
- if (!domain) {
- TString error = "cannot find domain info";
+ << request->ToString());
+
+ ctx.Send(MakeTxProxyID(), request.Release());
+ }
+
+ void ReadSubdomainKey(const TActorContext &ctx)
+ {
+ auto *domain = AppData(ctx)->DomainsInfo->GetDomainByName(ExtractDomain(Tenant->Path));
+ if (!domain) {
+ TString error = "cannot find domain info";
BLOG_CRIT("TSubdomainManip(" << Tenant->Path << ") " << error);
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainFailed(Tenant, error), ctx);
- return;
- }
-
- TabletId = domain->SchemeRoot;
- RequestSubdomainKey(ctx);
- }
-
- void Die(const TActorContext &ctx) override
- {
- if (Pipe)
- NTabletPipe::CloseClient(ctx, Pipe);
- TBase::Die(ctx);
- }
-
- void ActionFinished(const TActorContext &ctx)
- {
- if (Action == CREATE)
- RequestSubdomainKey(ctx);
- else
- ReplyAndDie(ctx);
- }
-
- void ReplyAndDie(const TActorContext &ctx)
- {
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainFailed(Tenant, error), ctx);
+ return;
+ }
+
+ TabletId = domain->SchemeRoot;
+ RequestSubdomainKey(ctx);
+ }
+
+ void Die(const TActorContext &ctx) override
+ {
+ if (Pipe)
+ NTabletPipe::CloseClient(ctx, Pipe);
+ TBase::Die(ctx);
+ }
+
+ void ActionFinished(const TActorContext &ctx)
+ {
+ if (Action == CREATE)
+ RequestSubdomainKey(ctx);
+ else
+ ReplyAndDie(ctx);
+ }
+
+ void ReplyAndDie(const TActorContext &ctx)
+ {
BLOG_D("TSubdomainManip(" << Tenant->Path << ") done");
- if (Action == CREATE)
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainCreated(Tenant, SchemeshardId, PathId), ctx);
+ if (Action == CREATE)
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainCreated(Tenant, SchemeshardId, PathId), ctx);
else if (Action == CONFIGURE || Action == CONFIGURE_ATTR)
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainReady(Tenant, Version), ctx);
- else if (Action == GET_KEY)
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainKey(Tenant, SchemeshardId, PathId), ctx);
- else {
- Y_VERIFY(Action == REMOVE);
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainRemoved(Tenant), ctx);
- }
- }
-
- void ReplyAndDie(IEventBase *resp,
- const TActorContext &ctx)
- {
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainReady(Tenant, Version), ctx);
+ else if (Action == GET_KEY)
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainKey(Tenant, SchemeshardId, PathId), ctx);
+ else {
+ Y_VERIFY(Action == REMOVE);
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainRemoved(Tenant), ctx);
+ }
+ }
+
+ void ReplyAndDie(IEventBase *resp,
+ const TActorContext &ctx)
+ {
BLOG_D("TSubdomainManip(" << Tenant->Path << ") reply with " << resp->ToString());
- ctx.Send(OwnerId, resp);
- Die(ctx);
- }
-
- void OnPipeDestroyed(const TActorContext &ctx)
- {
- if (Pipe) {
- NTabletPipe::CloseClient(ctx, Pipe);
+ ctx.Send(OwnerId, resp);
+ Die(ctx);
+ }
+
+ void OnPipeDestroyed(const TActorContext &ctx)
+ {
+ if (Pipe) {
+ NTabletPipe::CloseClient(ctx, Pipe);
Pipe = TActorId();
- }
-
- SendNotifyRequest(ctx);
- }
-
- void OpenPipe(const TActorContext &ctx)
- {
- Y_VERIFY(TabletId);
- NTabletPipe::TClientConfig pipeConfig;
+ }
+
+ SendNotifyRequest(ctx);
+ }
+
+ void OpenPipe(const TActorContext &ctx)
+ {
+ Y_VERIFY(TabletId);
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = FastConnectRetryPolicy();
- auto pipe = NTabletPipe::CreateClient(ctx.SelfID, TabletId, pipeConfig);
- Pipe = ctx.ExecutorThread.RegisterActor(pipe);
- }
-
- void SendNotifyRequest(const TActorContext &ctx)
- {
- if (!Pipe)
- OpenPipe(ctx);
-
+ auto pipe = NTabletPipe::CreateClient(ctx.SelfID, TabletId, pipeConfig);
+ Pipe = ctx.ExecutorThread.RegisterActor(pipe);
+ }
+
+ void SendNotifyRequest(const TActorContext &ctx)
+ {
+ if (!Pipe)
+ OpenPipe(ctx);
+
auto request = MakeHolder<TEvSchemeShard::TEvNotifyTxCompletion>();
- request->Record.SetTxId(TxId);
-
+ request->Record.SetTxId(TxId);
+
BLOG_TRACE("TSubdomainManip(" << Tenant->Path << ") send notification request: " << request->ToString());
-
- NTabletPipe::SendData(ctx, Pipe, request.Release());
- }
-
- void RequestSubdomainKey(const TActorContext &ctx)
- {
- Y_VERIFY(TabletId);
- if (!Pipe)
- OpenPipe(ctx);
-
+
+ NTabletPipe::SendData(ctx, Pipe, request.Release());
+ }
+
+ void RequestSubdomainKey(const TActorContext &ctx)
+ {
+ Y_VERIFY(TabletId);
+ if (!Pipe)
+ OpenPipe(ctx);
+
auto request = MakeHolder<TEvSchemeShard::TEvDescribeScheme>(Tenant->Path);
- NTabletPipe::SendData(ctx, Pipe, request.Release());
- }
-
- void Bootstrap(const TActorContext &ctx) {
+ NTabletPipe::SendData(ctx, Pipe, request.Release());
+ }
+
+ void Bootstrap(const TActorContext &ctx) {
BLOG_D("TSubdomainManip(" << Tenant->Path << ")::Bootstrap");
-
- if (Action == CREATE) {
+
+ if (Action == CREATE) {
Become(&TThis::StateSubdomain);
CreateSubdomain(ctx);
- } else if (Action == CONFIGURE) {
- Become(&TThis::StateSubdomain);
- AlterSubdomain(ctx);
- } else if (Action == GET_KEY) {
- Become(&TThis::GetSubdomainKey);
- ReadSubdomainKey(ctx);
- } else {
- Y_VERIFY(Action == REMOVE);
- Become(&TThis::StateSubdomain);
+ } else if (Action == CONFIGURE) {
+ Become(&TThis::StateSubdomain);
+ AlterSubdomain(ctx);
+ } else if (Action == GET_KEY) {
+ Become(&TThis::GetSubdomainKey);
+ ReadSubdomainKey(ctx);
+ } else {
+ Y_VERIFY(Action == REMOVE);
+ Become(&TThis::StateSubdomain);
ReadSubdomainKey(ctx);
- }
- }
-
+ }
+ }
+
void Handle(TEvSchemeShard::TEvNotifyTxCompletionRegistered::TPtr &ev, const TActorContext&) {
BLOG_D("TSubdomainManip(" << Tenant->Path << ") got TEvNotifyTxCompletionRegistered: "
- << ev->Get()->Record.ShortDebugString());
- }
-
+ << ev->Get()->Record.ShortDebugString());
+ }
+
void Handle(TEvSchemeShard::TEvNotifyTxCompletionResult::TPtr &ev, const TActorContext& ctx) {
BLOG_D("TSubdomainManip(" << Tenant->Path << ") got TEvNotifyTxCompletionResult: "
- << ev->Get()->Record.ShortDebugString());
-
+ << ev->Get()->Record.ShortDebugString());
+
if (Action == CONFIGURE && Tenant->Attributes.UserAttributesSize()) {
AlterUserAttribute(ctx);
Action = CONFIGURE_ATTR;
} else {
ActionFinished(ctx);
}
- }
-
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev, const TActorContext& ctx) {
- if (ev->Get()->Status != NKikimrProto::OK) {
- OnPipeDestroyed(ctx);
- }
- }
-
- void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr& /*ev*/, const TActorContext& ctx) {
- OnPipeDestroyed(ctx);
- }
-
- void HandleSubdomain(TEvTxUserProxy::TEvProposeTransactionStatus::TPtr& ev, const TActorContext& ctx)
- {
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev, const TActorContext& ctx) {
+ if (ev->Get()->Status != NKikimrProto::OK) {
+ OnPipeDestroyed(ctx);
+ }
+ }
+
+ void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr& /*ev*/, const TActorContext& ctx) {
+ OnPipeDestroyed(ctx);
+ }
+
+ void HandleSubdomain(TEvTxUserProxy::TEvProposeTransactionStatus::TPtr& ev, const TActorContext& ctx)
+ {
BLOG_D("TSubdomainManip(" << Tenant->Path << ") got propose result: "
- << ev->Get()->Record.ShortDebugString());
-
- auto &rec = ev->Get()->Record;
- switch (rec.GetStatus()) {
- case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecComplete:
- TabletId = rec.GetSchemeShardTabletId();
+ << ev->Get()->Record.ShortDebugString());
+
+ auto &rec = ev->Get()->Record;
+ switch (rec.GetStatus()) {
+ case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecComplete:
+ TabletId = rec.GetSchemeShardTabletId();
if (Action == CONFIGURE && Tenant->Attributes.UserAttributesSize()) {
AlterUserAttribute(ctx);
Action = CONFIGURE_ATTR;
} else {
ActionFinished(ctx);
}
- break;
- case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecInProgress:
- TxId = rec.GetTxId();
- TabletId = rec.GetSchemeShardTabletId();
- SendNotifyRequest(ctx);
- break;
- case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::AccessDenied:
- {
- auto issue = BuildErrorMsg(rec);
- ctx.Send(OwnerId, new TTenantsManager::TEvPrivate::TEvSubdomainFailed
- (Tenant, issue, Ydb::StatusIds::UNAUTHORIZED));
- break;
- }
- case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecError:
- if (Action == REMOVE) {
- // Check if removal finished or in-progress.
+ break;
+ case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecInProgress:
+ TxId = rec.GetTxId();
+ TabletId = rec.GetSchemeShardTabletId();
+ SendNotifyRequest(ctx);
+ break;
+ case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::AccessDenied:
+ {
+ auto issue = BuildErrorMsg(rec);
+ ctx.Send(OwnerId, new TTenantsManager::TEvPrivate::TEvSubdomainFailed
+ (Tenant, issue, Ydb::StatusIds::UNAUTHORIZED));
+ break;
+ }
+ case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecError:
+ if (Action == REMOVE) {
+ // Check if removal finished or in-progress.
if (rec.GetSchemeShardStatus() == NKikimrScheme::StatusPathDoesNotExist
|| rec.GetSchemeShardStatus() == NKikimrScheme::StatusMultipleModifications) {
BLOG_D("TSubdomainManip(" << Tenant->Path << ") consider dubdomain is removed");
- ActionFinished(ctx);
- break;
- }
- }
+ ActionFinished(ctx);
+ break;
+ }
+ }
[[fallthrough]];
- default:
- {
- auto issue = BuildErrorMsg(rec);
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainFailed(Tenant, issue), ctx);
- }
- }
- }
-
+ default:
+ {
+ auto issue = BuildErrorMsg(rec);
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainFailed(Tenant, issue), ctx);
+ }
+ }
+ }
+
void Handle(TEvSchemeShard::TEvDescribeSchemeResult::TPtr ev, const TActorContext &ctx)
- {
- const auto &rec = ev->Get()->GetRecord();
-
+ {
+ const auto &rec = ev->Get()->GetRecord();
+
BLOG_D("TSubdomainManip(" << Tenant->Path << ") got describe result: "
- << rec.ShortDebugString());
-
+ << rec.ShortDebugString());
+
if (Action == REMOVE) {
switch (rec.GetStatus()) {
case NKikimrScheme::EStatus::StatusPathDoesNotExist:
@@ -827,560 +827,560 @@ public:
if (rec.GetStatus() != NKikimrScheme::EStatus::StatusSuccess) {
BLOG_ERROR("TSubdomainManip(" << Tenant->Path << ") "
- << "Receive TEvDescribeSchemeResult with bad status "
+ << "Receive TEvDescribeSchemeResult with bad status "
<< NKikimrScheme::EStatus_Name(rec.GetStatus()) <<
- " reason is <" << rec.GetReason() << ">" <<
- " while resolving subdomain " << Tenant->Path);
-
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainFailed(Tenant, rec.GetReason()), ctx);
- return;
- }
-
- auto pathType = rec.GetPathDescription().GetSelf().GetPathType();
+ " reason is <" << rec.GetReason() << ">" <<
+ " while resolving subdomain " << Tenant->Path);
+
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainFailed(Tenant, rec.GetReason()), ctx);
+ return;
+ }
+
+ auto pathType = rec.GetPathDescription().GetSelf().GetPathType();
auto expectedPathType = Tenant->IsExternalSubdomain ? NKikimrSchemeOp::EPathTypeExtSubDomain : NKikimrSchemeOp::EPathTypeSubDomain;
if (pathType != expectedPathType) {
BLOG_ERROR("TSubdomainManip(" << Tenant->Path << ") "
- << "Resolve subdomain fail, tenant path "
- << Tenant->Path << " has invalid path type "
+ << "Resolve subdomain fail, tenant path "
+ << Tenant->Path << " has invalid path type "
<< NKikimrSchemeOp::EPathType_Name(pathType)
<< " but expected " << NKikimrSchemeOp::EPathType_Name(expectedPathType));
- ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainFailed(Tenant, "bad path type"), ctx);
- return;
- }
-
- const auto &key = rec.GetPathDescription().GetDomainDescription().GetDomainKey();
- SchemeshardId = key.GetSchemeShard();
- PathId = key.GetPathId();
-
- ReplyAndDie(ctx);
- }
-
- TString BuildErrorMsg(const NKikimrTxUserProxy::TEvProposeTransactionStatus &rec) const
- {
- if (rec.GetSchemeShardReason())
- return rec.GetSchemeShardReason();
- if (IssuesMap.contains(rec.GetStatus()))
- return IssuesMap.at(rec.GetStatus());
- return TString();
- }
-
- STFUNC(StateSubdomain) {
- switch (ev->GetTypeRewrite()) {
+ ReplyAndDie(new TTenantsManager::TEvPrivate::TEvSubdomainFailed(Tenant, "bad path type"), ctx);
+ return;
+ }
+
+ const auto &key = rec.GetPathDescription().GetDomainDescription().GetDomainKey();
+ SchemeshardId = key.GetSchemeShard();
+ PathId = key.GetPathId();
+
+ ReplyAndDie(ctx);
+ }
+
+ TString BuildErrorMsg(const NKikimrTxUserProxy::TEvProposeTransactionStatus &rec) const
+ {
+ if (rec.GetSchemeShardReason())
+ return rec.GetSchemeShardReason();
+ if (IssuesMap.contains(rec.GetStatus()))
+ return IssuesMap.at(rec.GetStatus());
+ return TString();
+ }
+
+ STFUNC(StateSubdomain) {
+ switch (ev->GetTypeRewrite()) {
HFunc(TEvSchemeShard::TEvDescribeSchemeResult, Handle);
HFunc(TEvSchemeShard::TEvNotifyTxCompletionRegistered, Handle);
HFunc(TEvSchemeShard::TEvNotifyTxCompletionResult, Handle);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
- HFunc(TEvTxUserProxy::TEvProposeTransactionStatus, HandleSubdomain);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
+ HFunc(TEvTxUserProxy::TEvProposeTransactionStatus, HandleSubdomain);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-
- STFUNC(GetSubdomainKey) {
- switch (ev->GetTypeRewrite()) {
+ break;
+ }
+ }
+
+ STFUNC(GetSubdomainKey) {
+ switch (ev->GetTypeRewrite()) {
HFunc(TEvSchemeShard::TEvDescribeSchemeResult, Handle);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
- ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-};
-
-THashMap<ui64, TString> TSubDomainManip::IssuesMap;
-
-} // anonymous namespace
-
-const std::array<TString, TTenantsManager::COUNTER_COUNT> TTenantsManager::TCounters::SensorNames = {{
- { "Tenants" },
- { "CreateDatabaseRequests" },
- { "AlterDatabaseRequests" },
- { "RemoveDatabaseRequests" },
- { "GetDatabaseStatusRequests" },
- { "ListDatabasesRequests" },
- { "DescribeDatabaseOptionsRequests" },
- { "GetOperationRequests" },
- { "AllocPoolFailed" },
- { "RemovePoolFailed" },
- { "ConfigureSubdomainFailed" },
- { "RemoveSubdomainFailed" },
- { "ComputationalUnitsQuotaExceeded" },
- { "ComputationalUnitsLoadQuotaExceeded" },
- { "TenantsQuotaExceeded" },
- { "RequestedStorageUnits" },
- { "AllocatedStorageUnits" },
- { "RegisteredUnits" },
- { "ComputationalUnits" },
- { "CreateDatabaseResponses" },
- { "AlterDatabaseResponses" },
- { "RemoveDatabaseResponses" },
- { "GetDatabaseStatusResponses" },
- { "GetOperationResponses" },
- }};
-
-const THashSet<TTenantsManager::ECounter> TTenantsManager::TCounters::DerivSensors = {{
- COUNTER_CREATE_REQUESTS,
- COUNTER_ALTER_REQUESTS,
- COUNTER_REMOVE_REQUESTS,
- COUNTER_STATUS_REQUESTS,
- COUNTER_LIST_REQUESTS,
- COUNTER_DESCRIBE_REQUESTS,
- COUNTER_GET_OPERATION_REQUESTS,
- COUNTER_CREATE_RESPONSES,
- COUNTER_ALTER_RESPONSES,
- COUNTER_REMOVE_RESPONSES,
- COUNTER_STATUS_RESPONSES,
- COUNTER_GET_OPERATION_RESPONSES,
- COUNTER_ALLOC_POOL_FAILED,
- COUNTER_REMOVE_POOL_FAILED,
- COUNTER_CONFIGURE_SUBDOMAIN_FAILED,
- COUNTER_REMOVE_SUBDOMAIN_FAILED,
- COUNTER_COMPUTATIONAL_QUOTA_EXCEEDED,
- COUNTER_COMPUTATIONAL_LOAD_QUOTA_EXCEEDED,
- COUNTER_TENANTS_QUOTA_EXCEEDED,
- }};
-
-void TTenantsManager::TCounters::AddUnits(const TUnitsCount &units)
-{
- for (auto &pr : units) {
- Inc(pr.first.first, pr.first.second,
- COUNTER_COMPUTATIONAL_UNITS, pr.second);
- }
-}
-
-void TTenantsManager::TCounters::RemoveUnits(const TUnitsCount &units)
-{
- for (auto &pr : units) {
- Dec(pr.first.first, pr.first.second,
- COUNTER_COMPUTATIONAL_UNITS, pr.second);
- }
-}
-
-void TTenantsManager::TSlotStats::Clear()
-{
- SlotsByType.clear();
- Total = TSlotCounters();
-}
-
-void TTenantsManager::TSlotStats::AllocateSlots(const TSlotsCount &slots)
-{
- for (auto &pr : slots) {
- auto &type = pr.first.SlotType;
-
- if (type)
- SlotsByType[type].Allocated += pr.second;
-
- Total.Allocated += pr.second;
- }
-}
-
-void TTenantsManager::TSlotStats::DeallocateSlots(const TSlotsCount &slots)
-{
- for (auto &pr : slots) {
- auto &type = pr.first.SlotType;
-
- if (type)
- SlotsByType[type].Allocated -= pr.second;
-
- Total.Allocated -= pr.second;
- }
-}
-
-void TTenantsManager::TSlotStats::UpdateStats(const NKikimrTenantSlotBroker::TSlotStats &stats)
-{
- for (auto &pr : SlotsByType) {
- pr.second.Connected = 0;
- pr.second.Free = 0;
- }
- Total.Connected = 0;
- Total.Free = 0;
-
- for (auto &counters : stats.GetSlotCounters()) {
- auto &type = counters.GetType();
- ui64 connected = counters.GetConnected();
- ui64 free = counters.GetFree();
-
- if (type) {
- SlotsByType[type].Connected += connected;
- SlotsByType[type].Free += free;
- }
-
- Total.Connected += connected;
- Total.Free += free;
- }
-}
-
-TTenantsManager::TTenantsConfig::TTenantsConfig()
- : DefaultStorageUnitsQuota(0)
- , DefaultComputationalUnitsQuota(0)
- , TotalComputationalUnitsQuota(0)
- , TotalComputationalUnitsLoadQuota(0)
- , TenantsQuota(0)
-{
-}
-
-void TTenantsManager::TTenantsConfig::Clear()
-{
- DefaultStorageUnitsQuota = 0;
- DefaultComputationalUnitsQuota = 0;
- AvailabilityZones.clear();
- TenantSlotKinds.clear();
- TotalComputationalUnitsQuota = 0;
- TotalComputationalUnitsLoadQuota = 0;
- TenantsQuota = 0;
-}
-
-void TTenantsManager::TTenantsConfig::Parse(const NKikimrConsole::TTenantsConfig &config)
-{
- TString error;
- bool res = Parse(config, error);
- Y_VERIFY(res);
-}
-
-bool TTenantsManager::TTenantsConfig::Parse(const NKikimrConsole::TTenantsConfig &config, TString &error)
-{
- Clear();
-
- DefaultStorageUnitsQuota = config.GetDefaultStorageUnitsQuota();
- DefaultComputationalUnitsQuota = config.GetDefaultComputationalUnitsQuota();
-
- for (auto &kind : config.GetAvailabilityZoneKinds()) {
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
+ break;
+ }
+ }
+};
+
+THashMap<ui64, TString> TSubDomainManip::IssuesMap;
+
+} // anonymous namespace
+
+const std::array<TString, TTenantsManager::COUNTER_COUNT> TTenantsManager::TCounters::SensorNames = {{
+ { "Tenants" },
+ { "CreateDatabaseRequests" },
+ { "AlterDatabaseRequests" },
+ { "RemoveDatabaseRequests" },
+ { "GetDatabaseStatusRequests" },
+ { "ListDatabasesRequests" },
+ { "DescribeDatabaseOptionsRequests" },
+ { "GetOperationRequests" },
+ { "AllocPoolFailed" },
+ { "RemovePoolFailed" },
+ { "ConfigureSubdomainFailed" },
+ { "RemoveSubdomainFailed" },
+ { "ComputationalUnitsQuotaExceeded" },
+ { "ComputationalUnitsLoadQuotaExceeded" },
+ { "TenantsQuotaExceeded" },
+ { "RequestedStorageUnits" },
+ { "AllocatedStorageUnits" },
+ { "RegisteredUnits" },
+ { "ComputationalUnits" },
+ { "CreateDatabaseResponses" },
+ { "AlterDatabaseResponses" },
+ { "RemoveDatabaseResponses" },
+ { "GetDatabaseStatusResponses" },
+ { "GetOperationResponses" },
+ }};
+
+const THashSet<TTenantsManager::ECounter> TTenantsManager::TCounters::DerivSensors = {{
+ COUNTER_CREATE_REQUESTS,
+ COUNTER_ALTER_REQUESTS,
+ COUNTER_REMOVE_REQUESTS,
+ COUNTER_STATUS_REQUESTS,
+ COUNTER_LIST_REQUESTS,
+ COUNTER_DESCRIBE_REQUESTS,
+ COUNTER_GET_OPERATION_REQUESTS,
+ COUNTER_CREATE_RESPONSES,
+ COUNTER_ALTER_RESPONSES,
+ COUNTER_REMOVE_RESPONSES,
+ COUNTER_STATUS_RESPONSES,
+ COUNTER_GET_OPERATION_RESPONSES,
+ COUNTER_ALLOC_POOL_FAILED,
+ COUNTER_REMOVE_POOL_FAILED,
+ COUNTER_CONFIGURE_SUBDOMAIN_FAILED,
+ COUNTER_REMOVE_SUBDOMAIN_FAILED,
+ COUNTER_COMPUTATIONAL_QUOTA_EXCEEDED,
+ COUNTER_COMPUTATIONAL_LOAD_QUOTA_EXCEEDED,
+ COUNTER_TENANTS_QUOTA_EXCEEDED,
+ }};
+
+void TTenantsManager::TCounters::AddUnits(const TUnitsCount &units)
+{
+ for (auto &pr : units) {
+ Inc(pr.first.first, pr.first.second,
+ COUNTER_COMPUTATIONAL_UNITS, pr.second);
+ }
+}
+
+void TTenantsManager::TCounters::RemoveUnits(const TUnitsCount &units)
+{
+ for (auto &pr : units) {
+ Dec(pr.first.first, pr.first.second,
+ COUNTER_COMPUTATIONAL_UNITS, pr.second);
+ }
+}
+
+void TTenantsManager::TSlotStats::Clear()
+{
+ SlotsByType.clear();
+ Total = TSlotCounters();
+}
+
+void TTenantsManager::TSlotStats::AllocateSlots(const TSlotsCount &slots)
+{
+ for (auto &pr : slots) {
+ auto &type = pr.first.SlotType;
+
+ if (type)
+ SlotsByType[type].Allocated += pr.second;
+
+ Total.Allocated += pr.second;
+ }
+}
+
+void TTenantsManager::TSlotStats::DeallocateSlots(const TSlotsCount &slots)
+{
+ for (auto &pr : slots) {
+ auto &type = pr.first.SlotType;
+
+ if (type)
+ SlotsByType[type].Allocated -= pr.second;
+
+ Total.Allocated -= pr.second;
+ }
+}
+
+void TTenantsManager::TSlotStats::UpdateStats(const NKikimrTenantSlotBroker::TSlotStats &stats)
+{
+ for (auto &pr : SlotsByType) {
+ pr.second.Connected = 0;
+ pr.second.Free = 0;
+ }
+ Total.Connected = 0;
+ Total.Free = 0;
+
+ for (auto &counters : stats.GetSlotCounters()) {
+ auto &type = counters.GetType();
+ ui64 connected = counters.GetConnected();
+ ui64 free = counters.GetFree();
+
+ if (type) {
+ SlotsByType[type].Connected += connected;
+ SlotsByType[type].Free += free;
+ }
+
+ Total.Connected += connected;
+ Total.Free += free;
+ }
+}
+
+TTenantsManager::TTenantsConfig::TTenantsConfig()
+ : DefaultStorageUnitsQuota(0)
+ , DefaultComputationalUnitsQuota(0)
+ , TotalComputationalUnitsQuota(0)
+ , TotalComputationalUnitsLoadQuota(0)
+ , TenantsQuota(0)
+{
+}
+
+void TTenantsManager::TTenantsConfig::Clear()
+{
+ DefaultStorageUnitsQuota = 0;
+ DefaultComputationalUnitsQuota = 0;
+ AvailabilityZones.clear();
+ TenantSlotKinds.clear();
+ TotalComputationalUnitsQuota = 0;
+ TotalComputationalUnitsLoadQuota = 0;
+ TenantsQuota = 0;
+}
+
+void TTenantsManager::TTenantsConfig::Parse(const NKikimrConsole::TTenantsConfig &config)
+{
+ TString error;
+ bool res = Parse(config, error);
+ Y_VERIFY(res);
+}
+
+bool TTenantsManager::TTenantsConfig::Parse(const NKikimrConsole::TTenantsConfig &config, TString &error)
+{
+ Clear();
+
+ DefaultStorageUnitsQuota = config.GetDefaultStorageUnitsQuota();
+ DefaultComputationalUnitsQuota = config.GetDefaultComputationalUnitsQuota();
+
+ for (auto &kind : config.GetAvailabilityZoneKinds()) {
if (AvailabilityZones.contains(kind.GetKind())) {
error = Sprintf("double definition of zone kind '%s'", kind.GetKind().data());
- return false;
- }
-
- switch (kind.GetZoneCase()) {
- case NKikimrConsole::TAvailabilityZoneKind::kDataCenterName:
- {
- TAvailabilityZone zone(kind.GetKind(), kind.GetDataCenterName());
- AvailabilityZones[kind.GetKind()] = zone;
- break;
- }
- case NKikimrConsole::TAvailabilityZoneKind::kSlotLocation:
- {
- auto &loc = kind.GetSlotLocation();
- TAvailabilityZone zone(kind.GetKind(), loc.GetDataCenter(),
- loc.GetForceLocation(), loc.GetCollocationGroup(),
- loc.GetForceCollocation());
- AvailabilityZones[kind.GetKind()] = zone;
- break;
- }
- case NKikimrConsole::TAvailabilityZoneKind::ZONE_NOT_SET:
- {
+ return false;
+ }
+
+ switch (kind.GetZoneCase()) {
+ case NKikimrConsole::TAvailabilityZoneKind::kDataCenterName:
+ {
+ TAvailabilityZone zone(kind.GetKind(), kind.GetDataCenterName());
+ AvailabilityZones[kind.GetKind()] = zone;
+ break;
+ }
+ case NKikimrConsole::TAvailabilityZoneKind::kSlotLocation:
+ {
+ auto &loc = kind.GetSlotLocation();
+ TAvailabilityZone zone(kind.GetKind(), loc.GetDataCenter(),
+ loc.GetForceLocation(), loc.GetCollocationGroup(),
+ loc.GetForceCollocation());
+ AvailabilityZones[kind.GetKind()] = zone;
+ break;
+ }
+ case NKikimrConsole::TAvailabilityZoneKind::ZONE_NOT_SET:
+ {
TAvailabilityZone zone(kind.GetKind(), ANY_DATA_CENTER);
- AvailabilityZones[kind.GetKind()] = zone;
- break;
- }
- default:
+ AvailabilityZones[kind.GetKind()] = zone;
+ break;
+ }
+ default:
error = Sprintf("unexpected zone case for zone '%s'", kind.GetKind().data());
- return false;
- }
- }
-
- THashMap<TString, TSet<TString>> zoneSets;
- for (auto &set : config.GetAvailabilityZoneSets()) {
+ return false;
+ }
+ }
+
+ THashMap<TString, TSet<TString>> zoneSets;
+ for (auto &set : config.GetAvailabilityZoneSets()) {
if (zoneSets.contains(set.GetName())) {
error = Sprintf("double definition of zone set '%s'", set.GetName().data());
- return false;
- }
-
- for (auto &kind : set.GetZoneKinds()) {
+ return false;
+ }
+
+ for (auto &kind : set.GetZoneKinds()) {
if (!AvailabilityZones.contains(kind)) {
error = Sprintf("uknown zone kind '%s' in zone set '%s'", kind.data(), set.GetName().data());
- return false;
- }
-
- zoneSets[set.GetName()].insert(kind);
- }
- }
-
- for (auto &kind : config.GetComputationalUnitKinds()) {
- switch (kind.GetResourceCase()) {
- case NKikimrConsole::TComputationalUnitKind::kTenantSlotType:
- {
+ return false;
+ }
+
+ zoneSets[set.GetName()].insert(kind);
+ }
+ }
+
+ for (auto &kind : config.GetComputationalUnitKinds()) {
+ switch (kind.GetResourceCase()) {
+ case NKikimrConsole::TComputationalUnitKind::kTenantSlotType:
+ {
if (TenantSlotKinds.contains(kind.GetKind())) {
error = Sprintf("double definition of computational unit kind '%s'", kind.GetKind().data());
- return false;
- }
-
- auto &slotKind = TenantSlotKinds[kind.GetKind()];
- slotKind.Kind = kind.GetKind();
- slotKind.TenantSlotType = kind.GetTenantSlotType();
-
+ return false;
+ }
+
+ auto &slotKind = TenantSlotKinds[kind.GetKind()];
+ slotKind.Kind = kind.GetKind();
+ slotKind.TenantSlotType = kind.GetTenantSlotType();
+
if(!zoneSets.contains(kind.GetAvailabilityZoneSet())) {
- error = Sprintf("unknown zone set '%s' is referred from computational unit kind '%s'",
+ error = Sprintf("unknown zone set '%s' is referred from computational unit kind '%s'",
kind.GetAvailabilityZoneSet().data(), kind.GetKind().data());
- return false;
- }
-
- slotKind.AllowedZones = zoneSets[kind.GetAvailabilityZoneSet()];
- }
- break;
- default:
+ return false;
+ }
+
+ slotKind.AllowedZones = zoneSets[kind.GetAvailabilityZoneSet()];
+ }
+ break;
+ default:
error = Sprintf("unexpected resource case for computational unit kind '%s'", kind.GetKind().data());
- return false;
- }
- }
-
- TotalComputationalUnitsQuota = config.GetClusterQuota().GetComputationalUnitsQuota();
- TotalComputationalUnitsLoadQuota = config.GetClusterQuota().GetComputationalUnitsLoadQuota();
- TenantsQuota = config.GetClusterQuota().GetTenantsQuota();
-
- return true;
-}
-
-TSlotDescription TTenantsManager::TTenantsConfig::GetSlotKey(const TString &kind,
- const TString &zone) const
-{
- auto zoneKind = zone ? AvailabilityZones.at(zone) : TAvailabilityZone();
- auto &slotKind = TenantSlotKinds.at(kind);
- return TSlotDescription(slotKind.TenantSlotType,
- zoneKind.DataCenter,
- zoneKind.ForceLocation,
- zoneKind.CollocationGroup,
- zoneKind.ForceCollocation);
-}
-
-TSlotDescription TTenantsManager::TTenantsConfig::GetSlotKey(const std::pair<TString, TString> &unit) const
-{
- return GetSlotKey(unit.first, unit.second);
-}
-
-void TTenantsManager::TTenantsConfig::ParseComputationalUnits(const TUnitsCount &units,
- TSlotsCount &slots) const
-{
- for (auto &pr : units) {
- auto key = GetSlotKey(pr.first);
- slots[key] += pr.second;
- }
-}
-
-TTenantsManager::TTenant::TTenant(const TString &path,
- EState state,
- const TString &token)
- : Path(path)
- , State(state)
- , Coordinators(3)
- , Mediators(3)
- , PlanResolution(10)
- , TimeCastBucketsPerMediator(2)
- , SlotsAllocationConfirmed(false)
- , StorageUnitsQuota(0)
- , ComputationalUnitsQuota(0)
- , ErrorCode(Ydb::StatusIds::STATUS_CODE_UNSPECIFIED)
- , TxId(0)
- , UserToken(token)
- , SubdomainVersion(1)
- , ConfirmedSubdomain(0)
- , Generation(0)
+ return false;
+ }
+ }
+
+ TotalComputationalUnitsQuota = config.GetClusterQuota().GetComputationalUnitsQuota();
+ TotalComputationalUnitsLoadQuota = config.GetClusterQuota().GetComputationalUnitsLoadQuota();
+ TenantsQuota = config.GetClusterQuota().GetTenantsQuota();
+
+ return true;
+}
+
+TSlotDescription TTenantsManager::TTenantsConfig::GetSlotKey(const TString &kind,
+ const TString &zone) const
+{
+ auto zoneKind = zone ? AvailabilityZones.at(zone) : TAvailabilityZone();
+ auto &slotKind = TenantSlotKinds.at(kind);
+ return TSlotDescription(slotKind.TenantSlotType,
+ zoneKind.DataCenter,
+ zoneKind.ForceLocation,
+ zoneKind.CollocationGroup,
+ zoneKind.ForceCollocation);
+}
+
+TSlotDescription TTenantsManager::TTenantsConfig::GetSlotKey(const std::pair<TString, TString> &unit) const
+{
+ return GetSlotKey(unit.first, unit.second);
+}
+
+void TTenantsManager::TTenantsConfig::ParseComputationalUnits(const TUnitsCount &units,
+ TSlotsCount &slots) const
+{
+ for (auto &pr : units) {
+ auto key = GetSlotKey(pr.first);
+ slots[key] += pr.second;
+ }
+}
+
+TTenantsManager::TTenant::TTenant(const TString &path,
+ EState state,
+ const TString &token)
+ : Path(path)
+ , State(state)
+ , Coordinators(3)
+ , Mediators(3)
+ , PlanResolution(10)
+ , TimeCastBucketsPerMediator(2)
+ , SlotsAllocationConfirmed(false)
+ , StorageUnitsQuota(0)
+ , ComputationalUnitsQuota(0)
+ , ErrorCode(Ydb::StatusIds::STATUS_CODE_UNSPECIFIED)
+ , TxId(0)
+ , UserToken(token)
+ , SubdomainVersion(1)
+ , ConfirmedSubdomain(0)
+ , Generation(0)
, IsExternalSubdomain(false)
, IsExternalHive(false)
, IsExternalSysViewProcessor(false)
, AreResourcesShared(false)
-{
-}
-
-bool TTenantsManager::TTenant::IsConfiguringState(EState state)
-{
- return state == CONFIGURING_SUBDOMAIN;
-}
-
-bool TTenantsManager::TTenant::IsCreatingState(EState state)
-{
- return state == CREATING_POOLS || state == CREATING_SUBDOMAIN;
-}
-
-bool TTenantsManager::TTenant::IsRemovingState(EState state)
-{
- return state == REMOVING_UNITS || state == REMOVING_POOLS || state == REMOVING_SUBDOMAIN;
-}
-
-bool TTenantsManager::TTenant::IsRunningState(EState state)
-{
- return state == RUNNING;
-}
-
-bool TTenantsManager::TTenant::IsConfiguring() const
-{
- return IsConfiguringState(State);
-}
-
-bool TTenantsManager::TTenant::IsCreating() const
-{
- return IsCreatingState(State);
-}
-
-bool TTenantsManager::TTenant::IsRemoving() const
-{
- return IsRemovingState(State);
-}
-
-bool TTenantsManager::TTenant::IsRunning() const
-{
- return IsRunningState(State);
-}
-
-bool TTenantsManager::TTenant::HasPoolsToCreate() const
-{
- for (auto &pr : StoragePools)
- if (pr.second->State != TStoragePool::ALLOCATED)
- return true;
- return false;
-}
-
-bool TTenantsManager::TTenant::HasPoolsToDelete() const
-{
- for (auto &pr : StoragePools)
- if (pr.second->State != TStoragePool::DELETED)
- return true;
- return false;
-}
-
-bool TTenantsManager::TTenant::HasSubDomainKey() const
-{
+{
+}
+
+bool TTenantsManager::TTenant::IsConfiguringState(EState state)
+{
+ return state == CONFIGURING_SUBDOMAIN;
+}
+
+bool TTenantsManager::TTenant::IsCreatingState(EState state)
+{
+ return state == CREATING_POOLS || state == CREATING_SUBDOMAIN;
+}
+
+bool TTenantsManager::TTenant::IsRemovingState(EState state)
+{
+ return state == REMOVING_UNITS || state == REMOVING_POOLS || state == REMOVING_SUBDOMAIN;
+}
+
+bool TTenantsManager::TTenant::IsRunningState(EState state)
+{
+ return state == RUNNING;
+}
+
+bool TTenantsManager::TTenant::IsConfiguring() const
+{
+ return IsConfiguringState(State);
+}
+
+bool TTenantsManager::TTenant::IsCreating() const
+{
+ return IsCreatingState(State);
+}
+
+bool TTenantsManager::TTenant::IsRemoving() const
+{
+ return IsRemovingState(State);
+}
+
+bool TTenantsManager::TTenant::IsRunning() const
+{
+ return IsRunningState(State);
+}
+
+bool TTenantsManager::TTenant::HasPoolsToCreate() const
+{
+ for (auto &pr : StoragePools)
+ if (pr.second->State != TStoragePool::ALLOCATED)
+ return true;
+ return false;
+}
+
+bool TTenantsManager::TTenant::HasPoolsToDelete() const
+{
+ for (auto &pr : StoragePools)
+ if (pr.second->State != TStoragePool::DELETED)
+ return true;
+ return false;
+}
+
+bool TTenantsManager::TTenant::HasSubDomainKey() const
+{
return bool(DomainId);
-}
-
-TString TTenantsManager::TTenant::MakeStoragePoolName(const TString &poolTypeName)
-{
+}
+
+TString TTenantsManager::TTenant::MakeStoragePoolName(const TString &poolTypeName)
+{
return Sprintf("%s:%s", Path.data(), poolTypeName.data());
-}
-
-bool TTenantsManager::TTenant::CheckComputationalUnitsQuota(const TUnitsCount &units,
- Ydb::StatusIds::StatusCode &code,
- TString &error)
-{
- if (ComputationalUnitsQuota) {
- ui64 total = 0;
- for (auto &pr : units)
- total += pr.second;
- if (total > ComputationalUnitsQuota) {
+}
+
+bool TTenantsManager::TTenant::CheckComputationalUnitsQuota(const TUnitsCount &units,
+ Ydb::StatusIds::StatusCode &code,
+ TString &error)
+{
+ if (ComputationalUnitsQuota) {
+ ui64 total = 0;
+ for (auto &pr : units)
+ total += pr.second;
+ if (total > ComputationalUnitsQuota) {
code = Ydb::StatusIds::BAD_REQUEST;
- error = Sprintf("Total count of computational units %" PRIu64 " exceeds quota %" PRIu64,
- total, ComputationalUnitsQuota);
- return false;
- }
- }
-
- return true;
-}
-
+ error = Sprintf("Total count of computational units %" PRIu64 " exceeds quota %" PRIu64,
+ total, ComputationalUnitsQuota);
+ return false;
+ }
+ }
+
+ return true;
+}
+
bool TTenantsManager::TTenant::CheckStorageUnitsQuota(Ydb::StatusIds::StatusCode &code, TString &error,
- ui64 additionalUnits)
-{
- if (StorageUnitsQuota) {
- ui64 total = additionalUnits;
- for (auto &pr : StoragePools)
- total += pr.second->Config.GetNumGroups();
- if (total > StorageUnitsQuota) {
+ ui64 additionalUnits)
+{
+ if (StorageUnitsQuota) {
+ ui64 total = additionalUnits;
+ for (auto &pr : StoragePools)
+ total += pr.second->Config.GetNumGroups();
+ if (total > StorageUnitsQuota) {
code = Ydb::StatusIds::BAD_REQUEST;
- error = Sprintf("Total count of storage units %" PRIu64 " exceeds quota %" PRIu64,
- total, StorageUnitsQuota);
- return false;
- }
- }
-
- return true;
-}
-
+ error = Sprintf("Total count of storage units %" PRIu64 " exceeds quota %" PRIu64,
+ total, StorageUnitsQuota);
+ return false;
+ }
+ }
+
+ return true;
+}
+
bool TTenantsManager::TTenant::CheckQuota(Ydb::StatusIds::StatusCode &code, TString &error)
-{
- return (CheckStorageUnitsQuota(code, error)
- && CheckComputationalUnitsQuota(ComputationalUnits, code, error));
-}
-
-void TTenantsManager::TTenant::ParseComputationalUnits(const TTenantsConfig &config)
-{
- Slots.clear();
- SlotsAllocationConfirmed = false;
-
- config.ParseComputationalUnits(ComputationalUnits, Slots);
-}
-
-void TTenantsManager::TTenant::RemoveComputationalUnits()
-{
- ComputationalUnits.clear();
- RegisteredComputationalUnits.clear();
-
- Slots.clear();
- SlotsAllocationConfirmed = false;
-}
-
-void TTenantsManager::ClearState()
-{
- Tenants.clear();
+{
+ return (CheckStorageUnitsQuota(code, error)
+ && CheckComputationalUnitsQuota(ComputationalUnits, code, error));
+}
+
+void TTenantsManager::TTenant::ParseComputationalUnits(const TTenantsConfig &config)
+{
+ Slots.clear();
+ SlotsAllocationConfirmed = false;
+
+ config.ParseComputationalUnits(ComputationalUnits, Slots);
+}
+
+void TTenantsManager::TTenant::RemoveComputationalUnits()
+{
+ ComputationalUnits.clear();
+ RegisteredComputationalUnits.clear();
+
+ Slots.clear();
+ SlotsAllocationConfirmed = false;
+}
+
+void TTenantsManager::ClearState()
+{
+ Tenants.clear();
TenantIdToName.clear();
- RemovedTenants.clear();
- SlotStats.Clear();
-}
-
-void TTenantsManager::Bootstrap(const TActorContext &ctx)
-{
+ RemovedTenants.clear();
+ SlotStats.Clear();
+}
+
+void TTenantsManager::Bootstrap(const TActorContext &ctx)
+{
BLOG_D("TTenantsManager::Bootstrap");
- Become(&TThis::StateWork);
- TxProcessor = Self.GetTxProcessor()->GetSubProcessor("tenants",
- ctx,
- false,
- NKikimrServices::CMS_TENANTS);
-}
-
-void TTenantsManager::Detach()
-{
- PassAway();
-}
-
-void TTenantsManager::SetConfig(const NKikimrConsole::TTenantsConfig &config)
-{
- Config.Parse(config);
-}
-
-TTenantsManager::TTenant::TPtr TTenantsManager::FindZoneKindUsage(const TString &kind)
-{
- for (auto &pr1 : Tenants) {
- for (auto &pr2 : pr1.second->ComputationalUnits) {
- if (pr2.first.second == kind)
- return pr1.second;
- }
- }
- return nullptr;
-}
-
-TTenantsManager::TTenant::TPtr TTenantsManager::FindComputationalUnitKindUsage(const TString &kind)
-{
- for (auto &pr1 : Tenants) {
- for (auto &pr2 : pr1.second->ComputationalUnits) {
- if (pr2.first.first == kind)
- return pr1.second;
- }
- }
- return nullptr;
-}
-
-TTenantsManager::TTenant::TPtr TTenantsManager::FindComputationalUnitKindUsage(const TString &kind,
- const TString &zone)
-{
- for (auto &pr : Tenants)
+ Become(&TThis::StateWork);
+ TxProcessor = Self.GetTxProcessor()->GetSubProcessor("tenants",
+ ctx,
+ false,
+ NKikimrServices::CMS_TENANTS);
+}
+
+void TTenantsManager::Detach()
+{
+ PassAway();
+}
+
+void TTenantsManager::SetConfig(const NKikimrConsole::TTenantsConfig &config)
+{
+ Config.Parse(config);
+}
+
+TTenantsManager::TTenant::TPtr TTenantsManager::FindZoneKindUsage(const TString &kind)
+{
+ for (auto &pr1 : Tenants) {
+ for (auto &pr2 : pr1.second->ComputationalUnits) {
+ if (pr2.first.second == kind)
+ return pr1.second;
+ }
+ }
+ return nullptr;
+}
+
+TTenantsManager::TTenant::TPtr TTenantsManager::FindComputationalUnitKindUsage(const TString &kind)
+{
+ for (auto &pr1 : Tenants) {
+ for (auto &pr2 : pr1.second->ComputationalUnits) {
+ if (pr2.first.first == kind)
+ return pr1.second;
+ }
+ }
+ return nullptr;
+}
+
+TTenantsManager::TTenant::TPtr TTenantsManager::FindComputationalUnitKindUsage(const TString &kind,
+ const TString &zone)
+{
+ for (auto &pr : Tenants)
if (pr.second->ComputationalUnits.contains(std::make_pair(kind, zone)))
- return pr.second;
- return nullptr;
-}
-
-TTenantsManager::TTenant::TPtr TTenantsManager::GetTenant(const TString &name)
-{
- auto it = Tenants.find(name);
- if (it != Tenants.end())
- return it->second;
- return nullptr;
-}
-
+ return pr.second;
+ return nullptr;
+}
+
+TTenantsManager::TTenant::TPtr TTenantsManager::GetTenant(const TString &name)
+{
+ auto it = Tenants.find(name);
+ if (it != Tenants.end())
+ return it->second;
+ return nullptr;
+}
+
TTenantsManager::TTenant::TPtr TTenantsManager::GetTenant(const TDomainId &domainId)
{
auto it = TenantIdToName.find(domainId);
@@ -1389,309 +1389,309 @@ TTenantsManager::TTenant::TPtr TTenantsManager::GetTenant(const TDomainId &domai
return nullptr;
}
-void TTenantsManager::AddTenant(TTenant::TPtr tenant)
-{
+void TTenantsManager::AddTenant(TTenant::TPtr tenant)
+{
Y_VERIFY(!Tenants.contains(tenant->Path));
- Tenants[tenant->Path] = tenant;
+ Tenants[tenant->Path] = tenant;
if (tenant->DomainId) {
Y_VERIFY(!TenantIdToName.contains(tenant->DomainId));
TenantIdToName[tenant->DomainId] = tenant->Path;
}
- SlotStats.AllocateSlots(tenant->Slots);
-
- Counters.Set(COUNTER_TENANTS, Tenants.size());
- Counters.AddUnits(tenant->ComputationalUnits);
- for (auto &pr : tenant->RegisteredComputationalUnits)
- Counters.Inc(pr.second.Kind, COUNTER_REGISTERED_UNITS);
- for (auto &pr : tenant->StoragePools) {
- Counters.Inc(pr.second->Kind, COUNTER_REQUESTED_STORAGE_UNITS, pr.second->GetGroups());
- Counters.Inc(pr.second->Kind, COUNTER_ALLOCATED_STORAGE_UNITS, pr.second->AllocatedNumGroups);
- }
-}
-
-void TTenantsManager::RemoveTenant(TTenant::TPtr tenant)
-{
- Tenants.erase(tenant->Path);
+ SlotStats.AllocateSlots(tenant->Slots);
+
+ Counters.Set(COUNTER_TENANTS, Tenants.size());
+ Counters.AddUnits(tenant->ComputationalUnits);
+ for (auto &pr : tenant->RegisteredComputationalUnits)
+ Counters.Inc(pr.second.Kind, COUNTER_REGISTERED_UNITS);
+ for (auto &pr : tenant->StoragePools) {
+ Counters.Inc(pr.second->Kind, COUNTER_REQUESTED_STORAGE_UNITS, pr.second->GetGroups());
+ Counters.Inc(pr.second->Kind, COUNTER_ALLOCATED_STORAGE_UNITS, pr.second->AllocatedNumGroups);
+ }
+}
+
+void TTenantsManager::RemoveTenant(TTenant::TPtr tenant)
+{
+ Tenants.erase(tenant->Path);
TenantIdToName.erase(tenant->DomainId);
- SlotStats.DeallocateSlots(tenant->Slots);
-
+ SlotStats.DeallocateSlots(tenant->Slots);
+
if (tenant->SharedDomainId) {
auto sharedTenant = GetTenant(tenant->SharedDomainId);
Y_VERIFY(sharedTenant);
sharedTenant->HostedTenants.erase(tenant);
}
- Counters.Set(COUNTER_TENANTS, Tenants.size());
- Counters.RemoveUnits(tenant->ComputationalUnits);
- for (auto &pr : tenant->RegisteredComputationalUnits)
- Counters.Dec(pr.second.Kind, COUNTER_REGISTERED_UNITS);
- for (auto &pr : tenant->StoragePools) {
- Counters.Dec(pr.second->Kind, COUNTER_REQUESTED_STORAGE_UNITS, pr.second->GetGroups());
- Counters.Dec(pr.second->Kind, COUNTER_ALLOCATED_STORAGE_UNITS, pr.second->AllocatedNumGroups);
- }
-
- TRemovedTenant removed;
- removed.Path = tenant->Path;
- removed.TxId = tenant->TxId;
- removed.ErrorCode = tenant->ErrorCode;
+ Counters.Set(COUNTER_TENANTS, Tenants.size());
+ Counters.RemoveUnits(tenant->ComputationalUnits);
+ for (auto &pr : tenant->RegisteredComputationalUnits)
+ Counters.Dec(pr.second.Kind, COUNTER_REGISTERED_UNITS);
+ for (auto &pr : tenant->StoragePools) {
+ Counters.Dec(pr.second->Kind, COUNTER_REQUESTED_STORAGE_UNITS, pr.second->GetGroups());
+ Counters.Dec(pr.second->Kind, COUNTER_ALLOCATED_STORAGE_UNITS, pr.second->AllocatedNumGroups);
+ }
+
+ TRemovedTenant removed;
+ removed.Path = tenant->Path;
+ removed.TxId = tenant->TxId;
+ removed.ErrorCode = tenant->ErrorCode;
removed.CreateIdempotencyKey = tenant->CreateIdempotencyKey;
- removed.Issue = tenant->Issue;
- removed.Code = Ydb::StatusIds::SUCCESS;
- RemovedTenants[tenant->Path] = removed;
-}
-
-void TTenantsManager::RemoveTenantFailed(TTenant::TPtr tenant,
- Ydb::StatusIds::StatusCode code)
-{
- TRemovedTenant removed;
- removed.Path = tenant->Path;
- removed.ErrorCode = tenant->ErrorCode;
+ removed.Issue = tenant->Issue;
+ removed.Code = Ydb::StatusIds::SUCCESS;
+ RemovedTenants[tenant->Path] = removed;
+}
+
+void TTenantsManager::RemoveTenantFailed(TTenant::TPtr tenant,
+ Ydb::StatusIds::StatusCode code)
+{
+ TRemovedTenant removed;
+ removed.Path = tenant->Path;
+ removed.ErrorCode = tenant->ErrorCode;
removed.CreateIdempotencyKey = tenant->CreateIdempotencyKey;
- removed.TxId = tenant->TxId;
- removed.Issue = tenant->Issue;
- removed.Code = code;
- RemovedTenants[tenant->Path] = removed;
-
- tenant->TxId = 0;
-}
-
-void TTenantsManager::ChangeTenantState(TTenant::TPtr tenant,
- TTenant::EState state,
- const TActorContext &ctx)
-{
- if (TTenant::IsCreatingState(tenant->State)
- && !TTenant::IsCreatingState(state)) {
- auto code = TTenant::IsRemovingState(state)
- ? (tenant->ErrorCode ? tenant->ErrorCode : Ydb::StatusIds::GENERIC_ERROR)
- : Ydb::StatusIds::SUCCESS;
- SendTenantNotifications(tenant, TTenant::CREATE, code, ctx);
- }
-
- tenant->State = state;
-}
-
-bool TTenantsManager::CheckTenantSlots(TTenant::TPtr tenant, const NKikimrTenantSlotBroker::TTenantState &state)
-{
- for (auto &slot : state.GetRequiredSlots()) {
- TSlotDescription key(slot);
- auto count = slot.GetCount();
+ removed.TxId = tenant->TxId;
+ removed.Issue = tenant->Issue;
+ removed.Code = code;
+ RemovedTenants[tenant->Path] = removed;
+
+ tenant->TxId = 0;
+}
+
+void TTenantsManager::ChangeTenantState(TTenant::TPtr tenant,
+ TTenant::EState state,
+ const TActorContext &ctx)
+{
+ if (TTenant::IsCreatingState(tenant->State)
+ && !TTenant::IsCreatingState(state)) {
+ auto code = TTenant::IsRemovingState(state)
+ ? (tenant->ErrorCode ? tenant->ErrorCode : Ydb::StatusIds::GENERIC_ERROR)
+ : Ydb::StatusIds::SUCCESS;
+ SendTenantNotifications(tenant, TTenant::CREATE, code, ctx);
+ }
+
+ tenant->State = state;
+}
+
+bool TTenantsManager::CheckTenantSlots(TTenant::TPtr tenant, const NKikimrTenantSlotBroker::TTenantState &state)
+{
+ for (auto &slot : state.GetRequiredSlots()) {
+ TSlotDescription key(slot);
+ auto count = slot.GetCount();
if (!tenant->Slots.contains(key) || tenant->Slots.at(key) != count)
- return false;
- }
-
- return state.RequiredSlotsSize() == tenant->Slots.size();
-}
-
+ return false;
+ }
+
+ return state.RequiredSlotsSize() == tenant->Slots.size();
+}
+
bool TTenantsManager::MakeBasicPoolCheck(const TString &kind, ui64 size, Ydb::StatusIds::StatusCode &code, TString &error)
-{
- if (!size) {
+{
+ if (!size) {
code = Ydb::StatusIds::BAD_REQUEST;
- error = "Zero count for storage units is not allowed";
- return false;
- }
-
+ error = "Zero count for storage units is not allowed";
+ return false;
+ }
+
if (!Domain->StoragePoolTypes.contains(kind)) {
code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("Unsupported storage unit kind '%s'.", kind.data());
- return false;
- }
-
- return true;
-}
-
-bool TTenantsManager::MakeBasicComputationalUnitCheck(const TString &kind, const TString &zone,
+ return false;
+ }
+
+ return true;
+}
+
+bool TTenantsManager::MakeBasicComputationalUnitCheck(const TString &kind, const TString &zone,
Ydb::StatusIds::StatusCode &code,
- TString &error)
-{
+ TString &error)
+{
if (!Config.TenantSlotKinds.contains(kind)) {
code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("Unknown computational unit kind '%s'", kind.data());
- return false;
- }
-
- if (zone) {
+ return false;
+ }
+
+ if (zone) {
if (!Config.AvailabilityZones.contains(zone)) {
code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("Unknown availability zone '%s'", zone.data());
- return false;
- }
-
- auto &slotKind = Config.TenantSlotKinds.at(kind);
+ return false;
+ }
+
+ auto &slotKind = Config.TenantSlotKinds.at(kind);
if (!slotKind.AllowedZones.contains(zone)) {
code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("Zone '%s' is unavailable for units of kind '%s'", zone.data(), kind.data());
- return false;
- }
- }
-
- return true;
-}
-
-bool TTenantsManager::CheckComputationalUnitsQuota(const TUnitsCount &units,
- TTenant::TPtr tenant,
- Ydb::StatusIds::StatusCode &code,
- TString &error)
-{
- if (!Config.TotalComputationalUnitsQuota
- && !Config.TotalComputationalUnitsLoadQuota)
- return true;
-
- TSlotStats stats = SlotStats;
- if (tenant)
- stats.DeallocateSlots(tenant->Slots);
-
- TSlotsCount slots;
- Config.ParseComputationalUnits(units, slots);
- stats.AllocateSlots(slots);
-
- if (Config.TotalComputationalUnitsQuota
- && Config.TotalComputationalUnitsQuota < stats.Total.Allocated) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool TTenantsManager::CheckComputationalUnitsQuota(const TUnitsCount &units,
+ TTenant::TPtr tenant,
+ Ydb::StatusIds::StatusCode &code,
+ TString &error)
+{
+ if (!Config.TotalComputationalUnitsQuota
+ && !Config.TotalComputationalUnitsLoadQuota)
+ return true;
+
+ TSlotStats stats = SlotStats;
+ if (tenant)
+ stats.DeallocateSlots(tenant->Slots);
+
+ TSlotsCount slots;
+ Config.ParseComputationalUnits(units, slots);
+ stats.AllocateSlots(slots);
+
+ if (Config.TotalComputationalUnitsQuota
+ && Config.TotalComputationalUnitsQuota < stats.Total.Allocated) {
BLOG_NOTICE("Cluster computational units quota is exceeded ("
- << stats.Total.Allocated << "/"
- << Config.TotalComputationalUnitsQuota << ")");
- Counters.Inc(COUNTER_COMPUTATIONAL_QUOTA_EXCEEDED);
- code = Ydb::StatusIds::UNAVAILABLE;
- error = "Cluster computational units quota is exceeded";
- return false;
- }
-
- if (Config.TotalComputationalUnitsLoadQuota) {
- for (auto &pr : stats.SlotsByType) {
- ui64 cur = pr.second.Allocated * 100;
- ui64 quota = pr.second.Connected * Config.TotalComputationalUnitsLoadQuota;
- if (cur > quota) {
+ << stats.Total.Allocated << "/"
+ << Config.TotalComputationalUnitsQuota << ")");
+ Counters.Inc(COUNTER_COMPUTATIONAL_QUOTA_EXCEEDED);
+ code = Ydb::StatusIds::UNAVAILABLE;
+ error = "Cluster computational units quota is exceeded";
+ return false;
+ }
+
+ if (Config.TotalComputationalUnitsLoadQuota) {
+ for (auto &pr : stats.SlotsByType) {
+ ui64 cur = pr.second.Allocated * 100;
+ ui64 quota = pr.second.Connected * Config.TotalComputationalUnitsLoadQuota;
+ if (cur > quota) {
BLOG_NOTICE("Cluster computational units load quota ("
- << Config.TotalComputationalUnitsLoadQuota
- << "%) is exceeded for slots '"
- << pr.first << "' (" << pr.second.Allocated
- << "/" << pr.second.Connected << ")");
- Counters.Inc(COUNTER_COMPUTATIONAL_LOAD_QUOTA_EXCEEDED);
- code = Ydb::StatusIds::UNAVAILABLE;
- error = "Cluster computational units load quota is exceeded";
- return false;
- }
- }
-
- ui64 cur = stats.Total.Allocated * 100;
- ui64 quota = stats.Total.Connected * Config.TotalComputationalUnitsLoadQuota;
- if (cur > quota) {
+ << Config.TotalComputationalUnitsLoadQuota
+ << "%) is exceeded for slots '"
+ << pr.first << "' (" << pr.second.Allocated
+ << "/" << pr.second.Connected << ")");
+ Counters.Inc(COUNTER_COMPUTATIONAL_LOAD_QUOTA_EXCEEDED);
+ code = Ydb::StatusIds::UNAVAILABLE;
+ error = "Cluster computational units load quota is exceeded";
+ return false;
+ }
+ }
+
+ ui64 cur = stats.Total.Allocated * 100;
+ ui64 quota = stats.Total.Connected * Config.TotalComputationalUnitsLoadQuota;
+ if (cur > quota) {
BLOG_NOTICE("Cluster computational units load quota ("
- << Config.TotalComputationalUnitsLoadQuota
- << "%) is exceeded (" << stats.Total.Allocated
- << "/" << stats.Total.Connected << ")");
- Counters.Inc(COUNTER_COMPUTATIONAL_LOAD_QUOTA_EXCEEDED);
- code = Ydb::StatusIds::UNAVAILABLE;
- error = "Cluster computational units load quota is exceeded";
- return false;
- }
- }
-
- return true;
-}
-
-bool TTenantsManager::CheckComputationalUnitsQuota(const TUnitsCount &units,
- Ydb::StatusIds::StatusCode &code,
- TString &error)
-{
- return CheckComputationalUnitsQuota(units, nullptr, code, error);
-}
-
-bool TTenantsManager::CheckTenantsConfig(const NKikimrConsole::TTenantsConfig &config,
+ << Config.TotalComputationalUnitsLoadQuota
+ << "%) is exceeded (" << stats.Total.Allocated
+ << "/" << stats.Total.Connected << ")");
+ Counters.Inc(COUNTER_COMPUTATIONAL_LOAD_QUOTA_EXCEEDED);
+ code = Ydb::StatusIds::UNAVAILABLE;
+ error = "Cluster computational units load quota is exceeded";
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool TTenantsManager::CheckComputationalUnitsQuota(const TUnitsCount &units,
+ Ydb::StatusIds::StatusCode &code,
+ TString &error)
+{
+ return CheckComputationalUnitsQuota(units, nullptr, code, error);
+}
+
+bool TTenantsManager::CheckTenantsConfig(const NKikimrConsole::TTenantsConfig &config,
Ydb::StatusIds::StatusCode &code,
- TString &error)
-{
- TTenantsConfig newConfig;
-
- // Check config is consistent.
- if (!newConfig.Parse(config, error)) {
+ TString &error)
+{
+ TTenantsConfig newConfig;
+
+ // Check config is consistent.
+ if (!newConfig.Parse(config, error)) {
code = Ydb::StatusIds::BAD_REQUEST;
- return false;
- }
-
- // Check used availability zones are not modified.
- for (auto &pr : Config.AvailabilityZones) {
- auto it = newConfig.AvailabilityZones.find(pr.first);
- if (it == newConfig.AvailabilityZones.end() || it->second != pr.second) {
- auto tenant = FindZoneKindUsage(pr.first);
- if (tenant) {
+ return false;
+ }
+
+ // Check used availability zones are not modified.
+ for (auto &pr : Config.AvailabilityZones) {
+ auto it = newConfig.AvailabilityZones.find(pr.first);
+ if (it == newConfig.AvailabilityZones.end() || it->second != pr.second) {
+ auto tenant = FindZoneKindUsage(pr.first);
+ if (tenant) {
code = Ydb::StatusIds::BAD_REQUEST;
- error = Sprintf("cannot remove or modify availability zone '%s' used by tenant '%s'",
+ error = Sprintf("cannot remove or modify availability zone '%s' used by tenant '%s'",
pr.first.data(), tenant->Path.data());
- return false;
- }
- }
- }
-
- // Check used computational unit kinds are not modified.
- for (auto &pr : Config.TenantSlotKinds) {
- auto it = newConfig.TenantSlotKinds.find(pr.first);
-
- // Check if unit kind can be removed.
- if (it == newConfig.TenantSlotKinds.end()) {
- auto tenant = FindComputationalUnitKindUsage(pr.first);
- if (tenant) {
+ return false;
+ }
+ }
+ }
+
+ // Check used computational unit kinds are not modified.
+ for (auto &pr : Config.TenantSlotKinds) {
+ auto it = newConfig.TenantSlotKinds.find(pr.first);
+
+ // Check if unit kind can be removed.
+ if (it == newConfig.TenantSlotKinds.end()) {
+ auto tenant = FindComputationalUnitKindUsage(pr.first);
+ if (tenant) {
code = Ydb::StatusIds::BAD_REQUEST;
- error = Sprintf("cannot remove computational unit kind '%s' used by tenant '%s'",
+ error = Sprintf("cannot remove computational unit kind '%s' used by tenant '%s'",
pr.first.data(), tenant->Path.data());
- return false;
- }
- continue;
- }
-
- // Check if tenant slot type modification for unit is OK.
- if (it->second.TenantSlotType != pr.second.TenantSlotType) {
- auto tenant = FindComputationalUnitKindUsage(pr.first);
- if (tenant) {
- code = Ydb::StatusIds::BAD_REQUEST;
- error = Sprintf("cannot modify computational unit kind '%s' used by tenant '%s'",
+ return false;
+ }
+ continue;
+ }
+
+ // Check if tenant slot type modification for unit is OK.
+ if (it->second.TenantSlotType != pr.second.TenantSlotType) {
+ auto tenant = FindComputationalUnitKindUsage(pr.first);
+ if (tenant) {
+ code = Ydb::StatusIds::BAD_REQUEST;
+ error = Sprintf("cannot modify computational unit kind '%s' used by tenant '%s'",
pr.first.data(), tenant->Path.data());
- return false;
- }
- }
-
- // Check is some used zone within the unit kind is missing now.
- if (it->second.AllowedZones != pr.second.AllowedZones) {
- for (auto &zone : pr.second.AllowedZones) {
+ return false;
+ }
+ }
+
+ // Check is some used zone within the unit kind is missing now.
+ if (it->second.AllowedZones != pr.second.AllowedZones) {
+ for (auto &zone : pr.second.AllowedZones) {
if (!it->second.AllowedZones.contains(zone)) {
- auto tenant = FindComputationalUnitKindUsage(pr.first, zone);
- if (tenant) {
+ auto tenant = FindComputationalUnitKindUsage(pr.first, zone);
+ if (tenant) {
code = Ydb::StatusIds::BAD_REQUEST;
- error = Sprintf("cannot remove allowed availability zone '%s' from computational"
- " unit kind '%s' used by tenant '%s'",
+ error = Sprintf("cannot remove allowed availability zone '%s' from computational"
+ " unit kind '%s' used by tenant '%s'",
zone.data(), pr.first.data(), tenant->Path.data());
- return false;
- }
- }
- }
- }
- }
-
- return true;
-}
-
-bool TTenantsManager::CheckAccess(const TString &token,
- Ydb::StatusIds::StatusCode &code,
- TString &error,
- const TActorContext &ctx)
-{
- auto *appData = AppData(ctx);
- if (appData->AdministrationAllowedSIDs.empty())
- return true;
-
- if (token) {
- NACLib::TUserToken userToken(token);
- for (auto &sid : appData->AdministrationAllowedSIDs)
- if (userToken.IsExist(sid))
- return true;
- }
-
- code = Ydb::StatusIds::UNAUTHORIZED;
- error = "You don't have permission for this operation."
- " Contact service admin for database administration operations.";
-
- return false;
-}
-
+ return false;
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+bool TTenantsManager::CheckAccess(const TString &token,
+ Ydb::StatusIds::StatusCode &code,
+ TString &error,
+ const TActorContext &ctx)
+{
+ auto *appData = AppData(ctx);
+ if (appData->AdministrationAllowedSIDs.empty())
+ return true;
+
+ if (token) {
+ NACLib::TUserToken userToken(token);
+ for (auto &sid : appData->AdministrationAllowedSIDs)
+ if (userToken.IsExist(sid))
+ return true;
+ }
+
+ code = Ydb::StatusIds::UNAUTHORIZED;
+ error = "You don't have permission for this operation."
+ " Contact service admin for database administration operations.";
+
+ return false;
+}
+
Ydb::TOperationId TTenantsManager::MakeOperationId(const TString &path, ui64 txId, TTenant::EAction action)
{
Ydb::TOperationId id;
@@ -1704,197 +1704,197 @@ Ydb::TOperationId TTenantsManager::MakeOperationId(const TString &path, ui64 txI
}
Ydb::TOperationId TTenantsManager::MakeOperationId(TTenant::TPtr tenant, TTenant::EAction action)
-{
+{
Ydb::TOperationId id;
id.SetKind(Ydb::TOperationId::CMS_REQUEST);
- AddOptionalValue(id, "tenant", tenant->Path);
- AddOptionalValue(id, "cmstid", ToString(Self.TabletID()));
- AddOptionalValue(id, "txid", ToString(tenant->TxId));
- AddOptionalValue(id, "action", ToString((ui32)action));
- return id;
-}
-
-TTenantsManager::TStoragePool::TPtr TTenantsManager::MakeStoragePool(TTenant::TPtr tenant, const TString &kind, ui64 size)
-{
- auto poolName = tenant->MakeStoragePoolName(kind);
- auto &config = Domain->StoragePoolTypes.at(kind);
-
- TStoragePool::TPtr pool = new TStoragePool(poolName, kind, size, config);
- if (tenant->HasSubDomainKey())
+ AddOptionalValue(id, "tenant", tenant->Path);
+ AddOptionalValue(id, "cmstid", ToString(Self.TabletID()));
+ AddOptionalValue(id, "txid", ToString(tenant->TxId));
+ AddOptionalValue(id, "action", ToString((ui32)action));
+ return id;
+}
+
+TTenantsManager::TStoragePool::TPtr TTenantsManager::MakeStoragePool(TTenant::TPtr tenant, const TString &kind, ui64 size)
+{
+ auto poolName = tenant->MakeStoragePoolName(kind);
+ auto &config = Domain->StoragePoolTypes.at(kind);
+
+ TStoragePool::TPtr pool = new TStoragePool(poolName, kind, size, config);
+ if (tenant->HasSubDomainKey())
pool->SetScopeId(tenant->DomainId);
-
- return pool;
-}
-
-void TTenantsManager::OpenTenantSlotBrokerPipe(const TActorContext &ctx)
-{
- NTabletPipe::TClientConfig pipeConfig;
+
+ return pool;
+}
+
+void TTenantsManager::OpenTenantSlotBrokerPipe(const TActorContext &ctx)
+{
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = FastConnectRetryPolicy();
- auto aid = MakeTenantSlotBrokerID(Domain->DefaultStateStorageGroup);
- auto pipe = NTabletPipe::CreateClient(ctx.SelfID, aid, pipeConfig);
- TenantSlotBrokerPipe = ctx.ExecutorThread.RegisterActor(pipe);
-}
-
-void TTenantsManager::OnTenantSlotBrokerPipeDestroyed(const TActorContext &ctx)
-{
- if (TenantSlotBrokerPipe) {
- NTabletPipe::CloseClient(ctx, TenantSlotBrokerPipe);
+ auto aid = MakeTenantSlotBrokerID(Domain->DefaultStateStorageGroup);
+ auto pipe = NTabletPipe::CreateClient(ctx.SelfID, aid, pipeConfig);
+ TenantSlotBrokerPipe = ctx.ExecutorThread.RegisterActor(pipe);
+}
+
+void TTenantsManager::OnTenantSlotBrokerPipeDestroyed(const TActorContext &ctx)
+{
+ if (TenantSlotBrokerPipe) {
+ NTabletPipe::CloseClient(ctx, TenantSlotBrokerPipe);
TenantSlotBrokerPipe = TActorId();
- }
-
- RetryResourcesRequests(ctx);
- if (DelayedTxs)
- RequestTenantSlotsStats(ctx);
-}
-
-void TTenantsManager::AllocateTenantPools(TTenant::TPtr tenant, const TActorContext &ctx)
-{
- if (!tenant->HasPoolsToCreate()) {
- if (tenant->State == TTenant::CREATING_POOLS)
- TxProcessor->ProcessTx(CreateTxUpdateTenantState(tenant->Path, TTenant::CREATING_SUBDOMAIN), ctx);
- return;
- }
-
- // If legacy tenant doesn't have domain key yet then postpone
- // pools update until subdomain key is updated.
- if (tenant->State != TTenant::CREATING_POOLS && !tenant->HasSubDomainKey())
- return;
-
- for (auto &pr : tenant->StoragePools) {
- if (pr.second->State != TStoragePool::ALLOCATED && !pr.second->Worker)
+ }
+
+ RetryResourcesRequests(ctx);
+ if (DelayedTxs)
+ RequestTenantSlotsStats(ctx);
+}
+
+void TTenantsManager::AllocateTenantPools(TTenant::TPtr tenant, const TActorContext &ctx)
+{
+ if (!tenant->HasPoolsToCreate()) {
+ if (tenant->State == TTenant::CREATING_POOLS)
+ TxProcessor->ProcessTx(CreateTxUpdateTenantState(tenant->Path, TTenant::CREATING_SUBDOMAIN), ctx);
+ return;
+ }
+
+ // If legacy tenant doesn't have domain key yet then postpone
+ // pools update until subdomain key is updated.
+ if (tenant->State != TTenant::CREATING_POOLS && !tenant->HasSubDomainKey())
+ return;
+
+ for (auto &pr : tenant->StoragePools) {
+ if (pr.second->State != TStoragePool::ALLOCATED && !pr.second->Worker)
pr.second->Worker = ctx.RegisterWithSameMailbox(new TPoolManip(SelfId(), Domain, tenant, pr.second, TPoolManip::ALLOCATE));
- }
-}
-
-void TTenantsManager::DeleteTenantPools(TTenant::TPtr tenant, const TActorContext &ctx)
-{
- if (!tenant->HasPoolsToDelete()) {
- TxProcessor->ProcessTx(CreateTxRemoveTenantDone(tenant), ctx);
- return;
- }
-
- for (auto &pr : tenant->StoragePools) {
- if (pr.second->State != TStoragePool::DELETED)
+ }
+}
+
+void TTenantsManager::DeleteTenantPools(TTenant::TPtr tenant, const TActorContext &ctx)
+{
+ if (!tenant->HasPoolsToDelete()) {
+ TxProcessor->ProcessTx(CreateTxRemoveTenantDone(tenant), ctx);
+ return;
+ }
+
+ for (auto &pr : tenant->StoragePools) {
+ if (pr.second->State != TStoragePool::DELETED)
pr.second->Worker = ctx.RegisterWithSameMailbox(new TPoolManip(SelfId(), Domain, tenant, pr.second, TPoolManip::DEALLOCATE));
- }
-}
-
-void TTenantsManager::RequestTenantResources(TTenant::TPtr tenant, const TActorContext &ctx)
-{
- if (!TenantSlotBrokerPipe)
- OpenTenantSlotBrokerPipe(ctx);
-
- auto request = MakeHolder<TEvTenantSlotBroker::TEvAlterTenant>();
- request->Record.SetTenantName(tenant->Path);
- for (auto &pr : tenant->Slots) {
- auto &slot = *request->Record.AddRequiredSlots();
- pr.first.Serialize(slot);
- slot.SetCount(pr.second);
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send TEvTenantSlotBroker::TEvAlterTenant: "
- << request->Record.ShortDebugString());
-
- NTabletPipe::SendData(ctx, TenantSlotBrokerPipe, request.Release());
-}
-
-void TTenantsManager::RequestTenantSlotsState(TTenant::TPtr tenant, const TActorContext &ctx)
-{
- Y_VERIFY(tenant->IsRunning() || tenant->IsConfiguring());
- if (!TenantSlotBrokerPipe)
- OpenTenantSlotBrokerPipe(ctx);
-
- auto request = MakeHolder<TEvTenantSlotBroker::TEvGetTenantState>();
- request->Record.SetTenantName(tenant->Path);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send TEvTenantSlotBroker::TEvGetTenantState: "
- << request->Record.ShortDebugString());
-
- NTabletPipe::SendData(ctx, TenantSlotBrokerPipe, request.Release());
-}
-
-void TTenantsManager::RequestTenantSlotsStats(const TActorContext &ctx)
-{
- if (!TenantSlotBrokerPipe)
- OpenTenantSlotBrokerPipe(ctx);
-
- auto request = MakeHolder<TEvTenantSlotBroker::TEvGetSlotStats>();
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send TEvTenantSlotBroker::TEvGetSlotStats: "
- << request->Record.ShortDebugString());
-
- NTabletPipe::SendData(ctx, TenantSlotBrokerPipe, request.Release());
-}
-
-void TTenantsManager::RetryResourcesRequests(const TActorContext &ctx)
-{
- for (auto &pr : Tenants) {
- auto tenant = pr.second;
- if (tenant->IsCreating())
- continue;
-
- if (!tenant->SlotsAllocationConfirmed)
- RequestTenantResources(tenant, ctx);
- else if (!tenant->StatusRequests.empty())
- RequestTenantSlotsState(tenant, ctx);
- }
-}
-
+ }
+}
+
+void TTenantsManager::RequestTenantResources(TTenant::TPtr tenant, const TActorContext &ctx)
+{
+ if (!TenantSlotBrokerPipe)
+ OpenTenantSlotBrokerPipe(ctx);
+
+ auto request = MakeHolder<TEvTenantSlotBroker::TEvAlterTenant>();
+ request->Record.SetTenantName(tenant->Path);
+ for (auto &pr : tenant->Slots) {
+ auto &slot = *request->Record.AddRequiredSlots();
+ pr.first.Serialize(slot);
+ slot.SetCount(pr.second);
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send TEvTenantSlotBroker::TEvAlterTenant: "
+ << request->Record.ShortDebugString());
+
+ NTabletPipe::SendData(ctx, TenantSlotBrokerPipe, request.Release());
+}
+
+void TTenantsManager::RequestTenantSlotsState(TTenant::TPtr tenant, const TActorContext &ctx)
+{
+ Y_VERIFY(tenant->IsRunning() || tenant->IsConfiguring());
+ if (!TenantSlotBrokerPipe)
+ OpenTenantSlotBrokerPipe(ctx);
+
+ auto request = MakeHolder<TEvTenantSlotBroker::TEvGetTenantState>();
+ request->Record.SetTenantName(tenant->Path);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send TEvTenantSlotBroker::TEvGetTenantState: "
+ << request->Record.ShortDebugString());
+
+ NTabletPipe::SendData(ctx, TenantSlotBrokerPipe, request.Release());
+}
+
+void TTenantsManager::RequestTenantSlotsStats(const TActorContext &ctx)
+{
+ if (!TenantSlotBrokerPipe)
+ OpenTenantSlotBrokerPipe(ctx);
+
+ auto request = MakeHolder<TEvTenantSlotBroker::TEvGetSlotStats>();
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send TEvTenantSlotBroker::TEvGetSlotStats: "
+ << request->Record.ShortDebugString());
+
+ NTabletPipe::SendData(ctx, TenantSlotBrokerPipe, request.Release());
+}
+
+void TTenantsManager::RetryResourcesRequests(const TActorContext &ctx)
+{
+ for (auto &pr : Tenants) {
+ auto tenant = pr.second;
+ if (tenant->IsCreating())
+ continue;
+
+ if (!tenant->SlotsAllocationConfirmed)
+ RequestTenantResources(tenant, ctx);
+ else if (!tenant->StatusRequests.empty())
+ RequestTenantSlotsState(tenant, ctx);
+ }
+}
+
void TTenantsManager::FillTenantStatus(TTenant::TPtr tenant, Ydb::Cms::GetDatabaseStatusResult &status)
-{
- status.set_path(tenant->Path);
+{
+ status.set_path(tenant->Path);
if (tenant->IsRunning() && tenant->SubdomainVersion != tenant->ConfirmedSubdomain)
status.set_state(Ydb::Cms::GetDatabaseStatusResult::CONFIGURING);
else if (tenant->IsRunning())
status.set_state(Ydb::Cms::GetDatabaseStatusResult::RUNNING);
- else if (tenant->IsConfiguring())
- status.set_state(Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES);
- else if (tenant->IsCreating())
+ else if (tenant->IsConfiguring())
+ status.set_state(Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES);
+ else if (tenant->IsCreating())
status.set_state(Ydb::Cms::GetDatabaseStatusResult::CREATING);
- else if (tenant->IsRemoving())
+ else if (tenant->IsRemoving())
status.set_state(Ydb::Cms::GetDatabaseStatusResult::REMOVING);
- else
+ else
status.set_state(Ydb::Cms::GetDatabaseStatusResult::STATE_UNSPECIFIED);
-
+
auto resources = tenant->AreResourcesShared ?
status.mutable_required_shared_resources() :
status.mutable_required_resources();
- for (auto &pr : tenant->StoragePools) {
+ for (auto &pr : tenant->StoragePools) {
auto &pool = *resources->add_storage_units();
- pool.set_unit_kind(pr.second->Kind);
- pool.set_count(pr.second->Config.GetNumGroups());
- if (pr.second->AllocatedNumGroups) {
- auto &allocatedPool = *status.mutable_allocated_resources()->add_storage_units();
- allocatedPool.set_unit_kind(pr.second->Kind);
- allocatedPool.set_count(pr.second->AllocatedNumGroups);
- }
- }
-
- for (auto &pr : tenant->ComputationalUnits) {
+ pool.set_unit_kind(pr.second->Kind);
+ pool.set_count(pr.second->Config.GetNumGroups());
+ if (pr.second->AllocatedNumGroups) {
+ auto &allocatedPool = *status.mutable_allocated_resources()->add_storage_units();
+ allocatedPool.set_unit_kind(pr.second->Kind);
+ allocatedPool.set_count(pr.second->AllocatedNumGroups);
+ }
+ }
+
+ for (auto &pr : tenant->ComputationalUnits) {
auto &unit = *resources->add_computational_units();
- unit.set_unit_kind(pr.first.first);
- unit.set_availability_zone(pr.first.second);
- unit.set_count(pr.second);
- }
-
+ unit.set_unit_kind(pr.first.first);
+ unit.set_availability_zone(pr.first.second);
+ unit.set_count(pr.second);
+ }
+
if (tenant->SharedDomainId) {
auto sharedTenant = GetTenant(tenant->SharedDomainId);
Y_VERIFY(sharedTenant);
status.mutable_serverless_resources()->set_shared_database_path(sharedTenant->Path);
}
- for (auto &pr : tenant->RegisteredComputationalUnits) {
- auto &unit = *status.add_registered_resources();
- unit.set_host(pr.second.Host);
- unit.set_port(pr.second.Port);
- unit.set_unit_kind(pr.second.Kind);
- }
-
- status.set_generation(tenant->Generation);
+ for (auto &pr : tenant->RegisteredComputationalUnits) {
+ auto &unit = *status.add_registered_resources();
+ unit.set_host(pr.second.Host);
+ unit.set_port(pr.second.Port);
+ unit.set_unit_kind(pr.second.Kind);
+ }
+
+ status.set_generation(tenant->Generation);
if (tenant->SchemaOperationQuotas) {
status.mutable_schema_operation_quotas()->CopyFrom(*tenant->SchemaOperationQuotas);
@@ -1903,222 +1903,222 @@ void TTenantsManager::FillTenantStatus(TTenant::TPtr tenant, Ydb::Cms::GetDataba
if (tenant->DatabaseQuotas) {
status.mutable_database_quotas()->CopyFrom(*tenant->DatabaseQuotas);
}
-}
-
+}
+
void TTenantsManager::FillTenantAllocatedSlots(TTenant::TPtr tenant, Ydb::Cms::GetDatabaseStatusResult &status,
- const NKikimrTenantSlotBroker::TTenantState &slots)
-{
- THashMap<TSlotDescription, ui64> allocated;
- for (auto &slot : slots.GetRequiredSlots()) {
- TSlotDescription key(slot);
- allocated[key] = slot.GetCount();
- }
- for (auto &slot : slots.GetPendingSlots()) {
- TSlotDescription key(slot);
- allocated[key] -= slot.GetCount();
- }
- for (auto &slot : slots.GetMissingSlots()) {
- TSlotDescription key(slot);
- allocated[key] -= slot.GetCount();
- }
-
- for (auto &pr : tenant->ComputationalUnits) {
- auto &kind = pr.first.first;
- auto &zone = pr.first.second;
- auto count = pr.second;
- auto key = Config.GetSlotKey(kind, zone);
-
- count = Min(count, allocated[key]);
- allocated[key] -= count;
-
- if (count) {
- auto &unit = *status.mutable_allocated_resources()->add_computational_units();
- unit.set_unit_kind(kind);
- unit.set_availability_zone(zone);
- unit.set_count(count);
- }
- }
-}
-
-void TTenantsManager::CheckSubDomainKey(TTenant::TPtr tenant,
- const TActorContext &ctx)
-{
- Y_VERIFY(tenant->IsRunning() || tenant->IsConfiguring());
- if (tenant->HasSubDomainKey() || tenant->Worker)
- return;
-
- auto *actor = new TSubDomainManip(SelfId(), tenant, TSubDomainManip::GET_KEY);
+ const NKikimrTenantSlotBroker::TTenantState &slots)
+{
+ THashMap<TSlotDescription, ui64> allocated;
+ for (auto &slot : slots.GetRequiredSlots()) {
+ TSlotDescription key(slot);
+ allocated[key] = slot.GetCount();
+ }
+ for (auto &slot : slots.GetPendingSlots()) {
+ TSlotDescription key(slot);
+ allocated[key] -= slot.GetCount();
+ }
+ for (auto &slot : slots.GetMissingSlots()) {
+ TSlotDescription key(slot);
+ allocated[key] -= slot.GetCount();
+ }
+
+ for (auto &pr : tenant->ComputationalUnits) {
+ auto &kind = pr.first.first;
+ auto &zone = pr.first.second;
+ auto count = pr.second;
+ auto key = Config.GetSlotKey(kind, zone);
+
+ count = Min(count, allocated[key]);
+ allocated[key] -= count;
+
+ if (count) {
+ auto &unit = *status.mutable_allocated_resources()->add_computational_units();
+ unit.set_unit_kind(kind);
+ unit.set_availability_zone(zone);
+ unit.set_count(count);
+ }
+ }
+}
+
+void TTenantsManager::CheckSubDomainKey(TTenant::TPtr tenant,
+ const TActorContext &ctx)
+{
+ Y_VERIFY(tenant->IsRunning() || tenant->IsConfiguring());
+ if (tenant->HasSubDomainKey() || tenant->Worker)
+ return;
+
+ auto *actor = new TSubDomainManip(SelfId(), tenant, TSubDomainManip::GET_KEY);
tenant->Worker = ctx.RegisterWithSameMailbox(actor);
-}
-
-void TTenantsManager::ConfigureTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx)
-{
- Y_VERIFY(tenant->IsRunning() || tenant->IsConfiguring());
- if (tenant->SubdomainVersion != tenant->ConfirmedSubdomain
- && !tenant->Worker) {
+}
+
+void TTenantsManager::ConfigureTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx)
+{
+ Y_VERIFY(tenant->IsRunning() || tenant->IsConfiguring());
+ if (tenant->SubdomainVersion != tenant->ConfirmedSubdomain
+ && !tenant->Worker) {
auto *actor = new TSubDomainManip(SelfId(), tenant, TSubDomainManip::CONFIGURE, GetTenant(tenant->SharedDomainId));
tenant->Worker = ctx.RegisterWithSameMailbox(actor);
- }
-}
-
-void TTenantsManager::CreateTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx)
-{
- Y_VERIFY(tenant->State == TTenant::CREATING_SUBDOMAIN);
- Y_VERIFY(!tenant->Worker);
+ }
+}
+
+void TTenantsManager::CreateTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx)
+{
+ Y_VERIFY(tenant->State == TTenant::CREATING_SUBDOMAIN);
+ Y_VERIFY(!tenant->Worker);
auto *actor = new TSubDomainManip(SelfId(), tenant, TSubDomainManip::CREATE, GetTenant(tenant->SharedDomainId));
tenant->Worker = ctx.RegisterWithSameMailbox(actor);
-}
-
-void TTenantsManager::DeleteTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx)
-{
- Y_VERIFY(tenant->State == TTenant::REMOVING_SUBDOMAIN);
- if (!tenant->Worker) {
- auto *actor = new TSubDomainManip(SelfId(), tenant, TSubDomainManip::REMOVE);
+}
+
+void TTenantsManager::DeleteTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx)
+{
+ Y_VERIFY(tenant->State == TTenant::REMOVING_SUBDOMAIN);
+ if (!tenant->Worker) {
+ auto *actor = new TSubDomainManip(SelfId(), tenant, TSubDomainManip::REMOVE);
tenant->Worker = ctx.RegisterWithSameMailbox(actor);
- }
-}
-
-void TTenantsManager::ProcessTenantActions(TTenant::TPtr tenant, const TActorContext &ctx)
-{
- if (tenant->State == TTenant::CREATING_POOLS) {
- AllocateTenantPools(tenant, ctx);
- } else if (tenant->State == TTenant::CREATING_SUBDOMAIN) {
- CreateTenantSubDomain(tenant, ctx);
- } else if (tenant->State == TTenant::CONFIGURING_SUBDOMAIN
- || tenant->State == TTenant::RUNNING) {
- // Tenant created using older CMS version has no
- // subdomain key fields filled. Check if update is
- // required.
- CheckSubDomainKey(tenant, ctx);
- // Process altered storage pools.
- AllocateTenantPools(tenant, ctx);
- // Deliver new pools to subdomain configuration.
- ConfigureTenantSubDomain(tenant, ctx);
- // Process slots allocation.
- if (!tenant->SlotsAllocationConfirmed)
- RequestTenantResources(tenant, ctx);
- } else if (tenant->State == TTenant::REMOVING_UNITS) {
- RequestTenantResources(tenant, ctx);
- } else if (tenant->State == TTenant::REMOVING_SUBDOMAIN) {
- DeleteTenantSubDomain(tenant, ctx);
- } else if (tenant->State == TTenant::REMOVING_POOLS) {
- DeleteTenantPools(tenant, ctx);
- } else {
- Y_FAIL("unexpected tenant state %u", (ui32)tenant->State);
- }
-}
-
-TTenantsManager::TTenant::TPtr TTenantsManager::FillOperationStatus(const TString &id,
+ }
+}
+
+void TTenantsManager::ProcessTenantActions(TTenant::TPtr tenant, const TActorContext &ctx)
+{
+ if (tenant->State == TTenant::CREATING_POOLS) {
+ AllocateTenantPools(tenant, ctx);
+ } else if (tenant->State == TTenant::CREATING_SUBDOMAIN) {
+ CreateTenantSubDomain(tenant, ctx);
+ } else if (tenant->State == TTenant::CONFIGURING_SUBDOMAIN
+ || tenant->State == TTenant::RUNNING) {
+ // Tenant created using older CMS version has no
+ // subdomain key fields filled. Check if update is
+ // required.
+ CheckSubDomainKey(tenant, ctx);
+ // Process altered storage pools.
+ AllocateTenantPools(tenant, ctx);
+ // Deliver new pools to subdomain configuration.
+ ConfigureTenantSubDomain(tenant, ctx);
+ // Process slots allocation.
+ if (!tenant->SlotsAllocationConfirmed)
+ RequestTenantResources(tenant, ctx);
+ } else if (tenant->State == TTenant::REMOVING_UNITS) {
+ RequestTenantResources(tenant, ctx);
+ } else if (tenant->State == TTenant::REMOVING_SUBDOMAIN) {
+ DeleteTenantSubDomain(tenant, ctx);
+ } else if (tenant->State == TTenant::REMOVING_POOLS) {
+ DeleteTenantPools(tenant, ctx);
+ } else {
+ Y_FAIL("unexpected tenant state %u", (ui32)tenant->State);
+ }
+}
+
+TTenantsManager::TTenant::TPtr TTenantsManager::FillOperationStatus(const TString &id,
Ydb::Operations::Operation &operation)
-{
- operation.set_id(id);
-
- TString path;
- ui64 action = 0;
- ui64 txId = 0;
- TTenant::TPtr tenant = nullptr;
- try {
- TOperationId opId(id);
- const auto& tenants = opId.GetValue("tenant");
- const auto& txIds = opId.GetValue("txid");
- const auto& actions = opId.GetValue("action");
- if (tenants.size() != 1 || txIds.size() != 1 || actions.size() != 1) {
- operation.set_ready(true);
- operation.set_status(Ydb::StatusIds::NOT_FOUND);
- }
- path = *tenants[0];
- if (!TryFromString(*actions[0], action)
- || !TryFromString(*txIds[0], txId)) {
- operation.set_ready(true);
- operation.set_status(Ydb::StatusIds::NOT_FOUND);
- }
- } catch (const yexception& ex) {
- operation.set_ready(true);
- operation.set_status(Ydb::StatusIds::NOT_FOUND);
- }
-
- if (action == TTenant::CREATE) {
- tenant = GetTenant(path);
- if (tenant && tenant->TxId == txId) {
- if (tenant->IsConfiguring() || tenant->IsRunning()) {
- operation.set_ready(true);
- operation.set_status(Ydb::StatusIds::SUCCESS);
- } else if (tenant->IsRemoving()) {
- operation.set_ready(true);
- operation.set_status(tenant->ErrorCode
- ? tenant->ErrorCode
- : Ydb::StatusIds::GENERIC_ERROR);
- auto issue = operation.add_issues();
- issue->set_severity(NYql::TSeverityIds::S_ERROR);
- issue->set_message(tenant->Issue);
- } else {
- Y_VERIFY(tenant->IsCreating() || tenant->IsConfiguring());
- operation.set_ready(false);
- }
+{
+ operation.set_id(id);
+
+ TString path;
+ ui64 action = 0;
+ ui64 txId = 0;
+ TTenant::TPtr tenant = nullptr;
+ try {
+ TOperationId opId(id);
+ const auto& tenants = opId.GetValue("tenant");
+ const auto& txIds = opId.GetValue("txid");
+ const auto& actions = opId.GetValue("action");
+ if (tenants.size() != 1 || txIds.size() != 1 || actions.size() != 1) {
+ operation.set_ready(true);
+ operation.set_status(Ydb::StatusIds::NOT_FOUND);
+ }
+ path = *tenants[0];
+ if (!TryFromString(*actions[0], action)
+ || !TryFromString(*txIds[0], txId)) {
+ operation.set_ready(true);
+ operation.set_status(Ydb::StatusIds::NOT_FOUND);
+ }
+ } catch (const yexception& ex) {
+ operation.set_ready(true);
+ operation.set_status(Ydb::StatusIds::NOT_FOUND);
+ }
+
+ if (action == TTenant::CREATE) {
+ tenant = GetTenant(path);
+ if (tenant && tenant->TxId == txId) {
+ if (tenant->IsConfiguring() || tenant->IsRunning()) {
+ operation.set_ready(true);
+ operation.set_status(Ydb::StatusIds::SUCCESS);
+ } else if (tenant->IsRemoving()) {
+ operation.set_ready(true);
+ operation.set_status(tenant->ErrorCode
+ ? tenant->ErrorCode
+ : Ydb::StatusIds::GENERIC_ERROR);
+ auto issue = operation.add_issues();
+ issue->set_severity(NYql::TSeverityIds::S_ERROR);
+ issue->set_message(tenant->Issue);
+ } else {
+ Y_VERIFY(tenant->IsCreating() || tenant->IsConfiguring());
+ operation.set_ready(false);
+ }
} else if (RemovedTenants.contains(path)
- && RemovedTenants.at(path).TxId == txId) {
- auto &removed = RemovedTenants.at(path);
- operation.set_ready(true);
- operation.set_status(removed.ErrorCode
- ? removed.ErrorCode
- : Ydb::StatusIds::GENERIC_ERROR);
- auto issue = operation.add_issues();
- issue->set_severity(NYql::TSeverityIds::S_ERROR);
- issue->set_message(removed.Issue);
- } else {
- operation.set_ready(true);
- operation.set_status(Ydb::StatusIds::NOT_FOUND);
- }
- } else if (action == TTenant::REMOVE) {
- tenant = GetTenant(path);
- if (tenant && tenant->TxId == txId) {
- operation.set_ready(false);
+ && RemovedTenants.at(path).TxId == txId) {
+ auto &removed = RemovedTenants.at(path);
+ operation.set_ready(true);
+ operation.set_status(removed.ErrorCode
+ ? removed.ErrorCode
+ : Ydb::StatusIds::GENERIC_ERROR);
+ auto issue = operation.add_issues();
+ issue->set_severity(NYql::TSeverityIds::S_ERROR);
+ issue->set_message(removed.Issue);
+ } else {
+ operation.set_ready(true);
+ operation.set_status(Ydb::StatusIds::NOT_FOUND);
+ }
+ } else if (action == TTenant::REMOVE) {
+ tenant = GetTenant(path);
+ if (tenant && tenant->TxId == txId) {
+ operation.set_ready(false);
} else if (RemovedTenants.contains(path)
- && RemovedTenants.at(path).TxId == txId) {
- operation.set_ready(true);
- operation.set_status(RemovedTenants.at(path).Code);
- } else {
- operation.set_ready(true);
- operation.set_status(Ydb::StatusIds::NOT_FOUND);
- }
- } else {
- operation.set_ready(true);
- operation.set_status(Ydb::StatusIds::NOT_FOUND);
- }
-
- return tenant;
-}
-
-void TTenantsManager::SendTenantNotifications(TTenant::TPtr tenant,
- TTenant::EAction action,
- Ydb::StatusIds::StatusCode code,
- const TActorContext &ctx)
-{
- for (auto &subscriber : tenant->Subscribers) {
- auto notification = MakeHolder<TEvConsole::TEvOperationCompletionNotification>();
- auto &operation = *notification->Record.MutableResponse()->mutable_operation();
- Ydb::TOperationId id = MakeOperationId(tenant, action);
- operation.set_id(ProtoToString(id));
- operation.set_ready(true);
- operation.set_status(code);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send " << tenant->Path << " notification to "
- << subscriber << ": " << notification->Record.ShortDebugString());
-
- ctx.Send(subscriber, notification.Release());
-
- if (action == TTenant::CREATE)
- Counters.Inc(code, COUNTER_CREATE_RESPONSES);
- else if (action == TTenant::REMOVE)
- Counters.Inc(code, COUNTER_REMOVE_RESPONSES);
- else
- Y_FAIL("unexpected action value (%" PRIu32 ")", static_cast<ui32>(action));
- }
- tenant->Subscribers.clear();
-}
-
+ && RemovedTenants.at(path).TxId == txId) {
+ operation.set_ready(true);
+ operation.set_status(RemovedTenants.at(path).Code);
+ } else {
+ operation.set_ready(true);
+ operation.set_status(Ydb::StatusIds::NOT_FOUND);
+ }
+ } else {
+ operation.set_ready(true);
+ operation.set_status(Ydb::StatusIds::NOT_FOUND);
+ }
+
+ return tenant;
+}
+
+void TTenantsManager::SendTenantNotifications(TTenant::TPtr tenant,
+ TTenant::EAction action,
+ Ydb::StatusIds::StatusCode code,
+ const TActorContext &ctx)
+{
+ for (auto &subscriber : tenant->Subscribers) {
+ auto notification = MakeHolder<TEvConsole::TEvOperationCompletionNotification>();
+ auto &operation = *notification->Record.MutableResponse()->mutable_operation();
+ Ydb::TOperationId id = MakeOperationId(tenant, action);
+ operation.set_id(ProtoToString(id));
+ operation.set_ready(true);
+ operation.set_status(code);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send " << tenant->Path << " notification to "
+ << subscriber << ": " << notification->Record.ShortDebugString());
+
+ ctx.Send(subscriber, notification.Release());
+
+ if (action == TTenant::CREATE)
+ Counters.Inc(code, COUNTER_CREATE_RESPONSES);
+ else if (action == TTenant::REMOVE)
+ Counters.Inc(code, COUNTER_REMOVE_RESPONSES);
+ else
+ Y_FAIL("unexpected action value (%" PRIu32 ")", static_cast<ui32>(action));
+ }
+ tenant->Subscribers.clear();
+}
+
TString DomainIdToStringSafe(const TTenantsManager::TDomainId& value) {
// <invalid> cannot be printed inside <pre> tag
if (!value) {
@@ -2128,151 +2128,151 @@ TString DomainIdToStringSafe(const TTenantsManager::TDomainId& value) {
return value.ToString();
}
-void TTenantsManager::DumpStateHTML(IOutputStream &os)
-{
- HTML(os) {
- PRE() {
- os << "Used config: " << Endl
- << Self.GetConfig().GetTenantsConfig().DebugString() << Endl
- << "Storage pool types:" << Endl;
- for (auto &pr : Domain->StoragePoolTypes)
- os << " " << pr.first << ": " << pr.second.ShortDebugString() << Endl;
- os << Endl;
-
- os << "SlotStats:" << Endl;
- for (auto &pr : SlotStats.SlotsByType)
- os << " " << pr.first << ": " << pr.second.Allocated << "/" << pr.second.Connected
- << "(free " << pr.second.Free << ")" << Endl;
- os << " Total: " << SlotStats.Total.Allocated << "/" << SlotStats.Total.Connected
- << "(free " << SlotStats.Total.Free << ")" << Endl;
-
- if (!DelayedTxs.empty())
- os << DelayedTxs.size() << " transaction(s) are waiting for updated slot stats" << Endl;
- os << Endl;
-
- os << "Tenants:" << Endl;
- for (auto &pr : Tenants) {
- auto tenant = pr.second;
- os << " - " << tenant->Path << " " << tenant->State << Endl
- << " Coordinators: " << tenant->Coordinators << Endl
- << " Mediators: " << tenant->Mediators << Endl
- << " PlanResolution: " << tenant->PlanResolution << Endl
- << " TimeCastBucketsPerMediator: " << tenant->TimeCastBucketsPerMediator << Endl
- << " StorageUnitsQuota: " << tenant->StorageUnitsQuota << Endl
- << " ComputationalUnitsQuota: " << tenant->ComputationalUnitsQuota << Endl
- << " Worker: " << tenant->Worker << Endl
- << " SubdomainVersion: " << tenant->SubdomainVersion << Endl
- << " ConfirmedSubdomain: " << tenant->ConfirmedSubdomain << Endl
+void TTenantsManager::DumpStateHTML(IOutputStream &os)
+{
+ HTML(os) {
+ PRE() {
+ os << "Used config: " << Endl
+ << Self.GetConfig().GetTenantsConfig().DebugString() << Endl
+ << "Storage pool types:" << Endl;
+ for (auto &pr : Domain->StoragePoolTypes)
+ os << " " << pr.first << ": " << pr.second.ShortDebugString() << Endl;
+ os << Endl;
+
+ os << "SlotStats:" << Endl;
+ for (auto &pr : SlotStats.SlotsByType)
+ os << " " << pr.first << ": " << pr.second.Allocated << "/" << pr.second.Connected
+ << "(free " << pr.second.Free << ")" << Endl;
+ os << " Total: " << SlotStats.Total.Allocated << "/" << SlotStats.Total.Connected
+ << "(free " << SlotStats.Total.Free << ")" << Endl;
+
+ if (!DelayedTxs.empty())
+ os << DelayedTxs.size() << " transaction(s) are waiting for updated slot stats" << Endl;
+ os << Endl;
+
+ os << "Tenants:" << Endl;
+ for (auto &pr : Tenants) {
+ auto tenant = pr.second;
+ os << " - " << tenant->Path << " " << tenant->State << Endl
+ << " Coordinators: " << tenant->Coordinators << Endl
+ << " Mediators: " << tenant->Mediators << Endl
+ << " PlanResolution: " << tenant->PlanResolution << Endl
+ << " TimeCastBucketsPerMediator: " << tenant->TimeCastBucketsPerMediator << Endl
+ << " StorageUnitsQuota: " << tenant->StorageUnitsQuota << Endl
+ << " ComputationalUnitsQuota: " << tenant->ComputationalUnitsQuota << Endl
+ << " Worker: " << tenant->Worker << Endl
+ << " SubdomainVersion: " << tenant->SubdomainVersion << Endl
+ << " ConfirmedSubdomain: " << tenant->ConfirmedSubdomain << Endl
<< " DomainId: " << DomainIdToStringSafe(tenant->DomainId) << Endl
<< " AreResourcesShared: " << tenant->AreResourcesShared << Endl
<< " SharedDomainId: " << DomainIdToStringSafe(tenant->SharedDomainId) << Endl
- << " Attributes: " << tenant->Attributes.ShortDebugString() << Endl;
-
- os << " Storage pools:" << Endl;
- for (auto &pr : tenant->StoragePools) {
- auto &pool = pr.second;
- os << " - " << pool->Kind << Endl
- << " State: " << pool->State << Endl
- << " Config: " << pool->Config.ShortDebugString() << Endl
- << " AllocatedNumGroups: " << pool->AllocatedNumGroups << Endl;
- if (pool->Issue)
- os << " Issue: " << pool->Issue << Endl;
- }
-
- if (tenant->Worker)
- os << " Worker actor ID: " << tenant->Worker << Endl;
-
- os << " Computational units:" << Endl;
- for (auto &pr : tenant->ComputationalUnits)
- os << " - [" << pr.first.first << ", " << pr.first.second << "]: " << pr.second << Endl;
-
- os << " Slots:" << Endl;
- for (auto &slot : tenant->Slots)
- os << " - " << slot.first.ToString() << ": " << slot.second << Endl;
-
- os << " Registered computational units:" << Endl;
- for (auto &pr : tenant->RegisteredComputationalUnits) {
- auto &unit = pr.second;
- os << " - " << unit.Host << ":" << unit.Port << " - " << unit.Kind << Endl;
- }
-
- if (!tenant->StatusRequests.empty()) {
- os << " Pending status requests from:";
- for (auto &e : tenant->StatusRequests)
- os << " " << e->Sender;
- os << Endl;
- }
- }
-
- os << Endl
- << "Removed tenants (path txid issue):" << Endl;
- for (auto &pr : RemovedTenants) {
- auto &tenant = pr.second;
- os << " - " << tenant.Path << " " << tenant.TxId << " " << tenant.Code << " " << tenant.Issue << Endl;
- }
- }
- }
-}
-
-void TTenantsManager::ProcessOrDelayTx(ITransaction *tx,
- const TActorContext &ctx)
-{
- // We use this function to delay tx if we have to collect stats
- // before tx execution.
- if (Config.TotalComputationalUnitsLoadQuota) {
- if (DelayedTxs.empty())
- RequestTenantSlotsStats(ctx);
- DelayedTxs.push(THolder<ITransaction>(tx));
- } else {
- TxProcessor->ProcessTx(tx, ctx);
- }
-}
-
-void TTenantsManager::DbAddTenant(TTenant::TPtr tenant,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Add tenant " << tenant->Path << " to database"
- << " state=" << tenant->State
- << " coordinators=" << tenant->Coordinators
- << " mediators=" << tenant->Mediators
- << " planresolution=" << tenant->PlanResolution
- << " timecastbucketspermediator=" << tenant->TimeCastBucketsPerMediator
- << " issue=" << tenant->Issue
- << " txid=" << tenant->TxId
- << " subdomainversion=" << tenant->SubdomainVersion
- << " confirmedsubdomain=" << tenant->ConfirmedSubdomain
- << " attrs=" << tenant->Attributes.ShortDebugString()
- << " generation=" << tenant->Generation
+ << " Attributes: " << tenant->Attributes.ShortDebugString() << Endl;
+
+ os << " Storage pools:" << Endl;
+ for (auto &pr : tenant->StoragePools) {
+ auto &pool = pr.second;
+ os << " - " << pool->Kind << Endl
+ << " State: " << pool->State << Endl
+ << " Config: " << pool->Config.ShortDebugString() << Endl
+ << " AllocatedNumGroups: " << pool->AllocatedNumGroups << Endl;
+ if (pool->Issue)
+ os << " Issue: " << pool->Issue << Endl;
+ }
+
+ if (tenant->Worker)
+ os << " Worker actor ID: " << tenant->Worker << Endl;
+
+ os << " Computational units:" << Endl;
+ for (auto &pr : tenant->ComputationalUnits)
+ os << " - [" << pr.first.first << ", " << pr.first.second << "]: " << pr.second << Endl;
+
+ os << " Slots:" << Endl;
+ for (auto &slot : tenant->Slots)
+ os << " - " << slot.first.ToString() << ": " << slot.second << Endl;
+
+ os << " Registered computational units:" << Endl;
+ for (auto &pr : tenant->RegisteredComputationalUnits) {
+ auto &unit = pr.second;
+ os << " - " << unit.Host << ":" << unit.Port << " - " << unit.Kind << Endl;
+ }
+
+ if (!tenant->StatusRequests.empty()) {
+ os << " Pending status requests from:";
+ for (auto &e : tenant->StatusRequests)
+ os << " " << e->Sender;
+ os << Endl;
+ }
+ }
+
+ os << Endl
+ << "Removed tenants (path txid issue):" << Endl;
+ for (auto &pr : RemovedTenants) {
+ auto &tenant = pr.second;
+ os << " - " << tenant.Path << " " << tenant.TxId << " " << tenant.Code << " " << tenant.Issue << Endl;
+ }
+ }
+ }
+}
+
+void TTenantsManager::ProcessOrDelayTx(ITransaction *tx,
+ const TActorContext &ctx)
+{
+ // We use this function to delay tx if we have to collect stats
+ // before tx execution.
+ if (Config.TotalComputationalUnitsLoadQuota) {
+ if (DelayedTxs.empty())
+ RequestTenantSlotsStats(ctx);
+ DelayedTxs.push(THolder<ITransaction>(tx));
+ } else {
+ TxProcessor->ProcessTx(tx, ctx);
+ }
+}
+
+void TTenantsManager::DbAddTenant(TTenant::TPtr tenant,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Add tenant " << tenant->Path << " to database"
+ << " state=" << tenant->State
+ << " coordinators=" << tenant->Coordinators
+ << " mediators=" << tenant->Mediators
+ << " planresolution=" << tenant->PlanResolution
+ << " timecastbucketspermediator=" << tenant->TimeCastBucketsPerMediator
+ << " issue=" << tenant->Issue
+ << " txid=" << tenant->TxId
+ << " subdomainversion=" << tenant->SubdomainVersion
+ << " confirmedsubdomain=" << tenant->ConfirmedSubdomain
+ << " attrs=" << tenant->Attributes.ShortDebugString()
+ << " generation=" << tenant->Generation
<< " errorcode=" << tenant->ErrorCode
<< " isExternalSubDomain=" << tenant->IsExternalSubdomain
<< " isExternalHive=" << tenant->IsExternalHive
<< " isExternalSysViewProcessor=" << tenant->IsExternalSysViewProcessor
<< " areResourcesShared=" << tenant->AreResourcesShared
<< " sharedDomainId=" << tenant->SharedDomainId);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Tenants>().Key(tenant->Path)
- .Update(NIceDb::TUpdate<Schema::Tenants::State>(tenant->State),
- NIceDb::TUpdate<Schema::Tenants::Coordinators>(tenant->Coordinators),
- NIceDb::TUpdate<Schema::Tenants::Mediators>(tenant->Mediators),
- NIceDb::TUpdate<Schema::Tenants::PlanResolution>(tenant->PlanResolution),
- NIceDb::TUpdate<Schema::Tenants::TimeCastBucketsPerMediator>(tenant->TimeCastBucketsPerMediator),
- NIceDb::TUpdate<Schema::Tenants::Issue>(tenant->Issue),
- NIceDb::TUpdate<Schema::Tenants::TxId>(tenant->TxId),
- NIceDb::TUpdate<Schema::Tenants::UserToken>(tenant->UserToken.SerializeAsString()),
- NIceDb::TUpdate<Schema::Tenants::SubdomainVersion>(tenant->SubdomainVersion),
- NIceDb::TUpdate<Schema::Tenants::ConfirmedSubdomain>(tenant->ConfirmedSubdomain),
- NIceDb::TUpdate<Schema::Tenants::Attributes>(tenant->Attributes),
- NIceDb::TUpdate<Schema::Tenants::Generation>(tenant->Generation),
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Tenants>().Key(tenant->Path)
+ .Update(NIceDb::TUpdate<Schema::Tenants::State>(tenant->State),
+ NIceDb::TUpdate<Schema::Tenants::Coordinators>(tenant->Coordinators),
+ NIceDb::TUpdate<Schema::Tenants::Mediators>(tenant->Mediators),
+ NIceDb::TUpdate<Schema::Tenants::PlanResolution>(tenant->PlanResolution),
+ NIceDb::TUpdate<Schema::Tenants::TimeCastBucketsPerMediator>(tenant->TimeCastBucketsPerMediator),
+ NIceDb::TUpdate<Schema::Tenants::Issue>(tenant->Issue),
+ NIceDb::TUpdate<Schema::Tenants::TxId>(tenant->TxId),
+ NIceDb::TUpdate<Schema::Tenants::UserToken>(tenant->UserToken.SerializeAsString()),
+ NIceDb::TUpdate<Schema::Tenants::SubdomainVersion>(tenant->SubdomainVersion),
+ NIceDb::TUpdate<Schema::Tenants::ConfirmedSubdomain>(tenant->ConfirmedSubdomain),
+ NIceDb::TUpdate<Schema::Tenants::Attributes>(tenant->Attributes),
+ NIceDb::TUpdate<Schema::Tenants::Generation>(tenant->Generation),
NIceDb::TUpdate<Schema::Tenants::ErrorCode>(tenant->ErrorCode),
NIceDb::TUpdate<Schema::Tenants::IsExternalSubDomain>(tenant->IsExternalSubdomain),
NIceDb::TUpdate<Schema::Tenants::IsExternalHive>(tenant->IsExternalHive),
NIceDb::TUpdate<Schema::Tenants::IsExternalSysViewProcessor>(tenant->IsExternalSysViewProcessor),
NIceDb::TUpdate<Schema::Tenants::AreResourcesShared>(tenant->AreResourcesShared),
NIceDb::TUpdate<Schema::Tenants::CreateIdempotencyKey>(tenant->CreateIdempotencyKey));
-
+
if (tenant->SharedDomainId) {
db.Table<Schema::Tenants>().Key(tenant->Path)
.Update(NIceDb::TUpdate<Schema::Tenants::SharedDomainSchemeShardId>(tenant->SharedDomainId.OwnerId),
@@ -2293,36 +2293,36 @@ void TTenantsManager::DbAddTenant(TTenant::TPtr tenant,
.Update(NIceDb::TUpdate<Schema::Tenants::DatabaseQuotas>(serialized));
}
- for (auto &pr : tenant->StoragePools) {
- auto &pool = *pr.second;
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Add tenant pool " << pool.Config.GetName() << " to database"
- << " kind=" << pool.Kind
- << " config=" << pool.Config.ShortDebugString()
- << " allocatednumgroups=" << pool.AllocatedNumGroups
- << " state=" << pool.State);
-
- TString config;
+ for (auto &pr : tenant->StoragePools) {
+ auto &pool = *pr.second;
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Add tenant pool " << pool.Config.GetName() << " to database"
+ << " kind=" << pool.Kind
+ << " config=" << pool.Config.ShortDebugString()
+ << " allocatednumgroups=" << pool.AllocatedNumGroups
+ << " state=" << pool.State);
+
+ TString config;
Y_PROTOBUF_SUPPRESS_NODISCARD pool.Config.SerializeToString(&config);
- db.Table<Schema::TenantPools>().Key(tenant->Path, pool.Kind)
- .Update(NIceDb::TUpdate<Schema::TenantPools::Config>(config),
- NIceDb::TUpdate<Schema::TenantPools::AllocatedNumGroups>(pool.AllocatedNumGroups),
- NIceDb::TUpdate<Schema::TenantPools::State>((ui32)pool.State));
- }
-
- for (auto &pr : tenant->ComputationalUnits) {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Add computational unit for " << tenant->Path << " to database"
- << " kind=" << pr.first.first
- << " zone=" << pr.first.second
- << " count=" << pr.second);
-
- db.Table<Schema::TenantUnits>().Key(tenant->Path, pr.first.first, pr.first.second)
- .Update(NIceDb::TUpdate<Schema::TenantUnits::Count>(pr.second));
- }
-}
-
+ db.Table<Schema::TenantPools>().Key(tenant->Path, pool.Kind)
+ .Update(NIceDb::TUpdate<Schema::TenantPools::Config>(config),
+ NIceDb::TUpdate<Schema::TenantPools::AllocatedNumGroups>(pool.AllocatedNumGroups),
+ NIceDb::TUpdate<Schema::TenantPools::State>((ui32)pool.State));
+ }
+
+ for (auto &pr : tenant->ComputationalUnits) {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Add computational unit for " << tenant->Path << " to database"
+ << " kind=" << pr.first.first
+ << " zone=" << pr.first.second
+ << " count=" << pr.second);
+
+ db.Table<Schema::TenantUnits>().Key(tenant->Path, pr.first.first, pr.first.second)
+ .Update(NIceDb::TUpdate<Schema::TenantUnits::Count>(pr.second));
+ }
+}
+
template <typename SchemeShardIdColumn, typename PathIdColumn, typename TRowSet>
static TTenantsManager::TDomainId LoadDomainId(const TRowSet& rowset) {
const ui64 schemeShardId = rowset.template GetValueOrDefault<SchemeShardIdColumn>(0);
@@ -2335,66 +2335,66 @@ static TTenantsManager::TDomainId LoadDomainId(const TRowSet& rowset) {
return TTenantsManager::TDomainId(schemeShardId, pathId);
}
-bool TTenantsManager::DbLoadState(TTransactionContext &txc, const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "Loading tenants state");
-
- NIceDb::TNiceDb db(txc.DB);
- auto tenantRowset = db.Table<Schema::Tenants>().Range().Select<Schema::Tenants::TColumns>();
- auto removedRowset = db.Table<Schema::RemovedTenants>().Range().Select<Schema::RemovedTenants::TColumns>();
- auto poolRowset = db.Table<Schema::TenantPools>().Range().Select<Schema::TenantPools::TColumns>();
- auto slotRowset = db.Table<Schema::TenantUnits>().Range().Select<Schema::TenantUnits::TColumns>();
- auto registeredRowset = db.Table<Schema::RegisteredUnits>().Range().Select<Schema::RegisteredUnits::TColumns>();
-
- if (!tenantRowset.IsReady()
- || !removedRowset.IsReady()
- || !poolRowset.IsReady()
- || !slotRowset.IsReady()
- || !registeredRowset.IsReady())
- return false;
-
- while (!tenantRowset.EndOfSet()) {
- TString path = tenantRowset.GetValue<Schema::Tenants::Path>();
- TTenant::EState state = static_cast<TTenant::EState>(tenantRowset.GetValue<Schema::Tenants::State>());
- ui64 coordinators = tenantRowset.GetValue<Schema::Tenants::Coordinators>();
- ui64 mediators = tenantRowset.GetValue<Schema::Tenants::Mediators>();
- ui64 planResolution = tenantRowset.GetValue<Schema::Tenants::PlanResolution>();
- ui32 timeCastBucketsPerMediator = tenantRowset.GetValue<Schema::Tenants::TimeCastBucketsPerMediator>();
- ui64 txId = tenantRowset.GetValue<Schema::Tenants::TxId>();
- TString userToken = tenantRowset.GetValue<Schema::Tenants::UserToken>();
- ui64 subdomainVersion = tenantRowset.GetValueOrDefault<Schema::Tenants::SubdomainVersion>(1);
- ui64 confirmedSubdomain = tenantRowset.GetValueOrDefault<Schema::Tenants::ConfirmedSubdomain>(0);
+bool TTenantsManager::DbLoadState(TTransactionContext &txc, const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::CMS_TENANTS, "Loading tenants state");
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto tenantRowset = db.Table<Schema::Tenants>().Range().Select<Schema::Tenants::TColumns>();
+ auto removedRowset = db.Table<Schema::RemovedTenants>().Range().Select<Schema::RemovedTenants::TColumns>();
+ auto poolRowset = db.Table<Schema::TenantPools>().Range().Select<Schema::TenantPools::TColumns>();
+ auto slotRowset = db.Table<Schema::TenantUnits>().Range().Select<Schema::TenantUnits::TColumns>();
+ auto registeredRowset = db.Table<Schema::RegisteredUnits>().Range().Select<Schema::RegisteredUnits::TColumns>();
+
+ if (!tenantRowset.IsReady()
+ || !removedRowset.IsReady()
+ || !poolRowset.IsReady()
+ || !slotRowset.IsReady()
+ || !registeredRowset.IsReady())
+ return false;
+
+ while (!tenantRowset.EndOfSet()) {
+ TString path = tenantRowset.GetValue<Schema::Tenants::Path>();
+ TTenant::EState state = static_cast<TTenant::EState>(tenantRowset.GetValue<Schema::Tenants::State>());
+ ui64 coordinators = tenantRowset.GetValue<Schema::Tenants::Coordinators>();
+ ui64 mediators = tenantRowset.GetValue<Schema::Tenants::Mediators>();
+ ui64 planResolution = tenantRowset.GetValue<Schema::Tenants::PlanResolution>();
+ ui32 timeCastBucketsPerMediator = tenantRowset.GetValue<Schema::Tenants::TimeCastBucketsPerMediator>();
+ ui64 txId = tenantRowset.GetValue<Schema::Tenants::TxId>();
+ TString userToken = tenantRowset.GetValue<Schema::Tenants::UserToken>();
+ ui64 subdomainVersion = tenantRowset.GetValueOrDefault<Schema::Tenants::SubdomainVersion>(1);
+ ui64 confirmedSubdomain = tenantRowset.GetValueOrDefault<Schema::Tenants::ConfirmedSubdomain>(0);
NKikimrSchemeOp::TAlterUserAttributes attrs = tenantRowset.GetValueOrDefault<Schema::Tenants::Attributes>({});
- ui64 generation = tenantRowset.GetValueOrDefault<Schema::Tenants::Generation>(1);
+ ui64 generation = tenantRowset.GetValueOrDefault<Schema::Tenants::Generation>(1);
const TDomainId domainId = LoadDomainId<Schema::Tenants::SchemeShardId, Schema::Tenants::PathId>(tenantRowset);
const TDomainId sharedDomainId = LoadDomainId<Schema::Tenants::SharedDomainSchemeShardId, Schema::Tenants::SharedDomainPathId>(tenantRowset);
- TString issue = tenantRowset.GetValueOrDefault<Schema::Tenants::Issue>("");
- Ydb::StatusIds::StatusCode errorCode
- = static_cast<Ydb::StatusIds::StatusCode>(tenantRowset.GetValueOrDefault<Schema::Tenants::ErrorCode>(0));
+ TString issue = tenantRowset.GetValueOrDefault<Schema::Tenants::Issue>("");
+ Ydb::StatusIds::StatusCode errorCode
+ = static_cast<Ydb::StatusIds::StatusCode>(tenantRowset.GetValueOrDefault<Schema::Tenants::ErrorCode>(0));
bool isExternalSubDomain = tenantRowset.GetValueOrDefault<Schema::Tenants::IsExternalSubDomain>(false);
bool isExternalHive = tenantRowset.GetValueOrDefault<Schema::Tenants::IsExternalHive>(false);
bool isExternalSysViewProcessor = tenantRowset.GetValueOrDefault<Schema::Tenants::IsExternalSysViewProcessor>(false);
const bool areResourcesShared = tenantRowset.GetValueOrDefault<Schema::Tenants::AreResourcesShared>(false);
-
- TTenant::TPtr tenant = new TTenant(path, state, userToken);
- tenant->Coordinators = coordinators;
- tenant->Mediators = mediators;
- tenant->PlanResolution = planResolution;
- tenant->TimeCastBucketsPerMediator = timeCastBucketsPerMediator;
- tenant->TxId = txId;
- tenant->SubdomainVersion = subdomainVersion;
- tenant->ConfirmedSubdomain = confirmedSubdomain;
- tenant->Attributes.CopyFrom(attrs);
- tenant->Generation = generation;
+
+ TTenant::TPtr tenant = new TTenant(path, state, userToken);
+ tenant->Coordinators = coordinators;
+ tenant->Mediators = mediators;
+ tenant->PlanResolution = planResolution;
+ tenant->TimeCastBucketsPerMediator = timeCastBucketsPerMediator;
+ tenant->TxId = txId;
+ tenant->SubdomainVersion = subdomainVersion;
+ tenant->ConfirmedSubdomain = confirmedSubdomain;
+ tenant->Attributes.CopyFrom(attrs);
+ tenant->Generation = generation;
tenant->DomainId = domainId;
tenant->SharedDomainId = sharedDomainId;
- tenant->ErrorCode = errorCode;
- tenant->Issue = issue;
+ tenant->ErrorCode = errorCode;
+ tenant->Issue = issue;
tenant->IsExternalSubdomain = isExternalSubDomain;
tenant->IsExternalHive = isExternalHive;
tenant->IsExternalSysViewProcessor = isExternalSysViewProcessor;
tenant->AreResourcesShared = areResourcesShared;
-
+
if (tenantRowset.HaveValue<Schema::Tenants::SchemaOperationQuotas>()) {
auto& deserialized = tenant->SchemaOperationQuotas.ConstructInPlace();
Y_VERIFY(ParseFromStringNoSizeLimit(deserialized, tenantRowset.GetValue<Schema::Tenants::SchemaOperationQuotas>()));
@@ -2413,14 +2413,14 @@ bool TTenantsManager::DbLoadState(TTransactionContext &txc, const TActorContext
tenant->AlterIdempotencyKey = tenantRowset.GetValue<Schema::Tenants::AlterIdempotencyKey>();
}
- AddTenant(tenant);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "Loaded tenant " << path);
-
- if (!tenantRowset.Next())
- return false;
- }
-
+ AddTenant(tenant);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS, "Loaded tenant " << path);
+
+ if (!tenantRowset.Next())
+ return false;
+ }
+
for (auto [_, tenant] : Tenants) {
if (!tenant->SharedDomainId) {
continue;
@@ -2431,324 +2431,324 @@ bool TTenantsManager::DbLoadState(TTransactionContext &txc, const TActorContext
sharedTenant->HostedTenants.emplace(tenant);
}
- while (!removedRowset.EndOfSet()) {
- TRemovedTenant tenant;
- tenant.Path = removedRowset.GetValue<Schema::RemovedTenants::Path>();
- tenant.TxId = removedRowset.GetValue<Schema::RemovedTenants::TxId>();
- tenant.Issue = removedRowset.GetValue<Schema::RemovedTenants::Issue>();
- tenant.Code = static_cast<Ydb::StatusIds::StatusCode>(removedRowset.GetValueOrDefault<Schema::RemovedTenants::Code>(Ydb::StatusIds::SUCCESS));
- tenant.ErrorCode = static_cast<Ydb::StatusIds::StatusCode>(removedRowset.GetValueOrDefault<Schema::RemovedTenants::ErrorCode>(0));
+ while (!removedRowset.EndOfSet()) {
+ TRemovedTenant tenant;
+ tenant.Path = removedRowset.GetValue<Schema::RemovedTenants::Path>();
+ tenant.TxId = removedRowset.GetValue<Schema::RemovedTenants::TxId>();
+ tenant.Issue = removedRowset.GetValue<Schema::RemovedTenants::Issue>();
+ tenant.Code = static_cast<Ydb::StatusIds::StatusCode>(removedRowset.GetValueOrDefault<Schema::RemovedTenants::Code>(Ydb::StatusIds::SUCCESS));
+ tenant.ErrorCode = static_cast<Ydb::StatusIds::StatusCode>(removedRowset.GetValueOrDefault<Schema::RemovedTenants::ErrorCode>(0));
tenant.CreateIdempotencyKey = removedRowset.GetValueOrDefault<Schema::RemovedTenants::CreateIdempotencyKey>(TString());
-
- RemovedTenants[tenant.Path] = tenant;
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "Loaded removed tenant " << tenant.Path << " (txid = " << tenant.TxId << ")");
-
- if (!removedRowset.Next())
- return false;
- }
-
- while (!poolRowset.EndOfSet()) {
- TString path = poolRowset.GetValue<Schema::TenantPools::Tenant>();
- TString type = poolRowset.GetValue<Schema::TenantPools::PoolType>();
- TString configVal = poolRowset.GetValue<Schema::TenantPools::Config>();
- ui32 allocated = poolRowset.GetValue<Schema::TenantPools::AllocatedNumGroups>();
- ui32 stateVal = poolRowset.GetValue<Schema::TenantPools::State>();
- TStoragePool::EState state = static_cast<TStoragePool::EState>(stateVal);
-
- NKikimrBlobStorage::TDefineStoragePool config;
+
+ RemovedTenants[tenant.Path] = tenant;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Loaded removed tenant " << tenant.Path << " (txid = " << tenant.TxId << ")");
+
+ if (!removedRowset.Next())
+ return false;
+ }
+
+ while (!poolRowset.EndOfSet()) {
+ TString path = poolRowset.GetValue<Schema::TenantPools::Tenant>();
+ TString type = poolRowset.GetValue<Schema::TenantPools::PoolType>();
+ TString configVal = poolRowset.GetValue<Schema::TenantPools::Config>();
+ ui32 allocated = poolRowset.GetValue<Schema::TenantPools::AllocatedNumGroups>();
+ ui32 stateVal = poolRowset.GetValue<Schema::TenantPools::State>();
+ TStoragePool::EState state = static_cast<TStoragePool::EState>(stateVal);
+
+ NKikimrBlobStorage::TDefineStoragePool config;
Y_PROTOBUF_SUPPRESS_NODISCARD config.ParseFromArray(configVal.data(), configVal.size());
-
- TStoragePool::TPtr pool = new TStoragePool(type, config);
- pool->AllocatedNumGroups = allocated;
- pool->State = state;
-
- auto tenant = GetTenant(path);
+
+ TStoragePool::TPtr pool = new TStoragePool(type, config);
+ pool->AllocatedNumGroups = allocated;
+ pool->State = state;
+
+ auto tenant = GetTenant(path);
Y_VERIFY_DEBUG(tenant, "loaded pool for unknown tenant %s", path.data());
- if (tenant) {
- tenant->StoragePools[type] = pool;
-
- Counters.Inc(pool->Kind, COUNTER_REQUESTED_STORAGE_UNITS, pool->GetGroups());
- Counters.Inc(pool->Kind, COUNTER_ALLOCATED_STORAGE_UNITS, pool->AllocatedNumGroups);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "Loaded pool " << pool->Config.GetName() << " for " << path);
- } else {
- LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
- "Loaded pool " << pool->Config.GetName() << " for unknown tenant " << path);
- }
-
- if (!poolRowset.Next())
- return false;
- }
-
- while (!slotRowset.EndOfSet()) {
- TString path = slotRowset.GetValue<Schema::TenantUnits::Tenant>();
- TString kind = slotRowset.GetValue<Schema::TenantUnits::UnitKind>();
- TString zone = slotRowset.GetValue<Schema::TenantUnits::AvailabilityZone>();
- ui64 count = slotRowset.GetValue<Schema::TenantUnits::Count>();
-
- auto tenant = GetTenant(path);
- Y_VERIFY_DEBUG(tenant, "loaded units <%s, %s>(%" PRIu64 ") for unknown tenant %s",
+ if (tenant) {
+ tenant->StoragePools[type] = pool;
+
+ Counters.Inc(pool->Kind, COUNTER_REQUESTED_STORAGE_UNITS, pool->GetGroups());
+ Counters.Inc(pool->Kind, COUNTER_ALLOCATED_STORAGE_UNITS, pool->AllocatedNumGroups);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Loaded pool " << pool->Config.GetName() << " for " << path);
+ } else {
+ LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Loaded pool " << pool->Config.GetName() << " for unknown tenant " << path);
+ }
+
+ if (!poolRowset.Next())
+ return false;
+ }
+
+ while (!slotRowset.EndOfSet()) {
+ TString path = slotRowset.GetValue<Schema::TenantUnits::Tenant>();
+ TString kind = slotRowset.GetValue<Schema::TenantUnits::UnitKind>();
+ TString zone = slotRowset.GetValue<Schema::TenantUnits::AvailabilityZone>();
+ ui64 count = slotRowset.GetValue<Schema::TenantUnits::Count>();
+
+ auto tenant = GetTenant(path);
+ Y_VERIFY_DEBUG(tenant, "loaded units <%s, %s>(%" PRIu64 ") for unknown tenant %s",
kind.data(), zone.data(), count, path.data());
- if (tenant) {
- tenant->ComputationalUnits[std::make_pair(kind, zone)] = count;
-
- Counters.Inc(kind, zone, COUNTER_COMPUTATIONAL_UNITS, count);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "Loaded units <" << kind << ", " << zone << ">("
- << count << ") for tenant " << path);
- } else {
- LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
- "Loaded units <" << kind << ", " << zone << ">("
- << count << ") for unknown tenant " << path);
- }
-
- if (!slotRowset.Next())
- return false;
- }
-
- while (!registeredRowset.EndOfSet()) {
- TString path = registeredRowset.GetValue<Schema::RegisteredUnits::Tenant>();
- TString host = registeredRowset.GetValue<Schema::RegisteredUnits::Host>();
- ui32 port = registeredRowset.GetValue<Schema::RegisteredUnits::Port>();
- TString kind = registeredRowset.GetValue<Schema::RegisteredUnits::Kind>();
-
- auto tenant = GetTenant(path);
- Y_VERIFY_DEBUG(tenant, "loaded registered unit %s:%" PRIu32 " for unknown tenant %s",
+ if (tenant) {
+ tenant->ComputationalUnits[std::make_pair(kind, zone)] = count;
+
+ Counters.Inc(kind, zone, COUNTER_COMPUTATIONAL_UNITS, count);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Loaded units <" << kind << ", " << zone << ">("
+ << count << ") for tenant " << path);
+ } else {
+ LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Loaded units <" << kind << ", " << zone << ">("
+ << count << ") for unknown tenant " << path);
+ }
+
+ if (!slotRowset.Next())
+ return false;
+ }
+
+ while (!registeredRowset.EndOfSet()) {
+ TString path = registeredRowset.GetValue<Schema::RegisteredUnits::Tenant>();
+ TString host = registeredRowset.GetValue<Schema::RegisteredUnits::Host>();
+ ui32 port = registeredRowset.GetValue<Schema::RegisteredUnits::Port>();
+ TString kind = registeredRowset.GetValue<Schema::RegisteredUnits::Kind>();
+
+ auto tenant = GetTenant(path);
+ Y_VERIFY_DEBUG(tenant, "loaded registered unit %s:%" PRIu32 " for unknown tenant %s",
host.data(), port, path.data());
- if (tenant) {
- TAllocatedComputationalUnit unit{host, port, kind};
- tenant->RegisteredComputationalUnits[std::make_pair(host, port)] = unit;
-
- Counters.Inc(kind, COUNTER_REGISTERED_UNITS);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "Loaded registered unit " << host << ":" << port << " of kind "
- << kind << " for tenant " << path);
- } else {
- LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
- "Loaded registered unit " << host << ":" << port << " of kind "
- << kind << " for unknown tenant " << path);
- }
-
- if (!registeredRowset.Next())
- return false;
- }
-
- for (auto &pr: Tenants) {
- pr.second->ParseComputationalUnits(Config);
- SlotStats.AllocateSlots(pr.second->Slots);
- }
-
- return true;
-}
-
-void TTenantsManager::DbRemoveComputationalUnit(TTenant::TPtr tenant,
- const TString &kind,
- const TString &zone,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Remove computational unit of " << tenant->Path << " from database"
- << " kind=" << kind
- << " zone=" << zone);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::TenantUnits>().Key(tenant->Path, kind, zone).Delete();
-}
-
-void TTenantsManager::DbUpdateConfirmedSubdomain(TTenant::TPtr tenant,
- ui64 version,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Update database for " << tenant->Path
- << " confirmedsubdomain=" << version);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Tenants>().Key(tenant->Path)
- .Update(NIceDb::TUpdate<Schema::Tenants::ConfirmedSubdomain>(version));
-}
-
-void TTenantsManager::DbRemoveComputationalUnits(TTenant::TPtr tenant,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Remove computational units of " << tenant->Path << " from database"
- << " txid=" << tenant->TxId
- << " issue=" << tenant->Issue);
-
- NIceDb::TNiceDb db(txc.DB);
- for (auto &pr : tenant->ComputationalUnits)
- db.Table<Schema::TenantUnits>().Key(tenant->Path, pr.first.first, pr.first.second).Delete();
- for (auto &pr : tenant->RegisteredComputationalUnits)
- db.Table<Schema::RegisteredUnits>().Key(tenant->Path, pr.first.first, pr.first.second).Delete();
-}
-
-void TTenantsManager::DbRemoveRegisteredUnit(TTenant::TPtr tenant,
- const TString &host,
- ui32 port,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Remove registered computational unit for " << tenant->Path << " from database"
- << " host=" << host
- << " port=" << port);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::RegisteredUnits>().Key(tenant->Path, host, port).Delete();
-}
-
-void TTenantsManager::DbRemoveTenantAndPools(TTenant::TPtr tenant,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Remove tenant " << tenant->Path << " from database"
- << " txid=" << tenant->TxId
- << " issue=" << tenant->Issue);
-
- NIceDb::TNiceDb db(txc.DB);
- for (auto &pr : tenant->StoragePools) {
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Remove pool " << pr.second->Config.GetName() << " from database");
- db.Table<Schema::TenantPools>().Key(tenant->Path, pr.second->Kind).Delete();
- }
- db.Table<Schema::Tenants>().Key(tenant->Path).Delete();
-}
-
-void TTenantsManager::DbUpdateComputationalUnit(TTenant::TPtr tenant,
- const TString &kind,
- const TString &zone,
- ui64 count,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Remove computational unit of " << tenant->Path << " from database"
- << " kind=" << kind
- << " zone=" << zone
- << " count=" << count);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::TenantUnits>().Key(tenant->Path, kind, zone)
- .Update(NIceDb::TUpdate<Schema::TenantUnits::Count>(count));
-}
-
-void TTenantsManager::DbUpdatePool(TTenant::TPtr tenant,
- TStoragePool::TPtr pool,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Update database for pool " << pool->Config.GetName()
- << " config=" << pool->Config.ShortDebugString()
- << " state=" << pool->State);
-
- TString config;
+ if (tenant) {
+ TAllocatedComputationalUnit unit{host, port, kind};
+ tenant->RegisteredComputationalUnits[std::make_pair(host, port)] = unit;
+
+ Counters.Inc(kind, COUNTER_REGISTERED_UNITS);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Loaded registered unit " << host << ":" << port << " of kind "
+ << kind << " for tenant " << path);
+ } else {
+ LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Loaded registered unit " << host << ":" << port << " of kind "
+ << kind << " for unknown tenant " << path);
+ }
+
+ if (!registeredRowset.Next())
+ return false;
+ }
+
+ for (auto &pr: Tenants) {
+ pr.second->ParseComputationalUnits(Config);
+ SlotStats.AllocateSlots(pr.second->Slots);
+ }
+
+ return true;
+}
+
+void TTenantsManager::DbRemoveComputationalUnit(TTenant::TPtr tenant,
+ const TString &kind,
+ const TString &zone,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Remove computational unit of " << tenant->Path << " from database"
+ << " kind=" << kind
+ << " zone=" << zone);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::TenantUnits>().Key(tenant->Path, kind, zone).Delete();
+}
+
+void TTenantsManager::DbUpdateConfirmedSubdomain(TTenant::TPtr tenant,
+ ui64 version,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Update database for " << tenant->Path
+ << " confirmedsubdomain=" << version);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Tenants>().Key(tenant->Path)
+ .Update(NIceDb::TUpdate<Schema::Tenants::ConfirmedSubdomain>(version));
+}
+
+void TTenantsManager::DbRemoveComputationalUnits(TTenant::TPtr tenant,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Remove computational units of " << tenant->Path << " from database"
+ << " txid=" << tenant->TxId
+ << " issue=" << tenant->Issue);
+
+ NIceDb::TNiceDb db(txc.DB);
+ for (auto &pr : tenant->ComputationalUnits)
+ db.Table<Schema::TenantUnits>().Key(tenant->Path, pr.first.first, pr.first.second).Delete();
+ for (auto &pr : tenant->RegisteredComputationalUnits)
+ db.Table<Schema::RegisteredUnits>().Key(tenant->Path, pr.first.first, pr.first.second).Delete();
+}
+
+void TTenantsManager::DbRemoveRegisteredUnit(TTenant::TPtr tenant,
+ const TString &host,
+ ui32 port,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Remove registered computational unit for " << tenant->Path << " from database"
+ << " host=" << host
+ << " port=" << port);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::RegisteredUnits>().Key(tenant->Path, host, port).Delete();
+}
+
+void TTenantsManager::DbRemoveTenantAndPools(TTenant::TPtr tenant,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Remove tenant " << tenant->Path << " from database"
+ << " txid=" << tenant->TxId
+ << " issue=" << tenant->Issue);
+
+ NIceDb::TNiceDb db(txc.DB);
+ for (auto &pr : tenant->StoragePools) {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Remove pool " << pr.second->Config.GetName() << " from database");
+ db.Table<Schema::TenantPools>().Key(tenant->Path, pr.second->Kind).Delete();
+ }
+ db.Table<Schema::Tenants>().Key(tenant->Path).Delete();
+}
+
+void TTenantsManager::DbUpdateComputationalUnit(TTenant::TPtr tenant,
+ const TString &kind,
+ const TString &zone,
+ ui64 count,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Remove computational unit of " << tenant->Path << " from database"
+ << " kind=" << kind
+ << " zone=" << zone
+ << " count=" << count);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::TenantUnits>().Key(tenant->Path, kind, zone)
+ .Update(NIceDb::TUpdate<Schema::TenantUnits::Count>(count));
+}
+
+void TTenantsManager::DbUpdatePool(TTenant::TPtr tenant,
+ TStoragePool::TPtr pool,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Update database for pool " << pool->Config.GetName()
+ << " config=" << pool->Config.ShortDebugString()
+ << " state=" << pool->State);
+
+ TString config;
Y_PROTOBUF_SUPPRESS_NODISCARD pool->Config.SerializeToString(&config);
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::TenantPools>().Key(tenant->Path, pool->Kind)
- .Update(NIceDb::TUpdate<Schema::TenantPools::Config>(config),
- NIceDb::TUpdate<Schema::TenantPools::State>((ui32)pool->State));
-}
-
-void TTenantsManager::DbUpdatePoolConfig(TTenant::TPtr tenant,
- TStoragePool::TPtr pool,
- const NKikimrBlobStorage::TDefineStoragePool &config,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Update pool config in database for " << pool->Config.GetName()
- << " config=" << config.ShortDebugString());
-
- TString val;
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::TenantPools>().Key(tenant->Path, pool->Kind)
+ .Update(NIceDb::TUpdate<Schema::TenantPools::Config>(config),
+ NIceDb::TUpdate<Schema::TenantPools::State>((ui32)pool->State));
+}
+
+void TTenantsManager::DbUpdatePoolConfig(TTenant::TPtr tenant,
+ TStoragePool::TPtr pool,
+ const NKikimrBlobStorage::TDefineStoragePool &config,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Update pool config in database for " << pool->Config.GetName()
+ << " config=" << config.ShortDebugString());
+
+ TString val;
Y_PROTOBUF_SUPPRESS_NODISCARD config.SerializeToString(&val);
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::TenantPools>().Key(tenant->Path, pool->Kind)
- .Update<Schema::TenantPools::Config>(val);
-}
-
-void TTenantsManager::DbUpdatePoolState(TTenant::TPtr tenant,
- TStoragePool::TPtr pool,
- TStoragePool::EState state,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Update pool state in database for " << pool->Config.GetName()
- << " state=" << state);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::TenantPools>().Key(tenant->Path, pool->Kind)
- .Update<Schema::TenantPools::State>((ui32)state);
-}
-
-void TTenantsManager::DbUpdatePoolState(TTenant::TPtr tenant,
- TStoragePool::TPtr pool,
- TStoragePool::EState state,
- ui32 allocatedNumGroups,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Update pool state in database for " << pool->Config.GetName()
- << " state=" << state
- << " allocatednumgroups=" << allocatedNumGroups);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::TenantPools>().Key(tenant->Path, pool->Kind)
- .Update(NIceDb::TUpdate<Schema::TenantPools::AllocatedNumGroups>(allocatedNumGroups),
- NIceDb::TUpdate<Schema::TenantPools::State>((ui32)state));
-}
-
-void TTenantsManager::DbUpdateRegisteredUnit(TTenant::TPtr tenant,
- const TString &host,
- ui32 port,
- const TString &kind,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Update registered computational unit for " << tenant->Path << " in database"
- << " host=" << host
- << " port=" << port
- << " kind=" << kind);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::RegisteredUnits>().Key(tenant->Path, host, port)
- .Update(NIceDb::TUpdate<Schema::RegisteredUnits::Kind>(kind));
-}
-
-void TTenantsManager::DbUpdateRemovedTenant(TTenant::TPtr tenant,
- Ydb::StatusIds::StatusCode code,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Add tenant removal info for " << tenant->Path
- << " txid=" << tenant->TxId
- << " code=" << code
- << " errorcode=" << tenant->ErrorCode
- << " issue=" << tenant->Issue);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::RemovedTenants>().Key(tenant->Path)
- .Update<Schema::RemovedTenants::TxId>(tenant->TxId)
- .Update<Schema::RemovedTenants::Issue>(tenant->Issue)
- .Update<Schema::RemovedTenants::Code>(code)
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::TenantPools>().Key(tenant->Path, pool->Kind)
+ .Update<Schema::TenantPools::Config>(val);
+}
+
+void TTenantsManager::DbUpdatePoolState(TTenant::TPtr tenant,
+ TStoragePool::TPtr pool,
+ TStoragePool::EState state,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Update pool state in database for " << pool->Config.GetName()
+ << " state=" << state);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::TenantPools>().Key(tenant->Path, pool->Kind)
+ .Update<Schema::TenantPools::State>((ui32)state);
+}
+
+void TTenantsManager::DbUpdatePoolState(TTenant::TPtr tenant,
+ TStoragePool::TPtr pool,
+ TStoragePool::EState state,
+ ui32 allocatedNumGroups,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Update pool state in database for " << pool->Config.GetName()
+ << " state=" << state
+ << " allocatednumgroups=" << allocatedNumGroups);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::TenantPools>().Key(tenant->Path, pool->Kind)
+ .Update(NIceDb::TUpdate<Schema::TenantPools::AllocatedNumGroups>(allocatedNumGroups),
+ NIceDb::TUpdate<Schema::TenantPools::State>((ui32)state));
+}
+
+void TTenantsManager::DbUpdateRegisteredUnit(TTenant::TPtr tenant,
+ const TString &host,
+ ui32 port,
+ const TString &kind,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Update registered computational unit for " << tenant->Path << " in database"
+ << " host=" << host
+ << " port=" << port
+ << " kind=" << kind);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::RegisteredUnits>().Key(tenant->Path, host, port)
+ .Update(NIceDb::TUpdate<Schema::RegisteredUnits::Kind>(kind));
+}
+
+void TTenantsManager::DbUpdateRemovedTenant(TTenant::TPtr tenant,
+ Ydb::StatusIds::StatusCode code,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Add tenant removal info for " << tenant->Path
+ << " txid=" << tenant->TxId
+ << " code=" << code
+ << " errorcode=" << tenant->ErrorCode
+ << " issue=" << tenant->Issue);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::RemovedTenants>().Key(tenant->Path)
+ .Update<Schema::RemovedTenants::TxId>(tenant->TxId)
+ .Update<Schema::RemovedTenants::Issue>(tenant->Issue)
+ .Update<Schema::RemovedTenants::Code>(code)
.Update<Schema::RemovedTenants::ErrorCode>(tenant->ErrorCode)
.Update<Schema::RemovedTenants::CreateIdempotencyKey>(tenant->CreateIdempotencyKey);
-}
-
+}
+
void TTenantsManager::DbUpdateTenantAlterIdempotencyKey(TTenant::TPtr tenant,
const TString &idempotencyKey,
TTransactionContext &txc,
@@ -2777,84 +2777,84 @@ void TTenantsManager::DbUpdateTenantUserAttributes(TTenant::TPtr tenant,
.Update<Schema::Tenants::Attributes>(attributes);
}
-void TTenantsManager::DbUpdateTenantGeneration(TTenant::TPtr tenant,
- ui64 generation,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Update generation for " << tenant->Path
- << " generation=" << generation);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Tenants>().Key(tenant->Path)
- .Update<Schema::Tenants::Generation>(generation);
-}
-
-void TTenantsManager::DbUpdateTenantState(TTenant::TPtr tenant,
- TTenant::EState state,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Update tenant state in database for " << tenant->Path
- << " state=" << state
- << " txid=" << tenant->TxId
- << " errorcode=" << tenant->ErrorCode
- << " issue=" << tenant->Issue);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Tenants>().Key(tenant->Path)
- .Update(NIceDb::TUpdate<Schema::Tenants::State>(state),
- NIceDb::TUpdate<Schema::Tenants::TxId>(tenant->TxId),
- NIceDb::TUpdate<Schema::Tenants::Issue>(tenant->Issue),
- NIceDb::TUpdate<Schema::Tenants::ErrorCode>(tenant->ErrorCode));
-}
-
-void TTenantsManager::DbUpdateTenantSubdomain(TTenant::TPtr tenant,
- ui64 schemeShardId,
- ui64 pathId,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Update tenant subdomain in database for " << tenant->Path
- << " schemeshardid=" << schemeShardId
- << " pathid=" << pathId);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Tenants>().Key(tenant->Path)
- .Update<Schema::Tenants::SchemeShardId>(schemeShardId)
- .Update<Schema::Tenants::PathId>(pathId);
-}
-
-void TTenantsManager::DbUpdateTenantUserToken(TTenant::TPtr tenant,
- const TString &userToken,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+void TTenantsManager::DbUpdateTenantGeneration(TTenant::TPtr tenant,
+ ui64 generation,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Update generation for " << tenant->Path
+ << " generation=" << generation);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Tenants>().Key(tenant->Path)
+ .Update<Schema::Tenants::Generation>(generation);
+}
+
+void TTenantsManager::DbUpdateTenantState(TTenant::TPtr tenant,
+ TTenant::EState state,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Update tenant state in database for " << tenant->Path
+ << " state=" << state
+ << " txid=" << tenant->TxId
+ << " errorcode=" << tenant->ErrorCode
+ << " issue=" << tenant->Issue);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Tenants>().Key(tenant->Path)
+ .Update(NIceDb::TUpdate<Schema::Tenants::State>(state),
+ NIceDb::TUpdate<Schema::Tenants::TxId>(tenant->TxId),
+ NIceDb::TUpdate<Schema::Tenants::Issue>(tenant->Issue),
+ NIceDb::TUpdate<Schema::Tenants::ErrorCode>(tenant->ErrorCode));
+}
+
+void TTenantsManager::DbUpdateTenantSubdomain(TTenant::TPtr tenant,
+ ui64 schemeShardId,
+ ui64 pathId,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Update tenant subdomain in database for " << tenant->Path
+ << " schemeshardid=" << schemeShardId
+ << " pathid=" << pathId);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Tenants>().Key(tenant->Path)
+ .Update<Schema::Tenants::SchemeShardId>(schemeShardId)
+ .Update<Schema::Tenants::PathId>(pathId);
+}
+
+void TTenantsManager::DbUpdateTenantUserToken(TTenant::TPtr tenant,
+ const TString &userToken,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
"Update user token in database for " << tenant->Path);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Tenants>().Key(tenant->Path)
- .Update(NIceDb::TUpdate<Schema::Tenants::UserToken>(userToken));
-}
-
-void TTenantsManager::DbUpdateSubdomainVersion(TTenant::TPtr tenant,
- ui64 version,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Update subdomain version in database for " << tenant->Path
- << " subdomainversion=" << version);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Tenants>().Key(tenant->Path)
- .Update(NIceDb::TUpdate<Schema::Tenants::SubdomainVersion>(version));
-}
-
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Tenants>().Key(tenant->Path)
+ .Update(NIceDb::TUpdate<Schema::Tenants::UserToken>(userToken));
+}
+
+void TTenantsManager::DbUpdateSubdomainVersion(TTenant::TPtr tenant,
+ ui64 version,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Update subdomain version in database for " << tenant->Path
+ << " subdomainversion=" << version);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Tenants>().Key(tenant->Path)
+ .Update(NIceDb::TUpdate<Schema::Tenants::SubdomainVersion>(version));
+}
+
void TTenantsManager::DbUpdateSchemaOperationQuotas(TTenant::TPtr tenant,
const Ydb::Cms::SchemaOperationQuotas &quotas,
TTransactionContext &txc,
@@ -2889,254 +2889,254 @@ void TTenantsManager::DbUpdateDatabaseQuotas(TTenant::TPtr tenant,
.Update(NIceDb::TUpdate<Schema::Tenants::DatabaseQuotas>(serialized));
}
-void TTenantsManager::Handle(TEvConsole::TEvAlterTenantRequest::TPtr &ev, const TActorContext &ctx)
-{
- Counters.Inc(COUNTER_ALTER_REQUESTS);
- ProcessOrDelayTx(CreateTxAlterTenant(ev), ctx);
-}
-
-void TTenantsManager::Handle(TEvConsole::TEvCreateTenantRequest::TPtr &ev, const TActorContext &ctx)
-{
- Counters.Inc(COUNTER_CREATE_REQUESTS);
- ProcessOrDelayTx(CreateTxCreateTenant(ev), ctx);
-}
-
-void TTenantsManager::Handle(TEvConsole::TEvDescribeTenantOptionsRequest::TPtr &ev, const TActorContext &ctx)
-{
- Ydb::Cms::DescribeDatabaseOptionsResult result;
-
- Counters.Inc(COUNTER_DESCRIBE_REQUESTS);
-
- // Fill pool settings.
- for (auto &pr : Domain->StoragePoolTypes) {
- auto &config = pr.second;
- auto &description = *result.add_storage_units();
- description.set_kind(pr.first);
- (*description.mutable_labels())["erasure"] = config.GetErasureSpecies();
- for (auto &filter : config.GetPDiskFilter()) {
- for (auto &prop : filter.GetProperty()) {
- if (prop.HasType()) {
- auto diskType = ToString(prop.GetType());
- (*description.mutable_labels())["disk_type"] = diskType;
- }
- }
- }
- }
-
- // Fill zone settings.
- for (auto &pr : Config.AvailabilityZones) {
- auto &description = *result.add_availability_zones();
- description.set_name(pr.first);
- TString dc;
+void TTenantsManager::Handle(TEvConsole::TEvAlterTenantRequest::TPtr &ev, const TActorContext &ctx)
+{
+ Counters.Inc(COUNTER_ALTER_REQUESTS);
+ ProcessOrDelayTx(CreateTxAlterTenant(ev), ctx);
+}
+
+void TTenantsManager::Handle(TEvConsole::TEvCreateTenantRequest::TPtr &ev, const TActorContext &ctx)
+{
+ Counters.Inc(COUNTER_CREATE_REQUESTS);
+ ProcessOrDelayTx(CreateTxCreateTenant(ev), ctx);
+}
+
+void TTenantsManager::Handle(TEvConsole::TEvDescribeTenantOptionsRequest::TPtr &ev, const TActorContext &ctx)
+{
+ Ydb::Cms::DescribeDatabaseOptionsResult result;
+
+ Counters.Inc(COUNTER_DESCRIBE_REQUESTS);
+
+ // Fill pool settings.
+ for (auto &pr : Domain->StoragePoolTypes) {
+ auto &config = pr.second;
+ auto &description = *result.add_storage_units();
+ description.set_kind(pr.first);
+ (*description.mutable_labels())["erasure"] = config.GetErasureSpecies();
+ for (auto &filter : config.GetPDiskFilter()) {
+ for (auto &prop : filter.GetProperty()) {
+ if (prop.HasType()) {
+ auto diskType = ToString(prop.GetType());
+ (*description.mutable_labels())["disk_type"] = diskType;
+ }
+ }
+ }
+ }
+
+ // Fill zone settings.
+ for (auto &pr : Config.AvailabilityZones) {
+ auto &description = *result.add_availability_zones();
+ description.set_name(pr.first);
+ TString dc;
if (pr.second.DataCenter != ANY_DATA_CENTER)
- (*description.mutable_labels())["fixed_data_center"] = pr.second.DataCenter;
- else
- (*description.mutable_labels())["any_data_center"] = "true";
- if (pr.second.CollocationGroup) {
- if (pr.second.ForceCollocation)
- (*description.mutable_labels())["collocation"] = "forced";
- else
- (*description.mutable_labels())["collocation"] = "enabled";
- } else {
- (*description.mutable_labels())["collocation"] = "disabled";
- }
- }
-
- // Fill slot settings.
- for (auto &pr : Config.TenantSlotKinds) {
- auto &description = *result.add_computational_units();
- description.set_kind(pr.first);
- for (auto &zone : pr.second.AllowedZones)
- description.add_allowed_availability_zones(zone);
- (*description.mutable_labels())["type"] = "dynamic_slot";
- (*description.mutable_labels())["slot_type"] = pr.second.TenantSlotType;
- }
-
- auto resp = MakeHolder<TEvConsole::TEvDescribeTenantOptionsResponse>();
- auto &operation = *resp->Record.MutableResponse()->mutable_operation();
- operation.set_ready(true);
- operation.set_status(Ydb::StatusIds::SUCCESS);
- operation.mutable_result()->PackFrom(result);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send TEvConsole::TEvDescribeTenantOptionsResponse: "
- << resp->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
-}
-
-void TTenantsManager::Handle(TEvConsole::TEvGetOperationRequest::TPtr &ev, const TActorContext &ctx)
-{
- Counters.Inc(COUNTER_GET_OPERATION_REQUESTS);
-
- auto resp = MakeHolder<TEvConsole::TEvGetOperationResponse>();
- auto &operation = *resp->Record.MutableResponse()->mutable_operation();
- FillOperationStatus(ev->Get()->Record.GetRequest().id(), operation);
-
- if (operation.status())
- Counters.Inc(operation.status(), COUNTER_CREATE_RESPONSES);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send TEvConsole::TEvGetOperationResponse: "
- << resp->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
-}
-
-void TTenantsManager::Handle(TEvConsole::TEvGetTenantStatusRequest::TPtr &ev, const TActorContext &ctx)
-{
- Counters.Inc(COUNTER_STATUS_REQUESTS);
-
- auto path = CanonizePath(ev->Get()->Record.GetRequest().path());
- auto tenant = GetTenant(path);
-
- auto resp = MakeHolder<TEvConsole::TEvGetTenantStatusResponse>();
- auto &operation = *resp->Record.MutableResponse()->mutable_operation();
- operation.set_ready(true);
-
- if (!tenant) {
- operation.set_status(Ydb::StatusIds::NOT_FOUND);
- auto issue = operation.add_issues();
+ (*description.mutable_labels())["fixed_data_center"] = pr.second.DataCenter;
+ else
+ (*description.mutable_labels())["any_data_center"] = "true";
+ if (pr.second.CollocationGroup) {
+ if (pr.second.ForceCollocation)
+ (*description.mutable_labels())["collocation"] = "forced";
+ else
+ (*description.mutable_labels())["collocation"] = "enabled";
+ } else {
+ (*description.mutable_labels())["collocation"] = "disabled";
+ }
+ }
+
+ // Fill slot settings.
+ for (auto &pr : Config.TenantSlotKinds) {
+ auto &description = *result.add_computational_units();
+ description.set_kind(pr.first);
+ for (auto &zone : pr.second.AllowedZones)
+ description.add_allowed_availability_zones(zone);
+ (*description.mutable_labels())["type"] = "dynamic_slot";
+ (*description.mutable_labels())["slot_type"] = pr.second.TenantSlotType;
+ }
+
+ auto resp = MakeHolder<TEvConsole::TEvDescribeTenantOptionsResponse>();
+ auto &operation = *resp->Record.MutableResponse()->mutable_operation();
+ operation.set_ready(true);
+ operation.set_status(Ydb::StatusIds::SUCCESS);
+ operation.mutable_result()->PackFrom(result);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send TEvConsole::TEvDescribeTenantOptionsResponse: "
+ << resp->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+}
+
+void TTenantsManager::Handle(TEvConsole::TEvGetOperationRequest::TPtr &ev, const TActorContext &ctx)
+{
+ Counters.Inc(COUNTER_GET_OPERATION_REQUESTS);
+
+ auto resp = MakeHolder<TEvConsole::TEvGetOperationResponse>();
+ auto &operation = *resp->Record.MutableResponse()->mutable_operation();
+ FillOperationStatus(ev->Get()->Record.GetRequest().id(), operation);
+
+ if (operation.status())
+ Counters.Inc(operation.status(), COUNTER_CREATE_RESPONSES);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send TEvConsole::TEvGetOperationResponse: "
+ << resp->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+}
+
+void TTenantsManager::Handle(TEvConsole::TEvGetTenantStatusRequest::TPtr &ev, const TActorContext &ctx)
+{
+ Counters.Inc(COUNTER_STATUS_REQUESTS);
+
+ auto path = CanonizePath(ev->Get()->Record.GetRequest().path());
+ auto tenant = GetTenant(path);
+
+ auto resp = MakeHolder<TEvConsole::TEvGetTenantStatusResponse>();
+ auto &operation = *resp->Record.MutableResponse()->mutable_operation();
+ operation.set_ready(true);
+
+ if (!tenant) {
+ operation.set_status(Ydb::StatusIds::NOT_FOUND);
+ auto issue = operation.add_issues();
issue->set_severity(NYql::TSeverityIds::S_ERROR);
issue->set_message(Sprintf("Unknown tenant %s", path.data()));
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send TEvConsole::TEvGetTenantStatusResponse: "
- << resp->Record.ShortDebugString());
-
- Counters.Inc(Ydb::StatusIds::NOT_FOUND, COUNTER_STATUS_RESPONSES);
-
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
- } else if (!tenant->IsRunning()
- && !tenant->IsConfiguring()) {
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send TEvConsole::TEvGetTenantStatusResponse: "
+ << resp->Record.ShortDebugString());
+
+ Counters.Inc(Ydb::StatusIds::NOT_FOUND, COUNTER_STATUS_RESPONSES);
+
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+ } else if (!tenant->IsRunning()
+ && !tenant->IsConfiguring()) {
Ydb::Cms::GetDatabaseStatusResult result;
- FillTenantStatus(tenant, result);
-
- operation.set_status(Ydb::StatusIds::SUCCESS);
- operation.mutable_result()->PackFrom(result);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send TEvConsole::TEvGetTenantStatusResponse: "
- << resp->Record.ShortDebugString());
-
- Counters.Inc(Ydb::StatusIds::SUCCESS, COUNTER_STATUS_RESPONSES);
-
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
- } else {
- if (tenant->StatusRequests.empty())
- RequestTenantSlotsState(tenant, ctx);
-
- tenant->StatusRequests.push_back(ev.Release());
- }
-}
-
-void TTenantsManager::Handle(TEvConsole::TEvListTenantsRequest::TPtr &ev, const TActorContext &ctx)
-{
- Counters.Inc(COUNTER_LIST_REQUESTS);
-
+ FillTenantStatus(tenant, result);
+
+ operation.set_status(Ydb::StatusIds::SUCCESS);
+ operation.mutable_result()->PackFrom(result);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send TEvConsole::TEvGetTenantStatusResponse: "
+ << resp->Record.ShortDebugString());
+
+ Counters.Inc(Ydb::StatusIds::SUCCESS, COUNTER_STATUS_RESPONSES);
+
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+ } else {
+ if (tenant->StatusRequests.empty())
+ RequestTenantSlotsState(tenant, ctx);
+
+ tenant->StatusRequests.push_back(ev.Release());
+ }
+}
+
+void TTenantsManager::Handle(TEvConsole::TEvListTenantsRequest::TPtr &ev, const TActorContext &ctx)
+{
+ Counters.Inc(COUNTER_LIST_REQUESTS);
+
Ydb::Cms::ListDatabasesResult result;
- for (auto &pr : Tenants)
- result.add_paths(pr.first);
-
- auto resp = MakeHolder<TEvConsole::TEvListTenantsResponse>();
- auto &operation = *resp->Record.MutableResponse()->mutable_operation();
- operation.set_ready(true);
- operation.set_status(Ydb::StatusIds::SUCCESS);
- operation.mutable_result()->PackFrom(result);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send TEvConsole::TEvListTenantsResponse: "
- << resp->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
-}
-
-void TTenantsManager::Handle(TEvConsole::TEvNotifyOperationCompletionRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
+ for (auto &pr : Tenants)
+ result.add_paths(pr.first);
+
+ auto resp = MakeHolder<TEvConsole::TEvListTenantsResponse>();
+ auto &operation = *resp->Record.MutableResponse()->mutable_operation();
+ operation.set_ready(true);
+ operation.set_status(Ydb::StatusIds::SUCCESS);
+ operation.mutable_result()->PackFrom(result);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send TEvConsole::TEvListTenantsResponse: "
+ << resp->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+}
+
+void TTenantsManager::Handle(TEvConsole::TEvNotifyOperationCompletionRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
Ydb::Operations::Operation operation;
- auto tenant = FillOperationStatus(rec.GetRequest().id(), operation);
-
- if (operation.ready() && operation.status() != Ydb::StatusIds::NOT_FOUND) {
- auto resp = MakeHolder<TEvConsole::TEvOperationCompletionNotification>();
- resp->Record.MutableResponse()->mutable_operation()->CopyFrom(operation);
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send TEvConsole::TEvOperationCompletionNotification: "
- << resp->Record.ShortDebugString());
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
- } else {
- if (!operation.ready()) {
- Y_VERIFY(tenant);
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "Add subscription to " << tenant->Path << " for " << ev->Sender);
- tenant->Subscribers.push_back(ev->Sender);
- }
-
- auto resp = MakeHolder<TEvConsole::TEvNotifyOperationCompletionResponse>();
- resp->Record.MutableResponse()->mutable_operation()->CopyFrom(operation);
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send TEvConsole::TEvNotifyOperationCompletionResponse: "
- << resp->Record.ShortDebugString());
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
- }
-}
-
-void TTenantsManager::Handle(TEvConsole::TEvRemoveTenantRequest::TPtr &ev, const TActorContext &ctx)
-{
- Counters.Inc(COUNTER_REMOVE_REQUESTS);
-
- auto path = CanonizePath(ev->Get()->Record.GetRequest().path());
- TxProcessor->ProcessTx(CreateTxRemoveTenant(ev), ctx);
-}
-
-void TTenantsManager::Handle(TEvPrivate::TEvPoolAllocated::TPtr &ev, const TActorContext &ctx)
-{
- auto tenant = ev->Get()->Tenant;
- auto pool = ev->Get()->Pool;
- Y_VERIFY(pool->State != TStoragePool::ALLOCATED);
-
+ auto tenant = FillOperationStatus(rec.GetRequest().id(), operation);
+
+ if (operation.ready() && operation.status() != Ydb::StatusIds::NOT_FOUND) {
+ auto resp = MakeHolder<TEvConsole::TEvOperationCompletionNotification>();
+ resp->Record.MutableResponse()->mutable_operation()->CopyFrom(operation);
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send TEvConsole::TEvOperationCompletionNotification: "
+ << resp->Record.ShortDebugString());
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+ } else {
+ if (!operation.ready()) {
+ Y_VERIFY(tenant);
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Add subscription to " << tenant->Path << " for " << ev->Sender);
+ tenant->Subscribers.push_back(ev->Sender);
+ }
+
+ auto resp = MakeHolder<TEvConsole::TEvNotifyOperationCompletionResponse>();
+ resp->Record.MutableResponse()->mutable_operation()->CopyFrom(operation);
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send TEvConsole::TEvNotifyOperationCompletionResponse: "
+ << resp->Record.ShortDebugString());
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+ }
+}
+
+void TTenantsManager::Handle(TEvConsole::TEvRemoveTenantRequest::TPtr &ev, const TActorContext &ctx)
+{
+ Counters.Inc(COUNTER_REMOVE_REQUESTS);
+
+ auto path = CanonizePath(ev->Get()->Record.GetRequest().path());
+ TxProcessor->ProcessTx(CreateTxRemoveTenant(ev), ctx);
+}
+
+void TTenantsManager::Handle(TEvPrivate::TEvPoolAllocated::TPtr &ev, const TActorContext &ctx)
+{
+ auto tenant = ev->Get()->Tenant;
+ auto pool = ev->Get()->Pool;
+ Y_VERIFY(pool->State != TStoragePool::ALLOCATED);
+
pool->GroupFitErrors = 0;
- TxProcessor->ProcessTx(CreateTxUpdatePoolState(tenant, pool, ev->Sender,
- TStoragePool::ALLOCATED),
- ctx);
-}
-
-void TTenantsManager::Handle(TEvPrivate::TEvPoolFailed::TPtr &ev, const TActorContext &ctx)
-{
- auto tenant = ev->Get()->Tenant;
- auto pool = ev->Get()->Pool;
- auto &issue = ev->Get()->Issue;
-
- if (pool->Worker != ev->Sender) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
- "Ignoring TEvPrivate::TEvPoolFailed from outdated worker of "
- << pool->Config.GetName() << " pool for tenant "
- << tenant->Path << ": " << issue);
- return;
- }
-
- if (tenant->State == TTenant::REMOVING_POOLS) {
- LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
- "Couldn't delete storage pool " << pool->Config.GetName()
- << " for tenant " << tenant->Path << ": " << issue);
- Counters.Inc(COUNTER_REMOVE_POOL_FAILED);
-
+ TxProcessor->ProcessTx(CreateTxUpdatePoolState(tenant, pool, ev->Sender,
+ TStoragePool::ALLOCATED),
+ ctx);
+}
+
+void TTenantsManager::Handle(TEvPrivate::TEvPoolFailed::TPtr &ev, const TActorContext &ctx)
+{
+ auto tenant = ev->Get()->Tenant;
+ auto pool = ev->Get()->Pool;
+ auto &issue = ev->Get()->Issue;
+
+ if (pool->Worker != ev->Sender) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Ignoring TEvPrivate::TEvPoolFailed from outdated worker of "
+ << pool->Config.GetName() << " pool for tenant "
+ << tenant->Path << ": " << issue);
+ return;
+ }
+
+ if (tenant->State == TTenant::REMOVING_POOLS) {
+ LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Couldn't delete storage pool " << pool->Config.GetName()
+ << " for tenant " << tenant->Path << ": " << issue);
+ Counters.Inc(COUNTER_REMOVE_POOL_FAILED);
+
pool->Worker = TActorId();
pool->GroupFitErrors = 0;
- ctx.Schedule(TDuration::Seconds(10),
- new TEvPrivate::TEvRetryAllocateResources(tenant->Path));
- } else if (tenant->IsCreating()) {
- Counters.Inc(COUNTER_ALLOC_POOL_FAILED);
+ ctx.Schedule(TDuration::Seconds(10),
+ new TEvPrivate::TEvRetryAllocateResources(tenant->Path));
+ } else if (tenant->IsCreating()) {
+ Counters.Inc(COUNTER_ALLOC_POOL_FAILED);
pool->Worker = TActorId();
pool->GroupFitErrors = 0;
- tenant->Issue = issue;
- TxProcessor->ProcessTx(CreateTxUpdateTenantState(tenant->Path, TTenant::REMOVING_POOLS), ctx);
- } else {
- LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
- "Couldn't update storage pool " << pool->Config.GetName()
- << " for tenant " << tenant->Path << ": " << issue);
-
+ tenant->Issue = issue;
+ TxProcessor->ProcessTx(CreateTxUpdateTenantState(tenant->Path, TTenant::REMOVING_POOLS), ctx);
+ } else {
+ LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Couldn't update storage pool " << pool->Config.GetName()
+ << " for tenant " << tenant->Path << ": " << issue);
+
if (issue.Contains("Group fit error")) {
if (++pool->GroupFitErrors >= 10) {
pool->GroupFitErrors = 0;
@@ -3147,247 +3147,247 @@ void TTenantsManager::Handle(TEvPrivate::TEvPoolFailed::TPtr &ev, const TActorCo
pool->GroupFitErrors = 0;
}
- Counters.Inc(COUNTER_ALLOC_POOL_FAILED);
+ Counters.Inc(COUNTER_ALLOC_POOL_FAILED);
pool->Worker = TActorId();
- ctx.Schedule(TDuration::Seconds(10),
- new TEvPrivate::TEvRetryAllocateResources(tenant->Path));
- }
-}
-
-void TTenantsManager::Handle(TEvPrivate::TEvPoolDeleted::TPtr &ev, const TActorContext &ctx)
-{
- auto tenant = ev->Get()->Tenant;
- auto pool = ev->Get()->Pool;
- Y_VERIFY(pool->Worker == ev->Sender);
-
- TxProcessor->ProcessTx(CreateTxUpdatePoolState(tenant, pool, ev->Sender,
- TStoragePool::DELETED),
- ctx);
-}
-
-void TTenantsManager::Handle(TEvPrivate::TEvRetryAllocateResources::TPtr &ev, const TActorContext &ctx)
-{
- auto tenant = GetTenant(ev->Get()->TenantName);
- if (tenant)
- ProcessTenantActions(tenant, ctx);
-}
-
-void TTenantsManager::Handle(TEvPrivate::TEvStateLoaded::TPtr &/*ev*/, const TActorContext &ctx)
-{
- for (auto &pr : Tenants)
- ProcessTenantActions(pr.second, ctx);
-}
-
-void TTenantsManager::Handle(TEvPrivate::TEvSubdomainFailed::TPtr &ev, const TActorContext &ctx)
-{
- auto tenant = ev->Get()->Tenant;
- auto &issue = ev->Get()->Issue;
- auto code = ev->Get()->Code;
-
- if (tenant->Worker != ev->Sender) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
- "Ignoring TEvPrivate::TEvSubdomainFailed from outdated worker of "
- << tenant->Path << ": " << issue);
- return;
- }
-
- tenant->ErrorCode = code;
- tenant->Issue = issue;
-
- if (tenant->IsRemoving()) {
- Y_VERIFY(tenant->State == TTenant::REMOVING_SUBDOMAIN);
-
- LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
- "Cannot remove subdomain for tenant " << tenant->Path
- << ": " << code << ": " << issue);
-
- Counters.Inc(COUNTER_REMOVE_SUBDOMAIN_FAILED);
-
- TxProcessor->ProcessTx(CreateTxRemoveTenantFailed(tenant, code), ctx);
- return;
- }
-
- Y_VERIFY(tenant == GetTenant(tenant->Path));
- Y_VERIFY(tenant->State == TTenant::CREATING_SUBDOMAIN
- || tenant->State == TTenant::CONFIGURING_SUBDOMAIN
- || tenant->State == TTenant::RUNNING);
-
- Counters.Inc(COUNTER_CONFIGURE_SUBDOMAIN_FAILED);
-
- if (tenant->State == TTenant::CREATING_SUBDOMAIN) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
- "Cannot create subdomain for tenant " << tenant->Path
- << ": " << code << ": " << issue);
-
- TxProcessor->ProcessTx(CreateTxUpdateTenantState(tenant->Path,
- TTenant::REMOVING_POOLS,
- tenant->Worker),
- ctx);
- } else {
- LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
- "Cannot configure subdomain for tenant " << tenant->Path
- << ": " << code << ": " << issue);
-
- tenant->Issue = issue;
+ ctx.Schedule(TDuration::Seconds(10),
+ new TEvPrivate::TEvRetryAllocateResources(tenant->Path));
+ }
+}
+
+void TTenantsManager::Handle(TEvPrivate::TEvPoolDeleted::TPtr &ev, const TActorContext &ctx)
+{
+ auto tenant = ev->Get()->Tenant;
+ auto pool = ev->Get()->Pool;
+ Y_VERIFY(pool->Worker == ev->Sender);
+
+ TxProcessor->ProcessTx(CreateTxUpdatePoolState(tenant, pool, ev->Sender,
+ TStoragePool::DELETED),
+ ctx);
+}
+
+void TTenantsManager::Handle(TEvPrivate::TEvRetryAllocateResources::TPtr &ev, const TActorContext &ctx)
+{
+ auto tenant = GetTenant(ev->Get()->TenantName);
+ if (tenant)
+ ProcessTenantActions(tenant, ctx);
+}
+
+void TTenantsManager::Handle(TEvPrivate::TEvStateLoaded::TPtr &/*ev*/, const TActorContext &ctx)
+{
+ for (auto &pr : Tenants)
+ ProcessTenantActions(pr.second, ctx);
+}
+
+void TTenantsManager::Handle(TEvPrivate::TEvSubdomainFailed::TPtr &ev, const TActorContext &ctx)
+{
+ auto tenant = ev->Get()->Tenant;
+ auto &issue = ev->Get()->Issue;
+ auto code = ev->Get()->Code;
+
+ if (tenant->Worker != ev->Sender) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Ignoring TEvPrivate::TEvSubdomainFailed from outdated worker of "
+ << tenant->Path << ": " << issue);
+ return;
+ }
+
+ tenant->ErrorCode = code;
+ tenant->Issue = issue;
+
+ if (tenant->IsRemoving()) {
+ Y_VERIFY(tenant->State == TTenant::REMOVING_SUBDOMAIN);
+
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Cannot remove subdomain for tenant " << tenant->Path
+ << ": " << code << ": " << issue);
+
+ Counters.Inc(COUNTER_REMOVE_SUBDOMAIN_FAILED);
+
+ TxProcessor->ProcessTx(CreateTxRemoveTenantFailed(tenant, code), ctx);
+ return;
+ }
+
+ Y_VERIFY(tenant == GetTenant(tenant->Path));
+ Y_VERIFY(tenant->State == TTenant::CREATING_SUBDOMAIN
+ || tenant->State == TTenant::CONFIGURING_SUBDOMAIN
+ || tenant->State == TTenant::RUNNING);
+
+ Counters.Inc(COUNTER_CONFIGURE_SUBDOMAIN_FAILED);
+
+ if (tenant->State == TTenant::CREATING_SUBDOMAIN) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Cannot create subdomain for tenant " << tenant->Path
+ << ": " << code << ": " << issue);
+
+ TxProcessor->ProcessTx(CreateTxUpdateTenantState(tenant->Path,
+ TTenant::REMOVING_POOLS,
+ tenant->Worker),
+ ctx);
+ } else {
+ LOG_CRIT_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Cannot configure subdomain for tenant " << tenant->Path
+ << ": " << code << ": " << issue);
+
+ tenant->Issue = issue;
tenant->Worker = TActorId();
- ctx.Schedule(TDuration::Seconds(10),
- new TEvPrivate::TEvRetryAllocateResources(tenant->Path));
- }
-}
-
-void TTenantsManager::Handle(TEvPrivate::TEvSubdomainCreated::TPtr &ev, const TActorContext &ctx)
-{
- auto tenant = ev->Get()->Tenant;
- Y_VERIFY(tenant == GetTenant(tenant->Path));
-
- if (tenant->Worker != ev->Sender) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "Ignoring created subdomain from outdated worker for tenant " << tenant->Path
- << " in " << tenant->State << " state");
- return;
- }
-
- Y_VERIFY(tenant->State == TTenant::CREATING_SUBDOMAIN);
- TxProcessor->ProcessTx(CreateTxUpdateSubDomainKey(tenant->Path,
- ev->Get()->SchemeShardId,
- ev->Get()->PathId,
- tenant->Worker),
- ctx);
-}
-
-void TTenantsManager::Handle(TEvPrivate::TEvSubdomainKey::TPtr &ev, const TActorContext &ctx)
-{
- auto tenant = ev->Get()->Tenant;
- Y_VERIFY(tenant == GetTenant(tenant->Path));
-
- if (tenant->Worker != ev->Sender) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "Ignoring subdomain key from outdated worker for tenant " << tenant->Path
- << " in " << tenant->State << " state");
- return;
- }
-
- TxProcessor->ProcessTx(CreateTxUpdateSubDomainKey(tenant->Path,
- ev->Get()->SchemeShardId,
- ev->Get()->PathId,
- tenant->Worker),
- ctx);
-}
-
-void TTenantsManager::Handle(TEvPrivate::TEvSubdomainReady::TPtr &ev, const TActorContext &ctx)
-{
- auto tenant = ev->Get()->Tenant;
-
- // Subdomain configuration might be too late.
- if (tenant->IsRemoving()) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "Ignoring ready subdomain for tenant " << tenant->Path
- << " in " << tenant->State << " state");
- return;
- }
-
- if (tenant->Worker != ev->Sender) {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
- "Ignoring ready subdomain from outdated worker for tenant " << tenant->Path
- << " in " << tenant->State << " state");
- return;
- }
-
- Y_VERIFY(tenant == GetTenant(tenant->Path));
- Y_VERIFY(tenant->State == TTenant::CONFIGURING_SUBDOMAIN
- || tenant->State == TTenant::RUNNING);
-
- TxProcessor->ProcessTx(CreateTxUpdateConfirmedSubdomain(tenant->Path,
- ev->Get()->Version,
- tenant->Worker),
- ctx);
-}
-
-void TTenantsManager::Handle(TEvPrivate::TEvSubdomainRemoved::TPtr &ev, const TActorContext &ctx)
-{
- auto tenant = ev->Get()->Tenant;
- Y_VERIFY(tenant == GetTenant(tenant->Path));
- Y_VERIFY(tenant->State == TTenant::REMOVING_SUBDOMAIN);
- Y_VERIFY(tenant->Worker == ev->Sender);
-
- TxProcessor->ProcessTx(CreateTxRemoveComputationalUnits(tenant), ctx);
-}
-
-void TTenantsManager::Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx)
-{
- TEvTabletPipe::TEvClientConnected *msg = ev->Get();
- if (msg->ClientId == TenantSlotBrokerPipe
- && msg->Status != NKikimrProto::OK) {
- OnTenantSlotBrokerPipeDestroyed(ctx);
- }
-}
-
-void TTenantsManager::Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx)
-{
- TEvTabletPipe::TEvClientDestroyed *msg = ev->Get();
- if (msg->ClientId == TenantSlotBrokerPipe)
- OnTenantSlotBrokerPipeDestroyed(ctx);
-}
-
-void TTenantsManager::Handle(TEvTenantSlotBroker::TEvSlotStats::TPtr &ev, const TActorContext &ctx)
-{
- SlotStats.UpdateStats(ev->Get()->Record);
- while (!DelayedTxs.empty()) {
- auto &tx = DelayedTxs.front();
- TxProcessor->ProcessTx(tx.Release(), ctx);
- DelayedTxs.pop();
- }
-}
-
-void TTenantsManager::Handle(TEvTenantSlotBroker::TEvTenantState::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- TString path = CanonizePath(rec.GetTenantName());
- auto tenant = GetTenant(path);
- if (!tenant) {
- LOG_WARN_S(ctx, NKikimrServices::CMS_TENANTS,
- "Got state for missing tenant " << path
- << " (" << rec.GetTenantName() << ") from Tenant Slot Broker");
- return;
- }
-
- tenant->SlotsAllocationConfirmed = CheckTenantSlots(tenant, rec);
- if (!tenant->SlotsAllocationConfirmed) {
- LOG_INFO_S(ctx, NKikimrServices::CMS_TENANTS,
- "Wrong resources are assigned for " << tenant->Path);
- ctx.Schedule(TDuration::Seconds(1), new TEvPrivate::TEvRetryAllocateResources(tenant->Path));
- }
-
- for (auto &req : tenant->StatusRequests) {
+ ctx.Schedule(TDuration::Seconds(10),
+ new TEvPrivate::TEvRetryAllocateResources(tenant->Path));
+ }
+}
+
+void TTenantsManager::Handle(TEvPrivate::TEvSubdomainCreated::TPtr &ev, const TActorContext &ctx)
+{
+ auto tenant = ev->Get()->Tenant;
+ Y_VERIFY(tenant == GetTenant(tenant->Path));
+
+ if (tenant->Worker != ev->Sender) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Ignoring created subdomain from outdated worker for tenant " << tenant->Path
+ << " in " << tenant->State << " state");
+ return;
+ }
+
+ Y_VERIFY(tenant->State == TTenant::CREATING_SUBDOMAIN);
+ TxProcessor->ProcessTx(CreateTxUpdateSubDomainKey(tenant->Path,
+ ev->Get()->SchemeShardId,
+ ev->Get()->PathId,
+ tenant->Worker),
+ ctx);
+}
+
+void TTenantsManager::Handle(TEvPrivate::TEvSubdomainKey::TPtr &ev, const TActorContext &ctx)
+{
+ auto tenant = ev->Get()->Tenant;
+ Y_VERIFY(tenant == GetTenant(tenant->Path));
+
+ if (tenant->Worker != ev->Sender) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Ignoring subdomain key from outdated worker for tenant " << tenant->Path
+ << " in " << tenant->State << " state");
+ return;
+ }
+
+ TxProcessor->ProcessTx(CreateTxUpdateSubDomainKey(tenant->Path,
+ ev->Get()->SchemeShardId,
+ ev->Get()->PathId,
+ tenant->Worker),
+ ctx);
+}
+
+void TTenantsManager::Handle(TEvPrivate::TEvSubdomainReady::TPtr &ev, const TActorContext &ctx)
+{
+ auto tenant = ev->Get()->Tenant;
+
+ // Subdomain configuration might be too late.
+ if (tenant->IsRemoving()) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Ignoring ready subdomain for tenant " << tenant->Path
+ << " in " << tenant->State << " state");
+ return;
+ }
+
+ if (tenant->Worker != ev->Sender) {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Ignoring ready subdomain from outdated worker for tenant " << tenant->Path
+ << " in " << tenant->State << " state");
+ return;
+ }
+
+ Y_VERIFY(tenant == GetTenant(tenant->Path));
+ Y_VERIFY(tenant->State == TTenant::CONFIGURING_SUBDOMAIN
+ || tenant->State == TTenant::RUNNING);
+
+ TxProcessor->ProcessTx(CreateTxUpdateConfirmedSubdomain(tenant->Path,
+ ev->Get()->Version,
+ tenant->Worker),
+ ctx);
+}
+
+void TTenantsManager::Handle(TEvPrivate::TEvSubdomainRemoved::TPtr &ev, const TActorContext &ctx)
+{
+ auto tenant = ev->Get()->Tenant;
+ Y_VERIFY(tenant == GetTenant(tenant->Path));
+ Y_VERIFY(tenant->State == TTenant::REMOVING_SUBDOMAIN);
+ Y_VERIFY(tenant->Worker == ev->Sender);
+
+ TxProcessor->ProcessTx(CreateTxRemoveComputationalUnits(tenant), ctx);
+}
+
+void TTenantsManager::Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx)
+{
+ TEvTabletPipe::TEvClientConnected *msg = ev->Get();
+ if (msg->ClientId == TenantSlotBrokerPipe
+ && msg->Status != NKikimrProto::OK) {
+ OnTenantSlotBrokerPipeDestroyed(ctx);
+ }
+}
+
+void TTenantsManager::Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx)
+{
+ TEvTabletPipe::TEvClientDestroyed *msg = ev->Get();
+ if (msg->ClientId == TenantSlotBrokerPipe)
+ OnTenantSlotBrokerPipeDestroyed(ctx);
+}
+
+void TTenantsManager::Handle(TEvTenantSlotBroker::TEvSlotStats::TPtr &ev, const TActorContext &ctx)
+{
+ SlotStats.UpdateStats(ev->Get()->Record);
+ while (!DelayedTxs.empty()) {
+ auto &tx = DelayedTxs.front();
+ TxProcessor->ProcessTx(tx.Release(), ctx);
+ DelayedTxs.pop();
+ }
+}
+
+void TTenantsManager::Handle(TEvTenantSlotBroker::TEvTenantState::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ TString path = CanonizePath(rec.GetTenantName());
+ auto tenant = GetTenant(path);
+ if (!tenant) {
+ LOG_WARN_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Got state for missing tenant " << path
+ << " (" << rec.GetTenantName() << ") from Tenant Slot Broker");
+ return;
+ }
+
+ tenant->SlotsAllocationConfirmed = CheckTenantSlots(tenant, rec);
+ if (!tenant->SlotsAllocationConfirmed) {
+ LOG_INFO_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Wrong resources are assigned for " << tenant->Path);
+ ctx.Schedule(TDuration::Seconds(1), new TEvPrivate::TEvRetryAllocateResources(tenant->Path));
+ }
+
+ for (auto &req : tenant->StatusRequests) {
Ydb::Cms::GetDatabaseStatusResult result;
- FillTenantStatus(tenant, result);
- FillTenantAllocatedSlots(tenant, result, rec);
-
- auto resp = MakeHolder<TEvConsole::TEvGetTenantStatusResponse>();
- auto &operation = *resp->Record.MutableResponse()->mutable_operation();
- operation.set_ready(true);
- operation.set_status(Ydb::StatusIds::SUCCESS);
- operation.mutable_result()->PackFrom(result);
-
- Counters.Inc(Ydb::StatusIds::SUCCESS, COUNTER_STATUS_RESPONSES);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
- "Send TEvConsole::TEvGetTenantStatusResponse: "
- << resp->Record.ShortDebugString());
-
- ctx.Send(req->Sender, resp.Release(), 0, req->Cookie);
- }
- tenant->StatusRequests.clear();
-
- if (tenant->State == TTenant::REMOVING_UNITS)
- TxProcessor->ProcessTx(CreateTxUpdateTenantState(tenant->Path, TTenant::REMOVING_POOLS), ctx);
-}
-
-TString MakeStoragePoolName(const TString &tenantName, const TString &poolTypeName)
-{
+ FillTenantStatus(tenant, result);
+ FillTenantAllocatedSlots(tenant, result, rec);
+
+ auto resp = MakeHolder<TEvConsole::TEvGetTenantStatusResponse>();
+ auto &operation = *resp->Record.MutableResponse()->mutable_operation();
+ operation.set_ready(true);
+ operation.set_status(Ydb::StatusIds::SUCCESS);
+ operation.mutable_result()->PackFrom(result);
+
+ Counters.Inc(Ydb::StatusIds::SUCCESS, COUNTER_STATUS_RESPONSES);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_TENANTS,
+ "Send TEvConsole::TEvGetTenantStatusResponse: "
+ << resp->Record.ShortDebugString());
+
+ ctx.Send(req->Sender, resp.Release(), 0, req->Cookie);
+ }
+ tenant->StatusRequests.clear();
+
+ if (tenant->State == TTenant::REMOVING_UNITS)
+ TxProcessor->ProcessTx(CreateTxUpdateTenantState(tenant->Path, TTenant::REMOVING_POOLS), ctx);
+}
+
+TString MakeStoragePoolName(const TString &tenantName, const TString &poolTypeName)
+{
return Sprintf("%s:%s", tenantName.data(), poolTypeName.data());
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console_tenants_manager.h b/ydb/core/cms/console/console_tenants_manager.h
index ca65439e264..a21615dd622 100644
--- a/ydb/core/cms/console/console_tenants_manager.h
+++ b/ydb/core/cms/console/console_tenants_manager.h
@@ -1,11 +1,11 @@
-#pragma once
-
-#include "defs.h"
-
-#include "console.h"
-#include "console__scheme.h"
-#include "tx_processor.h"
-
+#pragma once
+
+#include "defs.h"
+
+#include "console.h"
+#include "console__scheme.h"
+#include "tx_processor.h"
+
#include <ydb/core/base/blobstorage.h>
#include <ydb/core/base/location.h>
#include <ydb/core/base/pathid.h>
@@ -18,502 +18,502 @@
#include <ydb/core/tx/tx_proxy/proxy.h>
#include <ydb/library/aclib/aclib.h>
#include <ydb/public/lib/operation_id/operation_id.h>
-
+
#include <ydb/library/yql/public/issue/protos/issue_severity.pb.h>
-
+
#include <library/cpp/actors/core/hfunc.h>
-
-#include <util/generic/set.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-using NTabletFlatExecutor::TTabletExecutedFlat;
-using NTabletFlatExecutor::ITransaction;
-using NTabletFlatExecutor::TTransactionBase;
-using NTabletFlatExecutor::TTransactionContext;
+
+#include <util/generic/set.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+using NTabletFlatExecutor::TTabletExecutedFlat;
+using NTabletFlatExecutor::ITransaction;
+using NTabletFlatExecutor::TTransactionBase;
+using NTabletFlatExecutor::TTransactionContext;
using NSchemeShard::TEvSchemeShard;
-using NTenantSlotBroker::TEvTenantSlotBroker;
-using NTenantSlotBroker::TSlotDescription;
-using NMonitoring::TDynamicCounterPtr;
-
-class TConsole;
-
-class TTenantsManager : public TActorBootstrapped<TTenantsManager> {
-private:
- using TBase = TActorBootstrapped<TTenantsManager>;
-
-public:
- using TUnitsCount = THashMap<std::pair<TString, TString>, ui64>;
- using TSlotsCount = THashMap<TSlotDescription, ui64>;
+using NTenantSlotBroker::TEvTenantSlotBroker;
+using NTenantSlotBroker::TSlotDescription;
+using NMonitoring::TDynamicCounterPtr;
+
+class TConsole;
+
+class TTenantsManager : public TActorBootstrapped<TTenantsManager> {
+private:
+ using TBase = TActorBootstrapped<TTenantsManager>;
+
+public:
+ using TUnitsCount = THashMap<std::pair<TString, TString>, ui64>;
+ using TSlotsCount = THashMap<TSlotDescription, ui64>;
using TDomainId = TPathId;
-
- //////////////////////////////////////////////////
- // Counters
- //////////////////////////////////////////////////
-
- enum ECounter {
- // Simple counters.
- COUNTER_TENANTS,
- COUNTER_CREATE_REQUESTS,
- COUNTER_ALTER_REQUESTS,
- COUNTER_REMOVE_REQUESTS,
- COUNTER_STATUS_REQUESTS,
- COUNTER_LIST_REQUESTS,
- COUNTER_DESCRIBE_REQUESTS,
- COUNTER_GET_OPERATION_REQUESTS,
- COUNTER_ALLOC_POOL_FAILED,
- COUNTER_REMOVE_POOL_FAILED,
- COUNTER_CONFIGURE_SUBDOMAIN_FAILED,
- COUNTER_REMOVE_SUBDOMAIN_FAILED,
- COUNTER_COMPUTATIONAL_QUOTA_EXCEEDED,
- COUNTER_COMPUTATIONAL_LOAD_QUOTA_EXCEEDED,
- COUNTER_TENANTS_QUOTA_EXCEEDED,
-
- COUNTER_COUNT_SIMPLE,
- // Counters supplied with kind.
- COUNTER_REQUESTED_STORAGE_UNITS = COUNTER_COUNT_SIMPLE,
- COUNTER_ALLOCATED_STORAGE_UNITS,
- COUNTER_REGISTERED_UNITS,
-
- // Counters supplied with kind and zone.
- COUNTER_COMPUTATIONAL_UNITS,
-
- // Counters supplied with status.
- COUNTER_CREATE_RESPONSES,
- COUNTER_ALTER_RESPONSES,
- COUNTER_REMOVE_RESPONSES,
- COUNTER_STATUS_RESPONSES,
- COUNTER_GET_OPERATION_RESPONSES,
-
- COUNTER_COUNT
- };
-
- class TCounters {
- private:
- static const std::array<TString, COUNTER_COUNT> SensorNames;
- static const THashSet<ECounter> DerivSensors;
-
- public:
- using TCounterPtr = NMonitoring::TDynamicCounters::TCounterPtr;
-
- TCounters(TDynamicCounterPtr counters)
- : Counters(counters)
- {
- for (ui64 i = 0; i < COUNTER_COUNT_SIMPLE; ++i)
- SimpleCounters[i] = counters->GetCounter(SensorName(static_cast<ECounter>(i)),
- IsDeriv(static_cast<ECounter>(i)));
- }
-
- static const TString &SensorName(ECounter counter)
- {
- return SensorNames[counter];
- }
-
- static bool IsDeriv(ECounter counter)
- {
+
+ //////////////////////////////////////////////////
+ // Counters
+ //////////////////////////////////////////////////
+
+ enum ECounter {
+ // Simple counters.
+ COUNTER_TENANTS,
+ COUNTER_CREATE_REQUESTS,
+ COUNTER_ALTER_REQUESTS,
+ COUNTER_REMOVE_REQUESTS,
+ COUNTER_STATUS_REQUESTS,
+ COUNTER_LIST_REQUESTS,
+ COUNTER_DESCRIBE_REQUESTS,
+ COUNTER_GET_OPERATION_REQUESTS,
+ COUNTER_ALLOC_POOL_FAILED,
+ COUNTER_REMOVE_POOL_FAILED,
+ COUNTER_CONFIGURE_SUBDOMAIN_FAILED,
+ COUNTER_REMOVE_SUBDOMAIN_FAILED,
+ COUNTER_COMPUTATIONAL_QUOTA_EXCEEDED,
+ COUNTER_COMPUTATIONAL_LOAD_QUOTA_EXCEEDED,
+ COUNTER_TENANTS_QUOTA_EXCEEDED,
+
+ COUNTER_COUNT_SIMPLE,
+ // Counters supplied with kind.
+ COUNTER_REQUESTED_STORAGE_UNITS = COUNTER_COUNT_SIMPLE,
+ COUNTER_ALLOCATED_STORAGE_UNITS,
+ COUNTER_REGISTERED_UNITS,
+
+ // Counters supplied with kind and zone.
+ COUNTER_COMPUTATIONAL_UNITS,
+
+ // Counters supplied with status.
+ COUNTER_CREATE_RESPONSES,
+ COUNTER_ALTER_RESPONSES,
+ COUNTER_REMOVE_RESPONSES,
+ COUNTER_STATUS_RESPONSES,
+ COUNTER_GET_OPERATION_RESPONSES,
+
+ COUNTER_COUNT
+ };
+
+ class TCounters {
+ private:
+ static const std::array<TString, COUNTER_COUNT> SensorNames;
+ static const THashSet<ECounter> DerivSensors;
+
+ public:
+ using TCounterPtr = NMonitoring::TDynamicCounters::TCounterPtr;
+
+ TCounters(TDynamicCounterPtr counters)
+ : Counters(counters)
+ {
+ for (ui64 i = 0; i < COUNTER_COUNT_SIMPLE; ++i)
+ SimpleCounters[i] = counters->GetCounter(SensorName(static_cast<ECounter>(i)),
+ IsDeriv(static_cast<ECounter>(i)));
+ }
+
+ static const TString &SensorName(ECounter counter)
+ {
+ return SensorNames[counter];
+ }
+
+ static bool IsDeriv(ECounter counter)
+ {
return DerivSensors.contains(counter);
- }
-
- TCounterPtr GetCounter(ECounter counter)
- {
- return SimpleCounters[counter];
- }
-
- TCounterPtr GetCounter(const TString &kind,
- ECounter counter)
- {
- auto key = std::make_pair(kind, counter);
- auto it = KindCounters.find(key);
- if (it != KindCounters.end())
- return it->second;
-
- auto group = Counters->GetSubgroup("kind", key.first);
- auto res = group->GetCounter(SensorName(counter), IsDeriv(counter));
- KindCounters[key] = res;
-
- return res;
- }
-
- TCounterPtr GetCounter(const TString &kind,
- const TString &zone,
- ECounter counter)
- {
- auto key = std::make_tuple(kind, zone, counter);
- auto it = KindZoneCounters.find(key);
- if (it != KindZoneCounters.end())
- return it->second;
-
- auto group1 = Counters->GetSubgroup("kind", kind);
- auto group2 = group1->GetSubgroup("zone", zone);
- auto res = group2->GetCounter(SensorName(counter), IsDeriv(counter));
- KindZoneCounters[key] = res;
-
- return res;
- }
-
- TCounterPtr GetCounter(Ydb::StatusIds::StatusCode code,
- ECounter counter)
- {
- auto key = std::make_pair(code, counter);
- auto it = StatusCounters.find(key);
- if (it != StatusCounters.end())
- return it->second;
-
- auto group = Counters->GetSubgroup("status", ToString(key.first));
- auto res = group->GetCounter(SensorName(counter), IsDeriv(counter));
- StatusCounters[key] = res;
-
- return res;
- }
-
- void Inc(ECounter counter,
- ui64 delta = 1)
- {
- GetCounter(counter)->Add(delta);
- }
-
- void Dec(ECounter counter,
- ui64 delta = 1)
- {
- GetCounter(counter)->Sub(delta);
- }
-
- ui64 Get(ECounter counter)
- {
- return GetCounter(counter)->Val();
- }
-
- void Set(ECounter counter,
- ui64 val)
- {
- *GetCounter(counter) = val;
- }
-
- void Inc(const TString &kind,
- ECounter counter,
- ui64 delta = 1)
- {
- GetCounter(kind, counter)->Add(delta);
- }
-
- void Dec(const TString &kind,
- ECounter counter,
- ui64 delta = 1)
- {
- GetCounter(kind, counter)->Sub(delta);
- }
-
- ui64 Get(const TString &kind,
- ECounter counter)
- {
- return GetCounter(kind, counter)->Val();
- }
-
- void Set(const TString &kind,
- ECounter counter,
- ui64 val)
- {
- *GetCounter(kind, counter) = val;
- }
-
- void Inc(const TString &kind,
- const TString &zone,
- ECounter counter,
- ui64 delta = 1)
- {
- GetCounter(kind, zone, counter)->Add(delta);
- }
-
- void Dec(const TString &kind,
- const TString &zone,
- ECounter counter,
- ui64 delta = 1)
- {
- GetCounter(kind, zone, counter)->Sub(delta);
- }
-
- ui64 Get(const TString &kind,
- const TString &zone,
- ECounter counter)
- {
- return GetCounter(kind, zone, counter)->Val();
- }
-
- void Set(const TString &kind,
- const TString &zone,
- ECounter counter,
- ui64 val)
- {
- *GetCounter(kind, zone, counter) = val;
- }
-
- void Inc(Ydb::StatusIds::StatusCode code,
- ECounter counter,
- ui64 delta = 1)
- {
- GetCounter(code, counter)->Add(delta);
- }
-
- void AddUnits(const TUnitsCount &units);
- void RemoveUnits(const TUnitsCount &units);
-
- private:
- TDynamicCounterPtr Counters;
- std::array<TCounterPtr, COUNTER_COUNT_SIMPLE> SimpleCounters;
- THashMap<std::pair<TString, ECounter>, TCounterPtr> KindCounters;
- THashMap<std::tuple<TString, TString, ECounter>, TCounterPtr> KindZoneCounters;
- THashMap<std::pair<Ydb::StatusIds::StatusCode, ECounter>, TCounterPtr> StatusCounters;
- };
-
- //////////////////////////////////////////////////
- // State
- //////////////////////////////////////////////////
-
- struct TStoragePool : public TThrRefBase {
- using TPtr = TIntrusivePtr<TStoragePool>;
-
- enum EState {
- NOT_ALLOCATED,
- NOT_UPDATED,
- ALLOCATED,
- DELETED,
- };
-
- TStoragePool(const TString &kind, const NKikimrBlobStorage::TDefineStoragePool &config)
- : Kind(kind)
- , Config(config)
- , AllocatedNumGroups(0)
- , State(NOT_ALLOCATED)
- {
- Config.SetKind(kind);
- }
-
- TStoragePool(const TString &name, const TString &kind, ui64 size,
- const NKikimrBlobStorage::TDefineStoragePool &config)
- : TStoragePool(kind, config)
- {
- Config.SetName(name);
- Config.SetNumGroups(size);
- }
-
- TStoragePool(const TStoragePool &other) = default;
-
- void AddRequiredGroups(ui64 count)
- {
- Config.SetNumGroups(Config.GetNumGroups() + count);
- }
-
+ }
+
+ TCounterPtr GetCounter(ECounter counter)
+ {
+ return SimpleCounters[counter];
+ }
+
+ TCounterPtr GetCounter(const TString &kind,
+ ECounter counter)
+ {
+ auto key = std::make_pair(kind, counter);
+ auto it = KindCounters.find(key);
+ if (it != KindCounters.end())
+ return it->second;
+
+ auto group = Counters->GetSubgroup("kind", key.first);
+ auto res = group->GetCounter(SensorName(counter), IsDeriv(counter));
+ KindCounters[key] = res;
+
+ return res;
+ }
+
+ TCounterPtr GetCounter(const TString &kind,
+ const TString &zone,
+ ECounter counter)
+ {
+ auto key = std::make_tuple(kind, zone, counter);
+ auto it = KindZoneCounters.find(key);
+ if (it != KindZoneCounters.end())
+ return it->second;
+
+ auto group1 = Counters->GetSubgroup("kind", kind);
+ auto group2 = group1->GetSubgroup("zone", zone);
+ auto res = group2->GetCounter(SensorName(counter), IsDeriv(counter));
+ KindZoneCounters[key] = res;
+
+ return res;
+ }
+
+ TCounterPtr GetCounter(Ydb::StatusIds::StatusCode code,
+ ECounter counter)
+ {
+ auto key = std::make_pair(code, counter);
+ auto it = StatusCounters.find(key);
+ if (it != StatusCounters.end())
+ return it->second;
+
+ auto group = Counters->GetSubgroup("status", ToString(key.first));
+ auto res = group->GetCounter(SensorName(counter), IsDeriv(counter));
+ StatusCounters[key] = res;
+
+ return res;
+ }
+
+ void Inc(ECounter counter,
+ ui64 delta = 1)
+ {
+ GetCounter(counter)->Add(delta);
+ }
+
+ void Dec(ECounter counter,
+ ui64 delta = 1)
+ {
+ GetCounter(counter)->Sub(delta);
+ }
+
+ ui64 Get(ECounter counter)
+ {
+ return GetCounter(counter)->Val();
+ }
+
+ void Set(ECounter counter,
+ ui64 val)
+ {
+ *GetCounter(counter) = val;
+ }
+
+ void Inc(const TString &kind,
+ ECounter counter,
+ ui64 delta = 1)
+ {
+ GetCounter(kind, counter)->Add(delta);
+ }
+
+ void Dec(const TString &kind,
+ ECounter counter,
+ ui64 delta = 1)
+ {
+ GetCounter(kind, counter)->Sub(delta);
+ }
+
+ ui64 Get(const TString &kind,
+ ECounter counter)
+ {
+ return GetCounter(kind, counter)->Val();
+ }
+
+ void Set(const TString &kind,
+ ECounter counter,
+ ui64 val)
+ {
+ *GetCounter(kind, counter) = val;
+ }
+
+ void Inc(const TString &kind,
+ const TString &zone,
+ ECounter counter,
+ ui64 delta = 1)
+ {
+ GetCounter(kind, zone, counter)->Add(delta);
+ }
+
+ void Dec(const TString &kind,
+ const TString &zone,
+ ECounter counter,
+ ui64 delta = 1)
+ {
+ GetCounter(kind, zone, counter)->Sub(delta);
+ }
+
+ ui64 Get(const TString &kind,
+ const TString &zone,
+ ECounter counter)
+ {
+ return GetCounter(kind, zone, counter)->Val();
+ }
+
+ void Set(const TString &kind,
+ const TString &zone,
+ ECounter counter,
+ ui64 val)
+ {
+ *GetCounter(kind, zone, counter) = val;
+ }
+
+ void Inc(Ydb::StatusIds::StatusCode code,
+ ECounter counter,
+ ui64 delta = 1)
+ {
+ GetCounter(code, counter)->Add(delta);
+ }
+
+ void AddUnits(const TUnitsCount &units);
+ void RemoveUnits(const TUnitsCount &units);
+
+ private:
+ TDynamicCounterPtr Counters;
+ std::array<TCounterPtr, COUNTER_COUNT_SIMPLE> SimpleCounters;
+ THashMap<std::pair<TString, ECounter>, TCounterPtr> KindCounters;
+ THashMap<std::tuple<TString, TString, ECounter>, TCounterPtr> KindZoneCounters;
+ THashMap<std::pair<Ydb::StatusIds::StatusCode, ECounter>, TCounterPtr> StatusCounters;
+ };
+
+ //////////////////////////////////////////////////
+ // State
+ //////////////////////////////////////////////////
+
+ struct TStoragePool : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TStoragePool>;
+
+ enum EState {
+ NOT_ALLOCATED,
+ NOT_UPDATED,
+ ALLOCATED,
+ DELETED,
+ };
+
+ TStoragePool(const TString &kind, const NKikimrBlobStorage::TDefineStoragePool &config)
+ : Kind(kind)
+ , Config(config)
+ , AllocatedNumGroups(0)
+ , State(NOT_ALLOCATED)
+ {
+ Config.SetKind(kind);
+ }
+
+ TStoragePool(const TString &name, const TString &kind, ui64 size,
+ const NKikimrBlobStorage::TDefineStoragePool &config)
+ : TStoragePool(kind, config)
+ {
+ Config.SetName(name);
+ Config.SetNumGroups(size);
+ }
+
+ TStoragePool(const TStoragePool &other) = default;
+
+ void AddRequiredGroups(ui64 count)
+ {
+ Config.SetNumGroups(Config.GetNumGroups() + count);
+ }
+
void RevertRequiredGroups()
{
Config.SetNumGroups(AllocatedNumGroups);
}
- ui64 GetGroups() const
- {
- return Config.GetNumGroups();
- }
-
- void SetScopeId(ui64 schemeShardId,
- ui64 pathId)
- {
- SetScopeId(Config, schemeShardId, pathId);
- }
-
+ ui64 GetGroups() const
+ {
+ return Config.GetNumGroups();
+ }
+
+ void SetScopeId(ui64 schemeShardId,
+ ui64 pathId)
+ {
+ SetScopeId(Config, schemeShardId, pathId);
+ }
+
void SetScopeId(const TDomainId& domainId)
{
SetScopeId(Config, domainId.OwnerId, domainId.LocalPathId);
}
- static void SetScopeId(NKikimrBlobStorage::TDefineStoragePool &config,
- ui64 schemeShardId,
- ui64 pathId)
- {
- config.MutableScopeId()->SetX1(schemeShardId);
- config.MutableScopeId()->SetX2(pathId);
- }
-
- TString Kind;
- NKikimrBlobStorage::TDefineStoragePool Config;
- ui64 AllocatedNumGroups;
- EState State;
- TString Issue;
+ static void SetScopeId(NKikimrBlobStorage::TDefineStoragePool &config,
+ ui64 schemeShardId,
+ ui64 pathId)
+ {
+ config.MutableScopeId()->SetX1(schemeShardId);
+ config.MutableScopeId()->SetX2(pathId);
+ }
+
+ TString Kind;
+ NKikimrBlobStorage::TDefineStoragePool Config;
+ ui64 AllocatedNumGroups;
+ EState State;
+ TString Issue;
TActorId Worker;
size_t GroupFitErrors = 0;
- };
-
- struct TTenantSlotKind {
- TString Kind;
- TString TenantSlotType;
- TSet<TString> AllowedZones;
-
- bool operator==(const NKikimr::NConsole::TTenantsManager::TTenantSlotKind &rhs) const
- {
- return (Kind == rhs.Kind
- && TenantSlotType == rhs.TenantSlotType
- && AllowedZones == rhs.AllowedZones);
- }
-
- bool operator!=(const NKikimr::NConsole::TTenantsManager::TTenantSlotKind &rhs)
- {
- return !(*this == rhs);
- }
- };
-
- struct TAvailabilityZone {
- TString Name;
- TString DataCenter;
- bool ForceLocation;
- ui32 CollocationGroup;
- bool ForceCollocation;
-
- TAvailabilityZone()
- : ForceLocation(true)
- , CollocationGroup(0)
- , ForceCollocation(false)
- {
- }
-
- TAvailabilityZone(const TAvailabilityZone &other) = default;
- TAvailabilityZone(TAvailabilityZone &&other) = default;
-
- TAvailabilityZone(const TString &name,
- const TString &dc,
- bool forceLocation = true,
- ui32 collocationGroup = 0,
- bool forceCollocation = false)
- : Name(name)
- , DataCenter(dc)
- , ForceLocation(forceLocation)
- , CollocationGroup(collocationGroup)
- , ForceCollocation(forceCollocation)
- {
- }
-
- TAvailabilityZone &operator=(const TAvailabilityZone &other) = default;
- TAvailabilityZone &operator=(TAvailabilityZone &&other) = default;
-
- bool operator==(const NKikimr::NConsole::TTenantsManager::TAvailabilityZone &rhs) const
- {
- return (Name == rhs.Name
- && DataCenter == rhs.DataCenter
- && ForceLocation == rhs.ForceLocation
- && CollocationGroup == rhs.CollocationGroup
- && ForceCollocation == rhs.ForceCollocation);
- }
-
- bool operator!=(const NKikimr::NConsole::TTenantsManager::TAvailabilityZone &rhs) const
- {
- return !(*this == rhs);
- }
- };
-
- struct TTenantsConfig {
- TTenantsConfig();
-
- void Clear();
- void Parse(const NKikimrConsole::TTenantsConfig &config);
- bool Parse(const NKikimrConsole::TTenantsConfig &config, TString &error);
- TSlotDescription GetSlotKey(const TString &kind, const TString &zone) const;
- TSlotDescription GetSlotKey(const std::pair<TString, TString> &unit) const;
-
- void ParseComputationalUnits(const TUnitsCount &units,
- TSlotsCount &slots) const;
-
- ui64 DefaultStorageUnitsQuota;
- ui64 DefaultComputationalUnitsQuota;
- THashMap<TString, TAvailabilityZone> AvailabilityZones;
- THashMap<TString, TTenantSlotKind> TenantSlotKinds;
- ui64 TotalComputationalUnitsQuota;
- ui64 TotalComputationalUnitsLoadQuota;
- ui64 TenantsQuota;
- };
-
- struct TAllocatedComputationalUnit {
- TString Host;
- ui32 Port;
- TString Kind;
- };
-
- class TTenant : public TThrRefBase {
- public:
- using TPtr = TIntrusivePtr<TTenant>;
-
- enum EState {
- CREATING_POOLS,
- CREATING_SUBDOMAIN,
- RUNNING,
- REMOVING_UNITS,
- REMOVING_SUBDOMAIN,
- REMOVING_POOLS,
- CONFIGURING_SUBDOMAIN,
- };
-
- enum EAction {
- CREATE = 1,
- REMOVE,
- };
-
- TTenant(const TString &path,
- EState state,
- const TString &token);
-
- static bool IsConfiguringState(EState state);
- static bool IsCreatingState(EState state);
- static bool IsRemovingState(EState state);
- static bool IsRunningState(EState state);
-
- bool IsConfiguring() const;
- bool IsCreating() const;
- bool IsRemoving() const;
- bool IsRunning() const;
- bool HasPoolsToCreate() const;
- bool HasPoolsToDelete() const;
- bool HasSubDomainKey() const;
- TString MakeStoragePoolName(const TString &poolTypeName);
- bool CheckComputationalUnitsQuota(const TUnitsCount &units,
- Ydb::StatusIds::StatusCode &code,
- TString &error);
+ };
+
+ struct TTenantSlotKind {
+ TString Kind;
+ TString TenantSlotType;
+ TSet<TString> AllowedZones;
+
+ bool operator==(const NKikimr::NConsole::TTenantsManager::TTenantSlotKind &rhs) const
+ {
+ return (Kind == rhs.Kind
+ && TenantSlotType == rhs.TenantSlotType
+ && AllowedZones == rhs.AllowedZones);
+ }
+
+ bool operator!=(const NKikimr::NConsole::TTenantsManager::TTenantSlotKind &rhs)
+ {
+ return !(*this == rhs);
+ }
+ };
+
+ struct TAvailabilityZone {
+ TString Name;
+ TString DataCenter;
+ bool ForceLocation;
+ ui32 CollocationGroup;
+ bool ForceCollocation;
+
+ TAvailabilityZone()
+ : ForceLocation(true)
+ , CollocationGroup(0)
+ , ForceCollocation(false)
+ {
+ }
+
+ TAvailabilityZone(const TAvailabilityZone &other) = default;
+ TAvailabilityZone(TAvailabilityZone &&other) = default;
+
+ TAvailabilityZone(const TString &name,
+ const TString &dc,
+ bool forceLocation = true,
+ ui32 collocationGroup = 0,
+ bool forceCollocation = false)
+ : Name(name)
+ , DataCenter(dc)
+ , ForceLocation(forceLocation)
+ , CollocationGroup(collocationGroup)
+ , ForceCollocation(forceCollocation)
+ {
+ }
+
+ TAvailabilityZone &operator=(const TAvailabilityZone &other) = default;
+ TAvailabilityZone &operator=(TAvailabilityZone &&other) = default;
+
+ bool operator==(const NKikimr::NConsole::TTenantsManager::TAvailabilityZone &rhs) const
+ {
+ return (Name == rhs.Name
+ && DataCenter == rhs.DataCenter
+ && ForceLocation == rhs.ForceLocation
+ && CollocationGroup == rhs.CollocationGroup
+ && ForceCollocation == rhs.ForceCollocation);
+ }
+
+ bool operator!=(const NKikimr::NConsole::TTenantsManager::TAvailabilityZone &rhs) const
+ {
+ return !(*this == rhs);
+ }
+ };
+
+ struct TTenantsConfig {
+ TTenantsConfig();
+
+ void Clear();
+ void Parse(const NKikimrConsole::TTenantsConfig &config);
+ bool Parse(const NKikimrConsole::TTenantsConfig &config, TString &error);
+ TSlotDescription GetSlotKey(const TString &kind, const TString &zone) const;
+ TSlotDescription GetSlotKey(const std::pair<TString, TString> &unit) const;
+
+ void ParseComputationalUnits(const TUnitsCount &units,
+ TSlotsCount &slots) const;
+
+ ui64 DefaultStorageUnitsQuota;
+ ui64 DefaultComputationalUnitsQuota;
+ THashMap<TString, TAvailabilityZone> AvailabilityZones;
+ THashMap<TString, TTenantSlotKind> TenantSlotKinds;
+ ui64 TotalComputationalUnitsQuota;
+ ui64 TotalComputationalUnitsLoadQuota;
+ ui64 TenantsQuota;
+ };
+
+ struct TAllocatedComputationalUnit {
+ TString Host;
+ ui32 Port;
+ TString Kind;
+ };
+
+ class TTenant : public TThrRefBase {
+ public:
+ using TPtr = TIntrusivePtr<TTenant>;
+
+ enum EState {
+ CREATING_POOLS,
+ CREATING_SUBDOMAIN,
+ RUNNING,
+ REMOVING_UNITS,
+ REMOVING_SUBDOMAIN,
+ REMOVING_POOLS,
+ CONFIGURING_SUBDOMAIN,
+ };
+
+ enum EAction {
+ CREATE = 1,
+ REMOVE,
+ };
+
+ TTenant(const TString &path,
+ EState state,
+ const TString &token);
+
+ static bool IsConfiguringState(EState state);
+ static bool IsCreatingState(EState state);
+ static bool IsRemovingState(EState state);
+ static bool IsRunningState(EState state);
+
+ bool IsConfiguring() const;
+ bool IsCreating() const;
+ bool IsRemoving() const;
+ bool IsRunning() const;
+ bool HasPoolsToCreate() const;
+ bool HasPoolsToDelete() const;
+ bool HasSubDomainKey() const;
+ TString MakeStoragePoolName(const TString &poolTypeName);
+ bool CheckComputationalUnitsQuota(const TUnitsCount &units,
+ Ydb::StatusIds::StatusCode &code,
+ TString &error);
bool CheckStorageUnitsQuota(Ydb::StatusIds::StatusCode &code, TString &error, ui64 additionalUnits = 0);
bool CheckQuota(Ydb::StatusIds::StatusCode &code, TString &error);
- void ParseComputationalUnits(const TTenantsConfig &config);
- void RemoveComputationalUnits();
-
- TString Path;
- EState State;
- ui64 Coordinators;
- ui64 Mediators;
- ui64 PlanResolution;
- ui32 TimeCastBucketsPerMediator;
+ void ParseComputationalUnits(const TTenantsConfig &config);
+ void RemoveComputationalUnits();
+
+ TString Path;
+ EState State;
+ ui64 Coordinators;
+ ui64 Mediators;
+ ui64 PlanResolution;
+ ui32 TimeCastBucketsPerMediator;
TActorId Worker;
- // <type> -> pool
- THashMap<TString, TStoragePool::TPtr> StoragePools;
- // <kind, az> -> count
- TUnitsCount ComputationalUnits;
- // <host, port> -> TAllocatedComputationalUnit
- THashMap<std::pair<TString, ui32>, TAllocatedComputationalUnit> RegisteredComputationalUnits;
- // <type, dc> -> count
- TSlotsCount Slots;
- bool SlotsAllocationConfirmed;
- TVector<TAutoPtr<IEventHandle>> StatusRequests;
- ui64 StorageUnitsQuota;
- ui64 ComputationalUnitsQuota;
+ // <type> -> pool
+ THashMap<TString, TStoragePool::TPtr> StoragePools;
+ // <kind, az> -> count
+ TUnitsCount ComputationalUnits;
+ // <host, port> -> TAllocatedComputationalUnit
+ THashMap<std::pair<TString, ui32>, TAllocatedComputationalUnit> RegisteredComputationalUnits;
+ // <type, dc> -> count
+ TSlotsCount Slots;
+ bool SlotsAllocationConfirmed;
+ TVector<TAutoPtr<IEventHandle>> StatusRequests;
+ ui64 StorageUnitsQuota;
+ ui64 ComputationalUnitsQuota;
TVector<TActorId> Subscribers;
- // Error code and issue are used to report the last
- // problem with tenant.
- Ydb::StatusIds::StatusCode ErrorCode;
- TString Issue;
- ui64 TxId;
- NACLib::TUserToken UserToken;
- // Subdomain version is incremented on each pool creation.
- ui64 SubdomainVersion;
- // Last subdomain version configured in SchemeShard.
- ui64 ConfirmedSubdomain;
- // Attributes to attach to subdomain.
+ // Error code and issue are used to report the last
+ // problem with tenant.
+ Ydb::StatusIds::StatusCode ErrorCode;
+ TString Issue;
+ ui64 TxId;
+ NACLib::TUserToken UserToken;
+ // Subdomain version is incremented on each pool creation.
+ ui64 SubdomainVersion;
+ // Last subdomain version configured in SchemeShard.
+ ui64 ConfirmedSubdomain;
+ // Attributes to attach to subdomain.
NKikimrSchemeOp::TAlterUserAttributes Attributes;
- // Current generation.
- ui64 Generation;
- // Subdomain ID.
+ // Current generation.
+ ui64 Generation;
+ // Subdomain ID.
TDomainId DomainId;
TDomainId SharedDomainId;
bool IsExternalSubdomain;
@@ -526,342 +526,342 @@ public:
TMaybe<Ydb::Cms::DatabaseQuotas> DatabaseQuotas;
TString CreateIdempotencyKey;
TString AlterIdempotencyKey;
- };
-
- struct TRemovedTenant {
- TString Path;
- TString Issue;
- ui64 TxId;
- // Status code for removal operation.
- Ydb::StatusIds::StatusCode Code;
- // Error code copied from tenant state.
- Ydb::StatusIds::StatusCode ErrorCode;
+ };
+
+ struct TRemovedTenant {
+ TString Path;
+ TString Issue;
+ ui64 TxId;
+ // Status code for removal operation.
+ Ydb::StatusIds::StatusCode Code;
+ // Error code copied from tenant state.
+ Ydb::StatusIds::StatusCode ErrorCode;
// Idempotency key used in a creation request
TString CreateIdempotencyKey;
- };
-
- struct TSlotStats {
- struct TSlotCounters {
- ui64 Allocated = 0;
- ui64 Connected = 0;
- ui64 Free = 0;
- };
-
- THashMap<TString, TSlotCounters> SlotsByType;
- TSlotCounters Total;
-
- TSlotStats() = default;
-
- void Clear();
-
- void AllocateSlots(const TSlotsCount &slots);
- void DeallocateSlots(const TSlotsCount &slots);
-
- void UpdateStats(const NKikimrTenantSlotBroker::TSlotStats &stats);
- };
-
-public:
- //////////////////////////////////////////////////
- // PRIVATE EVENTS
- //////////////////////////////////////////////////
-
- struct TEvPrivate {
- enum EEv {
- EvStateLoaded = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
- EvSubdomainFailed,
- EvSubdomainCreated,
- EvSubdomainKey,
- EvSubdomainReady,
- EvSubdomainRemoved,
- EvRetryAllocateResources,
- EvPoolAllocated,
- EvPoolFailed,
- EvPoolDeleted,
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
-
- struct TEvStateLoaded : public TEventLocal<TEvStateLoaded, EvStateLoaded> {};
-
- struct TEvSubdomainFailed : public TEventLocal<TEvSubdomainFailed, EvSubdomainFailed> {
- TEvSubdomainFailed(TTenant::TPtr tenant,
- const TString &issue,
- Ydb::StatusIds::StatusCode code = Ydb::StatusIds::GENERIC_ERROR)
- : Tenant(tenant)
- , Issue(issue)
- , Code(code)
- {
- }
-
- TTenant::TPtr Tenant;
- TString Issue;
- Ydb::StatusIds::StatusCode Code;
- };
-
- struct TEvSubdomainCreated : public TEventLocal<TEvSubdomainCreated, EvSubdomainCreated> {
- TEvSubdomainCreated(TTenant::TPtr tenant, ui64 schemeShardId, ui64 pathId)
- : Tenant(tenant)
- , SchemeShardId(schemeShardId)
- , PathId(pathId)
- {
- }
-
- TTenant::TPtr Tenant;
- ui64 SchemeShardId;
- ui64 PathId;
- };
-
- struct TEvSubdomainKey : public TEventLocal<TEvSubdomainKey, EvSubdomainKey> {
- TEvSubdomainKey(TTenant::TPtr tenant, ui64 schemeShardId, ui64 pathId)
- : Tenant(tenant)
- , SchemeShardId(schemeShardId)
- , PathId(pathId)
- {
- }
-
- TTenant::TPtr Tenant;
- ui64 SchemeShardId;
- ui64 PathId;
- };
-
- struct TEvSubdomainReady : public TEventLocal<TEvSubdomainReady, EvSubdomainReady> {
- TEvSubdomainReady(TTenant::TPtr tenant,
- ui64 version)
- : Tenant(tenant)
- , Version(version)
- {
- }
-
- TTenant::TPtr Tenant;
- ui64 Version;
- };
-
- struct TEvSubdomainRemoved : public TEventLocal<TEvSubdomainRemoved, EvSubdomainRemoved> {
- TEvSubdomainRemoved(TTenant::TPtr tenant)
- : Tenant(tenant)
- {
- }
-
- TTenant::TPtr Tenant;
- };
-
- struct TEvRetryAllocateResources : public TEventLocal<TEvRetryAllocateResources, EvRetryAllocateResources> {
- TEvRetryAllocateResources(const TString &name)
- : TenantName(name)
- {
- }
-
- TString TenantName;
- };
-
- struct TEvPoolAllocated : public TEventLocal<TEvPoolAllocated, EvPoolAllocated> {
- TEvPoolAllocated(TTenant::TPtr tenant, TStoragePool::TPtr pool)
- : Tenant(tenant)
- , Pool(pool)
- {
- }
-
- TTenant::TPtr Tenant;
- TStoragePool::TPtr Pool;
- };
-
- struct TEvPoolFailed : public TEventLocal<TEvPoolFailed, EvPoolFailed> {
- TEvPoolFailed(TTenant::TPtr tenant, TStoragePool::TPtr pool, const TString &issue)
- : Tenant(tenant)
- , Pool(pool)
- , Issue(issue)
- {
- }
-
- TTenant::TPtr Tenant;
- TStoragePool::TPtr Pool;
- TString Issue;
- };
-
- struct TEvPoolDeleted : public TEventLocal<TEvPoolDeleted, EvPoolDeleted> {
- TEvPoolDeleted(TTenant::TPtr tenant, TStoragePool::TPtr pool)
- : Tenant(tenant)
- , Pool(pool)
- {
- }
-
- TTenant::TPtr Tenant;
- TStoragePool::TPtr Pool;
- };
- };
-
-public:
- class TTxAlterTenant;
- class TTxCreateTenant;
- class TTxRemoveComputationalUnits;
- class TTxRemoveTenant;
- class TTxRemoveTenantDone;
- class TTxRemoveTenantFailed;
- class TTxUpdateConfirmedSubdomain;
- class TTxUpdatePoolState;
+ };
+
+ struct TSlotStats {
+ struct TSlotCounters {
+ ui64 Allocated = 0;
+ ui64 Connected = 0;
+ ui64 Free = 0;
+ };
+
+ THashMap<TString, TSlotCounters> SlotsByType;
+ TSlotCounters Total;
+
+ TSlotStats() = default;
+
+ void Clear();
+
+ void AllocateSlots(const TSlotsCount &slots);
+ void DeallocateSlots(const TSlotsCount &slots);
+
+ void UpdateStats(const NKikimrTenantSlotBroker::TSlotStats &stats);
+ };
+
+public:
+ //////////////////////////////////////////////////
+ // PRIVATE EVENTS
+ //////////////////////////////////////////////////
+
+ struct TEvPrivate {
+ enum EEv {
+ EvStateLoaded = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
+ EvSubdomainFailed,
+ EvSubdomainCreated,
+ EvSubdomainKey,
+ EvSubdomainReady,
+ EvSubdomainRemoved,
+ EvRetryAllocateResources,
+ EvPoolAllocated,
+ EvPoolFailed,
+ EvPoolDeleted,
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
+
+ struct TEvStateLoaded : public TEventLocal<TEvStateLoaded, EvStateLoaded> {};
+
+ struct TEvSubdomainFailed : public TEventLocal<TEvSubdomainFailed, EvSubdomainFailed> {
+ TEvSubdomainFailed(TTenant::TPtr tenant,
+ const TString &issue,
+ Ydb::StatusIds::StatusCode code = Ydb::StatusIds::GENERIC_ERROR)
+ : Tenant(tenant)
+ , Issue(issue)
+ , Code(code)
+ {
+ }
+
+ TTenant::TPtr Tenant;
+ TString Issue;
+ Ydb::StatusIds::StatusCode Code;
+ };
+
+ struct TEvSubdomainCreated : public TEventLocal<TEvSubdomainCreated, EvSubdomainCreated> {
+ TEvSubdomainCreated(TTenant::TPtr tenant, ui64 schemeShardId, ui64 pathId)
+ : Tenant(tenant)
+ , SchemeShardId(schemeShardId)
+ , PathId(pathId)
+ {
+ }
+
+ TTenant::TPtr Tenant;
+ ui64 SchemeShardId;
+ ui64 PathId;
+ };
+
+ struct TEvSubdomainKey : public TEventLocal<TEvSubdomainKey, EvSubdomainKey> {
+ TEvSubdomainKey(TTenant::TPtr tenant, ui64 schemeShardId, ui64 pathId)
+ : Tenant(tenant)
+ , SchemeShardId(schemeShardId)
+ , PathId(pathId)
+ {
+ }
+
+ TTenant::TPtr Tenant;
+ ui64 SchemeShardId;
+ ui64 PathId;
+ };
+
+ struct TEvSubdomainReady : public TEventLocal<TEvSubdomainReady, EvSubdomainReady> {
+ TEvSubdomainReady(TTenant::TPtr tenant,
+ ui64 version)
+ : Tenant(tenant)
+ , Version(version)
+ {
+ }
+
+ TTenant::TPtr Tenant;
+ ui64 Version;
+ };
+
+ struct TEvSubdomainRemoved : public TEventLocal<TEvSubdomainRemoved, EvSubdomainRemoved> {
+ TEvSubdomainRemoved(TTenant::TPtr tenant)
+ : Tenant(tenant)
+ {
+ }
+
+ TTenant::TPtr Tenant;
+ };
+
+ struct TEvRetryAllocateResources : public TEventLocal<TEvRetryAllocateResources, EvRetryAllocateResources> {
+ TEvRetryAllocateResources(const TString &name)
+ : TenantName(name)
+ {
+ }
+
+ TString TenantName;
+ };
+
+ struct TEvPoolAllocated : public TEventLocal<TEvPoolAllocated, EvPoolAllocated> {
+ TEvPoolAllocated(TTenant::TPtr tenant, TStoragePool::TPtr pool)
+ : Tenant(tenant)
+ , Pool(pool)
+ {
+ }
+
+ TTenant::TPtr Tenant;
+ TStoragePool::TPtr Pool;
+ };
+
+ struct TEvPoolFailed : public TEventLocal<TEvPoolFailed, EvPoolFailed> {
+ TEvPoolFailed(TTenant::TPtr tenant, TStoragePool::TPtr pool, const TString &issue)
+ : Tenant(tenant)
+ , Pool(pool)
+ , Issue(issue)
+ {
+ }
+
+ TTenant::TPtr Tenant;
+ TStoragePool::TPtr Pool;
+ TString Issue;
+ };
+
+ struct TEvPoolDeleted : public TEventLocal<TEvPoolDeleted, EvPoolDeleted> {
+ TEvPoolDeleted(TTenant::TPtr tenant, TStoragePool::TPtr pool)
+ : Tenant(tenant)
+ , Pool(pool)
+ {
+ }
+
+ TTenant::TPtr Tenant;
+ TStoragePool::TPtr Pool;
+ };
+ };
+
+public:
+ class TTxAlterTenant;
+ class TTxCreateTenant;
+ class TTxRemoveComputationalUnits;
+ class TTxRemoveTenant;
+ class TTxRemoveTenantDone;
+ class TTxRemoveTenantFailed;
+ class TTxUpdateConfirmedSubdomain;
+ class TTxUpdatePoolState;
class TTxRevertPoolState;
- class TTxUpdateSubDomainKey;
- class TTxUpdateTenantState;
-
- ITransaction *CreateTxAlterTenant(TEvConsole::TEvAlterTenantRequest::TPtr &ev);
- ITransaction *CreateTxCreateTenant(TEvConsole::TEvCreateTenantRequest::TPtr &ev);
- ITransaction *CreateTxRemoveComputationalUnits(TTenant::TPtr tenant);
- ITransaction *CreateTxRemoveTenant(TEvConsole::TEvRemoveTenantRequest::TPtr &ev);
- ITransaction *CreateTxRemoveTenantDone(TTenant::TPtr tenant);
- ITransaction *CreateTxRemoveTenantFailed(TTenant::TPtr tenant,
- Ydb::StatusIds::StatusCode code);
- ITransaction *CreateTxUpdateConfirmedSubdomain(const TString &name,
- ui64 version,
+ class TTxUpdateSubDomainKey;
+ class TTxUpdateTenantState;
+
+ ITransaction *CreateTxAlterTenant(TEvConsole::TEvAlterTenantRequest::TPtr &ev);
+ ITransaction *CreateTxCreateTenant(TEvConsole::TEvCreateTenantRequest::TPtr &ev);
+ ITransaction *CreateTxRemoveComputationalUnits(TTenant::TPtr tenant);
+ ITransaction *CreateTxRemoveTenant(TEvConsole::TEvRemoveTenantRequest::TPtr &ev);
+ ITransaction *CreateTxRemoveTenantDone(TTenant::TPtr tenant);
+ ITransaction *CreateTxRemoveTenantFailed(TTenant::TPtr tenant,
+ Ydb::StatusIds::StatusCode code);
+ ITransaction *CreateTxUpdateConfirmedSubdomain(const TString &name,
+ ui64 version,
TActorId worker);
- ITransaction *CreateTxUpdateTenantState(const TString &name,
- TTenant::EState state,
+ ITransaction *CreateTxUpdateTenantState(const TString &name,
+ TTenant::EState state,
TActorId worker = TActorId());
- ITransaction *CreateTxUpdateSubDomainKey(const TString &path,
- ui64 schemeShardId,
- ui64 pathId,
+ ITransaction *CreateTxUpdateSubDomainKey(const TString &path,
+ ui64 schemeShardId,
+ ui64 pathId,
TActorId worker);
- ITransaction *CreateTxUpdatePoolState(TTenant::TPtr tenant,
- TStoragePool::TPtr pool,
+ ITransaction *CreateTxUpdatePoolState(TTenant::TPtr tenant,
+ TStoragePool::TPtr pool,
TActorId worker,
- TStoragePool::EState state);
+ TStoragePool::EState state);
ITransaction *CreateTxRevertPoolState(TTenant::TPtr tenant,
TStoragePool::TPtr pool,
TActorId worker);
-
- void ClearState();
- void SetConfig(const NKikimrConsole::TTenantsConfig &config);
-
- TTenant::TPtr FindZoneKindUsage(const TString &kind);
- TTenant::TPtr FindComputationalUnitKindUsage(const TString &kind);
- TTenant::TPtr FindComputationalUnitKindUsage(const TString &kind, const TString &zone);
-
- TTenant::TPtr GetTenant(const TString &name);
+
+ void ClearState();
+ void SetConfig(const NKikimrConsole::TTenantsConfig &config);
+
+ TTenant::TPtr FindZoneKindUsage(const TString &kind);
+ TTenant::TPtr FindComputationalUnitKindUsage(const TString &kind);
+ TTenant::TPtr FindComputationalUnitKindUsage(const TString &kind, const TString &zone);
+
+ TTenant::TPtr GetTenant(const TString &name);
TTenant::TPtr GetTenant(const TDomainId &domainId);
- void AddTenant(TTenant::TPtr tenant);
- void RemoveTenant(TTenant::TPtr tenant);
- void RemoveTenantFailed(TTenant::TPtr tenant,
- Ydb::StatusIds::StatusCode code);
- void ChangeTenantState(TTenant::TPtr tenant,
- TTenant::EState state,
- const TActorContext &ctx);
- bool CheckTenantSlots(TTenant::TPtr tenant, const NKikimrTenantSlotBroker::TTenantState &state);
- bool HasEnoughPoolIds(ui64 count);
+ void AddTenant(TTenant::TPtr tenant);
+ void RemoveTenant(TTenant::TPtr tenant);
+ void RemoveTenantFailed(TTenant::TPtr tenant,
+ Ydb::StatusIds::StatusCode code);
+ void ChangeTenantState(TTenant::TPtr tenant,
+ TTenant::EState state,
+ const TActorContext &ctx);
+ bool CheckTenantSlots(TTenant::TPtr tenant, const NKikimrTenantSlotBroker::TTenantState &state);
+ bool HasEnoughPoolIds(ui64 count);
bool MakeBasicPoolCheck(const TString &type, ui64 count, Ydb::StatusIds::StatusCode &code, TString &error);
- bool MakeBasicComputationalUnitCheck(const TString &kind, const TString &zone,
+ bool MakeBasicComputationalUnitCheck(const TString &kind, const TString &zone,
Ydb::StatusIds::StatusCode &code,
- TString &error);
- // Check we have enough quota to replace computational units
- // of specified tenant with new ones.
- bool CheckComputationalUnitsQuota(const TUnitsCount &units,
- TTenant::TPtr tenant,
- Ydb::StatusIds::StatusCode &code,
- TString &error);
- // Check if we have enough quota to allocate specified computational units.
- bool CheckComputationalUnitsQuota(const TUnitsCount &units,
- Ydb::StatusIds::StatusCode &code,
- TString &error);
- bool CheckTenantsConfig(const NKikimrConsole::TTenantsConfig &config,
+ TString &error);
+ // Check we have enough quota to replace computational units
+ // of specified tenant with new ones.
+ bool CheckComputationalUnitsQuota(const TUnitsCount &units,
+ TTenant::TPtr tenant,
+ Ydb::StatusIds::StatusCode &code,
+ TString &error);
+ // Check if we have enough quota to allocate specified computational units.
+ bool CheckComputationalUnitsQuota(const TUnitsCount &units,
+ Ydb::StatusIds::StatusCode &code,
+ TString &error);
+ bool CheckTenantsConfig(const NKikimrConsole::TTenantsConfig &config,
Ydb::StatusIds::StatusCode &code,
- TString &error);
- bool CheckAccess(const TString &token,
- Ydb::StatusIds::StatusCode &code,
- TString &error,
- const TActorContext &ctx);
+ TString &error);
+ bool CheckAccess(const TString &token,
+ Ydb::StatusIds::StatusCode &code,
+ TString &error,
+ const TActorContext &ctx);
Ydb::TOperationId MakeOperationId(const TString &path, ui64 txId, TTenant::EAction action);
Ydb::TOperationId MakeOperationId(TTenant::TPtr tenant, TTenant::EAction action);
- TStoragePool::TPtr MakeStoragePool(TTenant::TPtr tenant, const TString &kind, ui64 size);
-
- void CreateSubDomain(TTenant::TPtr tenant, const TActorContext &ctx);
- void OpenSchemeShardPipe(const TActorContext &ctx);
- void OnSchemeShardPipeDestroyed(const TActorContext &ctx);
- void OpenTenantSlotBrokerPipe(const TActorContext &ctx);
- void OnTenantSlotBrokerPipeDestroyed(const TActorContext &ctx);
- void AllocateTenantPools(TTenant::TPtr tenant, const TActorContext &ctx);
- void DeleteTenantPools(TTenant::TPtr tenant, const TActorContext &ctx);
- void RequestTenantResources(TTenant::TPtr tenant, const TActorContext &ctx);
- void RequestTenantSlotsState(TTenant::TPtr tenant, const TActorContext &ctx);
- void RequestTenantSlotsStats(const TActorContext &ctx);
- void RetryResourcesRequests(const TActorContext &ctx);
-
+ TStoragePool::TPtr MakeStoragePool(TTenant::TPtr tenant, const TString &kind, ui64 size);
+
+ void CreateSubDomain(TTenant::TPtr tenant, const TActorContext &ctx);
+ void OpenSchemeShardPipe(const TActorContext &ctx);
+ void OnSchemeShardPipeDestroyed(const TActorContext &ctx);
+ void OpenTenantSlotBrokerPipe(const TActorContext &ctx);
+ void OnTenantSlotBrokerPipeDestroyed(const TActorContext &ctx);
+ void AllocateTenantPools(TTenant::TPtr tenant, const TActorContext &ctx);
+ void DeleteTenantPools(TTenant::TPtr tenant, const TActorContext &ctx);
+ void RequestTenantResources(TTenant::TPtr tenant, const TActorContext &ctx);
+ void RequestTenantSlotsState(TTenant::TPtr tenant, const TActorContext &ctx);
+ void RequestTenantSlotsStats(const TActorContext &ctx);
+ void RetryResourcesRequests(const TActorContext &ctx);
+
void FillTenantStatus(TTenant::TPtr tenant, Ydb::Cms::GetDatabaseStatusResult &status);
void FillTenantAllocatedSlots(TTenant::TPtr tenant, Ydb::Cms::GetDatabaseStatusResult &status,
- const NKikimrTenantSlotBroker::TTenantState &slots);
- void CheckSubDomainKey(TTenant::TPtr tenant, const TActorContext &ctx);
- void ConfigureTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx);
- void CreateTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx);
- void DeleteTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx);
- void ProcessTenantActions(TTenant::TPtr tenant, const TActorContext &ctx);
+ const NKikimrTenantSlotBroker::TTenantState &slots);
+ void CheckSubDomainKey(TTenant::TPtr tenant, const TActorContext &ctx);
+ void ConfigureTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx);
+ void CreateTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx);
+ void DeleteTenantSubDomain(TTenant::TPtr tenant, const TActorContext &ctx);
+ void ProcessTenantActions(TTenant::TPtr tenant, const TActorContext &ctx);
TTenant::TPtr FillOperationStatus(const TString &id, Ydb::Operations::Operation &operation);
- void SendTenantNotifications(TTenant::TPtr tenant, TTenant::EAction action,
- Ydb::StatusIds::StatusCode code, const TActorContext &ctx);
- void DumpStateHTML(IOutputStream &os);
-
- void ProcessOrDelayTx(ITransaction *tx,
- const TActorContext &ctx);
-
- void DbAddTenant(TTenant::TPtr tenant,
- TTransactionContext &txc,
- const TActorContext &ctx);
- bool DbLoadState(TTransactionContext &txc,
- const TActorContext &ctx);
- void DbRemoveComputationalUnit(TTenant::TPtr tenant,
- const TString &kind,
- const TString &zone,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbRemoveComputationalUnits(TTenant::TPtr tenant,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbRemoveRegisteredUnit(TTenant::TPtr tenant,
- const TString &host,
- ui32 port,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbRemoveTenantAndPools(TTenant::TPtr tenant,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdateComputationalUnit(TTenant::TPtr tenant,
- const TString &kind,
- const TString &zone,
- ui64 count,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdateConfirmedSubdomain(TTenant::TPtr tenant,
- ui64 version,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdatePool(TTenant::TPtr tenant,
- TStoragePool::TPtr pool,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdatePoolConfig(TTenant::TPtr tenant,
- TStoragePool::TPtr pool,
- const NKikimrBlobStorage::TDefineStoragePool &config,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdatePoolState(TTenant::TPtr tenant,
- TStoragePool::TPtr pool,
- TStoragePool::EState state,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdatePoolState(TTenant::TPtr tenant,
- TStoragePool::TPtr pool,
- TStoragePool::EState state,
- ui32 allocatedNumGroups,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdateRegisteredUnit(TTenant::TPtr tenant,
- const TString &host,
- ui32 port,
- const TString &kind,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdateRemovedTenant(TTenant::TPtr tenant,
- Ydb::StatusIds::StatusCode code,
- TTransactionContext &txc,
- const TActorContext &ctx);
+ void SendTenantNotifications(TTenant::TPtr tenant, TTenant::EAction action,
+ Ydb::StatusIds::StatusCode code, const TActorContext &ctx);
+ void DumpStateHTML(IOutputStream &os);
+
+ void ProcessOrDelayTx(ITransaction *tx,
+ const TActorContext &ctx);
+
+ void DbAddTenant(TTenant::TPtr tenant,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ bool DbLoadState(TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbRemoveComputationalUnit(TTenant::TPtr tenant,
+ const TString &kind,
+ const TString &zone,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbRemoveComputationalUnits(TTenant::TPtr tenant,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbRemoveRegisteredUnit(TTenant::TPtr tenant,
+ const TString &host,
+ ui32 port,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbRemoveTenantAndPools(TTenant::TPtr tenant,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdateComputationalUnit(TTenant::TPtr tenant,
+ const TString &kind,
+ const TString &zone,
+ ui64 count,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdateConfirmedSubdomain(TTenant::TPtr tenant,
+ ui64 version,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdatePool(TTenant::TPtr tenant,
+ TStoragePool::TPtr pool,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdatePoolConfig(TTenant::TPtr tenant,
+ TStoragePool::TPtr pool,
+ const NKikimrBlobStorage::TDefineStoragePool &config,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdatePoolState(TTenant::TPtr tenant,
+ TStoragePool::TPtr pool,
+ TStoragePool::EState state,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdatePoolState(TTenant::TPtr tenant,
+ TStoragePool::TPtr pool,
+ TStoragePool::EState state,
+ ui32 allocatedNumGroups,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdateRegisteredUnit(TTenant::TPtr tenant,
+ const TString &host,
+ ui32 port,
+ const TString &kind,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdateRemovedTenant(TTenant::TPtr tenant,
+ Ydb::StatusIds::StatusCode code,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
void DbUpdateTenantAlterIdempotencyKey(TTenant::TPtr tenant,
const TString &idempotencyKey,
TTransactionContext &txc,
@@ -870,27 +870,27 @@ public:
const NKikimrSchemeOp::TAlterUserAttributes &attributes,
TTransactionContext &txc,
const TActorContext &ctx);
- void DbUpdateTenantGeneration(TTenant::TPtr tenant,
- ui64 generation,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdateTenantState(TTenant::TPtr tenant,
- TTenant::EState state,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdateTenantSubdomain(TTenant::TPtr tenant,
- ui64 schemeShardId,
- ui64 pathId,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdateTenantUserToken(TTenant::TPtr tenant,
- const TString &userToken,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void DbUpdateSubdomainVersion(TTenant::TPtr tenant,
- ui64 version,
- TTransactionContext &txc,
- const TActorContext &ctx);
+ void DbUpdateTenantGeneration(TTenant::TPtr tenant,
+ ui64 generation,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdateTenantState(TTenant::TPtr tenant,
+ TTenant::EState state,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdateTenantSubdomain(TTenant::TPtr tenant,
+ ui64 schemeShardId,
+ ui64 pathId,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdateTenantUserToken(TTenant::TPtr tenant,
+ const TString &userToken,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbUpdateSubdomainVersion(TTenant::TPtr tenant,
+ ui64 version,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
void DbUpdateSchemaOperationQuotas(TTenant::TPtr tenant,
const Ydb::Cms::SchemaOperationQuotas &quotas,
TTransactionContext &txc,
@@ -899,138 +899,138 @@ public:
const Ydb::Cms::DatabaseQuotas &quotas,
TTransactionContext &txc,
const TActorContext &ctx);
-
- void Handle(TEvConsole::TEvAlterTenantRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvCreateTenantRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvDescribeTenantOptionsRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvGetOperationRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvGetTenantStatusRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvListTenantsRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvNotifyOperationCompletionRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvConsole::TEvRemoveTenantRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvPoolAllocated::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvPoolDeleted::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvPoolFailed::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvRetryAllocateResources::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvStateLoaded::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvSubdomainFailed::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvSubdomainCreated::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvSubdomainKey::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvSubdomainReady::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvSubdomainRemoved::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTenantSlotBroker::TEvSlotStats::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTenantSlotBroker::TEvTenantState::TPtr &ev, const TActorContext &ctx);
-
- STFUNC(StateWork)
- {
- TRACE_EVENT(NKikimrServices::CMS_TENANTS);
- switch (ev->GetTypeRewrite()) {
- HFuncTraced(TEvConsole::TEvAlterTenantRequest, Handle);
- HFuncTraced(TEvConsole::TEvCreateTenantRequest, Handle);
- HFuncTraced(TEvConsole::TEvDescribeTenantOptionsRequest, Handle);
- HFuncTraced(TEvConsole::TEvGetOperationRequest, Handle);
- HFuncTraced(TEvConsole::TEvGetTenantStatusRequest, Handle);
- HFuncTraced(TEvConsole::TEvListTenantsRequest, Handle);
- HFuncTraced(TEvConsole::TEvNotifyOperationCompletionRequest, Handle);
- HFuncTraced(TEvConsole::TEvRemoveTenantRequest, Handle);
- HFuncTraced(TEvPrivate::TEvStateLoaded, Handle);
- HFuncTraced(TEvPrivate::TEvPoolAllocated, Handle);
- HFuncTraced(TEvPrivate::TEvPoolDeleted, Handle);
- HFuncTraced(TEvPrivate::TEvPoolFailed, Handle);
- HFuncTraced(TEvPrivate::TEvRetryAllocateResources, Handle);
- HFuncTraced(TEvPrivate::TEvSubdomainFailed, Handle);
- HFuncTraced(TEvPrivate::TEvSubdomainCreated, Handle);
- HFuncTraced(TEvPrivate::TEvSubdomainKey, Handle);
- HFuncTraced(TEvPrivate::TEvSubdomainReady, Handle);
- HFuncTraced(TEvPrivate::TEvSubdomainRemoved, Handle);
- HFuncTraced(TEvTabletPipe::TEvClientConnected, Handle);
- HFuncTraced(TEvTabletPipe::TEvClientDestroyed, Handle);
- HFuncTraced(TEvTenantSlotBroker::TEvSlotStats, Handle);
- HFuncTraced(TEvTenantSlotBroker::TEvTenantState, Handle);
-
- default:
- Y_FAIL("TTenantsManager::StateWork unexpected event type: %" PRIx32 " event: %s",
+
+ void Handle(TEvConsole::TEvAlterTenantRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvCreateTenantRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvDescribeTenantOptionsRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvGetOperationRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvGetTenantStatusRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvListTenantsRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvNotifyOperationCompletionRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvConsole::TEvRemoveTenantRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvPoolAllocated::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvPoolDeleted::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvPoolFailed::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvRetryAllocateResources::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvStateLoaded::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvSubdomainFailed::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvSubdomainCreated::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvSubdomainKey::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvSubdomainReady::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvSubdomainRemoved::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTenantSlotBroker::TEvSlotStats::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTenantSlotBroker::TEvTenantState::TPtr &ev, const TActorContext &ctx);
+
+ STFUNC(StateWork)
+ {
+ TRACE_EVENT(NKikimrServices::CMS_TENANTS);
+ switch (ev->GetTypeRewrite()) {
+ HFuncTraced(TEvConsole::TEvAlterTenantRequest, Handle);
+ HFuncTraced(TEvConsole::TEvCreateTenantRequest, Handle);
+ HFuncTraced(TEvConsole::TEvDescribeTenantOptionsRequest, Handle);
+ HFuncTraced(TEvConsole::TEvGetOperationRequest, Handle);
+ HFuncTraced(TEvConsole::TEvGetTenantStatusRequest, Handle);
+ HFuncTraced(TEvConsole::TEvListTenantsRequest, Handle);
+ HFuncTraced(TEvConsole::TEvNotifyOperationCompletionRequest, Handle);
+ HFuncTraced(TEvConsole::TEvRemoveTenantRequest, Handle);
+ HFuncTraced(TEvPrivate::TEvStateLoaded, Handle);
+ HFuncTraced(TEvPrivate::TEvPoolAllocated, Handle);
+ HFuncTraced(TEvPrivate::TEvPoolDeleted, Handle);
+ HFuncTraced(TEvPrivate::TEvPoolFailed, Handle);
+ HFuncTraced(TEvPrivate::TEvRetryAllocateResources, Handle);
+ HFuncTraced(TEvPrivate::TEvSubdomainFailed, Handle);
+ HFuncTraced(TEvPrivate::TEvSubdomainCreated, Handle);
+ HFuncTraced(TEvPrivate::TEvSubdomainKey, Handle);
+ HFuncTraced(TEvPrivate::TEvSubdomainReady, Handle);
+ HFuncTraced(TEvPrivate::TEvSubdomainRemoved, Handle);
+ HFuncTraced(TEvTabletPipe::TEvClientConnected, Handle);
+ HFuncTraced(TEvTabletPipe::TEvClientDestroyed, Handle);
+ HFuncTraced(TEvTenantSlotBroker::TEvSlotStats, Handle);
+ HFuncTraced(TEvTenantSlotBroker::TEvTenantState, Handle);
+
+ default:
+ Y_FAIL("TTenantsManager::StateWork unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
-public:
- TTenantsManager(TConsole &self,
- TDomainsInfo::TDomain::TPtr domain,
+ }
+ }
+
+public:
+ TTenantsManager(TConsole &self,
+ TDomainsInfo::TDomain::TPtr domain,
TDynamicCounterPtr counters,
NKikimrConfig::TFeatureFlags featureFlags)
- : Self(self)
- , Domain(domain)
- , Counters(counters)
+ : Self(self)
+ , Domain(domain)
+ , Counters(counters)
, FeatureFlags(std::move(featureFlags))
- {
- }
-
- ~TTenantsManager()
- {
- ClearState();
- }
-
+ {
+ }
+
+ ~TTenantsManager()
+ {
+ ClearState();
+ }
+
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_TENANTS_MANAGER;
- }
-
- void Bootstrap(const TActorContext &ctx);
- void Detach();
-
-private:
- TConsole &Self;
- TDomainsInfo::TDomain::TPtr Domain;
+ }
+
+ void Bootstrap(const TActorContext &ctx);
+ void Detach();
+
+private:
+ TConsole &Self;
+ TDomainsInfo::TDomain::TPtr Domain;
TActorId TenantSlotBrokerPipe;
- THashMap<TString, TTenant::TPtr> Tenants;
+ THashMap<TString, TTenant::TPtr> Tenants;
THashMap<TDomainId, TString> TenantIdToName;
- THashMap<TString, TRemovedTenant> RemovedTenants;
- TTenantsConfig Config;
- TTxProcessor::TPtr TxProcessor;
- TQueue<THolder<ITransaction>> DelayedTxs;
- TSlotStats SlotStats;
- TCounters Counters;
+ THashMap<TString, TRemovedTenant> RemovedTenants;
+ TTenantsConfig Config;
+ TTxProcessor::TPtr TxProcessor;
+ TQueue<THolder<ITransaction>> DelayedTxs;
+ TSlotStats SlotStats;
+ TCounters Counters;
NKikimrConfig::TFeatureFlags FeatureFlags;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
-
-template<>
-inline void Out<NKikimr::NConsole::TTenantsManager::TTenant::EState>(IOutputStream& o, NKikimr::NConsole::TTenantsManager::TTenant::EState x) {
- if (x == NKikimr::NConsole::TTenantsManager::TTenant::CREATING_POOLS)
- o << "CREATING_POOLS";
- else if (x == NKikimr::NConsole::TTenantsManager::TTenant::CREATING_SUBDOMAIN)
- o << "CREATING_SUBDOMAIN";
- else if (x == NKikimr::NConsole::TTenantsManager::TTenant::RUNNING)
- o << "RUNNING";
- else if (x == NKikimr::NConsole::TTenantsManager::TTenant::REMOVING_UNITS)
- o << "REMOVING_UNITS";
- else if (x == NKikimr::NConsole::TTenantsManager::TTenant::REMOVING_SUBDOMAIN)
- o << "REMOVING_SUBDOMAIN";
- else if (x == NKikimr::NConsole::TTenantsManager::TTenant::REMOVING_POOLS)
- o << "REMOVING_POOLS";
- else if (x == NKikimr::NConsole::TTenantsManager::TTenant::CONFIGURING_SUBDOMAIN)
- o << "CONFIGURING_SUBDOMAIN";
- else
- o << "<UNKNOWN>";
- return;
-}
-
-template<>
-inline void Out<NKikimr::NConsole::TTenantsManager::TStoragePool::EState>(IOutputStream& o, NKikimr::NConsole::TTenantsManager::TStoragePool::EState x) {
- if (x == NKikimr::NConsole::TTenantsManager::TStoragePool::NOT_ALLOCATED)
- o << "NOT_ALLOCATED";
- else if (x == NKikimr::NConsole::TTenantsManager::TStoragePool::NOT_UPDATED)
- o << "NOT_UPDATED";
- else if (x == NKikimr::NConsole::TTenantsManager::TStoragePool::ALLOCATED)
- o << "ALLOCATED";
- else if (x == NKikimr::NConsole::TTenantsManager::TStoragePool::DELETED)
- o << "DELETED";
- else
- o << "<UNKNOWN>";
- return;
-}
+};
+
+} // namespace NConsole
+} // namespace NKikimr
+
+template<>
+inline void Out<NKikimr::NConsole::TTenantsManager::TTenant::EState>(IOutputStream& o, NKikimr::NConsole::TTenantsManager::TTenant::EState x) {
+ if (x == NKikimr::NConsole::TTenantsManager::TTenant::CREATING_POOLS)
+ o << "CREATING_POOLS";
+ else if (x == NKikimr::NConsole::TTenantsManager::TTenant::CREATING_SUBDOMAIN)
+ o << "CREATING_SUBDOMAIN";
+ else if (x == NKikimr::NConsole::TTenantsManager::TTenant::RUNNING)
+ o << "RUNNING";
+ else if (x == NKikimr::NConsole::TTenantsManager::TTenant::REMOVING_UNITS)
+ o << "REMOVING_UNITS";
+ else if (x == NKikimr::NConsole::TTenantsManager::TTenant::REMOVING_SUBDOMAIN)
+ o << "REMOVING_SUBDOMAIN";
+ else if (x == NKikimr::NConsole::TTenantsManager::TTenant::REMOVING_POOLS)
+ o << "REMOVING_POOLS";
+ else if (x == NKikimr::NConsole::TTenantsManager::TTenant::CONFIGURING_SUBDOMAIN)
+ o << "CONFIGURING_SUBDOMAIN";
+ else
+ o << "<UNKNOWN>";
+ return;
+}
+
+template<>
+inline void Out<NKikimr::NConsole::TTenantsManager::TStoragePool::EState>(IOutputStream& o, NKikimr::NConsole::TTenantsManager::TStoragePool::EState x) {
+ if (x == NKikimr::NConsole::TTenantsManager::TStoragePool::NOT_ALLOCATED)
+ o << "NOT_ALLOCATED";
+ else if (x == NKikimr::NConsole::TTenantsManager::TStoragePool::NOT_UPDATED)
+ o << "NOT_UPDATED";
+ else if (x == NKikimr::NConsole::TTenantsManager::TStoragePool::ALLOCATED)
+ o << "ALLOCATED";
+ else if (x == NKikimr::NConsole::TTenantsManager::TStoragePool::DELETED)
+ o << "DELETED";
+ else
+ o << "<UNKNOWN>";
+ return;
+}
diff --git a/ydb/core/cms/console/console_ut_configs.cpp b/ydb/core/cms/console/console_ut_configs.cpp
index 3cc8ae5f323..0cb1655281d 100644
--- a/ydb/core/cms/console/console_ut_configs.cpp
+++ b/ydb/core/cms/console/console_ut_configs.cpp
@@ -1,7 +1,7 @@
-#include "ut_helpers.h"
-#include "console_configs_manager.h"
+#include "ut_helpers.h"
+#include "console_configs_manager.h"
#include "console_configs_subscriber.h"
-
+
#include <ydb/core/base/counters.h>
#include <ydb/core/node_whiteboard/node_whiteboard.h>
#include <ydb/core/base/path.h>
@@ -14,79 +14,79 @@
#include <ydb/core/testlib/tenant_runtime.h>
#include <library/cpp/testing/unittest/registar.h>
-
-#include <util/system/hostname.h>
-
-namespace NKikimr {
-
-using namespace NConsole;
-using namespace NConsole::NUT;
-
-namespace {
-
-TTenantTestConfig::TTenantPoolConfig DefaultTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {},
- // NodeType
- "type1"
- };
- return res;
-}
-
-TTenantTestConfig::TTenantPoolConfig TenantTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {TENANT1_1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {},
- // NodeType
- "type1"
- };
- return res;
-}
-
-TTenantTestConfig::TTenantPoolConfig MultipleTenantsTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {TENANT1_1_NAME, {1, 1, 1}},
- {TENANT1_2_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {},
- // NodeType
- "type1"
- };
- return res;
-}
-
-TTenantTestConfig DefaultConsoleTestConfig()
-{
- TTenantTestConfig res = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- false,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {DefaultTenantPoolConfig()},
- }},
- // DataCenterCount
- 1
- };
- return res;
-}
-
+
+#include <util/system/hostname.h>
+
+namespace NKikimr {
+
+using namespace NConsole;
+using namespace NConsole::NUT;
+
+namespace {
+
+TTenantTestConfig::TTenantPoolConfig DefaultTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {},
+ // NodeType
+ "type1"
+ };
+ return res;
+}
+
+TTenantTestConfig::TTenantPoolConfig TenantTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {TENANT1_1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {},
+ // NodeType
+ "type1"
+ };
+ return res;
+}
+
+TTenantTestConfig::TTenantPoolConfig MultipleTenantsTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {TENANT1_1_NAME, {1, 1, 1}},
+ {TENANT1_2_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {},
+ // NodeType
+ "type1"
+ };
+ return res;
+}
+
+TTenantTestConfig DefaultConsoleTestConfig()
+{
+ TTenantTestConfig res = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ false,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {DefaultTenantPoolConfig()},
+ }},
+ // DataCenterCount
+ 1
+ };
+ return res;
+}
+
TTenantTestConfig MultipleNodesConsoleTestConfig()
{
TTenantTestConfig res = {
@@ -112,2455 +112,2455 @@ TTenantTestConfig MultipleNodesConsoleTestConfig()
return res;
}
-TTenantTestConfig TenantConsoleTestConfig()
-{
- TTenantTestConfig res = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME }}} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- true,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {TenantTenantPoolConfig()},
- }},
- // DataCenterCount
- 1
- };
- return res;
-}
-
-TTenantTestConfig MultipleTenantsConsoleTestConfig()
-{
- TTenantTestConfig res = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME, TENANT1_2_NAME }}} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- true,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {MultipleTenantsTenantPoolConfig()},
- }},
- // DataCenterCount
- 1
- };
- return res;
-}
-
-template <typename TRequestEvent, typename TResponseEvent>
-void CheckGetItems(TTenantTestRuntime &runtime,
- THashMap<ui64, TConfigItem::TPtr> items,
- const typename TRequestEvent::ProtoRecordType &request)
-{
- auto *event = new TRequestEvent;
- event->Record.CopyFrom(request);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TResponseEvent>(handle);
+TTenantTestConfig TenantConsoleTestConfig()
+{
+ TTenantTestConfig res = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME }}} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ true,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {TenantTenantPoolConfig()},
+ }},
+ // DataCenterCount
+ 1
+ };
+ return res;
+}
+
+TTenantTestConfig MultipleTenantsConsoleTestConfig()
+{
+ TTenantTestConfig res = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME, TENANT1_2_NAME }}} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ true,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {MultipleTenantsTenantPoolConfig()},
+ }},
+ // DataCenterCount
+ 1
+ };
+ return res;
+}
+
+template <typename TRequestEvent, typename TResponseEvent>
+void CheckGetItems(TTenantTestRuntime &runtime,
+ THashMap<ui64, TConfigItem::TPtr> items,
+ const typename TRequestEvent::ProtoRecordType &request)
+{
+ auto *event = new TRequestEvent;
+ event->Record.CopyFrom(request);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TResponseEvent>(handle);
UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
-
- for (auto &item : reply->Record.GetConfigItems()) {
- auto it = items.find(item.GetId().GetId());
- UNIT_ASSERT(it != items.end());
- UNIT_ASSERT_VALUES_EQUAL(item.GetId().GetGeneration(), it->second->Generation);
- UNIT_ASSERT_VALUES_EQUAL(item.GetKind(), it->second->Kind);
- UNIT_ASSERT(TUsageScope(item.GetUsageScope(), item.GetOrder()) == it->second->UsageScope);
- UNIT_ASSERT_VALUES_EQUAL(item.GetMergeStrategy(), it->second->MergeStrategy);
- UNIT_ASSERT_VALUES_EQUAL(item.GetConfig().ShortDebugString(), it->second->Config.ShortDebugString());
- UNIT_ASSERT_VALUES_EQUAL(item.GetCookie(), it->second->Cookie);
- items.erase(it);
- }
- UNIT_ASSERT(items.empty());
-}
-
-void CheckGetItems(TTenantTestRuntime &runtime,
- THashMap<ui64, TConfigItem::TPtr> items,
- const NKikimrConsole::TGetConfigItemsRequest &request)
-{
- CheckGetItems<TEvConsole::TEvGetConfigItemsRequest, TEvConsole::TEvGetConfigItemsResponse>
- (runtime, items, request);
-}
-
-void CheckGetItems(TTenantTestRuntime &runtime,
- THashMap<ui64, TConfigItem::TPtr> items,
- const NKikimrConsole::TGetNodeConfigItemsRequest &request)
-{
- CheckGetItems<TEvConsole::TEvGetNodeConfigItemsRequest, TEvConsole::TEvGetNodeConfigItemsResponse>
- (runtime, items, request);
-}
-
-void CollectItems(THashMap<ui64, TConfigItem::TPtr> &)
-{
-}
-
-void CollectItems(THashMap<ui64, TConfigItem::TPtr> &items,
- const NKikimrConsole::TConfigItem &item)
-{
+
+ for (auto &item : reply->Record.GetConfigItems()) {
+ auto it = items.find(item.GetId().GetId());
+ UNIT_ASSERT(it != items.end());
+ UNIT_ASSERT_VALUES_EQUAL(item.GetId().GetGeneration(), it->second->Generation);
+ UNIT_ASSERT_VALUES_EQUAL(item.GetKind(), it->second->Kind);
+ UNIT_ASSERT(TUsageScope(item.GetUsageScope(), item.GetOrder()) == it->second->UsageScope);
+ UNIT_ASSERT_VALUES_EQUAL(item.GetMergeStrategy(), it->second->MergeStrategy);
+ UNIT_ASSERT_VALUES_EQUAL(item.GetConfig().ShortDebugString(), it->second->Config.ShortDebugString());
+ UNIT_ASSERT_VALUES_EQUAL(item.GetCookie(), it->second->Cookie);
+ items.erase(it);
+ }
+ UNIT_ASSERT(items.empty());
+}
+
+void CheckGetItems(TTenantTestRuntime &runtime,
+ THashMap<ui64, TConfigItem::TPtr> items,
+ const NKikimrConsole::TGetConfigItemsRequest &request)
+{
+ CheckGetItems<TEvConsole::TEvGetConfigItemsRequest, TEvConsole::TEvGetConfigItemsResponse>
+ (runtime, items, request);
+}
+
+void CheckGetItems(TTenantTestRuntime &runtime,
+ THashMap<ui64, TConfigItem::TPtr> items,
+ const NKikimrConsole::TGetNodeConfigItemsRequest &request)
+{
+ CheckGetItems<TEvConsole::TEvGetNodeConfigItemsRequest, TEvConsole::TEvGetNodeConfigItemsResponse>
+ (runtime, items, request);
+}
+
+void CollectItems(THashMap<ui64, TConfigItem::TPtr> &)
+{
+}
+
+void CollectItems(THashMap<ui64, TConfigItem::TPtr> &items,
+ const NKikimrConsole::TConfigItem &item)
+{
Y_VERIFY(!items.contains(item.GetId().GetId()));
- items.emplace(item.GetId().GetId(), new TConfigItem(item));
-}
-
-template <typename ...Ts>
-void CollectItems(THashMap<ui64, TConfigItem::TPtr> &items,
- const NKikimrConsole::TConfigItem &item, Ts... args)
-{
- CollectItems(items, item);
- CollectItems(items, args...);
-}
-
-void CollectKinds(NKikimrConsole::TGetConfigItemsRequest &request, const TVector<ui32> &kinds)
-{
- for (auto &kind : kinds)
- request.AddItemKinds(kind);
-}
-
-template <typename ...Ts>
-void CheckGetItemsById(TTenantTestRuntime &runtime, const TVector<ui64> &ids, const TVector<ui32> &kinds, Ts... args)
-{
- THashMap<ui64, TConfigItem::TPtr> items;
- CollectItems(items, args...);
-
-
- NKikimrConsole::TGetConfigItemsRequest request;
- for (auto id : ids)
- request.AddItemIds(id);
- CollectKinds(request, kinds);
- CheckGetItems(runtime, items, request);
-}
-
-template <typename ...Ts>
-void CheckGetItemsByNodeId(TTenantTestRuntime &runtime, const TVector<ui32> &nodes, const TVector<ui32> &kinds, Ts... args)
-{
- THashMap<ui64, TConfigItem::TPtr> items;
- CollectItems(items, args...);
-
- NKikimrConsole::TGetConfigItemsRequest request;
- request.MutableNodeFilter();
- for (auto node : nodes)
- request.MutableNodeFilter()->AddNodes(node);
- CollectKinds(request, kinds);
- CheckGetItems(runtime, items, request);
-}
-
-template <typename ...Ts>
-void CheckGetItemsByHost(TTenantTestRuntime &runtime, const TVector<TString> &hosts, const TVector<ui32> &kinds, Ts... args)
-{
- THashMap<ui64, TConfigItem::TPtr> items;
- CollectItems(items, args...);
-
- NKikimrConsole::TGetConfigItemsRequest request;
- request.MutableHostFilter();
- for (auto &host : hosts)
- request.MutableHostFilter()->AddHosts(host);
- CollectKinds(request, kinds);
- CheckGetItems(runtime, items, request);
-}
-
-template <typename ...Ts>
-void CheckGetItemsByTenant(TTenantTestRuntime &runtime, const TVector<TString> &tenants, const TVector<ui32> &kinds, Ts... args)
-{
- THashMap<ui64, TConfigItem::TPtr> items;
- CollectItems(items, args...);
-
- NKikimrConsole::TGetConfigItemsRequest request;
- request.MutableTenantFilter();
- for (auto &tenant : tenants)
- request.MutableTenantFilter()->AddTenants(tenant);
- CollectKinds(request, kinds);
- CheckGetItems(runtime, items, request);
-}
-
-template <typename ...Ts>
-void CheckGetItemsByNodeType(TTenantTestRuntime &runtime, const TVector<TString> &types, const TVector<ui32> &kinds, Ts... args)
-{
- THashMap<ui64, TConfigItem::TPtr> items;
- CollectItems(items, args...);
-
- NKikimrConsole::TGetConfigItemsRequest request;
- request.MutableNodeTypeFilter();
- for (auto &type : types)
- request.MutableNodeTypeFilter()->AddNodeTypes(type);
- CollectKinds(request, kinds);
- CheckGetItems(runtime, items, request);
-}
-
-template <typename ...Ts>
-void CheckGetItemsByTenantAndNodeType(TTenantTestRuntime &runtime, const TVector<std::pair<TString, TString>> &filters,
- const TVector<ui32> &kinds, Ts... args)
-{
- THashMap<ui64, TConfigItem::TPtr> items;
- CollectItems(items, args...);
-
- NKikimrConsole::TGetConfigItemsRequest request;
- request.MutableTenantAndNodeTypeFilter();
- for (auto &pr : filters) {
- auto &rec = *request.MutableTenantAndNodeTypeFilter()->AddTenantAndNodeTypes();
- rec.SetTenant(pr.first);
- rec.SetNodeType(pr.second);
- }
- CollectKinds(request, kinds);
- CheckGetItems(runtime, items, request);
-}
-
-template <typename ...Ts>
-void CheckGetItemsByUsageScope(TTenantTestRuntime &runtime, const TVector<NKikimrConsole::TUsageScope> &scopes,
- const TVector<ui32> &kinds, Ts... args)
-{
- THashMap<ui64, TConfigItem::TPtr> items;
- CollectItems(items, args...);
-
- NKikimrConsole::TGetConfigItemsRequest request;
- for (auto &scope : scopes)
- request.AddUsageScopes()->CopyFrom(scope);
- CollectKinds(request, kinds);
- CheckGetItems(runtime, items, request);
-}
-
-template <typename ...Ts>
-void CheckGetItemsByUsageScope(TTenantTestRuntime &runtime, const NKikimrConsole::TUsageScope &scope,
- const TVector<ui32> &kinds, Ts... args)
-{
- CheckGetItemsByUsageScope(runtime, TVector<NKikimrConsole::TUsageScope>({scope}), kinds, args...);
-}
-
-template <typename ...Ts>
-void CheckGetItemsByCookie(TTenantTestRuntime &runtime, const TVector<TString> &cookies, const TVector<ui32> &kinds, Ts... args)
-{
- THashMap<ui64, TConfigItem::TPtr> items;
- CollectItems(items, args...);
-
- NKikimrConsole::TGetConfigItemsRequest request;
- request.MutableCookieFilter();
- for (auto &cookie : cookies)
- request.MutableCookieFilter()->AddCookies(cookie);
- CollectKinds(request, kinds);
- CheckGetItems(runtime, items, request);
-}
-
-template <typename ...Ts>
-void CheckGetItems(TTenantTestRuntime &runtime, const TVector<ui32> &kinds, Ts... args)
-{
- THashMap<ui64, TConfigItem::TPtr> items;
- CollectItems(items, args...);
-
- NKikimrConsole::TGetConfigItemsRequest request;
- CollectKinds(request, kinds);
- CheckGetItems(runtime, items, request);
-}
-
-template <typename ...Ts>
-void CheckGetNodeItems(TTenantTestRuntime &runtime, ui32 nodeId, const TString &host,
- const TString &tenant, const TString &type, const TVector<ui32> &kinds, Ts... args)
-{
- THashMap<ui64, TConfigItem::TPtr> items;
- CollectItems(items, args...);
-
- NKikimrConsole::TGetNodeConfigItemsRequest request;
- request.MutableNode()->SetNodeId(nodeId);
- request.MutableNode()->SetHost(host);
- request.MutableNode()->SetTenant(tenant);
- request.MutableNode()->SetNodeType(type);
- for (auto &kind : kinds)
- request.AddItemKinds(kind);
- CheckGetItems(runtime, items, request);
-}
-
-void CheckGetNodeConfig(TTenantTestRuntime &runtime, ui32 nodeId, const TString &host,
- const TString &tenant, const TString &type,
- const NKikimrConfig::TAppConfig &config,
- const TVector<ui32> &kinds = TVector<ui32>())
-{
- auto *event = new TEvConsole::TEvGetNodeConfigRequest;
- event->Record.MutableNode()->SetNodeId(nodeId);
- event->Record.MutableNode()->SetHost(host);
- event->Record.MutableNode()->SetTenant(tenant);
- event->Record.MutableNode()->SetNodeType(type);
- for (auto &kind : kinds)
- event->Record.AddItemKinds(kind);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetNodeConfigResponse>(handle);
+ items.emplace(item.GetId().GetId(), new TConfigItem(item));
+}
+
+template <typename ...Ts>
+void CollectItems(THashMap<ui64, TConfigItem::TPtr> &items,
+ const NKikimrConsole::TConfigItem &item, Ts... args)
+{
+ CollectItems(items, item);
+ CollectItems(items, args...);
+}
+
+void CollectKinds(NKikimrConsole::TGetConfigItemsRequest &request, const TVector<ui32> &kinds)
+{
+ for (auto &kind : kinds)
+ request.AddItemKinds(kind);
+}
+
+template <typename ...Ts>
+void CheckGetItemsById(TTenantTestRuntime &runtime, const TVector<ui64> &ids, const TVector<ui32> &kinds, Ts... args)
+{
+ THashMap<ui64, TConfigItem::TPtr> items;
+ CollectItems(items, args...);
+
+
+ NKikimrConsole::TGetConfigItemsRequest request;
+ for (auto id : ids)
+ request.AddItemIds(id);
+ CollectKinds(request, kinds);
+ CheckGetItems(runtime, items, request);
+}
+
+template <typename ...Ts>
+void CheckGetItemsByNodeId(TTenantTestRuntime &runtime, const TVector<ui32> &nodes, const TVector<ui32> &kinds, Ts... args)
+{
+ THashMap<ui64, TConfigItem::TPtr> items;
+ CollectItems(items, args...);
+
+ NKikimrConsole::TGetConfigItemsRequest request;
+ request.MutableNodeFilter();
+ for (auto node : nodes)
+ request.MutableNodeFilter()->AddNodes(node);
+ CollectKinds(request, kinds);
+ CheckGetItems(runtime, items, request);
+}
+
+template <typename ...Ts>
+void CheckGetItemsByHost(TTenantTestRuntime &runtime, const TVector<TString> &hosts, const TVector<ui32> &kinds, Ts... args)
+{
+ THashMap<ui64, TConfigItem::TPtr> items;
+ CollectItems(items, args...);
+
+ NKikimrConsole::TGetConfigItemsRequest request;
+ request.MutableHostFilter();
+ for (auto &host : hosts)
+ request.MutableHostFilter()->AddHosts(host);
+ CollectKinds(request, kinds);
+ CheckGetItems(runtime, items, request);
+}
+
+template <typename ...Ts>
+void CheckGetItemsByTenant(TTenantTestRuntime &runtime, const TVector<TString> &tenants, const TVector<ui32> &kinds, Ts... args)
+{
+ THashMap<ui64, TConfigItem::TPtr> items;
+ CollectItems(items, args...);
+
+ NKikimrConsole::TGetConfigItemsRequest request;
+ request.MutableTenantFilter();
+ for (auto &tenant : tenants)
+ request.MutableTenantFilter()->AddTenants(tenant);
+ CollectKinds(request, kinds);
+ CheckGetItems(runtime, items, request);
+}
+
+template <typename ...Ts>
+void CheckGetItemsByNodeType(TTenantTestRuntime &runtime, const TVector<TString> &types, const TVector<ui32> &kinds, Ts... args)
+{
+ THashMap<ui64, TConfigItem::TPtr> items;
+ CollectItems(items, args...);
+
+ NKikimrConsole::TGetConfigItemsRequest request;
+ request.MutableNodeTypeFilter();
+ for (auto &type : types)
+ request.MutableNodeTypeFilter()->AddNodeTypes(type);
+ CollectKinds(request, kinds);
+ CheckGetItems(runtime, items, request);
+}
+
+template <typename ...Ts>
+void CheckGetItemsByTenantAndNodeType(TTenantTestRuntime &runtime, const TVector<std::pair<TString, TString>> &filters,
+ const TVector<ui32> &kinds, Ts... args)
+{
+ THashMap<ui64, TConfigItem::TPtr> items;
+ CollectItems(items, args...);
+
+ NKikimrConsole::TGetConfigItemsRequest request;
+ request.MutableTenantAndNodeTypeFilter();
+ for (auto &pr : filters) {
+ auto &rec = *request.MutableTenantAndNodeTypeFilter()->AddTenantAndNodeTypes();
+ rec.SetTenant(pr.first);
+ rec.SetNodeType(pr.second);
+ }
+ CollectKinds(request, kinds);
+ CheckGetItems(runtime, items, request);
+}
+
+template <typename ...Ts>
+void CheckGetItemsByUsageScope(TTenantTestRuntime &runtime, const TVector<NKikimrConsole::TUsageScope> &scopes,
+ const TVector<ui32> &kinds, Ts... args)
+{
+ THashMap<ui64, TConfigItem::TPtr> items;
+ CollectItems(items, args...);
+
+ NKikimrConsole::TGetConfigItemsRequest request;
+ for (auto &scope : scopes)
+ request.AddUsageScopes()->CopyFrom(scope);
+ CollectKinds(request, kinds);
+ CheckGetItems(runtime, items, request);
+}
+
+template <typename ...Ts>
+void CheckGetItemsByUsageScope(TTenantTestRuntime &runtime, const NKikimrConsole::TUsageScope &scope,
+ const TVector<ui32> &kinds, Ts... args)
+{
+ CheckGetItemsByUsageScope(runtime, TVector<NKikimrConsole::TUsageScope>({scope}), kinds, args...);
+}
+
+template <typename ...Ts>
+void CheckGetItemsByCookie(TTenantTestRuntime &runtime, const TVector<TString> &cookies, const TVector<ui32> &kinds, Ts... args)
+{
+ THashMap<ui64, TConfigItem::TPtr> items;
+ CollectItems(items, args...);
+
+ NKikimrConsole::TGetConfigItemsRequest request;
+ request.MutableCookieFilter();
+ for (auto &cookie : cookies)
+ request.MutableCookieFilter()->AddCookies(cookie);
+ CollectKinds(request, kinds);
+ CheckGetItems(runtime, items, request);
+}
+
+template <typename ...Ts>
+void CheckGetItems(TTenantTestRuntime &runtime, const TVector<ui32> &kinds, Ts... args)
+{
+ THashMap<ui64, TConfigItem::TPtr> items;
+ CollectItems(items, args...);
+
+ NKikimrConsole::TGetConfigItemsRequest request;
+ CollectKinds(request, kinds);
+ CheckGetItems(runtime, items, request);
+}
+
+template <typename ...Ts>
+void CheckGetNodeItems(TTenantTestRuntime &runtime, ui32 nodeId, const TString &host,
+ const TString &tenant, const TString &type, const TVector<ui32> &kinds, Ts... args)
+{
+ THashMap<ui64, TConfigItem::TPtr> items;
+ CollectItems(items, args...);
+
+ NKikimrConsole::TGetNodeConfigItemsRequest request;
+ request.MutableNode()->SetNodeId(nodeId);
+ request.MutableNode()->SetHost(host);
+ request.MutableNode()->SetTenant(tenant);
+ request.MutableNode()->SetNodeType(type);
+ for (auto &kind : kinds)
+ request.AddItemKinds(kind);
+ CheckGetItems(runtime, items, request);
+}
+
+void CheckGetNodeConfig(TTenantTestRuntime &runtime, ui32 nodeId, const TString &host,
+ const TString &tenant, const TString &type,
+ const NKikimrConfig::TAppConfig &config,
+ const TVector<ui32> &kinds = TVector<ui32>())
+{
+ auto *event = new TEvConsole::TEvGetNodeConfigRequest;
+ event->Record.MutableNode()->SetNodeId(nodeId);
+ event->Record.MutableNode()->SetHost(host);
+ event->Record.MutableNode()->SetTenant(tenant);
+ event->Record.MutableNode()->SetNodeType(type);
+ for (auto &kind : kinds)
+ event->Record.AddItemKinds(kind);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetNodeConfigResponse>(handle);
UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
CheckEqualsIgnoringVersion(reply->Record.GetConfig(), config);
-}
-
-void CheckGetNodeConfig(TTenantTestRuntime &runtime,
- ui32 nodeId,
- const TString &host,
- const TString &tenant,
- const TString &type,
- Ydb::StatusIds::StatusCode code)
-{
- auto *event = new TEvConsole::TEvGetNodeConfigRequest;
- event->Record.MutableNode()->SetNodeId(nodeId);
- event->Record.MutableNode()->SetHost(host);
- event->Record.MutableNode()->SetTenant(tenant);
- event->Record.MutableNode()->SetNodeType(type);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetNodeConfigResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
-}
-
-void IncGeneration(NKikimrConsole::TConfigItem &item)
-{
- item.MutableId()->SetGeneration(item.GetId().GetGeneration() + 1);
-}
-
-template <typename ...Ts>
-void IncGeneration(NKikimrConsole::TConfigItem &item, Ts&... args)
-{
- IncGeneration(item);
- IncGeneration(args...);
-}
-
+}
+
+void CheckGetNodeConfig(TTenantTestRuntime &runtime,
+ ui32 nodeId,
+ const TString &host,
+ const TString &tenant,
+ const TString &type,
+ Ydb::StatusIds::StatusCode code)
+{
+ auto *event = new TEvConsole::TEvGetNodeConfigRequest;
+ event->Record.MutableNode()->SetNodeId(nodeId);
+ event->Record.MutableNode()->SetHost(host);
+ event->Record.MutableNode()->SetTenant(tenant);
+ event->Record.MutableNode()->SetNodeType(type);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetNodeConfigResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
+}
+
+void IncGeneration(NKikimrConsole::TConfigItem &item)
+{
+ item.MutableId()->SetGeneration(item.GetId().GetGeneration() + 1);
+}
+
+template <typename ...Ts>
+void IncGeneration(NKikimrConsole::TConfigItem &item, Ts&... args)
+{
+ IncGeneration(item);
+ IncGeneration(args...);
+}
+
ui64 CheckAddConfigSubscription(TTenantTestRuntime &runtime, Ydb::StatusIds::StatusCode code,
- ui32 nodeId, const TString &host, const TString &tenant,
+ ui32 nodeId, const TString &host, const TString &tenant,
const TString &nodeType, ui64 tabletId, TActorId serviceId,
- TVector<ui32> kinds, ui64 id = 0)
-{
- auto *event = new TEvConsole::TEvAddConfigSubscriptionRequest;
- event->Record.MutableSubscription()->SetId(id);
- if (tabletId)
- event->Record.MutableSubscription()->MutableSubscriber()->SetTabletId(tabletId);
- else if (serviceId)
+ TVector<ui32> kinds, ui64 id = 0)
+{
+ auto *event = new TEvConsole::TEvAddConfigSubscriptionRequest;
+ event->Record.MutableSubscription()->SetId(id);
+ if (tabletId)
+ event->Record.MutableSubscription()->MutableSubscriber()->SetTabletId(tabletId);
+ else if (serviceId)
ActorIdToProto(serviceId, event->Record.MutableSubscription()->MutableSubscriber()->MutableServiceId());
- event->Record.MutableSubscription()->MutableOptions()->SetNodeId(nodeId);
- event->Record.MutableSubscription()->MutableOptions()->SetHost(host);
- event->Record.MutableSubscription()->MutableOptions()->SetTenant(tenant);
- event->Record.MutableSubscription()->MutableOptions()->SetNodeType(nodeType);
- for (auto &kind : kinds)
- event->Record.MutableSubscription()->AddConfigItemKinds(kind);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvAddConfigSubscriptionResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
-
- ui64 res = reply->Record.GetSubscriptionId();
+ event->Record.MutableSubscription()->MutableOptions()->SetNodeId(nodeId);
+ event->Record.MutableSubscription()->MutableOptions()->SetHost(host);
+ event->Record.MutableSubscription()->MutableOptions()->SetTenant(tenant);
+ event->Record.MutableSubscription()->MutableOptions()->SetNodeType(nodeType);
+ for (auto &kind : kinds)
+ event->Record.MutableSubscription()->AddConfigItemKinds(kind);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvAddConfigSubscriptionResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
+
+ ui64 res = reply->Record.GetSubscriptionId();
UNIT_ASSERT(code != Ydb::StatusIds::SUCCESS || res);
- return res;
-}
-
+ return res;
+}
+
ui64 CheckReplaceConfigSubscriptions(TTenantTestRuntime &runtime, Ydb::StatusIds::StatusCode code,
- ui32 nodeId, const TString &host, const TString &tenant,
+ ui32 nodeId, const TString &host, const TString &tenant,
const TString &nodeType, ui64 tabletId, TActorId serviceId,
- TVector<ui32> kinds, ui64 id = 0)
-{
- auto *event = new TEvConsole::TEvReplaceConfigSubscriptionsRequest;
- event->Record.MutableSubscription()->SetId(id);
- if (tabletId)
- event->Record.MutableSubscription()->MutableSubscriber()->SetTabletId(tabletId);
- else if (serviceId)
+ TVector<ui32> kinds, ui64 id = 0)
+{
+ auto *event = new TEvConsole::TEvReplaceConfigSubscriptionsRequest;
+ event->Record.MutableSubscription()->SetId(id);
+ if (tabletId)
+ event->Record.MutableSubscription()->MutableSubscriber()->SetTabletId(tabletId);
+ else if (serviceId)
ActorIdToProto(serviceId, event->Record.MutableSubscription()->MutableSubscriber()->MutableServiceId());
- event->Record.MutableSubscription()->MutableOptions()->SetNodeId(nodeId);
- event->Record.MutableSubscription()->MutableOptions()->SetHost(host);
- event->Record.MutableSubscription()->MutableOptions()->SetTenant(tenant);
- event->Record.MutableSubscription()->MutableOptions()->SetNodeType(nodeType);
- for (auto &kind : kinds)
- event->Record.MutableSubscription()->AddConfigItemKinds(kind);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvReplaceConfigSubscriptionsResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
-
- ui64 res = reply->Record.GetSubscriptionId();
+ event->Record.MutableSubscription()->MutableOptions()->SetNodeId(nodeId);
+ event->Record.MutableSubscription()->MutableOptions()->SetHost(host);
+ event->Record.MutableSubscription()->MutableOptions()->SetTenant(tenant);
+ event->Record.MutableSubscription()->MutableOptions()->SetNodeType(nodeType);
+ for (auto &kind : kinds)
+ event->Record.MutableSubscription()->AddConfigItemKinds(kind);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvReplaceConfigSubscriptionsResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
+
+ ui64 res = reply->Record.GetSubscriptionId();
UNIT_ASSERT(code != Ydb::StatusIds::SUCCESS || res);
- return res;
-}
-
+ return res;
+}
+
void CheckGetConfigSubscription(TTenantTestRuntime &runtime, Ydb::StatusIds::StatusCode code,
- ui64 id, ui32 nodeId = 0, const TString &host = "", const TString &tenant = "",
+ ui64 id, ui32 nodeId = 0, const TString &host = "", const TString &tenant = "",
const TString &nodeType = "", ui64 tabletId = 0, TActorId serviceId = {},
- TVector<ui32> kinds = {})
-{
- auto *event = new TEvConsole::TEvGetConfigSubscriptionRequest;
- event->Record.SetSubscriptionId(id);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetConfigSubscriptionResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
-
+ TVector<ui32> kinds = {})
+{
+ auto *event = new TEvConsole::TEvGetConfigSubscriptionRequest;
+ event->Record.SetSubscriptionId(id);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetConfigSubscriptionResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
+
if (code == Ydb::StatusIds::SUCCESS) {
- THashSet<ui32> k(kinds.begin(), kinds.end());
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetId(), id);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetSubscriber().GetTabletId(), tabletId);
+ THashSet<ui32> k(kinds.begin(), kinds.end());
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetId(), id);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetSubscriber().GetTabletId(), tabletId);
UNIT_ASSERT_VALUES_EQUAL(ActorIdFromProto(reply->Record.GetSubscription().GetSubscriber().GetServiceId()), serviceId);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetOptions().GetNodeId(), nodeId);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetOptions().GetHost(), host);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetOptions().GetTenant(), tenant);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetOptions().GetNodeType(), nodeType);
- for (auto &kind : reply->Record.GetSubscription().GetConfigItemKinds()) {
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetOptions().GetNodeId(), nodeId);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetOptions().GetHost(), host);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetOptions().GetTenant(), tenant);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetSubscription().GetOptions().GetNodeType(), nodeType);
+ for (auto &kind : reply->Record.GetSubscription().GetConfigItemKinds()) {
UNIT_ASSERT(k.contains(kind));
- k.erase(kind);
- }
- UNIT_ASSERT(k.empty());
- }
-}
-
+ k.erase(kind);
+ }
+ UNIT_ASSERT(k.empty());
+ }
+}
+
void CheckRemoveConfigSubscription(TTenantTestRuntime &runtime, Ydb::StatusIds::StatusCode code, ui64 id)
-{
- auto *event = new TEvConsole::TEvRemoveConfigSubscriptionRequest;
- event->Record.SetSubscriptionId(id);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvRemoveConfigSubscriptionResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
-}
-
+{
+ auto *event = new TEvConsole::TEvRemoveConfigSubscriptionRequest;
+ event->Record.SetSubscriptionId(id);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvRemoveConfigSubscriptionResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
+}
+
void CheckRemoveConfigSubscriptions(TTenantTestRuntime &runtime, Ydb::StatusIds::StatusCode code,
ui64 tabletId, TActorId serviceId)
-{
- auto *event = new TEvConsole::TEvRemoveConfigSubscriptionsRequest;
- if (tabletId)
- event->Record.MutableSubscriber()->SetTabletId(tabletId);
- else if (serviceId)
+{
+ auto *event = new TEvConsole::TEvRemoveConfigSubscriptionsRequest;
+ if (tabletId)
+ event->Record.MutableSubscriber()->SetTabletId(tabletId);
+ else if (serviceId)
ActorIdToProto(serviceId, event->Record.MutableSubscriber()->MutableServiceId());
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvRemoveConfigSubscriptionsResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
-}
-
-/*void CollectConfigItemIds(NConsole::TConfigId &)
-{
-}
-*/
-void CollectConfigItemIds(NConsole::TConfigId &id, const NKikimrConsole::TConfigItem &item)
-{
- id.ItemIds.push_back(std::make_pair(item.GetId().GetId(), item.GetId().GetGeneration()));
-}
-
-template <typename ...Ts>
-void CollectConfigItemIds(NConsole::TConfigId &id, const NKikimrConsole::TConfigItem &item, Ts ...args)
-{
- CollectConfigItemIds(id, item);
- CollectConfigItemIds(id, args...);
-}
-
-template <typename ...Ts>
-void CheckConfigId(const NKikimrConsole::TConfigId &configId, Ts ...args)
-{
- NConsole::TConfigId lhs(configId);
- NConsole::TConfigId rhs;
- CollectConfigItemIds(rhs, args...);
- UNIT_ASSERT_VALUES_EQUAL(lhs.ToString(), rhs.ToString());
-}
-
-void AcceptConfig(TTenantTestRuntime &runtime, TAutoPtr<IEventHandle>& handle)
-{
- auto &rec = handle->Get<TEvConsole::TEvConfigNotificationRequest>()->Record;
- auto *response = new TEvConsole::TEvConfigNotificationResponse;
- response->Record.SetSubscriptionId(rec.GetSubscriptionId());
- response->Record.MutableConfigId()->CopyFrom(rec.GetConfigId());
- runtime.Send(new IEventHandle(handle->Sender, runtime.Sender, response, 0, handle->Cookie));
-}
-
-NKikimrConsole::TConfig GetCurrentConfig(TTenantTestRuntime &runtime)
-{
- runtime.SendToConsole(new TEvConsole::TEvGetConfigRequest);
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetConfigResponse>(handle);
- return reply->Record.GetConfig();
-}
-
-void CheckSetConfig(TTenantTestRuntime &runtime, const NKikimrConsole::TConfig &config, Ydb::StatusIds::StatusCode code)
-{
- runtime.SendToConsole(new TEvConsole::TEvSetConfigRequest(config));
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvSetConfigResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
-}
-
-void CheckCheckConfigUpdates(TTenantTestRuntime &runtime,
- TVector<NKikimrConsole::TConfigItem> baseItems,
- THashSet<std::pair<ui64, ui64>> addedItems,
- THashSet<std::pair<ui64, ui64>> removedItems,
- THashSet<std::pair<ui64, ui64>> updatedItems)
-{
- auto *request = new TEvConsole::TEvCheckConfigUpdatesRequest;
- for (auto &item : baseItems)
- request->Record.AddBaseItemIds()->CopyFrom(item.GetId());
- runtime.SendToConsole(request);
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvCheckConfigUpdatesResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.AddedItemsSize(), addedItems.size());
- for (auto &item : reply->Record.GetAddedItems()) {
- auto id = std::make_pair(item.GetId(), item.GetGeneration());
- UNIT_ASSERT(addedItems.contains(id));
- addedItems.erase(id);
- }
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.RemovedItemsSize(), removedItems.size());
- for (auto &item : reply->Record.GetRemovedItems()) {
- auto id = std::make_pair(item.GetId(), item.GetGeneration());
- UNIT_ASSERT(removedItems.contains(id));
- removedItems.erase(id);
- }
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.UpdatedItemsSize(), updatedItems.size());
- for (auto &item : reply->Record.GetUpdatedItems()) {
- auto id = std::make_pair(item.GetId(), item.GetGeneration());
- UNIT_ASSERT(updatedItems.contains(id));
- updatedItems.erase(id);
- }
-}
-
-void RestartConsole(TTenantTestRuntime &runtime)
-{
- runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- runtime.DispatchEvents(options);
-}
-
-NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_1;
-NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_2;
-NKikimrConsole::TConfigItem ITEM_NODE12_LOG_1;
-NKikimrConsole::TConfigItem ITEM_NODE23_LOG_1;
-NKikimrConsole::TConfigItem ITEM_NODE34_LOG_1;
-NKikimrConsole::TConfigItem ITEM_HOST12_LOG_1;
-NKikimrConsole::TConfigItem ITEM_HOST23_LOG_1;
-NKikimrConsole::TConfigItem ITEM_HOST34_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TYPE2_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TYPE2_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE1_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE2_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE2_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE1_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE2_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE2_LOG_2;
-NKikimrConsole::TConfigItem ITEM_DOMAIN_TENANT_POOL_1;
-NKikimrConsole::TConfigItem ITEM_DOMAIN_TENANT_POOL_2;
-
-void InitializeTestConfigItems()
-{
- ITEM_DOMAIN_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_DOMAIN_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 2,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_NODE12_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {1, 2}, {}, "", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_NODE23_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {2, 3}, {}, "", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_NODE34_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {3, 4}, {}, "", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_HOST12_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {"host1", "host2"}, "", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_HOST23_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {"host2", "host3"}, "", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_HOST34_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {"host3", "host4"}, "", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TENANT1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TENANT1_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "", 2,
- NKikimrConsole::TConfigItem::MERGE, "cookie2");
- ITEM_TENANT2_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TENANT2_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "", 2,
- NKikimrConsole::TConfigItem::MERGE, "cookie2");
- ITEM_TYPE1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "type1", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TYPE1_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "type1", 2,
- NKikimrConsole::TConfigItem::MERGE, "cookie2");
- ITEM_TYPE2_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "type2", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TYPE2_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "type2", 2,
- NKikimrConsole::TConfigItem::MERGE, "cookie2");
- ITEM_TENANT1_TYPE1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "type1", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TENANT1_TYPE1_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "type1", 2,
- NKikimrConsole::TConfigItem::MERGE, "cookie2");
- ITEM_TENANT1_TYPE2_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "type2", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TENANT1_TYPE2_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "type2", 2,
- NKikimrConsole::TConfigItem::MERGE, "cookie2");
- ITEM_TENANT2_TYPE1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "type1", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TENANT2_TYPE1_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "type1", 2,
- NKikimrConsole::TConfigItem::MERGE, "cookie2");
- ITEM_TENANT2_TYPE2_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "type2", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TENANT2_TYPE2_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "type2", 2,
- NKikimrConsole::TConfigItem::MERGE, "cookie2");
- ITEM_DOMAIN_TENANT_POOL_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::TenantPoolConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_DOMAIN_TENANT_POOL_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::TenantPoolConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 2,
- NKikimrConsole::TConfigItem::MERGE, "cookie2");
-}
-
-class TTestValidator : public IConfigValidator {
-public:
- TTestValidator(ui32 maxCount,
- const TString &name = "test")
- : IConfigValidator(name, NKikimrConsole::TConfigItem::LogConfigItem)
- , MaxCount(maxCount)
- {
- }
-
- TTestValidator(ui32 maxCount,
- const TString &name,
- const THashSet<ui32> &kinds)
- : IConfigValidator(name, kinds)
- , MaxCount(maxCount)
- {
- }
-
- bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
- const NKikimrConfig::TAppConfig &newConfig,
- TVector<Ydb::Issue::IssueMessage> &issues) const override
- {
- Y_UNUSED(oldConfig);
- if (newConfig.GetLogConfig().EntrySize() > MaxCount) {
- Ydb::Issue::IssueMessage issue;
- issue.set_message("too many entries");
- issue.set_severity(NYql::TSeverityIds::S_ERROR);
- issues.push_back(issue);
- return false;
- }
- return true;
- }
-
-private:
- ui32 MaxCount;
-};
-
-struct TValidatorInfo {
- TString Name;
- TString Description;
- THashSet<ui32> CheckedKinds;
- bool Enabled = false;
-};
-
-void CheckListValidators(TTenantTestRuntime &runtime,
- TVector<TValidatorInfo> validators)
-{
- auto *request = new TEvConsole::TEvListConfigValidatorsRequest;
- runtime.SendToConsole(request);
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvListConfigValidatorsResponse>(handle);
- auto &rec = reply->Record;
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
- UNIT_ASSERT_VALUES_EQUAL(rec.ValidatorsSize(), validators.size());
-
- THashMap<TString, TValidatorInfo> infos;
- for (auto &validator : validators)
- infos[validator.Name] = validator;
-
- for (auto &entry : rec.GetValidators()) {
- UNIT_ASSERT(infos.contains(entry.GetName()));
- auto &info = infos.at(entry.GetName());
- UNIT_ASSERT_VALUES_EQUAL(info.Description, entry.GetDescription());
- UNIT_ASSERT_VALUES_EQUAL(info.CheckedKinds.size(), entry.CheckedItemKindsSize());
- for (auto kind : entry.GetCheckedItemKinds()) {
- UNIT_ASSERT(info.CheckedKinds.contains(kind));
- info.CheckedKinds.erase(kind);
- }
- UNIT_ASSERT_VALUES_EQUAL(info.Enabled, entry.GetEnabled());
- infos.erase(entry.GetName());
- }
-}
-
-void CheckToggleValidator(TTenantTestRuntime &runtime,
- const TString &name,
- bool disable,
- Ydb::StatusIds::StatusCode code)
-{
- auto *request = new TEvConsole::TEvToggleConfigValidatorRequest;
- request->Record.SetName(name);
- request->Record.SetDisable(disable);
- runtime.SendToConsole(request);
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvToggleConfigValidatorResponse>(handle);
- auto &rec = reply->Record;
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
-}
-
-void CheckDisableValidator(TTenantTestRuntime &runtime,
- const TString &name,
- Ydb::StatusIds::StatusCode code)
-{
- CheckToggleValidator(runtime, name, true, code);
-}
-
-void CheckEnableValidator(TTenantTestRuntime &runtime,
- const TString &name,
- Ydb::StatusIds::StatusCode code)
-{
- CheckToggleValidator(runtime, name, false, code);
-}
-
-template <typename ...Ts>
-TVector<ui64> CheckConfigureLogAffected(TTenantTestRuntime &runtime,
- Ydb::StatusIds::StatusCode code,
- THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected,
- bool dryRun,
- bool fillAffected,
- Ts... args)
-{
- auto *event = new TEvConsole::TEvConfigureRequest;
- event->Record.SetDryRun(dryRun);
- event->Record.SetFillAffectedConfigs(fillAffected);
- CollectActions(event->Record, args...);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigureResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
-
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.AffectedConfigsSize(), affected.size());
- for (auto &entry : reply->Record.GetAffectedConfigs()) {
- TTenantAndNodeType key(entry.GetTenant(), entry.GetNodeType());
- UNIT_ASSERT(affected.contains(key));
- UNIT_ASSERT_VALUES_EQUAL(affected.at(key).first, entry.GetOldConfig().GetLogConfig().EntrySize());
- UNIT_ASSERT_VALUES_EQUAL(affected.at(key).second, entry.GetNewConfig().GetLogConfig().EntrySize());
- affected.erase(key);
- }
-
- return {reply->Record.GetAddedItemIds().begin(), reply->Record.GetAddedItemIds().end()};
-}
-
-
-
-} // anonymous namespace
-
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvRemoveConfigSubscriptionsResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
+}
+
+/*void CollectConfigItemIds(NConsole::TConfigId &)
+{
+}
+*/
+void CollectConfigItemIds(NConsole::TConfigId &id, const NKikimrConsole::TConfigItem &item)
+{
+ id.ItemIds.push_back(std::make_pair(item.GetId().GetId(), item.GetId().GetGeneration()));
+}
+
+template <typename ...Ts>
+void CollectConfigItemIds(NConsole::TConfigId &id, const NKikimrConsole::TConfigItem &item, Ts ...args)
+{
+ CollectConfigItemIds(id, item);
+ CollectConfigItemIds(id, args...);
+}
+
+template <typename ...Ts>
+void CheckConfigId(const NKikimrConsole::TConfigId &configId, Ts ...args)
+{
+ NConsole::TConfigId lhs(configId);
+ NConsole::TConfigId rhs;
+ CollectConfigItemIds(rhs, args...);
+ UNIT_ASSERT_VALUES_EQUAL(lhs.ToString(), rhs.ToString());
+}
+
+void AcceptConfig(TTenantTestRuntime &runtime, TAutoPtr<IEventHandle>& handle)
+{
+ auto &rec = handle->Get<TEvConsole::TEvConfigNotificationRequest>()->Record;
+ auto *response = new TEvConsole::TEvConfigNotificationResponse;
+ response->Record.SetSubscriptionId(rec.GetSubscriptionId());
+ response->Record.MutableConfigId()->CopyFrom(rec.GetConfigId());
+ runtime.Send(new IEventHandle(handle->Sender, runtime.Sender, response, 0, handle->Cookie));
+}
+
+NKikimrConsole::TConfig GetCurrentConfig(TTenantTestRuntime &runtime)
+{
+ runtime.SendToConsole(new TEvConsole::TEvGetConfigRequest);
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetConfigResponse>(handle);
+ return reply->Record.GetConfig();
+}
+
+void CheckSetConfig(TTenantTestRuntime &runtime, const NKikimrConsole::TConfig &config, Ydb::StatusIds::StatusCode code)
+{
+ runtime.SendToConsole(new TEvConsole::TEvSetConfigRequest(config));
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvSetConfigResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
+}
+
+void CheckCheckConfigUpdates(TTenantTestRuntime &runtime,
+ TVector<NKikimrConsole::TConfigItem> baseItems,
+ THashSet<std::pair<ui64, ui64>> addedItems,
+ THashSet<std::pair<ui64, ui64>> removedItems,
+ THashSet<std::pair<ui64, ui64>> updatedItems)
+{
+ auto *request = new TEvConsole::TEvCheckConfigUpdatesRequest;
+ for (auto &item : baseItems)
+ request->Record.AddBaseItemIds()->CopyFrom(item.GetId());
+ runtime.SendToConsole(request);
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvCheckConfigUpdatesResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.AddedItemsSize(), addedItems.size());
+ for (auto &item : reply->Record.GetAddedItems()) {
+ auto id = std::make_pair(item.GetId(), item.GetGeneration());
+ UNIT_ASSERT(addedItems.contains(id));
+ addedItems.erase(id);
+ }
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.RemovedItemsSize(), removedItems.size());
+ for (auto &item : reply->Record.GetRemovedItems()) {
+ auto id = std::make_pair(item.GetId(), item.GetGeneration());
+ UNIT_ASSERT(removedItems.contains(id));
+ removedItems.erase(id);
+ }
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.UpdatedItemsSize(), updatedItems.size());
+ for (auto &item : reply->Record.GetUpdatedItems()) {
+ auto id = std::make_pair(item.GetId(), item.GetGeneration());
+ UNIT_ASSERT(updatedItems.contains(id));
+ updatedItems.erase(id);
+ }
+}
+
+void RestartConsole(TTenantTestRuntime &runtime)
+{
+ runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ runtime.DispatchEvents(options);
+}
+
+NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_1;
+NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_2;
+NKikimrConsole::TConfigItem ITEM_NODE12_LOG_1;
+NKikimrConsole::TConfigItem ITEM_NODE23_LOG_1;
+NKikimrConsole::TConfigItem ITEM_NODE34_LOG_1;
+NKikimrConsole::TConfigItem ITEM_HOST12_LOG_1;
+NKikimrConsole::TConfigItem ITEM_HOST23_LOG_1;
+NKikimrConsole::TConfigItem ITEM_HOST34_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TYPE2_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TYPE2_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE1_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE2_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE2_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE1_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE2_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE2_LOG_2;
+NKikimrConsole::TConfigItem ITEM_DOMAIN_TENANT_POOL_1;
+NKikimrConsole::TConfigItem ITEM_DOMAIN_TENANT_POOL_2;
+
+void InitializeTestConfigItems()
+{
+ ITEM_DOMAIN_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_DOMAIN_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 2,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_NODE12_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {1, 2}, {}, "", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_NODE23_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {2, 3}, {}, "", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_NODE34_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {3, 4}, {}, "", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_HOST12_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {"host1", "host2"}, "", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_HOST23_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {"host2", "host3"}, "", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_HOST34_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {"host3", "host4"}, "", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TENANT1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TENANT1_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "", 2,
+ NKikimrConsole::TConfigItem::MERGE, "cookie2");
+ ITEM_TENANT2_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TENANT2_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "", 2,
+ NKikimrConsole::TConfigItem::MERGE, "cookie2");
+ ITEM_TYPE1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "type1", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TYPE1_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "type1", 2,
+ NKikimrConsole::TConfigItem::MERGE, "cookie2");
+ ITEM_TYPE2_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "type2", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TYPE2_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "type2", 2,
+ NKikimrConsole::TConfigItem::MERGE, "cookie2");
+ ITEM_TENANT1_TYPE1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "type1", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TENANT1_TYPE1_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "type1", 2,
+ NKikimrConsole::TConfigItem::MERGE, "cookie2");
+ ITEM_TENANT1_TYPE2_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "type2", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TENANT1_TYPE2_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant1", "type2", 2,
+ NKikimrConsole::TConfigItem::MERGE, "cookie2");
+ ITEM_TENANT2_TYPE1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "type1", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TENANT2_TYPE1_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "type1", 2,
+ NKikimrConsole::TConfigItem::MERGE, "cookie2");
+ ITEM_TENANT2_TYPE2_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "type2", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TENANT2_TYPE2_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant2", "type2", 2,
+ NKikimrConsole::TConfigItem::MERGE, "cookie2");
+ ITEM_DOMAIN_TENANT_POOL_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::TenantPoolConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_DOMAIN_TENANT_POOL_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::TenantPoolConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 2,
+ NKikimrConsole::TConfigItem::MERGE, "cookie2");
+}
+
+class TTestValidator : public IConfigValidator {
+public:
+ TTestValidator(ui32 maxCount,
+ const TString &name = "test")
+ : IConfigValidator(name, NKikimrConsole::TConfigItem::LogConfigItem)
+ , MaxCount(maxCount)
+ {
+ }
+
+ TTestValidator(ui32 maxCount,
+ const TString &name,
+ const THashSet<ui32> &kinds)
+ : IConfigValidator(name, kinds)
+ , MaxCount(maxCount)
+ {
+ }
+
+ bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
+ const NKikimrConfig::TAppConfig &newConfig,
+ TVector<Ydb::Issue::IssueMessage> &issues) const override
+ {
+ Y_UNUSED(oldConfig);
+ if (newConfig.GetLogConfig().EntrySize() > MaxCount) {
+ Ydb::Issue::IssueMessage issue;
+ issue.set_message("too many entries");
+ issue.set_severity(NYql::TSeverityIds::S_ERROR);
+ issues.push_back(issue);
+ return false;
+ }
+ return true;
+ }
+
+private:
+ ui32 MaxCount;
+};
+
+struct TValidatorInfo {
+ TString Name;
+ TString Description;
+ THashSet<ui32> CheckedKinds;
+ bool Enabled = false;
+};
+
+void CheckListValidators(TTenantTestRuntime &runtime,
+ TVector<TValidatorInfo> validators)
+{
+ auto *request = new TEvConsole::TEvListConfigValidatorsRequest;
+ runtime.SendToConsole(request);
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvListConfigValidatorsResponse>(handle);
+ auto &rec = reply->Record;
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
+ UNIT_ASSERT_VALUES_EQUAL(rec.ValidatorsSize(), validators.size());
+
+ THashMap<TString, TValidatorInfo> infos;
+ for (auto &validator : validators)
+ infos[validator.Name] = validator;
+
+ for (auto &entry : rec.GetValidators()) {
+ UNIT_ASSERT(infos.contains(entry.GetName()));
+ auto &info = infos.at(entry.GetName());
+ UNIT_ASSERT_VALUES_EQUAL(info.Description, entry.GetDescription());
+ UNIT_ASSERT_VALUES_EQUAL(info.CheckedKinds.size(), entry.CheckedItemKindsSize());
+ for (auto kind : entry.GetCheckedItemKinds()) {
+ UNIT_ASSERT(info.CheckedKinds.contains(kind));
+ info.CheckedKinds.erase(kind);
+ }
+ UNIT_ASSERT_VALUES_EQUAL(info.Enabled, entry.GetEnabled());
+ infos.erase(entry.GetName());
+ }
+}
+
+void CheckToggleValidator(TTenantTestRuntime &runtime,
+ const TString &name,
+ bool disable,
+ Ydb::StatusIds::StatusCode code)
+{
+ auto *request = new TEvConsole::TEvToggleConfigValidatorRequest;
+ request->Record.SetName(name);
+ request->Record.SetDisable(disable);
+ runtime.SendToConsole(request);
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvToggleConfigValidatorResponse>(handle);
+ auto &rec = reply->Record;
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+}
+
+void CheckDisableValidator(TTenantTestRuntime &runtime,
+ const TString &name,
+ Ydb::StatusIds::StatusCode code)
+{
+ CheckToggleValidator(runtime, name, true, code);
+}
+
+void CheckEnableValidator(TTenantTestRuntime &runtime,
+ const TString &name,
+ Ydb::StatusIds::StatusCode code)
+{
+ CheckToggleValidator(runtime, name, false, code);
+}
+
+template <typename ...Ts>
+TVector<ui64> CheckConfigureLogAffected(TTenantTestRuntime &runtime,
+ Ydb::StatusIds::StatusCode code,
+ THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected,
+ bool dryRun,
+ bool fillAffected,
+ Ts... args)
+{
+ auto *event = new TEvConsole::TEvConfigureRequest;
+ event->Record.SetDryRun(dryRun);
+ event->Record.SetFillAffectedConfigs(fillAffected);
+ CollectActions(event->Record, args...);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigureResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
+
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.AffectedConfigsSize(), affected.size());
+ for (auto &entry : reply->Record.GetAffectedConfigs()) {
+ TTenantAndNodeType key(entry.GetTenant(), entry.GetNodeType());
+ UNIT_ASSERT(affected.contains(key));
+ UNIT_ASSERT_VALUES_EQUAL(affected.at(key).first, entry.GetOldConfig().GetLogConfig().EntrySize());
+ UNIT_ASSERT_VALUES_EQUAL(affected.at(key).second, entry.GetNewConfig().GetLogConfig().EntrySize());
+ affected.erase(key);
+ }
+
+ return {reply->Record.GetAddedItemIds().begin(), reply->Record.GetAddedItemIds().end()};
+}
+
+
+
+} // anonymous namespace
+
Y_UNIT_TEST_SUITE(TConsoleConfigTests) {
Y_UNIT_TEST(TestAddConfigItem) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
- auto tmp1 = ITEM_DOMAIN_TENANT_POOL_1;
- auto tmp2 = ITEM_DOMAIN_TENANT_POOL_2;
- tmp2.MutableConfig()->MutableLogConfig();
-
- // OK.
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
+ auto tmp1 = ITEM_DOMAIN_TENANT_POOL_1;
+ auto tmp2 = ITEM_DOMAIN_TENANT_POOL_2;
+ tmp2.MutableConfig()->MutableLogConfig();
+
+ // OK.
auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
- AssignIds(id1, ITEM_DOMAIN_TENANT_POOL_1);
- // Error: action has Id specified.
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
+ AssignIds(id1, ITEM_DOMAIN_TENANT_POOL_1);
+ // Error: action has Id specified.
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
- // Error: config doesn't match kind.
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
+ // Error: config doesn't match kind.
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(tmp2));
- // Error: order conflict with existing item.
+ MakeAddAction(tmp2));
+ // Error: order conflict with existing item.
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(tmp1));
- // Error: order conflict between new items.
+ MakeAddAction(tmp1));
+ // Error: order conflict between new items.
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_1));
- // OK.
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+ // OK.
auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_2));
- AssignIds(id2, ITEM_DOMAIN_TENANT_POOL_2);
- // Add several items. Order of ids should match items order.
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_2));
+ AssignIds(id2, ITEM_DOMAIN_TENANT_POOL_2);
+ // Add several items. Order of ids should match items order.
auto id3 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_HOST12_LOG_1));
- AssignIds(id3, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_HOST12_LOG_1);
-
- // Error: ' ' symbol in host name.
- auto item = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {"host1 host2"}, "", "", 10,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(tmp1));
-
- {
- runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- runtime.DispatchEvents(options);
- }
-
- // Check all items.
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_DOMAIN_TENANT_POOL_1,
- ITEM_DOMAIN_TENANT_POOL_2, ITEM_HOST12_LOG_1);
- }
-
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_HOST12_LOG_1));
+ AssignIds(id3, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_HOST12_LOG_1);
+
+ // Error: ' ' symbol in host name.
+ auto item = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {"host1 host2"}, "", "", 10,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
+ MakeAddAction(tmp1));
+
+ {
+ runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ runtime.DispatchEvents(options);
+ }
+
+ // Check all items.
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_DOMAIN_TENANT_POOL_1,
+ ITEM_DOMAIN_TENANT_POOL_2, ITEM_HOST12_LOG_1);
+ }
+
Y_UNIT_TEST(TestModifyConfigItem) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_DOMAIN_TENANT_POOL_1);
- // Error: kind mismatch.
- ITEM_DOMAIN_LOG_1.MutableConfig()->MutableTenantPoolConfig();
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_DOMAIN_TENANT_POOL_1);
+ // Error: kind mismatch.
+ ITEM_DOMAIN_LOG_1.MutableConfig()->MutableTenantPoolConfig();
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_LOG_1));
- ITEM_DOMAIN_LOG_1.MutableConfig()->ClearTenantPoolConfig();
- // Error: generation mismatch
- ITEM_DOMAIN_LOG_1.MutableId()->SetGeneration(2);
+ MakeModifyAction(ITEM_DOMAIN_LOG_1));
+ ITEM_DOMAIN_LOG_1.MutableConfig()->ClearTenantPoolConfig();
+ // Error: generation mismatch
+ ITEM_DOMAIN_LOG_1.MutableId()->SetGeneration(2);
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_LOG_1));
- ITEM_DOMAIN_LOG_1.MutableId()->SetGeneration(1);
- // Error: wrong id.
- ITEM_DOMAIN_LOG_1.MutableId()->SetId(987654321);
+ MakeModifyAction(ITEM_DOMAIN_LOG_1));
+ ITEM_DOMAIN_LOG_1.MutableId()->SetGeneration(1);
+ // Error: wrong id.
+ ITEM_DOMAIN_LOG_1.MutableId()->SetId(987654321);
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_LOG_1));
- ITEM_DOMAIN_LOG_1.MutableId()->SetId(id1[0]);
- // Error: cannot change kind
- ITEM_DOMAIN_TENANT_POOL_2.MutableId()->CopyFrom(ITEM_DOMAIN_LOG_1.GetId());
+ MakeModifyAction(ITEM_DOMAIN_LOG_1));
+ ITEM_DOMAIN_LOG_1.MutableId()->SetId(id1[0]);
+ // Error: cannot change kind
+ ITEM_DOMAIN_TENANT_POOL_2.MutableId()->CopyFrom(ITEM_DOMAIN_LOG_1.GetId());
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_2));
- ITEM_DOMAIN_TENANT_POOL_2.ClearId();
- // Error: double modification of the same item.
+ MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_2));
+ ITEM_DOMAIN_TENANT_POOL_2.ClearId();
+ // Error: double modification of the same item.
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_LOG_1),
- MakeModifyAction(ITEM_DOMAIN_LOG_1));
- // Error: order confilict with existing item.
- ITEM_DOMAIN_LOG_1.SetOrder(2);
+ MakeModifyAction(ITEM_DOMAIN_LOG_1),
+ MakeModifyAction(ITEM_DOMAIN_LOG_1));
+ // Error: order confilict with existing item.
+ ITEM_DOMAIN_LOG_1.SetOrder(2);
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_LOG_1));
- // Error: order confilict with another modification.
- ITEM_DOMAIN_LOG_1.SetOrder(3);
- ITEM_DOMAIN_LOG_2.SetOrder(3);
+ MakeModifyAction(ITEM_DOMAIN_LOG_1));
+ // Error: order confilict with another modification.
+ ITEM_DOMAIN_LOG_1.SetOrder(3);
+ ITEM_DOMAIN_LOG_2.SetOrder(3);
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_LOG_1),
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
- // Error: order conflict with added item.
- ITEM_DOMAIN_TENANT_POOL_1.SetOrder(2);
+ MakeModifyAction(ITEM_DOMAIN_LOG_1),
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ // Error: order conflict with added item.
+ ITEM_DOMAIN_TENANT_POOL_1.SetOrder(2);
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_1),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_2));
- // OK to modify order.
+ MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_1),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_2));
+ // OK to modify order.
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_1));
- IncGeneration(ITEM_DOMAIN_TENANT_POOL_1);
- // OK to modify order and add with the previous value.
- ITEM_DOMAIN_TENANT_POOL_1.SetOrder(3);
+ MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_1));
+ IncGeneration(ITEM_DOMAIN_TENANT_POOL_1);
+ // OK to modify order and add with the previous value.
+ ITEM_DOMAIN_TENANT_POOL_1.SetOrder(3);
auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_1),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_2));
- AssignIds(id2, ITEM_DOMAIN_TENANT_POOL_2);
- IncGeneration(ITEM_DOMAIN_TENANT_POOL_1);
- // OK to switch orders.
- ITEM_DOMAIN_LOG_1.SetOrder(2);
- ITEM_DOMAIN_LOG_2.SetOrder(1);
+ MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_1),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_2));
+ AssignIds(id2, ITEM_DOMAIN_TENANT_POOL_2);
+ IncGeneration(ITEM_DOMAIN_TENANT_POOL_1);
+ // OK to switch orders.
+ ITEM_DOMAIN_LOG_1.SetOrder(2);
+ ITEM_DOMAIN_LOG_2.SetOrder(1);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_LOG_1),
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
- IncGeneration(ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
- // OK to modify scope.
- ITEM_DOMAIN_LOG_1.MutableUsageScope()->MutableNodeFilter()->AddNodes(1);
+ MakeModifyAction(ITEM_DOMAIN_LOG_1),
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ IncGeneration(ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+ // OK to modify scope.
+ ITEM_DOMAIN_LOG_1.MutableUsageScope()->MutableNodeFilter()->AddNodes(1);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_LOG_1));
- IncGeneration(ITEM_DOMAIN_LOG_1);
- // Error: order conflict.
- ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableNodeFilter()->AddNodes(1);
- ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableNodeFilter()->AddNodes(2);
- ITEM_DOMAIN_LOG_2.SetOrder(2);
+ MakeModifyAction(ITEM_DOMAIN_LOG_1));
+ IncGeneration(ITEM_DOMAIN_LOG_1);
+ // Error: order conflict.
+ ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableNodeFilter()->AddNodes(1);
+ ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableNodeFilter()->AddNodes(2);
+ ITEM_DOMAIN_LOG_2.SetOrder(2);
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
- // OK to switch order back because of different scope.
- ITEM_DOMAIN_LOG_2.ClearUsageScope();
- ITEM_DOMAIN_LOG_2.SetOrder(2);
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ // OK to switch order back because of different scope.
+ ITEM_DOMAIN_LOG_2.ClearUsageScope();
+ ITEM_DOMAIN_LOG_2.SetOrder(2);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
- IncGeneration(ITEM_DOMAIN_LOG_2);
- // OK to use disjoint scopes.
- ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableNodeFilter()->AddNodes(2);
- ITEM_DOMAIN_LOG_2.SetOrder(2);
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ IncGeneration(ITEM_DOMAIN_LOG_2);
+ // OK to use disjoint scopes.
+ ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableNodeFilter()->AddNodes(2);
+ ITEM_DOMAIN_LOG_2.SetOrder(2);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
- IncGeneration(ITEM_DOMAIN_LOG_2);
- // Error: order conflicts in intersecting scopes.
- ITEM_DOMAIN_LOG_1.ClearUsageScope();
- ITEM_DOMAIN_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host1");
- ITEM_DOMAIN_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host2");
- ITEM_DOMAIN_LOG_2.ClearUsageScope();
- ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableHostFilter()->AddHosts("host2");
- ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableHostFilter()->AddHosts("host3");
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ IncGeneration(ITEM_DOMAIN_LOG_2);
+ // Error: order conflicts in intersecting scopes.
+ ITEM_DOMAIN_LOG_1.ClearUsageScope();
+ ITEM_DOMAIN_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host1");
+ ITEM_DOMAIN_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host2");
+ ITEM_DOMAIN_LOG_2.ClearUsageScope();
+ ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableHostFilter()->AddHosts("host2");
+ ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableHostFilter()->AddHosts("host3");
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_LOG_1),
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
- // OK
- ITEM_DOMAIN_LOG_2.ClearUsageScope();
- ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableHostFilter()->AddHosts("host3");
- ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableHostFilter()->AddHosts("host4");
+ MakeModifyAction(ITEM_DOMAIN_LOG_1),
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ // OK
+ ITEM_DOMAIN_LOG_2.ClearUsageScope();
+ ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableHostFilter()->AddHosts("host3");
+ ITEM_DOMAIN_LOG_2.MutableUsageScope()->MutableHostFilter()->AddHosts("host4");
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_LOG_1),
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
- IncGeneration(ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
-
- // Check all items.
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_DOMAIN_TENANT_POOL_1,
- ITEM_DOMAIN_TENANT_POOL_2);
- }
-
+ MakeModifyAction(ITEM_DOMAIN_LOG_1),
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ IncGeneration(ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+
+ // Check all items.
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_DOMAIN_TENANT_POOL_1,
+ ITEM_DOMAIN_TENANT_POOL_2);
+ }
+
Y_UNIT_TEST(TestRemoveConfigItem) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_DOMAIN_TENANT_POOL_1);
- // OK remove
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_DOMAIN_TENANT_POOL_1);
+ // OK remove
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_DOMAIN_LOG_1));
- // Error: wrong id
+ MakeRemoveAction(ITEM_DOMAIN_LOG_1));
+ // Error: wrong id
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeRemoveAction(ITEM_DOMAIN_LOG_1));
- // Error: wrong generation
+ MakeRemoveAction(ITEM_DOMAIN_LOG_1));
+ // Error: wrong generation
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeRemoveAction(ITEM_DOMAIN_LOG_2.GetId().GetId(),
- ITEM_DOMAIN_LOG_2.GetId().GetGeneration() + 1));
- // OK to modify order
- ITEM_DOMAIN_LOG_2.SetOrder(1);
+ MakeRemoveAction(ITEM_DOMAIN_LOG_2.GetId().GetId(),
+ ITEM_DOMAIN_LOG_2.GetId().GetGeneration() + 1));
+ // OK to modify order
+ ITEM_DOMAIN_LOG_2.SetOrder(1);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
- IncGeneration(ITEM_DOMAIN_LOG_2);
- // Error: conflicting order.
- ITEM_DOMAIN_LOG_1.ClearId();
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ IncGeneration(ITEM_DOMAIN_LOG_2);
+ // Error: conflicting order.
+ ITEM_DOMAIN_LOG_1.ClearId();
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_DOMAIN_LOG_1));
- // OK to add item with conflicting order if conflict is removed
- // at the same time.
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+ // OK to add item with conflicting order if conflict is removed
+ // at the same time.
auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_DOMAIN_LOG_1));
- AssignIds(id2, ITEM_DOMAIN_LOG_1);
- // Add item back.
- ITEM_DOMAIN_LOG_2.ClearId();
- ITEM_DOMAIN_LOG_2.SetOrder(2);
+ MakeRemoveAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+ AssignIds(id2, ITEM_DOMAIN_LOG_1);
+ // Add item back.
+ ITEM_DOMAIN_LOG_2.ClearId();
+ ITEM_DOMAIN_LOG_2.SetOrder(2);
auto id3 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_2));
- AssignIds(id3, ITEM_DOMAIN_LOG_2);
- // Error: conflicting order.
- ITEM_DOMAIN_LOG_2.SetOrder(1);
+ MakeAddAction(ITEM_DOMAIN_LOG_2));
+ AssignIds(id3, ITEM_DOMAIN_LOG_2);
+ // Error: conflicting order.
+ ITEM_DOMAIN_LOG_2.SetOrder(1);
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
-
- // OK to add item with conflicting order if conflict is removed
- // at the same time.
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+
+ // OK to add item with conflicting order if conflict is removed
+ // at the same time.
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_DOMAIN_LOG_1),
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
- IncGeneration(ITEM_DOMAIN_LOG_2);
-
- // Check all items.
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_2, ITEM_DOMAIN_TENANT_POOL_1);
- }
-
- Y_UNIT_TEST(TestRemoveConfigItems) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
- auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_TYPE1_LOG_1),
- MakeAddAction(ITEM_TYPE1_LOG_2),
- MakeAddAction(ITEM_TYPE2_LOG_1),
- MakeAddAction(ITEM_TYPE2_LOG_2),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2, ITEM_DOMAIN_TENANT_POOL_1);
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveByCookieAction("cookie1"));
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TYPE2_LOG_2);
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveByCookieAction("cookie1"));
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TYPE2_LOG_2);
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveByCookieAction("cookie2", ""));
- CheckGetItems(runtime, TVector<ui32>());
- }
-
+ MakeRemoveAction(ITEM_DOMAIN_LOG_1),
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ IncGeneration(ITEM_DOMAIN_LOG_2);
+
+ // Check all items.
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_2, ITEM_DOMAIN_TENANT_POOL_1);
+ }
+
+ Y_UNIT_TEST(TestRemoveConfigItems) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
+ auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_TYPE1_LOG_1),
+ MakeAddAction(ITEM_TYPE1_LOG_2),
+ MakeAddAction(ITEM_TYPE2_LOG_1),
+ MakeAddAction(ITEM_TYPE2_LOG_2),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2, ITEM_DOMAIN_TENANT_POOL_1);
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeRemoveByCookieAction("cookie1"));
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TYPE2_LOG_2);
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeRemoveByCookieAction("cookie1"));
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TYPE2_LOG_2);
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeRemoveByCookieAction("cookie2", ""));
+ CheckGetItems(runtime, TVector<ui32>());
+ }
+
Y_UNIT_TEST(TestConfigureOrderConflicts) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
- // NODE ITEMS
- // Error: order conflict.
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
+ // NODE ITEMS
+ // Error: order conflict.
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_NODE12_LOG_1),
- MakeAddAction(ITEM_NODE23_LOG_1));
+ MakeAddAction(ITEM_NODE12_LOG_1),
+ MakeAddAction(ITEM_NODE23_LOG_1));
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_NODE23_LOG_1),
- MakeAddAction(ITEM_NODE34_LOG_1));
- // OK
+ MakeAddAction(ITEM_NODE23_LOG_1),
+ MakeAddAction(ITEM_NODE34_LOG_1));
+ // OK
auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_NODE12_LOG_1),
- MakeAddAction(ITEM_NODE34_LOG_1));
- AssignIds(id1, ITEM_NODE12_LOG_1, ITEM_NODE34_LOG_1);
- // Error: order conflict.
- ITEM_NODE12_LOG_1.MutableUsageScope()->MutableNodeFilter()->AddNodes(3);
+ MakeAddAction(ITEM_NODE12_LOG_1),
+ MakeAddAction(ITEM_NODE34_LOG_1));
+ AssignIds(id1, ITEM_NODE12_LOG_1, ITEM_NODE34_LOG_1);
+ // Error: order conflict.
+ ITEM_NODE12_LOG_1.MutableUsageScope()->MutableNodeFilter()->AddNodes(3);
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_NODE12_LOG_1));
- // OK
+ MakeModifyAction(ITEM_NODE12_LOG_1));
+ // OK
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_NODE34_LOG_1),
- MakeModifyAction(ITEM_NODE12_LOG_1));
- IncGeneration(ITEM_NODE12_LOG_1);
-
- // HOST ITEMS
- // Error: order conflict.
+ MakeRemoveAction(ITEM_NODE34_LOG_1),
+ MakeModifyAction(ITEM_NODE12_LOG_1));
+ IncGeneration(ITEM_NODE12_LOG_1);
+
+ // HOST ITEMS
+ // Error: order conflict.
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_HOST12_LOG_1),
- MakeAddAction(ITEM_HOST23_LOG_1));
+ MakeAddAction(ITEM_HOST12_LOG_1),
+ MakeAddAction(ITEM_HOST23_LOG_1));
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_HOST23_LOG_1),
- MakeAddAction(ITEM_HOST34_LOG_1));
- // OK
+ MakeAddAction(ITEM_HOST23_LOG_1),
+ MakeAddAction(ITEM_HOST34_LOG_1));
+ // OK
auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_HOST12_LOG_1),
- MakeAddAction(ITEM_HOST34_LOG_1));
- AssignIds(id2, ITEM_HOST12_LOG_1, ITEM_HOST34_LOG_1);
- // Error: order conflict.
- ITEM_HOST12_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host3");
+ MakeAddAction(ITEM_HOST12_LOG_1),
+ MakeAddAction(ITEM_HOST34_LOG_1));
+ AssignIds(id2, ITEM_HOST12_LOG_1, ITEM_HOST34_LOG_1);
+ // Error: order conflict.
+ ITEM_HOST12_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host3");
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_HOST12_LOG_1));
- // OK
+ MakeModifyAction(ITEM_HOST12_LOG_1));
+ // OK
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_HOST34_LOG_1),
- MakeModifyAction(ITEM_HOST12_LOG_1));
- IncGeneration(ITEM_HOST12_LOG_1);
-
- // TENANT ITEMS
- // Error: order conflict.
+ MakeRemoveAction(ITEM_HOST34_LOG_1),
+ MakeModifyAction(ITEM_HOST12_LOG_1));
+ IncGeneration(ITEM_HOST12_LOG_1);
+
+ // TENANT ITEMS
+ // Error: order conflict.
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_TENANT1_LOG_1),
- MakeAddAction(ITEM_TENANT1_LOG_1));
- // OK
+ MakeAddAction(ITEM_TENANT1_LOG_1),
+ MakeAddAction(ITEM_TENANT1_LOG_1));
+ // OK
auto id3 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_TENANT1_LOG_1),
- MakeAddAction(ITEM_TENANT2_LOG_1));
- AssignIds(id3, ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1);
- // Error: order conflict.
- ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant1");
+ MakeAddAction(ITEM_TENANT1_LOG_1),
+ MakeAddAction(ITEM_TENANT2_LOG_1));
+ AssignIds(id3, ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1);
+ // Error: order conflict.
+ ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant1");
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_TENANT2_LOG_1));
- // Error: order conflict.
- ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant1");
+ MakeModifyAction(ITEM_TENANT2_LOG_1));
+ // Error: order conflict.
+ ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant1");
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_TENANT2_LOG_1));
- // OK
- ITEM_TENANT1_LOG_1.SetOrder(2);
+ MakeModifyAction(ITEM_TENANT2_LOG_1));
+ // OK
+ ITEM_TENANT1_LOG_1.SetOrder(2);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_TENANT1_LOG_1),
- MakeModifyAction(ITEM_TENANT2_LOG_1));
- IncGeneration(ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1);
- // OK
- ITEM_TENANT1_LOG_1.SetOrder(1);
- ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant2");
+ MakeModifyAction(ITEM_TENANT1_LOG_1),
+ MakeModifyAction(ITEM_TENANT2_LOG_1));
+ IncGeneration(ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1);
+ // OK
+ ITEM_TENANT1_LOG_1.SetOrder(1);
+ ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant2");
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_TENANT1_LOG_1),
- MakeModifyAction(ITEM_TENANT2_LOG_1));
- IncGeneration(ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1);
-
- // NODE TYPE ITEMS
- // Error: order conflict.
+ MakeModifyAction(ITEM_TENANT1_LOG_1),
+ MakeModifyAction(ITEM_TENANT2_LOG_1));
+ IncGeneration(ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1);
+
+ // NODE TYPE ITEMS
+ // Error: order conflict.
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_TYPE1_LOG_1),
- MakeAddAction(ITEM_TYPE1_LOG_1));
- // OK
+ MakeAddAction(ITEM_TYPE1_LOG_1),
+ MakeAddAction(ITEM_TYPE1_LOG_1));
+ // OK
auto id4 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_TYPE1_LOG_1),
- MakeAddAction(ITEM_TYPE2_LOG_1));
- AssignIds(id4, ITEM_TYPE1_LOG_1, ITEM_TYPE2_LOG_1);
- // Error: order conflict.
- ITEM_TYPE2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type1");
+ MakeAddAction(ITEM_TYPE1_LOG_1),
+ MakeAddAction(ITEM_TYPE2_LOG_1));
+ AssignIds(id4, ITEM_TYPE1_LOG_1, ITEM_TYPE2_LOG_1);
+ // Error: order conflict.
+ ITEM_TYPE2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type1");
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_TYPE2_LOG_1));
- // Error: order conflict.
- ITEM_TYPE2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type1");
+ MakeModifyAction(ITEM_TYPE2_LOG_1));
+ // Error: order conflict.
+ ITEM_TYPE2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type1");
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_TYPE2_LOG_1));
- // OK
- ITEM_TYPE1_LOG_1.SetOrder(2);
+ MakeModifyAction(ITEM_TYPE2_LOG_1));
+ // OK
+ ITEM_TYPE1_LOG_1.SetOrder(2);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_TYPE1_LOG_1),
- MakeModifyAction(ITEM_TYPE2_LOG_1));
- IncGeneration(ITEM_TYPE1_LOG_1, ITEM_TYPE2_LOG_1);
- // OK
- ITEM_TYPE1_LOG_1.SetOrder(1);
- ITEM_TYPE2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type2");
+ MakeModifyAction(ITEM_TYPE1_LOG_1),
+ MakeModifyAction(ITEM_TYPE2_LOG_1));
+ IncGeneration(ITEM_TYPE1_LOG_1, ITEM_TYPE2_LOG_1);
+ // OK
+ ITEM_TYPE1_LOG_1.SetOrder(1);
+ ITEM_TYPE2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type2");
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_TYPE1_LOG_1),
- MakeModifyAction(ITEM_TYPE2_LOG_1));
- IncGeneration(ITEM_TYPE1_LOG_1, ITEM_TYPE2_LOG_1);
-
- // TENANT AND NODE TYPE ITEMS
- // Error: order conflict.
+ MakeModifyAction(ITEM_TYPE1_LOG_1),
+ MakeModifyAction(ITEM_TYPE2_LOG_1));
+ IncGeneration(ITEM_TYPE1_LOG_1, ITEM_TYPE2_LOG_1);
+
+ // TENANT AND NODE TYPE ITEMS
+ // Error: order conflict.
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1),
- MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1));
- // OK
+ MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1),
+ MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1));
+ // OK
auto id5 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1),
- MakeAddAction(ITEM_TENANT1_TYPE2_LOG_1),
- MakeAddAction(ITEM_TENANT2_TYPE1_LOG_1),
- MakeAddAction(ITEM_TENANT2_TYPE2_LOG_1));
- AssignIds(id5, ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE2_LOG_1,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE2_LOG_1);
- // Error: order conflict
- ITEM_TENANT1_TYPE1_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type2");
+ MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1),
+ MakeAddAction(ITEM_TENANT1_TYPE2_LOG_1),
+ MakeAddAction(ITEM_TENANT2_TYPE1_LOG_1),
+ MakeAddAction(ITEM_TENANT2_TYPE2_LOG_1));
+ AssignIds(id5, ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE2_LOG_1,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE2_LOG_1);
+ // Error: order conflict
+ ITEM_TENANT1_TYPE1_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type2");
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_TENANT1_TYPE1_LOG_1));
- // OK
- ITEM_TENANT1_TYPE2_LOG_1.SetOrder(2);
+ MakeModifyAction(ITEM_TENANT1_TYPE1_LOG_1));
+ // OK
+ ITEM_TENANT1_TYPE2_LOG_1.SetOrder(2);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_TENANT1_TYPE1_LOG_1),
- MakeModifyAction(ITEM_TENANT1_TYPE2_LOG_1));
- IncGeneration(ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE2_LOG_1);
- // OK
- ITEM_TENANT1_TYPE2_LOG_1.SetOrder(1);
+ MakeModifyAction(ITEM_TENANT1_TYPE1_LOG_1),
+ MakeModifyAction(ITEM_TENANT1_TYPE2_LOG_1));
+ IncGeneration(ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE2_LOG_1);
+ // OK
+ ITEM_TENANT1_TYPE2_LOG_1.SetOrder(1);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_TENANT1_TYPE1_LOG_1),
- MakeModifyAction(ITEM_TENANT1_TYPE2_LOG_1));
- IncGeneration(ITEM_TENANT1_TYPE2_LOG_1);
-
- // Check all items.
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_NODE12_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1,
- ITEM_TYPE1_LOG_1, ITEM_TYPE2_LOG_1,
- ITEM_TENANT1_TYPE2_LOG_1,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE2_LOG_1);
- }
-
+ MakeRemoveAction(ITEM_TENANT1_TYPE1_LOG_1),
+ MakeModifyAction(ITEM_TENANT1_TYPE2_LOG_1));
+ IncGeneration(ITEM_TENANT1_TYPE2_LOG_1);
+
+ // Check all items.
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_NODE12_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE2_LOG_1,
+ ITEM_TENANT1_TYPE2_LOG_1,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE2_LOG_1);
+ }
+
Y_UNIT_TEST(TestGetItems) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_2));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
-
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_2));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
+
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
CheckGetItems(runtime, TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
CheckGetItems(runtime, TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::TenantPoolConfigItem}),
- ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
+ ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
CheckGetItems(runtime, TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem,
(ui32)NKikimrConsole::TConfigItem::TenantPoolConfigItem}),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
- CheckGetItems(runtime, TVector<ui32>(NKikimrConsole::TConfigItem::ActorSystemConfigItem));
-
- ITEM_NODE23_LOG_1.SetOrder(2);
- ITEM_HOST23_LOG_1.SetOrder(2);
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
+ CheckGetItems(runtime, TVector<ui32>(NKikimrConsole::TConfigItem::ActorSystemConfigItem));
+
+ ITEM_NODE23_LOG_1.SetOrder(2);
+ ITEM_HOST23_LOG_1.SetOrder(2);
auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_NODE12_LOG_1), MakeAddAction(ITEM_NODE23_LOG_1),
- MakeAddAction(ITEM_NODE34_LOG_1), MakeAddAction(ITEM_HOST12_LOG_1),
- MakeAddAction(ITEM_HOST23_LOG_1), MakeAddAction(ITEM_HOST34_LOG_1),
- MakeAddAction(ITEM_TENANT1_LOG_1), MakeAddAction(ITEM_TENANT1_LOG_2),
- MakeAddAction(ITEM_TENANT2_LOG_1), MakeAddAction(ITEM_TENANT2_LOG_2),
- MakeAddAction(ITEM_TYPE1_LOG_1), MakeAddAction(ITEM_TYPE1_LOG_2),
- MakeAddAction(ITEM_TYPE2_LOG_1), MakeAddAction(ITEM_TYPE2_LOG_2),
- MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE1_LOG_2),
- MakeAddAction(ITEM_TENANT1_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE2_LOG_2),
- MakeAddAction(ITEM_TENANT2_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE1_LOG_2),
- MakeAddAction(ITEM_TENANT2_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE2_LOG_2));
- AssignIds(id2, ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
- ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
-
- CheckGetItemsById(runtime, TVector<ui64>({id2[0]}),
+ MakeAddAction(ITEM_NODE12_LOG_1), MakeAddAction(ITEM_NODE23_LOG_1),
+ MakeAddAction(ITEM_NODE34_LOG_1), MakeAddAction(ITEM_HOST12_LOG_1),
+ MakeAddAction(ITEM_HOST23_LOG_1), MakeAddAction(ITEM_HOST34_LOG_1),
+ MakeAddAction(ITEM_TENANT1_LOG_1), MakeAddAction(ITEM_TENANT1_LOG_2),
+ MakeAddAction(ITEM_TENANT2_LOG_1), MakeAddAction(ITEM_TENANT2_LOG_2),
+ MakeAddAction(ITEM_TYPE1_LOG_1), MakeAddAction(ITEM_TYPE1_LOG_2),
+ MakeAddAction(ITEM_TYPE2_LOG_1), MakeAddAction(ITEM_TYPE2_LOG_2),
+ MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE1_LOG_2),
+ MakeAddAction(ITEM_TENANT1_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE2_LOG_2),
+ MakeAddAction(ITEM_TENANT2_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE1_LOG_2),
+ MakeAddAction(ITEM_TENANT2_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE2_LOG_2));
+ AssignIds(id2, ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
+ ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+
+ CheckGetItemsById(runtime, TVector<ui64>({id2[0]}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1);
- CheckGetItemsById(runtime, TVector<ui64>({id2[1]}),
+ ITEM_NODE12_LOG_1);
+ CheckGetItemsById(runtime, TVector<ui64>({id2[1]}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE23_LOG_1);
- CheckGetItemsById(runtime, TVector<ui64>({id2[0], id2[0]}),
+ ITEM_NODE23_LOG_1);
+ CheckGetItemsById(runtime, TVector<ui64>({id2[0], id2[0]}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1);
- CheckGetItemsById(runtime, TVector<ui64>({id2[0], id2[1]}),
+ ITEM_NODE12_LOG_1);
+ CheckGetItemsById(runtime, TVector<ui64>({id2[0], id2[1]}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1);
- CheckGetItemsById(runtime, TVector<ui64>({id2[1]}),
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1);
+ CheckGetItemsById(runtime, TVector<ui64>({id2[1]}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsById(runtime, TVector<ui64>({987654321}),
+ CheckGetItemsById(runtime, TVector<ui64>({987654321}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
-
- CheckGetItemsByNodeId(runtime, TVector<ui32>({1}),
+
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({1}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1);
- CheckGetItemsByNodeId(runtime, TVector<ui32>({2}),
+ ITEM_NODE12_LOG_1);
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({2}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1);
- CheckGetItemsByNodeId(runtime, TVector<ui32>({3}),
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1);
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({3}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE23_LOG_1, ITEM_NODE34_LOG_1);
- CheckGetItemsByNodeId(runtime, TVector<ui32>({4}),
+ ITEM_NODE23_LOG_1, ITEM_NODE34_LOG_1);
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({4}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE34_LOG_1);
- CheckGetItemsByNodeId(runtime, TVector<ui32>({1, 1}),
+ ITEM_NODE34_LOG_1);
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({1, 1}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1);
- CheckGetItemsByNodeId(runtime, TVector<ui32>({1, 2}),
+ ITEM_NODE12_LOG_1);
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({1, 2}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1);
- CheckGetItemsByNodeId(runtime, TVector<ui32>({1, 2, 3}),
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1);
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({1, 2, 3}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1, ITEM_NODE34_LOG_1);
- CheckGetItemsByNodeId(runtime, TVector<ui32>({1, 2, 3, 4}),
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1, ITEM_NODE34_LOG_1);
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({1, 2, 3, 4}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1, ITEM_NODE34_LOG_1);
- CheckGetItemsByNodeId(runtime, TVector<ui32>({2, 4, 5}),
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1, ITEM_NODE34_LOG_1);
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({2, 4, 5}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1, ITEM_NODE34_LOG_1);
- CheckGetItemsByNodeId(runtime, TVector<ui32>({}),
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1, ITEM_NODE34_LOG_1);
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1, ITEM_NODE34_LOG_1);
- CheckGetItemsByNodeId(runtime, TVector<ui32>({4}),
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1, ITEM_NODE34_LOG_1);
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({4}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByNodeId(runtime, TVector<ui32>({}),
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByNodeId(runtime, TVector<ui32>({5}),
+ CheckGetItemsByNodeId(runtime, TVector<ui32>({5}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
-
- CheckGetItemsByHost(runtime, TVector<TString>({"host1"}),
+
+ CheckGetItemsByHost(runtime, TVector<TString>({"host1"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_HOST12_LOG_1);
- CheckGetItemsByHost(runtime, TVector<TString>({"host2"}),
+ ITEM_HOST12_LOG_1);
+ CheckGetItemsByHost(runtime, TVector<TString>({"host2"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1);
- CheckGetItemsByHost(runtime, TVector<TString>({"host3"}),
+ ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1);
+ CheckGetItemsByHost(runtime, TVector<TString>({"host3"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1);
- CheckGetItemsByHost(runtime, TVector<TString>({"host4"}),
+ ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1);
+ CheckGetItemsByHost(runtime, TVector<TString>({"host4"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_HOST34_LOG_1);
- CheckGetItemsByHost(runtime, TVector<TString>({"host1", "host1"}),
+ ITEM_HOST34_LOG_1);
+ CheckGetItemsByHost(runtime, TVector<TString>({"host1", "host1"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_HOST12_LOG_1);
- CheckGetItemsByHost(runtime, TVector<TString>({"host1", "host2"}),
+ ITEM_HOST12_LOG_1);
+ CheckGetItemsByHost(runtime, TVector<TString>({"host1", "host2"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1);
- CheckGetItemsByHost(runtime, TVector<TString>({"host1", "host2", "host3"}),
+ ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1);
+ CheckGetItemsByHost(runtime, TVector<TString>({"host1", "host2", "host3"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1);
- CheckGetItemsByHost(runtime, TVector<TString>({"host1", "host2", "host3", "host4"}),
+ ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1);
+ CheckGetItemsByHost(runtime, TVector<TString>({"host1", "host2", "host3", "host4"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1);
- CheckGetItemsByHost(runtime, TVector<TString>({"host2", "host3", "host5"}),
+ ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1);
+ CheckGetItemsByHost(runtime, TVector<TString>({"host2", "host3", "host5"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1);
- CheckGetItemsByHost(runtime, TVector<TString>({}),
+ ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1);
+ CheckGetItemsByHost(runtime, TVector<TString>({}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1);
- CheckGetItemsByHost(runtime, TVector<TString>({"host4"}),
+ ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1);
+ CheckGetItemsByHost(runtime, TVector<TString>({"host4"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByHost(runtime, TVector<TString>({}),
+ CheckGetItemsByHost(runtime, TVector<TString>({}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByHost(runtime, TVector<TString>({"host5"}),
+ CheckGetItemsByHost(runtime, TVector<TString>({"host5"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
-
- CheckGetItemsByTenant(runtime, TVector<TString>({"tenant1"}),
+
+ CheckGetItemsByTenant(runtime, TVector<TString>({"tenant1"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2);
- CheckGetItemsByTenant(runtime, TVector<TString>({"tenant2"}),
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2);
+ CheckGetItemsByTenant(runtime, TVector<TString>({"tenant2"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItemsByTenant(runtime, TVector<TString>({"tenant1", "tenant1"}),
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItemsByTenant(runtime, TVector<TString>({"tenant1", "tenant1"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2);
- CheckGetItemsByTenant(runtime, TVector<TString>({"tenant1", "tenant2"}),
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2);
+ CheckGetItemsByTenant(runtime, TVector<TString>({"tenant1", "tenant2"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItemsByTenant(runtime, TVector<TString>({}),
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItemsByTenant(runtime, TVector<TString>({}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItemsByTenant(runtime, TVector<TString>({"tenant2"}),
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItemsByTenant(runtime, TVector<TString>({"tenant2"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByTenant(runtime, TVector<TString>({}),
+ CheckGetItemsByTenant(runtime, TVector<TString>({}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByTenant(runtime, TVector<TString>({"tenant3"}),
+ CheckGetItemsByTenant(runtime, TVector<TString>({"tenant3"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
-
- CheckGetItemsByNodeType(runtime, TVector<TString>({"type1"}),
+
+ CheckGetItemsByNodeType(runtime, TVector<TString>({"type1"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2);
- CheckGetItemsByNodeType(runtime, TVector<TString>({"type2"}),
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2);
+ CheckGetItemsByNodeType(runtime, TVector<TString>({"type2"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItemsByNodeType(runtime, TVector<TString>({"type1", "type1"}),
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItemsByNodeType(runtime, TVector<TString>({"type1", "type1"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2);
- CheckGetItemsByNodeType(runtime, TVector<TString>({"type1", "type2"}),
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2);
+ CheckGetItemsByNodeType(runtime, TVector<TString>({"type1", "type2"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItemsByNodeType(runtime, TVector<TString>({}),
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItemsByNodeType(runtime, TVector<TString>({}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItemsByNodeType(runtime, TVector<TString>({"type2"}),
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItemsByNodeType(runtime, TVector<TString>({"type2"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByNodeType(runtime, TVector<TString>({}),
+ CheckGetItemsByNodeType(runtime, TVector<TString>({}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByNodeType(runtime, TVector<TString>({"type3"}),
+ CheckGetItemsByNodeType(runtime, TVector<TString>({"type3"}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
-
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type1")}),
+
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type1")}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type2")}),
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type2")}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2);
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant2", "type1")}),
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2);
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant2", "type1")}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2);
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant2", "type2")}),
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2);
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant2", "type2")}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type1"),
- std::make_pair("tenant1", "type1")}),
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type1"),
+ std::make_pair("tenant1", "type1")}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type1"),
- std::make_pair("tenant1", "type2")}),
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type1"),
+ std::make_pair("tenant1", "type2")}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2);
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type1"),
- std::make_pair("tenant2", "type2")}),
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2);
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type1"),
+ std::make_pair("tenant2", "type2")}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({}),
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant2", "type2")}),
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant2", "type2")}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({}),
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type3")}),
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant1", "type3")}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant3", "type2")}),
+ CheckGetItemsByTenantAndNodeType(runtime, TVector<std::pair<TString, TString>>({std::make_pair("tenant3", "type2")}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
-
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({1, 2})), TVector<ui32>(),
- ITEM_NODE12_LOG_1);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({2, 3})), TVector<ui32>(),
- ITEM_NODE23_LOG_1);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({3, 4})), TVector<ui32>(),
- ITEM_NODE34_LOG_1);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({3, 4})),
+
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({1, 2})), TVector<ui32>(),
+ ITEM_NODE12_LOG_1);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({2, 3})), TVector<ui32>(),
+ ITEM_NODE23_LOG_1);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({3, 4})), TVector<ui32>(),
+ ITEM_NODE34_LOG_1);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({3, 4})),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({})), TVector<ui32>());
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({1})), TVector<ui32>());
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({2})), TVector<ui32>());
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({3})), TVector<ui32>());
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({1, 2, 3})), TVector<ui32>());
-
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host1"), TString("host2")})),
- TVector<ui32>(),
- ITEM_HOST12_LOG_1);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host2"), TString("host3")})),
- TVector<ui32>(),
- ITEM_HOST23_LOG_1);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host3"), TString("host4")})),
- TVector<ui32>(),
- ITEM_HOST34_LOG_1);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host3"), TString("host4")})),
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({})), TVector<ui32>());
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({1})), TVector<ui32>());
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({2})), TVector<ui32>());
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({3})), TVector<ui32>());
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<ui32>({1, 2, 3})), TVector<ui32>());
+
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host1"), TString("host2")})),
+ TVector<ui32>(),
+ ITEM_HOST12_LOG_1);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host2"), TString("host3")})),
+ TVector<ui32>(),
+ ITEM_HOST23_LOG_1);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host3"), TString("host4")})),
+ TVector<ui32>(),
+ ITEM_HOST34_LOG_1);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host3"), TString("host4")})),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>()), TVector<ui32>());
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host1")})), TVector<ui32>());
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host2")})), TVector<ui32>());
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host3")})), TVector<ui32>());
- CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host1"), TString("host2"), TString("host3")})),
- TVector<ui32>());
-
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant1", ""), TVector<ui32>(),
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant2", ""), TVector<ui32>(),
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant2", ""),
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>()), TVector<ui32>());
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host1")})), TVector<ui32>());
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host2")})), TVector<ui32>());
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host3")})), TVector<ui32>());
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope(TVector<TString>({TString("host1"), TString("host2"), TString("host3")})),
+ TVector<ui32>());
+
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant1", ""), TVector<ui32>(),
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant2", ""), TVector<ui32>(),
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant2", ""),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant3", ""), TVector<ui32>());
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("", "type1"), TVector<ui32>(),
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("", "type2"), TVector<ui32>(),
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("", "type2"),
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant3", ""), TVector<ui32>());
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("", "type1"), TVector<ui32>(),
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("", "type2"), TVector<ui32>(),
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("", "type2"),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("", "type3"), TVector<ui32>());
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant1", "type1"), TVector<ui32>(),
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant1", "type2"), TVector<ui32>(),
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant2", "type1"), TVector<ui32>(),
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant2", "type2"), TVector<ui32>(),
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant2", "type2"),
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("", "type3"), TVector<ui32>());
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant1", "type1"), TVector<ui32>(),
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant1", "type2"), TVector<ui32>(),
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant2", "type1"), TVector<ui32>(),
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant2", "type2"), TVector<ui32>(),
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant2", "type2"),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant3", "type1"), TVector<ui32>());
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant1", "type3"), TVector<ui32>());
-
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("", ""), TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("", ""),
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant3", "type1"), TVector<ui32>());
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("tenant1", "type3"), TVector<ui32>());
+
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("", ""), TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("", ""),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
- CheckGetItemsByUsageScope(runtime, MakeUsageScope("", ""),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+ CheckGetItemsByUsageScope(runtime, MakeUsageScope("", ""),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetItemsByUsageScope(runtime, NKikimrConsole::TUsageScope(), TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
- CheckGetItemsByUsageScope(runtime, NKikimrConsole::TUsageScope(),
+ CheckGetItemsByUsageScope(runtime, NKikimrConsole::TUsageScope(), TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
+ CheckGetItemsByUsageScope(runtime, NKikimrConsole::TUsageScope(),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
- CheckGetItemsByUsageScope(runtime, NKikimrConsole::TUsageScope(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+ CheckGetItemsByUsageScope(runtime, NKikimrConsole::TUsageScope(),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
-
- auto scope1 = MakeUsageScope(TVector<ui32>({1, 2}));
- auto scope2 = MakeUsageScope(TVector<TString>({TString("host1"), TString("host2")}));
- auto scope3 = MakeUsageScope("tenant1", "");
- auto scope4 = MakeUsageScope("", "type1");
- auto scope5 = MakeUsageScope("tenant1", "type1");
- auto scope6 = MakeUsageScope("", "");
- CheckGetItemsByUsageScope(runtime, TVector<NKikimrConsole::TUsageScope>({scope1, scope2, scope3, scope4, scope5, scope6}),
- TVector<ui32>(),
- ITEM_NODE12_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
- CheckGetItemsByUsageScope(runtime, TVector<NKikimrConsole::TUsageScope>({scope1, scope2, scope3, scope4, scope5, scope6}),
+
+ auto scope1 = MakeUsageScope(TVector<ui32>({1, 2}));
+ auto scope2 = MakeUsageScope(TVector<TString>({TString("host1"), TString("host2")}));
+ auto scope3 = MakeUsageScope("tenant1", "");
+ auto scope4 = MakeUsageScope("", "type1");
+ auto scope5 = MakeUsageScope("tenant1", "type1");
+ auto scope6 = MakeUsageScope("", "");
+ CheckGetItemsByUsageScope(runtime, TVector<NKikimrConsole::TUsageScope>({scope1, scope2, scope3, scope4, scope5, scope6}),
+ TVector<ui32>(),
+ ITEM_NODE12_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2);
+ CheckGetItemsByUsageScope(runtime, TVector<NKikimrConsole::TUsageScope>({scope1, scope2, scope3, scope4, scope5, scope6}),
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
-
- CheckGetItemsByCookie(runtime, TVector<TString>({"cookie1"}),
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
- ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1,
- ITEM_TYPE1_LOG_1, ITEM_TYPE2_LOG_1,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE2_LOG_1,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE2_LOG_1);
- CheckGetItemsByCookie(runtime, TVector<TString>({"cookie2"}),
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_TENANT1_LOG_2, ITEM_TENANT2_LOG_2,
- ITEM_TYPE1_LOG_2, ITEM_TYPE2_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_2, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_2, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItemsByCookie(runtime, TVector<TString>({""}),
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
- CheckGetItemsByCookie(runtime, TVector<TString>({"cookie3"}),
- TVector<ui32>());
-
+ ITEM_NODE12_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+
+ CheckGetItemsByCookie(runtime, TVector<TString>({"cookie1"}),
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
+ ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE2_LOG_1,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE2_LOG_1,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE2_LOG_1);
+ CheckGetItemsByCookie(runtime, TVector<TString>({"cookie2"}),
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
+ ITEM_TENANT1_LOG_2, ITEM_TENANT2_LOG_2,
+ ITEM_TYPE1_LOG_2, ITEM_TYPE2_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_2, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_2, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItemsByCookie(runtime, TVector<TString>({""}),
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+ CheckGetItemsByCookie(runtime, TVector<TString>({"cookie3"}),
+ TVector<ui32>());
+
CheckGetItems(runtime, TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
- ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2,
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
- ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
- }
-
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
+ ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2,
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
+ ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+ }
+
Y_UNIT_TEST(TestGetNodeItems) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
- ITEM_NODE23_LOG_1.SetOrder(2);
- ITEM_HOST23_LOG_1.SetOrder(2);
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
+ ITEM_NODE23_LOG_1.SetOrder(2);
+ ITEM_HOST23_LOG_1.SetOrder(2);
auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1), MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_NODE12_LOG_1), MakeAddAction(ITEM_NODE23_LOG_1),
- MakeAddAction(ITEM_NODE34_LOG_1), MakeAddAction(ITEM_HOST12_LOG_1),
- MakeAddAction(ITEM_HOST23_LOG_1), MakeAddAction(ITEM_HOST34_LOG_1),
- MakeAddAction(ITEM_TENANT1_LOG_1), MakeAddAction(ITEM_TENANT1_LOG_2),
- MakeAddAction(ITEM_TENANT2_LOG_1), MakeAddAction(ITEM_TENANT2_LOG_2),
- MakeAddAction(ITEM_TYPE1_LOG_1), MakeAddAction(ITEM_TYPE1_LOG_2),
- MakeAddAction(ITEM_TYPE2_LOG_1), MakeAddAction(ITEM_TYPE2_LOG_2),
- MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE1_LOG_2),
- MakeAddAction(ITEM_TENANT1_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE2_LOG_2),
- MakeAddAction(ITEM_TENANT2_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE1_LOG_2),
- MakeAddAction(ITEM_TENANT2_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE2_LOG_2));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
- ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
-
- CheckGetNodeItems(runtime, 1, "host1", "tenant1", "type1", TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_NODE12_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
- CheckGetNodeItems(runtime, 1, "host1", "tenant1", "type1",
+ MakeAddAction(ITEM_DOMAIN_LOG_1), MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_NODE12_LOG_1), MakeAddAction(ITEM_NODE23_LOG_1),
+ MakeAddAction(ITEM_NODE34_LOG_1), MakeAddAction(ITEM_HOST12_LOG_1),
+ MakeAddAction(ITEM_HOST23_LOG_1), MakeAddAction(ITEM_HOST34_LOG_1),
+ MakeAddAction(ITEM_TENANT1_LOG_1), MakeAddAction(ITEM_TENANT1_LOG_2),
+ MakeAddAction(ITEM_TENANT2_LOG_1), MakeAddAction(ITEM_TENANT2_LOG_2),
+ MakeAddAction(ITEM_TYPE1_LOG_1), MakeAddAction(ITEM_TYPE1_LOG_2),
+ MakeAddAction(ITEM_TYPE2_LOG_1), MakeAddAction(ITEM_TYPE2_LOG_2),
+ MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE1_LOG_2),
+ MakeAddAction(ITEM_TENANT1_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE2_LOG_2),
+ MakeAddAction(ITEM_TENANT2_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE1_LOG_2),
+ MakeAddAction(ITEM_TENANT2_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE2_LOG_2));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
+ ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+
+ CheckGetNodeItems(runtime, 1, "host1", "tenant1", "type1", TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_NODE12_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
+ CheckGetNodeItems(runtime, 1, "host1", "tenant1", "type1",
TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem}));
- CheckGetNodeItems(runtime, 2, "host1", "tenant1", "type1", TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
- CheckGetNodeItems(runtime, 5, "host2", "tenant1", "type1", TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
- CheckGetNodeItems(runtime, 5, "host4", "tenant2", "", TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_HOST34_LOG_1,
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2);
- CheckGetNodeItems(runtime, 5, "host5", "tenant2", "type3", TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2);
- CheckGetNodeItems(runtime, 5, "host5", "", "type2", TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2);
- CheckGetNodeItems(runtime, 5, "host5", "", "type3", TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
- }
-
+ CheckGetNodeItems(runtime, 2, "host1", "tenant1", "type1", TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
+ CheckGetNodeItems(runtime, 5, "host2", "tenant1", "type1", TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_HOST12_LOG_1, ITEM_HOST23_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2);
+ CheckGetNodeItems(runtime, 5, "host4", "tenant2", "", TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_HOST34_LOG_1,
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2);
+ CheckGetNodeItems(runtime, 5, "host5", "tenant2", "type3", TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2);
+ CheckGetNodeItems(runtime, 5, "host5", "", "type2", TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2);
+ CheckGetNodeItems(runtime, 5, "host5", "", "type3", TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+ }
+
Y_UNIT_TEST(TestGetNodeConfig) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
- ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file1");
- ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetBackendFileName("file2");
- ITEM_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file3");
- ITEM_TENANT1_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file4");
- ITEM_TENANT1_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file5");
- ITEM_HOST12_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file6");
- ITEM_NODE12_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file7");
-
- ITEM_TENANT2_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry()->SetLevel(1);
- ITEM_TENANT2_LOG_2.MutableConfig()->MutableLogConfig()->AddEntry()->SetLevel(2);
-
- ITEM_TENANT2_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry()->SetLevel(3);
- ITEM_TENANT2_TYPE1_LOG_1.SetMergeStrategy(NKikimrConsole::TConfigItem::MERGE_OVERWRITE_REPEATED);
-
- ITEM_NODE23_LOG_1.SetOrder(2);
-
- ITEM_HOST23_LOG_1.SetOrder(2);
- ITEM_HOST23_LOG_1.SetMergeStrategy(NKikimrConsole::TConfigItem::OVERWRITE);
- ITEM_HOST23_LOG_1.MutableConfig()->MutableLogConfig();
-
- ITEM_DOMAIN_TENANT_POOL_1.MutableConfig()->MutableTenantPoolConfig();
-
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
+ ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file1");
+ ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetBackendFileName("file2");
+ ITEM_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file3");
+ ITEM_TENANT1_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file4");
+ ITEM_TENANT1_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file5");
+ ITEM_HOST12_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file6");
+ ITEM_NODE12_LOG_1.MutableConfig()->MutableLogConfig()->SetBackendFileName("file7");
+
+ ITEM_TENANT2_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry()->SetLevel(1);
+ ITEM_TENANT2_LOG_2.MutableConfig()->MutableLogConfig()->AddEntry()->SetLevel(2);
+
+ ITEM_TENANT2_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry()->SetLevel(3);
+ ITEM_TENANT2_TYPE1_LOG_1.SetMergeStrategy(NKikimrConsole::TConfigItem::MERGE_OVERWRITE_REPEATED);
+
+ ITEM_NODE23_LOG_1.SetOrder(2);
+
+ ITEM_HOST23_LOG_1.SetOrder(2);
+ ITEM_HOST23_LOG_1.SetMergeStrategy(NKikimrConsole::TConfigItem::OVERWRITE);
+ ITEM_HOST23_LOG_1.MutableConfig()->MutableLogConfig();
+
+ ITEM_DOMAIN_TENANT_POOL_1.MutableConfig()->MutableTenantPoolConfig();
+
auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1), MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1), MakeAddAction(ITEM_DOMAIN_TENANT_POOL_2),
- MakeAddAction(ITEM_NODE12_LOG_1), MakeAddAction(ITEM_NODE23_LOG_1),
- MakeAddAction(ITEM_NODE34_LOG_1), MakeAddAction(ITEM_HOST12_LOG_1),
- MakeAddAction(ITEM_HOST23_LOG_1), MakeAddAction(ITEM_HOST34_LOG_1),
- MakeAddAction(ITEM_TENANT1_LOG_1), MakeAddAction(ITEM_TENANT1_LOG_2),
- MakeAddAction(ITEM_TENANT2_LOG_1), MakeAddAction(ITEM_TENANT2_LOG_2),
- MakeAddAction(ITEM_TYPE1_LOG_1), MakeAddAction(ITEM_TYPE1_LOG_2),
- MakeAddAction(ITEM_TYPE2_LOG_1), MakeAddAction(ITEM_TYPE2_LOG_2),
- MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE1_LOG_2),
- MakeAddAction(ITEM_TENANT1_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE2_LOG_2),
- MakeAddAction(ITEM_TENANT2_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE1_LOG_2),
- MakeAddAction(ITEM_TENANT2_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE2_LOG_2));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2,
- ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
- ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
- ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
-
- NKikimrConfig::TAppConfig config1;
- config1.MutableTenantPoolConfig();
- config1.MutableLogConfig()->SetClusterName("cluster1");
- config1.MutableLogConfig()->SetBackendFileName("file2");
- CheckGetNodeConfig(runtime, 0, "", "", "", config1);
- config1.MutableLogConfig()->SetBackendFileName("file3");
- CheckGetNodeConfig(runtime, 0, "", "", "type1", config1);
- config1.MutableLogConfig()->SetBackendFileName("file4");
- CheckGetNodeConfig(runtime, 0, "", "tenant1", "", config1);
- config1.MutableLogConfig()->SetBackendFileName("file5");
- CheckGetNodeConfig(runtime, 0, "", "tenant1", "type1", config1);
- config1.MutableLogConfig()->SetBackendFileName("file6");
- CheckGetNodeConfig(runtime, 0, "host1", "tenant1", "type1", config1);
- config1.MutableLogConfig()->SetBackendFileName("file7");
- CheckGetNodeConfig(runtime, 1, "host1", "tenant1", "type1", config1);
- config1.MutableLogConfig()->ClearClusterName();
- CheckGetNodeConfig(runtime, 1, "host2", "tenant1", "type1", config1);
- config1.MutableLogConfig()->ClearBackendFileName();
- CheckGetNodeConfig(runtime, 0, "host2", "tenant1", "type1", config1);
- config1.MutableLogConfig()->SetClusterName("cluster1");
- config1.MutableLogConfig()->SetBackendFileName("file2");
- config1.MutableLogConfig()->AddEntry()->SetLevel(1);
- config1.MutableLogConfig()->AddEntry()->SetLevel(2);
- CheckGetNodeConfig(runtime, 0, "", "tenant2", "", config1);
- config1.MutableLogConfig()->SetBackendFileName("file3");
- config1.MutableLogConfig()->ClearEntry();
- config1.MutableLogConfig()->AddEntry()->SetLevel(3);
- CheckGetNodeConfig(runtime, 0, "", "tenant2", "type1", config1);
-
- config1.ClearTenantPoolConfig();
- CheckGetNodeConfig(runtime, 0, "", "tenant2", "type1", config1,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- }
-
+ MakeAddAction(ITEM_DOMAIN_LOG_1), MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1), MakeAddAction(ITEM_DOMAIN_TENANT_POOL_2),
+ MakeAddAction(ITEM_NODE12_LOG_1), MakeAddAction(ITEM_NODE23_LOG_1),
+ MakeAddAction(ITEM_NODE34_LOG_1), MakeAddAction(ITEM_HOST12_LOG_1),
+ MakeAddAction(ITEM_HOST23_LOG_1), MakeAddAction(ITEM_HOST34_LOG_1),
+ MakeAddAction(ITEM_TENANT1_LOG_1), MakeAddAction(ITEM_TENANT1_LOG_2),
+ MakeAddAction(ITEM_TENANT2_LOG_1), MakeAddAction(ITEM_TENANT2_LOG_2),
+ MakeAddAction(ITEM_TYPE1_LOG_1), MakeAddAction(ITEM_TYPE1_LOG_2),
+ MakeAddAction(ITEM_TYPE2_LOG_1), MakeAddAction(ITEM_TYPE2_LOG_2),
+ MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE1_LOG_2),
+ MakeAddAction(ITEM_TENANT1_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT1_TYPE2_LOG_2),
+ MakeAddAction(ITEM_TENANT2_TYPE1_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE1_LOG_2),
+ MakeAddAction(ITEM_TENANT2_TYPE2_LOG_1), MakeAddAction(ITEM_TENANT2_TYPE2_LOG_2));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_DOMAIN_TENANT_POOL_1, ITEM_DOMAIN_TENANT_POOL_2,
+ ITEM_NODE12_LOG_1, ITEM_NODE23_LOG_1,
+ ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_HOST23_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1, ITEM_TENANT1_TYPE2_LOG_2,
+ ITEM_TENANT2_TYPE1_LOG_1, ITEM_TENANT2_TYPE1_LOG_2,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2);
+
+ NKikimrConfig::TAppConfig config1;
+ config1.MutableTenantPoolConfig();
+ config1.MutableLogConfig()->SetClusterName("cluster1");
+ config1.MutableLogConfig()->SetBackendFileName("file2");
+ CheckGetNodeConfig(runtime, 0, "", "", "", config1);
+ config1.MutableLogConfig()->SetBackendFileName("file3");
+ CheckGetNodeConfig(runtime, 0, "", "", "type1", config1);
+ config1.MutableLogConfig()->SetBackendFileName("file4");
+ CheckGetNodeConfig(runtime, 0, "", "tenant1", "", config1);
+ config1.MutableLogConfig()->SetBackendFileName("file5");
+ CheckGetNodeConfig(runtime, 0, "", "tenant1", "type1", config1);
+ config1.MutableLogConfig()->SetBackendFileName("file6");
+ CheckGetNodeConfig(runtime, 0, "host1", "tenant1", "type1", config1);
+ config1.MutableLogConfig()->SetBackendFileName("file7");
+ CheckGetNodeConfig(runtime, 1, "host1", "tenant1", "type1", config1);
+ config1.MutableLogConfig()->ClearClusterName();
+ CheckGetNodeConfig(runtime, 1, "host2", "tenant1", "type1", config1);
+ config1.MutableLogConfig()->ClearBackendFileName();
+ CheckGetNodeConfig(runtime, 0, "host2", "tenant1", "type1", config1);
+ config1.MutableLogConfig()->SetClusterName("cluster1");
+ config1.MutableLogConfig()->SetBackendFileName("file2");
+ config1.MutableLogConfig()->AddEntry()->SetLevel(1);
+ config1.MutableLogConfig()->AddEntry()->SetLevel(2);
+ CheckGetNodeConfig(runtime, 0, "", "tenant2", "", config1);
+ config1.MutableLogConfig()->SetBackendFileName("file3");
+ config1.MutableLogConfig()->ClearEntry();
+ config1.MutableLogConfig()->AddEntry()->SetLevel(3);
+ CheckGetNodeConfig(runtime, 0, "", "tenant2", "type1", config1);
+
+ config1.ClearTenantPoolConfig();
+ CheckGetNodeConfig(runtime, 0, "", "tenant2", "type1", config1,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+ }
+
Y_UNIT_TEST(TestAutoOrder) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
- ITEM_DOMAIN_LOG_1.SetOrder(0);
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
+ ITEM_DOMAIN_LOG_1.SetOrder(0);
auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1);
- ITEM_DOMAIN_LOG_1.SetOrder(10);
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1);
-
- ITEM_DOMAIN_LOG_2.SetOrder(0);
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1);
+ ITEM_DOMAIN_LOG_1.SetOrder(10);
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1);
+
+ ITEM_DOMAIN_LOG_2.SetOrder(0);
auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_2));
- AssignIds(id2, ITEM_DOMAIN_LOG_2);
- ITEM_DOMAIN_LOG_2.SetOrder(20);
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
-
- ITEM_DOMAIN_LOG_1.SetOrder(0);
+ MakeAddAction(ITEM_DOMAIN_LOG_2));
+ AssignIds(id2, ITEM_DOMAIN_LOG_2);
+ ITEM_DOMAIN_LOG_2.SetOrder(20);
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+
+ ITEM_DOMAIN_LOG_1.SetOrder(0);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_LOG_1));
- ITEM_DOMAIN_LOG_1.SetOrder(30);
- IncGeneration(ITEM_DOMAIN_LOG_1);
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
-
- ITEM_DOMAIN_LOG_1.SetOrder(0);
- ITEM_DOMAIN_LOG_2.SetOrder(0);
+ MakeModifyAction(ITEM_DOMAIN_LOG_1));
+ ITEM_DOMAIN_LOG_1.SetOrder(30);
+ IncGeneration(ITEM_DOMAIN_LOG_1);
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+
+ ITEM_DOMAIN_LOG_1.SetOrder(0);
+ ITEM_DOMAIN_LOG_2.SetOrder(0);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_LOG_1), MakeModifyAction(ITEM_DOMAIN_LOG_2));
- ITEM_DOMAIN_LOG_1.SetOrder(10);
- ITEM_DOMAIN_LOG_2.SetOrder(20);
- IncGeneration(ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
-
- ITEM_DOMAIN_LOG_2.SetOrder(0);
+ MakeModifyAction(ITEM_DOMAIN_LOG_1), MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ ITEM_DOMAIN_LOG_1.SetOrder(10);
+ ITEM_DOMAIN_LOG_2.SetOrder(20);
+ IncGeneration(ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+
+ ITEM_DOMAIN_LOG_2.SetOrder(0);
CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_DOMAIN_LOG_1), MakeModifyAction(ITEM_DOMAIN_LOG_2));
- ITEM_DOMAIN_LOG_2.SetOrder(10);
- IncGeneration(ITEM_DOMAIN_LOG_2);
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_2);
-
- ITEM_DOMAIN_LOG_1.SetOrder(0);
- ITEM_DOMAIN_LOG_1.ClearId();
- ITEM_DOMAIN_LOG_2.SetOrder(0);
+ MakeRemoveAction(ITEM_DOMAIN_LOG_1), MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ ITEM_DOMAIN_LOG_2.SetOrder(10);
+ IncGeneration(ITEM_DOMAIN_LOG_2);
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_2);
+
+ ITEM_DOMAIN_LOG_1.SetOrder(0);
+ ITEM_DOMAIN_LOG_1.ClearId();
+ ITEM_DOMAIN_LOG_2.SetOrder(0);
auto id3 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1), MakeModifyAction(ITEM_DOMAIN_LOG_2));
- AssignIds(id3, ITEM_DOMAIN_LOG_1);
- ITEM_DOMAIN_LOG_1.SetOrder(10);
- ITEM_DOMAIN_LOG_2.SetOrder(20);
- IncGeneration(ITEM_DOMAIN_LOG_2);
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
- }
-
+ MakeAddAction(ITEM_DOMAIN_LOG_1), MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ AssignIds(id3, ITEM_DOMAIN_LOG_1);
+ ITEM_DOMAIN_LOG_1.SetOrder(10);
+ ITEM_DOMAIN_LOG_2.SetOrder(20);
+ IncGeneration(ITEM_DOMAIN_LOG_2);
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+ }
+
Y_UNIT_TEST(TestAutoKind) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
- ITEM_DOMAIN_LOG_1.ClearKind();
- ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig();
- ITEM_DOMAIN_TENANT_POOL_1.ClearKind();
- ITEM_DOMAIN_TENANT_POOL_1.MutableConfig()->MutableTenantPoolConfig();
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
+ ITEM_DOMAIN_LOG_1.ClearKind();
+ ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig();
+ ITEM_DOMAIN_TENANT_POOL_1.ClearKind();
+ ITEM_DOMAIN_TENANT_POOL_1.MutableConfig()->MutableTenantPoolConfig();
auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1), MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
- ITEM_DOMAIN_LOG_1.SetKind(NKikimrConsole::TConfigItem::LogConfigItem);
- ITEM_DOMAIN_TENANT_POOL_1.SetKind(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
-
- // Cannot determine kind.
- ITEM_DOMAIN_LOG_2.ClearKind();
- ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig();
- ITEM_DOMAIN_LOG_2.MutableConfig()->MutableTenantPoolConfig();
+ MakeAddAction(ITEM_DOMAIN_LOG_1), MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
+ ITEM_DOMAIN_LOG_1.SetKind(NKikimrConsole::TConfigItem::LogConfigItem);
+ ITEM_DOMAIN_TENANT_POOL_1.SetKind(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
+
+ // Cannot determine kind.
+ ITEM_DOMAIN_LOG_2.ClearKind();
+ ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig();
+ ITEM_DOMAIN_LOG_2.MutableConfig()->MutableTenantPoolConfig();
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_DOMAIN_LOG_2));
- }
-
+ MakeAddAction(ITEM_DOMAIN_LOG_2));
+ }
+
Y_UNIT_TEST(TestAutoSplit) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
- ITEM_DOMAIN_LOG_1.ClearKind();
- ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig();
- ITEM_DOMAIN_LOG_1.MutableConfig()->MutableTenantPoolConfig();
- ITEM_DOMAIN_LOG_1.SetCookie("cookie3");
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
+ ITEM_DOMAIN_LOG_1.ClearKind();
+ ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig();
+ ITEM_DOMAIN_LOG_1.MutableConfig()->MutableTenantPoolConfig();
+ ITEM_DOMAIN_LOG_1.SetCookie("cookie3");
auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1, true));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
- ITEM_DOMAIN_LOG_1.SetKind(NKikimrConsole::TConfigItem::LogConfigItem);
- ITEM_DOMAIN_LOG_1.MutableConfig()->ClearTenantPoolConfig();
- ITEM_DOMAIN_TENANT_POOL_1.MutableConfig()->MutableTenantPoolConfig();
- ITEM_DOMAIN_TENANT_POOL_1.SetCookie(ITEM_DOMAIN_LOG_1.GetCookie());
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
-
- ITEM_NODE12_LOG_1.ClearKind();
- ITEM_NODE12_LOG_1.MutableConfig()->MutableLogConfig();
+ MakeAddAction(ITEM_DOMAIN_LOG_1, true));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
+ ITEM_DOMAIN_LOG_1.SetKind(NKikimrConsole::TConfigItem::LogConfigItem);
+ ITEM_DOMAIN_LOG_1.MutableConfig()->ClearTenantPoolConfig();
+ ITEM_DOMAIN_TENANT_POOL_1.MutableConfig()->MutableTenantPoolConfig();
+ ITEM_DOMAIN_TENANT_POOL_1.SetCookie(ITEM_DOMAIN_LOG_1.GetCookie());
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
+
+ ITEM_NODE12_LOG_1.ClearKind();
+ ITEM_NODE12_LOG_1.MutableConfig()->MutableLogConfig();
auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_NODE12_LOG_1, true));
- AssignIds(id2, ITEM_NODE12_LOG_1);
- ITEM_NODE12_LOG_1.SetKind(NKikimrConsole::TConfigItem::LogConfigItem);
- CheckGetItems(runtime, TVector<ui32>(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_TENANT_POOL_1,
- ITEM_NODE12_LOG_1);
-
- // Cannot split empty config.
- ITEM_DOMAIN_LOG_2.ClearKind();
- ITEM_DOMAIN_LOG_2.ClearConfig();
+ MakeAddAction(ITEM_NODE12_LOG_1, true));
+ AssignIds(id2, ITEM_NODE12_LOG_1);
+ ITEM_NODE12_LOG_1.SetKind(NKikimrConsole::TConfigItem::LogConfigItem);
+ CheckGetItems(runtime, TVector<ui32>(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_TENANT_POOL_1,
+ ITEM_NODE12_LOG_1);
+
+ // Cannot split empty config.
+ ITEM_DOMAIN_LOG_2.ClearKind();
+ ITEM_DOMAIN_LOG_2.ClearConfig();
+ CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
+ MakeAddAction(ITEM_DOMAIN_LOG_2, true));
+ }
+
+ Y_UNIT_TEST(TestAllowedScopes) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
+ NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()->Clear();
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddDisallowedDomainUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+
+ CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
+ MakeAddAction(ITEM_DOMAIN_LOG_1, true));
CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_DOMAIN_LOG_2, true));
- }
-
- Y_UNIT_TEST(TestAllowedScopes) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
- NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()->Clear();
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddDisallowedDomainUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
-
- CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_DOMAIN_LOG_1, true));
- CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_NODE12_LOG_1, true));
- CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_HOST12_LOG_1, true));
- CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_TENANT1_LOG_1, true));
- CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_TYPE1_LOG_1, true));
-
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddAllowedNodeIdUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddAllowedHostUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddAllowedTenantUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddAllowedNodeTypeUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->ClearDisallowedDomainUsageScopeKinds();
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
-
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1, true),
- MakeAddAction(ITEM_NODE12_LOG_1, true),
- MakeAddAction(ITEM_HOST12_LOG_1, true),
- MakeAddAction(ITEM_TENANT1_LOG_1, true),
- MakeAddAction(ITEM_TYPE1_LOG_1, true));
-
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->ClearAllowedNodeIdUsageScopeKinds();
- CheckSetConfig(runtime, config, Ydb::StatusIds::BAD_REQUEST);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddAllowedNodeIdUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->ClearAllowedHostUsageScopeKinds();
- CheckSetConfig(runtime, config, Ydb::StatusIds::BAD_REQUEST);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddAllowedHostUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->ClearAllowedTenantUsageScopeKinds();
- CheckSetConfig(runtime, config, Ydb::StatusIds::BAD_REQUEST);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddAllowedTenantUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->ClearAllowedNodeTypeUsageScopeKinds();
- CheckSetConfig(runtime, config, Ydb::StatusIds::BAD_REQUEST);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddAllowedNodeTypeUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddDisallowedDomainUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- CheckSetConfig(runtime, config, Ydb::StatusIds::BAD_REQUEST);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->ClearDisallowedDomainUsageScopeKinds();
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
- }
-
- Y_UNIT_TEST(TestValidation) {
- TValidatorsRegistry::DropInstance();
- RegisterValidator(new TTestValidator(3));
-
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_NODE12_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_HOST12_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_TENANT1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_TENANT1_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
-
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1, true),
- MakeAddAction(ITEM_NODE12_LOG_1, true),
- MakeAddAction(ITEM_HOST12_LOG_1, true),
- MakeAddAction(ITEM_TENANT1_LOG_1, true),
- MakeAddAction(ITEM_TYPE1_LOG_1, true));
-
- // OK configs.
- CheckGetNodeConfig(runtime, 0, "", "tenant1", "type1", Ydb::StatusIds::SUCCESS);
- CheckGetNodeConfig(runtime, 1, "host1", "tenant2", "type2", Ydb::StatusIds::SUCCESS);
- CheckGetNodeConfig(runtime, 3, "host1", "tenant1", "type2", Ydb::StatusIds::SUCCESS);
- CheckGetNodeConfig(runtime, 1, "host3", "tenant2", "type1", Ydb::StatusIds::SUCCESS);
- // Bad configs.
- CheckGetNodeConfig(runtime, 1, "host1", "tenant1", "type2", Ydb::StatusIds::PRECONDITION_FAILED);
- CheckGetNodeConfig(runtime, 1, "host1", "tenant2", "type1", Ydb::StatusIds::PRECONDITION_FAILED);
- CheckGetNodeConfig(runtime, 3, "host2", "tenant1", "type1", Ydb::StatusIds::PRECONDITION_FAILED);
-
- // Validator should fail for <tenant1, type1> combination.
- CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1, true));
-
- // Disable validation for types and try again.
- NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
- config.MutableConfigsConfig()->MutableValidationOptions()
- ->SetValidationLevel(NKikimrConsole::VALIDATE_TENANTS);
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1, true));
-
- // Validator should fail for tenant1.
- CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeAddAction(ITEM_DOMAIN_LOG_2, true));
-
- // Disable validation for tenants and try again.
- config.MutableConfigsConfig()->MutableValidationOptions()
- ->SetValidationLevel(NKikimrConsole::VALIDATE_DOMAIN);
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
- auto ids = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_2, true));
- AssignIds(ids, ITEM_DOMAIN_LOG_2);
-
- // Validator should fail for domain.
- ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->AddEntry();
- CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
-
- // Disable validation and try again.
- config.MutableConfigsConfig()->MutableValidationOptions()
- ->SetValidationLevel(NKikimrConsole::VALIDATE_NONE);
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
-
- // Configs are still bad.
- CheckGetNodeConfig(runtime, 0, "", "", "", Ydb::StatusIds::PRECONDITION_FAILED);
- CheckGetNodeConfig(runtime, 1, "host1", "tenant1", "type1", Ydb::StatusIds::PRECONDITION_FAILED);
-
- // Disable node configs check and get configs.
- config.MutableConfigsConfig()->MutableValidationOptions()
- ->SetEnableValidationOnNodeConfigRequest(false);
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
- CheckGetNodeConfig(runtime, 0, "", "", "", Ydb::StatusIds::SUCCESS);
- CheckGetNodeConfig(runtime, 1, "host1", "tenant1", "type1", Ydb::StatusIds::SUCCESS);
- }
-
- Y_UNIT_TEST(TestCheckConfigUpdates)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- TAutoPtr<IEventHandle> handle;
-
- auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_NODE12_LOG_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_NODE12_LOG_1);
-
- CheckCheckConfigUpdates(runtime,
- { },
- { std::make_pair(ITEM_DOMAIN_LOG_1.GetId().GetId(), ITEM_DOMAIN_LOG_1.GetId().GetGeneration()),
- std::make_pair(ITEM_DOMAIN_LOG_2.GetId().GetId(), ITEM_DOMAIN_LOG_2.GetId().GetGeneration()),
- std::make_pair(ITEM_NODE12_LOG_1.GetId().GetId(), ITEM_NODE12_LOG_1.GetId().GetGeneration()) },
- { },
- { });
-
- ITEM_DOMAIN_LOG_2.SetOrder(0);
- auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_NODE34_LOG_1),
- MakeModifyAction(ITEM_DOMAIN_LOG_2),
- MakeRemoveAction(ITEM_NODE12_LOG_1));
- AssignIds(id2, ITEM_NODE34_LOG_1);
-
- CheckCheckConfigUpdates(runtime,
- { ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1 },
- { std::make_pair(ITEM_NODE34_LOG_1.GetId().GetId(), ITEM_NODE34_LOG_1.GetId().GetGeneration()) },
- { std::make_pair(ITEM_NODE12_LOG_1.GetId().GetId(), ITEM_NODE12_LOG_1.GetId().GetGeneration()) },
- { std::make_pair(ITEM_DOMAIN_LOG_2.GetId().GetId(), ITEM_DOMAIN_LOG_2.GetId().GetGeneration() + 1) });
- }
-
- Y_UNIT_TEST(TestManageValidators)
- {
- TValidatorsRegistry::DropInstance();
- RegisterValidator(new TTestValidator(1, "name1", {1, 2, 3}));
- RegisterValidator(new TTestValidator(1, "name2", {4, 5, 6}));
-
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
- { "name2", "name2 configs validator", {4, 5, 6}, true } });
- CheckDisableValidator(runtime, "name1", Ydb::StatusIds::SUCCESS);
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
- { "name2", "name2 configs validator", {4, 5, 6}, true } });
- CheckDisableValidator(runtime, "name1", Ydb::StatusIds::SUCCESS);
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
- { "name2", "name2 configs validator", {4, 5, 6}, true } });
- CheckDisableValidator(runtime, "name2", Ydb::StatusIds::SUCCESS);
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
- { "name2", "name2 configs validator", {4, 5, 6}, false } });
- CheckEnableValidator(runtime, "name1", Ydb::StatusIds::SUCCESS);
- CheckEnableValidator(runtime, "name2", Ydb::StatusIds::SUCCESS);
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
- { "name2", "name2 configs validator", {4, 5, 6}, true } });
-
- CheckEnableValidator(runtime, "name3", Ydb::StatusIds::NOT_FOUND);
- CheckDisableValidator(runtime, "name3", Ydb::StatusIds::NOT_FOUND);
-
- RestartConsole(runtime);
-
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
- { "name2", "name2 configs validator", {4, 5, 6}, true } });
-
- auto registry = TValidatorsRegistry::Instance();
- registry->DisableValidators();
-
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
- { "name2", "name2 configs validator", {4, 5, 6}, false } });
-
- RestartConsole(runtime);
-
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
- { "name2", "name2 configs validator", {4, 5, 6}, true } });
-
- CheckDisableValidator(runtime, "name1", Ydb::StatusIds::SUCCESS);
- CheckDisableValidator(runtime, "name2", Ydb::StatusIds::SUCCESS);
-
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
- { "name2", "name2 configs validator", {4, 5, 6}, false } });
-
- registry->EnableValidators();
-
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
- { "name2", "name2 configs validator", {4, 5, 6}, true } });
-
- RestartConsole(runtime);
-
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
- { "name2", "name2 configs validator", {4, 5, 6}, false } });
-
- CheckEnableValidator(runtime, "name1", Ydb::StatusIds::SUCCESS);
-
- registry->DisableValidator("name1");
- registry->EnableValidator("name2");
-
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
- { "name2", "name2 configs validator", {4, 5, 6}, true } });
-
- RestartConsole(runtime);
-
- CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
- { "name2", "name2 configs validator", {4, 5, 6}, false } });
- }
-
- Y_UNIT_TEST(TestDryRun)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
- auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS, true, false,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_NODE12_LOG_1));
- UNIT_ASSERT(id1.empty());
-
- CheckCheckConfigUpdates(runtime,
- { }, { }, { }, { });
-
- auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_NODE12_LOG_1));
- AssignIds(id2, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_NODE12_LOG_1);
-
- ITEM_DOMAIN_LOG_2.SetOrder(0);
- auto id3 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS, true, false,
- MakeAddAction(ITEM_NODE34_LOG_1),
- MakeModifyAction(ITEM_DOMAIN_LOG_2),
- MakeRemoveAction(ITEM_NODE12_LOG_1));
- UNIT_ASSERT(id3.empty());
-
- CheckCheckConfigUpdates(runtime,
- { ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1 },
- { }, { }, { });
- }
-
- Y_UNIT_TEST(TestAffectedConfigs)
- {
+ MakeAddAction(ITEM_NODE12_LOG_1, true));
+ CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
+ MakeAddAction(ITEM_HOST12_LOG_1, true));
+ CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
+ MakeAddAction(ITEM_TENANT1_LOG_1, true));
+ CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
+ MakeAddAction(ITEM_TYPE1_LOG_1, true));
+
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddAllowedNodeIdUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddAllowedHostUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddAllowedTenantUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddAllowedNodeTypeUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->ClearDisallowedDomainUsageScopeKinds();
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1, true),
+ MakeAddAction(ITEM_NODE12_LOG_1, true),
+ MakeAddAction(ITEM_HOST12_LOG_1, true),
+ MakeAddAction(ITEM_TENANT1_LOG_1, true),
+ MakeAddAction(ITEM_TYPE1_LOG_1, true));
+
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->ClearAllowedNodeIdUsageScopeKinds();
+ CheckSetConfig(runtime, config, Ydb::StatusIds::BAD_REQUEST);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddAllowedNodeIdUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->ClearAllowedHostUsageScopeKinds();
+ CheckSetConfig(runtime, config, Ydb::StatusIds::BAD_REQUEST);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddAllowedHostUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->ClearAllowedTenantUsageScopeKinds();
+ CheckSetConfig(runtime, config, Ydb::StatusIds::BAD_REQUEST);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddAllowedTenantUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->ClearAllowedNodeTypeUsageScopeKinds();
+ CheckSetConfig(runtime, config, Ydb::StatusIds::BAD_REQUEST);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddAllowedNodeTypeUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddDisallowedDomainUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ CheckSetConfig(runtime, config, Ydb::StatusIds::BAD_REQUEST);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->ClearDisallowedDomainUsageScopeKinds();
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+ }
+
+ Y_UNIT_TEST(TestValidation) {
+ TValidatorsRegistry::DropInstance();
+ RegisterValidator(new TTestValidator(3));
+
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_NODE12_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_HOST12_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_TENANT1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_TENANT1_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1, true),
+ MakeAddAction(ITEM_NODE12_LOG_1, true),
+ MakeAddAction(ITEM_HOST12_LOG_1, true),
+ MakeAddAction(ITEM_TENANT1_LOG_1, true),
+ MakeAddAction(ITEM_TYPE1_LOG_1, true));
+
+ // OK configs.
+ CheckGetNodeConfig(runtime, 0, "", "tenant1", "type1", Ydb::StatusIds::SUCCESS);
+ CheckGetNodeConfig(runtime, 1, "host1", "tenant2", "type2", Ydb::StatusIds::SUCCESS);
+ CheckGetNodeConfig(runtime, 3, "host1", "tenant1", "type2", Ydb::StatusIds::SUCCESS);
+ CheckGetNodeConfig(runtime, 1, "host3", "tenant2", "type1", Ydb::StatusIds::SUCCESS);
+ // Bad configs.
+ CheckGetNodeConfig(runtime, 1, "host1", "tenant1", "type2", Ydb::StatusIds::PRECONDITION_FAILED);
+ CheckGetNodeConfig(runtime, 1, "host1", "tenant2", "type1", Ydb::StatusIds::PRECONDITION_FAILED);
+ CheckGetNodeConfig(runtime, 3, "host2", "tenant1", "type1", Ydb::StatusIds::PRECONDITION_FAILED);
+
+ // Validator should fail for <tenant1, type1> combination.
+ CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
+ MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1, true));
+
+ // Disable validation for types and try again.
+ NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
+ config.MutableConfigsConfig()->MutableValidationOptions()
+ ->SetValidationLevel(NKikimrConsole::VALIDATE_TENANTS);
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_TENANT1_TYPE1_LOG_1, true));
+
+ // Validator should fail for tenant1.
+ CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
+ MakeAddAction(ITEM_DOMAIN_LOG_2, true));
+
+ // Disable validation for tenants and try again.
+ config.MutableConfigsConfig()->MutableValidationOptions()
+ ->SetValidationLevel(NKikimrConsole::VALIDATE_DOMAIN);
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+ auto ids = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_2, true));
+ AssignIds(ids, ITEM_DOMAIN_LOG_2);
+
+ // Validator should fail for domain.
+ ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->AddEntry();
+ CheckConfigure(runtime, Ydb::StatusIds::BAD_REQUEST,
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+
+ // Disable validation and try again.
+ config.MutableConfigsConfig()->MutableValidationOptions()
+ ->SetValidationLevel(NKikimrConsole::VALIDATE_NONE);
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+
+ // Configs are still bad.
+ CheckGetNodeConfig(runtime, 0, "", "", "", Ydb::StatusIds::PRECONDITION_FAILED);
+ CheckGetNodeConfig(runtime, 1, "host1", "tenant1", "type1", Ydb::StatusIds::PRECONDITION_FAILED);
+
+ // Disable node configs check and get configs.
+ config.MutableConfigsConfig()->MutableValidationOptions()
+ ->SetEnableValidationOnNodeConfigRequest(false);
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+ CheckGetNodeConfig(runtime, 0, "", "", "", Ydb::StatusIds::SUCCESS);
+ CheckGetNodeConfig(runtime, 1, "host1", "tenant1", "type1", Ydb::StatusIds::SUCCESS);
+ }
+
+ Y_UNIT_TEST(TestCheckConfigUpdates)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ TAutoPtr<IEventHandle> handle;
+
+ auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_NODE12_LOG_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_NODE12_LOG_1);
+
+ CheckCheckConfigUpdates(runtime,
+ { },
+ { std::make_pair(ITEM_DOMAIN_LOG_1.GetId().GetId(), ITEM_DOMAIN_LOG_1.GetId().GetGeneration()),
+ std::make_pair(ITEM_DOMAIN_LOG_2.GetId().GetId(), ITEM_DOMAIN_LOG_2.GetId().GetGeneration()),
+ std::make_pair(ITEM_NODE12_LOG_1.GetId().GetId(), ITEM_NODE12_LOG_1.GetId().GetGeneration()) },
+ { },
+ { });
+
+ ITEM_DOMAIN_LOG_2.SetOrder(0);
+ auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_NODE34_LOG_1),
+ MakeModifyAction(ITEM_DOMAIN_LOG_2),
+ MakeRemoveAction(ITEM_NODE12_LOG_1));
+ AssignIds(id2, ITEM_NODE34_LOG_1);
+
+ CheckCheckConfigUpdates(runtime,
+ { ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1 },
+ { std::make_pair(ITEM_NODE34_LOG_1.GetId().GetId(), ITEM_NODE34_LOG_1.GetId().GetGeneration()) },
+ { std::make_pair(ITEM_NODE12_LOG_1.GetId().GetId(), ITEM_NODE12_LOG_1.GetId().GetGeneration()) },
+ { std::make_pair(ITEM_DOMAIN_LOG_2.GetId().GetId(), ITEM_DOMAIN_LOG_2.GetId().GetGeneration() + 1) });
+ }
+
+ Y_UNIT_TEST(TestManageValidators)
+ {
+ TValidatorsRegistry::DropInstance();
+ RegisterValidator(new TTestValidator(1, "name1", {1, 2, 3}));
+ RegisterValidator(new TTestValidator(1, "name2", {4, 5, 6}));
+
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
+ { "name2", "name2 configs validator", {4, 5, 6}, true } });
+ CheckDisableValidator(runtime, "name1", Ydb::StatusIds::SUCCESS);
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
+ { "name2", "name2 configs validator", {4, 5, 6}, true } });
+ CheckDisableValidator(runtime, "name1", Ydb::StatusIds::SUCCESS);
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
+ { "name2", "name2 configs validator", {4, 5, 6}, true } });
+ CheckDisableValidator(runtime, "name2", Ydb::StatusIds::SUCCESS);
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
+ { "name2", "name2 configs validator", {4, 5, 6}, false } });
+ CheckEnableValidator(runtime, "name1", Ydb::StatusIds::SUCCESS);
+ CheckEnableValidator(runtime, "name2", Ydb::StatusIds::SUCCESS);
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
+ { "name2", "name2 configs validator", {4, 5, 6}, true } });
+
+ CheckEnableValidator(runtime, "name3", Ydb::StatusIds::NOT_FOUND);
+ CheckDisableValidator(runtime, "name3", Ydb::StatusIds::NOT_FOUND);
+
+ RestartConsole(runtime);
+
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
+ { "name2", "name2 configs validator", {4, 5, 6}, true } });
+
+ auto registry = TValidatorsRegistry::Instance();
+ registry->DisableValidators();
+
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
+ { "name2", "name2 configs validator", {4, 5, 6}, false } });
+
+ RestartConsole(runtime);
+
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
+ { "name2", "name2 configs validator", {4, 5, 6}, true } });
+
+ CheckDisableValidator(runtime, "name1", Ydb::StatusIds::SUCCESS);
+ CheckDisableValidator(runtime, "name2", Ydb::StatusIds::SUCCESS);
+
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
+ { "name2", "name2 configs validator", {4, 5, 6}, false } });
+
+ registry->EnableValidators();
+
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
+ { "name2", "name2 configs validator", {4, 5, 6}, true } });
+
+ RestartConsole(runtime);
+
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
+ { "name2", "name2 configs validator", {4, 5, 6}, false } });
+
+ CheckEnableValidator(runtime, "name1", Ydb::StatusIds::SUCCESS);
+
+ registry->DisableValidator("name1");
+ registry->EnableValidator("name2");
+
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, false },
+ { "name2", "name2 configs validator", {4, 5, 6}, true } });
+
+ RestartConsole(runtime);
+
+ CheckListValidators(runtime, { { "name1", "name1 configs validator", {1, 2, 3}, true },
+ { "name2", "name2 configs validator", {4, 5, 6}, false } });
+ }
+
+ Y_UNIT_TEST(TestDryRun)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
+ auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS, true, false,
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_NODE12_LOG_1));
+ UNIT_ASSERT(id1.empty());
+
+ CheckCheckConfigUpdates(runtime,
+ { }, { }, { }, { });
+
+ auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_NODE12_LOG_1));
+ AssignIds(id2, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_NODE12_LOG_1);
+
+ ITEM_DOMAIN_LOG_2.SetOrder(0);
+ auto id3 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS, true, false,
+ MakeAddAction(ITEM_NODE34_LOG_1),
+ MakeModifyAction(ITEM_DOMAIN_LOG_2),
+ MakeRemoveAction(ITEM_NODE12_LOG_1));
+ UNIT_ASSERT(id3.empty());
+
+ CheckCheckConfigUpdates(runtime,
+ { ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1 },
+ { }, { }, { });
+ }
+
+ Y_UNIT_TEST(TestAffectedConfigs)
+ {
TValidatorsRegistry::Instance()->DropInstance();
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
-
- ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_TENANT1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_TENANT2_TYPE2_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_NODE12_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
- ITEM_HOST12_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
-
- THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected1;
- affected1[TTenantAndNodeType("", "")] = std::make_pair(0ULL, 1ULL);
- affected1[TTenantAndNodeType("tenant1", "")] = std::make_pair(0ULL, 2ULL);
- affected1[TTenantAndNodeType("", "type1")] = std::make_pair(0ULL, 2ULL);
- affected1[TTenantAndNodeType("tenant1", "type1")] = std::make_pair(0ULL, 3ULL);
- affected1[TTenantAndNodeType("tenant2", "type2")] = std::make_pair(0ULL, 2ULL);
- auto id1 = CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
- affected1, false, true,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_TENANT1_LOG_1),
- MakeAddAction(ITEM_TYPE1_LOG_1),
- MakeAddAction(ITEM_TENANT2_TYPE2_LOG_1),
- MakeAddAction(ITEM_NODE12_LOG_1),
- MakeAddAction(ITEM_HOST12_LOG_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_TENANT1_LOG_1, ITEM_TYPE1_LOG_1,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_NODE12_LOG_1, ITEM_HOST12_LOG_1);
-
- THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected2;
- affected2[TTenantAndNodeType("", "")] = std::make_pair(1ULL, 0ULL);
- affected2[TTenantAndNodeType("tenant1", "")] = std::make_pair(2ULL, 1ULL);
- affected2[TTenantAndNodeType("", "type1")] = std::make_pair(2ULL, 1ULL);
- affected2[TTenantAndNodeType("tenant1", "type1")] = std::make_pair(3ULL, 2ULL);
- affected2[TTenantAndNodeType("tenant2", "type2")] = std::make_pair(2ULL, 1ULL);
- CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
- affected2, true, true,
- MakeRemoveAction(ITEM_DOMAIN_LOG_1));
-
- THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected3;
- affected3[TTenantAndNodeType("tenant1", "")] = std::make_pair(2ULL, 1ULL);
- affected3[TTenantAndNodeType("tenant1", "type1")] = std::make_pair(3ULL, 2ULL);
- CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
- affected3, true, true,
- MakeRemoveAction(ITEM_TENANT1_LOG_1));
-
- THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected4;
- affected4[TTenantAndNodeType("", "type1")] = std::make_pair(2ULL, 1ULL);
- affected4[TTenantAndNodeType("tenant1", "type1")] = std::make_pair(3ULL, 2ULL);
- CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
- affected4, true, true,
- MakeRemoveAction(ITEM_TYPE1_LOG_1));
-
- THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected5;
- affected5[TTenantAndNodeType("tenant2", "type2")] = std::make_pair(2ULL, 1ULL);
- CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
- affected5, true, true,
- MakeRemoveAction(ITEM_TENANT2_TYPE2_LOG_1));
-
- THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected6;
- CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
- affected6, true, true,
- MakeRemoveAction(ITEM_NODE12_LOG_1));
- CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
- affected6, true, true,
- MakeRemoveAction(ITEM_HOST12_LOG_1));
- }
-}
-
-namespace {
-
-class TConfigProxy : public TActor<TConfigProxy>, public TTabletExecutedFlat {
- void OnActivateExecutor(const TActorContext &ctx) override
- {
- Become(&TThis::StateWork);
- ctx.Send(Sink, new TEvents::TEvWakeup);
- }
-
- void OnDetach(const TActorContext &ctx) override
- {
- Die(ctx);
- }
-
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override
- {
- Die(ctx);
- }
-
- void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev, const TActorContext &ctx)
- {
- ctx.Send(ev->Forward(Sink));
- }
-
-public:
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+
+ ITEM_DOMAIN_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_TENANT1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_TENANT2_TYPE2_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_NODE12_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+ ITEM_HOST12_LOG_1.MutableConfig()->MutableLogConfig()->AddEntry();
+
+ THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected1;
+ affected1[TTenantAndNodeType("", "")] = std::make_pair(0ULL, 1ULL);
+ affected1[TTenantAndNodeType("tenant1", "")] = std::make_pair(0ULL, 2ULL);
+ affected1[TTenantAndNodeType("", "type1")] = std::make_pair(0ULL, 2ULL);
+ affected1[TTenantAndNodeType("tenant1", "type1")] = std::make_pair(0ULL, 3ULL);
+ affected1[TTenantAndNodeType("tenant2", "type2")] = std::make_pair(0ULL, 2ULL);
+ auto id1 = CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
+ affected1, false, true,
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_TENANT1_LOG_1),
+ MakeAddAction(ITEM_TYPE1_LOG_1),
+ MakeAddAction(ITEM_TENANT2_TYPE2_LOG_1),
+ MakeAddAction(ITEM_NODE12_LOG_1),
+ MakeAddAction(ITEM_HOST12_LOG_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_TENANT1_LOG_1, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_NODE12_LOG_1, ITEM_HOST12_LOG_1);
+
+ THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected2;
+ affected2[TTenantAndNodeType("", "")] = std::make_pair(1ULL, 0ULL);
+ affected2[TTenantAndNodeType("tenant1", "")] = std::make_pair(2ULL, 1ULL);
+ affected2[TTenantAndNodeType("", "type1")] = std::make_pair(2ULL, 1ULL);
+ affected2[TTenantAndNodeType("tenant1", "type1")] = std::make_pair(3ULL, 2ULL);
+ affected2[TTenantAndNodeType("tenant2", "type2")] = std::make_pair(2ULL, 1ULL);
+ CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
+ affected2, true, true,
+ MakeRemoveAction(ITEM_DOMAIN_LOG_1));
+
+ THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected3;
+ affected3[TTenantAndNodeType("tenant1", "")] = std::make_pair(2ULL, 1ULL);
+ affected3[TTenantAndNodeType("tenant1", "type1")] = std::make_pair(3ULL, 2ULL);
+ CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
+ affected3, true, true,
+ MakeRemoveAction(ITEM_TENANT1_LOG_1));
+
+ THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected4;
+ affected4[TTenantAndNodeType("", "type1")] = std::make_pair(2ULL, 1ULL);
+ affected4[TTenantAndNodeType("tenant1", "type1")] = std::make_pair(3ULL, 2ULL);
+ CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
+ affected4, true, true,
+ MakeRemoveAction(ITEM_TYPE1_LOG_1));
+
+ THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected5;
+ affected5[TTenantAndNodeType("tenant2", "type2")] = std::make_pair(2ULL, 1ULL);
+ CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
+ affected5, true, true,
+ MakeRemoveAction(ITEM_TENANT2_TYPE2_LOG_1));
+
+ THashMap<TTenantAndNodeType, std::pair<ui64, ui64>> affected6;
+ CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
+ affected6, true, true,
+ MakeRemoveAction(ITEM_NODE12_LOG_1));
+ CheckConfigureLogAffected(runtime, Ydb::StatusIds::SUCCESS,
+ affected6, true, true,
+ MakeRemoveAction(ITEM_HOST12_LOG_1));
+ }
+}
+
+namespace {
+
+class TConfigProxy : public TActor<TConfigProxy>, public TTabletExecutedFlat {
+ void OnActivateExecutor(const TActorContext &ctx) override
+ {
+ Become(&TThis::StateWork);
+ ctx.Send(Sink, new TEvents::TEvWakeup);
+ }
+
+ void OnDetach(const TActorContext &ctx) override
+ {
+ Die(ctx);
+ }
+
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override
+ {
+ Die(ctx);
+ }
+
+ void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev, const TActorContext &ctx)
+ {
+ ctx.Send(ev->Forward(Sink));
+ }
+
+public:
TConfigProxy(const TActorId &tablet, TTabletStorageInfo *info, TActorId sink)
- : TActor(&TThis::StateInit)
- , TTabletExecutedFlat(info, tablet, nullptr)
- , Sink(sink)
- {
- }
-
- STFUNC(StateInit)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
- default:
- StateInitImpl(ev, ctx);
- }
- }
-
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
- }
- }
-private:
+ : TActor(&TThis::StateInit)
+ , TTabletExecutedFlat(info, tablet, nullptr)
+ , Sink(sink)
+ {
+ }
+
+ STFUNC(StateInit)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
+ default:
+ StateInitImpl(ev, ctx);
+ }
+ }
+
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
+ }
+ }
+private:
TActorId Sink;
-};
-
-class TConfigProxyService : public TActorBootstrapped<TConfigProxyService> {
-public:
+};
+
+class TConfigProxyService : public TActorBootstrapped<TConfigProxyService> {
+public:
TConfigProxyService(TActorId sink)
- : Sink(sink)
- {
- }
-
- void Bootstrap(const TActorContext &/*ctx*/)
- {
- Become(&TConfigProxyService::StateWork);
- }
-
- void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev, const TActorContext &ctx)
- {
- ctx.Send(ev->Forward(Sink));
- }
-
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
- }
- }
-
-private:
+ : Sink(sink)
+ {
+ }
+
+ void Bootstrap(const TActorContext &/*ctx*/)
+ {
+ Become(&TConfigProxyService::StateWork);
+ }
+
+ void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev, const TActorContext &ctx)
+ {
+ ctx.Send(ev->Forward(Sink));
+ }
+
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
+ }
+ }
+
+private:
TActorId Sink;
-};
-
-const ui64 CONFIG_PROXY_TABLET_ID = 0x0000000000840103;
-
-void StartConfigProxy(TTenantTestRuntime &runtime)
-{
+};
+
+const ui64 CONFIG_PROXY_TABLET_ID = 0x0000000000840103;
+
+void StartConfigProxy(TTenantTestRuntime &runtime)
+{
auto info = CreateTestTabletInfo(CONFIG_PROXY_TABLET_ID, TTabletTypes::TX_DUMMY, TErasureType::ErasureNone);
TActorId actorId = CreateTestBootstrapper(runtime, info, [&runtime](const TActorId &tablet, TTabletStorageInfo *info) -> IActor* {
- return new TConfigProxy(tablet, info, runtime.Sender);
- });
- runtime.EnableScheduleForActor(actorId, true);
-
- auto aid = runtime.Register(new TConfigProxyService(runtime.Sender));
+ return new TConfigProxy(tablet, info, runtime.Sender);
+ });
+ runtime.EnableScheduleForActor(actorId, true);
+
+ auto aid = runtime.Register(new TConfigProxyService(runtime.Sender));
runtime.RegisterService(TActorId(runtime.GetNodeId(0), "configproxy"), aid, 0);
-
- TAutoPtr<IEventHandle> handle;
- runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
-}
-
-} // anonymous namespace
-
-Y_UNIT_TEST_SUITE(TConsoleConfigSubscriptionTests) {
- Y_UNIT_TEST(TestAddConfigSubscription) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- // OK subscription for tablet
- ui32 nodeId = runtime.GetNodeId(0);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+}
+
+} // anonymous namespace
+
+Y_UNIT_TEST_SUITE(TConsoleConfigSubscriptionTests) {
+ Y_UNIT_TEST(TestAddConfigSubscription) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ // OK subscription for tablet
+ ui32 nodeId = runtime.GetNodeId(0);
ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2, 3}});
- // OK subscription for service
+ // OK subscription for service
ui64 id2 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5, 6}});
-
- runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- runtime.DispatchEvents(options);
-
- // OK subscription for service
+
+ runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ runtime.DispatchEvents(options);
+
+ // OK subscription for service
ui64 id3 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 3, "host3", "tenant-3", "type3",
+ 3, "host3", "tenant-3", "type3",
0, TActorId(nodeId, "service"), {{1, 1, 2}});
-
+
CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id1,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2, 3}});
CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id2,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5, 6}});
CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id3,
- 3, "host3", "tenant-3", "type3",
+ 3, "host3", "tenant-3", "type3",
0, TActorId(nodeId, "service"), {{1, 2}});
-
- // non-zero subscription id
+
+ // non-zero subscription id
CheckAddConfigSubscription(runtime, Ydb::StatusIds::BAD_REQUEST,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2, 3}}, 1);
- // no subscriber
+ // no subscriber
CheckAddConfigSubscription(runtime, Ydb::StatusIds::BAD_REQUEST,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
0, TActorId(), {{1, 2, 3}});
- // wrong service id
+ // wrong service id
CheckAddConfigSubscription(runtime, Ydb::StatusIds::BAD_REQUEST,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
0, TActorId(1, 0, 0, 0), {{1, 2, 3}});
- // no kinds
+ // no kinds
CheckAddConfigSubscription(runtime, Ydb::StatusIds::BAD_REQUEST,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {});
- }
-
- Y_UNIT_TEST(TestRemoveConfigSubscription) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- // OK subscription for tablet
- ui32 nodeId = runtime.GetNodeId(0);
+ }
+
+ Y_UNIT_TEST(TestRemoveConfigSubscription) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ // OK subscription for tablet
+ ui32 nodeId = runtime.GetNodeId(0);
ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2, 3}});
- // OK subscription for tablet
+ // OK subscription for tablet
ui64 id2 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host1", "tenant-1", "type1",
+ 2, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2, 3}});
- // OK subscription for service
+ // OK subscription for service
ui64 id3 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5, 6}});
-
+
CheckRemoveConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id2);
CheckRemoveConfigSubscription(runtime, Ydb::StatusIds::NOT_FOUND, id2);
-
- runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- runtime.DispatchEvents(options);
-
+
+ runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ runtime.DispatchEvents(options);
+
CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id1,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2, 3}});
CheckGetConfigSubscription(runtime, Ydb::StatusIds::NOT_FOUND, id2);
CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id3,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5, 6}});
-
+
CheckRemoveConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id1);
CheckGetConfigSubscription(runtime, Ydb::StatusIds::NOT_FOUND, id1);
- }
-
- Y_UNIT_TEST(TestRemoveConfigSubscriptions) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- // OK subscription for tablet
- ui32 nodeId = runtime.GetNodeId(0);
+ }
+
+ Y_UNIT_TEST(TestRemoveConfigSubscriptions) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ // OK subscription for tablet
+ ui32 nodeId = runtime.GetNodeId(0);
ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2, 3}});
- // OK subscription for tablet
+ // OK subscription for tablet
ui64 id2 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host1", "tenant-1", "type1",
+ 2, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2, 3}});
- // OK subscription for service
+ // OK subscription for service
ui64 id3 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5, 6}});
- // OK subscription for service
+ // OK subscription for service
ui64 id4 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 3, "host2", "tenant-2", "type2",
+ 3, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5, 6}});
-
+
CheckRemoveConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
1, TActorId());
CheckRemoveConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
@@ -2569,962 +2569,962 @@ Y_UNIT_TEST_SUITE(TConsoleConfigSubscriptionTests) {
2, TActorId());
CheckRemoveConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
0, TActorId());
-
- runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- runtime.DispatchEvents(options);
-
+
+ runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ runtime.DispatchEvents(options);
+
CheckGetConfigSubscription(runtime, Ydb::StatusIds::NOT_FOUND, id1);
CheckGetConfigSubscription(runtime, Ydb::StatusIds::NOT_FOUND, id2);
CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id3,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5, 6}});
CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id4,
- 3, "host2", "tenant-2", "type2",
+ 3, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5, 6}});
-
+
CheckRemoveConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
0, TActorId(nodeId, "service"));
-
+
CheckGetConfigSubscription(runtime, Ydb::StatusIds::NOT_FOUND, id3);
CheckGetConfigSubscription(runtime, Ydb::StatusIds::NOT_FOUND, id4);
- }
-
- Y_UNIT_TEST(TestListConfigSubscriptions) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- // OK subscription for tablet
- ui32 nodeId = runtime.GetNodeId(0);
+ }
+
+ Y_UNIT_TEST(TestListConfigSubscriptions) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ // OK subscription for tablet
+ ui32 nodeId = runtime.GetNodeId(0);
ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2}});
- // OK subscription for tablet
+ // OK subscription for tablet
ui64 id2 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{3, 4}});
- // OK subscription for service
+ // OK subscription for service
ui64 id3 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5}});
- // OK subscription for service
+ // OK subscription for service
ui64 id4 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{6, 7}});
-
- // List 1 2
+
+ // List 1 2
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 1, TActorId(),
- id1, 1, "host1", "tenant-1", "type1",
+ id1, 1, "host1", "tenant-1", "type1",
1, TActorId(), TVector<ui32>({1, 2}),
- id2, 1, "host1", "tenant-1", "type1",
+ id2, 1, "host1", "tenant-1", "type1",
1, TActorId(), TVector<ui32>({3, 4}));
- // List 3 4
+ // List 3 4
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(nodeId, "service"),
- id3, 2, "host2", "tenant-2", "type2",
+ id3, 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), TVector<ui32>({4, 5}),
- id4, 2, "host2", "tenant-2", "type2",
+ id4, 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), TVector<ui32>({6, 7}));
- // List 1 2 3 4
+ // List 1 2 3 4
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(),
- id1, 1, "host1", "tenant-1", "type1",
+ id1, 1, "host1", "tenant-1", "type1",
1, TActorId(), TVector<ui32>({1, 2}),
- id2, 1, "host1", "tenant-1", "type1",
+ id2, 1, "host1", "tenant-1", "type1",
1, TActorId(), TVector<ui32>({3, 4}),
- id3, 2, "host2", "tenant-2", "type2",
+ id3, 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), TVector<ui32>({4, 5}),
- id4, 2, "host2", "tenant-2", "type2",
+ id4, 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), TVector<ui32>({6, 7}));
- // Empty list
+ // Empty list
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 2, TActorId());
- // Empty list
+ // Empty list
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(nodeId, "service1"));
- // Empty list
+ // Empty list
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(nodeId + 1, "service"));
-
- // Remove 1 2
+
+ // Remove 1 2
CheckRemoveConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
1, TActorId());
- // Remove 3
+ // Remove 3
CheckRemoveConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id3);
-
- // Empty list
+
+ // Empty list
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 1, TActorId());
- // List 4
+ // List 4
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(nodeId, "service"),
- id4, 2, "host2", "tenant-2", "type2",
+ id4, 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), TVector<ui32>({6, 7}));
- // List 4
+ // List 4
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(),
- id4, 2, "host2", "tenant-2", "type2",
+ id4, 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), TVector<ui32>({6, 7}));
- }
-
- Y_UNIT_TEST(TestReplaceConfigSubscriptions) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- ui32 nodeId = runtime.GetNodeId(0);
+ }
+
+ Y_UNIT_TEST(TestReplaceConfigSubscriptions) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ ui32 nodeId = runtime.GetNodeId(0);
ui64 id1 = CheckReplaceConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2, 3}});
ui64 id2 = CheckReplaceConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5, 6}});
-
+
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 1, TActorId(),
- id1, 1, "host1", "tenant-1", "type1",
+ id1, 1, "host1", "tenant-1", "type1",
1, TActorId(), TVector<ui32>({1, 2, 3}));
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(nodeId, "service"),
- id2, 2, "host2", "tenant-2", "type2",
+ id2, 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), TVector<ui32>({4, 5, 6}));
-
+
CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2}});
CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5}});
-
+
ui64 id5 = CheckReplaceConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2, 3}});
- UNIT_ASSERT_VALUES_EQUAL(id1, id5);
+ UNIT_ASSERT_VALUES_EQUAL(id1, id5);
ui64 id6 = CheckReplaceConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5, 6}});
- UNIT_ASSERT_VALUES_EQUAL(id2, id6);
-
- runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- runtime.DispatchEvents(options);
-
+ UNIT_ASSERT_VALUES_EQUAL(id2, id6);
+
+ runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ runtime.DispatchEvents(options);
+
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 1, TActorId(),
- id1, 1, "host1", "tenant-1", "type1",
+ id1, 1, "host1", "tenant-1", "type1",
1, TActorId(), TVector<ui32>({1, 2, 3}));
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(nodeId, "service"),
- id2, 2, "host2", "tenant-2", "type2",
+ id2, 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), TVector<ui32>({4, 5, 6}));
-
+
ui64 id7 = CheckReplaceConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
+ 1, "host1", "tenant-1", "type1",
1, TActorId(), {{1, 2}});
- UNIT_ASSERT(id1 != id7);
+ UNIT_ASSERT(id1 != id7);
ui64 id8 = CheckReplaceConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host2", "tenant-2", "type2",
+ 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), {{4, 5}});
- UNIT_ASSERT(id2 != id8);
-
+ UNIT_ASSERT(id2 != id8);
+
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 1, TActorId(),
- id7, 1, "host1", "tenant-1", "type1",
+ id7, 1, "host1", "tenant-1", "type1",
1, TActorId(), TVector<ui32>({1, 2}));
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(nodeId, "service"),
- id8, 2, "host2", "tenant-2", "type2",
+ id8, 2, "host2", "tenant-2", "type2",
0, TActorId(nodeId, "service"), TVector<ui32>({4, 5}));
- }
-
- void TestNotificationForNewSubscriptionBase(bool useService)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ }
+
+ void TestNotificationForNewSubscriptionBase(bool useService)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
-
- if (useService)
+ ui64 tabletId = 0;
+
+ if (useService)
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- else
- tabletId = CONFIG_PROXY_TABLET_ID;
-
+ else
+ tabletId = CONFIG_PROXY_TABLET_ID;
+
auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_2));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
-
- // New subscription should cause notification.
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_2));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+
+ // New subscription should cause notification.
CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant1", "type1",
- tabletId, serviceId,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply1->Record.GetConfigId(), ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
- }
-
- Y_UNIT_TEST(TestNotificationForNewSubscription) {
- TestNotificationForNewSubscriptionBase(false);
- TestNotificationForNewSubscriptionBase(true);
- }
-
- void TestNotificationForNewConfigItemBase(bool useService)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ 1, "host1", "tenant1", "type1",
+ tabletId, serviceId,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply1->Record.GetConfigId(), ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+ }
+
+ Y_UNIT_TEST(TestNotificationForNewSubscription) {
+ TestNotificationForNewSubscriptionBase(false);
+ TestNotificationForNewSubscriptionBase(true);
+ }
+
+ void TestNotificationForNewConfigItemBase(bool useService)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
-
- if (useService)
+ ui64 tabletId = 0;
+
+ if (useService)
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- else
- tabletId = CONFIG_PROXY_TABLET_ID;
-
- auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1);
-
- // New subscription should cause notification.
- CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant1", "type1",
- tabletId, serviceId,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply1->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
- AcceptConfig(runtime, handle);
-
- // New items with another kind/node/host/tenant/type shouldn't cause notification.
- auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1),
- MakeAddAction(ITEM_NODE34_LOG_1),
- MakeAddAction(ITEM_HOST23_LOG_1),
- MakeAddAction(ITEM_TENANT2_LOG_1),
- MakeAddAction(ITEM_TYPE2_LOG_1));
- AssignIds(id2, ITEM_DOMAIN_TENANT_POOL_1, ITEM_NODE34_LOG_1, ITEM_HOST23_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE2_LOG_1);
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(1));
- UNIT_ASSERT(!reply2);
-
- // Add item with domain scope -> notification.
- auto id3 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_2));
- AssignIds(id3, ITEM_DOMAIN_LOG_2);
- auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply3->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
- AcceptConfig(runtime, handle);
-
- // Add item with matching node scope -> notification.
- auto id4 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_NODE12_LOG_1));
- AssignIds(id4, ITEM_NODE12_LOG_1);
- auto reply4 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply4->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Add item with matching host scope -> notification.
- ITEM_HOST12_LOG_1.SetOrder(0);
- auto id5 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_HOST12_LOG_1));
- AssignIds(id5, ITEM_HOST12_LOG_1);
- auto reply5 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply5->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_HOST12_LOG_1,
- ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Add item with matching tenant scope -> notification.
- auto id6 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_TENANT1_LOG_1));
- AssignIds(id6, ITEM_TENANT1_LOG_1);
- auto reply6 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply6->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TENANT1_LOG_1,
- ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Add item with matching node type scope -> notification.
- auto id7 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_TYPE1_LOG_1));
- AssignIds(id7, ITEM_TYPE1_LOG_1);
- auto reply7 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply7->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
- }
-
- Y_UNIT_TEST(TestNotificationForNewConfigItem) {
- TestNotificationForNewConfigItemBase(false);
- TestNotificationForNewConfigItemBase(true);
- }
-
- void TestNotificationForModifiedConfigItemBase(bool useService)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ else
+ tabletId = CONFIG_PROXY_TABLET_ID;
+
+ auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1);
+
+ // New subscription should cause notification.
+ CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant1", "type1",
+ tabletId, serviceId,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply1->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // New items with another kind/node/host/tenant/type shouldn't cause notification.
+ auto id2 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1),
+ MakeAddAction(ITEM_NODE34_LOG_1),
+ MakeAddAction(ITEM_HOST23_LOG_1),
+ MakeAddAction(ITEM_TENANT2_LOG_1),
+ MakeAddAction(ITEM_TYPE2_LOG_1));
+ AssignIds(id2, ITEM_DOMAIN_TENANT_POOL_1, ITEM_NODE34_LOG_1, ITEM_HOST23_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE2_LOG_1);
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(1));
+ UNIT_ASSERT(!reply2);
+
+ // Add item with domain scope -> notification.
+ auto id3 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_2));
+ AssignIds(id3, ITEM_DOMAIN_LOG_2);
+ auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply3->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2);
+ AcceptConfig(runtime, handle);
+
+ // Add item with matching node scope -> notification.
+ auto id4 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_NODE12_LOG_1));
+ AssignIds(id4, ITEM_NODE12_LOG_1);
+ auto reply4 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply4->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Add item with matching host scope -> notification.
+ ITEM_HOST12_LOG_1.SetOrder(0);
+ auto id5 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_HOST12_LOG_1));
+ AssignIds(id5, ITEM_HOST12_LOG_1);
+ auto reply5 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply5->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_HOST12_LOG_1,
+ ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Add item with matching tenant scope -> notification.
+ auto id6 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_TENANT1_LOG_1));
+ AssignIds(id6, ITEM_TENANT1_LOG_1);
+ auto reply6 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply6->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TENANT1_LOG_1,
+ ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Add item with matching node type scope -> notification.
+ auto id7 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_TYPE1_LOG_1));
+ AssignIds(id7, ITEM_TYPE1_LOG_1);
+ auto reply7 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply7->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+ }
+
+ Y_UNIT_TEST(TestNotificationForNewConfigItem) {
+ TestNotificationForNewConfigItemBase(false);
+ TestNotificationForNewConfigItemBase(true);
+ }
+
+ void TestNotificationForModifiedConfigItemBase(bool useService)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
-
- if (useService)
+ ui64 tabletId = 0;
+
+ if (useService)
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- else
- tabletId = CONFIG_PROXY_TABLET_ID;
-
- auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_NODE12_LOG_1),
- MakeAddAction(ITEM_NODE34_LOG_1),
- MakeAddAction(ITEM_HOST12_LOG_1),
- MakeAddAction(ITEM_HOST34_LOG_1),
- MakeAddAction(ITEM_TENANT1_LOG_1),
- MakeAddAction(ITEM_TENANT2_LOG_1),
- MakeAddAction(ITEM_TYPE1_LOG_1),
- MakeAddAction(ITEM_TYPE2_LOG_1),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1,
- ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE1_LOG_1,
- ITEM_TYPE2_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
-
- // New subscription should cause notification.
- CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant1", "type1",
- tabletId, serviceId,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply1->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify items with another kind/node/host/tenant/type shouldn't cause notification.
- ITEM_NODE34_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- ITEM_HOST34_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- ITEM_TENANT2_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- ITEM_TYPE2_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- ITEM_DOMAIN_TENANT_POOL_1.MutableConfig()->MutableTenantPoolConfig()->SetIsEnabled(false);
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_1),
- MakeModifyAction(ITEM_NODE34_LOG_1),
- MakeModifyAction(ITEM_HOST34_LOG_1),
- MakeModifyAction(ITEM_TENANT2_LOG_1),
- MakeModifyAction(ITEM_TYPE2_LOG_1));
- IncGeneration(ITEM_DOMAIN_TENANT_POOL_1, ITEM_NODE34_LOG_1, ITEM_HOST34_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE2_LOG_1);
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(1));
- UNIT_ASSERT(!reply2);
-
- // Modify item with domain scope -> notification.
- ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_LOG_2));
- IncGeneration(ITEM_DOMAIN_LOG_2);
- auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply3->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item with matching node scope -> notification.
- ITEM_NODE12_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_NODE12_LOG_1));
- IncGeneration(ITEM_NODE12_LOG_1);
- auto reply4 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply4->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item with matching host scope -> notification.
- ITEM_HOST12_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_HOST12_LOG_1));
- IncGeneration(ITEM_HOST12_LOG_1);
- auto reply5 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply5->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item with matching tenant scope -> notification.
- ITEM_TENANT1_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_TENANT1_LOG_1));
- IncGeneration(ITEM_TENANT1_LOG_1);
- auto reply6 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply6->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item with matching node type scope -> notification.
- ITEM_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_TYPE1_LOG_1));
- IncGeneration(ITEM_TYPE1_LOG_1);
- auto reply7 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply7->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
- }
-
- Y_UNIT_TEST(TestNotificationForModifiedConfigItem) {
- TestNotificationForModifiedConfigItemBase(false);
- TestNotificationForModifiedConfigItemBase(true);
- }
-
- void TestNotificationForModifiedConfigItemScopeBase(bool useService)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ else
+ tabletId = CONFIG_PROXY_TABLET_ID;
+
+ auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_NODE12_LOG_1),
+ MakeAddAction(ITEM_NODE34_LOG_1),
+ MakeAddAction(ITEM_HOST12_LOG_1),
+ MakeAddAction(ITEM_HOST34_LOG_1),
+ MakeAddAction(ITEM_TENANT1_LOG_1),
+ MakeAddAction(ITEM_TENANT2_LOG_1),
+ MakeAddAction(ITEM_TYPE1_LOG_1),
+ MakeAddAction(ITEM_TYPE2_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1,
+ ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE1_LOG_1,
+ ITEM_TYPE2_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
+
+ // New subscription should cause notification.
+ CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant1", "type1",
+ tabletId, serviceId,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply1->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify items with another kind/node/host/tenant/type shouldn't cause notification.
+ ITEM_NODE34_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ ITEM_HOST34_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ ITEM_TENANT2_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ ITEM_TYPE2_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ ITEM_DOMAIN_TENANT_POOL_1.MutableConfig()->MutableTenantPoolConfig()->SetIsEnabled(false);
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_1),
+ MakeModifyAction(ITEM_NODE34_LOG_1),
+ MakeModifyAction(ITEM_HOST34_LOG_1),
+ MakeModifyAction(ITEM_TENANT2_LOG_1),
+ MakeModifyAction(ITEM_TYPE2_LOG_1));
+ IncGeneration(ITEM_DOMAIN_TENANT_POOL_1, ITEM_NODE34_LOG_1, ITEM_HOST34_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE2_LOG_1);
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(1));
+ UNIT_ASSERT(!reply2);
+
+ // Modify item with domain scope -> notification.
+ ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_DOMAIN_LOG_2));
+ IncGeneration(ITEM_DOMAIN_LOG_2);
+ auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply3->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item with matching node scope -> notification.
+ ITEM_NODE12_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_NODE12_LOG_1));
+ IncGeneration(ITEM_NODE12_LOG_1);
+ auto reply4 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply4->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item with matching host scope -> notification.
+ ITEM_HOST12_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_HOST12_LOG_1));
+ IncGeneration(ITEM_HOST12_LOG_1);
+ auto reply5 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply5->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item with matching tenant scope -> notification.
+ ITEM_TENANT1_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_TENANT1_LOG_1));
+ IncGeneration(ITEM_TENANT1_LOG_1);
+ auto reply6 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply6->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item with matching node type scope -> notification.
+ ITEM_TYPE1_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_TYPE1_LOG_1));
+ IncGeneration(ITEM_TYPE1_LOG_1);
+ auto reply7 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply7->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+ }
+
+ Y_UNIT_TEST(TestNotificationForModifiedConfigItem) {
+ TestNotificationForModifiedConfigItemBase(false);
+ TestNotificationForModifiedConfigItemBase(true);
+ }
+
+ void TestNotificationForModifiedConfigItemScopeBase(bool useService)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
-
- if (useService)
+ ui64 tabletId = 0;
+
+ if (useService)
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- else
- tabletId = CONFIG_PROXY_TABLET_ID;
-
- auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_NODE12_LOG_1),
- MakeAddAction(ITEM_NODE34_LOG_1),
- MakeAddAction(ITEM_HOST12_LOG_1),
- MakeAddAction(ITEM_HOST34_LOG_1),
- MakeAddAction(ITEM_TENANT1_LOG_1),
- MakeAddAction(ITEM_TENANT2_LOG_1),
- MakeAddAction(ITEM_TYPE1_LOG_1),
- MakeAddAction(ITEM_TYPE2_LOG_1),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1,
- ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE1_LOG_1,
- ITEM_TYPE2_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
-
- // New subscription should cause notification.
- CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant1", "type1",
- tabletId, serviceId,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply1->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item's scopes with another kind/node/host/tenant/type shouldn't cause notification.
- ITEM_NODE34_LOG_1.MutableUsageScope()->MutableNodeFilter()->AddNodes(5);
- ITEM_HOST34_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host5");
- ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant3");
- ITEM_TYPE2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type3");
- ITEM_DOMAIN_TENANT_POOL_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant3");
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_1),
- MakeModifyAction(ITEM_NODE34_LOG_1),
- MakeModifyAction(ITEM_HOST34_LOG_1),
- MakeModifyAction(ITEM_TENANT2_LOG_1),
- MakeModifyAction(ITEM_TYPE2_LOG_1));
- IncGeneration(ITEM_DOMAIN_TENANT_POOL_1, ITEM_NODE34_LOG_1, ITEM_HOST34_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE2_LOG_1);
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(1));
- UNIT_ASSERT(!reply2);
-
- // Modify item's node scope to match subscription -> notification.
- ITEM_NODE34_LOG_1.MutableUsageScope()->MutableNodeFilter()->AddNodes(1);
- ITEM_NODE34_LOG_1.SetOrder(0);
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_NODE34_LOG_1));
- IncGeneration(ITEM_NODE34_LOG_1);
- auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply3->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1,
- ITEM_NODE34_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item's node scope to mismatch subscription -> notification.
- ITEM_NODE12_LOG_1.MutableUsageScope()->MutableNodeFilter()->ClearNodes();
- ITEM_NODE12_LOG_1.MutableUsageScope()->MutableNodeFilter()->AddNodes(2);
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_NODE12_LOG_1));
- IncGeneration(ITEM_NODE12_LOG_1);
- auto reply4 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply4->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE34_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item's host scope to match subscription -> notification.
- ITEM_HOST34_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host1");
- ITEM_HOST34_LOG_1.SetOrder(0);
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_HOST34_LOG_1));
- IncGeneration(ITEM_HOST34_LOG_1);
- auto reply5 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply5->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_NODE34_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item's host scope to mismatch subscription -> notification.
- ITEM_HOST12_LOG_1.MutableUsageScope()->MutableHostFilter()->ClearHosts();
- ITEM_HOST12_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host2");
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_HOST12_LOG_1));
- IncGeneration(ITEM_HOST12_LOG_1);
- auto reply6 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply6->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST34_LOG_1, ITEM_NODE34_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item's tenant scope to match subscription -> notification.
- ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant1");
- ITEM_TENANT2_LOG_1.SetOrder(0);
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_TENANT2_LOG_1));
- IncGeneration(ITEM_TENANT2_LOG_1);
- auto reply7 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply7->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_NODE34_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item's tenant scope to mismatch subscription -> notification.
- ITEM_TENANT1_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant2");
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_TENANT1_LOG_1));
- IncGeneration(ITEM_TENANT1_LOG_1);
- auto reply8 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply8->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT2_LOG_1, ITEM_HOST34_LOG_1, ITEM_NODE34_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item's node type scope to match subscription -> notification.
- ITEM_TYPE2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type1");
- ITEM_TYPE2_LOG_1.SetOrder(0);
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_TYPE2_LOG_1));
- IncGeneration(ITEM_TYPE2_LOG_1);
- auto reply9 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply9->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TYPE2_LOG_1, ITEM_TENANT2_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_NODE34_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Modify item's node type scope to mismatch subscription -> notification.
- ITEM_TYPE1_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type2");
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeModifyAction(ITEM_TYPE1_LOG_1));
- IncGeneration(ITEM_TYPE1_LOG_1);
- auto reply10 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply10->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE2_LOG_1,
- ITEM_TENANT2_LOG_1, ITEM_HOST34_LOG_1, ITEM_NODE34_LOG_1);
- AcceptConfig(runtime, handle);
- }
-
- Y_UNIT_TEST(TestNotificationForModifiedConfigItemScope) {
- TestNotificationForModifiedConfigItemScopeBase(false);
- TestNotificationForModifiedConfigItemScopeBase(true);
- }
-
- void TestNotificationForRemovedConfigItemBase(bool useService)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ else
+ tabletId = CONFIG_PROXY_TABLET_ID;
+
+ auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_NODE12_LOG_1),
+ MakeAddAction(ITEM_NODE34_LOG_1),
+ MakeAddAction(ITEM_HOST12_LOG_1),
+ MakeAddAction(ITEM_HOST34_LOG_1),
+ MakeAddAction(ITEM_TENANT1_LOG_1),
+ MakeAddAction(ITEM_TENANT2_LOG_1),
+ MakeAddAction(ITEM_TYPE1_LOG_1),
+ MakeAddAction(ITEM_TYPE2_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1,
+ ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE1_LOG_1,
+ ITEM_TYPE2_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
+
+ // New subscription should cause notification.
+ CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant1", "type1",
+ tabletId, serviceId,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply1->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item's scopes with another kind/node/host/tenant/type shouldn't cause notification.
+ ITEM_NODE34_LOG_1.MutableUsageScope()->MutableNodeFilter()->AddNodes(5);
+ ITEM_HOST34_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host5");
+ ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant3");
+ ITEM_TYPE2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type3");
+ ITEM_DOMAIN_TENANT_POOL_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant3");
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_DOMAIN_TENANT_POOL_1),
+ MakeModifyAction(ITEM_NODE34_LOG_1),
+ MakeModifyAction(ITEM_HOST34_LOG_1),
+ MakeModifyAction(ITEM_TENANT2_LOG_1),
+ MakeModifyAction(ITEM_TYPE2_LOG_1));
+ IncGeneration(ITEM_DOMAIN_TENANT_POOL_1, ITEM_NODE34_LOG_1, ITEM_HOST34_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE2_LOG_1);
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(1));
+ UNIT_ASSERT(!reply2);
+
+ // Modify item's node scope to match subscription -> notification.
+ ITEM_NODE34_LOG_1.MutableUsageScope()->MutableNodeFilter()->AddNodes(1);
+ ITEM_NODE34_LOG_1.SetOrder(0);
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_NODE34_LOG_1));
+ IncGeneration(ITEM_NODE34_LOG_1);
+ auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply3->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1,
+ ITEM_NODE34_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item's node scope to mismatch subscription -> notification.
+ ITEM_NODE12_LOG_1.MutableUsageScope()->MutableNodeFilter()->ClearNodes();
+ ITEM_NODE12_LOG_1.MutableUsageScope()->MutableNodeFilter()->AddNodes(2);
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_NODE12_LOG_1));
+ IncGeneration(ITEM_NODE12_LOG_1);
+ auto reply4 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply4->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE34_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item's host scope to match subscription -> notification.
+ ITEM_HOST34_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host1");
+ ITEM_HOST34_LOG_1.SetOrder(0);
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_HOST34_LOG_1));
+ IncGeneration(ITEM_HOST34_LOG_1);
+ auto reply5 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply5->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_NODE34_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item's host scope to mismatch subscription -> notification.
+ ITEM_HOST12_LOG_1.MutableUsageScope()->MutableHostFilter()->ClearHosts();
+ ITEM_HOST12_LOG_1.MutableUsageScope()->MutableHostFilter()->AddHosts("host2");
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_HOST12_LOG_1));
+ IncGeneration(ITEM_HOST12_LOG_1);
+ auto reply6 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply6->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST34_LOG_1, ITEM_NODE34_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item's tenant scope to match subscription -> notification.
+ ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant1");
+ ITEM_TENANT2_LOG_1.SetOrder(0);
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_TENANT2_LOG_1));
+ IncGeneration(ITEM_TENANT2_LOG_1);
+ auto reply7 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply7->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_NODE34_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item's tenant scope to mismatch subscription -> notification.
+ ITEM_TENANT1_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant("tenant2");
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_TENANT1_LOG_1));
+ IncGeneration(ITEM_TENANT1_LOG_1);
+ auto reply8 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply8->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT2_LOG_1, ITEM_HOST34_LOG_1, ITEM_NODE34_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item's node type scope to match subscription -> notification.
+ ITEM_TYPE2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type1");
+ ITEM_TYPE2_LOG_1.SetOrder(0);
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_TYPE2_LOG_1));
+ IncGeneration(ITEM_TYPE2_LOG_1);
+ auto reply9 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply9->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TYPE2_LOG_1, ITEM_TENANT2_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_NODE34_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Modify item's node type scope to mismatch subscription -> notification.
+ ITEM_TYPE1_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType("type2");
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeModifyAction(ITEM_TYPE1_LOG_1));
+ IncGeneration(ITEM_TYPE1_LOG_1);
+ auto reply10 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply10->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE2_LOG_1,
+ ITEM_TENANT2_LOG_1, ITEM_HOST34_LOG_1, ITEM_NODE34_LOG_1);
+ AcceptConfig(runtime, handle);
+ }
+
+ Y_UNIT_TEST(TestNotificationForModifiedConfigItemScope) {
+ TestNotificationForModifiedConfigItemScopeBase(false);
+ TestNotificationForModifiedConfigItemScopeBase(true);
+ }
+
+ void TestNotificationForRemovedConfigItemBase(bool useService)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
-
- if (useService)
+ ui64 tabletId = 0;
+
+ if (useService)
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- else
- tabletId = CONFIG_PROXY_TABLET_ID;
-
- auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_DOMAIN_LOG_2),
- MakeAddAction(ITEM_NODE12_LOG_1),
- MakeAddAction(ITEM_NODE34_LOG_1),
- MakeAddAction(ITEM_HOST12_LOG_1),
- MakeAddAction(ITEM_HOST34_LOG_1),
- MakeAddAction(ITEM_TENANT1_LOG_1),
- MakeAddAction(ITEM_TENANT2_LOG_1),
- MakeAddAction(ITEM_TYPE1_LOG_1),
- MakeAddAction(ITEM_TYPE2_LOG_1),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1,
- ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1, ITEM_HOST34_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE1_LOG_1,
- ITEM_TYPE2_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
-
- // New subscription should cause notification.
- CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant1", "type1",
- tabletId, serviceId,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply1->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Remove items with another kind/node/host/tenant/type shouldn't cause notification.
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_DOMAIN_TENANT_POOL_1),
- MakeRemoveAction(ITEM_NODE34_LOG_1),
- MakeRemoveAction(ITEM_HOST34_LOG_1),
- MakeRemoveAction(ITEM_TENANT2_LOG_1),
- MakeRemoveAction(ITEM_TYPE2_LOG_1));
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(1));
- UNIT_ASSERT(!reply2);
-
- // Remove item with domain scope -> notification.
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_DOMAIN_LOG_2));
- auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply3->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_1, ITEM_TENANT1_LOG_1,
- ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Remove item with matching node scope -> notification.
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_NODE12_LOG_1));
- auto reply4 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply4->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_1, ITEM_TENANT1_LOG_1,
- ITEM_HOST12_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Remove item with matching host scope -> notification.
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_HOST12_LOG_1));
- auto reply5 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply5->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_1, ITEM_TENANT1_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Remove item with matching tenant scope -> notification.
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_TENANT1_LOG_1));
- auto reply6 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply6->Record.GetConfigId(),
- ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Remove item with matching node type scope -> notification.
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeRemoveAction(ITEM_TYPE1_LOG_1));
- auto reply7 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply7->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
- AcceptConfig(runtime, handle);
- }
-
- Y_UNIT_TEST(TestNotificationForRemovedConfigItem) {
- TestNotificationForRemovedConfigItemBase(false);
- TestNotificationForRemovedConfigItemBase(true);
- }
-
- void TestNotificationForRestartedClientBase(bool useService)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ else
+ tabletId = CONFIG_PROXY_TABLET_ID;
+
+ auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_LOG_2),
+ MakeAddAction(ITEM_NODE12_LOG_1),
+ MakeAddAction(ITEM_NODE34_LOG_1),
+ MakeAddAction(ITEM_HOST12_LOG_1),
+ MakeAddAction(ITEM_HOST34_LOG_1),
+ MakeAddAction(ITEM_TENANT1_LOG_1),
+ MakeAddAction(ITEM_TENANT2_LOG_1),
+ MakeAddAction(ITEM_TYPE1_LOG_1),
+ MakeAddAction(ITEM_TYPE2_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_NODE12_LOG_1,
+ ITEM_NODE34_LOG_1, ITEM_HOST12_LOG_1, ITEM_HOST34_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT2_LOG_1, ITEM_TYPE1_LOG_1,
+ ITEM_TYPE2_LOG_1, ITEM_DOMAIN_TENANT_POOL_1);
+
+ // New subscription should cause notification.
+ CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant1", "type1",
+ tabletId, serviceId,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply1->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2, ITEM_TYPE1_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Remove items with another kind/node/host/tenant/type shouldn't cause notification.
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeRemoveAction(ITEM_DOMAIN_TENANT_POOL_1),
+ MakeRemoveAction(ITEM_NODE34_LOG_1),
+ MakeRemoveAction(ITEM_HOST34_LOG_1),
+ MakeRemoveAction(ITEM_TENANT2_LOG_1),
+ MakeRemoveAction(ITEM_TYPE2_LOG_1));
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(1));
+ UNIT_ASSERT(!reply2);
+
+ // Remove item with domain scope -> notification.
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeRemoveAction(ITEM_DOMAIN_LOG_2));
+ auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply3->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_1, ITEM_TENANT1_LOG_1,
+ ITEM_HOST12_LOG_1, ITEM_NODE12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Remove item with matching node scope -> notification.
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeRemoveAction(ITEM_NODE12_LOG_1));
+ auto reply4 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply4->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_1, ITEM_TENANT1_LOG_1,
+ ITEM_HOST12_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Remove item with matching host scope -> notification.
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeRemoveAction(ITEM_HOST12_LOG_1));
+ auto reply5 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply5->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_1, ITEM_TENANT1_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Remove item with matching tenant scope -> notification.
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeRemoveAction(ITEM_TENANT1_LOG_1));
+ auto reply6 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply6->Record.GetConfigId(),
+ ITEM_DOMAIN_LOG_1, ITEM_TYPE1_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Remove item with matching node type scope -> notification.
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeRemoveAction(ITEM_TYPE1_LOG_1));
+ auto reply7 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply7->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
+ AcceptConfig(runtime, handle);
+ }
+
+ Y_UNIT_TEST(TestNotificationForRemovedConfigItem) {
+ TestNotificationForRemovedConfigItemBase(false);
+ TestNotificationForRemovedConfigItemBase(true);
+ }
+
+ void TestNotificationForRestartedClientBase(bool useService)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
-
- if (useService)
+ ui64 tabletId = 0;
+
+ if (useService)
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- else
- tabletId = CONFIG_PROXY_TABLET_ID;
-
- auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1);
-
- // New subscription should cause notification.
- CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant1", "type1",
- tabletId, serviceId,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply1->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
-
- // Replace subscription (restart client) before accepting config update -> new notification.
- if (useService)
- CheckReplaceConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant1", "type1",
- tabletId, serviceId,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- else
- runtime.Register(CreateTabletKiller(CONFIG_PROXY_TABLET_ID));
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply2->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
- AcceptConfig(runtime, handle);
-
- // Replace subscription (restart client) after accepting config update -> new notification
- // only for service, not for tablet.
- if (useService) {
- CheckReplaceConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant1", "type1",
- tabletId, serviceId,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply3->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
- } else {
- runtime.Register(CreateTabletKiller(CONFIG_PROXY_TABLET_ID));
- auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(2));
- UNIT_ASSERT(!reply3);
- }
- }
-
- Y_UNIT_TEST(TestNotificationForRestartedClient) {
- TestNotificationForRestartedClientBase(false);
- TestNotificationForRestartedClientBase(true);
- }
-
- void TestNotificationForTimeoutedNotificationResponseBase(bool useService)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ else
+ tabletId = CONFIG_PROXY_TABLET_ID;
+
+ auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1);
+
+ // New subscription should cause notification.
+ CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant1", "type1",
+ tabletId, serviceId,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply1->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
+
+ // Replace subscription (restart client) before accepting config update -> new notification.
+ if (useService)
+ CheckReplaceConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant1", "type1",
+ tabletId, serviceId,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+ else
+ runtime.Register(CreateTabletKiller(CONFIG_PROXY_TABLET_ID));
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply2->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
+ AcceptConfig(runtime, handle);
+
+ // Replace subscription (restart client) after accepting config update -> new notification
+ // only for service, not for tablet.
+ if (useService) {
+ CheckReplaceConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant1", "type1",
+ tabletId, serviceId,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+ auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply3->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
+ } else {
+ runtime.Register(CreateTabletKiller(CONFIG_PROXY_TABLET_ID));
+ auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(2));
+ UNIT_ASSERT(!reply3);
+ }
+ }
+
+ Y_UNIT_TEST(TestNotificationForRestartedClient) {
+ TestNotificationForRestartedClientBase(false);
+ TestNotificationForRestartedClientBase(true);
+ }
+
+ void TestNotificationForTimeoutedNotificationResponseBase(bool useService)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
-
- if (useService)
+ ui64 tabletId = 0;
+
+ if (useService)
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- else
- tabletId = CONFIG_PROXY_TABLET_ID;
-
- auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1);
-
- // New subscription should cause notification.
- CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant1", "type1",
- tabletId, serviceId,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply1->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
-
- // Don't answer notification for too long and get another one.
- runtime.UpdateCurrentTime(runtime.GetCurrentTime() + TDuration::Minutes(20));
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply2->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
- }
-
- Y_UNIT_TEST(TestNotificationForTimeoutedNotificationResponse) {
- TestNotificationForTimeoutedNotificationResponseBase(false);
- TestNotificationForTimeoutedNotificationResponseBase(true);
- }
-
- void TestNotificationForRestartedServerBase(bool useService)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ else
+ tabletId = CONFIG_PROXY_TABLET_ID;
+
+ auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1);
+
+ // New subscription should cause notification.
+ CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant1", "type1",
+ tabletId, serviceId,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply1->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
+
+ // Don't answer notification for too long and get another one.
+ runtime.UpdateCurrentTime(runtime.GetCurrentTime() + TDuration::Minutes(20));
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply2->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
+ }
+
+ Y_UNIT_TEST(TestNotificationForTimeoutedNotificationResponse) {
+ TestNotificationForTimeoutedNotificationResponseBase(false);
+ TestNotificationForTimeoutedNotificationResponseBase(true);
+ }
+
+ void TestNotificationForRestartedServerBase(bool useService)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
-
- if (useService)
+ ui64 tabletId = 0;
+
+ if (useService)
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- else
- tabletId = CONFIG_PROXY_TABLET_ID;
-
- auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_DOMAIN_LOG_1));
- AssignIds(id1, ITEM_DOMAIN_LOG_1);
-
- // New subscription should cause notification.
- CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant1", "type1",
- tabletId, serviceId,
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply1->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
-
- // Restart server before notification response -> new notification.
- runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
- CheckConfigId(reply2->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
- AcceptConfig(runtime, handle);
- // Wait for subscription update.
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TConfigsProvider::TEvPrivate::EvUpdateSubscriptions, 1);
- runtime.DispatchEvents(options);
-
- // Restart server after notification response -> no new notification.
- runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
- auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(5));
- UNIT_ASSERT(!reply3);
- }
-
- Y_UNIT_TEST(TestNotificationForRestartedServer) {
- TestNotificationForRestartedServerBase(false);
- TestNotificationForRestartedServerBase(true);
- }
-
- void TestAddSubscriptionIdempotencyBase(bool useService)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ else
+ tabletId = CONFIG_PROXY_TABLET_ID;
+
+ auto id1 = CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+ AssignIds(id1, ITEM_DOMAIN_LOG_1);
+
+ // New subscription should cause notification.
+ CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant1", "type1",
+ tabletId, serviceId,
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply1->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
+
+ // Restart server before notification response -> new notification.
+ runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle);
+ CheckConfigId(reply2->Record.GetConfigId(), ITEM_DOMAIN_LOG_1);
+ AcceptConfig(runtime, handle);
+ // Wait for subscription update.
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TConfigsProvider::TEvPrivate::EvUpdateSubscriptions, 1);
+ runtime.DispatchEvents(options);
+
+ // Restart server after notification response -> no new notification.
+ runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
+ auto reply3 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigNotificationRequest>(handle, TDuration::Seconds(5));
+ UNIT_ASSERT(!reply3);
+ }
+
+ Y_UNIT_TEST(TestNotificationForRestartedServer) {
+ TestNotificationForRestartedServerBase(false);
+ TestNotificationForRestartedServerBase(true);
+ }
+
+ void TestAddSubscriptionIdempotencyBase(bool useService)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
-
- if (useService)
+ ui64 tabletId = 0;
+
+ if (useService)
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- else
- tabletId = CONFIG_PROXY_TABLET_ID;
-
- // Add subscriptions and check similar ones are not duplicated.
- ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
- tabletId, serviceId, {{1, 2, 3}});
- ui64 id2 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
- tabletId, serviceId, {{1, 2, 3}});
- ui64 id3 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
- tabletId, serviceId, {{1, 2}});
- ui64 id4 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
- tabletId, serviceId, {{1, 2}});
- ui64 id5 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type2",
- tabletId, serviceId, {{1, 2, 3}});
- ui64 id6 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-2", "type1",
- tabletId, serviceId, {{1, 2, 3}});
- ui64 id7 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host2", "tenant-1", "type1",
- tabletId, serviceId, {{1, 2, 3}});
- ui64 id8 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 2, "host1", "tenant-1", "type1",
- tabletId, serviceId, {{1, 2, 3}});
- UNIT_ASSERT_VALUES_EQUAL(id1, id2);
- UNIT_ASSERT_VALUES_EQUAL(id3, id4);
- UNIT_ASSERT_VALUES_UNEQUAL(id1, id4);
- UNIT_ASSERT_VALUES_UNEQUAL(id1, id5);
- UNIT_ASSERT_VALUES_UNEQUAL(id1, id6);
- UNIT_ASSERT_VALUES_UNEQUAL(id1, id7);
- UNIT_ASSERT_VALUES_UNEQUAL(id1, id8);
- }
-
- Y_UNIT_TEST(TestAddSubscriptionIdempotency) {
- TestAddSubscriptionIdempotencyBase(false);
- TestAddSubscriptionIdempotencyBase(true);
- }
-
- Y_UNIT_TEST(TestConfigNotificationRetries) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- //StartConfigProxy(runtime);
- //TAutoPtr<IEventHandle> handle;
-
- CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 100, "host100", "tenant-100", "type100",
+ else
+ tabletId = CONFIG_PROXY_TABLET_ID;
+
+ // Add subscriptions and check similar ones are not duplicated.
+ ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant-1", "type1",
+ tabletId, serviceId, {{1, 2, 3}});
+ ui64 id2 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant-1", "type1",
+ tabletId, serviceId, {{1, 2, 3}});
+ ui64 id3 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant-1", "type1",
+ tabletId, serviceId, {{1, 2}});
+ ui64 id4 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant-1", "type1",
+ tabletId, serviceId, {{1, 2}});
+ ui64 id5 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant-1", "type2",
+ tabletId, serviceId, {{1, 2, 3}});
+ ui64 id6 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant-2", "type1",
+ tabletId, serviceId, {{1, 2, 3}});
+ ui64 id7 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host2", "tenant-1", "type1",
+ tabletId, serviceId, {{1, 2, 3}});
+ ui64 id8 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 2, "host1", "tenant-1", "type1",
+ tabletId, serviceId, {{1, 2, 3}});
+ UNIT_ASSERT_VALUES_EQUAL(id1, id2);
+ UNIT_ASSERT_VALUES_EQUAL(id3, id4);
+ UNIT_ASSERT_VALUES_UNEQUAL(id1, id4);
+ UNIT_ASSERT_VALUES_UNEQUAL(id1, id5);
+ UNIT_ASSERT_VALUES_UNEQUAL(id1, id6);
+ UNIT_ASSERT_VALUES_UNEQUAL(id1, id7);
+ UNIT_ASSERT_VALUES_UNEQUAL(id1, id8);
+ }
+
+ Y_UNIT_TEST(TestAddSubscriptionIdempotency) {
+ TestAddSubscriptionIdempotencyBase(false);
+ TestAddSubscriptionIdempotencyBase(true);
+ }
+
+ Y_UNIT_TEST(TestConfigNotificationRetries) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ //StartConfigProxy(runtime);
+ //TAutoPtr<IEventHandle> handle;
+
+ CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 100, "host100", "tenant-100", "type100",
0, TActorId(100, "service"),
- TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
-
- ui32 undelivered = 0;
- bool attemptFinished = false;
+ TVector<ui32>({(ui32)NKikimrConsole::TConfigItem::LogConfigItem}));
+
+ ui32 undelivered = 0;
+ bool attemptFinished = false;
auto countRetries = [&](TTestActorRuntimeBase&,
- TAutoPtr<IEventHandle> &event) -> auto {
- if (event->GetTypeRewrite() == TEvents::TSystem::Undelivered) {
- if (!attemptFinished)
- ++undelivered;
- }
- if (event->GetTypeRewrite() == TConfigsProvider::TEvPrivate::EvNotificationTimeout
- && dynamic_cast<TConfigsProvider::TEvPrivate::TEvNotificationTimeout*>(event->GetBase())) {
- attemptFinished = true;
- }
- // Don't allow to cleanup config for missing node.
- if (event->GetTypeRewrite() == TConfigsManager::TEvPrivate::EvCleanupSubscriptions
- && dynamic_cast<TConfigsManager::TEvPrivate::TEvCleanupSubscriptions*>(event->GetBase()))
- return TTestActorRuntime::EEventAction::DROP;
- return TTestActorRuntime::EEventAction::PROCESS;
- };
- runtime.SetObserverFunc(countRetries);
-
-
- // When target node is down we retry with increasing
- // interval up to 1 min. One attempt lasts for 10
- // minutes. This regression test checks we don't have
- // excessive retries and don't re-create long timer
- // (loosing TConfigsProvider::TEvPrivate::TEvNotificationTimeout)
- auto *event = new TEvConsole::TEvConfigureRequest;
- CollectActions(event->Record, MakeAddAction(ITEM_DOMAIN_LOG_1));
- runtime.SendToConsole(event);
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back([&](IEventHandle &) -> bool {
- return attemptFinished;
- });
- runtime.DispatchEvents(options);
-
- UNIT_ASSERT_VALUES_EQUAL(undelivered, 12);
- }
-
- Y_UNIT_TEST(TestConfigSubscriptionsCleanup) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- //InitializeTestConfigItems();
- //StartConfigProxy(runtime);
- //TAutoPtr<IEventHandle> handle;
-
- ui32 nodeId = runtime.GetNodeId(0);
- ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- nodeId, "host1", "tenant-1", "type1",
+ TAutoPtr<IEventHandle> &event) -> auto {
+ if (event->GetTypeRewrite() == TEvents::TSystem::Undelivered) {
+ if (!attemptFinished)
+ ++undelivered;
+ }
+ if (event->GetTypeRewrite() == TConfigsProvider::TEvPrivate::EvNotificationTimeout
+ && dynamic_cast<TConfigsProvider::TEvPrivate::TEvNotificationTimeout*>(event->GetBase())) {
+ attemptFinished = true;
+ }
+ // Don't allow to cleanup config for missing node.
+ if (event->GetTypeRewrite() == TConfigsManager::TEvPrivate::EvCleanupSubscriptions
+ && dynamic_cast<TConfigsManager::TEvPrivate::TEvCleanupSubscriptions*>(event->GetBase()))
+ return TTestActorRuntime::EEventAction::DROP;
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+ runtime.SetObserverFunc(countRetries);
+
+
+ // When target node is down we retry with increasing
+ // interval up to 1 min. One attempt lasts for 10
+ // minutes. This regression test checks we don't have
+ // excessive retries and don't re-create long timer
+ // (loosing TConfigsProvider::TEvPrivate::TEvNotificationTimeout)
+ auto *event = new TEvConsole::TEvConfigureRequest;
+ CollectActions(event->Record, MakeAddAction(ITEM_DOMAIN_LOG_1));
+ runtime.SendToConsole(event);
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back([&](IEventHandle &) -> bool {
+ return attemptFinished;
+ });
+ runtime.DispatchEvents(options);
+
+ UNIT_ASSERT_VALUES_EQUAL(undelivered, 12);
+ }
+
+ Y_UNIT_TEST(TestConfigSubscriptionsCleanup) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ //InitializeTestConfigItems();
+ //StartConfigProxy(runtime);
+ //TAutoPtr<IEventHandle> handle;
+
+ ui32 nodeId = runtime.GetNodeId(0);
+ ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ nodeId, "host1", "tenant-1", "type1",
0, TActorId(nodeId, "service"), TVector<ui32>({1}));
- ui64 id2 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 100, "host100", "tenant-100", "type100",
+ ui64 id2 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 100, "host100", "tenant-100", "type100",
0, TActorId(100, "service"), TVector<ui32>({1}));
- ui64 id3 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 100, "host100", "tenant-100", "type100",
+ ui64 id3 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 100, "host100", "tenant-100", "type100",
100, TActorId(), TVector<ui32>({1}));
-
+
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(nodeId, "service"),
- id1, nodeId, "host1", "tenant-1", "type1",
+ id1, nodeId, "host1", "tenant-1", "type1",
0, TActorId(nodeId, "service"), TVector<ui32>({1}));
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(100, "service"),
- id2, 100, "host100", "tenant-100", "type100",
+ id2, 100, "host100", "tenant-100", "type100",
0, TActorId(100, "service"), TVector<ui32>({1}));
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 100, TActorId(),
- id3, 100, "host100", "tenant-100", "type100",
+ id3, 100, "host100", "tenant-100", "type100",
100, TActorId(), TVector<ui32>({1}));
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back([&](IEventHandle &ev) -> bool {
- if (ev.GetTypeRewrite() == TConfigsManager::TEvPrivate::EvCleanupSubscriptions
- && dynamic_cast<TConfigsManager::TEvPrivate::TEvCleanupSubscriptions*>(ev.GetBase()))
- return true;
- return false;
- }, 1);
- runtime.DispatchEvents(options);
-
-
- CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- nodeId + 1, "host2", "tenant-2", "type2",
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back([&](IEventHandle &ev) -> bool {
+ if (ev.GetTypeRewrite() == TConfigsManager::TEvPrivate::EvCleanupSubscriptions
+ && dynamic_cast<TConfigsManager::TEvPrivate::TEvCleanupSubscriptions*>(ev.GetBase()))
+ return true;
+ return false;
+ }, 1);
+ runtime.DispatchEvents(options);
+
+
+ CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ nodeId + 1, "host2", "tenant-2", "type2",
0, TActorId(nodeId + 1, "service"), TVector<ui32>({1}));
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(nodeId, "service"),
- id1, nodeId, "host1", "tenant-1", "type1",
+ id1, nodeId, "host1", "tenant-1", "type1",
0, TActorId(nodeId, "service"), TVector<ui32>({1}));
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 0, TActorId(100, "service"));
CheckListConfigSubscriptions(runtime, Ydb::StatusIds::SUCCESS, 100, TActorId(),
- id3, 100, "host100", "tenant-100", "type100",
+ id3, 100, "host100", "tenant-100", "type100",
100, TActorId(), TVector<ui32>({1}));
- }
-}
-
+ }
+}
+
Y_UNIT_TEST_SUITE(TConsoleInMemoryConfigSubscriptionTests) {
Y_UNIT_TEST(TestSubscriptionCreate) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig());
@@ -3762,251 +3762,251 @@ Y_UNIT_TEST_SUITE(TConsoleInMemoryConfigSubscriptionTests) {
}
}
-Y_UNIT_TEST_SUITE(TConsoleConfigHelpersTests) {
- Y_UNIT_TEST(TestConfigCourier) {
- TTenantTestRuntime runtime(TenantConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
-
- ITEM_TENANT1_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant(TENANT1_1_NAME);
- ITEM_TENANT1_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
- ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant(TENANT1_2_NAME);
- ITEM_TENANT2_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster2");
- ITEM_DOMAIN_TENANT_POOL_1.MutableConfig()->MutableTenantPoolConfig();
-
- CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
- MakeAddAction(ITEM_TENANT1_LOG_1),
- MakeAddAction(ITEM_TENANT2_LOG_1),
- MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
-
- NKikimrConfig::TAppConfig config1;
- config1.MutableTenantPoolConfig();
- config1.MutableLogConfig()->SetClusterName("cluster1");
- auto *courier1 = CreateNodeConfigCourier(runtime.Sender, 123);
- runtime.Register(courier1, 0);
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetNodeConfigResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(handle->Cookie, 123);
+Y_UNIT_TEST_SUITE(TConsoleConfigHelpersTests) {
+ Y_UNIT_TEST(TestConfigCourier) {
+ TTenantTestRuntime runtime(TenantConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
+
+ ITEM_TENANT1_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant(TENANT1_1_NAME);
+ ITEM_TENANT1_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster1");
+ ITEM_TENANT2_LOG_1.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant(TENANT1_2_NAME);
+ ITEM_TENANT2_LOG_1.MutableConfig()->MutableLogConfig()->SetClusterName("cluster2");
+ ITEM_DOMAIN_TENANT_POOL_1.MutableConfig()->MutableTenantPoolConfig();
+
+ CheckConfigure(runtime, Ydb::StatusIds::SUCCESS,
+ MakeAddAction(ITEM_TENANT1_LOG_1),
+ MakeAddAction(ITEM_TENANT2_LOG_1),
+ MakeAddAction(ITEM_DOMAIN_TENANT_POOL_1));
+
+ NKikimrConfig::TAppConfig config1;
+ config1.MutableTenantPoolConfig();
+ config1.MutableLogConfig()->SetClusterName("cluster1");
+ auto *courier1 = CreateNodeConfigCourier(runtime.Sender, 123);
+ runtime.Register(courier1, 0);
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetNodeConfigResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(handle->Cookie, 123);
CheckEqualsIgnoringVersion(reply1->Record.GetConfig(), config1);
-
- NKikimrConfig::TAppConfig config2;
- config2.MutableLogConfig()->SetClusterName("cluster2");
- auto *courier2 = CreateNodeConfigCourier((ui32)NKikimrConsole::TConfigItem::LogConfigItem,
- TENANT1_2_NAME, runtime.Sender, 321);
- runtime.Register(courier2, 0);
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetNodeConfigResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(handle->Cookie, 321);
+
+ NKikimrConfig::TAppConfig config2;
+ config2.MutableLogConfig()->SetClusterName("cluster2");
+ auto *courier2 = CreateNodeConfigCourier((ui32)NKikimrConsole::TConfigItem::LogConfigItem,
+ TENANT1_2_NAME, runtime.Sender, 321);
+ runtime.Register(courier2, 0);
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetNodeConfigResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(handle->Cookie, 321);
CheckEqualsIgnoringVersion(reply2->Record.GetConfig(), config2);
- }
-
- void TestConfigSubscriberBase(bool useService)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ }
+
+ void TestConfigSubscriberBase(bool useService)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
- IActor *subscriber;
-
- if (useService)
+ ui64 tabletId = 0;
+ IActor *subscriber;
+
+ if (useService)
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- else
- tabletId = CONFIG_PROXY_TABLET_ID;
-
- ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
- tabletId, serviceId, {{1, 2, 3}});
-
- if (useService)
- subscriber = CreateConfigSubscriber(serviceId,
- TVector<ui32>({1, 2}),
- "tenant1",
- runtime.Sender,
- true,
- 123);
- else
- subscriber = CreateConfigSubscriber(tabletId,
- TVector<ui32>({1, 2}),
- "tenant1",
- runtime.Sender,
- true,
- 123);
- runtime.Register(subscriber, 0);
-
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvReplaceConfigSubscriptionsResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply1->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
- UNIT_ASSERT_VALUES_EQUAL(handle->Cookie, 123);
- ui64 id2 = reply1->Record.GetSubscriptionId();
-
- // Subscriber replaced old configs with a new one.
- CheckGetConfigSubscription(runtime, Ydb::StatusIds::NOT_FOUND, id1);
- CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id2,
- runtime.GetNodeId(0), FQDNHostName(), "tenant1", "type1",
- tabletId, serviceId, {{1, 2}});
-
- if (useService)
- subscriber = CreateConfigSubscriber(serviceId,
- TVector<ui32>({1, 2, 3}),
- "tenant1",
- runtime.Sender,
- false,
- 321);
- else
- subscriber = CreateConfigSubscriber(tabletId,
- TVector<ui32>({1, 2, 3}),
- "tenant1",
- runtime.Sender,
- false,
- 321);
- runtime.Register(subscriber, 0);
-
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvAddConfigSubscriptionResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply2->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
- UNIT_ASSERT_VALUES_EQUAL(handle->Cookie, 321);
- ui64 id3 = reply2->Record.GetSubscriptionId();
-
- // This time we asked to not remove existing configs.
- CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id2,
- runtime.GetNodeId(0), FQDNHostName(), "tenant1", "type1",
- tabletId, serviceId, {{1, 2}});
- CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id3,
- runtime.GetNodeId(0), FQDNHostName(), "tenant1", "type1",
- tabletId, serviceId, {{1, 2, 3}});
- }
-
- Y_UNIT_TEST(TestConfigSubscriber) {
- TestConfigSubscriberBase(false);
- TestConfigSubscriberBase(true);
- }
-
- void TestConfigSubscriberAutoTenantTenantBase(bool useService)
- {
- TTenantTestRuntime runtime(TenantConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ else
+ tabletId = CONFIG_PROXY_TABLET_ID;
+
+ ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant-1", "type1",
+ tabletId, serviceId, {{1, 2, 3}});
+
+ if (useService)
+ subscriber = CreateConfigSubscriber(serviceId,
+ TVector<ui32>({1, 2}),
+ "tenant1",
+ runtime.Sender,
+ true,
+ 123);
+ else
+ subscriber = CreateConfigSubscriber(tabletId,
+ TVector<ui32>({1, 2}),
+ "tenant1",
+ runtime.Sender,
+ true,
+ 123);
+ runtime.Register(subscriber, 0);
+
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvReplaceConfigSubscriptionsResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply1->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
+ UNIT_ASSERT_VALUES_EQUAL(handle->Cookie, 123);
+ ui64 id2 = reply1->Record.GetSubscriptionId();
+
+ // Subscriber replaced old configs with a new one.
+ CheckGetConfigSubscription(runtime, Ydb::StatusIds::NOT_FOUND, id1);
+ CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id2,
+ runtime.GetNodeId(0), FQDNHostName(), "tenant1", "type1",
+ tabletId, serviceId, {{1, 2}});
+
+ if (useService)
+ subscriber = CreateConfigSubscriber(serviceId,
+ TVector<ui32>({1, 2, 3}),
+ "tenant1",
+ runtime.Sender,
+ false,
+ 321);
+ else
+ subscriber = CreateConfigSubscriber(tabletId,
+ TVector<ui32>({1, 2, 3}),
+ "tenant1",
+ runtime.Sender,
+ false,
+ 321);
+ runtime.Register(subscriber, 0);
+
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvAddConfigSubscriptionResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply2->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
+ UNIT_ASSERT_VALUES_EQUAL(handle->Cookie, 321);
+ ui64 id3 = reply2->Record.GetSubscriptionId();
+
+ // This time we asked to not remove existing configs.
+ CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id2,
+ runtime.GetNodeId(0), FQDNHostName(), "tenant1", "type1",
+ tabletId, serviceId, {{1, 2}});
+ CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id3,
+ runtime.GetNodeId(0), FQDNHostName(), "tenant1", "type1",
+ tabletId, serviceId, {{1, 2, 3}});
+ }
+
+ Y_UNIT_TEST(TestConfigSubscriber) {
+ TestConfigSubscriberBase(false);
+ TestConfigSubscriberBase(true);
+ }
+
+ void TestConfigSubscriberAutoTenantTenantBase(bool useService)
+ {
+ TTenantTestRuntime runtime(TenantConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
- IActor *subscriber;
-
- if (useService) {
+ ui64 tabletId = 0;
+ IActor *subscriber;
+
+ if (useService) {
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- subscriber = CreateConfigSubscriber(serviceId,
- TVector<ui32>({1, 2}),
- runtime.Sender);
- } else {
- tabletId = CONFIG_PROXY_TABLET_ID;
- subscriber = CreateConfigSubscriber(tabletId,
- TVector<ui32>({1, 2}),
- runtime.Sender);
- }
- runtime.Register(subscriber, 0);
-
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvReplaceConfigSubscriptionsResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply1->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
- ui64 id1 = reply1->Record.GetSubscriptionId();
-
- CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id1,
- runtime.GetNodeId(0), FQDNHostName(), TENANT1_1_NAME, "type1",
- tabletId, serviceId, {{1, 2}});
- }
-
- Y_UNIT_TEST(TestConfigSubscriberAutoTenantTenant) {
- TestConfigSubscriberAutoTenantTenantBase(false);
- TestConfigSubscriberAutoTenantTenantBase(true);
- }
-
- void TestConfigSubscriberAutoTenantMultipleTenantsBase(bool useService)
- {
- TTenantTestRuntime runtime(MultipleTenantsConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ subscriber = CreateConfigSubscriber(serviceId,
+ TVector<ui32>({1, 2}),
+ runtime.Sender);
+ } else {
+ tabletId = CONFIG_PROXY_TABLET_ID;
+ subscriber = CreateConfigSubscriber(tabletId,
+ TVector<ui32>({1, 2}),
+ runtime.Sender);
+ }
+ runtime.Register(subscriber, 0);
+
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvReplaceConfigSubscriptionsResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply1->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
+ ui64 id1 = reply1->Record.GetSubscriptionId();
+
+ CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id1,
+ runtime.GetNodeId(0), FQDNHostName(), TENANT1_1_NAME, "type1",
+ tabletId, serviceId, {{1, 2}});
+ }
+
+ Y_UNIT_TEST(TestConfigSubscriberAutoTenantTenant) {
+ TestConfigSubscriberAutoTenantTenantBase(false);
+ TestConfigSubscriberAutoTenantTenantBase(true);
+ }
+
+ void TestConfigSubscriberAutoTenantMultipleTenantsBase(bool useService)
+ {
+ TTenantTestRuntime runtime(MultipleTenantsConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
- IActor *subscriber;
-
- if (useService) {
+ ui64 tabletId = 0;
+ IActor *subscriber;
+
+ if (useService) {
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- subscriber = CreateConfigSubscriber(serviceId,
- TVector<ui32>({1, 2}),
- runtime.Sender);
- } else {
- tabletId = CONFIG_PROXY_TABLET_ID;
- subscriber = CreateConfigSubscriber(tabletId,
- TVector<ui32>({1, 2}),
- runtime.Sender);
- }
- runtime.Register(subscriber, 0);
-
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvReplaceConfigSubscriptionsResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply1->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
- ui64 id1 = reply1->Record.GetSubscriptionId();
-
- CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id1,
- runtime.GetNodeId(0), FQDNHostName(), "<multiple>", "type1",
- tabletId, serviceId, {{1, 2}});
- }
-
- Y_UNIT_TEST(TestConfigSubscriberAutoTenantMultipleTenants) {
- TestConfigSubscriberAutoTenantMultipleTenantsBase(false);
- TestConfigSubscriberAutoTenantMultipleTenantsBase(true);
- }
-
- void TestConfigSubscriberAutoTenantDomainBase(bool useService)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
+ subscriber = CreateConfigSubscriber(serviceId,
+ TVector<ui32>({1, 2}),
+ runtime.Sender);
+ } else {
+ tabletId = CONFIG_PROXY_TABLET_ID;
+ subscriber = CreateConfigSubscriber(tabletId,
+ TVector<ui32>({1, 2}),
+ runtime.Sender);
+ }
+ runtime.Register(subscriber, 0);
+
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvReplaceConfigSubscriptionsResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply1->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
+ ui64 id1 = reply1->Record.GetSubscriptionId();
+
+ CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id1,
+ runtime.GetNodeId(0), FQDNHostName(), "<multiple>", "type1",
+ tabletId, serviceId, {{1, 2}});
+ }
+
+ Y_UNIT_TEST(TestConfigSubscriberAutoTenantMultipleTenants) {
+ TestConfigSubscriberAutoTenantMultipleTenantsBase(false);
+ TestConfigSubscriberAutoTenantMultipleTenantsBase(true);
+ }
+
+ void TestConfigSubscriberAutoTenantDomainBase(bool useService)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
TActorId serviceId;
- ui64 tabletId = 0;
- IActor *subscriber;
-
- if (useService) {
+ ui64 tabletId = 0;
+ IActor *subscriber;
+
+ if (useService) {
serviceId = TActorId(runtime.GetNodeId(0), "configproxy");
- subscriber = CreateConfigSubscriber(serviceId,
- TVector<ui32>({1, 2}),
- runtime.Sender);
- } else {
- tabletId = CONFIG_PROXY_TABLET_ID;
- subscriber = CreateConfigSubscriber(tabletId,
- TVector<ui32>({1, 2}),
- runtime.Sender);
- }
- runtime.Register(subscriber, 0);
-
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvReplaceConfigSubscriptionsResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply1->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
- ui64 id1 = reply1->Record.GetSubscriptionId();
-
- CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id1,
- runtime.GetNodeId(0), FQDNHostName(), CanonizePath(DOMAIN1_NAME), "type1",
- tabletId, serviceId, {{1, 2}});
- }
-
- Y_UNIT_TEST(TestConfigSubscriberAutoTenantDomain) {
- TestConfigSubscriberAutoTenantDomainBase(false);
- TestConfigSubscriberAutoTenantDomainBase(true);
- }
-
- Y_UNIT_TEST(TestConfigSubscriptionEraser) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitializeTestConfigItems();
- StartConfigProxy(runtime);
- TAutoPtr<IEventHandle> handle;
-
- ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
- 1, "host1", "tenant-1", "type1",
+ subscriber = CreateConfigSubscriber(serviceId,
+ TVector<ui32>({1, 2}),
+ runtime.Sender);
+ } else {
+ tabletId = CONFIG_PROXY_TABLET_ID;
+ subscriber = CreateConfigSubscriber(tabletId,
+ TVector<ui32>({1, 2}),
+ runtime.Sender);
+ }
+ runtime.Register(subscriber, 0);
+
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvConsole::TEvReplaceConfigSubscriptionsResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply1->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
+ ui64 id1 = reply1->Record.GetSubscriptionId();
+
+ CheckGetConfigSubscription(runtime, Ydb::StatusIds::SUCCESS, id1,
+ runtime.GetNodeId(0), FQDNHostName(), CanonizePath(DOMAIN1_NAME), "type1",
+ tabletId, serviceId, {{1, 2}});
+ }
+
+ Y_UNIT_TEST(TestConfigSubscriberAutoTenantDomain) {
+ TestConfigSubscriberAutoTenantDomainBase(false);
+ TestConfigSubscriberAutoTenantDomainBase(true);
+ }
+
+ Y_UNIT_TEST(TestConfigSubscriptionEraser) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitializeTestConfigItems();
+ StartConfigProxy(runtime);
+ TAutoPtr<IEventHandle> handle;
+
+ ui64 id1 = CheckAddConfigSubscription(runtime, Ydb::StatusIds::SUCCESS,
+ 1, "host1", "tenant-1", "type1",
CONFIG_PROXY_TABLET_ID, TActorId(), {{1, 2, 3}});
-
- auto *eraser = CreateSubscriptionEraser(id1, runtime.Sender, 123);
- runtime.Register(eraser, 0);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvRemoveConfigSubscriptionResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
- UNIT_ASSERT_VALUES_EQUAL(handle->Cookie, 123);
- }
-}
-
-} // namespace NKikimr
+
+ auto *eraser = CreateSubscriptionEraser(id1, runtime.Sender, 123);
+ runtime.Register(eraser, 0);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvRemoveConfigSubscriptionResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
+ UNIT_ASSERT_VALUES_EQUAL(handle->Cookie, 123);
+ }
+}
+
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/console_ut_tenants.cpp b/ydb/core/cms/console/console_ut_tenants.cpp
index 071197c60b6..57e4820af72 100644
--- a/ydb/core/cms/console/console_ut_tenants.cpp
+++ b/ydb/core/cms/console/console_ut_tenants.cpp
@@ -1,6 +1,6 @@
-#include "console_tenants_manager.h"
-#include "ut_helpers.h"
-
+#include "console_tenants_manager.h"
+#include "ut_helpers.h"
+
#include <ydb/core/base/counters.h>
#include <ydb/core/node_whiteboard/node_whiteboard.h>
#include <ydb/core/base/path.h>
@@ -11,680 +11,680 @@
#include <ydb/core/testlib/tablet_helpers.h>
#include <ydb/core/testlib/tenant_runtime.h>
#include <ydb/core/tx/schemeshard/schemeshard.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-#include <util/random/random.h>
-
-namespace NKikimr {
-
+
+#include <util/random/random.h>
+
+namespace NKikimr {
+
using namespace NSchemeShard;
-using namespace NTenantSlotBroker;
-using namespace NConsole;
-using namespace NConsole::NUT;
-
-namespace {
-
-const TString SLOT1 = "slot-1";
-const TString SLOT2 = "slot-2";
-const TString SLOT3 = "slot-3";
-
-TTenantTestConfig::TTenantPoolConfig DefaultTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}},
- {SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
- {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
- "node-type"
- };
- return res;
-}
-
-TTenantTestConfig::TTenantPoolConfig FirstTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {SLOT1, "unknown", DOMAIN1_NAME, "", {1, 1, 1}} }},
- "node-type"
- };
- return res;
-}
-
-TTenantTestConfig DefaultConsoleTestConfig()
-{
- TTenantTestConfig res = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- false,
- // FakeSchemeShard
- false,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {FirstTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- }},
- // DataCenterCount
- 1
- };
- return res;
-}
-
-TTenantTestConfig ConsoleTestConfig3DC()
-{
- TTenantTestConfig res = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- false,
- // FakeSchemeShard
- false,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- }},
- // DataCenterCount
- 3
- };
- return res;
-}
-
-void CheckAlterTenantSlots(TTenantTestRuntime &runtime, const TString &path,
- ui64 generation, Ydb::StatusIds::StatusCode code,
- TVector<TSlotRequest> add,
+using namespace NTenantSlotBroker;
+using namespace NConsole;
+using namespace NConsole::NUT;
+
+namespace {
+
+const TString SLOT1 = "slot-1";
+const TString SLOT2 = "slot-2";
+const TString SLOT3 = "slot-3";
+
+TTenantTestConfig::TTenantPoolConfig DefaultTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}},
+ {SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
+ {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
+ "node-type"
+ };
+ return res;
+}
+
+TTenantTestConfig::TTenantPoolConfig FirstTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {SLOT1, "unknown", DOMAIN1_NAME, "", {1, 1, 1}} }},
+ "node-type"
+ };
+ return res;
+}
+
+TTenantTestConfig DefaultConsoleTestConfig()
+{
+ TTenantTestConfig res = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ false,
+ // FakeSchemeShard
+ false,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {FirstTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ }},
+ // DataCenterCount
+ 1
+ };
+ return res;
+}
+
+TTenantTestConfig ConsoleTestConfig3DC()
+{
+ TTenantTestConfig res = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ false,
+ // FakeSchemeShard
+ false,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ }},
+ // DataCenterCount
+ 3
+ };
+ return res;
+}
+
+void CheckAlterTenantSlots(TTenantTestRuntime &runtime, const TString &path,
+ ui64 generation, Ydb::StatusIds::StatusCode code,
+ TVector<TSlotRequest> add,
TVector<TSlotRequest> remove,
const TString &idempotencyKey = TString(),
const TVector<std::pair<TString, TString>> attrs = {})
-{
- auto *event = new TEvConsole::TEvAlterTenantRequest;
- event->Record.MutableRequest()->set_path(path);
- event->Record.MutableRequest()->set_generation(generation);
- for (auto &slot : add) {
- auto &unit = *event->Record.MutableRequest()->add_computational_units_to_add();
- unit.set_unit_kind(slot.Type);
- unit.set_availability_zone(slot.Zone);
- unit.set_count(slot.Count);
- }
- for (auto &slot : remove) {
- auto &unit = *event->Record.MutableRequest()->add_computational_units_to_remove();
- unit.set_unit_kind(slot.Type);
- unit.set_availability_zone(slot.Zone);
- unit.set_count(slot.Count);
- }
+{
+ auto *event = new TEvConsole::TEvAlterTenantRequest;
+ event->Record.MutableRequest()->set_path(path);
+ event->Record.MutableRequest()->set_generation(generation);
+ for (auto &slot : add) {
+ auto &unit = *event->Record.MutableRequest()->add_computational_units_to_add();
+ unit.set_unit_kind(slot.Type);
+ unit.set_availability_zone(slot.Zone);
+ unit.set_count(slot.Count);
+ }
+ for (auto &slot : remove) {
+ auto &unit = *event->Record.MutableRequest()->add_computational_units_to_remove();
+ unit.set_unit_kind(slot.Type);
+ unit.set_availability_zone(slot.Zone);
+ unit.set_count(slot.Count);
+ }
for (const auto& [key, value] : attrs) {
(*event->Record.MutableRequest()->mutable_alter_attributes())[key] = value;
}
if (idempotencyKey) {
event->Record.MutableRequest()->set_idempotency_key(idempotencyKey);
}
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvAlterTenantResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().status(), code);
-}
-
-void CheckAlterTenantSlots(TTenantTestRuntime &runtime, const TString &path,
- Ydb::StatusIds::StatusCode code,
- TVector<TSlotRequest> add,
- TVector<TSlotRequest> remove)
-{
- CheckAlterTenantSlots(runtime, path, 0, code, std::move(add), std::move(remove));
-}
-
-void CheckAlterRegisteredUnits(TTenantTestRuntime &runtime, const TString &path,
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvAlterTenantResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().status(), code);
+}
+
+void CheckAlterTenantSlots(TTenantTestRuntime &runtime, const TString &path,
+ Ydb::StatusIds::StatusCode code,
+ TVector<TSlotRequest> add,
+ TVector<TSlotRequest> remove)
+{
+ CheckAlterTenantSlots(runtime, path, 0, code, std::move(add), std::move(remove));
+}
+
+void CheckAlterRegisteredUnits(TTenantTestRuntime &runtime, const TString &path,
Ydb::StatusIds::StatusCode code,
- TVector<TUnitRegistration> registerUnits,
- TVector<TUnitRegistration> deregisterUnits)
-{
- auto *event = new TEvConsole::TEvAlterTenantRequest;
- event->Record.MutableRequest()->set_path(path);
- for (auto &unit : registerUnits) {
- auto &rec = *event->Record.MutableRequest()->add_computational_units_to_register();
- rec.set_host(unit.Host);
- rec.set_port(unit.Port);
- rec.set_unit_kind(unit.Kind);
- }
- for (auto &unit : deregisterUnits) {
- auto &rec = *event->Record.MutableRequest()->add_computational_units_to_deregister();
- rec.set_host(unit.Host);
- rec.set_port(unit.Port);
- rec.set_unit_kind(unit.Kind);
- }
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvAlterTenantResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().status(), code);
-}
-
-void CheckAlterTenantPools(TTenantTestRuntime &runtime,
- const TString &path,
- const TString &token,
- Ydb::StatusIds::StatusCode code,
- TVector<TPoolAllocation> add,
- bool hasModifications = true)
-{
- auto *event = new TEvConsole::TEvAlterTenantRequest;
- event->Record.MutableRequest()->set_path(path);
- if (token)
- event->Record.SetUserToken(token);
- for (auto &pool : add) {
- auto &unit = *event->Record.MutableRequest()->add_storage_units_to_add();
- unit.set_unit_kind(pool.PoolType);
- unit.set_count(pool.PoolSize);
- }
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
-
+ TVector<TUnitRegistration> registerUnits,
+ TVector<TUnitRegistration> deregisterUnits)
+{
+ auto *event = new TEvConsole::TEvAlterTenantRequest;
+ event->Record.MutableRequest()->set_path(path);
+ for (auto &unit : registerUnits) {
+ auto &rec = *event->Record.MutableRequest()->add_computational_units_to_register();
+ rec.set_host(unit.Host);
+ rec.set_port(unit.Port);
+ rec.set_unit_kind(unit.Kind);
+ }
+ for (auto &unit : deregisterUnits) {
+ auto &rec = *event->Record.MutableRequest()->add_computational_units_to_deregister();
+ rec.set_host(unit.Host);
+ rec.set_port(unit.Port);
+ rec.set_unit_kind(unit.Kind);
+ }
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvAlterTenantResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().status(), code);
+}
+
+void CheckAlterTenantPools(TTenantTestRuntime &runtime,
+ const TString &path,
+ const TString &token,
+ Ydb::StatusIds::StatusCode code,
+ TVector<TPoolAllocation> add,
+ bool hasModifications = true)
+{
+ auto *event = new TEvConsole::TEvAlterTenantRequest;
+ event->Record.MutableRequest()->set_path(path);
+ if (token)
+ event->Record.SetUserToken(token);
+ for (auto &pool : add) {
+ auto &unit = *event->Record.MutableRequest()->add_storage_units_to_add();
+ unit.set_unit_kind(pool.PoolType);
+ unit.set_count(pool.PoolSize);
+ }
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+
if (hasModifications && code == Ydb::StatusIds::SUCCESS) {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvPoolAllocated);
- runtime.DispatchEvents(options);
- }
-
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvAlterTenantResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().status(), code);
-}
-
-void CheckAlterTenantPools(TTenantTestRuntime &runtime,
- const TString &path,
- Ydb::StatusIds::StatusCode code,
- TVector<TPoolAllocation> add,
- bool hasModifications = true)
-{
- CheckAlterTenantPools(runtime, path, "", code, std::move(add), hasModifications);
-}
-
-void CheckListTenants(TTenantTestRuntime &runtime, TVector<TString> tenants)
-{
- THashSet<TString> paths;
- for (auto &tenant : tenants)
- paths.insert(CanonizePath(tenant));
-
- auto *event = new TEvConsole::TEvListTenantsRequest;
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvListTenantsResponse>(handle);
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvPoolAllocated);
+ runtime.DispatchEvents(options);
+ }
+
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvAlterTenantResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().status(), code);
+}
+
+void CheckAlterTenantPools(TTenantTestRuntime &runtime,
+ const TString &path,
+ Ydb::StatusIds::StatusCode code,
+ TVector<TPoolAllocation> add,
+ bool hasModifications = true)
+{
+ CheckAlterTenantPools(runtime, path, "", code, std::move(add), hasModifications);
+}
+
+void CheckListTenants(TTenantTestRuntime &runtime, TVector<TString> tenants)
+{
+ THashSet<TString> paths;
+ for (auto &tenant : tenants)
+ paths.insert(CanonizePath(tenant));
+
+ auto *event = new TEvConsole::TEvListTenantsRequest;
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvListTenantsResponse>(handle);
Ydb::Cms::ListDatabasesResult result;
- reply->Record.GetResponse().operation().result().UnpackTo(&result);
- for (auto &tenant : result.paths()) {
+ reply->Record.GetResponse().operation().result().UnpackTo(&result);
+ for (auto &tenant : result.paths()) {
UNIT_ASSERT(paths.contains(tenant));
- paths.erase(tenant);
- }
- UNIT_ASSERT(paths.empty());
-}
-
-NKikimrConsole::TConfig GetCurrentConfig(TTenantTestRuntime &runtime)
-{
- runtime.SendToConsole(new TEvConsole::TEvGetConfigRequest);
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetConfigResponse>(handle);
- return reply->Record.GetConfig();
-}
-
-void CheckGetConfig(TTenantTestRuntime &runtime,
- const NKikimrConsole::TConfig &config)
-{
- runtime.SendToConsole(new TEvConsole::TEvGetConfigRequest);
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetConfigResponse>(handle);
- auto &rec = reply->Record.GetConfig();
- UNIT_ASSERT_VALUES_EQUAL(rec.DebugString(), config.DebugString());
-}
-
-void CheckSetConfig(TTenantTestRuntime &runtime,
- const NKikimrConsole::TConfig &config,
- Ydb::StatusIds::StatusCode code,
- NKikimrConsole::TConfigItem::EMergeStrategy merge = NKikimrConsole::TConfigItem::OVERWRITE)
-{
- runtime.SendToConsole(new TEvConsole::TEvSetConfigRequest(config, merge));
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvSetConfigResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
-}
-
+ paths.erase(tenant);
+ }
+ UNIT_ASSERT(paths.empty());
+}
+
+NKikimrConsole::TConfig GetCurrentConfig(TTenantTestRuntime &runtime)
+{
+ runtime.SendToConsole(new TEvConsole::TEvGetConfigRequest);
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetConfigResponse>(handle);
+ return reply->Record.GetConfig();
+}
+
+void CheckGetConfig(TTenantTestRuntime &runtime,
+ const NKikimrConsole::TConfig &config)
+{
+ runtime.SendToConsole(new TEvConsole::TEvGetConfigRequest);
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetConfigResponse>(handle);
+ auto &rec = reply->Record.GetConfig();
+ UNIT_ASSERT_VALUES_EQUAL(rec.DebugString(), config.DebugString());
+}
+
+void CheckSetConfig(TTenantTestRuntime &runtime,
+ const NKikimrConsole::TConfig &config,
+ Ydb::StatusIds::StatusCode code,
+ NKikimrConsole::TConfigItem::EMergeStrategy merge = NKikimrConsole::TConfigItem::OVERWRITE)
+{
+ runtime.SendToConsole(new TEvConsole::TEvSetConfigRequest(config, merge));
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvSetConfigResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
+}
+
TString SendTenantCreationCommand(
TTenantTestRuntime &runtime, const TString &name,
const TString &idempotencyKey = TString(),
TMaybe<Ydb::StatusIds::StatusCode> expectedStatus = Nothing())
-{
- auto *request = new TEvConsole::TEvCreateTenantRequest;
- request->Record.MutableRequest()->set_path(name);
- auto &unit = *request->Record.MutableRequest()->mutable_resources()->add_storage_units();
- unit.set_unit_kind("hdd");
- unit.set_count(1);
- auto &comp = *request->Record.MutableRequest()->mutable_resources()->add_computational_units();
- comp.set_unit_kind(SLOT1_TYPE);
- comp.set_availability_zone(ZONE1);
- comp.set_count(1);
-
+{
+ auto *request = new TEvConsole::TEvCreateTenantRequest;
+ request->Record.MutableRequest()->set_path(name);
+ auto &unit = *request->Record.MutableRequest()->mutable_resources()->add_storage_units();
+ unit.set_unit_kind("hdd");
+ unit.set_count(1);
+ auto &comp = *request->Record.MutableRequest()->mutable_resources()->add_computational_units();
+ comp.set_unit_kind(SLOT1_TYPE);
+ comp.set_availability_zone(ZONE1);
+ comp.set_count(1);
+
if (idempotencyKey) {
request->Record.MutableRequest()->set_idempotency_key(idempotencyKey);
}
- runtime.SendToConsole(request);
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvCreateTenantResponse>(handle);
-
+ runtime.SendToConsole(request);
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvCreateTenantResponse>(handle);
+
if (expectedStatus) {
UNIT_ASSERT(reply->Record.GetResponse().operation().ready());
UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().status(), *expectedStatus);
return { };
}
- UNIT_ASSERT(!reply->Record.GetResponse().operation().ready());
- return reply->Record.GetResponse().operation().id();
-}
-
-TString SendTenantRemovalCommand(TTenantTestRuntime &runtime, const TString &name)
-{
- auto *request = new TEvConsole::TEvRemoveTenantRequest;
- request->Record.MutableRequest()->set_path(name);
-
- runtime.SendToConsole(request);
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvRemoveTenantResponse>(handle);
-
- UNIT_ASSERT(!reply->Record.GetResponse().operation().ready());
- return reply->Record.GetResponse().operation().id();
-}
-
-void CheckNotificationRequest(TTenantTestRuntime &runtime, const TString &id)
-{
- auto *request = new TEvConsole::TEvNotifyOperationCompletionRequest;
- request->Record.MutableRequest()->set_id(id);
-
- runtime.SendToConsole(request);
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvNotifyOperationCompletionResponse>(handle);
- UNIT_ASSERT(!reply->Record.GetResponse().operation().ready());
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().id(), id);
-}
-
-void CheckNotificationRequest(TTenantTestRuntime &runtime, const TString &id, Ydb::StatusIds::StatusCode code)
-{
- auto *request = new TEvConsole::TEvNotifyOperationCompletionRequest;
- request->Record.MutableRequest()->set_id(id);
-
- runtime.SendToConsole(request);
- TAutoPtr<IEventHandle> handle;
- auto replies = runtime.GrabEdgeEventsRethrow<TEvConsole::TEvNotifyOperationCompletionResponse,
- TEvConsole::TEvOperationCompletionNotification>(handle);
- UNIT_ASSERT(!std::get<0>(replies));
- UNIT_ASSERT(std::get<1>(replies)->Record.GetResponse().operation().ready());
- UNIT_ASSERT_VALUES_EQUAL(std::get<1>(replies)->Record.GetResponse().operation().id(), id);
- UNIT_ASSERT_VALUES_EQUAL(std::get<1>(replies)->Record.GetResponse().operation().status(), code);
-}
-
-void CheckCounter(TTenantTestRuntime &runtime,
- TVector<std::pair<TString, TString>> groups,
- TTenantsManager::ECounter counter,
- ui64 value)
-{
- NMonitoring::TDynamicCounterPtr counters;
- for (ui32 i = 0; i < runtime.GetNodeCount() && !counters; ++i) {
- auto tablets = GetServiceCounters(runtime.GetDynamicCounters(i), "tablets");
- counters = tablets->FindSubgroup("type", "CONSOLE");
- }
-
- UNIT_ASSERT(counters);
- for (auto &pr : groups) {
- counters = counters->FindSubgroup(pr.first, pr.second);
- UNIT_ASSERT(counters);
- }
-
- UNIT_ASSERT_VALUES_EQUAL(counters->GetCounter(TTenantsManager::TCounters::SensorName(counter), TTenantsManager::TCounters::IsDeriv(counter))->Val(), value);
-}
-
-void CheckTenantGeneration(TTenantTestRuntime &runtime,
- const TString &path,
- ui64 generation)
-{
- auto *event = new TEvConsole::TEvGetTenantStatusRequest;
- event->Record.MutableRequest()->set_path(path);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetTenantStatusResponse>(handle);
- auto &operation = reply->Record.GetResponse().operation();
- UNIT_ASSERT_VALUES_EQUAL(operation.status(), Ydb::StatusIds::SUCCESS);
-
- Ydb::Cms::GetDatabaseStatusResult status;
- UNIT_ASSERT(operation.result().UnpackTo(&status));
-
- UNIT_ASSERT_VALUES_EQUAL(status.generation(), generation);
-}
-
-void CheckPoolScope(TTenantTestRuntime &runtime,
- const TString &name)
-{
+ UNIT_ASSERT(!reply->Record.GetResponse().operation().ready());
+ return reply->Record.GetResponse().operation().id();
+}
+
+TString SendTenantRemovalCommand(TTenantTestRuntime &runtime, const TString &name)
+{
+ auto *request = new TEvConsole::TEvRemoveTenantRequest;
+ request->Record.MutableRequest()->set_path(name);
+
+ runtime.SendToConsole(request);
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvRemoveTenantResponse>(handle);
+
+ UNIT_ASSERT(!reply->Record.GetResponse().operation().ready());
+ return reply->Record.GetResponse().operation().id();
+}
+
+void CheckNotificationRequest(TTenantTestRuntime &runtime, const TString &id)
+{
+ auto *request = new TEvConsole::TEvNotifyOperationCompletionRequest;
+ request->Record.MutableRequest()->set_id(id);
+
+ runtime.SendToConsole(request);
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvNotifyOperationCompletionResponse>(handle);
+ UNIT_ASSERT(!reply->Record.GetResponse().operation().ready());
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().id(), id);
+}
+
+void CheckNotificationRequest(TTenantTestRuntime &runtime, const TString &id, Ydb::StatusIds::StatusCode code)
+{
+ auto *request = new TEvConsole::TEvNotifyOperationCompletionRequest;
+ request->Record.MutableRequest()->set_id(id);
+
+ runtime.SendToConsole(request);
+ TAutoPtr<IEventHandle> handle;
+ auto replies = runtime.GrabEdgeEventsRethrow<TEvConsole::TEvNotifyOperationCompletionResponse,
+ TEvConsole::TEvOperationCompletionNotification>(handle);
+ UNIT_ASSERT(!std::get<0>(replies));
+ UNIT_ASSERT(std::get<1>(replies)->Record.GetResponse().operation().ready());
+ UNIT_ASSERT_VALUES_EQUAL(std::get<1>(replies)->Record.GetResponse().operation().id(), id);
+ UNIT_ASSERT_VALUES_EQUAL(std::get<1>(replies)->Record.GetResponse().operation().status(), code);
+}
+
+void CheckCounter(TTenantTestRuntime &runtime,
+ TVector<std::pair<TString, TString>> groups,
+ TTenantsManager::ECounter counter,
+ ui64 value)
+{
+ NMonitoring::TDynamicCounterPtr counters;
+ for (ui32 i = 0; i < runtime.GetNodeCount() && !counters; ++i) {
+ auto tablets = GetServiceCounters(runtime.GetDynamicCounters(i), "tablets");
+ counters = tablets->FindSubgroup("type", "CONSOLE");
+ }
+
+ UNIT_ASSERT(counters);
+ for (auto &pr : groups) {
+ counters = counters->FindSubgroup(pr.first, pr.second);
+ UNIT_ASSERT(counters);
+ }
+
+ UNIT_ASSERT_VALUES_EQUAL(counters->GetCounter(TTenantsManager::TCounters::SensorName(counter), TTenantsManager::TCounters::IsDeriv(counter))->Val(), value);
+}
+
+void CheckTenantGeneration(TTenantTestRuntime &runtime,
+ const TString &path,
+ ui64 generation)
+{
+ auto *event = new TEvConsole::TEvGetTenantStatusRequest;
+ event->Record.MutableRequest()->set_path(path);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetTenantStatusResponse>(handle);
+ auto &operation = reply->Record.GetResponse().operation();
+ UNIT_ASSERT_VALUES_EQUAL(operation.status(), Ydb::StatusIds::SUCCESS);
+
+ Ydb::Cms::GetDatabaseStatusResult status;
+ UNIT_ASSERT(operation.result().UnpackTo(&status));
+
+ UNIT_ASSERT_VALUES_EQUAL(status.generation(), generation);
+}
+
+void CheckPoolScope(TTenantTestRuntime &runtime,
+ const TString &name)
+{
auto request = MakeHolder<TEvBlobStorage::TEvControllerConfigRequest>();
- auto &read = *request->Record.MutableRequest()->AddCommand()->MutableReadStoragePool();
- read.SetBoxId(1);
- read.AddName(name);
-
- NTabletPipe::TClientConfig pipeConfig;
+ auto &read = *request->Record.MutableRequest()->AddCommand()->MutableReadStoragePool();
+ read.SetBoxId(1);
+ read.AddName(name);
+
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = NTabletPipe::TClientRetryPolicy::WithRetries();
- runtime.SendToPipe(MakeBSControllerID(0), runtime.Sender, request.Release(), 0, pipeConfig);
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvBlobStorage::TEvControllerConfigResponse>(handle);
- const auto &scope = reply->Record.GetResponse().GetStatus(0).GetStoragePool(0).GetScopeId();
- UNIT_ASSERT(scope.GetX1() != 0);
- UNIT_ASSERT(scope.GetX2() != 0);
-}
-
-void RestartConsole(TTenantTestRuntime &runtime)
-{
- runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- runtime.DispatchEvents(options);
-}
-
-struct CatchPoolEvent {
- CatchPoolEvent(TVector<TAutoPtr<IEventHandle>> &captured)
- : Captured(captured)
- {
- }
-
+ runtime.SendToPipe(MakeBSControllerID(0), runtime.Sender, request.Release(), 0, pipeConfig);
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvBlobStorage::TEvControllerConfigResponse>(handle);
+ const auto &scope = reply->Record.GetResponse().GetStatus(0).GetStoragePool(0).GetScopeId();
+ UNIT_ASSERT(scope.GetX1() != 0);
+ UNIT_ASSERT(scope.GetX2() != 0);
+}
+
+void RestartConsole(TTenantTestRuntime &runtime)
+{
+ runtime.Register(CreateTabletKiller(MakeConsoleID(0)));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ runtime.DispatchEvents(options);
+}
+
+struct CatchPoolEvent {
+ CatchPoolEvent(TVector<TAutoPtr<IEventHandle>> &captured)
+ : Captured(captured)
+ {
+ }
+
TTenantTestRuntime::EEventAction operator()(TTestActorRuntimeBase&, TAutoPtr<IEventHandle> &ev)
- {
- if (ev->HasEvent()
- && (dynamic_cast<TTenantsManager::TEvPrivate::TEvPoolAllocated*>(ev->GetBase())
- || dynamic_cast<TTenantsManager::TEvPrivate::TEvPoolFailed*>(ev->GetBase())
- || dynamic_cast<TTenantsManager::TEvPrivate::TEvPoolDeleted*>(ev->GetBase()))) {
- Captured.emplace_back(std::move(ev));
- return TTestActorRuntime::EEventAction::DROP;
- }
- return TTestActorRuntime::EEventAction::PROCESS;
- }
-
- TVector<TAutoPtr<IEventHandle>> &Captured;
-};
-
-void SendCaptured(TTenantTestRuntime &runtime, TVector<TAutoPtr<IEventHandle>> &events)
-{
- for (auto &ev : events)
- runtime.Send(ev.Release());
- events.clear();
-}
-
-} // anonymous namespace
-
-Y_UNIT_TEST_SUITE(TConsoleTxProcessorTests) {
- class TTestTransaction : public ITransaction {
- public:
- TTestTransaction(ui64 no, TTxProcessor::TPtr processor)
- : No(no)
- , Processor(processor)
- {
- }
-
- bool Execute(TTransactionContext &, const TActorContext &) override
- {
- return true;
- }
-
- bool Execute(const THashSet<ui64> &allowed)
- {
+ {
+ if (ev->HasEvent()
+ && (dynamic_cast<TTenantsManager::TEvPrivate::TEvPoolAllocated*>(ev->GetBase())
+ || dynamic_cast<TTenantsManager::TEvPrivate::TEvPoolFailed*>(ev->GetBase())
+ || dynamic_cast<TTenantsManager::TEvPrivate::TEvPoolDeleted*>(ev->GetBase()))) {
+ Captured.emplace_back(std::move(ev));
+ return TTestActorRuntime::EEventAction::DROP;
+ }
+ return TTestActorRuntime::EEventAction::PROCESS;
+ }
+
+ TVector<TAutoPtr<IEventHandle>> &Captured;
+};
+
+void SendCaptured(TTenantTestRuntime &runtime, TVector<TAutoPtr<IEventHandle>> &events)
+{
+ for (auto &ev : events)
+ runtime.Send(ev.Release());
+ events.clear();
+}
+
+} // anonymous namespace
+
+Y_UNIT_TEST_SUITE(TConsoleTxProcessorTests) {
+ class TTestTransaction : public ITransaction {
+ public:
+ TTestTransaction(ui64 no, TTxProcessor::TPtr processor)
+ : No(no)
+ , Processor(processor)
+ {
+ }
+
+ bool Execute(TTransactionContext &, const TActorContext &) override
+ {
+ return true;
+ }
+
+ bool Execute(const THashSet<ui64> &allowed)
+ {
return allowed.contains(No);
- }
-
- void Complete(const TActorContext &ctx) override
- {
- Processor->TxCompleted(this, ctx);
- }
-
- ui64 No;
- TTxProcessor::TPtr Processor;
- };
-
- class TTestExecutor : public ITxExecutor {
- public:
- TTestExecutor()
- {
- }
-
- void Execute(ITransaction *transaction, const TActorContext &ctx) override
- {
-
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ Processor->TxCompleted(this, ctx);
+ }
+
+ ui64 No;
+ TTxProcessor::TPtr Processor;
+ };
+
+ class TTestExecutor : public ITxExecutor {
+ public:
+ TTestExecutor()
+ {
+ }
+
+ void Execute(ITransaction *transaction, const TActorContext &ctx) override
+ {
+
THolder<TTestTransaction> tx{dynamic_cast<TTestTransaction*>(transaction)};
- if (tx->Execute(Allowed)) {
- Result.push_back(tx->No);
- tx->Complete(ctx);
- } else {
- Postponed.push_back(std::move(tx));
- }
- }
-
- void Run(const TActorContext &ctx)
- {
- for (auto it = Postponed.begin(); it != Postponed.end(); ) {
- auto cur = it;
- ++it;
-
- if ((*cur)->Execute(Allowed)) {
- Result.push_back((*cur)->No);
- (*cur)->Complete(ctx);
- Postponed.erase(cur);
- }
- }
- }
-
- THashSet<ui64> Allowed;
- TList<THolder<TTestTransaction>> Postponed;
- TVector<ui64> Result;
- };
-
- class TTxTestActor : public TActorBootstrapped<TTxTestActor> {
- public:
+ if (tx->Execute(Allowed)) {
+ Result.push_back(tx->No);
+ tx->Complete(ctx);
+ } else {
+ Postponed.push_back(std::move(tx));
+ }
+ }
+
+ void Run(const TActorContext &ctx)
+ {
+ for (auto it = Postponed.begin(); it != Postponed.end(); ) {
+ auto cur = it;
+ ++it;
+
+ if ((*cur)->Execute(Allowed)) {
+ Result.push_back((*cur)->No);
+ (*cur)->Complete(ctx);
+ Postponed.erase(cur);
+ }
+ }
+ }
+
+ THashSet<ui64> Allowed;
+ TList<THolder<TTestTransaction>> Postponed;
+ TVector<ui64> Result;
+ };
+
+ class TTxTestActor : public TActorBootstrapped<TTxTestActor> {
+ public:
TTxTestActor(TActorId sink, std::function<void(const TActorContext &)> testFunction)
- : Sink(sink)
- , TestFunction(testFunction)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- TestFunction(ctx);
- ctx.Send(Sink, new TEvents::TEvWakeup);
- }
- private:
+ : Sink(sink)
+ , TestFunction(testFunction)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ TestFunction(ctx);
+ ctx.Send(Sink, new TEvents::TEvWakeup);
+ }
+ private:
TActorId Sink;
- std::function<void(const TActorContext &)> TestFunction;
- };
-
- void TestTxProcessorSingle(const TActorContext &ctx)
- {
- TTestExecutor executor;
- TTxProcessor::TPtr processor = new TTxProcessor(executor, "proc", NKikimrServices::CMS_CONFIGS);
- processor->ProcessTx(new TTestTransaction(1, processor), ctx);
- processor->ProcessTx(new TTestTransaction(2, processor), ctx);
- processor->ProcessTx(new TTestTransaction(3, processor), ctx);
- executor.Allowed.insert(1);
- executor.Allowed.insert(2);
- executor.Allowed.insert(3);
- executor.Run(ctx);
- UNIT_ASSERT_VALUES_EQUAL(JoinSeq(", ", executor.Result), "1, 2, 3");
- }
-
- Y_UNIT_TEST(TestTxProcessorSingle) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- runtime.Register(new TTxTestActor(runtime.Sender, TestTxProcessorSingle));
- TAutoPtr<IEventHandle> handle;
- runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
- }
-
- void TestTxProcessorSubProcessor(const TActorContext &ctx)
- {
- TTestExecutor executor;
- TTxProcessor::TPtr processor = new TTxProcessor(executor, "proc", 0);
- auto sub1 = processor->GetSubProcessor("sub1", ctx, false);
- sub1->ProcessTx(new TTestTransaction(1, sub1), ctx);
- auto sub2 = processor->GetSubProcessor("sub2", ctx, false);
- sub2->ProcessTx(new TTestTransaction(2, sub2), ctx);
- processor->ProcessTx(new TTestTransaction(3, processor), ctx);
- sub1->ProcessTx(new TTestTransaction(4, sub1), ctx);
- sub2->ProcessTx(new TTestTransaction(5, sub2), ctx);
- executor.Allowed.insert(1);
- executor.Allowed.insert(2);
- executor.Allowed.insert(3);
- executor.Allowed.insert(4);
- executor.Allowed.insert(5);
- executor.Run(ctx);
- UNIT_ASSERT_VALUES_EQUAL(JoinSeq(", ", executor.Result), "1, 2, 3, 4, 5");
- UNIT_ASSERT(processor->GetSubProcessor("sub1", ctx) == sub1);
- UNIT_ASSERT(processor->GetSubProcessor("sub2", ctx) == sub2);
- }
-
- Y_UNIT_TEST(TestTxProcessorSubProcessor) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- runtime.Register(new TTxTestActor(runtime.Sender, TestTxProcessorSubProcessor));
- TAutoPtr<IEventHandle> handle;
- runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
- }
-
- void TestTxProcessorTemporary(const TActorContext &ctx)
- {
- TTestExecutor executor;
- TTxProcessor::TPtr processor = new TTxProcessor(executor, "proc", 0);
- processor->ProcessTx(new TTestTransaction(1, processor), ctx);
- auto sub = processor->GetSubProcessor("sub", ctx);
- sub->ProcessTx(new TTestTransaction(2, sub), ctx);
- processor->ProcessTx(new TTestTransaction(3, processor), ctx);
- executor.Allowed.insert(1);
- executor.Allowed.insert(2);
- executor.Allowed.insert(3);
- executor.Run(ctx);
- UNIT_ASSERT_VALUES_EQUAL(JoinSeq(", ", executor.Result), "1, 3, 2");
- UNIT_ASSERT(processor->GetSubProcessor("sub", ctx) != sub);
- }
-
- Y_UNIT_TEST(TestTxProcessorTemporary) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- runtime.Register(new TTxTestActor(runtime.Sender, TestTxProcessorTemporary));
- TAutoPtr<IEventHandle> handle;
- runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
- }
-
- void TestTxProcessorRandom(const TActorContext &ctx)
- {
- TTestExecutor executor;
- TTxProcessor::TPtr processor = new TTxProcessor(executor, "proc", 0);
- TVector<ui64> postponed;
-
-#ifndef NDEBUG
-# define COUNT 1000000
-#else
-# define COUNT 10000000
-#endif
- for (ui64 no = 1; no <= COUNT; ++no) {
- ui64 i = RandomNumber<ui64>(6);
- TTxProcessor::TPtr proc;
- if (!i)
- proc = processor;
- else
- proc = processor->GetSubProcessor(ToString(i), ctx, false);
-
- if (RandomNumber<ui64>(1))
- proc = proc->GetSubProcessor(ToString(RandomNumber<ui64>(5)), ctx);
-
- proc->ProcessTx(new TTestTransaction(no, proc), ctx);
-
- if (RandomNumber<ui64>(4) == 3)
- executor.Allowed.insert(no);
- else
- postponed.push_back(no);
-
- if (postponed.size() >= 2) {
- for (i = 0; i < RandomNumber<ui64>(postponed.size() / 2); ++i) {
- auto it = postponed.begin() + RandomNumber<ui64>(postponed.size());
- executor.Allowed.insert(*it);
- postponed.erase(it);
- }
- }
-
- executor.Run(ctx);
- }
- for (auto no : postponed)
- executor.Allowed.insert(no);
- executor.Run(ctx);
-
- UNIT_ASSERT_VALUES_EQUAL(executor.Result.size(), COUNT);
- }
-
- Y_UNIT_TEST(TestTxProcessorRandom) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- runtime.Register(new TTxTestActor(runtime.Sender, TestTxProcessorRandom));
- TAutoPtr<IEventHandle> handle;
- runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
- }
-}
-
+ std::function<void(const TActorContext &)> TestFunction;
+ };
+
+ void TestTxProcessorSingle(const TActorContext &ctx)
+ {
+ TTestExecutor executor;
+ TTxProcessor::TPtr processor = new TTxProcessor(executor, "proc", NKikimrServices::CMS_CONFIGS);
+ processor->ProcessTx(new TTestTransaction(1, processor), ctx);
+ processor->ProcessTx(new TTestTransaction(2, processor), ctx);
+ processor->ProcessTx(new TTestTransaction(3, processor), ctx);
+ executor.Allowed.insert(1);
+ executor.Allowed.insert(2);
+ executor.Allowed.insert(3);
+ executor.Run(ctx);
+ UNIT_ASSERT_VALUES_EQUAL(JoinSeq(", ", executor.Result), "1, 2, 3");
+ }
+
+ Y_UNIT_TEST(TestTxProcessorSingle) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ runtime.Register(new TTxTestActor(runtime.Sender, TestTxProcessorSingle));
+ TAutoPtr<IEventHandle> handle;
+ runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+ }
+
+ void TestTxProcessorSubProcessor(const TActorContext &ctx)
+ {
+ TTestExecutor executor;
+ TTxProcessor::TPtr processor = new TTxProcessor(executor, "proc", 0);
+ auto sub1 = processor->GetSubProcessor("sub1", ctx, false);
+ sub1->ProcessTx(new TTestTransaction(1, sub1), ctx);
+ auto sub2 = processor->GetSubProcessor("sub2", ctx, false);
+ sub2->ProcessTx(new TTestTransaction(2, sub2), ctx);
+ processor->ProcessTx(new TTestTransaction(3, processor), ctx);
+ sub1->ProcessTx(new TTestTransaction(4, sub1), ctx);
+ sub2->ProcessTx(new TTestTransaction(5, sub2), ctx);
+ executor.Allowed.insert(1);
+ executor.Allowed.insert(2);
+ executor.Allowed.insert(3);
+ executor.Allowed.insert(4);
+ executor.Allowed.insert(5);
+ executor.Run(ctx);
+ UNIT_ASSERT_VALUES_EQUAL(JoinSeq(", ", executor.Result), "1, 2, 3, 4, 5");
+ UNIT_ASSERT(processor->GetSubProcessor("sub1", ctx) == sub1);
+ UNIT_ASSERT(processor->GetSubProcessor("sub2", ctx) == sub2);
+ }
+
+ Y_UNIT_TEST(TestTxProcessorSubProcessor) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ runtime.Register(new TTxTestActor(runtime.Sender, TestTxProcessorSubProcessor));
+ TAutoPtr<IEventHandle> handle;
+ runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+ }
+
+ void TestTxProcessorTemporary(const TActorContext &ctx)
+ {
+ TTestExecutor executor;
+ TTxProcessor::TPtr processor = new TTxProcessor(executor, "proc", 0);
+ processor->ProcessTx(new TTestTransaction(1, processor), ctx);
+ auto sub = processor->GetSubProcessor("sub", ctx);
+ sub->ProcessTx(new TTestTransaction(2, sub), ctx);
+ processor->ProcessTx(new TTestTransaction(3, processor), ctx);
+ executor.Allowed.insert(1);
+ executor.Allowed.insert(2);
+ executor.Allowed.insert(3);
+ executor.Run(ctx);
+ UNIT_ASSERT_VALUES_EQUAL(JoinSeq(", ", executor.Result), "1, 3, 2");
+ UNIT_ASSERT(processor->GetSubProcessor("sub", ctx) != sub);
+ }
+
+ Y_UNIT_TEST(TestTxProcessorTemporary) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ runtime.Register(new TTxTestActor(runtime.Sender, TestTxProcessorTemporary));
+ TAutoPtr<IEventHandle> handle;
+ runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+ }
+
+ void TestTxProcessorRandom(const TActorContext &ctx)
+ {
+ TTestExecutor executor;
+ TTxProcessor::TPtr processor = new TTxProcessor(executor, "proc", 0);
+ TVector<ui64> postponed;
+
+#ifndef NDEBUG
+# define COUNT 1000000
+#else
+# define COUNT 10000000
+#endif
+ for (ui64 no = 1; no <= COUNT; ++no) {
+ ui64 i = RandomNumber<ui64>(6);
+ TTxProcessor::TPtr proc;
+ if (!i)
+ proc = processor;
+ else
+ proc = processor->GetSubProcessor(ToString(i), ctx, false);
+
+ if (RandomNumber<ui64>(1))
+ proc = proc->GetSubProcessor(ToString(RandomNumber<ui64>(5)), ctx);
+
+ proc->ProcessTx(new TTestTransaction(no, proc), ctx);
+
+ if (RandomNumber<ui64>(4) == 3)
+ executor.Allowed.insert(no);
+ else
+ postponed.push_back(no);
+
+ if (postponed.size() >= 2) {
+ for (i = 0; i < RandomNumber<ui64>(postponed.size() / 2); ++i) {
+ auto it = postponed.begin() + RandomNumber<ui64>(postponed.size());
+ executor.Allowed.insert(*it);
+ postponed.erase(it);
+ }
+ }
+
+ executor.Run(ctx);
+ }
+ for (auto no : postponed)
+ executor.Allowed.insert(no);
+ executor.Run(ctx);
+
+ UNIT_ASSERT_VALUES_EQUAL(executor.Result.size(), COUNT);
+ }
+
+ Y_UNIT_TEST(TestTxProcessorRandom) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ runtime.Register(new TTxTestActor(runtime.Sender, TestTxProcessorRandom));
+ TAutoPtr<IEventHandle> handle;
+ runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+ }
+}
+
Y_UNIT_TEST_SUITE(TConsoleTests) {
void RunTestCreateTenant(TTenantTestRuntime& runtime, bool shared = false) {
using EType = TCreateTenantRequest::EType;
-
+
CheckCreateTenant(runtime, Ydb::StatusIds::SUCCESS,
TCreateTenantRequest(TENANT1_1_NAME, shared ? EType::Shared : EType::Common)
.WithSlots({{SLOT1_TYPE, ZONE1, 3}, {SLOT2_TYPE, ZONE1, 2}, {SLOT3_TYPE, ZONE1, 1}})
.WithPools({{"hdd", 1}, {"hdd-1", 2}}));
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 10, 10, 10}}});
-
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 10, 10, 10}}});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, shared, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
- {{"hdd", 1, 1}, {"hdd-1", 2, 2}}, {},
- SLOT1_TYPE, ZONE1, 3, 3,
- SLOT2_TYPE, ZONE1, 2, 2,
- SLOT3_TYPE, ZONE1, 1, 1);
-
- CheckPoolScope(runtime, TENANT1_1_NAME + ":hdd");
- CheckPoolScope(runtime, TENANT1_1_NAME + ":hdd-1");
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 1);
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_CREATE_REQUESTS, 1);
- CheckCounter(runtime, {{ {"status", "SUCCESS"} }}, TTenantsManager::COUNTER_CREATE_RESPONSES, 1);
- }
-
+ {{"hdd", 1, 1}, {"hdd-1", 2, 2}}, {},
+ SLOT1_TYPE, ZONE1, 3, 3,
+ SLOT2_TYPE, ZONE1, 2, 2,
+ SLOT3_TYPE, ZONE1, 1, 1);
+
+ CheckPoolScope(runtime, TENANT1_1_NAME + ":hdd");
+ CheckPoolScope(runtime, TENANT1_1_NAME + ":hdd-1");
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 1);
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_CREATE_REQUESTS, 1);
+ CheckCounter(runtime, {{ {"status", "SUCCESS"} }}, TTenantsManager::COUNTER_CREATE_RESPONSES, 1);
+ }
+
Y_UNIT_TEST(TestCreateTenant) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestCreateTenant(runtime);
}
-
+
Y_UNIT_TEST(TestCreateTenantExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestCreateTenant(runtime);
@@ -724,33 +724,33 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
}
void RunTestCreateTenantWrongName(TTenantTestRuntime& runtime) {
- // Empty path
+ // Empty path
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest(""));
- // Root path
+ // Root path
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest("/"));
- // Root path
+ // Root path
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest("///"));
- // Wrong char.
+ // Wrong char.
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest("tenant?"));
- // Wrong domain
+ // Wrong domain
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest("/wrong-domain/tenant"));
- // Tenant name starts with non-alpha
+ // Tenant name starts with non-alpha
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest("/dc-1/users/1-tenant"));
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest("/dc-1/users/-tenant"));
- // Dir name starts with non-alpha
+ // Dir name starts with non-alpha
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest("/dc-1/1users/tenant"));
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest("/dc-1/_users/tenant"));
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 0);
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_CREATE_REQUESTS, 9);
- CheckCounter(runtime, {{ {"status", "BAD_REQUEST"} }}, TTenantsManager::COUNTER_CREATE_RESPONSES, 9);
- }
-
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 0);
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_CREATE_REQUESTS, 9);
+ CheckCounter(runtime, {{ {"status", "BAD_REQUEST"} }}, TTenantsManager::COUNTER_CREATE_RESPONSES, 9);
+ }
+
Y_UNIT_TEST(TestCreateTenantWrongName) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestCreateTenantWrongName(runtime);
}
-
+
Y_UNIT_TEST(TestCreateTenantWrongNameExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestCreateTenantWrongName(runtime);
@@ -760,42 +760,42 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest(TENANT1_1_NAME));
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest(TENANT1_1_NAME).WithPools({{"hdd", 0}}));
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest(TENANT1_1_NAME).WithPools({{"unknown", 1}}));
- }
-
+ }
+
Y_UNIT_TEST(TestCreateTenantWrongPool) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestCreateTenantWrongPool(runtime);
}
-
+
Y_UNIT_TEST(TestCreateTenantWrongPoolExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestCreateTenantWrongPool(runtime);
}
void RunTestCreateTenantWrongComputationalUnit(TTenantTestRuntime& runtime) {
- // Unknown unit kind
+ // Unknown unit kind
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::BAD_REQUEST,
- {{"hdd", 1}, {"hdd-1", 2}},
- "wrong", ZONE1, 3);
- // Unknown zone
+ {{"hdd", 1}, {"hdd-1", 2}},
+ "wrong", ZONE1, 3);
+ // Unknown zone
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::BAD_REQUEST,
- {{"hdd", 1}, {"hdd-1", 2}},
- SLOT1_TYPE, "unknown-zone", 3);
- // Disallowed zone
+ {{"hdd", 1}, {"hdd-1", 2}},
+ SLOT1_TYPE, "unknown-zone", 3);
+ // Disallowed zone
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::BAD_REQUEST,
- {{"hdd", 1}, {"hdd-1", 2}},
- SLOT1_TYPE, ZONE2, 3);
- // OK
+ {{"hdd", 1}, {"hdd-1", 2}},
+ SLOT1_TYPE, ZONE2, 3);
+ // OK
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}, {"hdd-1", 2}},
- SLOT1_TYPE, ZONE1, 3);
- }
-
+ {{"hdd", 1}, {"hdd-1", 2}},
+ SLOT1_TYPE, ZONE1, 3);
+ }
+
Y_UNIT_TEST(TestCreateTenantWrongComputationalUnit) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestCreateTenantWrongComputationalUnit(runtime);
}
-
+
Y_UNIT_TEST(TestCreateTenantWrongComputationalUnitExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestCreateTenantWrongComputationalUnit(runtime);
@@ -803,40 +803,40 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
void RunTestCreateTenantAlreadyExists(TTenantTestRuntime& runtime) {
CheckCreateTenant(runtime, "/dc-1/users/tenant-1", Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 3,
- SLOT2_TYPE, ZONE1, 2,
- SLOT3_TYPE, ZONE1, 1);
-
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 3,
+ SLOT2_TYPE, ZONE1, 2,
+ SLOT3_TYPE, ZONE1, 1);
+
CheckCreateTenant(runtime, "/dc-1/users/tenant-1", Ydb::StatusIds::ALREADY_EXISTS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 3,
- SLOT2_TYPE, ZONE1, 2,
- SLOT3_TYPE, ZONE1, 1);
-
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 3,
+ SLOT2_TYPE, ZONE1, 2,
+ SLOT3_TYPE, ZONE1, 1);
+
CheckCreateTenant(runtime, "dc-1/users/tenant-1", Ydb::StatusIds::ALREADY_EXISTS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 3,
- SLOT2_TYPE, ZONE1, 2,
- SLOT3_TYPE, ZONE1, 1);
-
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 3,
+ SLOT2_TYPE, ZONE1, 2,
+ SLOT3_TYPE, ZONE1, 1);
+
CheckCreateTenant(runtime, "//dc-1/users///tenant-1/", Ydb::StatusIds::ALREADY_EXISTS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 3,
- SLOT2_TYPE, ZONE1, 2,
- SLOT3_TYPE, ZONE1, 1);
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_CREATE_REQUESTS, 4);
- CheckCounter(runtime, {{ {"status", "SUCCESS"} }}, TTenantsManager::COUNTER_CREATE_RESPONSES, 1);
- CheckCounter(runtime, {{ {"status", "ALREADY_EXISTS"} }}, TTenantsManager::COUNTER_CREATE_RESPONSES, 3);
- }
-
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 3,
+ SLOT2_TYPE, ZONE1, 2,
+ SLOT3_TYPE, ZONE1, 1);
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_CREATE_REQUESTS, 4);
+ CheckCounter(runtime, {{ {"status", "SUCCESS"} }}, TTenantsManager::COUNTER_CREATE_RESPONSES, 1);
+ CheckCounter(runtime, {{ {"status", "ALREADY_EXISTS"} }}, TTenantsManager::COUNTER_CREATE_RESPONSES, 3);
+ }
+
Y_UNIT_TEST(TestCreateTenantAlreadyExists) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestCreateTenantAlreadyExists(runtime);
}
-
+
Y_UNIT_TEST(TestCreateTenantAlreadyExistsExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestCreateTenantAlreadyExists(runtime);
@@ -845,64 +845,64 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
void RunTestGetUnknownTenantStatus(TTenantTestRuntime& runtime) {
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::NOT_FOUND,
Ydb::Cms::GetDatabaseStatusResult::STATE_UNSPECIFIED, {}, {});
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_STATUS_REQUESTS, 1);
- CheckCounter(runtime, {{ {"status", "NOT_FOUND"} }}, TTenantsManager::COUNTER_STATUS_RESPONSES, 1);
- }
-
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_STATUS_REQUESTS, 1);
+ CheckCounter(runtime, {{ {"status", "NOT_FOUND"} }}, TTenantsManager::COUNTER_STATUS_RESPONSES, 1);
+ }
+
Y_UNIT_TEST(TestGetUnknownTenantStatus) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestGetUnknownTenantStatus(runtime);
}
-
+
Y_UNIT_TEST(TestGetUnknownTenantStatusExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestGetUnknownTenantStatus(runtime);
}
void RunTestRestartConsoleAndPools(TTenantTestRuntime& runtime) {
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(1), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(2), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(3), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
-
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(1), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(2), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(3), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT2_TYPE, ZONE_ANY, 8);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 5, 5, 5},
- {TENANT1_1_NAME, 10, 10, 10}}});
-
+ {{"hdd", 1}},
+ SLOT2_TYPE, ZONE_ANY, 8);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 5, 5, 5},
+ {TENANT1_1_NAME, 10, 10, 10}}});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING, {{"hdd", 1, 1}}, {},
- SLOT2_TYPE, ZONE_ANY, 8, 5);
-
- RestartConsole(runtime);
- runtime.CreateTenantPool(1);
- runtime.CreateTenantPool(2);
- runtime.CreateTenantPool(3);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 16, 16, 16}}});
-
+ SLOT2_TYPE, ZONE_ANY, 8, 5);
+
+ RestartConsole(runtime);
+ runtime.CreateTenantPool(1);
+ runtime.CreateTenantPool(2);
+ runtime.CreateTenantPool(3);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 16, 16, 16}}});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING, {{"hdd", 1, 1}}, {},
- SLOT2_TYPE, ZONE_ANY, 8, 8);
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 1);
- }
-
+ SLOT2_TYPE, ZONE_ANY, 8, 8);
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 1);
+ }
+
Y_UNIT_TEST(TestRestartConsoleAndPools) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestRestartConsoleAndPools(runtime);
}
-
+
Y_UNIT_TEST(TestRestartConsoleAndPoolsExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestRestartConsoleAndPools(runtime);
@@ -911,96 +911,96 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
void RunTestAlterTenantModifyComputationalResourcesForPending(TTenantTestRuntime& runtime) {
CheckCreateTenant(runtime, Ydb::StatusIds::SUCCESS,
TCreateTenantRequest(TENANT1_1_NAME).WithPools({{"hdd", 1}}));
-
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES, {{"hdd", 1, 1}}, {});
-
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {SLOT1_TYPE, ZONE1, 5} }}, {});
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 5, 5, 5}}});
-
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::RUNNING, {{"hdd", 1, 1}}, {},
- SLOT1_TYPE, ZONE1, 5, 5);
- }
-
+
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES, {{"hdd", 1, 1}}, {});
+
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{ {SLOT1_TYPE, ZONE1, 5} }}, {});
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 5, 5, 5}}});
+
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::RUNNING, {{"hdd", 1, 1}}, {},
+ SLOT1_TYPE, ZONE1, 5, 5);
+ }
+
Y_UNIT_TEST(TestAlterTenantModifyComputationalResourcesForPending) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestAlterTenantModifyComputationalResourcesForPending(runtime);
}
-
+
Y_UNIT_TEST(TestAlterTenantModifyComputationalResourcesForPendingExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestAlterTenantModifyComputationalResourcesForPending(runtime);
}
void RunTestAlterTenantModifyComputationalResourcesForRunning(TTenantTestRuntime& runtime) {
- CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 5,
- SLOT2_TYPE, ZONE1, 8,
- SLOT3_TYPE, ZONE1, 10);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 45, 45, 45}}});
-
+ CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 5,
+ SLOT2_TYPE, ZONE1, 8,
+ SLOT3_TYPE, ZONE1, 10);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 45, 45, 45}}});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING, {{"hdd", 1, 1}}, {},
- SLOT1_TYPE, ZONE1, 5, 5,
- SLOT2_TYPE, ZONE1, 8, 8,
- SLOT3_TYPE, ZONE1, 10, 8);
-
+ SLOT1_TYPE, ZONE1, 5, 5,
+ SLOT2_TYPE, ZONE1, 8, 8,
+ SLOT3_TYPE, ZONE1, 10, 8);
+
CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {SLOT1_TYPE, ZONE1, 5} }},
- {{ {SLOT2_TYPE, ZONE1, 3},
+ {{ {SLOT1_TYPE, ZONE1, 5} }},
+ {{ {SLOT2_TYPE, ZONE1, 3},
{SLOT3_TYPE, ZONE1, 7} }});
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 27, 27, 27}}});
-
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 27, 27, 27}}});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING, {{"hdd", 1, 1}}, {},
- SLOT1_TYPE, ZONE1, 10, 8,
- SLOT2_TYPE, ZONE1, 5, 5,
- SLOT3_TYPE, ZONE1, 3, 3);
-
+ SLOT1_TYPE, ZONE1, 10, 8,
+ SLOT2_TYPE, ZONE1, 5, 5,
+ SLOT3_TYPE, ZONE1, 3, 3);
+
CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {},
- {{ {SLOT1_TYPE, ZONE1, 10},
+ {},
+ {{ {SLOT1_TYPE, ZONE1, 10},
{SLOT2_TYPE, ZONE1, 5},
{SLOT3_TYPE, ZONE1, 3} }});
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8}}});
-
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8}}});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING, {{"hdd", 1, 1}}, {});
-
+
CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {SLOT1_TYPE, ZONE1, 1},
+ {{ {SLOT1_TYPE, ZONE1, 1},
{SLOT2_TYPE, ZONE1, 2},
{SLOT3_TYPE, ZONE1, 3} }},
- {});
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 14, 14, 14}}});
-
+ {});
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 14, 14, 14}}});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING, {{"hdd", 1, 1}}, {},
- SLOT1_TYPE, ZONE1, 1, 1,
- SLOT2_TYPE, ZONE1, 2, 2,
- SLOT3_TYPE, ZONE1, 3, 3);
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_ALTER_REQUESTS, 3);
- CheckCounter(runtime, {{ {"status", "SUCCESS"} }}, TTenantsManager::COUNTER_ALTER_RESPONSES, 3);
- }
-
+ SLOT1_TYPE, ZONE1, 1, 1,
+ SLOT2_TYPE, ZONE1, 2, 2,
+ SLOT3_TYPE, ZONE1, 3, 3);
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_ALTER_REQUESTS, 3);
+ CheckCounter(runtime, {{ {"status", "SUCCESS"} }}, TTenantsManager::COUNTER_ALTER_RESPONSES, 3);
+ }
+
Y_UNIT_TEST(TestAlterTenantModifyComputationalResourcesForRunning) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestAlterTenantModifyComputationalResourcesForRunning(runtime);
}
-
+
Y_UNIT_TEST(TestAlterTenantModifyComputationalResourcesForRunningExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestAlterTenantModifyComputationalResourcesForRunning(runtime);
@@ -1009,151 +1009,151 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
void RunTestAlterTenantModifyStorageResourcesForPending(TTenantTestRuntime& runtime) {
CheckCreateTenant(runtime, Ydb::StatusIds::SUCCESS,
TCreateTenantRequest(TENANT1_1_NAME).WithPools({{"hdd", 1}, {"hdd-1", 3}}));
-
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 3);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 3);
-
+
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 3);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 3);
+
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
+ {{"hdd", 1, 1}, {"hdd-1", 3, 3}}, {});
+
+ TVector<TAutoPtr<IEventHandle>> captured;
+ runtime.SetObserverFunc(CatchPoolEvent(captured));
+
+ CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 2}, {"hdd-1", 3}}, {});
+
+ runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
+
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 3);
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 6);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 3);
+
+ RestartConsole(runtime);
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
- {{"hdd", 1, 1}, {"hdd-1", 3, 3}}, {});
-
- TVector<TAutoPtr<IEventHandle>> captured;
- runtime.SetObserverFunc(CatchPoolEvent(captured));
-
+ Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
+ {{"hdd", 3, 3}, {"hdd-1", 6, 6}}, {});
+
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 3);
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 3);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 6);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 6);
+
CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 2}, {"hdd-1", 3}}, {});
-
- runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
-
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 3);
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 6);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 3);
-
- RestartConsole(runtime);
-
+ {}, false);
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
- {{"hdd", 3, 3}, {"hdd-1", 6, 6}}, {});
-
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 3);
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 3);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 6);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 6);
-
+ Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
+ {{"hdd", 3, 3}, {"hdd-1", 6, 6}}, {});
+
CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {}, false);
-
+ {{"hdd-2", 1}});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
- {{"hdd", 3, 3}, {"hdd-1", 6, 6}}, {});
-
- CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd-2", 1}});
-
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
- {{"hdd", 3, 3}, {"hdd-1", 6, 6}, {"hdd-2", 1, 1}}, {});
-
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 3);
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 3);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 6);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 6);
- CheckCounter(runtime, {{ {"kind", "hdd-2"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "hdd-2"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 1);
-
- CheckRemoveTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS);
-
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 0);
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 0);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 0);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 0);
- CheckCounter(runtime, {{ {"kind", "hdd-2"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 0);
- CheckCounter(runtime, {{ {"kind", "hdd-2"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 0);
- }
-
+ Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
+ {{"hdd", 3, 3}, {"hdd-1", 6, 6}, {"hdd-2", 1, 1}}, {});
+
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 3);
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 3);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 6);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 6);
+ CheckCounter(runtime, {{ {"kind", "hdd-2"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "hdd-2"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 1);
+
+ CheckRemoveTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS);
+
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 0);
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 0);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 0);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 0);
+ CheckCounter(runtime, {{ {"kind", "hdd-2"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 0);
+ CheckCounter(runtime, {{ {"kind", "hdd-2"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 0);
+ }
+
Y_UNIT_TEST(TestAlterTenantModifyStorageResourcesForPending) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestAlterTenantModifyStorageResourcesForPending(runtime);
}
-
+
Y_UNIT_TEST(TestAlterTenantModifyStorageResourcesForPendingExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestAlterTenantModifyStorageResourcesForPending(runtime);
}
void RunTestAlterTenantModifyStorageResourcesForRunning(TTenantTestRuntime& runtime) {
- CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}, {"hdd-1", 3}},
- SLOT1_TYPE, ZONE1, 1);
-
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::RUNNING,
- {{"hdd", 1, 1}, {"hdd-1", 3, 3}}, {},
- SLOT1_TYPE, ZONE1, 1, 1);
-
- CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 2}, {"hdd-1", 3}}, {});
-
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::RUNNING,
- {{"hdd", 3, 3}, {"hdd-1", 6, 6}}, {},
- SLOT1_TYPE, ZONE1, 1, 1);
-
- CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {}, false);
-
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::RUNNING,
- {{"hdd", 3, 3}, {"hdd-1", 6, 6}}, {},
- SLOT1_TYPE, ZONE1, 1, 1);
-
- CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd-2", 1}});
-
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::RUNNING,
- {{"hdd", 3, 3}, {"hdd-1", 6, 6}, {"hdd-2", 1, 1}}, {},
- SLOT1_TYPE, ZONE1, 1, 1);
-
- // Wrong unit kind.
+ CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}, {"hdd-1", 3}},
+ SLOT1_TYPE, ZONE1, 1);
+
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::RUNNING,
+ {{"hdd", 1, 1}, {"hdd-1", 3, 3}}, {},
+ SLOT1_TYPE, ZONE1, 1, 1);
+
+ CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 2}, {"hdd-1", 3}}, {});
+
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::RUNNING,
+ {{"hdd", 3, 3}, {"hdd-1", 6, 6}}, {},
+ SLOT1_TYPE, ZONE1, 1, 1);
+
+ CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {}, false);
+
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::RUNNING,
+ {{"hdd", 3, 3}, {"hdd-1", 6, 6}}, {},
+ SLOT1_TYPE, ZONE1, 1, 1);
+
+ CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd-2", 1}});
+
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::RUNNING,
+ {{"hdd", 3, 3}, {"hdd-1", 6, 6}, {"hdd-2", 1, 1}}, {},
+ SLOT1_TYPE, ZONE1, 1, 1);
+
+ // Wrong unit kind.
CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::BAD_REQUEST,
- {{"unknown", 1}});
- // Zero pool size.
+ {{"unknown", 1}});
+ // Zero pool size.
CheckAlterTenantPools(runtime, TENANT1_1_NAME, Ydb::StatusIds::BAD_REQUEST,
- {{"hdd-3", 0}});
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_ALTER_REQUESTS, 5);
- CheckCounter(runtime, {{ {"status", "SUCCESS"} }}, TTenantsManager::COUNTER_ALTER_RESPONSES, 3);
- CheckCounter(runtime, {{ {"status", "BAD_REQUEST"} }}, TTenantsManager::COUNTER_ALTER_RESPONSES, 2);
- }
-
+ {{"hdd-3", 0}});
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_ALTER_REQUESTS, 5);
+ CheckCounter(runtime, {{ {"status", "SUCCESS"} }}, TTenantsManager::COUNTER_ALTER_RESPONSES, 3);
+ CheckCounter(runtime, {{ {"status", "BAD_REQUEST"} }}, TTenantsManager::COUNTER_ALTER_RESPONSES, 2);
+ }
+
Y_UNIT_TEST(TestAlterTenantModifyStorageResourcesForRunning) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestAlterTenantModifyStorageResourcesForRunning(runtime);
}
-
+
Y_UNIT_TEST(TestAlterTenantModifyStorageResourcesForRunningExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestAlterTenantModifyStorageResourcesForRunning(runtime);
}
void RunTestAlterUnknownTenant(TTenantTestRuntime& runtime) {
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::NOT_FOUND,
- { }, { });
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_ALTER_REQUESTS, 1);
- CheckCounter(runtime, {{ {"status", "NOT_FOUND"} }}, TTenantsManager::COUNTER_ALTER_RESPONSES, 1);
- }
-
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::NOT_FOUND,
+ { }, { });
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_ALTER_REQUESTS, 1);
+ CheckCounter(runtime, {{ {"status", "NOT_FOUND"} }}, TTenantsManager::COUNTER_ALTER_RESPONSES, 1);
+ }
+
Y_UNIT_TEST(TestAlterUnknownTenant) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestAlterUnknownTenant(runtime);
}
-
+
Y_UNIT_TEST(TestAlterUnknownTenantExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestAlterUnknownTenant(runtime);
@@ -1213,34 +1213,34 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
void RunTestListTenants(TTenantTestRuntime& runtime) {
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
CheckCreateTenant(runtime, TENANT1_4_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
CheckCreateTenant(runtime, TENANT1_5_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 1, 1, 1},
- {TENANT1_2_NAME, 1, 1, 1},
- {TENANT1_3_NAME, 1, 1, 1},
- {TENANT1_4_NAME, 1, 1, 1},
- {TENANT1_5_NAME, 1, 1, 1}}});
-
- CheckListTenants(runtime,
- {{ TENANT1_1_NAME, TENANT1_2_NAME, TENANT1_3_NAME, TENANT1_4_NAME, TENANT1_5_NAME }});
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_LIST_REQUESTS, 1);
- }
-
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 1, 1, 1},
+ {TENANT1_2_NAME, 1, 1, 1},
+ {TENANT1_3_NAME, 1, 1, 1},
+ {TENANT1_4_NAME, 1, 1, 1},
+ {TENANT1_5_NAME, 1, 1, 1}}});
+
+ CheckListTenants(runtime,
+ {{ TENANT1_1_NAME, TENANT1_2_NAME, TENANT1_3_NAME, TENANT1_4_NAME, TENANT1_5_NAME }});
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_LIST_REQUESTS, 1);
+ }
+
Y_UNIT_TEST(TestListTenants) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestListTenants(runtime);
@@ -1251,277 +1251,277 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
RunTestListTenants(runtime);
}
- Y_UNIT_TEST(TestSetDefaultStorageUnitsQuota) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
+ Y_UNIT_TEST(TestSetDefaultStorageUnitsQuota) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 3}},
- SLOT1_TYPE, ZONE1, 1);
-
- NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
- config.MutableTenantsConfig()->SetDefaultStorageUnitsQuota(2);
+ {{"hdd", 3}},
+ SLOT1_TYPE, ZONE1, 1);
+
+ NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
+ config.MutableTenantsConfig()->SetDefaultStorageUnitsQuota(2);
CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
-
+
CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 2}},
- SLOT1_TYPE, ZONE1, 1);
-
+ {{"hdd", 2}},
+ SLOT1_TYPE, ZONE1, 1);
+
CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::BAD_REQUEST,
- {{"hdd", 3}},
- SLOT1_TYPE, ZONE1, 1);
- }
-
- Y_UNIT_TEST(TestSetDefaultComputationalUnitsQuota) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
+ {{"hdd", 3}},
+ SLOT1_TYPE, ZONE1, 1);
+ }
+
+ Y_UNIT_TEST(TestSetDefaultComputationalUnitsQuota) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 3);
-
- NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
- config.MutableTenantsConfig()->SetDefaultComputationalUnitsQuota(2);
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 3);
+
+ NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
+ config.MutableTenantsConfig()->SetDefaultComputationalUnitsQuota(2);
CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
-
+
CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 2);
-
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 2);
+
CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::BAD_REQUEST,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 3);
- }
-
- Y_UNIT_TEST(TestTenantConfigConsistency) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
-
- // Repeated zone kind.
- NKikimrConsole::TConfig config1 = config;
- auto kind1 = config1.MutableTenantsConfig()->AddAvailabilityZoneKinds();
- kind1->CopyFrom(config1.GetTenantsConfig().GetAvailabilityZoneKinds(0));
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 3);
+ }
+
+ Y_UNIT_TEST(TestTenantConfigConsistency) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
+
+ // Repeated zone kind.
+ NKikimrConsole::TConfig config1 = config;
+ auto kind1 = config1.MutableTenantsConfig()->AddAvailabilityZoneKinds();
+ kind1->CopyFrom(config1.GetTenantsConfig().GetAvailabilityZoneKinds(0));
CheckSetConfig(runtime, config1, Ydb::StatusIds::BAD_REQUEST);
- // Repeated zone kind set.
- NKikimrConsole::TConfig config2 = config;
- auto set2 = config2.MutableTenantsConfig()->AddAvailabilityZoneSets();
- set2->CopyFrom(config2.GetTenantsConfig().GetAvailabilityZoneSets(0));
+ // Repeated zone kind set.
+ NKikimrConsole::TConfig config2 = config;
+ auto set2 = config2.MutableTenantsConfig()->AddAvailabilityZoneSets();
+ set2->CopyFrom(config2.GetTenantsConfig().GetAvailabilityZoneSets(0));
CheckSetConfig(runtime, config2, Ydb::StatusIds::BAD_REQUEST);
- // Repeated computational unit kind.
- NKikimrConsole::TConfig config3 = config;
- auto kind3 = config3.MutableTenantsConfig()->AddComputationalUnitKinds();
- kind3->CopyFrom(config1.GetTenantsConfig().GetComputationalUnitKinds(0));
+ // Repeated computational unit kind.
+ NKikimrConsole::TConfig config3 = config;
+ auto kind3 = config3.MutableTenantsConfig()->AddComputationalUnitKinds();
+ kind3->CopyFrom(config1.GetTenantsConfig().GetComputationalUnitKinds(0));
CheckSetConfig(runtime, config3, Ydb::StatusIds::BAD_REQUEST);
- // Unknown zone kind used.
- NKikimrConsole::TConfig config4 = config;
- config4.MutableTenantsConfig()->MutableAvailabilityZoneSets(0)->AddZoneKinds("unknown");
+ // Unknown zone kind used.
+ NKikimrConsole::TConfig config4 = config;
+ config4.MutableTenantsConfig()->MutableAvailabilityZoneSets(0)->AddZoneKinds("unknown");
CheckSetConfig(runtime, config4, Ydb::StatusIds::BAD_REQUEST);
- // Unknown zone set.
- NKikimrConsole::TConfig config5 = config;
- config5.MutableTenantsConfig()->MutableComputationalUnitKinds(0)->SetAvailabilityZoneSet("unknown");
+ // Unknown zone set.
+ NKikimrConsole::TConfig config5 = config;
+ config5.MutableTenantsConfig()->MutableComputationalUnitKinds(0)->SetAvailabilityZoneSet("unknown");
CheckSetConfig(runtime, config5, Ydb::StatusIds::BAD_REQUEST);
- // Empty computational unit kind.
- NKikimrConsole::TConfig config6 = config;
- config6.MutableTenantsConfig()->MutableComputationalUnitKinds(0)->ClearTenantSlotType();
+ // Empty computational unit kind.
+ NKikimrConsole::TConfig config6 = config;
+ config6.MutableTenantsConfig()->MutableComputationalUnitKinds(0)->ClearTenantSlotType();
CheckSetConfig(runtime, config6, Ydb::StatusIds::BAD_REQUEST);
-
+
CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
- CheckSetConfig(runtime, {}, Ydb::StatusIds::SUCCESS);
- }
-
- Y_UNIT_TEST(TestModifyUsedZoneKind) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
+ CheckSetConfig(runtime, {}, Ydb::StatusIds::SUCCESS);
+ }
+
+ Y_UNIT_TEST(TestModifyUsedZoneKind) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
-
- NKikimrConsole::TConfig config1 = GetCurrentConfig(runtime);
- for (ui64 i = 0; i < config1.GetTenantsConfig().AvailabilityZoneKindsSize(); ++i) {
- if (config1.GetTenantsConfig().GetAvailabilityZoneKinds(i).GetKind() == ZONE1) {
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+
+ NKikimrConsole::TConfig config1 = GetCurrentConfig(runtime);
+ for (ui64 i = 0; i < config1.GetTenantsConfig().AvailabilityZoneKindsSize(); ++i) {
+ if (config1.GetTenantsConfig().GetAvailabilityZoneKinds(i).GetKind() == ZONE1) {
config1.MutableTenantsConfig()->MutableAvailabilityZoneKinds(i)->SetDataCenterName(ToString(2));
- break;
- }
- }
- // Cannot modify used zone1
+ break;
+ }
+ }
+ // Cannot modify used zone1
CheckSetConfig(runtime, config1, Ydb::StatusIds::BAD_REQUEST);
-
- NKikimrConsole::TConfig config2 = GetCurrentConfig(runtime);
- for (ui64 i = 0; i < config2.GetTenantsConfig().AvailabilityZoneKindsSize(); ++i) {
- if (config2.GetTenantsConfig().GetAvailabilityZoneKinds(i).GetKind() == ZONE2) {
+
+ NKikimrConsole::TConfig config2 = GetCurrentConfig(runtime);
+ for (ui64 i = 0; i < config2.GetTenantsConfig().AvailabilityZoneKindsSize(); ++i) {
+ if (config2.GetTenantsConfig().GetAvailabilityZoneKinds(i).GetKind() == ZONE2) {
config2.MutableTenantsConfig()->MutableAvailabilityZoneKinds(i)->SetDataCenterName(ToString(1));
- break;
- }
- }
- // OK to modify unused zone2
+ break;
+ }
+ }
+ // OK to modify unused zone2
CheckSetConfig(runtime, config2, Ydb::StatusIds::SUCCESS);
-
+
CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT2_TYPE, ZONE2, 1);
-
- for (ui64 i = 0; i < config2.GetTenantsConfig().AvailabilityZoneKindsSize(); ++i) {
- if (config2.GetTenantsConfig().GetAvailabilityZoneKinds(i).GetKind() == ZONE2) {
+ {{"hdd", 1}},
+ SLOT2_TYPE, ZONE2, 1);
+
+ for (ui64 i = 0; i < config2.GetTenantsConfig().AvailabilityZoneKindsSize(); ++i) {
+ if (config2.GetTenantsConfig().GetAvailabilityZoneKinds(i).GetKind() == ZONE2) {
config2.MutableTenantsConfig()->MutableAvailabilityZoneKinds(i)->SetDataCenterName(ToString(2));
- break;
- }
- }
- // Now zone2 is also used.
+ break;
+ }
+ }
+ // Now zone2 is also used.
CheckSetConfig(runtime, config2, Ydb::StatusIds::BAD_REQUEST);
-
+
CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {},
- {{ {SLOT2_TYPE, ZONE2, 1} }});
-
- // Now zone2 is unused again.
+ {},
+ {{ {SLOT2_TYPE, ZONE2, 1} }});
+
+ // Now zone2 is unused again.
CheckSetConfig(runtime, config2, Ydb::StatusIds::SUCCESS);
- }
-
- Y_UNIT_TEST(TestSetConfig) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
+ }
+
+ Y_UNIT_TEST(TestSetConfig) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
-
- NKikimrConsole::TConfig config1 = GetCurrentConfig(runtime);
- for (ui64 i = 0; i < config1.GetTenantsConfig().ComputationalUnitKindsSize(); ++i) {
- if (config1.GetTenantsConfig().GetComputationalUnitKinds(i).GetKind() == SLOT1_TYPE) {
- config1.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetTenantSlotType("new_value");
- break;
- }
- }
- // Cannot modify tenant slot type for used SLOT1_TYPE
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+
+ NKikimrConsole::TConfig config1 = GetCurrentConfig(runtime);
+ for (ui64 i = 0; i < config1.GetTenantsConfig().ComputationalUnitKindsSize(); ++i) {
+ if (config1.GetTenantsConfig().GetComputationalUnitKinds(i).GetKind() == SLOT1_TYPE) {
+ config1.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetTenantSlotType("new_value");
+ break;
+ }
+ }
+ // Cannot modify tenant slot type for used SLOT1_TYPE
CheckSetConfig(runtime, config1, Ydb::StatusIds::BAD_REQUEST);
-
- NKikimrConsole::TConfig config2 = GetCurrentConfig(runtime);
- for (ui64 i = 0; i < config2.GetTenantsConfig().ComputationalUnitKindsSize(); ++i) {
- if (config2.GetTenantsConfig().GetComputationalUnitKinds(i).GetKind() == SLOT1_TYPE) {
- config2.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetAvailabilityZoneSet(ZONE2);
- break;
- }
- }
- // Cannot remove used zone1 from allowed availability zones of SLOT1_TYPE
+
+ NKikimrConsole::TConfig config2 = GetCurrentConfig(runtime);
+ for (ui64 i = 0; i < config2.GetTenantsConfig().ComputationalUnitKindsSize(); ++i) {
+ if (config2.GetTenantsConfig().GetComputationalUnitKinds(i).GetKind() == SLOT1_TYPE) {
+ config2.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetAvailabilityZoneSet(ZONE2);
+ break;
+ }
+ }
+ // Cannot remove used zone1 from allowed availability zones of SLOT1_TYPE
CheckSetConfig(runtime, config2, Ydb::StatusIds::BAD_REQUEST);
-
- // OK to add new allowed zones for SLOT1_TYPE
- NKikimrConsole::TConfig config3 = GetCurrentConfig(runtime);
- for (ui64 i = 0; i < config3.GetTenantsConfig().ComputationalUnitKindsSize(); ++i) {
- if (config3.GetTenantsConfig().GetComputationalUnitKinds(i).GetKind() == SLOT1_TYPE) {
- config3.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetAvailabilityZoneSet("all");
- break;
- }
- }
+
+ // OK to add new allowed zones for SLOT1_TYPE
+ NKikimrConsole::TConfig config3 = GetCurrentConfig(runtime);
+ for (ui64 i = 0; i < config3.GetTenantsConfig().ComputationalUnitKindsSize(); ++i) {
+ if (config3.GetTenantsConfig().GetComputationalUnitKinds(i).GetKind() == SLOT1_TYPE) {
+ config3.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetAvailabilityZoneSet("all");
+ break;
+ }
+ }
CheckSetConfig(runtime, config3, Ydb::StatusIds::SUCCESS);
-
- NKikimrConsole::TConfig config4 = GetCurrentConfig(runtime);
- for (ui64 i = 0; i < config4.GetTenantsConfig().ComputationalUnitKindsSize(); ++i) {
- if (config4.GetTenantsConfig().GetComputationalUnitKinds(i).GetKind() == SLOT2_TYPE) {
- config4.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetTenantSlotType(SLOT3_TYPE);
- config4.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetAvailabilityZoneSet(ZONE1);
- break;
- }
- }
- // OK to modify unused SLOT2_TYPE
+
+ NKikimrConsole::TConfig config4 = GetCurrentConfig(runtime);
+ for (ui64 i = 0; i < config4.GetTenantsConfig().ComputationalUnitKindsSize(); ++i) {
+ if (config4.GetTenantsConfig().GetComputationalUnitKinds(i).GetKind() == SLOT2_TYPE) {
+ config4.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetTenantSlotType(SLOT3_TYPE);
+ config4.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetAvailabilityZoneSet(ZONE1);
+ break;
+ }
+ }
+ // OK to modify unused SLOT2_TYPE
CheckSetConfig(runtime, config4, Ydb::StatusIds::SUCCESS);
-
+
CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT2_TYPE, ZONE1, 1);
-
- for (ui64 i = 0; i < config4.GetTenantsConfig().ComputationalUnitKindsSize(); ++i) {
- if (config4.GetTenantsConfig().GetComputationalUnitKinds(i).GetKind() == SLOT2_TYPE) {
- config4.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetTenantSlotType("new_value");
- config4.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetAvailabilityZoneSet(ZONE2);
- break;
- }
- }
- // Now SLOT2_TYPE is also used.
+ {{"hdd", 1}},
+ SLOT2_TYPE, ZONE1, 1);
+
+ for (ui64 i = 0; i < config4.GetTenantsConfig().ComputationalUnitKindsSize(); ++i) {
+ if (config4.GetTenantsConfig().GetComputationalUnitKinds(i).GetKind() == SLOT2_TYPE) {
+ config4.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetTenantSlotType("new_value");
+ config4.MutableTenantsConfig()->MutableComputationalUnitKinds(i)->SetAvailabilityZoneSet(ZONE2);
+ break;
+ }
+ }
+ // Now SLOT2_TYPE is also used.
CheckSetConfig(runtime, config4, Ydb::StatusIds::BAD_REQUEST);
-
+
CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {},
- {{ {SLOT2_TYPE, ZONE1, 1} }});
-
- // Now zone2 is unused again.
+ {},
+ {{ {SLOT2_TYPE, ZONE1, 1} }});
+
+ // Now zone2 is unused again.
CheckSetConfig(runtime, config4, Ydb::StatusIds::SUCCESS);
- }
-
- Y_UNIT_TEST(TestMergeConfig) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->ClearAllowedHostUsageScopeKinds();
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
- CheckGetConfig(runtime, config);
-
- {
- NKikimrConsole::TConfig delta;
- delta.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddAllowedHostUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- delta.MutableTenantsConfig()->MutableClusterQuota()
- ->SetTenantsQuota(10);
- CheckSetConfig(runtime, delta, Ydb::StatusIds::SUCCESS, NKikimrConsole::TConfigItem::MERGE);
-
- config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
- ->AddAllowedHostUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- config.MutableTenantsConfig()->MutableClusterQuota()
- ->SetTenantsQuota(10);
- CheckGetConfig(runtime, config);
- }
-
- {
- NKikimrConsole::TConfig delta;
- delta.MutableTenantsConfig()->MutableClusterQuota()
- ->SetTenantsQuota(0);
- CheckSetConfig(runtime, delta, Ydb::StatusIds::SUCCESS, NKikimrConsole::TConfigItem::MERGE);
-
- config.MutableTenantsConfig()->MutableClusterQuota()
- ->SetTenantsQuota(0);
- CheckGetConfig(runtime, config);
- }
-
- // Check merge doesn't disable checks.
- {
- NKikimrConsole::TConfig delta;
- auto zone = delta.MutableTenantsConfig()->AddAvailabilityZoneKinds();
- zone->SetKind(ZONE1);
+ }
+
+ Y_UNIT_TEST(TestMergeConfig) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->ClearAllowedHostUsageScopeKinds();
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+ CheckGetConfig(runtime, config);
+
+ {
+ NKikimrConsole::TConfig delta;
+ delta.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddAllowedHostUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ delta.MutableTenantsConfig()->MutableClusterQuota()
+ ->SetTenantsQuota(10);
+ CheckSetConfig(runtime, delta, Ydb::StatusIds::SUCCESS, NKikimrConsole::TConfigItem::MERGE);
+
+ config.MutableConfigsConfig()->MutableUsageScopeRestrictions()
+ ->AddAllowedHostUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ config.MutableTenantsConfig()->MutableClusterQuota()
+ ->SetTenantsQuota(10);
+ CheckGetConfig(runtime, config);
+ }
+
+ {
+ NKikimrConsole::TConfig delta;
+ delta.MutableTenantsConfig()->MutableClusterQuota()
+ ->SetTenantsQuota(0);
+ CheckSetConfig(runtime, delta, Ydb::StatusIds::SUCCESS, NKikimrConsole::TConfigItem::MERGE);
+
+ config.MutableTenantsConfig()->MutableClusterQuota()
+ ->SetTenantsQuota(0);
+ CheckGetConfig(runtime, config);
+ }
+
+ // Check merge doesn't disable checks.
+ {
+ NKikimrConsole::TConfig delta;
+ auto zone = delta.MutableTenantsConfig()->AddAvailabilityZoneKinds();
+ zone->SetKind(ZONE1);
zone->SetDataCenterName(ToString(1));
- CheckSetConfig(runtime, delta, Ydb::StatusIds::BAD_REQUEST, NKikimrConsole::TConfigItem::MERGE);
- }
-
- // Overwrite zones only.
- {
- NKikimrConsole::TConfig delta;
- auto zone1 = delta.MutableTenantsConfig()->AddAvailabilityZoneKinds();
- zone1->SetKind(ZONE1);
+ CheckSetConfig(runtime, delta, Ydb::StatusIds::BAD_REQUEST, NKikimrConsole::TConfigItem::MERGE);
+ }
+
+ // Overwrite zones only.
+ {
+ NKikimrConsole::TConfig delta;
+ auto zone1 = delta.MutableTenantsConfig()->AddAvailabilityZoneKinds();
+ zone1->SetKind(ZONE1);
zone1->SetDataCenterName(ToString(1));
- auto set1 = delta.MutableTenantsConfig()->AddAvailabilityZoneSets();
- set1->SetName("all");
- set1->AddZoneKinds(ZONE1);
- auto set2 = delta.MutableTenantsConfig()->AddAvailabilityZoneSets();
- set2->SetName(ZONE1);
- set2->AddZoneKinds(ZONE1);
- CheckSetConfig(runtime, delta, Ydb::StatusIds::SUCCESS, NKikimrConsole::TConfigItem::MERGE_OVERWRITE_REPEATED);
-
- config.MutableTenantsConfig()->MutableAvailabilityZoneKinds()
- ->CopyFrom(delta.GetTenantsConfig().GetAvailabilityZoneKinds());
- config.MutableTenantsConfig()->MutableAvailabilityZoneSets()
- ->CopyFrom(delta.GetTenantsConfig().GetAvailabilityZoneSets());
- CheckGetConfig(runtime, config);
- }
- }
-
+ auto set1 = delta.MutableTenantsConfig()->AddAvailabilityZoneSets();
+ set1->SetName("all");
+ set1->AddZoneKinds(ZONE1);
+ auto set2 = delta.MutableTenantsConfig()->AddAvailabilityZoneSets();
+ set2->SetName(ZONE1);
+ set2->AddZoneKinds(ZONE1);
+ CheckSetConfig(runtime, delta, Ydb::StatusIds::SUCCESS, NKikimrConsole::TConfigItem::MERGE_OVERWRITE_REPEATED);
+
+ config.MutableTenantsConfig()->MutableAvailabilityZoneKinds()
+ ->CopyFrom(delta.GetTenantsConfig().GetAvailabilityZoneKinds());
+ config.MutableTenantsConfig()->MutableAvailabilityZoneSets()
+ ->CopyFrom(delta.GetTenantsConfig().GetAvailabilityZoneSets());
+ CheckGetConfig(runtime, config);
+ }
+ }
+
void RunTestRemoveTenant(TTenantTestRuntime& runtime) {
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}, {"hdd-1", 2}},
- SLOT1_TYPE, ZONE1, 3,
- SLOT2_TYPE, ZONE1, 2,
- SLOT3_TYPE, ZONE1, 1);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 10, 10, 10}}});
-
+ {{"hdd", 1}, {"hdd-1", 2}},
+ SLOT1_TYPE, ZONE1, 3,
+ SLOT2_TYPE, ZONE1, 2,
+ SLOT3_TYPE, ZONE1, 1);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 10, 10, 10}}});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}, {"hdd-1", 2, 2}}, {},
@@ -1529,11 +1529,11 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
SLOT2_TYPE, ZONE1, 2, 2,
SLOT3_TYPE, ZONE1, 1, 1);
- CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {"host1", 1, "kind1"},
+ CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{ {"host1", 1, "kind1"},
{"host2", 2, "kind2"} }},
- {});
-
+ {});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}, {"hdd-1", 2, 2}},
@@ -1543,29 +1543,29 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
SLOT3_TYPE, ZONE1, 1, 1);
CheckRemoveTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS);
-
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::NOT_FOUND,
Ydb::Cms::GetDatabaseStatusResult::STATE_UNSPECIFIED, {}, {});
-
- CheckRemoveTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::NOT_FOUND);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8}}});
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_REMOVE_REQUESTS, 2);
- CheckCounter(runtime, {{ {"status", "SUCCESS"} }}, TTenantsManager::COUNTER_REMOVE_RESPONSES, 1);
- CheckCounter(runtime, {{ {"status", "NOT_FOUND"} }}, TTenantsManager::COUNTER_REMOVE_RESPONSES, 1);
-
- RestartConsole(runtime);
-
+
+ CheckRemoveTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::NOT_FOUND);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8}}});
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_REMOVE_REQUESTS, 2);
+ CheckCounter(runtime, {{ {"status", "SUCCESS"} }}, TTenantsManager::COUNTER_REMOVE_RESPONSES, 1);
+ CheckCounter(runtime, {{ {"status", "NOT_FOUND"} }}, TTenantsManager::COUNTER_REMOVE_RESPONSES, 1);
+
+ RestartConsole(runtime);
+
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}, {"hdd-1", 2}},
- SLOT1_TYPE, ZONE1, 3,
- SLOT2_TYPE, ZONE1, 2,
- SLOT3_TYPE, ZONE1, 1);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 10, 10, 10}}});
-
+ {{"hdd", 1}, {"hdd-1", 2}},
+ SLOT1_TYPE, ZONE1, 3,
+ SLOT2_TYPE, ZONE1, 2,
+ SLOT3_TYPE, ZONE1, 1);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 10, 10, 10}}});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}, {"hdd-1", 2, 2}}, {},
@@ -1574,21 +1574,21 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
SLOT3_TYPE, ZONE1, 1, 1);
CheckRemoveTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS);
-
- // Restart to check we don't load any garbage for removed tenant.
- RestartConsole(runtime);
-
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::NOT_FOUND,
- Ydb::Cms::GetDatabaseStatusResult::STATE_UNSPECIFIED, {}, {});
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 0);
- }
-
+
+ // Restart to check we don't load any garbage for removed tenant.
+ RestartConsole(runtime);
+
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::NOT_FOUND,
+ Ydb::Cms::GetDatabaseStatusResult::STATE_UNSPECIFIED, {}, {});
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 0);
+ }
+
Y_UNIT_TEST(TestRemoveTenant) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestRemoveTenant(runtime);
}
-
+
Y_UNIT_TEST(TestRemoveTenantExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestRemoveTenant(runtime);
@@ -1668,50 +1668,50 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
void RunTestCreateSubSubDomain(TTenantTestRuntime& runtime) {
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}, {"hdd-1", 2}},
- SLOT1_TYPE, ZONE1, 3,
- SLOT2_TYPE, ZONE1, 2,
- SLOT3_TYPE, ZONE1, 1);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 10, 10, 10}}});
-
+ {{"hdd", 1}, {"hdd-1", 2}},
+ SLOT1_TYPE, ZONE1, 3,
+ SLOT2_TYPE, ZONE1, 2,
+ SLOT3_TYPE, ZONE1, 1);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 10, 10, 10}}});
+
CheckCreateTenant(runtime, TENANT1_1_NAME + "/sub", Ydb::StatusIds::GENERIC_ERROR,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1,
- SLOT2_TYPE, ZONE1, 2,
- SLOT3_TYPE, ZONE1, 3);
- WaitForTenantStatus(runtime, TENANT1_1_NAME + "/sub", Ydb::StatusIds::NOT_FOUND);
-
- // Check unsuccessful tenant creation doesn't break counters.
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 1);
- CheckCounter(runtime, {{ {"kind", SLOT1_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 3);
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 2);
- CheckCounter(runtime, {{ {"kind", SLOT3_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 2);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 2);
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_CONFIGURE_SUBDOMAIN_FAILED, 1);
-
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1,
+ SLOT2_TYPE, ZONE1, 2,
+ SLOT3_TYPE, ZONE1, 3);
+ WaitForTenantStatus(runtime, TENANT1_1_NAME + "/sub", Ydb::StatusIds::NOT_FOUND);
+
+ // Check unsuccessful tenant creation doesn't break counters.
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 1);
+ CheckCounter(runtime, {{ {"kind", SLOT1_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 3);
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 2);
+ CheckCounter(runtime, {{ {"kind", SLOT3_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 2);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 2);
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_CONFIGURE_SUBDOMAIN_FAILED, 1);
+
CheckRemoveTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS);
-
+
CheckCreateTenant(runtime, TENANT1_1_NAME + "/sub", Ydb::StatusIds::SUCCESS,
- {{"hdd", 2}},
- SLOT1_TYPE, ZONE1, 1,
- SLOT2_TYPE, ZONE1, 2,
- SLOT3_TYPE, ZONE1, 3);
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 1);
- CheckCounter(runtime, {{ {"kind", SLOT1_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 2);
- CheckCounter(runtime, {{ {"kind", SLOT3_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 3);
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 2);
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 2);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 0);
- CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 0);
- }
-
+ {{"hdd", 2}},
+ SLOT1_TYPE, ZONE1, 1,
+ SLOT2_TYPE, ZONE1, 2,
+ SLOT3_TYPE, ZONE1, 3);
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS, 1);
+ CheckCounter(runtime, {{ {"kind", SLOT1_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 2);
+ CheckCounter(runtime, {{ {"kind", SLOT3_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 3);
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 2);
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 2);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 0);
+ CheckCounter(runtime, {{ {"kind", "hdd-1"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 0);
+ }
+
Y_UNIT_TEST(TestCreateSubSubDomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestCreateSubSubDomain(runtime);
@@ -1722,189 +1722,189 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
RunTestCreateSubSubDomain(runtime);
}
- Y_UNIT_TEST(TestDefaultAvailabilityZone) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
+ Y_UNIT_TEST(TestDefaultAvailabilityZone) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}, {"hdd-1", 2}},
- SLOT1_TYPE, ZONE1, 3,
- SLOT2_TYPE, ZONE1, 2,
- SLOT3_TYPE, ZONE1, 1);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 10, 10, 10}}});
-
-
-
- RestartConsole(runtime);
-
+ {{"hdd", 1}, {"hdd-1", 2}},
+ SLOT1_TYPE, ZONE1, 3,
+ SLOT2_TYPE, ZONE1, 2,
+ SLOT3_TYPE, ZONE1, 1);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 10, 10, 10}}});
+
+
+
+ RestartConsole(runtime);
+
CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {SLOT1_TYPE, "", 1},
- {SLOT2_TYPE, "", 2},
- {SLOT3_TYPE, "", 3} }},
- {});
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 24, 24, 24}}});
- }
-
- Y_UNIT_TEST(TestRegisterComputationalUnitsForPending) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
+ {{ {SLOT1_TYPE, "", 1},
+ {SLOT2_TYPE, "", 2},
+ {SLOT3_TYPE, "", 3} }},
+ {});
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 24, 24, 24}}});
+ }
+
+ Y_UNIT_TEST(TestRegisterComputationalUnitsForPending) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
CheckCreateTenant(runtime, Ydb::StatusIds::SUCCESS,
TCreateTenantRequest(TENANT1_1_NAME).WithPools({{"hdd", 1}, {"hdd-1", 1}}));
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8}}});
-
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
- {{"hdd", 1, 1}, {"hdd-1", 1, 1}}, {});
-
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8}}});
+
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
+ {{"hdd", 1, 1}, {"hdd-1", 1, 1}}, {});
+
CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {"host1", 1, "kind1"},
- {"host2", 2, "kind2"} }},
- {});
-
+ {{ {"host1", 1, "kind1"},
+ {"host2", 2, "kind2"} }},
+ {});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
- {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
- {{"host1", 1, "kind1"}, {"host2", 2, "kind2"}});
-
- CheckCounter(runtime, {{ {"kind", "kind1"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "kind2"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
-
+ Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
+ {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
+ {{"host1", 1, "kind1"}, {"host2", 2, "kind2"}});
+
+ CheckCounter(runtime, {{ {"kind", "kind1"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "kind2"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
+
CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {"host3", 3, "kind2"} }},
- {{ {"host1", 1, ""} }});
-
- CheckCounter(runtime, {{ {"kind", "kind1"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 0);
- CheckCounter(runtime, {{ {"kind", "kind2"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 2);
-
+ {{ {"host3", 3, "kind2"} }},
+ {{ {"host1", 1, ""} }});
+
+ CheckCounter(runtime, {{ {"kind", "kind1"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 0);
+ CheckCounter(runtime, {{ {"kind", "kind2"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 2);
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
- {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
- {{"host2", 2, "kind2"}, {"host3", 3, "kind2"}});
-
+ Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
+ {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
+ {{"host2", 2, "kind2"}, {"host3", 3, "kind2"}});
+
CheckCreateTenant(runtime, Ydb::StatusIds::SUCCESS,
TCreateTenantRequest(TENANT1_2_NAME).WithPools({{"hdd", 1}, {"hdd-1", 1}}));
-
- CheckAlterRegisteredUnits(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{ {"host4", 4, "kind1"},
- {"host5", 5, "kind2"} }},
- {});
-
- CheckCounter(runtime, {{ {"kind", "kind1"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "kind2"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 3);
-
- CheckRemoveTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS);
-
- CheckCounter(runtime, {{ {"kind", "kind1"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "kind2"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
-
- RestartConsole(runtime);
-
- CheckTenantStatus(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
- {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
- {{"host4", 4, "kind1"}, {"host5", 5, "kind2"}});
-
- CheckCounter(runtime, {{ {"kind", "kind1"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "kind2"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
- }
-
- Y_UNIT_TEST(TestRegisterComputationalUnitsForRunning) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}, {"hdd-1", 1}},
- SLOT1_TYPE, ZONE1, 1);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 1, 1, 1}}});
-
- CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {"host1", 1, "kind1"},
- {"host2", 2, "kind2"} }},
- {});
-
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::RUNNING,
- {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
- {{"host1", 1, "kind1"}, {"host2", 2, "kind2"}},
- SLOT1_TYPE, ZONE1, 1, 1);
-
- CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {},
- {{ {"host1", 1, ""} }});
-
- CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- Ydb::Cms::GetDatabaseStatusResult::RUNNING,
- {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
- {{"host2", 2, "kind2"}},
- SLOT1_TYPE, ZONE1, 1, 1);
-
- RestartConsole(runtime);
-
+
+ CheckAlterRegisteredUnits(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
+ {{ {"host4", 4, "kind1"},
+ {"host5", 5, "kind2"} }},
+ {});
+
+ CheckCounter(runtime, {{ {"kind", "kind1"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "kind2"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 3);
+
+ CheckRemoveTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS);
+
+ CheckCounter(runtime, {{ {"kind", "kind1"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "kind2"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
+
+ RestartConsole(runtime);
+
+ CheckTenantStatus(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES,
+ {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
+ {{"host4", 4, "kind1"}, {"host5", 5, "kind2"}});
+
+ CheckCounter(runtime, {{ {"kind", "kind1"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "kind2"} }}, TTenantsManager::COUNTER_REGISTERED_UNITS, 1);
+ }
+
+ Y_UNIT_TEST(TestRegisterComputationalUnitsForRunning) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}, {"hdd-1", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 1, 1, 1}}});
+
+ CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{ {"host1", 1, "kind1"},
+ {"host2", 2, "kind2"} }},
+ {});
+
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::RUNNING,
+ {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
+ {{"host1", 1, "kind1"}, {"host2", 2, "kind2"}},
+ SLOT1_TYPE, ZONE1, 1, 1);
+
+ CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {},
+ {{ {"host1", 1, ""} }});
+
+ CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ Ydb::Cms::GetDatabaseStatusResult::RUNNING,
+ {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
+ {{"host2", 2, "kind2"}},
+ SLOT1_TYPE, ZONE1, 1, 1);
+
+ RestartConsole(runtime);
+
CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::BAD_REQUEST,
- {},
- {{ {"host1", 1, "kind1"} }});
-
+ {},
+ {{ {"host1", 1, "kind1"} }});
+
CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::BAD_REQUEST,
- {{ {"host2", 2, "kind1"} }},
- {});
-
+ {{ {"host2", 2, "kind1"} }},
+ {});
+
CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {"host2", 2, "kind2"} }},
- {});
-
+ {{ {"host2", 2, "kind2"} }},
+ {});
+
CheckAlterRegisteredUnits(runtime, TENANT1_1_NAME, Ydb::StatusIds::BAD_REQUEST,
- {{ {"host1", 1, "kind1"},
- {"host1", 1, "kind2"} }},
- {});
-
+ {{ {"host1", 1, "kind1"},
+ {"host1", 1, "kind2"} }},
+ {});
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
- {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
- {{"host2", 2, "kind2"}},
- SLOT1_TYPE, ZONE1, 1, 1);
- }
-
+ {{"hdd", 1, 1}, {"hdd-1", 1, 1}},
+ {{"host2", 2, "kind2"}},
+ SLOT1_TYPE, ZONE1, 1, 1);
+ }
+
void RunTestNotifyOperationCompletion(TTenantTestRuntime& runtime) {
- TAutoPtr<IEventHandle> handle;
-
- // This observer should intercept events about pool creation/removal
- // and thus pause tenant creation/removal.
- TVector<TAutoPtr<IEventHandle>> captured;
- runtime.SetObserverFunc(CatchPoolEvent(captured));
-
- // Send tenant creation command and store operation id.
+ TAutoPtr<IEventHandle> handle;
+
+ // This observer should intercept events about pool creation/removal
+ // and thus pause tenant creation/removal.
+ TVector<TAutoPtr<IEventHandle>> captured;
+ runtime.SetObserverFunc(CatchPoolEvent(captured));
+
+ // Send tenant creation command and store operation id.
TString id = SendTenantCreationCommand(runtime, TENANT1_1_NAME, "create-1-key");
- // Send notification request. Tenant shouldn't be created by that time,
- // so we should get TEvNotifyOperationCompletionResponse.
- CheckNotificationRequest(runtime, id);
-
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 0);
-
- // Now remove observer, get back intercepted event (if any) and wait for
- // tenant creation notification.
- {
- runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
- SendCaptured(runtime, captured);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvOperationCompletionNotification>(handle);
- auto &operation = reply->Record.GetResponse().operation();
- UNIT_ASSERT(operation.ready());
- UNIT_ASSERT_VALUES_EQUAL(operation.id(), id);
- UNIT_ASSERT_VALUES_EQUAL(operation.status(), Ydb::StatusIds::SUCCESS);
- }
-
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 1);
-
- // Now notification request should cause instant TEvOperationCompletionNotification
- // with no TEvNotifyOperationCompletionResponse.
- CheckNotificationRequest(runtime, id, Ydb::StatusIds::SUCCESS);
-
+ // Send notification request. Tenant shouldn't be created by that time,
+ // so we should get TEvNotifyOperationCompletionResponse.
+ CheckNotificationRequest(runtime, id);
+
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 0);
+
+ // Now remove observer, get back intercepted event (if any) and wait for
+ // tenant creation notification.
+ {
+ runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
+ SendCaptured(runtime, captured);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvOperationCompletionNotification>(handle);
+ auto &operation = reply->Record.GetResponse().operation();
+ UNIT_ASSERT(operation.ready());
+ UNIT_ASSERT_VALUES_EQUAL(operation.id(), id);
+ UNIT_ASSERT_VALUES_EQUAL(operation.status(), Ydb::StatusIds::SUCCESS);
+ }
+
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_REQUESTED_STORAGE_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "hdd"} }}, TTenantsManager::COUNTER_ALLOCATED_STORAGE_UNITS, 1);
+
+ // Now notification request should cause instant TEvOperationCompletionNotification
+ // with no TEvNotifyOperationCompletionResponse.
+ CheckNotificationRequest(runtime, id, Ydb::StatusIds::SUCCESS);
+
// Create existing tenant using correct idempotency key, we should get the same operation id
TString id2 = SendTenantCreationCommand(runtime, TENANT1_1_NAME, "create-1-key");
UNIT_ASSERT_VALUES_EQUAL(id, id2);
@@ -1912,61 +1912,61 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
// Create existing tenant using different idempotency key, we should get an error
SendTenantCreationCommand(runtime, TENANT1_1_NAME, "create-1-wrong-key", Ydb::StatusIds::ALREADY_EXISTS);
- // Send another tenant creation command and store operation id.
- runtime.SetObserverFunc(CatchPoolEvent(captured));
- id = SendTenantCreationCommand(runtime, TENANT1_1_NAME + "/sub");
- // Send notification request. Tenant shouldn't be created by that time,
- // so we should get TEvNotifyOperationCompletionResponse.
- CheckNotificationRequest(runtime, id);
-
- // Not remove observer, get back intercepted event (if any) and wait for
- // tenant creation notification.
- {
- runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
- SendCaptured(runtime, captured);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvOperationCompletionNotification>(handle);
- auto &operation = reply->Record.GetResponse().operation();
- UNIT_ASSERT(operation.ready());
- UNIT_ASSERT_VALUES_EQUAL(operation.id(), id);
- UNIT_ASSERT_VALUES_EQUAL(operation.status(), Ydb::StatusIds::GENERIC_ERROR);
- }
-
- // Now notification request should cause instant TEvOperationCompletionNotification
- // with no TEvNotifyOperationCompletionResponse.
- CheckNotificationRequest(runtime, id, Ydb::StatusIds::GENERIC_ERROR);
-
+ // Send another tenant creation command and store operation id.
+ runtime.SetObserverFunc(CatchPoolEvent(captured));
+ id = SendTenantCreationCommand(runtime, TENANT1_1_NAME + "/sub");
+ // Send notification request. Tenant shouldn't be created by that time,
+ // so we should get TEvNotifyOperationCompletionResponse.
+ CheckNotificationRequest(runtime, id);
+
+ // Not remove observer, get back intercepted event (if any) and wait for
+ // tenant creation notification.
+ {
+ runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
+ SendCaptured(runtime, captured);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvOperationCompletionNotification>(handle);
+ auto &operation = reply->Record.GetResponse().operation();
+ UNIT_ASSERT(operation.ready());
+ UNIT_ASSERT_VALUES_EQUAL(operation.id(), id);
+ UNIT_ASSERT_VALUES_EQUAL(operation.status(), Ydb::StatusIds::GENERIC_ERROR);
+ }
+
+ // Now notification request should cause instant TEvOperationCompletionNotification
+ // with no TEvNotifyOperationCompletionResponse.
+ CheckNotificationRequest(runtime, id, Ydb::StatusIds::GENERIC_ERROR);
+
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}}, {},
SLOT1_TYPE, ZONE1, 1, 1);
- // Send tenant removal command and store operation id.
- runtime.SetObserverFunc(CatchPoolEvent(captured));
- id = SendTenantRemovalCommand(runtime, TENANT1_1_NAME);
-
- // Send notification request. Tenant shouldn't be removed by that time,
- // so we should get TEvNotifyOperationCompletionResponse.
- CheckNotificationRequest(runtime, id);
-
- // Not remove observer, get back intercepted event (if any) and wait for
- // tenant removal notification.
- {
- runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
- SendCaptured(runtime, captured);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvOperationCompletionNotification>(handle);
- auto &operation = reply->Record.GetResponse().operation();
- UNIT_ASSERT(operation.ready());
- UNIT_ASSERT_VALUES_EQUAL(operation.id(), id);
- UNIT_ASSERT_VALUES_EQUAL(operation.status(), Ydb::StatusIds::SUCCESS);
- }
-
- // Now notification request should cause instant TEvOperationCompletionNotification
- // with no TEvNotifyOperationCompletionResponse.
- CheckNotificationRequest(runtime, id, Ydb::StatusIds::SUCCESS);
- }
-
+ // Send tenant removal command and store operation id.
+ runtime.SetObserverFunc(CatchPoolEvent(captured));
+ id = SendTenantRemovalCommand(runtime, TENANT1_1_NAME);
+
+ // Send notification request. Tenant shouldn't be removed by that time,
+ // so we should get TEvNotifyOperationCompletionResponse.
+ CheckNotificationRequest(runtime, id);
+
+ // Not remove observer, get back intercepted event (if any) and wait for
+ // tenant removal notification.
+ {
+ runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
+ SendCaptured(runtime, captured);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvOperationCompletionNotification>(handle);
+ auto &operation = reply->Record.GetResponse().operation();
+ UNIT_ASSERT(operation.ready());
+ UNIT_ASSERT_VALUES_EQUAL(operation.id(), id);
+ UNIT_ASSERT_VALUES_EQUAL(operation.status(), Ydb::StatusIds::SUCCESS);
+ }
+
+ // Now notification request should cause instant TEvOperationCompletionNotification
+ // with no TEvNotifyOperationCompletionResponse.
+ CheckNotificationRequest(runtime, id, Ydb::StatusIds::SUCCESS);
+ }
+
Y_UNIT_TEST(TestNotifyOperationCompletion) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestNotifyOperationCompletion(runtime);
}
@@ -1976,76 +1976,76 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
}
void RunTestAuthorization(TTenantTestRuntime& runtime) {
- for (ui32 i = 0; i < runtime.GetNodeCount(); ++i) {
- auto &appData = runtime.GetAppData(i);
- appData.AdministrationAllowedSIDs.push_back("root@builtin");
- }
-
- CheckCreateTenant(runtime, TENANT1_1_NAME,
- NACLib::TUserToken("root@builtin", {}).SerializeAsString(),
- Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}, {"hdd-1", 3}},
- SLOT1_TYPE, ZONE1, 1);
-
- CheckCreateTenant(runtime, TENANT1_2_NAME,
- NACLib::TUserToken("root@builtin", {}).SerializeAsString(),
- Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}, {"hdd-1", 3}},
- SLOT1_TYPE, ZONE1, 1);
-
- CheckCreateTenant(runtime, TENANT1_3_NAME,
- NACLib::TUserToken("user1@builtin", {}).SerializeAsString(),
- Ydb::StatusIds::UNAUTHORIZED,
- {{"hdd", 1}, {"hdd-1", 3}},
- SLOT1_TYPE, ZONE1, 1);
-
- CheckAlterTenantPools(runtime, TENANT1_1_NAME,
- NACLib::TUserToken("root@builtin", {}).SerializeAsString(),
- Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}}, false);
-
- CheckRemoveTenant(runtime, TENANT1_1_NAME,
- NACLib::TUserToken("root@builtin", {}).SerializeAsString(),
- Ydb::StatusIds::SUCCESS);
-
- CheckAlterTenantPools(runtime, TENANT1_2_NAME,
- NACLib::TUserToken("user1@builtin", {}).SerializeAsString(),
- Ydb::StatusIds::UNAUTHORIZED,
- {{"hdd", 1}}, false);
-
- CheckRemoveTenant(runtime, TENANT1_2_NAME,
- NACLib::TUserToken("user1@builtin", {}).SerializeAsString(),
- Ydb::StatusIds::UNAUTHORIZED);
- }
-
+ for (ui32 i = 0; i < runtime.GetNodeCount(); ++i) {
+ auto &appData = runtime.GetAppData(i);
+ appData.AdministrationAllowedSIDs.push_back("root@builtin");
+ }
+
+ CheckCreateTenant(runtime, TENANT1_1_NAME,
+ NACLib::TUserToken("root@builtin", {}).SerializeAsString(),
+ Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}, {"hdd-1", 3}},
+ SLOT1_TYPE, ZONE1, 1);
+
+ CheckCreateTenant(runtime, TENANT1_2_NAME,
+ NACLib::TUserToken("root@builtin", {}).SerializeAsString(),
+ Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}, {"hdd-1", 3}},
+ SLOT1_TYPE, ZONE1, 1);
+
+ CheckCreateTenant(runtime, TENANT1_3_NAME,
+ NACLib::TUserToken("user1@builtin", {}).SerializeAsString(),
+ Ydb::StatusIds::UNAUTHORIZED,
+ {{"hdd", 1}, {"hdd-1", 3}},
+ SLOT1_TYPE, ZONE1, 1);
+
+ CheckAlterTenantPools(runtime, TENANT1_1_NAME,
+ NACLib::TUserToken("root@builtin", {}).SerializeAsString(),
+ Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}}, false);
+
+ CheckRemoveTenant(runtime, TENANT1_1_NAME,
+ NACLib::TUserToken("root@builtin", {}).SerializeAsString(),
+ Ydb::StatusIds::SUCCESS);
+
+ CheckAlterTenantPools(runtime, TENANT1_2_NAME,
+ NACLib::TUserToken("user1@builtin", {}).SerializeAsString(),
+ Ydb::StatusIds::UNAUTHORIZED,
+ {{"hdd", 1}}, false);
+
+ CheckRemoveTenant(runtime, TENANT1_2_NAME,
+ NACLib::TUserToken("user1@builtin", {}).SerializeAsString(),
+ Ydb::StatusIds::UNAUTHORIZED);
+ }
+
Y_UNIT_TEST(TestAuthorization) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestAuthorization(runtime);
}
-
+
Y_UNIT_TEST(TestAuthorizationExtSubdomain) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestAuthorization(runtime);
}
-
+
bool CheckAttrsPresent(TTenantTestRuntime& runtime, const TString& tenantName, THashMap<TString, TString> attrs, bool skipAbsent = false) {
auto request = MakeHolder<TEvSchemeShard::TEvDescribeScheme>(tenantName);
ForwardToTablet(runtime, SCHEME_SHARD1_ID, runtime.Sender, request.Release());
-
- TAutoPtr<IEventHandle> handle;
+
+ TAutoPtr<IEventHandle> handle;
auto reply = runtime.GrabEdgeEvent<TEvSchemeShard::TEvDescribeSchemeResult>(handle);
Cerr << "Reply: " << reply->GetRecord().DebugString() << "\n";
- for (auto &attr : reply->GetRecord().GetPathDescription().GetUserAttributes()) {
+ for (auto &attr : reply->GetRecord().GetPathDescription().GetUserAttributes()) {
if (!skipAbsent) {
UNIT_ASSERT(attrs.contains(attr.GetKey()));
UNIT_ASSERT_VALUES_EQUAL(attrs.at(attr.GetKey()), attr.GetValue());
}
- attrs.erase(attr.GetKey());
- }
+ attrs.erase(attr.GetKey());
+ }
return attrs.empty();
}
-
+
void RunTestAttributes(TTenantTestRuntime& runtime) {
// Create tenant with attrs and check subdomain has them attached.
runtime.SetLogPriority(NKikimrServices::FLAT_TX_SCHEMESHARD, NActors::NLog::PRI_DEBUG);
@@ -2064,15 +2064,15 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
UNIT_ASSERT(CheckAttrsPresent(runtime, TENANT1_1_NAME, THashMap<TString, TString> {{"name1", "value1"}, {"name2", "value2"}}));
- // Requests with wrong attributes.
- CheckCreateTenant(runtime, TENANT1_2_NAME,
- Ydb::StatusIds::BAD_REQUEST,
- {{"hdd", 1}, {"hdd-1", 3}},
- TVector<std::pair<TString, TString>>({{"", "value1"}}));
- CheckCreateTenant(runtime, TENANT1_2_NAME,
- Ydb::StatusIds::BAD_REQUEST,
- {{"hdd", 1}, {"hdd-1", 3}},
- TVector<std::pair<TString, TString>>({{"name1", ""}}));
+ // Requests with wrong attributes.
+ CheckCreateTenant(runtime, TENANT1_2_NAME,
+ Ydb::StatusIds::BAD_REQUEST,
+ {{"hdd", 1}, {"hdd-1", 3}},
+ TVector<std::pair<TString, TString>>({{"", "value1"}}));
+ CheckCreateTenant(runtime, TENANT1_2_NAME,
+ Ydb::StatusIds::BAD_REQUEST,
+ {{"hdd", 1}, {"hdd-1", 3}},
+ TVector<std::pair<TString, TString>>({{"name1", ""}}));
CheckAlterTenantSlots(runtime, TENANT1_1_NAME, 0,
Ydb::StatusIds::SUCCESS, {}, {},
@@ -2098,7 +2098,7 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
runtime.SetLogPriority(NKikimrServices::TX_COORDINATOR, NActors::NLog::PRI_DEBUG);
CheckCreateTenant(runtime, TENANT1_1_NAME,
Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}, {"hdd-1", 3}},
+ {{"hdd", 1}, {"hdd-1", 3}},
TVector<std::pair<TString, TString>>({{"name1", "value1"}, {"name2", "value2"}}),
SLOT1_TYPE, ZONE1, 1);
@@ -2124,8 +2124,8 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
}
CheckAttrsPresent(runtime, TENANT1_1_NAME, THashMap<TString, TString> {{"name1", "value1"}});
- }
-
+ }
+
Y_UNIT_TEST(TestAttributes) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestAttributes(runtime);
@@ -2146,292 +2146,292 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
RunTestRemoveAttributes(runtime);
}
- Y_UNIT_TEST(TestTenantsQuota) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- // Set tenants quota to 2.
- NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
- auto &quota = *config.MutableTenantsConfig()->MutableClusterQuota();
- quota.SetTenantsQuota(2);
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
-
- // Create first tenant.
- CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
- // Wrong request shouldn't eat quota.
+ Y_UNIT_TEST(TestTenantsQuota) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ // Set tenants quota to 2.
+ NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
+ auto &quota = *config.MutableTenantsConfig()->MutableClusterQuota();
+ quota.SetTenantsQuota(2);
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+
+ // Create first tenant.
+ CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+ // Wrong request shouldn't eat quota.
CheckCreateTenant(runtime, Ydb::StatusIds::BAD_REQUEST, TCreateTenantRequest(""));
- // This one should fail on subdomain creation and then release quota.
+ // This one should fail on subdomain creation and then release quota.
CheckCreateTenant(runtime, Ydb::StatusIds::GENERIC_ERROR,
TCreateTenantRequest(TENANT1_1_NAME + "/sub").WithPools({{"hdd", 1}}));
- // Here status is received before tenant is completely removed.
- // Wait for complete removal.
- WaitForTenantStatus(runtime, TENANT1_1_NAME + "/sub", Ydb::StatusIds::NOT_FOUND);
- // Create second tenant.
- CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
- // Quota is exceeded.
- CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
- // Remove tenant to get some free quota.
+ // Here status is received before tenant is completely removed.
+ // Wait for complete removal.
+ WaitForTenantStatus(runtime, TENANT1_1_NAME + "/sub", Ydb::StatusIds::NOT_FOUND);
+ // Create second tenant.
+ CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+ // Quota is exceeded.
+ CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+ // Remove tenant to get some free quota.
WaitTenantRunning(runtime, TENANT1_2_NAME); // workaround for scheme cache race
- CheckRemoveTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS);
- // Create second tenant.
- CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
- // Quota is exceeded again.
- CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
- // Increase quota.
- quota.SetTenantsQuota(3);
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
- // Now we can create third tenant.
- CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS_QUOTA_EXCEEDED, 2);
- }
-
- Y_UNIT_TEST(TestComputationalUnitsQuota) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- // Set tenants quota to 2.
- NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
- auto &quota = *config.MutableTenantsConfig()->MutableClusterQuota();
- quota.SetComputationalUnitsQuota(10);
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
-
- // OK.
- CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT3_TYPE, ZONE_ANY, 5);
+ CheckRemoveTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS);
+ // Create second tenant.
+ CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+ // Quota is exceeded again.
+ CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+ // Increase quota.
+ quota.SetTenantsQuota(3);
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+ // Now we can create third tenant.
+ CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_TENANTS_QUOTA_EXCEEDED, 2);
+ }
+
+ Y_UNIT_TEST(TestComputationalUnitsQuota) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ // Set tenants quota to 2.
+ NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
+ auto &quota = *config.MutableTenantsConfig()->MutableClusterQuota();
+ quota.SetComputationalUnitsQuota(10);
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+
+ // OK.
+ CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ SLOT3_TYPE, ZONE_ANY, 5);
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}}, {},
SLOT3_TYPE, ZONE_ANY, 5, 5);
- // Wrong request shouldn't eat quota.
- CheckCreateTenant(runtime, "", Ydb::StatusIds::BAD_REQUEST,
- {{"hdd", 1}},
- SLOT2_TYPE, ZONE_ANY, 5);
- // This one should fail on subdomain creation and then release quota.
- CheckCreateTenant(runtime, TENANT1_1_NAME + "/sub", Ydb::StatusIds::GENERIC_ERROR,
- {{"hdd", 1}},
- SLOT2_TYPE, ZONE_ANY, 5);
- // Wait for complete tenant removal.
- WaitForTenantStatus(runtime, TENANT1_1_NAME + "/sub", Ydb::StatusIds::NOT_FOUND);
+ // Wrong request shouldn't eat quota.
+ CheckCreateTenant(runtime, "", Ydb::StatusIds::BAD_REQUEST,
+ {{"hdd", 1}},
+ SLOT2_TYPE, ZONE_ANY, 5);
+ // This one should fail on subdomain creation and then release quota.
+ CheckCreateTenant(runtime, TENANT1_1_NAME + "/sub", Ydb::StatusIds::GENERIC_ERROR,
+ {{"hdd", 1}},
+ SLOT2_TYPE, ZONE_ANY, 5);
+ // Wait for complete tenant removal.
+ WaitForTenantStatus(runtime, TENANT1_1_NAME + "/sub", Ydb::StatusIds::NOT_FOUND);
CheckTenantStatus(runtime, TENANT1_1_NAME + "/sub", Ydb::StatusIds::NOT_FOUND,
Ydb::Cms::GetDatabaseStatusResult::STATE_UNSPECIFIED, {}, {});
- // OK.
- CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT2_TYPE, ZONE_ANY, 5);
+ // OK.
+ CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ SLOT2_TYPE, ZONE_ANY, 5);
CheckTenantStatus(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}}, {},
SLOT2_TYPE, ZONE_ANY, 5, 5);
- // Out of quota.
- CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{"hdd", 1}},
- SLOT3_TYPE, ZONE_ANY, 5);
- // Out of quota.
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{ {SLOT3_TYPE, ZONE_ANY, 1} }},
- {});
- // OK to add if some slots are removed.
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {SLOT2_TYPE, ZONE_ANY, 2} }},
- {{ {SLOT3_TYPE, ZONE_ANY, 3} }});
- // Out of quota.
- CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{ {SLOT3_TYPE, ZONE_ANY, 2} }},
- {});
- // OK.
- CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{ {SLOT3_TYPE, ZONE_ANY, 1} }},
- {});
+ // Out of quota.
+ CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{"hdd", 1}},
+ SLOT3_TYPE, ZONE_ANY, 5);
+ // Out of quota.
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{ {SLOT3_TYPE, ZONE_ANY, 1} }},
+ {});
+ // OK to add if some slots are removed.
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{ {SLOT2_TYPE, ZONE_ANY, 2} }},
+ {{ {SLOT3_TYPE, ZONE_ANY, 3} }});
+ // Out of quota.
+ CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{ {SLOT3_TYPE, ZONE_ANY, 2} }},
+ {});
+ // OK.
+ CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
+ {{ {SLOT3_TYPE, ZONE_ANY, 1} }},
+ {});
CheckTenantStatus(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}}, {},
SLOT2_TYPE, ZONE_ANY, 5, 5,
SLOT3_TYPE, ZONE_ANY, 1, 1);
- // Remove tenant to release some resources.
- CheckRemoveTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS);
+ // Remove tenant to release some resources.
+ CheckRemoveTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS);
CheckTenantStatus(runtime, TENANT1_2_NAME, Ydb::StatusIds::NOT_FOUND,
Ydb::Cms::GetDatabaseStatusResult::STATE_UNSPECIFIED, {}, {});
- // OK.
- CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT2_TYPE, ZONE_ANY, 6);
+ // OK.
+ CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ SLOT2_TYPE, ZONE_ANY, 6);
CheckTenantStatus(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}}, {},
SLOT2_TYPE, ZONE_ANY, 6, 6);
- // Out of quota.
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{ {SLOT3_TYPE, ZONE_ANY, 1} }},
- {});
-
- CheckCounter(runtime, {}, TTenantsManager::COUNTER_COMPUTATIONAL_QUOTA_EXCEEDED, 4);
-
- // Check quota is correctly computed after Console restart.
- RestartConsole(runtime);
-
- // Out of quota.
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{ {SLOT3_TYPE, ZONE_ANY, 1} }},
- {});
- // OK to change slot type.
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {SLOT2_TYPE, ZONE_ANY, 1} }},
- {{ {SLOT3_TYPE, ZONE_ANY, 1} }});
- }
-
- Y_UNIT_TEST(TestComputationalUnitsLoadQuota) {
- TTenantTestRuntime runtime(ConsoleTestConfig3DC());
-
- // Set tenants quota to 2.
- NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
- auto &quota = *config.MutableTenantsConfig()->MutableClusterQuota();
- quota.SetComputationalUnitsLoadQuota(67);
- auto anyUnit = config.MutableTenantsConfig()->AddComputationalUnitKinds();
- anyUnit->SetKind("any");
- anyUnit->SetTenantSlotType("");
- anyUnit->SetAvailabilityZoneSet("all");
- CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
-
- // OK.
- CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT2_TYPE, ZONE_ANY, 5);
+ // Out of quota.
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{ {SLOT3_TYPE, ZONE_ANY, 1} }},
+ {});
+
+ CheckCounter(runtime, {}, TTenantsManager::COUNTER_COMPUTATIONAL_QUOTA_EXCEEDED, 4);
+
+ // Check quota is correctly computed after Console restart.
+ RestartConsole(runtime);
+
+ // Out of quota.
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{ {SLOT3_TYPE, ZONE_ANY, 1} }},
+ {});
+ // OK to change slot type.
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{ {SLOT2_TYPE, ZONE_ANY, 1} }},
+ {{ {SLOT3_TYPE, ZONE_ANY, 1} }});
+ }
+
+ Y_UNIT_TEST(TestComputationalUnitsLoadQuota) {
+ TTenantTestRuntime runtime(ConsoleTestConfig3DC());
+
+ // Set tenants quota to 2.
+ NKikimrConsole::TConfig config = GetCurrentConfig(runtime);
+ auto &quota = *config.MutableTenantsConfig()->MutableClusterQuota();
+ quota.SetComputationalUnitsLoadQuota(67);
+ auto anyUnit = config.MutableTenantsConfig()->AddComputationalUnitKinds();
+ anyUnit->SetKind("any");
+ anyUnit->SetTenantSlotType("");
+ anyUnit->SetAvailabilityZoneSet("all");
+ CheckSetConfig(runtime, config, Ydb::StatusIds::SUCCESS);
+
+ // OK.
+ CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ SLOT2_TYPE, ZONE_ANY, 5);
CheckTenantStatus(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}}, {},
SLOT2_TYPE, ZONE_ANY, 5, 5);
- // Out of quota for SLOT2_TYPE.
- CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{"hdd", 1}},
- SLOT2_TYPE, ZONE1, 2);
- // OK.
- CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT2_TYPE, ZONE1, 1);
+ // Out of quota for SLOT2_TYPE.
+ CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{"hdd", 1}},
+ SLOT2_TYPE, ZONE1, 2);
+ // OK.
+ CheckCreateTenant(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ SLOT2_TYPE, ZONE1, 1);
CheckTenantStatus(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}}, {},
SLOT2_TYPE, ZONE1, 1, 1);
- // Out of total quota.
- CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{"hdd", 1}},
- "any", ZONE_ANY, 13);
- // OK.
- CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- "any", ZONE_ANY, 12);
+ // Out of total quota.
+ CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{"hdd", 1}},
+ "any", ZONE_ANY, 13);
+ // OK.
+ CheckCreateTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ "any", ZONE_ANY, 12);
CheckTenantStatus(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}}, {},
"any", ZONE_ANY, 12, 12);
-
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 5);
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "any"}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 12);
-
- // Out of total quota.
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{ {"any", ZONE_ANY, 1} }},
- {});
- // OK to change TYPE2_SLOT to another type.
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{ {"any", ZONE_ANY, 1} }},
- {{ {SLOT2_TYPE, ZONE_ANY, 1} }});
- // Out of SLOT2_TYPE quota.
- CheckAlterTenantSlots(runtime, TENANT1_3_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{ {SLOT2_TYPE, ZONE_ANY, 2} }},
- {{ {"any", ZONE_ANY, 2} }});
- // OK.
- CheckAlterTenantSlots(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
- {{ {SLOT2_TYPE, ZONE_ANY, 1} }},
- {{ {"any", ZONE_ANY, 1} }});
+
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 5);
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "any"}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 12);
+
+ // Out of total quota.
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{ {"any", ZONE_ANY, 1} }},
+ {});
+ // OK to change TYPE2_SLOT to another type.
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{ {"any", ZONE_ANY, 1} }},
+ {{ {SLOT2_TYPE, ZONE_ANY, 1} }});
+ // Out of SLOT2_TYPE quota.
+ CheckAlterTenantSlots(runtime, TENANT1_3_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{ {SLOT2_TYPE, ZONE_ANY, 2} }},
+ {{ {"any", ZONE_ANY, 2} }});
+ // OK.
+ CheckAlterTenantSlots(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
+ {{ {SLOT2_TYPE, ZONE_ANY, 1} }},
+ {{ {"any", ZONE_ANY, 1} }});
CheckTenantStatus(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS,
Ydb::Cms::GetDatabaseStatusResult::RUNNING,
{{"hdd", 1, 1}}, {},
"any", ZONE_ANY, 11, 11,
SLOT2_TYPE, ZONE_ANY, 1, 1);
-
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 5);
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "any"}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 12);
-
- // Remove tenant to release some resources.
- CheckRemoveTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS);
+
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 5);
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "any"}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 12);
+
+ // Remove tenant to release some resources.
+ CheckRemoveTenant(runtime, TENANT1_3_NAME, Ydb::StatusIds::SUCCESS);
CheckTenantStatus(runtime, TENANT1_3_NAME, Ydb::StatusIds::NOT_FOUND,
Ydb::Cms::GetDatabaseStatusResult::STATE_UNSPECIFIED, {}, {});
-
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 4);
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "any"}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
-
- // Out of SLOT2_TYPE quota.
- CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{ {SLOT2_TYPE, ZONE_ANY, 2} }},
- {});
- // Out of total quota.
- CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{ {SLOT2_TYPE, ZONE_ANY, 1},
- {"any", ZONE_ANY, 12} }},
- {});
- // OK
- CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
- {{ {SLOT2_TYPE, ZONE_ANY, 1},
- {"any", ZONE_ANY, 11} }},
- {});
-
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 5);
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "any"}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 12);
-
- // Check quota is correctly computed after Console restart.
- RestartConsole(runtime);
-
- // Out of quota.
- CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
- {{ {"any", ZONE_ANY, 1} }},
- {});
-
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 5);
- CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
- CheckCounter(runtime, {{ {"kind", "any"}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 12);
- }
-
+
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 4);
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "any"}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
+
+ // Out of SLOT2_TYPE quota.
+ CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{ {SLOT2_TYPE, ZONE_ANY, 2} }},
+ {});
+ // Out of total quota.
+ CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{ {SLOT2_TYPE, ZONE_ANY, 1},
+ {"any", ZONE_ANY, 12} }},
+ {});
+ // OK
+ CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::SUCCESS,
+ {{ {SLOT2_TYPE, ZONE_ANY, 1},
+ {"any", ZONE_ANY, 11} }},
+ {});
+
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 5);
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "any"}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 12);
+
+ // Check quota is correctly computed after Console restart.
+ RestartConsole(runtime);
+
+ // Out of quota.
+ CheckAlterTenantSlots(runtime, TENANT1_2_NAME, Ydb::StatusIds::UNAVAILABLE,
+ {{ {"any", ZONE_ANY, 1} }},
+ {});
+
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 5);
+ CheckCounter(runtime, {{ {"kind", SLOT2_TYPE}, {"zone", ZONE1 } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 1);
+ CheckCounter(runtime, {{ {"kind", "any"}, {"zone", ZONE_ANY } }}, TTenantsManager::COUNTER_COMPUTATIONAL_UNITS, 12);
+ }
+
void RunTestTenantGeneration(TTenantTestRuntime& runtime) {
- CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
- CheckTenantGeneration(runtime, TENANT1_1_NAME, 1);
-
- RestartConsole(runtime);
- CheckTenantGeneration(runtime, TENANT1_1_NAME, 1);
-
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, 2,
- Ydb::StatusIds::BAD_REQUEST,
- {{ {SLOT1_TYPE, ZONE1, 1} }}, {});
- CheckTenantGeneration(runtime, TENANT1_1_NAME, 1);
-
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, 1,
- Ydb::StatusIds::SUCCESS,
+ CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+ CheckTenantGeneration(runtime, TENANT1_1_NAME, 1);
+
+ RestartConsole(runtime);
+ CheckTenantGeneration(runtime, TENANT1_1_NAME, 1);
+
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, 2,
+ Ydb::StatusIds::BAD_REQUEST,
+ {{ {SLOT1_TYPE, ZONE1, 1} }}, {});
+ CheckTenantGeneration(runtime, TENANT1_1_NAME, 1);
+
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, 1,
+ Ydb::StatusIds::SUCCESS,
{{ {SLOT1_TYPE, ZONE1, 1} }}, {},
"alter-key-1");
- CheckTenantGeneration(runtime, TENANT1_1_NAME, 2);
-
- CheckAlterTenantSlots(runtime, TENANT1_1_NAME, 1,
- Ydb::StatusIds::BAD_REQUEST,
- {{ {SLOT1_TYPE, ZONE1, 1} }}, {});
-
+ CheckTenantGeneration(runtime, TENANT1_1_NAME, 2);
+
+ CheckAlterTenantSlots(runtime, TENANT1_1_NAME, 1,
+ Ydb::StatusIds::BAD_REQUEST,
+ {{ {SLOT1_TYPE, ZONE1, 1} }}, {});
+
// Repeating the same idempotency key should result in a success
CheckAlterTenantSlots(runtime, TENANT1_1_NAME, 1,
Ydb::StatusIds::SUCCESS,
@@ -2439,8 +2439,8 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
"alter-key-1");
CheckTenantGeneration(runtime, TENANT1_1_NAME, 2);
- RestartConsole(runtime);
- CheckTenantGeneration(runtime, TENANT1_1_NAME, 2);
+ RestartConsole(runtime);
+ CheckTenantGeneration(runtime, TENANT1_1_NAME, 2);
// Repeating the same idempotency key should result in a success after restart
CheckAlterTenantSlots(runtime, TENANT1_1_NAME, 1,
@@ -2460,8 +2460,8 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
Ydb::StatusIds::BAD_REQUEST,
{{ {SLOT1_TYPE, ZONE1, 1} }}, {},
"alter-key-1");
- }
-
+ }
+
Y_UNIT_TEST(TestTenantGeneration) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig());
RunTestTenantGeneration(runtime);
@@ -2472,23 +2472,23 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
RunTestTenantGeneration(runtime);
}
- Y_UNIT_TEST(TestSchemeShardErrorForwarding) {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
-
- // Unauthorized create subdomain.
- CheckCreateTenant(runtime, "/dc-1/db-1",
- NACLib::TUserToken("user1@builtin", {}).SerializeAsString(),
- Ydb::StatusIds::UNAUTHORIZED,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
-
- // Unauthorized create directory.
- CheckCreateTenant(runtime, "/dc-1/subdir/db-1",
- NACLib::TUserToken("user1@builtin", {}).SerializeAsString(),
- Ydb::StatusIds::UNAUTHORIZED,
- {{"hdd", 1}},
- SLOT1_TYPE, ZONE1, 1);
- }
+ Y_UNIT_TEST(TestSchemeShardErrorForwarding) {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+
+ // Unauthorized create subdomain.
+ CheckCreateTenant(runtime, "/dc-1/db-1",
+ NACLib::TUserToken("user1@builtin", {}).SerializeAsString(),
+ Ydb::StatusIds::UNAUTHORIZED,
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+
+ // Unauthorized create directory.
+ CheckCreateTenant(runtime, "/dc-1/subdir/db-1",
+ NACLib::TUserToken("user1@builtin", {}).SerializeAsString(),
+ Ydb::StatusIds::UNAUTHORIZED,
+ {{"hdd", 1}},
+ SLOT1_TYPE, ZONE1, 1);
+ }
void RunTestAlterTenantTooManyStorageResourcesForRunning(TTenantTestRuntime& runtime) {
using EType = TCreateTenantRequest::EType;
@@ -2538,6 +2538,6 @@ Y_UNIT_TEST_SUITE(TConsoleTests) {
TTenantTestRuntime runtime(DefaultConsoleTestConfig(), {}, true);
RunTestAlterTenantTooManyStorageResourcesForRunning(runtime);
}
-}
-
-} // namespace NKikimr
+}
+
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/defs.h b/ydb/core/cms/console/defs.h
index 2ca496b6e3d..c5a708c5606 100644
--- a/ydb/core/cms/console/defs.h
+++ b/ydb/core/cms/console/defs.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
// unique tag: ./ydb/core/cms/console/defs.h
#include <ydb/core/base/defs.h>
#include <ydb/core/base/events.h>
diff --git a/ydb/core/cms/console/http.cpp b/ydb/core/cms/console/http.cpp
index c9c9d898104..feacd672df3 100644
--- a/ydb/core/cms/console/http.cpp
+++ b/ydb/core/cms/console/http.cpp
@@ -1,92 +1,92 @@
-#include "http.h"
-
-#include <util/random/random.h>
-#include <util/string/builder.h>
-
-namespace NKikimr {
-namespace NConsole {
-namespace NHttp {
-
-void OutputStyles(IOutputStream &os)
-{
- os << "<style>" << Endl
- << ".collapse-ref {" << Endl
- << " cursor: pointer" << Endl
- << "}" << Endl
- << ".tab-left {" << Endl
- << " margin-left: 20px" << Endl
- << "}" << Endl
- << "</style>" << Endl;
-}
-
-void OutputStaticPart(IOutputStream &os)
-{
- HTML(os) {
- HEAD() {
- os << "<link rel='stylesheet' href='https://yastatic.net/bootstrap/3.3.1/css/bootstrap.min.css'>" << Endl
- << "<script language='javascript' type='text/javascript' src='https://yastatic.net/jquery/2.1.3/jquery.min.js'></script>" << Endl
- << "<script language='javascript' type='text/javascript' src='https://yastatic.net/bootstrap/3.3.1/js/bootstrap.min.js'></script>" << Endl;
- }
- OutputStyles(os);
- }
-}
-
-void OutputConfigHTML(IOutputStream &os, const NKikimrConfig::TAppConfig &config)
-{
- HTML(os) {
- DIV_CLASS("tab-left") {
- auto *reflection = config.GetReflection();
- std::vector<const ::google::protobuf::FieldDescriptor *> fields;
- reflection->ListFields(config, &fields);
-
- for (auto field : fields) {
- TString id = TStringBuilder() << field->name() << "-" << RandomNumber<ui64>();
- COLLAPSED_REF_CONTENT(id, field->name()) {
- DIV_CLASS("tab-left") {
- PRE() {
- switch (field->cpp_type()) {
- case ::google::protobuf::FieldDescriptor::CPPTYPE_INT32:
- os << reflection->GetInt32(config, field);
- break;
- case ::google::protobuf::FieldDescriptor::CPPTYPE_INT64:
- os << reflection->GetInt64(config, field);
- break;
- case ::google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
- os << reflection->GetUInt32(config, field);
- break;
- case ::google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
- os << reflection->GetUInt64(config, field);
- break;
- case ::google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE:
- os << reflection->GetDouble(config, field);
- break;
- case ::google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
- os << reflection->GetFloat(config, field);
- break;
- case ::google::protobuf::FieldDescriptor::CPPTYPE_BOOL:
- os << reflection->GetBool(config, field);
- break;
- case ::google::protobuf::FieldDescriptor::CPPTYPE_ENUM:
- os << reflection->GetEnum(config, field)->name();
- break;
- case ::google::protobuf::FieldDescriptor::CPPTYPE_STRING:
- os << reflection->GetString(config, field);
- break;
- case ::google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE:
- os << reflection->GetMessage(config, field).DebugString();
- break;
- default:
- os << "<unsupported value type>";
- }
- }
- }
- }
- os << "<br/>" << Endl;
- }
- }
- }
-}
-
-} // namespace NHttp
-} // namespace NConsole
-} // namespace NKikimr
+#include "http.h"
+
+#include <util/random/random.h>
+#include <util/string/builder.h>
+
+namespace NKikimr {
+namespace NConsole {
+namespace NHttp {
+
+void OutputStyles(IOutputStream &os)
+{
+ os << "<style>" << Endl
+ << ".collapse-ref {" << Endl
+ << " cursor: pointer" << Endl
+ << "}" << Endl
+ << ".tab-left {" << Endl
+ << " margin-left: 20px" << Endl
+ << "}" << Endl
+ << "</style>" << Endl;
+}
+
+void OutputStaticPart(IOutputStream &os)
+{
+ HTML(os) {
+ HEAD() {
+ os << "<link rel='stylesheet' href='https://yastatic.net/bootstrap/3.3.1/css/bootstrap.min.css'>" << Endl
+ << "<script language='javascript' type='text/javascript' src='https://yastatic.net/jquery/2.1.3/jquery.min.js'></script>" << Endl
+ << "<script language='javascript' type='text/javascript' src='https://yastatic.net/bootstrap/3.3.1/js/bootstrap.min.js'></script>" << Endl;
+ }
+ OutputStyles(os);
+ }
+}
+
+void OutputConfigHTML(IOutputStream &os, const NKikimrConfig::TAppConfig &config)
+{
+ HTML(os) {
+ DIV_CLASS("tab-left") {
+ auto *reflection = config.GetReflection();
+ std::vector<const ::google::protobuf::FieldDescriptor *> fields;
+ reflection->ListFields(config, &fields);
+
+ for (auto field : fields) {
+ TString id = TStringBuilder() << field->name() << "-" << RandomNumber<ui64>();
+ COLLAPSED_REF_CONTENT(id, field->name()) {
+ DIV_CLASS("tab-left") {
+ PRE() {
+ switch (field->cpp_type()) {
+ case ::google::protobuf::FieldDescriptor::CPPTYPE_INT32:
+ os << reflection->GetInt32(config, field);
+ break;
+ case ::google::protobuf::FieldDescriptor::CPPTYPE_INT64:
+ os << reflection->GetInt64(config, field);
+ break;
+ case ::google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
+ os << reflection->GetUInt32(config, field);
+ break;
+ case ::google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
+ os << reflection->GetUInt64(config, field);
+ break;
+ case ::google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE:
+ os << reflection->GetDouble(config, field);
+ break;
+ case ::google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
+ os << reflection->GetFloat(config, field);
+ break;
+ case ::google::protobuf::FieldDescriptor::CPPTYPE_BOOL:
+ os << reflection->GetBool(config, field);
+ break;
+ case ::google::protobuf::FieldDescriptor::CPPTYPE_ENUM:
+ os << reflection->GetEnum(config, field)->name();
+ break;
+ case ::google::protobuf::FieldDescriptor::CPPTYPE_STRING:
+ os << reflection->GetString(config, field);
+ break;
+ case ::google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE:
+ os << reflection->GetMessage(config, field).DebugString();
+ break;
+ default:
+ os << "<unsupported value type>";
+ }
+ }
+ }
+ }
+ os << "<br/>" << Endl;
+ }
+ }
+ }
+}
+
+} // namespace NHttp
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/http.h b/ydb/core/cms/console/http.h
index 413c46ae665..f64ba795df1 100644
--- a/ydb/core/cms/console/http.h
+++ b/ydb/core/cms/console/http.h
@@ -1,48 +1,48 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <ydb/core/protos/config.pb.h>
-
+
#include <library/cpp/monlib/service/pages/templates.h>
-
-#include <util/stream/output.h>
-
-#define COLLAPSED_REF_CONTENT(target, text) \
- WITH_SCOPED(tmp, NKikimr::NConsole::NHttp::TCollapsedRef(__stream, target, text))
-
-namespace NKikimr {
-namespace NConsole {
-namespace NHttp {
-
-struct TCollapsedRef {
- TCollapsedRef(IOutputStream& str, const TString& target, const TString& text)
- : Str(str)
- {
- Str << "<a class='collapse-ref' data-toggle='collapse' data-target='#" << target << "'>"
- << text << "</a>";
- Str << "<div id='" << target << "' class='collapse'>";
- }
-
- ~TCollapsedRef()
- {
- try {
- Str << "</div>";
- } catch (...) {
- }
- }
-
- explicit inline operator bool() const noexcept
- {
- return true; // just to work with WITH_SCOPED
- }
-
- IOutputStream &Str;
-};
-
-void OutputStaticPart(IOutputStream &os);
-void OutputStyles(IOutputStream &os);
-void OutputConfigHTML(IOutputStream &os, const NKikimrConfig::TAppConfig &config);
-
-} // namespace NHttp
-} // namespace NConsole
-} // namespace NKikimr
+
+#include <util/stream/output.h>
+
+#define COLLAPSED_REF_CONTENT(target, text) \
+ WITH_SCOPED(tmp, NKikimr::NConsole::NHttp::TCollapsedRef(__stream, target, text))
+
+namespace NKikimr {
+namespace NConsole {
+namespace NHttp {
+
+struct TCollapsedRef {
+ TCollapsedRef(IOutputStream& str, const TString& target, const TString& text)
+ : Str(str)
+ {
+ Str << "<a class='collapse-ref' data-toggle='collapse' data-target='#" << target << "'>"
+ << text << "</a>";
+ Str << "<div id='" << target << "' class='collapse'>";
+ }
+
+ ~TCollapsedRef()
+ {
+ try {
+ Str << "</div>";
+ } catch (...) {
+ }
+ }
+
+ explicit inline operator bool() const noexcept
+ {
+ return true; // just to work with WITH_SCOPED
+ }
+
+ IOutputStream &Str;
+};
+
+void OutputStaticPart(IOutputStream &os);
+void OutputStyles(IOutputStream &os);
+void OutputConfigHTML(IOutputStream &os, const NKikimrConfig::TAppConfig &config);
+
+} // namespace NHttp
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/immediate_controls_configurator.cpp b/ydb/core/cms/console/immediate_controls_configurator.cpp
index e50d4edde6d..af3ad242171 100644
--- a/ydb/core/cms/console/immediate_controls_configurator.cpp
+++ b/ydb/core/cms/console/immediate_controls_configurator.cpp
@@ -1,201 +1,201 @@
-#include "configs_dispatcher.h"
-#include "console.h"
-#include "immediate_controls_configurator.h"
-
+#include "configs_dispatcher.h"
+#include "console.h"
+#include "immediate_controls_configurator.h"
+
#include <ydb/core/base/appdata.h>
#include <ydb/core/protos/config.pb.h>
-
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-class TImmediateControlsConfigurator : public TActorBootstrapped<TImmediateControlsConfigurator> {
-public:
+
+namespace NKikimr {
+namespace NConsole {
+
+class TImmediateControlsConfigurator : public TActorBootstrapped<TImmediateControlsConfigurator> {
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::IMMEDITE_CONTROLS_CONFIGURATOR;
- }
-
- TImmediateControlsConfigurator(TIntrusivePtr<TControlBoard> board,
- const NKikimrConfig::TImmediateControlsConfig &cfg);
-
- void Bootstrap(const TActorContext &ctx);
-
- void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx);
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
- IgnoreFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
- ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-
-private:
- void CreateControls(TIntrusivePtr<TControlBoard> board);
- void CreateControls(TIntrusivePtr<TControlBoard> board,
- const google::protobuf::Descriptor *desc,
- const TString &prefix);
- void AddControl(TIntrusivePtr<TControlBoard> board,
- const google::protobuf::FieldDescriptor *desc,
- const TString &prefix);
- void ApplyConfig(const NKikimrConfig::TImmediateControlsConfig &cfg,
- TIntrusivePtr<TControlBoard> board);
- void ApplyConfig(const ::google::protobuf::Message &cfg,
- const TString &prefix,
- TIntrusivePtr<TControlBoard> board);
- TString MakePrefix(const TString &prefix,
- const TString &name);
-
- THashMap<TString, TControlWrapper> Controls;
-};
-
-TImmediateControlsConfigurator::TImmediateControlsConfigurator(TIntrusivePtr<TControlBoard> board,
- const NKikimrConfig::TImmediateControlsConfig &cfg)
-{
- CreateControls(board);
- ApplyConfig(cfg, board);
-}
-
-void TImmediateControlsConfigurator::Bootstrap(const TActorContext &ctx)
-{
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TImmediateControlsConfigurator Bootstrap");
-
- Become(&TThis::StateWork);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TImmediateControlsConfigurator: subscribe for config updates.");
-
- ui32 item = (ui32)NKikimrConsole::TConfigItem::ImmediateControlsConfigItem;
- ctx.Send(MakeConfigsDispatcherID(SelfId().NodeId()),
- new TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest(item));
-}
-
-void TImmediateControlsConfigurator::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- LOG_INFO_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TImmediateControlsConfigurator: got new config: "
- << rec.GetConfig().ShortDebugString());
-
- ApplyConfig(rec.GetConfig().GetImmediateControlsConfig(), AppData(ctx)->Icb);
-
- auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TImmediateControlsConfigurator: Send TEvConfigNotificationResponse: "
- << resp->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
-}
-
-void TImmediateControlsConfigurator::CreateControls(TIntrusivePtr<TControlBoard> board)
-{
- auto *desc = NKikimrConfig::TImmediateControlsConfig::descriptor();
- CreateControls(board, desc, "");
-}
-
-void TImmediateControlsConfigurator::CreateControls(TIntrusivePtr<TControlBoard> board,
- const google::protobuf::Descriptor *desc,
- const TString &prefix)
-{
- for (int i = 0; i < desc->field_count(); ++i) {
- auto *fieldDesc = desc->field(i);
-
- Y_VERIFY(!fieldDesc->is_repeated(),
- "Repeated fields are not allowed in Immediate Controls Config");
-
- auto fieldType = fieldDesc->type();
- if (fieldType == google::protobuf::FieldDescriptor::TYPE_UINT64
- || fieldType == google::protobuf::FieldDescriptor::TYPE_INT64)
- AddControl(board, fieldDesc, prefix);
- else {
- Y_VERIFY(fieldType == google::protobuf::FieldDescriptor::TYPE_MESSAGE,
- "Only [u]int64 and message fields are allowed in Immediate Controls Config");
-
- CreateControls(board, fieldDesc->message_type(),
- MakePrefix(prefix, fieldDesc->name()));
- }
- }
-}
-
-void TImmediateControlsConfigurator::AddControl(TIntrusivePtr<TControlBoard> board,
- const google::protobuf::FieldDescriptor *desc,
- const TString &prefix)
-{
- auto &opts = desc->options().GetExtension(NKikimrConfig::ControlOptions);
- auto name = MakePrefix(prefix, desc->name());
- ui64 defaultValue = opts.GetDefaultValue();
- ui64 minValue = opts.GetMinValue();
- ui64 maxValue = opts.GetMaxValue();
-
- Controls[name] = TControlWrapper(defaultValue, minValue, maxValue);
- // All controls are actually shared but use RegisterLocalControl to
- // make sure it is not registered by someone else with other options.
- auto res = board->RegisterLocalControl(Controls[name], name);
- Y_VERIFY_S(res, "Immediate Control " << name << " was registered before "
- << "TImmediateControlsConfigurator creation");
-}
-
-void TImmediateControlsConfigurator::ApplyConfig(const NKikimrConfig::TImmediateControlsConfig &cfg,
- TIntrusivePtr<TControlBoard> board)
-{
- ApplyConfig(cfg, "", board);
-}
-
-void TImmediateControlsConfigurator::ApplyConfig(const ::google::protobuf::Message &cfg,
- const TString &prefix,
- TIntrusivePtr<TControlBoard> board)
-{
- auto *desc = cfg.GetDescriptor();
- auto *reflection = cfg.GetReflection();
- for (int i = 0; i < desc->field_count(); ++i) {
- auto *fieldDesc = desc->field(i);
- auto fieldType = fieldDesc->type();
- auto name = MakePrefix(prefix, fieldDesc->name());
- if (fieldType == google::protobuf::FieldDescriptor::TYPE_UINT64
- || fieldType == google::protobuf::FieldDescriptor::TYPE_INT64) {
- Y_VERIFY(Controls.contains(name));
- if (reflection->HasField(cfg, fieldDesc)) {
- TAtomicBase prev;
- if (fieldType == google::protobuf::FieldDescriptor::TYPE_UINT64)
- board->SetValue(name, reflection->GetUInt64(cfg, fieldDesc), prev);
- else
- board->SetValue(name, reflection->GetInt64(cfg, fieldDesc), prev);
- } else {
- board->RestoreDefault(name);
- }
- } else {
- Y_VERIFY(fieldType == google::protobuf::FieldDescriptor::TYPE_MESSAGE,
- "Only [u]int64 and message fields are allowed in Immediate Controls Config");
- ApplyConfig(reflection->GetMessage(cfg, fieldDesc), name, board);
- }
- }
-}
-
-TString TImmediateControlsConfigurator::MakePrefix(const TString &prefix,
- const TString &name)
-{
- if (!prefix)
- return name;
-
- return prefix + "." + name;
-}
-
-IActor *CreateImmediateControlsConfigurator(TIntrusivePtr<TControlBoard> board,
- const NKikimrConfig::TImmediateControlsConfig &cfg)
-{
- return new TImmediateControlsConfigurator(board, cfg);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ }
+
+ TImmediateControlsConfigurator(TIntrusivePtr<TControlBoard> board,
+ const NKikimrConfig::TImmediateControlsConfig &cfg);
+
+ void Bootstrap(const TActorContext &ctx);
+
+ void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx);
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
+ IgnoreFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
+ break;
+ }
+ }
+
+private:
+ void CreateControls(TIntrusivePtr<TControlBoard> board);
+ void CreateControls(TIntrusivePtr<TControlBoard> board,
+ const google::protobuf::Descriptor *desc,
+ const TString &prefix);
+ void AddControl(TIntrusivePtr<TControlBoard> board,
+ const google::protobuf::FieldDescriptor *desc,
+ const TString &prefix);
+ void ApplyConfig(const NKikimrConfig::TImmediateControlsConfig &cfg,
+ TIntrusivePtr<TControlBoard> board);
+ void ApplyConfig(const ::google::protobuf::Message &cfg,
+ const TString &prefix,
+ TIntrusivePtr<TControlBoard> board);
+ TString MakePrefix(const TString &prefix,
+ const TString &name);
+
+ THashMap<TString, TControlWrapper> Controls;
+};
+
+TImmediateControlsConfigurator::TImmediateControlsConfigurator(TIntrusivePtr<TControlBoard> board,
+ const NKikimrConfig::TImmediateControlsConfig &cfg)
+{
+ CreateControls(board);
+ ApplyConfig(cfg, board);
+}
+
+void TImmediateControlsConfigurator::Bootstrap(const TActorContext &ctx)
+{
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TImmediateControlsConfigurator Bootstrap");
+
+ Become(&TThis::StateWork);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TImmediateControlsConfigurator: subscribe for config updates.");
+
+ ui32 item = (ui32)NKikimrConsole::TConfigItem::ImmediateControlsConfigItem;
+ ctx.Send(MakeConfigsDispatcherID(SelfId().NodeId()),
+ new TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest(item));
+}
+
+void TImmediateControlsConfigurator::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ LOG_INFO_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TImmediateControlsConfigurator: got new config: "
+ << rec.GetConfig().ShortDebugString());
+
+ ApplyConfig(rec.GetConfig().GetImmediateControlsConfig(), AppData(ctx)->Icb);
+
+ auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TImmediateControlsConfigurator: Send TEvConfigNotificationResponse: "
+ << resp->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+}
+
+void TImmediateControlsConfigurator::CreateControls(TIntrusivePtr<TControlBoard> board)
+{
+ auto *desc = NKikimrConfig::TImmediateControlsConfig::descriptor();
+ CreateControls(board, desc, "");
+}
+
+void TImmediateControlsConfigurator::CreateControls(TIntrusivePtr<TControlBoard> board,
+ const google::protobuf::Descriptor *desc,
+ const TString &prefix)
+{
+ for (int i = 0; i < desc->field_count(); ++i) {
+ auto *fieldDesc = desc->field(i);
+
+ Y_VERIFY(!fieldDesc->is_repeated(),
+ "Repeated fields are not allowed in Immediate Controls Config");
+
+ auto fieldType = fieldDesc->type();
+ if (fieldType == google::protobuf::FieldDescriptor::TYPE_UINT64
+ || fieldType == google::protobuf::FieldDescriptor::TYPE_INT64)
+ AddControl(board, fieldDesc, prefix);
+ else {
+ Y_VERIFY(fieldType == google::protobuf::FieldDescriptor::TYPE_MESSAGE,
+ "Only [u]int64 and message fields are allowed in Immediate Controls Config");
+
+ CreateControls(board, fieldDesc->message_type(),
+ MakePrefix(prefix, fieldDesc->name()));
+ }
+ }
+}
+
+void TImmediateControlsConfigurator::AddControl(TIntrusivePtr<TControlBoard> board,
+ const google::protobuf::FieldDescriptor *desc,
+ const TString &prefix)
+{
+ auto &opts = desc->options().GetExtension(NKikimrConfig::ControlOptions);
+ auto name = MakePrefix(prefix, desc->name());
+ ui64 defaultValue = opts.GetDefaultValue();
+ ui64 minValue = opts.GetMinValue();
+ ui64 maxValue = opts.GetMaxValue();
+
+ Controls[name] = TControlWrapper(defaultValue, minValue, maxValue);
+ // All controls are actually shared but use RegisterLocalControl to
+ // make sure it is not registered by someone else with other options.
+ auto res = board->RegisterLocalControl(Controls[name], name);
+ Y_VERIFY_S(res, "Immediate Control " << name << " was registered before "
+ << "TImmediateControlsConfigurator creation");
+}
+
+void TImmediateControlsConfigurator::ApplyConfig(const NKikimrConfig::TImmediateControlsConfig &cfg,
+ TIntrusivePtr<TControlBoard> board)
+{
+ ApplyConfig(cfg, "", board);
+}
+
+void TImmediateControlsConfigurator::ApplyConfig(const ::google::protobuf::Message &cfg,
+ const TString &prefix,
+ TIntrusivePtr<TControlBoard> board)
+{
+ auto *desc = cfg.GetDescriptor();
+ auto *reflection = cfg.GetReflection();
+ for (int i = 0; i < desc->field_count(); ++i) {
+ auto *fieldDesc = desc->field(i);
+ auto fieldType = fieldDesc->type();
+ auto name = MakePrefix(prefix, fieldDesc->name());
+ if (fieldType == google::protobuf::FieldDescriptor::TYPE_UINT64
+ || fieldType == google::protobuf::FieldDescriptor::TYPE_INT64) {
+ Y_VERIFY(Controls.contains(name));
+ if (reflection->HasField(cfg, fieldDesc)) {
+ TAtomicBase prev;
+ if (fieldType == google::protobuf::FieldDescriptor::TYPE_UINT64)
+ board->SetValue(name, reflection->GetUInt64(cfg, fieldDesc), prev);
+ else
+ board->SetValue(name, reflection->GetInt64(cfg, fieldDesc), prev);
+ } else {
+ board->RestoreDefault(name);
+ }
+ } else {
+ Y_VERIFY(fieldType == google::protobuf::FieldDescriptor::TYPE_MESSAGE,
+ "Only [u]int64 and message fields are allowed in Immediate Controls Config");
+ ApplyConfig(reflection->GetMessage(cfg, fieldDesc), name, board);
+ }
+ }
+}
+
+TString TImmediateControlsConfigurator::MakePrefix(const TString &prefix,
+ const TString &name)
+{
+ if (!prefix)
+ return name;
+
+ return prefix + "." + name;
+}
+
+IActor *CreateImmediateControlsConfigurator(TIntrusivePtr<TControlBoard> board,
+ const NKikimrConfig::TImmediateControlsConfig &cfg)
+{
+ return new TImmediateControlsConfigurator(board, cfg);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/immediate_controls_configurator.h b/ydb/core/cms/console/immediate_controls_configurator.h
index 30876323ba1..c6c4ba029da 100644
--- a/ydb/core/cms/console/immediate_controls_configurator.h
+++ b/ydb/core/cms/console/immediate_controls_configurator.h
@@ -1,19 +1,19 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <ydb/core/control/immediate_control_board_impl.h>
-
-#include <util/generic/ptr.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-/**
- * Immediate Controls Configurator is used to work with
- * immediate control board via CMS.
- */
-IActor *CreateImmediateControlsConfigurator(TIntrusivePtr<TControlBoard> board,
- const NKikimrConfig::TImmediateControlsConfig &cfg);
-
-} // namespace NConsole
-} // namespace NKikimr
+
+#include <util/generic/ptr.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+/**
+ * Immediate Controls Configurator is used to work with
+ * immediate control board via CMS.
+ */
+IActor *CreateImmediateControlsConfigurator(TIntrusivePtr<TControlBoard> board,
+ const NKikimrConfig::TImmediateControlsConfig &cfg);
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/immediate_controls_configurator_ut.cpp b/ydb/core/cms/console/immediate_controls_configurator_ut.cpp
index 979c813920b..8ad8f6ed1b8 100644
--- a/ydb/core/cms/console/immediate_controls_configurator_ut.cpp
+++ b/ydb/core/cms/console/immediate_controls_configurator_ut.cpp
@@ -1,260 +1,260 @@
-#include "configs_dispatcher.h"
-#include "immediate_controls_configurator.h"
-#include "ut_helpers.h"
-
-namespace NKikimr {
-
-using namespace NConsole;
-using namespace NConsole::NUT;
-
-namespace {
-
-TTenantTestConfig::TTenantPoolConfig StaticTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {},
- // NodeType
- "type1"
- };
- return res;
-}
-
-TTenantTestConfig DefaultConsoleTestConfig()
-{
- TTenantTestConfig res = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- false,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {StaticTenantPoolConfig()},
- }},
- // DataCenterCount
- 1,
- // CreateConfigsDispatcher
- true
- };
- return res;
-}
-
-NKikimrConsole::TConfigItem ITEM_CONTROLS_DEFAULT;
-NKikimrConsole::TConfigItem ITEM_CONTROLS1;
-NKikimrConsole::TConfigItem ITEM_CONTROLS2;
-NKikimrConsole::TConfigItem ITEM_CONTROLS2_RES;
-NKikimrConsole::TConfigItem ITEM_CONTROLS_MAX;
-NKikimrConsole::TConfigItem ITEM_CONTROLS_EXCEED_MAX;
-
-void InitImmediateControlsConfigurator(TTenantTestRuntime &runtime)
-{
- runtime.Register(CreateImmediateControlsConfigurator(runtime.GetAppData().Icb,
- NKikimrConfig::TImmediateControlsConfig()));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvConfigsDispatcher::EvSetConfigSubscriptionResponse, 1);
- runtime.DispatchEvents(options);
-
- ITEM_CONTROLS_DEFAULT
- = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 1,
- NKikimrConsole::TConfigItem::OVERWRITE, "");
- {
- auto &cfg = *ITEM_CONTROLS_DEFAULT.MutableConfig()->MutableImmediateControlsConfig();
- cfg.MutableDataShardControls()->SetMaxTxInFly(15000);
- cfg.MutableDataShardControls()->SetDisableByKeyFilter(0);
- cfg.MutableDataShardControls()->SetMaxTxLagMilliseconds(300000);
- cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(0);
- cfg.MutableTxLimitControls()->SetPerRequestDataSizeLimit(53687091200);
- cfg.MutableTxLimitControls()->SetPerShardReadSizeLimit(5368709120);
- cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(209715200);
- }
-
- ITEM_CONTROLS1
- = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 2,
- NKikimrConsole::TConfigItem::OVERWRITE, "");
- {
- auto &cfg = *ITEM_CONTROLS1.MutableConfig()->MutableImmediateControlsConfig();
- cfg.MutableDataShardControls()->SetMaxTxInFly(3);
- cfg.MutableDataShardControls()->SetDisableByKeyFilter(1);
- cfg.MutableDataShardControls()->SetMaxTxLagMilliseconds(5);
- cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(1);
- cfg.MutableTxLimitControls()->SetPerRequestDataSizeLimit(11);
- cfg.MutableTxLimitControls()->SetPerShardReadSizeLimit(12);
- cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(13);
- }
-
- ITEM_CONTROLS2
- = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 3,
- NKikimrConsole::TConfigItem::OVERWRITE, "");
- {
- auto &cfg = *ITEM_CONTROLS2.MutableConfig()->MutableImmediateControlsConfig();
- cfg.MutableDataShardControls()->SetMaxTxInFly(3);
- cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(1);
- cfg.MutableTxLimitControls()->SetPerRequestDataSizeLimit(11);
- cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(13);
- }
-
- ITEM_CONTROLS2_RES
- = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 4,
- NKikimrConsole::TConfigItem::OVERWRITE, "");
- {
- auto &cfg = *ITEM_CONTROLS2_RES.MutableConfig()->MutableImmediateControlsConfig();
- cfg.MutableDataShardControls()->SetMaxTxInFly(3);
- cfg.MutableDataShardControls()->SetDisableByKeyFilter(0);
- cfg.MutableDataShardControls()->SetMaxTxLagMilliseconds(300000);
- cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(1);
- cfg.MutableTxLimitControls()->SetPerRequestDataSizeLimit(11);
- cfg.MutableTxLimitControls()->SetPerShardReadSizeLimit(5368709120);
- cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(13);
- }
-
- ITEM_CONTROLS_MAX
- = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 5,
- NKikimrConsole::TConfigItem::OVERWRITE, "");
- {
- auto &cfg = *ITEM_CONTROLS_MAX.MutableConfig()->MutableImmediateControlsConfig();
- cfg.MutableDataShardControls()->SetMaxTxInFly(100000);
- cfg.MutableDataShardControls()->SetDisableByKeyFilter(1);
- cfg.MutableDataShardControls()->SetMaxTxLagMilliseconds(2592000000ULL);
- cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(1);
+#include "configs_dispatcher.h"
+#include "immediate_controls_configurator.h"
+#include "ut_helpers.h"
+
+namespace NKikimr {
+
+using namespace NConsole;
+using namespace NConsole::NUT;
+
+namespace {
+
+TTenantTestConfig::TTenantPoolConfig StaticTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {},
+ // NodeType
+ "type1"
+ };
+ return res;
+}
+
+TTenantTestConfig DefaultConsoleTestConfig()
+{
+ TTenantTestConfig res = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ false,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {StaticTenantPoolConfig()},
+ }},
+ // DataCenterCount
+ 1,
+ // CreateConfigsDispatcher
+ true
+ };
+ return res;
+}
+
+NKikimrConsole::TConfigItem ITEM_CONTROLS_DEFAULT;
+NKikimrConsole::TConfigItem ITEM_CONTROLS1;
+NKikimrConsole::TConfigItem ITEM_CONTROLS2;
+NKikimrConsole::TConfigItem ITEM_CONTROLS2_RES;
+NKikimrConsole::TConfigItem ITEM_CONTROLS_MAX;
+NKikimrConsole::TConfigItem ITEM_CONTROLS_EXCEED_MAX;
+
+void InitImmediateControlsConfigurator(TTenantTestRuntime &runtime)
+{
+ runtime.Register(CreateImmediateControlsConfigurator(runtime.GetAppData().Icb,
+ NKikimrConfig::TImmediateControlsConfig()));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvConfigsDispatcher::EvSetConfigSubscriptionResponse, 1);
+ runtime.DispatchEvents(options);
+
+ ITEM_CONTROLS_DEFAULT
+ = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 1,
+ NKikimrConsole::TConfigItem::OVERWRITE, "");
+ {
+ auto &cfg = *ITEM_CONTROLS_DEFAULT.MutableConfig()->MutableImmediateControlsConfig();
+ cfg.MutableDataShardControls()->SetMaxTxInFly(15000);
+ cfg.MutableDataShardControls()->SetDisableByKeyFilter(0);
+ cfg.MutableDataShardControls()->SetMaxTxLagMilliseconds(300000);
+ cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(0);
+ cfg.MutableTxLimitControls()->SetPerRequestDataSizeLimit(53687091200);
+ cfg.MutableTxLimitControls()->SetPerShardReadSizeLimit(5368709120);
+ cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(209715200);
+ }
+
+ ITEM_CONTROLS1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 2,
+ NKikimrConsole::TConfigItem::OVERWRITE, "");
+ {
+ auto &cfg = *ITEM_CONTROLS1.MutableConfig()->MutableImmediateControlsConfig();
+ cfg.MutableDataShardControls()->SetMaxTxInFly(3);
+ cfg.MutableDataShardControls()->SetDisableByKeyFilter(1);
+ cfg.MutableDataShardControls()->SetMaxTxLagMilliseconds(5);
+ cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(1);
+ cfg.MutableTxLimitControls()->SetPerRequestDataSizeLimit(11);
+ cfg.MutableTxLimitControls()->SetPerShardReadSizeLimit(12);
+ cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(13);
+ }
+
+ ITEM_CONTROLS2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 3,
+ NKikimrConsole::TConfigItem::OVERWRITE, "");
+ {
+ auto &cfg = *ITEM_CONTROLS2.MutableConfig()->MutableImmediateControlsConfig();
+ cfg.MutableDataShardControls()->SetMaxTxInFly(3);
+ cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(1);
+ cfg.MutableTxLimitControls()->SetPerRequestDataSizeLimit(11);
+ cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(13);
+ }
+
+ ITEM_CONTROLS2_RES
+ = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 4,
+ NKikimrConsole::TConfigItem::OVERWRITE, "");
+ {
+ auto &cfg = *ITEM_CONTROLS2_RES.MutableConfig()->MutableImmediateControlsConfig();
+ cfg.MutableDataShardControls()->SetMaxTxInFly(3);
+ cfg.MutableDataShardControls()->SetDisableByKeyFilter(0);
+ cfg.MutableDataShardControls()->SetMaxTxLagMilliseconds(300000);
+ cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(1);
+ cfg.MutableTxLimitControls()->SetPerRequestDataSizeLimit(11);
+ cfg.MutableTxLimitControls()->SetPerShardReadSizeLimit(5368709120);
+ cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(13);
+ }
+
+ ITEM_CONTROLS_MAX
+ = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 5,
+ NKikimrConsole::TConfigItem::OVERWRITE, "");
+ {
+ auto &cfg = *ITEM_CONTROLS_MAX.MutableConfig()->MutableImmediateControlsConfig();
+ cfg.MutableDataShardControls()->SetMaxTxInFly(100000);
+ cfg.MutableDataShardControls()->SetDisableByKeyFilter(1);
+ cfg.MutableDataShardControls()->SetMaxTxLagMilliseconds(2592000000ULL);
+ cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(1);
cfg.MutableTxLimitControls()->SetPerRequestDataSizeLimit(256000000000000ULL);
- cfg.MutableTxLimitControls()->SetPerShardReadSizeLimit(107374182400ULL);
- cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(5368709120ULL);
- }
-
- ITEM_CONTROLS_EXCEED_MAX
- = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 6,
- NKikimrConsole::TConfigItem::OVERWRITE, "");
- {
- auto &cfg = *ITEM_CONTROLS_EXCEED_MAX.MutableConfig()->MutableImmediateControlsConfig();
- cfg.MutableDataShardControls()->SetMaxTxInFly(1000000);
- cfg.MutableDataShardControls()->SetDisableByKeyFilter(10);
- cfg.MutableDataShardControls()->SetMaxTxLagMilliseconds(25920000000ULL);
- cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(10);
+ cfg.MutableTxLimitControls()->SetPerShardReadSizeLimit(107374182400ULL);
+ cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(5368709120ULL);
+ }
+
+ ITEM_CONTROLS_EXCEED_MAX
+ = MakeConfigItem(NKikimrConsole::TConfigItem::ImmediateControlsConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 6,
+ NKikimrConsole::TConfigItem::OVERWRITE, "");
+ {
+ auto &cfg = *ITEM_CONTROLS_EXCEED_MAX.MutableConfig()->MutableImmediateControlsConfig();
+ cfg.MutableDataShardControls()->SetMaxTxInFly(1000000);
+ cfg.MutableDataShardControls()->SetDisableByKeyFilter(10);
+ cfg.MutableDataShardControls()->SetMaxTxLagMilliseconds(25920000000ULL);
+ cfg.MutableDataShardControls()->SetCanCancelROWithReadSets(10);
cfg.MutableTxLimitControls()->SetPerRequestDataSizeLimit(300000000000000ULL);
- cfg.MutableTxLimitControls()->SetPerShardReadSizeLimit(1073741824000ULL);
- cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(53687091200ULL);
- }
-}
-
-void WaitForUpdate(TTenantTestRuntime &runtime)
-{
- struct TIsConfigNotificationProcessed {
- bool operator()(IEventHandle& ev)
- {
- if (ev.GetTypeRewrite() == NConsole::TEvConsole::EvConfigNotificationResponse) {
- auto &rec = ev.Get<NConsole::TEvConsole::TEvConfigNotificationResponse>()->Record;
- if (rec.GetConfigId().ItemIdsSize() != 1 || rec.GetConfigId().GetItemIds(0).GetId())
- return true;
- }
-
- return false;
- }
- };
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TIsConfigNotificationProcessed(), 1);
- runtime.DispatchEvents(options);
-}
-
-template <typename ...Ts>
-void ConfigureAndWaitUpdate(TTenantTestRuntime &runtime,
- Ts... args)
-{
- auto *event = new TEvConsole::TEvConfigureRequest;
- CollectActions(event->Record, args...);
-
- runtime.SendToConsole(event);
- WaitForUpdate(runtime);
-}
-
-void CompareControls(TTenantTestRuntime &runtime,
- const NKikimrConfig::TImmediateControlsConfig &cfg)
-{
- auto icb = runtime.GetAppData().Icb;
-
- TControlWrapper wrapper;
-
- icb->RegisterSharedControl(wrapper, "DataShardControls.MaxTxInFly");
- UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetDataShardControls().GetMaxTxInFly());
- icb->RegisterSharedControl(wrapper, "DataShardControls.DisableByKeyFilter");
- UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetDataShardControls().GetDisableByKeyFilter());
- icb->RegisterSharedControl(wrapper, "DataShardControls.MaxTxLagMilliseconds");
- UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetDataShardControls().GetMaxTxLagMilliseconds());
- icb->RegisterSharedControl(wrapper, "DataShardControls.CanCancelROWithReadSets");
- UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetDataShardControls().GetCanCancelROWithReadSets());
- icb->RegisterSharedControl(wrapper, "TxLimitControls.PerRequestDataSizeLimit");
- UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetTxLimitControls().GetPerRequestDataSizeLimit());
- icb->RegisterSharedControl(wrapper, "TxLimitControls.PerShardReadSizeLimit");
- UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetTxLimitControls().GetPerShardReadSizeLimit());
- icb->RegisterSharedControl(wrapper, "TxLimitControls.PerShardIncomingReadSetSizeLimit");
- UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetTxLimitControls().GetPerShardIncomingReadSetSizeLimit());
-}
-
-} // anonymous namespace
-
-Y_UNIT_TEST_SUITE(TImmediateControlsConfiguratorTests)
-{
- Y_UNIT_TEST(TestControlsInitialization)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitImmediateControlsConfigurator(runtime);
-
- CompareControls(runtime, ITEM_CONTROLS_DEFAULT.GetConfig().GetImmediateControlsConfig());
- }
-
- Y_UNIT_TEST(TestModifiedControls)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitImmediateControlsConfigurator(runtime);
-
- ConfigureAndWaitUpdate(runtime,
- MakeAddAction(ITEM_CONTROLS1));
- CompareControls(runtime, ITEM_CONTROLS1.GetConfig().GetImmediateControlsConfig());
- }
-
- Y_UNIT_TEST(TestResetToDefault)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitImmediateControlsConfigurator(runtime);
-
- ConfigureAndWaitUpdate(runtime,
- MakeAddAction(ITEM_CONTROLS1));
- CompareControls(runtime, ITEM_CONTROLS1.GetConfig().GetImmediateControlsConfig());
-
- ConfigureAndWaitUpdate(runtime,
- MakeAddAction(ITEM_CONTROLS2));
- CompareControls(runtime, ITEM_CONTROLS2_RES.GetConfig().GetImmediateControlsConfig());
-
- ConfigureAndWaitUpdate(runtime,
- MakeRemoveAction(1, 1),
- MakeRemoveAction(2, 1));
-
- CompareControls(runtime, ITEM_CONTROLS_DEFAULT.GetConfig().GetImmediateControlsConfig());
- }
-
- Y_UNIT_TEST(TestMaxLimit)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- InitImmediateControlsConfigurator(runtime);
-
- ConfigureAndWaitUpdate(runtime,
- MakeAddAction(ITEM_CONTROLS_EXCEED_MAX));
- CompareControls(runtime, ITEM_CONTROLS_MAX.GetConfig().GetImmediateControlsConfig());
- }
-}
-
-} // namespace NKikimr
+ cfg.MutableTxLimitControls()->SetPerShardReadSizeLimit(1073741824000ULL);
+ cfg.MutableTxLimitControls()->SetPerShardIncomingReadSetSizeLimit(53687091200ULL);
+ }
+}
+
+void WaitForUpdate(TTenantTestRuntime &runtime)
+{
+ struct TIsConfigNotificationProcessed {
+ bool operator()(IEventHandle& ev)
+ {
+ if (ev.GetTypeRewrite() == NConsole::TEvConsole::EvConfigNotificationResponse) {
+ auto &rec = ev.Get<NConsole::TEvConsole::TEvConfigNotificationResponse>()->Record;
+ if (rec.GetConfigId().ItemIdsSize() != 1 || rec.GetConfigId().GetItemIds(0).GetId())
+ return true;
+ }
+
+ return false;
+ }
+ };
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TIsConfigNotificationProcessed(), 1);
+ runtime.DispatchEvents(options);
+}
+
+template <typename ...Ts>
+void ConfigureAndWaitUpdate(TTenantTestRuntime &runtime,
+ Ts... args)
+{
+ auto *event = new TEvConsole::TEvConfigureRequest;
+ CollectActions(event->Record, args...);
+
+ runtime.SendToConsole(event);
+ WaitForUpdate(runtime);
+}
+
+void CompareControls(TTenantTestRuntime &runtime,
+ const NKikimrConfig::TImmediateControlsConfig &cfg)
+{
+ auto icb = runtime.GetAppData().Icb;
+
+ TControlWrapper wrapper;
+
+ icb->RegisterSharedControl(wrapper, "DataShardControls.MaxTxInFly");
+ UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetDataShardControls().GetMaxTxInFly());
+ icb->RegisterSharedControl(wrapper, "DataShardControls.DisableByKeyFilter");
+ UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetDataShardControls().GetDisableByKeyFilter());
+ icb->RegisterSharedControl(wrapper, "DataShardControls.MaxTxLagMilliseconds");
+ UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetDataShardControls().GetMaxTxLagMilliseconds());
+ icb->RegisterSharedControl(wrapper, "DataShardControls.CanCancelROWithReadSets");
+ UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetDataShardControls().GetCanCancelROWithReadSets());
+ icb->RegisterSharedControl(wrapper, "TxLimitControls.PerRequestDataSizeLimit");
+ UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetTxLimitControls().GetPerRequestDataSizeLimit());
+ icb->RegisterSharedControl(wrapper, "TxLimitControls.PerShardReadSizeLimit");
+ UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetTxLimitControls().GetPerShardReadSizeLimit());
+ icb->RegisterSharedControl(wrapper, "TxLimitControls.PerShardIncomingReadSetSizeLimit");
+ UNIT_ASSERT_VALUES_EQUAL((ui64)(i64)wrapper, cfg.GetTxLimitControls().GetPerShardIncomingReadSetSizeLimit());
+}
+
+} // anonymous namespace
+
+Y_UNIT_TEST_SUITE(TImmediateControlsConfiguratorTests)
+{
+ Y_UNIT_TEST(TestControlsInitialization)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitImmediateControlsConfigurator(runtime);
+
+ CompareControls(runtime, ITEM_CONTROLS_DEFAULT.GetConfig().GetImmediateControlsConfig());
+ }
+
+ Y_UNIT_TEST(TestModifiedControls)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitImmediateControlsConfigurator(runtime);
+
+ ConfigureAndWaitUpdate(runtime,
+ MakeAddAction(ITEM_CONTROLS1));
+ CompareControls(runtime, ITEM_CONTROLS1.GetConfig().GetImmediateControlsConfig());
+ }
+
+ Y_UNIT_TEST(TestResetToDefault)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitImmediateControlsConfigurator(runtime);
+
+ ConfigureAndWaitUpdate(runtime,
+ MakeAddAction(ITEM_CONTROLS1));
+ CompareControls(runtime, ITEM_CONTROLS1.GetConfig().GetImmediateControlsConfig());
+
+ ConfigureAndWaitUpdate(runtime,
+ MakeAddAction(ITEM_CONTROLS2));
+ CompareControls(runtime, ITEM_CONTROLS2_RES.GetConfig().GetImmediateControlsConfig());
+
+ ConfigureAndWaitUpdate(runtime,
+ MakeRemoveAction(1, 1),
+ MakeRemoveAction(2, 1));
+
+ CompareControls(runtime, ITEM_CONTROLS_DEFAULT.GetConfig().GetImmediateControlsConfig());
+ }
+
+ Y_UNIT_TEST(TestMaxLimit)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ InitImmediateControlsConfigurator(runtime);
+
+ ConfigureAndWaitUpdate(runtime,
+ MakeAddAction(ITEM_CONTROLS_EXCEED_MAX));
+ CompareControls(runtime, ITEM_CONTROLS_MAX.GetConfig().GetImmediateControlsConfig());
+ }
+}
+
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/log_settings_configurator.cpp b/ydb/core/cms/console/log_settings_configurator.cpp
index 18c01439cde..11d41e245e4 100644
--- a/ydb/core/cms/console/log_settings_configurator.cpp
+++ b/ydb/core/cms/console/log_settings_configurator.cpp
@@ -1,107 +1,107 @@
-#include "configs_dispatcher.h"
-#include "console.h"
-#include "log_settings_configurator.h"
-
+#include "configs_dispatcher.h"
+#include "console.h"
+#include "log_settings_configurator.h"
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <util/system/file.h>
#include <util/system/fs.h>
#include <util/stream/file.h>
#include <google/protobuf/text_format.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-class TLogSettingsConfigurator : public TActorBootstrapped<TLogSettingsConfigurator> {
-public:
+
+namespace NKikimr {
+namespace NConsole {
+
+class TLogSettingsConfigurator : public TActorBootstrapped<TLogSettingsConfigurator> {
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::LOG_SETTINGS_CONFIGURATOR;
- }
-
- TLogSettingsConfigurator();
+ }
+
+ TLogSettingsConfigurator();
TLogSettingsConfigurator(const TString &pathToConfigCacheFile);
-
+
void SaveLogSettingsConfigToCache(const NKikimrConfig::TLogConfig &logConfig,
const TActorContext &ctx);
- void Bootstrap(const TActorContext &ctx);
-
- void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx);
-
- void ApplyLogConfig(const NKikimrConfig::TLogConfig &config,
- const TActorContext &ctx);
- TVector<NLog::TComponentSettings>
- ComputeComponentSettings(const NKikimrConfig::TLogConfig &config,
- const TActorContext &ctx);
- void ApplyComponentSettings(const TVector<NLog::TComponentSettings> &settings,
- const TActorContext &ctx);
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
- IgnoreFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ void Bootstrap(const TActorContext &ctx);
+
+ void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx);
+
+ void ApplyLogConfig(const NKikimrConfig::TLogConfig &config,
+ const TActorContext &ctx);
+ TVector<NLog::TComponentSettings>
+ ComputeComponentSettings(const NKikimrConfig::TLogConfig &config,
+ const TActorContext &ctx);
+ void ApplyComponentSettings(const TVector<NLog::TComponentSettings> &settings,
+ const TActorContext &ctx);
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
+ IgnoreFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
+ break;
+ }
+ }
private:
TString PathToConfigCacheFile;
-};
-
-TLogSettingsConfigurator::TLogSettingsConfigurator()
-{
-}
-
+};
+
+TLogSettingsConfigurator::TLogSettingsConfigurator()
+{
+}
+
TLogSettingsConfigurator::TLogSettingsConfigurator(const TString &pathToConfigCacheFile)
{
PathToConfigCacheFile = pathToConfigCacheFile;
}
-void TLogSettingsConfigurator::Bootstrap(const TActorContext &ctx)
-{
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TLogSettingsConfigurator Bootstrap");
-
- Become(&TThis::StateWork);
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TLogSettingsConfigurator: subscribe for config updates.");
-
- ui32 item = (ui32)NKikimrConsole::TConfigItem::LogConfigItem;
- ctx.Send(MakeConfigsDispatcherID(SelfId().NodeId()),
- new TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest(item));
-}
-
-void TLogSettingsConfigurator::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
-
- LOG_INFO_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TLogSettingsConfigurator: got new config: "
- << rec.GetConfig().ShortDebugString());
-
+void TLogSettingsConfigurator::Bootstrap(const TActorContext &ctx)
+{
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TLogSettingsConfigurator Bootstrap");
+
+ Become(&TThis::StateWork);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TLogSettingsConfigurator: subscribe for config updates.");
+
+ ui32 item = (ui32)NKikimrConsole::TConfigItem::LogConfigItem;
+ ctx.Send(MakeConfigsDispatcherID(SelfId().NodeId()),
+ new TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest(item));
+}
+
+void TLogSettingsConfigurator::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+
+ LOG_INFO_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TLogSettingsConfigurator: got new config: "
+ << rec.GetConfig().ShortDebugString());
+
const auto& logConfig = rec.GetConfig().GetLogConfig();
-
+
ApplyLogConfig(logConfig, ctx);
// Save config to cache file
if (PathToConfigCacheFile)
SaveLogSettingsConfigToCache(logConfig, ctx);
- auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TLogSettingsConfigurator: Send TEvConfigNotificationResponse: "
- << resp->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
-}
-
+ auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TLogSettingsConfigurator: Send TEvConfigNotificationResponse: "
+ << resp->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+}
+
void TLogSettingsConfigurator::SaveLogSettingsConfigToCache(const NKikimrConfig::TLogConfig &logConfig,
const TActorContext &ctx) {
try {
@@ -132,90 +132,90 @@ void TLogSettingsConfigurator::SaveLogSettingsConfigToCache(const NKikimrConfig:
}
}
-void TLogSettingsConfigurator::ApplyLogConfig(const NKikimrConfig::TLogConfig &config,
- const TActorContext &ctx)
-{
- auto componentSettings = ComputeComponentSettings(config, ctx);
- ApplyComponentSettings(componentSettings, ctx);
-
- // TODO: support update for AllowDrop, Format, ClusterName, UseLocalTimestamps.
- // Options should either become atomic or update should be done via log service.
-}
-
-TVector<NLog::TComponentSettings>
-TLogSettingsConfigurator::ComputeComponentSettings(const NKikimrConfig::TLogConfig &config,
- const TActorContext &ctx)
-{
- auto *logSettings = static_cast<NLog::TSettings*>(ctx.LoggerSettings());
- NLog::TComponentSettings defSettings(config.GetDefaultLevel(),
- config.GetDefaultSamplingLevel(),
- config.GetDefaultSamplingRate());
-
- TVector<NLog::TComponentSettings> result(logSettings->MaxVal + 1, defSettings);
- for (auto &entry : config.GetEntry()) {
- auto component = logSettings->FindComponent(entry.GetComponent());
-
- if (component == NLog::InvalidComponent) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS_CONFIGS,
- "TLogSettingsConfigurator: ignoring entry for invalid component '"
- << entry.GetComponent() << "'");
- continue;
- }
-
- if (entry.HasLevel())
- result[component].Raw.X.Level = static_cast<ui8>(entry.GetLevel());
- if (entry.HasSamplingLevel())
- result[component].Raw.X.SamplingLevel = static_cast<ui8>(entry.GetSamplingLevel());
- if (entry.HasSamplingRate())
- result[component].Raw.X.SamplingRate = static_cast<ui8>(entry.GetSamplingRate());
- }
-
- return result;
-}
-
-void TLogSettingsConfigurator::ApplyComponentSettings(const TVector<NLog::TComponentSettings> &settings,
- const TActorContext &ctx)
-{
- auto *logSettings = static_cast<NLog::TSettings*>(ctx.LoggerSettings());
- for (NLog::EComponent i = logSettings->MinVal; i <= logSettings->MaxVal; ++i) {
- if (!logSettings->IsValidComponent(i))
- continue;
-
- auto curSettings = logSettings->GetComponentSettings(i);
-
- TString msg;
- if (curSettings.Raw.X.Level != settings[i].Raw.X.Level) {
- NLog::EPriority prio = static_cast<NLog::EPriority>(settings[i].Raw.X.Level);
- auto logPrio = logSettings->SetLevel(prio, i, msg)
- ? NLog::PRI_ERROR : NLog::PRI_NOTICE;
- LOG_LOG_S(ctx, logPrio, NKikimrServices::CMS_CONFIGS,
- "TLogSettingsConfigurator: " << msg);
- }
- if (curSettings.Raw.X.SamplingLevel != settings[i].Raw.X.SamplingLevel) {
- NLog::EPriority prio = static_cast<NLog::EPriority>(settings[i].Raw.X.SamplingLevel);
- auto logPrio = logSettings->SetSamplingLevel(prio, i, msg)
- ? NLog::PRI_ERROR : NLog::PRI_NOTICE;
- LOG_LOG_S(ctx, logPrio, NKikimrServices::CMS_CONFIGS,
- "TLogSettingsConfigurator: " << msg);
- }
- if (curSettings.Raw.X.SamplingRate != settings[i].Raw.X.SamplingRate) {
- auto prio = logSettings->SetSamplingRate(settings[i].Raw.X.SamplingRate, i, msg)
- ? NLog::PRI_ERROR : NLog::PRI_NOTICE;
- LOG_LOG_S(ctx, prio, NKikimrServices::CMS_CONFIGS,
- "TLogSettingsConfigurator: " << msg);
- }
- }
-}
-
-IActor *CreateLogSettingsConfigurator()
-{
- return new TLogSettingsConfigurator();
-}
-
+void TLogSettingsConfigurator::ApplyLogConfig(const NKikimrConfig::TLogConfig &config,
+ const TActorContext &ctx)
+{
+ auto componentSettings = ComputeComponentSettings(config, ctx);
+ ApplyComponentSettings(componentSettings, ctx);
+
+ // TODO: support update for AllowDrop, Format, ClusterName, UseLocalTimestamps.
+ // Options should either become atomic or update should be done via log service.
+}
+
+TVector<NLog::TComponentSettings>
+TLogSettingsConfigurator::ComputeComponentSettings(const NKikimrConfig::TLogConfig &config,
+ const TActorContext &ctx)
+{
+ auto *logSettings = static_cast<NLog::TSettings*>(ctx.LoggerSettings());
+ NLog::TComponentSettings defSettings(config.GetDefaultLevel(),
+ config.GetDefaultSamplingLevel(),
+ config.GetDefaultSamplingRate());
+
+ TVector<NLog::TComponentSettings> result(logSettings->MaxVal + 1, defSettings);
+ for (auto &entry : config.GetEntry()) {
+ auto component = logSettings->FindComponent(entry.GetComponent());
+
+ if (component == NLog::InvalidComponent) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS_CONFIGS,
+ "TLogSettingsConfigurator: ignoring entry for invalid component '"
+ << entry.GetComponent() << "'");
+ continue;
+ }
+
+ if (entry.HasLevel())
+ result[component].Raw.X.Level = static_cast<ui8>(entry.GetLevel());
+ if (entry.HasSamplingLevel())
+ result[component].Raw.X.SamplingLevel = static_cast<ui8>(entry.GetSamplingLevel());
+ if (entry.HasSamplingRate())
+ result[component].Raw.X.SamplingRate = static_cast<ui8>(entry.GetSamplingRate());
+ }
+
+ return result;
+}
+
+void TLogSettingsConfigurator::ApplyComponentSettings(const TVector<NLog::TComponentSettings> &settings,
+ const TActorContext &ctx)
+{
+ auto *logSettings = static_cast<NLog::TSettings*>(ctx.LoggerSettings());
+ for (NLog::EComponent i = logSettings->MinVal; i <= logSettings->MaxVal; ++i) {
+ if (!logSettings->IsValidComponent(i))
+ continue;
+
+ auto curSettings = logSettings->GetComponentSettings(i);
+
+ TString msg;
+ if (curSettings.Raw.X.Level != settings[i].Raw.X.Level) {
+ NLog::EPriority prio = static_cast<NLog::EPriority>(settings[i].Raw.X.Level);
+ auto logPrio = logSettings->SetLevel(prio, i, msg)
+ ? NLog::PRI_ERROR : NLog::PRI_NOTICE;
+ LOG_LOG_S(ctx, logPrio, NKikimrServices::CMS_CONFIGS,
+ "TLogSettingsConfigurator: " << msg);
+ }
+ if (curSettings.Raw.X.SamplingLevel != settings[i].Raw.X.SamplingLevel) {
+ NLog::EPriority prio = static_cast<NLog::EPriority>(settings[i].Raw.X.SamplingLevel);
+ auto logPrio = logSettings->SetSamplingLevel(prio, i, msg)
+ ? NLog::PRI_ERROR : NLog::PRI_NOTICE;
+ LOG_LOG_S(ctx, logPrio, NKikimrServices::CMS_CONFIGS,
+ "TLogSettingsConfigurator: " << msg);
+ }
+ if (curSettings.Raw.X.SamplingRate != settings[i].Raw.X.SamplingRate) {
+ auto prio = logSettings->SetSamplingRate(settings[i].Raw.X.SamplingRate, i, msg)
+ ? NLog::PRI_ERROR : NLog::PRI_NOTICE;
+ LOG_LOG_S(ctx, prio, NKikimrServices::CMS_CONFIGS,
+ "TLogSettingsConfigurator: " << msg);
+ }
+ }
+}
+
+IActor *CreateLogSettingsConfigurator()
+{
+ return new TLogSettingsConfigurator();
+}
+
IActor *CreateLogSettingsConfigurator(const TString &pathToConfigCacheFile)
{
return new TLogSettingsConfigurator(pathToConfigCacheFile);
}
-} // namespace NConsole
-} // namespace NKikimr
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/log_settings_configurator.h b/ydb/core/cms/console/log_settings_configurator.h
index f2801a54b95..e46a92d5650 100644
--- a/ydb/core/cms/console/log_settings_configurator.h
+++ b/ydb/core/cms/console/log_settings_configurator.h
@@ -1,16 +1,16 @@
-#pragma once
-#include "defs.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-/**
- * Log Settings Configurator is used to track log config changes and adjust current
- * log setting appropriately.
- */
-IActor *CreateLogSettingsConfigurator();
-
+#pragma once
+#include "defs.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+/**
+ * Log Settings Configurator is used to track log config changes and adjust current
+ * log setting appropriately.
+ */
+IActor *CreateLogSettingsConfigurator();
+
IActor *CreateLogSettingsConfigurator(const TString &pathToConfigCacheFile);
-} // namespace NConsole
-} // namespace NKikimr
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/log_settings_configurator_ut.cpp b/ydb/core/cms/console/log_settings_configurator_ut.cpp
index af1e6f251c9..03b52e27171 100644
--- a/ydb/core/cms/console/log_settings_configurator_ut.cpp
+++ b/ydb/core/cms/console/log_settings_configurator_ut.cpp
@@ -1,349 +1,349 @@
-#include "configs_dispatcher.h"
-#include "log_settings_configurator.h"
-#include "ut_helpers.h"
-
-namespace NKikimr {
-
-using namespace NConsole;
-using namespace NConsole::NUT;
-using namespace NLog;
-
-namespace {
-
-TTenantTestConfig::TTenantPoolConfig TenantTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {"slot", "default", DOMAIN1_NAME, "", {1, 1, 1}} }},
- // NodeType
- "type1"
- };
- return res;
-}
-
-TTenantTestConfig DefaultConsoleTestConfig()
-{
- TTenantTestConfig res = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- false,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {TenantTenantPoolConfig()},
- }},
- // DataCenterCount
- 1,
- // CreateConfigsDispatcher
- true
- };
- return res;
-}
-
-NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_1;
-NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE1_LOG_1;
-
-TVector<TComponentSettings>
-InitLogSettingsConfigurator(TTenantTestRuntime &runtime)
-{
+#include "configs_dispatcher.h"
+#include "log_settings_configurator.h"
+#include "ut_helpers.h"
+
+namespace NKikimr {
+
+using namespace NConsole;
+using namespace NConsole::NUT;
+using namespace NLog;
+
+namespace {
+
+TTenantTestConfig::TTenantPoolConfig TenantTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {"slot", "default", DOMAIN1_NAME, "", {1, 1, 1}} }},
+ // NodeType
+ "type1"
+ };
+ return res;
+}
+
+TTenantTestConfig DefaultConsoleTestConfig()
+{
+ TTenantTestConfig res = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ false,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {TenantTenantPoolConfig()},
+ }},
+ // DataCenterCount
+ 1,
+ // CreateConfigsDispatcher
+ true
+ };
+ return res;
+}
+
+NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_1;
+NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE1_LOG_1;
+
+TVector<TComponentSettings>
+InitLogSettingsConfigurator(TTenantTestRuntime &runtime)
+{
CheckCreateTenant(runtime, Ydb::StatusIds::SUCCESS,
TCreateTenantRequest(TENANT1_1_NAME)
.WithPools({{"hdd", 1}}));
CheckCreateTenant(runtime, Ydb::StatusIds::SUCCESS,
TCreateTenantRequest(TENANT1_2_NAME)
.WithPools({{"hdd", 1}}));
-
- ChangeTenant(runtime, TENANT1_1_NAME);
-
- runtime.Register(CreateLogSettingsConfigurator());
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvConfigsDispatcher::EvSetConfigSubscriptionResponse, 1);
- runtime.DispatchEvents(options);
-
-
- ITEM_DOMAIN_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 1,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_DOMAIN_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 2,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_TENANT1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, TENANT1_1_NAME, "", 3,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_TENANT1_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, TENANT1_1_NAME, "", 4,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_TENANT2_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, TENANT1_2_NAME, "", 5,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_TENANT2_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, TENANT1_2_NAME, "", 6,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_TYPE1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "type1", 7,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_TYPE1_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "type1", 8,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_TENANT1_TYPE1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, TENANT1_1_NAME, "type1", 9,
- NKikimrConsole::TConfigItem::MERGE, "");
- ITEM_TENANT2_TYPE1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, TENANT1_2_NAME, "type1", 10,
- NKikimrConsole::TConfigItem::MERGE, "");
-
- auto logSettings = runtime.GetLogSettings(0);
-
- // Reset all to defaults except CMS_CONFIGS.
- TString dummy;
- logSettings->SetLevel(logSettings->DefPriority,
- InvalidComponent,
- dummy);
- logSettings->SetSamplingLevel(logSettings->DefSamplingPriority,
- InvalidComponent,
- dummy);
- logSettings->SetSamplingRate(logSettings->DefSamplingRate,
- InvalidComponent,
- dummy);
- logSettings->SetLevel(PRI_TRACE,
- NKikimrServices::CMS_CONFIGS,
- dummy);
-
- // But enable CMS_CONFIGS
-
- TVector<TComponentSettings> result(logSettings->MaxVal + 1,
- TComponentSettings(0));
- for (EComponent i = logSettings->MinVal; i <= logSettings->MaxVal; ++i) {
- if (logSettings->IsValidComponent(i))
- result[i] = logSettings->GetComponentSettings(i);
- }
- return result;
-}
-
-void SetDefaults(NKikimrConsole::TConfigItem &item,
- ui32 level,
- ui32 samplingLevel,
- ui32 samplingRate)
-{
- auto &cfg = *item.MutableConfig()->MutableLogConfig();
- cfg.SetDefaultLevel(level);
- cfg.SetDefaultSamplingLevel(samplingLevel);
- cfg.SetDefaultSamplingRate(samplingRate);
-}
-
-void AddEntry(NKikimrConsole::TConfigItem &item,
- const TString &component,
- ui32 level,
- ui32 samplingLevel,
- ui32 samplingRate)
-{
- auto &entry = *item.MutableConfig()->MutableLogConfig()->AddEntry();
- entry.SetComponent(component);
- if (level != Max<ui32>())
- entry.SetLevel(level);
- if (samplingLevel != Max<ui32>())
- entry.SetSamplingLevel(samplingLevel);
- if (samplingRate != Max<ui32>())
- entry.SetSamplingRate(samplingRate);
-}
-
-void SetDefaultLogConfig(NKikimrConsole::TConfigItem &item)
-{
- SetDefaults(item, PRI_WARN, PRI_WARN, 0);
- AddEntry(item, "CMS_CONFIGS", PRI_TRACE, Max<ui32>(), Max<ui32>());
-}
-
-void WaitForUpdate(TTenantTestRuntime &runtime)
-{
- struct TIsConfigNotificationProcessed {
- bool operator()(IEventHandle& ev)
- {
- if (ev.GetTypeRewrite() == NConsole::TEvConsole::EvConfigNotificationResponse) {
- auto &rec = ev.Get<NConsole::TEvConsole::TEvConfigNotificationResponse>()->Record;
- if (rec.GetConfigId().ItemIdsSize() != 1 || rec.GetConfigId().GetItemIds(0).GetId())
- return true;
- }
-
- return false;
- }
- };
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TIsConfigNotificationProcessed(), 1);
- runtime.DispatchEvents(options);
-}
-
-template <typename ...Ts>
-void ConfigureAndWaitUpdate(TTenantTestRuntime &runtime,
- Ts... args)
-{
- auto *event = new TEvConsole::TEvConfigureRequest;
- CollectActions(event->Record, args...);
-
- runtime.SendToConsole(event);
- WaitForUpdate(runtime);
-}
-
-void CompareSettings(TTenantTestRuntime &runtime,
- const TVector<TComponentSettings> &settings)
-{
- auto logSettings = runtime.GetLogSettings(0);
- for (EComponent i = logSettings->MinVal; i <= logSettings->MaxVal; ++i) {
- if (!logSettings->IsValidComponent(i))
- continue;
-
- UNIT_ASSERT_VALUES_EQUAL(settings[i].Raw.X.Level,
- logSettings->GetComponentSettings(i).Raw.X.Level);
- UNIT_ASSERT_VALUES_EQUAL(settings[i].Raw.X.SamplingLevel,
- logSettings->GetComponentSettings(i).Raw.X.SamplingLevel);
- UNIT_ASSERT_VALUES_EQUAL(settings[i].Raw.X.SamplingRate,
- logSettings->GetComponentSettings(i).Raw.X.SamplingRate);
- }
-}
-
-TVector<ui64> GetTenantItemIds(TTenantTestRuntime &runtime,
- const TString &tenant)
-{
- auto *event = new TEvConsole::TEvGetConfigItemsRequest;
- event->Record.MutableTenantFilter()->AddTenants(tenant);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetConfigItemsResponse>(handle);
- TVector<ui64> result;
- for (auto &item : reply->Record.GetConfigItems())
- result.push_back(item.GetId().GetId());
- return result;
-}
-
-} // anonymous namespace
-
-Y_UNIT_TEST_SUITE(TLogSettingsConfiguratorTests)
-{
- Y_UNIT_TEST(TestNoChanges)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- auto settings = InitLogSettingsConfigurator(runtime);
-
- SetDefaultLogConfig(ITEM_DOMAIN_LOG_1);
- ConfigureAndWaitUpdate(runtime,
- MakeAddAction(ITEM_DOMAIN_LOG_1));
- CompareSettings(runtime, settings);
- }
-
- Y_UNIT_TEST(TestAddComponentEntries)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- auto settings = InitLogSettingsConfigurator(runtime);
-
- SetDefaultLogConfig(ITEM_DOMAIN_LOG_1);
- AddEntry(ITEM_DOMAIN_LOG_1, "CMS_CLUSTER", 5, Max<ui32>(), Max<ui32>());
- AddEntry(ITEM_DOMAIN_LOG_1, "CMS_CONFIGS", Max<ui32>(), 5, Max<ui32>());
- AddEntry(ITEM_DOMAIN_LOG_1, "CMS_TENANTS", Max<ui32>(), Max<ui32>(), 5);
- ConfigureAndWaitUpdate(runtime,
- MakeAddAction(ITEM_DOMAIN_LOG_1));
- settings[NKikimrServices::CMS_CLUSTER].Raw.X.Level = 5;
- settings[NKikimrServices::CMS_CONFIGS].Raw.X.SamplingLevel = 5;
- settings[NKikimrServices::CMS_TENANTS].Raw.X.SamplingRate = 5;
- CompareSettings(runtime, settings);
- }
-
- Y_UNIT_TEST(TestRemoveComponentEntries)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- auto settings = InitLogSettingsConfigurator(runtime);
-
- SetDefaultLogConfig(ITEM_DOMAIN_LOG_1);
- AddEntry(ITEM_TENANT1_LOG_1, "CMS_CLUSTER", 5, Max<ui32>(), Max<ui32>());
- AddEntry(ITEM_TENANT1_LOG_1, "CMS_CONFIGS", Max<ui32>(), 5, Max<ui32>());
- AddEntry(ITEM_TENANT1_LOG_1, "CMS_TENANTS", Max<ui32>(), Max<ui32>(), 5);
- ConfigureAndWaitUpdate(runtime,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_TENANT1_LOG_1));
- settings[NKikimrServices::CMS_CLUSTER].Raw.X.Level = 5;
- settings[NKikimrServices::CMS_CONFIGS].Raw.X.SamplingLevel = 5;
- settings[NKikimrServices::CMS_TENANTS].Raw.X.SamplingRate = 5;
- CompareSettings(runtime, settings);
-
- auto ids = GetTenantItemIds(runtime, TENANT1_1_NAME);
- AssignIds(ids, ITEM_TENANT1_LOG_1);
-
- ConfigureAndWaitUpdate(runtime,
- MakeRemoveAction(ITEM_TENANT1_LOG_1));
- settings[NKikimrServices::CMS_CLUSTER].Raw.X.Level = 4;
- settings[NKikimrServices::CMS_CONFIGS].Raw.X.SamplingLevel = 4;
- settings[NKikimrServices::CMS_TENANTS].Raw.X.SamplingRate = 0;
- CompareSettings(runtime, settings);
- }
-
- Y_UNIT_TEST(TestChangeDefaults)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- auto settings = InitLogSettingsConfigurator(runtime);
-
- SetDefaultLogConfig(ITEM_DOMAIN_LOG_1);
- SetDefaults(ITEM_TENANT1_LOG_1, PRI_ALERT, PRI_ALERT, 10);
- ConfigureAndWaitUpdate(runtime,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_TENANT1_LOG_1));
- for (auto &set : settings)
- set = TComponentSettings(PRI_ALERT, PRI_ALERT, 10);
- settings[NKikimrServices::CMS_CONFIGS].Raw.X.Level = PRI_TRACE;
- CompareSettings(runtime, settings);
- }
-
- Y_UNIT_TEST(TestChangeTenant)
- {
- TTenantTestRuntime runtime(DefaultConsoleTestConfig());
- auto settings = InitLogSettingsConfigurator(runtime);
-
- SetDefaultLogConfig(ITEM_DOMAIN_LOG_1);
- SetDefaults(ITEM_TENANT2_LOG_1, PRI_ALERT, PRI_ALERT, 10);
- AddEntry(ITEM_TENANT2_LOG_1, "CMS_CLUSTER", 5, Max<ui32>(), Max<ui32>());
- AddEntry(ITEM_TENANT2_LOG_1, "CMS_CONFIGS", Max<ui32>(), 5, Max<ui32>());
- AddEntry(ITEM_TENANT2_LOG_1, "CMS_TENANTS", Max<ui32>(), Max<ui32>(), 5);
- ConfigureAndWaitUpdate(runtime,
- MakeAddAction(ITEM_DOMAIN_LOG_1),
- MakeAddAction(ITEM_TENANT2_LOG_1));
- CompareSettings(runtime, settings);
-
- ChangeTenant(runtime, TENANT1_2_NAME, 0, false);
- WaitForUpdate(runtime);
-
- for (auto &set : settings)
- set = TComponentSettings(PRI_ALERT, PRI_ALERT, 10);
- settings[NKikimrServices::CMS_CLUSTER].Raw.X.Level = 5;
- settings[NKikimrServices::CMS_CONFIGS].Raw.X.Level = PRI_TRACE;
- settings[NKikimrServices::CMS_CONFIGS].Raw.X.SamplingLevel = 5;
- settings[NKikimrServices::CMS_TENANTS].Raw.X.SamplingRate = 5;
- CompareSettings(runtime, settings);
- }
-}
-
-} // namespace NKikimr
+
+ ChangeTenant(runtime, TENANT1_1_NAME);
+
+ runtime.Register(CreateLogSettingsConfigurator());
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvConfigsDispatcher::EvSetConfigSubscriptionResponse, 1);
+ runtime.DispatchEvents(options);
+
+
+ ITEM_DOMAIN_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 1,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_DOMAIN_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 2,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_TENANT1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, TENANT1_1_NAME, "", 3,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_TENANT1_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, TENANT1_1_NAME, "", 4,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_TENANT2_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, TENANT1_2_NAME, "", 5,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_TENANT2_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, TENANT1_2_NAME, "", 6,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_TYPE1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "type1", 7,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_TYPE1_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "type1", 8,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_TENANT1_TYPE1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, TENANT1_1_NAME, "type1", 9,
+ NKikimrConsole::TConfigItem::MERGE, "");
+ ITEM_TENANT2_TYPE1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, TENANT1_2_NAME, "type1", 10,
+ NKikimrConsole::TConfigItem::MERGE, "");
+
+ auto logSettings = runtime.GetLogSettings(0);
+
+ // Reset all to defaults except CMS_CONFIGS.
+ TString dummy;
+ logSettings->SetLevel(logSettings->DefPriority,
+ InvalidComponent,
+ dummy);
+ logSettings->SetSamplingLevel(logSettings->DefSamplingPriority,
+ InvalidComponent,
+ dummy);
+ logSettings->SetSamplingRate(logSettings->DefSamplingRate,
+ InvalidComponent,
+ dummy);
+ logSettings->SetLevel(PRI_TRACE,
+ NKikimrServices::CMS_CONFIGS,
+ dummy);
+
+ // But enable CMS_CONFIGS
+
+ TVector<TComponentSettings> result(logSettings->MaxVal + 1,
+ TComponentSettings(0));
+ for (EComponent i = logSettings->MinVal; i <= logSettings->MaxVal; ++i) {
+ if (logSettings->IsValidComponent(i))
+ result[i] = logSettings->GetComponentSettings(i);
+ }
+ return result;
+}
+
+void SetDefaults(NKikimrConsole::TConfigItem &item,
+ ui32 level,
+ ui32 samplingLevel,
+ ui32 samplingRate)
+{
+ auto &cfg = *item.MutableConfig()->MutableLogConfig();
+ cfg.SetDefaultLevel(level);
+ cfg.SetDefaultSamplingLevel(samplingLevel);
+ cfg.SetDefaultSamplingRate(samplingRate);
+}
+
+void AddEntry(NKikimrConsole::TConfigItem &item,
+ const TString &component,
+ ui32 level,
+ ui32 samplingLevel,
+ ui32 samplingRate)
+{
+ auto &entry = *item.MutableConfig()->MutableLogConfig()->AddEntry();
+ entry.SetComponent(component);
+ if (level != Max<ui32>())
+ entry.SetLevel(level);
+ if (samplingLevel != Max<ui32>())
+ entry.SetSamplingLevel(samplingLevel);
+ if (samplingRate != Max<ui32>())
+ entry.SetSamplingRate(samplingRate);
+}
+
+void SetDefaultLogConfig(NKikimrConsole::TConfigItem &item)
+{
+ SetDefaults(item, PRI_WARN, PRI_WARN, 0);
+ AddEntry(item, "CMS_CONFIGS", PRI_TRACE, Max<ui32>(), Max<ui32>());
+}
+
+void WaitForUpdate(TTenantTestRuntime &runtime)
+{
+ struct TIsConfigNotificationProcessed {
+ bool operator()(IEventHandle& ev)
+ {
+ if (ev.GetTypeRewrite() == NConsole::TEvConsole::EvConfigNotificationResponse) {
+ auto &rec = ev.Get<NConsole::TEvConsole::TEvConfigNotificationResponse>()->Record;
+ if (rec.GetConfigId().ItemIdsSize() != 1 || rec.GetConfigId().GetItemIds(0).GetId())
+ return true;
+ }
+
+ return false;
+ }
+ };
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TIsConfigNotificationProcessed(), 1);
+ runtime.DispatchEvents(options);
+}
+
+template <typename ...Ts>
+void ConfigureAndWaitUpdate(TTenantTestRuntime &runtime,
+ Ts... args)
+{
+ auto *event = new TEvConsole::TEvConfigureRequest;
+ CollectActions(event->Record, args...);
+
+ runtime.SendToConsole(event);
+ WaitForUpdate(runtime);
+}
+
+void CompareSettings(TTenantTestRuntime &runtime,
+ const TVector<TComponentSettings> &settings)
+{
+ auto logSettings = runtime.GetLogSettings(0);
+ for (EComponent i = logSettings->MinVal; i <= logSettings->MaxVal; ++i) {
+ if (!logSettings->IsValidComponent(i))
+ continue;
+
+ UNIT_ASSERT_VALUES_EQUAL(settings[i].Raw.X.Level,
+ logSettings->GetComponentSettings(i).Raw.X.Level);
+ UNIT_ASSERT_VALUES_EQUAL(settings[i].Raw.X.SamplingLevel,
+ logSettings->GetComponentSettings(i).Raw.X.SamplingLevel);
+ UNIT_ASSERT_VALUES_EQUAL(settings[i].Raw.X.SamplingRate,
+ logSettings->GetComponentSettings(i).Raw.X.SamplingRate);
+ }
+}
+
+TVector<ui64> GetTenantItemIds(TTenantTestRuntime &runtime,
+ const TString &tenant)
+{
+ auto *event = new TEvConsole::TEvGetConfigItemsRequest;
+ event->Record.MutableTenantFilter()->AddTenants(tenant);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetConfigItemsResponse>(handle);
+ TVector<ui64> result;
+ for (auto &item : reply->Record.GetConfigItems())
+ result.push_back(item.GetId().GetId());
+ return result;
+}
+
+} // anonymous namespace
+
+Y_UNIT_TEST_SUITE(TLogSettingsConfiguratorTests)
+{
+ Y_UNIT_TEST(TestNoChanges)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ auto settings = InitLogSettingsConfigurator(runtime);
+
+ SetDefaultLogConfig(ITEM_DOMAIN_LOG_1);
+ ConfigureAndWaitUpdate(runtime,
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+ CompareSettings(runtime, settings);
+ }
+
+ Y_UNIT_TEST(TestAddComponentEntries)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ auto settings = InitLogSettingsConfigurator(runtime);
+
+ SetDefaultLogConfig(ITEM_DOMAIN_LOG_1);
+ AddEntry(ITEM_DOMAIN_LOG_1, "CMS_CLUSTER", 5, Max<ui32>(), Max<ui32>());
+ AddEntry(ITEM_DOMAIN_LOG_1, "CMS_CONFIGS", Max<ui32>(), 5, Max<ui32>());
+ AddEntry(ITEM_DOMAIN_LOG_1, "CMS_TENANTS", Max<ui32>(), Max<ui32>(), 5);
+ ConfigureAndWaitUpdate(runtime,
+ MakeAddAction(ITEM_DOMAIN_LOG_1));
+ settings[NKikimrServices::CMS_CLUSTER].Raw.X.Level = 5;
+ settings[NKikimrServices::CMS_CONFIGS].Raw.X.SamplingLevel = 5;
+ settings[NKikimrServices::CMS_TENANTS].Raw.X.SamplingRate = 5;
+ CompareSettings(runtime, settings);
+ }
+
+ Y_UNIT_TEST(TestRemoveComponentEntries)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ auto settings = InitLogSettingsConfigurator(runtime);
+
+ SetDefaultLogConfig(ITEM_DOMAIN_LOG_1);
+ AddEntry(ITEM_TENANT1_LOG_1, "CMS_CLUSTER", 5, Max<ui32>(), Max<ui32>());
+ AddEntry(ITEM_TENANT1_LOG_1, "CMS_CONFIGS", Max<ui32>(), 5, Max<ui32>());
+ AddEntry(ITEM_TENANT1_LOG_1, "CMS_TENANTS", Max<ui32>(), Max<ui32>(), 5);
+ ConfigureAndWaitUpdate(runtime,
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_TENANT1_LOG_1));
+ settings[NKikimrServices::CMS_CLUSTER].Raw.X.Level = 5;
+ settings[NKikimrServices::CMS_CONFIGS].Raw.X.SamplingLevel = 5;
+ settings[NKikimrServices::CMS_TENANTS].Raw.X.SamplingRate = 5;
+ CompareSettings(runtime, settings);
+
+ auto ids = GetTenantItemIds(runtime, TENANT1_1_NAME);
+ AssignIds(ids, ITEM_TENANT1_LOG_1);
+
+ ConfigureAndWaitUpdate(runtime,
+ MakeRemoveAction(ITEM_TENANT1_LOG_1));
+ settings[NKikimrServices::CMS_CLUSTER].Raw.X.Level = 4;
+ settings[NKikimrServices::CMS_CONFIGS].Raw.X.SamplingLevel = 4;
+ settings[NKikimrServices::CMS_TENANTS].Raw.X.SamplingRate = 0;
+ CompareSettings(runtime, settings);
+ }
+
+ Y_UNIT_TEST(TestChangeDefaults)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ auto settings = InitLogSettingsConfigurator(runtime);
+
+ SetDefaultLogConfig(ITEM_DOMAIN_LOG_1);
+ SetDefaults(ITEM_TENANT1_LOG_1, PRI_ALERT, PRI_ALERT, 10);
+ ConfigureAndWaitUpdate(runtime,
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_TENANT1_LOG_1));
+ for (auto &set : settings)
+ set = TComponentSettings(PRI_ALERT, PRI_ALERT, 10);
+ settings[NKikimrServices::CMS_CONFIGS].Raw.X.Level = PRI_TRACE;
+ CompareSettings(runtime, settings);
+ }
+
+ Y_UNIT_TEST(TestChangeTenant)
+ {
+ TTenantTestRuntime runtime(DefaultConsoleTestConfig());
+ auto settings = InitLogSettingsConfigurator(runtime);
+
+ SetDefaultLogConfig(ITEM_DOMAIN_LOG_1);
+ SetDefaults(ITEM_TENANT2_LOG_1, PRI_ALERT, PRI_ALERT, 10);
+ AddEntry(ITEM_TENANT2_LOG_1, "CMS_CLUSTER", 5, Max<ui32>(), Max<ui32>());
+ AddEntry(ITEM_TENANT2_LOG_1, "CMS_CONFIGS", Max<ui32>(), 5, Max<ui32>());
+ AddEntry(ITEM_TENANT2_LOG_1, "CMS_TENANTS", Max<ui32>(), Max<ui32>(), 5);
+ ConfigureAndWaitUpdate(runtime,
+ MakeAddAction(ITEM_DOMAIN_LOG_1),
+ MakeAddAction(ITEM_TENANT2_LOG_1));
+ CompareSettings(runtime, settings);
+
+ ChangeTenant(runtime, TENANT1_2_NAME, 0, false);
+ WaitForUpdate(runtime);
+
+ for (auto &set : settings)
+ set = TComponentSettings(PRI_ALERT, PRI_ALERT, 10);
+ settings[NKikimrServices::CMS_CLUSTER].Raw.X.Level = 5;
+ settings[NKikimrServices::CMS_CONFIGS].Raw.X.Level = PRI_TRACE;
+ settings[NKikimrServices::CMS_CONFIGS].Raw.X.SamplingLevel = 5;
+ settings[NKikimrServices::CMS_TENANTS].Raw.X.SamplingRate = 5;
+ CompareSettings(runtime, settings);
+ }
+}
+
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/modifications_validator.cpp b/ydb/core/cms/console/modifications_validator.cpp
index a300a402182..b3125be5850 100644
--- a/ydb/core/cms/console/modifications_validator.cpp
+++ b/ydb/core/cms/console/modifications_validator.cpp
@@ -1,374 +1,374 @@
-#include "modifications_validator.h"
-
+#include "modifications_validator.h"
+
#include <ydb/core/cms/console/validators/registry.h>
-
+
#include <ydb/library/yql/public/issue/protos/issue_severity.pb.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-TModificationsValidator::TModificationsValidator(const TConfigIndex &index,
- const TConfigModifications &diff,
- const TConfigsConfig &config)
- : OldIndex(index)
- , ValidationLevel(config.ValidationLevel)
- , ChecksLimit(config.MaxConfigChecksPerModification)
- , FailOnExceededChecksLimit(config.FailOnExceededConfigChecksLimit)
- , TreatWarningAsError(config.TreatWarningAsError)
- , Validated(false)
- , ValidationResult(false)
-{
- Y_UNUSED(ChecksLimit);
- Y_UNUSED(FailOnExceededChecksLimit);
-
- BuildConfigIndexForValidation();
-
- TConfigModifications importantDiff = BuildModificationsForValidation(diff);
-
- CollectModifiedItems(importantDiff);
-
- importantDiff.ApplyTo(Index);
-}
-
-bool TModificationsValidator::ApplyValidators()
-{
- if (!Validated)
- ValidateModifications();
-
- if (ValidationResult && TreatWarningAsError) {
- for (auto &issue : Issues) {
- if (issue.severity() == NYql::TSeverityIds::S_WARNING) {
- ValidationResult = false;
- break;
- }
- }
- }
-
- Validated = true;
-
- return ValidationResult;
-}
-
-const TVector<Ydb::Issue::IssueMessage> &TModificationsValidator::GetIssues() const
-{
- return Issues;
-}
-
-const TString &TModificationsValidator::GetErrorMessage() const
-{
- return Error;
-}
-
-ui64 TModificationsValidator::GetChecksDone() const
-{
- return ChecksDone;
-}
-
-void TModificationsValidator::BuildConfigIndexForValidation()
-{
- if (ValidationLevel == NKikimrConsole::VALIDATE_NONE)
- return;
-
- TConfigItems items;
- OldIndex.CollectItemsByTenantAndNodeType("", "", TDynBitMap(), items);
- if (ValidationLevel == NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES) {
- OldIndex.CollectItemsWithTenantScope({}, items);
- OldIndex.CollectItemsWithNodeTypeScope({}, items);
- } else if (ValidationLevel == NKikimrConsole::VALIDATE_TENANTS) {
- OldIndex.CollectItemsWithPureTenantScope({}, items);
- }
-
- for (auto &item : items)
- Index.AddItem(item);
-}
-
-TConfigModifications TModificationsValidator::BuildModificationsForValidation(const TConfigModifications &diff)
-{
- TConfigModifications result;
-
- for (auto id : diff.RemovedItems) {
- if (Index.GetItem(id))
- result.RemovedItems.insert(id);
- }
-
- ui64 newId = Max<ui64>();
- for (auto &pr : diff.ModifiedItems) {
- if (Index.GetItem(pr.first)) {
- if (IsValidationRequired(pr.second)) {
- TConfigItem::TPtr newItem = new TConfigItem(*pr.second);
- ++newItem->Generation;
- result.ModifiedItems.emplace(pr.first, newItem);
- } else {
- result.RemovedItems.insert(pr.first);
- }
- } else if (IsValidationRequired(pr.second)) {
- TConfigItem::TPtr newItem = new TConfigItem(*pr.second);
- ++newItem->Generation;
- result.AddedItems.push_back(newItem);
- }
- }
-
- for (auto &item : diff.AddedItems) {
- if (IsValidationRequired(item)) {
- TConfigItem::TPtr newItem = new TConfigItem(*item);
- newItem->Id = newId--;
- newItem->Generation = 1;
- result.AddedItems.push_back(newItem);
- }
- }
-
- return result;
-}
-
-void TModificationsValidator::CollectModifiedItems(const TConfigModifications &diff)
-{
- for (auto id : diff.RemovedItems)
- ModifiedItems.insert(Index.GetItem(id));
- for (auto &pr : diff.ModifiedItems) {
- ModifiedItems.insert(Index.GetItem(pr.first));
- ModifiedItems.insert(pr.second);
- }
- for (auto item : diff.AddedItems)
- ModifiedItems.insert(item);
-}
-
-bool TModificationsValidator::IsValidationRequired(TConfigItem::TPtr item) const
-{
- if (!item->UsageScope.NodeIds.empty() || !item->UsageScope.Hosts.empty())
- return false;
-
- if (item->UsageScope.NodeType)
- return ValidationLevel == NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES;
-
- if (item->UsageScope.Tenant)
- return (ValidationLevel == NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES
- || ValidationLevel == NKikimrConsole::VALIDATE_TENANTS);
-
- return ValidationLevel != NKikimrConsole::VALIDATE_NONE;
-}
-
-void TModificationsValidator::ValidateModifications()
-{
- if (ModifiedItems.empty()) {
- ValidationResult = true;
- return;
- }
-
- ChecksDone = 0;
-
- TDynBitMap modifiedKinds;
- for (auto item : ModifiedItems)
- modifiedKinds.Set(item->Kind);
-
- auto &itemClasses = TValidatorsRegistry::Instance()->GetValidatorClasses();
- for (auto &cl : itemClasses) {
- if (cl.Empty() || modifiedKinds.HasAny(cl)) {
- if (ChecksLimit && (ChecksDone >= ChecksLimit)) {
- AddLimitExceededIssue();
- ValidationResult = !FailOnExceededChecksLimit;
- return;
- }
-
- if (!ValidateConfigs(cl)) {
- ValidationResult = false;
- return;
- }
- }
- }
-
- ValidationResult = true;
-}
-
-bool TModificationsValidator::ValidateConfigs(const TDynBitMap &kinds)
-{
- auto requiredChecks = ComputeAffectedConfigs(kinds, true);
-
- for (auto &pr : requiredChecks) {
- if (ChecksLimit && (ChecksDone >= ChecksLimit)) {
- AddLimitExceededIssue();
- return !FailOnExceededChecksLimit;
- }
- ++ChecksDone;
-
- if (!ValidateConfig(kinds, pr.Tenant, pr.NodeType))
- return false;
- }
-
- return true;
-}
-
-THashSet<TTenantAndNodeType>
-TModificationsValidator::ComputeAffectedConfigs(const TDynBitMap &kinds,
- bool requireCheck) const
-{
- THashSet<TTenantAndNodeType> affected;
- if (ValidationLevel == NKikimrConsole::VALIDATE_NONE)
- return affected;
-
- THashSet<TString> allTenants;
- THashSet<TString> allNodeTypes;
- THashSet<TTenantAndNodeType> allTenantAndNodeTypes;
- Index.CollectTenantAndNodeTypeUsageScopes(kinds, allTenants, allNodeTypes,
- allTenantAndNodeTypes);
-
- THashSet<TString> affectedTenants;
- THashSet<TString> affectedNodeTypes;
- THashSet<TTenantAndNodeType> affectedTenantAndNodeTypes;
- bool domainAffected = false;
-
- for (auto item : ModifiedItems) {
- if (!kinds.Empty() && !kinds.Get(item->Kind))
- continue;
-
- Y_ASSERT(item->UsageScope.NodeIds.empty()
- && item->UsageScope.Hosts.empty());
-
- if (item->UsageScope.Tenant) {
- if (item->UsageScope.NodeType)
- affectedTenantAndNodeTypes.insert({item->UsageScope.Tenant,
- item->UsageScope.NodeType});
- else
- affectedTenants.insert(item->UsageScope.Tenant);
- } else if (item->UsageScope.NodeType) {
- affectedNodeTypes.insert(item->UsageScope.NodeType);
- } else {
- Y_VERIFY(item->UsageScope.NodeIds.empty());
- Y_VERIFY(item->UsageScope.Hosts.empty());
- domainAffected = true;
- }
- }
-
- // Affected tenants and types with no more configs should still
- // be included into the result if all affected configs are
- // requested.
- if (!requireCheck) {
- allTenants.insert(affectedTenants.begin(), affectedTenants.end());
- allNodeTypes.insert(affectedNodeTypes.begin(), affectedNodeTypes.end());
- allTenantAndNodeTypes.insert(affectedTenantAndNodeTypes.begin(),
- affectedTenantAndNodeTypes.end());
- }
-
- if (domainAffected) {
- affected.insert({TString(), TString()});
- if (ValidationLevel == NKikimrConsole::VALIDATE_DOMAIN) {
- Y_ASSERT(affected.size() == 1);
- } else {
- for (auto &tenant : allTenants)
- affected.insert({tenant, TString()});
-
- if (ValidationLevel == NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES) {
- for (auto &type : allNodeTypes) {
- affected.insert({TString(), type});
- for (auto &tenant : allTenants)
- affected.insert({tenant, type});
- }
-
- for (auto &type : allTenantAndNodeTypes)
- affected.insert(type);
- }
- }
- } else {
- if (ValidationLevel == NKikimrConsole::VALIDATE_DOMAIN) {
- Y_FAIL("Trying to validate unmodified kinds");
- } else {
- // If tenant was modified but it has no more config items in
- // the resulting config index then its config is equal to
- // domain one (which is unmodified) and shouldn't be checked.
- for (auto &tenant : affectedTenants) {
+
+namespace NKikimr {
+namespace NConsole {
+
+TModificationsValidator::TModificationsValidator(const TConfigIndex &index,
+ const TConfigModifications &diff,
+ const TConfigsConfig &config)
+ : OldIndex(index)
+ , ValidationLevel(config.ValidationLevel)
+ , ChecksLimit(config.MaxConfigChecksPerModification)
+ , FailOnExceededChecksLimit(config.FailOnExceededConfigChecksLimit)
+ , TreatWarningAsError(config.TreatWarningAsError)
+ , Validated(false)
+ , ValidationResult(false)
+{
+ Y_UNUSED(ChecksLimit);
+ Y_UNUSED(FailOnExceededChecksLimit);
+
+ BuildConfigIndexForValidation();
+
+ TConfigModifications importantDiff = BuildModificationsForValidation(diff);
+
+ CollectModifiedItems(importantDiff);
+
+ importantDiff.ApplyTo(Index);
+}
+
+bool TModificationsValidator::ApplyValidators()
+{
+ if (!Validated)
+ ValidateModifications();
+
+ if (ValidationResult && TreatWarningAsError) {
+ for (auto &issue : Issues) {
+ if (issue.severity() == NYql::TSeverityIds::S_WARNING) {
+ ValidationResult = false;
+ break;
+ }
+ }
+ }
+
+ Validated = true;
+
+ return ValidationResult;
+}
+
+const TVector<Ydb::Issue::IssueMessage> &TModificationsValidator::GetIssues() const
+{
+ return Issues;
+}
+
+const TString &TModificationsValidator::GetErrorMessage() const
+{
+ return Error;
+}
+
+ui64 TModificationsValidator::GetChecksDone() const
+{
+ return ChecksDone;
+}
+
+void TModificationsValidator::BuildConfigIndexForValidation()
+{
+ if (ValidationLevel == NKikimrConsole::VALIDATE_NONE)
+ return;
+
+ TConfigItems items;
+ OldIndex.CollectItemsByTenantAndNodeType("", "", TDynBitMap(), items);
+ if (ValidationLevel == NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES) {
+ OldIndex.CollectItemsWithTenantScope({}, items);
+ OldIndex.CollectItemsWithNodeTypeScope({}, items);
+ } else if (ValidationLevel == NKikimrConsole::VALIDATE_TENANTS) {
+ OldIndex.CollectItemsWithPureTenantScope({}, items);
+ }
+
+ for (auto &item : items)
+ Index.AddItem(item);
+}
+
+TConfigModifications TModificationsValidator::BuildModificationsForValidation(const TConfigModifications &diff)
+{
+ TConfigModifications result;
+
+ for (auto id : diff.RemovedItems) {
+ if (Index.GetItem(id))
+ result.RemovedItems.insert(id);
+ }
+
+ ui64 newId = Max<ui64>();
+ for (auto &pr : diff.ModifiedItems) {
+ if (Index.GetItem(pr.first)) {
+ if (IsValidationRequired(pr.second)) {
+ TConfigItem::TPtr newItem = new TConfigItem(*pr.second);
+ ++newItem->Generation;
+ result.ModifiedItems.emplace(pr.first, newItem);
+ } else {
+ result.RemovedItems.insert(pr.first);
+ }
+ } else if (IsValidationRequired(pr.second)) {
+ TConfigItem::TPtr newItem = new TConfigItem(*pr.second);
+ ++newItem->Generation;
+ result.AddedItems.push_back(newItem);
+ }
+ }
+
+ for (auto &item : diff.AddedItems) {
+ if (IsValidationRequired(item)) {
+ TConfigItem::TPtr newItem = new TConfigItem(*item);
+ newItem->Id = newId--;
+ newItem->Generation = 1;
+ result.AddedItems.push_back(newItem);
+ }
+ }
+
+ return result;
+}
+
+void TModificationsValidator::CollectModifiedItems(const TConfigModifications &diff)
+{
+ for (auto id : diff.RemovedItems)
+ ModifiedItems.insert(Index.GetItem(id));
+ for (auto &pr : diff.ModifiedItems) {
+ ModifiedItems.insert(Index.GetItem(pr.first));
+ ModifiedItems.insert(pr.second);
+ }
+ for (auto item : diff.AddedItems)
+ ModifiedItems.insert(item);
+}
+
+bool TModificationsValidator::IsValidationRequired(TConfigItem::TPtr item) const
+{
+ if (!item->UsageScope.NodeIds.empty() || !item->UsageScope.Hosts.empty())
+ return false;
+
+ if (item->UsageScope.NodeType)
+ return ValidationLevel == NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES;
+
+ if (item->UsageScope.Tenant)
+ return (ValidationLevel == NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES
+ || ValidationLevel == NKikimrConsole::VALIDATE_TENANTS);
+
+ return ValidationLevel != NKikimrConsole::VALIDATE_NONE;
+}
+
+void TModificationsValidator::ValidateModifications()
+{
+ if (ModifiedItems.empty()) {
+ ValidationResult = true;
+ return;
+ }
+
+ ChecksDone = 0;
+
+ TDynBitMap modifiedKinds;
+ for (auto item : ModifiedItems)
+ modifiedKinds.Set(item->Kind);
+
+ auto &itemClasses = TValidatorsRegistry::Instance()->GetValidatorClasses();
+ for (auto &cl : itemClasses) {
+ if (cl.Empty() || modifiedKinds.HasAny(cl)) {
+ if (ChecksLimit && (ChecksDone >= ChecksLimit)) {
+ AddLimitExceededIssue();
+ ValidationResult = !FailOnExceededChecksLimit;
+ return;
+ }
+
+ if (!ValidateConfigs(cl)) {
+ ValidationResult = false;
+ return;
+ }
+ }
+ }
+
+ ValidationResult = true;
+}
+
+bool TModificationsValidator::ValidateConfigs(const TDynBitMap &kinds)
+{
+ auto requiredChecks = ComputeAffectedConfigs(kinds, true);
+
+ for (auto &pr : requiredChecks) {
+ if (ChecksLimit && (ChecksDone >= ChecksLimit)) {
+ AddLimitExceededIssue();
+ return !FailOnExceededChecksLimit;
+ }
+ ++ChecksDone;
+
+ if (!ValidateConfig(kinds, pr.Tenant, pr.NodeType))
+ return false;
+ }
+
+ return true;
+}
+
+THashSet<TTenantAndNodeType>
+TModificationsValidator::ComputeAffectedConfigs(const TDynBitMap &kinds,
+ bool requireCheck) const
+{
+ THashSet<TTenantAndNodeType> affected;
+ if (ValidationLevel == NKikimrConsole::VALIDATE_NONE)
+ return affected;
+
+ THashSet<TString> allTenants;
+ THashSet<TString> allNodeTypes;
+ THashSet<TTenantAndNodeType> allTenantAndNodeTypes;
+ Index.CollectTenantAndNodeTypeUsageScopes(kinds, allTenants, allNodeTypes,
+ allTenantAndNodeTypes);
+
+ THashSet<TString> affectedTenants;
+ THashSet<TString> affectedNodeTypes;
+ THashSet<TTenantAndNodeType> affectedTenantAndNodeTypes;
+ bool domainAffected = false;
+
+ for (auto item : ModifiedItems) {
+ if (!kinds.Empty() && !kinds.Get(item->Kind))
+ continue;
+
+ Y_ASSERT(item->UsageScope.NodeIds.empty()
+ && item->UsageScope.Hosts.empty());
+
+ if (item->UsageScope.Tenant) {
+ if (item->UsageScope.NodeType)
+ affectedTenantAndNodeTypes.insert({item->UsageScope.Tenant,
+ item->UsageScope.NodeType});
+ else
+ affectedTenants.insert(item->UsageScope.Tenant);
+ } else if (item->UsageScope.NodeType) {
+ affectedNodeTypes.insert(item->UsageScope.NodeType);
+ } else {
+ Y_VERIFY(item->UsageScope.NodeIds.empty());
+ Y_VERIFY(item->UsageScope.Hosts.empty());
+ domainAffected = true;
+ }
+ }
+
+ // Affected tenants and types with no more configs should still
+ // be included into the result if all affected configs are
+ // requested.
+ if (!requireCheck) {
+ allTenants.insert(affectedTenants.begin(), affectedTenants.end());
+ allNodeTypes.insert(affectedNodeTypes.begin(), affectedNodeTypes.end());
+ allTenantAndNodeTypes.insert(affectedTenantAndNodeTypes.begin(),
+ affectedTenantAndNodeTypes.end());
+ }
+
+ if (domainAffected) {
+ affected.insert({TString(), TString()});
+ if (ValidationLevel == NKikimrConsole::VALIDATE_DOMAIN) {
+ Y_ASSERT(affected.size() == 1);
+ } else {
+ for (auto &tenant : allTenants)
+ affected.insert({tenant, TString()});
+
+ if (ValidationLevel == NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES) {
+ for (auto &type : allNodeTypes) {
+ affected.insert({TString(), type});
+ for (auto &tenant : allTenants)
+ affected.insert({tenant, type});
+ }
+
+ for (auto &type : allTenantAndNodeTypes)
+ affected.insert(type);
+ }
+ }
+ } else {
+ if (ValidationLevel == NKikimrConsole::VALIDATE_DOMAIN) {
+ Y_FAIL("Trying to validate unmodified kinds");
+ } else {
+ // If tenant was modified but it has no more config items in
+ // the resulting config index then its config is equal to
+ // domain one (which is unmodified) and shouldn't be checked.
+ for (auto &tenant : affectedTenants) {
if (allTenants.contains(tenant))
- affected.insert({tenant, TString()});
- }
-
- if (ValidationLevel == NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES) {
- // Affected node types should be checked with all tenants.
- // Filter out those types which have no more config items
- // in the resulting config index.
- for (auto &type : affectedNodeTypes) {
+ affected.insert({tenant, TString()});
+ }
+
+ if (ValidationLevel == NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES) {
+ // Affected node types should be checked with all tenants.
+ // Filter out those types which have no more config items
+ // in the resulting config index.
+ for (auto &type : affectedNodeTypes) {
if (allNodeTypes.contains(type)) {
- affected.insert({TString(), type});
-
- for (auto &tenant : allTenants)
- affected.insert({tenant, type});
- }
- }
- // Similarly to affected node types affected tenants should be
- // checked with all node types.
- for (auto &tenant : affectedTenants) {
+ affected.insert({TString(), type});
+
+ for (auto &tenant : allTenants)
+ affected.insert({tenant, type});
+ }
+ }
+ // Similarly to affected node types affected tenants should be
+ // checked with all node types.
+ for (auto &tenant : affectedTenants) {
if (allTenants.contains(tenant)) {
- for (auto &type : allNodeTypes)
- affected.insert({tenant, type});
- }
- }
-
- // Modified tenant and node type pair should be checked in case
- // the resulting config index holds items for both tenant and
- // node type.
- for (auto &type : affectedTenantAndNodeTypes) {
- if (allTenantAndNodeTypes.contains(type)
- || (allTenants.contains(type.Tenant)
- && allNodeTypes.contains(type.NodeType)))
- affected.insert(type);
- }
- }
- }
- }
-
- return affected;
-}
-
-bool TModificationsValidator::ValidateConfig(const TDynBitMap &kinds,
- const TString &tenant,
- const TString &nodeType)
-{
- NKikimrConfig::TAppConfig oldConfig;
- NKikimrConfig::TAppConfig newConfig;
- BuildConfigs(kinds, tenant, nodeType, oldConfig, newConfig);
-
- if (!TValidatorsRegistry::Instance()->CheckConfig(oldConfig, newConfig, kinds, Issues)) {
- ExtractErrorMessage();
- return false;
- }
-
- return true;
-}
-
-void TModificationsValidator::BuildConfigs(const TDynBitMap &kinds,
- const TString &tenant,
- const TString &nodeType,
- NKikimrConfig::TAppConfig &oldConfig,
- NKikimrConfig::TAppConfig &newConfig) const
-{
- auto oldScopedConfig = OldIndex.BuildConfig(0, "", tenant, nodeType, kinds);
- oldScopedConfig->ComputeConfig(oldConfig);
- auto newScopedConfig = Index.BuildConfig(0, "", tenant, nodeType, kinds);
- newScopedConfig->ComputeConfig(newConfig);
-}
-
-void TModificationsValidator::ExtractErrorMessage()
-{
- for (auto &issue : Issues) {
- if (issue.severity() == NYql::TSeverityIds::S_ERROR
- || issue.severity() == NYql::TSeverityIds::S_FATAL) {
- Error = issue.message();
- break;
- }
- }
-}
-
-void TModificationsValidator::AddLimitExceededIssue()
-{
- auto msg = Sprintf("Config checks limit (%" PRIu64 ") exceeded during validation",
- ChecksLimit);
- Ydb::Issue::IssueMessage issue;
- issue.set_message(msg);
- if (FailOnExceededChecksLimit) {
- issue.set_severity(NYql::TSeverityIds::S_ERROR);
- Error = msg;
- } else {
- issue.set_severity(NYql::TSeverityIds::S_INFO);
- }
- Issues.push_back(issue);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ for (auto &type : allNodeTypes)
+ affected.insert({tenant, type});
+ }
+ }
+
+ // Modified tenant and node type pair should be checked in case
+ // the resulting config index holds items for both tenant and
+ // node type.
+ for (auto &type : affectedTenantAndNodeTypes) {
+ if (allTenantAndNodeTypes.contains(type)
+ || (allTenants.contains(type.Tenant)
+ && allNodeTypes.contains(type.NodeType)))
+ affected.insert(type);
+ }
+ }
+ }
+ }
+
+ return affected;
+}
+
+bool TModificationsValidator::ValidateConfig(const TDynBitMap &kinds,
+ const TString &tenant,
+ const TString &nodeType)
+{
+ NKikimrConfig::TAppConfig oldConfig;
+ NKikimrConfig::TAppConfig newConfig;
+ BuildConfigs(kinds, tenant, nodeType, oldConfig, newConfig);
+
+ if (!TValidatorsRegistry::Instance()->CheckConfig(oldConfig, newConfig, kinds, Issues)) {
+ ExtractErrorMessage();
+ return false;
+ }
+
+ return true;
+}
+
+void TModificationsValidator::BuildConfigs(const TDynBitMap &kinds,
+ const TString &tenant,
+ const TString &nodeType,
+ NKikimrConfig::TAppConfig &oldConfig,
+ NKikimrConfig::TAppConfig &newConfig) const
+{
+ auto oldScopedConfig = OldIndex.BuildConfig(0, "", tenant, nodeType, kinds);
+ oldScopedConfig->ComputeConfig(oldConfig);
+ auto newScopedConfig = Index.BuildConfig(0, "", tenant, nodeType, kinds);
+ newScopedConfig->ComputeConfig(newConfig);
+}
+
+void TModificationsValidator::ExtractErrorMessage()
+{
+ for (auto &issue : Issues) {
+ if (issue.severity() == NYql::TSeverityIds::S_ERROR
+ || issue.severity() == NYql::TSeverityIds::S_FATAL) {
+ Error = issue.message();
+ break;
+ }
+ }
+}
+
+void TModificationsValidator::AddLimitExceededIssue()
+{
+ auto msg = Sprintf("Config checks limit (%" PRIu64 ") exceeded during validation",
+ ChecksLimit);
+ Ydb::Issue::IssueMessage issue;
+ issue.set_message(msg);
+ if (FailOnExceededChecksLimit) {
+ issue.set_severity(NYql::TSeverityIds::S_ERROR);
+ Error = msg;
+ } else {
+ issue.set_severity(NYql::TSeverityIds::S_INFO);
+ }
+ Issues.push_back(issue);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/modifications_validator.h b/ydb/core/cms/console/modifications_validator.h
index 5a6acbd0733..05b85794809 100644
--- a/ydb/core/cms/console/modifications_validator.h
+++ b/ydb/core/cms/console/modifications_validator.h
@@ -1,65 +1,65 @@
-#pragma once
-
-#include "config_index.h"
-#include "configs_config.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TModificationsValidatorTests;
-
-class TModificationsValidator {
-public:
- TModificationsValidator(const TConfigIndex &index,
- const TConfigModifications &diff,
- const TConfigsConfig &config);
-
- bool ApplyValidators();
-
- const TVector<Ydb::Issue::IssueMessage> &GetIssues() const;
- const TString &GetErrorMessage() const;
- ui64 GetChecksDone() const;
-
- THashSet<TTenantAndNodeType> ComputeAffectedConfigs(const TDynBitMap &kinds,
- bool requireCheck) const;
- void BuildConfigs(const TDynBitMap &kinds,
- const TString &tenant,
- const TString &nodeType,
- NKikimrConfig::TAppConfig &oldConfig,
- NKikimrConfig::TAppConfig &newConfig) const;
-
-private:
- void BuildConfigIndexForValidation();
- TConfigModifications BuildModificationsForValidation(const TConfigModifications &diff);
- void CollectModifiedItems(const TConfigModifications &diff);
-
- bool IsValidationRequired(TConfigItem::TPtr item) const;
-
- void ValidateModifications();
- bool ValidateConfigs(const TDynBitMap &kinds);
- bool ValidateConfig(const TDynBitMap &kinds,
- const TString &tenant,
- const TString &nodeType);
- void ExtractErrorMessage();
- void AddLimitExceededIssue();
-
- TConfigIndex Index;
- TConfigItems ModifiedItems;
- const TConfigIndex &OldIndex;
-
- NKikimrConsole::EValidationLevel ValidationLevel;
- ui64 ChecksLimit;
- bool FailOnExceededChecksLimit;
- bool TreatWarningAsError;
-
- bool Validated;
- bool ValidationResult;
- TString Error;
- TVector<Ydb::Issue::IssueMessage> Issues;
- ui64 ChecksDone;
-
- friend class TModificationsValidatorTests;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
+#pragma once
+
+#include "config_index.h"
+#include "configs_config.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TModificationsValidatorTests;
+
+class TModificationsValidator {
+public:
+ TModificationsValidator(const TConfigIndex &index,
+ const TConfigModifications &diff,
+ const TConfigsConfig &config);
+
+ bool ApplyValidators();
+
+ const TVector<Ydb::Issue::IssueMessage> &GetIssues() const;
+ const TString &GetErrorMessage() const;
+ ui64 GetChecksDone() const;
+
+ THashSet<TTenantAndNodeType> ComputeAffectedConfigs(const TDynBitMap &kinds,
+ bool requireCheck) const;
+ void BuildConfigs(const TDynBitMap &kinds,
+ const TString &tenant,
+ const TString &nodeType,
+ NKikimrConfig::TAppConfig &oldConfig,
+ NKikimrConfig::TAppConfig &newConfig) const;
+
+private:
+ void BuildConfigIndexForValidation();
+ TConfigModifications BuildModificationsForValidation(const TConfigModifications &diff);
+ void CollectModifiedItems(const TConfigModifications &diff);
+
+ bool IsValidationRequired(TConfigItem::TPtr item) const;
+
+ void ValidateModifications();
+ bool ValidateConfigs(const TDynBitMap &kinds);
+ bool ValidateConfig(const TDynBitMap &kinds,
+ const TString &tenant,
+ const TString &nodeType);
+ void ExtractErrorMessage();
+ void AddLimitExceededIssue();
+
+ TConfigIndex Index;
+ TConfigItems ModifiedItems;
+ const TConfigIndex &OldIndex;
+
+ NKikimrConsole::EValidationLevel ValidationLevel;
+ ui64 ChecksLimit;
+ bool FailOnExceededChecksLimit;
+ bool TreatWarningAsError;
+
+ bool Validated;
+ bool ValidationResult;
+ TString Error;
+ TVector<Ydb::Issue::IssueMessage> Issues;
+ ui64 ChecksDone;
+
+ friend class TModificationsValidatorTests;
+};
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/modifications_validator_ut.cpp b/ydb/core/cms/console/modifications_validator_ut.cpp
index 42a7d74040b..c29d8c563ed 100644
--- a/ydb/core/cms/console/modifications_validator_ut.cpp
+++ b/ydb/core/cms/console/modifications_validator_ut.cpp
@@ -1,780 +1,780 @@
-#include "modifications_validator.h"
-#include "ut_helpers.h"
-
+#include "modifications_validator.h"
+#include "ut_helpers.h"
+
#include <ydb/core/cms/console/validators/registry.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-using namespace NUT;
-
-namespace {
-
-TConfigsConfig MakeConfigsConfig(NKikimrConsole::EValidationLevel level,
- ui64 limit = 0,
- bool failOnLimit = false,
- bool treatWarningAsError = false)
-{
- TConfigsConfig result;
- result.ValidationLevel = level;
- result.MaxConfigChecksPerModification = limit;
- result.FailOnExceededConfigChecksLimit = failOnLimit;
- result.TreatWarningAsError = treatWarningAsError;
- return result;
-}
-
-void AssignIds(ui64)
-{
-}
-
-template <typename ...Ts>
-void AssignIds(ui64 id,
- NKikimrConsole::TConfigItem &item,
- Ts&... args)
-{
- item.MutableId()->SetId(id);
- item.MutableId()->SetGeneration(1);
- item.SetOrder(static_cast<ui32>(id));
- AssignIds(id + 1, args...);
-}
-
-template <typename ...Ts>
-void AssignIdsAndOrder(NKikimrConsole::TConfigItem &item,
- Ts&... args)
-{
- AssignIds(1, item, args...);
-}
-
-NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_1;
-NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_2;
-NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_3;
-NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_4;
-NKikimrConsole::TConfigItem ITEM_NODE1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_NODE2_LOG_1;
-NKikimrConsole::TConfigItem ITEM_NODE12_LOG_1;
-NKikimrConsole::TConfigItem ITEM_HOST1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_HOST2_LOG_1;
-NKikimrConsole::TConfigItem ITEM_HOST12_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT3_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT3_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TYPE2_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TYPE2_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TYPE3_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TYPE3_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE1_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE1_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE2_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE2_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE2_LOG_2;
-NKikimrConsole::TConfigItem ITEM_TENANT3_TYPE3_LOG_1;
-NKikimrConsole::TConfigItem ITEM_TENANT3_TYPE3_LOG_2;
-
-NKikimrConsole::TConfigItem ITEM_DOMAIN_POOL_1;
-NKikimrConsole::TConfigItem ITEM_TENANT3_POOL_1;
-NKikimrConsole::TConfigItem ITEM_TYPE3_POOL_1;
-
-void InitializeTestConfigItems()
-{
- NKikimrConfig::TAppConfig logConfig;
- logConfig.MutableLogConfig()->AddEntry();
-
- ITEM_DOMAIN_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_DOMAIN_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_DOMAIN_LOG_3
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_DOMAIN_LOG_4
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_NODE1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {1}, {}, "", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_NODE2_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {2}, {}, "", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_NODE12_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {1, 2}, {}, "", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_HOST1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {"host1"}, "", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_HOST2_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {"host2"}, "", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_HOST12_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {"host1", "host2"}, "", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant1", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT1_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant1", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT2_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant2", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT2_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant2", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT3_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant3", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT3_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant3", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TYPE1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "", "type1", 0,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TYPE1_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "", "type1", 0,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TYPE2_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "", "type2", 0,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TYPE2_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "", "type2", 0,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TYPE3_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "", "type3", 0,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TYPE3_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "", "type3", 0,
- NKikimrConsole::TConfigItem::MERGE, "cookie1");
- ITEM_TENANT1_TYPE1_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant1", "type1", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT1_TYPE1_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant1", "type1", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT1_TYPE2_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant1", "type2", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT2_TYPE2_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant2", "type2", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT2_TYPE2_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant2", "type2", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT3_TYPE3_LOG_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant3", "type3", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT3_TYPE3_LOG_2
- = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
- logConfig, {}, {}, "tenant3", "type3", 0,
- NKikimrConsole::TConfigItem::MERGE);
-
- ITEM_DOMAIN_POOL_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::TenantPoolConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TENANT3_POOL_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::TenantPoolConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "tenant3", "", 0,
- NKikimrConsole::TConfigItem::MERGE);
- ITEM_TYPE3_POOL_1
- = MakeConfigItem(NKikimrConsole::TConfigItem::TenantPoolConfigItem,
- NKikimrConfig::TAppConfig(), {}, {}, "", "type3", 0,
- NKikimrConsole::TConfigItem::MERGE);
-
- AssignIdsAndOrder(ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
- ITEM_DOMAIN_LOG_3, ITEM_DOMAIN_LOG_4,
- ITEM_NODE1_LOG_1, ITEM_NODE2_LOG_1, ITEM_NODE12_LOG_1,
- ITEM_HOST1_LOG_1, ITEM_HOST2_LOG_1, ITEM_HOST12_LOG_1,
- ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
- ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
- ITEM_TENANT3_LOG_1, ITEM_TENANT3_LOG_2,
- ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
- ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
- ITEM_TYPE3_LOG_1, ITEM_TYPE3_LOG_2,
- ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
- ITEM_TENANT1_TYPE2_LOG_1,
- ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2,
- ITEM_TENANT3_TYPE3_LOG_1, ITEM_TENANT3_TYPE3_LOG_2,
- ITEM_DOMAIN_POOL_1, ITEM_TENANT3_POOL_1, ITEM_TYPE3_POOL_1);
-}
-
-TConfigIndex MakeDefaultIndex()
-{
- TConfigIndex result;
- result.AddItem(new TConfigItem(ITEM_DOMAIN_LOG_1));
- result.AddItem(new TConfigItem(ITEM_DOMAIN_LOG_2));
- result.AddItem(new TConfigItem(ITEM_DOMAIN_LOG_3));
- result.AddItem(new TConfigItem(ITEM_NODE1_LOG_1));
- result.AddItem(new TConfigItem(ITEM_NODE2_LOG_1));
- result.AddItem(new TConfigItem(ITEM_HOST1_LOG_1));
- result.AddItem(new TConfigItem(ITEM_HOST2_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TENANT1_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TENANT2_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TENANT3_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TYPE1_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TYPE2_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TYPE3_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TENANT2_TYPE2_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TENANT3_TYPE3_LOG_1));
- return result;
-}
-
-TConfigIndex MakeSmallIndex()
-{
- TConfigIndex result;
- result.AddItem(new TConfigItem(ITEM_DOMAIN_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TENANT1_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TYPE2_LOG_1));
- result.AddItem(new TConfigItem(ITEM_TENANT3_TYPE3_LOG_1));
- return result;
-}
-
-TConfigModifications MakeDiffAddItems()
-{
- TConfigModifications result;
- result.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_4));
- result.AddedItems.push_back(new TConfigItem(ITEM_NODE12_LOG_1));
- result.AddedItems.push_back(new TConfigItem(ITEM_HOST12_LOG_1));
- result.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
- result.AddedItems.push_back(new TConfigItem(ITEM_TYPE1_LOG_2));
- result.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_2));
- return result;
-}
-
-
-TConfigModifications MakeDiffRemoveItems()
-{
- TConfigModifications result;
- result.RemovedItems.insert(ITEM_DOMAIN_LOG_1.GetId().GetId());
- result.RemovedItems.insert(ITEM_NODE1_LOG_1.GetId().GetId());
- result.RemovedItems.insert(ITEM_HOST1_LOG_1.GetId().GetId());
- result.RemovedItems.insert(ITEM_TENANT1_LOG_1.GetId().GetId());
- result.RemovedItems.insert(ITEM_TYPE1_LOG_1.GetId().GetId());
- result.RemovedItems.insert(ITEM_TENANT1_TYPE1_LOG_1.GetId().GetId());
- return result;
-}
-
-TConfigModifications MakeDiffModifyItemsSameScope()
-{
- TConfigModifications result;
- result.ModifiedItems[ITEM_DOMAIN_LOG_2.GetId().GetId()]
- = new TConfigItem(ITEM_DOMAIN_LOG_2);
- result.ModifiedItems[ITEM_NODE2_LOG_1.GetId().GetId()]
- = new TConfigItem(ITEM_NODE2_LOG_1);
- result.ModifiedItems[ITEM_HOST2_LOG_1.GetId().GetId()]
- = new TConfigItem(ITEM_HOST2_LOG_1);
- result.ModifiedItems[ITEM_TENANT2_LOG_1.GetId().GetId()]
- = new TConfigItem(ITEM_TENANT2_LOG_1);
- result.ModifiedItems[ITEM_TYPE2_LOG_1.GetId().GetId()]
- = new TConfigItem(ITEM_TYPE2_LOG_1);
- result.ModifiedItems[ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()]
- = new TConfigItem(ITEM_TENANT2_TYPE2_LOG_1);
- return result;
-}
-
-void AddScopeModification(TConfigModifications &diff,
- const NKikimrConsole::TConfigItem &item,
- const NKikimrConsole::TConfigItem &scopeSource)
-{
- diff.ModifiedItems[item.GetId().GetId()]
- = new TConfigItem(item);
- diff.ModifiedItems[item.GetId().GetId()]->UsageScope
- = TUsageScope(scopeSource.GetUsageScope(),
- item.GetOrder());
-}
-
-TConfigModifications MakeDiffModifyItemsExpandScope()
-{
- TConfigModifications result;
- AddScopeModification(result, ITEM_DOMAIN_LOG_2, ITEM_DOMAIN_LOG_2);
- AddScopeModification(result, ITEM_NODE2_LOG_1, ITEM_DOMAIN_LOG_1);
- AddScopeModification(result, ITEM_HOST2_LOG_1, ITEM_TENANT1_TYPE1_LOG_1);
- AddScopeModification(result, ITEM_TENANT2_LOG_1, ITEM_DOMAIN_LOG_1);
- AddScopeModification(result, ITEM_TYPE2_LOG_1, ITEM_DOMAIN_LOG_1);
- AddScopeModification(result, ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_LOG_1);
- return result;
-}
-
-TConfigModifications MakeDiffModifyItemsNarrowScope()
-{
- TConfigModifications result;
- AddScopeModification(result, ITEM_DOMAIN_LOG_2, ITEM_TENANT2_LOG_2);
- AddScopeModification(result, ITEM_NODE2_LOG_1, ITEM_NODE2_LOG_1);
- AddScopeModification(result, ITEM_HOST2_LOG_1, ITEM_HOST2_LOG_1);
- AddScopeModification(result, ITEM_TENANT2_LOG_1, ITEM_HOST2_LOG_1);
- AddScopeModification(result, ITEM_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_1);
- AddScopeModification(result, ITEM_TENANT2_TYPE2_LOG_1, ITEM_NODE2_LOG_1);
- return result;
-}
-
-TConfigModifications MakeDiffForRequiredChecks(bool domainAffected)
-{
- TConfigModifications result;
- if (domainAffected)
- AddScopeModification(result, ITEM_DOMAIN_LOG_2, ITEM_TENANT1_LOG_1);
- else
- AddScopeModification(result, ITEM_TENANT1_LOG_2, ITEM_TENANT1_LOG_1);
- AddScopeModification(result, ITEM_TENANT2_LOG_1, ITEM_TYPE1_LOG_1);
- AddScopeModification(result, ITEM_TENANT3_LOG_1, ITEM_TENANT3_TYPE3_LOG_1);
- AddScopeModification(result, ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT1_TYPE1_LOG_1);
- AddScopeModification(result, ITEM_TYPE2_LOG_1, ITEM_TENANT1_LOG_1);
- AddScopeModification(result, ITEM_TYPE3_LOG_1, ITEM_TENANT3_TYPE3_LOG_1);
- if (domainAffected)
- result.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_POOL_1));
- result.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_POOL_1));
- result.AddedItems.push_back(new TConfigItem(ITEM_TYPE3_POOL_1));
- return result;
-}
-
-TConfigModifications MakeDiffForAllAffected(bool domainAffected)
-{
- TConfigModifications result;
- if (domainAffected) {
- result.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_POOL_1));
- result.RemovedItems.insert(ITEM_DOMAIN_LOG_1.GetId().GetId());
- }
- AddScopeModification(result, ITEM_TENANT2_LOG_1, ITEM_TYPE2_LOG_1);
- AddScopeModification(result, ITEM_TENANT3_TYPE3_LOG_1, ITEM_TYPE2_LOG_1);
- result.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_POOL_1));
- result.AddedItems.push_back(new TConfigItem(ITEM_TYPE3_POOL_1));
- result.RemovedItems.insert(ITEM_TYPE1_LOG_1.GetId().GetId());
- result.RemovedItems.insert(ITEM_TENANT1_LOG_1.GetId().GetId());
- result.RemovedItems.insert(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId());
- return result;
-}
-
-class TTestValidator : public IConfigValidator {
-public:
- TTestValidator(ui32 maxCount, bool countOld = false, bool warning = false)
- : IConfigValidator("test", NKikimrConsole::TConfigItem::LogConfigItem)
- , MaxCount(maxCount)
- , CountOld(countOld)
- , Warning(warning)
- {
- }
-
- bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
- const NKikimrConfig::TAppConfig &newConfig,
- TVector<Ydb::Issue::IssueMessage> &issues) const override
- {
- size_t count = newConfig.GetLogConfig().EntrySize();
- if (CountOld)
- count += oldConfig.GetLogConfig().EntrySize();
- if (count > MaxCount) {
- AddIssue(issues, "too many entries",
- Warning ? NYql::TSeverityIds::S_WARNING : NYql::TSeverityIds::S_ERROR);
- return false;
- }
- return true;
- }
-
-private:
- ui32 MaxCount;
- bool CountOld;
- bool Warning;
-};
-
-} // anonymous namespace
-
-class TModificationsValidatorTests : public NUnitTest::TTestBase {
-public:
- UNIT_TEST_SUITE(TModificationsValidatorTests)
- UNIT_TEST(TestIsValidationRequired_NONE)
- UNIT_TEST(TestIsValidationRequired_DOMAIN)
- UNIT_TEST(TestIsValidationRequired_TENANTS)
- UNIT_TEST(TestIsValidationRequired_TENANTS_AND_NODE_TYPES)
- UNIT_TEST(TestIndexAndModificationsShrink_AddItems_NONE)
- UNIT_TEST(TestIndexAndModificationsShrink_AddItems_DOMAIN)
- UNIT_TEST(TestIndexAndModificationsShrink_AddItems_TENANTS)
- UNIT_TEST(TestIndexAndModificationsShrink_AddItems_TENANTS_AND_NODE_TYPES)
- UNIT_TEST(TestIndexAndModificationsShrink_RemoveItems_NONE)
- UNIT_TEST(TestIndexAndModificationsShrink_RemoveItems_DOMAIN)
- UNIT_TEST(TestIndexAndModificationsShrink_RemoveItems_TENANTS)
- UNIT_TEST(TestIndexAndModificationsShrink_RemoveItems_TENANTS_AND_NODE_TYPES)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsSameScope_NONE)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsSameScope_DOMAIN)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsSameScope_TENANTS)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsSameScope_TENANTS_AND_NODE_TYPES)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsExpandScope_NONE)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsExpandScope_DOMAIN)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsExpandScope_TENANTS)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsExpandScope_TENANTS_AND_NODE_TYPES)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsNarrowScope_NONE)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsNarrowScope_DOMAIN)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsNarrowScope_TENANTS)
- UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsNarrowScope_TENANTS_AND_NODE_TYPES)
- UNIT_TEST(TestComputeAffectedConfigs_DomainAffected_DOMAIN)
- UNIT_TEST(TestComputeAffectedConfigs_DomainAffected_TENANTS)
- UNIT_TEST(TestComputeAffectedConfigs_DomainAffected_TENANTS_AND_NODE_TYPES)
- UNIT_TEST(TestComputeAffectedConfigs_DomainUnaffected_TENANTS)
- UNIT_TEST(TestComputeAffectedConfigs_DomainUnaffected_TENANTS_AND_NODE_TYPES)
- UNIT_TEST(TestComputeAffectedConfigs_All_DomainAffected_DOMAIN)
- UNIT_TEST(TestComputeAffectedConfigs_All_DomainAffected_TENANTS)
- UNIT_TEST(TestComputeAffectedConfigs_All_DomainAffected_TENANTS_AND_NODE_TYPES)
- UNIT_TEST(TestComputeAffectedConfigs_All_DomainUnaffected_TENANTS)
- UNIT_TEST(TestComputeAffectedConfigs_All_DomainUnaffected_TENANTS_AND_NODE_TYPES)
- UNIT_TEST(TestApplyValidators_TENANTS);
- UNIT_TEST(TestApplyValidators_TENANTS_AND_NODE_TYPES);
- UNIT_TEST(TestApplyValidatorsWithOldConfig);
- UNIT_TEST(TestChecksLimitError);
- UNIT_TEST(TestChecksLimitWarning);
- UNIT_TEST_SUITE_END();
-
- void TestIsValidationRequired_NONE()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
- TModificationsValidator validator(TConfigIndex(),
- TConfigModifications(),
- config);
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_DOMAIN_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_NODE12_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_HOST12_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TYPE1_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_1)));
- }
-
- void TestIsValidationRequired_DOMAIN()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
- TModificationsValidator validator(TConfigIndex(),
- TConfigModifications(),
- config);
- UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_DOMAIN_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_NODE12_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_HOST12_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TYPE1_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_1)));
- }
-
- void TestIsValidationRequired_TENANTS()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TModificationsValidator validator(TConfigIndex(),
- TConfigModifications(),
- config);
- UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_DOMAIN_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_NODE12_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_HOST12_LOG_1)));
- UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TYPE1_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_1)));
- }
-
- void TestIsValidationRequired_TENANTS_AND_NODE_TYPES()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
- TModificationsValidator validator(TConfigIndex(),
- TConfigModifications(),
- config);
- UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_DOMAIN_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_NODE12_LOG_1)));
- UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_HOST12_LOG_1)));
- UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_LOG_1)));
- UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_TYPE1_LOG_1)));
- UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_1)));
- }
-
- void TestIndexAndModificationsShrink_AddItems_NONE()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffAddItems();
- TModificationsValidator validator(index, diff, config);
-
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 0);
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 0);
- }
-
- void TestIndexAndModificationsShrink_AddItems_DOMAIN()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffAddItems();
- TModificationsValidator validator(index, diff, config);
-
- // Expect original items and new items with required scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 4);
-
- // Added items have tmp ids but also have order equal to old ids.
- THashSet<ui64> orders;
- orders.insert(ITEM_DOMAIN_LOG_4.GetId().GetId());
- for (auto &item : validator.ModifiedItems) {
+
+namespace NKikimr {
+namespace NConsole {
+
+using namespace NUT;
+
+namespace {
+
+TConfigsConfig MakeConfigsConfig(NKikimrConsole::EValidationLevel level,
+ ui64 limit = 0,
+ bool failOnLimit = false,
+ bool treatWarningAsError = false)
+{
+ TConfigsConfig result;
+ result.ValidationLevel = level;
+ result.MaxConfigChecksPerModification = limit;
+ result.FailOnExceededConfigChecksLimit = failOnLimit;
+ result.TreatWarningAsError = treatWarningAsError;
+ return result;
+}
+
+void AssignIds(ui64)
+{
+}
+
+template <typename ...Ts>
+void AssignIds(ui64 id,
+ NKikimrConsole::TConfigItem &item,
+ Ts&... args)
+{
+ item.MutableId()->SetId(id);
+ item.MutableId()->SetGeneration(1);
+ item.SetOrder(static_cast<ui32>(id));
+ AssignIds(id + 1, args...);
+}
+
+template <typename ...Ts>
+void AssignIdsAndOrder(NKikimrConsole::TConfigItem &item,
+ Ts&... args)
+{
+ AssignIds(1, item, args...);
+}
+
+NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_1;
+NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_2;
+NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_3;
+NKikimrConsole::TConfigItem ITEM_DOMAIN_LOG_4;
+NKikimrConsole::TConfigItem ITEM_NODE1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_NODE2_LOG_1;
+NKikimrConsole::TConfigItem ITEM_NODE12_LOG_1;
+NKikimrConsole::TConfigItem ITEM_HOST1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_HOST2_LOG_1;
+NKikimrConsole::TConfigItem ITEM_HOST12_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT1_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT2_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT3_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT3_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TYPE1_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TYPE2_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TYPE2_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TYPE3_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TYPE3_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE1_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE1_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT1_TYPE2_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE2_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT2_TYPE2_LOG_2;
+NKikimrConsole::TConfigItem ITEM_TENANT3_TYPE3_LOG_1;
+NKikimrConsole::TConfigItem ITEM_TENANT3_TYPE3_LOG_2;
+
+NKikimrConsole::TConfigItem ITEM_DOMAIN_POOL_1;
+NKikimrConsole::TConfigItem ITEM_TENANT3_POOL_1;
+NKikimrConsole::TConfigItem ITEM_TYPE3_POOL_1;
+
+void InitializeTestConfigItems()
+{
+ NKikimrConfig::TAppConfig logConfig;
+ logConfig.MutableLogConfig()->AddEntry();
+
+ ITEM_DOMAIN_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_DOMAIN_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_DOMAIN_LOG_3
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_DOMAIN_LOG_4
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_NODE1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {1}, {}, "", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_NODE2_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {2}, {}, "", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_NODE12_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {1, 2}, {}, "", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_HOST1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {"host1"}, "", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_HOST2_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {"host2"}, "", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_HOST12_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {"host1", "host2"}, "", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant1", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT1_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant1", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT2_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant2", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT2_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant2", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT3_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant3", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT3_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant3", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TYPE1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "", "type1", 0,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TYPE1_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "", "type1", 0,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TYPE2_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "", "type2", 0,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TYPE2_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "", "type2", 0,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TYPE3_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "", "type3", 0,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TYPE3_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "", "type3", 0,
+ NKikimrConsole::TConfigItem::MERGE, "cookie1");
+ ITEM_TENANT1_TYPE1_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant1", "type1", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT1_TYPE1_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant1", "type1", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT1_TYPE2_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant1", "type2", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT2_TYPE2_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant2", "type2", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT2_TYPE2_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant2", "type2", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT3_TYPE3_LOG_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant3", "type3", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT3_TYPE3_LOG_2
+ = MakeConfigItem(NKikimrConsole::TConfigItem::LogConfigItem,
+ logConfig, {}, {}, "tenant3", "type3", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+
+ ITEM_DOMAIN_POOL_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::TenantPoolConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TENANT3_POOL_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::TenantPoolConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "tenant3", "", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+ ITEM_TYPE3_POOL_1
+ = MakeConfigItem(NKikimrConsole::TConfigItem::TenantPoolConfigItem,
+ NKikimrConfig::TAppConfig(), {}, {}, "", "type3", 0,
+ NKikimrConsole::TConfigItem::MERGE);
+
+ AssignIdsAndOrder(ITEM_DOMAIN_LOG_1, ITEM_DOMAIN_LOG_2,
+ ITEM_DOMAIN_LOG_3, ITEM_DOMAIN_LOG_4,
+ ITEM_NODE1_LOG_1, ITEM_NODE2_LOG_1, ITEM_NODE12_LOG_1,
+ ITEM_HOST1_LOG_1, ITEM_HOST2_LOG_1, ITEM_HOST12_LOG_1,
+ ITEM_TENANT1_LOG_1, ITEM_TENANT1_LOG_2,
+ ITEM_TENANT2_LOG_1, ITEM_TENANT2_LOG_2,
+ ITEM_TENANT3_LOG_1, ITEM_TENANT3_LOG_2,
+ ITEM_TYPE1_LOG_1, ITEM_TYPE1_LOG_2,
+ ITEM_TYPE2_LOG_1, ITEM_TYPE2_LOG_2,
+ ITEM_TYPE3_LOG_1, ITEM_TYPE3_LOG_2,
+ ITEM_TENANT1_TYPE1_LOG_1, ITEM_TENANT1_TYPE1_LOG_2,
+ ITEM_TENANT1_TYPE2_LOG_1,
+ ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_2,
+ ITEM_TENANT3_TYPE3_LOG_1, ITEM_TENANT3_TYPE3_LOG_2,
+ ITEM_DOMAIN_POOL_1, ITEM_TENANT3_POOL_1, ITEM_TYPE3_POOL_1);
+}
+
+TConfigIndex MakeDefaultIndex()
+{
+ TConfigIndex result;
+ result.AddItem(new TConfigItem(ITEM_DOMAIN_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_DOMAIN_LOG_2));
+ result.AddItem(new TConfigItem(ITEM_DOMAIN_LOG_3));
+ result.AddItem(new TConfigItem(ITEM_NODE1_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_NODE2_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_HOST1_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_HOST2_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TENANT1_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TENANT2_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TENANT3_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TYPE1_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TYPE2_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TYPE3_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TENANT2_TYPE2_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TENANT3_TYPE3_LOG_1));
+ return result;
+}
+
+TConfigIndex MakeSmallIndex()
+{
+ TConfigIndex result;
+ result.AddItem(new TConfigItem(ITEM_DOMAIN_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TENANT1_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TYPE2_LOG_1));
+ result.AddItem(new TConfigItem(ITEM_TENANT3_TYPE3_LOG_1));
+ return result;
+}
+
+TConfigModifications MakeDiffAddItems()
+{
+ TConfigModifications result;
+ result.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_4));
+ result.AddedItems.push_back(new TConfigItem(ITEM_NODE12_LOG_1));
+ result.AddedItems.push_back(new TConfigItem(ITEM_HOST12_LOG_1));
+ result.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
+ result.AddedItems.push_back(new TConfigItem(ITEM_TYPE1_LOG_2));
+ result.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_2));
+ return result;
+}
+
+
+TConfigModifications MakeDiffRemoveItems()
+{
+ TConfigModifications result;
+ result.RemovedItems.insert(ITEM_DOMAIN_LOG_1.GetId().GetId());
+ result.RemovedItems.insert(ITEM_NODE1_LOG_1.GetId().GetId());
+ result.RemovedItems.insert(ITEM_HOST1_LOG_1.GetId().GetId());
+ result.RemovedItems.insert(ITEM_TENANT1_LOG_1.GetId().GetId());
+ result.RemovedItems.insert(ITEM_TYPE1_LOG_1.GetId().GetId());
+ result.RemovedItems.insert(ITEM_TENANT1_TYPE1_LOG_1.GetId().GetId());
+ return result;
+}
+
+TConfigModifications MakeDiffModifyItemsSameScope()
+{
+ TConfigModifications result;
+ result.ModifiedItems[ITEM_DOMAIN_LOG_2.GetId().GetId()]
+ = new TConfigItem(ITEM_DOMAIN_LOG_2);
+ result.ModifiedItems[ITEM_NODE2_LOG_1.GetId().GetId()]
+ = new TConfigItem(ITEM_NODE2_LOG_1);
+ result.ModifiedItems[ITEM_HOST2_LOG_1.GetId().GetId()]
+ = new TConfigItem(ITEM_HOST2_LOG_1);
+ result.ModifiedItems[ITEM_TENANT2_LOG_1.GetId().GetId()]
+ = new TConfigItem(ITEM_TENANT2_LOG_1);
+ result.ModifiedItems[ITEM_TYPE2_LOG_1.GetId().GetId()]
+ = new TConfigItem(ITEM_TYPE2_LOG_1);
+ result.ModifiedItems[ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()]
+ = new TConfigItem(ITEM_TENANT2_TYPE2_LOG_1);
+ return result;
+}
+
+void AddScopeModification(TConfigModifications &diff,
+ const NKikimrConsole::TConfigItem &item,
+ const NKikimrConsole::TConfigItem &scopeSource)
+{
+ diff.ModifiedItems[item.GetId().GetId()]
+ = new TConfigItem(item);
+ diff.ModifiedItems[item.GetId().GetId()]->UsageScope
+ = TUsageScope(scopeSource.GetUsageScope(),
+ item.GetOrder());
+}
+
+TConfigModifications MakeDiffModifyItemsExpandScope()
+{
+ TConfigModifications result;
+ AddScopeModification(result, ITEM_DOMAIN_LOG_2, ITEM_DOMAIN_LOG_2);
+ AddScopeModification(result, ITEM_NODE2_LOG_1, ITEM_DOMAIN_LOG_1);
+ AddScopeModification(result, ITEM_HOST2_LOG_1, ITEM_TENANT1_TYPE1_LOG_1);
+ AddScopeModification(result, ITEM_TENANT2_LOG_1, ITEM_DOMAIN_LOG_1);
+ AddScopeModification(result, ITEM_TYPE2_LOG_1, ITEM_DOMAIN_LOG_1);
+ AddScopeModification(result, ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT2_LOG_1);
+ return result;
+}
+
+TConfigModifications MakeDiffModifyItemsNarrowScope()
+{
+ TConfigModifications result;
+ AddScopeModification(result, ITEM_DOMAIN_LOG_2, ITEM_TENANT2_LOG_2);
+ AddScopeModification(result, ITEM_NODE2_LOG_1, ITEM_NODE2_LOG_1);
+ AddScopeModification(result, ITEM_HOST2_LOG_1, ITEM_HOST2_LOG_1);
+ AddScopeModification(result, ITEM_TENANT2_LOG_1, ITEM_HOST2_LOG_1);
+ AddScopeModification(result, ITEM_TYPE2_LOG_1, ITEM_TENANT2_TYPE2_LOG_1);
+ AddScopeModification(result, ITEM_TENANT2_TYPE2_LOG_1, ITEM_NODE2_LOG_1);
+ return result;
+}
+
+TConfigModifications MakeDiffForRequiredChecks(bool domainAffected)
+{
+ TConfigModifications result;
+ if (domainAffected)
+ AddScopeModification(result, ITEM_DOMAIN_LOG_2, ITEM_TENANT1_LOG_1);
+ else
+ AddScopeModification(result, ITEM_TENANT1_LOG_2, ITEM_TENANT1_LOG_1);
+ AddScopeModification(result, ITEM_TENANT2_LOG_1, ITEM_TYPE1_LOG_1);
+ AddScopeModification(result, ITEM_TENANT3_LOG_1, ITEM_TENANT3_TYPE3_LOG_1);
+ AddScopeModification(result, ITEM_TENANT2_TYPE2_LOG_1, ITEM_TENANT1_TYPE1_LOG_1);
+ AddScopeModification(result, ITEM_TYPE2_LOG_1, ITEM_TENANT1_LOG_1);
+ AddScopeModification(result, ITEM_TYPE3_LOG_1, ITEM_TENANT3_TYPE3_LOG_1);
+ if (domainAffected)
+ result.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_POOL_1));
+ result.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_POOL_1));
+ result.AddedItems.push_back(new TConfigItem(ITEM_TYPE3_POOL_1));
+ return result;
+}
+
+TConfigModifications MakeDiffForAllAffected(bool domainAffected)
+{
+ TConfigModifications result;
+ if (domainAffected) {
+ result.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_POOL_1));
+ result.RemovedItems.insert(ITEM_DOMAIN_LOG_1.GetId().GetId());
+ }
+ AddScopeModification(result, ITEM_TENANT2_LOG_1, ITEM_TYPE2_LOG_1);
+ AddScopeModification(result, ITEM_TENANT3_TYPE3_LOG_1, ITEM_TYPE2_LOG_1);
+ result.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_POOL_1));
+ result.AddedItems.push_back(new TConfigItem(ITEM_TYPE3_POOL_1));
+ result.RemovedItems.insert(ITEM_TYPE1_LOG_1.GetId().GetId());
+ result.RemovedItems.insert(ITEM_TENANT1_LOG_1.GetId().GetId());
+ result.RemovedItems.insert(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId());
+ return result;
+}
+
+class TTestValidator : public IConfigValidator {
+public:
+ TTestValidator(ui32 maxCount, bool countOld = false, bool warning = false)
+ : IConfigValidator("test", NKikimrConsole::TConfigItem::LogConfigItem)
+ , MaxCount(maxCount)
+ , CountOld(countOld)
+ , Warning(warning)
+ {
+ }
+
+ bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
+ const NKikimrConfig::TAppConfig &newConfig,
+ TVector<Ydb::Issue::IssueMessage> &issues) const override
+ {
+ size_t count = newConfig.GetLogConfig().EntrySize();
+ if (CountOld)
+ count += oldConfig.GetLogConfig().EntrySize();
+ if (count > MaxCount) {
+ AddIssue(issues, "too many entries",
+ Warning ? NYql::TSeverityIds::S_WARNING : NYql::TSeverityIds::S_ERROR);
+ return false;
+ }
+ return true;
+ }
+
+private:
+ ui32 MaxCount;
+ bool CountOld;
+ bool Warning;
+};
+
+} // anonymous namespace
+
+class TModificationsValidatorTests : public NUnitTest::TTestBase {
+public:
+ UNIT_TEST_SUITE(TModificationsValidatorTests)
+ UNIT_TEST(TestIsValidationRequired_NONE)
+ UNIT_TEST(TestIsValidationRequired_DOMAIN)
+ UNIT_TEST(TestIsValidationRequired_TENANTS)
+ UNIT_TEST(TestIsValidationRequired_TENANTS_AND_NODE_TYPES)
+ UNIT_TEST(TestIndexAndModificationsShrink_AddItems_NONE)
+ UNIT_TEST(TestIndexAndModificationsShrink_AddItems_DOMAIN)
+ UNIT_TEST(TestIndexAndModificationsShrink_AddItems_TENANTS)
+ UNIT_TEST(TestIndexAndModificationsShrink_AddItems_TENANTS_AND_NODE_TYPES)
+ UNIT_TEST(TestIndexAndModificationsShrink_RemoveItems_NONE)
+ UNIT_TEST(TestIndexAndModificationsShrink_RemoveItems_DOMAIN)
+ UNIT_TEST(TestIndexAndModificationsShrink_RemoveItems_TENANTS)
+ UNIT_TEST(TestIndexAndModificationsShrink_RemoveItems_TENANTS_AND_NODE_TYPES)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsSameScope_NONE)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsSameScope_DOMAIN)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsSameScope_TENANTS)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsSameScope_TENANTS_AND_NODE_TYPES)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsExpandScope_NONE)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsExpandScope_DOMAIN)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsExpandScope_TENANTS)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsExpandScope_TENANTS_AND_NODE_TYPES)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsNarrowScope_NONE)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsNarrowScope_DOMAIN)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsNarrowScope_TENANTS)
+ UNIT_TEST(TestIndexAndModificationsShrink_ModifyItemsNarrowScope_TENANTS_AND_NODE_TYPES)
+ UNIT_TEST(TestComputeAffectedConfigs_DomainAffected_DOMAIN)
+ UNIT_TEST(TestComputeAffectedConfigs_DomainAffected_TENANTS)
+ UNIT_TEST(TestComputeAffectedConfigs_DomainAffected_TENANTS_AND_NODE_TYPES)
+ UNIT_TEST(TestComputeAffectedConfigs_DomainUnaffected_TENANTS)
+ UNIT_TEST(TestComputeAffectedConfigs_DomainUnaffected_TENANTS_AND_NODE_TYPES)
+ UNIT_TEST(TestComputeAffectedConfigs_All_DomainAffected_DOMAIN)
+ UNIT_TEST(TestComputeAffectedConfigs_All_DomainAffected_TENANTS)
+ UNIT_TEST(TestComputeAffectedConfigs_All_DomainAffected_TENANTS_AND_NODE_TYPES)
+ UNIT_TEST(TestComputeAffectedConfigs_All_DomainUnaffected_TENANTS)
+ UNIT_TEST(TestComputeAffectedConfigs_All_DomainUnaffected_TENANTS_AND_NODE_TYPES)
+ UNIT_TEST(TestApplyValidators_TENANTS);
+ UNIT_TEST(TestApplyValidators_TENANTS_AND_NODE_TYPES);
+ UNIT_TEST(TestApplyValidatorsWithOldConfig);
+ UNIT_TEST(TestChecksLimitError);
+ UNIT_TEST(TestChecksLimitWarning);
+ UNIT_TEST_SUITE_END();
+
+ void TestIsValidationRequired_NONE()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
+ TModificationsValidator validator(TConfigIndex(),
+ TConfigModifications(),
+ config);
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_DOMAIN_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_NODE12_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_HOST12_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TYPE1_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_1)));
+ }
+
+ void TestIsValidationRequired_DOMAIN()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
+ TModificationsValidator validator(TConfigIndex(),
+ TConfigModifications(),
+ config);
+ UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_DOMAIN_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_NODE12_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_HOST12_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TYPE1_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_1)));
+ }
+
+ void TestIsValidationRequired_TENANTS()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TModificationsValidator validator(TConfigIndex(),
+ TConfigModifications(),
+ config);
+ UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_DOMAIN_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_NODE12_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_HOST12_LOG_1)));
+ UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TYPE1_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_1)));
+ }
+
+ void TestIsValidationRequired_TENANTS_AND_NODE_TYPES()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
+ TModificationsValidator validator(TConfigIndex(),
+ TConfigModifications(),
+ config);
+ UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_DOMAIN_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_NODE12_LOG_1)));
+ UNIT_ASSERT(!validator.IsValidationRequired(new TConfigItem(ITEM_HOST12_LOG_1)));
+ UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_LOG_1)));
+ UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_TYPE1_LOG_1)));
+ UNIT_ASSERT(validator.IsValidationRequired(new TConfigItem(ITEM_TENANT1_TYPE1_LOG_1)));
+ }
+
+ void TestIndexAndModificationsShrink_AddItems_NONE()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffAddItems();
+ TModificationsValidator validator(index, diff, config);
+
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 0);
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 0);
+ }
+
+ void TestIndexAndModificationsShrink_AddItems_DOMAIN()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffAddItems();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect original items and new items with required scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 4);
+
+ // Added items have tmp ids but also have order equal to old ids.
+ THashSet<ui64> orders;
+ orders.insert(ITEM_DOMAIN_LOG_4.GetId().GetId());
+ for (auto &item : validator.ModifiedItems) {
UNIT_ASSERT(orders.contains(item->UsageScope.Order));
- orders.erase(item->UsageScope.Order);
- }
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 1);
- }
-
- void TestIndexAndModificationsShrink_AddItems_TENANTS()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffAddItems();
- TModificationsValidator validator(index, diff, config);
-
- // Expect original items and new items with required scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 8);
-
- // Added items have tmp ids but also have order equal to old ids.
- THashSet<ui64> orders;
- orders.insert(ITEM_DOMAIN_LOG_4.GetId().GetId());
- orders.insert(ITEM_TENANT1_LOG_2.GetId().GetId());
- for (auto &item : validator.ModifiedItems) {
+ orders.erase(item->UsageScope.Order);
+ }
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 1);
+ }
+
+ void TestIndexAndModificationsShrink_AddItems_TENANTS()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffAddItems();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect original items and new items with required scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 8);
+
+ // Added items have tmp ids but also have order equal to old ids.
+ THashSet<ui64> orders;
+ orders.insert(ITEM_DOMAIN_LOG_4.GetId().GetId());
+ orders.insert(ITEM_TENANT1_LOG_2.GetId().GetId());
+ for (auto &item : validator.ModifiedItems) {
UNIT_ASSERT(orders.contains(item->UsageScope.Order));
- orders.erase(item->UsageScope.Order);
- }
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 2);
- }
-
- void TestIndexAndModificationsShrink_AddItems_TENANTS_AND_NODE_TYPES()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffAddItems();
- TModificationsValidator validator(index, diff, config);
-
- // Expect original items and new items with required scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE3_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_TYPE1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_TYPE3_LOG_1.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 16);
-
- // Added items have tmp ids but also have order equal to old ids.
- THashSet<ui64> orders;
- orders.insert(ITEM_DOMAIN_LOG_4.GetId().GetId());
- orders.insert(ITEM_TENANT1_LOG_2.GetId().GetId());
- orders.insert(ITEM_TYPE1_LOG_2.GetId().GetId());
- orders.insert(ITEM_TENANT1_TYPE1_LOG_2.GetId().GetId());
- for (auto &item : validator.ModifiedItems) {
+ orders.erase(item->UsageScope.Order);
+ }
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 2);
+ }
+
+ void TestIndexAndModificationsShrink_AddItems_TENANTS_AND_NODE_TYPES()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffAddItems();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect original items and new items with required scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_TYPE1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_TYPE3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 16);
+
+ // Added items have tmp ids but also have order equal to old ids.
+ THashSet<ui64> orders;
+ orders.insert(ITEM_DOMAIN_LOG_4.GetId().GetId());
+ orders.insert(ITEM_TENANT1_LOG_2.GetId().GetId());
+ orders.insert(ITEM_TYPE1_LOG_2.GetId().GetId());
+ orders.insert(ITEM_TENANT1_TYPE1_LOG_2.GetId().GetId());
+ for (auto &item : validator.ModifiedItems) {
UNIT_ASSERT(orders.contains(item->UsageScope.Order));
- orders.erase(item->UsageScope.Order);
- }
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 4);
- }
-
- void TestIndexAndModificationsShrink_RemoveItems_NONE()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffRemoveItems();
- TModificationsValidator validator(index, diff, config);
-
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 0);
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 0);
- }
-
- void TestIndexAndModificationsShrink_RemoveItems_DOMAIN()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffRemoveItems();
- TModificationsValidator validator(index, diff, config);
-
- // Expect original items except removed with required scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 2);
-
- // Expect all removed items with required scope.
+ orders.erase(item->UsageScope.Order);
+ }
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 4);
+ }
+
+ void TestIndexAndModificationsShrink_RemoveItems_NONE()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffRemoveItems();
+ TModificationsValidator validator(index, diff, config);
+
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 0);
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 0);
+ }
+
+ void TestIndexAndModificationsShrink_RemoveItems_DOMAIN()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffRemoveItems();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect original items except removed with required scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 2);
+
+ // Expect all removed items with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 1);
- }
-
- void TestIndexAndModificationsShrink_RemoveItems_TENANTS()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffRemoveItems();
- TModificationsValidator validator(index, diff, config);
-
- // Expect original items except removed with required scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 4);
-
- // Expect all removed items with required scope.
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 1);
+ }
+
+ void TestIndexAndModificationsShrink_RemoveItems_TENANTS()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffRemoveItems();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect original items except removed with required scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 4);
+
+ // Expect all removed items with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 2);
- }
-
- void TestIndexAndModificationsShrink_RemoveItems_TENANTS_AND_NODE_TYPES()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffRemoveItems();
- TModificationsValidator validator(index, diff, config);
-
- // Expect original items except removed with required scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE3_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_TYPE3_LOG_1.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 8);
-
- // Expect all removed items with required scope.
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 2);
+ }
+
+ void TestIndexAndModificationsShrink_RemoveItems_TENANTS_AND_NODE_TYPES()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffRemoveItems();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect original items except removed with required scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_TYPE3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 8);
+
+ // Expect all removed items with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TYPE1_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TENANT1_TYPE1_LOG_1.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 4);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsSameScope_NONE()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsSameScope();
- TModificationsValidator validator(index, diff, config);
-
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 0);
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 0);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsSameScope_DOMAIN()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsSameScope();
- TModificationsValidator validator(index, diff, config);
-
- // Expect all original items with required scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 3);
-
- // Expect all modified items (both original and resulting ones) with required scope.
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 4);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsSameScope_NONE()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsSameScope();
+ TModificationsValidator validator(index, diff, config);
+
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 0);
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 0);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsSameScope_DOMAIN()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsSameScope();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect all original items with required scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 3);
+
+ // Expect all modified items (both original and resulting ones) with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 2);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsSameScope_TENANTS()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsSameScope();
- TModificationsValidator validator(index, diff, config);
-
- // Expect all original items with required scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 6);
-
- // Expect all modified items (both original and resulting ones) with required scope.
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 2);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsSameScope_TENANTS()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsSameScope();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect all original items with required scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 6);
+
+ // Expect all modified items (both original and resulting ones) with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 4);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsSameScope_TENANTS_AND_NODE_TYPES()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsSameScope();
- TModificationsValidator validator(index, diff, config);
-
- // Expect all original items with required scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE3_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_TYPE1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_TYPE3_LOG_1.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 12);
-
- // Expect all modified items (both original and resulting ones) with required scope.
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 4);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsSameScope_TENANTS_AND_NODE_TYPES()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsSameScope();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect all original items with required scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_TYPE1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_TYPE3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 12);
+
+ // Expect all modified items (both original and resulting ones) with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId())));
@@ -783,70 +783,70 @@ public:
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 8);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsExpandScope_NONE()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsExpandScope();
- TModificationsValidator validator(index, diff, config);
-
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 0);
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 0);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsExpandScope_DOMAIN()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsExpandScope();
- TModificationsValidator validator(index, diff, config);
-
- // Expect all original items with required scope and modified items with
- // matching resulting scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_NODE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 6);
-
- // Expect all modified items (both original and resulting ones) with required scope.
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 8);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsExpandScope_NONE()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsExpandScope();
+ TModificationsValidator validator(index, diff, config);
+
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 0);
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 0);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsExpandScope_DOMAIN()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsExpandScope();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect all original items with required scope and modified items with
+ // matching resulting scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_NODE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 6);
+
+ // Expect all modified items (both original and resulting ones) with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_NODE2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 5);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsExpandScope_TENANTS()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsExpandScope();
- TModificationsValidator validator(index, diff, config);
-
- // Expect all original items with required scope and modified items with
- // matching resulting scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_NODE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 9);
-
- // Expect all modified items (both original and resulting ones) with required scope.
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 5);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsExpandScope_TENANTS()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsExpandScope();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect all original items with required scope and modified items with
+ // matching resulting scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_NODE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 9);
+
+ // Expect all modified items (both original and resulting ones) with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
@@ -854,36 +854,36 @@ public:
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 7);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsExpandScope_TENANTS_AND_NODE_TYPES()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsExpandScope();
- TModificationsValidator validator(index, diff, config);
-
- // Expect all original items with required scope and modified items with
- // matching resulting scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_NODE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_HOST2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE3_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_TYPE1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_TYPE3_LOG_1.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 14);
-
- // Expect all modified items (both original and resulting ones) with required scope.
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 7);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsExpandScope_TENANTS_AND_NODE_TYPES()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsExpandScope();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect all original items with required scope and modified items with
+ // matching resulting scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_NODE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_HOST2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_TYPE1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_TYPE3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 14);
+
+ // Expect all modified items (both original and resulting ones) with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId())));
@@ -894,749 +894,749 @@ public:
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 10);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsNarrowScope_NONE()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsNarrowScope();
- TModificationsValidator validator(index, diff, config);
-
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 0);
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 0);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsNarrowScope_DOMAIN()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsNarrowScope();
- TModificationsValidator validator(index, diff, config);
-
- // Expect all original items with required scope and modified items with
- // matching resulting scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 2);
-
- // Expect all modified items (both original and resulting ones) with required scope.
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 10);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsNarrowScope_NONE()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_NONE);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsNarrowScope();
+ TModificationsValidator validator(index, diff, config);
+
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 0);
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 0);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsNarrowScope_DOMAIN()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsNarrowScope();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect all original items with required scope and modified items with
+ // matching resulting scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 2);
+
+ // Expect all modified items (both original and resulting ones) with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 1);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsNarrowScope_TENANTS()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsNarrowScope();
- TModificationsValidator validator(index, diff, config);
-
- // Expect all original items with required scope and modified items with
- // matching resulting scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 5);
-
- // Expect all modified items (both original and resulting ones) with required scope.
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 1);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsNarrowScope_TENANTS()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsNarrowScope();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect all original items with required scope and modified items with
+ // matching resulting scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 5);
+
+ // Expect all modified items (both original and resulting ones) with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 3);
- }
-
- void TestIndexAndModificationsShrink_ModifyItemsNarrowScope_TENANTS_AND_NODE_TYPES()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffModifyItemsNarrowScope();
- TModificationsValidator validator(index, diff, config);
-
- // Expect all original items with required scope and modified items with
- // matching resulting scope.
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE3_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_TYPE1_LOG_1.GetId().GetId()));
- UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_TYPE3_LOG_1.GetId().GetId()));
- UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 10);
-
- // Expect all modified items (both original and resulting ones) with required scope.
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 3);
+ }
+
+ void TestIndexAndModificationsShrink_ModifyItemsNarrowScope_TENANTS_AND_NODE_TYPES()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffModifyItemsNarrowScope();
+ TModificationsValidator validator(index, diff, config);
+
+ // Expect all original items with required scope and modified items with
+ // matching resulting scope.
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_DOMAIN_LOG_3.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TYPE3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT1_TYPE1_LOG_1.GetId().GetId()));
+ UNIT_ASSERT(validator.Index.GetItem(ITEM_TENANT3_TYPE3_LOG_1.GetId().GetId()));
+ UNIT_ASSERT_VALUES_EQUAL(validator.Index.GetConfigItems().size(), 10);
+
+ // Expect all modified items (both original and resulting ones) with required scope.
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TENANT2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(index.GetItem(ITEM_TENANT2_TYPE2_LOG_1.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_DOMAIN_LOG_2.GetId().GetId())));
UNIT_ASSERT(validator.ModifiedItems.contains(validator.Index.GetItem(ITEM_TYPE2_LOG_1.GetId().GetId())));
- UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 6);
- }
-
- void TestComputeAffectedConfigs_DomainAffected_DOMAIN()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffForRequiredChecks(true);
- TModificationsValidator validator(index, diff, config);
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
- }
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
- }
-
- {
- TDynBitMap kinds;
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
- }
- }
-
- void TestComputeAffectedConfigs_DomainAffected_TENANTS()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffForRequiredChecks(true);
- TModificationsValidator validator(index, diff, config);
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 2);
- }
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 2);
- }
-
- {
- TDynBitMap kinds;
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 3);
- }
- }
-
- void TestComputeAffectedConfigs_DomainAffected_TENANTS_AND_NODE_TYPES()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffForRequiredChecks(true);
- TModificationsValidator validator(index, diff, config);
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 5);
- }
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 4);
- }
-
- {
- TDynBitMap kinds;
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 9);
- }
- }
-
- void TestComputeAffectedConfigs_DomainUnaffected_TENANTS()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffForRequiredChecks(false);
- TModificationsValidator validator(index, diff, config);
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
- }
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
- }
-
- {
- TDynBitMap kinds;
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 2);
- }
- }
-
- void TestComputeAffectedConfigs_DomainUnaffected_TENANTS_AND_NODE_TYPES()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffForRequiredChecks(false);
- TModificationsValidator validator(index, diff, config);
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 4);
- }
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 3);
- }
-
- {
- TDynBitMap kinds;
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 8);
- }
- }
-
- void TestComputeAffectedConfigs_All_DomainAffected_DOMAIN()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffForAllAffected(true);
- TModificationsValidator validator(index, diff, config);
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
- }
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
- }
-
- {
- TDynBitMap kinds;
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
- }
- }
-
- void TestComputeAffectedConfigs_All_DomainAffected_TENANTS()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffForAllAffected(true);
- TModificationsValidator validator(index, diff, config);
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 4);
- }
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 2);
- }
-
- {
- TDynBitMap kinds;
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 4);
- }
- }
-
- void TestComputeAffectedConfigs_All_DomainAffected_TENANTS_AND_NODE_TYPES()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffForAllAffected(true);
- TModificationsValidator validator(index, diff, config);
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 16);
- }
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 4);
- }
-
- {
- TDynBitMap kinds;
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 16);
- }
- }
-
- void TestComputeAffectedConfigs_All_DomainUnaffected_TENANTS()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffForAllAffected(false);
- TModificationsValidator validator(index, diff, config);
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 2);
- }
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
- }
-
- {
- TDynBitMap kinds;
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 3);
- }
- }
-
- void TestComputeAffectedConfigs_All_DomainUnaffected_TENANTS_AND_NODE_TYPES()
- {
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
- TConfigIndex index = MakeDefaultIndex();
- TConfigModifications diff = MakeDiffForAllAffected(false);
- TModificationsValidator validator(index, diff, config);
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type2"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 13);
- }
-
- {
- TDynBitMap kinds;
- kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 3);
- }
-
- {
- TDynBitMap kinds;
- auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type2"))));
- UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
- UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 15);
- }
- }
-
- void TestApplyValidators_TENANTS()
- {
- TValidatorsRegistry::DropInstance();
- RegisterValidator(new TTestValidator(3));
- auto registry = TValidatorsRegistry::Instance();
- registry->LockValidators();
-
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TConfigIndex index = MakeSmallIndex();
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(validator.ApplyValidators());
- UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 1);
- }
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(validator.ApplyValidators());
- UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 3);
- }
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(!validator.ApplyValidators());
- UNIT_ASSERT(validator.GetErrorMessage());
- }
- }
-
- void TestApplyValidators_TENANTS_AND_NODE_TYPES()
- {
- TValidatorsRegistry::DropInstance();
- RegisterValidator(new TTestValidator(3));
- auto registry = TValidatorsRegistry::Instance();
- registry->LockValidators();
-
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
- TConfigIndex index = MakeSmallIndex();
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(validator.ApplyValidators());
- UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 2);
- }
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
- AddScopeModification(diff, ITEM_TENANT3_TYPE3_LOG_1, ITEM_TENANT1_TYPE1_LOG_1);
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(validator.ApplyValidators());
- UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 3);
- }
-
-
- {
- TConfigModifications diff;
- AddScopeModification(diff, ITEM_TENANT3_TYPE3_LOG_1, ITEM_TENANT1_TYPE2_LOG_1);
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(!validator.ApplyValidators());
- UNIT_ASSERT(validator.GetErrorMessage());
- }
-
-
- {
- TConfigModifications diff;
- AddScopeModification(diff, ITEM_TYPE2_LOG_1, ITEM_TYPE1_LOG_1);
- AddScopeModification(diff, ITEM_TENANT3_TYPE3_LOG_1, ITEM_TENANT1_TYPE1_LOG_1);
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(!validator.ApplyValidators());
- UNIT_ASSERT(validator.GetErrorMessage());
- }
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
- diff.AddedItems.push_back(new TConfigItem(ITEM_TYPE3_LOG_1));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(!validator.ApplyValidators());
- UNIT_ASSERT(validator.GetErrorMessage());
- }
- }
-
- void TestApplyValidatorsWithOldConfig()
- {
- TValidatorsRegistry::DropInstance();
- RegisterValidator(new TTestValidator(5, true));
- auto registry = TValidatorsRegistry::Instance();
- registry->LockValidators();
-
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
- TConfigIndex index = MakeSmallIndex();
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(validator.ApplyValidators());
- UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 1);
- }
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(!validator.ApplyValidators());
- UNIT_ASSERT(validator.GetErrorMessage());
- }
- }
-
- void TestChecksLimitError()
- {
- TValidatorsRegistry::DropInstance();
- RegisterValidator(new TTestValidator(10));
- auto registry = TValidatorsRegistry::Instance();
- registry->LockValidators();
-
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS, 2, true);
- TConfigIndex index = MakeSmallIndex();
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(validator.ApplyValidators());
- UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 1);
- }
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(validator.ApplyValidators());
- UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 2);
- }
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT2_LOG_1));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(!validator.ApplyValidators());
- UNIT_ASSERT(validator.GetErrorMessage());
- UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 2);
- }
- }
-
- void TestChecksLimitWarning()
- {
- TValidatorsRegistry::DropInstance();
- RegisterValidator(new TTestValidator(10));
- auto registry = TValidatorsRegistry::Instance();
- registry->LockValidators();
-
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS, 2, false);
- TConfigIndex index = MakeSmallIndex();
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(validator.ApplyValidators());
- UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 1);
- }
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(validator.ApplyValidators());
- UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 2);
- }
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT2_LOG_1));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(validator.ApplyValidators());
- UNIT_ASSERT_VALUES_EQUAL(validator.GetIssues().size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 2);
- }
- }
-
- void TestTreatWarningAsError()
- {
- TValidatorsRegistry::DropInstance();
- RegisterValidator(new TTestValidator(2, false, true));
- auto registry = TValidatorsRegistry::Instance();
- registry->LockValidators();
-
- InitializeTestConfigItems();
- auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS, 0, false);
- TConfigIndex index = MakeSmallIndex();
-
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(validator.ApplyValidators());
- }
-
- config.TreatWarningAsError = true;
- {
- TConfigModifications diff;
- diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
- TModificationsValidator validator(index, diff, config);
- UNIT_ASSERT(!validator.ApplyValidators());
- }
- }
-};
-
-UNIT_TEST_SUITE_REGISTRATION(TModificationsValidatorTests);
-
-} // namespace NConsole
-} // namespace NKikimr
+ UNIT_ASSERT_VALUES_EQUAL(validator.ModifiedItems.size(), 6);
+ }
+
+ void TestComputeAffectedConfigs_DomainAffected_DOMAIN()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffForRequiredChecks(true);
+ TModificationsValidator validator(index, diff, config);
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
+ }
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
+ }
+
+ {
+ TDynBitMap kinds;
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
+ }
+ }
+
+ void TestComputeAffectedConfigs_DomainAffected_TENANTS()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffForRequiredChecks(true);
+ TModificationsValidator validator(index, diff, config);
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 2);
+ }
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 2);
+ }
+
+ {
+ TDynBitMap kinds;
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 3);
+ }
+ }
+
+ void TestComputeAffectedConfigs_DomainAffected_TENANTS_AND_NODE_TYPES()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffForRequiredChecks(true);
+ TModificationsValidator validator(index, diff, config);
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 5);
+ }
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 4);
+ }
+
+ {
+ TDynBitMap kinds;
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 9);
+ }
+ }
+
+ void TestComputeAffectedConfigs_DomainUnaffected_TENANTS()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffForRequiredChecks(false);
+ TModificationsValidator validator(index, diff, config);
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
+ }
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
+ }
+
+ {
+ TDynBitMap kinds;
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 2);
+ }
+ }
+
+ void TestComputeAffectedConfigs_DomainUnaffected_TENANTS_AND_NODE_TYPES()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffForRequiredChecks(false);
+ TModificationsValidator validator(index, diff, config);
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 4);
+ }
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 3);
+ }
+
+ {
+ TDynBitMap kinds;
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, true);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 8);
+ }
+ }
+
+ void TestComputeAffectedConfigs_All_DomainAffected_DOMAIN()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_DOMAIN);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffForAllAffected(true);
+ TModificationsValidator validator(index, diff, config);
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
+ }
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
+ }
+
+ {
+ TDynBitMap kinds;
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
+ }
+ }
+
+ void TestComputeAffectedConfigs_All_DomainAffected_TENANTS()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffForAllAffected(true);
+ TModificationsValidator validator(index, diff, config);
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 4);
+ }
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 2);
+ }
+
+ {
+ TDynBitMap kinds;
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 4);
+ }
+ }
+
+ void TestComputeAffectedConfigs_All_DomainAffected_TENANTS_AND_NODE_TYPES()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffForAllAffected(true);
+ TModificationsValidator validator(index, diff, config);
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 16);
+ }
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 4);
+ }
+
+ {
+ TDynBitMap kinds;
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 16);
+ }
+ }
+
+ void TestComputeAffectedConfigs_All_DomainUnaffected_TENANTS()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffForAllAffected(false);
+ TModificationsValidator validator(index, diff, config);
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 2);
+ }
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 1);
+ }
+
+ {
+ TDynBitMap kinds;
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 3);
+ }
+ }
+
+ void TestComputeAffectedConfigs_All_DomainUnaffected_TENANTS_AND_NODE_TYPES()
+ {
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
+ TConfigIndex index = MakeDefaultIndex();
+ TConfigModifications diff = MakeDiffForAllAffected(false);
+ TModificationsValidator validator(index, diff, config);
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::LogConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type2"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 13);
+ }
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 3);
+ }
+
+ {
+ TDynBitMap kinds;
+ auto requiredChecks = validator.ComputeAffectedConfigs(kinds, false);
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant1"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant2"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString(""))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString("tenant3"), TString("type3"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type1"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type2"))));
+ UNIT_ASSERT(requiredChecks.contains(TTenantAndNodeType(TString(""), TString("type3"))));
+ UNIT_ASSERT_VALUES_EQUAL(requiredChecks.size(), 15);
+ }
+ }
+
+ void TestApplyValidators_TENANTS()
+ {
+ TValidatorsRegistry::DropInstance();
+ RegisterValidator(new TTestValidator(3));
+ auto registry = TValidatorsRegistry::Instance();
+ registry->LockValidators();
+
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TConfigIndex index = MakeSmallIndex();
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(validator.ApplyValidators());
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 1);
+ }
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(validator.ApplyValidators());
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 3);
+ }
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(!validator.ApplyValidators());
+ UNIT_ASSERT(validator.GetErrorMessage());
+ }
+ }
+
+ void TestApplyValidators_TENANTS_AND_NODE_TYPES()
+ {
+ TValidatorsRegistry::DropInstance();
+ RegisterValidator(new TTestValidator(3));
+ auto registry = TValidatorsRegistry::Instance();
+ registry->LockValidators();
+
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS_AND_NODE_TYPES);
+ TConfigIndex index = MakeSmallIndex();
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(validator.ApplyValidators());
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 2);
+ }
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
+ AddScopeModification(diff, ITEM_TENANT3_TYPE3_LOG_1, ITEM_TENANT1_TYPE1_LOG_1);
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(validator.ApplyValidators());
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 3);
+ }
+
+
+ {
+ TConfigModifications diff;
+ AddScopeModification(diff, ITEM_TENANT3_TYPE3_LOG_1, ITEM_TENANT1_TYPE2_LOG_1);
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(!validator.ApplyValidators());
+ UNIT_ASSERT(validator.GetErrorMessage());
+ }
+
+
+ {
+ TConfigModifications diff;
+ AddScopeModification(diff, ITEM_TYPE2_LOG_1, ITEM_TYPE1_LOG_1);
+ AddScopeModification(diff, ITEM_TENANT3_TYPE3_LOG_1, ITEM_TENANT1_TYPE1_LOG_1);
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(!validator.ApplyValidators());
+ UNIT_ASSERT(validator.GetErrorMessage());
+ }
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TYPE3_LOG_1));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(!validator.ApplyValidators());
+ UNIT_ASSERT(validator.GetErrorMessage());
+ }
+ }
+
+ void TestApplyValidatorsWithOldConfig()
+ {
+ TValidatorsRegistry::DropInstance();
+ RegisterValidator(new TTestValidator(5, true));
+ auto registry = TValidatorsRegistry::Instance();
+ registry->LockValidators();
+
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS);
+ TConfigIndex index = MakeSmallIndex();
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(validator.ApplyValidators());
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 1);
+ }
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(!validator.ApplyValidators());
+ UNIT_ASSERT(validator.GetErrorMessage());
+ }
+ }
+
+ void TestChecksLimitError()
+ {
+ TValidatorsRegistry::DropInstance();
+ RegisterValidator(new TTestValidator(10));
+ auto registry = TValidatorsRegistry::Instance();
+ registry->LockValidators();
+
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS, 2, true);
+ TConfigIndex index = MakeSmallIndex();
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(validator.ApplyValidators());
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 1);
+ }
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(validator.ApplyValidators());
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 2);
+ }
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT2_LOG_1));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(!validator.ApplyValidators());
+ UNIT_ASSERT(validator.GetErrorMessage());
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 2);
+ }
+ }
+
+ void TestChecksLimitWarning()
+ {
+ TValidatorsRegistry::DropInstance();
+ RegisterValidator(new TTestValidator(10));
+ auto registry = TValidatorsRegistry::Instance();
+ registry->LockValidators();
+
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS, 2, false);
+ TConfigIndex index = MakeSmallIndex();
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT3_LOG_1));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(validator.ApplyValidators());
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 1);
+ }
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(validator.ApplyValidators());
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 2);
+ }
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_DOMAIN_LOG_2));
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT2_LOG_1));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(validator.ApplyValidators());
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetIssues().size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(validator.GetChecksDone(), 2);
+ }
+ }
+
+ void TestTreatWarningAsError()
+ {
+ TValidatorsRegistry::DropInstance();
+ RegisterValidator(new TTestValidator(2, false, true));
+ auto registry = TValidatorsRegistry::Instance();
+ registry->LockValidators();
+
+ InitializeTestConfigItems();
+ auto config = MakeConfigsConfig(NKikimrConsole::VALIDATE_TENANTS, 0, false);
+ TConfigIndex index = MakeSmallIndex();
+
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(validator.ApplyValidators());
+ }
+
+ config.TreatWarningAsError = true;
+ {
+ TConfigModifications diff;
+ diff.AddedItems.push_back(new TConfigItem(ITEM_TENANT1_LOG_2));
+ TModificationsValidator validator(index, diff, config);
+ UNIT_ASSERT(!validator.ApplyValidators());
+ }
+ }
+};
+
+UNIT_TEST_SUITE_REGISTRATION(TModificationsValidatorTests);
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/tx_processor.cpp b/ydb/core/cms/console/tx_processor.cpp
index 567fe24b224..9ba7e9ad4cb 100644
--- a/ydb/core/cms/console/tx_processor.cpp
+++ b/ydb/core/cms/console/tx_processor.cpp
@@ -1,253 +1,253 @@
-#include "tx_processor.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-TTxProcessor::TTxProcessor(ITxExecutor &executor,
- const TString &name,
- ui32 service,
- TTxProcessor::TPtr parent,
- bool temporary)
- : Executor(executor)
- , Name(name)
- , Service(service)
- , State(EState::LOCKED_BY_PARENT)
- , Temporary(temporary)
- , ActiveTx(nullptr)
- , Parent(parent.Get())
-{
- Y_VERIFY(!Temporary || Parent);
- if (!Parent || Parent->State == EState::LOCKED_BY_CHILDREN)
- State = EState::ACTIVE;
+#include "tx_processor.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+TTxProcessor::TTxProcessor(ITxExecutor &executor,
+ const TString &name,
+ ui32 service,
+ TTxProcessor::TPtr parent,
+ bool temporary)
+ : Executor(executor)
+ , Name(name)
+ , Service(service)
+ , State(EState::LOCKED_BY_PARENT)
+ , Temporary(temporary)
+ , ActiveTx(nullptr)
+ , Parent(parent.Get())
+{
+ Y_VERIFY(!Temporary || Parent);
+ if (!Parent || Parent->State == EState::LOCKED_BY_CHILDREN)
+ State = EState::ACTIVE;
LogPrefix = Sprintf("TTxProcessor(%s) ", Name.data());
-}
-
-TTxProcessor::TPtr TTxProcessor::GetSubProcessor(const TString &name,
- const TActorContext &ctx,
- bool temporary,
- ui32 service)
-{
- auto it = SubProcessors.find(name);
- if (it != SubProcessors.end())
- return it->second;
-
- LOG_TRACE_S(ctx, Service, LogPrefix << "creating sub-processor " << name);
-
- TTxProcessor::TPtr subProcessor = new TTxProcessor(Executor,
- name,
- service ? service : Service,
- this,
- temporary);
- SubProcessors.emplace(name, subProcessor);
-
- if (!ActiveTx && State == EState::ACTIVE)
- ActivateChildren(ctx);
-
- return subProcessor;
-}
-
-void TTxProcessor::ProcessTx(ITransaction *tx,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, Service, LogPrefix << "enqueue tx");
-
+}
+
+TTxProcessor::TPtr TTxProcessor::GetSubProcessor(const TString &name,
+ const TActorContext &ctx,
+ bool temporary,
+ ui32 service)
+{
+ auto it = SubProcessors.find(name);
+ if (it != SubProcessors.end())
+ return it->second;
+
+ LOG_TRACE_S(ctx, Service, LogPrefix << "creating sub-processor " << name);
+
+ TTxProcessor::TPtr subProcessor = new TTxProcessor(Executor,
+ name,
+ service ? service : Service,
+ this,
+ temporary);
+ SubProcessors.emplace(name, subProcessor);
+
+ if (!ActiveTx && State == EState::ACTIVE)
+ ActivateChildren(ctx);
+
+ return subProcessor;
+}
+
+void TTxProcessor::ProcessTx(ITransaction *tx,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, Service, LogPrefix << "enqueue tx");
+
TxQueue.push_back(THolder<ITransaction>(tx));
- ProcessNextTx(ctx);
-}
-
-void TTxProcessor::TxCompleted(ITransaction *tx,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, Service, LogPrefix << "completed tx");
-
- Y_VERIFY(tx == ActiveTx);
- ActiveTx = nullptr;
-
- if (CheckTemporary(ctx))
- return;
-
- if (State == EState::LOCKING)
- CheckLocks(ctx);
- else {
- Y_VERIFY(State == EState::ACTIVE);
- ProcessNextTx(ctx);
- }
-}
-
-void TTxProcessor::RemoveSubProcessor(TTxProcessor::TPtr sub,
- const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, Service, LogPrefix << "removing sub-processor " << sub->Name);
-
+ ProcessNextTx(ctx);
+}
+
+void TTxProcessor::TxCompleted(ITransaction *tx,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, Service, LogPrefix << "completed tx");
+
+ Y_VERIFY(tx == ActiveTx);
+ ActiveTx = nullptr;
+
+ if (CheckTemporary(ctx))
+ return;
+
+ if (State == EState::LOCKING)
+ CheckLocks(ctx);
+ else {
+ Y_VERIFY(State == EState::ACTIVE);
+ ProcessNextTx(ctx);
+ }
+}
+
+void TTxProcessor::RemoveSubProcessor(TTxProcessor::TPtr sub,
+ const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, Service, LogPrefix << "removing sub-processor " << sub->Name);
+
Y_VERIFY(SubProcessors.contains(sub->Name));
- SubProcessors.erase(sub->Name);
-
- if (CheckTemporary(ctx))
- return;
-
- if (SubProcessors.empty() && State == EState::LOCKED_BY_CHILDREN)
- Activate(ctx);
- else
- CheckActivation(ctx);
- CheckLocks(ctx);
-}
-
-void TTxProcessor::Clear()
-{
- SubProcessors.clear();
- TxQueue.clear();
-}
-
-void TTxProcessor::Activate(const TActorContext &ctx)
-{
- LOG_TRACE_S(ctx, Service, LogPrefix << "is now active");
-
- State = EState::ACTIVE;
- ProcessNextTx(ctx);
-}
-
-void TTxProcessor::ActivateChildren(const TActorContext &ctx)
-{
- Y_VERIFY(State == EState::ACTIVE);
- if (SubProcessors.empty())
- return;
-
- LOG_TRACE_S(ctx, Service, LogPrefix << "is now locked by children");
-
- State = EState::LOCKED_BY_CHILDREN;
- for (auto it = SubProcessors.begin(); it != SubProcessors.end(); ) {
- auto cur = it++;
- cur->second->Start(ctx);
- }
-}
-
-bool TTxProcessor::Lock(const TActorContext &ctx)
-{
- if (State == EState::LOCKING)
- return false;
-
- if (State == EState::LOCKED_BY_PARENT)
- return true;
-
- LOG_TRACE_S(ctx, Service, LogPrefix << "is now locking");
-
- State = EState::LOCKING;
-
- if (ActiveTx)
- return false;
-
- bool res = true;
- for (auto &pr : SubProcessors)
- res = res && pr.second->Lock(ctx);
-
- if (res) {
- LOG_TRACE_S(ctx, Service, LogPrefix << "is now locked by parent");
-
- State = EState::LOCKED_BY_PARENT;
- return true;
- }
-
- return false;
-}
-
-void TTxProcessor::TryToLockChildren(const TActorContext &ctx)
-{
- Y_VERIFY(State == EState::LOCKED_BY_CHILDREN);
- LOG_TRACE_S(ctx, Service, LogPrefix << "trying to lock children");
-
- bool res = true;
- for (auto &pr : SubProcessors)
- if (!pr.second->Lock(ctx))
- res = false;
- if (res)
- Activate(ctx);
-}
-
-void TTxProcessor::Start(const TActorContext &ctx)
-{
- if (State == EState::LOCKED_BY_PARENT)
- Activate(ctx);
- else {
- Y_VERIFY(State == EState::LOCKED_BY_CHILDREN);
- CheckActivation(ctx);
- }
-}
-
-void TTxProcessor::CheckActivation(const TActorContext &ctx)
-{
- if (TxQueue.empty())
- return;
-
- if (State != EState::LOCKED_BY_CHILDREN)
- return;
-
- for (auto &pr : SubProcessors)
- if (pr.second->State != EState::LOCKED_BY_PARENT)
- return;
-
- Activate(ctx);
-}
-
-void TTxProcessor::CheckLocks(const TActorContext &ctx)
-{
- if (State != EState::LOCKING)
- return;
-
- if (ActiveTx)
- return;
-
- for (auto &pr : SubProcessors)
- if (pr.second->State != EState::LOCKED_BY_PARENT)
- return;
-
- LOG_TRACE_S(ctx, Service, LogPrefix << "is now locked by parent");
-
- State = EState::LOCKED_BY_PARENT;
- if (Parent)
- Parent->Start(ctx);
-}
-
-bool TTxProcessor::CheckTemporary(const TActorContext &ctx)
-{
- if (!Temporary)
- return false;
-
- if (ActiveTx || !TxQueue.empty() || !SubProcessors.empty())
- return false;
-
- LOG_TRACE_S(ctx, Service, LogPrefix << "unlink from parent");
-
- Parent->RemoveSubProcessor(this, ctx);
- return true;
-}
-
-void TTxProcessor::ProcessNextTx(const TActorContext &ctx)
-{
- if (ActiveTx)
- return;
-
- if (State == EState::LOCKED_BY_CHILDREN) {
- // In case of success it will process next tx by its own.
- TryToLockChildren(ctx);
- return;
- }
-
- if (State != EState::ACTIVE)
- return;
-
- if (State == EState::ACTIVE && TxQueue.empty()) {
- ActivateChildren(ctx);
- return;
- }
-
- ActiveTx = TxQueue.front().Release();
- TxQueue.pop_front();
-
- LOG_TRACE_S(ctx, Service, LogPrefix << "starts new tx");
-
- Y_VERIFY(ActiveTx);
- Executor.Execute(ActiveTx, ctx);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ SubProcessors.erase(sub->Name);
+
+ if (CheckTemporary(ctx))
+ return;
+
+ if (SubProcessors.empty() && State == EState::LOCKED_BY_CHILDREN)
+ Activate(ctx);
+ else
+ CheckActivation(ctx);
+ CheckLocks(ctx);
+}
+
+void TTxProcessor::Clear()
+{
+ SubProcessors.clear();
+ TxQueue.clear();
+}
+
+void TTxProcessor::Activate(const TActorContext &ctx)
+{
+ LOG_TRACE_S(ctx, Service, LogPrefix << "is now active");
+
+ State = EState::ACTIVE;
+ ProcessNextTx(ctx);
+}
+
+void TTxProcessor::ActivateChildren(const TActorContext &ctx)
+{
+ Y_VERIFY(State == EState::ACTIVE);
+ if (SubProcessors.empty())
+ return;
+
+ LOG_TRACE_S(ctx, Service, LogPrefix << "is now locked by children");
+
+ State = EState::LOCKED_BY_CHILDREN;
+ for (auto it = SubProcessors.begin(); it != SubProcessors.end(); ) {
+ auto cur = it++;
+ cur->second->Start(ctx);
+ }
+}
+
+bool TTxProcessor::Lock(const TActorContext &ctx)
+{
+ if (State == EState::LOCKING)
+ return false;
+
+ if (State == EState::LOCKED_BY_PARENT)
+ return true;
+
+ LOG_TRACE_S(ctx, Service, LogPrefix << "is now locking");
+
+ State = EState::LOCKING;
+
+ if (ActiveTx)
+ return false;
+
+ bool res = true;
+ for (auto &pr : SubProcessors)
+ res = res && pr.second->Lock(ctx);
+
+ if (res) {
+ LOG_TRACE_S(ctx, Service, LogPrefix << "is now locked by parent");
+
+ State = EState::LOCKED_BY_PARENT;
+ return true;
+ }
+
+ return false;
+}
+
+void TTxProcessor::TryToLockChildren(const TActorContext &ctx)
+{
+ Y_VERIFY(State == EState::LOCKED_BY_CHILDREN);
+ LOG_TRACE_S(ctx, Service, LogPrefix << "trying to lock children");
+
+ bool res = true;
+ for (auto &pr : SubProcessors)
+ if (!pr.second->Lock(ctx))
+ res = false;
+ if (res)
+ Activate(ctx);
+}
+
+void TTxProcessor::Start(const TActorContext &ctx)
+{
+ if (State == EState::LOCKED_BY_PARENT)
+ Activate(ctx);
+ else {
+ Y_VERIFY(State == EState::LOCKED_BY_CHILDREN);
+ CheckActivation(ctx);
+ }
+}
+
+void TTxProcessor::CheckActivation(const TActorContext &ctx)
+{
+ if (TxQueue.empty())
+ return;
+
+ if (State != EState::LOCKED_BY_CHILDREN)
+ return;
+
+ for (auto &pr : SubProcessors)
+ if (pr.second->State != EState::LOCKED_BY_PARENT)
+ return;
+
+ Activate(ctx);
+}
+
+void TTxProcessor::CheckLocks(const TActorContext &ctx)
+{
+ if (State != EState::LOCKING)
+ return;
+
+ if (ActiveTx)
+ return;
+
+ for (auto &pr : SubProcessors)
+ if (pr.second->State != EState::LOCKED_BY_PARENT)
+ return;
+
+ LOG_TRACE_S(ctx, Service, LogPrefix << "is now locked by parent");
+
+ State = EState::LOCKED_BY_PARENT;
+ if (Parent)
+ Parent->Start(ctx);
+}
+
+bool TTxProcessor::CheckTemporary(const TActorContext &ctx)
+{
+ if (!Temporary)
+ return false;
+
+ if (ActiveTx || !TxQueue.empty() || !SubProcessors.empty())
+ return false;
+
+ LOG_TRACE_S(ctx, Service, LogPrefix << "unlink from parent");
+
+ Parent->RemoveSubProcessor(this, ctx);
+ return true;
+}
+
+void TTxProcessor::ProcessNextTx(const TActorContext &ctx)
+{
+ if (ActiveTx)
+ return;
+
+ if (State == EState::LOCKED_BY_CHILDREN) {
+ // In case of success it will process next tx by its own.
+ TryToLockChildren(ctx);
+ return;
+ }
+
+ if (State != EState::ACTIVE)
+ return;
+
+ if (State == EState::ACTIVE && TxQueue.empty()) {
+ ActivateChildren(ctx);
+ return;
+ }
+
+ ActiveTx = TxQueue.front().Release();
+ TxQueue.pop_front();
+
+ LOG_TRACE_S(ctx, Service, LogPrefix << "starts new tx");
+
+ Y_VERIFY(ActiveTx);
+ Executor.Execute(ActiveTx, ctx);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/tx_processor.h b/ydb/core/cms/console/tx_processor.h
index b922effebf1..c179b032145 100644
--- a/ydb/core/cms/console/tx_processor.h
+++ b/ydb/core/cms/console/tx_processor.h
@@ -1,170 +1,170 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
-
-#include <util/generic/hash.h>
-#include <util/generic/ptr.h>
-#include <util/generic/string.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-using NTabletFlatExecutor::ITransaction;
-
-class ITxExecutor {
-public:
- virtual void Execute(ITransaction *transaction, const TActorContext &ctx) = 0;
-};
-
-/**
- * Class to organize ordered transactions execution. Single
- * processor executes transactions in a strict order only one
- * at a time.
- *
- * Multiple processors may be linked into a tree. Each tree
- * node can start new transaction in case there is no parent
- * running tx or having tx in its queue and no child running
- * tx. Thus tree root executes global transactions which have
- * exclusive state ownership and never intersect with other
- * transactions. Leaf nodes refer to more local transactions
- * (e.g. transaction for some tenant) which may go in parallel.
- *
- * New processor may be created by simply calling
- * GetSubProcessor method. If processor is not going to have
- * more sub-processors and is likely to have no more transactions
- * in the nearest future then it is reasonable to mark it as
- * a temporary processor. Temporary processor is automatically
- * unlinked from parent processor once it has no transactions
- * to run and no live sub-processors.
- *
- * Console tablet uses following processors organization:
- * 'console' - root permanent processor used for state
- * | load, tablet config updates
- * |-'configs' - permanent processor used for all config
- * | updates
- * |-'tenants' - permanent processor used for all tenant
- * transactions
- */
-class TTxProcessor : public TThrRefBase {
-private:
- enum class EState {
- // Can run transactions
- ACTIVE,
- // Going to be locked by parent but has running tx
- // or a sub-processor with running tx.
- LOCKING,
- // Cannot run transactions because parent is running
- // (or going to run) some tx.
- LOCKED_BY_PARENT,
- // Has nothing to do and passed control to
- // sub-processors.
- LOCKED_BY_CHILDREN,
- };
-
-public:
- using TPtr = TIntrusivePtr<TTxProcessor>;
-
- TTxProcessor(ITxExecutor &executor,
- const TString &name,
- ui32 service,
- TTxProcessor::TPtr parent = nullptr,
- bool temporary = false);
-
- /**
- * Get existing or create a new sub-processor. Created
- * sub-processot becomes active if processor is locked
- * by children or is active and has no tx to run.
- */
- TTxProcessor::TPtr GetSubProcessor(const TString &name,
- const TActorContext &ctx,
- bool temporary = true,
- ui32 service = 0);
- /**
- * Enqueue next tx for execution. If processor is active
- * and runs no tx then start new transaction.
- */
- void ProcessTx(ITransaction *tx,
- const TActorContext &ctx);
- /**
- * This method should be called by all transactions started
- * by this processor upon completion.
- */
- void TxCompleted(ITransaction *tx,
- const TActorContext &ctx);
-
- /**
- * Clear processor of all sub-processors and transactions.
- */
- void Clear();
-
-private:
- void RemoveSubProcessor(TTxProcessor::TPtr sub,
- const TActorContext &ctx);
-
- /**
- * Switch into ACTIVE state and start next tx if any
- * is in queue.
- */
- void Activate(const TActorContext &ctx);
- /**
- * If there are sub-processors then switch into
- * LOCKED_BY_CHILDREN state and activate them.
- */
- void ActivateChildren(const TActorContext &ctx);
- /**
- * Stop tx execution. Called by parent to get rid of children
- * Lock. Return true if stopped and false otherwise.
- * If false is returned then call parent's Start method after
- * tx execution is stopped.
- */
- bool Lock(const TActorContext &ctx);
- /**
- * This method is called when processor is locked by children
- * but got something to run. Tries to lock children and become
- * active.
- */
- void TryToLockChildren(const TActorContext &ctx);
- /**
- * Try to continue tx execution. If processor is locked
- * by parent then it means parent unlocks it. If processor
- * is locked by children then it means some of children
- * became locked.
- */
- void Start(const TActorContext &ctx);
-
- /**
- * Check if we need to become active and all children are now locked.
- */
- void CheckActivation(const TActorContext &ctx);
- /**
- * Check if we need to be locked by parent and now may be locked.
- * If required and possible then change state and notify parent
- * via Start method call.
- */
- void CheckLocks(const TActorContext &ctx);
- /**
- * Check if this processor is temporary and it's time to unlink
- * (and die). Return true if unlinked from parent.
- */
- bool CheckTemporary(const TActorContext &ctx);
- /**
- * Process next tx from the queue if possible. If we are not
- * locked and there is nothing to
- */
- void ProcessNextTx(const TActorContext &ctx);
-
- ITxExecutor &Executor;
- TString Name;
- ui32 Service;
- EState State;
- bool Temporary;
- ITransaction *ActiveTx;
- TDeque<THolder<ITransaction>> TxQueue;
- TTxProcessor *Parent;
- TMap<TString, TTxProcessor::TPtr> SubProcessors;
- TString LogPrefix;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
+
+#include <util/generic/hash.h>
+#include <util/generic/ptr.h>
+#include <util/generic/string.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+using NTabletFlatExecutor::ITransaction;
+
+class ITxExecutor {
+public:
+ virtual void Execute(ITransaction *transaction, const TActorContext &ctx) = 0;
+};
+
+/**
+ * Class to organize ordered transactions execution. Single
+ * processor executes transactions in a strict order only one
+ * at a time.
+ *
+ * Multiple processors may be linked into a tree. Each tree
+ * node can start new transaction in case there is no parent
+ * running tx or having tx in its queue and no child running
+ * tx. Thus tree root executes global transactions which have
+ * exclusive state ownership and never intersect with other
+ * transactions. Leaf nodes refer to more local transactions
+ * (e.g. transaction for some tenant) which may go in parallel.
+ *
+ * New processor may be created by simply calling
+ * GetSubProcessor method. If processor is not going to have
+ * more sub-processors and is likely to have no more transactions
+ * in the nearest future then it is reasonable to mark it as
+ * a temporary processor. Temporary processor is automatically
+ * unlinked from parent processor once it has no transactions
+ * to run and no live sub-processors.
+ *
+ * Console tablet uses following processors organization:
+ * 'console' - root permanent processor used for state
+ * | load, tablet config updates
+ * |-'configs' - permanent processor used for all config
+ * | updates
+ * |-'tenants' - permanent processor used for all tenant
+ * transactions
+ */
+class TTxProcessor : public TThrRefBase {
+private:
+ enum class EState {
+ // Can run transactions
+ ACTIVE,
+ // Going to be locked by parent but has running tx
+ // or a sub-processor with running tx.
+ LOCKING,
+ // Cannot run transactions because parent is running
+ // (or going to run) some tx.
+ LOCKED_BY_PARENT,
+ // Has nothing to do and passed control to
+ // sub-processors.
+ LOCKED_BY_CHILDREN,
+ };
+
+public:
+ using TPtr = TIntrusivePtr<TTxProcessor>;
+
+ TTxProcessor(ITxExecutor &executor,
+ const TString &name,
+ ui32 service,
+ TTxProcessor::TPtr parent = nullptr,
+ bool temporary = false);
+
+ /**
+ * Get existing or create a new sub-processor. Created
+ * sub-processot becomes active if processor is locked
+ * by children or is active and has no tx to run.
+ */
+ TTxProcessor::TPtr GetSubProcessor(const TString &name,
+ const TActorContext &ctx,
+ bool temporary = true,
+ ui32 service = 0);
+ /**
+ * Enqueue next tx for execution. If processor is active
+ * and runs no tx then start new transaction.
+ */
+ void ProcessTx(ITransaction *tx,
+ const TActorContext &ctx);
+ /**
+ * This method should be called by all transactions started
+ * by this processor upon completion.
+ */
+ void TxCompleted(ITransaction *tx,
+ const TActorContext &ctx);
+
+ /**
+ * Clear processor of all sub-processors and transactions.
+ */
+ void Clear();
+
+private:
+ void RemoveSubProcessor(TTxProcessor::TPtr sub,
+ const TActorContext &ctx);
+
+ /**
+ * Switch into ACTIVE state and start next tx if any
+ * is in queue.
+ */
+ void Activate(const TActorContext &ctx);
+ /**
+ * If there are sub-processors then switch into
+ * LOCKED_BY_CHILDREN state and activate them.
+ */
+ void ActivateChildren(const TActorContext &ctx);
+ /**
+ * Stop tx execution. Called by parent to get rid of children
+ * Lock. Return true if stopped and false otherwise.
+ * If false is returned then call parent's Start method after
+ * tx execution is stopped.
+ */
+ bool Lock(const TActorContext &ctx);
+ /**
+ * This method is called when processor is locked by children
+ * but got something to run. Tries to lock children and become
+ * active.
+ */
+ void TryToLockChildren(const TActorContext &ctx);
+ /**
+ * Try to continue tx execution. If processor is locked
+ * by parent then it means parent unlocks it. If processor
+ * is locked by children then it means some of children
+ * became locked.
+ */
+ void Start(const TActorContext &ctx);
+
+ /**
+ * Check if we need to become active and all children are now locked.
+ */
+ void CheckActivation(const TActorContext &ctx);
+ /**
+ * Check if we need to be locked by parent and now may be locked.
+ * If required and possible then change state and notify parent
+ * via Start method call.
+ */
+ void CheckLocks(const TActorContext &ctx);
+ /**
+ * Check if this processor is temporary and it's time to unlink
+ * (and die). Return true if unlinked from parent.
+ */
+ bool CheckTemporary(const TActorContext &ctx);
+ /**
+ * Process next tx from the queue if possible. If we are not
+ * locked and there is nothing to
+ */
+ void ProcessNextTx(const TActorContext &ctx);
+
+ ITxExecutor &Executor;
+ TString Name;
+ ui32 Service;
+ EState State;
+ bool Temporary;
+ ITransaction *ActiveTx;
+ TDeque<THolder<ITransaction>> TxQueue;
+ TTxProcessor *Parent;
+ TMap<TString, TTxProcessor::TPtr> SubProcessors;
+ TString LogPrefix;
+};
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/ut/ya.make b/ydb/core/cms/console/ut/ya.make
index 54072777080..9f42e184275 100644
--- a/ydb/core/cms/console/ut/ya.make
+++ b/ydb/core/cms/console/ut/ya.make
@@ -1,9 +1,9 @@
UNITTEST_FOR(ydb/core/cms/console)
-
+
OWNER(g:kikimr)
-
-FORK_SUBTESTS()
-
+
+FORK_SUBTESTS()
+
IF (SANITIZER_TYPE OR WITH_VALGRIND)
TIMEOUT(1200)
SIZE(LARGE)
@@ -15,26 +15,26 @@ ELSE()
SIZE(MEDIUM)
REQUIREMENTS(ram:16)
ENDIF()
-
-PEERDIR(
+
+PEERDIR(
library/cpp/getopt
library/cpp/protobuf/util
library/cpp/regex/pcre
library/cpp/svnversion
ydb/core/testlib
-)
-
+)
+
YQL_LAST_ABI_VERSION()
-SRCS(
+SRCS(
configs_cache_ut.cpp
- configs_dispatcher_ut.cpp
- console_ut_tenants.cpp
- console_ut_configs.cpp
- immediate_controls_configurator_ut.cpp
- log_settings_configurator_ut.cpp
- modifications_validator_ut.cpp
+ configs_dispatcher_ut.cpp
+ console_ut_tenants.cpp
+ console_ut_configs.cpp
+ immediate_controls_configurator_ut.cpp
+ log_settings_configurator_ut.cpp
+ modifications_validator_ut.cpp
net_classifier_updater_ut.cpp
-)
-
-END()
+)
+
+END()
diff --git a/ydb/core/cms/console/ut_helpers.h b/ydb/core/cms/console/ut_helpers.h
index 2bb92a045dd..9faf6468fa2 100644
--- a/ydb/core/cms/console/ut_helpers.h
+++ b/ydb/core/cms/console/ut_helpers.h
@@ -1,358 +1,358 @@
-#pragma once
-
-#include "config_helpers.h"
-#include "config_index.h"
-#include "console_configs_provider.h"
-#include "console_impl.h"
-#include "console_tenants_manager.h"
-
+#pragma once
+
+#include "config_helpers.h"
+#include "config_index.h"
+#include "console_configs_provider.h"
+#include "console_impl.h"
+#include "console_tenants_manager.h"
+
#include <ydb/core/testlib/tenant_runtime.h>
#include <ydb/core/testlib/tenant_helpers.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace NKikimr {
-namespace NConsole {
-namespace NUT {
-
-struct TUnitRegistration {
- TUnitRegistration(const TString &host = "", ui32 port = 0, const TString &kind = "")
- : Host(host)
- , Port(port)
- , Kind(kind)
- {
- }
-
- TString Host;
- ui32 Port;
- TString Kind;
-};
-
-inline NKikimrConsole::TUsageScope MakeUsageScope(const TVector<ui32> &nodes)
-{
- NKikimrConsole::TUsageScope res;
- auto &filter = *res.MutableNodeFilter();
- for (auto &host : nodes)
- filter.AddNodes(host);
- return res;
-}
-
-inline NKikimrConsole::TUsageScope MakeUsageScope(const TVector<TString> &hosts)
-{
- NKikimrConsole::TUsageScope res;
- auto &filter = *res.MutableHostFilter();
- for (auto &host : hosts)
- filter.AddHosts(host);
- return res;
-}
-
-inline NKikimrConsole::TUsageScope MakeUsageScope(const TString &tenant, const TString &nodeType)
-{
- NKikimrConsole::TUsageScope res;
- res.MutableTenantAndNodeTypeFilter()->SetTenant(tenant);
- res.MutableTenantAndNodeTypeFilter()->SetNodeType(nodeType);
- return res;
-}
-
-inline NKikimrConsole::TConfigItem MakeConfigItem(ui32 kind, const NKikimrConfig::TAppConfig &config,
- TVector<ui32> nodes, TVector<TString> hosts,
- const TString &tenant, const TString &nodeType,
- ui32 order, ui32 merge, const TString &cookie = "")
-{
- NKikimrConsole::TConfigItem item;
- item.SetKind(kind);
- item.MutableConfig()->CopyFrom(config);
- for (auto id : nodes)
- item.MutableUsageScope()->MutableNodeFilter()->AddNodes(id);
- for (auto host : hosts)
- item.MutableUsageScope()->MutableHostFilter()->AddHosts(host);
- if (nodes.empty() && hosts.empty()) {
- item.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant(tenant);
- item.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType(nodeType);
- }
- item.SetOrder(order);
- item.SetMergeStrategy(merge);
- item.SetCookie(cookie);
- return item;
-}
-
-inline NKikimrConsole::TConfigureAction MakeAddAction(const NKikimrConsole::TConfigItem &item, bool split = false)
-{
- NKikimrConsole::TConfigureAction res;
- res.MutableAddConfigItem()->MutableConfigItem()->CopyFrom(item);
- res.MutableAddConfigItem()->SetEnableAutoSplit(split);
- return res;
-}
-
-inline NKikimrConsole::TConfigureAction MakeModifyAction(const NKikimrConsole::TConfigItem &item)
-{
- NKikimrConsole::TConfigureAction res;
- res.MutableModifyConfigItem()->MutableConfigItem()->CopyFrom(item);
- return res;
-}
-
-inline NKikimrConsole::TConfigureAction MakeRemoveAction(ui64 id, ui64 generation)
-{
- NKikimrConsole::TConfigureAction res;
- res.MutableRemoveConfigItem()->MutableConfigItemId()->SetId(id);
- res.MutableRemoveConfigItem()->MutableConfigItemId()->SetGeneration(generation);
- return res;
-}
-
-inline NKikimrConsole::TConfigureAction MakeRemoveAction(const NKikimrConsole::TConfigItem &item)
-{
- return MakeRemoveAction(item.GetId().GetId(), item.GetId().GetGeneration());
-}
-
-inline NKikimrConsole::TConfigureAction MakeRemoveByCookieAction(const TString &cookie)
-{
- NKikimrConsole::TConfigureAction res;
- res.MutableRemoveConfigItems()->MutableCookieFilter()->AddCookies(cookie);
- return res;
-}
-
-inline NKikimrConsole::TConfigureAction MakeRemoveByCookieAction(const TString &cookie1,
- const TString &cookie2)
-{
- NKikimrConsole::TConfigureAction res;
- res.MutableRemoveConfigItems()->MutableCookieFilter()->AddCookies(cookie1);
- res.MutableRemoveConfigItems()->MutableCookieFilter()->AddCookies(cookie2);
- return res;
-}
-
-inline void CollectActions(NKikimrConsole::TConfigureRequest &request,
- const NKikimrConsole::TConfigureAction &action)
-{
- request.AddActions()->CopyFrom(action);
-}
-
-template <typename ...Ts>
-void CollectActions(NKikimrConsole::TConfigureRequest &request,
- const NKikimrConsole::TConfigureAction &action, Ts... args)
-{
- CollectActions(request, action);
- CollectActions(request, args...);
-}
-
-template <typename ...Ts>
-TVector<ui64> CheckConfigure(TTenantTestRuntime &runtime,
- Ydb::StatusIds::StatusCode code,
- bool dryRun,
- bool fillAffected,
- Ts... args)
-{
- auto *event = new TEvConsole::TEvConfigureRequest;
- event->Record.SetDryRun(dryRun);
- event->Record.SetFillAffectedConfigs(fillAffected);
- CollectActions(event->Record, args...);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigureResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
- return {reply->Record.GetAddedItemIds().begin(), reply->Record.GetAddedItemIds().end()};
-}
-
-template <typename ...Ts>
-TVector<ui64> CheckConfigure(TTenantTestRuntime &runtime,
- Ydb::StatusIds::StatusCode code,
- Ts... args)
-{
- return CheckConfigure(runtime, code, false, false, args...);
-}
-
-template <typename ...Ts>
-void SendConfigure(TTenantTestRuntime &runtime, Ts... args)
-{
- auto *event = new TEvConsole::TEvConfigureRequest;
- CollectActions(event->Record, args...);
- runtime.SendToConsole(event);
-}
-
-inline void CollectSubscriptions(THashMap<ui64, TSubscription> &)
-{
-}
-
-inline void CollectSubscriptions(THashMap<ui64, TSubscription> &subscriptions,
- ui64 id, ui32 nodeId, const TString &host, const TString &tenant,
+
+namespace NKikimr {
+namespace NConsole {
+namespace NUT {
+
+struct TUnitRegistration {
+ TUnitRegistration(const TString &host = "", ui32 port = 0, const TString &kind = "")
+ : Host(host)
+ , Port(port)
+ , Kind(kind)
+ {
+ }
+
+ TString Host;
+ ui32 Port;
+ TString Kind;
+};
+
+inline NKikimrConsole::TUsageScope MakeUsageScope(const TVector<ui32> &nodes)
+{
+ NKikimrConsole::TUsageScope res;
+ auto &filter = *res.MutableNodeFilter();
+ for (auto &host : nodes)
+ filter.AddNodes(host);
+ return res;
+}
+
+inline NKikimrConsole::TUsageScope MakeUsageScope(const TVector<TString> &hosts)
+{
+ NKikimrConsole::TUsageScope res;
+ auto &filter = *res.MutableHostFilter();
+ for (auto &host : hosts)
+ filter.AddHosts(host);
+ return res;
+}
+
+inline NKikimrConsole::TUsageScope MakeUsageScope(const TString &tenant, const TString &nodeType)
+{
+ NKikimrConsole::TUsageScope res;
+ res.MutableTenantAndNodeTypeFilter()->SetTenant(tenant);
+ res.MutableTenantAndNodeTypeFilter()->SetNodeType(nodeType);
+ return res;
+}
+
+inline NKikimrConsole::TConfigItem MakeConfigItem(ui32 kind, const NKikimrConfig::TAppConfig &config,
+ TVector<ui32> nodes, TVector<TString> hosts,
+ const TString &tenant, const TString &nodeType,
+ ui32 order, ui32 merge, const TString &cookie = "")
+{
+ NKikimrConsole::TConfigItem item;
+ item.SetKind(kind);
+ item.MutableConfig()->CopyFrom(config);
+ for (auto id : nodes)
+ item.MutableUsageScope()->MutableNodeFilter()->AddNodes(id);
+ for (auto host : hosts)
+ item.MutableUsageScope()->MutableHostFilter()->AddHosts(host);
+ if (nodes.empty() && hosts.empty()) {
+ item.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetTenant(tenant);
+ item.MutableUsageScope()->MutableTenantAndNodeTypeFilter()->SetNodeType(nodeType);
+ }
+ item.SetOrder(order);
+ item.SetMergeStrategy(merge);
+ item.SetCookie(cookie);
+ return item;
+}
+
+inline NKikimrConsole::TConfigureAction MakeAddAction(const NKikimrConsole::TConfigItem &item, bool split = false)
+{
+ NKikimrConsole::TConfigureAction res;
+ res.MutableAddConfigItem()->MutableConfigItem()->CopyFrom(item);
+ res.MutableAddConfigItem()->SetEnableAutoSplit(split);
+ return res;
+}
+
+inline NKikimrConsole::TConfigureAction MakeModifyAction(const NKikimrConsole::TConfigItem &item)
+{
+ NKikimrConsole::TConfigureAction res;
+ res.MutableModifyConfigItem()->MutableConfigItem()->CopyFrom(item);
+ return res;
+}
+
+inline NKikimrConsole::TConfigureAction MakeRemoveAction(ui64 id, ui64 generation)
+{
+ NKikimrConsole::TConfigureAction res;
+ res.MutableRemoveConfigItem()->MutableConfigItemId()->SetId(id);
+ res.MutableRemoveConfigItem()->MutableConfigItemId()->SetGeneration(generation);
+ return res;
+}
+
+inline NKikimrConsole::TConfigureAction MakeRemoveAction(const NKikimrConsole::TConfigItem &item)
+{
+ return MakeRemoveAction(item.GetId().GetId(), item.GetId().GetGeneration());
+}
+
+inline NKikimrConsole::TConfigureAction MakeRemoveByCookieAction(const TString &cookie)
+{
+ NKikimrConsole::TConfigureAction res;
+ res.MutableRemoveConfigItems()->MutableCookieFilter()->AddCookies(cookie);
+ return res;
+}
+
+inline NKikimrConsole::TConfigureAction MakeRemoveByCookieAction(const TString &cookie1,
+ const TString &cookie2)
+{
+ NKikimrConsole::TConfigureAction res;
+ res.MutableRemoveConfigItems()->MutableCookieFilter()->AddCookies(cookie1);
+ res.MutableRemoveConfigItems()->MutableCookieFilter()->AddCookies(cookie2);
+ return res;
+}
+
+inline void CollectActions(NKikimrConsole::TConfigureRequest &request,
+ const NKikimrConsole::TConfigureAction &action)
+{
+ request.AddActions()->CopyFrom(action);
+}
+
+template <typename ...Ts>
+void CollectActions(NKikimrConsole::TConfigureRequest &request,
+ const NKikimrConsole::TConfigureAction &action, Ts... args)
+{
+ CollectActions(request, action);
+ CollectActions(request, args...);
+}
+
+template <typename ...Ts>
+TVector<ui64> CheckConfigure(TTenantTestRuntime &runtime,
+ Ydb::StatusIds::StatusCode code,
+ bool dryRun,
+ bool fillAffected,
+ Ts... args)
+{
+ auto *event = new TEvConsole::TEvConfigureRequest;
+ event->Record.SetDryRun(dryRun);
+ event->Record.SetFillAffectedConfigs(fillAffected);
+ CollectActions(event->Record, args...);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigureResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
+ return {reply->Record.GetAddedItemIds().begin(), reply->Record.GetAddedItemIds().end()};
+}
+
+template <typename ...Ts>
+TVector<ui64> CheckConfigure(TTenantTestRuntime &runtime,
+ Ydb::StatusIds::StatusCode code,
+ Ts... args)
+{
+ return CheckConfigure(runtime, code, false, false, args...);
+}
+
+template <typename ...Ts>
+void SendConfigure(TTenantTestRuntime &runtime, Ts... args)
+{
+ auto *event = new TEvConsole::TEvConfigureRequest;
+ CollectActions(event->Record, args...);
+ runtime.SendToConsole(event);
+}
+
+inline void CollectSubscriptions(THashMap<ui64, TSubscription> &)
+{
+}
+
+inline void CollectSubscriptions(THashMap<ui64, TSubscription> &subscriptions,
+ ui64 id, ui32 nodeId, const TString &host, const TString &tenant,
const TString &nodeType, ui64 tabletId, TActorId serviceId,
- TVector<ui32> kinds)
-{
- TSubscription subscription;
- subscription.Id = id;
- subscription.NodeId = nodeId;
- subscription.Host = host;
- subscription.Tenant = tenant;
- subscription.NodeType = nodeType;
- subscription.Subscriber.TabletId = tabletId;
- subscription.Subscriber.ServiceId = serviceId;
- for (auto &kind : kinds)
- subscription.ItemKinds.insert(kind);
- subscriptions[id] = subscription;
-}
-
-template <typename ...Ts>
-void CollectSubscriptions(THashMap<ui64, TSubscription> &subscriptions,
- ui64 id, ui32 nodeId, const TString &host, const TString &tenant,
+ TVector<ui32> kinds)
+{
+ TSubscription subscription;
+ subscription.Id = id;
+ subscription.NodeId = nodeId;
+ subscription.Host = host;
+ subscription.Tenant = tenant;
+ subscription.NodeType = nodeType;
+ subscription.Subscriber.TabletId = tabletId;
+ subscription.Subscriber.ServiceId = serviceId;
+ for (auto &kind : kinds)
+ subscription.ItemKinds.insert(kind);
+ subscriptions[id] = subscription;
+}
+
+template <typename ...Ts>
+void CollectSubscriptions(THashMap<ui64, TSubscription> &subscriptions,
+ ui64 id, ui32 nodeId, const TString &host, const TString &tenant,
const TString &nodeType, ui64 tabletId, TActorId serviceId,
- TVector<ui32> kinds, Ts ...args)
-{
- CollectSubscriptions(subscriptions, id, nodeId, host, tenant, nodeType, tabletId, serviceId, kinds);
- CollectSubscriptions(subscriptions, args...);
-}
-
-template <typename ...Ts>
-void CheckListConfigSubscriptions(TTenantTestRuntime &runtime, Ydb::StatusIds::StatusCode code,
+ TVector<ui32> kinds, Ts ...args)
+{
+ CollectSubscriptions(subscriptions, id, nodeId, host, tenant, nodeType, tabletId, serviceId, kinds);
+ CollectSubscriptions(subscriptions, args...);
+}
+
+template <typename ...Ts>
+void CheckListConfigSubscriptions(TTenantTestRuntime &runtime, Ydb::StatusIds::StatusCode code,
ui64 tabletId, TActorId serviceId, Ts ...args)
-{
- THashMap<ui64, TSubscription> subscriptions;
- CollectSubscriptions(subscriptions, args...);
-
- auto *event = new TEvConsole::TEvListConfigSubscriptionsRequest;
- if (tabletId)
- event->Record.MutableSubscriber()->SetTabletId(tabletId);
- else if (serviceId)
+{
+ THashMap<ui64, TSubscription> subscriptions;
+ CollectSubscriptions(subscriptions, args...);
+
+ auto *event = new TEvConsole::TEvListConfigSubscriptionsRequest;
+ if (tabletId)
+ event->Record.MutableSubscriber()->SetTabletId(tabletId);
+ else if (serviceId)
ActorIdToProto(serviceId, event->Record.MutableSubscriber()->MutableServiceId());
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvListConfigSubscriptionsResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
-
- for (auto &rec : reply->Record.GetSubscriptions()) {
- TSubscription subscription(rec);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvListConfigSubscriptionsResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), code);
+
+ for (auto &rec : reply->Record.GetSubscriptions()) {
+ TSubscription subscription(rec);
UNIT_ASSERT(subscriptions.contains(subscription.Id));
- UNIT_ASSERT(subscriptions.at(subscription.Id).IsEqual(subscription));
- subscriptions.erase(subscription.Id);
- }
- UNIT_ASSERT(subscriptions.empty());
-}
-
-inline bool CompareState(THashMap<std::pair<TString, TString>, TSlotState> slots,
- THashMap<TString, TPoolAllocation> pools,
- THashMap<std::pair<TString, ui32>, TUnitRegistration> registrations,
+ UNIT_ASSERT(subscriptions.at(subscription.Id).IsEqual(subscription));
+ subscriptions.erase(subscription.Id);
+ }
+ UNIT_ASSERT(subscriptions.empty());
+}
+
+inline bool CompareState(THashMap<std::pair<TString, TString>, TSlotState> slots,
+ THashMap<TString, TPoolAllocation> pools,
+ THashMap<std::pair<TString, ui32>, TUnitRegistration> registrations,
const Ydb::Cms::GetDatabaseStatusResult &status, bool shared = false)
-{
+{
const auto& resources = shared ? status.required_shared_resources() : status.required_resources();
for (auto &unit : resources.computational_units()) {
- auto key = std::make_pair(unit.unit_kind(), unit.availability_zone());
- auto count = unit.count();
+ auto key = std::make_pair(unit.unit_kind(), unit.availability_zone());
+ auto count = unit.count();
if (!slots.contains(key))
- return false;
- if (slots[key].Required != count)
- return false;
- slots[key].Required = 0;
- }
-
+ return false;
+ if (slots[key].Required != count)
+ return false;
+ slots[key].Required = 0;
+ }
+
for (auto &unit : resources.storage_units()) {
- auto key = unit.unit_kind();
- auto size = unit.count();
+ auto key = unit.unit_kind();
+ auto size = unit.count();
if (!pools.contains(key))
- return false;
- if (pools[key].PoolSize != size)
- return false;
- pools[key].PoolSize = 0;
- }
-
- for (auto &unit : status.allocated_resources().computational_units()) {
- auto key = std::make_pair(unit.unit_kind(), unit.availability_zone());
- auto count = unit.count();
+ return false;
+ if (pools[key].PoolSize != size)
+ return false;
+ pools[key].PoolSize = 0;
+ }
+
+ for (auto &unit : status.allocated_resources().computational_units()) {
+ auto key = std::make_pair(unit.unit_kind(), unit.availability_zone());
+ auto count = unit.count();
if (!slots.contains(key))
- return false;
- if (slots[key].Allocated != count)
- return false;
- slots[key].Allocated = 0;
- }
-
- for (auto &unit : status.allocated_resources().storage_units()) {
- auto key = unit.unit_kind();
- auto size = unit.count();
+ return false;
+ if (slots[key].Allocated != count)
+ return false;
+ slots[key].Allocated = 0;
+ }
+
+ for (auto &unit : status.allocated_resources().storage_units()) {
+ auto key = unit.unit_kind();
+ auto size = unit.count();
if (!pools.contains(key))
- return false;
- if (pools[key].Allocated != size)
- return false;
- pools[key].Allocated = 0;
- }
-
- for (auto &unit : status.registered_resources()) {
- auto key = std::make_pair(unit.host(), unit.port());
+ return false;
+ if (pools[key].Allocated != size)
+ return false;
+ pools[key].Allocated = 0;
+ }
+
+ for (auto &unit : status.registered_resources()) {
+ auto key = std::make_pair(unit.host(), unit.port());
if (!registrations.contains(key))
- return false;
- if (registrations.at(key).Kind != unit.unit_kind())
- return false;
- registrations.erase(key);
- }
-
- for (auto &pr : slots) {
- if (pr.second.Required || pr.second.Allocated)
- return false;
- }
-
- for (auto &pr : pools) {
- if (pr.second.PoolSize || pr.second.Allocated)
- return false;
- }
-
- if (registrations.size())
- return false;
-
- return true;
-}
-
-template <typename ...Ts>
+ return false;
+ if (registrations.at(key).Kind != unit.unit_kind())
+ return false;
+ registrations.erase(key);
+ }
+
+ for (auto &pr : slots) {
+ if (pr.second.Required || pr.second.Allocated)
+ return false;
+ }
+
+ for (auto &pr : pools) {
+ if (pr.second.PoolSize || pr.second.Allocated)
+ return false;
+ }
+
+ if (registrations.size())
+ return false;
+
+ return true;
+}
+
+template <typename ...Ts>
void CheckTenantStatus(TTenantTestRuntime &runtime, const TString &path, bool shared,
- Ydb::StatusIds::StatusCode code,
- Ydb::Cms::GetDatabaseStatusResult::State state,
- TVector<TPoolAllocation> poolTypes,
- TVector<TUnitRegistration> unitRegistrations,
- Ts... args)
-{
- THashMap<std::pair<TString, TString>, TSlotState> slots;
- CollectSlots(slots, args...);
-
- THashMap<TString, TPoolAllocation> pools;
- for (auto &pool : poolTypes)
- pools[pool.PoolType] = pool;
-
- THashMap<std::pair<TString, ui32>, TUnitRegistration> registrations;
- for (auto &reg : unitRegistrations)
- registrations[std::make_pair(reg.Host, reg.Port)] = reg;
-
- bool ok = false;
- while (!ok) {
- auto *event = new TEvConsole::TEvGetTenantStatusRequest;
- event->Record.MutableRequest()->set_path(path);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetTenantStatusResponse>(handle);
- auto &operation = reply->Record.GetResponse().operation();
- UNIT_ASSERT_VALUES_EQUAL(operation.status(), code);
- if (code != Ydb::StatusIds::SUCCESS)
- return;
-
- Ydb::Cms::GetDatabaseStatusResult status;
- UNIT_ASSERT(operation.result().UnpackTo(&status));
-
- UNIT_ASSERT_VALUES_EQUAL(status.path(), CanonizePath(path));
-
+ Ydb::StatusIds::StatusCode code,
+ Ydb::Cms::GetDatabaseStatusResult::State state,
+ TVector<TPoolAllocation> poolTypes,
+ TVector<TUnitRegistration> unitRegistrations,
+ Ts... args)
+{
+ THashMap<std::pair<TString, TString>, TSlotState> slots;
+ CollectSlots(slots, args...);
+
+ THashMap<TString, TPoolAllocation> pools;
+ for (auto &pool : poolTypes)
+ pools[pool.PoolType] = pool;
+
+ THashMap<std::pair<TString, ui32>, TUnitRegistration> registrations;
+ for (auto &reg : unitRegistrations)
+ registrations[std::make_pair(reg.Host, reg.Port)] = reg;
+
+ bool ok = false;
+ while (!ok) {
+ auto *event = new TEvConsole::TEvGetTenantStatusRequest;
+ event->Record.MutableRequest()->set_path(path);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetTenantStatusResponse>(handle);
+ auto &operation = reply->Record.GetResponse().operation();
+ UNIT_ASSERT_VALUES_EQUAL(operation.status(), code);
+ if (code != Ydb::StatusIds::SUCCESS)
+ return;
+
+ Ydb::Cms::GetDatabaseStatusResult status;
+ UNIT_ASSERT(operation.result().UnpackTo(&status));
+
+ UNIT_ASSERT_VALUES_EQUAL(status.path(), CanonizePath(path));
+
ok = status.state() == state && CompareState(slots, pools, registrations, status, shared);
- if (!ok) {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvRetryAllocateResources);
- options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvSubdomainFailed);
- options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvSubdomainCreated);
- options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvSubdomainReady);
- options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvSubdomainRemoved);
- options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvPoolAllocated);
- options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvPoolFailed);
- options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvPoolDeleted);
- runtime.DispatchEvents(options, TDuration::Seconds(10));
- }
- }
-}
-
+ if (!ok) {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvRetryAllocateResources);
+ options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvSubdomainFailed);
+ options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvSubdomainCreated);
+ options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvSubdomainReady);
+ options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvSubdomainRemoved);
+ options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvPoolAllocated);
+ options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvPoolFailed);
+ options.FinalEvents.emplace_back(NConsole::TTenantsManager::TEvPrivate::EvPoolDeleted);
+ runtime.DispatchEvents(options, TDuration::Seconds(10));
+ }
+ }
+}
+
template <typename ...Ts>
void CheckTenantStatus(TTenantTestRuntime &runtime, const TString &path,
Ydb::StatusIds::StatusCode code,
@@ -364,78 +364,78 @@ void CheckTenantStatus(TTenantTestRuntime &runtime, const TString &path,
CheckTenantStatus(runtime, path, false, code, state, poolTypes, unitRegistrations, args...);
}
-inline void WaitForTenantStatus(TTenantTestRuntime &runtime,
- const TString &path,
- Ydb::StatusIds::StatusCode code)
-{
- while (true) {
- auto *event = new TEvConsole::TEvGetTenantStatusRequest;
- event->Record.MutableRequest()->set_path(path);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetTenantStatusResponse>(handle);
- auto &operation = reply->Record.GetResponse().operation();
- if (operation.status() == code)
- return;
-
- TDispatchOptions options;
- runtime.DispatchEvents(options, TDuration::MilliSeconds(100));
- }
-}
-
-inline void ChangeTenant(TTenantTestRuntime &runtime,
- const TString &tenant,
- ui32 nodeIdx = 0,
- bool wait = true)
-{
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(nodeIdx)),
- runtime.Sender,
- new TEvTenantPool::TEvTakeOwnership));
-
- TAutoPtr<IEventHandle> handle;
- runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvTenantPoolStatus>(handle);
-
- auto *request = new TEvTenantPool::TEvConfigureSlot;
- request->Record.SetSlotId("slot");
- request->Record.SetAssignedTenant(tenant);
- request->Record.SetLabel("slot-1");
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(nodeIdx)),
- runtime.Sender,
- request));
-
- if (wait) {
- auto reply = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvConfigureSlotResult>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), NKikimrTenantPool::SUCCESS);
- }
-}
-
-inline int AssignIds(const TVector<ui64> &ids,
- int no,
- NKikimrConsole::TConfigItem &item)
-{
- item.MutableId()->SetId(ids[no]);
- item.MutableId()->SetGeneration(1);
- return no + 1;
-}
-
-template <typename ...Ts>
-int AssignIds(const TVector<ui64> &ids,
- int no,
- NKikimrConsole::TConfigItem &item, Ts&... args)
-{
- AssignIds(ids, no, item);
- return AssignIds(ids, no + 1, args...);
-}
-
-template <typename ...Ts>
-void AssignIds(const TVector<ui64> &ids,
- Ts&... args)
-{
- UNIT_ASSERT_VALUES_EQUAL(ids.size(), AssignIds(ids, 0, args...));
-}
-
-
+inline void WaitForTenantStatus(TTenantTestRuntime &runtime,
+ const TString &path,
+ Ydb::StatusIds::StatusCode code)
+{
+ while (true) {
+ auto *event = new TEvConsole::TEvGetTenantStatusRequest;
+ event->Record.MutableRequest()->set_path(path);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetTenantStatusResponse>(handle);
+ auto &operation = reply->Record.GetResponse().operation();
+ if (operation.status() == code)
+ return;
+
+ TDispatchOptions options;
+ runtime.DispatchEvents(options, TDuration::MilliSeconds(100));
+ }
+}
+
+inline void ChangeTenant(TTenantTestRuntime &runtime,
+ const TString &tenant,
+ ui32 nodeIdx = 0,
+ bool wait = true)
+{
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(nodeIdx)),
+ runtime.Sender,
+ new TEvTenantPool::TEvTakeOwnership));
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvTenantPoolStatus>(handle);
+
+ auto *request = new TEvTenantPool::TEvConfigureSlot;
+ request->Record.SetSlotId("slot");
+ request->Record.SetAssignedTenant(tenant);
+ request->Record.SetLabel("slot-1");
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(nodeIdx)),
+ runtime.Sender,
+ request));
+
+ if (wait) {
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvConfigureSlotResult>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), NKikimrTenantPool::SUCCESS);
+ }
+}
+
+inline int AssignIds(const TVector<ui64> &ids,
+ int no,
+ NKikimrConsole::TConfigItem &item)
+{
+ item.MutableId()->SetId(ids[no]);
+ item.MutableId()->SetGeneration(1);
+ return no + 1;
+}
+
+template <typename ...Ts>
+int AssignIds(const TVector<ui64> &ids,
+ int no,
+ NKikimrConsole::TConfigItem &item, Ts&... args)
+{
+ AssignIds(ids, no, item);
+ return AssignIds(ids, no + 1, args...);
+}
+
+template <typename ...Ts>
+void AssignIds(const TVector<ui64> &ids,
+ Ts&... args)
+{
+ UNIT_ASSERT_VALUES_EQUAL(ids.size(), AssignIds(ids, 0, args...));
+}
+
+
inline void CheckEqualsIgnoringVersion(NKikimrConfig::TAppConfig config1, NKikimrConfig::TAppConfig config2)
{
config1.ClearVersion();
@@ -445,6 +445,6 @@ inline void CheckEqualsIgnoringVersion(NKikimrConfig::TAppConfig config1, NKikim
}
-} // namespace NUT
-} // namespace NConsole
-} // namesapce NKikimr
+} // namespace NUT
+} // namespace NConsole
+} // namesapce NKikimr
diff --git a/ydb/core/cms/console/validators/core_validators.cpp b/ydb/core/cms/console/validators/core_validators.cpp
index d139c0beea4..5d0a707c72c 100644
--- a/ydb/core/cms/console/validators/core_validators.cpp
+++ b/ydb/core/cms/console/validators/core_validators.cpp
@@ -1,16 +1,16 @@
-#include "core_validators.h"
-#include "validator.h"
-#include "validator_bootstrap.h"
-#include "validator_nameservice.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-void RegisterCoreValidators()
-{
- RegisterValidator(new TBootstrapConfigValidator);
- RegisterValidator(new TNameserviceConfigValidator);
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+#include "core_validators.h"
+#include "validator.h"
+#include "validator_bootstrap.h"
+#include "validator_nameservice.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+void RegisterCoreValidators()
+{
+ RegisterValidator(new TBootstrapConfigValidator);
+ RegisterValidator(new TNameserviceConfigValidator);
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/core_validators.h b/ydb/core/cms/console/validators/core_validators.h
index 6394f1ba890..4d7b37d112b 100644
--- a/ydb/core/cms/console/validators/core_validators.h
+++ b/ydb/core/cms/console/validators/core_validators.h
@@ -1,9 +1,9 @@
-#pragma once
-
-namespace NKikimr {
-namespace NConsole {
-
-void RegisterCoreValidators();
-
-} // namespace NConsole
-} // namespace NKikimr
+#pragma once
+
+namespace NKikimr {
+namespace NConsole {
+
+void RegisterCoreValidators();
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/registry.cpp b/ydb/core/cms/console/validators/registry.cpp
index cd80cd79d23..26819bf5142 100644
--- a/ydb/core/cms/console/validators/registry.cpp
+++ b/ydb/core/cms/console/validators/registry.cpp
@@ -1,185 +1,185 @@
-#include "registry.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-TValidatorsRegistry::TPtr TValidatorsRegistry::Instance_;
-TMutex TValidatorsRegistry::Mutex;
-
-TValidatorsRegistry::TPtr TValidatorsRegistry::Instance()
-{
- auto res = Instance_;
- if (!res) {
- TGuard<TMutex> guard(Mutex);
- if (!Instance_)
- Instance_ = new TValidatorsRegistry();
- res = Instance_;
- }
- return res;
-}
-
-void TValidatorsRegistry::DropInstance()
-{
- TGuard<TMutex> guard(Mutex);
- Instance_ = nullptr;
-}
-
-TValidatorsRegistry::TValidatorsRegistry()
- : Locked(0)
-{
-}
-
-bool TValidatorsRegistry::AddValidator(IConfigValidator::TPtr validator)
-{
- TGuard<TMutex> guard(Mutex);
-
+#include "registry.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+TValidatorsRegistry::TPtr TValidatorsRegistry::Instance_;
+TMutex TValidatorsRegistry::Mutex;
+
+TValidatorsRegistry::TPtr TValidatorsRegistry::Instance()
+{
+ auto res = Instance_;
+ if (!res) {
+ TGuard<TMutex> guard(Mutex);
+ if (!Instance_)
+ Instance_ = new TValidatorsRegistry();
+ res = Instance_;
+ }
+ return res;
+}
+
+void TValidatorsRegistry::DropInstance()
+{
+ TGuard<TMutex> guard(Mutex);
+ Instance_ = nullptr;
+}
+
+TValidatorsRegistry::TValidatorsRegistry()
+ : Locked(0)
+{
+}
+
+bool TValidatorsRegistry::AddValidator(IConfigValidator::TPtr validator)
+{
+ TGuard<TMutex> guard(Mutex);
+
if (IsLocked() || Validators.contains(validator->GetName()))
- return false;
-
- Validators.emplace(validator->GetName(), validator);
- AddToValidatorClasses(validator);
-
- return true;
-}
-
-void TValidatorsRegistry::LockValidators()
-{
- TGuard<TMutex> guard(Mutex);
- Locked = 1;
-}
-
-bool TValidatorsRegistry::IsLocked() const
-{
- return Locked;
-}
-
-bool TValidatorsRegistry::CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
- const NKikimrConfig::TAppConfig &newConfig,
- const TDynBitMap &validatorClass,
- TVector<Ydb::Issue::IssueMessage> &issues) const
-{
- Y_VERIFY(Locked);
+ return false;
+
+ Validators.emplace(validator->GetName(), validator);
+ AddToValidatorClasses(validator);
+
+ return true;
+}
+
+void TValidatorsRegistry::LockValidators()
+{
+ TGuard<TMutex> guard(Mutex);
+ Locked = 1;
+}
+
+bool TValidatorsRegistry::IsLocked() const
+{
+ return Locked;
+}
+
+bool TValidatorsRegistry::CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
+ const NKikimrConfig::TAppConfig &newConfig,
+ const TDynBitMap &validatorClass,
+ TVector<Ydb::Issue::IssueMessage> &issues) const
+{
+ Y_VERIFY(Locked);
if (!ItemClasses.contains(validatorClass))
- return true;
-
- for (auto &validator : ValidatorsByItemClass.at(validatorClass))
- if (validator->IsEnabled() && !validator->CheckConfig(oldConfig, newConfig, issues))
- return false;
-
- return true;
-}
-
-bool TValidatorsRegistry::CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
- const NKikimrConfig::TAppConfig &newConfig,
- TVector<Ydb::Issue::IssueMessage> &issues) const
-{
- Y_VERIFY(Locked);
- for (auto &pr : Validators) {
- if (pr.second->IsEnabled() && !pr.second->CheckConfig(oldConfig, newConfig, issues))
- return false;
- }
-
- return true;
-}
-
-bool TValidatorsRegistry::EnableValidator(const TString &name)
-{
- Y_VERIFY(Locked);
- auto validator = GetValidator(name);
- if (!validator)
- return false;
-
- if (!validator->IsEnabled()) {
- validator->Enable();
- AddToValidatorClasses(validator);
- }
-
- return true;
-}
-
-bool TValidatorsRegistry::DisableValidator(const TString &name)
-{
- Y_VERIFY(Locked);
- auto validator = GetValidator(name);
- if (!validator)
- return false;
-
- if (validator->IsEnabled()) {
- validator->Disable();
- RemoveFromValidatorClasses(validator);
- }
-
- return true;
-}
-
-bool TValidatorsRegistry::IsValidatorEnabled(const TString &name) const
-{
- Y_VERIFY(Locked);
- auto validator = GetValidator(name);
- return validator ? validator->IsEnabled() : false;
-}
-
-void TValidatorsRegistry::EnableValidators()
-{
- for (auto &pr : Validators) {
- if (!pr.second->IsEnabled()) {
- pr.second->Enable();
- AddToValidatorClasses(pr.second);
- }
- }
-}
-
-void TValidatorsRegistry::DisableValidators()
-{
- for (auto &pr : Validators) {
- if (pr.second->IsEnabled()) {
- pr.second->Disable();
- RemoveFromValidatorClasses(pr.second);
- }
- }
-}
-
-IConfigValidator::TPtr TValidatorsRegistry::GetValidator(const TString &name) const
-{
- Y_VERIFY(Locked);
+ return true;
+
+ for (auto &validator : ValidatorsByItemClass.at(validatorClass))
+ if (validator->IsEnabled() && !validator->CheckConfig(oldConfig, newConfig, issues))
+ return false;
+
+ return true;
+}
+
+bool TValidatorsRegistry::CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
+ const NKikimrConfig::TAppConfig &newConfig,
+ TVector<Ydb::Issue::IssueMessage> &issues) const
+{
+ Y_VERIFY(Locked);
+ for (auto &pr : Validators) {
+ if (pr.second->IsEnabled() && !pr.second->CheckConfig(oldConfig, newConfig, issues))
+ return false;
+ }
+
+ return true;
+}
+
+bool TValidatorsRegistry::EnableValidator(const TString &name)
+{
+ Y_VERIFY(Locked);
+ auto validator = GetValidator(name);
+ if (!validator)
+ return false;
+
+ if (!validator->IsEnabled()) {
+ validator->Enable();
+ AddToValidatorClasses(validator);
+ }
+
+ return true;
+}
+
+bool TValidatorsRegistry::DisableValidator(const TString &name)
+{
+ Y_VERIFY(Locked);
+ auto validator = GetValidator(name);
+ if (!validator)
+ return false;
+
+ if (validator->IsEnabled()) {
+ validator->Disable();
+ RemoveFromValidatorClasses(validator);
+ }
+
+ return true;
+}
+
+bool TValidatorsRegistry::IsValidatorEnabled(const TString &name) const
+{
+ Y_VERIFY(Locked);
+ auto validator = GetValidator(name);
+ return validator ? validator->IsEnabled() : false;
+}
+
+void TValidatorsRegistry::EnableValidators()
+{
+ for (auto &pr : Validators) {
+ if (!pr.second->IsEnabled()) {
+ pr.second->Enable();
+ AddToValidatorClasses(pr.second);
+ }
+ }
+}
+
+void TValidatorsRegistry::DisableValidators()
+{
+ for (auto &pr : Validators) {
+ if (pr.second->IsEnabled()) {
+ pr.second->Disable();
+ RemoveFromValidatorClasses(pr.second);
+ }
+ }
+}
+
+IConfigValidator::TPtr TValidatorsRegistry::GetValidator(const TString &name) const
+{
+ Y_VERIFY(Locked);
if (Validators.contains(name))
- return Validators.at(name);
- return nullptr;
-}
-
-const TValidatorsRegistry::TValidators &TValidatorsRegistry::GetValidators() const
-{
- Y_VERIFY(Locked);
- return Validators;
-}
-
-const THashSet<TDynBitMap> &TValidatorsRegistry::GetValidatorClasses() const
-{
- Y_VERIFY(Locked);
- return ItemClasses;
-}
-
-void TValidatorsRegistry::AddToValidatorClasses(IConfigValidator::TPtr validator)
-{
- TDynBitMap kinds;
- for (auto kind : validator->GetCheckedConfigItemKinds())
- kinds.Set(kind);
- ValidatorsByItemClass[kinds].insert(validator);
- ItemClasses.insert(kinds);
-}
-
-void TValidatorsRegistry::RemoveFromValidatorClasses(IConfigValidator::TPtr validator)
-{
- TDynBitMap kinds;
- for (auto kind : validator->GetCheckedConfigItemKinds())
- kinds.Set(kind);
- auto it = ValidatorsByItemClass.find(kinds);
- it->second.erase(validator);
- if (it->second.empty()) {
- ItemClasses.erase(it->first);
- ValidatorsByItemClass.erase(it);
- }
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ return Validators.at(name);
+ return nullptr;
+}
+
+const TValidatorsRegistry::TValidators &TValidatorsRegistry::GetValidators() const
+{
+ Y_VERIFY(Locked);
+ return Validators;
+}
+
+const THashSet<TDynBitMap> &TValidatorsRegistry::GetValidatorClasses() const
+{
+ Y_VERIFY(Locked);
+ return ItemClasses;
+}
+
+void TValidatorsRegistry::AddToValidatorClasses(IConfigValidator::TPtr validator)
+{
+ TDynBitMap kinds;
+ for (auto kind : validator->GetCheckedConfigItemKinds())
+ kinds.Set(kind);
+ ValidatorsByItemClass[kinds].insert(validator);
+ ItemClasses.insert(kinds);
+}
+
+void TValidatorsRegistry::RemoveFromValidatorClasses(IConfigValidator::TPtr validator)
+{
+ TDynBitMap kinds;
+ for (auto kind : validator->GetCheckedConfigItemKinds())
+ kinds.Set(kind);
+ auto it = ValidatorsByItemClass.find(kinds);
+ it->second.erase(validator);
+ if (it->second.empty()) {
+ ItemClasses.erase(it->first);
+ ValidatorsByItemClass.erase(it);
+ }
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/registry.h b/ydb/core/cms/console/validators/registry.h
index 200f1d3115f..98edf56fa46 100644
--- a/ydb/core/cms/console/validators/registry.h
+++ b/ydb/core/cms/console/validators/registry.h
@@ -1,77 +1,77 @@
-#pragma once
-
-#include "validator.h"
-
-#include <util/generic/bitmap.h>
-#include <util/system/mutex.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-class TValidatorsRegistry : public TThrRefBase {
-public:
- using TPtr = TIntrusivePtr<TValidatorsRegistry>;
- using TValidators = THashMap<TString, IConfigValidator::TPtr>;
- using TValidatorsSet = THashSet<IConfigValidator::TPtr>;
-
- static TPtr Instance();
- // Drop is currently used by tests to re-initialize registry.
- static void DropInstance();
-
- bool AddValidator(IConfigValidator::TPtr validator);
-
- // Don't allow to add any more validators.
- void LockValidators();
- bool IsLocked() const;
-
- bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
- const NKikimrConfig::TAppConfig &newConfig,
- const TDynBitMap &validatorClass,
- TVector<Ydb::Issue::IssueMessage> &issues) const;
-
- bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
- const NKikimrConfig::TAppConfig &newConfig,
- TVector<Ydb::Issue::IssueMessage> &issues) const;
-
- bool EnableValidator(const TString &name);
- bool DisableValidator(const TString &name);
- bool IsValidatorEnabled(const TString &name) const;
-
- void EnableValidators();
- void DisableValidators();
-
- IConfigValidator::TPtr GetValidator(const TString &name) const;
-
- const TValidators &GetValidators() const;
-
- // All validators are split into classes. Each class corresponds
- // to a set of checked config items. Config variations to check
- // are examined within each class to reduce total number of
- // variations to check. This method returns vector of such
- // classes represented as a bitmap holding numbers of included
- // item kinds. Empty bitmap corresponds to global validator
- // covering all config items.
- // Currently we don't merge validators for various kinds into
- // single class but this can be changed in the future. E.g. we
- // might want to split all validators into non-intersecting
- // classes.
- const THashSet<TDynBitMap> &GetValidatorClasses() const;
-
-private:
- TValidatorsRegistry();
-
- void AddToValidatorClasses(IConfigValidator::TPtr validator);
- void RemoveFromValidatorClasses(IConfigValidator::TPtr validator);
-
- TValidators Validators;
- THashSet<TDynBitMap> ItemClasses;
- THashMap<TDynBitMap, TValidatorsSet> ValidatorsByItemClass;
-
- TAtomic Locked;
-
- static TMutex Mutex;
- static TPtr Instance_;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
+#pragma once
+
+#include "validator.h"
+
+#include <util/generic/bitmap.h>
+#include <util/system/mutex.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+class TValidatorsRegistry : public TThrRefBase {
+public:
+ using TPtr = TIntrusivePtr<TValidatorsRegistry>;
+ using TValidators = THashMap<TString, IConfigValidator::TPtr>;
+ using TValidatorsSet = THashSet<IConfigValidator::TPtr>;
+
+ static TPtr Instance();
+ // Drop is currently used by tests to re-initialize registry.
+ static void DropInstance();
+
+ bool AddValidator(IConfigValidator::TPtr validator);
+
+ // Don't allow to add any more validators.
+ void LockValidators();
+ bool IsLocked() const;
+
+ bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
+ const NKikimrConfig::TAppConfig &newConfig,
+ const TDynBitMap &validatorClass,
+ TVector<Ydb::Issue::IssueMessage> &issues) const;
+
+ bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
+ const NKikimrConfig::TAppConfig &newConfig,
+ TVector<Ydb::Issue::IssueMessage> &issues) const;
+
+ bool EnableValidator(const TString &name);
+ bool DisableValidator(const TString &name);
+ bool IsValidatorEnabled(const TString &name) const;
+
+ void EnableValidators();
+ void DisableValidators();
+
+ IConfigValidator::TPtr GetValidator(const TString &name) const;
+
+ const TValidators &GetValidators() const;
+
+ // All validators are split into classes. Each class corresponds
+ // to a set of checked config items. Config variations to check
+ // are examined within each class to reduce total number of
+ // variations to check. This method returns vector of such
+ // classes represented as a bitmap holding numbers of included
+ // item kinds. Empty bitmap corresponds to global validator
+ // covering all config items.
+ // Currently we don't merge validators for various kinds into
+ // single class but this can be changed in the future. E.g. we
+ // might want to split all validators into non-intersecting
+ // classes.
+ const THashSet<TDynBitMap> &GetValidatorClasses() const;
+
+private:
+ TValidatorsRegistry();
+
+ void AddToValidatorClasses(IConfigValidator::TPtr validator);
+ void RemoveFromValidatorClasses(IConfigValidator::TPtr validator);
+
+ TValidators Validators;
+ THashSet<TDynBitMap> ItemClasses;
+ THashMap<TDynBitMap, TValidatorsSet> ValidatorsByItemClass;
+
+ TAtomic Locked;
+
+ static TMutex Mutex;
+ static TPtr Instance_;
+};
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/registry_ut.cpp b/ydb/core/cms/console/validators/registry_ut.cpp
index 0e95a530a38..dade37b722c 100644
--- a/ydb/core/cms/console/validators/registry_ut.cpp
+++ b/ydb/core/cms/console/validators/registry_ut.cpp
@@ -1,269 +1,269 @@
-#include "registry.h"
-
+#include "registry.h"
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-namespace {
-
-class TTestValidator : public IConfigValidator {
-public:
- TTestValidator(const TString &name,
- THashSet<ui32> kinds)
- : IConfigValidator(name, kinds)
- , Counter(0)
- , Limit(Max<ui64>())
- {
- }
-
- TTestValidator(const TString &name,
- ui32 kind)
- : IConfigValidator(name, kind)
- , Counter(0)
- , Limit(Max<ui64>())
- {
- }
-
- TTestValidator(const TString &name)
- : IConfigValidator(name, THashSet<ui32>())
- , Counter(0)
- , Limit(Max<ui64>())
- {
- }
-
- ui64 GetCounter() const
- {
- return Counter;
- }
-
- bool CheckConfig(const NKikimrConfig::TAppConfig &newConfig,
- const NKikimrConfig::TAppConfig &oldConfig,
- TVector<Ydb::Issue::IssueMessage> &issues) const override
- {
- Y_UNUSED(oldConfig);
- Y_UNUSED(newConfig);
- Y_UNUSED(issues);
- ++Counter;
- return Counter <= Limit;
- }
-
- void SetLimit(ui64 limit)
- {
- Limit = limit;
- }
-
-private:
- mutable volatile ui64 Counter;
- ui64 Limit;
-};
-
-void CollectClasses(THashSet<TDynBitMap> &classes)
-{
- Y_UNUSED(classes);
-}
-
-template<typename ...Ts>
-void CollectClasses(THashSet<TDynBitMap> &classes,
- ui32 kind,
- Ts... args);
-template<typename ...Ts>
-void CollectClasses(THashSet<TDynBitMap> &classes,
- THashSet<ui32> kinds,
- Ts... args);
-
-template<typename ...Ts>
-void CollectClasses(THashSet<TDynBitMap> &classes,
- ui32 kind,
- Ts... args)
-{
- TDynBitMap kinds;
- kinds.Set(kind);
- classes.insert(kinds);
- CollectClasses(classes, args...);
-}
-
-template<typename ...Ts>
-void CollectClasses(THashSet<TDynBitMap> &classes,
- THashSet<ui32> kinds,
- Ts... args)
-{
- TDynBitMap map;
- for (auto kind : kinds)
- map.Set(kind);
- classes.insert(map);
- CollectClasses(classes, args...);
-}
-
-template<typename ...Ts>
-void CheckValidatorClasses(Ts... args)
-{
- THashSet<TDynBitMap> classes;
- CollectClasses(classes, args...);
-
- UNIT_ASSERT_VALUES_EQUAL(TValidatorsRegistry::Instance()->GetValidatorClasses().size(),
- classes.size());
- for (auto kinds : TValidatorsRegistry::Instance()->GetValidatorClasses()) {
+
+namespace NKikimr {
+namespace NConsole {
+
+namespace {
+
+class TTestValidator : public IConfigValidator {
+public:
+ TTestValidator(const TString &name,
+ THashSet<ui32> kinds)
+ : IConfigValidator(name, kinds)
+ , Counter(0)
+ , Limit(Max<ui64>())
+ {
+ }
+
+ TTestValidator(const TString &name,
+ ui32 kind)
+ : IConfigValidator(name, kind)
+ , Counter(0)
+ , Limit(Max<ui64>())
+ {
+ }
+
+ TTestValidator(const TString &name)
+ : IConfigValidator(name, THashSet<ui32>())
+ , Counter(0)
+ , Limit(Max<ui64>())
+ {
+ }
+
+ ui64 GetCounter() const
+ {
+ return Counter;
+ }
+
+ bool CheckConfig(const NKikimrConfig::TAppConfig &newConfig,
+ const NKikimrConfig::TAppConfig &oldConfig,
+ TVector<Ydb::Issue::IssueMessage> &issues) const override
+ {
+ Y_UNUSED(oldConfig);
+ Y_UNUSED(newConfig);
+ Y_UNUSED(issues);
+ ++Counter;
+ return Counter <= Limit;
+ }
+
+ void SetLimit(ui64 limit)
+ {
+ Limit = limit;
+ }
+
+private:
+ mutable volatile ui64 Counter;
+ ui64 Limit;
+};
+
+void CollectClasses(THashSet<TDynBitMap> &classes)
+{
+ Y_UNUSED(classes);
+}
+
+template<typename ...Ts>
+void CollectClasses(THashSet<TDynBitMap> &classes,
+ ui32 kind,
+ Ts... args);
+template<typename ...Ts>
+void CollectClasses(THashSet<TDynBitMap> &classes,
+ THashSet<ui32> kinds,
+ Ts... args);
+
+template<typename ...Ts>
+void CollectClasses(THashSet<TDynBitMap> &classes,
+ ui32 kind,
+ Ts... args)
+{
+ TDynBitMap kinds;
+ kinds.Set(kind);
+ classes.insert(kinds);
+ CollectClasses(classes, args...);
+}
+
+template<typename ...Ts>
+void CollectClasses(THashSet<TDynBitMap> &classes,
+ THashSet<ui32> kinds,
+ Ts... args)
+{
+ TDynBitMap map;
+ for (auto kind : kinds)
+ map.Set(kind);
+ classes.insert(map);
+ CollectClasses(classes, args...);
+}
+
+template<typename ...Ts>
+void CheckValidatorClasses(Ts... args)
+{
+ THashSet<TDynBitMap> classes;
+ CollectClasses(classes, args...);
+
+ UNIT_ASSERT_VALUES_EQUAL(TValidatorsRegistry::Instance()->GetValidatorClasses().size(),
+ classes.size());
+ for (auto kinds : TValidatorsRegistry::Instance()->GetValidatorClasses()) {
UNIT_ASSERT(classes.contains(kinds));
- }
-}
-
-} // anonymous namespace
-
-Y_UNIT_TEST_SUITE(TRegistryTests) {
- Y_UNIT_TEST(TestAddGet) {
- TValidatorsRegistry::DropInstance();
- auto registry = TValidatorsRegistry::Instance();
- UNIT_ASSERT(registry->AddValidator(new TTestValidator("test1", 1)));
- UNIT_ASSERT(registry->AddValidator(new TTestValidator("test2", 1)));
- UNIT_ASSERT(registry->AddValidator(new TTestValidator("test3", 1)));
- UNIT_ASSERT(!registry->AddValidator(new TTestValidator("test1", 1)));
-
- registry->LockValidators();
-
- UNIT_ASSERT(registry->GetValidator("test1"));
- UNIT_ASSERT(registry->GetValidator("test2"));
- UNIT_ASSERT(registry->GetValidator("test3"));
- UNIT_ASSERT(!registry->GetValidator("test4"));
- UNIT_ASSERT_VALUES_EQUAL(registry->GetValidators().size(), 3);
- }
-
- Y_UNIT_TEST(TestLock) {
- TValidatorsRegistry::DropInstance();
- auto registry = TValidatorsRegistry::Instance();
- UNIT_ASSERT(registry->AddValidator(new TTestValidator("test1", 1)));
- UNIT_ASSERT(!registry->IsLocked());
- registry->LockValidators();
- UNIT_ASSERT(!registry->AddValidator(new TTestValidator("test2", 1)));
- UNIT_ASSERT(registry->IsLocked());
- registry->LockValidators();
- UNIT_ASSERT(registry->IsLocked());
- }
-
- Y_UNIT_TEST(TestClasses) {
- TValidatorsRegistry::DropInstance();
- auto registry = TValidatorsRegistry::Instance();
- UNIT_ASSERT(registry->AddValidator(new TTestValidator("test1", 1)));
- UNIT_ASSERT(registry->AddValidator(new TTestValidator("test2", 1)));
- UNIT_ASSERT(registry->AddValidator(new TTestValidator("test3", 2)));
- UNIT_ASSERT(registry->AddValidator(new TTestValidator("test4")));
- UNIT_ASSERT(registry->AddValidator(new TTestValidator("test5", THashSet<ui32>({1, 2, 3}))));
- UNIT_ASSERT(registry->AddValidator(new TTestValidator("test6", THashSet<ui32>({1, 2, 3}))));
- registry->LockValidators();
-
- CheckValidatorClasses(1, 2, THashSet<ui32>(), THashSet<ui32>({1, 2, 3}));
-
- UNIT_ASSERT(registry->DisableValidator("test1"));
- UNIT_ASSERT(registry->DisableValidator("test5"));
-
- CheckValidatorClasses(1, 2, THashSet<ui32>(), THashSet<ui32>({1, 2, 3}));
-
- UNIT_ASSERT(registry->DisableValidator("test2"));
- UNIT_ASSERT(registry->DisableValidator("test6"));
-
- CheckValidatorClasses(2, THashSet<ui32>());
-
- UNIT_ASSERT(registry->EnableValidator("test6"));
-
- CheckValidatorClasses(2, THashSet<ui32>(), THashSet<ui32>({1, 2, 3}));
- }
-
- Y_UNIT_TEST(TestCheckConfig) {
- TValidatorsRegistry::DropInstance();
- auto registry = TValidatorsRegistry::Instance();
- TIntrusivePtr<TTestValidator> test1 = new TTestValidator("test1", 1);
- TIntrusivePtr<TTestValidator> test2 = new TTestValidator("test2", 1);
- TIntrusivePtr<TTestValidator> test3 = new TTestValidator("test3");
-
- UNIT_ASSERT(registry->AddValidator(test1));
- UNIT_ASSERT(registry->AddValidator(test2));
- UNIT_ASSERT(registry->AddValidator(test3));
-
- registry->LockValidators();
-
- TVector<Ydb::Issue::IssueMessage> issues;
- UNIT_ASSERT(registry->CheckConfig({}, {}, issues));
- UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 1);
- UNIT_ASSERT_VALUES_EQUAL(test2->GetCounter(), 1);
- UNIT_ASSERT_VALUES_EQUAL(test3->GetCounter(), 1);
-
- {
- TDynBitMap kinds;
- kinds.Set(1);
- UNIT_ASSERT(registry->CheckConfig({}, {}, kinds, issues));
- UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 2);
- UNIT_ASSERT_VALUES_EQUAL(test2->GetCounter(), 2);
- UNIT_ASSERT_VALUES_EQUAL(test3->GetCounter(), 1);
- }
-
- {
- TDynBitMap kinds;
- kinds.Set(2);
- UNIT_ASSERT(registry->CheckConfig({}, {}, kinds, issues));
- UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 2);
- UNIT_ASSERT_VALUES_EQUAL(test2->GetCounter(), 2);
- UNIT_ASSERT_VALUES_EQUAL(test3->GetCounter(), 1);
- }
-
- {
- TDynBitMap kinds;
- UNIT_ASSERT(registry->CheckConfig({}, {}, kinds, issues));
- UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 2);
- UNIT_ASSERT_VALUES_EQUAL(test2->GetCounter(), 2);
- UNIT_ASSERT_VALUES_EQUAL(test3->GetCounter(), 2);
- }
-
- test1->SetLimit(2);
- UNIT_ASSERT(!registry->CheckConfig({}, {}, issues));
- UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 3);
- {
- TDynBitMap kinds;
- kinds.Set(1);
- UNIT_ASSERT(!registry->CheckConfig({}, {}, kinds, issues));
- UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 4);
- }
- }
-
- Y_UNIT_TEST(TestDisableEnable) {
- TValidatorsRegistry::DropInstance();
- auto registry = TValidatorsRegistry::Instance();
- TIntrusivePtr<TTestValidator> test1 = new TTestValidator("test1", 1);
- TIntrusivePtr<TTestValidator> test2 = new TTestValidator("test2", 1);
-
- test1->SetLimit(0);
-
- UNIT_ASSERT(registry->AddValidator(test1));
- UNIT_ASSERT(registry->AddValidator(test2));
-
- registry->LockValidators();
-
- TVector<Ydb::Issue::IssueMessage> issues;
- UNIT_ASSERT(!registry->CheckConfig({}, {}, issues));
- UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 1);
-
- UNIT_ASSERT(registry->DisableValidator("test1"));
- UNIT_ASSERT(registry->DisableValidator("test1"));
- UNIT_ASSERT(!registry->DisableValidator("unknown"));
-
- UNIT_ASSERT(registry->CheckConfig({}, {}, issues));
- UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 1);
-
- UNIT_ASSERT(registry->EnableValidator("test1"));
- UNIT_ASSERT(registry->EnableValidator("test1"));
- UNIT_ASSERT(!registry->EnableValidator("unknown"));
-
- UNIT_ASSERT(!registry->CheckConfig({}, {}, issues));
- UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 2);
-
- registry->EnableValidators();
- UNIT_ASSERT(registry->IsValidatorEnabled("test1"));
- UNIT_ASSERT(registry->IsValidatorEnabled("test2"));
-
- registry->DisableValidators();
- UNIT_ASSERT(!registry->IsValidatorEnabled("test1"));
- UNIT_ASSERT(!registry->IsValidatorEnabled("test2"));
- }
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ }
+}
+
+} // anonymous namespace
+
+Y_UNIT_TEST_SUITE(TRegistryTests) {
+ Y_UNIT_TEST(TestAddGet) {
+ TValidatorsRegistry::DropInstance();
+ auto registry = TValidatorsRegistry::Instance();
+ UNIT_ASSERT(registry->AddValidator(new TTestValidator("test1", 1)));
+ UNIT_ASSERT(registry->AddValidator(new TTestValidator("test2", 1)));
+ UNIT_ASSERT(registry->AddValidator(new TTestValidator("test3", 1)));
+ UNIT_ASSERT(!registry->AddValidator(new TTestValidator("test1", 1)));
+
+ registry->LockValidators();
+
+ UNIT_ASSERT(registry->GetValidator("test1"));
+ UNIT_ASSERT(registry->GetValidator("test2"));
+ UNIT_ASSERT(registry->GetValidator("test3"));
+ UNIT_ASSERT(!registry->GetValidator("test4"));
+ UNIT_ASSERT_VALUES_EQUAL(registry->GetValidators().size(), 3);
+ }
+
+ Y_UNIT_TEST(TestLock) {
+ TValidatorsRegistry::DropInstance();
+ auto registry = TValidatorsRegistry::Instance();
+ UNIT_ASSERT(registry->AddValidator(new TTestValidator("test1", 1)));
+ UNIT_ASSERT(!registry->IsLocked());
+ registry->LockValidators();
+ UNIT_ASSERT(!registry->AddValidator(new TTestValidator("test2", 1)));
+ UNIT_ASSERT(registry->IsLocked());
+ registry->LockValidators();
+ UNIT_ASSERT(registry->IsLocked());
+ }
+
+ Y_UNIT_TEST(TestClasses) {
+ TValidatorsRegistry::DropInstance();
+ auto registry = TValidatorsRegistry::Instance();
+ UNIT_ASSERT(registry->AddValidator(new TTestValidator("test1", 1)));
+ UNIT_ASSERT(registry->AddValidator(new TTestValidator("test2", 1)));
+ UNIT_ASSERT(registry->AddValidator(new TTestValidator("test3", 2)));
+ UNIT_ASSERT(registry->AddValidator(new TTestValidator("test4")));
+ UNIT_ASSERT(registry->AddValidator(new TTestValidator("test5", THashSet<ui32>({1, 2, 3}))));
+ UNIT_ASSERT(registry->AddValidator(new TTestValidator("test6", THashSet<ui32>({1, 2, 3}))));
+ registry->LockValidators();
+
+ CheckValidatorClasses(1, 2, THashSet<ui32>(), THashSet<ui32>({1, 2, 3}));
+
+ UNIT_ASSERT(registry->DisableValidator("test1"));
+ UNIT_ASSERT(registry->DisableValidator("test5"));
+
+ CheckValidatorClasses(1, 2, THashSet<ui32>(), THashSet<ui32>({1, 2, 3}));
+
+ UNIT_ASSERT(registry->DisableValidator("test2"));
+ UNIT_ASSERT(registry->DisableValidator("test6"));
+
+ CheckValidatorClasses(2, THashSet<ui32>());
+
+ UNIT_ASSERT(registry->EnableValidator("test6"));
+
+ CheckValidatorClasses(2, THashSet<ui32>(), THashSet<ui32>({1, 2, 3}));
+ }
+
+ Y_UNIT_TEST(TestCheckConfig) {
+ TValidatorsRegistry::DropInstance();
+ auto registry = TValidatorsRegistry::Instance();
+ TIntrusivePtr<TTestValidator> test1 = new TTestValidator("test1", 1);
+ TIntrusivePtr<TTestValidator> test2 = new TTestValidator("test2", 1);
+ TIntrusivePtr<TTestValidator> test3 = new TTestValidator("test3");
+
+ UNIT_ASSERT(registry->AddValidator(test1));
+ UNIT_ASSERT(registry->AddValidator(test2));
+ UNIT_ASSERT(registry->AddValidator(test3));
+
+ registry->LockValidators();
+
+ TVector<Ydb::Issue::IssueMessage> issues;
+ UNIT_ASSERT(registry->CheckConfig({}, {}, issues));
+ UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(test2->GetCounter(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(test3->GetCounter(), 1);
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(1);
+ UNIT_ASSERT(registry->CheckConfig({}, {}, kinds, issues));
+ UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(test2->GetCounter(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(test3->GetCounter(), 1);
+ }
+
+ {
+ TDynBitMap kinds;
+ kinds.Set(2);
+ UNIT_ASSERT(registry->CheckConfig({}, {}, kinds, issues));
+ UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(test2->GetCounter(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(test3->GetCounter(), 1);
+ }
+
+ {
+ TDynBitMap kinds;
+ UNIT_ASSERT(registry->CheckConfig({}, {}, kinds, issues));
+ UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(test2->GetCounter(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(test3->GetCounter(), 2);
+ }
+
+ test1->SetLimit(2);
+ UNIT_ASSERT(!registry->CheckConfig({}, {}, issues));
+ UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 3);
+ {
+ TDynBitMap kinds;
+ kinds.Set(1);
+ UNIT_ASSERT(!registry->CheckConfig({}, {}, kinds, issues));
+ UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 4);
+ }
+ }
+
+ Y_UNIT_TEST(TestDisableEnable) {
+ TValidatorsRegistry::DropInstance();
+ auto registry = TValidatorsRegistry::Instance();
+ TIntrusivePtr<TTestValidator> test1 = new TTestValidator("test1", 1);
+ TIntrusivePtr<TTestValidator> test2 = new TTestValidator("test2", 1);
+
+ test1->SetLimit(0);
+
+ UNIT_ASSERT(registry->AddValidator(test1));
+ UNIT_ASSERT(registry->AddValidator(test2));
+
+ registry->LockValidators();
+
+ TVector<Ydb::Issue::IssueMessage> issues;
+ UNIT_ASSERT(!registry->CheckConfig({}, {}, issues));
+ UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 1);
+
+ UNIT_ASSERT(registry->DisableValidator("test1"));
+ UNIT_ASSERT(registry->DisableValidator("test1"));
+ UNIT_ASSERT(!registry->DisableValidator("unknown"));
+
+ UNIT_ASSERT(registry->CheckConfig({}, {}, issues));
+ UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 1);
+
+ UNIT_ASSERT(registry->EnableValidator("test1"));
+ UNIT_ASSERT(registry->EnableValidator("test1"));
+ UNIT_ASSERT(!registry->EnableValidator("unknown"));
+
+ UNIT_ASSERT(!registry->CheckConfig({}, {}, issues));
+ UNIT_ASSERT_VALUES_EQUAL(test1->GetCounter(), 2);
+
+ registry->EnableValidators();
+ UNIT_ASSERT(registry->IsValidatorEnabled("test1"));
+ UNIT_ASSERT(registry->IsValidatorEnabled("test2"));
+
+ registry->DisableValidators();
+ UNIT_ASSERT(!registry->IsValidatorEnabled("test1"));
+ UNIT_ASSERT(!registry->IsValidatorEnabled("test2"));
+ }
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/ut/ya.make b/ydb/core/cms/console/validators/ut/ya.make
index f329283962f..dfc239e3e54 100644
--- a/ydb/core/cms/console/validators/ut/ya.make
+++ b/ydb/core/cms/console/validators/ut/ya.make
@@ -1,21 +1,21 @@
UNITTEST_FOR(ydb/core/cms/console/validators)
-
-OWNER(ienkovich g:kikimr)
-
-FORK_SUBTESTS()
-
+
+OWNER(ienkovich g:kikimr)
+
+FORK_SUBTESTS()
+
TIMEOUT(600)
SIZE(MEDIUM)
-
-PEERDIR(
+
+PEERDIR(
library/cpp/testing/unittest
-)
-
-SRCS(
- registry_ut.cpp
- validator_bootstrap_ut.cpp
- validator_nameservice_ut.cpp
- validator_ut_common.h
-)
-
-END()
+)
+
+SRCS(
+ registry_ut.cpp
+ validator_bootstrap_ut.cpp
+ validator_nameservice_ut.cpp
+ validator_ut_common.h
+)
+
+END()
diff --git a/ydb/core/cms/console/validators/validator.cpp b/ydb/core/cms/console/validators/validator.cpp
index 09180ff92bd..36e31dd5d1f 100644
--- a/ydb/core/cms/console/validators/validator.cpp
+++ b/ydb/core/cms/console/validators/validator.cpp
@@ -1,15 +1,15 @@
-#include "validator.h"
-#include "registry.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-void RegisterValidator(IConfigValidator::TPtr validator)
-{
- auto res = TValidatorsRegistry::Instance()->AddValidator(validator);
- Y_VERIFY(res, "cannot register validator '%s' (locked=%" PRIu32 ")",
+#include "validator.h"
+#include "registry.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+void RegisterValidator(IConfigValidator::TPtr validator)
+{
+ auto res = TValidatorsRegistry::Instance()->AddValidator(validator);
+ Y_VERIFY(res, "cannot register validator '%s' (locked=%" PRIu32 ")",
validator->GetName().data(), (ui32)TValidatorsRegistry::Instance()->IsLocked());
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/validator.h b/ydb/core/cms/console/validators/validator.h
index 50dc00e9099..ffe52809fcb 100644
--- a/ydb/core/cms/console/validators/validator.h
+++ b/ydb/core/cms/console/validators/validator.h
@@ -1,127 +1,127 @@
-#pragma once
-
+#pragma once
+
#include <ydb/core/protos/config.pb.h>
#include <ydb/public/api/protos/ydb_issue_message.pb.h>
-
+
#include <ydb/library/yql/public/issue/protos/issue_severity.pb.h>
-
-#include <util/generic/hash_set.h>
-#include <util/generic/ptr.h>
-#include <util/generic/vector.h>
-#include <util/string/printf.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-// Base class for config validators. Validators are used
-// by CMS to check uploaded cluster configs.
-//
-// All validators should provide CheckConfig method
-// implementation. To become active validator should be
-// registered using RegisterValidator method.
-//
-// CheckConfig implementation should be thread-safe to
-// allow simultaneous validators usage from different
-// actors.
-class IConfigValidator : public TThrRefBase {
-public:
- using TPtr = TIntrusivePtr<IConfigValidator>;
-
- // Config item kinds set specifies which config items are checked by
- // validator. Modifications in other items will not trigger validator.
- // Empty set means all items are checked.
- IConfigValidator(const TString &name,
- THashSet<ui32> itemKinds)
- : Name(name)
- , CheckedConfigItemKinds(std::move(itemKinds))
- , Enabled(true)
- {
- }
-
- IConfigValidator(const TString &name,
- ui32 itemKind)
- : IConfigValidator(name, THashSet<ui32>({itemKind}))
- {
- }
-
- const TString &GetName() const
- {
- return Name;
- }
-
- const THashSet<ui32> GetCheckedConfigItemKinds() const
- {
- return CheckedConfigItemKinds;
- }
-
- void Enable()
- {
- Enabled = true;
- }
-
- void Disable()
- {
- Enabled = false;
- }
-
- bool IsEnabled() const
- {
- return Enabled;
- }
-
- virtual TString GetDescription() const
- {
- return GetName() + " configs validator";
- }
-
- // Return true if new config is OK, and false otherwise. Output issues
- // vector should be filled with appropriate error message(s) if false
- // is returned. Info and warning messages may be added to output
- // issues for both correct and incorrect configs.
- virtual bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
- const NKikimrConfig::TAppConfig &newConfig,
- TVector<Ydb::Issue::IssueMessage> &issues) const = 0;
-
-protected:
- void AddIssue(TVector<Ydb::Issue::IssueMessage> &issues,
- const TString &msg,
- ui32 severity = NYql::TSeverityIds::S_ERROR) const
- {
- Ydb::Issue::IssueMessage issue;
+
+#include <util/generic/hash_set.h>
+#include <util/generic/ptr.h>
+#include <util/generic/vector.h>
+#include <util/string/printf.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+// Base class for config validators. Validators are used
+// by CMS to check uploaded cluster configs.
+//
+// All validators should provide CheckConfig method
+// implementation. To become active validator should be
+// registered using RegisterValidator method.
+//
+// CheckConfig implementation should be thread-safe to
+// allow simultaneous validators usage from different
+// actors.
+class IConfigValidator : public TThrRefBase {
+public:
+ using TPtr = TIntrusivePtr<IConfigValidator>;
+
+ // Config item kinds set specifies which config items are checked by
+ // validator. Modifications in other items will not trigger validator.
+ // Empty set means all items are checked.
+ IConfigValidator(const TString &name,
+ THashSet<ui32> itemKinds)
+ : Name(name)
+ , CheckedConfigItemKinds(std::move(itemKinds))
+ , Enabled(true)
+ {
+ }
+
+ IConfigValidator(const TString &name,
+ ui32 itemKind)
+ : IConfigValidator(name, THashSet<ui32>({itemKind}))
+ {
+ }
+
+ const TString &GetName() const
+ {
+ return Name;
+ }
+
+ const THashSet<ui32> GetCheckedConfigItemKinds() const
+ {
+ return CheckedConfigItemKinds;
+ }
+
+ void Enable()
+ {
+ Enabled = true;
+ }
+
+ void Disable()
+ {
+ Enabled = false;
+ }
+
+ bool IsEnabled() const
+ {
+ return Enabled;
+ }
+
+ virtual TString GetDescription() const
+ {
+ return GetName() + " configs validator";
+ }
+
+ // Return true if new config is OK, and false otherwise. Output issues
+ // vector should be filled with appropriate error message(s) if false
+ // is returned. Info and warning messages may be added to output
+ // issues for both correct and incorrect configs.
+ virtual bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
+ const NKikimrConfig::TAppConfig &newConfig,
+ TVector<Ydb::Issue::IssueMessage> &issues) const = 0;
+
+protected:
+ void AddIssue(TVector<Ydb::Issue::IssueMessage> &issues,
+ const TString &msg,
+ ui32 severity = NYql::TSeverityIds::S_ERROR) const
+ {
+ Ydb::Issue::IssueMessage issue;
issue.set_message(Sprintf("%s validator: %s", Name.data(), msg.data()));
- issue.set_severity(severity);
- issues.push_back(issue);
- }
-
- void AddError(TVector<Ydb::Issue::IssueMessage> &issues,
- const TString &msg) const
- {
- AddIssue(issues, msg, NYql::TSeverityIds::S_ERROR);
- }
-
- void AddWarning(TVector<Ydb::Issue::IssueMessage> &issues,
- const TString &msg) const
- {
- AddIssue(issues, msg, NYql::TSeverityIds::S_WARNING);
- }
-
- void AddInfo(TVector<Ydb::Issue::IssueMessage> &issues,
- const TString &msg) const
- {
- AddIssue(issues, msg, NYql::TSeverityIds::S_INFO);
- }
-
-private:
- TString Name;
- THashSet<ui32> CheckedConfigItemKinds;
- bool Enabled;
-};
-
-// All validators should be registered before Console activation.
-// An attempt to register validator after Console activation will
-// cause a failure.
-// All registered validators should have unique names.
-void RegisterValidator(IConfigValidator::TPtr validator);
-
-} // namespace NConsole
-} // namespace NKikimr
+ issue.set_severity(severity);
+ issues.push_back(issue);
+ }
+
+ void AddError(TVector<Ydb::Issue::IssueMessage> &issues,
+ const TString &msg) const
+ {
+ AddIssue(issues, msg, NYql::TSeverityIds::S_ERROR);
+ }
+
+ void AddWarning(TVector<Ydb::Issue::IssueMessage> &issues,
+ const TString &msg) const
+ {
+ AddIssue(issues, msg, NYql::TSeverityIds::S_WARNING);
+ }
+
+ void AddInfo(TVector<Ydb::Issue::IssueMessage> &issues,
+ const TString &msg) const
+ {
+ AddIssue(issues, msg, NYql::TSeverityIds::S_INFO);
+ }
+
+private:
+ TString Name;
+ THashSet<ui32> CheckedConfigItemKinds;
+ bool Enabled;
+};
+
+// All validators should be registered before Console activation.
+// An attempt to register validator after Console activation will
+// cause a failure.
+// All registered validators should have unique names.
+void RegisterValidator(IConfigValidator::TPtr validator);
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/validator_bootstrap.cpp b/ydb/core/cms/console/validators/validator_bootstrap.cpp
index ab4674f305c..4732fa802a3 100644
--- a/ydb/core/cms/console/validators/validator_bootstrap.cpp
+++ b/ydb/core/cms/console/validators/validator_bootstrap.cpp
@@ -1,195 +1,195 @@
-#include "validator_bootstrap.h"
-
+#include "validator_bootstrap.h"
+
#include <ydb/core/base/localdb.h>
#include <ydb/core/protos/console_config.pb.h>
#include <ydb/core/tablet/resource_broker.h>
-
-#include <util/string/builder.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-TBootstrapConfigValidator::TBootstrapConfigValidator()
- : IConfigValidator("bootstrap",
- { (ui32)NKikimrConsole::TConfigItem::NameserviceConfigItem,
+
+#include <util/string/builder.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+TBootstrapConfigValidator::TBootstrapConfigValidator()
+ : IConfigValidator("bootstrap",
+ { (ui32)NKikimrConsole::TConfigItem::NameserviceConfigItem,
(ui32)NKikimrConsole::TConfigItem::BootstrapConfigItem,
(ui32)NKikimrConsole::TConfigItem::ResourceBrokerConfigItem, })
-{
-}
-
-TString TBootstrapConfigValidator::GetDescription() const
-{
- return "Check Resource Broker config and required system tablets.";
-}
-
-bool TBootstrapConfigValidator::CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
- const NKikimrConfig::TAppConfig &newConfig,
- TVector<Ydb::Issue::IssueMessage> &issues) const
-{
- Y_UNUSED(oldConfig);
-
- if (!oldConfig.HasBootstrapConfig() && !newConfig.HasBootstrapConfig())
- return true;
-
- if (!newConfig.HasBootstrapConfig()) {
- AddError(issues, "missing bootstrap config");
- return false;
- }
-
- if (!CheckTablets(newConfig, issues))
- return false;
-
- if (!CheckResourceBrokerConfig(newConfig, issues))
- return false;
-
+{
+}
+
+TString TBootstrapConfigValidator::GetDescription() const
+{
+ return "Check Resource Broker config and required system tablets.";
+}
+
+bool TBootstrapConfigValidator::CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
+ const NKikimrConfig::TAppConfig &newConfig,
+ TVector<Ydb::Issue::IssueMessage> &issues) const
+{
+ Y_UNUSED(oldConfig);
+
+ if (!oldConfig.HasBootstrapConfig() && !newConfig.HasBootstrapConfig())
+ return true;
+
+ if (!newConfig.HasBootstrapConfig()) {
+ AddError(issues, "missing bootstrap config");
+ return false;
+ }
+
+ if (!CheckTablets(newConfig, issues))
+ return false;
+
+ if (!CheckResourceBrokerConfig(newConfig, issues))
+ return false;
+
if (!CheckResourceBrokerOverrides(newConfig, issues))
return false;
- if (newConfig.GetBootstrapConfig().HasCompactionBroker()) {
- AddError(issues, "deprecated compaction broker config is used");
- return false;
- }
-
- return true;
-}
-
-bool TBootstrapConfigValidator::CheckTablets(const NKikimrConfig::TAppConfig &config,
- TVector<Ydb::Issue::IssueMessage> &issues) const
-{
- THashSet<NKikimrConfig::TBootstrap::ETabletType> requiredTablets = {
- NKikimrConfig::TBootstrap::FLAT_BS_CONTROLLER,
- NKikimrConfig::TBootstrap::FLAT_SCHEMESHARD,
- NKikimrConfig::TBootstrap::FLAT_TX_COORDINATOR,
- NKikimrConfig::TBootstrap::TX_MEDIATOR,
- NKikimrConfig::TBootstrap::TX_ALLOCATOR,
- NKikimrConfig::TBootstrap::CONSOLE
- };
- THashSet<NKikimrConfig::TBootstrap::ETabletType> importantTablets = {
- NKikimrConfig::TBootstrap::CMS,
- NKikimrConfig::TBootstrap::NODE_BROKER,
- NKikimrConfig::TBootstrap::TENANT_SLOT_BROKER,
- };
-
- auto &cfg = config.GetBootstrapConfig();
- auto &nsCfg = config.GetNameserviceConfig();
- THashSet<ui32> nodeIds;
-
- for (auto &node : nsCfg.GetNode())
- nodeIds.insert(node.GetNodeId());
-
- for (auto &tablet : cfg.GetTablet()) {
- auto type = tablet.GetType();
-
- requiredTablets.erase(type);
- importantTablets.erase(type);
-
- for (auto id : tablet.GetNode()) {
- if (!nodeIds.contains(id)) {
- AddError(issues,
- TStringBuilder() << "Missing node " << id
- << " is used for tablet " << type);
- return false;
- }
- }
-
- if (!tablet.NodeSize()) {
- AddError(issues,
- TStringBuilder() << "Empty nodes list for tablet " << type);
- return false;
- }
- }
-
- if (!requiredTablets.empty()) {
- for (auto type : requiredTablets)
- AddError(issues, TStringBuilder() << "Missing required tablet " << type);
- return false;
- }
-
- for (auto type : importantTablets)
- AddWarning(issues, TStringBuilder() << "Missing important tablet " << type);
-
- return true;
-}
-
-bool TBootstrapConfigValidator::CheckResourceBrokerConfig(const NKikimrConfig::TAppConfig &config,
- TVector<Ydb::Issue::IssueMessage> &issues) const
-{
- if (!config.GetBootstrapConfig().HasResourceBroker())
- return true;
-
- auto &cfg = config.GetBootstrapConfig().GetResourceBroker();
-
- THashSet<TString> queues;
- for (auto &queue : cfg.GetQueues()) {
- if (!queue.GetName()) {
- AddError(issues, "queue with empty name is not allowed");
- return false;
- }
+ if (newConfig.GetBootstrapConfig().HasCompactionBroker()) {
+ AddError(issues, "deprecated compaction broker config is used");
+ return false;
+ }
+
+ return true;
+}
+
+bool TBootstrapConfigValidator::CheckTablets(const NKikimrConfig::TAppConfig &config,
+ TVector<Ydb::Issue::IssueMessage> &issues) const
+{
+ THashSet<NKikimrConfig::TBootstrap::ETabletType> requiredTablets = {
+ NKikimrConfig::TBootstrap::FLAT_BS_CONTROLLER,
+ NKikimrConfig::TBootstrap::FLAT_SCHEMESHARD,
+ NKikimrConfig::TBootstrap::FLAT_TX_COORDINATOR,
+ NKikimrConfig::TBootstrap::TX_MEDIATOR,
+ NKikimrConfig::TBootstrap::TX_ALLOCATOR,
+ NKikimrConfig::TBootstrap::CONSOLE
+ };
+ THashSet<NKikimrConfig::TBootstrap::ETabletType> importantTablets = {
+ NKikimrConfig::TBootstrap::CMS,
+ NKikimrConfig::TBootstrap::NODE_BROKER,
+ NKikimrConfig::TBootstrap::TENANT_SLOT_BROKER,
+ };
+
+ auto &cfg = config.GetBootstrapConfig();
+ auto &nsCfg = config.GetNameserviceConfig();
+ THashSet<ui32> nodeIds;
+
+ for (auto &node : nsCfg.GetNode())
+ nodeIds.insert(node.GetNodeId());
+
+ for (auto &tablet : cfg.GetTablet()) {
+ auto type = tablet.GetType();
+
+ requiredTablets.erase(type);
+ importantTablets.erase(type);
+
+ for (auto id : tablet.GetNode()) {
+ if (!nodeIds.contains(id)) {
+ AddError(issues,
+ TStringBuilder() << "Missing node " << id
+ << " is used for tablet " << type);
+ return false;
+ }
+ }
+
+ if (!tablet.NodeSize()) {
+ AddError(issues,
+ TStringBuilder() << "Empty nodes list for tablet " << type);
+ return false;
+ }
+ }
+
+ if (!requiredTablets.empty()) {
+ for (auto type : requiredTablets)
+ AddError(issues, TStringBuilder() << "Missing required tablet " << type);
+ return false;
+ }
+
+ for (auto type : importantTablets)
+ AddWarning(issues, TStringBuilder() << "Missing important tablet " << type);
+
+ return true;
+}
+
+bool TBootstrapConfigValidator::CheckResourceBrokerConfig(const NKikimrConfig::TAppConfig &config,
+ TVector<Ydb::Issue::IssueMessage> &issues) const
+{
+ if (!config.GetBootstrapConfig().HasResourceBroker())
+ return true;
+
+ auto &cfg = config.GetBootstrapConfig().GetResourceBroker();
+
+ THashSet<TString> queues;
+ for (auto &queue : cfg.GetQueues()) {
+ if (!queue.GetName()) {
+ AddError(issues, "queue with empty name is not allowed");
+ return false;
+ }
if (queues.contains(queue.GetName())) {
- AddError(issues, Sprintf("multiple queues with '%s' name",
+ AddError(issues, Sprintf("multiple queues with '%s' name",
queue.GetName().data()));
- return false;
- }
- if (!queue.GetWeight()) {
- AddError(issues, Sprintf("queue '%s' should have non-zero weight",
+ return false;
+ }
+ if (!queue.GetWeight()) {
+ AddError(issues, Sprintf("queue '%s' should have non-zero weight",
queue.GetName().data()));
- return false;
- }
- if (IsUnlimitedResource(queue.GetLimit())) {
- AddWarning(issues, Sprintf("unlimited resources for queue '%s'",
- queue.GetName().data()));
- }
- queues.insert(queue.GetName());
- }
-
- THashSet<TString> tasks;
- THashSet<TString> unusedQueues = queues;
- for (auto &task : cfg.GetTasks()) {
- if (!task.GetName()) {
- AddError(issues, "task with empty name is not allowed");
- return false;
- }
+ return false;
+ }
+ if (IsUnlimitedResource(queue.GetLimit())) {
+ AddWarning(issues, Sprintf("unlimited resources for queue '%s'",
+ queue.GetName().data()));
+ }
+ queues.insert(queue.GetName());
+ }
+
+ THashSet<TString> tasks;
+ THashSet<TString> unusedQueues = queues;
+ for (auto &task : cfg.GetTasks()) {
+ if (!task.GetName()) {
+ AddError(issues, "task with empty name is not allowed");
+ return false;
+ }
if (tasks.contains(task.GetName())) {
- AddError(issues, Sprintf("multiple tasks with '%s' name",
+ AddError(issues, Sprintf("multiple tasks with '%s' name",
task.GetName().data()));
- return false;
- }
+ return false;
+ }
if (!queues.contains(task.GetQueueName())) {
- AddError(issues, Sprintf("task '%s' uses unknown queue '%s'",
+ AddError(issues, Sprintf("task '%s' uses unknown queue '%s'",
task.GetName().data(), task.GetQueueName().data()));
- return false;
- }
- if (!task.GetDefaultDuration()) {
- AddError(issues, Sprintf("task '%s' should have non-zero default duration",
+ return false;
+ }
+ if (!task.GetDefaultDuration()) {
+ AddError(issues, Sprintf("task '%s' should have non-zero default duration",
task.GetName().data()));
- return false;
- }
- tasks.insert(task.GetName());
- unusedQueues.erase(task.GetQueueName());
- }
-
+ return false;
+ }
+ tasks.insert(task.GetName());
+ unusedQueues.erase(task.GetQueueName());
+ }
+
if (!queues.contains(NLocalDb::DefaultQueueName)) {
- AddError(issues, Sprintf("config should have '%s' queue defined",
+ AddError(issues, Sprintf("config should have '%s' queue defined",
NLocalDb::DefaultQueueName.data()));
- return false;
- }
+ return false;
+ }
if (!tasks.contains(NLocalDb::UnknownTaskName)) {
- AddError(issues, Sprintf("config should have '%s' task defined",
+ AddError(issues, Sprintf("config should have '%s' task defined",
NLocalDb::UnknownTaskName.data()));
- return false;
- }
-
- for (auto &queue : unusedQueues) {
- if (queue != NLocalDb::DefaultQueueName)
- AddWarning(issues, Sprintf("queue '%s' is not used by any task", queue.data()));
- }
-
- if (IsUnlimitedResource(cfg.GetResourceLimit()))
- AddWarning(issues, "unlimited total resources");
-
- return true;
-}
-
+ return false;
+ }
+
+ for (auto &queue : unusedQueues) {
+ if (queue != NLocalDb::DefaultQueueName)
+ AddWarning(issues, Sprintf("queue '%s' is not used by any task", queue.data()));
+ }
+
+ if (IsUnlimitedResource(cfg.GetResourceLimit()))
+ AddWarning(issues, "unlimited total resources");
+
+ return true;
+}
+
bool TBootstrapConfigValidator::CheckResourceBrokerOverrides(
const NKikimrConfig::TAppConfig &config,
TVector<Ydb::Issue::IssueMessage> &issues) const
@@ -264,18 +264,18 @@ bool TBootstrapConfigValidator::CheckResourceBrokerOverrides(
return true;
}
-bool TBootstrapConfigValidator::IsUnlimitedResource(const NKikimrResourceBroker::TResources &limit) const
-{
- for (auto res : limit.GetResource()) {
+bool TBootstrapConfigValidator::IsUnlimitedResource(const NKikimrResourceBroker::TResources &limit) const
+{
+ for (auto res : limit.GetResource()) {
if (res > 0 && res < Max<ui64>())
- return false;
- }
+ return false;
+ }
if (limit.HasCpu() && limit.GetCpu() < Max<ui64>())
return false;
if (limit.HasMemory() && limit.GetMemory() < Max<ui64>())
return false;
- return true;
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ return true;
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/validator_bootstrap.h b/ydb/core/cms/console/validators/validator_bootstrap.h
index fa11a0d0803..0b1b668ceba 100644
--- a/ydb/core/cms/console/validators/validator_bootstrap.h
+++ b/ydb/core/cms/console/validators/validator_bootstrap.h
@@ -1,28 +1,28 @@
-#pragma once
-
-#include "validator.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TBootstrapConfigValidator : public IConfigValidator {
-public:
- TBootstrapConfigValidator();
-
- TString GetDescription() const override;
- bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
- const NKikimrConfig::TAppConfig &newConfig,
- TVector<Ydb::Issue::IssueMessage> &issues) const override;
-
-private:
- bool CheckTablets(const NKikimrConfig::TAppConfig &config,
- TVector<Ydb::Issue::IssueMessage> &issues) const;
- bool CheckResourceBrokerConfig(const NKikimrConfig::TAppConfig &config,
- TVector<Ydb::Issue::IssueMessage> &issues) const;
+#pragma once
+
+#include "validator.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TBootstrapConfigValidator : public IConfigValidator {
+public:
+ TBootstrapConfigValidator();
+
+ TString GetDescription() const override;
+ bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
+ const NKikimrConfig::TAppConfig &newConfig,
+ TVector<Ydb::Issue::IssueMessage> &issues) const override;
+
+private:
+ bool CheckTablets(const NKikimrConfig::TAppConfig &config,
+ TVector<Ydb::Issue::IssueMessage> &issues) const;
+ bool CheckResourceBrokerConfig(const NKikimrConfig::TAppConfig &config,
+ TVector<Ydb::Issue::IssueMessage> &issues) const;
bool CheckResourceBrokerOverrides(const NKikimrConfig::TAppConfig &config,
TVector<Ydb::Issue::IssueMessage> &issues) const;
- bool IsUnlimitedResource(const NKikimrResourceBroker::TResources &limit) const;
-};
-
-} // namespace NConsole
-} // namespace NKikimr
+ bool IsUnlimitedResource(const NKikimrResourceBroker::TResources &limit) const;
+};
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/validator_bootstrap_ut.cpp b/ydb/core/cms/console/validators/validator_bootstrap_ut.cpp
index f4225ba2088..24f0045e46f 100644
--- a/ydb/core/cms/console/validators/validator_bootstrap_ut.cpp
+++ b/ydb/core/cms/console/validators/validator_bootstrap_ut.cpp
@@ -1,171 +1,171 @@
-#include "validator_bootstrap.h"
-#include "validator_ut_common.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-using namespace NTests;
-
-namespace {
-
-void CheckConfig(const NKikimrConfig::TBootstrap &config,
- bool result,
- ui32 warnings = 0)
-{
- NKikimrConfig::TAppConfig cfg;
- cfg.MutableBootstrapConfig()->CopyFrom(config);
- cfg.MutableNameserviceConfig()->CopyFrom(MakeDefaultNameserviceConfig());
- NTests::CheckConfig<TBootstrapConfigValidator>(cfg, result, warnings);
-}
-
-void CheckConfig(const NKikimrResourceBroker::TResourceBrokerConfig &config,
- bool result,
- ui32 warnings = 0)
-{
- NKikimrConfig::TBootstrap cfg = MakeDefaultBootstrapConfig();
- cfg.MutableResourceBroker()->CopyFrom(config);
- CheckConfig(cfg, result, warnings);
-}
-
-} // anonymous namespace
-
-Y_UNIT_TEST_SUITE(ResourceBrokerConfigValidatorTests) {
- Y_UNIT_TEST(TestEmptyConfig) {
- TBootstrapConfigValidator validator;
- TVector<Ydb::Issue::IssueMessage> issues;
- UNIT_ASSERT(validator.CheckConfig({}, {}, issues));
- }
-
- Y_UNIT_TEST(TestMinConfig) {
- CheckConfig(MakeDefaultResourceBrokerConfig(), true);
- }
-
- Y_UNIT_TEST(TestEmptyQueueName) {
- auto config = MakeDefaultResourceBrokerConfig();
- AddQueue("", 100, {1}, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestZeroQueueWeight) {
- auto config = MakeDefaultResourceBrokerConfig();
- AddQueue("queue", 0, {1}, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestRepeatedQueueName) {
- auto config = MakeDefaultResourceBrokerConfig();
- AddQueue("queue", 100, {1}, config);
- AddQueue("queue", 100, {1}, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestEmptyTaskName) {
- auto config = MakeDefaultResourceBrokerConfig();
- AddTask("", "queue_default", 10000000, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestRepeatedTaskName) {
- auto config = MakeDefaultResourceBrokerConfig();
- AddTask("task", "queue_default", 10000000, config);
- AddTask("task", "queue_default", 10000000, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestZeroDefaultDuration) {
- auto config = MakeDefaultResourceBrokerConfig();
- AddTask("task", "queue_default", 0, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestUnknownQueue) {
- auto config = MakeDefaultResourceBrokerConfig();
- AddTask("task", "queue_unknown", 0, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestNoDefaultQueue) {
- NKikimrResourceBroker::TResourceBrokerConfig config;
- AddQueue("queue1", 100, {1}, config);
- AddTask(NLocalDb::UnknownTaskName, "queue1", 0, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestNoUnknownTask) {
- NKikimrResourceBroker::TResourceBrokerConfig config;
- AddQueue(NLocalDb::DefaultQueueName, 100, {1}, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestUnlimitedResource) {
- NKikimrResourceBroker::TResourceBrokerConfig config;
- AddQueue(NLocalDb::DefaultQueueName, 100, {}, config);
- AddTask(NLocalDb::UnknownTaskName, NLocalDb::DefaultQueueName, 10000000, config);
- config.MutableResourceLimit();
- CheckConfig(config, true, 2);
- }
-
- Y_UNIT_TEST(TestUnusedQueue) {
- auto config = MakeDefaultResourceBrokerConfig();
- AddQueue("queue1", 100, {1}, config);
- CheckConfig(config, true, 1);
- }
-}
-
-Y_UNIT_TEST_SUITE(BootstrapTabletsValidatorTests) {
- Y_UNIT_TEST(TestUnknownNodeForTablet) {
- auto config = MakeDefaultBootstrapConfig();
- config.MutableCompactionBroker();
- AddTablet(NKikimrConfig::TBootstrap::TX_MEDIATOR, {1, 5}, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestNoNodeForTablet) {
- auto config = MakeDefaultBootstrapConfig();
- config.MutableCompactionBroker();
- AddTablet(NKikimrConfig::TBootstrap::TX_MEDIATOR, {}, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestRequiredTablet) {
- auto config = MakeDefaultBootstrapConfig();
- RemoveTablet(NKikimrConfig::TBootstrap::FLAT_BS_CONTROLLER, config);
- CheckConfig(config, false);
- config = MakeDefaultBootstrapConfig();
- RemoveTablet(NKikimrConfig::TBootstrap::FLAT_SCHEMESHARD, config);
- CheckConfig(config, false);
- config = MakeDefaultBootstrapConfig();
- RemoveTablet(NKikimrConfig::TBootstrap::FLAT_TX_COORDINATOR, config);
- CheckConfig(config, false);
- config = MakeDefaultBootstrapConfig();
- RemoveTablet(NKikimrConfig::TBootstrap::TX_MEDIATOR, config);
- CheckConfig(config, false);
- config = MakeDefaultBootstrapConfig();
- RemoveTablet(NKikimrConfig::TBootstrap::TX_ALLOCATOR, config);
- CheckConfig(config, false);
- config = MakeDefaultBootstrapConfig();
- RemoveTablet(NKikimrConfig::TBootstrap::CONSOLE, config);
- CheckConfig(config, false);
- }
-
- Y_UNIT_TEST(TestImportantTablet) {
- auto config = MakeDefaultBootstrapConfig();
- RemoveTablet(NKikimrConfig::TBootstrap::CMS, config);
- CheckConfig(config, true, 1);
- config = MakeDefaultBootstrapConfig();
- RemoveTablet(NKikimrConfig::TBootstrap::NODE_BROKER, config);
- CheckConfig(config, true, 1);
- config = MakeDefaultBootstrapConfig();
- RemoveTablet(NKikimrConfig::TBootstrap::TENANT_SLOT_BROKER, config);
- CheckConfig(config, true, 1);
- }
-
- Y_UNIT_TEST(TestCompactionBroker) {
- auto config = MakeDefaultBootstrapConfig();
- config.MutableCompactionBroker();
- CheckConfig(config, false);
- }
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+#include "validator_bootstrap.h"
+#include "validator_ut_common.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+using namespace NTests;
+
+namespace {
+
+void CheckConfig(const NKikimrConfig::TBootstrap &config,
+ bool result,
+ ui32 warnings = 0)
+{
+ NKikimrConfig::TAppConfig cfg;
+ cfg.MutableBootstrapConfig()->CopyFrom(config);
+ cfg.MutableNameserviceConfig()->CopyFrom(MakeDefaultNameserviceConfig());
+ NTests::CheckConfig<TBootstrapConfigValidator>(cfg, result, warnings);
+}
+
+void CheckConfig(const NKikimrResourceBroker::TResourceBrokerConfig &config,
+ bool result,
+ ui32 warnings = 0)
+{
+ NKikimrConfig::TBootstrap cfg = MakeDefaultBootstrapConfig();
+ cfg.MutableResourceBroker()->CopyFrom(config);
+ CheckConfig(cfg, result, warnings);
+}
+
+} // anonymous namespace
+
+Y_UNIT_TEST_SUITE(ResourceBrokerConfigValidatorTests) {
+ Y_UNIT_TEST(TestEmptyConfig) {
+ TBootstrapConfigValidator validator;
+ TVector<Ydb::Issue::IssueMessage> issues;
+ UNIT_ASSERT(validator.CheckConfig({}, {}, issues));
+ }
+
+ Y_UNIT_TEST(TestMinConfig) {
+ CheckConfig(MakeDefaultResourceBrokerConfig(), true);
+ }
+
+ Y_UNIT_TEST(TestEmptyQueueName) {
+ auto config = MakeDefaultResourceBrokerConfig();
+ AddQueue("", 100, {1}, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestZeroQueueWeight) {
+ auto config = MakeDefaultResourceBrokerConfig();
+ AddQueue("queue", 0, {1}, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestRepeatedQueueName) {
+ auto config = MakeDefaultResourceBrokerConfig();
+ AddQueue("queue", 100, {1}, config);
+ AddQueue("queue", 100, {1}, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestEmptyTaskName) {
+ auto config = MakeDefaultResourceBrokerConfig();
+ AddTask("", "queue_default", 10000000, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestRepeatedTaskName) {
+ auto config = MakeDefaultResourceBrokerConfig();
+ AddTask("task", "queue_default", 10000000, config);
+ AddTask("task", "queue_default", 10000000, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestZeroDefaultDuration) {
+ auto config = MakeDefaultResourceBrokerConfig();
+ AddTask("task", "queue_default", 0, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestUnknownQueue) {
+ auto config = MakeDefaultResourceBrokerConfig();
+ AddTask("task", "queue_unknown", 0, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestNoDefaultQueue) {
+ NKikimrResourceBroker::TResourceBrokerConfig config;
+ AddQueue("queue1", 100, {1}, config);
+ AddTask(NLocalDb::UnknownTaskName, "queue1", 0, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestNoUnknownTask) {
+ NKikimrResourceBroker::TResourceBrokerConfig config;
+ AddQueue(NLocalDb::DefaultQueueName, 100, {1}, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestUnlimitedResource) {
+ NKikimrResourceBroker::TResourceBrokerConfig config;
+ AddQueue(NLocalDb::DefaultQueueName, 100, {}, config);
+ AddTask(NLocalDb::UnknownTaskName, NLocalDb::DefaultQueueName, 10000000, config);
+ config.MutableResourceLimit();
+ CheckConfig(config, true, 2);
+ }
+
+ Y_UNIT_TEST(TestUnusedQueue) {
+ auto config = MakeDefaultResourceBrokerConfig();
+ AddQueue("queue1", 100, {1}, config);
+ CheckConfig(config, true, 1);
+ }
+}
+
+Y_UNIT_TEST_SUITE(BootstrapTabletsValidatorTests) {
+ Y_UNIT_TEST(TestUnknownNodeForTablet) {
+ auto config = MakeDefaultBootstrapConfig();
+ config.MutableCompactionBroker();
+ AddTablet(NKikimrConfig::TBootstrap::TX_MEDIATOR, {1, 5}, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestNoNodeForTablet) {
+ auto config = MakeDefaultBootstrapConfig();
+ config.MutableCompactionBroker();
+ AddTablet(NKikimrConfig::TBootstrap::TX_MEDIATOR, {}, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestRequiredTablet) {
+ auto config = MakeDefaultBootstrapConfig();
+ RemoveTablet(NKikimrConfig::TBootstrap::FLAT_BS_CONTROLLER, config);
+ CheckConfig(config, false);
+ config = MakeDefaultBootstrapConfig();
+ RemoveTablet(NKikimrConfig::TBootstrap::FLAT_SCHEMESHARD, config);
+ CheckConfig(config, false);
+ config = MakeDefaultBootstrapConfig();
+ RemoveTablet(NKikimrConfig::TBootstrap::FLAT_TX_COORDINATOR, config);
+ CheckConfig(config, false);
+ config = MakeDefaultBootstrapConfig();
+ RemoveTablet(NKikimrConfig::TBootstrap::TX_MEDIATOR, config);
+ CheckConfig(config, false);
+ config = MakeDefaultBootstrapConfig();
+ RemoveTablet(NKikimrConfig::TBootstrap::TX_ALLOCATOR, config);
+ CheckConfig(config, false);
+ config = MakeDefaultBootstrapConfig();
+ RemoveTablet(NKikimrConfig::TBootstrap::CONSOLE, config);
+ CheckConfig(config, false);
+ }
+
+ Y_UNIT_TEST(TestImportantTablet) {
+ auto config = MakeDefaultBootstrapConfig();
+ RemoveTablet(NKikimrConfig::TBootstrap::CMS, config);
+ CheckConfig(config, true, 1);
+ config = MakeDefaultBootstrapConfig();
+ RemoveTablet(NKikimrConfig::TBootstrap::NODE_BROKER, config);
+ CheckConfig(config, true, 1);
+ config = MakeDefaultBootstrapConfig();
+ RemoveTablet(NKikimrConfig::TBootstrap::TENANT_SLOT_BROKER, config);
+ CheckConfig(config, true, 1);
+ }
+
+ Y_UNIT_TEST(TestCompactionBroker) {
+ auto config = MakeDefaultBootstrapConfig();
+ config.MutableCompactionBroker();
+ CheckConfig(config, false);
+ }
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/validator_nameservice.cpp b/ydb/core/cms/console/validators/validator_nameservice.cpp
index 7f00eae4fb7..0867be38132 100644
--- a/ydb/core/cms/console/validators/validator_nameservice.cpp
+++ b/ydb/core/cms/console/validators/validator_nameservice.cpp
@@ -1,173 +1,173 @@
-#include "validator_nameservice.h"
-
+#include "validator_nameservice.h"
+
#include <ydb/core/base/localdb.h>
#include <ydb/core/protos/console_config.pb.h>
-
+
#include <library/cpp/actors/interconnect/interconnect.h>
-
-#include <util/string/builder.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-TNameserviceConfigValidator::TNameserviceConfigValidator()
- : IConfigValidator("nameservice", NKikimrConsole::TConfigItem::NameserviceConfigItem)
-{
-}
-
-TString TNameserviceConfigValidator::GetDescription() const
-{
- return "Check Nameservice config for consistency and suspicious modifications";
-}
-
-bool TNameserviceConfigValidator::CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
- const NKikimrConfig::TAppConfig &newConfig,
- TVector<Ydb::Issue::IssueMessage> &issues) const
-{
- if (!oldConfig.HasNameserviceConfig() && !newConfig.HasNameserviceConfig())
- return true;
-
- if (!newConfig.HasNameserviceConfig()) {
- AddError(issues, "missing nameservice config");
- return false;
- }
-
- THashMap<ui32, TTableNameserverSetup::TNodeInfo> idMap;
- THashMap<std::pair<TString, ui16>, ui32> hostMap;
- THashMap<std::pair<TString, ui16>, ui32> ihostMap;
- THashMap<std::pair<TString, ui16>, ui32> addrMap;
-
- for (auto &node : newConfig.GetNameserviceConfig().GetNode()) {
- ui32 id = node.GetNodeId();
- TString host = node.GetHost();
- TString ihost = node.GetInterconnectHost();
- TString addr = node.GetAddress();
- ui16 port = node.GetPort();
-
- if (idMap.contains(id)) {
- AddError(issues,
- TStringBuilder() << "duplicating node id " << id);
- return false;
- }
-
- auto hostPort = std::make_pair(host, port);
- if (hostMap.contains(hostPort)) {
- AddError(issues,
- TStringBuilder() << "duplicating " << host << ":" << port
- << " for nodes " << hostMap.at(hostPort) << " and " << id);
- return false;
- }
-
- auto ihostPort = std::make_pair(ihost, port);
- if (ihostMap.contains(ihostPort)) {
- AddError(issues,
- TStringBuilder() << "duplicating " << ihost << ":" << port
- << " for nodes " << ihostMap.at(ihostPort) << " and " << id);
- return false;
- }
-
- auto addrPort = std::make_pair(addr, port);
+
+#include <util/string/builder.h>
+
+namespace NKikimr {
+namespace NConsole {
+
+TNameserviceConfigValidator::TNameserviceConfigValidator()
+ : IConfigValidator("nameservice", NKikimrConsole::TConfigItem::NameserviceConfigItem)
+{
+}
+
+TString TNameserviceConfigValidator::GetDescription() const
+{
+ return "Check Nameservice config for consistency and suspicious modifications";
+}
+
+bool TNameserviceConfigValidator::CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
+ const NKikimrConfig::TAppConfig &newConfig,
+ TVector<Ydb::Issue::IssueMessage> &issues) const
+{
+ if (!oldConfig.HasNameserviceConfig() && !newConfig.HasNameserviceConfig())
+ return true;
+
+ if (!newConfig.HasNameserviceConfig()) {
+ AddError(issues, "missing nameservice config");
+ return false;
+ }
+
+ THashMap<ui32, TTableNameserverSetup::TNodeInfo> idMap;
+ THashMap<std::pair<TString, ui16>, ui32> hostMap;
+ THashMap<std::pair<TString, ui16>, ui32> ihostMap;
+ THashMap<std::pair<TString, ui16>, ui32> addrMap;
+
+ for (auto &node : newConfig.GetNameserviceConfig().GetNode()) {
+ ui32 id = node.GetNodeId();
+ TString host = node.GetHost();
+ TString ihost = node.GetInterconnectHost();
+ TString addr = node.GetAddress();
+ ui16 port = node.GetPort();
+
+ if (idMap.contains(id)) {
+ AddError(issues,
+ TStringBuilder() << "duplicating node id " << id);
+ return false;
+ }
+
+ auto hostPort = std::make_pair(host, port);
+ if (hostMap.contains(hostPort)) {
+ AddError(issues,
+ TStringBuilder() << "duplicating " << host << ":" << port
+ << " for nodes " << hostMap.at(hostPort) << " and " << id);
+ return false;
+ }
+
+ auto ihostPort = std::make_pair(ihost, port);
+ if (ihostMap.contains(ihostPort)) {
+ AddError(issues,
+ TStringBuilder() << "duplicating " << ihost << ":" << port
+ << " for nodes " << ihostMap.at(ihostPort) << " and " << id);
+ return false;
+ }
+
+ auto addrPort = std::make_pair(addr, port);
// do not validate for duplicates if addr is empty
if (addr && addrMap.contains(addrPort)) {
- AddError(issues,
- TStringBuilder() << "duplicating " << addr << ":" << port
- << " for nodes " << addrMap.at(addrPort) << " and " << id);
- return false;
- }
-
- if (node.GetWalleLocation().GetDataCenter().size() > 4) {
- AddError(issues,
- TStringBuilder() << "node " << id << " has data center in"
- << " Wall-E location longer than 4 symbols");
- return false;
- }
-
- idMap.emplace(id, TTableNameserverSetup::TNodeInfo(addr, host, ihost, port, {}));
- hostMap.emplace(hostPort, id);
- ihostMap.emplace(ihostPort, id);
+ AddError(issues,
+ TStringBuilder() << "duplicating " << addr << ":" << port
+ << " for nodes " << addrMap.at(addrPort) << " and " << id);
+ return false;
+ }
+
+ if (node.GetWalleLocation().GetDataCenter().size() > 4) {
+ AddError(issues,
+ TStringBuilder() << "node " << id << " has data center in"
+ << " Wall-E location longer than 4 symbols");
+ return false;
+ }
+
+ idMap.emplace(id, TTableNameserverSetup::TNodeInfo(addr, host, ihost, port, {}));
+ hostMap.emplace(hostPort, id);
+ ihostMap.emplace(ihostPort, id);
if (addr) {
addrMap.emplace(addrPort, id);
}
- }
-
- if (idMap.empty()) {
- AddError(issues, "config should have at least 1 node");
- return false;
- }
-
- if (oldConfig.HasNameserviceConfig()) {
- if (oldConfig.GetNameserviceConfig().GetClusterUUID()
- != newConfig.GetNameserviceConfig().GetClusterUUID()) {
- AddError(issues, "cannot modify cluster UUID");
- return false;
- }
-
- size_t prevTotal = oldConfig.GetNameserviceConfig().NodeSize();
- size_t removed = prevTotal;
- for (auto &node : oldConfig.GetNameserviceConfig().GetNode()) {
- ui32 id = node.GetNodeId();
- TString host = node.GetHost();
- TString ihost = node.GetInterconnectHost();
- TString addr = node.GetAddress();
- ui16 port = node.GetPort();
-
- auto hostPort = std::make_pair(host, port);
- if (hostMap.contains(hostPort) && hostMap.at(hostPort) != id) {
- AddError(issues,
- TStringBuilder() << "modified id for " << host << ":" << port
- << " from " << id << " to " << hostMap.at(hostPort));
- return false;
- }
-
- auto ihostPort = std::make_pair(ihost, port);
- if (ihostMap.contains(ihostPort) && ihostMap.at(ihostPort) != id) {
- AddError(issues,
- TStringBuilder() << "modified id for " << ihost << ":" << port
- << " from " << id << " to " << ihostMap.at(ihostPort));
- return false;
- }
-
- auto addrPort = std::make_pair(addr, port);
+ }
+
+ if (idMap.empty()) {
+ AddError(issues, "config should have at least 1 node");
+ return false;
+ }
+
+ if (oldConfig.HasNameserviceConfig()) {
+ if (oldConfig.GetNameserviceConfig().GetClusterUUID()
+ != newConfig.GetNameserviceConfig().GetClusterUUID()) {
+ AddError(issues, "cannot modify cluster UUID");
+ return false;
+ }
+
+ size_t prevTotal = oldConfig.GetNameserviceConfig().NodeSize();
+ size_t removed = prevTotal;
+ for (auto &node : oldConfig.GetNameserviceConfig().GetNode()) {
+ ui32 id = node.GetNodeId();
+ TString host = node.GetHost();
+ TString ihost = node.GetInterconnectHost();
+ TString addr = node.GetAddress();
+ ui16 port = node.GetPort();
+
+ auto hostPort = std::make_pair(host, port);
+ if (hostMap.contains(hostPort) && hostMap.at(hostPort) != id) {
+ AddError(issues,
+ TStringBuilder() << "modified id for " << host << ":" << port
+ << " from " << id << " to " << hostMap.at(hostPort));
+ return false;
+ }
+
+ auto ihostPort = std::make_pair(ihost, port);
+ if (ihostMap.contains(ihostPort) && ihostMap.at(ihostPort) != id) {
+ AddError(issues,
+ TStringBuilder() << "modified id for " << ihost << ":" << port
+ << " from " << id << " to " << ihostMap.at(ihostPort));
+ return false;
+ }
+
+ auto addrPort = std::make_pair(addr, port);
if (addr && addrMap.contains(addrPort) && addrMap.at(addrPort) != id) {
- AddError(issues,
- TStringBuilder() << "modified id for " << addr << ":" << port
- << " from " << id << " to " << addrMap.at(addrPort));
- return false;
- }
-
- if (idMap.contains(id)) {
- auto &info = idMap.at(id);
- if (info.Host != host) {
- AddWarning(issues,
- TStringBuilder() << "modified host for node " << id
- << " from " << host << " to " << info.Host);
- }
-
- if (info.ResolveHost != ihost) {
- AddWarning(issues,
- TStringBuilder() << "modified resolve host for node "
- << id << " from " << ihost << " to " << info.ResolveHost);
- }
-
- if (info.Port != port) {
- AddWarning(issues,
- TStringBuilder() << "modified port for node "
- << id << " from " << port << " to " << info.Port);
- }
-
- --removed;
- }
- }
-
- if (removed > Max<size_t>(prevTotal / 2, 1)) {
- AddWarning(issues,
- TStringBuilder() << "suspiciously large number of removed nodes ("
- << removed << " of " << prevTotal << ")");
- }
- }
-
- return true;
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+ AddError(issues,
+ TStringBuilder() << "modified id for " << addr << ":" << port
+ << " from " << id << " to " << addrMap.at(addrPort));
+ return false;
+ }
+
+ if (idMap.contains(id)) {
+ auto &info = idMap.at(id);
+ if (info.Host != host) {
+ AddWarning(issues,
+ TStringBuilder() << "modified host for node " << id
+ << " from " << host << " to " << info.Host);
+ }
+
+ if (info.ResolveHost != ihost) {
+ AddWarning(issues,
+ TStringBuilder() << "modified resolve host for node "
+ << id << " from " << ihost << " to " << info.ResolveHost);
+ }
+
+ if (info.Port != port) {
+ AddWarning(issues,
+ TStringBuilder() << "modified port for node "
+ << id << " from " << port << " to " << info.Port);
+ }
+
+ --removed;
+ }
+ }
+
+ if (removed > Max<size_t>(prevTotal / 2, 1)) {
+ AddWarning(issues,
+ TStringBuilder() << "suspiciously large number of removed nodes ("
+ << removed << " of " << prevTotal << ")");
+ }
+ }
+
+ return true;
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/validator_nameservice.h b/ydb/core/cms/console/validators/validator_nameservice.h
index a750201e720..d10cda0dfe7 100644
--- a/ydb/core/cms/console/validators/validator_nameservice.h
+++ b/ydb/core/cms/console/validators/validator_nameservice.h
@@ -1,21 +1,21 @@
-#pragma once
-
-#include "validator.h"
-
-namespace NKikimr {
-namespace NConsole {
-
-class TNameserviceConfigValidator : public IConfigValidator {
-public:
- TNameserviceConfigValidator();
-
- TString GetDescription() const override;
- bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
- const NKikimrConfig::TAppConfig &newConfig,
- TVector<Ydb::Issue::IssueMessage> &issues) const override;
-
-private:
-};
-
-} // namespace NConsole
-} // namespace NKikimr
+#pragma once
+
+#include "validator.h"
+
+namespace NKikimr {
+namespace NConsole {
+
+class TNameserviceConfigValidator : public IConfigValidator {
+public:
+ TNameserviceConfigValidator();
+
+ TString GetDescription() const override;
+ bool CheckConfig(const NKikimrConfig::TAppConfig &oldConfig,
+ const NKikimrConfig::TAppConfig &newConfig,
+ TVector<Ydb::Issue::IssueMessage> &issues) const override;
+
+private:
+};
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/validator_nameservice_ut.cpp b/ydb/core/cms/console/validators/validator_nameservice_ut.cpp
index 1a29178ff92..939e3fe7f34 100644
--- a/ydb/core/cms/console/validators/validator_nameservice_ut.cpp
+++ b/ydb/core/cms/console/validators/validator_nameservice_ut.cpp
@@ -1,153 +1,153 @@
-#include "validator_nameservice.h"
-#include "validator_ut_common.h"
-
+#include "validator_nameservice.h"
+#include "validator_ut_common.h"
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace NKikimr {
-namespace NConsole {
-
-using namespace NTests;
-
-namespace {
-
-void CheckConfig(const NKikimrConfig::TStaticNameserviceConfig &oldConfig,
- const NKikimrConfig::TStaticNameserviceConfig &newConfig,
- bool result,
- ui32 warnings = 0)
-{
- NKikimrConfig::TAppConfig oldCfg;
- oldCfg.MutableNameserviceConfig()->CopyFrom(oldConfig);
- NKikimrConfig::TAppConfig newCfg;
- newCfg.MutableNameserviceConfig()->CopyFrom(newConfig);
- NTests::CheckConfig<TNameserviceConfigValidator>(oldCfg, newCfg, result, warnings);
-}
-
-void CheckConfig(const NKikimrConfig::TStaticNameserviceConfig &config,
- bool result,
- ui32 warnings = 0)
-{
- CheckConfig({}, config, result, warnings);
-}
-
-} // anonymous namespace
-
-Y_UNIT_TEST_SUITE(NameserviceConfigValidatorTests) {
- Y_UNIT_TEST(TestEmptyConfig) {
- CheckConfig({}, false);
- }
-
- Y_UNIT_TEST(TestAddNewNode) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- AddNode(5, "host5", 105, "rhost5", "addr5", "dc1", newCfg);
- AddNode(6, "host1", 102, "rhost3", "addr4", "dc1", newCfg);
- CheckConfig(oldCfg, newCfg, true);
- }
-
- Y_UNIT_TEST(TestDuplicatingId) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- AddNode(1, "host5", 105, "rhost5", "addr5", "dc1", newCfg);
- CheckConfig(oldCfg, newCfg, false);
- }
-
- Y_UNIT_TEST(TestDuplicatingHostPort) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- AddNode(5, "host1", 101, "rhost5", "addr5", "dc1", newCfg);
- CheckConfig(oldCfg, newCfg, false);
- }
-
- Y_UNIT_TEST(TestDuplicatingResolveHostPort) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- AddNode(5, "host5", 101, "rhost1", "addr5", "dc1", newCfg);
- CheckConfig(oldCfg, newCfg, false);
- }
-
- Y_UNIT_TEST(TestDuplicatingAddrPort) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- AddNode(5, "host5", 101, "rhost5", "addr1", "dc1", newCfg);
- CheckConfig(oldCfg, newCfg, false);
- }
-
- Y_UNIT_TEST(TestLongWalleDC) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- UpdateNode(1, "host1", 101, "rhost1", "addr1", "dc11", newCfg);
- CheckConfig(oldCfg, newCfg, true);
- UpdateNode(1, "host1", 101, "rhost1", "addr1", "dc111", newCfg);
- CheckConfig(oldCfg, newCfg, false);
- }
-
- Y_UNIT_TEST(TestModifyClusterUUID) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- newCfg.SetClusterUUID("cluster_uuid_2");
- CheckConfig(oldCfg, newCfg, false);
- }
-
- Y_UNIT_TEST(TestModifyIdForHostPort) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- RemoveNode(1, newCfg);
- AddNode(5, "host1", 101, "rhost5", "addr5", "dc1", newCfg);
- CheckConfig(oldCfg, newCfg, false);
- }
-
- Y_UNIT_TEST(TestModifyIdForResolveHostPort) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- RemoveNode(1, newCfg);
- AddNode(5, "host5", 101, "rhost1", "addr5", "dc1", newCfg);
- CheckConfig(oldCfg, newCfg, false);
- }
-
- Y_UNIT_TEST(TestModifyIdForAddrPort) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- RemoveNode(1, newCfg);
- AddNode(5, "host5", 101, "rhost5", "addr1", "dc1", newCfg);
- CheckConfig(oldCfg, newCfg, false);
- }
-
- Y_UNIT_TEST(TestModifyHost) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- UpdateNode(1, "host5", 101, "rhost1", "addr1", "dc1", newCfg);
- CheckConfig(oldCfg, newCfg, true, 1);
- }
-
- Y_UNIT_TEST(TestModifyResolveHost) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- UpdateNode(1, "host1", 101, "rhost5", "addr1", "dc1", newCfg);
- CheckConfig(oldCfg, newCfg, true, 1);
- }
-
- Y_UNIT_TEST(TestModifyPort) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- UpdateNode(1, "host1", 105, "rhost1", "addr1", "dc1", newCfg);
- CheckConfig(oldCfg, newCfg, true, 1);
- }
-
-
- Y_UNIT_TEST(TestRemoveTooMany) {
- NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
- NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
- RemoveNode(1, newCfg);
- CheckConfig(oldCfg, newCfg, true);
- RemoveNode(2, newCfg);
- CheckConfig(oldCfg, newCfg, true);
- RemoveNode(3, newCfg);
- CheckConfig(oldCfg, newCfg, true, 1);
- RemoveNode(1, oldCfg);
- CheckConfig(oldCfg, newCfg, true, 1);
- RemoveNode(2, oldCfg);
- CheckConfig(oldCfg, newCfg, true);
- }
+
+namespace NKikimr {
+namespace NConsole {
+
+using namespace NTests;
+
+namespace {
+
+void CheckConfig(const NKikimrConfig::TStaticNameserviceConfig &oldConfig,
+ const NKikimrConfig::TStaticNameserviceConfig &newConfig,
+ bool result,
+ ui32 warnings = 0)
+{
+ NKikimrConfig::TAppConfig oldCfg;
+ oldCfg.MutableNameserviceConfig()->CopyFrom(oldConfig);
+ NKikimrConfig::TAppConfig newCfg;
+ newCfg.MutableNameserviceConfig()->CopyFrom(newConfig);
+ NTests::CheckConfig<TNameserviceConfigValidator>(oldCfg, newCfg, result, warnings);
+}
+
+void CheckConfig(const NKikimrConfig::TStaticNameserviceConfig &config,
+ bool result,
+ ui32 warnings = 0)
+{
+ CheckConfig({}, config, result, warnings);
+}
+
+} // anonymous namespace
+
+Y_UNIT_TEST_SUITE(NameserviceConfigValidatorTests) {
+ Y_UNIT_TEST(TestEmptyConfig) {
+ CheckConfig({}, false);
+ }
+
+ Y_UNIT_TEST(TestAddNewNode) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ AddNode(5, "host5", 105, "rhost5", "addr5", "dc1", newCfg);
+ AddNode(6, "host1", 102, "rhost3", "addr4", "dc1", newCfg);
+ CheckConfig(oldCfg, newCfg, true);
+ }
+
+ Y_UNIT_TEST(TestDuplicatingId) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ AddNode(1, "host5", 105, "rhost5", "addr5", "dc1", newCfg);
+ CheckConfig(oldCfg, newCfg, false);
+ }
+
+ Y_UNIT_TEST(TestDuplicatingHostPort) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ AddNode(5, "host1", 101, "rhost5", "addr5", "dc1", newCfg);
+ CheckConfig(oldCfg, newCfg, false);
+ }
+
+ Y_UNIT_TEST(TestDuplicatingResolveHostPort) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ AddNode(5, "host5", 101, "rhost1", "addr5", "dc1", newCfg);
+ CheckConfig(oldCfg, newCfg, false);
+ }
+
+ Y_UNIT_TEST(TestDuplicatingAddrPort) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ AddNode(5, "host5", 101, "rhost5", "addr1", "dc1", newCfg);
+ CheckConfig(oldCfg, newCfg, false);
+ }
+
+ Y_UNIT_TEST(TestLongWalleDC) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ UpdateNode(1, "host1", 101, "rhost1", "addr1", "dc11", newCfg);
+ CheckConfig(oldCfg, newCfg, true);
+ UpdateNode(1, "host1", 101, "rhost1", "addr1", "dc111", newCfg);
+ CheckConfig(oldCfg, newCfg, false);
+ }
+
+ Y_UNIT_TEST(TestModifyClusterUUID) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ newCfg.SetClusterUUID("cluster_uuid_2");
+ CheckConfig(oldCfg, newCfg, false);
+ }
+
+ Y_UNIT_TEST(TestModifyIdForHostPort) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ RemoveNode(1, newCfg);
+ AddNode(5, "host1", 101, "rhost5", "addr5", "dc1", newCfg);
+ CheckConfig(oldCfg, newCfg, false);
+ }
+
+ Y_UNIT_TEST(TestModifyIdForResolveHostPort) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ RemoveNode(1, newCfg);
+ AddNode(5, "host5", 101, "rhost1", "addr5", "dc1", newCfg);
+ CheckConfig(oldCfg, newCfg, false);
+ }
+
+ Y_UNIT_TEST(TestModifyIdForAddrPort) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ RemoveNode(1, newCfg);
+ AddNode(5, "host5", 101, "rhost5", "addr1", "dc1", newCfg);
+ CheckConfig(oldCfg, newCfg, false);
+ }
+
+ Y_UNIT_TEST(TestModifyHost) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ UpdateNode(1, "host5", 101, "rhost1", "addr1", "dc1", newCfg);
+ CheckConfig(oldCfg, newCfg, true, 1);
+ }
+
+ Y_UNIT_TEST(TestModifyResolveHost) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ UpdateNode(1, "host1", 101, "rhost5", "addr1", "dc1", newCfg);
+ CheckConfig(oldCfg, newCfg, true, 1);
+ }
+
+ Y_UNIT_TEST(TestModifyPort) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ UpdateNode(1, "host1", 105, "rhost1", "addr1", "dc1", newCfg);
+ CheckConfig(oldCfg, newCfg, true, 1);
+ }
+
+
+ Y_UNIT_TEST(TestRemoveTooMany) {
+ NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
+ NKikimrConfig::TStaticNameserviceConfig newCfg = MakeDefaultNameserviceConfig();
+ RemoveNode(1, newCfg);
+ CheckConfig(oldCfg, newCfg, true);
+ RemoveNode(2, newCfg);
+ CheckConfig(oldCfg, newCfg, true);
+ RemoveNode(3, newCfg);
+ CheckConfig(oldCfg, newCfg, true, 1);
+ RemoveNode(1, oldCfg);
+ CheckConfig(oldCfg, newCfg, true, 1);
+ RemoveNode(2, oldCfg);
+ CheckConfig(oldCfg, newCfg, true);
+ }
Y_UNIT_TEST(TestEmptyAddresses) {
NKikimrConfig::TStaticNameserviceConfig oldCfg = MakeDefaultNameserviceConfig();
@@ -160,7 +160,7 @@ Y_UNIT_TEST_SUITE(NameserviceConfigValidatorTests) {
AddNode(8, "host8", 19001, "rhost8", "", "dc1", newCfg);
CheckConfig(midCfg, newCfg, true);
}
-}
-
-} // namespace NConsole
-} // namespace NKikimr
+}
+
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/validator_ut_common.h b/ydb/core/cms/console/validators/validator_ut_common.h
index ea0afb35793..416b6f8dff7 100644
--- a/ydb/core/cms/console/validators/validator_ut_common.h
+++ b/ydb/core/cms/console/validators/validator_ut_common.h
@@ -1,168 +1,168 @@
-#pragma once
-
-#include "validator.h"
-
+#pragma once
+
+#include "validator.h"
+
#include <ydb/core/base/localdb.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace NKikimr {
-namespace NConsole {
-namespace NTests {
-
-inline void RemoveNode(ui32 id,
- NKikimrConfig::TStaticNameserviceConfig &config)
-{
- for (size_t i = 0; i < config.NodeSize(); ++i) {
- if (config.GetNode(i).GetNodeId() == id) {
- config.MutableNode()->DeleteSubrange(i, 1);
- break;
- }
- }
-}
-
-inline void AddNode(ui32 id,
- const TString &host,
- ui16 port,
- const TString &resolveHost,
- const TString &addr,
- const TString &dc,
- NKikimrConfig::TStaticNameserviceConfig &config)
-{
- auto &node = *config.AddNode();
- node.SetNodeId(id);
- node.SetAddress(addr);
- node.SetPort(port);
- node.SetHost(host);
- node.SetInterconnectHost(resolveHost);
- if (dc)
- node.MutableWalleLocation()->SetDataCenter(dc);
-}
-
-inline void UpdateNode(ui32 id,
- const TString &host,
- ui16 port,
- const TString &resolveHost,
- const TString &addr,
- const TString &dc,
- NKikimrConfig::TStaticNameserviceConfig &config)
-{
- RemoveNode(id, config);
- AddNode(id, host, port, resolveHost, addr, dc, config);
-}
-
-inline NKikimrConfig::TStaticNameserviceConfig MakeDefaultNameserviceConfig()
-{
- NKikimrConfig::TStaticNameserviceConfig res;
- AddNode(1, "host1", 101, "rhost1", "addr1", "dc1", res);
- AddNode(2, "host2", 102, "rhost2", "addr2", "dc1", res);
- AddNode(3, "host3", 103, "rhost3", "addr3", "dc1", res);
- AddNode(4, "host4", 104, "rhost4", "addr4", "dc1", res);
- res.SetClusterUUID("cluster_uuid_1");
- return res;
-}
-
-inline void AddQueue(const TString &name,
- ui32 weight,
- TVector<ui64> limits,
- NKikimrResourceBroker::TResourceBrokerConfig &config)
-{
- auto queue = config.AddQueues();
- queue->SetName(name);
- queue->SetWeight(weight);
- for (auto limit : limits)
- queue->MutableLimit()->AddResource(limit);
-}
-
-inline void AddTask(const TString &name,
- const TString &queue,
- ui64 defaultDuration,
- NKikimrResourceBroker::TResourceBrokerConfig &config)
-{
- auto task = config.AddTasks();
- task->SetName(name);
- task->SetQueueName(queue);
- task->SetDefaultDuration(defaultDuration);
-}
-
-inline NKikimrResourceBroker::TResourceBrokerConfig MakeDefaultResourceBrokerConfig()
-{
- NKikimrResourceBroker::TResourceBrokerConfig res;
- AddQueue(NLocalDb::DefaultQueueName, 100, {1}, res);
- AddTask(NLocalDb::UnknownTaskName, NLocalDb::DefaultQueueName, 10000000, res);
- res.MutableResourceLimit()->AddResource(100);
- return res;
-}
-
-inline void AddTablet(NKikimrConfig::TBootstrap::ETabletType type,
- const TVector<ui32> &nodes,
- NKikimrConfig::TBootstrap &config)
-{
- auto &tablet = *config.AddTablet();
- tablet.SetType(type);
- for (ui32 node : nodes)
- tablet.AddNode(node);
-}
-
-inline void RemoveTablet(NKikimrConfig::TBootstrap::ETabletType type,
- NKikimrConfig::TBootstrap &config)
-{
- for (size_t i = 0; i < config.TabletSize(); ++i) {
- if (config.GetTablet(i).GetType() == type) {
- config.MutableTablet()->DeleteSubrange(i, 1);
- break;
- }
- }
-}
-
-inline NKikimrConfig::TBootstrap MakeDefaultBootstrapConfig()
-{
- NKikimrConfig::TBootstrap res;
- res.MutableResourceBroker()->CopyFrom(MakeDefaultResourceBrokerConfig());
- AddTablet(NKikimrConfig::TBootstrap::FLAT_BS_CONTROLLER, {1, 2}, res);
- AddTablet(NKikimrConfig::TBootstrap::FLAT_SCHEMESHARD, {1, 2}, res);
- AddTablet(NKikimrConfig::TBootstrap::FLAT_TX_COORDINATOR, {1, 2}, res);
- AddTablet(NKikimrConfig::TBootstrap::TX_MEDIATOR, {1, 2}, res);
- AddTablet(NKikimrConfig::TBootstrap::TX_ALLOCATOR, {1, 2}, res);
- AddTablet(NKikimrConfig::TBootstrap::CONSOLE, {1, 2}, res);
- AddTablet(NKikimrConfig::TBootstrap::CMS, {1, 2}, res);
- AddTablet(NKikimrConfig::TBootstrap::NODE_BROKER, {1, 2}, res);
- AddTablet(NKikimrConfig::TBootstrap::TENANT_SLOT_BROKER, {1, 2}, res);
- return res;
-}
-
-template <typename TValidator>
-void CheckConfig(const NKikimrConfig::TAppConfig &oldCfg,
- const NKikimrConfig::TAppConfig &newCfg,
- bool result,
- ui32 warnings)
-{
- TValidator validator;
- TVector<Ydb::Issue::IssueMessage> issues;
- if (validator.CheckConfig(oldCfg, newCfg, issues) != result) {
- for (auto &issue : issues)
- Cerr << issue.DebugString();
- UNIT_FAIL("wrong check result");
- }
- for (auto &issue : issues) {
- if (issue.severity() == NYql::TSeverityIds::S_WARNING)
- --warnings;
- }
- if (warnings) {
- for (auto &issue : issues)
- Cerr << issue.DebugString();
- UNIT_ASSERT_VALUES_EQUAL(warnings, 0);
- }
-}
-
-template <typename TValidator>
-void CheckConfig(const NKikimrConfig::TAppConfig &config,
- bool result,
- ui32 warnings)
-{
- CheckConfig<TValidator>({}, config, result, warnings);
-}
-
-} // namespace NTests
-} // namespace NConsole
-} // namespace NKikimr
+
+namespace NKikimr {
+namespace NConsole {
+namespace NTests {
+
+inline void RemoveNode(ui32 id,
+ NKikimrConfig::TStaticNameserviceConfig &config)
+{
+ for (size_t i = 0; i < config.NodeSize(); ++i) {
+ if (config.GetNode(i).GetNodeId() == id) {
+ config.MutableNode()->DeleteSubrange(i, 1);
+ break;
+ }
+ }
+}
+
+inline void AddNode(ui32 id,
+ const TString &host,
+ ui16 port,
+ const TString &resolveHost,
+ const TString &addr,
+ const TString &dc,
+ NKikimrConfig::TStaticNameserviceConfig &config)
+{
+ auto &node = *config.AddNode();
+ node.SetNodeId(id);
+ node.SetAddress(addr);
+ node.SetPort(port);
+ node.SetHost(host);
+ node.SetInterconnectHost(resolveHost);
+ if (dc)
+ node.MutableWalleLocation()->SetDataCenter(dc);
+}
+
+inline void UpdateNode(ui32 id,
+ const TString &host,
+ ui16 port,
+ const TString &resolveHost,
+ const TString &addr,
+ const TString &dc,
+ NKikimrConfig::TStaticNameserviceConfig &config)
+{
+ RemoveNode(id, config);
+ AddNode(id, host, port, resolveHost, addr, dc, config);
+}
+
+inline NKikimrConfig::TStaticNameserviceConfig MakeDefaultNameserviceConfig()
+{
+ NKikimrConfig::TStaticNameserviceConfig res;
+ AddNode(1, "host1", 101, "rhost1", "addr1", "dc1", res);
+ AddNode(2, "host2", 102, "rhost2", "addr2", "dc1", res);
+ AddNode(3, "host3", 103, "rhost3", "addr3", "dc1", res);
+ AddNode(4, "host4", 104, "rhost4", "addr4", "dc1", res);
+ res.SetClusterUUID("cluster_uuid_1");
+ return res;
+}
+
+inline void AddQueue(const TString &name,
+ ui32 weight,
+ TVector<ui64> limits,
+ NKikimrResourceBroker::TResourceBrokerConfig &config)
+{
+ auto queue = config.AddQueues();
+ queue->SetName(name);
+ queue->SetWeight(weight);
+ for (auto limit : limits)
+ queue->MutableLimit()->AddResource(limit);
+}
+
+inline void AddTask(const TString &name,
+ const TString &queue,
+ ui64 defaultDuration,
+ NKikimrResourceBroker::TResourceBrokerConfig &config)
+{
+ auto task = config.AddTasks();
+ task->SetName(name);
+ task->SetQueueName(queue);
+ task->SetDefaultDuration(defaultDuration);
+}
+
+inline NKikimrResourceBroker::TResourceBrokerConfig MakeDefaultResourceBrokerConfig()
+{
+ NKikimrResourceBroker::TResourceBrokerConfig res;
+ AddQueue(NLocalDb::DefaultQueueName, 100, {1}, res);
+ AddTask(NLocalDb::UnknownTaskName, NLocalDb::DefaultQueueName, 10000000, res);
+ res.MutableResourceLimit()->AddResource(100);
+ return res;
+}
+
+inline void AddTablet(NKikimrConfig::TBootstrap::ETabletType type,
+ const TVector<ui32> &nodes,
+ NKikimrConfig::TBootstrap &config)
+{
+ auto &tablet = *config.AddTablet();
+ tablet.SetType(type);
+ for (ui32 node : nodes)
+ tablet.AddNode(node);
+}
+
+inline void RemoveTablet(NKikimrConfig::TBootstrap::ETabletType type,
+ NKikimrConfig::TBootstrap &config)
+{
+ for (size_t i = 0; i < config.TabletSize(); ++i) {
+ if (config.GetTablet(i).GetType() == type) {
+ config.MutableTablet()->DeleteSubrange(i, 1);
+ break;
+ }
+ }
+}
+
+inline NKikimrConfig::TBootstrap MakeDefaultBootstrapConfig()
+{
+ NKikimrConfig::TBootstrap res;
+ res.MutableResourceBroker()->CopyFrom(MakeDefaultResourceBrokerConfig());
+ AddTablet(NKikimrConfig::TBootstrap::FLAT_BS_CONTROLLER, {1, 2}, res);
+ AddTablet(NKikimrConfig::TBootstrap::FLAT_SCHEMESHARD, {1, 2}, res);
+ AddTablet(NKikimrConfig::TBootstrap::FLAT_TX_COORDINATOR, {1, 2}, res);
+ AddTablet(NKikimrConfig::TBootstrap::TX_MEDIATOR, {1, 2}, res);
+ AddTablet(NKikimrConfig::TBootstrap::TX_ALLOCATOR, {1, 2}, res);
+ AddTablet(NKikimrConfig::TBootstrap::CONSOLE, {1, 2}, res);
+ AddTablet(NKikimrConfig::TBootstrap::CMS, {1, 2}, res);
+ AddTablet(NKikimrConfig::TBootstrap::NODE_BROKER, {1, 2}, res);
+ AddTablet(NKikimrConfig::TBootstrap::TENANT_SLOT_BROKER, {1, 2}, res);
+ return res;
+}
+
+template <typename TValidator>
+void CheckConfig(const NKikimrConfig::TAppConfig &oldCfg,
+ const NKikimrConfig::TAppConfig &newCfg,
+ bool result,
+ ui32 warnings)
+{
+ TValidator validator;
+ TVector<Ydb::Issue::IssueMessage> issues;
+ if (validator.CheckConfig(oldCfg, newCfg, issues) != result) {
+ for (auto &issue : issues)
+ Cerr << issue.DebugString();
+ UNIT_FAIL("wrong check result");
+ }
+ for (auto &issue : issues) {
+ if (issue.severity() == NYql::TSeverityIds::S_WARNING)
+ --warnings;
+ }
+ if (warnings) {
+ for (auto &issue : issues)
+ Cerr << issue.DebugString();
+ UNIT_ASSERT_VALUES_EQUAL(warnings, 0);
+ }
+}
+
+template <typename TValidator>
+void CheckConfig(const NKikimrConfig::TAppConfig &config,
+ bool result,
+ ui32 warnings)
+{
+ CheckConfig<TValidator>({}, config, result, warnings);
+}
+
+} // namespace NTests
+} // namespace NConsole
+} // namespace NKikimr
diff --git a/ydb/core/cms/console/validators/ya.make b/ydb/core/cms/console/validators/ya.make
index 3475a663ba9..e8536d9618e 100644
--- a/ydb/core/cms/console/validators/ya.make
+++ b/ydb/core/cms/console/validators/ya.make
@@ -1,31 +1,31 @@
-LIBRARY()
-
-OWNER(
- ienkovich
- g:kikimr
-)
-
-SRCS(
- core_validators.cpp
- core_validators.h
- registry.cpp
- registry.h
- validator.cpp
- validator.h
- validator_bootstrap.cpp
- validator_bootstrap.h
- validator_nameservice.cpp
- validator_nameservice.h
-)
-
-PEERDIR(
+LIBRARY()
+
+OWNER(
+ ienkovich
+ g:kikimr
+)
+
+SRCS(
+ core_validators.cpp
+ core_validators.h
+ registry.cpp
+ registry.h
+ validator.cpp
+ validator.h
+ validator_bootstrap.cpp
+ validator_bootstrap.h
+ validator_nameservice.cpp
+ validator_nameservice.h
+)
+
+PEERDIR(
ydb/core/base
ydb/core/protos
ydb/core/tablet
ydb/public/api/protos
-)
-
-END()
+)
+
+END()
RECURSE_FOR_TESTS(
ut
diff --git a/ydb/core/cms/console/ya.make b/ydb/core/cms/console/ya.make
index 4c3a9508584..e33d3fc19a5 100644
--- a/ydb/core/cms/console/ya.make
+++ b/ydb/core/cms/console/ya.make
@@ -1,74 +1,74 @@
-LIBRARY()
-
-OWNER(
- ienkovich
- g:kikimr
-)
-
-SRCS(
- config_helpers.cpp
- config_helpers.h
- config_index.cpp
- config_index.h
+LIBRARY()
+
+OWNER(
+ ienkovich
+ g:kikimr
+)
+
+SRCS(
+ config_helpers.cpp
+ config_helpers.h
+ config_index.cpp
+ config_index.h
configs_cache.cpp
configs_cache.h
- configs_config.cpp
- configs_config.h
- configs_dispatcher.cpp
- configs_dispatcher.h
- console.cpp
- console.h
- console_configs_manager.cpp
- console_configs_manager.h
- console_configs_provider.cpp
- console_configs_provider.h
+ configs_config.cpp
+ configs_config.h
+ configs_dispatcher.cpp
+ configs_dispatcher.h
+ console.cpp
+ console.h
+ console_configs_manager.cpp
+ console_configs_manager.h
+ console_configs_provider.cpp
+ console_configs_provider.h
console_configs_subscriber.cpp
console_configs_subscriber.h
- console_impl.h
- console_tenants_manager.cpp
- console_tenants_manager.h
- console__add_config_subscription.cpp
- console__alter_tenant.cpp
- console__cleanup_subscriptions.cpp
- console__configure.cpp
- console__create_tenant.cpp
- console__init_scheme.cpp
- console__load_state.cpp
- console__remove_computational_units.cpp
- console__remove_config_subscription.cpp
- console__remove_config_subscriptions.cpp
- console__remove_tenant.cpp
- console__remove_tenant_done.cpp
- console__remove_tenant_failed.cpp
- console__replace_config_subscriptions.cpp
+ console_impl.h
+ console_tenants_manager.cpp
+ console_tenants_manager.h
+ console__add_config_subscription.cpp
+ console__alter_tenant.cpp
+ console__cleanup_subscriptions.cpp
+ console__configure.cpp
+ console__create_tenant.cpp
+ console__init_scheme.cpp
+ console__load_state.cpp
+ console__remove_computational_units.cpp
+ console__remove_config_subscription.cpp
+ console__remove_config_subscriptions.cpp
+ console__remove_tenant.cpp
+ console__remove_tenant_done.cpp
+ console__remove_tenant_failed.cpp
+ console__replace_config_subscriptions.cpp
console__revert_pool_state.cpp
- console__scheme.h
- console__set_config.cpp
- console__toggle_config_validator.cpp
- console__update_confirmed_subdomain.cpp
- console__update_last_provided_config.cpp
- console__update_pool_state.cpp
- console__update_subdomain_key.cpp
- console__update_tenant_state.cpp
- defs.h
- http.cpp
- http.h
- immediate_controls_configurator.cpp
- immediate_controls_configurator.h
- log_settings_configurator.cpp
- log_settings_configurator.h
- modifications_validator.cpp
- modifications_validator.h
+ console__scheme.h
+ console__set_config.cpp
+ console__toggle_config_validator.cpp
+ console__update_confirmed_subdomain.cpp
+ console__update_last_provided_config.cpp
+ console__update_pool_state.cpp
+ console__update_subdomain_key.cpp
+ console__update_tenant_state.cpp
+ defs.h
+ http.cpp
+ http.h
+ immediate_controls_configurator.cpp
+ immediate_controls_configurator.h
+ log_settings_configurator.cpp
+ log_settings_configurator.h
+ modifications_validator.cpp
+ modifications_validator.h
net_classifier_updater.cpp
shared_cache_configurator.cpp
shared_cache_configurator.h
- tx_processor.cpp
- tx_processor.h
+ tx_processor.cpp
+ tx_processor.h
util.cpp
util.h
-)
-
-PEERDIR(
+)
+
+PEERDIR(
library/cpp/actors/core
library/cpp/actors/http
ydb/core/actorlib_impl
@@ -88,9 +88,9 @@ PEERDIR(
ydb/library/aclib
ydb/public/api/protos
ydb/public/lib/operation_id
-)
-
-END()
+)
+
+END()
RECURSE(
validators
diff --git a/ydb/core/cms/defs.h b/ydb/core/cms/defs.h
index 209e4dbeb7c..93442598542 100644
--- a/ydb/core/cms/defs.h
+++ b/ydb/core/cms/defs.h
@@ -1,14 +1,14 @@
-#pragma once
-
-#include "config.h"
-
+#pragma once
+
+#include "config.h"
+
#include <ydb/core/base/defs.h>
#include <ydb/core/base/events.h>
-
-#include <util/datetime/base.h>
-
-namespace NKikimr {
-namespace NCms {
-
-} // NCms
-} // NKikimr
+
+#include <util/datetime/base.h>
+
+namespace NKikimr {
+namespace NCms {
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/downtime.cpp b/ydb/core/cms/downtime.cpp
index 1cc6b2b9ea1..2d72a676fa7 100644
--- a/ydb/core/cms/downtime.cpp
+++ b/ydb/core/cms/downtime.cpp
@@ -1,293 +1,293 @@
-#include "downtime.h"
-#include "cluster_info.h"
-#include "scheme.h"
-
-#include <util/generic/algorithm.h>
-
-#include <util/string/join.h>
-
-namespace NKikimr {
-namespace NCms {
-
-TDowntime::TDowntime(TDuration ignoredDowntimeGap)
- : IgnoredDowntimeGap(ignoredDowntimeGap)
-{
-}
-
-void TDowntime::AddDowntime(TInstant start, TInstant end, const TString &reason)
-{
- AddDowntime({start, end, reason});
-}
-
-void TDowntime::AddDowntime(TInstant start, TDuration duration, const TString &reason)
-{
- AddDowntime({start, duration, reason});
-}
-
-void TDowntime::AddDowntime(const TSegment segment)
-{
- if (!segment.Duration())
- return;
-
- auto it = DowntimeSegments.insert(segment);
-
- while (it.first != DowntimeSegments.begin()) {
- it = CollapseWithPrev(it.first);
- if (!it.second)
- break;
- }
-
- while (++it.first != DowntimeSegments.end()) {
- it = CollapseWithPrev(it.first);
- if (!it.second)
- break;
- }
-}
-
-void TDowntime::AddDowntime(const TDowntime &downtime)
-{
- for (auto &segment : downtime.GetDowntimeSegments())
- AddDowntime(segment);
-}
-
-void TDowntime::AddDowntime(const TLockableItem &item, TInstant now)
-{
- AddDowntime(item.Downtime);
-
- if (item.State != NKikimrCms::UP)
- AddDowntime(item.Timestamp, now, "known downtime");
-
- if (item.Lock.Defined()) {
+#include "downtime.h"
+#include "cluster_info.h"
+#include "scheme.h"
+
+#include <util/generic/algorithm.h>
+
+#include <util/string/join.h>
+
+namespace NKikimr {
+namespace NCms {
+
+TDowntime::TDowntime(TDuration ignoredDowntimeGap)
+ : IgnoredDowntimeGap(ignoredDowntimeGap)
+{
+}
+
+void TDowntime::AddDowntime(TInstant start, TInstant end, const TString &reason)
+{
+ AddDowntime({start, end, reason});
+}
+
+void TDowntime::AddDowntime(TInstant start, TDuration duration, const TString &reason)
+{
+ AddDowntime({start, duration, reason});
+}
+
+void TDowntime::AddDowntime(const TSegment segment)
+{
+ if (!segment.Duration())
+ return;
+
+ auto it = DowntimeSegments.insert(segment);
+
+ while (it.first != DowntimeSegments.begin()) {
+ it = CollapseWithPrev(it.first);
+ if (!it.second)
+ break;
+ }
+
+ while (++it.first != DowntimeSegments.end()) {
+ it = CollapseWithPrev(it.first);
+ if (!it.second)
+ break;
+ }
+}
+
+void TDowntime::AddDowntime(const TDowntime &downtime)
+{
+ for (auto &segment : downtime.GetDowntimeSegments())
+ AddDowntime(segment);
+}
+
+void TDowntime::AddDowntime(const TLockableItem &item, TInstant now)
+{
+ AddDowntime(item.Downtime);
+
+ if (item.State != NKikimrCms::UP)
+ AddDowntime(item.Timestamp, now, "known downtime");
+
+ if (item.Lock.Defined()) {
auto end = Min(now + TDuration::MicroSeconds(item.Lock->Action.GetDuration()),
- item.Lock->ActionDeadline);
- AddDowntime(now, end, item.Lock->PermissionId);
- }
-
- for (auto &lock : item.ExternalLocks) {
- auto start = Max(lock.LockStart, now);
- AddDowntime(start, lock.LockDeadline, lock.NotificationId);
- }
-}
-
-bool TDowntime::HasUpcomingDowntime(TInstant now, TDuration distance, TDuration duration) const
-{
- for (auto &segment : DowntimeSegments) {
- if (segment.Start > now + distance)
- break;
-
- if (segment.End >= now && segment.Duration() >= duration)
- return true;
- }
-
- return false;
-}
-
-TDuration TDowntime::GetIgnoredDowntimeGap() const
-{
- return IgnoredDowntimeGap;
-}
-
-void TDowntime::SetIgnoredDowntimeGap(TDuration gap)
-{
- bool merge = IgnoredDowntimeGap < gap;
- IgnoredDowntimeGap = gap;
-
- if (merge && !DowntimeSegments.empty()) {
- for (auto it = ++DowntimeSegments.begin(); it != DowntimeSegments.end(); ++it)
- it = CollapseWithPrev(it).first;
- }
-}
-
-void TDowntime::CleanupOldSegments(TInstant now)
-{
- while (!DowntimeSegments.empty()) {
- auto it = DowntimeSegments.begin();
- if (it->End + IgnoredDowntimeGap < now)
- DowntimeSegments.erase(it);
- else
- break;
- }
-}
-
-void TDowntime::Serialize(NKikimrCms::TAvailabilityStats *rec) const
-{
- for (auto &segment : DowntimeSegments) {
- auto &entry = *rec->AddDowntimes();
- entry.SetStart(segment.Start.GetValue());
- entry.SetEnd(segment.End.GetValue());
- entry.SetExplanation(segment.Reason);
- }
- rec->SetIgnoredDowntimeGap(IgnoredDowntimeGap.GetValue());
-}
-
-void TDowntime::Deserialize(const NKikimrCms::TAvailabilityStats &rec)
-{
- SetIgnoredDowntimeGap(TDuration::FromValue(rec.GetIgnoredDowntimeGap()));
-
- for (auto &entry : rec.GetDowntimes()) {
- AddDowntime(TInstant::FromValue(entry.GetStart()),
- TInstant::FromValue(entry.GetEnd()),
- entry.GetExplanation());
- }
-}
-
-std::pair<TDowntime::TSegments::iterator, bool>
-TDowntime::CollapseWithPrev(TSegments::iterator it)
-{
- auto prev = it;
- --prev;
-
- if (it->Start - prev->End <= IgnoredDowntimeGap) {
- TString newReason;
- if (!prev->Reason || prev->Reason == it->Reason)
- newReason = it->Reason;
- else if (!it->Reason)
- newReason = prev->Reason;
- else
- newReason = Join(", ", prev->Reason, it->Reason);
-
- TSegment collapsed = {prev->Start, Max(prev->End, it->End), newReason};
- DowntimeSegments.erase(prev);
- DowntimeSegments.erase(it);
- return {DowntimeSegments.insert(collapsed).first, true};
- }
-
- return {it, false};
-}
-
-TDowntimes::TDowntimes()
-{
-}
-
-void TDowntimes::SetIgnoredDowntimeGap(TDuration gap)
-{
- if (IgnoredDowntimeGap == gap)
- return;
-
- for (auto &pr : NodeDowntimes)
- pr.second.SetIgnoredDowntimeGap(gap);
- for (auto &pr : PDiskDowntimes)
- pr.second.SetIgnoredDowntimeGap(gap);
-}
-
-void TDowntimes::CleanupOld(TInstant now)
-{
- for (auto &pr : NodeDowntimes)
- pr.second.CleanupOldSegments(now);
- for (auto &pr : PDiskDowntimes)
- pr.second.CleanupOldSegments(now);
-}
-
-void TDowntimes::CleanupEmpty()
-{
- for (auto it = NodeDowntimes.begin(); it != NodeDowntimes.end(); ) {
- auto next = it;
- ++next;
- if (it->second.Empty())
- NodeDowntimes.erase(it);
- it = next;
- }
-
- for (auto it = PDiskDowntimes.begin(); it != PDiskDowntimes.end(); ) {
- auto next = it;
- ++next;
- if (it->second.Empty())
- PDiskDowntimes.erase(it);
- it = next;
- }
-}
-
-bool TDowntimes::DbLoadState(TTransactionContext& txc,
- const TActorContext& ctx)
-{
- Y_UNUSED(ctx);
-
- NIceDb::TNiceDb db(txc.DB);
- auto nodeRowset = db.Table<Schema::NodeDowntimes>().Range().Select<Schema::NodeDowntimes::TColumns>();
- auto pdiskRowset = db.Table<Schema::PDiskDowntimes>().Range().Select<Schema::PDiskDowntimes::TColumns>();
-
- if (!nodeRowset.IsReady() || !pdiskRowset.IsReady())
- return false;
-
- NodeDowntimes.clear();
- PDiskDowntimes.clear();
-
- while (!nodeRowset.EndOfSet()) {
- ui32 nodeId = nodeRowset.GetValue<Schema::NodeDowntimes::NodeId>();
- NKikimrCms::TAvailabilityStats rec = nodeRowset.GetValue<Schema::NodeDowntimes::Downtime>();
-
- NodeDowntimes[nodeId].Deserialize(rec);
-
- if (!nodeRowset.Next())
- return false;
- }
-
- while (!pdiskRowset.EndOfSet()) {
- ui32 nodeId = pdiskRowset.GetValue<Schema::PDiskDowntimes::NodeId>();
- ui32 diskId = pdiskRowset.GetValue<Schema::PDiskDowntimes::DiskId>();
- NKikimrCms::TAvailabilityStats rec = pdiskRowset.GetValue<Schema::PDiskDowntimes::Downtime>();
-
- PDiskDowntimes[TPDiskID(nodeId, diskId)].Deserialize(rec);
-
- if (!pdiskRowset.Next())
- return false;
- }
-
- return true;
-}
-
-void TDowntimes::DbStoreState(TTransactionContext& txc,
- const TActorContext& ctx)
-{
- NIceDb::TNiceDb db(txc.DB);
-
- for (auto &pr : NodeDowntimes) {
- if (pr.second.Empty()) {
- db.Table<Schema::NodeDowntimes>().Key(pr.first).Delete();
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS,
- "Removed downtime for node " << pr.first << " from local DB");
- } else {
- NKikimrCms::TAvailabilityStats rec;
- pr.second.Serialize(&rec);
- db.Table<Schema::NodeDowntimes>().Key(pr.first)
- .Update<Schema::NodeDowntimes::Downtime>(rec);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS,
- "Updated downtime for node " << pr.first
- << " in local DB downtime=" << pr.second);
- }
- }
-
- for (auto &pr : PDiskDowntimes) {
- if (pr.second.Empty()) {
- db.Table<Schema::PDiskDowntimes>().Key(pr.first.NodeId, pr.first.DiskId)
- .Delete();
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS, "Removed downtime for pdisk " << pr.first.ToString()
- << " from local DB");
- } else {
- NKikimrCms::TAvailabilityStats rec;
- pr.second.Serialize(&rec);
- db.Table<Schema::PDiskDowntimes>().Key(pr.first.NodeId, pr.first.DiskId)
- .Update<Schema::PDiskDowntimes::Downtime>(rec);
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS,
- "Updated downtime for pdisk " << pr.first.ToString()
- << " in local DB downtime=" << pr.second);
- }
- }
-}
-
-} // NCms
-} // NKikimr
-
-Y_DECLARE_OUT_SPEC(, NKikimr::NCms::TDowntime::TSegment, stream, value) {
- stream << "[" << value.Start.ToStringLocalUpToSeconds() << "-"
- << value.End.ToStringLocalUpToSeconds() << "]("
- << value.Reason << ")";
-}
-
-Y_DECLARE_OUT_SPEC(, NKikimr::NCms::TDowntime, stream, value) {
- stream << JoinSeq(", ", value.GetDowntimeSegments());
-}
+ item.Lock->ActionDeadline);
+ AddDowntime(now, end, item.Lock->PermissionId);
+ }
+
+ for (auto &lock : item.ExternalLocks) {
+ auto start = Max(lock.LockStart, now);
+ AddDowntime(start, lock.LockDeadline, lock.NotificationId);
+ }
+}
+
+bool TDowntime::HasUpcomingDowntime(TInstant now, TDuration distance, TDuration duration) const
+{
+ for (auto &segment : DowntimeSegments) {
+ if (segment.Start > now + distance)
+ break;
+
+ if (segment.End >= now && segment.Duration() >= duration)
+ return true;
+ }
+
+ return false;
+}
+
+TDuration TDowntime::GetIgnoredDowntimeGap() const
+{
+ return IgnoredDowntimeGap;
+}
+
+void TDowntime::SetIgnoredDowntimeGap(TDuration gap)
+{
+ bool merge = IgnoredDowntimeGap < gap;
+ IgnoredDowntimeGap = gap;
+
+ if (merge && !DowntimeSegments.empty()) {
+ for (auto it = ++DowntimeSegments.begin(); it != DowntimeSegments.end(); ++it)
+ it = CollapseWithPrev(it).first;
+ }
+}
+
+void TDowntime::CleanupOldSegments(TInstant now)
+{
+ while (!DowntimeSegments.empty()) {
+ auto it = DowntimeSegments.begin();
+ if (it->End + IgnoredDowntimeGap < now)
+ DowntimeSegments.erase(it);
+ else
+ break;
+ }
+}
+
+void TDowntime::Serialize(NKikimrCms::TAvailabilityStats *rec) const
+{
+ for (auto &segment : DowntimeSegments) {
+ auto &entry = *rec->AddDowntimes();
+ entry.SetStart(segment.Start.GetValue());
+ entry.SetEnd(segment.End.GetValue());
+ entry.SetExplanation(segment.Reason);
+ }
+ rec->SetIgnoredDowntimeGap(IgnoredDowntimeGap.GetValue());
+}
+
+void TDowntime::Deserialize(const NKikimrCms::TAvailabilityStats &rec)
+{
+ SetIgnoredDowntimeGap(TDuration::FromValue(rec.GetIgnoredDowntimeGap()));
+
+ for (auto &entry : rec.GetDowntimes()) {
+ AddDowntime(TInstant::FromValue(entry.GetStart()),
+ TInstant::FromValue(entry.GetEnd()),
+ entry.GetExplanation());
+ }
+}
+
+std::pair<TDowntime::TSegments::iterator, bool>
+TDowntime::CollapseWithPrev(TSegments::iterator it)
+{
+ auto prev = it;
+ --prev;
+
+ if (it->Start - prev->End <= IgnoredDowntimeGap) {
+ TString newReason;
+ if (!prev->Reason || prev->Reason == it->Reason)
+ newReason = it->Reason;
+ else if (!it->Reason)
+ newReason = prev->Reason;
+ else
+ newReason = Join(", ", prev->Reason, it->Reason);
+
+ TSegment collapsed = {prev->Start, Max(prev->End, it->End), newReason};
+ DowntimeSegments.erase(prev);
+ DowntimeSegments.erase(it);
+ return {DowntimeSegments.insert(collapsed).first, true};
+ }
+
+ return {it, false};
+}
+
+TDowntimes::TDowntimes()
+{
+}
+
+void TDowntimes::SetIgnoredDowntimeGap(TDuration gap)
+{
+ if (IgnoredDowntimeGap == gap)
+ return;
+
+ for (auto &pr : NodeDowntimes)
+ pr.second.SetIgnoredDowntimeGap(gap);
+ for (auto &pr : PDiskDowntimes)
+ pr.second.SetIgnoredDowntimeGap(gap);
+}
+
+void TDowntimes::CleanupOld(TInstant now)
+{
+ for (auto &pr : NodeDowntimes)
+ pr.second.CleanupOldSegments(now);
+ for (auto &pr : PDiskDowntimes)
+ pr.second.CleanupOldSegments(now);
+}
+
+void TDowntimes::CleanupEmpty()
+{
+ for (auto it = NodeDowntimes.begin(); it != NodeDowntimes.end(); ) {
+ auto next = it;
+ ++next;
+ if (it->second.Empty())
+ NodeDowntimes.erase(it);
+ it = next;
+ }
+
+ for (auto it = PDiskDowntimes.begin(); it != PDiskDowntimes.end(); ) {
+ auto next = it;
+ ++next;
+ if (it->second.Empty())
+ PDiskDowntimes.erase(it);
+ it = next;
+ }
+}
+
+bool TDowntimes::DbLoadState(TTransactionContext& txc,
+ const TActorContext& ctx)
+{
+ Y_UNUSED(ctx);
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto nodeRowset = db.Table<Schema::NodeDowntimes>().Range().Select<Schema::NodeDowntimes::TColumns>();
+ auto pdiskRowset = db.Table<Schema::PDiskDowntimes>().Range().Select<Schema::PDiskDowntimes::TColumns>();
+
+ if (!nodeRowset.IsReady() || !pdiskRowset.IsReady())
+ return false;
+
+ NodeDowntimes.clear();
+ PDiskDowntimes.clear();
+
+ while (!nodeRowset.EndOfSet()) {
+ ui32 nodeId = nodeRowset.GetValue<Schema::NodeDowntimes::NodeId>();
+ NKikimrCms::TAvailabilityStats rec = nodeRowset.GetValue<Schema::NodeDowntimes::Downtime>();
+
+ NodeDowntimes[nodeId].Deserialize(rec);
+
+ if (!nodeRowset.Next())
+ return false;
+ }
+
+ while (!pdiskRowset.EndOfSet()) {
+ ui32 nodeId = pdiskRowset.GetValue<Schema::PDiskDowntimes::NodeId>();
+ ui32 diskId = pdiskRowset.GetValue<Schema::PDiskDowntimes::DiskId>();
+ NKikimrCms::TAvailabilityStats rec = pdiskRowset.GetValue<Schema::PDiskDowntimes::Downtime>();
+
+ PDiskDowntimes[TPDiskID(nodeId, diskId)].Deserialize(rec);
+
+ if (!pdiskRowset.Next())
+ return false;
+ }
+
+ return true;
+}
+
+void TDowntimes::DbStoreState(TTransactionContext& txc,
+ const TActorContext& ctx)
+{
+ NIceDb::TNiceDb db(txc.DB);
+
+ for (auto &pr : NodeDowntimes) {
+ if (pr.second.Empty()) {
+ db.Table<Schema::NodeDowntimes>().Key(pr.first).Delete();
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS,
+ "Removed downtime for node " << pr.first << " from local DB");
+ } else {
+ NKikimrCms::TAvailabilityStats rec;
+ pr.second.Serialize(&rec);
+ db.Table<Schema::NodeDowntimes>().Key(pr.first)
+ .Update<Schema::NodeDowntimes::Downtime>(rec);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS,
+ "Updated downtime for node " << pr.first
+ << " in local DB downtime=" << pr.second);
+ }
+ }
+
+ for (auto &pr : PDiskDowntimes) {
+ if (pr.second.Empty()) {
+ db.Table<Schema::PDiskDowntimes>().Key(pr.first.NodeId, pr.first.DiskId)
+ .Delete();
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS, "Removed downtime for pdisk " << pr.first.ToString()
+ << " from local DB");
+ } else {
+ NKikimrCms::TAvailabilityStats rec;
+ pr.second.Serialize(&rec);
+ db.Table<Schema::PDiskDowntimes>().Key(pr.first.NodeId, pr.first.DiskId)
+ .Update<Schema::PDiskDowntimes::Downtime>(rec);
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS,
+ "Updated downtime for pdisk " << pr.first.ToString()
+ << " in local DB downtime=" << pr.second);
+ }
+ }
+}
+
+} // NCms
+} // NKikimr
+
+Y_DECLARE_OUT_SPEC(, NKikimr::NCms::TDowntime::TSegment, stream, value) {
+ stream << "[" << value.Start.ToStringLocalUpToSeconds() << "-"
+ << value.End.ToStringLocalUpToSeconds() << "]("
+ << value.Reason << ")";
+}
+
+Y_DECLARE_OUT_SPEC(, NKikimr::NCms::TDowntime, stream, value) {
+ stream << JoinSeq(", ", value.GetDowntimeSegments());
+}
diff --git a/ydb/core/cms/downtime.h b/ydb/core/cms/downtime.h
index 9ce632a3c64..0e517a1467f 100644
--- a/ydb/core/cms/downtime.h
+++ b/ydb/core/cms/downtime.h
@@ -1,130 +1,130 @@
-#pragma once
-
-#include "config.h"
-#include "pdiskid.h"
-
+#pragma once
+
+#include "config.h"
+#include "pdiskid.h"
+
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
-
-#include <util/datetime/base.h>
-#include <util/generic/set.h>
-
-namespace NKikimr {
-namespace NCms {
-
-using NTabletFlatExecutor::TTransactionContext;
-
-class TLockableItem;
-
-/**
- * Class to hold downtime of tracked item. Downtime is stored as a set
- * of downtime segments. Nearby segments are collapsed into a single segment
- * if gap doesn't exceed configured value. Ignored gap size can be configured
- * dynamically but already collapsed segments never split back.
- */
-class TDowntime {
-public:
- struct TSegment {
- TInstant Start;
- TInstant End;
- TString Reason;
-
- TSegment(TInstant start, TInstant end, const TString reason = "")
- : Start(start)
- , End(end)
- , Reason(reason)
- {
- }
- TSegment(TInstant start, TDuration duration, const TString reason = "")
- : Start(start)
- , End(start + duration)
- , Reason(reason)
- {
- }
- TSegment(const TSegment &other) = default;
- TSegment(TSegment &&other) = default;
-
- TSegment &operator=(const TSegment &other) = default;
- TSegment &operator=(TSegment &&other) = default;
-
- TDuration Duration() const
- {
- return End - Start;
- }
- };
-
- struct TSegmentCmp {
- bool operator()(const TSegment &l, const TSegment &r) const {
- if (l.Start != r.Start)
- return l.Start < r.Start;
- else if (l.End != r.End)
- return l.End < r.End;
- else
- return l.Reason < r.Reason;
- }
- };
-
+
+#include <util/datetime/base.h>
+#include <util/generic/set.h>
+
+namespace NKikimr {
+namespace NCms {
+
+using NTabletFlatExecutor::TTransactionContext;
+
+class TLockableItem;
+
+/**
+ * Class to hold downtime of tracked item. Downtime is stored as a set
+ * of downtime segments. Nearby segments are collapsed into a single segment
+ * if gap doesn't exceed configured value. Ignored gap size can be configured
+ * dynamically but already collapsed segments never split back.
+ */
+class TDowntime {
+public:
+ struct TSegment {
+ TInstant Start;
+ TInstant End;
+ TString Reason;
+
+ TSegment(TInstant start, TInstant end, const TString reason = "")
+ : Start(start)
+ , End(end)
+ , Reason(reason)
+ {
+ }
+ TSegment(TInstant start, TDuration duration, const TString reason = "")
+ : Start(start)
+ , End(start + duration)
+ , Reason(reason)
+ {
+ }
+ TSegment(const TSegment &other) = default;
+ TSegment(TSegment &&other) = default;
+
+ TSegment &operator=(const TSegment &other) = default;
+ TSegment &operator=(TSegment &&other) = default;
+
+ TDuration Duration() const
+ {
+ return End - Start;
+ }
+ };
+
+ struct TSegmentCmp {
+ bool operator()(const TSegment &l, const TSegment &r) const {
+ if (l.Start != r.Start)
+ return l.Start < r.Start;
+ else if (l.End != r.End)
+ return l.End < r.End;
+ else
+ return l.Reason < r.Reason;
+ }
+ };
+
using TSegments = TSet<TSegment, TSegmentCmp>;
-
-public:
- TDowntime(TDuration ignoredDowntimeGap = TDuration::Zero());
-
- void AddDowntime(TInstant start, TInstant end, const TString &reason = "");
- void AddDowntime(TInstant start, TDuration duration, const TString &reason = "");
- void AddDowntime(const TSegment segment);
- void AddDowntime(const TDowntime &downtime);
- void AddDowntime(const TLockableItem &item, TInstant now);
-
- const TSegments &GetDowntimeSegments() const
- {
- return DowntimeSegments;
- }
-
- bool Empty() const
- {
- return DowntimeSegments.empty();
- }
-
- void Clear()
- {
- DowntimeSegments.clear();
- }
-
- bool HasUpcomingDowntime(TInstant now, TDuration distance, TDuration duration) const;
-
- TDuration GetIgnoredDowntimeGap() const;
- void SetIgnoredDowntimeGap(TDuration gap);
- void CleanupOldSegments(TInstant now);
-
- void Serialize(NKikimrCms::TAvailabilityStats *rec) const;
- void Deserialize(const NKikimrCms::TAvailabilityStats &rec);
-
-private:
- std::pair<TSegments::iterator, bool> CollapseWithPrev(TSegments::iterator it);
-
-private:
- TDuration IgnoredDowntimeGap;
- TSegments DowntimeSegments;
-};
-
-class TDowntimes {
-public:
- TDowntimes();
-
- void SetIgnoredDowntimeGap(TDuration gap);
- void CleanupOld(TInstant now);
- void CleanupEmpty();
-
- bool DbLoadState(TTransactionContext& txc,
- const TActorContext& ctx);
- void DbStoreState(TTransactionContext& txc,
- const TActorContext& ctx);
-
- THashMap<ui32, TDowntime> NodeDowntimes;
- THashMap<TPDiskID, TDowntime, TPDiskIDHash> PDiskDowntimes;
-
-private:
- TDuration IgnoredDowntimeGap;
-};
-
-} // NCms
-} // NKikimr
+
+public:
+ TDowntime(TDuration ignoredDowntimeGap = TDuration::Zero());
+
+ void AddDowntime(TInstant start, TInstant end, const TString &reason = "");
+ void AddDowntime(TInstant start, TDuration duration, const TString &reason = "");
+ void AddDowntime(const TSegment segment);
+ void AddDowntime(const TDowntime &downtime);
+ void AddDowntime(const TLockableItem &item, TInstant now);
+
+ const TSegments &GetDowntimeSegments() const
+ {
+ return DowntimeSegments;
+ }
+
+ bool Empty() const
+ {
+ return DowntimeSegments.empty();
+ }
+
+ void Clear()
+ {
+ DowntimeSegments.clear();
+ }
+
+ bool HasUpcomingDowntime(TInstant now, TDuration distance, TDuration duration) const;
+
+ TDuration GetIgnoredDowntimeGap() const;
+ void SetIgnoredDowntimeGap(TDuration gap);
+ void CleanupOldSegments(TInstant now);
+
+ void Serialize(NKikimrCms::TAvailabilityStats *rec) const;
+ void Deserialize(const NKikimrCms::TAvailabilityStats &rec);
+
+private:
+ std::pair<TSegments::iterator, bool> CollapseWithPrev(TSegments::iterator it);
+
+private:
+ TDuration IgnoredDowntimeGap;
+ TSegments DowntimeSegments;
+};
+
+class TDowntimes {
+public:
+ TDowntimes();
+
+ void SetIgnoredDowntimeGap(TDuration gap);
+ void CleanupOld(TInstant now);
+ void CleanupEmpty();
+
+ bool DbLoadState(TTransactionContext& txc,
+ const TActorContext& ctx);
+ void DbStoreState(TTransactionContext& txc,
+ const TActorContext& ctx);
+
+ THashMap<ui32, TDowntime> NodeDowntimes;
+ THashMap<TPDiskID, TDowntime, TPDiskIDHash> PDiskDowntimes;
+
+private:
+ TDuration IgnoredDowntimeGap;
+};
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/downtime_ut.cpp b/ydb/core/cms/downtime_ut.cpp
index bbb65763ba2..12a5bdbdde8 100644
--- a/ydb/core/cms/downtime_ut.cpp
+++ b/ydb/core/cms/downtime_ut.cpp
@@ -1,165 +1,165 @@
-#include "cluster_info.h"
-#include "cms_state.h"
-#include "cms_ut_common.h"
-#include "downtime.h"
-#include "ut_helpers.h"
-
+#include "cluster_info.h"
+#include "cms_state.h"
+#include "cms_ut_common.h"
+#include "downtime.h"
+#include "ut_helpers.h"
+
#include <ydb/core/blobstorage/base/blobstorage_events.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace NKikimr {
-namespace NCmsTest {
-
-using namespace NCms;
-using namespace NKikimrBlobStorage;
-using namespace NKikimrCms;
-
-static void CheckDowntime(TDowntime::TSegments::const_iterator i,
- TInstant start , TInstant end, const TString &reason)
-{
- UNIT_ASSERT_VALUES_EQUAL(i->Start, start);
- UNIT_ASSERT_VALUES_EQUAL(i->End, end);
- if (reason != "any")
- UNIT_ASSERT_VALUES_EQUAL(i->Reason, reason);
-}
-
-static void CheckDowntime(TDowntime::TSegments::const_iterator i,
- TDowntime::TSegments::const_iterator iend,
- TInstant start , TInstant end, const TString &reason)
-{
- UNIT_ASSERT(i != iend);
- CheckDowntime(i, start, end, reason);
- UNIT_ASSERT(++i == iend);
-}
-
-template<typename... Ts>
-void CheckDowntime(TDowntime::TSegments::const_iterator i,
- TDowntime::TSegments::const_iterator iend,
- TInstant start , TInstant end, const TString &reason,
- Ts... intervals)
-{
- UNIT_ASSERT(i != iend);
- CheckDowntime(i, start, end, reason);
- UNIT_ASSERT(++i != iend);
- CheckDowntime(i, iend, intervals...);
-}
-
-template<typename... Ts>
-void CheckDowntime(const TDowntime &downtime, Ts... intervals)
-{
- return CheckDowntime(downtime.GetDowntimeSegments().begin(),
- downtime.GetDowntimeSegments().end(),
- intervals...);
-}
-
+
+namespace NKikimr {
+namespace NCmsTest {
+
+using namespace NCms;
+using namespace NKikimrBlobStorage;
+using namespace NKikimrCms;
+
+static void CheckDowntime(TDowntime::TSegments::const_iterator i,
+ TInstant start , TInstant end, const TString &reason)
+{
+ UNIT_ASSERT_VALUES_EQUAL(i->Start, start);
+ UNIT_ASSERT_VALUES_EQUAL(i->End, end);
+ if (reason != "any")
+ UNIT_ASSERT_VALUES_EQUAL(i->Reason, reason);
+}
+
+static void CheckDowntime(TDowntime::TSegments::const_iterator i,
+ TDowntime::TSegments::const_iterator iend,
+ TInstant start , TInstant end, const TString &reason)
+{
+ UNIT_ASSERT(i != iend);
+ CheckDowntime(i, start, end, reason);
+ UNIT_ASSERT(++i == iend);
+}
+
+template<typename... Ts>
+void CheckDowntime(TDowntime::TSegments::const_iterator i,
+ TDowntime::TSegments::const_iterator iend,
+ TInstant start , TInstant end, const TString &reason,
+ Ts... intervals)
+{
+ UNIT_ASSERT(i != iend);
+ CheckDowntime(i, start, end, reason);
+ UNIT_ASSERT(++i != iend);
+ CheckDowntime(i, iend, intervals...);
+}
+
+template<typename... Ts>
+void CheckDowntime(const TDowntime &downtime, Ts... intervals)
+{
+ return CheckDowntime(downtime.GetDowntimeSegments().begin(),
+ downtime.GetDowntimeSegments().end(),
+ intervals...);
+}
+
Y_UNIT_TEST_SUITE(TDowntimeTest) {
Y_UNIT_TEST(AddDowntime)
- {
- TDowntime downtime1(TDuration::Seconds(10));
- TInstant t1 = Now();
- TInstant t2 = t1 + TDuration::Seconds(3);
- TInstant t3 = t1 + TDuration::Seconds(6);
- TInstant t4 = t1 + TDuration::Seconds(9);
- TInstant t5 = t1 + TDuration::Seconds(12);
- TInstant t6 = t1 + TDuration::Seconds(15);
- TInstant t7 = t1 + TDuration::Seconds(18);
- TInstant t8 = t1 + TDuration::Seconds(21);
- TInstant t9 = t1 + TDuration::Seconds(30);
- TInstant t10 = t1 + TDuration::Seconds(33);
-
- UNIT_ASSERT(downtime1.Empty());
- downtime1.AddDowntime(t1, t2, "s1");
- downtime1.AddDowntime(t6, t7, "s2");
- CheckDowntime(downtime1, t1, t2, "s1", t6, t7, "s2");
- downtime1.AddDowntime(t4, t5, "s3");
- CheckDowntime(downtime1, t1, t7, "s1, s3, s2");
- downtime1.AddDowntime(t3, t4, "s4");
- CheckDowntime(downtime1, t1, t7, "s1, s3, s2, s4");
- downtime1.AddDowntime(t1, t4, "s5");
- CheckDowntime(downtime1, t1, t7, "s5, s1, s3, s2, s4");
-
- downtime1.Clear();
- downtime1.AddDowntime(t2, t3, "");
- downtime1.AddDowntime(t3, t4, "s1");
- CheckDowntime(downtime1, t2, t4, "s1");
-
- downtime1.Clear();
- downtime1.AddDowntime(t2, TDuration::Seconds(3), "s1");
- downtime1.AddDowntime({t3, t4, ""});
- CheckDowntime(downtime1, t2, t4, "s1");
-
- TDowntime downtime2;
- downtime1.Clear();
- downtime1.AddDowntime(t1, t2, "s1");
- downtime1.AddDowntime(t6, t7, "s2");
- downtime2.AddDowntime(t4, t5, "s3");
- downtime2.AddDowntime(t9, t10, "s4");
- downtime2.AddDowntime(downtime1);
- CheckDowntime(downtime2, t1, t2, "s1", t4, t5, "s3",
- t6, t7, "s2", t9, t10, "s4");
- downtime1.AddDowntime(downtime2);
- CheckDowntime(downtime1, t1, t7, "any", t9, t10, "s4");
-
- NCms::TPDiskInfo pdisk;
- TAction action1 = MakeAction(TAction::SHUTDOWN_HOST, 1, TDuration::Seconds(6).GetValue());
- TPermissionInfo permission1;
- permission1.Action = action1;
- permission1.PermissionId = "permission-1";
- permission1.Deadline = t9;
- pdisk.AddLock(permission1);
- TNotificationInfo notification1;
- notification1.NotificationId = "notification-1";
- notification1.Notification.SetTime(t6.GetValue());
- pdisk.AddExternalLock(notification1, action1);
- pdisk.Downtime.AddDowntime(t1, t2, "known downtime");
- pdisk.State = UP;
- pdisk.Timestamp = t2;
- downtime2.Clear();
- downtime2.AddDowntime(pdisk, t3);
- CheckDowntime(downtime2, t1, t2, "known downtime", t3, t5, "permission-1",
- t6, t8, "notification-1");
-
- pdisk.State = DOWN;
- pdisk.Lock.Clear();
- pdisk.ExternalLocks.clear();
- pdisk.Downtime.Clear();
- downtime2.Clear();
- downtime2.AddDowntime(pdisk, t3);
- CheckDowntime(downtime2, t2, t3, "known downtime");
-
- pdisk.State = UP;
- TPermissionInfo permission2;
- permission2.Action = action1;
- permission2.PermissionId = "permission-2";
- permission2.Deadline = t2;
- pdisk.AddLock(permission2);
- downtime2.Clear();
- downtime2.AddDowntime(pdisk, t3);
- CheckDowntime(downtime2, t3, t4, "permission-2");
-
- pdisk.Lock.Clear();
- TNotificationInfo notification2;
- notification2.NotificationId = "notification-2";
- notification2.Notification.SetTime(t2.GetValue());
- pdisk.AddExternalLock(notification2, action1);
- downtime2.Clear();
- downtime2.AddDowntime(pdisk, t3);
- CheckDowntime(downtime2, t3, t4, "notification-2");
- }
-
+ {
+ TDowntime downtime1(TDuration::Seconds(10));
+ TInstant t1 = Now();
+ TInstant t2 = t1 + TDuration::Seconds(3);
+ TInstant t3 = t1 + TDuration::Seconds(6);
+ TInstant t4 = t1 + TDuration::Seconds(9);
+ TInstant t5 = t1 + TDuration::Seconds(12);
+ TInstant t6 = t1 + TDuration::Seconds(15);
+ TInstant t7 = t1 + TDuration::Seconds(18);
+ TInstant t8 = t1 + TDuration::Seconds(21);
+ TInstant t9 = t1 + TDuration::Seconds(30);
+ TInstant t10 = t1 + TDuration::Seconds(33);
+
+ UNIT_ASSERT(downtime1.Empty());
+ downtime1.AddDowntime(t1, t2, "s1");
+ downtime1.AddDowntime(t6, t7, "s2");
+ CheckDowntime(downtime1, t1, t2, "s1", t6, t7, "s2");
+ downtime1.AddDowntime(t4, t5, "s3");
+ CheckDowntime(downtime1, t1, t7, "s1, s3, s2");
+ downtime1.AddDowntime(t3, t4, "s4");
+ CheckDowntime(downtime1, t1, t7, "s1, s3, s2, s4");
+ downtime1.AddDowntime(t1, t4, "s5");
+ CheckDowntime(downtime1, t1, t7, "s5, s1, s3, s2, s4");
+
+ downtime1.Clear();
+ downtime1.AddDowntime(t2, t3, "");
+ downtime1.AddDowntime(t3, t4, "s1");
+ CheckDowntime(downtime1, t2, t4, "s1");
+
+ downtime1.Clear();
+ downtime1.AddDowntime(t2, TDuration::Seconds(3), "s1");
+ downtime1.AddDowntime({t3, t4, ""});
+ CheckDowntime(downtime1, t2, t4, "s1");
+
+ TDowntime downtime2;
+ downtime1.Clear();
+ downtime1.AddDowntime(t1, t2, "s1");
+ downtime1.AddDowntime(t6, t7, "s2");
+ downtime2.AddDowntime(t4, t5, "s3");
+ downtime2.AddDowntime(t9, t10, "s4");
+ downtime2.AddDowntime(downtime1);
+ CheckDowntime(downtime2, t1, t2, "s1", t4, t5, "s3",
+ t6, t7, "s2", t9, t10, "s4");
+ downtime1.AddDowntime(downtime2);
+ CheckDowntime(downtime1, t1, t7, "any", t9, t10, "s4");
+
+ NCms::TPDiskInfo pdisk;
+ TAction action1 = MakeAction(TAction::SHUTDOWN_HOST, 1, TDuration::Seconds(6).GetValue());
+ TPermissionInfo permission1;
+ permission1.Action = action1;
+ permission1.PermissionId = "permission-1";
+ permission1.Deadline = t9;
+ pdisk.AddLock(permission1);
+ TNotificationInfo notification1;
+ notification1.NotificationId = "notification-1";
+ notification1.Notification.SetTime(t6.GetValue());
+ pdisk.AddExternalLock(notification1, action1);
+ pdisk.Downtime.AddDowntime(t1, t2, "known downtime");
+ pdisk.State = UP;
+ pdisk.Timestamp = t2;
+ downtime2.Clear();
+ downtime2.AddDowntime(pdisk, t3);
+ CheckDowntime(downtime2, t1, t2, "known downtime", t3, t5, "permission-1",
+ t6, t8, "notification-1");
+
+ pdisk.State = DOWN;
+ pdisk.Lock.Clear();
+ pdisk.ExternalLocks.clear();
+ pdisk.Downtime.Clear();
+ downtime2.Clear();
+ downtime2.AddDowntime(pdisk, t3);
+ CheckDowntime(downtime2, t2, t3, "known downtime");
+
+ pdisk.State = UP;
+ TPermissionInfo permission2;
+ permission2.Action = action1;
+ permission2.PermissionId = "permission-2";
+ permission2.Deadline = t2;
+ pdisk.AddLock(permission2);
+ downtime2.Clear();
+ downtime2.AddDowntime(pdisk, t3);
+ CheckDowntime(downtime2, t3, t4, "permission-2");
+
+ pdisk.Lock.Clear();
+ TNotificationInfo notification2;
+ notification2.NotificationId = "notification-2";
+ notification2.Notification.SetTime(t2.GetValue());
+ pdisk.AddExternalLock(notification2, action1);
+ downtime2.Clear();
+ downtime2.AddDowntime(pdisk, t3);
+ CheckDowntime(downtime2, t3, t4, "notification-2");
+ }
+
Y_UNIT_TEST(HasUpcomingDowntime)
- {
- TDowntime downtime1(TDuration::Seconds(5));
- TInstant t1 = Now();
- TInstant t2 = t1 + TDuration::Seconds(3);
- TInstant t3 = t1 + TDuration::Seconds(6);
- TInstant t4 = t1 + TDuration::Seconds(9);
- TInstant t5 = t1 + TDuration::Seconds(23);
- TInstant t6 = t1 + TDuration::Seconds(26);
- TInstant t7 = t1 + TDuration::Seconds(33);
-
- downtime1.AddDowntime(t2, t4);
+ {
+ TDowntime downtime1(TDuration::Seconds(5));
+ TInstant t1 = Now();
+ TInstant t2 = t1 + TDuration::Seconds(3);
+ TInstant t3 = t1 + TDuration::Seconds(6);
+ TInstant t4 = t1 + TDuration::Seconds(9);
+ TInstant t5 = t1 + TDuration::Seconds(23);
+ TInstant t6 = t1 + TDuration::Seconds(26);
+ TInstant t7 = t1 + TDuration::Seconds(33);
+
+ downtime1.AddDowntime(t2, t4);
UNIT_ASSERT(!downtime1.HasUpcomingDowntime(t1, TDuration::Seconds(0), TDuration::Seconds(5)));
UNIT_ASSERT(downtime1.HasUpcomingDowntime(t1, TDuration::Seconds(3), TDuration::Seconds(5)));
UNIT_ASSERT(!downtime1.HasUpcomingDowntime(t2, TDuration::Seconds(3), TDuration::Seconds(15)));
@@ -168,62 +168,62 @@ Y_UNIT_TEST_SUITE(TDowntimeTest) {
UNIT_ASSERT(downtime1.HasUpcomingDowntime(t3, TDuration::Seconds(3), TDuration::Seconds(5)));
UNIT_ASSERT(downtime1.HasUpcomingDowntime(t4, TDuration::Seconds(3), TDuration::Seconds(5)));
UNIT_ASSERT(!downtime1.HasUpcomingDowntime(t5, TDuration::Seconds(3), TDuration::Seconds(5)));
-
- downtime1.AddDowntime(t5, t7);
+
+ downtime1.AddDowntime(t5, t7);
UNIT_ASSERT(!downtime1.HasUpcomingDowntime(t1, TDuration::Seconds(0), TDuration::Seconds(10)));
UNIT_ASSERT(downtime1.HasUpcomingDowntime(t1, TDuration::Seconds(25), TDuration::Seconds(10)));
UNIT_ASSERT(!downtime1.HasUpcomingDowntime(t1, TDuration::Seconds(30), TDuration::Seconds(11)));
UNIT_ASSERT(!downtime1.HasUpcomingDowntime(t6, TDuration::Seconds(0), TDuration::Seconds(11)));
- }
-
+ }
+
Y_UNIT_TEST(SetIgnoredDowntimeGap)
- {
- TDowntime downtime1(TDuration::Seconds(5));
- TInstant t1 = Now();
- TInstant t2 = t1 + TDuration::Seconds(3);
- TInstant t3 = t1 + TDuration::Seconds(13);
- TInstant t4 = t1 + TDuration::Seconds(16);
- TInstant t5 = t1 + TDuration::Seconds(23);
- TInstant t6 = t1 + TDuration::Seconds(26);
- TInstant t7 = t1 + TDuration::Seconds(40);
- TInstant t8 = t1 + TDuration::Seconds(43);
-
- downtime1.AddDowntime(t1, t2, "s1");
- downtime1.AddDowntime(t3, t4, "s2");
- downtime1.AddDowntime(t5, t6, "s3");
- downtime1.AddDowntime(t7, t8, "s4");
- CheckDowntime(downtime1, t1, t2, "s1", t3, t4, "s2",
- t5, t6, "s3", t7, t8, "s4");
-
- downtime1.SetIgnoredDowntimeGap(TDuration::Seconds(10));
- CheckDowntime(downtime1, t1, t6, "s1, s2, s3", t7, t8, "s4");
-
- downtime1.SetIgnoredDowntimeGap(TDuration::Seconds(5));
- CheckDowntime(downtime1, t1, t6, "s1, s2, s3", t7, t8, "s4");
-
- downtime1.SetIgnoredDowntimeGap(TDuration::Seconds(15));
- CheckDowntime(downtime1, t1, t8, "s1, s2, s3, s4");
- }
-
+ {
+ TDowntime downtime1(TDuration::Seconds(5));
+ TInstant t1 = Now();
+ TInstant t2 = t1 + TDuration::Seconds(3);
+ TInstant t3 = t1 + TDuration::Seconds(13);
+ TInstant t4 = t1 + TDuration::Seconds(16);
+ TInstant t5 = t1 + TDuration::Seconds(23);
+ TInstant t6 = t1 + TDuration::Seconds(26);
+ TInstant t7 = t1 + TDuration::Seconds(40);
+ TInstant t8 = t1 + TDuration::Seconds(43);
+
+ downtime1.AddDowntime(t1, t2, "s1");
+ downtime1.AddDowntime(t3, t4, "s2");
+ downtime1.AddDowntime(t5, t6, "s3");
+ downtime1.AddDowntime(t7, t8, "s4");
+ CheckDowntime(downtime1, t1, t2, "s1", t3, t4, "s2",
+ t5, t6, "s3", t7, t8, "s4");
+
+ downtime1.SetIgnoredDowntimeGap(TDuration::Seconds(10));
+ CheckDowntime(downtime1, t1, t6, "s1, s2, s3", t7, t8, "s4");
+
+ downtime1.SetIgnoredDowntimeGap(TDuration::Seconds(5));
+ CheckDowntime(downtime1, t1, t6, "s1, s2, s3", t7, t8, "s4");
+
+ downtime1.SetIgnoredDowntimeGap(TDuration::Seconds(15));
+ CheckDowntime(downtime1, t1, t8, "s1, s2, s3, s4");
+ }
+
Y_UNIT_TEST(CleanupOldSegments)
- {
- TDowntime downtime1(TDuration::Seconds(5));
- TInstant t1 = Now();
- TInstant t2 = t1 + TDuration::Seconds(3);
- TInstant t3 = t1 + TDuration::Seconds(9);
- TInstant t4 = t1 + TDuration::Seconds(12);
- TInstant t5 = t1 + TDuration::Seconds(15);
- TInstant t6 = t1 + TDuration::Seconds(18);
- TInstant t7 = t1 + TDuration::Seconds(21);
-
- downtime1.AddDowntime(t1, t2, "s1");
- downtime1.AddDowntime(t3, t4, "s2");
- downtime1.AddDowntime(t6, t7, "s3");
-
- downtime1.CleanupOldSegments(t5);
- CheckDowntime(downtime1, t3, t4, "s2", t6, t7, "s3");
- }
-}
-
-} // NCmsTest
-} // NKikimr
+ {
+ TDowntime downtime1(TDuration::Seconds(5));
+ TInstant t1 = Now();
+ TInstant t2 = t1 + TDuration::Seconds(3);
+ TInstant t3 = t1 + TDuration::Seconds(9);
+ TInstant t4 = t1 + TDuration::Seconds(12);
+ TInstant t5 = t1 + TDuration::Seconds(15);
+ TInstant t6 = t1 + TDuration::Seconds(18);
+ TInstant t7 = t1 + TDuration::Seconds(21);
+
+ downtime1.AddDowntime(t1, t2, "s1");
+ downtime1.AddDowntime(t3, t4, "s2");
+ downtime1.AddDowntime(t6, t7, "s3");
+
+ downtime1.CleanupOldSegments(t5);
+ CheckDowntime(downtime1, t3, t4, "s2", t6, t7, "s3");
+ }
+}
+
+} // NCmsTest
+} // NKikimr
diff --git a/ydb/core/cms/http.cpp b/ydb/core/cms/http.cpp
index a520991f8a4..648d864b6ed 100644
--- a/ydb/core/cms/http.cpp
+++ b/ydb/core/cms/http.cpp
@@ -1,134 +1,134 @@
-#include "http.h"
-#include "json_proxy.h"
-#include "json_proxy_config_items.h"
-#include "json_proxy_config_updates.h"
-#include "json_proxy_config_validators.h"
-#include "json_proxy_log.h"
-#include "json_proxy_operations.h"
-#include "json_proxy_proto.h"
-#include "json_proxy_toggle_config_validator.h"
-#include "base_handler.h"
-#include "walle.h"
-
+#include "http.h"
+#include "json_proxy.h"
+#include "json_proxy_config_items.h"
+#include "json_proxy_config_updates.h"
+#include "json_proxy_config_validators.h"
+#include "json_proxy_log.h"
+#include "json_proxy_operations.h"
+#include "json_proxy_proto.h"
+#include "json_proxy_toggle_config_validator.h"
+#include "base_handler.h"
+#include "walle.h"
+
#include <ydb/core/base/appdata.h>
#include <ydb/core/mon/mon.h>
-
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
#include <library/cpp/actors/core/mon.h>
#include <library/cpp/mime/types/mime.h>
#include <library/cpp/resource/resource.h>
-
-namespace NKikimr {
-namespace NCms {
-
-template <typename HandlerActorType>
-class TApiMethodHandler : public TApiMethodHandlerBase {
-public:
- IActor *CreateHandlerActor(NMon::TEvHttpInfo::TPtr &event) override
- {
- return new HandlerActorType(event);
- }
-};
-
-class TCmsHttp : public TActorBootstrapped<TCmsHttp> {
-public:
+
+namespace NKikimr {
+namespace NCms {
+
+template <typename HandlerActorType>
+class TApiMethodHandler : public TApiMethodHandlerBase {
+public:
+ IActor *CreateHandlerActor(NMon::TEvHttpInfo::TPtr &event) override
+ {
+ return new HandlerActorType(event);
+ }
+};
+
+class TCmsHttp : public TActorBootstrapped<TCmsHttp> {
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_SERVICE_PROXY;
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- Become(&TThis::StateWork);
- NActors::TMon *mon = AppData(ctx)->Mon;
- if (mon) {
- mon->RegisterActorPage(nullptr, "cms", "Cluster Management System", false, ctx.ExecutorThread.ActorSystem, ctx.SelfID);
-
- ApiHandlers["/api/clusterstaterequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvClusterStateRequest,
- TEvCms::TEvClusterStateResponse>>;
- ApiHandlers["/api/permissionrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvPermissionRequest,
- TEvCms::TEvPermissionResponse>>;
- ApiHandlers["/api/managerequestrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvManageRequestRequest,
- TEvCms::TEvManageRequestResponse>>;
- ApiHandlers["/api/checkrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvCheckRequest,
- TEvCms::TEvPermissionResponse>>;
- ApiHandlers["/api/managepermissionrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvManagePermissionRequest,
- TEvCms::TEvManagePermissionResponse>>;
- ApiHandlers["/api/conditionalpermissionrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvConditionalPermissionRequest,
- TEvCms::TEvPermissionResponse>>;
- ApiHandlers["/api/notification"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvNotification,
- TEvCms::TEvNotificationResponse>>;
- ApiHandlers["/api/managenotificationrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvManageNotificationRequest,
- TEvCms::TEvManageNotificationResponse>>;
- ApiHandlers["/api/managenotificationrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvManageNotificationRequest,
- TEvCms::TEvManageNotificationResponse>>;
-
- ApiHandlers["/api/console/configure"] = new TApiMethodHandler<TJsonProxyConsole<NConsole::TEvConsole::TEvConfigureRequest,
- NConsole::TEvConsole::TEvConfigureResponse>>;
- ApiHandlers["/api/json/log"] = new TApiMethodHandler<TJsonProxyLog>;
- ApiHandlers["/api/json/configitems"] = new TApiMethodHandler<TJsonProxyConfigItems>;
- ApiHandlers["/api/json/configvalidators"] = new TApiMethodHandler<TJsonProxyConfigValidators>;
- ApiHandlers["/api/json/toggleconfigvalidator"] = new TApiMethodHandler<TJsonProxyToggleConfigValidator>;
- ApiHandlers["/api/json/configupdates"] = new TApiMethodHandler<TJsonProxyConfigUpdates>;
- ApiHandlers["/api/json/proto"] = new TApiMethodHandler<TJsonProxyProto>;
-
- ApiHandlers["/api/datashard/json/getinfo"]
- = new TApiMethodHandler<TJsonProxyDataShard<TEvDataShard::TEvGetInfoRequest,
- TEvDataShard::TEvGetInfoResponse>>;
- ApiHandlers["/api/datashard/json/listoperations"]
- = new TApiMethodHandler<TJsonProxyDataShard<TEvDataShard::TEvListOperationsRequest,
- TEvDataShard::TEvListOperationsResponse>>;
- ApiHandlers["/api/datashard/json/getoperation"]
- = new TApiMethodHandler<TJsonProxyDataShardGetOperation>;
- ApiHandlers["/api/datashard/json/getreadtablesinkstate"]
- = new TApiMethodHandler<TJsonProxyDataShardGetReadTableSinkState>;
- ApiHandlers["/api/datashard/json/getreadtablescanstate"]
- = new TApiMethodHandler<TJsonProxyDataShardGetReadTableScanState>;
- ApiHandlers["/api/datashard/json/getreadtablestreamstate"]
- = new TApiMethodHandler<TJsonProxyDataShardGetReadTableStreamState>;
- ApiHandlers["/api/datashard/json/getslowopprofiles"]
- = new TApiMethodHandler<TJsonProxyDataShardGetSlowOpProfiles>;
- ApiHandlers["/api/datashard/json/getrsinfo"]
- = new TApiMethodHandler<TJsonProxyDataShardGetRSInfo>;
- ApiHandlers["/api/datashard/json/getdatahist"]
- = new TApiMethodHandler<TJsonProxyDataShardGetDataHistogram>;
-
- ApiHandlers[WALLE_API_URL_PREFIX] = new TWalleApiHandler;
- }
- }
-
-private:
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(NMon::TEvHttpInfo, Handle);
- }
- }
-
- void ReplyWithFile(NMon::TEvHttpInfo::TPtr &ev,
- const TActorContext &ctx,
- const TString& name)
- {
- TString filename = TString("cms/ui") + name;
- if (filename.EndsWith('/'))
- filename += "index.html";
- else if (name == "")
- filename += "/index.html";
-
- TString blob;
- TString type;
- if (NResource::FindExact(filename, &blob))
- type = mimetypeByExt(filename.c_str());
-
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ Become(&TThis::StateWork);
+ NActors::TMon *mon = AppData(ctx)->Mon;
+ if (mon) {
+ mon->RegisterActorPage(nullptr, "cms", "Cluster Management System", false, ctx.ExecutorThread.ActorSystem, ctx.SelfID);
+
+ ApiHandlers["/api/clusterstaterequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvClusterStateRequest,
+ TEvCms::TEvClusterStateResponse>>;
+ ApiHandlers["/api/permissionrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvPermissionRequest,
+ TEvCms::TEvPermissionResponse>>;
+ ApiHandlers["/api/managerequestrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvManageRequestRequest,
+ TEvCms::TEvManageRequestResponse>>;
+ ApiHandlers["/api/checkrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvCheckRequest,
+ TEvCms::TEvPermissionResponse>>;
+ ApiHandlers["/api/managepermissionrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvManagePermissionRequest,
+ TEvCms::TEvManagePermissionResponse>>;
+ ApiHandlers["/api/conditionalpermissionrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvConditionalPermissionRequest,
+ TEvCms::TEvPermissionResponse>>;
+ ApiHandlers["/api/notification"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvNotification,
+ TEvCms::TEvNotificationResponse>>;
+ ApiHandlers["/api/managenotificationrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvManageNotificationRequest,
+ TEvCms::TEvManageNotificationResponse>>;
+ ApiHandlers["/api/managenotificationrequest"] = new TApiMethodHandler<TJsonProxyCms<TEvCms::TEvManageNotificationRequest,
+ TEvCms::TEvManageNotificationResponse>>;
+
+ ApiHandlers["/api/console/configure"] = new TApiMethodHandler<TJsonProxyConsole<NConsole::TEvConsole::TEvConfigureRequest,
+ NConsole::TEvConsole::TEvConfigureResponse>>;
+ ApiHandlers["/api/json/log"] = new TApiMethodHandler<TJsonProxyLog>;
+ ApiHandlers["/api/json/configitems"] = new TApiMethodHandler<TJsonProxyConfigItems>;
+ ApiHandlers["/api/json/configvalidators"] = new TApiMethodHandler<TJsonProxyConfigValidators>;
+ ApiHandlers["/api/json/toggleconfigvalidator"] = new TApiMethodHandler<TJsonProxyToggleConfigValidator>;
+ ApiHandlers["/api/json/configupdates"] = new TApiMethodHandler<TJsonProxyConfigUpdates>;
+ ApiHandlers["/api/json/proto"] = new TApiMethodHandler<TJsonProxyProto>;
+
+ ApiHandlers["/api/datashard/json/getinfo"]
+ = new TApiMethodHandler<TJsonProxyDataShard<TEvDataShard::TEvGetInfoRequest,
+ TEvDataShard::TEvGetInfoResponse>>;
+ ApiHandlers["/api/datashard/json/listoperations"]
+ = new TApiMethodHandler<TJsonProxyDataShard<TEvDataShard::TEvListOperationsRequest,
+ TEvDataShard::TEvListOperationsResponse>>;
+ ApiHandlers["/api/datashard/json/getoperation"]
+ = new TApiMethodHandler<TJsonProxyDataShardGetOperation>;
+ ApiHandlers["/api/datashard/json/getreadtablesinkstate"]
+ = new TApiMethodHandler<TJsonProxyDataShardGetReadTableSinkState>;
+ ApiHandlers["/api/datashard/json/getreadtablescanstate"]
+ = new TApiMethodHandler<TJsonProxyDataShardGetReadTableScanState>;
+ ApiHandlers["/api/datashard/json/getreadtablestreamstate"]
+ = new TApiMethodHandler<TJsonProxyDataShardGetReadTableStreamState>;
+ ApiHandlers["/api/datashard/json/getslowopprofiles"]
+ = new TApiMethodHandler<TJsonProxyDataShardGetSlowOpProfiles>;
+ ApiHandlers["/api/datashard/json/getrsinfo"]
+ = new TApiMethodHandler<TJsonProxyDataShardGetRSInfo>;
+ ApiHandlers["/api/datashard/json/getdatahist"]
+ = new TApiMethodHandler<TJsonProxyDataShardGetDataHistogram>;
+
+ ApiHandlers[WALLE_API_URL_PREFIX] = new TWalleApiHandler;
+ }
+ }
+
+private:
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(NMon::TEvHttpInfo, Handle);
+ }
+ }
+
+ void ReplyWithFile(NMon::TEvHttpInfo::TPtr &ev,
+ const TActorContext &ctx,
+ const TString& name)
+ {
+ TString filename = TString("cms/ui") + name;
+ if (filename.EndsWith('/'))
+ filename += "index.html";
+ else if (name == "")
+ filename += "/index.html";
+
+ TString blob;
+ TString type;
+ if (NResource::FindExact(filename, &blob))
+ type = mimetypeByExt(filename.c_str());
+
if (blob.empty()) {
- ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(TString(NMonitoring::HTTPNOTFOUND), 0,
- NMon::IEvHttpInfoRes::EContentType::Custom));
- return;
- }
-
+ ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(TString(NMonitoring::HTTPNOTFOUND), 0,
+ NMon::IEvHttpInfoRes::EContentType::Custom));
+ return;
+ }
+
if (filename == "cms/ui/index.html") {
- type = "text/html";
+ type = "text/html";
}
TStringStream response;
@@ -138,8 +138,8 @@ private:
response << "\r\n";
response.Write(blob.data(), blob.size());
ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(response.Str(), 0, NMon::IEvHttpInfoRes::EContentType::Custom));
- }
-
+ }
+
static TString DumpRequest(const NMonitoring::IMonHttpRequest& request) {
TStringBuilder result;
result << "{";
@@ -163,46 +163,46 @@ private:
return result;
}
- void Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx)
- {
- Y_UNUSED(ctx);
-
- NMon::TEvHttpInfo *msg = ev->Get();
-
+ void Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx)
+ {
+ Y_UNUSED(ctx);
+
+ NMon::TEvHttpInfo *msg = ev->Get();
+
LOG_DEBUG_S(ctx, NKikimrServices::CMS, "HTTP request"
<< ": dump# " << DumpRequest(msg->Request));
-
- // Check for API call.
+
+ // Check for API call.
if (msg->Request.GetPathInfo().StartsWith("/api/")) {
- // Check for Wall-E call.
+ // Check for Wall-E call.
if (msg->Request.GetPathInfo().StartsWith(WALLE_API_URL_PREFIX)) {
- ctx.ExecutorThread.RegisterActor(ApiHandlers.find(WALLE_API_URL_PREFIX)->second->CreateHandlerActor(ev));
- return;
- }
-
+ ctx.ExecutorThread.RegisterActor(ApiHandlers.find(WALLE_API_URL_PREFIX)->second->CreateHandlerActor(ev));
+ return;
+ }
+
auto it = ApiHandlers.find(msg->Request.GetPathInfo());
- if (it != ApiHandlers.end()) {
- ctx.ExecutorThread.RegisterActor(it->second->CreateHandlerActor(ev));
- return;
- }
-
- // Wrong API method called.
- ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(TString(NMonitoring::HTTPNOTFOUND) + HELP_LINK, 0,
- NMon::IEvHttpInfoRes::EContentType::Custom));
- return;
- }
-
+ if (it != ApiHandlers.end()) {
+ ctx.ExecutorThread.RegisterActor(it->second->CreateHandlerActor(ev));
+ return;
+ }
+
+ // Wrong API method called.
+ ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(TString(NMonitoring::HTTPNOTFOUND) + HELP_LINK, 0,
+ NMon::IEvHttpInfoRes::EContentType::Custom));
+ return;
+ }
+
ReplyWithFile(ev, ctx, TString{msg->Request.GetPathInfo()});
- }
-
+ }
+
THashMap<TString, TAutoPtr<TApiMethodHandlerBase>> ApiHandlers;
-
- const TStringBuf HELP_LINK = "Check /api/help for usage details";
-};
-
-IActor *CreateCmsHttp() {
- return new TCmsHttp();
-}
-
-} // NCms
-} // NKikimr
+
+ const TStringBuf HELP_LINK = "Check /api/help for usage details";
+};
+
+IActor *CreateCmsHttp() {
+ return new TCmsHttp();
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/http.h b/ydb/core/cms/http.h
index efa330da382..1401d2b89b1 100644
--- a/ydb/core/cms/http.h
+++ b/ydb/core/cms/http.h
@@ -1,13 +1,13 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <library/cpp/actors/core/actor.h>
-
-namespace NKikimr {
-namespace NCms {
-
-IActor *CreateCmsHttp();
-
-} // NCms
-} // NKikimr
+
+namespace NKikimr {
+namespace NCms {
+
+IActor *CreateCmsHttp();
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/info_collector.cpp b/ydb/core/cms/info_collector.cpp
index 8429b0e72af..02766b3e497 100644
--- a/ydb/core/cms/info_collector.cpp
+++ b/ydb/core/cms/info_collector.cpp
@@ -1,11 +1,11 @@
-#include "cms_impl.h"
+#include "cms_impl.h"
#include "info_collector.h"
-
+
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/blobstorage/base/blobstorage_events.h>
#include <ydb/core/mind/tenant_pool.h>
#include <ydb/core/node_whiteboard/node_whiteboard.h>
-
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
#include <library/cpp/actors/core/interconnect.h>
@@ -18,28 +18,28 @@
#define LOG_W(stream) LOG_WARN_S (*TlsActivationContext, NKikimrServices::CMS, "[InfoCollector] " << stream)
#define LOG_E(stream) LOG_ERROR_S (*TlsActivationContext, NKikimrServices::CMS, "[InfoCollector] " << stream)
-namespace NKikimr {
-namespace NCms {
-
+namespace NKikimr {
+namespace NCms {
+
using namespace NNodeWhiteboard;
using namespace NKikimrWhiteboard;
-
+
class TInfoCollector: public TActorBootstrapped<TInfoCollector> {
public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::CMS_INFO_COLLECTOR;
}
-
+
explicit TInfoCollector(const TActorId& client, const TDuration& timeout)
: Client(client)
, Timeout(timeout)
, Info(new TClusterInfo)
, BaseConfigReceived(false)
{
- }
-
+ }
+
void Bootstrap();
-
+
private:
STATEFN(StateWork) {
switch (ev->GetTypeRewrite()) {
@@ -68,12 +68,12 @@ private:
<< ": type# " << ev->GetTypeRewrite()
<< ", event# " << (ev->HasEvent() ? ev->GetBase()->ToString() : "serialized?"));
}
- }
-
+ }
+
void ReplyAndDie();
void MaybeReplyAndDie();
void PassAway() override;
-
+
// Nodes
void Handle(TEvInterconnect::TEvNodesInfo::TPtr& ev);
@@ -100,51 +100,51 @@ private:
private:
const TActorId Client;
const TDuration Timeout;
-
+
TClusterInfoPtr Info;
TActorId BscPipe;
bool BaseConfigReceived;
THashMap<ui32, TSet<ui32>> NodeEvents; // nodeId -> expected events
THashMap<TPDiskID, TPDiskStateInfo, TPDiskIDHash> PDiskInfo;
THashMap<TVDiskID, TVDiskStateInfo> VDiskInfo;
-
+
}; // TInfoCollector
-
+
void TInfoCollector::ReplyAndDie() {
auto ev = MakeHolder<TCms::TEvPrivate::TEvClusterInfo>();
ev->Success = BaseConfigReceived;
-
+
if (BaseConfigReceived) {
for (const auto& [id, info] : PDiskInfo) {
Info->UpdatePDiskState(id, info);
}
-
+
for (const auto& [id, info] : VDiskInfo) {
Info->UpdateVDiskState(id, info);
}
-
+
ev->Info = Info;
ev->Info->SetTimestamp(TlsActivationContext->Now());
- }
-
+ }
+
Send(Client, std::move(ev));
PassAway();
-}
-
+}
+
void TInfoCollector::MaybeReplyAndDie() {
if (!BaseConfigReceived) {
- return;
+ return;
}
-
+
for (const auto& [nodeId, events] : NodeEvents) {
if (!events.empty()) {
- return;
+ return;
}
}
ReplyAndDie();
-}
-
+}
+
void TInfoCollector::PassAway() {
for (const auto& [nodeId, _] : NodeEvents) {
Send(TActivationContext::InterconnectProxy(nodeId), new TEvents::TEvUnsubscribe());
@@ -155,23 +155,23 @@ void TInfoCollector::PassAway() {
}
TActorBootstrapped::PassAway();
-}
-
+}
+
void TInfoCollector::Bootstrap() {
Send(GetNameserviceActorId(), new TEvInterconnect::TEvListNodes());
Schedule(Timeout, new TEvents::TEvWakeup());
Become(&TThis::StateWork);
}
-
+
void TInfoCollector::Handle(TEvInterconnect::TEvNodesInfo::TPtr& ev) {
RequestBaseConfig();
-
+
for (const auto& node : ev->Get()->Nodes) {
Info->AddNode(node, &TlsActivationContext->AsActorContext());
SendNodeRequests(node.NodeId);
- }
+ }
}
-
+
void TInfoCollector::RequestBaseConfig() {
using namespace NTabletPipe;
@@ -186,19 +186,19 @@ void TInfoCollector::RequestBaseConfig() {
ev->Record.MutableRequest()->AddCommand()->MutableQueryBaseConfig();
SendData(SelfId(), BscPipe, ev.Release());
}
-}
-
+}
+
void TInfoCollector::Handle(TEvBlobStorage::TEvControllerConfigResponse::TPtr& ev) {
const auto& record = ev->Get()->Record.GetResponse();
LOG_D("Got base config"
<< ": record# " << record.ShortDebugString());
-
+
if (!record.GetSuccess() || !record.StatusSize() || !record.GetStatus(0).GetSuccess()) {
LOG_E("Couldn't get base config");
ReplyAndDie();
} else {
BaseConfigReceived = true;
-
+
for (const auto& pdisk : record.GetStatus(0).GetBaseConfig().GetPDisk()) {
Info->AddPDisk(pdisk);
}
@@ -212,23 +212,23 @@ void TInfoCollector::Handle(TEvBlobStorage::TEvControllerConfigResponse::TPtr& e
}
MaybeReplyAndDie();
- }
+ }
}
-
+
void TInfoCollector::Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev) {
const auto& msg = *ev->Get();
if (msg.ClientId == BscPipe && msg.Status != NKikimrProto::OK) {
OnPipeDestroyed();
}
-}
-
+}
+
void TInfoCollector::Handle(TEvTabletPipe::TEvClientDestroyed::TPtr& ev) {
const auto& msg = *ev->Get();
if (msg.ClientId == BscPipe) {
OnPipeDestroyed();
- }
+ }
}
-
+
void TInfoCollector::OnPipeDestroyed() {
LOG_W("BscPipe destroyed");
@@ -239,53 +239,53 @@ void TInfoCollector::OnPipeDestroyed() {
if (!BaseConfigReceived) {
RequestBaseConfig();
}
-}
-
+}
+
void TInfoCollector::SendNodeRequests(ui32 nodeId) {
const TActorId whiteBoardId = MakeNodeWhiteboardServiceId(nodeId);
SendNodeEvent(nodeId, whiteBoardId, new TEvWhiteboard::TEvSystemStateRequest(), TEvWhiteboard::EvSystemStateResponse);
SendNodeEvent(nodeId, whiteBoardId, new TEvWhiteboard::TEvTabletStateRequest(), TEvWhiteboard::EvTabletStateResponse);
SendNodeEvent(nodeId, whiteBoardId, new TEvWhiteboard::TEvPDiskStateRequest(), TEvWhiteboard::EvPDiskStateResponse);
SendNodeEvent(nodeId, whiteBoardId, new TEvWhiteboard::TEvVDiskStateRequest(), TEvWhiteboard::EvVDiskStateResponse);
-
+
const auto domains = AppData()->DomainsInfo->Domains;
Y_VERIFY(domains.size() <= 1);
-
+
for (const auto& domain : domains) {
const TActorId tenantPoolId = MakeTenantPoolID(nodeId, domain.second->DomainUid);
SendNodeEvent(nodeId, tenantPoolId, new TEvTenantPool::TEvGetStatus(true), TEvTenantPool::EvTenantPoolStatus);
- }
+ }
}
-
+
void TInfoCollector::SendNodeEvent(ui32 nodeId, const TActorId& recipient, IEventBase* request, ui32 responseType) {
Send(recipient, request, IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession, nodeId);
NodeEvents[nodeId].insert(responseType);
-}
-
+}
+
bool TInfoCollector::IsNodeInfoRequired(ui32 nodeId, ui32 eventType) const {
auto it = NodeEvents.find(nodeId);
if (it == NodeEvents.end()) {
LOG_W("Got info from unknown node"
<< ": nodeId# " << nodeId);
return false;
- }
-
+ }
+
return it->second.contains(eventType);
-}
-
+}
+
void TInfoCollector::ResponseProcessed(ui32 nodeId, ui32 eventType) {
Y_VERIFY_S(NodeEvents.contains(nodeId), "Unexpected node"
<< ": nodeId# " << nodeId);
Y_VERIFY_S(NodeEvents[nodeId].contains(eventType), "Unexpected event"
<< ": nodeId# " << nodeId
<< ", eventType# " << eventType);
-
+
NodeEvents[nodeId].erase(eventType);
if (NodeEvents[nodeId].empty()) {
MaybeReplyAndDie();
}
}
-
+
void TInfoCollector::Handle(TEvWhiteboard::TEvSystemStateResponse::TPtr& ev) {
const ui32 nodeId = ev->Sender.NodeId();
const auto& record = ev->Get()->Record;
@@ -295,81 +295,81 @@ void TInfoCollector::Handle(TEvWhiteboard::TEvSystemStateResponse::TPtr& ev) {
<< ", record# " << record.DebugString());
if (!IsNodeInfoRequired(nodeId, ev->Type)) {
- return;
+ return;
}
-
+
if (record.SystemStateInfoSize() != 1) {
LOG_E("Unexpected system state's size"
<< ": nodeId# " << nodeId
<< ", size# " << record.SystemStateInfoSize());
- return;
- }
-
+ return;
+ }
+
Info->SetNodeState(nodeId, NKikimrCms::UP, record.GetSystemStateInfo(0));
ResponseProcessed(nodeId, ev->Type);
-}
-
+}
+
void TInfoCollector::Handle(TEvWhiteboard::TEvTabletStateResponse::TPtr& ev) {
const ui32 nodeId = ev->Sender.NodeId();
const auto& record = ev->Get()->Record;
-
+
LOG_D("Got tablet state"
<< ": nodeId# " << nodeId
<< ", record# " << record.DebugString());
-
+
if (!IsNodeInfoRequired(nodeId, ev->Type)) {
- return;
+ return;
}
-
+
for (const auto& info : record.GetTabletStateInfo()) {
- Info->AddTablet(nodeId, info);
+ Info->AddTablet(nodeId, info);
}
-
+
ResponseProcessed(nodeId, ev->Type);
-}
-
+}
+
void TInfoCollector::Handle(TEvWhiteboard::TEvPDiskStateResponse::TPtr& ev) {
const ui32 nodeId = ev->Sender.NodeId();
auto& record = ev->Get()->Record;
-
+
LOG_D("Got PDisk state"
<< ": nodeId# " << nodeId
<< ", record# " << record.DebugString());
-
+
if (!IsNodeInfoRequired(nodeId, ev->Type)) {
- return;
+ return;
}
-
+
for (ui32 i = 0; i < record.PDiskStateInfoSize(); ++i) {
auto* info = record.MutablePDiskStateInfo(i);
const auto id = TPDiskID(nodeId, info->GetPDiskId());
- PDiskInfo[id].Swap(info);
- }
-
+ PDiskInfo[id].Swap(info);
+ }
+
ResponseProcessed(nodeId, ev->Type);
-}
-
+}
+
void TInfoCollector::Handle(TEvWhiteboard::TEvVDiskStateResponse::TPtr& ev) {
const ui32 nodeId = ev->Sender.NodeId();
auto& record = ev->Get()->Record;
-
+
LOG_D("Got VDisk state"
<< ": nodeId# " << nodeId
<< ", record# " << record.DebugString());
-
+
if (!IsNodeInfoRequired(nodeId, ev->Type)) {
- return;
+ return;
}
-
+
for (ui32 i = 0; i < record.VDiskStateInfoSize(); ++i) {
auto* info = record.MutableVDiskStateInfo(i);
const auto id = VDiskIDFromVDiskID(info->GetVDiskId());
- VDiskInfo[id].Swap(info);
- }
-
+ VDiskInfo[id].Swap(info);
+ }
+
ResponseProcessed(nodeId, ev->Type);
-}
-
+}
+
void TInfoCollector::Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr& ev) {
const ui32 nodeId = ev->Sender.NodeId();
const auto& record = ev->Get()->Record;
@@ -384,8 +384,8 @@ void TInfoCollector::Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr& ev) {
Info->AddNodeTenants(nodeId, record);
ResponseProcessed(nodeId, ev->Type);
-}
-
+}
+
void TInfoCollector::Handle(TEvents::TEvUndelivered::TPtr& ev) {
const auto& msg = *ev->Get();
const ui32 nodeId = ev->Cookie;
@@ -410,28 +410,28 @@ void TInfoCollector::Handle(TEvents::TEvUndelivered::TPtr& ev) {
}
MaybeReplyAndDie();
-}
-
+}
+
void TInfoCollector::Handle(TEvInterconnect::TEvNodeDisconnected::TPtr& ev) {
const ui32 nodeId = ev->Get()->NodeId;
LOG_D("Disconnected"
<< ": nodeId# " << nodeId);
-
+
if (!NodeEvents.contains(nodeId)) {
LOG_E("Disconnected unknown node"
<< ": nodeId# " << nodeId);
- return;
+ return;
}
-
+
Info->ClearNode(nodeId);
NodeEvents[nodeId].clear();
MaybeReplyAndDie();
-}
-
+}
+
IActor* CreateInfoCollector(const TActorId& client, const TDuration& timeout) {
- return new TInfoCollector(client, timeout);
+ return new TInfoCollector(client, timeout);
}
-} // NCms
-} // NKikimr
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/info_collector.h b/ydb/core/cms/info_collector.h
index 148c0136298..ec030909e6b 100644
--- a/ydb/core/cms/info_collector.h
+++ b/ydb/core/cms/info_collector.h
@@ -1,11 +1,11 @@
-#pragma once
-
-#include "defs.h"
-
-namespace NKikimr {
-namespace NCms {
-
+#pragma once
+
+#include "defs.h"
+
+namespace NKikimr {
+namespace NCms {
+
IActor* CreateInfoCollector(const TActorId& client, const TDuration& timeout);
-
-} // NCms
-} // NKikimr
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/json_proxy.h b/ydb/core/cms/json_proxy.h
index 3e7c660da91..185d0ce01b6 100644
--- a/ydb/core/cms/json_proxy.h
+++ b/ydb/core/cms/json_proxy.h
@@ -1,9 +1,9 @@
-#pragma once
-
+#pragma once
+
#include "audit_log.h"
#include <ydb/core/base/defs.h>
-
+
#include <library/cpp/actors/core/actor.h>
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
@@ -14,232 +14,232 @@
#include <ydb/core/cms/cms.h>
#include <ydb/core/cms/console/console.h>
#include <ydb/core/tx/datashard/datashard.h>
-
+
#include <library/cpp/protobuf/json/json2proto.h>
#include <library/cpp/protobuf/json/proto2json.h>
-
-#include <iostream>
-
-namespace NKikimr {
-namespace NCms {
-
-template <typename TRequestEvent, typename TResponseEvent>
-class TJsonProxyBase : public TActorBootstrapped<TJsonProxyBase<TRequestEvent, TResponseEvent>> {
-private:
- using TBase = TActorBootstrapped<TJsonProxyBase<TRequestEvent, TResponseEvent>>;
-
-protected:
- using TRequest = TRequestEvent;
- using TResponse = TResponseEvent;
-
-public:
+
+#include <iostream>
+
+namespace NKikimr {
+namespace NCms {
+
+template <typename TRequestEvent, typename TResponseEvent>
+class TJsonProxyBase : public TActorBootstrapped<TJsonProxyBase<TRequestEvent, TResponseEvent>> {
+private:
+ using TBase = TActorBootstrapped<TJsonProxyBase<TRequestEvent, TResponseEvent>>;
+
+protected:
+ using TRequest = TRequestEvent;
+ using TResponse = TResponseEvent;
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_SERVICE_PROXY;
- }
-
- TJsonProxyBase(NMon::TEvHttpInfo::TPtr &event)
- : RequestEvent(event)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ }
+
+ TJsonProxyBase(NMon::TEvHttpInfo::TPtr &event)
+ : RequestEvent(event)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
"TJsonProxyBase::Bootstrap url=" << RequestEvent->Get()->Request.GetPathInfo());
-
- auto dinfo = AppData(ctx)->DomainsInfo;
- if (dinfo->Domains.size() != 1) {
- ReplyWithErrorAndDie(TString("HTTP/1.1 501 Not Implemented\r\n\r\nMultiple domains are not supported."), ctx);
- return;
- }
-
- TAutoPtr<TRequestEvent> request = PrepareRequest(ctx);
- if (!request) {
- LOG_ERROR_S(ctx, NKikimrServices::CMS,
- "TJsonProxyBase no request to send was built");
- return;
- }
-
- ui64 tid = GetTabletId(ctx);
- if (!tid) {
- ReplyWithErrorAndDie(TString(NMonitoring::HTTPNOTFOUND) + " unknown tablet ID", ctx);
- return;
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS,
- "TJsonProxyBase send request to " << GetTabletName() << " tablet " << tid);
-
- NTabletPipe::TClientConfig pipeConfig;
+
+ auto dinfo = AppData(ctx)->DomainsInfo;
+ if (dinfo->Domains.size() != 1) {
+ ReplyWithErrorAndDie(TString("HTTP/1.1 501 Not Implemented\r\n\r\nMultiple domains are not supported."), ctx);
+ return;
+ }
+
+ TAutoPtr<TRequestEvent> request = PrepareRequest(ctx);
+ if (!request) {
+ LOG_ERROR_S(ctx, NKikimrServices::CMS,
+ "TJsonProxyBase no request to send was built");
+ return;
+ }
+
+ ui64 tid = GetTabletId(ctx);
+ if (!tid) {
+ ReplyWithErrorAndDie(TString(NMonitoring::HTTPNOTFOUND) + " unknown tablet ID", ctx);
+ return;
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS,
+ "TJsonProxyBase send request to " << GetTabletName() << " tablet " << tid);
+
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = {.RetryLimitCount = 10};
Pipe = ctx.RegisterWithSameMailbox(NTabletPipe::CreateClient(ctx.SelfID, tid, pipeConfig));
- NTabletPipe::SendData(ctx, Pipe, request.Release());
-
- TBase::Become(&TBase::TThis::StateWork, ctx, TDuration::Seconds(120), new TEvents::TEvWakeup());
- }
-
- virtual TAutoPtr<TRequestEvent> PrepareRequest(const TActorContext &ctx) = 0;
- virtual ui64 GetTabletId(const TActorContext &ctx) const = 0;
- virtual TString GetTabletName() const = 0;
-
-protected:
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TResponseEvent, Handle);
- CFunc(TEvents::TSystem::Wakeup, Timeout);
- CFunc(TEvTabletPipe::TEvClientDestroyed::EventType, Disconnect);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- default:
- LOG_DEBUG(ctx, NKikimrServices::CMS, "HTTP::StateWork ignored event type: %" PRIx32 " event: %s",
+ NTabletPipe::SendData(ctx, Pipe, request.Release());
+
+ TBase::Become(&TBase::TThis::StateWork, ctx, TDuration::Seconds(120), new TEvents::TEvWakeup());
+ }
+
+ virtual TAutoPtr<TRequestEvent> PrepareRequest(const TActorContext &ctx) = 0;
+ virtual ui64 GetTabletId(const TActorContext &ctx) const = 0;
+ virtual TString GetTabletName() const = 0;
+
+protected:
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TResponseEvent, Handle);
+ CFunc(TEvents::TSystem::Wakeup, Timeout);
+ CFunc(TEvTabletPipe::TEvClientDestroyed::EventType, Disconnect);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ default:
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "HTTP::StateWork ignored event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
- void ReplyWithErrorAndDie(const TString &err, const TActorContext &ctx)
- {
+ }
+ }
+
+ void ReplyWithErrorAndDie(const TString &err, const TActorContext &ctx)
+ {
ReplyAndDieImpl(err, ctx);
- }
-
- void ReplyAndDie(const typename TResponseEvent::ProtoRecordType &resp, const TActorContext &ctx)
- {
- auto config = NProtobufJson::TProto2JsonConfig()
- .SetFormatOutput(false)
- .SetEnumMode(NProtobufJson::TProto2JsonConfig::EnumName)
- .SetStringifyLongNumbers(NProtobufJson::TProto2JsonConfig::StringifyLongNumbersForDouble);
-
- auto json = NProtobufJson::Proto2Json(resp, config);
- ReplyAndDie(json, ctx);
- }
-
- void ReplyAndDie(const TString &json, const TActorContext &ctx)
- {
+ }
+
+ void ReplyAndDie(const typename TResponseEvent::ProtoRecordType &resp, const TActorContext &ctx)
+ {
+ auto config = NProtobufJson::TProto2JsonConfig()
+ .SetFormatOutput(false)
+ .SetEnumMode(NProtobufJson::TProto2JsonConfig::EnumName)
+ .SetStringifyLongNumbers(NProtobufJson::TProto2JsonConfig::StringifyLongNumbersForDouble);
+
+ auto json = NProtobufJson::Proto2Json(resp, config);
+ ReplyAndDie(json, ctx);
+ }
+
+ void ReplyAndDie(const TString &json, const TActorContext &ctx)
+ {
ReplyAndDieImpl(TString(NMonitoring::HTTPOKJSON) + json, ctx);
}
-
+
void ReplyAndDieImpl(const TString &data, const TActorContext &ctx)
{
AuditLog("JsonProxy", RequestEvent, data, ctx);
ctx.Send(RequestEvent->Sender, new NMon::TEvHttpInfoRes(data, 0, NMon::IEvHttpInfoRes::EContentType::Custom));
- TBase::Die(ctx);
- }
-
- void Die(const TActorContext& ctx) override
- {
- NTabletPipe::CloseClient(ctx, Pipe);
- TBase::Die(ctx);
- }
-
- void Handle(typename TResponseEvent::TPtr &ev, const TActorContext &ctx)
- {
- ReplyAndDie(ev->Get()->Record, ctx);
- }
-
- void SetTempError(NKikimrCms::TStatus &status,
- const TString &error)
- {
- status.SetCode(NKikimrCms::TStatus::ERROR_TEMP);
- status.SetReason(error);
- }
-
- void SetTempError(NKikimrConsole::TStatus &status,
- const TString &error)
- {
- status.SetCode(Ydb::StatusIds::UNAVAILABLE);
- status.SetReason(error);
- }
-
- void SetTempError(NKikimrTxDataShard::TStatus &status,
- const TString &error)
- {
- status.SetCode(Ydb::StatusIds::UNAVAILABLE);
- auto *issue = status.AddIssues();
- issue->set_severity(NYql::TSeverityIds::S_ERROR);
- issue->set_message(error);
- }
-
- void Timeout(const TActorContext& ctx)
- {
- typename TResponseEvent::ProtoRecordType rec;
- SetTempError(*rec.MutableStatus(), "Request timeout.");
- ReplyAndDie(rec, ctx);
- }
-
- void Disconnect(const TActorContext& ctx)
- {
- typename TResponseEvent::ProtoRecordType rec;
- SetTempError(*rec.MutableStatus(), GetTabletName() + " disconnected.");
- ReplyAndDie(rec, ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) noexcept
- {
- if (ev->Get()->Status != NKikimrProto::OK) {
- typename TResponseEvent::ProtoRecordType rec;
- SetTempError(*rec.MutableStatus(), GetTabletName() + " is unavailable.");
- ReplyAndDie(rec, ctx);
- }
- }
-
- NMon::TEvHttpInfo::TPtr RequestEvent;
+ TBase::Die(ctx);
+ }
+
+ void Die(const TActorContext& ctx) override
+ {
+ NTabletPipe::CloseClient(ctx, Pipe);
+ TBase::Die(ctx);
+ }
+
+ void Handle(typename TResponseEvent::TPtr &ev, const TActorContext &ctx)
+ {
+ ReplyAndDie(ev->Get()->Record, ctx);
+ }
+
+ void SetTempError(NKikimrCms::TStatus &status,
+ const TString &error)
+ {
+ status.SetCode(NKikimrCms::TStatus::ERROR_TEMP);
+ status.SetReason(error);
+ }
+
+ void SetTempError(NKikimrConsole::TStatus &status,
+ const TString &error)
+ {
+ status.SetCode(Ydb::StatusIds::UNAVAILABLE);
+ status.SetReason(error);
+ }
+
+ void SetTempError(NKikimrTxDataShard::TStatus &status,
+ const TString &error)
+ {
+ status.SetCode(Ydb::StatusIds::UNAVAILABLE);
+ auto *issue = status.AddIssues();
+ issue->set_severity(NYql::TSeverityIds::S_ERROR);
+ issue->set_message(error);
+ }
+
+ void Timeout(const TActorContext& ctx)
+ {
+ typename TResponseEvent::ProtoRecordType rec;
+ SetTempError(*rec.MutableStatus(), "Request timeout.");
+ ReplyAndDie(rec, ctx);
+ }
+
+ void Disconnect(const TActorContext& ctx)
+ {
+ typename TResponseEvent::ProtoRecordType rec;
+ SetTempError(*rec.MutableStatus(), GetTabletName() + " disconnected.");
+ ReplyAndDie(rec, ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ if (ev->Get()->Status != NKikimrProto::OK) {
+ typename TResponseEvent::ProtoRecordType rec;
+ SetTempError(*rec.MutableStatus(), GetTabletName() + " is unavailable.");
+ ReplyAndDie(rec, ctx);
+ }
+ }
+
+ NMon::TEvHttpInfo::TPtr RequestEvent;
TActorId Pipe;
-};
-
-template <typename TRequestEvent, typename TResponseEvent>
-class TJsonProxy : public TJsonProxyBase<TRequestEvent, TResponseEvent> {
-private:
- using TBase = TJsonProxyBase<TRequestEvent, TResponseEvent>;
-
-public:
- TJsonProxy(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyBase<TRequestEvent, TResponseEvent>(event)
- {
- }
-
- TAutoPtr<TRequestEvent> PrepareRequest(const TActorContext &ctx) override
- {
- TAutoPtr<TRequestEvent> request = new TRequestEvent;
- NMon::TEvHttpInfo *msg = TBase::RequestEvent->Get();
-
- try {
+};
+
+template <typename TRequestEvent, typename TResponseEvent>
+class TJsonProxy : public TJsonProxyBase<TRequestEvent, TResponseEvent> {
+private:
+ using TBase = TJsonProxyBase<TRequestEvent, TResponseEvent>;
+
+public:
+ TJsonProxy(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyBase<TRequestEvent, TResponseEvent>(event)
+ {
+ }
+
+ TAutoPtr<TRequestEvent> PrepareRequest(const TActorContext &ctx) override
+ {
+ TAutoPtr<TRequestEvent> request = new TRequestEvent;
+ NMon::TEvHttpInfo *msg = TBase::RequestEvent->Get();
+
+ try {
const auto &json = msg->Request.GetPostContent();
- if (json)
- request->Record = NProtobufJson::Json2Proto<typename TRequestEvent::ProtoRecordType>(json);
- } catch (yexception e) {
- TBase::ReplyWithErrorAndDie(TString("HTTP/1.1 400 Bad Request\r\n\r\nCan't parse provided JSON: ") + e.what(), ctx);
- return nullptr;
- }
-
- return request;
- }
-};
-
-template <typename TRequestEvent, typename TResponseEvent, bool useConsole>
-class TJsonProxyCmsBase : public TJsonProxy<TRequestEvent, TResponseEvent> {
-public:
- TJsonProxyCmsBase(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxy<TRequestEvent, TResponseEvent>(event)
- {
- }
-
- ui64 GetTabletId(const TActorContext &ctx) const override
- {
- auto dinfo = AppData(ctx)->DomainsInfo;
- ui32 domain = dinfo->Domains.begin()->first;
- return useConsole ? MakeConsoleID(domain) : MakeCmsID(domain);
- }
-
- TString GetTabletName() const override
- {
- return useConsole ? "Console" : "CMS";
- }
-};
-
-template <typename TRequestEvent, typename TResponseEvent>
-using TJsonProxyCms = TJsonProxyCmsBase<TRequestEvent, TResponseEvent, false>;
-
-template <typename TRequestEvent, typename TResponseEvent>
-using TJsonProxyConsole = TJsonProxyCmsBase<TRequestEvent, TResponseEvent, true>;
-
-} // NCms
-} // NKikimr
+ if (json)
+ request->Record = NProtobufJson::Json2Proto<typename TRequestEvent::ProtoRecordType>(json);
+ } catch (yexception e) {
+ TBase::ReplyWithErrorAndDie(TString("HTTP/1.1 400 Bad Request\r\n\r\nCan't parse provided JSON: ") + e.what(), ctx);
+ return nullptr;
+ }
+
+ return request;
+ }
+};
+
+template <typename TRequestEvent, typename TResponseEvent, bool useConsole>
+class TJsonProxyCmsBase : public TJsonProxy<TRequestEvent, TResponseEvent> {
+public:
+ TJsonProxyCmsBase(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxy<TRequestEvent, TResponseEvent>(event)
+ {
+ }
+
+ ui64 GetTabletId(const TActorContext &ctx) const override
+ {
+ auto dinfo = AppData(ctx)->DomainsInfo;
+ ui32 domain = dinfo->Domains.begin()->first;
+ return useConsole ? MakeConsoleID(domain) : MakeCmsID(domain);
+ }
+
+ TString GetTabletName() const override
+ {
+ return useConsole ? "Console" : "CMS";
+ }
+};
+
+template <typename TRequestEvent, typename TResponseEvent>
+using TJsonProxyCms = TJsonProxyCmsBase<TRequestEvent, TResponseEvent, false>;
+
+template <typename TRequestEvent, typename TResponseEvent>
+using TJsonProxyConsole = TJsonProxyCmsBase<TRequestEvent, TResponseEvent, true>;
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/json_proxy_config_items.h b/ydb/core/cms/json_proxy_config_items.h
index 8a12670dd62..53fa0a2d9ba 100644
--- a/ydb/core/cms/json_proxy_config_items.h
+++ b/ydb/core/cms/json_proxy_config_items.h
@@ -1,41 +1,41 @@
-#pragma once
-
-#include "json_proxy.h"
-
+#pragma once
+
+#include "json_proxy.h"
+
#include <util/string/split.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TJsonProxyConfigItems : public TJsonProxyConsole<NConsole::TEvConsole::TEvGetConfigItemsRequest,
- NConsole::TEvConsole::TEvGetConfigItemsResponse> {
-private:
-
-public:
- TJsonProxyConfigItems(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyConsole<NConsole::TEvConsole::TEvGetConfigItemsRequest,
- NConsole::TEvConsole::TEvGetConfigItemsResponse>(event)
- {
- }
-
- TAutoPtr<TRequest> PrepareRequest(const TActorContext &) override
- {
- TAutoPtr<TRequest> request = new TRequest;
+
+namespace NKikimr {
+namespace NCms {
+
+class TJsonProxyConfigItems : public TJsonProxyConsole<NConsole::TEvConsole::TEvGetConfigItemsRequest,
+ NConsole::TEvConsole::TEvGetConfigItemsResponse> {
+private:
+
+public:
+ TJsonProxyConfigItems(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyConsole<NConsole::TEvConsole::TEvGetConfigItemsRequest,
+ NConsole::TEvConsole::TEvGetConfigItemsResponse>(event)
+ {
+ }
+
+ TAutoPtr<TRequest> PrepareRequest(const TActorContext &) override
+ {
+ TAutoPtr<TRequest> request = new TRequest;
const TCgiParameters& cgi = RequestEvent->Get()->Request.GetParams();
-
- if (cgi.Has("ids")) {
- TVector<TString> ids = StringSplitter(cgi.Get("ids")).Split(',').ToList<TString>();
- for (auto &idStr : ids) {
- ui64 id = 0;
- if (TryFromString<ui64>(idStr, id))
- request->Record.AddItemIds(id);
- }
- }
-
- return request;
- }
-};
-
-
-} // NCms
-} // NKikimr
+
+ if (cgi.Has("ids")) {
+ TVector<TString> ids = StringSplitter(cgi.Get("ids")).Split(',').ToList<TString>();
+ for (auto &idStr : ids) {
+ ui64 id = 0;
+ if (TryFromString<ui64>(idStr, id))
+ request->Record.AddItemIds(id);
+ }
+ }
+
+ return request;
+ }
+};
+
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/json_proxy_config_updates.h b/ydb/core/cms/json_proxy_config_updates.h
index b023d225d5a..1cf9b62e92b 100644
--- a/ydb/core/cms/json_proxy_config_updates.h
+++ b/ydb/core/cms/json_proxy_config_updates.h
@@ -1,48 +1,48 @@
-#pragma once
-
-#include "json_proxy.h"
-
+#pragma once
+
+#include "json_proxy.h"
+
#include <util/string/split.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TJsonProxyConfigUpdates : public TJsonProxyConsole<NConsole::TEvConsole::TEvCheckConfigUpdatesRequest,
- NConsole::TEvConsole::TEvCheckConfigUpdatesResponse> {
-private:
-
-public:
- TJsonProxyConfigUpdates(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyConsole<NConsole::TEvConsole::TEvCheckConfigUpdatesRequest,
- NConsole::TEvConsole::TEvCheckConfigUpdatesResponse>(event)
- {
- }
-
- TAutoPtr<TRequest> PrepareRequest(const TActorContext &) override
- {
- TAutoPtr<TRequest> request = new TRequest;
+
+namespace NKikimr {
+namespace NCms {
+
+class TJsonProxyConfigUpdates : public TJsonProxyConsole<NConsole::TEvConsole::TEvCheckConfigUpdatesRequest,
+ NConsole::TEvConsole::TEvCheckConfigUpdatesResponse> {
+private:
+
+public:
+ TJsonProxyConfigUpdates(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyConsole<NConsole::TEvConsole::TEvCheckConfigUpdatesRequest,
+ NConsole::TEvConsole::TEvCheckConfigUpdatesResponse>(event)
+ {
+ }
+
+ TAutoPtr<TRequest> PrepareRequest(const TActorContext &) override
+ {
+ TAutoPtr<TRequest> request = new TRequest;
const TCgiParameters& cgi = RequestEvent->Get()->Request.GetParams();
-
- if (cgi.Has("base")) {
- TVector<TString> ids = StringSplitter(cgi.Get("base")).Split(',').ToList<TString>();
- for (auto &item : ids) {
- TVector<TString> parts = StringSplitter(item).Split('.').ToList<TString>();
- ui64 id = 0;
- ui64 generation = 0;
- if (parts.size() == 2
- && TryFromString<ui64>(parts[0], id)
- && TryFromString<ui64>(parts[1], generation)) {
- auto &rec = *request->Record.AddBaseItemIds();
- rec.SetId(id);
- rec.SetGeneration(generation);
- }
- }
- }
-
- return request;
- }
-};
-
-
-} // NCms
-} // NKikimr
+
+ if (cgi.Has("base")) {
+ TVector<TString> ids = StringSplitter(cgi.Get("base")).Split(',').ToList<TString>();
+ for (auto &item : ids) {
+ TVector<TString> parts = StringSplitter(item).Split('.').ToList<TString>();
+ ui64 id = 0;
+ ui64 generation = 0;
+ if (parts.size() == 2
+ && TryFromString<ui64>(parts[0], id)
+ && TryFromString<ui64>(parts[1], generation)) {
+ auto &rec = *request->Record.AddBaseItemIds();
+ rec.SetId(id);
+ rec.SetGeneration(generation);
+ }
+ }
+ }
+
+ return request;
+ }
+};
+
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/json_proxy_config_validators.h b/ydb/core/cms/json_proxy_config_validators.h
index 6248dc8be23..98d981a1e37 100644
--- a/ydb/core/cms/json_proxy_config_validators.h
+++ b/ydb/core/cms/json_proxy_config_validators.h
@@ -1,30 +1,30 @@
-#pragma once
-
-#include "json_proxy.h"
-
+#pragma once
+
+#include "json_proxy.h"
+
#include <util/string/split.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TJsonProxyConfigValidators : public TJsonProxyConsole<NConsole::TEvConsole::TEvListConfigValidatorsRequest,
- NConsole::TEvConsole::TEvListConfigValidatorsResponse> {
-private:
-
-public:
- TJsonProxyConfigValidators(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyConsole<NConsole::TEvConsole::TEvListConfigValidatorsRequest,
- NConsole::TEvConsole::TEvListConfigValidatorsResponse>(event)
- {
- }
-
- TAutoPtr<TRequest> PrepareRequest(const TActorContext &) override
- {
- TAutoPtr<TRequest> request = new TRequest;
- return request;
- }
-};
-
-
-} // NCms
-} // NKikimr
+
+namespace NKikimr {
+namespace NCms {
+
+class TJsonProxyConfigValidators : public TJsonProxyConsole<NConsole::TEvConsole::TEvListConfigValidatorsRequest,
+ NConsole::TEvConsole::TEvListConfigValidatorsResponse> {
+private:
+
+public:
+ TJsonProxyConfigValidators(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyConsole<NConsole::TEvConsole::TEvListConfigValidatorsRequest,
+ NConsole::TEvConsole::TEvListConfigValidatorsResponse>(event)
+ {
+ }
+
+ TAutoPtr<TRequest> PrepareRequest(const TActorContext &) override
+ {
+ TAutoPtr<TRequest> request = new TRequest;
+ return request;
+ }
+};
+
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/json_proxy_log.h b/ydb/core/cms/json_proxy_log.h
index ce39075275b..70177824695 100644
--- a/ydb/core/cms/json_proxy_log.h
+++ b/ydb/core/cms/json_proxy_log.h
@@ -1,52 +1,52 @@
-#pragma once
-
-#include "json_proxy.h"
-
-namespace NKikimr {
-namespace NCms {
-
-class TJsonProxyLog : public TJsonProxyCms<TEvCms::TEvGetLogTailRequest, TEvCms::TEvGetLogTailResponse> {
-private:
-
-public:
- TJsonProxyLog(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyCms<TEvCms::TEvGetLogTailRequest, TEvCms::TEvGetLogTailResponse>(event)
- {
- }
-
- TAutoPtr<TRequest> PrepareRequest(const TActorContext &) override
- {
- TAutoPtr<TRequest> request = new TRequest;
+#pragma once
+
+#include "json_proxy.h"
+
+namespace NKikimr {
+namespace NCms {
+
+class TJsonProxyLog : public TJsonProxyCms<TEvCms::TEvGetLogTailRequest, TEvCms::TEvGetLogTailResponse> {
+private:
+
+public:
+ TJsonProxyLog(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyCms<TEvCms::TEvGetLogTailRequest, TEvCms::TEvGetLogTailResponse>(event)
+ {
+ }
+
+ TAutoPtr<TRequest> PrepareRequest(const TActorContext &) override
+ {
+ TAutoPtr<TRequest> request = new TRequest;
const TCgiParameters& cgi = RequestEvent->Get()->Request.GetParams();
-
- if (cgi.Has("limit")) {
- ui32 limit = 0;
- if (TryFromString<ui32>(cgi.Get("limit"), limit))
- request->Record.MutableLogFilter()->SetLimit(limit);
- }
- if (cgi.Has("from")) {
- ui64 val = 0;
- if (TryFromString<ui64>(cgi.Get("from"), val))
- request->Record.MutableLogFilter()->SetMinTimestamp(val);
- }
- if (cgi.Has("to")) {
- ui64 val = 0;
- if (TryFromString<ui64>(cgi.Get("to"), val))
- request->Record.MutableLogFilter()->SetMaxTimestamp(val);
- }
- if (cgi.Has("detailed")) {
- if (cgi.Get("detailed") == "1")
- request->Record.SetTextFormat(NKikimrCms::TEXT_FORMAT_DETAILED);
- }
- if (cgi.Has("data")) {
- if (cgi.Get("data") == "1")
- request->Record.SetIncludeData(true);
- }
-
- return request;
- }
-};
-
-
-} // NCms
-} // NKikimr
+
+ if (cgi.Has("limit")) {
+ ui32 limit = 0;
+ if (TryFromString<ui32>(cgi.Get("limit"), limit))
+ request->Record.MutableLogFilter()->SetLimit(limit);
+ }
+ if (cgi.Has("from")) {
+ ui64 val = 0;
+ if (TryFromString<ui64>(cgi.Get("from"), val))
+ request->Record.MutableLogFilter()->SetMinTimestamp(val);
+ }
+ if (cgi.Has("to")) {
+ ui64 val = 0;
+ if (TryFromString<ui64>(cgi.Get("to"), val))
+ request->Record.MutableLogFilter()->SetMaxTimestamp(val);
+ }
+ if (cgi.Has("detailed")) {
+ if (cgi.Get("detailed") == "1")
+ request->Record.SetTextFormat(NKikimrCms::TEXT_FORMAT_DETAILED);
+ }
+ if (cgi.Has("data")) {
+ if (cgi.Get("data") == "1")
+ request->Record.SetIncludeData(true);
+ }
+
+ return request;
+ }
+};
+
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/json_proxy_operations.h b/ydb/core/cms/json_proxy_operations.h
index f386ab52ffb..6bce70054d9 100644
--- a/ydb/core/cms/json_proxy_operations.h
+++ b/ydb/core/cms/json_proxy_operations.h
@@ -1,23 +1,23 @@
-#pragma once
-
-#include "json_proxy.h"
-
+#pragma once
+
+#include "json_proxy.h"
+
#include <util/string/split.h>
-
-namespace NKikimr {
-namespace NCms {
-
-template <typename TRequestEvent, typename TResponseEvent>
-class TJsonProxyDataShard : public TJsonProxy<TRequestEvent, TResponseEvent> {
-public:
- TJsonProxyDataShard(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxy<TRequestEvent, TResponseEvent>(event)
- {
- }
-
- ui64 GetTabletId(const TActorContext &) const override
- {
- const TCgiParameters &cgi = this->RequestEvent->Get()->Request.GetParams();
+
+namespace NKikimr {
+namespace NCms {
+
+template <typename TRequestEvent, typename TResponseEvent>
+class TJsonProxyDataShard : public TJsonProxy<TRequestEvent, TResponseEvent> {
+public:
+ TJsonProxyDataShard(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxy<TRequestEvent, TResponseEvent>(event)
+ {
+ }
+
+ ui64 GetTabletId(const TActorContext &) const override
+ {
+ const TCgiParameters &cgi = this->RequestEvent->Get()->Request.GetParams();
ui64 tabletId = 0;
if (cgi.Has("tabletid")) {
@@ -29,161 +29,161 @@ public:
}
return tabletId;
- }
-
- TString GetTabletName() const override
- {
- return "DataShard";
- }
-};
-
-class TJsonProxyDataShardGetOperation : public TJsonProxyDataShard<TEvDataShard::TEvGetOperationRequest,
- TEvDataShard::TEvGetOperationResponse> {
-private:
-
-public:
- TJsonProxyDataShardGetOperation(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyDataShard<TEvDataShard::TEvGetOperationRequest,
- TEvDataShard::TEvGetOperationResponse>(event)
- {
- }
-
- TAutoPtr<TEvDataShard::TEvGetOperationRequest> PrepareRequest(const TActorContext &) override
- {
- auto *request = new TEvDataShard::TEvGetOperationRequest;
- const TCgiParameters &cgi = RequestEvent->Get()->Request.GetParams();
- if (cgi.Has("opid")) {
- ui64 id;
- if (TryFromString(cgi.Get("opid"), id))
- request->Record.SetTxId(id);
- }
- return request;
- }
-};
-
-class TJsonProxyDataShardGetReadTableSinkState : public TJsonProxyDataShard<TEvDataShard::TEvGetReadTableSinkStateRequest,
- TEvDataShard::TEvGetReadTableSinkStateResponse> {
-private:
-
-public:
- TJsonProxyDataShardGetReadTableSinkState(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyDataShard<TEvDataShard::TEvGetReadTableSinkStateRequest,
- TEvDataShard::TEvGetReadTableSinkStateResponse>(event)
- {
- }
-
- TAutoPtr<TEvDataShard::TEvGetReadTableSinkStateRequest> PrepareRequest(const TActorContext &) override
- {
- auto *request = new TEvDataShard::TEvGetReadTableSinkStateRequest;
- const TCgiParameters &cgi = RequestEvent->Get()->Request.GetParams();
- if (cgi.Has("opid")) {
- ui64 id;
- if (TryFromString(cgi.Get("opid"), id))
- request->Record.SetTxId(id);
- }
- return request;
- }
-};
-
-class TJsonProxyDataShardGetReadTableScanState : public TJsonProxyDataShard<TEvDataShard::TEvGetReadTableScanStateRequest,
- TEvDataShard::TEvGetReadTableScanStateResponse> {
-private:
-
-public:
- TJsonProxyDataShardGetReadTableScanState(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyDataShard<TEvDataShard::TEvGetReadTableScanStateRequest,
- TEvDataShard::TEvGetReadTableScanStateResponse>(event)
- {
- }
-
- TAutoPtr<TEvDataShard::TEvGetReadTableScanStateRequest> PrepareRequest(const TActorContext &) override
- {
- auto *request = new TEvDataShard::TEvGetReadTableScanStateRequest;
- const TCgiParameters &cgi = RequestEvent->Get()->Request.GetParams();
- if (cgi.Has("opid")) {
- ui64 id;
- if (TryFromString(cgi.Get("opid"), id))
- request->Record.SetTxId(id);
- }
- return request;
- }
-};
-
-class TJsonProxyDataShardGetReadTableStreamState : public TJsonProxyDataShard<TEvDataShard::TEvGetReadTableStreamStateRequest,
- TEvDataShard::TEvGetReadTableStreamStateResponse> {
-private:
-
-public:
- TJsonProxyDataShardGetReadTableStreamState(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyDataShard<TEvDataShard::TEvGetReadTableStreamStateRequest,
- TEvDataShard::TEvGetReadTableStreamStateResponse>(event)
- {
- }
-
- TAutoPtr<TEvDataShard::TEvGetReadTableStreamStateRequest> PrepareRequest(const TActorContext &) override
- {
- auto *request = new TEvDataShard::TEvGetReadTableStreamStateRequest;
- const TCgiParameters &cgi = RequestEvent->Get()->Request.GetParams();
- if (cgi.Has("opid")) {
- ui64 id;
- if (TryFromString(cgi.Get("opid"), id))
- request->Record.SetTxId(id);
- }
- return request;
- }
-};
-
-class TJsonProxyDataShardGetSlowOpProfiles : public TJsonProxyDataShard<TEvDataShard::TEvGetSlowOpProfilesRequest,
- TEvDataShard::TEvGetSlowOpProfilesResponse> {
-private:
-
-public:
- TJsonProxyDataShardGetSlowOpProfiles(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyDataShard<TEvDataShard::TEvGetSlowOpProfilesRequest,
- TEvDataShard::TEvGetSlowOpProfilesResponse>(event)
- {
- }
-
- TAutoPtr<TEvDataShard::TEvGetSlowOpProfilesRequest> PrepareRequest(const TActorContext &) override
- {
- return new TEvDataShard::TEvGetSlowOpProfilesRequest;
- }
-};
-
-class TJsonProxyDataShardGetRSInfo : public TJsonProxyDataShard<TEvDataShard::TEvGetRSInfoRequest,
- TEvDataShard::TEvGetRSInfoResponse> {
-private:
-
-public:
- TJsonProxyDataShardGetRSInfo(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyDataShard<TEvDataShard::TEvGetRSInfoRequest,
- TEvDataShard::TEvGetRSInfoResponse>(event)
- {
- }
-
- TAutoPtr<TEvDataShard::TEvGetRSInfoRequest> PrepareRequest(const TActorContext &) override
- {
- return new TEvDataShard::TEvGetRSInfoRequest;
- }
-};
-
-class TJsonProxyDataShardGetDataHistogram : public TJsonProxyDataShard<TEvDataShard::TEvGetDataHistogramRequest,
- TEvDataShard::TEvGetDataHistogramResponse> {
-private:
-
-public:
- TJsonProxyDataShardGetDataHistogram(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyDataShard<TEvDataShard::TEvGetDataHistogramRequest,
- TEvDataShard::TEvGetDataHistogramResponse>(event)
- {
- }
-
- TAutoPtr<TEvDataShard::TEvGetDataHistogramRequest> PrepareRequest(const TActorContext &) override
- {
- return new TEvDataShard::TEvGetDataHistogramRequest;
- }
-};
-
-
-} // NCms
-} // NKikimr
+ }
+
+ TString GetTabletName() const override
+ {
+ return "DataShard";
+ }
+};
+
+class TJsonProxyDataShardGetOperation : public TJsonProxyDataShard<TEvDataShard::TEvGetOperationRequest,
+ TEvDataShard::TEvGetOperationResponse> {
+private:
+
+public:
+ TJsonProxyDataShardGetOperation(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyDataShard<TEvDataShard::TEvGetOperationRequest,
+ TEvDataShard::TEvGetOperationResponse>(event)
+ {
+ }
+
+ TAutoPtr<TEvDataShard::TEvGetOperationRequest> PrepareRequest(const TActorContext &) override
+ {
+ auto *request = new TEvDataShard::TEvGetOperationRequest;
+ const TCgiParameters &cgi = RequestEvent->Get()->Request.GetParams();
+ if (cgi.Has("opid")) {
+ ui64 id;
+ if (TryFromString(cgi.Get("opid"), id))
+ request->Record.SetTxId(id);
+ }
+ return request;
+ }
+};
+
+class TJsonProxyDataShardGetReadTableSinkState : public TJsonProxyDataShard<TEvDataShard::TEvGetReadTableSinkStateRequest,
+ TEvDataShard::TEvGetReadTableSinkStateResponse> {
+private:
+
+public:
+ TJsonProxyDataShardGetReadTableSinkState(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyDataShard<TEvDataShard::TEvGetReadTableSinkStateRequest,
+ TEvDataShard::TEvGetReadTableSinkStateResponse>(event)
+ {
+ }
+
+ TAutoPtr<TEvDataShard::TEvGetReadTableSinkStateRequest> PrepareRequest(const TActorContext &) override
+ {
+ auto *request = new TEvDataShard::TEvGetReadTableSinkStateRequest;
+ const TCgiParameters &cgi = RequestEvent->Get()->Request.GetParams();
+ if (cgi.Has("opid")) {
+ ui64 id;
+ if (TryFromString(cgi.Get("opid"), id))
+ request->Record.SetTxId(id);
+ }
+ return request;
+ }
+};
+
+class TJsonProxyDataShardGetReadTableScanState : public TJsonProxyDataShard<TEvDataShard::TEvGetReadTableScanStateRequest,
+ TEvDataShard::TEvGetReadTableScanStateResponse> {
+private:
+
+public:
+ TJsonProxyDataShardGetReadTableScanState(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyDataShard<TEvDataShard::TEvGetReadTableScanStateRequest,
+ TEvDataShard::TEvGetReadTableScanStateResponse>(event)
+ {
+ }
+
+ TAutoPtr<TEvDataShard::TEvGetReadTableScanStateRequest> PrepareRequest(const TActorContext &) override
+ {
+ auto *request = new TEvDataShard::TEvGetReadTableScanStateRequest;
+ const TCgiParameters &cgi = RequestEvent->Get()->Request.GetParams();
+ if (cgi.Has("opid")) {
+ ui64 id;
+ if (TryFromString(cgi.Get("opid"), id))
+ request->Record.SetTxId(id);
+ }
+ return request;
+ }
+};
+
+class TJsonProxyDataShardGetReadTableStreamState : public TJsonProxyDataShard<TEvDataShard::TEvGetReadTableStreamStateRequest,
+ TEvDataShard::TEvGetReadTableStreamStateResponse> {
+private:
+
+public:
+ TJsonProxyDataShardGetReadTableStreamState(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyDataShard<TEvDataShard::TEvGetReadTableStreamStateRequest,
+ TEvDataShard::TEvGetReadTableStreamStateResponse>(event)
+ {
+ }
+
+ TAutoPtr<TEvDataShard::TEvGetReadTableStreamStateRequest> PrepareRequest(const TActorContext &) override
+ {
+ auto *request = new TEvDataShard::TEvGetReadTableStreamStateRequest;
+ const TCgiParameters &cgi = RequestEvent->Get()->Request.GetParams();
+ if (cgi.Has("opid")) {
+ ui64 id;
+ if (TryFromString(cgi.Get("opid"), id))
+ request->Record.SetTxId(id);
+ }
+ return request;
+ }
+};
+
+class TJsonProxyDataShardGetSlowOpProfiles : public TJsonProxyDataShard<TEvDataShard::TEvGetSlowOpProfilesRequest,
+ TEvDataShard::TEvGetSlowOpProfilesResponse> {
+private:
+
+public:
+ TJsonProxyDataShardGetSlowOpProfiles(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyDataShard<TEvDataShard::TEvGetSlowOpProfilesRequest,
+ TEvDataShard::TEvGetSlowOpProfilesResponse>(event)
+ {
+ }
+
+ TAutoPtr<TEvDataShard::TEvGetSlowOpProfilesRequest> PrepareRequest(const TActorContext &) override
+ {
+ return new TEvDataShard::TEvGetSlowOpProfilesRequest;
+ }
+};
+
+class TJsonProxyDataShardGetRSInfo : public TJsonProxyDataShard<TEvDataShard::TEvGetRSInfoRequest,
+ TEvDataShard::TEvGetRSInfoResponse> {
+private:
+
+public:
+ TJsonProxyDataShardGetRSInfo(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyDataShard<TEvDataShard::TEvGetRSInfoRequest,
+ TEvDataShard::TEvGetRSInfoResponse>(event)
+ {
+ }
+
+ TAutoPtr<TEvDataShard::TEvGetRSInfoRequest> PrepareRequest(const TActorContext &) override
+ {
+ return new TEvDataShard::TEvGetRSInfoRequest;
+ }
+};
+
+class TJsonProxyDataShardGetDataHistogram : public TJsonProxyDataShard<TEvDataShard::TEvGetDataHistogramRequest,
+ TEvDataShard::TEvGetDataHistogramResponse> {
+private:
+
+public:
+ TJsonProxyDataShardGetDataHistogram(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyDataShard<TEvDataShard::TEvGetDataHistogramRequest,
+ TEvDataShard::TEvGetDataHistogramResponse>(event)
+ {
+ }
+
+ TAutoPtr<TEvDataShard::TEvGetDataHistogramRequest> PrepareRequest(const TActorContext &) override
+ {
+ return new TEvDataShard::TEvGetDataHistogramRequest;
+ }
+};
+
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/json_proxy_proto.h b/ydb/core/cms/json_proxy_proto.h
index 519c5270429..b1b87f30cda 100644
--- a/ydb/core/cms/json_proxy_proto.h
+++ b/ydb/core/cms/json_proxy_proto.h
@@ -1,10 +1,10 @@
-#pragma once
-
+#pragma once
+
#include "pdisk_state.h"
#include <ydb/core/base/defs.h>
#include <ydb/core/mon/mon.h>
-
+
#include <google/protobuf/util/json_util.h>
#include <library/cpp/actors/core/actor.h>
#include <library/cpp/actors/core/actor_bootstrapped.h>
@@ -13,74 +13,74 @@
#include <library/cpp/json/json_value.h>
#include <library/cpp/json/json_reader.h>
#include <library/cpp/json/json_writer.h>
-
+
#include <util/generic/serialized_enum.h>
-#include <iostream>
-
-namespace NKikimr {
-namespace NCms {
-
-class TJsonProxyProto : public TActorBootstrapped<TJsonProxyProto> {
-private:
- using TBase = TActorBootstrapped<TJsonProxyProto>;
-
-public:
+#include <iostream>
+
+namespace NKikimr {
+namespace NCms {
+
+class TJsonProxyProto : public TActorBootstrapped<TJsonProxyProto> {
+private:
+ using TBase = TActorBootstrapped<TJsonProxyProto>;
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_SERVICE_PROXY;
- }
-
- TJsonProxyProto(NMon::TEvHttpInfo::TPtr &event)
- : RequestEvent(event)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ }
+
+ TJsonProxyProto(NMon::TEvHttpInfo::TPtr &event)
+ : RequestEvent(event)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
"TJsonProxyProto::Bootstrap url=" << RequestEvent->Get()->Request.GetPathInfo());
- ProcessRequest(ctx);
- Die(ctx);
- }
-
-protected:
-
- void ProcessRequest(const TActorContext &ctx)
- {
+ ProcessRequest(ctx);
+ Die(ctx);
+ }
+
+protected:
+
+ void ProcessRequest(const TActorContext &ctx)
+ {
const TCgiParameters &cgi = RequestEvent->Get()->Request.GetParams();
-
- if (cgi.Has("enum")) {
- TString name = cgi.Get("enum");
- if (name == "NKikimrConsole::TConfigItem::EKind")
- return ReplyWithEnumDescription(*NKikimrConsole::TConfigItem::EKind_descriptor(), ctx);
- else if (name == "NKikimrConsole::TConfigItem::EMergeStrategy")
- return ReplyWithEnumDescription(*NKikimrConsole::TConfigItem::EMergeStrategy_descriptor(), ctx);
- else if (name == "NKikimrServices::EServiceKikimr")
+
+ if (cgi.Has("enum")) {
+ TString name = cgi.Get("enum");
+ if (name == "NKikimrConsole::TConfigItem::EKind")
+ return ReplyWithEnumDescription(*NKikimrConsole::TConfigItem::EKind_descriptor(), ctx);
+ else if (name == "NKikimrConsole::TConfigItem::EMergeStrategy")
+ return ReplyWithEnumDescription(*NKikimrConsole::TConfigItem::EMergeStrategy_descriptor(), ctx);
+ else if (name == "NKikimrServices::EServiceKikimr")
return ReplyWithLogComponents(ctx.LoggerSettings(), ctx);
- else if (name == "NKikimrCms::TCmsConfig::TLogConfig::ELevel")
- return ReplyWithEnumDescription(*NKikimrCms::TCmsConfig::TLogConfig::ELevel_descriptor(), ctx);
- else if (name == "NKikimrCms::TLogRecordData::EType")
- return ReplyWithEnumDescription(*NKikimrCms::TLogRecordData::EType_descriptor(), ctx);
+ else if (name == "NKikimrCms::TCmsConfig::TLogConfig::ELevel")
+ return ReplyWithEnumDescription(*NKikimrCms::TCmsConfig::TLogConfig::ELevel_descriptor(), ctx);
+ else if (name == "NKikimrCms::TLogRecordData::EType")
+ return ReplyWithEnumDescription(*NKikimrCms::TLogRecordData::EType_descriptor(), ctx);
else if (name == "NCms::EPDiskState")
return ReplyWithEnumDescription(*NKikimrBlobStorage::TPDiskState::E_descriptor(), ctx);
- } else if (cgi.Has("type")) {
- TString name = cgi.Get("type");
- if (name == ".NKikimrConfig.TImmediateControlsConfig")
- return ReplyWithTypeDescription(*NKikimrConfig::TImmediateControlsConfig::descriptor(), ctx);
- else if (name == ".NKikimrConfig.TImmediateControlsConfig.TDataShardControls")
- return ReplyWithTypeDescription(*NKikimrConfig::TImmediateControlsConfig::TDataShardControls::descriptor(), ctx);
- else if (name == ".NKikimrConfig.TImmediateControlsConfig.TDataShardControls.TExecutionProfileOptions")
- return ReplyWithTypeDescription(*NKikimrConfig::TImmediateControlsConfig::TDataShardControls::TExecutionProfileOptions::descriptor(), ctx);
- else if (name == ".NKikimrConfig.TImmediateControlsConfig.TTxLimitControls")
- return ReplyWithTypeDescription(*NKikimrConfig::TImmediateControlsConfig::TTxLimitControls::descriptor(), ctx);
- }
-
- ctx.Send(RequestEvent->Sender,
- new NMon::TEvHttpInfoRes(TString(NMonitoring::HTTPNOTFOUND) + "unsupported args",
- 0,
- NMon::IEvHttpInfoRes::EContentType::Custom));
- }
-
+ } else if (cgi.Has("type")) {
+ TString name = cgi.Get("type");
+ if (name == ".NKikimrConfig.TImmediateControlsConfig")
+ return ReplyWithTypeDescription(*NKikimrConfig::TImmediateControlsConfig::descriptor(), ctx);
+ else if (name == ".NKikimrConfig.TImmediateControlsConfig.TDataShardControls")
+ return ReplyWithTypeDescription(*NKikimrConfig::TImmediateControlsConfig::TDataShardControls::descriptor(), ctx);
+ else if (name == ".NKikimrConfig.TImmediateControlsConfig.TDataShardControls.TExecutionProfileOptions")
+ return ReplyWithTypeDescription(*NKikimrConfig::TImmediateControlsConfig::TDataShardControls::TExecutionProfileOptions::descriptor(), ctx);
+ else if (name == ".NKikimrConfig.TImmediateControlsConfig.TTxLimitControls")
+ return ReplyWithTypeDescription(*NKikimrConfig::TImmediateControlsConfig::TTxLimitControls::descriptor(), ctx);
+ }
+
+ ctx.Send(RequestEvent->Sender,
+ new NMon::TEvHttpInfoRes(TString(NMonitoring::HTTPNOTFOUND) + "unsupported args",
+ 0,
+ NMon::IEvHttpInfoRes::EContentType::Custom));
+ }
+
void ReplyWithLogComponents(NLog::TSettings *settings, const TActorContext &ctx)
{
NJson::TJsonValue json;
@@ -102,98 +102,98 @@ protected:
Reply(WriteJson(json), ctx);
}
- void ReplyWithEnumDescription(const ::google::protobuf::EnumDescriptor &descriptor,
- const TActorContext &ctx)
- {
- ::google::protobuf::EnumDescriptorProto result;
- descriptor.CopyTo(&result);
- Reply(result, ctx);
- }
-
- void ReplyWithTypeDescription(const ::google::protobuf::Descriptor &descriptor,
- const TActorContext &ctx)
- {
- ::google::protobuf::DescriptorProto result;
- descriptor.CopyTo(&result);
-
- auto json = ProtoToJson(result);
-
- // Add custom field options to json.
- NJson::TJsonValue val;
- auto ok = ReadJsonTree(json, &val);
- Y_VERIFY(ok);
-
- AddCustomFieldOptions(descriptor, val);
- json = WriteJson(val);
-
- Reply(json, ctx);
- }
-
- void AddCustomFieldOptions(const ::google::protobuf::Descriptor &descriptor,
- NJson::TJsonValue &val)
- {
- if (!val.IsMap() || !val.Has("field"))
- return;
-
- auto &fields = val["field"];
- if (!fields.IsArray())
- return;
-
- for (size_t i = 0; i < fields.GetArray().size(); ++i) {
- auto &field = fields[i];
- if (!field.IsMap() || !field.Has("options"))
- continue;
-
- auto num = field["number"].GetUInteger();
- auto &opts = field["options"];
-
- auto *fieldDesc = descriptor.FindFieldByNumber(num);
- Y_VERIFY(fieldDesc);
-
- auto &optsMsg = fieldDesc->options();
- auto *reflection = optsMsg.GetReflection();
-
- std::vector<const ::google::protobuf::FieldDescriptor *> optsFields;
- reflection->ListFields(optsMsg, &optsFields);
-
- for (auto *optsFieldDesc : optsFields) {
- if (optsFieldDesc->is_extension()
- && optsFieldDesc->type() == google::protobuf::FieldDescriptor::TYPE_MESSAGE) {
- auto &ext = reflection->GetMessage(optsMsg, optsFieldDesc);
- auto json = ProtoToJson(ext);
- NJson::TJsonValue extVal;
- ReadJsonTree(json, &extVal);
- opts[optsFieldDesc->name()] = extVal;
- }
- }
- }
- }
-
-
- TString ProtoToJson(const google::protobuf::Message &resp)
- {
- auto config = NProtobufJson::TProto2JsonConfig()
- .SetFormatOutput(false)
- .SetEnumMode(NProtobufJson::TProto2JsonConfig::EnumName);
- return NProtobufJson::Proto2Json(resp, config);
- }
-
- void Reply(const google::protobuf::Message &resp, const TActorContext &ctx)
- {
- Reply(ProtoToJson(resp), ctx);
- }
-
- void Reply(const TString &json, const TActorContext &ctx)
- {
- LOG_TRACE_S(ctx, NKikimrServices::CMS,
- "TJsonProxyProto reply with json '" << json << "'");
-
- ctx.Send(RequestEvent->Sender, new NMon::TEvHttpInfoRes(TString(NMonitoring::HTTPOKJSON) + json, 0,
- NMon::IEvHttpInfoRes::EContentType::Custom));
- }
-
- NMon::TEvHttpInfo::TPtr RequestEvent;
-};
-
-} // NCms
-} // NKikimr
+ void ReplyWithEnumDescription(const ::google::protobuf::EnumDescriptor &descriptor,
+ const TActorContext &ctx)
+ {
+ ::google::protobuf::EnumDescriptorProto result;
+ descriptor.CopyTo(&result);
+ Reply(result, ctx);
+ }
+
+ void ReplyWithTypeDescription(const ::google::protobuf::Descriptor &descriptor,
+ const TActorContext &ctx)
+ {
+ ::google::protobuf::DescriptorProto result;
+ descriptor.CopyTo(&result);
+
+ auto json = ProtoToJson(result);
+
+ // Add custom field options to json.
+ NJson::TJsonValue val;
+ auto ok = ReadJsonTree(json, &val);
+ Y_VERIFY(ok);
+
+ AddCustomFieldOptions(descriptor, val);
+ json = WriteJson(val);
+
+ Reply(json, ctx);
+ }
+
+ void AddCustomFieldOptions(const ::google::protobuf::Descriptor &descriptor,
+ NJson::TJsonValue &val)
+ {
+ if (!val.IsMap() || !val.Has("field"))
+ return;
+
+ auto &fields = val["field"];
+ if (!fields.IsArray())
+ return;
+
+ for (size_t i = 0; i < fields.GetArray().size(); ++i) {
+ auto &field = fields[i];
+ if (!field.IsMap() || !field.Has("options"))
+ continue;
+
+ auto num = field["number"].GetUInteger();
+ auto &opts = field["options"];
+
+ auto *fieldDesc = descriptor.FindFieldByNumber(num);
+ Y_VERIFY(fieldDesc);
+
+ auto &optsMsg = fieldDesc->options();
+ auto *reflection = optsMsg.GetReflection();
+
+ std::vector<const ::google::protobuf::FieldDescriptor *> optsFields;
+ reflection->ListFields(optsMsg, &optsFields);
+
+ for (auto *optsFieldDesc : optsFields) {
+ if (optsFieldDesc->is_extension()
+ && optsFieldDesc->type() == google::protobuf::FieldDescriptor::TYPE_MESSAGE) {
+ auto &ext = reflection->GetMessage(optsMsg, optsFieldDesc);
+ auto json = ProtoToJson(ext);
+ NJson::TJsonValue extVal;
+ ReadJsonTree(json, &extVal);
+ opts[optsFieldDesc->name()] = extVal;
+ }
+ }
+ }
+ }
+
+
+ TString ProtoToJson(const google::protobuf::Message &resp)
+ {
+ auto config = NProtobufJson::TProto2JsonConfig()
+ .SetFormatOutput(false)
+ .SetEnumMode(NProtobufJson::TProto2JsonConfig::EnumName);
+ return NProtobufJson::Proto2Json(resp, config);
+ }
+
+ void Reply(const google::protobuf::Message &resp, const TActorContext &ctx)
+ {
+ Reply(ProtoToJson(resp), ctx);
+ }
+
+ void Reply(const TString &json, const TActorContext &ctx)
+ {
+ LOG_TRACE_S(ctx, NKikimrServices::CMS,
+ "TJsonProxyProto reply with json '" << json << "'");
+
+ ctx.Send(RequestEvent->Sender, new NMon::TEvHttpInfoRes(TString(NMonitoring::HTTPOKJSON) + json, 0,
+ NMon::IEvHttpInfoRes::EContentType::Custom));
+ }
+
+ NMon::TEvHttpInfo::TPtr RequestEvent;
+};
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/json_proxy_toggle_config_validator.h b/ydb/core/cms/json_proxy_toggle_config_validator.h
index f4c2f569cad..fdf80b90259 100644
--- a/ydb/core/cms/json_proxy_toggle_config_validator.h
+++ b/ydb/core/cms/json_proxy_toggle_config_validator.h
@@ -1,41 +1,41 @@
-#pragma once
-
-#include "json_proxy.h"
-
+#pragma once
+
+#include "json_proxy.h"
+
#include <util/string/split.h>
-
-namespace NKikimr {
-namespace NCms {
-
-class TJsonProxyToggleConfigValidator : public TJsonProxyConsole<NConsole::TEvConsole::TEvToggleConfigValidatorRequest,
- NConsole::TEvConsole::TEvToggleConfigValidatorResponse> {
-private:
-
-public:
- TJsonProxyToggleConfigValidator(NMon::TEvHttpInfo::TPtr &event)
- : TJsonProxyConsole<NConsole::TEvConsole::TEvToggleConfigValidatorRequest,
- NConsole::TEvConsole::TEvToggleConfigValidatorResponse>(event)
- {
- }
-
- TAutoPtr<TRequest> PrepareRequest(const TActorContext &) override
- {
- TAutoPtr<TRequest> request = new TRequest;
+
+namespace NKikimr {
+namespace NCms {
+
+class TJsonProxyToggleConfigValidator : public TJsonProxyConsole<NConsole::TEvConsole::TEvToggleConfigValidatorRequest,
+ NConsole::TEvConsole::TEvToggleConfigValidatorResponse> {
+private:
+
+public:
+ TJsonProxyToggleConfigValidator(NMon::TEvHttpInfo::TPtr &event)
+ : TJsonProxyConsole<NConsole::TEvConsole::TEvToggleConfigValidatorRequest,
+ NConsole::TEvConsole::TEvToggleConfigValidatorResponse>(event)
+ {
+ }
+
+ TAutoPtr<TRequest> PrepareRequest(const TActorContext &) override
+ {
+ TAutoPtr<TRequest> request = new TRequest;
const TCgiParameters& cgi = RequestEvent->Get()->Request.GetParams();
-
- if (!cgi.Has("name"))
- return nullptr;
-
- request->Record.SetName(cgi.Get("name"));
- if (cgi.Has("enable"))
- request->Record.SetDisable(cgi.Get("enable") == "0");
- if (cgi.Has("disable"))
- request->Record.SetDisable(cgi.Get("disable") != "0");
-
- return request;
- }
-};
-
-
-} // NCms
-} // NKikimr
+
+ if (!cgi.Has("name"))
+ return nullptr;
+
+ request->Record.SetName(cgi.Get("name"));
+ if (cgi.Has("enable"))
+ request->Record.SetDisable(cgi.Get("enable") == "0");
+ if (cgi.Has("disable"))
+ request->Record.SetDisable(cgi.Get("disable") != "0");
+
+ return request;
+ }
+};
+
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/log_formatter.h b/ydb/core/cms/log_formatter.h
index b6e6a7939d0..2ebb9e74702 100644
--- a/ydb/core/cms/log_formatter.h
+++ b/ydb/core/cms/log_formatter.h
@@ -1,160 +1,160 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <ydb/core/protos/cms.pb.h>
#include <ydb/core/base/ticket_parser.h>
-
-namespace NKikimr {
-namespace NCms {
-
-template <NKikimrCms::ETextFormat format>
-class TLogFormatter {
-public:
- static TString Format(const NKikimrCms::TLogRecord &rec)
- {
- switch (rec.GetRecordType()) {
- case NKikimrCms::TLogRecordData::CMS_LOADED:
- return FormatData(rec.GetData().GetCmsLoaded());
- break;
- case NKikimrCms::TLogRecordData::PDISK_MONITOR_ACTION:
- return FormatData(rec.GetData().GetPDiskMonitorAction());
- break;
- case NKikimrCms::TLogRecordData::MARKERS_MODIFICATION:
- return FormatData(rec.GetData().GetMarkersModification());
- break;
- default:
- return "[unsupported record data type]";
- };
- }
-
- template <NKikimrCms::ETextFormat U>
- friend class TLogFormatter;
-
-private:
- TLogFormatter() {};
-
- template<typename T>
- static TString FormatData(const T &data)
- {
- Y_UNUSED(data);
- return "[unsupported record data type]";
- }
-
- static void OutputItem(IOutputStream &os,
- const NKikimrCms::TLogRecordData::TMarkersModification &data)
- {
- if (data.HasHost())
- os << "host " << data.GetHost();
- else if (data.HasNode())
- os << "node " << data.GetNode();
- else if (data.HasPDisk())
- os << "PDisk " << data.GetPDisk().GetNodeId() << ":" << data.GetPDisk().GetDiskId();
- else if (data.HasVDisk())
- os << "VDisk " << VDiskIDFromVDiskID(data.GetVDisk()).ToString();
- }
-
- static void OutputMarkers(IOutputStream &os,
- const ::google::protobuf::RepeatedField<int> &list)
- {
- if (list.size()) {
- for (auto &elem : list)
- os << " " << static_cast<NKikimrCms::EMarker>(elem);
- } else {
- os << " <empty list>";
- }
- }
-
- static void OutputDowntimes(IOutputStream &os,
- const TString &prefix,
- const NKikimrCms::TAvailabilityStats &stats)
- {
- os << prefix;
- for (auto &entry : stats.GetDowntimes()) {
- TInstant start = TInstant::FromValue(entry.GetStart());
- TInstant end = TInstant::FromValue(entry.GetEnd());
- os << " [" << start.ToStringLocalUpToSeconds()
- << " - " << end.ToStringLocalUpToSeconds()
- << ": " << entry.GetExplanation() << "]";
- }
- TDuration gap = TDuration::FromValue(stats.GetIgnoredDowntimeGap());
- os << " ignored gap: " << gap.ToString();
- }
-};
-
-template<> template<>
-TString TLogFormatter<NKikimrCms::TEXT_FORMAT_SHORT>::FormatData(const NKikimrCms::TLogRecordData::TCmsLoaded &data)
-{
- TStringStream ss;
- ss << "CMS loaded at " << data.GetHost()
- << " (" << data.GetNodeId() << ")"
- << " " << data.GetVersion();
- return ss.Str();
-}
-
-template<> template<>
-TString TLogFormatter<NKikimrCms::TEXT_FORMAT_DETAILED>::FormatData(const NKikimrCms::TLogRecordData::TCmsLoaded &data)
-{
- return TLogFormatter<NKikimrCms::TEXT_FORMAT_SHORT>::FormatData(data);
-}
-
-template<> template<>
-TString TLogFormatter<NKikimrCms::TEXT_FORMAT_SHORT>::FormatData(const NKikimrCms::TLogRecordData::TPDiskMonitorAction &data)
-{
- TStringStream ss;
+
+namespace NKikimr {
+namespace NCms {
+
+template <NKikimrCms::ETextFormat format>
+class TLogFormatter {
+public:
+ static TString Format(const NKikimrCms::TLogRecord &rec)
+ {
+ switch (rec.GetRecordType()) {
+ case NKikimrCms::TLogRecordData::CMS_LOADED:
+ return FormatData(rec.GetData().GetCmsLoaded());
+ break;
+ case NKikimrCms::TLogRecordData::PDISK_MONITOR_ACTION:
+ return FormatData(rec.GetData().GetPDiskMonitorAction());
+ break;
+ case NKikimrCms::TLogRecordData::MARKERS_MODIFICATION:
+ return FormatData(rec.GetData().GetMarkersModification());
+ break;
+ default:
+ return "[unsupported record data type]";
+ };
+ }
+
+ template <NKikimrCms::ETextFormat U>
+ friend class TLogFormatter;
+
+private:
+ TLogFormatter() {};
+
+ template<typename T>
+ static TString FormatData(const T &data)
+ {
+ Y_UNUSED(data);
+ return "[unsupported record data type]";
+ }
+
+ static void OutputItem(IOutputStream &os,
+ const NKikimrCms::TLogRecordData::TMarkersModification &data)
+ {
+ if (data.HasHost())
+ os << "host " << data.GetHost();
+ else if (data.HasNode())
+ os << "node " << data.GetNode();
+ else if (data.HasPDisk())
+ os << "PDisk " << data.GetPDisk().GetNodeId() << ":" << data.GetPDisk().GetDiskId();
+ else if (data.HasVDisk())
+ os << "VDisk " << VDiskIDFromVDiskID(data.GetVDisk()).ToString();
+ }
+
+ static void OutputMarkers(IOutputStream &os,
+ const ::google::protobuf::RepeatedField<int> &list)
+ {
+ if (list.size()) {
+ for (auto &elem : list)
+ os << " " << static_cast<NKikimrCms::EMarker>(elem);
+ } else {
+ os << " <empty list>";
+ }
+ }
+
+ static void OutputDowntimes(IOutputStream &os,
+ const TString &prefix,
+ const NKikimrCms::TAvailabilityStats &stats)
+ {
+ os << prefix;
+ for (auto &entry : stats.GetDowntimes()) {
+ TInstant start = TInstant::FromValue(entry.GetStart());
+ TInstant end = TInstant::FromValue(entry.GetEnd());
+ os << " [" << start.ToStringLocalUpToSeconds()
+ << " - " << end.ToStringLocalUpToSeconds()
+ << ": " << entry.GetExplanation() << "]";
+ }
+ TDuration gap = TDuration::FromValue(stats.GetIgnoredDowntimeGap());
+ os << " ignored gap: " << gap.ToString();
+ }
+};
+
+template<> template<>
+TString TLogFormatter<NKikimrCms::TEXT_FORMAT_SHORT>::FormatData(const NKikimrCms::TLogRecordData::TCmsLoaded &data)
+{
+ TStringStream ss;
+ ss << "CMS loaded at " << data.GetHost()
+ << " (" << data.GetNodeId() << ")"
+ << " " << data.GetVersion();
+ return ss.Str();
+}
+
+template<> template<>
+TString TLogFormatter<NKikimrCms::TEXT_FORMAT_DETAILED>::FormatData(const NKikimrCms::TLogRecordData::TCmsLoaded &data)
+{
+ return TLogFormatter<NKikimrCms::TEXT_FORMAT_SHORT>::FormatData(data);
+}
+
+template<> template<>
+TString TLogFormatter<NKikimrCms::TEXT_FORMAT_SHORT>::FormatData(const NKikimrCms::TLogRecordData::TPDiskMonitorAction &data)
+{
+ TStringStream ss;
ss << "Send command to BS_CONTROLLER to change status of PDisk "
- << data.GetPDiskId().GetNodeId() << ":" << data.GetPDiskId().GetDiskId()
+ << data.GetPDiskId().GetNodeId() << ":" << data.GetPDiskId().GetDiskId()
<< " at " << (data.HasHost() ? data.GetHost() : "<undefined>")
- << " from " << data.GetCurrentStatus()
- << " to " << data.GetRequiredStatus();
+ << " from " << data.GetCurrentStatus()
+ << " to " << data.GetRequiredStatus();
if (data.HasReason()) {
ss << "(" << data.GetReason() << ")";
}
- return ss.Str();
-}
-
-template<> template<>
-TString TLogFormatter<NKikimrCms::TEXT_FORMAT_DETAILED>::FormatData(const NKikimrCms::TLogRecordData::TPDiskMonitorAction &data)
-{
- TStringStream ss;
- ss << TLogFormatter<NKikimrCms::TEXT_FORMAT_SHORT>::FormatData(data)
- << " disk markers:";
- for (auto marker: data.GetPDiskMarkers())
- ss << " " << marker;
- ss << " node markers:";
- for (auto marker: data.GetNodeMarkers())
- ss << " " << marker;
- OutputDowntimes(ss, " disk downtimes:", data.GetDiskAvailabilityStats());
- OutputDowntimes(ss, " node downtimes:", data.GetNodeAvailabilityStats());
- return ss.Str();
-}
-
-template<> template<>
-TString TLogFormatter<NKikimrCms::TEXT_FORMAT_SHORT>::FormatData(const NKikimrCms::TLogRecordData::TMarkersModification &data)
-{
- TStringStream ss;
- ss << "Changed markers for ";
- OutputItem(ss, data);
- ss << " to";
- OutputMarkers(ss, data.GetNewMarkers());
- return ss.Str();
-}
-
-template<> template<>
-TString TLogFormatter<NKikimrCms::TEXT_FORMAT_DETAILED>::FormatData(const NKikimrCms::TLogRecordData::TMarkersModification &data)
-{
- TStringStream ss;
- ss << "Changed markers for ";
- OutputItem(ss, data);
- ss << " from";
- OutputMarkers(ss, data.GetOldMarkers());
- ss << " to";
- OutputMarkers(ss, data.GetNewMarkers());
- if (data.GetUserToken()) {
- NACLib::TUserToken userToken(data.GetUserToken());
- ss << " by " << userToken.ShortDebugString();
- }
- return ss.Str();
-}
-
-} // NCms
-} // NKikimr
+ return ss.Str();
+}
+
+template<> template<>
+TString TLogFormatter<NKikimrCms::TEXT_FORMAT_DETAILED>::FormatData(const NKikimrCms::TLogRecordData::TPDiskMonitorAction &data)
+{
+ TStringStream ss;
+ ss << TLogFormatter<NKikimrCms::TEXT_FORMAT_SHORT>::FormatData(data)
+ << " disk markers:";
+ for (auto marker: data.GetPDiskMarkers())
+ ss << " " << marker;
+ ss << " node markers:";
+ for (auto marker: data.GetNodeMarkers())
+ ss << " " << marker;
+ OutputDowntimes(ss, " disk downtimes:", data.GetDiskAvailabilityStats());
+ OutputDowntimes(ss, " node downtimes:", data.GetNodeAvailabilityStats());
+ return ss.Str();
+}
+
+template<> template<>
+TString TLogFormatter<NKikimrCms::TEXT_FORMAT_SHORT>::FormatData(const NKikimrCms::TLogRecordData::TMarkersModification &data)
+{
+ TStringStream ss;
+ ss << "Changed markers for ";
+ OutputItem(ss, data);
+ ss << " to";
+ OutputMarkers(ss, data.GetNewMarkers());
+ return ss.Str();
+}
+
+template<> template<>
+TString TLogFormatter<NKikimrCms::TEXT_FORMAT_DETAILED>::FormatData(const NKikimrCms::TLogRecordData::TMarkersModification &data)
+{
+ TStringStream ss;
+ ss << "Changed markers for ";
+ OutputItem(ss, data);
+ ss << " from";
+ OutputMarkers(ss, data.GetOldMarkers());
+ ss << " to";
+ OutputMarkers(ss, data.GetNewMarkers());
+ if (data.GetUserToken()) {
+ NACLib::TUserToken userToken(data.GetUserToken());
+ ss << " by " << userToken.ShortDebugString();
+ }
+ return ss.Str();
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/logger.cpp b/ydb/core/cms/logger.cpp
index 1181620ff75..b6349d488bd 100644
--- a/ydb/core/cms/logger.cpp
+++ b/ydb/core/cms/logger.cpp
@@ -1,136 +1,136 @@
-#include "logger.h"
-#include "log_formatter.h"
-
-#include <util/generic/utility.h>
-
-namespace NKikimr {
-namespace NCms {
-
-using namespace NKikimrCms;
-
-TLogger::TLogger(TCmsStatePtr state)
- : State(state)
-{
-}
-
-TString TLogger::GetLogMessage(const NKikimrCms::TLogRecord &rec,
- NKikimrCms::ETextFormat format) const
-{
- switch (format) {
- case TEXT_FORMAT_NONE:
- return "";
- case TEXT_FORMAT_SHORT:
- return TLogFormatter<TEXT_FORMAT_SHORT>::Format(rec);
- case TEXT_FORMAT_DETAILED:
- return TLogFormatter<TEXT_FORMAT_DETAILED>::Format(rec);
- default:
- return TStringBuilder() << "[unsupported format]" << format;
- }
-}
-
-bool TLogger::DbCleanupLog(TTransactionContext& txc,
- const TActorContext& ctx)
-{
-
- NIceDb::TNiceDb db(txc.DB);
- TInstant fromDate = ctx.Now() - State->Config.LogConfig.TTL;
- ui64 from = Max<ui64>() - fromDate.GetValue();
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "Cleanup log records until " << fromDate);
-
- auto rowset = db.Table<Schema::LogRecords>().GreaterOrEqual(from)
- .Select<Schema::LogRecords::Timestamp>();
-
- if (!rowset.IsReady())
- return false;
-
- TVector<ui64> ids;
- while (!rowset.EndOfSet()) {
- ids.push_back(rowset.GetValue<Schema::LogRecords::Timestamp>());
-
- if (!rowset.Next())
- return false;
- }
-
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "Removing " << ids.size() << " log records");
-
- for (auto id : ids)
- db.Table<Schema::LogRecords>().Key(id).Delete();
-
- return true;
-}
-
-bool TLogger::DbLoadLogTail(const NKikimrCms::TLogFilter &filter,
- TVector<NKikimrCms::TLogRecord> &result,
- TTransactionContext& txc)
-{
- result.clear();
-
- ui64 from = 0;
- ui64 to = Max<ui64>() - filter.GetMinTimestamp();
- ui64 skip = filter.GetOffset();
- ui64 remain = Min<ui32>(filter.GetLimit(), 10000);
- ui32 type = filter.GetRecordType();
-
- if (filter.GetMaxTimestamp())
- from = Max<ui64>() - filter.GetMaxTimestamp();
-
- NIceDb::TNiceDb db(txc.DB);
- auto rowset = db.Table<Schema::LogRecords>().GreaterOrEqual(from)
- .Select<Schema::LogRecords::TColumns>();
-
- if (!rowset.IsReady())
- return false;
-
- while (remain && !rowset.EndOfSet()) {
- auto timestamp = rowset.GetValue<Schema::LogRecords::Timestamp>();
- if (timestamp > to)
- break;
-
- auto data = rowset.GetValue<Schema::LogRecords::Data>();
- if (!type || data.GetRecordType() == type) {
- if (skip) {
- --skip;
- } else {
- result.push_back(NKikimrCms::TLogRecord());
- result.back().SetTimestamp(Max<ui64>() - timestamp);
- result.back().SetRecordType(data.GetRecordType());
- result.back().MutableData()->Swap(&data);
- --remain;
- }
- }
-
- if (remain && !rowset.Next())
- return false;
- }
-
- return true;
-}
-
-void TLogger::DbLogData(const TLogRecordData &data,
- TTransactionContext& txc,
- const TActorContext& ctx)
-{
- if (!State->Config.IsLogEnabled(data.GetRecordType()))
- return;
-
- ui64 timestamp = ctx.Now().GetValue();
-
- if (timestamp <= State->LastLogRecordTimestamp)
- timestamp = State->LastLogRecordTimestamp + 1;
- State->LastLogRecordTimestamp = timestamp;
-
- LOG_TRACE_S(ctx, NKikimrServices::CMS,
- "Add log record to local DB"
- << " timestamp=" << timestamp
- << " data=" << data.ShortDebugString());
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::LogRecords>().Key(Max<ui64>() - timestamp)
- .Update<Schema::LogRecords::Data>(data);
-}
-
-} // NCms
-} // NKikimr
+#include "logger.h"
+#include "log_formatter.h"
+
+#include <util/generic/utility.h>
+
+namespace NKikimr {
+namespace NCms {
+
+using namespace NKikimrCms;
+
+TLogger::TLogger(TCmsStatePtr state)
+ : State(state)
+{
+}
+
+TString TLogger::GetLogMessage(const NKikimrCms::TLogRecord &rec,
+ NKikimrCms::ETextFormat format) const
+{
+ switch (format) {
+ case TEXT_FORMAT_NONE:
+ return "";
+ case TEXT_FORMAT_SHORT:
+ return TLogFormatter<TEXT_FORMAT_SHORT>::Format(rec);
+ case TEXT_FORMAT_DETAILED:
+ return TLogFormatter<TEXT_FORMAT_DETAILED>::Format(rec);
+ default:
+ return TStringBuilder() << "[unsupported format]" << format;
+ }
+}
+
+bool TLogger::DbCleanupLog(TTransactionContext& txc,
+ const TActorContext& ctx)
+{
+
+ NIceDb::TNiceDb db(txc.DB);
+ TInstant fromDate = ctx.Now() - State->Config.LogConfig.TTL;
+ ui64 from = Max<ui64>() - fromDate.GetValue();
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "Cleanup log records until " << fromDate);
+
+ auto rowset = db.Table<Schema::LogRecords>().GreaterOrEqual(from)
+ .Select<Schema::LogRecords::Timestamp>();
+
+ if (!rowset.IsReady())
+ return false;
+
+ TVector<ui64> ids;
+ while (!rowset.EndOfSet()) {
+ ids.push_back(rowset.GetValue<Schema::LogRecords::Timestamp>());
+
+ if (!rowset.Next())
+ return false;
+ }
+
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "Removing " << ids.size() << " log records");
+
+ for (auto id : ids)
+ db.Table<Schema::LogRecords>().Key(id).Delete();
+
+ return true;
+}
+
+bool TLogger::DbLoadLogTail(const NKikimrCms::TLogFilter &filter,
+ TVector<NKikimrCms::TLogRecord> &result,
+ TTransactionContext& txc)
+{
+ result.clear();
+
+ ui64 from = 0;
+ ui64 to = Max<ui64>() - filter.GetMinTimestamp();
+ ui64 skip = filter.GetOffset();
+ ui64 remain = Min<ui32>(filter.GetLimit(), 10000);
+ ui32 type = filter.GetRecordType();
+
+ if (filter.GetMaxTimestamp())
+ from = Max<ui64>() - filter.GetMaxTimestamp();
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto rowset = db.Table<Schema::LogRecords>().GreaterOrEqual(from)
+ .Select<Schema::LogRecords::TColumns>();
+
+ if (!rowset.IsReady())
+ return false;
+
+ while (remain && !rowset.EndOfSet()) {
+ auto timestamp = rowset.GetValue<Schema::LogRecords::Timestamp>();
+ if (timestamp > to)
+ break;
+
+ auto data = rowset.GetValue<Schema::LogRecords::Data>();
+ if (!type || data.GetRecordType() == type) {
+ if (skip) {
+ --skip;
+ } else {
+ result.push_back(NKikimrCms::TLogRecord());
+ result.back().SetTimestamp(Max<ui64>() - timestamp);
+ result.back().SetRecordType(data.GetRecordType());
+ result.back().MutableData()->Swap(&data);
+ --remain;
+ }
+ }
+
+ if (remain && !rowset.Next())
+ return false;
+ }
+
+ return true;
+}
+
+void TLogger::DbLogData(const TLogRecordData &data,
+ TTransactionContext& txc,
+ const TActorContext& ctx)
+{
+ if (!State->Config.IsLogEnabled(data.GetRecordType()))
+ return;
+
+ ui64 timestamp = ctx.Now().GetValue();
+
+ if (timestamp <= State->LastLogRecordTimestamp)
+ timestamp = State->LastLogRecordTimestamp + 1;
+ State->LastLogRecordTimestamp = timestamp;
+
+ LOG_TRACE_S(ctx, NKikimrServices::CMS,
+ "Add log record to local DB"
+ << " timestamp=" << timestamp
+ << " data=" << data.ShortDebugString());
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::LogRecords>().Key(Max<ui64>() - timestamp)
+ .Update<Schema::LogRecords::Data>(data);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/logger.h b/ydb/core/cms/logger.h
index 04f90a5ded0..03e718795a3 100644
--- a/ydb/core/cms/logger.h
+++ b/ydb/core/cms/logger.h
@@ -1,41 +1,41 @@
-#pragma once
-#include "defs.h"
-
-#include "cms_state.h"
-#include "scheme.h"
-
+#pragma once
+#include "defs.h"
+
+#include "cms_state.h"
+#include "scheme.h"
+
#include <ydb/core/protos/cms.pb.h>
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
-
-#include <util/datetime/base.h>
-#include <util/generic/set.h>
-
-namespace NKikimr {
-namespace NCms {
-
-using NTabletFlatExecutor::TTransactionContext;
-
-/**
- * Class for log manipulation in local CMS DB.
- */
-class TLogger {
-public:
- TLogger(TCmsStatePtr state);
-
- TString GetLogMessage(const NKikimrCms::TLogRecord &rec,
- NKikimrCms::ETextFormat format) const;
-
- bool DbCleanupLog(TTransactionContext& txc,
- const TActorContext& ctx);
- bool DbLoadLogTail(const NKikimrCms::TLogFilter &filter,
- TVector<NKikimrCms::TLogRecord> &result,
- TTransactionContext& txc);
- void DbLogData(const NKikimrCms::TLogRecordData &data,
- TTransactionContext& txc,
- const TActorContext& ctx);
-private:
- TCmsStatePtr State;
-};
-
-} // NCms
-} // NKikimr
+
+#include <util/datetime/base.h>
+#include <util/generic/set.h>
+
+namespace NKikimr {
+namespace NCms {
+
+using NTabletFlatExecutor::TTransactionContext;
+
+/**
+ * Class for log manipulation in local CMS DB.
+ */
+class TLogger {
+public:
+ TLogger(TCmsStatePtr state);
+
+ TString GetLogMessage(const NKikimrCms::TLogRecord &rec,
+ NKikimrCms::ETextFormat format) const;
+
+ bool DbCleanupLog(TTransactionContext& txc,
+ const TActorContext& ctx);
+ bool DbLoadLogTail(const NKikimrCms::TLogFilter &filter,
+ TVector<NKikimrCms::TLogRecord> &result,
+ TTransactionContext& txc);
+ void DbLogData(const NKikimrCms::TLogRecordData &data,
+ TTransactionContext& txc,
+ const TActorContext& ctx);
+private:
+ TCmsStatePtr State;
+};
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/pdiskid.h b/ydb/core/cms/pdiskid.h
index db5beafd93b..a1ff7b215f9 100644
--- a/ydb/core/cms/pdiskid.h
+++ b/ydb/core/cms/pdiskid.h
@@ -1,67 +1,67 @@
-#pragma once
-#include "defs.h"
-
-namespace NKikimr {
-namespace NCms {
-
-struct TPDiskID {
- ui32 NodeId;
- ui32 DiskId;
-
- TPDiskID()
- : NodeId(0)
- , DiskId(0)
- {
- }
-
- TPDiskID(ui32 nodeId, ui32 diskId)
- : NodeId(nodeId)
- , DiskId(diskId)
- {
- }
-
- explicit operator bool() const
- {
- return NodeId;
- }
-
- bool operator==(const TPDiskID &other) const
- {
- return NodeId == other.NodeId && DiskId == other.DiskId;
- }
-
- bool operator!=(const TPDiskID &other) const
- {
- return !(*this == other);
- }
-
- bool operator<(const TPDiskID &other) const
- {
- if (NodeId != other.NodeId)
- return NodeId < other.NodeId;
- return DiskId < other.DiskId;
- }
-
- TString ToString() const
- {
- return Sprintf("%" PRIu32 ":%" PRIu32, NodeId, DiskId);
- }
-
- void Serialize(NKikimrCms::TPDiskID *rec) const
- {
- rec->SetNodeId(NodeId);
- rec->SetDiskId(DiskId);
- }
-};
-
-struct TPDiskIDHash {
- size_t operator()(const TPDiskID &id) const {
- return THash<intptr_t>()((ui64)id.NodeId + ((ui64)id.DiskId << 32));
- }
-};
-
-} // NCms
-} // NKikimr
+#pragma once
+#include "defs.h"
+
+namespace NKikimr {
+namespace NCms {
+
+struct TPDiskID {
+ ui32 NodeId;
+ ui32 DiskId;
+
+ TPDiskID()
+ : NodeId(0)
+ , DiskId(0)
+ {
+ }
+
+ TPDiskID(ui32 nodeId, ui32 diskId)
+ : NodeId(nodeId)
+ , DiskId(diskId)
+ {
+ }
+
+ explicit operator bool() const
+ {
+ return NodeId;
+ }
+
+ bool operator==(const TPDiskID &other) const
+ {
+ return NodeId == other.NodeId && DiskId == other.DiskId;
+ }
+
+ bool operator!=(const TPDiskID &other) const
+ {
+ return !(*this == other);
+ }
+
+ bool operator<(const TPDiskID &other) const
+ {
+ if (NodeId != other.NodeId)
+ return NodeId < other.NodeId;
+ return DiskId < other.DiskId;
+ }
+
+ TString ToString() const
+ {
+ return Sprintf("%" PRIu32 ":%" PRIu32, NodeId, DiskId);
+ }
+
+ void Serialize(NKikimrCms::TPDiskID *rec) const
+ {
+ rec->SetNodeId(NodeId);
+ rec->SetDiskId(DiskId);
+ }
+};
+
+struct TPDiskIDHash {
+ size_t operator()(const TPDiskID &id) const {
+ return THash<intptr_t>()((ui64)id.NodeId + ((ui64)id.DiskId << 32));
+ }
+};
+
+} // NCms
+} // NKikimr
template<>
inline void Out<NKikimr::NCms::TPDiskID>(IOutputStream& o, const NKikimr::NCms::TPDiskID& x) {
diff --git a/ydb/core/cms/scheme.h b/ydb/core/cms/scheme.h
index 0a58f6d16bd..013792f93f9 100644
--- a/ydb/core/cms/scheme.h
+++ b/ydb/core/cms/scheme.h
@@ -1,66 +1,66 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <ydb/core/scheme/scheme_types_defs.h>
#include <ydb/core/tablet_flat/flat_cxx_database.h>
-
-namespace NKikimr {
-namespace NCms {
-
-struct Schema : NIceDb::Schema {
- struct Param : Table<1> {
- struct ID : Column<1, NScheme::NTypeIds::Uint32> {};
- struct NextPermissionID : Column<2, NScheme::NTypeIds::Uint64> {};
- struct NextRequestID : Column<3, NScheme::NTypeIds::Uint64> {};
- struct NextNotificationID : Column<4, NScheme::NTypeIds::Uint64> {};
- struct Config : Column<5, NScheme::NTypeIds::String> { using Type = NKikimrCms::TCmsConfig; };
- struct LastLogRecordTimestamp : Column<6, NScheme::NTypeIds::Uint64> {};
-
- using TKey = TableKey<ID>;
- using TColumns = TableColumns<ID, NextPermissionID, NextRequestID, NextNotificationID,
- Config, LastLogRecordTimestamp>;
- };
-
- struct Permission : Table<2> {
+
+namespace NKikimr {
+namespace NCms {
+
+struct Schema : NIceDb::Schema {
+ struct Param : Table<1> {
+ struct ID : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct NextPermissionID : Column<2, NScheme::NTypeIds::Uint64> {};
+ struct NextRequestID : Column<3, NScheme::NTypeIds::Uint64> {};
+ struct NextNotificationID : Column<4, NScheme::NTypeIds::Uint64> {};
+ struct Config : Column<5, NScheme::NTypeIds::String> { using Type = NKikimrCms::TCmsConfig; };
+ struct LastLogRecordTimestamp : Column<6, NScheme::NTypeIds::Uint64> {};
+
+ using TKey = TableKey<ID>;
+ using TColumns = TableColumns<ID, NextPermissionID, NextRequestID, NextNotificationID,
+ Config, LastLogRecordTimestamp>;
+ };
+
+ struct Permission : Table<2> {
struct ID : Column<1, NScheme::NTypeIds::Utf8> {};
struct Owner : Column<2, NScheme::NTypeIds::Utf8> {};
struct Action : Column<3, NScheme::NTypeIds::Utf8> {};
- struct Deadline : Column<4, NScheme::NTypeIds::Uint64> {};
+ struct Deadline : Column<4, NScheme::NTypeIds::Uint64> {};
struct RequestID : Column<5, NScheme::NTypeIds::Utf8> {};
-
- using TKey = TableKey<ID>;
- using TColumns = TableColumns<ID, Owner, Action, Deadline, RequestID>;
- };
-
- struct Request : Table<3> {
+
+ using TKey = TableKey<ID>;
+ using TColumns = TableColumns<ID, Owner, Action, Deadline, RequestID>;
+ };
+
+ struct Request : Table<3> {
struct ID : Column<1, NScheme::NTypeIds::Utf8> {};
struct Owner : Column<2, NScheme::NTypeIds::Utf8> {};
- struct Order : Column<3, NScheme::NTypeIds::Uint64> {};
+ struct Order : Column<3, NScheme::NTypeIds::Uint64> {};
struct Content : Column<4, NScheme::NTypeIds::Utf8> {};
-
- using TKey = TableKey<ID>;
- using TColumns = TableColumns<ID, Owner, Order, Content>;
- };
-
-
- struct WalleTask : Table<4> {
+
+ using TKey = TableKey<ID>;
+ using TColumns = TableColumns<ID, Owner, Order, Content>;
+ };
+
+
+ struct WalleTask : Table<4> {
struct TaskID : Column<1, NScheme::NTypeIds::Utf8> {};
struct RequestID : Column<2, NScheme::NTypeIds::Utf8> {};
-
- using TKey = TableKey<TaskID>;
- using TColumns = TableColumns<TaskID, RequestID>;
- };
-
- struct Notification : Table<5> {
- struct ID : Column<1, NScheme::NTypeIds::Utf8> {};
- struct Owner : Column<2, NScheme::NTypeIds::Utf8> {};
- struct NotificationProto : Column<3, NScheme::NTypeIds::Utf8> {};
-
- using TKey = TableKey<ID>;
- using TColumns = TableColumns<ID, Owner, NotificationProto>;
- };
-
+
+ using TKey = TableKey<TaskID>;
+ using TColumns = TableColumns<TaskID, RequestID>;
+ };
+
+ struct Notification : Table<5> {
+ struct ID : Column<1, NScheme::NTypeIds::Utf8> {};
+ struct Owner : Column<2, NScheme::NTypeIds::Utf8> {};
+ struct NotificationProto : Column<3, NScheme::NTypeIds::Utf8> {};
+
+ using TKey = TableKey<ID>;
+ using TColumns = TableColumns<ID, Owner, NotificationProto>;
+ };
+
struct NodeTenant : Table<6> {
struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
struct Tenant : Column<2, NScheme::NTypeIds::Utf8> {};
@@ -69,73 +69,73 @@ struct Schema : NIceDb::Schema {
using TColumns = TableColumns<NodeId, Tenant>;
};
- struct HostMarkers : Table<7> {
- struct Host : Column<1, NScheme::NTypeIds::Utf8> {};
- struct Markers : Column<2, NScheme::NTypeIds::String> { using Type = TVector<NKikimrCms::EMarker>; };
-
- using TKey = TableKey<Host>;
- using TColumns = TableColumns<Host, Markers>;
- };
-
- struct NodeMarkers : Table<8> {
- struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
- struct Markers : Column<2, NScheme::NTypeIds::String> { using Type = TVector<NKikimrCms::EMarker>; };
-
- using TKey = TableKey<NodeId>;
- using TColumns = TableColumns<NodeId, Markers>;
- };
-
- struct PDiskMarkers : Table<9> {
- struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
- struct DiskId : Column<2, NScheme::NTypeIds::Uint32> {};
- struct Markers : Column<3, NScheme::NTypeIds::String> { using Type = TVector<NKikimrCms::EMarker>; };
-
- using TKey = TableKey<NodeId, DiskId>;
- using TColumns = TableColumns<NodeId, DiskId, Markers>;
- };
-
- struct VDiskMarkers : Table<10> {
- struct GroupId : Column<1, NScheme::NTypeIds::Uint32> {};
- struct GroupGeneration : Column<2, NScheme::NTypeIds::Uint32> {};
- struct FailRealm : Column<3, NScheme::NTypeIds::Uint8> {};
- struct FailDomain : Column<4, NScheme::NTypeIds::Uint8> {};
- struct VDisk : Column<5, NScheme::NTypeIds::Uint8> {};
- struct Markers : Column<6, NScheme::NTypeIds::String> { using Type = TVector<NKikimrCms::EMarker>; };
-
- using TKey = TableKey<GroupId, GroupGeneration, FailRealm, FailDomain, VDisk>;
- using TColumns = TableColumns<GroupId, GroupGeneration, FailRealm, FailDomain, VDisk, Markers>;
- };
-
- struct LogRecords : Table<11> {
- struct Timestamp : Column<1, NScheme::NTypeIds::Uint64> {};
- struct Data : Column<2, NScheme::NTypeIds::String> { using Type = NKikimrCms::TLogRecordData; };
-
- using TKey = TableKey<Timestamp>;
- using TColumns = TableColumns<Timestamp, Data>;
- };
-
- struct NodeDowntimes : Table<12> {
- struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
- struct Downtime : Column<2, NScheme::NTypeIds::String> { using Type = NKikimrCms::TAvailabilityStats; };
-
- using TKey = TableKey<NodeId>;
- using TColumns = TableColumns<NodeId, Downtime>;
- };
-
- struct PDiskDowntimes : Table<13> {
- struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
- struct DiskId : Column<2, NScheme::NTypeIds::Uint32> {};
- struct Downtime : Column<3, NScheme::NTypeIds::String> { using Type = NKikimrCms::TAvailabilityStats; };
-
- using TKey = TableKey<NodeId, DiskId>;
- using TColumns = TableColumns<NodeId, DiskId, Downtime>;
- };
-
- using TTables = SchemaTables<Param, Permission, Request, WalleTask, Notification, NodeTenant,
- HostMarkers, NodeMarkers, PDiskMarkers, VDiskMarkers, LogRecords, NodeDowntimes, PDiskDowntimes>;
- using TSettings = SchemaSettings<ExecutorLogBatching<true>,
- ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
-};
-
-} // NCms
-} // NKikimr
+ struct HostMarkers : Table<7> {
+ struct Host : Column<1, NScheme::NTypeIds::Utf8> {};
+ struct Markers : Column<2, NScheme::NTypeIds::String> { using Type = TVector<NKikimrCms::EMarker>; };
+
+ using TKey = TableKey<Host>;
+ using TColumns = TableColumns<Host, Markers>;
+ };
+
+ struct NodeMarkers : Table<8> {
+ struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct Markers : Column<2, NScheme::NTypeIds::String> { using Type = TVector<NKikimrCms::EMarker>; };
+
+ using TKey = TableKey<NodeId>;
+ using TColumns = TableColumns<NodeId, Markers>;
+ };
+
+ struct PDiskMarkers : Table<9> {
+ struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct DiskId : Column<2, NScheme::NTypeIds::Uint32> {};
+ struct Markers : Column<3, NScheme::NTypeIds::String> { using Type = TVector<NKikimrCms::EMarker>; };
+
+ using TKey = TableKey<NodeId, DiskId>;
+ using TColumns = TableColumns<NodeId, DiskId, Markers>;
+ };
+
+ struct VDiskMarkers : Table<10> {
+ struct GroupId : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct GroupGeneration : Column<2, NScheme::NTypeIds::Uint32> {};
+ struct FailRealm : Column<3, NScheme::NTypeIds::Uint8> {};
+ struct FailDomain : Column<4, NScheme::NTypeIds::Uint8> {};
+ struct VDisk : Column<5, NScheme::NTypeIds::Uint8> {};
+ struct Markers : Column<6, NScheme::NTypeIds::String> { using Type = TVector<NKikimrCms::EMarker>; };
+
+ using TKey = TableKey<GroupId, GroupGeneration, FailRealm, FailDomain, VDisk>;
+ using TColumns = TableColumns<GroupId, GroupGeneration, FailRealm, FailDomain, VDisk, Markers>;
+ };
+
+ struct LogRecords : Table<11> {
+ struct Timestamp : Column<1, NScheme::NTypeIds::Uint64> {};
+ struct Data : Column<2, NScheme::NTypeIds::String> { using Type = NKikimrCms::TLogRecordData; };
+
+ using TKey = TableKey<Timestamp>;
+ using TColumns = TableColumns<Timestamp, Data>;
+ };
+
+ struct NodeDowntimes : Table<12> {
+ struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct Downtime : Column<2, NScheme::NTypeIds::String> { using Type = NKikimrCms::TAvailabilityStats; };
+
+ using TKey = TableKey<NodeId>;
+ using TColumns = TableColumns<NodeId, Downtime>;
+ };
+
+ struct PDiskDowntimes : Table<13> {
+ struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct DiskId : Column<2, NScheme::NTypeIds::Uint32> {};
+ struct Downtime : Column<3, NScheme::NTypeIds::String> { using Type = NKikimrCms::TAvailabilityStats; };
+
+ using TKey = TableKey<NodeId, DiskId>;
+ using TColumns = TableColumns<NodeId, DiskId, Downtime>;
+ };
+
+ using TTables = SchemaTables<Param, Permission, Request, WalleTask, Notification, NodeTenant,
+ HostMarkers, NodeMarkers, PDiskMarkers, VDiskMarkers, LogRecords, NodeDowntimes, PDiskDowntimes>;
+ using TSettings = SchemaSettings<ExecutorLogBatching<true>,
+ ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
+};
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/ui/cms.css b/ydb/core/cms/ui/cms.css
index 0cabaef920b..b8b1105295f 100644
--- a/ydb/core/cms/ui/cms.css
+++ b/ydb/core/cms/ui/cms.css
@@ -1,71 +1,71 @@
-button.cfg-item-remove-icon {
- background: url(res/remove.png) no-repeat center;
-}
-
-button.cfg-item-edit-icon {
- background: url(res/edit.png) no-repeat center;
-}
-
-.btn-cfg-item:hover {
- border-style: solid;
- border-color: #cccccc;
- border-width: 1px;
- border-radius: 4px;
-}
-
-.btn-cfg-item {
- width: 34px;
- height: 34px;
- background-color: transparent;
- border: none;
- margin: 0;
- padding: 0;
-}
-
-form.cfg-form {
- margin: 5px 0 5px 0;
- border-style: solid;
- border-color: #cccccc;
- border-width: 1px;
- border-radius: 4px;
- padding: 5px 10px;
-}
-
-label.cfg-form {
- margin: 0 5px 0 5px;
-}
-
-.pending-update {
- background: #F08080 url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='100px' width='300px'><text x='0' y='50' fill='red' font-size='30'>Pending Update</text></svg>") no-repeat center;
-
-}
-
-pre.cfg-item-hdr {
- background-color: transparent;
-}
-
-.cfg-item {
- margin: 5px 0 5px 0;
- background-color: #f7f7f7;
- border-style: solid;
- border-color: #cccccc;
- border-width: 1px;
- border-radius: 4px;
- padding: 5px 10px;
-}
-
-.btn-light {
- background-color: #f5f5f5;
- margin: 1px 0px;
-}
-
-th {
- font-weight: 700;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-td {
- padding-left: 10px;
- padding-right: 10px;
-}
+button.cfg-item-remove-icon {
+ background: url(res/remove.png) no-repeat center;
+}
+
+button.cfg-item-edit-icon {
+ background: url(res/edit.png) no-repeat center;
+}
+
+.btn-cfg-item:hover {
+ border-style: solid;
+ border-color: #cccccc;
+ border-width: 1px;
+ border-radius: 4px;
+}
+
+.btn-cfg-item {
+ width: 34px;
+ height: 34px;
+ background-color: transparent;
+ border: none;
+ margin: 0;
+ padding: 0;
+}
+
+form.cfg-form {
+ margin: 5px 0 5px 0;
+ border-style: solid;
+ border-color: #cccccc;
+ border-width: 1px;
+ border-radius: 4px;
+ padding: 5px 10px;
+}
+
+label.cfg-form {
+ margin: 0 5px 0 5px;
+}
+
+.pending-update {
+ background: #F08080 url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='100px' width='300px'><text x='0' y='50' fill='red' font-size='30'>Pending Update</text></svg>") no-repeat center;
+
+}
+
+pre.cfg-item-hdr {
+ background-color: transparent;
+}
+
+.cfg-item {
+ margin: 5px 0 5px 0;
+ background-color: #f7f7f7;
+ border-style: solid;
+ border-color: #cccccc;
+ border-width: 1px;
+ border-radius: 4px;
+ padding: 5px 10px;
+}
+
+.btn-light {
+ background-color: #f5f5f5;
+ margin: 1px 0px;
+}
+
+th {
+ font-weight: 700;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+td {
+ padding-left: 10px;
+ padding-right: 10px;
+}
diff --git a/ydb/core/cms/ui/cms.js b/ydb/core/cms/ui/cms.js
index 20048374d3f..15c17525a47 100644
--- a/ydb/core/cms/ui/cms.js
+++ b/ydb/core/cms/ui/cms.js
@@ -1,34 +1,34 @@
-'use strict';
-
-function main() {
- // making main container wider
- //$('.container').toggleClass('container container-fluid');
-
- if (window.location.hash == '') {
- window.location.hash = 'page=configs';
- } else {
- window.location.hash.substr(1).split('&').forEach((o) => { var a = o.split('='); Parameters[a[0]] = decodeURIComponent(a[1]); } );
- if (Parameters.page !== undefined) {
- $('.nav-tabs a[href="#' + Parameters.page + '"]').tab('show');
- }
- if (Parameters.show !== undefined) {
- for (var id of Parameters.show.split(',')) {
- ShownElements.add(id);
- }
- }
- }
-
- document.getElementById('host-ref').textContent += " - " + window.location.hostname;
-
- $('.nav-tabs a').on('shown.bs.tab', function (e) {
- Parameters.page = e.target.hash.substr(1);
- window.location.hash = $.param(Parameters);
- })
-
- initCommon();
- initConfigsTab();
- initValidatorsTab();
- initCmsLogTab();
-}
-
-$(document).ready(main);
+'use strict';
+
+function main() {
+ // making main container wider
+ //$('.container').toggleClass('container container-fluid');
+
+ if (window.location.hash == '') {
+ window.location.hash = 'page=configs';
+ } else {
+ window.location.hash.substr(1).split('&').forEach((o) => { var a = o.split('='); Parameters[a[0]] = decodeURIComponent(a[1]); } );
+ if (Parameters.page !== undefined) {
+ $('.nav-tabs a[href="#' + Parameters.page + '"]').tab('show');
+ }
+ if (Parameters.show !== undefined) {
+ for (var id of Parameters.show.split(',')) {
+ ShownElements.add(id);
+ }
+ }
+ }
+
+ document.getElementById('host-ref').textContent += " - " + window.location.hostname;
+
+ $('.nav-tabs a').on('shown.bs.tab', function (e) {
+ Parameters.page = e.target.hash.substr(1);
+ window.location.hash = $.param(Parameters);
+ })
+
+ initCommon();
+ initConfigsTab();
+ initValidatorsTab();
+ initCmsLogTab();
+}
+
+$(document).ready(main);
diff --git a/ydb/core/cms/ui/cms_log.js b/ydb/core/cms/ui/cms_log.js
index 078222c1706..6dda01bbf82 100644
--- a/ydb/core/cms/ui/cms_log.js
+++ b/ydb/core/cms/ui/cms_log.js
@@ -1,117 +1,117 @@
-'use strict';
-
-var CmsLogState = {
- lastDate: 0,
- firstDate: 0,
- prevLastDate: 0,
- isFull: true,
- limit: 10000,
- fetchInterval: 5000,
- retryInterval: 5000,
- totalRecords: 0,
- initialFetchLimit: 1000000,
- recordTypes: new Set(),
-};
-
-function onCmsLogLoaded(data) {
- if (data['Status']['Code'] != 'OK') {
- onCmsLogFailed(data);
- return;
- }
-
- $('#cms-log-error').html('');
-
- var recs = data['LogRecords'];
- if (recs === undefined)
- recs = [];
-
- if (recs.length > 0) {
- if (CmsLogState.isFull) {
- CmsLogState.prevLastDate = CmsLogState.lastDate;
- CmsLogState.lastDate = recs[recs.length - 1]['Timestamp'];
- }
- CmsLogState.firstDate = recs[0]['Timestamp'];
- CmsLogState.totalRecords += recs.length;
- }
-
- for (var i = 0; i < recs.length; ++i) {
- var rec = recs[i];
- var line = document.createElement('tr');
- var cell1 = document.createElement('td');
- var cell2 = document.createElement('td');
-
- var timestamp = new Date(rec['Timestamp'] / 1000);
- cell1.textContent = timestamp.toLocaleString();
- cell1.dataset.ordervalue = rec['Timestamp'];
- cell2.textContent = rec['Message'];
- cell2.dataset.filtervalue = rec['RecordType'];
- cell2.title = JSON.stringify(rec['Data'], null, 2);
-
- line.appendChild(cell1);
- line.appendChild(cell2);
-
- document.getElementById('cms-log-body').appendChild(line);
-
- CmsLogState.recordTypes.add(rec['RecordType']);
- }
-
- if (recs.length > 0) {
- $("#cms-log-table").trigger("update", [true]);
- }
-
- if (recs.length == CmsLogState.limit) {
- CmsLogState.isFull = false;
- loadCmsLog();
- } else {
- CmsLogState.isFull = true;
- setTimeout(loadCmsLog, CmsLogState.fetchInterval);
- }
-}
-
-function onCmsLogFailed(data) {
- if (data && data['Status'] && data['Status']['Reason'])
- $('#cms-log-error').html(data['Status']['Reason']);
- else
- $('#cms-log-error').html("Cannot get CMS log update");
- setTimeout(loadCmsLog, CmsLogState.retryInterval);
-}
-
-function loadCmsLog() {
- var url = 'cms/api/json/log?data=1&limit=' + CmsLogState.limit;
- if (CmsLogState.isFull) {
- url += '&from=' + (CmsLogState.lastDate + 1);
- } else {
- if (CmsLogState.prevLastDate != 0) {
- url += '&from=' + (CmsLogState.prevLastDate + 1);
- url += '&to=' + (CmsLogState.firstDate - 1);
- } else {
- if (CmsLogState.totalRecords >= CmsLogState.initialFetchLimit) {
- $('#cms-log-error').html("Stop fetching too long log");
- CmsLogState.isFull = true;
- setTimeout(loadCmsLog, CmsLogState.fetchInterval);
- return;
- } else {
- url += '&from=0&to=' + (CmsLogState.firstDate - 1);
- }
- }
- }
- $.get(url).done(onCmsLogLoaded).fail(onCmsLogFailed);
-}
-
-function initCmsLogTab() {
- $("#cms-log-table").tablesorter({
- theme: 'blue',
- sortList: [[0,0]],
- headers: {
- 0: {
- sorter: 'numeric-ordervalue',
- },
- 1: {
- sorter: false,
- }
- },
- widgets : ['zebra'],
- });
-
- loadCmsLog();
-}
+'use strict';
+
+var CmsLogState = {
+ lastDate: 0,
+ firstDate: 0,
+ prevLastDate: 0,
+ isFull: true,
+ limit: 10000,
+ fetchInterval: 5000,
+ retryInterval: 5000,
+ totalRecords: 0,
+ initialFetchLimit: 1000000,
+ recordTypes: new Set(),
+};
+
+function onCmsLogLoaded(data) {
+ if (data['Status']['Code'] != 'OK') {
+ onCmsLogFailed(data);
+ return;
+ }
+
+ $('#cms-log-error').html('');
+
+ var recs = data['LogRecords'];
+ if (recs === undefined)
+ recs = [];
+
+ if (recs.length > 0) {
+ if (CmsLogState.isFull) {
+ CmsLogState.prevLastDate = CmsLogState.lastDate;
+ CmsLogState.lastDate = recs[recs.length - 1]['Timestamp'];
+ }
+ CmsLogState.firstDate = recs[0]['Timestamp'];
+ CmsLogState.totalRecords += recs.length;
+ }
+
+ for (var i = 0; i < recs.length; ++i) {
+ var rec = recs[i];
+ var line = document.createElement('tr');
+ var cell1 = document.createElement('td');
+ var cell2 = document.createElement('td');
+
+ var timestamp = new Date(rec['Timestamp'] / 1000);
+ cell1.textContent = timestamp.toLocaleString();
+ cell1.dataset.ordervalue = rec['Timestamp'];
+ cell2.textContent = rec['Message'];
+ cell2.dataset.filtervalue = rec['RecordType'];
+ cell2.title = JSON.stringify(rec['Data'], null, 2);
+
+ line.appendChild(cell1);
+ line.appendChild(cell2);
+
+ document.getElementById('cms-log-body').appendChild(line);
+
+ CmsLogState.recordTypes.add(rec['RecordType']);
+ }
+
+ if (recs.length > 0) {
+ $("#cms-log-table").trigger("update", [true]);
+ }
+
+ if (recs.length == CmsLogState.limit) {
+ CmsLogState.isFull = false;
+ loadCmsLog();
+ } else {
+ CmsLogState.isFull = true;
+ setTimeout(loadCmsLog, CmsLogState.fetchInterval);
+ }
+}
+
+function onCmsLogFailed(data) {
+ if (data && data['Status'] && data['Status']['Reason'])
+ $('#cms-log-error').html(data['Status']['Reason']);
+ else
+ $('#cms-log-error').html("Cannot get CMS log update");
+ setTimeout(loadCmsLog, CmsLogState.retryInterval);
+}
+
+function loadCmsLog() {
+ var url = 'cms/api/json/log?data=1&limit=' + CmsLogState.limit;
+ if (CmsLogState.isFull) {
+ url += '&from=' + (CmsLogState.lastDate + 1);
+ } else {
+ if (CmsLogState.prevLastDate != 0) {
+ url += '&from=' + (CmsLogState.prevLastDate + 1);
+ url += '&to=' + (CmsLogState.firstDate - 1);
+ } else {
+ if (CmsLogState.totalRecords >= CmsLogState.initialFetchLimit) {
+ $('#cms-log-error').html("Stop fetching too long log");
+ CmsLogState.isFull = true;
+ setTimeout(loadCmsLog, CmsLogState.fetchInterval);
+ return;
+ } else {
+ url += '&from=0&to=' + (CmsLogState.firstDate - 1);
+ }
+ }
+ }
+ $.get(url).done(onCmsLogLoaded).fail(onCmsLogFailed);
+}
+
+function initCmsLogTab() {
+ $("#cms-log-table").tablesorter({
+ theme: 'blue',
+ sortList: [[0,0]],
+ headers: {
+ 0: {
+ sorter: 'numeric-ordervalue',
+ },
+ 1: {
+ sorter: false,
+ }
+ },
+ widgets : ['zebra'],
+ });
+
+ loadCmsLog();
+}
diff --git a/ydb/core/cms/ui/common.css b/ydb/core/cms/ui/common.css
index 853f80671a4..e6298511cd0 100644
--- a/ydb/core/cms/ui/common.css
+++ b/ydb/core/cms/ui/common.css
@@ -1,32 +1,32 @@
-.tooltip-inner {
- color:#fff;
- background-color:#245973;
-}
-
-.vs-4px {
- margin-top: 4px;
-}
-
-.help-icon {
- width: 24px;
- height: 24px;
- background-color: transparent;
- border: none;
- margin: auto 0;
- padding: 0;
- background: url(/cms/res/help.png) no-repeat center;
-}
-
-.error {
- color: red;
- font-weight: bold;
-}
-
-.success {
- color: green;
- font-weight: bold;
-}
-
-.va-top {
- vertical-align: top;
-}
+.tooltip-inner {
+ color:#fff;
+ background-color:#245973;
+}
+
+.vs-4px {
+ margin-top: 4px;
+}
+
+.help-icon {
+ width: 24px;
+ height: 24px;
+ background-color: transparent;
+ border: none;
+ margin: auto 0;
+ padding: 0;
+ background: url(/cms/res/help.png) no-repeat center;
+}
+
+.error {
+ color: red;
+ font-weight: bold;
+}
+
+.success {
+ color: green;
+ font-weight: bold;
+}
+
+.va-top {
+ vertical-align: top;
+}
diff --git a/ydb/core/cms/ui/common.js b/ydb/core/cms/ui/common.js
index 2c0de8571cc..dacea7b50e4 100644
--- a/ydb/core/cms/ui/common.js
+++ b/ydb/core/cms/ui/common.js
@@ -1,85 +1,85 @@
-'use strict';
-
-var Parameters = {};
-var ShownElements = new Set();
-
-function onShown(id) {
- ShownElements.add(id);
- Parameters.show = Array.from(ShownElements.keys()).join(',');
- window.location.hash = $.param(Parameters);
-}
-
-function getOnShown(id) {
- return function() { onShown(id) };
-}
-
-function onHidden(id) {
- ShownElements.delete(id);
- Parameters.show = Array.from(ShownElements.keys()).join(',');
- window.location.hash = $.param(Parameters);
-}
-
-function getOnHidden(id) {
- return function() { onHidden(id) };
-}
-
-function removeElement(elem) {
- elem.parentElement.removeChild(elem);
-}
-
-function* makeUniqueId() {
- var id = 0;
- while (true) {
- ++id;
- console.log('elem-id-' + id);
- yield 'elem-id-' + id;
- }
-}
-
-function initCommon() {
- $.tablesorter.addParser({
- id: 'numeric-ordervalue',
- is: function() {
- return false;
- },
- format: function(s, table, cell, cellIndex) {
- return cell.dataset.ordervalue;
- },
- type: 'numeric'
- });
-
- $.tablesorter.addParser({
- id: 'filtervalue',
- is: function() {
- return false;
- },
- format: function(s, table, cell, cellIndex) {
- return cell.dataset.filtervalue;
- },
- type: 'text',
- parsed: true
- });
-}
-
-function parseHashParams() {
- window.location.hash.substr(1).split('&').forEach(
- function(o) {
- var a = o.split('=');
- Parameters[a[0]] = decodeURIComponent(a[1]);
- }
- );
-}
-
-function setHashParam(name, val) {
- Parameters[name] = val;
- window.location.hash = $.param(Parameters);
-}
-
-function timeToString(val) {
- var date = new Date(val / 1000);
- return date.toLocaleString();
-}
-
-function durationToStringMs(val) {
- return `${val / 1000} ms`;
-}
+'use strict';
+
+var Parameters = {};
+var ShownElements = new Set();
+
+function onShown(id) {
+ ShownElements.add(id);
+ Parameters.show = Array.from(ShownElements.keys()).join(',');
+ window.location.hash = $.param(Parameters);
+}
+
+function getOnShown(id) {
+ return function() { onShown(id) };
+}
+
+function onHidden(id) {
+ ShownElements.delete(id);
+ Parameters.show = Array.from(ShownElements.keys()).join(',');
+ window.location.hash = $.param(Parameters);
+}
+
+function getOnHidden(id) {
+ return function() { onHidden(id) };
+}
+
+function removeElement(elem) {
+ elem.parentElement.removeChild(elem);
+}
+
+function* makeUniqueId() {
+ var id = 0;
+ while (true) {
+ ++id;
+ console.log('elem-id-' + id);
+ yield 'elem-id-' + id;
+ }
+}
+
+function initCommon() {
+ $.tablesorter.addParser({
+ id: 'numeric-ordervalue',
+ is: function() {
+ return false;
+ },
+ format: function(s, table, cell, cellIndex) {
+ return cell.dataset.ordervalue;
+ },
+ type: 'numeric'
+ });
+
+ $.tablesorter.addParser({
+ id: 'filtervalue',
+ is: function() {
+ return false;
+ },
+ format: function(s, table, cell, cellIndex) {
+ return cell.dataset.filtervalue;
+ },
+ type: 'text',
+ parsed: true
+ });
+}
+
+function parseHashParams() {
+ window.location.hash.substr(1).split('&').forEach(
+ function(o) {
+ var a = o.split('=');
+ Parameters[a[0]] = decodeURIComponent(a[1]);
+ }
+ );
+}
+
+function setHashParam(name, val) {
+ Parameters[name] = val;
+ window.location.hash = $.param(Parameters);
+}
+
+function timeToString(val) {
+ var date = new Date(val / 1000);
+ return date.toLocaleString();
+}
+
+function durationToStringMs(val) {
+ return `${val / 1000} ms`;
+}
diff --git a/ydb/core/cms/ui/config_forms.js b/ydb/core/cms/ui/config_forms.js
index c8710325b8c..27518ef5ca1 100644
--- a/ydb/core/cms/ui/config_forms.js
+++ b/ydb/core/cms/ui/config_forms.js
@@ -1,895 +1,895 @@
-'use strict';
-
-function removeConfigItem(item) {
- var modalHTML = `
- <div class="modal fade" tabindex="-1" role="dialog">
- <div class="modal-dialog modal-dialog-centered" role="document">
- <div class="modal-content">
- <div class="modal-header">
- <h5 class="modal-title">Remove config item</h5>
- <button type="button" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">&times;</span>
- </button>
- </div>
- <div class="modal-body">
- <div class="error"></div>
- <p>Are you sure you want to remove config item ${item.getIdString()}?</p>
- </div>
- <div class="modal-footer">
- <button type="button" class="btn btn-primary" data-dismiss="modal">Decline</button>
- <button type="button" class="btn btn-danger" data-action="remove">Remove</button>
- </div>
- </div>
- </div>
- </div>
- `;
- var modal = $(modalHTML);
- modal.find('[data-action="remove"]').click(function() {
- var url = 'cms/api/console/configure';
- var cmd = {
- Actions: [
- {
- RemoveConfigItem: {
- ConfigItemId: item.getIdObj()
- }
- }
- ]
- };
-
- $(modal).find(".error").html('');
-
- $.post(url, JSON.stringify(cmd))
- .done(function (data) {
- if (data['Status']['Code'] != 'SUCCESS') {
- $(modal).find(".error").html(data['Status']['Reason']);
- return;
- }
-
- item.remove();
- modal.modal('hide');
- })
- .fail(function () {
- $(modal).find(".error").html("Removal request failed");
- });
- });
- modal.modal();
-}
-
-function formatUsageScopeText(scope) {
- var result = '';
- if (scope.NodeFilter) {
- result += 'node(s) ' + scope.NodeFilter.Nodes.join(' ');
- } else if (scope.HostFilter) {
- result += 'host(s) ' + scope.HostFilter.Hosts.join(' ');
- } else if (scope.TenantAndNodeTypeFilter) {
- if (scope.TenantAndNodeTypeFilter.Tenant)
- result += 'tenant ' + scope.TenantAndNodeTypeFilter.Tenant + " ";
- if (scope.TenantAndNodeTypeFilter.NodeType)
- result += 'node ' + scope.TenantAndNodeTypeFilter.NodeType + " ";
- } else {
- result += 'domain';
- }
- return result;
-}
-
-function formatCommonItemText(item) {
- var scope = item.getUsageScope();
- var result = "";
- result += "Id: " + item.getIdString() + "\n";
- result += "UsageScope: " + formatUsageScopeText(scope) + "\n";
- result += "Order: " + item.getOrder() + "\n";
- result += "Merge strategy: " + cmsEnums.MergeStrategy.get(item.getMergeStrategy()) + "\n";
- result += "Cookie: " + item.getCookie() + "\n";
- return result;
-}
-
-function addEditButtons(div, item) {
- var buttonsHTML = `
- <div style="z-index: 1; position: absolute; top: 0; right: 0; margin: 5px;">
+'use strict';
+
+function removeConfigItem(item) {
+ var modalHTML = `
+ <div class="modal fade" tabindex="-1" role="dialog">
+ <div class="modal-dialog modal-dialog-centered" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title">Remove config item</h5>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ </div>
+ <div class="modal-body">
+ <div class="error"></div>
+ <p>Are you sure you want to remove config item ${item.getIdString()}?</p>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-primary" data-dismiss="modal">Decline</button>
+ <button type="button" class="btn btn-danger" data-action="remove">Remove</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ `;
+ var modal = $(modalHTML);
+ modal.find('[data-action="remove"]').click(function() {
+ var url = 'cms/api/console/configure';
+ var cmd = {
+ Actions: [
+ {
+ RemoveConfigItem: {
+ ConfigItemId: item.getIdObj()
+ }
+ }
+ ]
+ };
+
+ $(modal).find(".error").html('');
+
+ $.post(url, JSON.stringify(cmd))
+ .done(function (data) {
+ if (data['Status']['Code'] != 'SUCCESS') {
+ $(modal).find(".error").html(data['Status']['Reason']);
+ return;
+ }
+
+ item.remove();
+ modal.modal('hide');
+ })
+ .fail(function () {
+ $(modal).find(".error").html("Removal request failed");
+ });
+ });
+ modal.modal();
+}
+
+function formatUsageScopeText(scope) {
+ var result = '';
+ if (scope.NodeFilter) {
+ result += 'node(s) ' + scope.NodeFilter.Nodes.join(' ');
+ } else if (scope.HostFilter) {
+ result += 'host(s) ' + scope.HostFilter.Hosts.join(' ');
+ } else if (scope.TenantAndNodeTypeFilter) {
+ if (scope.TenantAndNodeTypeFilter.Tenant)
+ result += 'tenant ' + scope.TenantAndNodeTypeFilter.Tenant + " ";
+ if (scope.TenantAndNodeTypeFilter.NodeType)
+ result += 'node ' + scope.TenantAndNodeTypeFilter.NodeType + " ";
+ } else {
+ result += 'domain';
+ }
+ return result;
+}
+
+function formatCommonItemText(item) {
+ var scope = item.getUsageScope();
+ var result = "";
+ result += "Id: " + item.getIdString() + "\n";
+ result += "UsageScope: " + formatUsageScopeText(scope) + "\n";
+ result += "Order: " + item.getOrder() + "\n";
+ result += "Merge strategy: " + cmsEnums.MergeStrategy.get(item.getMergeStrategy()) + "\n";
+ result += "Cookie: " + item.getCookie() + "\n";
+ return result;
+}
+
+function addEditButtons(div, item) {
+ var buttonsHTML = `
+ <div style="z-index: 1; position: absolute; top: 0; right: 0; margin: 5px;">
<button data-action="edit" class="${item.kind.editable ? '' : 'd-none'} btn-cfg-item cfg-item-edit-icon"></button>
- <button data-action="remove" class="btn-cfg-item cfg-item-remove-icon"></button>
- </div>
- `;
- $(div).append(buttonsHTML);
-
- $(div).find('[data-action="edit"]').click(function() {
- item.edit();
- });
- $(div).find('[data-action="remove"]').click(function() {
- removeConfigItem(item);
- });
-}
-
-class GenericConfigView {
- constructor(item) {
- this.item = item;
- this._createUIElements();
- }
-
- getElement() {
- return this._div;
- }
-
- update() {
- $(this._pre).html(this._formatItemText());
- }
-
- show() {
- $(this._div).show();
- }
-
- hide() {
- $(this._div).hide();
- }
-
- remove() {
- removeElement(this._div);
- this.item.kind.onViewRemoved();
- }
-
- markAsPendingUpdate() {
- $(this._pre).addClass('pending-update');
- }
-
- unmarkAsPendingUpdate() {
- $(this._pre).removeClass('pending-update');
- }
-
- _createUIElements() {
- this._pre = document.createElement('pre');
- this._pre.setAttribute('class', 'cfg-item');
-
- this._div = document.createElement('div');
- this._div.setAttribute('style', 'position: relative;');
- this._div.id = 'config-item-' + this.item.getId();
- this._div.appendChild(this._pre);
-
+ <button data-action="remove" class="btn-cfg-item cfg-item-remove-icon"></button>
+ </div>
+ `;
+ $(div).append(buttonsHTML);
+
+ $(div).find('[data-action="edit"]').click(function() {
+ item.edit();
+ });
+ $(div).find('[data-action="remove"]').click(function() {
+ removeConfigItem(item);
+ });
+}
+
+class GenericConfigView {
+ constructor(item) {
+ this.item = item;
+ this._createUIElements();
+ }
+
+ getElement() {
+ return this._div;
+ }
+
+ update() {
+ $(this._pre).html(this._formatItemText());
+ }
+
+ show() {
+ $(this._div).show();
+ }
+
+ hide() {
+ $(this._div).hide();
+ }
+
+ remove() {
+ removeElement(this._div);
+ this.item.kind.onViewRemoved();
+ }
+
+ markAsPendingUpdate() {
+ $(this._pre).addClass('pending-update');
+ }
+
+ unmarkAsPendingUpdate() {
+ $(this._pre).removeClass('pending-update');
+ }
+
+ _createUIElements() {
+ this._pre = document.createElement('pre');
+ this._pre.setAttribute('class', 'cfg-item');
+
+ this._div = document.createElement('div');
+ this._div.setAttribute('style', 'position: relative;');
+ this._div.id = 'config-item-' + this.item.getId();
+ this._div.appendChild(this._pre);
+
addEditButtons(this._div, this.item);
-
- this.item.kind.appendView(this._div);
-
- this.update();
- }
-
- _formatItemText() {
- var result = formatCommonItemText(this.item);
- result += "Config: " + JSON.stringify(this.item.getConfig(), null, 2);
-
- return result;
- }
-
-}
-
-class LogConfigView {
- constructor(item) {
- this.item = item;
- this._createUIElements();
- }
-
- getElement() {
- return this._div;
- }
-
- update() {
- $(this._pre).html(this._formatItemText());
-
- var tbody = $(this._table).find('tbody');
- tbody.empty();
-
- var cfg = this.item.getConfig().LogConfig;
- if (cfg === undefined)
- cfg = {};
-
- if (cfg.DefaultLevel !== undefined
- || cfg.DefaultSamplingLevel !== undefined
- || cfg.DefaultSamplingRate !== undefined)
- this._addLogLevelEntry("_DEFAULT_", cfg.DefaultLevel, cfg.DefaultSamplingLevel,
- cfg.DefaultSamplingRate);
-
- if (cfg.Entry)
- for (var entry of cfg.Entry)
- this._addLogLevelEntry(entry.Component, entry.Level, entry.SamplingLevel,
- entry.SamplingRate);
-
- $(this._table).trigger("update", [true]);
- }
-
- show() {
- $(this._div).show();
- }
-
- hide() {
- $(this._div).hide();
- }
-
- remove() {
- removeElement(this._div);
- this.item.kind.onViewRemoved();
- }
-
- markAsPendingUpdate() {
- $(this._pre).addClass('pending-update');
- }
-
- unmarkAsPendingUpdate() {
- $(this._pre).removeClass('pending-update');
- }
-
- _createUIElements() {
- this._pre = document.createElement('pre');
- this._pre.setAttribute('class', 'cfg-item-hdr');
-
- this._table = document.createElement('table');
-
- this._table.innerHTML =
- `<thead>
- <tr>
- <th>Component</th>
- <th>Log level</th>
- <th>Sampling level</th>
- <th>Sampling rate</th>
- </tr>
- </thead>
- <tbody>
- </tbody>`;
-
- $(this._table).tablesorter({
- theme: 'blue',
- sortList: [[0,0]],
- widgets : ['zebra'],
- });
-
- this._div = document.createElement('div');
- this._div.setAttribute('class', 'cfg-item');
- this._div.setAttribute('style', 'position: relative;');
- this._div.id = 'config-item-' + this.item.getId();
- this._div.appendChild(this._pre);
- this._div.appendChild(this._table);
-
+
+ this.item.kind.appendView(this._div);
+
+ this.update();
+ }
+
+ _formatItemText() {
+ var result = formatCommonItemText(this.item);
+ result += "Config: " + JSON.stringify(this.item.getConfig(), null, 2);
+
+ return result;
+ }
+
+}
+
+class LogConfigView {
+ constructor(item) {
+ this.item = item;
+ this._createUIElements();
+ }
+
+ getElement() {
+ return this._div;
+ }
+
+ update() {
+ $(this._pre).html(this._formatItemText());
+
+ var tbody = $(this._table).find('tbody');
+ tbody.empty();
+
+ var cfg = this.item.getConfig().LogConfig;
+ if (cfg === undefined)
+ cfg = {};
+
+ if (cfg.DefaultLevel !== undefined
+ || cfg.DefaultSamplingLevel !== undefined
+ || cfg.DefaultSamplingRate !== undefined)
+ this._addLogLevelEntry("_DEFAULT_", cfg.DefaultLevel, cfg.DefaultSamplingLevel,
+ cfg.DefaultSamplingRate);
+
+ if (cfg.Entry)
+ for (var entry of cfg.Entry)
+ this._addLogLevelEntry(entry.Component, entry.Level, entry.SamplingLevel,
+ entry.SamplingRate);
+
+ $(this._table).trigger("update", [true]);
+ }
+
+ show() {
+ $(this._div).show();
+ }
+
+ hide() {
+ $(this._div).hide();
+ }
+
+ remove() {
+ removeElement(this._div);
+ this.item.kind.onViewRemoved();
+ }
+
+ markAsPendingUpdate() {
+ $(this._pre).addClass('pending-update');
+ }
+
+ unmarkAsPendingUpdate() {
+ $(this._pre).removeClass('pending-update');
+ }
+
+ _createUIElements() {
+ this._pre = document.createElement('pre');
+ this._pre.setAttribute('class', 'cfg-item-hdr');
+
+ this._table = document.createElement('table');
+
+ this._table.innerHTML =
+ `<thead>
+ <tr>
+ <th>Component</th>
+ <th>Log level</th>
+ <th>Sampling level</th>
+ <th>Sampling rate</th>
+ </tr>
+ </thead>
+ <tbody>
+ </tbody>`;
+
+ $(this._table).tablesorter({
+ theme: 'blue',
+ sortList: [[0,0]],
+ widgets : ['zebra'],
+ });
+
+ this._div = document.createElement('div');
+ this._div.setAttribute('class', 'cfg-item');
+ this._div.setAttribute('style', 'position: relative;');
+ this._div.id = 'config-item-' + this.item.getId();
+ this._div.appendChild(this._pre);
+ this._div.appendChild(this._table);
+
addEditButtons(this._div, this.item);
-
- this.item.kind.appendView(this._div);
-
- this.update();
- }
-
- _addLogLevelEntry(name, level, sampling, rate) {
- if (level === undefined)
- level = '';
- else
- level = this._logLevelToString(level);
- if (sampling === undefined)
- sampling = '';
- else
- sampling = this._logLevelToString(sampling);
- if (rate === undefined)
- rate = '';
- var tbody = $(this._table).find('tbody');
- var tr = `<tr><td>${name}</td><td>${level}</td><td>${sampling}</td><td>${rate}</td>`;
- $(tr).appendTo(tbody);
- }
-
- _formatItemText() {
- var result = formatCommonItemText(this.item);
- result += '\n';
-
- var cfg = this.item.getConfig().LogConfig;
- if (cfg !== undefined)
- for (var field of ['SysLog', 'Format', 'ClusterName', 'AllowDropEntries', 'UseLocalTimestamps',
- 'BackendFileName', 'SysLogService', 'SysLogToStdErr']) {
- if (cfg[field] !== undefined)
- result += field + ': ' + cfg[field];
- }
-
- return result;
- }
-
- _logLevelToString(level) {
- if (level === 0)
- return 'EMERG';
- if (level === 1)
- return 'ALERT';
- if (level === 2)
- return 'CRIT';
- if (level === 3)
- return 'ERROR';
- if (level === 4)
- return 'WARN';
- if (level === 5)
- return 'NOTICE';
- if (level === 6)
- return 'INFO';
- if (level === 7)
- return 'DEBUG';
- if (level === 8)
- return 'TRACE';
- return 'UNKNOWN';
- }
-}
-
-class NodeBrokerConfigView {
- constructor(item) {
- this.item = item;
- this._createUIElements();
- }
-
- getElement() {
- return this._div;
- }
-
- update() {
- $(this._pre).html(this._formatItemText());
- }
-
- show() {
- $(this._div).show();
- }
-
- hide() {
- $(this._div).hide();
- }
-
- remove() {
- removeElement(this._div);
- this.item.kind.onViewRemoved();
- }
-
- markAsPendingUpdate() {
- $(this._pre).addClass('pending-update');
- }
-
- unmarkAsPendingUpdate() {
- $(this._pre).removeClass('pending-update');
- }
-
- _createUIElements() {
- this._pre = document.createElement('pre');
- this._pre.setAttribute('class', 'cfg-item');
-
- this._div = document.createElement('div');
- this._div.setAttribute('style', 'position: relative;');
- this._div.id = 'config-item-' + this.item.getId();
- this._div.appendChild(this._pre);
-
+
+ this.item.kind.appendView(this._div);
+
+ this.update();
+ }
+
+ _addLogLevelEntry(name, level, sampling, rate) {
+ if (level === undefined)
+ level = '';
+ else
+ level = this._logLevelToString(level);
+ if (sampling === undefined)
+ sampling = '';
+ else
+ sampling = this._logLevelToString(sampling);
+ if (rate === undefined)
+ rate = '';
+ var tbody = $(this._table).find('tbody');
+ var tr = `<tr><td>${name}</td><td>${level}</td><td>${sampling}</td><td>${rate}</td>`;
+ $(tr).appendTo(tbody);
+ }
+
+ _formatItemText() {
+ var result = formatCommonItemText(this.item);
+ result += '\n';
+
+ var cfg = this.item.getConfig().LogConfig;
+ if (cfg !== undefined)
+ for (var field of ['SysLog', 'Format', 'ClusterName', 'AllowDropEntries', 'UseLocalTimestamps',
+ 'BackendFileName', 'SysLogService', 'SysLogToStdErr']) {
+ if (cfg[field] !== undefined)
+ result += field + ': ' + cfg[field];
+ }
+
+ return result;
+ }
+
+ _logLevelToString(level) {
+ if (level === 0)
+ return 'EMERG';
+ if (level === 1)
+ return 'ALERT';
+ if (level === 2)
+ return 'CRIT';
+ if (level === 3)
+ return 'ERROR';
+ if (level === 4)
+ return 'WARN';
+ if (level === 5)
+ return 'NOTICE';
+ if (level === 6)
+ return 'INFO';
+ if (level === 7)
+ return 'DEBUG';
+ if (level === 8)
+ return 'TRACE';
+ return 'UNKNOWN';
+ }
+}
+
+class NodeBrokerConfigView {
+ constructor(item) {
+ this.item = item;
+ this._createUIElements();
+ }
+
+ getElement() {
+ return this._div;
+ }
+
+ update() {
+ $(this._pre).html(this._formatItemText());
+ }
+
+ show() {
+ $(this._div).show();
+ }
+
+ hide() {
+ $(this._div).hide();
+ }
+
+ remove() {
+ removeElement(this._div);
+ this.item.kind.onViewRemoved();
+ }
+
+ markAsPendingUpdate() {
+ $(this._pre).addClass('pending-update');
+ }
+
+ unmarkAsPendingUpdate() {
+ $(this._pre).removeClass('pending-update');
+ }
+
+ _createUIElements() {
+ this._pre = document.createElement('pre');
+ this._pre.setAttribute('class', 'cfg-item');
+
+ this._div = document.createElement('div');
+ this._div.setAttribute('style', 'position: relative;');
+ this._div.id = 'config-item-' + this.item.getId();
+ this._div.appendChild(this._pre);
+
addEditButtons(this._div, this.item);
-
- this.item.kind.appendView(this._div);
-
- this.update();
- }
-
- _formatItemText() {
- var result = formatCommonItemText(this.item);
- result += '\n';
-
- var cfg = this.item.getConfig().NodeBrokerConfig;
- if (cfg == undefined)
- cfg = {};
-
- if (cfg['EpochDuration'] !== undefined)
- result += 'EpochDuration: ' + cfg['EpochDuration'] / 1000000 / 60 + ' min.\n';
- if (cfg['BannedNodeIds'] !== undefined) {
- result += 'BannedNodeIds:';
- for (var ids of cfg['BannedNodeIds'])
- result += ' [' + ids.From + ', ' + ids.To + ']';
- }
-
- return result;
- }
-}
-
-class ImmediateControlsConfigView {
- constructor(item) {
- this.item = item;
- this._createUIElements();
- }
-
- getElement() {
- return this._div;
- }
-
- update() {
- $(this._pre).html(this._formatItemText());
- }
-
- show() {
- $(this._div).show();
- }
-
- hide() {
- $(this._div).hide();
- }
-
- remove() {
- removeElement(this._div);
- this.item.kind.onViewRemoved();
- }
-
- markAsPendingUpdate() {
- $(this._pre).addClass('pending-update');
- }
-
- unmarkAsPendingUpdate() {
- $(this._pre).removeClass('pending-update');
- }
-
- _createUIElements() {
- this._pre = document.createElement('pre');
- this._pre.setAttribute('class', 'cfg-item');
-
- this._div = document.createElement('div');
- this._div.setAttribute('style', 'position: relative;');
- this._div.id = 'config-item-' + this.item.getId();
- this._div.appendChild(this._pre);
-
+
+ this.item.kind.appendView(this._div);
+
+ this.update();
+ }
+
+ _formatItemText() {
+ var result = formatCommonItemText(this.item);
+ result += '\n';
+
+ var cfg = this.item.getConfig().NodeBrokerConfig;
+ if (cfg == undefined)
+ cfg = {};
+
+ if (cfg['EpochDuration'] !== undefined)
+ result += 'EpochDuration: ' + cfg['EpochDuration'] / 1000000 / 60 + ' min.\n';
+ if (cfg['BannedNodeIds'] !== undefined) {
+ result += 'BannedNodeIds:';
+ for (var ids of cfg['BannedNodeIds'])
+ result += ' [' + ids.From + ', ' + ids.To + ']';
+ }
+
+ return result;
+ }
+}
+
+class ImmediateControlsConfigView {
+ constructor(item) {
+ this.item = item;
+ this._createUIElements();
+ }
+
+ getElement() {
+ return this._div;
+ }
+
+ update() {
+ $(this._pre).html(this._formatItemText());
+ }
+
+ show() {
+ $(this._div).show();
+ }
+
+ hide() {
+ $(this._div).hide();
+ }
+
+ remove() {
+ removeElement(this._div);
+ this.item.kind.onViewRemoved();
+ }
+
+ markAsPendingUpdate() {
+ $(this._pre).addClass('pending-update');
+ }
+
+ unmarkAsPendingUpdate() {
+ $(this._pre).removeClass('pending-update');
+ }
+
+ _createUIElements() {
+ this._pre = document.createElement('pre');
+ this._pre.setAttribute('class', 'cfg-item');
+
+ this._div = document.createElement('div');
+ this._div.setAttribute('style', 'position: relative;');
+ this._div.id = 'config-item-' + this.item.getId();
+ this._div.appendChild(this._pre);
+
addEditButtons(this._div, this.item);
-
- this.item.kind.appendView(this._div);
-
- this.update();
- }
-
- _formatItemText() {
- var result = formatCommonItemText(this.item);
- result += '\n';
-
- var cfg;
- if (this.item.getConfig() && this.item.getConfig().ImmediateControlsConfig)
- cfg = this.item.getConfig().ImmediateControlsConfig;
-
- var desc = cmsProtoTypes.get('.NKikimrConfig.TImmediateControlsConfig');
- result += this._printCfg(cfg, desc, "");
-
- return result;
- }
-
- _printCfg(cfg, desc, prefix) {
- var res = '';
- for (var field of desc.field) {
- var name = prefix ? (prefix + '.' + field.name) : field.name;
- var value = cfg === undefined ? undefined : cfg[field.name];
- if (field.type_name !== undefined) {
- res += this._printCfg(value, cmsProtoTypes.get(field.type_name), name) + "\n";
- } else {
- var opts = field.options.ControlOptions;
- res += name + ": ";
- if (value !== undefined)
- res += value;
- else
- res += "UNSPECIFIED (default value: " + opts.DefaultValue + ")";
- res += "\n";
- }
- }
-
- return res;
- }
-}
-
-function getConfigViewCreator(kindName) {
- if (kindName === 'LogConfigItem')
- return function (item) {
- return new LogConfigView(item);
- }
- else if (kindName === 'NodeBrokerConfigItem')
- return function (item) {
- return new NodeBrokerConfigView(item);
- }
- else if (kindName === 'ImmediateControlsConfigItem')
- return function (item) {
- return new ImmediateControlsConfigView(item);
- }
-
- return function (item){
- return new GenericConfigView(item);
- }
-}
-
-class CommonEditForm {
- constructor(kind, item) {
- var form = document.createElement('form');
- form.setAttribute('class', 'cfg-form');
-
- this._kind = kind;
- this._item = item;
- this._form = form;
-
- var title;
- if (item)
- title = `Modify config item #${item.getIdString()}`;
- else
- title = 'Create new config item';
-
- form.innerHTML = `
- <div class="error"></div>
- <div class="cfg-form" style="padding-left: 10px;">
- <div class="form-group row">
- <label class="col-form-label form-control-sm col-sm-auto">${title}</label>
- </div>
- <div class="form-group row">
- <label class="col-form-label form-control-sm col-sm-1">Scope:</label>
- <div class="col-sm-auto">
- <select class="cfg-form scope-select form-control-sm">
- <option value="">All nodes</option>
- <option value="nodes">Filter by node ID</option>
- <option value="hosts">Filter by host</option>
- <option value="type">Filter by node type</option>
- <option value="tenant">Filter by tenant</option>
- <option value="tenant-and-type">Filter by tenant and node type</option>
- </select>
- </div>
- </div>
- <div class="form-group row scope-nodes">
- <label class="col-form-label form-control-sm col-sm-1">Node ID(s):</label>
- <div class="col-sm-auto">
- <input type="text" class="form-control-sm cfg-form" placeholder="1 2 3..."/>
- </div>
- </div>
- <div class="form-group row scope-hosts">
- <label class="col-form-label form-control-sm col-sm-1">Host(s):</label>
- <div class="col-sm-auto">
- <input type="text" class="form-control-sm cfg-form" placeholder="host1 host2 host3..."/>
- </div>
- </div>
- <div class="form-group row scope-tenant">
- <label class="col-form-label form-control-sm col-sm-1">Tenant:</label>
- <div class="col-sm-auto">
- <input type="text" class="form-control-sm cfg-form" placeholder="Enter tenant name..."/>
- </div>
- </div>
- <div class="form-group row scope-type">
- <label class="col-form-label form-control-sm col-sm-1">Node type:</label>
- <div class="col-sm-auto">
- <input type="text" class="form-control-sm cfg-form" placeholder="Enter node type..."/>
- </div>
- </div>
- </div>
- <div class="row">
- <div class="col-sm-auto">
- <button class="form-control btn btn-primary" data-action="submit">Submit</button>
- </div>
- <div class="col-sm-auto">
- <button class="form-control btn btn-danger" data-action="discard">Discard</button>
- </div>
- </div>
- `;
-
- var select = $(form).find('.scope-select');
- if (item) {
- if (item.getUsageScope()) {
- var scope = item.getUsageScope();
- if (scope.NodeFilter) {
- select.children("[value='nodes']").attr('selected', '');
- $(form).find('.scope-nodes').find(':input').val(
- scope.NodeFilter.Nodes.join(' '));
- } else if (scope.HostFilter) {
- select.children("[value='hosts']").attr('selected', '');
- $(form).find('.scope-hosts').find(':input').val(
- scope.HostFilter.Hosts.join(' '));
- } else if (scope.TenantAndNodeTypeFilter) {
- var filter = scope.TenantAndNodeTypeFilter;
- if (filter.Tenant) {
- select.children("[value='tenant']").attr('selected', '');
- $(form).find('.scope-tenant').find(':input').val(filter.Tenant);
- }
- if (filter.NodeType) {
- $(form).find('.scope-type').find(':input').val(filter.NodeType);
- if (filter.Tenant)
- select.children("[value='tenant-and-type']").attr('selected', '');
- else
- select.children("[value='type']").attr('selected', '');
- }
- }
- }
- }
-
- this._onUsageScopeSelect(select[0]);
-
- let _this = this;
- $(form).find('[data-action="submit"]').click(function() {
- _this._submit();
- });
- $(form).find('[data-action="discard"]').click(function() {
- _this._discard();
- });
- $(form).find('.scope-select').change(function() {
- _this._onUsageScopeSelect(this);
- });
- }
-
- getElement() {
- return this._form;
- }
-
- _prepareData() {
- var data = {};
- var form = $(this._form);
- var val = form.find('.scope-select').children(":selected").val();
- var scope = {};
-
- if (val === 'nodes') {
- var scope = { NodeFilter: { Nodes: [] } };
-
- var nodes = form.find('.scope-nodes').find(':input').val();
- if (!nodes.match(/^[0-9 ]*$/))
- throw "invalid nodes list (use only 0-9 and ' ' symbols)";
-
- nodes = nodes.match(/\d+/g);
- if (!nodes)
- throw "empty nodes list is not allowed";
-
- scope.NodeFilter.Nodes = nodes.map(Number);
- } else if (val === 'hosts') {
- var scope = { HostFilter: { Hosts: [] } };
-
- var hosts = form.find('.scope-hosts').find(':input').val();
- scope.HostFilter.Hosts = hosts.match(/[^ ]+/g);
-
- if (!scope.HostFilter.Hosts)
- throw "empty hosts list is not allowed";
- } else if (val === 'tenant') {
- var tenant = this._extractTenantName();
- var scope = { TenantAndNodeTypeFilter: { Tenant: tenant } };
- } else if (val === 'type') {
- var type = this._extractNodeType();
- var scope = { TenantAndNodeTypeFilter: { NodeType: type } };
- } else if (val === 'tenant-and-type') {
- var type = this._extractNodeType();
- var tenant = this._extractTenantName();
- var scope = { TenantAndNodeTypeFilter: { Tenant: tenant, NodeType: type } };
- }
-
- data.UsageScope = scope;
-
- return data;
- }
-
- _extractTenantName() {
- var tenant = $(this._form).find('.scope-tenant').find(':input').val();
-
- if (!tenant.match(/^\/[a-zA-Z0-9-_./]+$/))
- throw "invalid tenant path";
-
- return tenant;
- }
-
- _extractNodeType() {
- var type = $(this._form).find('.scope-type').find(':input').val();
-
- if (!type.match(/^[a-zA-Z0-9-_.]+$/))
- throw "invalid node type";
-
- return type;
- }
-
- _makeNumericInput(label, cl, placeholder, value, help) {
- return this._makeInput(label, 'number', cl, placeholder, value, help);
- }
-
- _makeTextInput(label, cl, placeholder, value, help) {
- return this._makeInput(label, 'text', cl, placeholder, value, help);
- }
-
- _makeInput(label, type, cl, placeholder, value, help) {
- var val = value !== undefined ? value : '';
- var res = `
- <div class="col-3">
- <label class="col-form-label form-control-sm">${label}</label>
- </div>
- <div class="col-auto">
- <input type="${type}" class="form-control-sm cfg-form ${cl}" placeholder="${placeholder}" value="${val}"/>
- </div>`;
- if (help !== undefined)
- res += `<div class="help-icon" data-toggle="tooltip" title="${help}"></div>`;
- return res;
- }
-
- _setTimeSecValue(data, cl, path) {
- this._setTimeValue(data, 1000000, cl, path);
- }
-
- _setTimeMinValue(data, cl, path) {
- this._setTimeValue(data, 60 * 1000000, cl, path);
- }
-
- _setTimeHourValue(data, cl, path) {
- this._setTimeValue(data, 3600 * 1000000, cl, path);
- }
-
- _setTimeDayValue(data, cl, path) {
- this._setTimeValue(data, 24 * 3600 * 1000000, cl, path);
- }
-
- _setTimeValue(data, factor, cl, path) {
- var val = $(this._form).find('.' + cl).val();
- if (val === '')
- return;
-
- val = +val;
- if (val < 0)
- throw `negative duration value (${val}) is not allowed`;
- val = val * factor;
-
- this._setValue(data, val, path);
- }
-
- _setNumValue(data, cl, path) {
- var val = $(this._form).find('.' + cl).val();
- if (val === '')
- return;
-
- val = +val;
- if (val < 0)
- throw `negative value (${val}) is not allowed`;
-
- this._setValue(data, val, path);
- }
-
- _setBoolSelectValue(data, cl, path) {
- var val = +$(this._form).find('.' + cl).children(":selected").val();
- if (val === -1)
- return;
- this._setValue(data, val === 1, path);
- }
-
- _setValue(data, val, path) {
- if (typeof path === 'string') {
- data[path] = val;
- return;
- }
-
- console.assert(path.length > 0);
- for (var i = 0; i < path.length - 1; ++i) {
- if (data[path[i]] === undefined)
- data[path[i]] = {};
- data = data[path[i]];
- }
- data[path[path.length - 1]] = val;
- }
-
- _parseInt(val) {
- if (val === undefined)
- return val;
-
- val.trim();
- if (!val.match(/^\d+$/))
- return undefined;
-
- return +val;
- }
-
- _submit() {
- try {
- $(this._form).children(".error").html('');
- $("#configs-success").html('');
-
- var data = this._prepareData();
-
- var cmd = { Actions: [] };
- if (this._item) {
- data.Id = this._item.getIdObj();
- data.Kind = this._item.getKindNo();
- data.Order = this._item.getOrder();
- data.MergeStrategy = this._item.getMergeStrategy();
- data.Cookie = this._item.getCookie();
-
- var modify = { ModifyConfigItem: { ConfigItem: data } };
- cmd.Actions.push(modify);
-
- this._generation = this._item.getGeneration();
- } else {
- var add = { AddConfigItem: { ConfigItem: data } };
- cmd.Actions.push(add);
- }
-
- this._data = data;
-
- $(this._form).find('[data-action="submit"]').attr("disabled", "");
- $(this._form).find('[data-action="discard"]').attr("disabled", "");
-
- var url = 'cms/api/console/configure';
- let _this = this;
- $.post(url, JSON.stringify(cmd))
- .done(function (data) {
- _this._onConfigureFinished(data);
- })
- .fail(function () {
- _this._onConfigureFailed();
- });
- } catch (err) {
- $(this._form).children(".error").html(err);
- }
- }
-
- _discard() {
- if (this._item)
- this._item.show();
- removeElement(this._form);
- }
-
- _onConfigureFinished(data) {
- if (data['Status']['Code'] != 'SUCCESS') {
- this._onConfigureFailed(data);
- return;
- }
-
- $("#configs-success").html('Successfully updated config');
- if (this._item) {
- if (this._item.getGeneration() === this._generation) {
- this._data.Id = this._item.getIdObj();
- this._item.update(this._data);
- this._item.markAsPendingUpdate();
- }
- this._item.show();
- } else {
- if (data.AddedItemIds && data.AddedItemIds.length == 1) {
- this._data.Id = {
- Id: data.AddedItemIds[0],
- Generation: 0,
- };
- this._data.Kind = this._kind.no;
- var item = new ConfigItem(this._data);
- item.markAsPendingUpdate();
- }
- }
- removeElement(this._form);
- }
-
- _onConfigureFailed(data) {
- if (data && data['Status'] && data['Status']['Reason'])
- $(this._form).find('.error').html(data['Status']['Reason']);
- else
- $(this._form).find('.error').html("Cannot update config");
-
- $(this._form).find('[data-action="submit"]').removeAttr("disabled");
- $(this._form).find('[data-action="discard"]').removeAttr("disabled");
- }
-
- _onUsageScopeSelect(select) {
- var form = $(this._form);
- var value = $(select).children(":selected").val();
-
- form.find('.scope-nodes').hide();
- form.find('.scope-hosts').hide();
- form.find('.scope-tenant').hide();
- form.find('.scope-type').hide();
-
- if (value === 'nodes')
- form.find('.scope-nodes').show();
- else if (value === 'hosts')
- form.find('.scope-hosts').show();
- else if (value === 'tenant')
- form.find('.scope-tenant').show();
- else if (value === 'type')
- form.find('.scope-type').show();
- else if (value === 'tenant-and-type') {
- form.find('.scope-tenant').show();
- form.find('.scope-type').show();
- }
- }
-}
-
-class LogConfigEditForm extends CommonEditForm {
- constructor(kind, item) {
- super(kind, item);
- var form = $(this._form);
-
+
+ this.item.kind.appendView(this._div);
+
+ this.update();
+ }
+
+ _formatItemText() {
+ var result = formatCommonItemText(this.item);
+ result += '\n';
+
+ var cfg;
+ if (this.item.getConfig() && this.item.getConfig().ImmediateControlsConfig)
+ cfg = this.item.getConfig().ImmediateControlsConfig;
+
+ var desc = cmsProtoTypes.get('.NKikimrConfig.TImmediateControlsConfig');
+ result += this._printCfg(cfg, desc, "");
+
+ return result;
+ }
+
+ _printCfg(cfg, desc, prefix) {
+ var res = '';
+ for (var field of desc.field) {
+ var name = prefix ? (prefix + '.' + field.name) : field.name;
+ var value = cfg === undefined ? undefined : cfg[field.name];
+ if (field.type_name !== undefined) {
+ res += this._printCfg(value, cmsProtoTypes.get(field.type_name), name) + "\n";
+ } else {
+ var opts = field.options.ControlOptions;
+ res += name + ": ";
+ if (value !== undefined)
+ res += value;
+ else
+ res += "UNSPECIFIED (default value: " + opts.DefaultValue + ")";
+ res += "\n";
+ }
+ }
+
+ return res;
+ }
+}
+
+function getConfigViewCreator(kindName) {
+ if (kindName === 'LogConfigItem')
+ return function (item) {
+ return new LogConfigView(item);
+ }
+ else if (kindName === 'NodeBrokerConfigItem')
+ return function (item) {
+ return new NodeBrokerConfigView(item);
+ }
+ else if (kindName === 'ImmediateControlsConfigItem')
+ return function (item) {
+ return new ImmediateControlsConfigView(item);
+ }
+
+ return function (item){
+ return new GenericConfigView(item);
+ }
+}
+
+class CommonEditForm {
+ constructor(kind, item) {
+ var form = document.createElement('form');
+ form.setAttribute('class', 'cfg-form');
+
+ this._kind = kind;
+ this._item = item;
+ this._form = form;
+
+ var title;
+ if (item)
+ title = `Modify config item #${item.getIdString()}`;
+ else
+ title = 'Create new config item';
+
+ form.innerHTML = `
+ <div class="error"></div>
+ <div class="cfg-form" style="padding-left: 10px;">
+ <div class="form-group row">
+ <label class="col-form-label form-control-sm col-sm-auto">${title}</label>
+ </div>
+ <div class="form-group row">
+ <label class="col-form-label form-control-sm col-sm-1">Scope:</label>
+ <div class="col-sm-auto">
+ <select class="cfg-form scope-select form-control-sm">
+ <option value="">All nodes</option>
+ <option value="nodes">Filter by node ID</option>
+ <option value="hosts">Filter by host</option>
+ <option value="type">Filter by node type</option>
+ <option value="tenant">Filter by tenant</option>
+ <option value="tenant-and-type">Filter by tenant and node type</option>
+ </select>
+ </div>
+ </div>
+ <div class="form-group row scope-nodes">
+ <label class="col-form-label form-control-sm col-sm-1">Node ID(s):</label>
+ <div class="col-sm-auto">
+ <input type="text" class="form-control-sm cfg-form" placeholder="1 2 3..."/>
+ </div>
+ </div>
+ <div class="form-group row scope-hosts">
+ <label class="col-form-label form-control-sm col-sm-1">Host(s):</label>
+ <div class="col-sm-auto">
+ <input type="text" class="form-control-sm cfg-form" placeholder="host1 host2 host3..."/>
+ </div>
+ </div>
+ <div class="form-group row scope-tenant">
+ <label class="col-form-label form-control-sm col-sm-1">Tenant:</label>
+ <div class="col-sm-auto">
+ <input type="text" class="form-control-sm cfg-form" placeholder="Enter tenant name..."/>
+ </div>
+ </div>
+ <div class="form-group row scope-type">
+ <label class="col-form-label form-control-sm col-sm-1">Node type:</label>
+ <div class="col-sm-auto">
+ <input type="text" class="form-control-sm cfg-form" placeholder="Enter node type..."/>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-sm-auto">
+ <button class="form-control btn btn-primary" data-action="submit">Submit</button>
+ </div>
+ <div class="col-sm-auto">
+ <button class="form-control btn btn-danger" data-action="discard">Discard</button>
+ </div>
+ </div>
+ `;
+
+ var select = $(form).find('.scope-select');
+ if (item) {
+ if (item.getUsageScope()) {
+ var scope = item.getUsageScope();
+ if (scope.NodeFilter) {
+ select.children("[value='nodes']").attr('selected', '');
+ $(form).find('.scope-nodes').find(':input').val(
+ scope.NodeFilter.Nodes.join(' '));
+ } else if (scope.HostFilter) {
+ select.children("[value='hosts']").attr('selected', '');
+ $(form).find('.scope-hosts').find(':input').val(
+ scope.HostFilter.Hosts.join(' '));
+ } else if (scope.TenantAndNodeTypeFilter) {
+ var filter = scope.TenantAndNodeTypeFilter;
+ if (filter.Tenant) {
+ select.children("[value='tenant']").attr('selected', '');
+ $(form).find('.scope-tenant').find(':input').val(filter.Tenant);
+ }
+ if (filter.NodeType) {
+ $(form).find('.scope-type').find(':input').val(filter.NodeType);
+ if (filter.Tenant)
+ select.children("[value='tenant-and-type']").attr('selected', '');
+ else
+ select.children("[value='type']").attr('selected', '');
+ }
+ }
+ }
+ }
+
+ this._onUsageScopeSelect(select[0]);
+
+ let _this = this;
+ $(form).find('[data-action="submit"]').click(function() {
+ _this._submit();
+ });
+ $(form).find('[data-action="discard"]').click(function() {
+ _this._discard();
+ });
+ $(form).find('.scope-select').change(function() {
+ _this._onUsageScopeSelect(this);
+ });
+ }
+
+ getElement() {
+ return this._form;
+ }
+
+ _prepareData() {
+ var data = {};
+ var form = $(this._form);
+ var val = form.find('.scope-select').children(":selected").val();
+ var scope = {};
+
+ if (val === 'nodes') {
+ var scope = { NodeFilter: { Nodes: [] } };
+
+ var nodes = form.find('.scope-nodes').find(':input').val();
+ if (!nodes.match(/^[0-9 ]*$/))
+ throw "invalid nodes list (use only 0-9 and ' ' symbols)";
+
+ nodes = nodes.match(/\d+/g);
+ if (!nodes)
+ throw "empty nodes list is not allowed";
+
+ scope.NodeFilter.Nodes = nodes.map(Number);
+ } else if (val === 'hosts') {
+ var scope = { HostFilter: { Hosts: [] } };
+
+ var hosts = form.find('.scope-hosts').find(':input').val();
+ scope.HostFilter.Hosts = hosts.match(/[^ ]+/g);
+
+ if (!scope.HostFilter.Hosts)
+ throw "empty hosts list is not allowed";
+ } else if (val === 'tenant') {
+ var tenant = this._extractTenantName();
+ var scope = { TenantAndNodeTypeFilter: { Tenant: tenant } };
+ } else if (val === 'type') {
+ var type = this._extractNodeType();
+ var scope = { TenantAndNodeTypeFilter: { NodeType: type } };
+ } else if (val === 'tenant-and-type') {
+ var type = this._extractNodeType();
+ var tenant = this._extractTenantName();
+ var scope = { TenantAndNodeTypeFilter: { Tenant: tenant, NodeType: type } };
+ }
+
+ data.UsageScope = scope;
+
+ return data;
+ }
+
+ _extractTenantName() {
+ var tenant = $(this._form).find('.scope-tenant').find(':input').val();
+
+ if (!tenant.match(/^\/[a-zA-Z0-9-_./]+$/))
+ throw "invalid tenant path";
+
+ return tenant;
+ }
+
+ _extractNodeType() {
+ var type = $(this._form).find('.scope-type').find(':input').val();
+
+ if (!type.match(/^[a-zA-Z0-9-_.]+$/))
+ throw "invalid node type";
+
+ return type;
+ }
+
+ _makeNumericInput(label, cl, placeholder, value, help) {
+ return this._makeInput(label, 'number', cl, placeholder, value, help);
+ }
+
+ _makeTextInput(label, cl, placeholder, value, help) {
+ return this._makeInput(label, 'text', cl, placeholder, value, help);
+ }
+
+ _makeInput(label, type, cl, placeholder, value, help) {
+ var val = value !== undefined ? value : '';
+ var res = `
+ <div class="col-3">
+ <label class="col-form-label form-control-sm">${label}</label>
+ </div>
+ <div class="col-auto">
+ <input type="${type}" class="form-control-sm cfg-form ${cl}" placeholder="${placeholder}" value="${val}"/>
+ </div>`;
+ if (help !== undefined)
+ res += `<div class="help-icon" data-toggle="tooltip" title="${help}"></div>`;
+ return res;
+ }
+
+ _setTimeSecValue(data, cl, path) {
+ this._setTimeValue(data, 1000000, cl, path);
+ }
+
+ _setTimeMinValue(data, cl, path) {
+ this._setTimeValue(data, 60 * 1000000, cl, path);
+ }
+
+ _setTimeHourValue(data, cl, path) {
+ this._setTimeValue(data, 3600 * 1000000, cl, path);
+ }
+
+ _setTimeDayValue(data, cl, path) {
+ this._setTimeValue(data, 24 * 3600 * 1000000, cl, path);
+ }
+
+ _setTimeValue(data, factor, cl, path) {
+ var val = $(this._form).find('.' + cl).val();
+ if (val === '')
+ return;
+
+ val = +val;
+ if (val < 0)
+ throw `negative duration value (${val}) is not allowed`;
+ val = val * factor;
+
+ this._setValue(data, val, path);
+ }
+
+ _setNumValue(data, cl, path) {
+ var val = $(this._form).find('.' + cl).val();
+ if (val === '')
+ return;
+
+ val = +val;
+ if (val < 0)
+ throw `negative value (${val}) is not allowed`;
+
+ this._setValue(data, val, path);
+ }
+
+ _setBoolSelectValue(data, cl, path) {
+ var val = +$(this._form).find('.' + cl).children(":selected").val();
+ if (val === -1)
+ return;
+ this._setValue(data, val === 1, path);
+ }
+
+ _setValue(data, val, path) {
+ if (typeof path === 'string') {
+ data[path] = val;
+ return;
+ }
+
+ console.assert(path.length > 0);
+ for (var i = 0; i < path.length - 1; ++i) {
+ if (data[path[i]] === undefined)
+ data[path[i]] = {};
+ data = data[path[i]];
+ }
+ data[path[path.length - 1]] = val;
+ }
+
+ _parseInt(val) {
+ if (val === undefined)
+ return val;
+
+ val.trim();
+ if (!val.match(/^\d+$/))
+ return undefined;
+
+ return +val;
+ }
+
+ _submit() {
+ try {
+ $(this._form).children(".error").html('');
+ $("#configs-success").html('');
+
+ var data = this._prepareData();
+
+ var cmd = { Actions: [] };
+ if (this._item) {
+ data.Id = this._item.getIdObj();
+ data.Kind = this._item.getKindNo();
+ data.Order = this._item.getOrder();
+ data.MergeStrategy = this._item.getMergeStrategy();
+ data.Cookie = this._item.getCookie();
+
+ var modify = { ModifyConfigItem: { ConfigItem: data } };
+ cmd.Actions.push(modify);
+
+ this._generation = this._item.getGeneration();
+ } else {
+ var add = { AddConfigItem: { ConfigItem: data } };
+ cmd.Actions.push(add);
+ }
+
+ this._data = data;
+
+ $(this._form).find('[data-action="submit"]').attr("disabled", "");
+ $(this._form).find('[data-action="discard"]').attr("disabled", "");
+
+ var url = 'cms/api/console/configure';
+ let _this = this;
+ $.post(url, JSON.stringify(cmd))
+ .done(function (data) {
+ _this._onConfigureFinished(data);
+ })
+ .fail(function () {
+ _this._onConfigureFailed();
+ });
+ } catch (err) {
+ $(this._form).children(".error").html(err);
+ }
+ }
+
+ _discard() {
+ if (this._item)
+ this._item.show();
+ removeElement(this._form);
+ }
+
+ _onConfigureFinished(data) {
+ if (data['Status']['Code'] != 'SUCCESS') {
+ this._onConfigureFailed(data);
+ return;
+ }
+
+ $("#configs-success").html('Successfully updated config');
+ if (this._item) {
+ if (this._item.getGeneration() === this._generation) {
+ this._data.Id = this._item.getIdObj();
+ this._item.update(this._data);
+ this._item.markAsPendingUpdate();
+ }
+ this._item.show();
+ } else {
+ if (data.AddedItemIds && data.AddedItemIds.length == 1) {
+ this._data.Id = {
+ Id: data.AddedItemIds[0],
+ Generation: 0,
+ };
+ this._data.Kind = this._kind.no;
+ var item = new ConfigItem(this._data);
+ item.markAsPendingUpdate();
+ }
+ }
+ removeElement(this._form);
+ }
+
+ _onConfigureFailed(data) {
+ if (data && data['Status'] && data['Status']['Reason'])
+ $(this._form).find('.error').html(data['Status']['Reason']);
+ else
+ $(this._form).find('.error').html("Cannot update config");
+
+ $(this._form).find('[data-action="submit"]').removeAttr("disabled");
+ $(this._form).find('[data-action="discard"]').removeAttr("disabled");
+ }
+
+ _onUsageScopeSelect(select) {
+ var form = $(this._form);
+ var value = $(select).children(":selected").val();
+
+ form.find('.scope-nodes').hide();
+ form.find('.scope-hosts').hide();
+ form.find('.scope-tenant').hide();
+ form.find('.scope-type').hide();
+
+ if (value === 'nodes')
+ form.find('.scope-nodes').show();
+ else if (value === 'hosts')
+ form.find('.scope-hosts').show();
+ else if (value === 'tenant')
+ form.find('.scope-tenant').show();
+ else if (value === 'type')
+ form.find('.scope-type').show();
+ else if (value === 'tenant-and-type') {
+ form.find('.scope-tenant').show();
+ form.find('.scope-type').show();
+ }
+ }
+}
+
+class LogConfigEditForm extends CommonEditForm {
+ constructor(kind, item) {
+ super(kind, item);
+ var form = $(this._form);
+
var syslog;
- var defLevel;
- var defSampling;
- var defRate;
- var cfg;
-
- if (item && item.getConfig() && item.getConfig().LogConfig) {
- cfg = item.getConfig().LogConfig;
-
+ var defLevel;
+ var defSampling;
+ var defRate;
+ var cfg;
+
+ if (item && item.getConfig() && item.getConfig().LogConfig) {
+ cfg = item.getConfig().LogConfig;
+
syslog = cfg.SysLog;
- defLevel = cfg.DefaultLevel;
- defSampling = cfg.DefaultSamplingLevel;
- defRate = cfg.DefaultSamplingRate;
- }
-
- var configFormHTML = `
- <div style="padding-left: 10px;">
+ defLevel = cfg.DefaultLevel;
+ defSampling = cfg.DefaultSamplingLevel;
+ defRate = cfg.DefaultSamplingRate;
+ }
+
+ var configFormHTML = `
+ <div style="padding-left: 10px;">
<div class="form-group row">
<label class="col-form-label form-control-sm col-sm-1">Syslog:</label>
<div class="col-sm-auto">
@@ -900,186 +900,186 @@ class LogConfigEditForm extends CommonEditForm {
</select>
</div>
</div>
- <div class="form-group def-log-settings">
- <div class="row">
- <label class="col-form-label form-control-sm col-sm-auto">Default log settings:</label>
- </div>
- <div class="row">
- <label class="col-form-label form-control-sm col-sm-auto">Level: </label>
- <div class="col-sm-auto">
- ${this._getLevelSelectHTML("def-log-level", defLevel)}
- </div>
- <label class="col-form-label form-control-sm col-sm-auto">Sampling: </label>
- <div class="col-sm-auto">
- ${this._getLevelSelectHTML("def-log-sampling", defSampling)}
- </div>
- <label class="col-form-label form-control-sm col-sm-auto">Sampling rate: </label>
- <div class="col-sm-auto">
- <input type="number" class="form-control-sm cfg-form def-log-rate" placeholder="Enter sampling rate..."/>
- </div>
- </div>
- </div>
- <div class="form-group">
- <div class="row">
- <label class="col-form-label form-control-sm col-sm-auto">Component log settings:</label>
- </div>
- <div class="row" style="padding: 0 .5rem;">
- <table class="tablesorter" style="margin-right: 15px;">
- <thead>
- <tr>
- <th>Component</th>
- <th>Log level</th>
- <th>Sampling level</th>
- <th>Sampling rate</th>
- </tr>
- </thead>
- <tbody>
- </tbody>
- </table>
- </div>
- </div>
- </div>
- `;
-
- $(configFormHTML).insertBefore(form.children("div.row:last-child"));
-
- if (defRate)
- form.find(".def-log-rate").val(defRate);
-
- var levels = new Map();
- var samplings = new Map();
- var rates = new Map();
- if (cfg && cfg.Entry) {
- for (var entry of cfg.Entry) {
- if (entry.Level !== undefined)
- levels.set(entry.Component, entry.Level);
- if (entry.SamplingLevel !== undefined)
- samplings.set(entry.Component, entry.SamplingLevel);
- if (entry.SamplingRate !== undefined)
- rates.set(entry.Component, entry.SamplingRate);
- }
- }
-
- var tbody = form.find("tbody");
- for (var val of cmsEnums['ServiceKikimr'].values()) {
- var rowHTML = `
- <tr class="log-item-settings">
- <td class="log-item-name">${val}</td>
- <td>${this._getLevelSelectHTML("log-item-level", levels.get(val))}</td>
- <td>${this._getLevelSelectHTML("log-item-sampling", samplings.get(val))}</td>
- <td>
- <input type="number" class="form-control-sm cfg-form log-item-rate" placeholder="Enter sampling rate..." value="${rates.has(val) ? rates.get(val) : ""}"/>
- </td>
- </tr>
- `;
- tbody.append(rowHTML);
- }
-
- form.find("table").tablesorter({
- theme: 'blue',
- sortList: [[0,0]],
- headers: {
- 1: {
- sorter: 'numeric-ordervalue',
- },
- 2: {
- sorter: 'numeric-ordervalue',
- },
- 3: {
- sorter: false,
- },
- },
- widgets : ['zebra', 'filter'],
- });
- }
-
- _getLevelSelectHTML(classes, val) {
- if (val === undefined)
- val = -1;
- return `
- <select class="sampling-select form-control-sm ${classes}">
- <option value="-1" ${val == -1 ? "selected" : ""}>Default</option>
- <option value="0" ${val == 0 ? "selected" : ""}>EMERG</option>
- <option value="1" ${val == 1 ? "selected" : ""}>ALERT</option>
- <option value="2" ${val == 2 ? "selected" : ""}>CRIT</option>
- <option value="3" ${val == 3 ? "selected" : ""}>ERROR</option>
- <option value="4" ${val == 4 ? "selected" : ""}>WARN</option>
- <option value="5" ${val == 5 ? "selected" : ""}>NOTICE</option>
- <option value="6" ${val == 6 ? "selected" : ""}>INFO</option>
- <option value="7" ${val == 7 ? "selected" : ""}>DEBUG</option>
- <option value="8" ${val == 8 ? "selected" : ""}>TRACE</option>
- </select>
- `;
- }
-
- _prepareData() {
- var data = super._prepareData();
-
+ <div class="form-group def-log-settings">
+ <div class="row">
+ <label class="col-form-label form-control-sm col-sm-auto">Default log settings:</label>
+ </div>
+ <div class="row">
+ <label class="col-form-label form-control-sm col-sm-auto">Level: </label>
+ <div class="col-sm-auto">
+ ${this._getLevelSelectHTML("def-log-level", defLevel)}
+ </div>
+ <label class="col-form-label form-control-sm col-sm-auto">Sampling: </label>
+ <div class="col-sm-auto">
+ ${this._getLevelSelectHTML("def-log-sampling", defSampling)}
+ </div>
+ <label class="col-form-label form-control-sm col-sm-auto">Sampling rate: </label>
+ <div class="col-sm-auto">
+ <input type="number" class="form-control-sm cfg-form def-log-rate" placeholder="Enter sampling rate..."/>
+ </div>
+ </div>
+ </div>
+ <div class="form-group">
+ <div class="row">
+ <label class="col-form-label form-control-sm col-sm-auto">Component log settings:</label>
+ </div>
+ <div class="row" style="padding: 0 .5rem;">
+ <table class="tablesorter" style="margin-right: 15px;">
+ <thead>
+ <tr>
+ <th>Component</th>
+ <th>Log level</th>
+ <th>Sampling level</th>
+ <th>Sampling rate</th>
+ </tr>
+ </thead>
+ <tbody>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ `;
+
+ $(configFormHTML).insertBefore(form.children("div.row:last-child"));
+
+ if (defRate)
+ form.find(".def-log-rate").val(defRate);
+
+ var levels = new Map();
+ var samplings = new Map();
+ var rates = new Map();
+ if (cfg && cfg.Entry) {
+ for (var entry of cfg.Entry) {
+ if (entry.Level !== undefined)
+ levels.set(entry.Component, entry.Level);
+ if (entry.SamplingLevel !== undefined)
+ samplings.set(entry.Component, entry.SamplingLevel);
+ if (entry.SamplingRate !== undefined)
+ rates.set(entry.Component, entry.SamplingRate);
+ }
+ }
+
+ var tbody = form.find("tbody");
+ for (var val of cmsEnums['ServiceKikimr'].values()) {
+ var rowHTML = `
+ <tr class="log-item-settings">
+ <td class="log-item-name">${val}</td>
+ <td>${this._getLevelSelectHTML("log-item-level", levels.get(val))}</td>
+ <td>${this._getLevelSelectHTML("log-item-sampling", samplings.get(val))}</td>
+ <td>
+ <input type="number" class="form-control-sm cfg-form log-item-rate" placeholder="Enter sampling rate..." value="${rates.has(val) ? rates.get(val) : ""}"/>
+ </td>
+ </tr>
+ `;
+ tbody.append(rowHTML);
+ }
+
+ form.find("table").tablesorter({
+ theme: 'blue',
+ sortList: [[0,0]],
+ headers: {
+ 1: {
+ sorter: 'numeric-ordervalue',
+ },
+ 2: {
+ sorter: 'numeric-ordervalue',
+ },
+ 3: {
+ sorter: false,
+ },
+ },
+ widgets : ['zebra', 'filter'],
+ });
+ }
+
+ _getLevelSelectHTML(classes, val) {
+ if (val === undefined)
+ val = -1;
+ return `
+ <select class="sampling-select form-control-sm ${classes}">
+ <option value="-1" ${val == -1 ? "selected" : ""}>Default</option>
+ <option value="0" ${val == 0 ? "selected" : ""}>EMERG</option>
+ <option value="1" ${val == 1 ? "selected" : ""}>ALERT</option>
+ <option value="2" ${val == 2 ? "selected" : ""}>CRIT</option>
+ <option value="3" ${val == 3 ? "selected" : ""}>ERROR</option>
+ <option value="4" ${val == 4 ? "selected" : ""}>WARN</option>
+ <option value="5" ${val == 5 ? "selected" : ""}>NOTICE</option>
+ <option value="6" ${val == 6 ? "selected" : ""}>INFO</option>
+ <option value="7" ${val == 7 ? "selected" : ""}>DEBUG</option>
+ <option value="8" ${val == 8 ? "selected" : ""}>TRACE</option>
+ </select>
+ `;
+ }
+
+ _prepareData() {
+ var data = super._prepareData();
+
var syslog = +$(this._form).find(".syslog").children(":selected").val();
- var defSettings = $(this._form).find("div.def-log-settings");
- var defLevel = +defSettings.find(".def-log-level").children(":selected").val();
- var defSampling = +defSettings.find(".def-log-sampling").children(":selected").val();
- var defRate = defSettings.find(".def-log-rate").val();
-
- var config = { LogConfig: {} };
+ var defSettings = $(this._form).find("div.def-log-settings");
+ var defLevel = +defSettings.find(".def-log-level").children(":selected").val();
+ var defSampling = +defSettings.find(".def-log-sampling").children(":selected").val();
+ var defRate = defSettings.find(".def-log-rate").val();
+
+ var config = { LogConfig: {} };
if (syslog != -1)
config.LogConfig.SysLog = syslog ? true : false;
- if (defLevel != -1)
- config.LogConfig.DefaultLevel = defLevel;
- if (defSampling != -1)
- config.LogConfig.DefaultSamplingLevel = defSampling;
- if (defRate)
- config.LogConfig.DefaultSamplingRate = +defRate;
-
- $(this._form).find("tr.log-item-settings").each(function() {
- var name = $(this).find(".log-item-name").text();
- var level = +$(this).find(".log-item-level").val();
- var sampling = +$(this).find(".log-item-sampling").val();
- var rate = $(this).find(".log-item-rate").val();
-
- if (level != -1 || sampling != -1 || rate) {
- var entry = {};
- entry.Component = name;
- if (level != -1)
- entry.Level = level;
- if (sampling != -1)
- entry.SamplingLevel = sampling;
- if (rate)
- entry.SamplingRate = +rate;
-
- if (!config.LogConfig.Entry)
- config.LogConfig.Entry = [];
-
- config.LogConfig.Entry.push(entry);
- }
- });
-
- data.Config = config;
-
- return data;
- }
-}
-
-class CmsConfigEditForm extends CommonEditForm {
- constructor(kind, item) {
- super(kind, item);
- var form = $(this._form);
-
- var infoCollectionTimeout;
- var defRetryTime;
- var defPermissionDuration;
- var clusterNodesLimit;
- var clusterNodesRatioLimit;
- var tenantNodesLimit;
- var tenantNodesRatioLimit;
- var monEnabled;
- var monUpdateInterval;
- var monIgnoredGap;
- var monBrokenTimeout;
- var monBrokenPrepTimeout;
- var monFaultyPrepTimeout;
- var logTTL;
-
+ if (defLevel != -1)
+ config.LogConfig.DefaultLevel = defLevel;
+ if (defSampling != -1)
+ config.LogConfig.DefaultSamplingLevel = defSampling;
+ if (defRate)
+ config.LogConfig.DefaultSamplingRate = +defRate;
+
+ $(this._form).find("tr.log-item-settings").each(function() {
+ var name = $(this).find(".log-item-name").text();
+ var level = +$(this).find(".log-item-level").val();
+ var sampling = +$(this).find(".log-item-sampling").val();
+ var rate = $(this).find(".log-item-rate").val();
+
+ if (level != -1 || sampling != -1 || rate) {
+ var entry = {};
+ entry.Component = name;
+ if (level != -1)
+ entry.Level = level;
+ if (sampling != -1)
+ entry.SamplingLevel = sampling;
+ if (rate)
+ entry.SamplingRate = +rate;
+
+ if (!config.LogConfig.Entry)
+ config.LogConfig.Entry = [];
+
+ config.LogConfig.Entry.push(entry);
+ }
+ });
+
+ data.Config = config;
+
+ return data;
+ }
+}
+
+class CmsConfigEditForm extends CommonEditForm {
+ constructor(kind, item) {
+ super(kind, item);
+ var form = $(this._form);
+
+ var infoCollectionTimeout;
+ var defRetryTime;
+ var defPermissionDuration;
+ var clusterNodesLimit;
+ var clusterNodesRatioLimit;
+ var tenantNodesLimit;
+ var tenantNodesRatioLimit;
+ var monEnabled;
+ var monUpdateInterval;
+ var monIgnoredGap;
+ var monBrokenTimeout;
+ var monBrokenPrepTimeout;
+ var monFaultyPrepTimeout;
+ var logTTL;
+
// sentinel
var sentinelEnabled;
var sentinelDryRun;
@@ -1093,26 +1093,26 @@ class CmsConfigEditForm extends CommonEditForm {
var sentinelStateLimits = new Map();
var sentinelDefaultStateLimits = new Map();
- if (item && item.getConfig() && item.getConfig().CmsConfig) {
- var cfg = item.getConfig().CmsConfig;
-
- if (cfg.InfoCollectionTimeout)
- infoCollectionTimeout = cfg.InfoCollectionTimeout / 1000000;
- if (cfg.DefaultRetryTime)
- defRetryTime = cfg.DefaultRetryTime / 1000000;
- if (cfg.DefaultPermissionDuration)
- defPermissionDuration = cfg.DefaultPermissionDuration / 1000000;
- if (cfg.ClusterLimits) {
- clusterNodesLimit = cfg.ClusterLimits.DisabledNodesLimit;
- clusterNodesRatioLimit = cfg.ClusterLimits.DisabledNodesRatioLimit;
- }
- if (cfg.TenantLimits) {
- tenantNodesLimit = cfg.TenantLimits.DisabledNodesLimit;
- tenantNodesRatioLimit = cfg.TenantLimits.DisabledNodesRatioLimit;
- }
-
- if (cfg.LogConfig && cfg.LogConfig.TTL)
- logTTL = cfg.LogConfig.TTL / 1000000 / 3600 / 24;
+ if (item && item.getConfig() && item.getConfig().CmsConfig) {
+ var cfg = item.getConfig().CmsConfig;
+
+ if (cfg.InfoCollectionTimeout)
+ infoCollectionTimeout = cfg.InfoCollectionTimeout / 1000000;
+ if (cfg.DefaultRetryTime)
+ defRetryTime = cfg.DefaultRetryTime / 1000000;
+ if (cfg.DefaultPermissionDuration)
+ defPermissionDuration = cfg.DefaultPermissionDuration / 1000000;
+ if (cfg.ClusterLimits) {
+ clusterNodesLimit = cfg.ClusterLimits.DisabledNodesLimit;
+ clusterNodesRatioLimit = cfg.ClusterLimits.DisabledNodesRatioLimit;
+ }
+ if (cfg.TenantLimits) {
+ tenantNodesLimit = cfg.TenantLimits.DisabledNodesLimit;
+ tenantNodesRatioLimit = cfg.TenantLimits.DisabledNodesRatioLimit;
+ }
+
+ if (cfg.LogConfig && cfg.LogConfig.TTL)
+ logTTL = cfg.LogConfig.TTL / 1000000 / 3600 / 24;
// sentinel
if (cfg.SentinelConfig) {
@@ -1149,59 +1149,59 @@ class CmsConfigEditForm extends CommonEditForm {
} else if (e > 250) {
sentinelDefaultStateLimits.set(e, 60);
}
- }
-
- var configFormHTML = `
- <div style="padding-left: 10px;">
- <div class="form-group">
- <div class="row">
- <label class="col-form-label form-control-sm col-sm-auto">Permission parameters</label>
- </div>
- <div class="row">
- ${this._makeNumericInput("Info collection timeout (sec.)", "info-collection-timeout",
- "Default is 15 sec.", infoCollectionTimeout,
- "Maximum allowed time for cluster state collection")}
- <div class="w-100 vs-4px"></div>
- ${this._makeNumericInput("Default retry interval (sec.)", "def-retry-time",
- "Default is 300 sec.", defRetryTime,
- "If requested permission temporarily cannot be given and appropriate retry interval is unknown then default retry interval is used.")}
- <div class="w-100 vs-4px"></div>
- ${this._makeNumericInput("Default permission duration (sec.)", "def-permission-duration",
- "Default is 300 sec.", defPermissionDuration,
- "This duration is used for permission request with no duration specified")}
- </div>
- </div>
- <div class="form-group">
- <div class="row">
- ${this._makeNumericInput("Cluster disabled node limit", "cluster-node-limit",
- "Unlimited by default", clusterNodesLimit,
- "Maximum number of nodes allowed to be down at the same time")}
- <div class="w-100 vs-4px"></div>
- ${this._makeNumericInput("Cluster disabled node ratio limit (%)", "cluster-node-ratio-limit",
- "Defalut is 10%", clusterNodesRatioLimit,
- "Maximum number of nodes allowed to be down at the same time specified in % of total cluster nodes count")}
- </div>
- </div>
- <div class="form-group">
- <div class="row">
- ${this._makeNumericInput("Tenant disabled node limit", "tenant-node-limit",
- "Unlimited by default", tenantNodesLimit,
- "Maximum number of nodes allowed to be down at the same time for each tenant.")}
- <div class="w-100 vs-4px"></div>
- ${this._makeNumericInput("Tenant disabled node ratio limit (%)", "tenant-node-ratio-limit",
- "Defalut is 10%", tenantNodesRatioLimit,
- "Maximum number of tenant nodes allowed to be down at the same time specified in % of total tenant nodes count")}
- </div>
- </div>
- <div class="form-group">
- <div class="row">
+ }
+
+ var configFormHTML = `
+ <div style="padding-left: 10px;">
+ <div class="form-group">
+ <div class="row">
+ <label class="col-form-label form-control-sm col-sm-auto">Permission parameters</label>
+ </div>
+ <div class="row">
+ ${this._makeNumericInput("Info collection timeout (sec.)", "info-collection-timeout",
+ "Default is 15 sec.", infoCollectionTimeout,
+ "Maximum allowed time for cluster state collection")}
+ <div class="w-100 vs-4px"></div>
+ ${this._makeNumericInput("Default retry interval (sec.)", "def-retry-time",
+ "Default is 300 sec.", defRetryTime,
+ "If requested permission temporarily cannot be given and appropriate retry interval is unknown then default retry interval is used.")}
+ <div class="w-100 vs-4px"></div>
+ ${this._makeNumericInput("Default permission duration (sec.)", "def-permission-duration",
+ "Default is 300 sec.", defPermissionDuration,
+ "This duration is used for permission request with no duration specified")}
+ </div>
+ </div>
+ <div class="form-group">
+ <div class="row">
+ ${this._makeNumericInput("Cluster disabled node limit", "cluster-node-limit",
+ "Unlimited by default", clusterNodesLimit,
+ "Maximum number of nodes allowed to be down at the same time")}
+ <div class="w-100 vs-4px"></div>
+ ${this._makeNumericInput("Cluster disabled node ratio limit (%)", "cluster-node-ratio-limit",
+ "Defalut is 10%", clusterNodesRatioLimit,
+ "Maximum number of nodes allowed to be down at the same time specified in % of total cluster nodes count")}
+ </div>
+ </div>
+ <div class="form-group">
+ <div class="row">
+ ${this._makeNumericInput("Tenant disabled node limit", "tenant-node-limit",
+ "Unlimited by default", tenantNodesLimit,
+ "Maximum number of nodes allowed to be down at the same time for each tenant.")}
+ <div class="w-100 vs-4px"></div>
+ ${this._makeNumericInput("Tenant disabled node ratio limit (%)", "tenant-node-ratio-limit",
+ "Defalut is 10%", tenantNodesRatioLimit,
+ "Maximum number of tenant nodes allowed to be down at the same time specified in % of total tenant nodes count")}
+ </div>
+ </div>
+ <div class="form-group">
+ <div class="row">
<label class="col-form-label form-control-sm col-sm-auto">Sentinel (self heal) parameters</label>
- </div>
- <div class="row">
- <div class="col-3">
+ </div>
+ <div class="row">
+ <div class="col-3">
<label class="col-form-label form-control-sm">Status</label>
- </div>
- <div class="col-auto">
+ </div>
+ <div class="col-auto">
<select class="form-control-sm sentinel-enabled">
<option value="0" ${sentinelEnabled ? "" : "selected"}>Disabled</option>
<option value="1" ${sentinelEnabled ? "selected" : ""}>Enabled</option>
@@ -1273,79 +1273,79 @@ class CmsConfigEditForm extends CommonEditForm {
"Default is 14 days", logTTL)}
</div>
</div>
- </div>
- `;
-
- $(configFormHTML).insertBefore(form.children("div.row:last-child"));
- form.find('[data-toggle="tooltip"]').tooltip();
- }
-
- _makeLogLevelSelects() {
- var item = this._item;
- var defLogLevel = 0;
- var componentLevels = new Map();
-
- if (item && item.getConfig() && item.getConfig().CmsConfig && item.getConfig().CmsConfig.LogConfig) {
- var cfg = item.getConfig().CmsConfig.LogConfig;
-
- if (cfg.DefaultLevel)
- defLogLevel = cmsEnums.parse('CmsLogConfigLevel', cfg.DefaultLevel);
- if (cfg.ComponentLevels) {
- for (var c of cfg.ComponentLevels) {
- if (c.RecordType === undefined)
- continue;
- var level = c.Level === undefined ? 0 : cmsEnums.parse('CmsLogConfigLevel', c.Level);
- componentLevels.set(c.RecordType, level);
- }
- }
- }
-
- var result = `
- <div class="col-3">
- <label class="col-form-label form-control-sm">Default log level</label>
- </div>
- <div class="col-auto">
- ${this._makeLogLevelSelect(-1, false, defLogLevel)}
- </div>
- `;
-
- for (var e of cmsEnums['CmsLogRecordType'].keys()) {
- if (e === 0)
- continue;
-
- var name = cmsEnums.get('CmsLogRecordType', e);
- result += `
- <div class="w-100 vs-4px"></div>
- <div class="col-3">
- <label class="col-form-label form-control-sm">${name} log level</label>
- </div>
- <div class="col-auto">
- ${this._makeLogLevelSelect(e, true, componentLevels.get(e))}
- </div>
- `;
- }
-
- return result;
- }
-
- _makeLogLevelSelect(type, allowDefault, val) {
- if (val === undefined) {
- console.assert(allowDefault);
- val = -1;
- }
-
- var res = `<select class="form-control-sm log-level" data-recordtype="${type}">`;
- if (allowDefault)
- res += `<option value="-1" ${val == -1 ? "selected" : ""}>Default</option>`;
- for (var e of cmsEnums['CmsLogConfigLevel'].keys()) {
- var name = cmsEnums.get('CmsLogConfigLevel', e);
- res += `<option value="${e}" ${val == e ? "selected" : ""}>${name}</option>`;
- }
- res += '</select>';
-
- return res;
- }
-
+ </div>
+ `;
+
+ $(configFormHTML).insertBefore(form.children("div.row:last-child"));
+ form.find('[data-toggle="tooltip"]').tooltip();
+ }
+
+ _makeLogLevelSelects() {
+ var item = this._item;
+ var defLogLevel = 0;
+ var componentLevels = new Map();
+
+ if (item && item.getConfig() && item.getConfig().CmsConfig && item.getConfig().CmsConfig.LogConfig) {
+ var cfg = item.getConfig().CmsConfig.LogConfig;
+
+ if (cfg.DefaultLevel)
+ defLogLevel = cmsEnums.parse('CmsLogConfigLevel', cfg.DefaultLevel);
+ if (cfg.ComponentLevels) {
+ for (var c of cfg.ComponentLevels) {
+ if (c.RecordType === undefined)
+ continue;
+ var level = c.Level === undefined ? 0 : cmsEnums.parse('CmsLogConfigLevel', c.Level);
+ componentLevels.set(c.RecordType, level);
+ }
+ }
+ }
+
+ var result = `
+ <div class="col-3">
+ <label class="col-form-label form-control-sm">Default log level</label>
+ </div>
+ <div class="col-auto">
+ ${this._makeLogLevelSelect(-1, false, defLogLevel)}
+ </div>
+ `;
+
+ for (var e of cmsEnums['CmsLogRecordType'].keys()) {
+ if (e === 0)
+ continue;
+
+ var name = cmsEnums.get('CmsLogRecordType', e);
+ result += `
+ <div class="w-100 vs-4px"></div>
+ <div class="col-3">
+ <label class="col-form-label form-control-sm">${name} log level</label>
+ </div>
+ <div class="col-auto">
+ ${this._makeLogLevelSelect(e, true, componentLevels.get(e))}
+ </div>
+ `;
+ }
+
+ return result;
+ }
+
+ _makeLogLevelSelect(type, allowDefault, val) {
+ if (val === undefined) {
+ console.assert(allowDefault);
+ val = -1;
+ }
+
+ var res = `<select class="form-control-sm log-level" data-recordtype="${type}">`;
+ if (allowDefault)
+ res += `<option value="-1" ${val == -1 ? "selected" : ""}>Default</option>`;
+ for (var e of cmsEnums['CmsLogConfigLevel'].keys()) {
+ var name = cmsEnums.get('CmsLogConfigLevel', e);
+ res += `<option value="${e}" ${val == e ? "selected" : ""}>${name}</option>`;
+ }
+ res += '</select>';
+
+ return res;
+ }
+
_makeSentinelStateLimits(stateLimits, defaultStateLimits) {
var res = '';
@@ -1372,38 +1372,38 @@ class CmsConfigEditForm extends CommonEditForm {
return res;
}
- _prepareData() {
- var data = super._prepareData();
- var cfg = {};
-
- this._setTimeSecValue(cfg, 'info-collection-timeout', 'InfoCollectionTimeout');
- this._setTimeSecValue(cfg, 'def-retry-time', 'DefaultRetryTime');
- this._setTimeSecValue(cfg, 'def-permission-duration', 'DefaultPermissionDuration');
- this._setNumValue(cfg, 'cluster-node-limit', ['ClusterLimits', 'DisabledNodesLimit']);
- this._setNumValue(cfg, 'cluster-node-ratio-limit', ['ClusterLimits', 'DisabledNodesRatioLimit']);
- this._setNumValue(cfg, 'tenant-node-limit', ['TenantLimits', 'DisabledNodesLimit']);
- this._setNumValue(cfg, 'tenant-node-ratio-limit', ['TenantLimits', 'DisabledNodesRatioLimit']);
-
- cfg.LogConfig = {};
- this._setTimeDayValue(cfg, 'log-ttl', ['LogConfig', 'TTL']);
- $(this._form).find('select.log-level').each(function() {
- var recType = +this.dataset.recordtype;
- var val = +$(this).children(":selected").val();
-
- if (recType === -1) {
- console.assert(val !== -1);
- cfg.LogConfig.DefaultLevel = cmsEnums.get('CmsLogConfigLevel', val);
- } else if (val !== -1) {
- if (cfg.LogConfig.ComponentLevels === undefined)
- cfg.LogConfig.ComponentLevels = [];
- var comp = {
- RecordType: recType,
- Level: cmsEnums.get('CmsLogConfigLevel', val),
- };
- cfg.LogConfig.ComponentLevels.push(comp);
- }
- });
-
+ _prepareData() {
+ var data = super._prepareData();
+ var cfg = {};
+
+ this._setTimeSecValue(cfg, 'info-collection-timeout', 'InfoCollectionTimeout');
+ this._setTimeSecValue(cfg, 'def-retry-time', 'DefaultRetryTime');
+ this._setTimeSecValue(cfg, 'def-permission-duration', 'DefaultPermissionDuration');
+ this._setNumValue(cfg, 'cluster-node-limit', ['ClusterLimits', 'DisabledNodesLimit']);
+ this._setNumValue(cfg, 'cluster-node-ratio-limit', ['ClusterLimits', 'DisabledNodesRatioLimit']);
+ this._setNumValue(cfg, 'tenant-node-limit', ['TenantLimits', 'DisabledNodesLimit']);
+ this._setNumValue(cfg, 'tenant-node-ratio-limit', ['TenantLimits', 'DisabledNodesRatioLimit']);
+
+ cfg.LogConfig = {};
+ this._setTimeDayValue(cfg, 'log-ttl', ['LogConfig', 'TTL']);
+ $(this._form).find('select.log-level').each(function() {
+ var recType = +this.dataset.recordtype;
+ var val = +$(this).children(":selected").val();
+
+ if (recType === -1) {
+ console.assert(val !== -1);
+ cfg.LogConfig.DefaultLevel = cmsEnums.get('CmsLogConfigLevel', val);
+ } else if (val !== -1) {
+ if (cfg.LogConfig.ComponentLevels === undefined)
+ cfg.LogConfig.ComponentLevels = [];
+ var comp = {
+ RecordType: recType,
+ Level: cmsEnums.get('CmsLogConfigLevel', val),
+ };
+ cfg.LogConfig.ComponentLevels.push(comp);
+ }
+ });
+
// sentinel
this._setBoolSelectValue(cfg, 'sentinel-enabled', ['SentinelConfig', 'Enable']);
this._setBoolSelectValue(cfg, 'sentinel-dry-run', ['SentinelConfig', 'DryRun']);
@@ -1426,97 +1426,97 @@ class CmsConfigEditForm extends CommonEditForm {
}
});
- data.Config = { CmsConfig: cfg };
-
- return data;
- }
-}
-
-class NodeBrokerConfigEditForm extends CommonEditForm {
- constructor(kind, item) {
- super(kind, item);
- var form = $(this._form);
-
- var epochDuration;
- var bannedIds;
-
- if (item && item.getConfig() && item.getConfig().NodeBrokerConfig) {
- var cfg = item.getConfig().NodeBrokerConfig;
-
- if (cfg.EpochDuration)
- epochDuration = cfg.EpochDuration / 1000000 / 60;
- if (cfg.BannedNodeIds) {
- bannedIds = '';
- for (var ids of cfg.BannedNodeIds) {
- if (bannedIds !== '')
- bannedIds += ',';
- bannedIds += ids.From;
- if (ids.To != ids.From)
- bannedIds += '-' + ids.To;
- }
- }
- }
-
- var configFormHTML = `
- <div style="padding-left: 10px;">
- <div class="form-group">
- <div class="row">
- ${this._makeNumericInput("Epoch duration (min.)", "epoch-duration",
- "Default is 60 min.", epochDuration)}
- <div class="w-100 vs-4px"></div>
- ${this._makeTextInput("Banned node IDs", "banned-ids",
- "E.g. 1000-2999,4000,5000,6000-6500", bannedIds)}
- </div>
- </div>
- </div>
- `;
-
- $(configFormHTML).insertBefore(form.children("div.row:last-child"));
- form.find('[data-toggle="tooltip"]').tooltip();
- }
-
- _prepareData() {
- var data = super._prepareData();
- var cfg = {};
-
- this._setTimeMinValue(cfg, 'epoch-duration', 'EpochDuration');
- this._parseNodeIds(cfg);
-
- data.Config = { NodeBrokerConfig: cfg };
-
- return data;
- }
-
- _parseNodeIds(cfg) {
- var val = $(this._form).find('.banned-ids').val().trim();
- if (val === '')
- return;
-
- cfg.BannedNodeIds = [];
- var ranges = val.split(',');
- for (var range of ranges) {
- if (range.search('-') != -1) {
- var vals = range.split('-');
- if (vals.length != 2)
- throw 'incorrect banned IDs range: ' + range;
-
- var from = this._parseInt(vals[0]);
- var to = this._parseInt(vals[1]);
- if (from === undefined || to === undefined)
- throw 'incorrect banned IDs range: ' + range;
-
- cfg.BannedNodeIds.push({From: from, To: to});
- } else {
- var val = this._parseInt(range);
- if (val === undefined)
- throw 'incorrect banned IDs range: ' + range;
-
- cfg.BannedNodeIds.push({From: val, To: val});
- }
- }
- }
-}
-
+ data.Config = { CmsConfig: cfg };
+
+ return data;
+ }
+}
+
+class NodeBrokerConfigEditForm extends CommonEditForm {
+ constructor(kind, item) {
+ super(kind, item);
+ var form = $(this._form);
+
+ var epochDuration;
+ var bannedIds;
+
+ if (item && item.getConfig() && item.getConfig().NodeBrokerConfig) {
+ var cfg = item.getConfig().NodeBrokerConfig;
+
+ if (cfg.EpochDuration)
+ epochDuration = cfg.EpochDuration / 1000000 / 60;
+ if (cfg.BannedNodeIds) {
+ bannedIds = '';
+ for (var ids of cfg.BannedNodeIds) {
+ if (bannedIds !== '')
+ bannedIds += ',';
+ bannedIds += ids.From;
+ if (ids.To != ids.From)
+ bannedIds += '-' + ids.To;
+ }
+ }
+ }
+
+ var configFormHTML = `
+ <div style="padding-left: 10px;">
+ <div class="form-group">
+ <div class="row">
+ ${this._makeNumericInput("Epoch duration (min.)", "epoch-duration",
+ "Default is 60 min.", epochDuration)}
+ <div class="w-100 vs-4px"></div>
+ ${this._makeTextInput("Banned node IDs", "banned-ids",
+ "E.g. 1000-2999,4000,5000,6000-6500", bannedIds)}
+ </div>
+ </div>
+ </div>
+ `;
+
+ $(configFormHTML).insertBefore(form.children("div.row:last-child"));
+ form.find('[data-toggle="tooltip"]').tooltip();
+ }
+
+ _prepareData() {
+ var data = super._prepareData();
+ var cfg = {};
+
+ this._setTimeMinValue(cfg, 'epoch-duration', 'EpochDuration');
+ this._parseNodeIds(cfg);
+
+ data.Config = { NodeBrokerConfig: cfg };
+
+ return data;
+ }
+
+ _parseNodeIds(cfg) {
+ var val = $(this._form).find('.banned-ids').val().trim();
+ if (val === '')
+ return;
+
+ cfg.BannedNodeIds = [];
+ var ranges = val.split(',');
+ for (var range of ranges) {
+ if (range.search('-') != -1) {
+ var vals = range.split('-');
+ if (vals.length != 2)
+ throw 'incorrect banned IDs range: ' + range;
+
+ var from = this._parseInt(vals[0]);
+ var to = this._parseInt(vals[1]);
+ if (from === undefined || to === undefined)
+ throw 'incorrect banned IDs range: ' + range;
+
+ cfg.BannedNodeIds.push({From: from, To: to});
+ } else {
+ var val = this._parseInt(range);
+ if (val === undefined)
+ throw 'incorrect banned IDs range: ' + range;
+
+ cfg.BannedNodeIds.push({From: val, To: val});
+ }
+ }
+ }
+}
+
class SharedCacheConfigEditForm extends CommonEditForm {
constructor(kind, item) {
super(kind, item);
@@ -1584,123 +1584,123 @@ class SharedCacheConfigEditForm extends CommonEditForm {
return data;
}
-}
-
-class ImmediateControlsConfigEditForm extends CommonEditForm {
- constructor(kind, item) {
- super(kind, item);
- var form = $(this._form);
- var cfg;
-
- if (item && item.getConfig() && item.getConfig().ImmediateControlsConfig)
- cfg = item.getConfig().ImmediateControlsConfig;
-
- var configFormHTML = `
- <div style="padding-left: 10px;">
- <div class="form-group">
- ${this._makeControlInputs(cfg)}
- </div>
- </div>
- `;
-
- $(configFormHTML).insertBefore(form.children("div.row:last-child"));
- form.find('[data-toggle="tooltip"]').tooltip({html: true});
- }
-
- _makeControlInputs(item) {
- var desc = cmsProtoTypes.get('.NKikimrConfig.TImmediateControlsConfig');
- return this._makeControlInputsForMessage(item, desc, undefined);
- }
-
- _makeControlInputsForMessage(cfg, desc, cl) {
- var res = '';
- for (var field of desc.field) {
- var fieldCl = cl ? (cl + '-' + field.name) : field.name;
- var value = cfg === undefined ? undefined : cfg[field.name];
- if (field.type_name !== undefined) {
- res += `<div class="row vs-4px">
- <label class="col-form-label form-control-sm">${field.name}:</label>
- </div>`;
-
- res += '<div style="padding-left: 10px;">'
- + this._makeControlInputsForMessage(value,
- cmsProtoTypes.get(field.type_name),
- fieldCl)
- + '</div>';
- } else {
- var opts = field.options.ControlOptions;
- var help = `${opts.Description}<br/>
- Allowed range: [${opts.MinValue}-${opts.MaxValue}]<br/>
- Default value: ${opts.DefaultValue}<br/>`;
- res += '<div class="row">'
- + this._makeNumericInput(field.name, fieldCl,
- "Default is " + opts.DefaultValue,
- value, help)
- + '<div class="w-100 vs-4px"></div>'
- + '</div>';
- }
- }
- return res;
- }
-
- _prepareData() {
- var data = super._prepareData();
-
- var cfg = {};
- this._parseControlInputs(cfg);
-
- data.Config = { ImmediateControlsConfig: cfg };
-
- return data;
- }
-
- _parseControlInputs(cfg) {
- var desc = cmsProtoTypes.get('.NKikimrConfig.TImmediateControlsConfig');
- this._parseControlInputsForMessage(cfg, desc, undefined);
- }
-
- _parseControlInputsForMessage(cfg, desc, cl) {
- var res = '';
- for (var field of desc.field) {
- var fieldCl = cl ? (cl + '-' + field.name) : field.name;
- if (field.type_name !== undefined) {
- cfg[field.name] = {};
- this._parseControlInputsForMessage(cfg[field.name],
- cmsProtoTypes.get(field.type_name),
- fieldCl);
- } else {
- var value = this._parseInt($(this._form).find("." + fieldCl).val());
- if (value !== undefined)
- cfg[field.name] = value;
- }
- }
- }
}
-function getConfigEditFormCreator(kindName) {
- if (kindName === 'LogConfigItem') {
- return function (kind, item) {
- return new LogConfigEditForm(kind, item);
- }
- } else if (kindName === 'CmsConfigItem') {
- return function (kind, item) {
- return new CmsConfigEditForm(kind, item);
- }
- } else if (kindName === 'NodeBrokerConfigItem') {
- return function (kind, item) {
- return new NodeBrokerConfigEditForm(kind, item);
- }
+class ImmediateControlsConfigEditForm extends CommonEditForm {
+ constructor(kind, item) {
+ super(kind, item);
+ var form = $(this._form);
+ var cfg;
+
+ if (item && item.getConfig() && item.getConfig().ImmediateControlsConfig)
+ cfg = item.getConfig().ImmediateControlsConfig;
+
+ var configFormHTML = `
+ <div style="padding-left: 10px;">
+ <div class="form-group">
+ ${this._makeControlInputs(cfg)}
+ </div>
+ </div>
+ `;
+
+ $(configFormHTML).insertBefore(form.children("div.row:last-child"));
+ form.find('[data-toggle="tooltip"]').tooltip({html: true});
+ }
+
+ _makeControlInputs(item) {
+ var desc = cmsProtoTypes.get('.NKikimrConfig.TImmediateControlsConfig');
+ return this._makeControlInputsForMessage(item, desc, undefined);
+ }
+
+ _makeControlInputsForMessage(cfg, desc, cl) {
+ var res = '';
+ for (var field of desc.field) {
+ var fieldCl = cl ? (cl + '-' + field.name) : field.name;
+ var value = cfg === undefined ? undefined : cfg[field.name];
+ if (field.type_name !== undefined) {
+ res += `<div class="row vs-4px">
+ <label class="col-form-label form-control-sm">${field.name}:</label>
+ </div>`;
+
+ res += '<div style="padding-left: 10px;">'
+ + this._makeControlInputsForMessage(value,
+ cmsProtoTypes.get(field.type_name),
+ fieldCl)
+ + '</div>';
+ } else {
+ var opts = field.options.ControlOptions;
+ var help = `${opts.Description}<br/>
+ Allowed range: [${opts.MinValue}-${opts.MaxValue}]<br/>
+ Default value: ${opts.DefaultValue}<br/>`;
+ res += '<div class="row">'
+ + this._makeNumericInput(field.name, fieldCl,
+ "Default is " + opts.DefaultValue,
+ value, help)
+ + '<div class="w-100 vs-4px"></div>'
+ + '</div>';
+ }
+ }
+ return res;
+ }
+
+ _prepareData() {
+ var data = super._prepareData();
+
+ var cfg = {};
+ this._parseControlInputs(cfg);
+
+ data.Config = { ImmediateControlsConfig: cfg };
+
+ return data;
+ }
+
+ _parseControlInputs(cfg) {
+ var desc = cmsProtoTypes.get('.NKikimrConfig.TImmediateControlsConfig');
+ this._parseControlInputsForMessage(cfg, desc, undefined);
+ }
+
+ _parseControlInputsForMessage(cfg, desc, cl) {
+ var res = '';
+ for (var field of desc.field) {
+ var fieldCl = cl ? (cl + '-' + field.name) : field.name;
+ if (field.type_name !== undefined) {
+ cfg[field.name] = {};
+ this._parseControlInputsForMessage(cfg[field.name],
+ cmsProtoTypes.get(field.type_name),
+ fieldCl);
+ } else {
+ var value = this._parseInt($(this._form).find("." + fieldCl).val());
+ if (value !== undefined)
+ cfg[field.name] = value;
+ }
+ }
+ }
+}
+
+function getConfigEditFormCreator(kindName) {
+ if (kindName === 'LogConfigItem') {
+ return function (kind, item) {
+ return new LogConfigEditForm(kind, item);
+ }
+ } else if (kindName === 'CmsConfigItem') {
+ return function (kind, item) {
+ return new CmsConfigEditForm(kind, item);
+ }
+ } else if (kindName === 'NodeBrokerConfigItem') {
+ return function (kind, item) {
+ return new NodeBrokerConfigEditForm(kind, item);
+ }
} else if (kindName == 'SharedCacheConfigItem') {
return function (kind, item) {
return new SharedCacheConfigEditForm(kind, item);
}
- } else if (kindName == 'ImmediateControlsConfigItem') {
- return function (kind, item) {
- return new ImmediateControlsConfigEditForm(kind, item);
- }
- }
-
- return function (item) {
- return undefined;
- }
-}
+ } else if (kindName == 'ImmediateControlsConfigItem') {
+ return function (kind, item) {
+ return new ImmediateControlsConfigEditForm(kind, item);
+ }
+ }
+
+ return function (item) {
+ return undefined;
+ }
+}
diff --git a/ydb/core/cms/ui/configs.js b/ydb/core/cms/ui/configs.js
index 3fe5a57f91c..f3b807e451b 100644
--- a/ydb/core/cms/ui/configs.js
+++ b/ydb/core/cms/ui/configs.js
@@ -1,333 +1,333 @@
-'use strict';
-
-var ConfigsState = {
- updateIds: [],
- configItems: new Map(),
- itemKinds: new Map(),
- editableItemKinds: new Set(['LogConfigItem', 'CmsConfigItem',
- 'NodeBrokerConfigItem', 'SharedCacheConfigItem',
- 'ImmediateControlsConfigItem']),
- checkInterval: 5000,
- retryInterval: 5000,
-}
-
-class ItemKind {
- constructor(kindNo) {
- this.no = kindNo;
- this.name = cmsEnums.ItemKinds.get(kindNo);
- if (!this.name)
- this.name = 'UNKNOWN CONFIG ITEM';
-
- this.createConfigView = getConfigViewCreator(this.name);
- this.createConfigEditForm = getConfigEditFormCreator(this.name);
-
- this._createUIElements();
-
- console.assert(!ConfigsState.itemKinds.has(this.no));
- ConfigsState.itemKinds.set(this.no, this);
-
- if (ShownElements.has(this.itemsDiv.id))
- $(this.itemsDiv).collapse('show');
- }
-
- appendView(element) {
- this.itemsDiv.appendChild(element);
- $(this.blockDiv).show();
- }
-
- createNewItem() {
- this._createItemForm();
- }
-
- editItem(item) {
- this._createItemForm(item);
- }
-
- onViewRemoved() {
- if (this.itemsDiv.childNodes.length == 0)
- $(this.blockDiv).hide();
- }
-
- _createUIElements() {
- this.itemsDiv = document.createElement('div');
- this.itemsDiv.id = 'config-items-' + this.no;
- this.itemsDiv.setAttribute('class', 'collapse');
- this.itemsDiv.setAttribute('aria-expanded', false);
-
- this.editable = ConfigsState.editableItemKinds.has(this.name);
- if (this.editable) {
- let _this = this;
- this.addBtn = document.createElement('button');
- this.addBtn.setAttribute('class', 'btn btn-outline-secondary btn-block');
- this.addBtn.setAttribute('style', 'margin-top: 5px;');
- this.addBtn.textContent = 'Create new item';
- this.addBtn.addEventListener('click', function() { _this.createNewItem(); });
- this.itemsDiv.appendChild(this.addBtn);
- }
-
- this.toggleBtn = document.createElement('button');
- this.toggleBtn.setAttribute('class', 'btn btn-light btn-block');
- this.toggleBtn.setAttribute('aria-expanded', false);
- this.toggleBtn.dataset.toggle = "collapse";
- this.toggleBtn.dataset.target = "#" + this.itemsDiv.id;
- this.toggleBtn.textContent = this.name + 's';
-
- this.blockDiv = document.createElement('div');
- this.blockDiv.appendChild(this.toggleBtn);
- this.blockDiv.appendChild(this.itemsDiv);
-
- var minKind = Number.MAX_SAFE_INTEGER;
- var insertBefore = null;
- for (var [key, value] of ConfigsState.itemKinds) {
- if (key < minKind && key > this.no) {
- minKind = key;
- insertBefore = value.blockDiv;
- }
- }
-
- document.getElementById('config-items').insertBefore(this.blockDiv, insertBefore);
-
- $(this.itemsDiv).on('shown.bs.collapse', getOnShown(this.itemsDiv.id));
- $(this.itemsDiv).on('hidden.bs.collapse', getOnHidden(this.itemsDiv.id));
- }
-
- _createItemForm(item) {
- var form = this.createConfigEditForm(this, item);
-
- if (form) {
- var elem = form.getElement();
- if (item !== undefined) {
- this.itemsDiv.insertBefore(elem, item.view.getElement());
- item.hide();
- } else if (this.itemsDiv.childNodes.length > 1)
- this.itemsDiv.insertBefore(elem, this.itemsDiv.childNodes[1]);
- else
- this.itemsDiv.appendChild(elem);
- } else {
- $('#configs-error').html('cannot create ' + this.name + ' edit form');
- }
- }
-}
-
-function getOrCreateItemKind(kindNo) {
- var kind = ConfigsState.itemKinds.get(kindNo);
- if (!kind)
- kind = new ItemKind(kindNo);
- return kind;
-}
-
-class ConfigItem {
- constructor(data) {
- this._data = data;
-
- console.assert(!ConfigsState.configItems.has(this.getId()));
- ConfigsState.configItems.set(this.getId(), this);
-
- this.kind = getOrCreateItemKind(this.getKindNo());
- this.view = this.kind.createConfigView(this);
-
- this.update();
- }
-
- update(data) {
- if (data !== undefined) {
- console.assert(this.getId() == data.Id.Id);
- this._data = data;
-
- this.unmarkAsPendingUpdate();
- }
-
- this.view.update();
- }
-
- getConfig() {
- return this._data.Config;
- }
-
- getCookie() {
- return this._data.Cookie;
- }
-
- getGeneration() {
- return this._data.Id.Generation;
- }
-
- getId() {
- return this._data.Id.Id;
- }
-
- getIdObj() {
- return this._data.Id;
- }
-
- getKindNo() {
- return this._data.Kind;
- }
-
- getMergeStrategy() {
- return this._data.MergeStrategy;
- }
-
- getOrder() {
- return this._data.Order;
- }
-
- getUsageScope() {
- return this._data.UsageScope;
- }
-
- getIdString() {
- return this._data.Id.Id + "." + this._data.Id.Generation;
- }
-
- show() {
- this.view.show();
- }
-
- hide() {
- this.view.hide();
- }
-
- edit() {
- this.kind.editItem(this);
- }
-
- remove() {
- this.view.remove();
- ConfigsState.configItems.delete(this.getId());
- }
-
- markAsPendingUpdate() {
- this.view.markAsPendingUpdate();
- }
-
- unmarkAsPendingUpdate() {
- this.view.unmarkAsPendingUpdate();
- }
-}
-
-function onConfigItemsLoaded(data) {
- if (data['Status']['Code'] != 'SUCCESS') {
- onConfigItemsFailed(data);
- return;
- }
-
- $('#configs-error').html('');
-
- var items = data.ConfigItems;
- if (!items)
- items = [];
-
- for (var i = 0; i < items.length; ++i) {
- var item = ConfigsState.configItems.get(items[i].Id.Id);
-
- if (!item) {
- new ConfigItem(items[i]);
- } else {
- item.update(items[i]);
- }
- }
-
- setTimeout(checkConfigItemUpdates, ConfigsState.checkInterval);
-}
-
-function onConfigItemsFailed(data) {
- if (data && data['Status'] && data['Status']['Reason'])
- $('#configs-error').html(data['Status']['Reason']);
- else
- $('#configs-error').html("Cannot get config items");
- setTimeout(loadConfigItems, ConfigsState.retryInterval);
-}
-
-function onConfigUpdatesLoaded(data) {
- if (data['Status']['Code'] != 'SUCCESS') {
- onConfigUpdatesFailed(data);
- return;
- }
-
- $('#configs-error').html('');
-
- ConfigsState.updateIds = [];
-
- var added = data.AddedItems;
- if (!added)
- added = [];
- var removed = data.RemovedItems;
- if (!removed)
- removed = [];
- var updated = data.UpdatedItems;
- if (!updated)
- updated = [];
-
- for (var id of added)
- ConfigsState.updateIds.push(id.Id);
- for (var id of updated)
- ConfigsState.updateIds.push(id.Id);
-
- for (var id of removed) {
- var item = ConfigsState.configItems.get(id.Id);
- if (!item) {
- console.error('Cannot remove unknown config item ' + id.Id);
- continue;
- }
-
- item.remove();
- }
-
- if (ConfigsState.updateIds.length > 0)
- loadConfigItems();
- else
- setTimeout(checkConfigItemUpdates, ConfigsState.checkInterval);
-}
-
-function onConfigUpdatesFailed(data) {
- if (data && data['Status'] && data['Status']['Reason'])
- $('#configs-error').html(data['Status']['Reason']);
- else
- $('#configs-error').html("Cannot get config updates");
- setTimeout(checkConfigItemUpdates, ConfigsState.retryInterval);
-}
-
-function checkConfigItemUpdates() {
- var url = 'cms/api/json/configupdates';
- var items = Array.from(ConfigsState.configItems.values());
- for (var i = 0; i < items.length; ++i) {
- if (i == 0)
- url += '?base=';
- else
- url += ',';
- url += items[i].getIdString();
- }
- $.get(url).done(onConfigUpdatesLoaded).fail(onConfigUpdatesFailed);
-}
-
-function loadConfigItems() {
- var url = 'cms/api/json/configitems';
- if (ConfigsState.updateIds.length > 0)
- url += '?ids=' + ConfigsState.updateIds.toString();
- $.get(url).done(onConfigItemsLoaded).fail(onConfigItemsFailed);
-}
-
-function loadConfigsContent() {
- for (var kind of ConfigsState.editableItemKinds)
- getOrCreateItemKind(cmsEnums.parse('ItemKinds', kind));
-
- loadConfigItems();
-}
-
-function loadTypes() {
- cmsProtoTypes
- .add('.NKikimrConfig.TImmediateControlsConfig')
- .done(loadConfigsContent);
-}
-
-function initConfigsTab() {
- cmsEnums
- .add('ItemKinds', 'NKikimrConsole::TConfigItem::EKind')
- .add('MergeStrategy', 'NKikimrConsole::TConfigItem::EMergeStrategy')
- .add('ServiceKikimr', 'NKikimrServices::EServiceKikimr')
- .add('CmsLogConfigLevel', 'NKikimrCms::TCmsConfig::TLogConfig::ELevel')
- .add('CmsLogRecordType', 'NKikimrCms::TLogRecordData::EType')
+'use strict';
+
+var ConfigsState = {
+ updateIds: [],
+ configItems: new Map(),
+ itemKinds: new Map(),
+ editableItemKinds: new Set(['LogConfigItem', 'CmsConfigItem',
+ 'NodeBrokerConfigItem', 'SharedCacheConfigItem',
+ 'ImmediateControlsConfigItem']),
+ checkInterval: 5000,
+ retryInterval: 5000,
+}
+
+class ItemKind {
+ constructor(kindNo) {
+ this.no = kindNo;
+ this.name = cmsEnums.ItemKinds.get(kindNo);
+ if (!this.name)
+ this.name = 'UNKNOWN CONFIG ITEM';
+
+ this.createConfigView = getConfigViewCreator(this.name);
+ this.createConfigEditForm = getConfigEditFormCreator(this.name);
+
+ this._createUIElements();
+
+ console.assert(!ConfigsState.itemKinds.has(this.no));
+ ConfigsState.itemKinds.set(this.no, this);
+
+ if (ShownElements.has(this.itemsDiv.id))
+ $(this.itemsDiv).collapse('show');
+ }
+
+ appendView(element) {
+ this.itemsDiv.appendChild(element);
+ $(this.blockDiv).show();
+ }
+
+ createNewItem() {
+ this._createItemForm();
+ }
+
+ editItem(item) {
+ this._createItemForm(item);
+ }
+
+ onViewRemoved() {
+ if (this.itemsDiv.childNodes.length == 0)
+ $(this.blockDiv).hide();
+ }
+
+ _createUIElements() {
+ this.itemsDiv = document.createElement('div');
+ this.itemsDiv.id = 'config-items-' + this.no;
+ this.itemsDiv.setAttribute('class', 'collapse');
+ this.itemsDiv.setAttribute('aria-expanded', false);
+
+ this.editable = ConfigsState.editableItemKinds.has(this.name);
+ if (this.editable) {
+ let _this = this;
+ this.addBtn = document.createElement('button');
+ this.addBtn.setAttribute('class', 'btn btn-outline-secondary btn-block');
+ this.addBtn.setAttribute('style', 'margin-top: 5px;');
+ this.addBtn.textContent = 'Create new item';
+ this.addBtn.addEventListener('click', function() { _this.createNewItem(); });
+ this.itemsDiv.appendChild(this.addBtn);
+ }
+
+ this.toggleBtn = document.createElement('button');
+ this.toggleBtn.setAttribute('class', 'btn btn-light btn-block');
+ this.toggleBtn.setAttribute('aria-expanded', false);
+ this.toggleBtn.dataset.toggle = "collapse";
+ this.toggleBtn.dataset.target = "#" + this.itemsDiv.id;
+ this.toggleBtn.textContent = this.name + 's';
+
+ this.blockDiv = document.createElement('div');
+ this.blockDiv.appendChild(this.toggleBtn);
+ this.blockDiv.appendChild(this.itemsDiv);
+
+ var minKind = Number.MAX_SAFE_INTEGER;
+ var insertBefore = null;
+ for (var [key, value] of ConfigsState.itemKinds) {
+ if (key < minKind && key > this.no) {
+ minKind = key;
+ insertBefore = value.blockDiv;
+ }
+ }
+
+ document.getElementById('config-items').insertBefore(this.blockDiv, insertBefore);
+
+ $(this.itemsDiv).on('shown.bs.collapse', getOnShown(this.itemsDiv.id));
+ $(this.itemsDiv).on('hidden.bs.collapse', getOnHidden(this.itemsDiv.id));
+ }
+
+ _createItemForm(item) {
+ var form = this.createConfigEditForm(this, item);
+
+ if (form) {
+ var elem = form.getElement();
+ if (item !== undefined) {
+ this.itemsDiv.insertBefore(elem, item.view.getElement());
+ item.hide();
+ } else if (this.itemsDiv.childNodes.length > 1)
+ this.itemsDiv.insertBefore(elem, this.itemsDiv.childNodes[1]);
+ else
+ this.itemsDiv.appendChild(elem);
+ } else {
+ $('#configs-error').html('cannot create ' + this.name + ' edit form');
+ }
+ }
+}
+
+function getOrCreateItemKind(kindNo) {
+ var kind = ConfigsState.itemKinds.get(kindNo);
+ if (!kind)
+ kind = new ItemKind(kindNo);
+ return kind;
+}
+
+class ConfigItem {
+ constructor(data) {
+ this._data = data;
+
+ console.assert(!ConfigsState.configItems.has(this.getId()));
+ ConfigsState.configItems.set(this.getId(), this);
+
+ this.kind = getOrCreateItemKind(this.getKindNo());
+ this.view = this.kind.createConfigView(this);
+
+ this.update();
+ }
+
+ update(data) {
+ if (data !== undefined) {
+ console.assert(this.getId() == data.Id.Id);
+ this._data = data;
+
+ this.unmarkAsPendingUpdate();
+ }
+
+ this.view.update();
+ }
+
+ getConfig() {
+ return this._data.Config;
+ }
+
+ getCookie() {
+ return this._data.Cookie;
+ }
+
+ getGeneration() {
+ return this._data.Id.Generation;
+ }
+
+ getId() {
+ return this._data.Id.Id;
+ }
+
+ getIdObj() {
+ return this._data.Id;
+ }
+
+ getKindNo() {
+ return this._data.Kind;
+ }
+
+ getMergeStrategy() {
+ return this._data.MergeStrategy;
+ }
+
+ getOrder() {
+ return this._data.Order;
+ }
+
+ getUsageScope() {
+ return this._data.UsageScope;
+ }
+
+ getIdString() {
+ return this._data.Id.Id + "." + this._data.Id.Generation;
+ }
+
+ show() {
+ this.view.show();
+ }
+
+ hide() {
+ this.view.hide();
+ }
+
+ edit() {
+ this.kind.editItem(this);
+ }
+
+ remove() {
+ this.view.remove();
+ ConfigsState.configItems.delete(this.getId());
+ }
+
+ markAsPendingUpdate() {
+ this.view.markAsPendingUpdate();
+ }
+
+ unmarkAsPendingUpdate() {
+ this.view.unmarkAsPendingUpdate();
+ }
+}
+
+function onConfigItemsLoaded(data) {
+ if (data['Status']['Code'] != 'SUCCESS') {
+ onConfigItemsFailed(data);
+ return;
+ }
+
+ $('#configs-error').html('');
+
+ var items = data.ConfigItems;
+ if (!items)
+ items = [];
+
+ for (var i = 0; i < items.length; ++i) {
+ var item = ConfigsState.configItems.get(items[i].Id.Id);
+
+ if (!item) {
+ new ConfigItem(items[i]);
+ } else {
+ item.update(items[i]);
+ }
+ }
+
+ setTimeout(checkConfigItemUpdates, ConfigsState.checkInterval);
+}
+
+function onConfigItemsFailed(data) {
+ if (data && data['Status'] && data['Status']['Reason'])
+ $('#configs-error').html(data['Status']['Reason']);
+ else
+ $('#configs-error').html("Cannot get config items");
+ setTimeout(loadConfigItems, ConfigsState.retryInterval);
+}
+
+function onConfigUpdatesLoaded(data) {
+ if (data['Status']['Code'] != 'SUCCESS') {
+ onConfigUpdatesFailed(data);
+ return;
+ }
+
+ $('#configs-error').html('');
+
+ ConfigsState.updateIds = [];
+
+ var added = data.AddedItems;
+ if (!added)
+ added = [];
+ var removed = data.RemovedItems;
+ if (!removed)
+ removed = [];
+ var updated = data.UpdatedItems;
+ if (!updated)
+ updated = [];
+
+ for (var id of added)
+ ConfigsState.updateIds.push(id.Id);
+ for (var id of updated)
+ ConfigsState.updateIds.push(id.Id);
+
+ for (var id of removed) {
+ var item = ConfigsState.configItems.get(id.Id);
+ if (!item) {
+ console.error('Cannot remove unknown config item ' + id.Id);
+ continue;
+ }
+
+ item.remove();
+ }
+
+ if (ConfigsState.updateIds.length > 0)
+ loadConfigItems();
+ else
+ setTimeout(checkConfigItemUpdates, ConfigsState.checkInterval);
+}
+
+function onConfigUpdatesFailed(data) {
+ if (data && data['Status'] && data['Status']['Reason'])
+ $('#configs-error').html(data['Status']['Reason']);
+ else
+ $('#configs-error').html("Cannot get config updates");
+ setTimeout(checkConfigItemUpdates, ConfigsState.retryInterval);
+}
+
+function checkConfigItemUpdates() {
+ var url = 'cms/api/json/configupdates';
+ var items = Array.from(ConfigsState.configItems.values());
+ for (var i = 0; i < items.length; ++i) {
+ if (i == 0)
+ url += '?base=';
+ else
+ url += ',';
+ url += items[i].getIdString();
+ }
+ $.get(url).done(onConfigUpdatesLoaded).fail(onConfigUpdatesFailed);
+}
+
+function loadConfigItems() {
+ var url = 'cms/api/json/configitems';
+ if (ConfigsState.updateIds.length > 0)
+ url += '?ids=' + ConfigsState.updateIds.toString();
+ $.get(url).done(onConfigItemsLoaded).fail(onConfigItemsFailed);
+}
+
+function loadConfigsContent() {
+ for (var kind of ConfigsState.editableItemKinds)
+ getOrCreateItemKind(cmsEnums.parse('ItemKinds', kind));
+
+ loadConfigItems();
+}
+
+function loadTypes() {
+ cmsProtoTypes
+ .add('.NKikimrConfig.TImmediateControlsConfig')
+ .done(loadConfigsContent);
+}
+
+function initConfigsTab() {
+ cmsEnums
+ .add('ItemKinds', 'NKikimrConsole::TConfigItem::EKind')
+ .add('MergeStrategy', 'NKikimrConsole::TConfigItem::EMergeStrategy')
+ .add('ServiceKikimr', 'NKikimrServices::EServiceKikimr')
+ .add('CmsLogConfigLevel', 'NKikimrCms::TCmsConfig::TLogConfig::ELevel')
+ .add('CmsLogRecordType', 'NKikimrCms::TLogRecordData::EType')
.add('PDiskStates', 'NCms::EPDiskState')
- .done(loadTypes);
-}
+ .done(loadTypes);
+}
diff --git a/ydb/core/cms/ui/datashard.css b/ydb/core/cms/ui/datashard.css
index 78e615b012c..53358859430 100644
--- a/ydb/core/cms/ui/datashard.css
+++ b/ydb/core/cms/ui/datashard.css
@@ -1,47 +1,47 @@
-table.ds-info {
- border-bottom-style: solid;
- border-top-style: solid;
- border-width: 1px;
- border-color: darkgrey;
-}
-
-tfoot.ds-info {
- border-top-style: solid;
- border-width: 1px;
- border-color: darkgrey;
- padding: 5px 0px 5px 0px;
-}
-
-caption.ds-info {
- font-weight: 700;
- caption-side: top;
- padding: 20px 0px 0px 10px;
- color: black;
-}
-
-caption.ds-info-table-stats {
- font-weight: 700;
- caption-side: top;
- padding: 0px 0px 0px 10px;
- color: gray;
-}
-
-td.ds-info {
- padding-left: 10px;
- padding-right: 10px;
-}
-
-.ds-plan-executed {
- color: green;
- font-weight: 500;
-}
-
-.ds-plan-executing {
- color: red;
- font-weight: 500;
-}
-
-.ds-plan-to-execute {
- color: gray;
- font-weight: 500;
-}
+table.ds-info {
+ border-bottom-style: solid;
+ border-top-style: solid;
+ border-width: 1px;
+ border-color: darkgrey;
+}
+
+tfoot.ds-info {
+ border-top-style: solid;
+ border-width: 1px;
+ border-color: darkgrey;
+ padding: 5px 0px 5px 0px;
+}
+
+caption.ds-info {
+ font-weight: 700;
+ caption-side: top;
+ padding: 20px 0px 0px 10px;
+ color: black;
+}
+
+caption.ds-info-table-stats {
+ font-weight: 700;
+ caption-side: top;
+ padding: 0px 0px 0px 10px;
+ color: gray;
+}
+
+td.ds-info {
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+.ds-plan-executed {
+ color: green;
+ font-weight: 500;
+}
+
+.ds-plan-executing {
+ color: red;
+ font-weight: 500;
+}
+
+.ds-plan-to-execute {
+ color: gray;
+ font-weight: 500;
+}
diff --git a/ydb/core/cms/ui/datashard.js b/ydb/core/cms/ui/datashard.js
index c075d3276e0..5965b0f5a32 100644
--- a/ydb/core/cms/ui/datashard.js
+++ b/ydb/core/cms/ui/datashard.js
@@ -1,46 +1,46 @@
-'use strict';
-
-var TabletId;
-
-function main() {
- // making main container wider
- //$('.container').toggleClass('container container-fluid');
-
- if (window.location.hash == '') {
- window.location.hash = 'page=info';
- } else {
- parseHashParams();
- if (Parameters.page !== undefined) {
- $('.nav-tabs a[href="#' + Parameters.page + '"]').tab('show');
- }
- if (Parameters.show !== undefined) {
- for (var id of Parameters.show.split(',')) {
- ShownElements.add(id);
- }
- }
- }
-
- var args = {};
- window.location.search.substr(1).split('&').forEach((o) => { var a = o.split('='); args[a[0]] = decodeURIComponent(a[1]); } );
- if (args.TabletID !== undefined) {
- TabletId = args.TabletID;
- }
-
- document.getElementById('host-ref').textContent += " - " + window.location.hostname;
- $('#shard-ref').text('DataShard ' + TabletId);
- $('#main-title').text('DataShard ' + TabletId);
-
- $('.nav-tabs a').on('shown.bs.tab', function (e) {
- setHashParam('page', e.target.hash.substr(1));
- })
-
- initCommon();
- initDataShardInfoTab();
- initOperationsListTab();
- initOperationTab();
- initSlowOperationsTab();
- initReadSetsTab();
- initHistogramTab();
-}
-
-$(document).ready(main);
+'use strict';
+
+var TabletId;
+
+function main() {
+ // making main container wider
+ //$('.container').toggleClass('container container-fluid');
+
+ if (window.location.hash == '') {
+ window.location.hash = 'page=info';
+ } else {
+ parseHashParams();
+ if (Parameters.page !== undefined) {
+ $('.nav-tabs a[href="#' + Parameters.page + '"]').tab('show');
+ }
+ if (Parameters.show !== undefined) {
+ for (var id of Parameters.show.split(',')) {
+ ShownElements.add(id);
+ }
+ }
+ }
+
+ var args = {};
+ window.location.search.substr(1).split('&').forEach((o) => { var a = o.split('='); args[a[0]] = decodeURIComponent(a[1]); } );
+ if (args.TabletID !== undefined) {
+ TabletId = args.TabletID;
+ }
+
+ document.getElementById('host-ref').textContent += " - " + window.location.hostname;
+ $('#shard-ref').text('DataShard ' + TabletId);
+ $('#main-title').text('DataShard ' + TabletId);
+
+ $('.nav-tabs a').on('shown.bs.tab', function (e) {
+ setHashParam('page', e.target.hash.substr(1));
+ })
+
+ initCommon();
+ initDataShardInfoTab();
+ initOperationsListTab();
+ initOperationTab();
+ initSlowOperationsTab();
+ initReadSetsTab();
+ initHistogramTab();
+}
+
+$(document).ready(main);
diff --git a/ydb/core/cms/ui/datashard_hist.js b/ydb/core/cms/ui/datashard_hist.js
index 6ae76112568..54de6f2d001 100644
--- a/ydb/core/cms/ui/datashard_hist.js
+++ b/ydb/core/cms/ui/datashard_hist.js
@@ -1,135 +1,135 @@
-'use strict';
-
-var HistogramState = {
- fetchInterval: 300000,
- retryInterval: 5000,
- loading: false,
- scheduledLoad: false,
- ops: new Map(),
-};
-
-function onHistogramLoaded(data) {
- HistogramState.loading = false;
-
- if (data['Status']['Code'] != 'SUCCESS') {
- onHistogramFailed(data);
- return;
- }
-
- $('#ds-hist-error').html('');
-
- $('#ds-hist-tables').empty();
-
- if (data.TableHistograms) {
- for (var table of data.TableHistograms) {
- addTableHistograms(table);
- }
- }
-
- $('#ds-ops-list-table').trigger('update', [true]);
-
- scheduleLoadHistogram(HistogramState.fetchInterval);
-}
-
-function addTableHistograms(data) {
- var tableName = data.TableName;
- var keys = data.KeyNames;
-
- if (data.SizeHistogram)
- addHistogram(tableName, keys, 'Data size', data.SizeHistogram)
-
- if (data.CountHistogram)
- addHistogram(tableName, keys, 'Rows count', data.CountHistogram)
+'use strict';
+
+var HistogramState = {
+ fetchInterval: 300000,
+ retryInterval: 5000,
+ loading: false,
+ scheduledLoad: false,
+ ops: new Map(),
+};
+
+function onHistogramLoaded(data) {
+ HistogramState.loading = false;
+
+ if (data['Status']['Code'] != 'SUCCESS') {
+ onHistogramFailed(data);
+ return;
+ }
+
+ $('#ds-hist-error').html('');
+
+ $('#ds-hist-tables').empty();
+
+ if (data.TableHistograms) {
+ for (var table of data.TableHistograms) {
+ addTableHistograms(table);
+ }
+ }
+
+ $('#ds-ops-list-table').trigger('update', [true]);
+
+ scheduleLoadHistogram(HistogramState.fetchInterval);
+}
+
+function addTableHistograms(data) {
+ var tableName = data.TableName;
+ var keys = data.KeyNames;
+
+ if (data.SizeHistogram)
+ addHistogram(tableName, keys, 'Data size', data.SizeHistogram)
+
+ if (data.CountHistogram)
+ addHistogram(tableName, keys, 'Rows count', data.CountHistogram)
if (data.KeyAccessSample)
addHistogram(tableName, keys, 'Key access sample', data.KeyAccessSample)
-}
-
-function addHistogram(tableName, keys, histName, hist) {
- var headCells = `<th data-sorter="false">${histName}</th>`;
- for (var key of keys)
- headCells += `<th data-sorter="false">${key}</th>`;
-
- var bodyRows = '';
- if (hist.Items) {
- for (var item of hist.Items) {
- var rowCells = `<td>${item.Value}</td>`;
- for (var val of item.KeyValues)
- rowCells += `<td>${val}</td>`;
- bodyRows += `<tr>${rowCells}</tr>`;
- }
- }
-
- var table = $(`
- <table class="tablesorter">
- <caption class="ds-info">${histName} histogram for ${tableName}</caption>
- <thead>
- <tr>${headCells}</tr>
- </thead>
- <tbody>${bodyRows}</tbody>
- </table>
- `);
-
- table.appendTo($('#ds-hist-tables'));
- table.tablesorter({
- theme: 'blue',
- sortList: [],
- widgets : ['zebra'],
- });
-
- console.log(table);
-}
-
-function onHistogramFailed(data) {
- HistogramState.loading = false;
-
- if (data && data['Status'] && data['Status']['Issues'])
- $('#ds-hist-error').html(JSON.stringify(data['Status']['Issues']));
- else
- $('#ds-hist-error').html("Cannot get data histograms");
- scheduleLoadHistogram(HistogramState.retryInterval);
-}
-
-function loadHistogram() {
- if (HistogramState.loading)
- return;
-
- if (!$('#ds-hist-link').hasClass('active'))
- return;
-
- HistogramState.loading = true;
- var url = '../cms/api/datashard/json/getdatahist?tabletid=' + TabletId;
- $.get(url).done(onHistogramLoaded).fail(onHistogramFailed);
-}
-
-function scheduledLoadHistogram() {
- HistogramState.scheduledLoad = false;
- loadHistogram();
-}
-
-function scheduleLoadHistogram(timeout) {
- if (HistogramState.scheduledLoad)
- return;
- HistogramState.scheduledLoad = true;
- setTimeout(scheduledLoadHistogram, timeout);
-}
-
-function initHistogramTab() {
- $(document).on('shown.bs.tab', '', function(e) {
- if (e.target.id == 'ds-hist-link') {
- $('#ds-size-hist-table').tablesorter({
- theme: 'blue',
- sortList: [],
- widgets : ['zebra'],
- });
- $('#ds-count-hist-table').tablesorter({
- theme: 'blue',
- sortList: [],
- widgets : ['zebra'],
- });
- scheduleLoadHistogram(0);
- }
- });
-
- loadHistogram();
-}
+}
+
+function addHistogram(tableName, keys, histName, hist) {
+ var headCells = `<th data-sorter="false">${histName}</th>`;
+ for (var key of keys)
+ headCells += `<th data-sorter="false">${key}</th>`;
+
+ var bodyRows = '';
+ if (hist.Items) {
+ for (var item of hist.Items) {
+ var rowCells = `<td>${item.Value}</td>`;
+ for (var val of item.KeyValues)
+ rowCells += `<td>${val}</td>`;
+ bodyRows += `<tr>${rowCells}</tr>`;
+ }
+ }
+
+ var table = $(`
+ <table class="tablesorter">
+ <caption class="ds-info">${histName} histogram for ${tableName}</caption>
+ <thead>
+ <tr>${headCells}</tr>
+ </thead>
+ <tbody>${bodyRows}</tbody>
+ </table>
+ `);
+
+ table.appendTo($('#ds-hist-tables'));
+ table.tablesorter({
+ theme: 'blue',
+ sortList: [],
+ widgets : ['zebra'],
+ });
+
+ console.log(table);
+}
+
+function onHistogramFailed(data) {
+ HistogramState.loading = false;
+
+ if (data && data['Status'] && data['Status']['Issues'])
+ $('#ds-hist-error').html(JSON.stringify(data['Status']['Issues']));
+ else
+ $('#ds-hist-error').html("Cannot get data histograms");
+ scheduleLoadHistogram(HistogramState.retryInterval);
+}
+
+function loadHistogram() {
+ if (HistogramState.loading)
+ return;
+
+ if (!$('#ds-hist-link').hasClass('active'))
+ return;
+
+ HistogramState.loading = true;
+ var url = '../cms/api/datashard/json/getdatahist?tabletid=' + TabletId;
+ $.get(url).done(onHistogramLoaded).fail(onHistogramFailed);
+}
+
+function scheduledLoadHistogram() {
+ HistogramState.scheduledLoad = false;
+ loadHistogram();
+}
+
+function scheduleLoadHistogram(timeout) {
+ if (HistogramState.scheduledLoad)
+ return;
+ HistogramState.scheduledLoad = true;
+ setTimeout(scheduledLoadHistogram, timeout);
+}
+
+function initHistogramTab() {
+ $(document).on('shown.bs.tab', '', function(e) {
+ if (e.target.id == 'ds-hist-link') {
+ $('#ds-size-hist-table').tablesorter({
+ theme: 'blue',
+ sortList: [],
+ widgets : ['zebra'],
+ });
+ $('#ds-count-hist-table').tablesorter({
+ theme: 'blue',
+ sortList: [],
+ widgets : ['zebra'],
+ });
+ scheduleLoadHistogram(0);
+ }
+ });
+
+ loadHistogram();
+}
diff --git a/ydb/core/cms/ui/datashard_info.js b/ydb/core/cms/ui/datashard_info.js
index 422e4a9f6d8..f1c8bad40f5 100644
--- a/ydb/core/cms/ui/datashard_info.js
+++ b/ydb/core/cms/ui/datashard_info.js
@@ -1,52 +1,52 @@
-'use strict';
-
-var DataShardInfoState = {
- fetchInterval: 5000,
- retryInterval: 5000,
- loadingInfo: false,
- scheduledLoad: false,
-};
-
-function onDataShardInfoLoaded(data) {
- DataShardInfoState.loadingInfo = false;
-
- if (data['Status']['Code'] != 'SUCCESS') {
- onDataShardInfoFailed(data);
- return;
- }
-
- $('#ds-info-error').html('');
-
- var info = data.TabletInfo;
- var tables = data.UserTables;
- if (tables) {
- for (var table of tables) {
- var tableInfoHTML = `
- <table class="ds-info">
- <caption class="ds-info">User table ${table.Name}</caption>
- <tbody class="ds-info">
- <tr class="ds-info">
- <td class="ds-info">Path</td>
- <td class="ds-info"><a href="../viewer/#page=schema&path=${table.Path}">${table.Path}</a></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">PathId</td>
- <td class="ds-info"><a href="app?TabletID=${info.SchemeShard}&Page=PathInfo&PathId=${table.PathId}">${table.PathId}</a></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">LocalId</td>
- <td class="ds-info">${table.LocalId}</td>
- </tr>
+'use strict';
+
+var DataShardInfoState = {
+ fetchInterval: 5000,
+ retryInterval: 5000,
+ loadingInfo: false,
+ scheduledLoad: false,
+};
+
+function onDataShardInfoLoaded(data) {
+ DataShardInfoState.loadingInfo = false;
+
+ if (data['Status']['Code'] != 'SUCCESS') {
+ onDataShardInfoFailed(data);
+ return;
+ }
+
+ $('#ds-info-error').html('');
+
+ var info = data.TabletInfo;
+ var tables = data.UserTables;
+ if (tables) {
+ for (var table of tables) {
+ var tableInfoHTML = `
+ <table class="ds-info">
+ <caption class="ds-info">User table ${table.Name}</caption>
+ <tbody class="ds-info">
+ <tr class="ds-info">
+ <td class="ds-info">Path</td>
+ <td class="ds-info"><a href="../viewer/#page=schema&path=${table.Path}">${table.Path}</a></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">PathId</td>
+ <td class="ds-info"><a href="app?TabletID=${info.SchemeShard}&Page=PathInfo&PathId=${table.PathId}">${table.PathId}</a></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">LocalId</td>
+ <td class="ds-info">${table.LocalId}</td>
+ </tr>
<tr class="ds-info">
<td class="ds-info">SchemaVersion</td>
<td class="ds-info">${table.SchemaVersion}</td>
</tr>
- </tbody>
- </table>
- `;
- if (table.Stats) {
- tableInfoHTML += `
- <table class="ds-info">
+ </tbody>
+ </table>
+ `;
+ if (table.Stats) {
+ tableInfoHTML += `
+ <table class="ds-info">
<caption class="ds-info-table-stats">Metrics</caption>
<tbody class="ds-info">
<tr class="ds-info">
@@ -57,144 +57,144 @@ function onDataShardInfoLoaded(data) {
</table>
<table class="ds-info">
- <caption class="ds-info-table-stats">Statistics</caption>
- <tbody class="ds-info">
- <tr class="ds-info">
- <td class="ds-info">Rows count</td>
- <td class="ds-info">${table.Stats.RowCount}</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Data size</td>
- <td class="ds-info">${table.Stats.DataSize}</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Last access time</td>
- <td class="ds-info">${table.Stats.LastAccessTime}</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Last update time</td>
- <td class="ds-info">${table.Stats.LastUpdateTime}</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Last stats update time</td>
- <td class="ds-info">${table.Stats.LastStatsUpdateTime}</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Last stats report time</td>
- <td class="ds-info">${table.Stats.LastStatsReportTime}</td>
- </tr>
- </tbody>
- </table>
- `;
- }
- $('#user-tables').html(tableInfoHTML);
- }
- }
-
- if (tables && tables.length == 1) {
- var path = tables[0].Path;
- $('#main-title').text('DataShard ' + TabletId + ' (' + path + ')');
- }
-
- $('#tablet-info-schemeshard').html('<a href="../tablets?TabletID=' + info.SchemeShard
- + '">' + info.SchemeShard + '</a>');
- $('#tablet-info-mediator').html('<a href="../tablets?TabletID=' + info.Mediator
- + '">' + info.Mediator + '</a>');
- $('#tablet-info-generation').text(info.Generation);
+ <caption class="ds-info-table-stats">Statistics</caption>
+ <tbody class="ds-info">
+ <tr class="ds-info">
+ <td class="ds-info">Rows count</td>
+ <td class="ds-info">${table.Stats.RowCount}</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Data size</td>
+ <td class="ds-info">${table.Stats.DataSize}</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Last access time</td>
+ <td class="ds-info">${table.Stats.LastAccessTime}</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Last update time</td>
+ <td class="ds-info">${table.Stats.LastUpdateTime}</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Last stats update time</td>
+ <td class="ds-info">${table.Stats.LastStatsUpdateTime}</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Last stats report time</td>
+ <td class="ds-info">${table.Stats.LastStatsReportTime}</td>
+ </tr>
+ </tbody>
+ </table>
+ `;
+ }
+ $('#user-tables').html(tableInfoHTML);
+ }
+ }
+
+ if (tables && tables.length == 1) {
+ var path = tables[0].Path;
+ $('#main-title').text('DataShard ' + TabletId + ' (' + path + ')');
+ }
+
+ $('#tablet-info-schemeshard').html('<a href="../tablets?TabletID=' + info.SchemeShard
+ + '">' + info.SchemeShard + '</a>');
+ $('#tablet-info-mediator').html('<a href="../tablets?TabletID=' + info.Mediator
+ + '">' + info.Mediator + '</a>');
+ $('#tablet-info-generation').text(info.Generation);
$('#tablet-info-role').text(info.IsFollower ? 'Follower' : 'Leader');
- $('#tablet-info-state').text(info.State + (info.IsActive ? ' (active)' : ' (inactive)'));
- $('#tablet-info-shared-blobs').text(info.HasSharedBlobs);
-
- var activities = data.Activities;
- if (activities) {
- $('#activities-last-planned-tx').text(activities.LastPlannedStep
- + '.' + activities.LastPlannedTx);
- $('#activities-last-completed-tx').text(activities.LastCompletedStep
- + '.' + activities.LastCompletedTx);
- $('#activities-utmost-completed-tx').text(activities.UtmostCompletedStep
- + '.' + activities.UtmostCompletedTx);
- $('#activities-data-tx-complete-lag').text(activities.DataTxCompleteLag);
- $('#activities-scan-tx-complete-lag').text(activities.ScanTxCompleteLag);
- $('#activities-in-fly-planned').text(activities.InFlyPlanned);
- $('#activities-in-fly-immediate').text(activities.InFlyImmediate);
- $('#activities-executing-ops').text(activities.ExecutingOps);
- $('#activities-waiting-ops').text(activities.WaitingOps);
- $('#activities-execute-blockers').text(activities.ExecuteBlockers);
- $('#activities-data-tx-cached').text(activities.DataTxCached);
- $('#activities-out-rs').text(activities.OutReadSets);
- $('#activities-our-rs-acks').text(activities.OutReadSetsAcks);
- $('#activities-delayed-acks').text(activities.DelayedAcks);
- $('#activities-locks').text(activities.Locks);
- $('#activities-broken-locks').text(activities.BrokenLocks);
- }
-
- var controls = data.Controls;
- $('#tablet-info-controls').html('');
- if (controls && controls.length) {
- for (var control of controls) {
- var tr = `
- <tr class="ds-info">
- <td class="ds-info">${control.Name}</td>
- <td class="ds-info">${control.Value}</td>
- </tr>
- `;
- $('#tablet-info-controls').append(tr);
- }
- }
-
- var pcfg = data.PipelineConfig;
- if (pcfg) {
- $('#pipeline-out-of-order-enabled').text(pcfg.OutOfOrderEnabled);
- $('#pipeline-active-txs-limit').text(pcfg.ActiveTxsLimit);
- $('#pipeline-allow-immediate').text(pcfg.AllowImmediate);
- $('#pipeline-force-online-rw').text(pcfg.ForceOnlineRW);
- $('#pipeline-dirty-online').text(pcfg.DirtyOnline);
- $('#pipeline-dirty-immediate').text(pcfg.DirtyImmediate);
- $('#pipeline-data-tx-cache-limit').text(pcfg.DataTxCacheSize);
- }
-
- scheduleLoadDataShardInfo(DataShardInfoState.fetchInterval);
-}
-
-function onDataShardInfoFailed(data) {
- DataShardInfoState.loadingInfo = false;
-
- if (data && data['Status'] && data['Status']['Issues'])
- $('#ds-info-error').html(JSON.stringify(data['Status']['Issues']));
- else
- $('#ds-info-error').html("Cannot get DataShard info");
- scheduleLoadDataShardInfo(DataShardInfoState.retryInterval);
-}
-
-function loadDataShardInfo() {
- if (DataShardInfoState.loadingInfo)
- return;
-
- if (!$('#ds-info-link').hasClass('active'))
- return;
-
- DataShardInfoState.loadingInfo = true;
- var url = '../cms/api/datashard/json/getinfo?tabletid=' + TabletId;
- $.get(url).done(onDataShardInfoLoaded).fail(onDataShardInfoFailed);
-}
-
-function scheduledLoadDataShardInfo() {
- DataShardInfoState.scheduledLoad = false;
- loadDataShardInfo();
-}
-
-function scheduleLoadDataShardInfo(timeout) {
- if (DataShardInfoState.scheduledLoad)
- return;
- DataShardInfoState.scheduledLoad = true;
- setTimeout(scheduledLoadDataShardInfo, timeout);
-}
-
-function initDataShardInfoTab() {
- $(document).on('shown.bs.tab', '', function(e) {
- if (e.target.id == 'ds-info-link')
- scheduleLoadDataShardInfo(0);
- });
-
- loadDataShardInfo();
-}
+ $('#tablet-info-state').text(info.State + (info.IsActive ? ' (active)' : ' (inactive)'));
+ $('#tablet-info-shared-blobs').text(info.HasSharedBlobs);
+
+ var activities = data.Activities;
+ if (activities) {
+ $('#activities-last-planned-tx').text(activities.LastPlannedStep
+ + '.' + activities.LastPlannedTx);
+ $('#activities-last-completed-tx').text(activities.LastCompletedStep
+ + '.' + activities.LastCompletedTx);
+ $('#activities-utmost-completed-tx').text(activities.UtmostCompletedStep
+ + '.' + activities.UtmostCompletedTx);
+ $('#activities-data-tx-complete-lag').text(activities.DataTxCompleteLag);
+ $('#activities-scan-tx-complete-lag').text(activities.ScanTxCompleteLag);
+ $('#activities-in-fly-planned').text(activities.InFlyPlanned);
+ $('#activities-in-fly-immediate').text(activities.InFlyImmediate);
+ $('#activities-executing-ops').text(activities.ExecutingOps);
+ $('#activities-waiting-ops').text(activities.WaitingOps);
+ $('#activities-execute-blockers').text(activities.ExecuteBlockers);
+ $('#activities-data-tx-cached').text(activities.DataTxCached);
+ $('#activities-out-rs').text(activities.OutReadSets);
+ $('#activities-our-rs-acks').text(activities.OutReadSetsAcks);
+ $('#activities-delayed-acks').text(activities.DelayedAcks);
+ $('#activities-locks').text(activities.Locks);
+ $('#activities-broken-locks').text(activities.BrokenLocks);
+ }
+
+ var controls = data.Controls;
+ $('#tablet-info-controls').html('');
+ if (controls && controls.length) {
+ for (var control of controls) {
+ var tr = `
+ <tr class="ds-info">
+ <td class="ds-info">${control.Name}</td>
+ <td class="ds-info">${control.Value}</td>
+ </tr>
+ `;
+ $('#tablet-info-controls').append(tr);
+ }
+ }
+
+ var pcfg = data.PipelineConfig;
+ if (pcfg) {
+ $('#pipeline-out-of-order-enabled').text(pcfg.OutOfOrderEnabled);
+ $('#pipeline-active-txs-limit').text(pcfg.ActiveTxsLimit);
+ $('#pipeline-allow-immediate').text(pcfg.AllowImmediate);
+ $('#pipeline-force-online-rw').text(pcfg.ForceOnlineRW);
+ $('#pipeline-dirty-online').text(pcfg.DirtyOnline);
+ $('#pipeline-dirty-immediate').text(pcfg.DirtyImmediate);
+ $('#pipeline-data-tx-cache-limit').text(pcfg.DataTxCacheSize);
+ }
+
+ scheduleLoadDataShardInfo(DataShardInfoState.fetchInterval);
+}
+
+function onDataShardInfoFailed(data) {
+ DataShardInfoState.loadingInfo = false;
+
+ if (data && data['Status'] && data['Status']['Issues'])
+ $('#ds-info-error').html(JSON.stringify(data['Status']['Issues']));
+ else
+ $('#ds-info-error').html("Cannot get DataShard info");
+ scheduleLoadDataShardInfo(DataShardInfoState.retryInterval);
+}
+
+function loadDataShardInfo() {
+ if (DataShardInfoState.loadingInfo)
+ return;
+
+ if (!$('#ds-info-link').hasClass('active'))
+ return;
+
+ DataShardInfoState.loadingInfo = true;
+ var url = '../cms/api/datashard/json/getinfo?tabletid=' + TabletId;
+ $.get(url).done(onDataShardInfoLoaded).fail(onDataShardInfoFailed);
+}
+
+function scheduledLoadDataShardInfo() {
+ DataShardInfoState.scheduledLoad = false;
+ loadDataShardInfo();
+}
+
+function scheduleLoadDataShardInfo(timeout) {
+ if (DataShardInfoState.scheduledLoad)
+ return;
+ DataShardInfoState.scheduledLoad = true;
+ setTimeout(scheduledLoadDataShardInfo, timeout);
+}
+
+function initDataShardInfoTab() {
+ $(document).on('shown.bs.tab', '', function(e) {
+ if (e.target.id == 'ds-info-link')
+ scheduleLoadDataShardInfo(0);
+ });
+
+ loadDataShardInfo();
+}
diff --git a/ydb/core/cms/ui/datashard_op.js b/ydb/core/cms/ui/datashard_op.js
index be68a14cc15..fe5a4a98cbb 100644
--- a/ydb/core/cms/ui/datashard_op.js
+++ b/ydb/core/cms/ui/datashard_op.js
@@ -1,879 +1,879 @@
-'use strict';
-
-var OperationState = {
- fetchInterval: 5000,
- retryInterval: 5000,
- sinkStateFetchInterval: 5000,
- sinkStateRetryInterval: 5000,
- scanStateFetchInterval: 5000,
- scanStateRetryInterval: 5000,
- streamStateFetchInterval: 5000,
- streamStateRetryInterval: 5000,
- loading: false,
- scheduledLoad: false,
- id: undefined,
- op: undefined,
-};
-
-function showOp(id) {
- setHashParam('op', id);
-
- if (!$('#ds-op-link').hasClass('active')) {
- $('#ds-op-link').tab('show')
- } else {
- $('#ds-op-error').html('');
- loadOperation(id);
- }
-}
-
-class Operation {
- constructor(info) {
- this.id = info.BasicInfo.TxId;
- this._createView();
- this.updateBasicInfo(info);
- }
-
- updateBasicInfo(info) {
- this.info = info;
-
- $('#ds-op-info-id').text(info.BasicInfo.TxId);
- $('#ds-op-info-step').text(info.BasicInfo.Step);
- $('#ds-op-info-kind').text(info.BasicInfo.Kind);
- $('#ds-op-info-received-at').text(timeToString(info.BasicInfo.ReceivedAt));
- $('#ds-op-info-min-step').text(info.BasicInfo.MinStep);
- $('#ds-op-info-max-step').text(info.BasicInfo.MaxStep);
- $('#ds-op-info-flags').text(info.BasicInfo.Flags.join(", "));
-
- // Fill execution plan.
- var profile = new Map();
- if (info.ExecutionProfile.UnitProfiles) {
- for (var unit of info.ExecutionProfile.UnitProfiles) {
- var total = unit.WaitTime + unit.ExecuteTime + unit.CommitTime
- + unit.CompleteTime;
-
- var p = {};
- p.total = durationToStringMs(total);
- p.wait = durationToStringMs(unit.WaitTime);
- p.execute = durationToStringMs(unit.ExecuteTime);
- p.commit = durationToStringMs(unit.CommitTime);
- p.complete = durationToStringMs(unit.CompleteTime);
- p.show = $('#ds-op-unit-ptofile-' + unit.UnitKind).hasClass('show');
- p.count = unit.ExecuteCount;
-
- profile.set(unit.UnitKind, p);
- }
- }
-
- $('#ds-op-plan-body').html('');
- var cur = info.ExecutionPlan.CurrentUnit;
- for (var i = 0; i < info.ExecutionPlan.Units.length; ++i) {
- var unit = info.ExecutionPlan.Units[i];
- var unitCl = i < cur ? "ds-plan-executed" : (i == cur ? "ds-plan-executing" : "ds-plan-to-execute");
- var p = profile.has(unit) ? profile.get(unit) : {};
- var trHtml = `
- <tr class="ds-info">
- <td class="ds-info va-top ${unitCl}">${unit}</td>
- <td>
- <a data-toggle="collapse" href="#ds-op-unit-ptofile-${unit}">${p.total}</a><br>
- <div class="collapse ${p.show ? "show" : ""}" id="ds-op-unit-ptofile-${unit}">
- Wait: ${p.wait}<br>
- Execute (${p.count}): ${p.execute}</br>
- Commit: ${p.commit}</br>
- Complete: ${p.complete}</br>
- </div>
- </td>
- </tr>
- `;
- $(trHtml).appendTo($('#ds-op-plan-body'));
- }
-
- $('#ds-op-dependencies-body').html('');
- $('#ds-op-dependents-body').html('');
- if (info.Dependencies) {
- this._addDeps(info.Dependencies.Dependencies, $('#ds-op-dependencies-body'));
- this._addDeps(info.Dependencies.Dependents, $('#ds-op-dependents-body'));
- }
-
- if (info.InputData && info.InputData.InputRS) {
- $('#ds-op-input-rs').show();
- $('#ds-op-input-rs-body').html('');
-
- for (var rs of info.InputData.InputRS) {
- var trHtml = `
- <tr class="ds-info">
- <td class="ds-info"><a href="app?TabletID=${rs.From}">${rs.From}</td>
- <td class="ds-info">${rs.Received} received</td>
- </tr>
- `;
- $(trHtml).appendTo($('#ds-op-input-rs-body'));
- }
- var trHtml = `
- <tr class="ds-info">
- <td class="ds-info">Total remains</td>
- <td class="ds-info">${info.InputData.RemainedInputRS}</td>
- </tr>
- `;
- $(trHtml).appendTo($('#ds-op-input-rs-body'));
- } else {
- $('#ds-op-input-rs').hide();
- }
-
- if (info.ReadTableState) {
- $('#ds-op-readtable').show();
-
- $('#ds-op-readtable-table').text(info.ReadTableState.TableId);
- $('#ds-op-readtable-snapshot').text(info.ReadTableState.SnapshotId);
- $('#ds-op-readtable-scan-task').text(info.ReadTableState.ScanTaskId);
- $('#ds-op-readtable-sink').text(info.ReadTableState.SinkActor);
- $('#ds-op-readtable-scan-actor').text(info.ReadTableState.ScanActor);
- } else {
- $('#ds-op-readtable').hide();
- }
- }
-
-
- remove() {
- $('#ds-op-info').html('');
- }
-
- onTabShown() {
- if (this.requestedSinkState)
- this._scheduleLoadSinkState();
- if (this.requestedScanState)
- this._scheduleLoadScanState();
- if (this.requestedStreamState)
- this._scheduleLoadStreamState();
- }
-
- requestScanState() {
- this.requestedScanState = true;
- $('#ds-op-scan-state-div').show();
- this._scheduleLoadScanState(0);
- }
-
- requestSinkState() {
- this.requestedSinkState = true;
- $('#ds-op-sink-state-div').show();
- this._scheduleLoadSinkState(0);
- }
-
- requestStreamState() {
- this.requestedStreamState = true;
- $('#ds-op-stream-state-div').show();
- this._scheduleLoadStreamState(0);
- }
-
- _addDeps(deps, body) {
- if (!deps) {
- var trHtml = `
- <tr class="ds-info">
- <td class="ds-info">None</td>
- </tr>
- `;
- $(trHtml).appendTo(body);
- return;
- }
-
- for (var dep of deps) {
- var trHtml = `
- <tr class="ds-info">
- <td class="ds-info"><a href="#page=ds-op&op=${dep.Target}" onclick="showOp(${dep.Target})">${dep.Target}</a></td>
- <td class="ds-info">${dep.Types.join(", ")}</td>
- </tr>
- `;
- $(trHtml).appendTo(body);
- }
- }
-
- _createView() {
- var html = `
- <div class="row">
- <div class="col">
- <table class="ds-info">
- <caption class="ds-info">Basic info</caption>
- <tbody class="ds-info">
- <tr class="ds-info">
- <td class="ds-info">TxId</td>
- <td class="ds-info" id="ds-op-info-id"></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Step</td>
- <td class="ds-info" id="ds-op-info-step"></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Kind</td>
- <td class="ds-info" id="ds-op-info-kind"></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">ReceivedAt</td>
- <td class="ds-info" id="ds-op-info-received-at"></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">MinStep</td>
- <td class="ds-info" id="ds-op-info-min-step"></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">MaxStep</td>
- <td class="ds-info" id="ds-op-info-max-step"></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Flags</td>
- <td class="ds-info" id="ds-op-info-flags"></td>
- </tr>
- </tbody>
- </table>
- <table class="ds-info">
- <caption class="ds-info">Execution plan</caption>
- <tbody class="ds-info" id="ds-op-plan-body">
- </tbody>
- </table>
- </div>
- <div class="col">
- <table class="ds-info" id="ds-op-input-rs">
- <caption class="ds-info">Input read sets</caption>
- <tbody class="ds-info" id="ds-op-input-rs-body">
- </tbody>
- </table>
- <table class="ds-info">
- <caption class="ds-info">Dependencies</caption>
- <tbody class="ds-info" id="ds-op-dependencies-body">
- </tbody>
- </table>
- <table class="ds-info">
- <caption class="ds-info">Dependent operations</caption>
- <tbody class="ds-info" id="ds-op-dependents-body">
- </tbody>
- </table>
- <table class="ds-info" id="ds-op-readtable">
- <caption class="ds-info">ReadTable state</caption>
- <tbody class="ds-info">
- <tr class="ds-info">
- <td class="ds-info">Table ID</td>
- <td class="ds-info" id="ds-op-readtable-table"></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Snapshot ID</td>
- <td class="ds-info" id="ds-op-readtable-snapshot"></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Scan task ID</td>
- <td class="ds-info" id="ds-op-readtable-scan-task"></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Sink actor</td>
- <td class="ds-info" id="ds-op-readtable-sink"></td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Scan actor</td>
- <td class="ds-info" id="ds-op-readtable-scan-actor"></td>
- </tr>
- </tbody>
- <tfoot class="ds-info">
- <tr class="ds-info">
- <td class="ds-info" colspan="2">
- <button class="btn btn-primary btn-sm" onclick="requestScanState(${this.id})">Get scan state</button>
- <button class="btn btn-primary btn-sm" onclick="requestSinkState(${this.id})">Get proxy state</button>
- <button class="btn btn-primary btn-sm" onclick="requestStreamState(${this.id})">Get stream state</button>
- </td>
- </tr>
- </tfoot>
- </table>
- </div>
- </div>
- <div class="row">
- <div class="col" style="display: none;" id="ds-op-scan-state-div">
- <div class="error" id="ds-op-scan-state-error"></div>
- <table class="ds-info" id="ds-op-readtable">
- <caption class="ds-info">Scan actor state</caption>
- <tbody class="ds-info">
- <tr class="ds-info">
- <td class="ds-info">Message quota</td>
- <td class="ds-info" id="ds-op-scan-quota">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Message size limit</td>
- <td class="ds-info" id="ds-op-scan-size-limit">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Message rows limit</td>
- <td class="ds-info" id="ds-op-scan-rows-limit">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Pending acks</td>
- <td class="ds-info" id="ds-op-scan-pending-acks">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Result size</td>
- <td class="ds-info" id="ds-op-scan-res-size">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Result rows</td>
- <td class="ds-info" id="ds-op-scan-res-rows">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Has upper border</td>
- <td class="ds-info" id="ds-op-scan-upper">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Finished</td>
- <td class="ds-info" id="ds-op-scan-finished">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Error</td>
- <td class="ds-info" id="ds-op-scan-error">Loading...</td>
- </tr>
- </tbody>
- </table>
- </div>
- <div class="col" style="display: none;" id="ds-op-sink-state-div">
- <div class="error" id="ds-op-sink-state-error"></div>
- <table class="ds-info" id="ds-op-readtable">
- <caption class="ds-info">Proxy actor state</caption>
- <tbody class="ds-info">
- <tr class="ds-info">
- <td class="ds-info">TxId</td>
- <td class="ds-info" id="ds-op-sink-txid">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Accepted</td>
- <td class="ds-info" id="ds-op-sink-accepted">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">ResolveStarted</td>
- <td class="ds-info" id="ds-op-sink-resolve-started">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Resolved</td>
- <td class="ds-info" id="ds-op-sink-resolved">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Prepared</td>
- <td class="ds-info" id="ds-op-sink-prepared">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Planned</td>
- <td class="ds-info" id="ds-op-sink-planned">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Timeout</td>
- <td class="ds-info" id="ds-op-sink-timeout">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Coordinator</td>
- <td class="ds-info" id="ds-op-sink-coordinator">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Request source</td>
- <td class="ds-info" id="ds-op-sink-source">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Request version</td>
- <td class="ds-info" id="ds-op-sink-request-version">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Response version</td>
- <td class="ds-info" id="ds-op-sink-response-version">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info va-top">Clearance requests</td>
- <td class="ds-info" id="ds-op-sink-clearance">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info va-top">Quota requests</td>
- <td class="ds-info" id="ds-op-sink-quota">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info va-top">Streaming shards</td>
- <td class="ds-info" id="ds-op-sink-streaming">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info va-top">Shards queue</td>
- <td class="ds-info" id="ds-op-sink-queue">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Ordered</td>
- <td class="ds-info" id="ds-op-sink-ordered">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Limited</td>
- <td class="ds-info" id="ds-op-sink-limited">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Rows remain</td>
- <td class="ds-info" id="ds-op-sink-remain">Loading...</td>
- </tr>
- </tbody>
- </table>
- </div>
- <div class="col" style="display: none;" id="ds-op-stream-state-div">
- <div class="error" id="ds-op-stream-state-error"></div>
- <table class="ds-info" id="ds-op-readtable">
- <caption class="ds-info">Stream actor state</caption>
- <tbody class="ds-info">
- <tr class="ds-info">
- <td class="ds-info">Ready</td>
- <td class="ds-info" id="ds-op-stream-ready">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Finished</td>
- <td class="ds-info" id="ds-op-stream-finished">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Responses in queue</td>
- <td class="ds-info" id="ds-op-stream-queue">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info va-top">Quota requests</td>
- <td class="ds-info" id="ds-op-stream-requests">Loading...</td>
- </tr>
- <tr class="ds-info va-top">
- <td class="ds-info">Shard quotas</td>
- <td class="ds-info" id="ds-op-stream-quotas">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Quota limit</td>
- <td class="ds-info" id="ds-op-stream-limit">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Quota reserved</td>
- <td class="ds-info" id="ds-op-stream-reserved">Loading...</td>
- </tr>
- <tr class="ds-info va-top">
- <td class="ds-info">Released shards</td>
- <td class="ds-info" id="ds-op-stream-released">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Client stream timeout</td>
- <td class="ds-info" id="ds-op-stream-client-timeout">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Server stream timeout</td>
- <td class="ds-info" id="ds-op-stream-server-timeout">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Last data stream</td>
- <td class="ds-info" id="ds-op-stream-last-stream">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Last status</td>
- <td class="ds-info" id="ds-op-stream-last-status">Loading...</td>
- </tr>
- </tbody>
- </table>
- <div id="ds-op-stream-state"></div>
- </div>
- </div>
- `;
- $(html).appendTo($('#ds-op-info'));
- }
-
- _maybeGetScanStateLink(state) {
- if (state.ScanActor)
- return `(<a onclick="requestScanState(${this.id})">get state</a>)`;
- return "";
- }
-
- _updateSinkInfo(info) {
- $('#ds-op-sink-txid').html(info.TxId);
- $('#ds-op-sink-accepted').html(timeToString(info.WallClockAccepted));
- $('#ds-op-sink-resolve-started').html(timeToString(info.WallClockResolveStarted));
- $('#ds-op-sink-resolved').html(timeToString(info.WallClockResolved));
- $('#ds-op-sink-prepared').html(timeToString(info.WallClockPrepared));
- $('#ds-op-sink-planned').html(timeToString(info.WallClockPlanned));
- $('#ds-op-sink-timeout').html(this._durationToString(info.ExecTimeoutPeriod));
- $('#ds-op-sink-coordinator').html(`<a href="../tablets?TabletID=${info.SelectedCoordinator}">${info.SelectedCoordinator}</a>`);
- $('#ds-op-sink-source').html(info.RequestSource);
- $('#ds-op-sink-request-version').html(info.RequestVersion);
- $('#ds-op-sink-response-version').html(info.ResponseVersion);
- $('#ds-op-sink-clearance').html(this._makeShardsList(info.ClearanceRequests));
- $('#ds-op-sink-quota').html(this._makeShardsList(info.QuotaRequests));
- $('#ds-op-sink-streaming').html(this._makeShardsList(info.StreamingRequests));
- $('#ds-op-sink-queue').html(this._makeShardsList(info.ShardsQueue));
- $('#ds-op-sink-ordered').html(info.Ordered.toString());
- $('#ds-op-sink-limited').html(info.RowsLimited.toString());
- $('#ds-op-sink-remain').html(info.RowsRemain);
- }
-
- _updateScanInfo(info) {
- $('#ds-op-scan-quota').html(info.MessageQuota);
- $('#ds-op-scan-size-limit').html(info.MessageSizeLimit);
- $('#ds-op-scan-rows-limit').html(info.RowsLimit);
- $('#ds-op-scan-pending-acks').html(info.PendingAcks);
- $('#ds-op-scan-res-size').html(info.ResultSize);
- $('#ds-op-scan-res-rows').html(info.ResultRows);
- $('#ds-op-scan-upper').html(info.HasUpperBorder.toString());
- $('#ds-op-scan-finished').html(info.Finished.toString());
- $('#ds-op-scan-error').html(info.Error);
- }
-
- _updateStreamInfo(info) {
- $('#ds-op-stream-ready').html(info.Ready === undefined ? 'unknown' : info.Ready.toString());
- $('#ds-op-stream-finished').html(info.Finished === undefined ? 'unknown' : info.Finished.toString());
- $('#ds-op-stream-queue').html(info.ResponseQueueSize);
- $('#ds-op-stream-requests').html(this._makeShardsList(info.QuotaRequests));
- $('#ds-op-stream-quotas').html(this._makeShardQuotasList(info.ShardQuotas));
- $('#ds-op-stream-limit').html(info.QuotaLimit);
- $('#ds-op-stream-reserved').html(info.QuotaReserved);
- $('#ds-op-stream-released').html(this._makeShardsList(info.ReleasedShards));
- $('#ds-op-stream-client-timeout').html(this._durationToString(info.InactiveClientTimeout));
- $('#ds-op-stream-server-timeout').html(this._durationToString(info.InactiveServerTimeout));
- $('#ds-op-stream-last-stream').html(timeToString(info.LastDataStreamTimestamp));
- $('#ds-op-stream-last-status').html(timeToString(info.LastStatusTimestamp));
- }
-
- _makeShardsList(shards) {
- if (!shards)
- return '';
-
- var res = '';
- for (var shard of shards) {
- res += `<a href="app?TabletID=${shard.Id}#page=ds-op&op=${this.id}">${shard.Id}</a><br>`;
- }
-
- return res;
- }
-
- _makeShardQuotasList(quotas) {
- if (!quotas)
- return '';
-
- var res = '';
- for (var quota of quotas) {
- res += `<a href="app?TabletID=${quota.ShardId}#page=ds-op&op=${this.id}">${quota.ShardId} (${quota.Quota})</a><br>`;
- }
-
- return res;
- }
-
- // Load sink state
- _onSinkStateLoaded(data) {
- if (OperationState.id != this.id)
- return;
-
- this.loadingSinkState = false;
-
- if (data['Status']['Code'] != 'SUCCESS') {
- this._onSinkStateFailed(data);
- return;
- }
-
- $('#ds-op-sink-state-error').html('');
-
- this._updateSinkInfo(data);
-
- this._scheduleLoadSinkState(OperationState.sinkStateFetchInterval);
- }
-
- _onSinkStateFailed(data) {
- if (OperationState.id != this.id)
- return;
-
- this.loadingSinkState = false;
-
- if (data && data['Status'] && data['Status']['Issues'])
- $('#ds-op-sink-state-error').html(JSON.stringify(data['Status']['Issues']));
- else
- $('#ds-op-sink-state-error').html("Cannot load proxy actor state " + this.id);
- this._scheduleLoadSinkState(OperationState.sinkStateRetryInterval);
- }
-
- _loadSinkState() {
- if (OperationState.id != this.id)
- return;
-
- if (this.loadingSinkState)
- return;
-
- if (!$('#ds-op-link').hasClass('active'))
- return;
-
- this.loadingSinkState = true;
- var _this = this;
- var url = '../cms/api/datashard/json/getreadtablesinkstate?tabletid=' + TabletId
- + '&opid=' + this.id;
- $.get(url)
- .done(function(data) { _this._onSinkStateLoaded(data); })
- .fail(function(data) { _this._onSinkStateFailed(data); });
- }
-
- _scheduleLoadSinkState(timeout) {
- if (this.scheduledLoadSinkState)
- return;
-
- this.scheduledLoadSinkState = true;
-
- var _this = this;
- setTimeout(function() {
- _this.scheduledLoadSinkState = false;
- _this._loadSinkState();
- }, timeout);
- }
-
- // Load scan state
- _onScanStateLoaded(data) {
- if (OperationState.id != this.id)
- return;
-
- this.loadingScanState = false;
-
- if (data['Status']['Code'] != 'SUCCESS') {
- this._onScanStateFailed(data);
- return;
- }
-
- $('#ds-op-scan-state-error').html('');
-
- this._updateScanInfo(data);
-
- this._scheduleLoadScanState(OperationState.scanStateFetchInterval);
- }
-
- _onScanStateFailed(data) {
- if (OperationState.id != this.id)
- return;
-
- this.loadingScanState = false;
-
- if (data && data['Status'] && data['Status']['Issues'])
- $('#ds-op-scan-state-error').html(JSON.stringify(data['Status']['Issues']));
- else
- $('#ds-op-scan-state-error').html("Cannot load scan actor state " + this.id);
- this._scheduleLoadScanState(OperationState.scanStateRetryInterval);
- }
-
- _loadScanState() {
- if (OperationState.id != this.id)
- return;
-
- if (this.loadingScanState)
- return;
-
- if (!$('#ds-op-link').hasClass('active'))
- return;
-
- this.loadingScanState = true;
- var _this = this;
- var url = '../cms/api/datashard/json/getreadtablescanstate?tabletid=' + TabletId
- + '&opid=' + this.id;
- $.get(url)
- .done(function(data) { _this._onScanStateLoaded(data); })
- .fail(function(data) { _this._onScanStateFailed(data); });
- }
-
- _scheduleLoadScanState(timeout) {
- if (this.scheduledLoadScanState)
- return;
-
- this.scheduledLoadScanState = true;
-
- var _this = this;
- setTimeout(function() {
- _this.scheduledLoadScanState = false;
- _this._loadScanState();
- }, timeout);
- }
-
- // Load stream state
- _onStreamStateLoaded(data) {
- if (OperationState.id != this.id)
- return;
-
- this.loadingStreamState = false;
-
- if (data['Status']['Code'] != 'SUCCESS') {
- this._onStreamStateFailed(data);
- return;
- }
-
- $('#ds-op-stream-state-error').html('');
-
- this._updateStreamInfo(data);
-
- this._scheduleLoadStreamState(OperationState.streamStateFetchInterval);
- }
-
- _onStreamStateFailed(data) {
- if (OperationState.id != this.id)
- return;
-
- this.loadingStreamState = false;
-
- if (data && data['Status'] && data['Status']['Issues'])
- $('#ds-op-stream-state-error').html(JSON.stringify(data['Status']['Issues']));
- else
- $('#ds-op-stream-state-error').html("Cannot load stream actor state " + this.id);
- this._scheduleLoadStreamState(OperationState.streamStateRetryInterval);
- }
-
- _loadStreamState() {
- if (OperationState.id != this.id)
- return;
-
- if (this.loadingStreamState)
- return;
-
- if (!$('#ds-op-link').hasClass('active'))
- return;
-
- this.loadingStreamState = true;
- var _this = this;
- var url = '../cms/api/datashard/json/getreadtablestreamstate?tabletid=' + TabletId
- + '&opid=' + this.id;
- $.get(url)
- .done(function(data) { _this._onStreamStateLoaded(data); })
- .fail(function(data) { _this._onStreamStateFailed(data); });
- }
-
- _scheduleLoadStreamState(timeout) {
- if (this.scheduledLoadStreamState)
- return;
-
- this.scheduledLoadStreamState = true;
-
- var _this = this;
- setTimeout(function() {
- _this.scheduledLoadStreamState = false;
- _this._loadStreamState();
- }, timeout);
- }
-
- _durationToString(val) {
- var print = function(v) {
- if (v >= 10)
- return v.toString();
- return '0' + v;
- };
-
- val = val / 1000000;
- var hour = parseInt(val / 3600);
- var min = parseInt(val % 3600 / 60);
- var sec = parseInt(val % 60);
- return `${hour}:${print(min)}:${print(sec)}`;
- }
-}
-
-function requestSinkState(id) {
- if (OperationState.op && OperationState.op.id == id)
- OperationState.op.requestSinkState();
-}
-
-function requestScanState(id) {
- if (OperationState.op && OperationState.op.id == id)
- OperationState.op.requestScanState();
-}
-
-function requestStreamState(id) {
- if (OperationState.op && OperationState.op.id == id)
- OperationState.op.requestStreamState();
-}
-
-function onOperationLoaded(id, data) {
- if (OperationState.id != id)
- return;
-
- OperationState.loading = false;
-
- if (data['Status']['Code'] != 'SUCCESS') {
- onOperationFailed(id, data);
- return;
- }
-
- $('#ds-op-error').html('');
-
- if (OperationState.op) {
- if (OperationState.op.id != id) {
- OperationState.op.remove();
- OperationState.op = new Operation(data);
- } else {
- OperationState.op.updateBasicInfo(data);
- }
- } else {
- OperationState.op = new Operation(data);
- }
-
- scheduleLoadOperation(OperationState.fetchInterval);
-}
-
-function onOperationFailed(id, data) {
- if (OperationState.id != id)
- return;
-
- OperationState.loading = false;
-
- if (data && data['Status'] && data['Status']['Issues'])
- $('#ds-op-error').html(JSON.stringify(data['Status']['Issues']));
- else {
- var error = "Cannot load operation " + id;
- if (data && data['Status'])
- error += ": " + data['Status']['Code'];
- $('#ds-op-error').html(error);
- }
-
- if (data && data['Status'] && data['Status']['Code'] == 'NOT_FOUND')
- return;
-
- scheduleLoadOperation(OperationState.retryInterval);
-}
-
-function loadOperation(id) {
- if (OperationState.id != id) {
- if (Operation.op) {
- Operaiton.op.remove();
- Operaiton.op = undefined;
- }
- OperationState.id = id;
- OperationState.loading = false;
- } else {
- if (OperationState.loading)
- return;
- }
-
- if (!$('#ds-op-link').hasClass('active'))
- return;
-
- if (!OperationState.id)
- return;
-
- OperationState.loading = true;
- var url = '../cms/api/datashard/json/getoperation?tabletid=' + TabletId
- + '&opid=' + OperationState.id;
- $.get(url)
- .done(function(data) { onOperationLoaded(id, data);})
- .fail(function(data) { onOperationFailed(id, data);});
-}
-
-function scheduledLoadOperation() {
- OperationState.scheduledLoad = false;
- if (OperationState.id)
- loadOperation(OperationState.id);
-}
-
-function scheduleLoadOperation(timeout) {
- if (OperationState.scheduledLoad)
- return;
- OperationState.scheduledLoad = true;
- setTimeout(scheduledLoadOperation, timeout);
-}
-
-function initOperationTab() {
- $(document).on('shown.bs.tab', '', function(e) {
- if (Parameters.op)
- OperationState.id = Parameters.op;
- if (OperationState.op)
- OperationState.op.onTabShown();
- scheduleLoadOperation(0);
- });
-
- $('#ds-op').find('[data-action="show"]').click(function() {
- var id = $('#ds-op-id-input').val();
- if (!id) {
- $('#ds-op-error').html('Operation id is empty');
- return;
- }
-
- setHashParam('op', id);
-
- $('#ds-op-error').html('');
- loadOperation(id);
- });
-}
+'use strict';
+
+var OperationState = {
+ fetchInterval: 5000,
+ retryInterval: 5000,
+ sinkStateFetchInterval: 5000,
+ sinkStateRetryInterval: 5000,
+ scanStateFetchInterval: 5000,
+ scanStateRetryInterval: 5000,
+ streamStateFetchInterval: 5000,
+ streamStateRetryInterval: 5000,
+ loading: false,
+ scheduledLoad: false,
+ id: undefined,
+ op: undefined,
+};
+
+function showOp(id) {
+ setHashParam('op', id);
+
+ if (!$('#ds-op-link').hasClass('active')) {
+ $('#ds-op-link').tab('show')
+ } else {
+ $('#ds-op-error').html('');
+ loadOperation(id);
+ }
+}
+
+class Operation {
+ constructor(info) {
+ this.id = info.BasicInfo.TxId;
+ this._createView();
+ this.updateBasicInfo(info);
+ }
+
+ updateBasicInfo(info) {
+ this.info = info;
+
+ $('#ds-op-info-id').text(info.BasicInfo.TxId);
+ $('#ds-op-info-step').text(info.BasicInfo.Step);
+ $('#ds-op-info-kind').text(info.BasicInfo.Kind);
+ $('#ds-op-info-received-at').text(timeToString(info.BasicInfo.ReceivedAt));
+ $('#ds-op-info-min-step').text(info.BasicInfo.MinStep);
+ $('#ds-op-info-max-step').text(info.BasicInfo.MaxStep);
+ $('#ds-op-info-flags').text(info.BasicInfo.Flags.join(", "));
+
+ // Fill execution plan.
+ var profile = new Map();
+ if (info.ExecutionProfile.UnitProfiles) {
+ for (var unit of info.ExecutionProfile.UnitProfiles) {
+ var total = unit.WaitTime + unit.ExecuteTime + unit.CommitTime
+ + unit.CompleteTime;
+
+ var p = {};
+ p.total = durationToStringMs(total);
+ p.wait = durationToStringMs(unit.WaitTime);
+ p.execute = durationToStringMs(unit.ExecuteTime);
+ p.commit = durationToStringMs(unit.CommitTime);
+ p.complete = durationToStringMs(unit.CompleteTime);
+ p.show = $('#ds-op-unit-ptofile-' + unit.UnitKind).hasClass('show');
+ p.count = unit.ExecuteCount;
+
+ profile.set(unit.UnitKind, p);
+ }
+ }
+
+ $('#ds-op-plan-body').html('');
+ var cur = info.ExecutionPlan.CurrentUnit;
+ for (var i = 0; i < info.ExecutionPlan.Units.length; ++i) {
+ var unit = info.ExecutionPlan.Units[i];
+ var unitCl = i < cur ? "ds-plan-executed" : (i == cur ? "ds-plan-executing" : "ds-plan-to-execute");
+ var p = profile.has(unit) ? profile.get(unit) : {};
+ var trHtml = `
+ <tr class="ds-info">
+ <td class="ds-info va-top ${unitCl}">${unit}</td>
+ <td>
+ <a data-toggle="collapse" href="#ds-op-unit-ptofile-${unit}">${p.total}</a><br>
+ <div class="collapse ${p.show ? "show" : ""}" id="ds-op-unit-ptofile-${unit}">
+ Wait: ${p.wait}<br>
+ Execute (${p.count}): ${p.execute}</br>
+ Commit: ${p.commit}</br>
+ Complete: ${p.complete}</br>
+ </div>
+ </td>
+ </tr>
+ `;
+ $(trHtml).appendTo($('#ds-op-plan-body'));
+ }
+
+ $('#ds-op-dependencies-body').html('');
+ $('#ds-op-dependents-body').html('');
+ if (info.Dependencies) {
+ this._addDeps(info.Dependencies.Dependencies, $('#ds-op-dependencies-body'));
+ this._addDeps(info.Dependencies.Dependents, $('#ds-op-dependents-body'));
+ }
+
+ if (info.InputData && info.InputData.InputRS) {
+ $('#ds-op-input-rs').show();
+ $('#ds-op-input-rs-body').html('');
+
+ for (var rs of info.InputData.InputRS) {
+ var trHtml = `
+ <tr class="ds-info">
+ <td class="ds-info"><a href="app?TabletID=${rs.From}">${rs.From}</td>
+ <td class="ds-info">${rs.Received} received</td>
+ </tr>
+ `;
+ $(trHtml).appendTo($('#ds-op-input-rs-body'));
+ }
+ var trHtml = `
+ <tr class="ds-info">
+ <td class="ds-info">Total remains</td>
+ <td class="ds-info">${info.InputData.RemainedInputRS}</td>
+ </tr>
+ `;
+ $(trHtml).appendTo($('#ds-op-input-rs-body'));
+ } else {
+ $('#ds-op-input-rs').hide();
+ }
+
+ if (info.ReadTableState) {
+ $('#ds-op-readtable').show();
+
+ $('#ds-op-readtable-table').text(info.ReadTableState.TableId);
+ $('#ds-op-readtable-snapshot').text(info.ReadTableState.SnapshotId);
+ $('#ds-op-readtable-scan-task').text(info.ReadTableState.ScanTaskId);
+ $('#ds-op-readtable-sink').text(info.ReadTableState.SinkActor);
+ $('#ds-op-readtable-scan-actor').text(info.ReadTableState.ScanActor);
+ } else {
+ $('#ds-op-readtable').hide();
+ }
+ }
+
+
+ remove() {
+ $('#ds-op-info').html('');
+ }
+
+ onTabShown() {
+ if (this.requestedSinkState)
+ this._scheduleLoadSinkState();
+ if (this.requestedScanState)
+ this._scheduleLoadScanState();
+ if (this.requestedStreamState)
+ this._scheduleLoadStreamState();
+ }
+
+ requestScanState() {
+ this.requestedScanState = true;
+ $('#ds-op-scan-state-div').show();
+ this._scheduleLoadScanState(0);
+ }
+
+ requestSinkState() {
+ this.requestedSinkState = true;
+ $('#ds-op-sink-state-div').show();
+ this._scheduleLoadSinkState(0);
+ }
+
+ requestStreamState() {
+ this.requestedStreamState = true;
+ $('#ds-op-stream-state-div').show();
+ this._scheduleLoadStreamState(0);
+ }
+
+ _addDeps(deps, body) {
+ if (!deps) {
+ var trHtml = `
+ <tr class="ds-info">
+ <td class="ds-info">None</td>
+ </tr>
+ `;
+ $(trHtml).appendTo(body);
+ return;
+ }
+
+ for (var dep of deps) {
+ var trHtml = `
+ <tr class="ds-info">
+ <td class="ds-info"><a href="#page=ds-op&op=${dep.Target}" onclick="showOp(${dep.Target})">${dep.Target}</a></td>
+ <td class="ds-info">${dep.Types.join(", ")}</td>
+ </tr>
+ `;
+ $(trHtml).appendTo(body);
+ }
+ }
+
+ _createView() {
+ var html = `
+ <div class="row">
+ <div class="col">
+ <table class="ds-info">
+ <caption class="ds-info">Basic info</caption>
+ <tbody class="ds-info">
+ <tr class="ds-info">
+ <td class="ds-info">TxId</td>
+ <td class="ds-info" id="ds-op-info-id"></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Step</td>
+ <td class="ds-info" id="ds-op-info-step"></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Kind</td>
+ <td class="ds-info" id="ds-op-info-kind"></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">ReceivedAt</td>
+ <td class="ds-info" id="ds-op-info-received-at"></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">MinStep</td>
+ <td class="ds-info" id="ds-op-info-min-step"></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">MaxStep</td>
+ <td class="ds-info" id="ds-op-info-max-step"></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Flags</td>
+ <td class="ds-info" id="ds-op-info-flags"></td>
+ </tr>
+ </tbody>
+ </table>
+ <table class="ds-info">
+ <caption class="ds-info">Execution plan</caption>
+ <tbody class="ds-info" id="ds-op-plan-body">
+ </tbody>
+ </table>
+ </div>
+ <div class="col">
+ <table class="ds-info" id="ds-op-input-rs">
+ <caption class="ds-info">Input read sets</caption>
+ <tbody class="ds-info" id="ds-op-input-rs-body">
+ </tbody>
+ </table>
+ <table class="ds-info">
+ <caption class="ds-info">Dependencies</caption>
+ <tbody class="ds-info" id="ds-op-dependencies-body">
+ </tbody>
+ </table>
+ <table class="ds-info">
+ <caption class="ds-info">Dependent operations</caption>
+ <tbody class="ds-info" id="ds-op-dependents-body">
+ </tbody>
+ </table>
+ <table class="ds-info" id="ds-op-readtable">
+ <caption class="ds-info">ReadTable state</caption>
+ <tbody class="ds-info">
+ <tr class="ds-info">
+ <td class="ds-info">Table ID</td>
+ <td class="ds-info" id="ds-op-readtable-table"></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Snapshot ID</td>
+ <td class="ds-info" id="ds-op-readtable-snapshot"></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Scan task ID</td>
+ <td class="ds-info" id="ds-op-readtable-scan-task"></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Sink actor</td>
+ <td class="ds-info" id="ds-op-readtable-sink"></td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Scan actor</td>
+ <td class="ds-info" id="ds-op-readtable-scan-actor"></td>
+ </tr>
+ </tbody>
+ <tfoot class="ds-info">
+ <tr class="ds-info">
+ <td class="ds-info" colspan="2">
+ <button class="btn btn-primary btn-sm" onclick="requestScanState(${this.id})">Get scan state</button>
+ <button class="btn btn-primary btn-sm" onclick="requestSinkState(${this.id})">Get proxy state</button>
+ <button class="btn btn-primary btn-sm" onclick="requestStreamState(${this.id})">Get stream state</button>
+ </td>
+ </tr>
+ </tfoot>
+ </table>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col" style="display: none;" id="ds-op-scan-state-div">
+ <div class="error" id="ds-op-scan-state-error"></div>
+ <table class="ds-info" id="ds-op-readtable">
+ <caption class="ds-info">Scan actor state</caption>
+ <tbody class="ds-info">
+ <tr class="ds-info">
+ <td class="ds-info">Message quota</td>
+ <td class="ds-info" id="ds-op-scan-quota">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Message size limit</td>
+ <td class="ds-info" id="ds-op-scan-size-limit">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Message rows limit</td>
+ <td class="ds-info" id="ds-op-scan-rows-limit">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Pending acks</td>
+ <td class="ds-info" id="ds-op-scan-pending-acks">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Result size</td>
+ <td class="ds-info" id="ds-op-scan-res-size">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Result rows</td>
+ <td class="ds-info" id="ds-op-scan-res-rows">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Has upper border</td>
+ <td class="ds-info" id="ds-op-scan-upper">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Finished</td>
+ <td class="ds-info" id="ds-op-scan-finished">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Error</td>
+ <td class="ds-info" id="ds-op-scan-error">Loading...</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div class="col" style="display: none;" id="ds-op-sink-state-div">
+ <div class="error" id="ds-op-sink-state-error"></div>
+ <table class="ds-info" id="ds-op-readtable">
+ <caption class="ds-info">Proxy actor state</caption>
+ <tbody class="ds-info">
+ <tr class="ds-info">
+ <td class="ds-info">TxId</td>
+ <td class="ds-info" id="ds-op-sink-txid">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Accepted</td>
+ <td class="ds-info" id="ds-op-sink-accepted">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">ResolveStarted</td>
+ <td class="ds-info" id="ds-op-sink-resolve-started">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Resolved</td>
+ <td class="ds-info" id="ds-op-sink-resolved">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Prepared</td>
+ <td class="ds-info" id="ds-op-sink-prepared">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Planned</td>
+ <td class="ds-info" id="ds-op-sink-planned">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Timeout</td>
+ <td class="ds-info" id="ds-op-sink-timeout">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Coordinator</td>
+ <td class="ds-info" id="ds-op-sink-coordinator">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Request source</td>
+ <td class="ds-info" id="ds-op-sink-source">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Request version</td>
+ <td class="ds-info" id="ds-op-sink-request-version">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Response version</td>
+ <td class="ds-info" id="ds-op-sink-response-version">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info va-top">Clearance requests</td>
+ <td class="ds-info" id="ds-op-sink-clearance">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info va-top">Quota requests</td>
+ <td class="ds-info" id="ds-op-sink-quota">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info va-top">Streaming shards</td>
+ <td class="ds-info" id="ds-op-sink-streaming">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info va-top">Shards queue</td>
+ <td class="ds-info" id="ds-op-sink-queue">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Ordered</td>
+ <td class="ds-info" id="ds-op-sink-ordered">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Limited</td>
+ <td class="ds-info" id="ds-op-sink-limited">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Rows remain</td>
+ <td class="ds-info" id="ds-op-sink-remain">Loading...</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div class="col" style="display: none;" id="ds-op-stream-state-div">
+ <div class="error" id="ds-op-stream-state-error"></div>
+ <table class="ds-info" id="ds-op-readtable">
+ <caption class="ds-info">Stream actor state</caption>
+ <tbody class="ds-info">
+ <tr class="ds-info">
+ <td class="ds-info">Ready</td>
+ <td class="ds-info" id="ds-op-stream-ready">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Finished</td>
+ <td class="ds-info" id="ds-op-stream-finished">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Responses in queue</td>
+ <td class="ds-info" id="ds-op-stream-queue">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info va-top">Quota requests</td>
+ <td class="ds-info" id="ds-op-stream-requests">Loading...</td>
+ </tr>
+ <tr class="ds-info va-top">
+ <td class="ds-info">Shard quotas</td>
+ <td class="ds-info" id="ds-op-stream-quotas">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Quota limit</td>
+ <td class="ds-info" id="ds-op-stream-limit">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Quota reserved</td>
+ <td class="ds-info" id="ds-op-stream-reserved">Loading...</td>
+ </tr>
+ <tr class="ds-info va-top">
+ <td class="ds-info">Released shards</td>
+ <td class="ds-info" id="ds-op-stream-released">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Client stream timeout</td>
+ <td class="ds-info" id="ds-op-stream-client-timeout">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Server stream timeout</td>
+ <td class="ds-info" id="ds-op-stream-server-timeout">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Last data stream</td>
+ <td class="ds-info" id="ds-op-stream-last-stream">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Last status</td>
+ <td class="ds-info" id="ds-op-stream-last-status">Loading...</td>
+ </tr>
+ </tbody>
+ </table>
+ <div id="ds-op-stream-state"></div>
+ </div>
+ </div>
+ `;
+ $(html).appendTo($('#ds-op-info'));
+ }
+
+ _maybeGetScanStateLink(state) {
+ if (state.ScanActor)
+ return `(<a onclick="requestScanState(${this.id})">get state</a>)`;
+ return "";
+ }
+
+ _updateSinkInfo(info) {
+ $('#ds-op-sink-txid').html(info.TxId);
+ $('#ds-op-sink-accepted').html(timeToString(info.WallClockAccepted));
+ $('#ds-op-sink-resolve-started').html(timeToString(info.WallClockResolveStarted));
+ $('#ds-op-sink-resolved').html(timeToString(info.WallClockResolved));
+ $('#ds-op-sink-prepared').html(timeToString(info.WallClockPrepared));
+ $('#ds-op-sink-planned').html(timeToString(info.WallClockPlanned));
+ $('#ds-op-sink-timeout').html(this._durationToString(info.ExecTimeoutPeriod));
+ $('#ds-op-sink-coordinator').html(`<a href="../tablets?TabletID=${info.SelectedCoordinator}">${info.SelectedCoordinator}</a>`);
+ $('#ds-op-sink-source').html(info.RequestSource);
+ $('#ds-op-sink-request-version').html(info.RequestVersion);
+ $('#ds-op-sink-response-version').html(info.ResponseVersion);
+ $('#ds-op-sink-clearance').html(this._makeShardsList(info.ClearanceRequests));
+ $('#ds-op-sink-quota').html(this._makeShardsList(info.QuotaRequests));
+ $('#ds-op-sink-streaming').html(this._makeShardsList(info.StreamingRequests));
+ $('#ds-op-sink-queue').html(this._makeShardsList(info.ShardsQueue));
+ $('#ds-op-sink-ordered').html(info.Ordered.toString());
+ $('#ds-op-sink-limited').html(info.RowsLimited.toString());
+ $('#ds-op-sink-remain').html(info.RowsRemain);
+ }
+
+ _updateScanInfo(info) {
+ $('#ds-op-scan-quota').html(info.MessageQuota);
+ $('#ds-op-scan-size-limit').html(info.MessageSizeLimit);
+ $('#ds-op-scan-rows-limit').html(info.RowsLimit);
+ $('#ds-op-scan-pending-acks').html(info.PendingAcks);
+ $('#ds-op-scan-res-size').html(info.ResultSize);
+ $('#ds-op-scan-res-rows').html(info.ResultRows);
+ $('#ds-op-scan-upper').html(info.HasUpperBorder.toString());
+ $('#ds-op-scan-finished').html(info.Finished.toString());
+ $('#ds-op-scan-error').html(info.Error);
+ }
+
+ _updateStreamInfo(info) {
+ $('#ds-op-stream-ready').html(info.Ready === undefined ? 'unknown' : info.Ready.toString());
+ $('#ds-op-stream-finished').html(info.Finished === undefined ? 'unknown' : info.Finished.toString());
+ $('#ds-op-stream-queue').html(info.ResponseQueueSize);
+ $('#ds-op-stream-requests').html(this._makeShardsList(info.QuotaRequests));
+ $('#ds-op-stream-quotas').html(this._makeShardQuotasList(info.ShardQuotas));
+ $('#ds-op-stream-limit').html(info.QuotaLimit);
+ $('#ds-op-stream-reserved').html(info.QuotaReserved);
+ $('#ds-op-stream-released').html(this._makeShardsList(info.ReleasedShards));
+ $('#ds-op-stream-client-timeout').html(this._durationToString(info.InactiveClientTimeout));
+ $('#ds-op-stream-server-timeout').html(this._durationToString(info.InactiveServerTimeout));
+ $('#ds-op-stream-last-stream').html(timeToString(info.LastDataStreamTimestamp));
+ $('#ds-op-stream-last-status').html(timeToString(info.LastStatusTimestamp));
+ }
+
+ _makeShardsList(shards) {
+ if (!shards)
+ return '';
+
+ var res = '';
+ for (var shard of shards) {
+ res += `<a href="app?TabletID=${shard.Id}#page=ds-op&op=${this.id}">${shard.Id}</a><br>`;
+ }
+
+ return res;
+ }
+
+ _makeShardQuotasList(quotas) {
+ if (!quotas)
+ return '';
+
+ var res = '';
+ for (var quota of quotas) {
+ res += `<a href="app?TabletID=${quota.ShardId}#page=ds-op&op=${this.id}">${quota.ShardId} (${quota.Quota})</a><br>`;
+ }
+
+ return res;
+ }
+
+ // Load sink state
+ _onSinkStateLoaded(data) {
+ if (OperationState.id != this.id)
+ return;
+
+ this.loadingSinkState = false;
+
+ if (data['Status']['Code'] != 'SUCCESS') {
+ this._onSinkStateFailed(data);
+ return;
+ }
+
+ $('#ds-op-sink-state-error').html('');
+
+ this._updateSinkInfo(data);
+
+ this._scheduleLoadSinkState(OperationState.sinkStateFetchInterval);
+ }
+
+ _onSinkStateFailed(data) {
+ if (OperationState.id != this.id)
+ return;
+
+ this.loadingSinkState = false;
+
+ if (data && data['Status'] && data['Status']['Issues'])
+ $('#ds-op-sink-state-error').html(JSON.stringify(data['Status']['Issues']));
+ else
+ $('#ds-op-sink-state-error').html("Cannot load proxy actor state " + this.id);
+ this._scheduleLoadSinkState(OperationState.sinkStateRetryInterval);
+ }
+
+ _loadSinkState() {
+ if (OperationState.id != this.id)
+ return;
+
+ if (this.loadingSinkState)
+ return;
+
+ if (!$('#ds-op-link').hasClass('active'))
+ return;
+
+ this.loadingSinkState = true;
+ var _this = this;
+ var url = '../cms/api/datashard/json/getreadtablesinkstate?tabletid=' + TabletId
+ + '&opid=' + this.id;
+ $.get(url)
+ .done(function(data) { _this._onSinkStateLoaded(data); })
+ .fail(function(data) { _this._onSinkStateFailed(data); });
+ }
+
+ _scheduleLoadSinkState(timeout) {
+ if (this.scheduledLoadSinkState)
+ return;
+
+ this.scheduledLoadSinkState = true;
+
+ var _this = this;
+ setTimeout(function() {
+ _this.scheduledLoadSinkState = false;
+ _this._loadSinkState();
+ }, timeout);
+ }
+
+ // Load scan state
+ _onScanStateLoaded(data) {
+ if (OperationState.id != this.id)
+ return;
+
+ this.loadingScanState = false;
+
+ if (data['Status']['Code'] != 'SUCCESS') {
+ this._onScanStateFailed(data);
+ return;
+ }
+
+ $('#ds-op-scan-state-error').html('');
+
+ this._updateScanInfo(data);
+
+ this._scheduleLoadScanState(OperationState.scanStateFetchInterval);
+ }
+
+ _onScanStateFailed(data) {
+ if (OperationState.id != this.id)
+ return;
+
+ this.loadingScanState = false;
+
+ if (data && data['Status'] && data['Status']['Issues'])
+ $('#ds-op-scan-state-error').html(JSON.stringify(data['Status']['Issues']));
+ else
+ $('#ds-op-scan-state-error').html("Cannot load scan actor state " + this.id);
+ this._scheduleLoadScanState(OperationState.scanStateRetryInterval);
+ }
+
+ _loadScanState() {
+ if (OperationState.id != this.id)
+ return;
+
+ if (this.loadingScanState)
+ return;
+
+ if (!$('#ds-op-link').hasClass('active'))
+ return;
+
+ this.loadingScanState = true;
+ var _this = this;
+ var url = '../cms/api/datashard/json/getreadtablescanstate?tabletid=' + TabletId
+ + '&opid=' + this.id;
+ $.get(url)
+ .done(function(data) { _this._onScanStateLoaded(data); })
+ .fail(function(data) { _this._onScanStateFailed(data); });
+ }
+
+ _scheduleLoadScanState(timeout) {
+ if (this.scheduledLoadScanState)
+ return;
+
+ this.scheduledLoadScanState = true;
+
+ var _this = this;
+ setTimeout(function() {
+ _this.scheduledLoadScanState = false;
+ _this._loadScanState();
+ }, timeout);
+ }
+
+ // Load stream state
+ _onStreamStateLoaded(data) {
+ if (OperationState.id != this.id)
+ return;
+
+ this.loadingStreamState = false;
+
+ if (data['Status']['Code'] != 'SUCCESS') {
+ this._onStreamStateFailed(data);
+ return;
+ }
+
+ $('#ds-op-stream-state-error').html('');
+
+ this._updateStreamInfo(data);
+
+ this._scheduleLoadStreamState(OperationState.streamStateFetchInterval);
+ }
+
+ _onStreamStateFailed(data) {
+ if (OperationState.id != this.id)
+ return;
+
+ this.loadingStreamState = false;
+
+ if (data && data['Status'] && data['Status']['Issues'])
+ $('#ds-op-stream-state-error').html(JSON.stringify(data['Status']['Issues']));
+ else
+ $('#ds-op-stream-state-error').html("Cannot load stream actor state " + this.id);
+ this._scheduleLoadStreamState(OperationState.streamStateRetryInterval);
+ }
+
+ _loadStreamState() {
+ if (OperationState.id != this.id)
+ return;
+
+ if (this.loadingStreamState)
+ return;
+
+ if (!$('#ds-op-link').hasClass('active'))
+ return;
+
+ this.loadingStreamState = true;
+ var _this = this;
+ var url = '../cms/api/datashard/json/getreadtablestreamstate?tabletid=' + TabletId
+ + '&opid=' + this.id;
+ $.get(url)
+ .done(function(data) { _this._onStreamStateLoaded(data); })
+ .fail(function(data) { _this._onStreamStateFailed(data); });
+ }
+
+ _scheduleLoadStreamState(timeout) {
+ if (this.scheduledLoadStreamState)
+ return;
+
+ this.scheduledLoadStreamState = true;
+
+ var _this = this;
+ setTimeout(function() {
+ _this.scheduledLoadStreamState = false;
+ _this._loadStreamState();
+ }, timeout);
+ }
+
+ _durationToString(val) {
+ var print = function(v) {
+ if (v >= 10)
+ return v.toString();
+ return '0' + v;
+ };
+
+ val = val / 1000000;
+ var hour = parseInt(val / 3600);
+ var min = parseInt(val % 3600 / 60);
+ var sec = parseInt(val % 60);
+ return `${hour}:${print(min)}:${print(sec)}`;
+ }
+}
+
+function requestSinkState(id) {
+ if (OperationState.op && OperationState.op.id == id)
+ OperationState.op.requestSinkState();
+}
+
+function requestScanState(id) {
+ if (OperationState.op && OperationState.op.id == id)
+ OperationState.op.requestScanState();
+}
+
+function requestStreamState(id) {
+ if (OperationState.op && OperationState.op.id == id)
+ OperationState.op.requestStreamState();
+}
+
+function onOperationLoaded(id, data) {
+ if (OperationState.id != id)
+ return;
+
+ OperationState.loading = false;
+
+ if (data['Status']['Code'] != 'SUCCESS') {
+ onOperationFailed(id, data);
+ return;
+ }
+
+ $('#ds-op-error').html('');
+
+ if (OperationState.op) {
+ if (OperationState.op.id != id) {
+ OperationState.op.remove();
+ OperationState.op = new Operation(data);
+ } else {
+ OperationState.op.updateBasicInfo(data);
+ }
+ } else {
+ OperationState.op = new Operation(data);
+ }
+
+ scheduleLoadOperation(OperationState.fetchInterval);
+}
+
+function onOperationFailed(id, data) {
+ if (OperationState.id != id)
+ return;
+
+ OperationState.loading = false;
+
+ if (data && data['Status'] && data['Status']['Issues'])
+ $('#ds-op-error').html(JSON.stringify(data['Status']['Issues']));
+ else {
+ var error = "Cannot load operation " + id;
+ if (data && data['Status'])
+ error += ": " + data['Status']['Code'];
+ $('#ds-op-error').html(error);
+ }
+
+ if (data && data['Status'] && data['Status']['Code'] == 'NOT_FOUND')
+ return;
+
+ scheduleLoadOperation(OperationState.retryInterval);
+}
+
+function loadOperation(id) {
+ if (OperationState.id != id) {
+ if (Operation.op) {
+ Operaiton.op.remove();
+ Operaiton.op = undefined;
+ }
+ OperationState.id = id;
+ OperationState.loading = false;
+ } else {
+ if (OperationState.loading)
+ return;
+ }
+
+ if (!$('#ds-op-link').hasClass('active'))
+ return;
+
+ if (!OperationState.id)
+ return;
+
+ OperationState.loading = true;
+ var url = '../cms/api/datashard/json/getoperation?tabletid=' + TabletId
+ + '&opid=' + OperationState.id;
+ $.get(url)
+ .done(function(data) { onOperationLoaded(id, data);})
+ .fail(function(data) { onOperationFailed(id, data);});
+}
+
+function scheduledLoadOperation() {
+ OperationState.scheduledLoad = false;
+ if (OperationState.id)
+ loadOperation(OperationState.id);
+}
+
+function scheduleLoadOperation(timeout) {
+ if (OperationState.scheduledLoad)
+ return;
+ OperationState.scheduledLoad = true;
+ setTimeout(scheduledLoadOperation, timeout);
+}
+
+function initOperationTab() {
+ $(document).on('shown.bs.tab', '', function(e) {
+ if (Parameters.op)
+ OperationState.id = Parameters.op;
+ if (OperationState.op)
+ OperationState.op.onTabShown();
+ scheduleLoadOperation(0);
+ });
+
+ $('#ds-op').find('[data-action="show"]').click(function() {
+ var id = $('#ds-op-id-input').val();
+ if (!id) {
+ $('#ds-op-error').html('Operation id is empty');
+ return;
+ }
+
+ setHashParam('op', id);
+
+ $('#ds-op-error').html('');
+ loadOperation(id);
+ });
+}
diff --git a/ydb/core/cms/ui/datashard_ops_list.js b/ydb/core/cms/ui/datashard_ops_list.js
index e3b8afd9f15..91c15b93927 100644
--- a/ydb/core/cms/ui/datashard_ops_list.js
+++ b/ydb/core/cms/ui/datashard_ops_list.js
@@ -1,130 +1,130 @@
-'use strict';
-
-var OperationsListState = {
- fetchInterval: 5000,
- retryInterval: 5000,
- loading: false,
- scheduledLoad: false,
- ops: new Map(),
-};
-
-class OperationInfo {
- constructor(info) {
- var trHtml = this._makeTrHtml(info);
- $(trHtml).appendTo($('#ds-ops-list-body'));
-
- this.txId = info.TxId;
- }
-
- update(info) {
- $('#ds-ops-list-row-' + this.txId).replaceWith(this._makeTrHtml(info));
- }
-
- remove() {
- $('#ds-ops-list-row-' + this.txId).remove();
- }
-
- _makeTrHtml(info) {
- return `
- <tr id="ds-ops-list-row-${info.TxId}">
- <td><a href="#page=ds-op&op=${info.TxId}" onclick="showOp(${info.TxId})">${info.TxId}</a></td>
- <td>${info.Step}</td>
- <td>${info.Kind}</td>
- <td>${info.IsImmediate}</td>
- <td>${info.IsReadOnly}</td>
- <td>${info.IsWaiting}</td>
- <td>${info.IsExecuting}</td>
- <td>${info.IsCompleted}</td>
- <td>${info.ExecutionUnit}</td>
- <td>${timeToString(info.ReceivedAt)}</td>
- </tr>
- `;
- }
-}
-
-function onOperationsListLoaded(data) {
- OperationsListState.loading = false;
-
- if (data['Status']['Code'] != 'SUCCESS') {
- onOperationsListFailed(data);
- return;
- }
-
- $('#ds-ops-list-error').html('');
-
- var ops = new Set();
- if (data.Operations) {
- for (var op of data.Operations) {
- ops.add(op.TxId);
- if (OperationsListState.ops.has(op.TxId)) {
- OperationsListState.ops.get(op.TxId).update(op);
- } else {
- OperationsListState.ops.set(op.TxId, new OperationInfo(op));
- }
- }
- }
-
- var toRemove = [];
- for (var txId of OperationsListState.ops.keys()) {
- if (!ops.has(txId))
- toRemove.push(txId);
- }
-
- for (var txId of toRemove) {
- OperationsListState.ops.get(txId).remove();
- OperationsListState.ops.delete(txId);
- }
-
- $('#ds-ops-list-table').trigger('update', [true]);
-
- scheduleLoadOperationsList(OperationsListState.fetchInterval);
-}
-
-function onOperationsListFailed(data) {
- OperationsListState.loading = false;
-
- if (data && data['Status'] && data['Status']['Issues'])
- $('#ds-ops-list-error').html(JSON.stringify(data['Status']['Issues']));
- else
- $('#ds-ops-list-error').html("Cannot get operations list");
- scheduleLoadOperationsList(OperationsListState.retryInterval);
-}
-
-function loadOperationsList() {
- if (OperationsListState.loading)
- return;
-
- if (!$('#ds-ops-list-link').hasClass('active'))
- return;
-
- OperationsListState.loading = true;
- var url = '../cms/api/datashard/json/listoperations?tabletid=' + TabletId;
- $.get(url).done(onOperationsListLoaded).fail(onOperationsListFailed);
-}
-
-function scheduledLoadOperationsList() {
- OperationsListState.scheduledLoad = false;
- loadOperationsList();
-}
-
-function scheduleLoadOperationsList(timeout) {
- if (OperationsListState.scheduledLoad)
- return;
- OperationsListState.scheduledLoad = true;
- setTimeout(scheduledLoadOperationsList, timeout);
-}
-
-function initOperationsListTab() {
- $(document).on('shown.bs.tab', '', function(e) {
- if (e.target.id == 'ds-ops-list-link') {
- $('#ds-ops-list-table').tablesorter({
- theme: 'blue',
- sortList: [[0,0]],
- widgets : ['zebra', 'filter'],
- });
- scheduleLoadOperationsList(0);
- }
- });
-
- loadOperationsList();
-}
+'use strict';
+
+var OperationsListState = {
+ fetchInterval: 5000,
+ retryInterval: 5000,
+ loading: false,
+ scheduledLoad: false,
+ ops: new Map(),
+};
+
+class OperationInfo {
+ constructor(info) {
+ var trHtml = this._makeTrHtml(info);
+ $(trHtml).appendTo($('#ds-ops-list-body'));
+
+ this.txId = info.TxId;
+ }
+
+ update(info) {
+ $('#ds-ops-list-row-' + this.txId).replaceWith(this._makeTrHtml(info));
+ }
+
+ remove() {
+ $('#ds-ops-list-row-' + this.txId).remove();
+ }
+
+ _makeTrHtml(info) {
+ return `
+ <tr id="ds-ops-list-row-${info.TxId}">
+ <td><a href="#page=ds-op&op=${info.TxId}" onclick="showOp(${info.TxId})">${info.TxId}</a></td>
+ <td>${info.Step}</td>
+ <td>${info.Kind}</td>
+ <td>${info.IsImmediate}</td>
+ <td>${info.IsReadOnly}</td>
+ <td>${info.IsWaiting}</td>
+ <td>${info.IsExecuting}</td>
+ <td>${info.IsCompleted}</td>
+ <td>${info.ExecutionUnit}</td>
+ <td>${timeToString(info.ReceivedAt)}</td>
+ </tr>
+ `;
+ }
+}
+
+function onOperationsListLoaded(data) {
+ OperationsListState.loading = false;
+
+ if (data['Status']['Code'] != 'SUCCESS') {
+ onOperationsListFailed(data);
+ return;
+ }
+
+ $('#ds-ops-list-error').html('');
+
+ var ops = new Set();
+ if (data.Operations) {
+ for (var op of data.Operations) {
+ ops.add(op.TxId);
+ if (OperationsListState.ops.has(op.TxId)) {
+ OperationsListState.ops.get(op.TxId).update(op);
+ } else {
+ OperationsListState.ops.set(op.TxId, new OperationInfo(op));
+ }
+ }
+ }
+
+ var toRemove = [];
+ for (var txId of OperationsListState.ops.keys()) {
+ if (!ops.has(txId))
+ toRemove.push(txId);
+ }
+
+ for (var txId of toRemove) {
+ OperationsListState.ops.get(txId).remove();
+ OperationsListState.ops.delete(txId);
+ }
+
+ $('#ds-ops-list-table').trigger('update', [true]);
+
+ scheduleLoadOperationsList(OperationsListState.fetchInterval);
+}
+
+function onOperationsListFailed(data) {
+ OperationsListState.loading = false;
+
+ if (data && data['Status'] && data['Status']['Issues'])
+ $('#ds-ops-list-error').html(JSON.stringify(data['Status']['Issues']));
+ else
+ $('#ds-ops-list-error').html("Cannot get operations list");
+ scheduleLoadOperationsList(OperationsListState.retryInterval);
+}
+
+function loadOperationsList() {
+ if (OperationsListState.loading)
+ return;
+
+ if (!$('#ds-ops-list-link').hasClass('active'))
+ return;
+
+ OperationsListState.loading = true;
+ var url = '../cms/api/datashard/json/listoperations?tabletid=' + TabletId;
+ $.get(url).done(onOperationsListLoaded).fail(onOperationsListFailed);
+}
+
+function scheduledLoadOperationsList() {
+ OperationsListState.scheduledLoad = false;
+ loadOperationsList();
+}
+
+function scheduleLoadOperationsList(timeout) {
+ if (OperationsListState.scheduledLoad)
+ return;
+ OperationsListState.scheduledLoad = true;
+ setTimeout(scheduledLoadOperationsList, timeout);
+}
+
+function initOperationsListTab() {
+ $(document).on('shown.bs.tab', '', function(e) {
+ if (e.target.id == 'ds-ops-list-link') {
+ $('#ds-ops-list-table').tablesorter({
+ theme: 'blue',
+ sortList: [[0,0]],
+ widgets : ['zebra', 'filter'],
+ });
+ scheduleLoadOperationsList(0);
+ }
+ });
+
+ loadOperationsList();
+}
diff --git a/ydb/core/cms/ui/datashard_rs.js b/ydb/core/cms/ui/datashard_rs.js
index 5d378f565dc..c1c9daec750 100644
--- a/ydb/core/cms/ui/datashard_rs.js
+++ b/ydb/core/cms/ui/datashard_rs.js
@@ -1,221 +1,221 @@
-'use strict';
-
-var ReadSetsState = {
- fetchInterval: 5000,
- retryInterval: 5000,
- loading: false,
- scheduledLoad: false,
- rs: new Map(),
- acks: new Map(),
- delayedAcks: new Map(),
-};
-
-function makeRSKey(info) {
- return `${info.TxId}-${info.Origin}-${info.Source}-${info.Destination}-${info.SeqNo}`;
-}
-
-class RSInfo {
- constructor(info) {
- this.key = makeRSKey(info);
-
- var trHtml = this._makeTrHtml(info);
- $(trHtml).appendTo($('#ds-out-rs-body'));
- }
-
- update(info) {
- $('#ds-out-rs-row-' + this.key).replaceWith(this._makeTrHtml(info));
- }
-
- remove() {
- $('#ds-out-rs-row-' + this.key).remove();
- }
-
- _makeTrHtml(info) {
- return `
- <tr id="ds-out-rs-row-${this.key}">
- <td><a href="#page=ds-op&op=${info.TxId}" onclick="showOp(${info.TxId})">${info.TxId}</a></td>
- <td><a href="app?TabletID=${info.Origin}">${info.Origin}</a></td>
- <td><a href="app?TabletID=${info.Source}">${info.Source}</a></td>
- <td><a href="app?TabletID=${info.Destination}">${info.Destination}</a></td>
- <td>${info.SeqNo}</td>
- </tr>
- `;
- }
-}
-
-class RSAckInfo {
- constructor(info,body) {
- this.key = makeRSKey(info);
-
- var trHtml = this._makeTrHtml(info);
- $(trHtml).appendTo($('#' + body));
- }
-
- update(info) {
- $('#ds-out-rs-ack-row-' + this.key).replaceWith(this._makeTrHtml(info));
- }
-
- remove() {
- $('#ds-out-rs-ack-row-' + this.key).remove();
- }
-
- _makeTrHtml(info) {
- return `
- <tr id="ds-out-rs-ack-row-${this.key}">
- <td><a href="#page=ds-op&op=${info.TxId}" onclick="showOp(${info.TxId})">${info.TxId}</a></td>
- <td><a href="app?TabletID=${info.Origin}">${info.Origin}</a></td>
- <td><a href="app?TabletID=${info.Source}">${info.Source}</a></td>
- <td><a href="app?TabletID=${info.Destination}">${info.Destination}</a></td>
- <td>${info.SeqNo}</td>
- </tr>
- `;
- }
-}
-
-function onReadSetsLoaded(data) {
- ReadSetsState.loading = false;
-
- if (data['Status']['Code'] != 'SUCCESS') {
- onReadSetsFailed(data);
- return;
- }
-
- $('#ds-rs-error').html('');
-
- var outRS = new Set();
- if (data.OutReadSets) {
- for (var rs of data.OutReadSets) {
- var key = makeRSKey(rs);
- outRS.add(key);
- if (ReadSetsState.rs.has(key)) {
- ReadSetsState.rs.get(key).update(rs);
- } else {
- ReadSetsState.rs.set(key, new RSInfo(rs));
- }
- }
- }
-
- var toRemove = [];
- for (var key of ReadSetsState.rs.keys()) {
- if (!outRS.has(key))
- toRemove.push(key);
- }
-
- for (var key of toRemove) {
- ReadSetsState.rs.get(key).remove();
- ReadSetsState.rs.delete(key);
- }
-
- var acks = new Set();
- if (data.OutRSAcks) {
- for (var ack of data.OutRSAcks) {
- var key = makeRSKey(ack);
- acks.add(key);
- if (ReadSetsState.acks.has(key)) {
- ReadSetsState.acks.get(key).update(ack);
- } else {
- ReadSetsState.acks.set(key, new RSAckInfo(ack, 'ds-out-rs-ack-body'));
- }
- }
- }
-
- toRemove = [];
- for (var key of ReadSetsState.acks.keys()) {
- if (!acks.has(key))
- toRemove.push(key);
- }
-
- for (var key of toRemove) {
- ReadSetsState.acks.get(key).remove();
- ReadSetsState.acks.delete(key);
- }
-
- var delayedAcks = new Set();
- if (data.DelayedRSAcks) {
- for (var ack of data.DelayedRSAcks) {
- var key = makeRSKey(ack);
- delayedAcks.add(key);
- if (ReadSetsState.delayedAcks.has(key)) {
- ReadSetsState.delayedAcks.get(key).update(ack);
- } else {
- ReadSetsState.delayedAcks.set(key, new RSAckInfo(ack, 'ds-delayed-ack-body'));
- }
- }
- }
-
- toRemove = [];
- for (var key of ReadSetsState.delayedAcks.keys()) {
- if (!delayedAcks.has(key))
- toRemove.push(key);
- }
-
- for (var key of toRemove) {
- ReadSetsState.delayedAcks.get(key).remove();
- ReadSetsState.delayedAcks.delete(key);
- }
-
- $('#ds-out-rs-table').trigger('update', [true]);
- $('#ds-out-rs-ack-table').trigger('update', [true]);
- $('#ds-delayed-ack-table').trigger('update', [true]);
-
- scheduleLoadReadSets(ReadSetsState.fetchInterval);
-}
-
-function onReadSetsFailed(data) {
- ReadSetsState.loading = false;
-
- if (data && data['Status'] && data['Status']['Issues'])
- $('#ds-rs-error').html(JSON.stringify(data['Status']['Issues']));
- else
- $('#ds-rs-error').html("Cannot get read sets info");
- scheduleLoadReadSets(ReadSetsState.retryInterval);
-}
-
-function loadReadSets() {
- if (ReadSetsState.loading)
- return;
-
- if (!$('#ds-rs-link').hasClass('active'))
- return;
-
- ReadSetsState.loading = true;
- var url = '../cms/api/datashard/json/getrsinfo?tabletid=' + TabletId;
- $.get(url).done(onReadSetsLoaded).fail(onReadSetsFailed);
-}
-
-function scheduledLoadReadSets() {
- ReadSetsState.scheduledLoad = false;
- loadReadSets();
-}
-
-function scheduleLoadReadSets(timeout) {
- if (ReadSetsState.scheduledLoad)
- return;
- ReadSetsState.scheduledLoad = true;
- setTimeout(scheduledLoadReadSets, timeout);
-}
-
-function initReadSetsTab() {
- $(document).on('shown.bs.tab', '', function(e) {
- if (e.target.id == 'ds-rs-link') {
- $('#ds-out-rs-table').tablesorter({
- theme: 'blue',
- sortList: [[0,0]],
- widgets : ['zebra', 'filter'],
- });
- $('#ds-out-rs-ack-table').tablesorter({
- theme: 'blue',
- sortList: [[0,0]],
- widgets : ['zebra', 'filter'],
- });
- $('#ds-delayed-ack-table').tablesorter({
- theme: 'blue',
- sortList: [[0,0]],
- widgets : ['zebra', 'filter'],
- });
- scheduleLoadReadSets(0);
- }
- });
-
- loadReadSets();
-}
+'use strict';
+
+var ReadSetsState = {
+ fetchInterval: 5000,
+ retryInterval: 5000,
+ loading: false,
+ scheduledLoad: false,
+ rs: new Map(),
+ acks: new Map(),
+ delayedAcks: new Map(),
+};
+
+function makeRSKey(info) {
+ return `${info.TxId}-${info.Origin}-${info.Source}-${info.Destination}-${info.SeqNo}`;
+}
+
+class RSInfo {
+ constructor(info) {
+ this.key = makeRSKey(info);
+
+ var trHtml = this._makeTrHtml(info);
+ $(trHtml).appendTo($('#ds-out-rs-body'));
+ }
+
+ update(info) {
+ $('#ds-out-rs-row-' + this.key).replaceWith(this._makeTrHtml(info));
+ }
+
+ remove() {
+ $('#ds-out-rs-row-' + this.key).remove();
+ }
+
+ _makeTrHtml(info) {
+ return `
+ <tr id="ds-out-rs-row-${this.key}">
+ <td><a href="#page=ds-op&op=${info.TxId}" onclick="showOp(${info.TxId})">${info.TxId}</a></td>
+ <td><a href="app?TabletID=${info.Origin}">${info.Origin}</a></td>
+ <td><a href="app?TabletID=${info.Source}">${info.Source}</a></td>
+ <td><a href="app?TabletID=${info.Destination}">${info.Destination}</a></td>
+ <td>${info.SeqNo}</td>
+ </tr>
+ `;
+ }
+}
+
+class RSAckInfo {
+ constructor(info,body) {
+ this.key = makeRSKey(info);
+
+ var trHtml = this._makeTrHtml(info);
+ $(trHtml).appendTo($('#' + body));
+ }
+
+ update(info) {
+ $('#ds-out-rs-ack-row-' + this.key).replaceWith(this._makeTrHtml(info));
+ }
+
+ remove() {
+ $('#ds-out-rs-ack-row-' + this.key).remove();
+ }
+
+ _makeTrHtml(info) {
+ return `
+ <tr id="ds-out-rs-ack-row-${this.key}">
+ <td><a href="#page=ds-op&op=${info.TxId}" onclick="showOp(${info.TxId})">${info.TxId}</a></td>
+ <td><a href="app?TabletID=${info.Origin}">${info.Origin}</a></td>
+ <td><a href="app?TabletID=${info.Source}">${info.Source}</a></td>
+ <td><a href="app?TabletID=${info.Destination}">${info.Destination}</a></td>
+ <td>${info.SeqNo}</td>
+ </tr>
+ `;
+ }
+}
+
+function onReadSetsLoaded(data) {
+ ReadSetsState.loading = false;
+
+ if (data['Status']['Code'] != 'SUCCESS') {
+ onReadSetsFailed(data);
+ return;
+ }
+
+ $('#ds-rs-error').html('');
+
+ var outRS = new Set();
+ if (data.OutReadSets) {
+ for (var rs of data.OutReadSets) {
+ var key = makeRSKey(rs);
+ outRS.add(key);
+ if (ReadSetsState.rs.has(key)) {
+ ReadSetsState.rs.get(key).update(rs);
+ } else {
+ ReadSetsState.rs.set(key, new RSInfo(rs));
+ }
+ }
+ }
+
+ var toRemove = [];
+ for (var key of ReadSetsState.rs.keys()) {
+ if (!outRS.has(key))
+ toRemove.push(key);
+ }
+
+ for (var key of toRemove) {
+ ReadSetsState.rs.get(key).remove();
+ ReadSetsState.rs.delete(key);
+ }
+
+ var acks = new Set();
+ if (data.OutRSAcks) {
+ for (var ack of data.OutRSAcks) {
+ var key = makeRSKey(ack);
+ acks.add(key);
+ if (ReadSetsState.acks.has(key)) {
+ ReadSetsState.acks.get(key).update(ack);
+ } else {
+ ReadSetsState.acks.set(key, new RSAckInfo(ack, 'ds-out-rs-ack-body'));
+ }
+ }
+ }
+
+ toRemove = [];
+ for (var key of ReadSetsState.acks.keys()) {
+ if (!acks.has(key))
+ toRemove.push(key);
+ }
+
+ for (var key of toRemove) {
+ ReadSetsState.acks.get(key).remove();
+ ReadSetsState.acks.delete(key);
+ }
+
+ var delayedAcks = new Set();
+ if (data.DelayedRSAcks) {
+ for (var ack of data.DelayedRSAcks) {
+ var key = makeRSKey(ack);
+ delayedAcks.add(key);
+ if (ReadSetsState.delayedAcks.has(key)) {
+ ReadSetsState.delayedAcks.get(key).update(ack);
+ } else {
+ ReadSetsState.delayedAcks.set(key, new RSAckInfo(ack, 'ds-delayed-ack-body'));
+ }
+ }
+ }
+
+ toRemove = [];
+ for (var key of ReadSetsState.delayedAcks.keys()) {
+ if (!delayedAcks.has(key))
+ toRemove.push(key);
+ }
+
+ for (var key of toRemove) {
+ ReadSetsState.delayedAcks.get(key).remove();
+ ReadSetsState.delayedAcks.delete(key);
+ }
+
+ $('#ds-out-rs-table').trigger('update', [true]);
+ $('#ds-out-rs-ack-table').trigger('update', [true]);
+ $('#ds-delayed-ack-table').trigger('update', [true]);
+
+ scheduleLoadReadSets(ReadSetsState.fetchInterval);
+}
+
+function onReadSetsFailed(data) {
+ ReadSetsState.loading = false;
+
+ if (data && data['Status'] && data['Status']['Issues'])
+ $('#ds-rs-error').html(JSON.stringify(data['Status']['Issues']));
+ else
+ $('#ds-rs-error').html("Cannot get read sets info");
+ scheduleLoadReadSets(ReadSetsState.retryInterval);
+}
+
+function loadReadSets() {
+ if (ReadSetsState.loading)
+ return;
+
+ if (!$('#ds-rs-link').hasClass('active'))
+ return;
+
+ ReadSetsState.loading = true;
+ var url = '../cms/api/datashard/json/getrsinfo?tabletid=' + TabletId;
+ $.get(url).done(onReadSetsLoaded).fail(onReadSetsFailed);
+}
+
+function scheduledLoadReadSets() {
+ ReadSetsState.scheduledLoad = false;
+ loadReadSets();
+}
+
+function scheduleLoadReadSets(timeout) {
+ if (ReadSetsState.scheduledLoad)
+ return;
+ ReadSetsState.scheduledLoad = true;
+ setTimeout(scheduledLoadReadSets, timeout);
+}
+
+function initReadSetsTab() {
+ $(document).on('shown.bs.tab', '', function(e) {
+ if (e.target.id == 'ds-rs-link') {
+ $('#ds-out-rs-table').tablesorter({
+ theme: 'blue',
+ sortList: [[0,0]],
+ widgets : ['zebra', 'filter'],
+ });
+ $('#ds-out-rs-ack-table').tablesorter({
+ theme: 'blue',
+ sortList: [[0,0]],
+ widgets : ['zebra', 'filter'],
+ });
+ $('#ds-delayed-ack-table').tablesorter({
+ theme: 'blue',
+ sortList: [[0,0]],
+ widgets : ['zebra', 'filter'],
+ });
+ scheduleLoadReadSets(0);
+ }
+ });
+
+ loadReadSets();
+}
diff --git a/ydb/core/cms/ui/datashard_slow_ops.js b/ydb/core/cms/ui/datashard_slow_ops.js
index a3e4ccfc198..b97d98e359b 100644
--- a/ydb/core/cms/ui/datashard_slow_ops.js
+++ b/ydb/core/cms/ui/datashard_slow_ops.js
@@ -1,129 +1,129 @@
-'use strict';
-var SlowOperationsState = {
- fetchInterval: 30000,
- retryInterval: 5000,
- loading: false,
- scheduledLoad: false,
- ops: new Set(),
-};
-
-function onSlowOperationsLoaded(data) {
- SlowOperationsState.loading = false;
-
- if (data['Status']['Code'] != 'SUCCESS') {
- onSlowOperationsFailed(data);
- return;
- }
-
- $('#ds-slow-ops-error').html('');
-
- if (data.Profiles) {
- for (var profile of data.Profiles) {
- var id = profile.BasicInfo.TxId;
-
- if (SlowOperationsState.ops.has(id))
- continue;
-
- var step = profile.BasicInfo.Step;
- var kind = profile.BasicInfo.Kind;
- var received = timeToString(profile.BasicInfo.ReceivedAt);
- var immediate = false;
- var readOnly = false;
-
- for (var flag of profile.BasicInfo.Flags) {
- if (flag == "ReadOnly")
- readOnly = true;
- else if (flag == "Immediate")
- immediate = true;
- }
-
- var fullProfile = "";
- var total = 0;
- for (var unit of profile.ExecutionProfile.UnitProfiles) {
- var unitTotal = unit.WaitTime + unit.ExecuteTime + unit.CommitTime
- + unit.CompleteTime;
- fullProfile += `
- <b>${unit.UnitKind}: ${durationToStringMs(unitTotal)}</b><br>
- Wait: ${durationToStringMs(unit.WaitTime)}<br>
- Execute: ${durationToStringMs(unit.ExecuteTime)}<br>
- Commit: ${durationToStringMs(unit.CommitTime)}<br>
- Complete: ${durationToStringMs(unit.CompleteTime)}<br>
- `;
- total += unitTotal;
- }
-
- var trHtml = `
- <tr>
- <td>${id}</td>
- <td>${step}</td>
- <td>${kind}</td>
- <td>${received}</td>
- <td>${immediate.toString()}</td>
- <td>${readOnly.toString()}</td>
- <td>
- <a data-toggle="collapse" href="#ds-slow-ops-profile-${id}">${durationToStringMs(total)}</a><br>
- <div class="collapse" id="ds-slow-ops-profile-${id}">
- ${fullProfile}
- </div>
- </td>
- </tr>
- `;
- $(trHtml).appendTo($('#ds-slow-ops-body'));
-
- SlowOperationsState.ops.add(id);
- }
- }
-
- $('#ds-slow-ops-table').trigger('update', [true]);
-
- scheduleLoadSlowOperations(SlowOperationsState.fetchInterval);
-}
-
-function onSlowOperationsFailed(data) {
- SlowOperationsState.loading = false;
-
- if (data && data['Status'] && data['Status']['Issues'])
- $('#ds-slow-ops-error').html(JSON.stringify(data['Status']['Issues']));
- else
- $('#ds-slow-ops-error').html("Cannot get operations list");
- scheduleLoadSlowOperations(SlowOperationsState.retryInterval);
-}
-
-function loadSlowOperations() {
- if (SlowOperationsState.loading)
- return;
-
- if (!$('#ds-slow-ops-link').hasClass('active'))
- return;
-
- SlowOperationsState.loading = true;
- var url = '../cms/api/datashard/json/getslowopprofiles?tabletid=' + TabletId;
- $.get(url).done(onSlowOperationsLoaded).fail(onSlowOperationsFailed);
-}
-
-function scheduledLoadSlowOperations() {
- SlowOperationsState.scheduledLoad = false;
- loadSlowOperations();
-}
-
-function scheduleLoadSlowOperations(timeout) {
- if (SlowOperationsState.scheduledLoad)
- return;
- SlowOperationsState.scheduledLoad = true;
- setTimeout(scheduledLoadSlowOperations, timeout);
-}
-
-function initSlowOperationsTab() {
- $(document).on('shown.bs.tab', '', function(e) {
- if (e.target.id == 'ds-slow-ops-link') {
- $('#ds-slow-ops-table').tablesorter({
- theme: 'blue',
- sortList: [[0,0]],
- widgets : ['zebra', 'filter'],
- });
- scheduleLoadSlowOperations(0);
- }
- });
-
- loadSlowOperations();
-}
+'use strict';
+var SlowOperationsState = {
+ fetchInterval: 30000,
+ retryInterval: 5000,
+ loading: false,
+ scheduledLoad: false,
+ ops: new Set(),
+};
+
+function onSlowOperationsLoaded(data) {
+ SlowOperationsState.loading = false;
+
+ if (data['Status']['Code'] != 'SUCCESS') {
+ onSlowOperationsFailed(data);
+ return;
+ }
+
+ $('#ds-slow-ops-error').html('');
+
+ if (data.Profiles) {
+ for (var profile of data.Profiles) {
+ var id = profile.BasicInfo.TxId;
+
+ if (SlowOperationsState.ops.has(id))
+ continue;
+
+ var step = profile.BasicInfo.Step;
+ var kind = profile.BasicInfo.Kind;
+ var received = timeToString(profile.BasicInfo.ReceivedAt);
+ var immediate = false;
+ var readOnly = false;
+
+ for (var flag of profile.BasicInfo.Flags) {
+ if (flag == "ReadOnly")
+ readOnly = true;
+ else if (flag == "Immediate")
+ immediate = true;
+ }
+
+ var fullProfile = "";
+ var total = 0;
+ for (var unit of profile.ExecutionProfile.UnitProfiles) {
+ var unitTotal = unit.WaitTime + unit.ExecuteTime + unit.CommitTime
+ + unit.CompleteTime;
+ fullProfile += `
+ <b>${unit.UnitKind}: ${durationToStringMs(unitTotal)}</b><br>
+ Wait: ${durationToStringMs(unit.WaitTime)}<br>
+ Execute: ${durationToStringMs(unit.ExecuteTime)}<br>
+ Commit: ${durationToStringMs(unit.CommitTime)}<br>
+ Complete: ${durationToStringMs(unit.CompleteTime)}<br>
+ `;
+ total += unitTotal;
+ }
+
+ var trHtml = `
+ <tr>
+ <td>${id}</td>
+ <td>${step}</td>
+ <td>${kind}</td>
+ <td>${received}</td>
+ <td>${immediate.toString()}</td>
+ <td>${readOnly.toString()}</td>
+ <td>
+ <a data-toggle="collapse" href="#ds-slow-ops-profile-${id}">${durationToStringMs(total)}</a><br>
+ <div class="collapse" id="ds-slow-ops-profile-${id}">
+ ${fullProfile}
+ </div>
+ </td>
+ </tr>
+ `;
+ $(trHtml).appendTo($('#ds-slow-ops-body'));
+
+ SlowOperationsState.ops.add(id);
+ }
+ }
+
+ $('#ds-slow-ops-table').trigger('update', [true]);
+
+ scheduleLoadSlowOperations(SlowOperationsState.fetchInterval);
+}
+
+function onSlowOperationsFailed(data) {
+ SlowOperationsState.loading = false;
+
+ if (data && data['Status'] && data['Status']['Issues'])
+ $('#ds-slow-ops-error').html(JSON.stringify(data['Status']['Issues']));
+ else
+ $('#ds-slow-ops-error').html("Cannot get operations list");
+ scheduleLoadSlowOperations(SlowOperationsState.retryInterval);
+}
+
+function loadSlowOperations() {
+ if (SlowOperationsState.loading)
+ return;
+
+ if (!$('#ds-slow-ops-link').hasClass('active'))
+ return;
+
+ SlowOperationsState.loading = true;
+ var url = '../cms/api/datashard/json/getslowopprofiles?tabletid=' + TabletId;
+ $.get(url).done(onSlowOperationsLoaded).fail(onSlowOperationsFailed);
+}
+
+function scheduledLoadSlowOperations() {
+ SlowOperationsState.scheduledLoad = false;
+ loadSlowOperations();
+}
+
+function scheduleLoadSlowOperations(timeout) {
+ if (SlowOperationsState.scheduledLoad)
+ return;
+ SlowOperationsState.scheduledLoad = true;
+ setTimeout(scheduledLoadSlowOperations, timeout);
+}
+
+function initSlowOperationsTab() {
+ $(document).on('shown.bs.tab', '', function(e) {
+ if (e.target.id == 'ds-slow-ops-link') {
+ $('#ds-slow-ops-table').tablesorter({
+ theme: 'blue',
+ sortList: [[0,0]],
+ widgets : ['zebra', 'filter'],
+ });
+ scheduleLoadSlowOperations(0);
+ }
+ });
+
+ loadSlowOperations();
+}
diff --git a/ydb/core/cms/ui/enums.js b/ydb/core/cms/ui/enums.js
index c318a0676ce..02d1e766576 100644
--- a/ydb/core/cms/ui/enums.js
+++ b/ydb/core/cms/ui/enums.js
@@ -1,89 +1,89 @@
-'use strict';
-
-class Enums {
-
- constructor(errorElemId) {
- this._requested = new Map();
- this._requests = 0;
- this._retryInterval = 5000;
- this._errorElemId = errorElemId;
- this._onDone = [];
- }
-
- add(enumName, enumClass) {
- if (this._requested.has(enumName)) {
- console.assert(this._requested.get(enumName) === enumClass);
- } else {
- this._requested.set(enumName, enumClass);
- ++this._requests;
- this._load(enumName, enumClass);
- }
-
- return this;
- }
-
- done(cb) {
- this._onDone.push(cb);
- return this;
- }
-
- get(name, val) {
- if (!this[name])
- return '<unknown>';
-
- if (this[name].has(val))
- return this[name].get(val);
-
- return '<unknown>';
- }
-
- parse(name, val) {
- name += 'Names';
- if (!this[name])
- return -1;
-
- if (this[name].has(val))
- return this[name].get(val);
-
- return -1;
- }
-
- _load(enumName, enumClass) {
- var _this = this;
- $.get('cms/api/json/proto?enum=' + enumClass)
- .done((data) => {
- _this._onLoaded(enumName, data);
- })
- .fail(function(){
- _this._onLoadFailed(enumName, enumClass);
- });
- }
-
- _onLoaded(enumName, data) {
- var items = new Map();
- var names = new Map();
- for (var entry of data.value) {
- items.set(entry.number, entry.name);
- names.set(entry.name, entry.number);
- }
-
- this[enumName] = items;
- this[enumName + 'Names'] = names;
-
- --this._requests;
- if (this._requests == 0) {
- $('#' + this._errorElemId).html('');
- for (var cb of this._onDone)
- cb();
- }
- }
-
- _onLoadFailed(enumName, enumClass) {
- var error = 'Cannot load values for enum ' + enumName + ' (' + enumClass + ')';
- $('#' + this._errorElemId).html(error);
- var _this = this;
- setTimeout(function() { _this._load(enumName, enumClass) }, this._retryInterval);
- }
-}
-
-var cmsEnums = new Enums('enums-error');
+'use strict';
+
+class Enums {
+
+ constructor(errorElemId) {
+ this._requested = new Map();
+ this._requests = 0;
+ this._retryInterval = 5000;
+ this._errorElemId = errorElemId;
+ this._onDone = [];
+ }
+
+ add(enumName, enumClass) {
+ if (this._requested.has(enumName)) {
+ console.assert(this._requested.get(enumName) === enumClass);
+ } else {
+ this._requested.set(enumName, enumClass);
+ ++this._requests;
+ this._load(enumName, enumClass);
+ }
+
+ return this;
+ }
+
+ done(cb) {
+ this._onDone.push(cb);
+ return this;
+ }
+
+ get(name, val) {
+ if (!this[name])
+ return '<unknown>';
+
+ if (this[name].has(val))
+ return this[name].get(val);
+
+ return '<unknown>';
+ }
+
+ parse(name, val) {
+ name += 'Names';
+ if (!this[name])
+ return -1;
+
+ if (this[name].has(val))
+ return this[name].get(val);
+
+ return -1;
+ }
+
+ _load(enumName, enumClass) {
+ var _this = this;
+ $.get('cms/api/json/proto?enum=' + enumClass)
+ .done((data) => {
+ _this._onLoaded(enumName, data);
+ })
+ .fail(function(){
+ _this._onLoadFailed(enumName, enumClass);
+ });
+ }
+
+ _onLoaded(enumName, data) {
+ var items = new Map();
+ var names = new Map();
+ for (var entry of data.value) {
+ items.set(entry.number, entry.name);
+ names.set(entry.name, entry.number);
+ }
+
+ this[enumName] = items;
+ this[enumName + 'Names'] = names;
+
+ --this._requests;
+ if (this._requests == 0) {
+ $('#' + this._errorElemId).html('');
+ for (var cb of this._onDone)
+ cb();
+ }
+ }
+
+ _onLoadFailed(enumName, enumClass) {
+ var error = 'Cannot load values for enum ' + enumName + ' (' + enumClass + ')';
+ $('#' + this._errorElemId).html(error);
+ var _this = this;
+ setTimeout(function() { _this._load(enumName, enumClass) }, this._retryInterval);
+ }
+}
+
+var cmsEnums = new Enums('enums-error');
diff --git a/ydb/core/cms/ui/ext/bootstrap.bundle.min.js b/ydb/core/cms/ui/ext/bootstrap.bundle.min.js
index 335af88df42..72a46cf9804 100644
--- a/ydb/core/cms/ui/ext/bootstrap.bundle.min.js
+++ b/ydb/core/cms/ui/ext/bootstrap.bundle.min.js
@@ -1,7 +1,7 @@
-/*!
- * Bootstrap v4.1.3 (https://getbootstrap.com/)
- * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],t):t(e.bootstrap={},e.jQuery)}(this,function(e,t){"use strict";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function s(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}function l(r){for(var e=1;e<arguments.length;e++){var o=null!=arguments[e]?arguments[e]:{},t=Object.keys(o);"function"==typeof Object.getOwnPropertySymbols&&(t=t.concat(Object.getOwnPropertySymbols(o).filter(function(e){return Object.getOwnPropertyDescriptor(o,e).enumerable}))),t.forEach(function(e){var t,n,i;t=r,i=o[n=e],n in t?Object.defineProperty(t,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[n]=i})}return r}for(var r,n,o,a,c,u,f,h,d,p,m,g,_,v,y,E,b,w,C,T,S,D,A,I,O,N,k,x,P,L,j,H,M,F,W,R,U,B,q,K,Q,Y,V,z,G,J,Z,X,$,ee,te,ne,ie,re,oe,se,ae,le,ce,ue,fe,he,de,pe,me,ge,_e,ve,ye,Ee,be,we=function(i){var t="transitionend";function e(e){var t=this,n=!1;return i(this).one(l.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||l.triggerTransitionEnd(t)},e),this}var l={TRANSITION_END:"bsTransitionEnd",getUID:function(e){for(;e+=~~(1e6*Math.random()),document.getElementById(e););return e},getSelectorFromElement:function(e){var t=e.getAttribute("data-target");t&&"#"!==t||(t=e.getAttribute("href")||"");try{return document.querySelector(t)?t:null}catch(e){return null}},getTransitionDurationFromElement:function(e){if(!e)return 0;var t=i(e).css("transition-duration");return parseFloat(t)?(t=t.split(",")[0],1e3*parseFloat(t)):0},reflow:function(e){return e.offsetHeight},triggerTransitionEnd:function(e){i(e).trigger(t)},supportsTransitionEnd:function(){return Boolean(t)},isElement:function(e){return(e[0]||e).nodeType},typeCheckConfig:function(e,t,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var r=n[i],o=t[i],s=o&&l.isElement(o)?"element":(a=o,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(r).test(s))throw new Error(e.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+r+'".')}var a}};return i.fn.emulateTransitionEnd=e,i.event.special[l.TRANSITION_END]={bindType:t,delegateType:t,handle:function(e){if(i(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}},l}(t=t&&t.hasOwnProperty("default")?t.default:t),Ce=(n="alert",a="."+(o="bs.alert"),c=(r=t).fn[n],u={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},f="alert",h="fade",d="show",p=function(){function i(e){this._element=e}var e=i.prototype;return e.close=function(e){var t=this._element;e&&(t=this._getRootElement(e)),this._triggerCloseEvent(t).isDefaultPrevented()||this._removeElement(t)},e.dispose=function(){r.removeData(this._element,o),this._element=null},e._getRootElement=function(e){var t=we.getSelectorFromElement(e),n=!1;return t&&(n=document.querySelector(t)),n||(n=r(e).closest("."+f)[0]),n},e._triggerCloseEvent=function(e){var t=r.Event(u.CLOSE);return r(e).trigger(t),t},e._removeElement=function(t){var n=this;if(r(t).removeClass(d),r(t).hasClass(h)){var e=we.getTransitionDurationFromElement(t);r(t).one(we.TRANSITION_END,function(e){return n._destroyElement(t,e)}).emulateTransitionEnd(e)}else this._destroyElement(t)},e._destroyElement=function(e){r(e).detach().trigger(u.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var e=r(this),t=e.data(o);t||(t=new i(this),e.data(o,t)),"close"===n&&t[n](this)})},i._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}}]),i}(),r(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',p._handleDismiss(new p)),r.fn[n]=p._jQueryInterface,r.fn[n].Constructor=p,r.fn[n].noConflict=function(){return r.fn[n]=c,p._jQueryInterface},p),Te=(g="button",v="."+(_="bs.button"),y=".data-api",E=(m=t).fn[g],b="active",w="btn",T='[data-toggle^="button"]',S='[data-toggle="buttons"]',D="input",A=".active",I=".btn",O={CLICK_DATA_API:"click"+v+y,FOCUS_BLUR_DATA_API:(C="focus")+v+y+" blur"+v+y},N=function(){function n(e){this._element=e}var e=n.prototype;return e.toggle=function(){var e=!0,t=!0,n=m(this._element).closest(S)[0];if(n){var i=this._element.querySelector(D);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(b))e=!1;else{var r=n.querySelector(A);r&&m(r).removeClass(b)}if(e){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!this._element.classList.contains(b),m(i).trigger("change")}i.focus(),t=!1}}t&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(b)),e&&m(this._element).toggleClass(b)},e.dispose=function(){m.removeData(this._element,_),this._element=null},n._jQueryInterface=function(t){return this.each(function(){var e=m(this).data(_);e||(e=new n(this),m(this).data(_,e)),"toggle"===t&&e[t]()})},s(n,null,[{key:"VERSION",get:function(){return"4.1.3"}}]),n}(),m(document).on(O.CLICK_DATA_API,T,function(e){e.preventDefault();var t=e.target;m(t).hasClass(w)||(t=m(t).closest(I)),N._jQueryInterface.call(m(t),"toggle")}).on(O.FOCUS_BLUR_DATA_API,T,function(e){var t=m(e.target).closest(I)[0];m(t).toggleClass(C,/^focus(in)?$/.test(e.type))}),m.fn[g]=N._jQueryInterface,m.fn[g].Constructor=N,m.fn[g].noConflict=function(){return m.fn[g]=E,N._jQueryInterface},N),Se=(x="carousel",L="."+(P="bs.carousel"),j=".data-api",H=(k=t).fn[x],M={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},F={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},W="next",R="prev",U="left",B="right",q={SLIDE:"slide"+L,SLID:"slid"+L,KEYDOWN:"keydown"+L,MOUSEENTER:"mouseenter"+L,MOUSELEAVE:"mouseleave"+L,TOUCHEND:"touchend"+L,LOAD_DATA_API:"load"+L+j,CLICK_DATA_API:"click"+L+j},K="carousel",Q="active",Y="slide",V="carousel-item-right",z="carousel-item-left",G="carousel-item-next",J="carousel-item-prev",Z=".active",X=".active.carousel-item",$=".carousel-item",ee=".carousel-item-next, .carousel-item-prev",te=".carousel-indicators",ne="[data-slide], [data-slide-to]",ie='[data-ride="carousel"]',re=function(){function o(e,t){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(t),this._element=k(e)[0],this._indicatorsElement=this._element.querySelector(te),this._addEventListeners()}var e=o.prototype;return e.next=function(){this._isSliding||this._slide(W)},e.nextWhenVisible=function(){!document.hidden&&k(this._element).is(":visible")&&"hidden"!==k(this._element).css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(R)},e.pause=function(e){e||(this._isPaused=!0),this._element.querySelector(ee)&&(we.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(e){var t=this;this._activeElement=this._element.querySelector(X);var n=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)k(this._element).one(q.SLID,function(){return t.to(e)});else{if(n===e)return this.pause(),void this.cycle();var i=n<e?W:R;this._slide(i,this._items[e])}},e.dispose=function(){k(this._element).off(L),k.removeData(this._element,P),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(e){return e=l({},M,e),we.typeCheckConfig(x,e,F),e},e._addEventListeners=function(){var t=this;this._config.keyboard&&k(this._element).on(q.KEYDOWN,function(e){return t._keydown(e)}),"hover"===this._config.pause&&(k(this._element).on(q.MOUSEENTER,function(e){return t.pause(e)}).on(q.MOUSELEAVE,function(e){return t.cycle(e)}),"ontouchstart"in document.documentElement&&k(this._element).on(q.TOUCHEND,function(){t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout(function(e){return t.cycle(e)},500+t._config.interval)}))},e._keydown=function(e){if(!/input|textarea/i.test(e.target.tagName))switch(e.which){case 37:e.preventDefault(),this.prev();break;case 39:e.preventDefault(),this.next()}},e._getItemIndex=function(e){return this._items=e&&e.parentNode?[].slice.call(e.parentNode.querySelectorAll($)):[],this._items.indexOf(e)},e._getItemByDirection=function(e,t){var n=e===W,i=e===R,r=this._getItemIndex(t),o=this._items.length-1;if((i&&0===r||n&&r===o)&&!this._config.wrap)return t;var s=(r+(e===R?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},e._triggerSlideEvent=function(e,t){var n=this._getItemIndex(e),i=this._getItemIndex(this._element.querySelector(X)),r=k.Event(q.SLIDE,{relatedTarget:e,direction:t,from:i,to:n});return k(this._element).trigger(r),r},e._setActiveIndicatorElement=function(e){if(this._indicatorsElement){var t=[].slice.call(this._indicatorsElement.querySelectorAll(Z));k(t).removeClass(Q);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&k(n).addClass(Q)}},e._slide=function(e,t){var n,i,r,o=this,s=this._element.querySelector(X),a=this._getItemIndex(s),l=t||s&&this._getItemByDirection(e,s),c=this._getItemIndex(l),u=Boolean(this._interval);if(e===W?(n=z,i=G,r=U):(n=V,i=J,r=B),l&&k(l).hasClass(Q))this._isSliding=!1;else if(!this._triggerSlideEvent(l,r).isDefaultPrevented()&&s&&l){this._isSliding=!0,u&&this.pause(),this._setActiveIndicatorElement(l);var f=k.Event(q.SLID,{relatedTarget:l,direction:r,from:a,to:c});if(k(this._element).hasClass(Y)){k(l).addClass(i),we.reflow(l),k(s).addClass(n),k(l).addClass(n);var h=we.getTransitionDurationFromElement(s);k(s).one(we.TRANSITION_END,function(){k(l).removeClass(n+" "+i).addClass(Q),k(s).removeClass(Q+" "+i+" "+n),o._isSliding=!1,setTimeout(function(){return k(o._element).trigger(f)},0)}).emulateTransitionEnd(h)}else k(s).removeClass(Q),k(l).addClass(Q),this._isSliding=!1,k(this._element).trigger(f);u&&this.cycle()}},o._jQueryInterface=function(i){return this.each(function(){var e=k(this).data(P),t=l({},M,k(this).data());"object"==typeof i&&(t=l({},t,i));var n="string"==typeof i?i:t.slide;if(e||(e=new o(this,t),k(this).data(P,e)),"number"==typeof i)e.to(i);else if("string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}else t.interval&&(e.pause(),e.cycle())})},o._dataApiClickHandler=function(e){var t=we.getSelectorFromElement(this);if(t){var n=k(t)[0];if(n&&k(n).hasClass(K)){var i=l({},k(n).data(),k(this).data()),r=this.getAttribute("data-slide-to");r&&(i.interval=!1),o._jQueryInterface.call(k(n),i),r&&k(n).data(P).to(r),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return M}}]),o}(),k(document).on(q.CLICK_DATA_API,ne,re._dataApiClickHandler),k(window).on(q.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(ie)),t=0,n=e.length;t<n;t++){var i=k(e[t]);re._jQueryInterface.call(i,i.data())}}),k.fn[x]=re._jQueryInterface,k.fn[x].Constructor=re,k.fn[x].noConflict=function(){return k.fn[x]=H,re._jQueryInterface},re),De=(se="collapse",le="."+(ae="bs.collapse"),ce=(oe=t).fn[se],ue={toggle:!0,parent:""},fe={toggle:"boolean",parent:"(string|element)"},he={SHOW:"show"+le,SHOWN:"shown"+le,HIDE:"hide"+le,HIDDEN:"hidden"+le,CLICK_DATA_API:"click"+le+".data-api"},de="show",pe="collapse",me="collapsing",ge="collapsed",_e="width",ve="height",ye=".show, .collapsing",Ee='[data-toggle="collapse"]',be=function(){function a(t,e){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(e),this._triggerArray=oe.makeArray(document.querySelectorAll('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(Ee)),i=0,r=n.length;i<r;i++){var o=n[i],s=we.getSelectorFromElement(o),a=[].slice.call(document.querySelectorAll(s)).filter(function(e){return e===t});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(o))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=a.prototype;return e.toggle=function(){oe(this._element).hasClass(de)?this.hide():this.show()},e.show=function(){var e,t,n=this;if(!this._isTransitioning&&!oe(this._element).hasClass(de)&&(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(ye)).filter(function(e){return e.getAttribute("data-parent")===n._config.parent})).length&&(e=null),!(e&&(t=oe(e).not(this._selector).data(ae))&&t._isTransitioning))){var i=oe.Event(he.SHOW);if(oe(this._element).trigger(i),!i.isDefaultPrevented()){e&&(a._jQueryInterface.call(oe(e).not(this._selector),"hide"),t||oe(e).data(ae,null));var r=this._getDimension();oe(this._element).removeClass(pe).addClass(me),this._element.style[r]=0,this._triggerArray.length&&oe(this._triggerArray).removeClass(ge).attr("aria-expanded",!0),this.setTransitioning(!0);var o="scroll"+(r[0].toUpperCase()+r.slice(1)),s=we.getTransitionDurationFromElement(this._element);oe(this._element).one(we.TRANSITION_END,function(){oe(n._element).removeClass(me).addClass(pe).addClass(de),n._element.style[r]="",n.setTransitioning(!1),oe(n._element).trigger(he.SHOWN)}).emulateTransitionEnd(s),this._element.style[r]=this._element[o]+"px"}}},e.hide=function(){var e=this;if(!this._isTransitioning&&oe(this._element).hasClass(de)){var t=oe.Event(he.HIDE);if(oe(this._element).trigger(t),!t.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",we.reflow(this._element),oe(this._element).addClass(me).removeClass(pe).removeClass(de);var i=this._triggerArray.length;if(0<i)for(var r=0;r<i;r++){var o=this._triggerArray[r],s=we.getSelectorFromElement(o);if(null!==s)oe([].slice.call(document.querySelectorAll(s))).hasClass(de)||oe(o).addClass(ge).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=we.getTransitionDurationFromElement(this._element);oe(this._element).one(we.TRANSITION_END,function(){e.setTransitioning(!1),oe(e._element).removeClass(me).addClass(pe).trigger(he.HIDDEN)}).emulateTransitionEnd(a)}}},e.setTransitioning=function(e){this._isTransitioning=e},e.dispose=function(){oe.removeData(this._element,ae),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},e._getConfig=function(e){return(e=l({},ue,e)).toggle=Boolean(e.toggle),we.typeCheckConfig(se,e,fe),e},e._getDimension=function(){return oe(this._element).hasClass(_e)?_e:ve},e._getParent=function(){var n=this,e=null;we.isElement(this._config.parent)?(e=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(e=this._config.parent[0])):e=document.querySelector(this._config.parent);var t='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(e.querySelectorAll(t));return oe(i).each(function(e,t){n._addAriaAndCollapsedClass(a._getTargetFromElement(t),[t])}),e},e._addAriaAndCollapsedClass=function(e,t){if(e){var n=oe(e).hasClass(de);t.length&&oe(t).toggleClass(ge,!n).attr("aria-expanded",n)}},a._getTargetFromElement=function(e){var t=we.getSelectorFromElement(e);return t?document.querySelector(t):null},a._jQueryInterface=function(i){return this.each(function(){var e=oe(this),t=e.data(ae),n=l({},ue,e.data(),"object"==typeof i&&i?i:{});if(!t&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),t||(t=new a(this,n),e.data(ae,t)),"string"==typeof i){if("undefined"==typeof t[i])throw new TypeError('No method named "'+i+'"');t[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return ue}}]),a}(),oe(document).on(he.CLICK_DATA_API,Ee,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var n=oe(this),t=we.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(t));oe(i).each(function(){var e=oe(this),t=e.data(ae)?"toggle":n.data();be._jQueryInterface.call(e,t)})}),oe.fn[se]=be._jQueryInterface,oe.fn[se].Constructor=be,oe.fn[se].noConflict=function(){return oe.fn[se]=ce,be._jQueryInterface},be),Ae="undefined"!=typeof window&&"undefined"!=typeof document,Ie=["Edge","Trident","Firefox"],Oe=0,Ne=0;Ne<Ie.length;Ne+=1)if(Ae&&0<=navigator.userAgent.indexOf(Ie[Ne])){Oe=1;break}var ke=Ae&&window.Promise?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},Oe))}};function xe(e){return e&&"[object Function]"==={}.toString.call(e)}function Pe(e,t){if(1!==e.nodeType)return[];var n=getComputedStyle(e,null);return t?n[t]:n}function Le(e){return"HTML"===e.nodeName?e:e.parentNode||e.host}function je(e){if(!e)return document.body;switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var t=Pe(e),n=t.overflow,i=t.overflowX,r=t.overflowY;return/(auto|scroll|overlay)/.test(n+r+i)?e:je(Le(e))}var He=Ae&&!(!window.MSInputMethodContext||!document.documentMode),Me=Ae&&/MSIE 10/.test(navigator.userAgent);function Fe(e){return 11===e?He:10===e?Me:He||Me}function We(e){if(!e)return document.documentElement;for(var t=Fe(10)?document.body:null,n=e.offsetParent;n===t&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&"BODY"!==i&&"HTML"!==i?-1!==["TD","TABLE"].indexOf(n.nodeName)&&"static"===Pe(n,"position")?We(n):n:e?e.ownerDocument.documentElement:document.documentElement}function Re(e){return null!==e.parentNode?Re(e.parentNode):e}function Ue(e,t){if(!(e&&e.nodeType&&t&&t.nodeType))return document.documentElement;var n=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?e:t,r=n?t:e,o=document.createRange();o.setStart(i,0),o.setEnd(r,0);var s,a,l=o.commonAncestorContainer;if(e!==l&&t!==l||i.contains(r))return"BODY"===(a=(s=l).nodeName)||"HTML"!==a&&We(s.firstElementChild)!==s?We(l):l;var c=Re(e);return c.host?Ue(c.host,t):Ue(e,Re(t).host)}function Be(e){var t="top"===(1<arguments.length&&void 0!==arguments[1]?arguments[1]:"top")?"scrollTop":"scrollLeft",n=e.nodeName;if("BODY"===n||"HTML"===n){var i=e.ownerDocument.documentElement;return(e.ownerDocument.scrollingElement||i)[t]}return e[t]}function qe(e,t){var n="x"===t?"Left":"Top",i="Left"===n?"Right":"Bottom";return parseFloat(e["border"+n+"Width"],10)+parseFloat(e["border"+i+"Width"],10)}function Ke(e,t,n,i){return Math.max(t["offset"+e],t["scroll"+e],n["client"+e],n["offset"+e],n["scroll"+e],Fe(10)?n["offset"+e]+i["margin"+("Height"===e?"Top":"Left")]+i["margin"+("Height"===e?"Bottom":"Right")]:0)}function Qe(){var e=document.body,t=document.documentElement,n=Fe(10)&&getComputedStyle(t);return{height:Ke("Height",e,t,n),width:Ke("Width",e,t,n)}}var Ye=function(){function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}}(),Ve=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},ze=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e};function Ge(e){return ze({},e,{right:e.left+e.width,bottom:e.top+e.height})}function Je(e){var t={};try{if(Fe(10)){t=e.getBoundingClientRect();var n=Be(e,"top"),i=Be(e,"left");t.top+=n,t.left+=i,t.bottom+=n,t.right+=i}else t=e.getBoundingClientRect()}catch(e){}var r={left:t.left,top:t.top,width:t.right-t.left,height:t.bottom-t.top},o="HTML"===e.nodeName?Qe():{},s=o.width||e.clientWidth||r.right-r.left,a=o.height||e.clientHeight||r.bottom-r.top,l=e.offsetWidth-s,c=e.offsetHeight-a;if(l||c){var u=Pe(e);l-=qe(u,"x"),c-=qe(u,"y"),r.width-=l,r.height-=c}return Ge(r)}function Ze(e,t){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Fe(10),r="HTML"===t.nodeName,o=Je(e),s=Je(t),a=je(e),l=Pe(t),c=parseFloat(l.borderTopWidth,10),u=parseFloat(l.borderLeftWidth,10);n&&"HTML"===t.nodeName&&(s.top=Math.max(s.top,0),s.left=Math.max(s.left,0));var f=Ge({top:o.top-s.top-c,left:o.left-s.left-u,width:o.width,height:o.height});if(f.marginTop=0,f.marginLeft=0,!i&&r){var h=parseFloat(l.marginTop,10),d=parseFloat(l.marginLeft,10);f.top-=c-h,f.bottom-=c-h,f.left-=u-d,f.right-=u-d,f.marginTop=h,f.marginLeft=d}return(i&&!n?t.contains(a):t===a&&"BODY"!==a.nodeName)&&(f=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Be(t,"top"),r=Be(t,"left"),o=n?-1:1;return e.top+=i*o,e.bottom+=i*o,e.left+=r*o,e.right+=r*o,e}(f,t)),f}function Xe(e){if(!e||!e.parentElement||Fe())return document.documentElement;for(var t=e.parentElement;t&&"none"===Pe(t,"transform");)t=t.parentElement;return t||document.documentElement}function $e(e,t,n,i){var r=4<arguments.length&&void 0!==arguments[4]&&arguments[4],o={top:0,left:0},s=r?Xe(e):Ue(e,t);if("viewport"===i)o=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=e.ownerDocument.documentElement,i=Ze(e,n),r=Math.max(n.clientWidth,window.innerWidth||0),o=Math.max(n.clientHeight,window.innerHeight||0),s=t?0:Be(n),a=t?0:Be(n,"left");return Ge({top:s-i.top+i.marginTop,left:a-i.left+i.marginLeft,width:r,height:o})}(s,r);else{var a=void 0;"scrollParent"===i?"BODY"===(a=je(Le(t))).nodeName&&(a=e.ownerDocument.documentElement):a="window"===i?e.ownerDocument.documentElement:i;var l=Ze(a,s,r);if("HTML"!==a.nodeName||function e(t){var n=t.nodeName;return"BODY"!==n&&"HTML"!==n&&("fixed"===Pe(t,"position")||e(Le(t)))}(s))o=l;else{var c=Qe(),u=c.height,f=c.width;o.top+=l.top-l.marginTop,o.bottom=u+l.top,o.left+=l.left-l.marginLeft,o.right=f+l.left}}return o.left+=n,o.top+=n,o.right-=n,o.bottom-=n,o}function et(e,t,i,n,r){var o=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf("auto"))return e;var s=$e(i,n,o,r),a={top:{width:s.width,height:t.top-s.top},right:{width:s.right-t.right,height:s.height},bottom:{width:s.width,height:s.bottom-t.bottom},left:{width:t.left-s.left,height:s.height}},l=Object.keys(a).map(function(e){return ze({key:e},a[e],{area:(t=a[e],t.width*t.height)});var t}).sort(function(e,t){return t.area-e.area}),c=l.filter(function(e){var t=e.width,n=e.height;return t>=i.clientWidth&&n>=i.clientHeight}),u=0<c.length?c[0].key:l[0].key,f=e.split("-")[1];return u+(f?"-"+f:"")}function tt(e,t,n){var i=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return Ze(n,i?Xe(t):Ue(t,n),i)}function nt(e){var t=getComputedStyle(e),n=parseFloat(t.marginTop)+parseFloat(t.marginBottom),i=parseFloat(t.marginLeft)+parseFloat(t.marginRight);return{width:e.offsetWidth+i,height:e.offsetHeight+n}}function it(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function rt(e,t,n){n=n.split("-")[0];var i=nt(e),r={width:i.width,height:i.height},o=-1!==["right","left"].indexOf(n),s=o?"top":"left",a=o?"left":"top",l=o?"height":"width",c=o?"width":"height";return r[s]=t[s]+t[l]/2-i[l]/2,r[a]=n===a?t[a]-i[c]:t[it(a)],r}function ot(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function st(e,n,t){return(void 0===t?e:e.slice(0,function(e,t,n){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===n});var i=ot(e,function(e){return e[t]===n});return e.indexOf(i)}(e,"name",t))).forEach(function(e){e.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var t=e.function||e.fn;e.enabled&&xe(t)&&(n.offsets.popper=Ge(n.offsets.popper),n.offsets.reference=Ge(n.offsets.reference),n=t(n,e))}),n}function at(e,n){return e.some(function(e){var t=e.name;return e.enabled&&t===n})}function lt(e){for(var t=[!1,"ms","Webkit","Moz","O"],n=e.charAt(0).toUpperCase()+e.slice(1),i=0;i<t.length;i++){var r=t[i],o=r?""+r+n:e;if("undefined"!=typeof document.body.style[o])return o}return null}function ct(e){var t=e.ownerDocument;return t?t.defaultView:window}function ut(e,t,n,i){n.updateBound=i,ct(e).addEventListener("resize",n.updateBound,{passive:!0});var r=je(e);return function e(t,n,i,r){var o="BODY"===t.nodeName,s=o?t.ownerDocument.defaultView:t;s.addEventListener(n,i,{passive:!0}),o||e(je(s.parentNode),n,i,r),r.push(s)}(r,"scroll",n.updateBound,n.scrollParents),n.scrollElement=r,n.eventsEnabled=!0,n}function ft(){var e,t;this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=(e=this.reference,t=this.state,ct(e).removeEventListener("resize",t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t))}function ht(e){return""!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function dt(n,i){Object.keys(i).forEach(function(e){var t="";-1!==["width","height","top","right","bottom","left"].indexOf(e)&&ht(i[e])&&(t="px"),n.style[e]=i[e]+t})}function pt(e,t,n){var i=ot(e,function(e){return e.name===t}),r=!!i&&e.some(function(e){return e.name===n&&e.enabled&&e.order<i.order});if(!r){var o="`"+t+"`",s="`"+n+"`";console.warn(s+" modifier is required by "+o+" modifier in order to work, be sure to include it before "+o+"!")}return r}var mt=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"],gt=mt.slice(3);function _t(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=gt.indexOf(e),i=gt.slice(n+1).concat(gt.slice(0,n));return t?i.reverse():i}var vt="flip",yt="clockwise",Et="counterclockwise";function bt(e,r,o,t){var s=[0,0],a=-1!==["right","left"].indexOf(t),n=e.split(/(\+|\-)/).map(function(e){return e.trim()}),i=n.indexOf(ot(n,function(e){return-1!==e.search(/,|\s/)}));n[i]&&-1===n[i].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,c=-1!==i?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];return(c=c.map(function(e,t){var n=(1===t?!a:a)?"height":"width",i=!1;return e.reduce(function(e,t){return""===e[e.length-1]&&-1!==["+","-"].indexOf(t)?(e[e.length-1]=t,i=!0,e):i?(e[e.length-1]+=t,i=!1,e):e.concat(t)},[]).map(function(e){return function(e,t,n,i){var r=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),o=+r[1],s=r[2];if(!o)return e;if(0===s.indexOf("%")){var a=void 0;switch(s){case"%p":a=n;break;case"%":case"%r":default:a=i}return Ge(a)[t]/100*o}if("vh"===s||"vw"===s)return("vh"===s?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*o;return o}(e,n,r,o)})})).forEach(function(n,i){n.forEach(function(e,t){ht(e)&&(s[i]+=e*("-"===n[t-1]?-1:1))})}),s}var wt={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,n=t.split("-")[0],i=t.split("-")[1];if(i){var r=e.offsets,o=r.reference,s=r.popper,a=-1!==["bottom","top"].indexOf(n),l=a?"left":"top",c=a?"width":"height",u={start:Ve({},l,o[l]),end:Ve({},l,o[l]+o[c]-s[c])};e.offsets.popper=ze({},s,u[i])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var n=t.offset,i=e.placement,r=e.offsets,o=r.popper,s=r.reference,a=i.split("-")[0],l=void 0;return l=ht(+n)?[+n,0]:bt(n,o,s,a),"left"===a?(o.top+=l[0],o.left-=l[1]):"right"===a?(o.top+=l[0],o.left+=l[1]):"top"===a?(o.left+=l[0],o.top-=l[1]):"bottom"===a&&(o.left+=l[0],o.top+=l[1]),e.popper=o,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,i){var t=i.boundariesElement||We(e.instance.popper);e.instance.reference===t&&(t=We(t));var n=lt("transform"),r=e.instance.popper.style,o=r.top,s=r.left,a=r[n];r.top="",r.left="",r[n]="";var l=$e(e.instance.popper,e.instance.reference,i.padding,t,e.positionFixed);r.top=o,r.left=s,r[n]=a,i.boundaries=l;var c=i.priority,u=e.offsets.popper,f={primary:function(e){var t=u[e];return u[e]<l[e]&&!i.escapeWithReference&&(t=Math.max(u[e],l[e])),Ve({},e,t)},secondary:function(e){var t="right"===e?"left":"top",n=u[t];return u[e]>l[e]&&!i.escapeWithReference&&(n=Math.min(u[t],l[e]-("right"===e?u.width:u.height))),Ve({},t,n)}};return c.forEach(function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";u=ze({},u,f[t](e))}),e.offsets.popper=u,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,i=t.reference,r=e.placement.split("-")[0],o=Math.floor,s=-1!==["top","bottom"].indexOf(r),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]<o(i[l])&&(e.offsets.popper[l]=o(i[l])-n[c]),n[l]>o(i[a])&&(e.offsets.popper[l]=o(i[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!pt(e.instance.modifiers,"arrow","keepTogether"))return e;var i=t.element;if("string"==typeof i){if(!(i=e.instance.popper.querySelector(i)))return e}else if(!e.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var r=e.placement.split("-")[0],o=e.offsets,s=o.popper,a=o.reference,l=-1!==["left","right"].indexOf(r),c=l?"height":"width",u=l?"Top":"Left",f=u.toLowerCase(),h=l?"left":"top",d=l?"bottom":"right",p=nt(i)[c];a[d]-p<s[f]&&(e.offsets.popper[f]-=s[f]-(a[d]-p)),a[f]+p>s[d]&&(e.offsets.popper[f]+=a[f]+p-s[d]),e.offsets.popper=Ge(e.offsets.popper);var m=a[f]+a[c]/2-p/2,g=Pe(e.instance.popper),_=parseFloat(g["margin"+u],10),v=parseFloat(g["border"+u+"Width"],10),y=m-e.offsets.popper[f]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),e.arrowElement=i,e.offsets.arrow=(Ve(n={},f,Math.round(y)),Ve(n,h,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(p,m){if(at(p.instance.modifiers,"inner"))return p;if(p.flipped&&p.placement===p.originalPlacement)return p;var g=$e(p.instance.popper,p.instance.reference,m.padding,m.boundariesElement,p.positionFixed),_=p.placement.split("-")[0],v=it(_),y=p.placement.split("-")[1]||"",E=[];switch(m.behavior){case vt:E=[_,v];break;case yt:E=_t(_);break;case Et:E=_t(_,!0);break;default:E=m.behavior}return E.forEach(function(e,t){if(_!==e||E.length===t+1)return p;_=p.placement.split("-")[0],v=it(_);var n,i=p.offsets.popper,r=p.offsets.reference,o=Math.floor,s="left"===_&&o(i.right)>o(r.left)||"right"===_&&o(i.left)<o(r.right)||"top"===_&&o(i.bottom)>o(r.top)||"bottom"===_&&o(i.top)<o(r.bottom),a=o(i.left)<o(g.left),l=o(i.right)>o(g.right),c=o(i.top)<o(g.top),u=o(i.bottom)>o(g.bottom),f="left"===_&&a||"right"===_&&l||"top"===_&&c||"bottom"===_&&u,h=-1!==["top","bottom"].indexOf(_),d=!!m.flipVariations&&(h&&"start"===y&&a||h&&"end"===y&&l||!h&&"start"===y&&c||!h&&"end"===y&&u);(s||f||d)&&(p.flipped=!0,(s||f)&&(_=E[t+1]),d&&(y="end"===(n=y)?"start":"start"===n?"end":n),p.placement=_+(y?"-"+y:""),p.offsets.popper=ze({},p.offsets.popper,rt(p.instance.popper,p.offsets.reference,p.placement)),p=st(p.instance.modifiers,p,"flip"))}),p},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],i=e.offsets,r=i.popper,o=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return r[s?"left":"top"]=o[n]-(a?r[s?"width":"height"]:0),e.placement=it(t),e.offsets.popper=Ge(r),e}},hide:{order:800,enabled:!0,fn:function(e){if(!pt(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=ot(e.instance.modifiers,function(e){return"preventOverflow"===e.name}).boundaries;if(t.bottom<n.top||t.left>n.right||t.top>n.bottom||t.right<n.left){if(!0===e.hide)return e;e.hide=!0,e.attributes["x-out-of-boundaries"]=""}else{if(!1===e.hide)return e;e.hide=!1,e.attributes["x-out-of-boundaries"]=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var n=t.x,i=t.y,r=e.offsets.popper,o=ot(e.instance.modifiers,function(e){return"applyStyle"===e.name}).gpuAcceleration;void 0!==o&&console.warn("WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!");var s=void 0!==o?o:t.gpuAcceleration,a=Je(We(e.instance.popper)),l={position:r.position},c={left:Math.floor(r.left),top:Math.round(r.top),bottom:Math.round(r.bottom),right:Math.floor(r.right)},u="bottom"===n?"top":"bottom",f="right"===i?"left":"right",h=lt("transform"),d=void 0,p=void 0;if(p="bottom"===u?-a.height+c.bottom:c.top,d="right"===f?-a.width+c.right:c.left,s&&h)l[h]="translate3d("+d+"px, "+p+"px, 0)",l[u]=0,l[f]=0,l.willChange="transform";else{var m="bottom"===u?-1:1,g="right"===f?-1:1;l[u]=p*m,l[f]=d*g,l.willChange=u+", "+f}var _={"x-placement":e.placement};return e.attributes=ze({},_,e.attributes),e.styles=ze({},l,e.styles),e.arrowStyles=ze({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:"bottom",y:"right"},applyStyle:{order:900,enabled:!0,fn:function(e){var t,n;return dt(e.instance.popper,e.styles),t=e.instance.popper,n=e.attributes,Object.keys(n).forEach(function(e){!1!==n[e]?t.setAttribute(e,n[e]):t.removeAttribute(e)}),e.arrowElement&&Object.keys(e.arrowStyles).length&&dt(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,n,i,r){var o=tt(r,t,e,n.positionFixed),s=et(n.placement,o,t,e,n.modifiers.flip.boundariesElement,n.modifiers.flip.padding);return t.setAttribute("x-placement",s),dt(t,{position:n.positionFixed?"fixed":"absolute"}),n},gpuAcceleration:void 0}}},Ct=function(){function o(e,t){var n=this,i=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=ke(this.update.bind(this)),this.options=ze({},o.Defaults,i),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=e&&e.jquery?e[0]:e,this.popper=t&&t.jquery?t[0]:t,this.options.modifiers={},Object.keys(ze({},o.Defaults.modifiers,i.modifiers)).forEach(function(e){n.options.modifiers[e]=ze({},o.Defaults.modifiers[e]||{},i.modifiers?i.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return ze({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(e){e.enabled&&xe(e.onLoad)&&e.onLoad(n.reference,n.popper,n.options,e,n.state)}),this.update();var r=this.options.eventsEnabled;r&&this.enableEventListeners(),this.state.eventsEnabled=r}return Ye(o,[{key:"update",value:function(){return function(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=tt(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=et(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=rt(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",e=st(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}.call(this)}},{key:"destroy",value:function(){return function(){return this.state.isDestroyed=!0,at(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[lt("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}.call(this)}},{key:"enableEventListeners",value:function(){return function(){this.state.eventsEnabled||(this.state=ut(this.reference,this.options,this.state,this.scheduleUpdate))}.call(this)}},{key:"disableEventListeners",value:function(){return ft.call(this)}}]),o}();Ct.Utils=("undefined"!=typeof window?window:global).PopperUtils,Ct.placements=mt,Ct.Defaults=wt;var Tt,St,Dt,At,It,Ot,Nt,kt,xt,Pt,Lt,jt,Ht,Mt,Ft,Wt,Rt,Ut,Bt,qt,Kt,Qt,Yt,Vt,zt,Gt,Jt,Zt,Xt,$t,en,tn,nn,rn,on,sn,an,ln,cn,un,fn,hn,dn,pn,mn,gn,_n,vn,yn,En,bn,wn,Cn,Tn,Sn,Dn,An,In,On,Nn,kn,xn,Pn,Ln,jn,Hn,Mn,Fn,Wn,Rn,Un,Bn,qn,Kn,Qn,Yn,Vn,zn,Gn,Jn,Zn,Xn,$n,ei,ti,ni,ii,ri,oi,si,ai,li,ci,ui,fi,hi,di,pi,mi,gi,_i,vi,yi,Ei,bi,wi,Ci,Ti,Si,Di,Ai,Ii,Oi,Ni,ki,xi,Pi,Li,ji,Hi,Mi,Fi,Wi,Ri,Ui,Bi=(St="dropdown",At="."+(Dt="bs.dropdown"),It=".data-api",Ot=(Tt=t).fn[St],Nt=new RegExp("38|40|27"),kt={HIDE:"hide"+At,HIDDEN:"hidden"+At,SHOW:"show"+At,SHOWN:"shown"+At,CLICK:"click"+At,CLICK_DATA_API:"click"+At+It,KEYDOWN_DATA_API:"keydown"+At+It,KEYUP_DATA_API:"keyup"+At+It},xt="disabled",Pt="show",Lt="dropup",jt="dropright",Ht="dropleft",Mt="dropdown-menu-right",Ft="position-static",Wt='[data-toggle="dropdown"]',Rt=".dropdown form",Ut=".dropdown-menu",Bt=".navbar-nav",qt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Kt="top-start",Qt="top-end",Yt="bottom-start",Vt="bottom-end",zt="right-start",Gt="left-start",Jt={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},Zt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Xt=function(){function c(e,t){this._element=e,this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var e=c.prototype;return e.toggle=function(){if(!this._element.disabled&&!Tt(this._element).hasClass(xt)){var e=c._getParentFromElement(this._element),t=Tt(this._menu).hasClass(Pt);if(c._clearMenus(),!t){var n={relatedTarget:this._element},i=Tt.Event(kt.SHOW,n);if(Tt(e).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof Ct)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var r=this._element;"parent"===this._config.reference?r=e:we.isElement(this._config.reference)&&(r=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(r=this._config.reference[0])),"scrollParent"!==this._config.boundary&&Tt(e).addClass(Ft),this._popper=new Ct(r,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===Tt(e).closest(Bt).length&&Tt(document.body).children().on("mouseover",null,Tt.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),Tt(this._menu).toggleClass(Pt),Tt(e).toggleClass(Pt).trigger(Tt.Event(kt.SHOWN,n))}}}},e.dispose=function(){Tt.removeData(this._element,Dt),Tt(this._element).off(At),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},e.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},e._addEventListeners=function(){var t=this;Tt(this._element).on(kt.CLICK,function(e){e.preventDefault(),e.stopPropagation(),t.toggle()})},e._getConfig=function(e){return e=l({},this.constructor.Default,Tt(this._element).data(),e),we.typeCheckConfig(St,e,this.constructor.DefaultType),e},e._getMenuElement=function(){if(!this._menu){var e=c._getParentFromElement(this._element);e&&(this._menu=e.querySelector(Ut))}return this._menu},e._getPlacement=function(){var e=Tt(this._element.parentNode),t=Yt;return e.hasClass(Lt)?(t=Kt,Tt(this._menu).hasClass(Mt)&&(t=Qt)):e.hasClass(jt)?t=zt:e.hasClass(Ht)?t=Gt:Tt(this._menu).hasClass(Mt)&&(t=Vt),t},e._detectNavbar=function(){return 0<Tt(this._element).closest(".navbar").length},e._getPopperConfig=function(){var t=this,e={};"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset;var n={placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(n.modifiers.applyStyle={enabled:!1}),n},c._jQueryInterface=function(t){return this.each(function(){var e=Tt(this).data(Dt);if(e||(e=new c(this,"object"==typeof t?t:null),Tt(this).data(Dt,e)),"string"==typeof t){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}})},c._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var t=[].slice.call(document.querySelectorAll(Wt)),n=0,i=t.length;n<i;n++){var r=c._getParentFromElement(t[n]),o=Tt(t[n]).data(Dt),s={relatedTarget:t[n]};if(e&&"click"===e.type&&(s.clickEvent=e),o){var a=o._menu;if(Tt(r).hasClass(Pt)&&!(e&&("click"===e.type&&/input|textarea/i.test(e.target.tagName)||"keyup"===e.type&&9===e.which)&&Tt.contains(r,e.target))){var l=Tt.Event(kt.HIDE,s);Tt(r).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&Tt(document.body).children().off("mouseover",null,Tt.noop),t[n].setAttribute("aria-expanded","false"),Tt(a).removeClass(Pt),Tt(r).removeClass(Pt).trigger(Tt.Event(kt.HIDDEN,s)))}}}},c._getParentFromElement=function(e){var t,n=we.getSelectorFromElement(e);return n&&(t=document.querySelector(n)),t||e.parentNode},c._dataApiKeydownHandler=function(e){if((/input|textarea/i.test(e.target.tagName)?!(32===e.which||27!==e.which&&(40!==e.which&&38!==e.which||Tt(e.target).closest(Ut).length)):Nt.test(e.which))&&(e.preventDefault(),e.stopPropagation(),!this.disabled&&!Tt(this).hasClass(xt))){var t=c._getParentFromElement(this),n=Tt(t).hasClass(Pt);if((n||27===e.which&&32===e.which)&&(!n||27!==e.which&&32!==e.which)){var i=[].slice.call(t.querySelectorAll(qt));if(0!==i.length){var r=i.indexOf(e.target);38===e.which&&0<r&&r--,40===e.which&&r<i.length-1&&r++,r<0&&(r=0),i[r].focus()}}else{if(27===e.which){var o=t.querySelector(Wt);Tt(o).trigger("focus")}Tt(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return Jt}},{key:"DefaultType",get:function(){return Zt}}]),c}(),Tt(document).on(kt.KEYDOWN_DATA_API,Wt,Xt._dataApiKeydownHandler).on(kt.KEYDOWN_DATA_API,Ut,Xt._dataApiKeydownHandler).on(kt.CLICK_DATA_API+" "+kt.KEYUP_DATA_API,Xt._clearMenus).on(kt.CLICK_DATA_API,Wt,function(e){e.preventDefault(),e.stopPropagation(),Xt._jQueryInterface.call(Tt(this),"toggle")}).on(kt.CLICK_DATA_API,Rt,function(e){e.stopPropagation()}),Tt.fn[St]=Xt._jQueryInterface,Tt.fn[St].Constructor=Xt,Tt.fn[St].noConflict=function(){return Tt.fn[St]=Ot,Xt._jQueryInterface},Xt),qi=(en="modal",nn="."+(tn="bs.modal"),rn=($t=t).fn[en],on={backdrop:!0,keyboard:!0,focus:!0,show:!0},sn={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},an={HIDE:"hide"+nn,HIDDEN:"hidden"+nn,SHOW:"show"+nn,SHOWN:"shown"+nn,FOCUSIN:"focusin"+nn,RESIZE:"resize"+nn,CLICK_DISMISS:"click.dismiss"+nn,KEYDOWN_DISMISS:"keydown.dismiss"+nn,MOUSEUP_DISMISS:"mouseup.dismiss"+nn,MOUSEDOWN_DISMISS:"mousedown.dismiss"+nn,CLICK_DATA_API:"click"+nn+".data-api"},ln="modal-scrollbar-measure",cn="modal-backdrop",un="modal-open",fn="fade",hn="show",dn=".modal-dialog",pn='[data-toggle="modal"]',mn='[data-dismiss="modal"]',gn=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",_n=".sticky-top",vn=function(){function r(e,t){this._config=this._getConfig(t),this._element=e,this._dialog=e.querySelector(dn),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._scrollbarWidth=0}var e=r.prototype;return e.toggle=function(e){return this._isShown?this.hide():this.show(e)},e.show=function(e){var t=this;if(!this._isTransitioning&&!this._isShown){$t(this._element).hasClass(fn)&&(this._isTransitioning=!0);var n=$t.Event(an.SHOW,{relatedTarget:e});$t(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),$t(document.body).addClass(un),this._setEscapeEvent(),this._setResizeEvent(),$t(this._element).on(an.CLICK_DISMISS,mn,function(e){return t.hide(e)}),$t(this._dialog).on(an.MOUSEDOWN_DISMISS,function(){$t(t._element).one(an.MOUSEUP_DISMISS,function(e){$t(e.target).is(t._element)&&(t._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return t._showElement(e)}))}},e.hide=function(e){var t=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var n=$t.Event(an.HIDE);if($t(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=$t(this._element).hasClass(fn);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),$t(document).off(an.FOCUSIN),$t(this._element).removeClass(hn),$t(this._element).off(an.CLICK_DISMISS),$t(this._dialog).off(an.MOUSEDOWN_DISMISS),i){var r=we.getTransitionDurationFromElement(this._element);$t(this._element).one(we.TRANSITION_END,function(e){return t._hideModal(e)}).emulateTransitionEnd(r)}else this._hideModal()}}},e.dispose=function(){$t.removeData(this._element,tn),$t(window,document,this._element,this._backdrop).off(nn),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},e.handleUpdate=function(){this._adjustDialog()},e._getConfig=function(e){return e=l({},on,e),we.typeCheckConfig(en,e,sn),e},e._showElement=function(e){var t=this,n=$t(this._element).hasClass(fn);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,n&&we.reflow(this._element),$t(this._element).addClass(hn),this._config.focus&&this._enforceFocus();var i=$t.Event(an.SHOWN,{relatedTarget:e}),r=function(){t._config.focus&&t._element.focus(),t._isTransitioning=!1,$t(t._element).trigger(i)};if(n){var o=we.getTransitionDurationFromElement(this._element);$t(this._dialog).one(we.TRANSITION_END,r).emulateTransitionEnd(o)}else r()},e._enforceFocus=function(){var t=this;$t(document).off(an.FOCUSIN).on(an.FOCUSIN,function(e){document!==e.target&&t._element!==e.target&&0===$t(t._element).has(e.target).length&&t._element.focus()})},e._setEscapeEvent=function(){var t=this;this._isShown&&this._config.keyboard?$t(this._element).on(an.KEYDOWN_DISMISS,function(e){27===e.which&&(e.preventDefault(),t.hide())}):this._isShown||$t(this._element).off(an.KEYDOWN_DISMISS)},e._setResizeEvent=function(){var t=this;this._isShown?$t(window).on(an.RESIZE,function(e){return t.handleUpdate(e)}):$t(window).off(an.RESIZE)},e._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){$t(document.body).removeClass(un),e._resetAdjustments(),e._resetScrollbar(),$t(e._element).trigger(an.HIDDEN)})},e._removeBackdrop=function(){this._backdrop&&($t(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(e){var t=this,n=$t(this._element).hasClass(fn)?fn:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=cn,n&&this._backdrop.classList.add(n),$t(this._backdrop).appendTo(document.body),$t(this._element).on(an.CLICK_DISMISS,function(e){t._ignoreBackdropClick?t._ignoreBackdropClick=!1:e.target===e.currentTarget&&("static"===t._config.backdrop?t._element.focus():t.hide())}),n&&we.reflow(this._backdrop),$t(this._backdrop).addClass(hn),!e)return;if(!n)return void e();var i=we.getTransitionDurationFromElement(this._backdrop);$t(this._backdrop).one(we.TRANSITION_END,e).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){$t(this._backdrop).removeClass(hn);var r=function(){t._removeBackdrop(),e&&e()};if($t(this._element).hasClass(fn)){var o=we.getTransitionDurationFromElement(this._backdrop);$t(this._backdrop).one(we.TRANSITION_END,r).emulateTransitionEnd(o)}else r()}else e&&e()},e._adjustDialog=function(){var e=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=e.left+e.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},e._setScrollbar=function(){var r=this;if(this._isBodyOverflowing){var e=[].slice.call(document.querySelectorAll(gn)),t=[].slice.call(document.querySelectorAll(_n));$t(e).each(function(e,t){var n=t.style.paddingRight,i=$t(t).css("padding-right");$t(t).data("padding-right",n).css("padding-right",parseFloat(i)+r._scrollbarWidth+"px")}),$t(t).each(function(e,t){var n=t.style.marginRight,i=$t(t).css("margin-right");$t(t).data("margin-right",n).css("margin-right",parseFloat(i)-r._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=$t(document.body).css("padding-right");$t(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}},e._resetScrollbar=function(){var e=[].slice.call(document.querySelectorAll(gn));$t(e).each(function(e,t){var n=$t(t).data("padding-right");$t(t).removeData("padding-right"),t.style.paddingRight=n||""});var t=[].slice.call(document.querySelectorAll(""+_n));$t(t).each(function(e,t){var n=$t(t).data("margin-right");"undefined"!=typeof n&&$t(t).css("margin-right",n).removeData("margin-right")});var n=$t(document.body).data("padding-right");$t(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},e._getScrollbarWidth=function(){var e=document.createElement("div");e.className=ln,document.body.appendChild(e);var t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t},r._jQueryInterface=function(n,i){return this.each(function(){var e=$t(this).data(tn),t=l({},on,$t(this).data(),"object"==typeof n&&n?n:{});if(e||(e=new r(this,t),$t(this).data(tn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](i)}else t.show&&e.show(i)})},s(r,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return on}}]),r}(),$t(document).on(an.CLICK_DATA_API,pn,function(e){var t,n=this,i=we.getSelectorFromElement(this);i&&(t=document.querySelector(i));var r=$t(t).data(tn)?"toggle":l({},$t(t).data(),$t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var o=$t(t).one(an.SHOW,function(e){e.isDefaultPrevented()||o.one(an.HIDDEN,function(){$t(n).is(":visible")&&n.focus()})});vn._jQueryInterface.call($t(t),r,this)}),$t.fn[en]=vn._jQueryInterface,$t.fn[en].Constructor=vn,$t.fn[en].noConflict=function(){return $t.fn[en]=rn,vn._jQueryInterface},vn),Ki=(En="tooltip",wn="."+(bn="bs.tooltip"),Cn=(yn=t).fn[En],Tn="bs-tooltip",Sn=new RegExp("(^|\\s)"+Tn+"\\S+","g"),In={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!(An={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"}),selector:!(Dn={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"}),placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},Nn="out",kn={HIDE:"hide"+wn,HIDDEN:"hidden"+wn,SHOW:(On="show")+wn,SHOWN:"shown"+wn,INSERTED:"inserted"+wn,CLICK:"click"+wn,FOCUSIN:"focusin"+wn,FOCUSOUT:"focusout"+wn,MOUSEENTER:"mouseenter"+wn,MOUSELEAVE:"mouseleave"+wn},xn="fade",Pn="show",Ln=".tooltip-inner",jn=".arrow",Hn="hover",Mn="focus",Fn="click",Wn="manual",Rn=function(){function i(e,t){if("undefined"==typeof Ct)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var e=i.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=yn(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),yn(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(yn(this.getTipElement()).hasClass(Pn))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),yn.removeData(this.element,this.constructor.DATA_KEY),yn(this.element).off(this.constructor.EVENT_KEY),yn(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&yn(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===yn(this.element).css("display"))throw new Error("Please use show on visible elements");var e=yn.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){yn(this.element).trigger(e);var n=yn.contains(this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!n)return;var i=this.getTipElement(),r=we.getUID(this.constructor.NAME);i.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&yn(i).addClass(xn);var o="function"==typeof this.config.placement?this.config.placement.call(this,i,this.element):this.config.placement,s=this._getAttachment(o);this.addAttachmentClass(s);var a=!1===this.config.container?document.body:yn(document).find(this.config.container);yn(i).data(this.constructor.DATA_KEY,this),yn.contains(this.element.ownerDocument.documentElement,this.tip)||yn(i).appendTo(a),yn(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new Ct(this.element,i,{placement:s,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:jn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){t._handlePopperPlacementChange(e)}}),yn(i).addClass(Pn),"ontouchstart"in document.documentElement&&yn(document.body).children().on("mouseover",null,yn.noop);var l=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,yn(t.element).trigger(t.constructor.Event.SHOWN),e===Nn&&t._leave(null,t)};if(yn(this.tip).hasClass(xn)){var c=we.getTransitionDurationFromElement(this.tip);yn(this.tip).one(we.TRANSITION_END,l).emulateTransitionEnd(c)}else l()}},e.hide=function(e){var t=this,n=this.getTipElement(),i=yn.Event(this.constructor.Event.HIDE),r=function(){t._hoverState!==On&&n.parentNode&&n.parentNode.removeChild(n),t._cleanTipClass(),t.element.removeAttribute("aria-describedby"),yn(t.element).trigger(t.constructor.Event.HIDDEN),null!==t._popper&&t._popper.destroy(),e&&e()};if(yn(this.element).trigger(i),!i.isDefaultPrevented()){if(yn(n).removeClass(Pn),"ontouchstart"in document.documentElement&&yn(document.body).children().off("mouseover",null,yn.noop),this._activeTrigger[Fn]=!1,this._activeTrigger[Mn]=!1,this._activeTrigger[Hn]=!1,yn(this.tip).hasClass(xn)){var o=we.getTransitionDurationFromElement(n);yn(n).one(we.TRANSITION_END,r).emulateTransitionEnd(o)}else r();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(e){yn(this.getTipElement()).addClass(Tn+"-"+e)},e.getTipElement=function(){return this.tip=this.tip||yn(this.config.template)[0],this.tip},e.setContent=function(){var e=this.getTipElement();this.setElementContent(yn(e.querySelectorAll(Ln)),this.getTitle()),yn(e).removeClass(xn+" "+Pn)},e.setElementContent=function(e,t){var n=this.config.html;"object"==typeof t&&(t.nodeType||t.jquery)?n?yn(t).parent().is(e)||e.empty().append(t):e.text(yn(t).text()):e[n?"html":"text"](t)},e.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e||(e="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),e},e._getAttachment=function(e){return An[e.toUpperCase()]},e._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)yn(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(e){return i.toggle(e)});else if(e!==Wn){var t=e===Hn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=e===Hn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;yn(i.element).on(t,i.config.selector,function(e){return i._enter(e)}).on(n,i.config.selector,function(e){return i._leave(e)})}yn(i.element).closest(".modal").on("hide.bs.modal",function(){return i.hide()})}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==e)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||yn(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),yn(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?Mn:Hn]=!0),yn(t.getTipElement()).hasClass(Pn)||t._hoverState===On?t._hoverState=On:(clearTimeout(t._timeout),t._hoverState=On,t.config.delay&&t.config.delay.show?t._timeout=setTimeout(function(){t._hoverState===On&&t.show()},t.config.delay.show):t.show())},e._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||yn(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),yn(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?Mn:Hn]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState=Nn,t.config.delay&&t.config.delay.hide?t._timeout=setTimeout(function(){t._hoverState===Nn&&t.hide()},t.config.delay.hide):t.hide())},e._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},e._getConfig=function(e){return"number"==typeof(e=l({},this.constructor.Default,yn(this.element).data(),"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),we.typeCheckConfig(En,e,this.constructor.DefaultType),e},e._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},e._cleanTipClass=function(){var e=yn(this.getTipElement()),t=e.attr("class").match(Sn);null!==t&&t.length&&e.removeClass(t.join(""))},e._handlePopperPlacementChange=function(e){var t=e.instance;this.tip=t.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},e._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(yn(e).removeClass(xn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},i._jQueryInterface=function(n){return this.each(function(){var e=yn(this).data(bn),t="object"==typeof n&&n;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),yn(this).data(bn,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return In}},{key:"NAME",get:function(){return En}},{key:"DATA_KEY",get:function(){return bn}},{key:"Event",get:function(){return kn}},{key:"EVENT_KEY",get:function(){return wn}},{key:"DefaultType",get:function(){return Dn}}]),i}(),yn.fn[En]=Rn._jQueryInterface,yn.fn[En].Constructor=Rn,yn.fn[En].noConflict=function(){return yn.fn[En]=Cn,Rn._jQueryInterface},Rn),Qi=(Bn="popover",Kn="."+(qn="bs.popover"),Qn=(Un=t).fn[Bn],Yn="bs-popover",Vn=new RegExp("(^|\\s)"+Yn+"\\S+","g"),zn=l({},Ki.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),Gn=l({},Ki.DefaultType,{content:"(string|element|function)"}),Jn="fade",Xn=".popover-header",$n=".popover-body",ei={HIDE:"hide"+Kn,HIDDEN:"hidden"+Kn,SHOW:(Zn="show")+Kn,SHOWN:"shown"+Kn,INSERTED:"inserted"+Kn,CLICK:"click"+Kn,FOCUSIN:"focusin"+Kn,FOCUSOUT:"focusout"+Kn,MOUSEENTER:"mouseenter"+Kn,MOUSELEAVE:"mouseleave"+Kn},ti=function(e){var t,n;function i(){return e.apply(this,arguments)||this}n=e,(t=i).prototype=Object.create(n.prototype),(t.prototype.constructor=t).__proto__=n;var r=i.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(e){Un(this.getTipElement()).addClass(Yn+"-"+e)},r.getTipElement=function(){return this.tip=this.tip||Un(this.config.template)[0],this.tip},r.setContent=function(){var e=Un(this.getTipElement());this.setElementContent(e.find(Xn),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find($n),t),e.removeClass(Jn+" "+Zn)},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var e=Un(this.getTipElement()),t=e.attr("class").match(Vn);null!==t&&0<t.length&&e.removeClass(t.join(""))},i._jQueryInterface=function(n){return this.each(function(){var e=Un(this).data(qn),t="object"==typeof n?n:null;if((e||!/destroy|hide/.test(n))&&(e||(e=new i(this,t),Un(this).data(qn,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return zn}},{key:"NAME",get:function(){return Bn}},{key:"DATA_KEY",get:function(){return qn}},{key:"Event",get:function(){return ei}},{key:"EVENT_KEY",get:function(){return Kn}},{key:"DefaultType",get:function(){return Gn}}]),i}(Ki),Un.fn[Bn]=ti._jQueryInterface,Un.fn[Bn].Constructor=ti,Un.fn[Bn].noConflict=function(){return Un.fn[Bn]=Qn,ti._jQueryInterface},ti),Yi=(ii="scrollspy",oi="."+(ri="bs.scrollspy"),si=(ni=t).fn[ii],ai={offset:10,method:"auto",target:""},li={offset:"number",method:"string",target:"(string|element)"},ci={ACTIVATE:"activate"+oi,SCROLL:"scroll"+oi,LOAD_DATA_API:"load"+oi+".data-api"},ui="dropdown-item",fi="active",hi='[data-spy="scroll"]',di=".active",pi=".nav, .list-group",mi=".nav-link",gi=".nav-item",_i=".list-group-item",vi=".dropdown",yi=".dropdown-item",Ei=".dropdown-toggle",bi="offset",wi="position",Ci=function(){function n(e,t){var n=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(t),this._selector=this._config.target+" "+mi+","+this._config.target+" "+_i+","+this._config.target+" "+yi,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,ni(this._scrollElement).on(ci.SCROLL,function(e){return n._process(e)}),this.refresh(),this._process()}var e=n.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?bi:wi,r="auto"===this._config.method?e:this._config.method,o=r===wi?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(e){var t,n=we.getSelectorFromElement(e);if(n&&(t=document.querySelector(n)),t){var i=t.getBoundingClientRect();if(i.width||i.height)return[ni(t)[r]().top+o,n]}return null}).filter(function(e){return e}).sort(function(e,t){return e[0]-t[0]}).forEach(function(e){t._offsets.push(e[0]),t._targets.push(e[1])})},e.dispose=function(){ni.removeData(this._element,ri),ni(this._scrollElement).off(oi),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(e){if("string"!=typeof(e=l({},ai,"object"==typeof e&&e?e:{})).target){var t=ni(e.target).attr("id");t||(t=we.getUID(ii),ni(e.target).attr("id",t)),e.target="#"+t}return we.typeCheckConfig(ii,e,li),e},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),n<=e){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&e<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var r=this._offsets.length;r--;){this._activeTarget!==this._targets[r]&&e>=this._offsets[r]&&("undefined"==typeof this._offsets[r+1]||e<this._offsets[r+1])&&this._activate(this._targets[r])}}},e._activate=function(t){this._activeTarget=t,this._clear();var e=this._selector.split(",");e=e.map(function(e){return e+'[data-target="'+t+'"],'+e+'[href="'+t+'"]'});var n=ni([].slice.call(document.querySelectorAll(e.join(","))));n.hasClass(ui)?(n.closest(vi).find(Ei).addClass(fi),n.addClass(fi)):(n.addClass(fi),n.parents(pi).prev(mi+", "+_i).addClass(fi),n.parents(pi).prev(gi).children(mi).addClass(fi)),ni(this._scrollElement).trigger(ci.ACTIVATE,{relatedTarget:t})},e._clear=function(){var e=[].slice.call(document.querySelectorAll(this._selector));ni(e).filter(di).removeClass(fi)},n._jQueryInterface=function(t){return this.each(function(){var e=ni(this).data(ri);if(e||(e=new n(this,"object"==typeof t&&t),ni(this).data(ri,e)),"string"==typeof t){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return ai}}]),n}(),ni(window).on(ci.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(hi)),t=e.length;t--;){var n=ni(e[t]);Ci._jQueryInterface.call(n,n.data())}}),ni.fn[ii]=Ci._jQueryInterface,ni.fn[ii].Constructor=Ci,ni.fn[ii].noConflict=function(){return ni.fn[ii]=si,Ci._jQueryInterface},Ci),Vi=(Di="."+(Si="bs.tab"),Ai=(Ti=t).fn.tab,Ii={HIDE:"hide"+Di,HIDDEN:"hidden"+Di,SHOW:"show"+Di,SHOWN:"shown"+Di,CLICK_DATA_API:"click"+Di+".data-api"},Oi="dropdown-menu",Ni="active",ki="disabled",xi="fade",Pi="show",Li=".dropdown",ji=".nav, .list-group",Hi=".active",Mi="> li > .active",Fi='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',Wi=".dropdown-toggle",Ri="> .dropdown-menu .active",Ui=function(){function i(e){this._element=e}var e=i.prototype;return e.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&Ti(this._element).hasClass(Ni)||Ti(this._element).hasClass(ki))){var e,i,t=Ti(this._element).closest(ji)[0],r=we.getSelectorFromElement(this._element);if(t){var o="UL"===t.nodeName?Mi:Hi;i=(i=Ti.makeArray(Ti(t).find(o)))[i.length-1]}var s=Ti.Event(Ii.HIDE,{relatedTarget:this._element}),a=Ti.Event(Ii.SHOW,{relatedTarget:i});if(i&&Ti(i).trigger(s),Ti(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){r&&(e=document.querySelector(r)),this._activate(this._element,t);var l=function(){var e=Ti.Event(Ii.HIDDEN,{relatedTarget:n._element}),t=Ti.Event(Ii.SHOWN,{relatedTarget:i});Ti(i).trigger(e),Ti(n._element).trigger(t)};e?this._activate(e,e.parentNode,l):l()}}},e.dispose=function(){Ti.removeData(this._element,Si),this._element=null},e._activate=function(e,t,n){var i=this,r=("UL"===t.nodeName?Ti(t).find(Mi):Ti(t).children(Hi))[0],o=n&&r&&Ti(r).hasClass(xi),s=function(){return i._transitionComplete(e,r,n)};if(r&&o){var a=we.getTransitionDurationFromElement(r);Ti(r).one(we.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},e._transitionComplete=function(e,t,n){if(t){Ti(t).removeClass(Pi+" "+Ni);var i=Ti(t.parentNode).find(Ri)[0];i&&Ti(i).removeClass(Ni),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}if(Ti(e).addClass(Ni),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),we.reflow(e),Ti(e).addClass(Pi),e.parentNode&&Ti(e.parentNode).hasClass(Oi)){var r=Ti(e).closest(Li)[0];if(r){var o=[].slice.call(r.querySelectorAll(Wi));Ti(o).addClass(Ni)}e.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var e=Ti(this),t=e.data(Si);if(t||(t=new i(this),e.data(Si,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}}]),i}(),Ti(document).on(Ii.CLICK_DATA_API,Fi,function(e){e.preventDefault(),Ui._jQueryInterface.call(Ti(this),"show")}),Ti.fn.tab=Ui._jQueryInterface,Ti.fn.tab.Constructor=Ui,Ti.fn.tab.noConflict=function(){return Ti.fn.tab=Ai,Ui._jQueryInterface},Ui);!function(e){if("undefined"==typeof e)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(t),e.Util=we,e.Alert=Ce,e.Button=Te,e.Carousel=Se,e.Collapse=De,e.Dropdown=Bi,e.Modal=qi,e.Popover=Qi,e.Scrollspy=Yi,e.Tab=Vi,e.Tooltip=Ki,Object.defineProperty(e,"__esModule",{value:!0})});
-//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file
+/*!
+ * Bootstrap v4.1.3 (https://getbootstrap.com/)
+ * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],t):t(e.bootstrap={},e.jQuery)}(this,function(e,t){"use strict";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function s(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}function l(r){for(var e=1;e<arguments.length;e++){var o=null!=arguments[e]?arguments[e]:{},t=Object.keys(o);"function"==typeof Object.getOwnPropertySymbols&&(t=t.concat(Object.getOwnPropertySymbols(o).filter(function(e){return Object.getOwnPropertyDescriptor(o,e).enumerable}))),t.forEach(function(e){var t,n,i;t=r,i=o[n=e],n in t?Object.defineProperty(t,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[n]=i})}return r}for(var r,n,o,a,c,u,f,h,d,p,m,g,_,v,y,E,b,w,C,T,S,D,A,I,O,N,k,x,P,L,j,H,M,F,W,R,U,B,q,K,Q,Y,V,z,G,J,Z,X,$,ee,te,ne,ie,re,oe,se,ae,le,ce,ue,fe,he,de,pe,me,ge,_e,ve,ye,Ee,be,we=function(i){var t="transitionend";function e(e){var t=this,n=!1;return i(this).one(l.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||l.triggerTransitionEnd(t)},e),this}var l={TRANSITION_END:"bsTransitionEnd",getUID:function(e){for(;e+=~~(1e6*Math.random()),document.getElementById(e););return e},getSelectorFromElement:function(e){var t=e.getAttribute("data-target");t&&"#"!==t||(t=e.getAttribute("href")||"");try{return document.querySelector(t)?t:null}catch(e){return null}},getTransitionDurationFromElement:function(e){if(!e)return 0;var t=i(e).css("transition-duration");return parseFloat(t)?(t=t.split(",")[0],1e3*parseFloat(t)):0},reflow:function(e){return e.offsetHeight},triggerTransitionEnd:function(e){i(e).trigger(t)},supportsTransitionEnd:function(){return Boolean(t)},isElement:function(e){return(e[0]||e).nodeType},typeCheckConfig:function(e,t,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var r=n[i],o=t[i],s=o&&l.isElement(o)?"element":(a=o,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(r).test(s))throw new Error(e.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+r+'".')}var a}};return i.fn.emulateTransitionEnd=e,i.event.special[l.TRANSITION_END]={bindType:t,delegateType:t,handle:function(e){if(i(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}},l}(t=t&&t.hasOwnProperty("default")?t.default:t),Ce=(n="alert",a="."+(o="bs.alert"),c=(r=t).fn[n],u={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},f="alert",h="fade",d="show",p=function(){function i(e){this._element=e}var e=i.prototype;return e.close=function(e){var t=this._element;e&&(t=this._getRootElement(e)),this._triggerCloseEvent(t).isDefaultPrevented()||this._removeElement(t)},e.dispose=function(){r.removeData(this._element,o),this._element=null},e._getRootElement=function(e){var t=we.getSelectorFromElement(e),n=!1;return t&&(n=document.querySelector(t)),n||(n=r(e).closest("."+f)[0]),n},e._triggerCloseEvent=function(e){var t=r.Event(u.CLOSE);return r(e).trigger(t),t},e._removeElement=function(t){var n=this;if(r(t).removeClass(d),r(t).hasClass(h)){var e=we.getTransitionDurationFromElement(t);r(t).one(we.TRANSITION_END,function(e){return n._destroyElement(t,e)}).emulateTransitionEnd(e)}else this._destroyElement(t)},e._destroyElement=function(e){r(e).detach().trigger(u.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var e=r(this),t=e.data(o);t||(t=new i(this),e.data(o,t)),"close"===n&&t[n](this)})},i._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}}]),i}(),r(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',p._handleDismiss(new p)),r.fn[n]=p._jQueryInterface,r.fn[n].Constructor=p,r.fn[n].noConflict=function(){return r.fn[n]=c,p._jQueryInterface},p),Te=(g="button",v="."+(_="bs.button"),y=".data-api",E=(m=t).fn[g],b="active",w="btn",T='[data-toggle^="button"]',S='[data-toggle="buttons"]',D="input",A=".active",I=".btn",O={CLICK_DATA_API:"click"+v+y,FOCUS_BLUR_DATA_API:(C="focus")+v+y+" blur"+v+y},N=function(){function n(e){this._element=e}var e=n.prototype;return e.toggle=function(){var e=!0,t=!0,n=m(this._element).closest(S)[0];if(n){var i=this._element.querySelector(D);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(b))e=!1;else{var r=n.querySelector(A);r&&m(r).removeClass(b)}if(e){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!this._element.classList.contains(b),m(i).trigger("change")}i.focus(),t=!1}}t&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(b)),e&&m(this._element).toggleClass(b)},e.dispose=function(){m.removeData(this._element,_),this._element=null},n._jQueryInterface=function(t){return this.each(function(){var e=m(this).data(_);e||(e=new n(this),m(this).data(_,e)),"toggle"===t&&e[t]()})},s(n,null,[{key:"VERSION",get:function(){return"4.1.3"}}]),n}(),m(document).on(O.CLICK_DATA_API,T,function(e){e.preventDefault();var t=e.target;m(t).hasClass(w)||(t=m(t).closest(I)),N._jQueryInterface.call(m(t),"toggle")}).on(O.FOCUS_BLUR_DATA_API,T,function(e){var t=m(e.target).closest(I)[0];m(t).toggleClass(C,/^focus(in)?$/.test(e.type))}),m.fn[g]=N._jQueryInterface,m.fn[g].Constructor=N,m.fn[g].noConflict=function(){return m.fn[g]=E,N._jQueryInterface},N),Se=(x="carousel",L="."+(P="bs.carousel"),j=".data-api",H=(k=t).fn[x],M={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},F={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},W="next",R="prev",U="left",B="right",q={SLIDE:"slide"+L,SLID:"slid"+L,KEYDOWN:"keydown"+L,MOUSEENTER:"mouseenter"+L,MOUSELEAVE:"mouseleave"+L,TOUCHEND:"touchend"+L,LOAD_DATA_API:"load"+L+j,CLICK_DATA_API:"click"+L+j},K="carousel",Q="active",Y="slide",V="carousel-item-right",z="carousel-item-left",G="carousel-item-next",J="carousel-item-prev",Z=".active",X=".active.carousel-item",$=".carousel-item",ee=".carousel-item-next, .carousel-item-prev",te=".carousel-indicators",ne="[data-slide], [data-slide-to]",ie='[data-ride="carousel"]',re=function(){function o(e,t){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(t),this._element=k(e)[0],this._indicatorsElement=this._element.querySelector(te),this._addEventListeners()}var e=o.prototype;return e.next=function(){this._isSliding||this._slide(W)},e.nextWhenVisible=function(){!document.hidden&&k(this._element).is(":visible")&&"hidden"!==k(this._element).css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(R)},e.pause=function(e){e||(this._isPaused=!0),this._element.querySelector(ee)&&(we.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(e){var t=this;this._activeElement=this._element.querySelector(X);var n=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)k(this._element).one(q.SLID,function(){return t.to(e)});else{if(n===e)return this.pause(),void this.cycle();var i=n<e?W:R;this._slide(i,this._items[e])}},e.dispose=function(){k(this._element).off(L),k.removeData(this._element,P),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(e){return e=l({},M,e),we.typeCheckConfig(x,e,F),e},e._addEventListeners=function(){var t=this;this._config.keyboard&&k(this._element).on(q.KEYDOWN,function(e){return t._keydown(e)}),"hover"===this._config.pause&&(k(this._element).on(q.MOUSEENTER,function(e){return t.pause(e)}).on(q.MOUSELEAVE,function(e){return t.cycle(e)}),"ontouchstart"in document.documentElement&&k(this._element).on(q.TOUCHEND,function(){t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout(function(e){return t.cycle(e)},500+t._config.interval)}))},e._keydown=function(e){if(!/input|textarea/i.test(e.target.tagName))switch(e.which){case 37:e.preventDefault(),this.prev();break;case 39:e.preventDefault(),this.next()}},e._getItemIndex=function(e){return this._items=e&&e.parentNode?[].slice.call(e.parentNode.querySelectorAll($)):[],this._items.indexOf(e)},e._getItemByDirection=function(e,t){var n=e===W,i=e===R,r=this._getItemIndex(t),o=this._items.length-1;if((i&&0===r||n&&r===o)&&!this._config.wrap)return t;var s=(r+(e===R?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},e._triggerSlideEvent=function(e,t){var n=this._getItemIndex(e),i=this._getItemIndex(this._element.querySelector(X)),r=k.Event(q.SLIDE,{relatedTarget:e,direction:t,from:i,to:n});return k(this._element).trigger(r),r},e._setActiveIndicatorElement=function(e){if(this._indicatorsElement){var t=[].slice.call(this._indicatorsElement.querySelectorAll(Z));k(t).removeClass(Q);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&k(n).addClass(Q)}},e._slide=function(e,t){var n,i,r,o=this,s=this._element.querySelector(X),a=this._getItemIndex(s),l=t||s&&this._getItemByDirection(e,s),c=this._getItemIndex(l),u=Boolean(this._interval);if(e===W?(n=z,i=G,r=U):(n=V,i=J,r=B),l&&k(l).hasClass(Q))this._isSliding=!1;else if(!this._triggerSlideEvent(l,r).isDefaultPrevented()&&s&&l){this._isSliding=!0,u&&this.pause(),this._setActiveIndicatorElement(l);var f=k.Event(q.SLID,{relatedTarget:l,direction:r,from:a,to:c});if(k(this._element).hasClass(Y)){k(l).addClass(i),we.reflow(l),k(s).addClass(n),k(l).addClass(n);var h=we.getTransitionDurationFromElement(s);k(s).one(we.TRANSITION_END,function(){k(l).removeClass(n+" "+i).addClass(Q),k(s).removeClass(Q+" "+i+" "+n),o._isSliding=!1,setTimeout(function(){return k(o._element).trigger(f)},0)}).emulateTransitionEnd(h)}else k(s).removeClass(Q),k(l).addClass(Q),this._isSliding=!1,k(this._element).trigger(f);u&&this.cycle()}},o._jQueryInterface=function(i){return this.each(function(){var e=k(this).data(P),t=l({},M,k(this).data());"object"==typeof i&&(t=l({},t,i));var n="string"==typeof i?i:t.slide;if(e||(e=new o(this,t),k(this).data(P,e)),"number"==typeof i)e.to(i);else if("string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}else t.interval&&(e.pause(),e.cycle())})},o._dataApiClickHandler=function(e){var t=we.getSelectorFromElement(this);if(t){var n=k(t)[0];if(n&&k(n).hasClass(K)){var i=l({},k(n).data(),k(this).data()),r=this.getAttribute("data-slide-to");r&&(i.interval=!1),o._jQueryInterface.call(k(n),i),r&&k(n).data(P).to(r),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return M}}]),o}(),k(document).on(q.CLICK_DATA_API,ne,re._dataApiClickHandler),k(window).on(q.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(ie)),t=0,n=e.length;t<n;t++){var i=k(e[t]);re._jQueryInterface.call(i,i.data())}}),k.fn[x]=re._jQueryInterface,k.fn[x].Constructor=re,k.fn[x].noConflict=function(){return k.fn[x]=H,re._jQueryInterface},re),De=(se="collapse",le="."+(ae="bs.collapse"),ce=(oe=t).fn[se],ue={toggle:!0,parent:""},fe={toggle:"boolean",parent:"(string|element)"},he={SHOW:"show"+le,SHOWN:"shown"+le,HIDE:"hide"+le,HIDDEN:"hidden"+le,CLICK_DATA_API:"click"+le+".data-api"},de="show",pe="collapse",me="collapsing",ge="collapsed",_e="width",ve="height",ye=".show, .collapsing",Ee='[data-toggle="collapse"]',be=function(){function a(t,e){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(e),this._triggerArray=oe.makeArray(document.querySelectorAll('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(Ee)),i=0,r=n.length;i<r;i++){var o=n[i],s=we.getSelectorFromElement(o),a=[].slice.call(document.querySelectorAll(s)).filter(function(e){return e===t});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(o))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=a.prototype;return e.toggle=function(){oe(this._element).hasClass(de)?this.hide():this.show()},e.show=function(){var e,t,n=this;if(!this._isTransitioning&&!oe(this._element).hasClass(de)&&(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(ye)).filter(function(e){return e.getAttribute("data-parent")===n._config.parent})).length&&(e=null),!(e&&(t=oe(e).not(this._selector).data(ae))&&t._isTransitioning))){var i=oe.Event(he.SHOW);if(oe(this._element).trigger(i),!i.isDefaultPrevented()){e&&(a._jQueryInterface.call(oe(e).not(this._selector),"hide"),t||oe(e).data(ae,null));var r=this._getDimension();oe(this._element).removeClass(pe).addClass(me),this._element.style[r]=0,this._triggerArray.length&&oe(this._triggerArray).removeClass(ge).attr("aria-expanded",!0),this.setTransitioning(!0);var o="scroll"+(r[0].toUpperCase()+r.slice(1)),s=we.getTransitionDurationFromElement(this._element);oe(this._element).one(we.TRANSITION_END,function(){oe(n._element).removeClass(me).addClass(pe).addClass(de),n._element.style[r]="",n.setTransitioning(!1),oe(n._element).trigger(he.SHOWN)}).emulateTransitionEnd(s),this._element.style[r]=this._element[o]+"px"}}},e.hide=function(){var e=this;if(!this._isTransitioning&&oe(this._element).hasClass(de)){var t=oe.Event(he.HIDE);if(oe(this._element).trigger(t),!t.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",we.reflow(this._element),oe(this._element).addClass(me).removeClass(pe).removeClass(de);var i=this._triggerArray.length;if(0<i)for(var r=0;r<i;r++){var o=this._triggerArray[r],s=we.getSelectorFromElement(o);if(null!==s)oe([].slice.call(document.querySelectorAll(s))).hasClass(de)||oe(o).addClass(ge).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=we.getTransitionDurationFromElement(this._element);oe(this._element).one(we.TRANSITION_END,function(){e.setTransitioning(!1),oe(e._element).removeClass(me).addClass(pe).trigger(he.HIDDEN)}).emulateTransitionEnd(a)}}},e.setTransitioning=function(e){this._isTransitioning=e},e.dispose=function(){oe.removeData(this._element,ae),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},e._getConfig=function(e){return(e=l({},ue,e)).toggle=Boolean(e.toggle),we.typeCheckConfig(se,e,fe),e},e._getDimension=function(){return oe(this._element).hasClass(_e)?_e:ve},e._getParent=function(){var n=this,e=null;we.isElement(this._config.parent)?(e=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(e=this._config.parent[0])):e=document.querySelector(this._config.parent);var t='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(e.querySelectorAll(t));return oe(i).each(function(e,t){n._addAriaAndCollapsedClass(a._getTargetFromElement(t),[t])}),e},e._addAriaAndCollapsedClass=function(e,t){if(e){var n=oe(e).hasClass(de);t.length&&oe(t).toggleClass(ge,!n).attr("aria-expanded",n)}},a._getTargetFromElement=function(e){var t=we.getSelectorFromElement(e);return t?document.querySelector(t):null},a._jQueryInterface=function(i){return this.each(function(){var e=oe(this),t=e.data(ae),n=l({},ue,e.data(),"object"==typeof i&&i?i:{});if(!t&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),t||(t=new a(this,n),e.data(ae,t)),"string"==typeof i){if("undefined"==typeof t[i])throw new TypeError('No method named "'+i+'"');t[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return ue}}]),a}(),oe(document).on(he.CLICK_DATA_API,Ee,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var n=oe(this),t=we.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(t));oe(i).each(function(){var e=oe(this),t=e.data(ae)?"toggle":n.data();be._jQueryInterface.call(e,t)})}),oe.fn[se]=be._jQueryInterface,oe.fn[se].Constructor=be,oe.fn[se].noConflict=function(){return oe.fn[se]=ce,be._jQueryInterface},be),Ae="undefined"!=typeof window&&"undefined"!=typeof document,Ie=["Edge","Trident","Firefox"],Oe=0,Ne=0;Ne<Ie.length;Ne+=1)if(Ae&&0<=navigator.userAgent.indexOf(Ie[Ne])){Oe=1;break}var ke=Ae&&window.Promise?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},Oe))}};function xe(e){return e&&"[object Function]"==={}.toString.call(e)}function Pe(e,t){if(1!==e.nodeType)return[];var n=getComputedStyle(e,null);return t?n[t]:n}function Le(e){return"HTML"===e.nodeName?e:e.parentNode||e.host}function je(e){if(!e)return document.body;switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var t=Pe(e),n=t.overflow,i=t.overflowX,r=t.overflowY;return/(auto|scroll|overlay)/.test(n+r+i)?e:je(Le(e))}var He=Ae&&!(!window.MSInputMethodContext||!document.documentMode),Me=Ae&&/MSIE 10/.test(navigator.userAgent);function Fe(e){return 11===e?He:10===e?Me:He||Me}function We(e){if(!e)return document.documentElement;for(var t=Fe(10)?document.body:null,n=e.offsetParent;n===t&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&"BODY"!==i&&"HTML"!==i?-1!==["TD","TABLE"].indexOf(n.nodeName)&&"static"===Pe(n,"position")?We(n):n:e?e.ownerDocument.documentElement:document.documentElement}function Re(e){return null!==e.parentNode?Re(e.parentNode):e}function Ue(e,t){if(!(e&&e.nodeType&&t&&t.nodeType))return document.documentElement;var n=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?e:t,r=n?t:e,o=document.createRange();o.setStart(i,0),o.setEnd(r,0);var s,a,l=o.commonAncestorContainer;if(e!==l&&t!==l||i.contains(r))return"BODY"===(a=(s=l).nodeName)||"HTML"!==a&&We(s.firstElementChild)!==s?We(l):l;var c=Re(e);return c.host?Ue(c.host,t):Ue(e,Re(t).host)}function Be(e){var t="top"===(1<arguments.length&&void 0!==arguments[1]?arguments[1]:"top")?"scrollTop":"scrollLeft",n=e.nodeName;if("BODY"===n||"HTML"===n){var i=e.ownerDocument.documentElement;return(e.ownerDocument.scrollingElement||i)[t]}return e[t]}function qe(e,t){var n="x"===t?"Left":"Top",i="Left"===n?"Right":"Bottom";return parseFloat(e["border"+n+"Width"],10)+parseFloat(e["border"+i+"Width"],10)}function Ke(e,t,n,i){return Math.max(t["offset"+e],t["scroll"+e],n["client"+e],n["offset"+e],n["scroll"+e],Fe(10)?n["offset"+e]+i["margin"+("Height"===e?"Top":"Left")]+i["margin"+("Height"===e?"Bottom":"Right")]:0)}function Qe(){var e=document.body,t=document.documentElement,n=Fe(10)&&getComputedStyle(t);return{height:Ke("Height",e,t,n),width:Ke("Width",e,t,n)}}var Ye=function(){function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}}(),Ve=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},ze=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e};function Ge(e){return ze({},e,{right:e.left+e.width,bottom:e.top+e.height})}function Je(e){var t={};try{if(Fe(10)){t=e.getBoundingClientRect();var n=Be(e,"top"),i=Be(e,"left");t.top+=n,t.left+=i,t.bottom+=n,t.right+=i}else t=e.getBoundingClientRect()}catch(e){}var r={left:t.left,top:t.top,width:t.right-t.left,height:t.bottom-t.top},o="HTML"===e.nodeName?Qe():{},s=o.width||e.clientWidth||r.right-r.left,a=o.height||e.clientHeight||r.bottom-r.top,l=e.offsetWidth-s,c=e.offsetHeight-a;if(l||c){var u=Pe(e);l-=qe(u,"x"),c-=qe(u,"y"),r.width-=l,r.height-=c}return Ge(r)}function Ze(e,t){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Fe(10),r="HTML"===t.nodeName,o=Je(e),s=Je(t),a=je(e),l=Pe(t),c=parseFloat(l.borderTopWidth,10),u=parseFloat(l.borderLeftWidth,10);n&&"HTML"===t.nodeName&&(s.top=Math.max(s.top,0),s.left=Math.max(s.left,0));var f=Ge({top:o.top-s.top-c,left:o.left-s.left-u,width:o.width,height:o.height});if(f.marginTop=0,f.marginLeft=0,!i&&r){var h=parseFloat(l.marginTop,10),d=parseFloat(l.marginLeft,10);f.top-=c-h,f.bottom-=c-h,f.left-=u-d,f.right-=u-d,f.marginTop=h,f.marginLeft=d}return(i&&!n?t.contains(a):t===a&&"BODY"!==a.nodeName)&&(f=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Be(t,"top"),r=Be(t,"left"),o=n?-1:1;return e.top+=i*o,e.bottom+=i*o,e.left+=r*o,e.right+=r*o,e}(f,t)),f}function Xe(e){if(!e||!e.parentElement||Fe())return document.documentElement;for(var t=e.parentElement;t&&"none"===Pe(t,"transform");)t=t.parentElement;return t||document.documentElement}function $e(e,t,n,i){var r=4<arguments.length&&void 0!==arguments[4]&&arguments[4],o={top:0,left:0},s=r?Xe(e):Ue(e,t);if("viewport"===i)o=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=e.ownerDocument.documentElement,i=Ze(e,n),r=Math.max(n.clientWidth,window.innerWidth||0),o=Math.max(n.clientHeight,window.innerHeight||0),s=t?0:Be(n),a=t?0:Be(n,"left");return Ge({top:s-i.top+i.marginTop,left:a-i.left+i.marginLeft,width:r,height:o})}(s,r);else{var a=void 0;"scrollParent"===i?"BODY"===(a=je(Le(t))).nodeName&&(a=e.ownerDocument.documentElement):a="window"===i?e.ownerDocument.documentElement:i;var l=Ze(a,s,r);if("HTML"!==a.nodeName||function e(t){var n=t.nodeName;return"BODY"!==n&&"HTML"!==n&&("fixed"===Pe(t,"position")||e(Le(t)))}(s))o=l;else{var c=Qe(),u=c.height,f=c.width;o.top+=l.top-l.marginTop,o.bottom=u+l.top,o.left+=l.left-l.marginLeft,o.right=f+l.left}}return o.left+=n,o.top+=n,o.right-=n,o.bottom-=n,o}function et(e,t,i,n,r){var o=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf("auto"))return e;var s=$e(i,n,o,r),a={top:{width:s.width,height:t.top-s.top},right:{width:s.right-t.right,height:s.height},bottom:{width:s.width,height:s.bottom-t.bottom},left:{width:t.left-s.left,height:s.height}},l=Object.keys(a).map(function(e){return ze({key:e},a[e],{area:(t=a[e],t.width*t.height)});var t}).sort(function(e,t){return t.area-e.area}),c=l.filter(function(e){var t=e.width,n=e.height;return t>=i.clientWidth&&n>=i.clientHeight}),u=0<c.length?c[0].key:l[0].key,f=e.split("-")[1];return u+(f?"-"+f:"")}function tt(e,t,n){var i=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return Ze(n,i?Xe(t):Ue(t,n),i)}function nt(e){var t=getComputedStyle(e),n=parseFloat(t.marginTop)+parseFloat(t.marginBottom),i=parseFloat(t.marginLeft)+parseFloat(t.marginRight);return{width:e.offsetWidth+i,height:e.offsetHeight+n}}function it(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function rt(e,t,n){n=n.split("-")[0];var i=nt(e),r={width:i.width,height:i.height},o=-1!==["right","left"].indexOf(n),s=o?"top":"left",a=o?"left":"top",l=o?"height":"width",c=o?"width":"height";return r[s]=t[s]+t[l]/2-i[l]/2,r[a]=n===a?t[a]-i[c]:t[it(a)],r}function ot(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function st(e,n,t){return(void 0===t?e:e.slice(0,function(e,t,n){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===n});var i=ot(e,function(e){return e[t]===n});return e.indexOf(i)}(e,"name",t))).forEach(function(e){e.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var t=e.function||e.fn;e.enabled&&xe(t)&&(n.offsets.popper=Ge(n.offsets.popper),n.offsets.reference=Ge(n.offsets.reference),n=t(n,e))}),n}function at(e,n){return e.some(function(e){var t=e.name;return e.enabled&&t===n})}function lt(e){for(var t=[!1,"ms","Webkit","Moz","O"],n=e.charAt(0).toUpperCase()+e.slice(1),i=0;i<t.length;i++){var r=t[i],o=r?""+r+n:e;if("undefined"!=typeof document.body.style[o])return o}return null}function ct(e){var t=e.ownerDocument;return t?t.defaultView:window}function ut(e,t,n,i){n.updateBound=i,ct(e).addEventListener("resize",n.updateBound,{passive:!0});var r=je(e);return function e(t,n,i,r){var o="BODY"===t.nodeName,s=o?t.ownerDocument.defaultView:t;s.addEventListener(n,i,{passive:!0}),o||e(je(s.parentNode),n,i,r),r.push(s)}(r,"scroll",n.updateBound,n.scrollParents),n.scrollElement=r,n.eventsEnabled=!0,n}function ft(){var e,t;this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=(e=this.reference,t=this.state,ct(e).removeEventListener("resize",t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t))}function ht(e){return""!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function dt(n,i){Object.keys(i).forEach(function(e){var t="";-1!==["width","height","top","right","bottom","left"].indexOf(e)&&ht(i[e])&&(t="px"),n.style[e]=i[e]+t})}function pt(e,t,n){var i=ot(e,function(e){return e.name===t}),r=!!i&&e.some(function(e){return e.name===n&&e.enabled&&e.order<i.order});if(!r){var o="`"+t+"`",s="`"+n+"`";console.warn(s+" modifier is required by "+o+" modifier in order to work, be sure to include it before "+o+"!")}return r}var mt=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"],gt=mt.slice(3);function _t(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=gt.indexOf(e),i=gt.slice(n+1).concat(gt.slice(0,n));return t?i.reverse():i}var vt="flip",yt="clockwise",Et="counterclockwise";function bt(e,r,o,t){var s=[0,0],a=-1!==["right","left"].indexOf(t),n=e.split(/(\+|\-)/).map(function(e){return e.trim()}),i=n.indexOf(ot(n,function(e){return-1!==e.search(/,|\s/)}));n[i]&&-1===n[i].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,c=-1!==i?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];return(c=c.map(function(e,t){var n=(1===t?!a:a)?"height":"width",i=!1;return e.reduce(function(e,t){return""===e[e.length-1]&&-1!==["+","-"].indexOf(t)?(e[e.length-1]=t,i=!0,e):i?(e[e.length-1]+=t,i=!1,e):e.concat(t)},[]).map(function(e){return function(e,t,n,i){var r=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),o=+r[1],s=r[2];if(!o)return e;if(0===s.indexOf("%")){var a=void 0;switch(s){case"%p":a=n;break;case"%":case"%r":default:a=i}return Ge(a)[t]/100*o}if("vh"===s||"vw"===s)return("vh"===s?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*o;return o}(e,n,r,o)})})).forEach(function(n,i){n.forEach(function(e,t){ht(e)&&(s[i]+=e*("-"===n[t-1]?-1:1))})}),s}var wt={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,n=t.split("-")[0],i=t.split("-")[1];if(i){var r=e.offsets,o=r.reference,s=r.popper,a=-1!==["bottom","top"].indexOf(n),l=a?"left":"top",c=a?"width":"height",u={start:Ve({},l,o[l]),end:Ve({},l,o[l]+o[c]-s[c])};e.offsets.popper=ze({},s,u[i])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var n=t.offset,i=e.placement,r=e.offsets,o=r.popper,s=r.reference,a=i.split("-")[0],l=void 0;return l=ht(+n)?[+n,0]:bt(n,o,s,a),"left"===a?(o.top+=l[0],o.left-=l[1]):"right"===a?(o.top+=l[0],o.left+=l[1]):"top"===a?(o.left+=l[0],o.top-=l[1]):"bottom"===a&&(o.left+=l[0],o.top+=l[1]),e.popper=o,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,i){var t=i.boundariesElement||We(e.instance.popper);e.instance.reference===t&&(t=We(t));var n=lt("transform"),r=e.instance.popper.style,o=r.top,s=r.left,a=r[n];r.top="",r.left="",r[n]="";var l=$e(e.instance.popper,e.instance.reference,i.padding,t,e.positionFixed);r.top=o,r.left=s,r[n]=a,i.boundaries=l;var c=i.priority,u=e.offsets.popper,f={primary:function(e){var t=u[e];return u[e]<l[e]&&!i.escapeWithReference&&(t=Math.max(u[e],l[e])),Ve({},e,t)},secondary:function(e){var t="right"===e?"left":"top",n=u[t];return u[e]>l[e]&&!i.escapeWithReference&&(n=Math.min(u[t],l[e]-("right"===e?u.width:u.height))),Ve({},t,n)}};return c.forEach(function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";u=ze({},u,f[t](e))}),e.offsets.popper=u,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,i=t.reference,r=e.placement.split("-")[0],o=Math.floor,s=-1!==["top","bottom"].indexOf(r),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]<o(i[l])&&(e.offsets.popper[l]=o(i[l])-n[c]),n[l]>o(i[a])&&(e.offsets.popper[l]=o(i[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!pt(e.instance.modifiers,"arrow","keepTogether"))return e;var i=t.element;if("string"==typeof i){if(!(i=e.instance.popper.querySelector(i)))return e}else if(!e.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var r=e.placement.split("-")[0],o=e.offsets,s=o.popper,a=o.reference,l=-1!==["left","right"].indexOf(r),c=l?"height":"width",u=l?"Top":"Left",f=u.toLowerCase(),h=l?"left":"top",d=l?"bottom":"right",p=nt(i)[c];a[d]-p<s[f]&&(e.offsets.popper[f]-=s[f]-(a[d]-p)),a[f]+p>s[d]&&(e.offsets.popper[f]+=a[f]+p-s[d]),e.offsets.popper=Ge(e.offsets.popper);var m=a[f]+a[c]/2-p/2,g=Pe(e.instance.popper),_=parseFloat(g["margin"+u],10),v=parseFloat(g["border"+u+"Width"],10),y=m-e.offsets.popper[f]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),e.arrowElement=i,e.offsets.arrow=(Ve(n={},f,Math.round(y)),Ve(n,h,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(p,m){if(at(p.instance.modifiers,"inner"))return p;if(p.flipped&&p.placement===p.originalPlacement)return p;var g=$e(p.instance.popper,p.instance.reference,m.padding,m.boundariesElement,p.positionFixed),_=p.placement.split("-")[0],v=it(_),y=p.placement.split("-")[1]||"",E=[];switch(m.behavior){case vt:E=[_,v];break;case yt:E=_t(_);break;case Et:E=_t(_,!0);break;default:E=m.behavior}return E.forEach(function(e,t){if(_!==e||E.length===t+1)return p;_=p.placement.split("-")[0],v=it(_);var n,i=p.offsets.popper,r=p.offsets.reference,o=Math.floor,s="left"===_&&o(i.right)>o(r.left)||"right"===_&&o(i.left)<o(r.right)||"top"===_&&o(i.bottom)>o(r.top)||"bottom"===_&&o(i.top)<o(r.bottom),a=o(i.left)<o(g.left),l=o(i.right)>o(g.right),c=o(i.top)<o(g.top),u=o(i.bottom)>o(g.bottom),f="left"===_&&a||"right"===_&&l||"top"===_&&c||"bottom"===_&&u,h=-1!==["top","bottom"].indexOf(_),d=!!m.flipVariations&&(h&&"start"===y&&a||h&&"end"===y&&l||!h&&"start"===y&&c||!h&&"end"===y&&u);(s||f||d)&&(p.flipped=!0,(s||f)&&(_=E[t+1]),d&&(y="end"===(n=y)?"start":"start"===n?"end":n),p.placement=_+(y?"-"+y:""),p.offsets.popper=ze({},p.offsets.popper,rt(p.instance.popper,p.offsets.reference,p.placement)),p=st(p.instance.modifiers,p,"flip"))}),p},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],i=e.offsets,r=i.popper,o=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return r[s?"left":"top"]=o[n]-(a?r[s?"width":"height"]:0),e.placement=it(t),e.offsets.popper=Ge(r),e}},hide:{order:800,enabled:!0,fn:function(e){if(!pt(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=ot(e.instance.modifiers,function(e){return"preventOverflow"===e.name}).boundaries;if(t.bottom<n.top||t.left>n.right||t.top>n.bottom||t.right<n.left){if(!0===e.hide)return e;e.hide=!0,e.attributes["x-out-of-boundaries"]=""}else{if(!1===e.hide)return e;e.hide=!1,e.attributes["x-out-of-boundaries"]=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var n=t.x,i=t.y,r=e.offsets.popper,o=ot(e.instance.modifiers,function(e){return"applyStyle"===e.name}).gpuAcceleration;void 0!==o&&console.warn("WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!");var s=void 0!==o?o:t.gpuAcceleration,a=Je(We(e.instance.popper)),l={position:r.position},c={left:Math.floor(r.left),top:Math.round(r.top),bottom:Math.round(r.bottom),right:Math.floor(r.right)},u="bottom"===n?"top":"bottom",f="right"===i?"left":"right",h=lt("transform"),d=void 0,p=void 0;if(p="bottom"===u?-a.height+c.bottom:c.top,d="right"===f?-a.width+c.right:c.left,s&&h)l[h]="translate3d("+d+"px, "+p+"px, 0)",l[u]=0,l[f]=0,l.willChange="transform";else{var m="bottom"===u?-1:1,g="right"===f?-1:1;l[u]=p*m,l[f]=d*g,l.willChange=u+", "+f}var _={"x-placement":e.placement};return e.attributes=ze({},_,e.attributes),e.styles=ze({},l,e.styles),e.arrowStyles=ze({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:"bottom",y:"right"},applyStyle:{order:900,enabled:!0,fn:function(e){var t,n;return dt(e.instance.popper,e.styles),t=e.instance.popper,n=e.attributes,Object.keys(n).forEach(function(e){!1!==n[e]?t.setAttribute(e,n[e]):t.removeAttribute(e)}),e.arrowElement&&Object.keys(e.arrowStyles).length&&dt(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,n,i,r){var o=tt(r,t,e,n.positionFixed),s=et(n.placement,o,t,e,n.modifiers.flip.boundariesElement,n.modifiers.flip.padding);return t.setAttribute("x-placement",s),dt(t,{position:n.positionFixed?"fixed":"absolute"}),n},gpuAcceleration:void 0}}},Ct=function(){function o(e,t){var n=this,i=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=ke(this.update.bind(this)),this.options=ze({},o.Defaults,i),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=e&&e.jquery?e[0]:e,this.popper=t&&t.jquery?t[0]:t,this.options.modifiers={},Object.keys(ze({},o.Defaults.modifiers,i.modifiers)).forEach(function(e){n.options.modifiers[e]=ze({},o.Defaults.modifiers[e]||{},i.modifiers?i.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return ze({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(e){e.enabled&&xe(e.onLoad)&&e.onLoad(n.reference,n.popper,n.options,e,n.state)}),this.update();var r=this.options.eventsEnabled;r&&this.enableEventListeners(),this.state.eventsEnabled=r}return Ye(o,[{key:"update",value:function(){return function(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=tt(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=et(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=rt(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",e=st(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}.call(this)}},{key:"destroy",value:function(){return function(){return this.state.isDestroyed=!0,at(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[lt("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}.call(this)}},{key:"enableEventListeners",value:function(){return function(){this.state.eventsEnabled||(this.state=ut(this.reference,this.options,this.state,this.scheduleUpdate))}.call(this)}},{key:"disableEventListeners",value:function(){return ft.call(this)}}]),o}();Ct.Utils=("undefined"!=typeof window?window:global).PopperUtils,Ct.placements=mt,Ct.Defaults=wt;var Tt,St,Dt,At,It,Ot,Nt,kt,xt,Pt,Lt,jt,Ht,Mt,Ft,Wt,Rt,Ut,Bt,qt,Kt,Qt,Yt,Vt,zt,Gt,Jt,Zt,Xt,$t,en,tn,nn,rn,on,sn,an,ln,cn,un,fn,hn,dn,pn,mn,gn,_n,vn,yn,En,bn,wn,Cn,Tn,Sn,Dn,An,In,On,Nn,kn,xn,Pn,Ln,jn,Hn,Mn,Fn,Wn,Rn,Un,Bn,qn,Kn,Qn,Yn,Vn,zn,Gn,Jn,Zn,Xn,$n,ei,ti,ni,ii,ri,oi,si,ai,li,ci,ui,fi,hi,di,pi,mi,gi,_i,vi,yi,Ei,bi,wi,Ci,Ti,Si,Di,Ai,Ii,Oi,Ni,ki,xi,Pi,Li,ji,Hi,Mi,Fi,Wi,Ri,Ui,Bi=(St="dropdown",At="."+(Dt="bs.dropdown"),It=".data-api",Ot=(Tt=t).fn[St],Nt=new RegExp("38|40|27"),kt={HIDE:"hide"+At,HIDDEN:"hidden"+At,SHOW:"show"+At,SHOWN:"shown"+At,CLICK:"click"+At,CLICK_DATA_API:"click"+At+It,KEYDOWN_DATA_API:"keydown"+At+It,KEYUP_DATA_API:"keyup"+At+It},xt="disabled",Pt="show",Lt="dropup",jt="dropright",Ht="dropleft",Mt="dropdown-menu-right",Ft="position-static",Wt='[data-toggle="dropdown"]',Rt=".dropdown form",Ut=".dropdown-menu",Bt=".navbar-nav",qt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Kt="top-start",Qt="top-end",Yt="bottom-start",Vt="bottom-end",zt="right-start",Gt="left-start",Jt={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},Zt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Xt=function(){function c(e,t){this._element=e,this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var e=c.prototype;return e.toggle=function(){if(!this._element.disabled&&!Tt(this._element).hasClass(xt)){var e=c._getParentFromElement(this._element),t=Tt(this._menu).hasClass(Pt);if(c._clearMenus(),!t){var n={relatedTarget:this._element},i=Tt.Event(kt.SHOW,n);if(Tt(e).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof Ct)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var r=this._element;"parent"===this._config.reference?r=e:we.isElement(this._config.reference)&&(r=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(r=this._config.reference[0])),"scrollParent"!==this._config.boundary&&Tt(e).addClass(Ft),this._popper=new Ct(r,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===Tt(e).closest(Bt).length&&Tt(document.body).children().on("mouseover",null,Tt.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),Tt(this._menu).toggleClass(Pt),Tt(e).toggleClass(Pt).trigger(Tt.Event(kt.SHOWN,n))}}}},e.dispose=function(){Tt.removeData(this._element,Dt),Tt(this._element).off(At),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},e.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},e._addEventListeners=function(){var t=this;Tt(this._element).on(kt.CLICK,function(e){e.preventDefault(),e.stopPropagation(),t.toggle()})},e._getConfig=function(e){return e=l({},this.constructor.Default,Tt(this._element).data(),e),we.typeCheckConfig(St,e,this.constructor.DefaultType),e},e._getMenuElement=function(){if(!this._menu){var e=c._getParentFromElement(this._element);e&&(this._menu=e.querySelector(Ut))}return this._menu},e._getPlacement=function(){var e=Tt(this._element.parentNode),t=Yt;return e.hasClass(Lt)?(t=Kt,Tt(this._menu).hasClass(Mt)&&(t=Qt)):e.hasClass(jt)?t=zt:e.hasClass(Ht)?t=Gt:Tt(this._menu).hasClass(Mt)&&(t=Vt),t},e._detectNavbar=function(){return 0<Tt(this._element).closest(".navbar").length},e._getPopperConfig=function(){var t=this,e={};"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset;var n={placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(n.modifiers.applyStyle={enabled:!1}),n},c._jQueryInterface=function(t){return this.each(function(){var e=Tt(this).data(Dt);if(e||(e=new c(this,"object"==typeof t?t:null),Tt(this).data(Dt,e)),"string"==typeof t){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}})},c._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var t=[].slice.call(document.querySelectorAll(Wt)),n=0,i=t.length;n<i;n++){var r=c._getParentFromElement(t[n]),o=Tt(t[n]).data(Dt),s={relatedTarget:t[n]};if(e&&"click"===e.type&&(s.clickEvent=e),o){var a=o._menu;if(Tt(r).hasClass(Pt)&&!(e&&("click"===e.type&&/input|textarea/i.test(e.target.tagName)||"keyup"===e.type&&9===e.which)&&Tt.contains(r,e.target))){var l=Tt.Event(kt.HIDE,s);Tt(r).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&Tt(document.body).children().off("mouseover",null,Tt.noop),t[n].setAttribute("aria-expanded","false"),Tt(a).removeClass(Pt),Tt(r).removeClass(Pt).trigger(Tt.Event(kt.HIDDEN,s)))}}}},c._getParentFromElement=function(e){var t,n=we.getSelectorFromElement(e);return n&&(t=document.querySelector(n)),t||e.parentNode},c._dataApiKeydownHandler=function(e){if((/input|textarea/i.test(e.target.tagName)?!(32===e.which||27!==e.which&&(40!==e.which&&38!==e.which||Tt(e.target).closest(Ut).length)):Nt.test(e.which))&&(e.preventDefault(),e.stopPropagation(),!this.disabled&&!Tt(this).hasClass(xt))){var t=c._getParentFromElement(this),n=Tt(t).hasClass(Pt);if((n||27===e.which&&32===e.which)&&(!n||27!==e.which&&32!==e.which)){var i=[].slice.call(t.querySelectorAll(qt));if(0!==i.length){var r=i.indexOf(e.target);38===e.which&&0<r&&r--,40===e.which&&r<i.length-1&&r++,r<0&&(r=0),i[r].focus()}}else{if(27===e.which){var o=t.querySelector(Wt);Tt(o).trigger("focus")}Tt(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return Jt}},{key:"DefaultType",get:function(){return Zt}}]),c}(),Tt(document).on(kt.KEYDOWN_DATA_API,Wt,Xt._dataApiKeydownHandler).on(kt.KEYDOWN_DATA_API,Ut,Xt._dataApiKeydownHandler).on(kt.CLICK_DATA_API+" "+kt.KEYUP_DATA_API,Xt._clearMenus).on(kt.CLICK_DATA_API,Wt,function(e){e.preventDefault(),e.stopPropagation(),Xt._jQueryInterface.call(Tt(this),"toggle")}).on(kt.CLICK_DATA_API,Rt,function(e){e.stopPropagation()}),Tt.fn[St]=Xt._jQueryInterface,Tt.fn[St].Constructor=Xt,Tt.fn[St].noConflict=function(){return Tt.fn[St]=Ot,Xt._jQueryInterface},Xt),qi=(en="modal",nn="."+(tn="bs.modal"),rn=($t=t).fn[en],on={backdrop:!0,keyboard:!0,focus:!0,show:!0},sn={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},an={HIDE:"hide"+nn,HIDDEN:"hidden"+nn,SHOW:"show"+nn,SHOWN:"shown"+nn,FOCUSIN:"focusin"+nn,RESIZE:"resize"+nn,CLICK_DISMISS:"click.dismiss"+nn,KEYDOWN_DISMISS:"keydown.dismiss"+nn,MOUSEUP_DISMISS:"mouseup.dismiss"+nn,MOUSEDOWN_DISMISS:"mousedown.dismiss"+nn,CLICK_DATA_API:"click"+nn+".data-api"},ln="modal-scrollbar-measure",cn="modal-backdrop",un="modal-open",fn="fade",hn="show",dn=".modal-dialog",pn='[data-toggle="modal"]',mn='[data-dismiss="modal"]',gn=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",_n=".sticky-top",vn=function(){function r(e,t){this._config=this._getConfig(t),this._element=e,this._dialog=e.querySelector(dn),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._scrollbarWidth=0}var e=r.prototype;return e.toggle=function(e){return this._isShown?this.hide():this.show(e)},e.show=function(e){var t=this;if(!this._isTransitioning&&!this._isShown){$t(this._element).hasClass(fn)&&(this._isTransitioning=!0);var n=$t.Event(an.SHOW,{relatedTarget:e});$t(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),$t(document.body).addClass(un),this._setEscapeEvent(),this._setResizeEvent(),$t(this._element).on(an.CLICK_DISMISS,mn,function(e){return t.hide(e)}),$t(this._dialog).on(an.MOUSEDOWN_DISMISS,function(){$t(t._element).one(an.MOUSEUP_DISMISS,function(e){$t(e.target).is(t._element)&&(t._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return t._showElement(e)}))}},e.hide=function(e){var t=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var n=$t.Event(an.HIDE);if($t(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=$t(this._element).hasClass(fn);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),$t(document).off(an.FOCUSIN),$t(this._element).removeClass(hn),$t(this._element).off(an.CLICK_DISMISS),$t(this._dialog).off(an.MOUSEDOWN_DISMISS),i){var r=we.getTransitionDurationFromElement(this._element);$t(this._element).one(we.TRANSITION_END,function(e){return t._hideModal(e)}).emulateTransitionEnd(r)}else this._hideModal()}}},e.dispose=function(){$t.removeData(this._element,tn),$t(window,document,this._element,this._backdrop).off(nn),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},e.handleUpdate=function(){this._adjustDialog()},e._getConfig=function(e){return e=l({},on,e),we.typeCheckConfig(en,e,sn),e},e._showElement=function(e){var t=this,n=$t(this._element).hasClass(fn);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,n&&we.reflow(this._element),$t(this._element).addClass(hn),this._config.focus&&this._enforceFocus();var i=$t.Event(an.SHOWN,{relatedTarget:e}),r=function(){t._config.focus&&t._element.focus(),t._isTransitioning=!1,$t(t._element).trigger(i)};if(n){var o=we.getTransitionDurationFromElement(this._element);$t(this._dialog).one(we.TRANSITION_END,r).emulateTransitionEnd(o)}else r()},e._enforceFocus=function(){var t=this;$t(document).off(an.FOCUSIN).on(an.FOCUSIN,function(e){document!==e.target&&t._element!==e.target&&0===$t(t._element).has(e.target).length&&t._element.focus()})},e._setEscapeEvent=function(){var t=this;this._isShown&&this._config.keyboard?$t(this._element).on(an.KEYDOWN_DISMISS,function(e){27===e.which&&(e.preventDefault(),t.hide())}):this._isShown||$t(this._element).off(an.KEYDOWN_DISMISS)},e._setResizeEvent=function(){var t=this;this._isShown?$t(window).on(an.RESIZE,function(e){return t.handleUpdate(e)}):$t(window).off(an.RESIZE)},e._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){$t(document.body).removeClass(un),e._resetAdjustments(),e._resetScrollbar(),$t(e._element).trigger(an.HIDDEN)})},e._removeBackdrop=function(){this._backdrop&&($t(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(e){var t=this,n=$t(this._element).hasClass(fn)?fn:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=cn,n&&this._backdrop.classList.add(n),$t(this._backdrop).appendTo(document.body),$t(this._element).on(an.CLICK_DISMISS,function(e){t._ignoreBackdropClick?t._ignoreBackdropClick=!1:e.target===e.currentTarget&&("static"===t._config.backdrop?t._element.focus():t.hide())}),n&&we.reflow(this._backdrop),$t(this._backdrop).addClass(hn),!e)return;if(!n)return void e();var i=we.getTransitionDurationFromElement(this._backdrop);$t(this._backdrop).one(we.TRANSITION_END,e).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){$t(this._backdrop).removeClass(hn);var r=function(){t._removeBackdrop(),e&&e()};if($t(this._element).hasClass(fn)){var o=we.getTransitionDurationFromElement(this._backdrop);$t(this._backdrop).one(we.TRANSITION_END,r).emulateTransitionEnd(o)}else r()}else e&&e()},e._adjustDialog=function(){var e=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=e.left+e.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},e._setScrollbar=function(){var r=this;if(this._isBodyOverflowing){var e=[].slice.call(document.querySelectorAll(gn)),t=[].slice.call(document.querySelectorAll(_n));$t(e).each(function(e,t){var n=t.style.paddingRight,i=$t(t).css("padding-right");$t(t).data("padding-right",n).css("padding-right",parseFloat(i)+r._scrollbarWidth+"px")}),$t(t).each(function(e,t){var n=t.style.marginRight,i=$t(t).css("margin-right");$t(t).data("margin-right",n).css("margin-right",parseFloat(i)-r._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=$t(document.body).css("padding-right");$t(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}},e._resetScrollbar=function(){var e=[].slice.call(document.querySelectorAll(gn));$t(e).each(function(e,t){var n=$t(t).data("padding-right");$t(t).removeData("padding-right"),t.style.paddingRight=n||""});var t=[].slice.call(document.querySelectorAll(""+_n));$t(t).each(function(e,t){var n=$t(t).data("margin-right");"undefined"!=typeof n&&$t(t).css("margin-right",n).removeData("margin-right")});var n=$t(document.body).data("padding-right");$t(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},e._getScrollbarWidth=function(){var e=document.createElement("div");e.className=ln,document.body.appendChild(e);var t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t},r._jQueryInterface=function(n,i){return this.each(function(){var e=$t(this).data(tn),t=l({},on,$t(this).data(),"object"==typeof n&&n?n:{});if(e||(e=new r(this,t),$t(this).data(tn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](i)}else t.show&&e.show(i)})},s(r,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return on}}]),r}(),$t(document).on(an.CLICK_DATA_API,pn,function(e){var t,n=this,i=we.getSelectorFromElement(this);i&&(t=document.querySelector(i));var r=$t(t).data(tn)?"toggle":l({},$t(t).data(),$t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var o=$t(t).one(an.SHOW,function(e){e.isDefaultPrevented()||o.one(an.HIDDEN,function(){$t(n).is(":visible")&&n.focus()})});vn._jQueryInterface.call($t(t),r,this)}),$t.fn[en]=vn._jQueryInterface,$t.fn[en].Constructor=vn,$t.fn[en].noConflict=function(){return $t.fn[en]=rn,vn._jQueryInterface},vn),Ki=(En="tooltip",wn="."+(bn="bs.tooltip"),Cn=(yn=t).fn[En],Tn="bs-tooltip",Sn=new RegExp("(^|\\s)"+Tn+"\\S+","g"),In={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!(An={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"}),selector:!(Dn={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"}),placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},Nn="out",kn={HIDE:"hide"+wn,HIDDEN:"hidden"+wn,SHOW:(On="show")+wn,SHOWN:"shown"+wn,INSERTED:"inserted"+wn,CLICK:"click"+wn,FOCUSIN:"focusin"+wn,FOCUSOUT:"focusout"+wn,MOUSEENTER:"mouseenter"+wn,MOUSELEAVE:"mouseleave"+wn},xn="fade",Pn="show",Ln=".tooltip-inner",jn=".arrow",Hn="hover",Mn="focus",Fn="click",Wn="manual",Rn=function(){function i(e,t){if("undefined"==typeof Ct)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var e=i.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=yn(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),yn(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(yn(this.getTipElement()).hasClass(Pn))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),yn.removeData(this.element,this.constructor.DATA_KEY),yn(this.element).off(this.constructor.EVENT_KEY),yn(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&yn(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===yn(this.element).css("display"))throw new Error("Please use show on visible elements");var e=yn.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){yn(this.element).trigger(e);var n=yn.contains(this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!n)return;var i=this.getTipElement(),r=we.getUID(this.constructor.NAME);i.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&yn(i).addClass(xn);var o="function"==typeof this.config.placement?this.config.placement.call(this,i,this.element):this.config.placement,s=this._getAttachment(o);this.addAttachmentClass(s);var a=!1===this.config.container?document.body:yn(document).find(this.config.container);yn(i).data(this.constructor.DATA_KEY,this),yn.contains(this.element.ownerDocument.documentElement,this.tip)||yn(i).appendTo(a),yn(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new Ct(this.element,i,{placement:s,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:jn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){t._handlePopperPlacementChange(e)}}),yn(i).addClass(Pn),"ontouchstart"in document.documentElement&&yn(document.body).children().on("mouseover",null,yn.noop);var l=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,yn(t.element).trigger(t.constructor.Event.SHOWN),e===Nn&&t._leave(null,t)};if(yn(this.tip).hasClass(xn)){var c=we.getTransitionDurationFromElement(this.tip);yn(this.tip).one(we.TRANSITION_END,l).emulateTransitionEnd(c)}else l()}},e.hide=function(e){var t=this,n=this.getTipElement(),i=yn.Event(this.constructor.Event.HIDE),r=function(){t._hoverState!==On&&n.parentNode&&n.parentNode.removeChild(n),t._cleanTipClass(),t.element.removeAttribute("aria-describedby"),yn(t.element).trigger(t.constructor.Event.HIDDEN),null!==t._popper&&t._popper.destroy(),e&&e()};if(yn(this.element).trigger(i),!i.isDefaultPrevented()){if(yn(n).removeClass(Pn),"ontouchstart"in document.documentElement&&yn(document.body).children().off("mouseover",null,yn.noop),this._activeTrigger[Fn]=!1,this._activeTrigger[Mn]=!1,this._activeTrigger[Hn]=!1,yn(this.tip).hasClass(xn)){var o=we.getTransitionDurationFromElement(n);yn(n).one(we.TRANSITION_END,r).emulateTransitionEnd(o)}else r();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(e){yn(this.getTipElement()).addClass(Tn+"-"+e)},e.getTipElement=function(){return this.tip=this.tip||yn(this.config.template)[0],this.tip},e.setContent=function(){var e=this.getTipElement();this.setElementContent(yn(e.querySelectorAll(Ln)),this.getTitle()),yn(e).removeClass(xn+" "+Pn)},e.setElementContent=function(e,t){var n=this.config.html;"object"==typeof t&&(t.nodeType||t.jquery)?n?yn(t).parent().is(e)||e.empty().append(t):e.text(yn(t).text()):e[n?"html":"text"](t)},e.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e||(e="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),e},e._getAttachment=function(e){return An[e.toUpperCase()]},e._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)yn(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(e){return i.toggle(e)});else if(e!==Wn){var t=e===Hn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=e===Hn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;yn(i.element).on(t,i.config.selector,function(e){return i._enter(e)}).on(n,i.config.selector,function(e){return i._leave(e)})}yn(i.element).closest(".modal").on("hide.bs.modal",function(){return i.hide()})}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==e)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||yn(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),yn(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?Mn:Hn]=!0),yn(t.getTipElement()).hasClass(Pn)||t._hoverState===On?t._hoverState=On:(clearTimeout(t._timeout),t._hoverState=On,t.config.delay&&t.config.delay.show?t._timeout=setTimeout(function(){t._hoverState===On&&t.show()},t.config.delay.show):t.show())},e._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||yn(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),yn(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?Mn:Hn]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState=Nn,t.config.delay&&t.config.delay.hide?t._timeout=setTimeout(function(){t._hoverState===Nn&&t.hide()},t.config.delay.hide):t.hide())},e._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},e._getConfig=function(e){return"number"==typeof(e=l({},this.constructor.Default,yn(this.element).data(),"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),we.typeCheckConfig(En,e,this.constructor.DefaultType),e},e._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},e._cleanTipClass=function(){var e=yn(this.getTipElement()),t=e.attr("class").match(Sn);null!==t&&t.length&&e.removeClass(t.join(""))},e._handlePopperPlacementChange=function(e){var t=e.instance;this.tip=t.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},e._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(yn(e).removeClass(xn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},i._jQueryInterface=function(n){return this.each(function(){var e=yn(this).data(bn),t="object"==typeof n&&n;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),yn(this).data(bn,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return In}},{key:"NAME",get:function(){return En}},{key:"DATA_KEY",get:function(){return bn}},{key:"Event",get:function(){return kn}},{key:"EVENT_KEY",get:function(){return wn}},{key:"DefaultType",get:function(){return Dn}}]),i}(),yn.fn[En]=Rn._jQueryInterface,yn.fn[En].Constructor=Rn,yn.fn[En].noConflict=function(){return yn.fn[En]=Cn,Rn._jQueryInterface},Rn),Qi=(Bn="popover",Kn="."+(qn="bs.popover"),Qn=(Un=t).fn[Bn],Yn="bs-popover",Vn=new RegExp("(^|\\s)"+Yn+"\\S+","g"),zn=l({},Ki.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),Gn=l({},Ki.DefaultType,{content:"(string|element|function)"}),Jn="fade",Xn=".popover-header",$n=".popover-body",ei={HIDE:"hide"+Kn,HIDDEN:"hidden"+Kn,SHOW:(Zn="show")+Kn,SHOWN:"shown"+Kn,INSERTED:"inserted"+Kn,CLICK:"click"+Kn,FOCUSIN:"focusin"+Kn,FOCUSOUT:"focusout"+Kn,MOUSEENTER:"mouseenter"+Kn,MOUSELEAVE:"mouseleave"+Kn},ti=function(e){var t,n;function i(){return e.apply(this,arguments)||this}n=e,(t=i).prototype=Object.create(n.prototype),(t.prototype.constructor=t).__proto__=n;var r=i.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(e){Un(this.getTipElement()).addClass(Yn+"-"+e)},r.getTipElement=function(){return this.tip=this.tip||Un(this.config.template)[0],this.tip},r.setContent=function(){var e=Un(this.getTipElement());this.setElementContent(e.find(Xn),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find($n),t),e.removeClass(Jn+" "+Zn)},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var e=Un(this.getTipElement()),t=e.attr("class").match(Vn);null!==t&&0<t.length&&e.removeClass(t.join(""))},i._jQueryInterface=function(n){return this.each(function(){var e=Un(this).data(qn),t="object"==typeof n?n:null;if((e||!/destroy|hide/.test(n))&&(e||(e=new i(this,t),Un(this).data(qn,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return zn}},{key:"NAME",get:function(){return Bn}},{key:"DATA_KEY",get:function(){return qn}},{key:"Event",get:function(){return ei}},{key:"EVENT_KEY",get:function(){return Kn}},{key:"DefaultType",get:function(){return Gn}}]),i}(Ki),Un.fn[Bn]=ti._jQueryInterface,Un.fn[Bn].Constructor=ti,Un.fn[Bn].noConflict=function(){return Un.fn[Bn]=Qn,ti._jQueryInterface},ti),Yi=(ii="scrollspy",oi="."+(ri="bs.scrollspy"),si=(ni=t).fn[ii],ai={offset:10,method:"auto",target:""},li={offset:"number",method:"string",target:"(string|element)"},ci={ACTIVATE:"activate"+oi,SCROLL:"scroll"+oi,LOAD_DATA_API:"load"+oi+".data-api"},ui="dropdown-item",fi="active",hi='[data-spy="scroll"]',di=".active",pi=".nav, .list-group",mi=".nav-link",gi=".nav-item",_i=".list-group-item",vi=".dropdown",yi=".dropdown-item",Ei=".dropdown-toggle",bi="offset",wi="position",Ci=function(){function n(e,t){var n=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(t),this._selector=this._config.target+" "+mi+","+this._config.target+" "+_i+","+this._config.target+" "+yi,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,ni(this._scrollElement).on(ci.SCROLL,function(e){return n._process(e)}),this.refresh(),this._process()}var e=n.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?bi:wi,r="auto"===this._config.method?e:this._config.method,o=r===wi?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(e){var t,n=we.getSelectorFromElement(e);if(n&&(t=document.querySelector(n)),t){var i=t.getBoundingClientRect();if(i.width||i.height)return[ni(t)[r]().top+o,n]}return null}).filter(function(e){return e}).sort(function(e,t){return e[0]-t[0]}).forEach(function(e){t._offsets.push(e[0]),t._targets.push(e[1])})},e.dispose=function(){ni.removeData(this._element,ri),ni(this._scrollElement).off(oi),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(e){if("string"!=typeof(e=l({},ai,"object"==typeof e&&e?e:{})).target){var t=ni(e.target).attr("id");t||(t=we.getUID(ii),ni(e.target).attr("id",t)),e.target="#"+t}return we.typeCheckConfig(ii,e,li),e},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),n<=e){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&e<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var r=this._offsets.length;r--;){this._activeTarget!==this._targets[r]&&e>=this._offsets[r]&&("undefined"==typeof this._offsets[r+1]||e<this._offsets[r+1])&&this._activate(this._targets[r])}}},e._activate=function(t){this._activeTarget=t,this._clear();var e=this._selector.split(",");e=e.map(function(e){return e+'[data-target="'+t+'"],'+e+'[href="'+t+'"]'});var n=ni([].slice.call(document.querySelectorAll(e.join(","))));n.hasClass(ui)?(n.closest(vi).find(Ei).addClass(fi),n.addClass(fi)):(n.addClass(fi),n.parents(pi).prev(mi+", "+_i).addClass(fi),n.parents(pi).prev(gi).children(mi).addClass(fi)),ni(this._scrollElement).trigger(ci.ACTIVATE,{relatedTarget:t})},e._clear=function(){var e=[].slice.call(document.querySelectorAll(this._selector));ni(e).filter(di).removeClass(fi)},n._jQueryInterface=function(t){return this.each(function(){var e=ni(this).data(ri);if(e||(e=new n(this,"object"==typeof t&&t),ni(this).data(ri,e)),"string"==typeof t){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return ai}}]),n}(),ni(window).on(ci.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(hi)),t=e.length;t--;){var n=ni(e[t]);Ci._jQueryInterface.call(n,n.data())}}),ni.fn[ii]=Ci._jQueryInterface,ni.fn[ii].Constructor=Ci,ni.fn[ii].noConflict=function(){return ni.fn[ii]=si,Ci._jQueryInterface},Ci),Vi=(Di="."+(Si="bs.tab"),Ai=(Ti=t).fn.tab,Ii={HIDE:"hide"+Di,HIDDEN:"hidden"+Di,SHOW:"show"+Di,SHOWN:"shown"+Di,CLICK_DATA_API:"click"+Di+".data-api"},Oi="dropdown-menu",Ni="active",ki="disabled",xi="fade",Pi="show",Li=".dropdown",ji=".nav, .list-group",Hi=".active",Mi="> li > .active",Fi='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',Wi=".dropdown-toggle",Ri="> .dropdown-menu .active",Ui=function(){function i(e){this._element=e}var e=i.prototype;return e.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&Ti(this._element).hasClass(Ni)||Ti(this._element).hasClass(ki))){var e,i,t=Ti(this._element).closest(ji)[0],r=we.getSelectorFromElement(this._element);if(t){var o="UL"===t.nodeName?Mi:Hi;i=(i=Ti.makeArray(Ti(t).find(o)))[i.length-1]}var s=Ti.Event(Ii.HIDE,{relatedTarget:this._element}),a=Ti.Event(Ii.SHOW,{relatedTarget:i});if(i&&Ti(i).trigger(s),Ti(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){r&&(e=document.querySelector(r)),this._activate(this._element,t);var l=function(){var e=Ti.Event(Ii.HIDDEN,{relatedTarget:n._element}),t=Ti.Event(Ii.SHOWN,{relatedTarget:i});Ti(i).trigger(e),Ti(n._element).trigger(t)};e?this._activate(e,e.parentNode,l):l()}}},e.dispose=function(){Ti.removeData(this._element,Si),this._element=null},e._activate=function(e,t,n){var i=this,r=("UL"===t.nodeName?Ti(t).find(Mi):Ti(t).children(Hi))[0],o=n&&r&&Ti(r).hasClass(xi),s=function(){return i._transitionComplete(e,r,n)};if(r&&o){var a=we.getTransitionDurationFromElement(r);Ti(r).one(we.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},e._transitionComplete=function(e,t,n){if(t){Ti(t).removeClass(Pi+" "+Ni);var i=Ti(t.parentNode).find(Ri)[0];i&&Ti(i).removeClass(Ni),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}if(Ti(e).addClass(Ni),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),we.reflow(e),Ti(e).addClass(Pi),e.parentNode&&Ti(e.parentNode).hasClass(Oi)){var r=Ti(e).closest(Li)[0];if(r){var o=[].slice.call(r.querySelectorAll(Wi));Ti(o).addClass(Ni)}e.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var e=Ti(this),t=e.data(Si);if(t||(t=new i(this),e.data(Si,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}}]),i}(),Ti(document).on(Ii.CLICK_DATA_API,Fi,function(e){e.preventDefault(),Ui._jQueryInterface.call(Ti(this),"show")}),Ti.fn.tab=Ui._jQueryInterface,Ti.fn.tab.Constructor=Ui,Ti.fn.tab.noConflict=function(){return Ti.fn.tab=Ai,Ui._jQueryInterface},Ui);!function(e){if("undefined"==typeof e)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(t),e.Util=we,e.Alert=Ce,e.Button=Te,e.Carousel=Se,e.Collapse=De,e.Dropdown=Bi,e.Modal=qi,e.Popover=Qi,e.Scrollspy=Yi,e.Tab=Vi,e.Tooltip=Ki,Object.defineProperty(e,"__esModule",{value:!0})});
+//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file
diff --git a/ydb/core/cms/ui/ext/bootstrap.min.css b/ydb/core/cms/ui/ext/bootstrap.min.css
index d3ef88f47b3..882691283ab 100644
--- a/ydb/core/cms/ui/ext/bootstrap.min.css
+++ b/ydb/core/cms/ui/ext/bootstrap.min.css
@@ -1,7 +1,7 @@
-/*!
- * Bootstrap v4.1.3 (https://getbootstrap.com/)
- * Copyright 2011-2018 The Bootstrap Authors
- * Copyright 2011-2018 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::after,.was-validated .custom-file-input:valid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::after,.was-validated .custom-file-input:invalid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-dialog-centered::before{display:block;height:calc(100vh - (.5rem * 2));content:""}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-dialog-centered::before{height:calc(100vh - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item-next,.carousel-item-prev,.carousel-item.active{transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}
-/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
+/*!
+ * Bootstrap v4.1.3 (https://getbootstrap.com/)
+ * Copyright 2011-2018 The Bootstrap Authors
+ * Copyright 2011-2018 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::after,.was-validated .custom-file-input:valid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::after,.was-validated .custom-file-input:invalid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-dialog-centered::before{display:block;height:calc(100vh - (.5rem * 2));content:""}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-dialog-centered::before{height:calc(100vh - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item-next,.carousel-item-prev,.carousel-item.active{transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}
+/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
diff --git a/ydb/core/cms/ui/ext/theme.blue.css b/ydb/core/cms/ui/ext/theme.blue.css
index 343b523046e..da90a81d73d 100644
--- a/ydb/core/cms/ui/ext/theme.blue.css
+++ b/ydb/core/cms/ui/ext/theme.blue.css
@@ -1,229 +1,229 @@
-/*************
- Blue Theme
- *************/
-/* overall */
-.tablesorter-blue {
- width: 100%;
- background-color: #fff;
- margin: 10px 0 15px;
- text-align: left;
- border-spacing: 0;
- border: #cdcdcd 1px solid;
- border-width: 1px 0 0 1px;
-}
-.tablesorter-blue th,
-.tablesorter-blue td {
- border: #cdcdcd 1px solid;
- border-width: 0 1px 1px 0;
-}
-
-/* header */
-.tablesorter-blue th,
-.tablesorter-blue thead td {
- font: 12px/18px Arial, Sans-serif;
- font-weight: bold;
- color: #000;
- background-color: #99bfe6;
- border-collapse: collapse;
- padding: 4px;
- text-shadow: 0 1px 0 rgba(204, 204, 204, 0.7);
-}
-.tablesorter-blue tbody td,
-.tablesorter-blue tfoot th,
-.tablesorter-blue tfoot td {
- padding: 4px;
- vertical-align: top;
-}
-.tablesorter-blue .header,
-.tablesorter-blue .tablesorter-header {
- /* black (unsorted) double arrow */
- background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);
- /* white (unsorted) double arrow */
- /* background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==); */
- /* image */
- /* background-image: url(images/black-unsorted.gif); */
- background-repeat: no-repeat;
- background-position: center right;
- padding: 4px 18px 4px 4px;
- white-space: normal;
- cursor: pointer;
-}
-.tablesorter-blue .headerSortUp,
-.tablesorter-blue .tablesorter-headerSortUp,
-.tablesorter-blue .tablesorter-headerAsc {
- background-color: #9fbfdf;
- /* black asc arrow */
- background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);
- /* white asc arrow */
- /* background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7); */
- /* image */
- /* background-image: url(images/black-asc.gif); */
-}
-.tablesorter-blue .headerSortDown,
-.tablesorter-blue .tablesorter-headerSortDown,
-.tablesorter-blue .tablesorter-headerDesc {
- background-color: #8cb3d9;
- /* black desc arrow */
- background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);
- /* white desc arrow */
- /* background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7); */
- /* image */
- /* background-image: url(images/black-desc.gif); */
-}
-.tablesorter-blue thead .sorter-false {
- background-image: none;
- cursor: default;
- padding: 4px;
-}
-
-/* tfoot */
-.tablesorter-blue tfoot .tablesorter-headerSortUp,
-.tablesorter-blue tfoot .tablesorter-headerSortDown,
-.tablesorter-blue tfoot .tablesorter-headerAsc,
-.tablesorter-blue tfoot .tablesorter-headerDesc {
- /* remove sort arrows from footer */
- background-image: none;
-}
-
-/* tbody */
-.tablesorter-blue td {
- color: #3d3d3d;
- background-color: #fff;
- padding: 4px;
- vertical-align: top;
-}
-
-/* hovered row colors
- you'll need to add additional lines for
- rows with more than 2 child rows
- */
-.tablesorter-blue tbody > tr.hover > td,
-.tablesorter-blue tbody > tr:hover > td,
-.tablesorter-blue tbody > tr:hover + tr.tablesorter-childRow > td,
-.tablesorter-blue tbody > tr:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td,
-.tablesorter-blue tbody > tr.even.hover > td,
-.tablesorter-blue tbody > tr.even:hover > td,
-.tablesorter-blue tbody > tr.even:hover + tr.tablesorter-childRow > td,
-.tablesorter-blue tbody > tr.even:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
- background-color: #d9d9d9;
-}
-.tablesorter-blue tbody > tr.odd.hover > td,
-.tablesorter-blue tbody > tr.odd:hover > td,
-.tablesorter-blue tbody > tr.odd:hover + tr.tablesorter-childRow > td,
-.tablesorter-blue tbody > tr.odd:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
- background-color: #bfbfbf;
-}
-
-/* table processing indicator */
-.tablesorter-blue .tablesorter-processing {
- background-position: center center !important;
- background-repeat: no-repeat !important;
- /* background-image: url(images/loading.gif) !important; */
- background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
-}
-
-/* Zebra Widget - row alternating colors */
-.tablesorter-blue tbody tr.odd > td {
- background-color: #ebf2fa;
-}
-.tablesorter-blue tbody tr.even > td {
- background-color: #fff;
-}
-
-/* Column Widget - column sort colors */
-.tablesorter-blue td.primary,
-.tablesorter-blue tr.odd td.primary {
- background-color: #99b3e6;
-}
-.tablesorter-blue tr.even td.primary {
- background-color: #c2d1f0;
-}
-.tablesorter-blue td.secondary,
-.tablesorter-blue tr.odd td.secondary {
- background-color: #c2d1f0;
-}
-.tablesorter-blue tr.even td.secondary {
- background-color: #d6e0f5;
-}
-.tablesorter-blue td.tertiary,
-.tablesorter-blue tr.odd td.tertiary {
- background-color: #d6e0f5;
-}
-.tablesorter-blue tr.even td.tertiary {
- background-color: #ebf0fa;
-}
-
-/* caption */
-.tablesorter-blue > caption {
- background-color: #fff;
-}
-
-/* filter widget */
-.tablesorter-blue .tablesorter-filter-row {
- background-color: #eee;
-}
-.tablesorter-blue .tablesorter-filter-row td {
- background-color: #eee;
- line-height: normal;
- text-align: center; /* center the input */
- -webkit-transition: line-height 0.1s ease;
- -moz-transition: line-height 0.1s ease;
- -o-transition: line-height 0.1s ease;
- transition: line-height 0.1s ease;
-}
-/* optional disabled input styling */
-.tablesorter-blue .tablesorter-filter-row .disabled {
- opacity: 0.5;
- filter: alpha(opacity=50);
- cursor: not-allowed;
-}
-/* hidden filter row */
-.tablesorter-blue .tablesorter-filter-row.hideme td {
- /*** *********************************************** ***/
- /*** change this padding to modify the thickness ***/
- /*** of the closed filter row (height = padding x 2) ***/
- padding: 2px;
- /*** *********************************************** ***/
- margin: 0;
- line-height: 0;
- cursor: pointer;
-}
-.tablesorter-blue .tablesorter-filter-row.hideme * {
- height: 1px;
- min-height: 0;
- border: 0;
- padding: 0;
- margin: 0;
- /* don't use visibility: hidden because it disables tabbing */
- opacity: 0;
- filter: alpha(opacity=0);
-}
-/* filters */
-.tablesorter-blue input.tablesorter-filter,
-.tablesorter-blue select.tablesorter-filter {
- width: 98%;
- height: auto;
- margin: 0;
- padding: 4px;
- background-color: #fff;
- border: 1px solid #bbb;
- color: #333;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-transition: height 0.1s ease;
- -moz-transition: height 0.1s ease;
- -o-transition: height 0.1s ease;
- transition: height 0.1s ease;
-}
-/* rows hidden by filtering (needed for child rows) */
-.tablesorter .filtered {
- display: none;
-}
-
-/* ajax error row */
-.tablesorter .tablesorter-errorRow td {
- text-align: center;
- cursor: pointer;
- background-color: #e6bf99;
-}
+/*************
+ Blue Theme
+ *************/
+/* overall */
+.tablesorter-blue {
+ width: 100%;
+ background-color: #fff;
+ margin: 10px 0 15px;
+ text-align: left;
+ border-spacing: 0;
+ border: #cdcdcd 1px solid;
+ border-width: 1px 0 0 1px;
+}
+.tablesorter-blue th,
+.tablesorter-blue td {
+ border: #cdcdcd 1px solid;
+ border-width: 0 1px 1px 0;
+}
+
+/* header */
+.tablesorter-blue th,
+.tablesorter-blue thead td {
+ font: 12px/18px Arial, Sans-serif;
+ font-weight: bold;
+ color: #000;
+ background-color: #99bfe6;
+ border-collapse: collapse;
+ padding: 4px;
+ text-shadow: 0 1px 0 rgba(204, 204, 204, 0.7);
+}
+.tablesorter-blue tbody td,
+.tablesorter-blue tfoot th,
+.tablesorter-blue tfoot td {
+ padding: 4px;
+ vertical-align: top;
+}
+.tablesorter-blue .header,
+.tablesorter-blue .tablesorter-header {
+ /* black (unsorted) double arrow */
+ background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);
+ /* white (unsorted) double arrow */
+ /* background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==); */
+ /* image */
+ /* background-image: url(images/black-unsorted.gif); */
+ background-repeat: no-repeat;
+ background-position: center right;
+ padding: 4px 18px 4px 4px;
+ white-space: normal;
+ cursor: pointer;
+}
+.tablesorter-blue .headerSortUp,
+.tablesorter-blue .tablesorter-headerSortUp,
+.tablesorter-blue .tablesorter-headerAsc {
+ background-color: #9fbfdf;
+ /* black asc arrow */
+ background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);
+ /* white asc arrow */
+ /* background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7); */
+ /* image */
+ /* background-image: url(images/black-asc.gif); */
+}
+.tablesorter-blue .headerSortDown,
+.tablesorter-blue .tablesorter-headerSortDown,
+.tablesorter-blue .tablesorter-headerDesc {
+ background-color: #8cb3d9;
+ /* black desc arrow */
+ background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);
+ /* white desc arrow */
+ /* background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7); */
+ /* image */
+ /* background-image: url(images/black-desc.gif); */
+}
+.tablesorter-blue thead .sorter-false {
+ background-image: none;
+ cursor: default;
+ padding: 4px;
+}
+
+/* tfoot */
+.tablesorter-blue tfoot .tablesorter-headerSortUp,
+.tablesorter-blue tfoot .tablesorter-headerSortDown,
+.tablesorter-blue tfoot .tablesorter-headerAsc,
+.tablesorter-blue tfoot .tablesorter-headerDesc {
+ /* remove sort arrows from footer */
+ background-image: none;
+}
+
+/* tbody */
+.tablesorter-blue td {
+ color: #3d3d3d;
+ background-color: #fff;
+ padding: 4px;
+ vertical-align: top;
+}
+
+/* hovered row colors
+ you'll need to add additional lines for
+ rows with more than 2 child rows
+ */
+.tablesorter-blue tbody > tr.hover > td,
+.tablesorter-blue tbody > tr:hover > td,
+.tablesorter-blue tbody > tr:hover + tr.tablesorter-childRow > td,
+.tablesorter-blue tbody > tr:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td,
+.tablesorter-blue tbody > tr.even.hover > td,
+.tablesorter-blue tbody > tr.even:hover > td,
+.tablesorter-blue tbody > tr.even:hover + tr.tablesorter-childRow > td,
+.tablesorter-blue tbody > tr.even:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
+ background-color: #d9d9d9;
+}
+.tablesorter-blue tbody > tr.odd.hover > td,
+.tablesorter-blue tbody > tr.odd:hover > td,
+.tablesorter-blue tbody > tr.odd:hover + tr.tablesorter-childRow > td,
+.tablesorter-blue tbody > tr.odd:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
+ background-color: #bfbfbf;
+}
+
+/* table processing indicator */
+.tablesorter-blue .tablesorter-processing {
+ background-position: center center !important;
+ background-repeat: no-repeat !important;
+ /* background-image: url(images/loading.gif) !important; */
+ background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
+}
+
+/* Zebra Widget - row alternating colors */
+.tablesorter-blue tbody tr.odd > td {
+ background-color: #ebf2fa;
+}
+.tablesorter-blue tbody tr.even > td {
+ background-color: #fff;
+}
+
+/* Column Widget - column sort colors */
+.tablesorter-blue td.primary,
+.tablesorter-blue tr.odd td.primary {
+ background-color: #99b3e6;
+}
+.tablesorter-blue tr.even td.primary {
+ background-color: #c2d1f0;
+}
+.tablesorter-blue td.secondary,
+.tablesorter-blue tr.odd td.secondary {
+ background-color: #c2d1f0;
+}
+.tablesorter-blue tr.even td.secondary {
+ background-color: #d6e0f5;
+}
+.tablesorter-blue td.tertiary,
+.tablesorter-blue tr.odd td.tertiary {
+ background-color: #d6e0f5;
+}
+.tablesorter-blue tr.even td.tertiary {
+ background-color: #ebf0fa;
+}
+
+/* caption */
+.tablesorter-blue > caption {
+ background-color: #fff;
+}
+
+/* filter widget */
+.tablesorter-blue .tablesorter-filter-row {
+ background-color: #eee;
+}
+.tablesorter-blue .tablesorter-filter-row td {
+ background-color: #eee;
+ line-height: normal;
+ text-align: center; /* center the input */
+ -webkit-transition: line-height 0.1s ease;
+ -moz-transition: line-height 0.1s ease;
+ -o-transition: line-height 0.1s ease;
+ transition: line-height 0.1s ease;
+}
+/* optional disabled input styling */
+.tablesorter-blue .tablesorter-filter-row .disabled {
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ cursor: not-allowed;
+}
+/* hidden filter row */
+.tablesorter-blue .tablesorter-filter-row.hideme td {
+ /*** *********************************************** ***/
+ /*** change this padding to modify the thickness ***/
+ /*** of the closed filter row (height = padding x 2) ***/
+ padding: 2px;
+ /*** *********************************************** ***/
+ margin: 0;
+ line-height: 0;
+ cursor: pointer;
+}
+.tablesorter-blue .tablesorter-filter-row.hideme * {
+ height: 1px;
+ min-height: 0;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ /* don't use visibility: hidden because it disables tabbing */
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+/* filters */
+.tablesorter-blue input.tablesorter-filter,
+.tablesorter-blue select.tablesorter-filter {
+ width: 98%;
+ height: auto;
+ margin: 0;
+ padding: 4px;
+ background-color: #fff;
+ border: 1px solid #bbb;
+ color: #333;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-transition: height 0.1s ease;
+ -moz-transition: height 0.1s ease;
+ -o-transition: height 0.1s ease;
+ transition: height 0.1s ease;
+}
+/* rows hidden by filtering (needed for child rows) */
+.tablesorter .filtered {
+ display: none;
+}
+
+/* ajax error row */
+.tablesorter .tablesorter-errorRow td {
+ text-align: center;
+ cursor: pointer;
+ background-color: #e6bf99;
+}
diff --git a/ydb/core/cms/ui/index.html b/ydb/core/cms/ui/index.html
index ca53ef5816f..a8759493094 100644
--- a/ydb/core/cms/ui/index.html
+++ b/ydb/core/cms/ui/index.html
@@ -1,87 +1,87 @@
-<html>
- <head>
- <link rel='stylesheet' href='cms/ext/bootstrap.min.css'>
- <script language='javascript' type='text/javascript' src='https://yastatic.net/jquery/3.3.1/jquery.min.js'></script>
- <script language='javascript' type='text/javascript' src='cms/ext/bootstrap.bundle.min.js'></script>
- <link rel='stylesheet' href='./jquery.tablesorter.css'>
- <script language='javascript' type='text/javascript' src='./jquery.tablesorter.js'></script>
- <link rel="stylesheet" href="cms/ext/theme.blue.css"></link>
-
- <link rel="stylesheet" href="cms/common.css"></link>
- <link rel="stylesheet" href="cms/cms.css"></link>
- <script language="javascript" type="text/javascript" src="cms/common.js"></script>
- <script language="javascript" type="text/javascript" src="cms/enums.js"></script>
- <script language="javascript" type="text/javascript" src="cms/proto_types.js"></script>
- <script language="javascript" type="text/javascript" src="cms/cms_log.js"></script>
- <script language="javascript" type="text/javascript" src="cms/configs.js"></script>
- <script language="javascript" type="text/javascript" src="cms/config_forms.js"></script>
- <script language="javascript" type="text/javascript" src="cms/validators.js"></script>
- <script language="javascript" type="text/javascript" src="cms/cms.js"></script>
-
- <style type="text/css">
- .table-nonfluid { width: auto; }
- .narrow-line50 {line-height: 50%}
- .narrow-line60 {line-height: 60%}
- .narrow-line70 {line-height: 70%}
- .narrow-line80 {line-height: 80%}
- .narrow-line90 {line-height: 90%}
- </style>
- </head>
- <body>
- <ol class='breadcrumb'>
- <li class='breadcrumb-item'><a id='host-ref' href='.'>Kikimr Monitoring</a></li>
- <li class='breadcrumb-item active'>Cluster Management System</li>
- </ol>
- <div class="container"><h2>Cluster Management System</h2>
- <div id="enums-error" class="error"></div>
- <div id="proto-types-error" class="error"></div>
- <ul class="nav nav-tabs">
- <li class="nav-item">
- <a class="nav-link active" href="#configs" data-toggle="tab">Configs</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="#validators" data-toggle="tab">Validators</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="#cms-log" data-toggle="tab">CMS Log</a>
- </li>
- </ul>
- <div class="tab-content" style="padding-top: 10px">
- <div id="configs" class="tab-pane fade in active show">
- <div id="configs-error" class="error"></div>
- <div id="configs-success" class="success"></div>
- <div id="config-items"></div>
- </div>
- <div id="validators" class="tab-pane fade">
- <div id="validators-error" class="error"></div>
- <div id="update-validator-error" class="error"></div>
- <table id="validators-table" class="tablesorter">
- <thead>
- <tr>
- <th>Name</th>
- <th>Description</th>
- <th>Checked Configs</th>
- <th>Enabled</th>
- </tr>
- </thead>
- <tbody id="validators-body">
- </tbody>
- </table>
- </div>
- <div id="cms-log" class="tab-pane fade">
- <div id="cms-log-error" class="error"></div>
- <table id="cms-log-table" class="tablesorter">
- <thead>
- <tr>
- <th>Timestamp</th>
- <th>Message</th>
- </tr>
- </thead>
- <tbody id="cms-log-body">
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </body>
-</html>
+<html>
+ <head>
+ <link rel='stylesheet' href='cms/ext/bootstrap.min.css'>
+ <script language='javascript' type='text/javascript' src='https://yastatic.net/jquery/3.3.1/jquery.min.js'></script>
+ <script language='javascript' type='text/javascript' src='cms/ext/bootstrap.bundle.min.js'></script>
+ <link rel='stylesheet' href='./jquery.tablesorter.css'>
+ <script language='javascript' type='text/javascript' src='./jquery.tablesorter.js'></script>
+ <link rel="stylesheet" href="cms/ext/theme.blue.css"></link>
+
+ <link rel="stylesheet" href="cms/common.css"></link>
+ <link rel="stylesheet" href="cms/cms.css"></link>
+ <script language="javascript" type="text/javascript" src="cms/common.js"></script>
+ <script language="javascript" type="text/javascript" src="cms/enums.js"></script>
+ <script language="javascript" type="text/javascript" src="cms/proto_types.js"></script>
+ <script language="javascript" type="text/javascript" src="cms/cms_log.js"></script>
+ <script language="javascript" type="text/javascript" src="cms/configs.js"></script>
+ <script language="javascript" type="text/javascript" src="cms/config_forms.js"></script>
+ <script language="javascript" type="text/javascript" src="cms/validators.js"></script>
+ <script language="javascript" type="text/javascript" src="cms/cms.js"></script>
+
+ <style type="text/css">
+ .table-nonfluid { width: auto; }
+ .narrow-line50 {line-height: 50%}
+ .narrow-line60 {line-height: 60%}
+ .narrow-line70 {line-height: 70%}
+ .narrow-line80 {line-height: 80%}
+ .narrow-line90 {line-height: 90%}
+ </style>
+ </head>
+ <body>
+ <ol class='breadcrumb'>
+ <li class='breadcrumb-item'><a id='host-ref' href='.'>Kikimr Monitoring</a></li>
+ <li class='breadcrumb-item active'>Cluster Management System</li>
+ </ol>
+ <div class="container"><h2>Cluster Management System</h2>
+ <div id="enums-error" class="error"></div>
+ <div id="proto-types-error" class="error"></div>
+ <ul class="nav nav-tabs">
+ <li class="nav-item">
+ <a class="nav-link active" href="#configs" data-toggle="tab">Configs</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="#validators" data-toggle="tab">Validators</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="#cms-log" data-toggle="tab">CMS Log</a>
+ </li>
+ </ul>
+ <div class="tab-content" style="padding-top: 10px">
+ <div id="configs" class="tab-pane fade in active show">
+ <div id="configs-error" class="error"></div>
+ <div id="configs-success" class="success"></div>
+ <div id="config-items"></div>
+ </div>
+ <div id="validators" class="tab-pane fade">
+ <div id="validators-error" class="error"></div>
+ <div id="update-validator-error" class="error"></div>
+ <table id="validators-table" class="tablesorter">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Description</th>
+ <th>Checked Configs</th>
+ <th>Enabled</th>
+ </tr>
+ </thead>
+ <tbody id="validators-body">
+ </tbody>
+ </table>
+ </div>
+ <div id="cms-log" class="tab-pane fade">
+ <div id="cms-log-error" class="error"></div>
+ <table id="cms-log-table" class="tablesorter">
+ <thead>
+ <tr>
+ <th>Timestamp</th>
+ <th>Message</th>
+ </tr>
+ </thead>
+ <tbody id="cms-log-body">
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/ydb/core/cms/ui/proto_types.js b/ydb/core/cms/ui/proto_types.js
index 82295f8ba69..e683fa6ccd8 100644
--- a/ydb/core/cms/ui/proto_types.js
+++ b/ydb/core/cms/ui/proto_types.js
@@ -1,70 +1,70 @@
-'use strict';
-
-class ProtoTypes {
-
- constructor(errorElemId) {
- this._requested = new Set();
- this._requests = 0;
- this._retryInterval = 5000;
- this._errorElemId = errorElemId;
- this._onDone = [];
- }
-
- add(typeName) {
- if (!this._requested.has(typeName)) {
- this._requested.add(typeName);
- ++this._requests;
- this._load(typeName);
- }
-
- return this;
- }
-
- done(cb) {
- this._onDone.push(cb);
- return this;
- }
-
- get(name) {
- if (!this[name])
- return undefined;
- return this[name];
- }
-
- _load(typeName) {
- var _this = this;
- $.get('cms/api/json/proto?type=' + typeName)
- .done((data) => {
- _this._onLoaded(typeName, data);
- })
- .fail(function(){
- _this._onLoadFailed(typeName);
- });
- }
-
- _onLoaded(typeName, data) {
- this[typeName] = data;
-
- for (var field of data.field) {
- if (field.type_name !== undefined) {
- this.add(field.type_name);
- }
- }
-
- --this._requests;
- if (this._requests == 0) {
- $('#' + this._errorElemId).html('');
- for (var cb of this._onDone)
- cb();
- }
- }
-
- _onLoadFailed(typeName) {
- var error = 'Cannot load description of proto type ' + typeName;
- $('#' + this._errorElemId).html(error);
- var _this = this;
- setTimeout(function() { _this._load(typeName) }, this._retryInterval);
- }
-}
-
-var cmsProtoTypes = new ProtoTypes('proto-types-error');
+'use strict';
+
+class ProtoTypes {
+
+ constructor(errorElemId) {
+ this._requested = new Set();
+ this._requests = 0;
+ this._retryInterval = 5000;
+ this._errorElemId = errorElemId;
+ this._onDone = [];
+ }
+
+ add(typeName) {
+ if (!this._requested.has(typeName)) {
+ this._requested.add(typeName);
+ ++this._requests;
+ this._load(typeName);
+ }
+
+ return this;
+ }
+
+ done(cb) {
+ this._onDone.push(cb);
+ return this;
+ }
+
+ get(name) {
+ if (!this[name])
+ return undefined;
+ return this[name];
+ }
+
+ _load(typeName) {
+ var _this = this;
+ $.get('cms/api/json/proto?type=' + typeName)
+ .done((data) => {
+ _this._onLoaded(typeName, data);
+ })
+ .fail(function(){
+ _this._onLoadFailed(typeName);
+ });
+ }
+
+ _onLoaded(typeName, data) {
+ this[typeName] = data;
+
+ for (var field of data.field) {
+ if (field.type_name !== undefined) {
+ this.add(field.type_name);
+ }
+ }
+
+ --this._requests;
+ if (this._requests == 0) {
+ $('#' + this._errorElemId).html('');
+ for (var cb of this._onDone)
+ cb();
+ }
+ }
+
+ _onLoadFailed(typeName) {
+ var error = 'Cannot load description of proto type ' + typeName;
+ $('#' + this._errorElemId).html(error);
+ var _this = this;
+ setTimeout(function() { _this._load(typeName) }, this._retryInterval);
+ }
+}
+
+var cmsProtoTypes = new ProtoTypes('proto-types-error');
diff --git a/ydb/core/cms/ui/validators.js b/ydb/core/cms/ui/validators.js
index 507ad47ac26..89f706067e2 100644
--- a/ydb/core/cms/ui/validators.js
+++ b/ydb/core/cms/ui/validators.js
@@ -1,233 +1,233 @@
-var ValidatorsState = {
- validators: new Map(),
- retryInterval: 5000,
- updateInterval: 5000,
-}
-
-class Validator {
- constructor(info) {
- this.name = info.Name;
- this.description = info.Description;
- this.checkedKinds = info.CheckedItemKinds;
- if (!this.checkedKinds)
- this.checkedKinds = [];
- this.enabled = info.Enabled;
- this.toggling = false;
-
- var cell1 = document.createElement('td');
- cell1.textContent = this.name;
-
- var cell2 = document.createElement('td');
- cell2.textContent = this.description;
-
- var cell3 = document.createElement('td');
- for (var kind of this.checkedKinds) {
- var p = document.createElement('p');
- p.textContent = cmsEnums.get('ItemKinds', kind);
- cell3.appendChild(p);
- }
- cell3.dataset.ordervalue = 0;
- if (this.checkedKinds.length > 0)
- cell3.dataset.ordervalue = this.checkedKinds[0];
-
- this.enableBtn = document.createElement('input');
- this.enableBtn.type = 'radio';
- this.enableBtn.name = 'options';
- this.enableBtn.id = this.name + '-validator-enable';
- this.enableBtn.autocomplete = 'off';
- $(this.enableBtn).change(this._getOnChange(true));
- var enableLabel = document.createElement('label');
- enableLabel.setAttribute('class', 'btn btn-sm btn-outline-success');
- enableLabel.textContent = 'Enabled';
- enableLabel.appendChild(this.enableBtn);
-
- this.disableBtn = document.createElement('input');
- this.disableBtn.id = this.name + '-validator-disable';
- this.disableBtn.type = 'radio';
- this.disableBtn.name = 'options';
- this.disableBtn.autocomplete = 'off';
- $(this.disableBtn).change(this._getOnChange(false));
- var disableLabel = document.createElement('label');
- disableLabel.setAttribute('class', 'btn btn-sm btn-outline-danger');
- disableLabel.textContent = 'Disabled';
- disableLabel.appendChild(this.disableBtn);
-
- var divBtns = document.createElement('div');
- divBtns.setAttribute('class', 'btn-group btn-group-toggle');
- divBtns.dataset.toggle = 'buttons';
- divBtns.appendChild(enableLabel);
- divBtns.appendChild(disableLabel);
-
- this.enableCell = document.createElement('td');
- this.enableCell.setAttribute('style', 'vertical-align: middle; text-align: center;');
- this.enableCell.appendChild(divBtns);
-
- var line = document.createElement('tr');
- line.appendChild(cell1);
- line.appendChild(cell2);
- line.appendChild(cell3);
- line.appendChild(this.enableCell);
-
- document.getElementById('validators-body').appendChild(line);
-
- this.update(info);
- }
-
- update(info) {
- if (this.toggling)
- return;
-
- this.enabled = info.Enabled;
-
- if (this.enableCell.dataset.ordervalue == Number(this.enabled))
- return;
-
- if (this.enabled) {
- this.enableBtn.parentNode.classList.add('active');
- this.enableBtn.setAttribute('checked', '');
- this.disableBtn.removeAttribute('checked');
- this.disableBtn.parentNode.classList.remove('active');
- } else {
- this.disableBtn.parentNode.classList.add('active');
- this.disableBtn.setAttribute('checked', '');
- this.enableBtn.removeAttribute('checked');
- this.enableBtn.parentNode.classList.remove('active');
- }
- this.enableCell.dataset.ordervalue = Number(this.enabled);
-
- this._updateTable();
- }
-
- _getOnChange(enabled) {
- var _this = this;
- return function() {
- _this._toggle(enabled);
- };
- }
-
- _toggle(enabled) {
- if (this.toggling || this.enabled == enabled)
- return;
-
- this.toggling = true;
- this.enabled = enabled;
-
- if (enabled) {
- this.disableBtn.classList.add('disabled');
- this.disableBtn.parentNode.classList.add('disabled');
- } else {
- this.enableBtn.parentNode.classList.add('disabled');
- this.enableBtn.classList.add('disabled');
- }
-
- this._sendToggle();
- }
-
- _sendToggle() {
- var url = 'cms/api/json/toggleconfigvalidator?';
- url += 'name=' + this.name;
- url += '&enable=' + (+this.enabled);
- var _this = this;
- $.get(url)
- .done(function(data) {
- _this._onToggleFinished(data);
- })
- .fail(function() {
- _this._onToggleFailed();
- });
- }
-
- _onToggleFinished(data) {
- if (data['Status']['Code'] != 'SUCCESS') {
- this._onToggleFailed(data);
- return;
- }
-
- $('#update-validator-error').html('');
-
- this.enableBtn.parentNode.classList.remove('disabled');
- this.enableBtn.classList.remove('disabled');
- this.disableBtn.parentNode.classList.remove('disabled');
- this.disableBtn.classList.remove('disabled');
-
- this.toggling = false;
- this.enableCell.dataset.ordervalue = Number(this.enabled);
-
- this._updateTable();
- }
-
- _onToggleFailed(data) {
- console.log('_onToggleFailed');
- console.log(data);
- if (data && data['Status'] && data['Status']['Reason'])
- $('#update-validator-error').html(data['Status']['Reason']);
- else
- $('#update-validator-error').html("Cannot update validator state");
-
- var _this = this;
- setTimeout(function(){ _this._sendToggle() }, ValidatorsState.retryInterval);
- }
-
- _updateTable() {
- $("#validators-table").trigger("update", [true]);
- }
-}
-
-function onValidatorsLoaded(data) {
- if (data['Status']['Code'] != 'SUCCESS') {
- onValidatorsFailed(data);
- return;
- }
-
- $('#validators-error').html('');
-
- var validators = data.Validators;
- if (!validators)
- validators = [];
-
- for (var info of validators) {
- if (ValidatorsState.validators.has(info.Name)) {
- ValidatorsState.validators.get(info.Name).update(info);
- } else {
- ValidatorsState.validators.set(info.Name, new Validator(info));
- }
- }
-
- setTimeout(loadValidators, ValidatorsState.updateInterval);
-}
-
-function onValidatorsFailed(data) {
- if (data && data['Status'] && data['Status']['Reason'])
- $('#validators-error').html(data['Status']['Reason']);
- else
- $('#validators-error').html("Cannot get validators state");
- setTimeout(loadValidators, ValidatorsState.retryInterval);
-}
-
-function loadValidators() {
- var url = 'cms/api/json/configvalidators';
- $.get(url).done(onValidatorsLoaded).fail(onValidatorsFailed);
-}
-
-function initValidatorsTab() {
- $("#validators-table").tablesorter({
- theme: 'blue',
- sortList: [[0,0]],
- headers: {
- 1: {
- sorter: false,
- },
- 2: {
- sorter: 'numeric-ordervalue',
- },
- 3: {
- sorter: 'numeric-ordervalue',
- },
- },
- widgets : ['zebra'],
- });
-
- cmsEnums
- .add('ItemKinds', 'NKikimrConsole::TConfigItem::EKind')
- .done(loadValidators);
-}
+var ValidatorsState = {
+ validators: new Map(),
+ retryInterval: 5000,
+ updateInterval: 5000,
+}
+
+class Validator {
+ constructor(info) {
+ this.name = info.Name;
+ this.description = info.Description;
+ this.checkedKinds = info.CheckedItemKinds;
+ if (!this.checkedKinds)
+ this.checkedKinds = [];
+ this.enabled = info.Enabled;
+ this.toggling = false;
+
+ var cell1 = document.createElement('td');
+ cell1.textContent = this.name;
+
+ var cell2 = document.createElement('td');
+ cell2.textContent = this.description;
+
+ var cell3 = document.createElement('td');
+ for (var kind of this.checkedKinds) {
+ var p = document.createElement('p');
+ p.textContent = cmsEnums.get('ItemKinds', kind);
+ cell3.appendChild(p);
+ }
+ cell3.dataset.ordervalue = 0;
+ if (this.checkedKinds.length > 0)
+ cell3.dataset.ordervalue = this.checkedKinds[0];
+
+ this.enableBtn = document.createElement('input');
+ this.enableBtn.type = 'radio';
+ this.enableBtn.name = 'options';
+ this.enableBtn.id = this.name + '-validator-enable';
+ this.enableBtn.autocomplete = 'off';
+ $(this.enableBtn).change(this._getOnChange(true));
+ var enableLabel = document.createElement('label');
+ enableLabel.setAttribute('class', 'btn btn-sm btn-outline-success');
+ enableLabel.textContent = 'Enabled';
+ enableLabel.appendChild(this.enableBtn);
+
+ this.disableBtn = document.createElement('input');
+ this.disableBtn.id = this.name + '-validator-disable';
+ this.disableBtn.type = 'radio';
+ this.disableBtn.name = 'options';
+ this.disableBtn.autocomplete = 'off';
+ $(this.disableBtn).change(this._getOnChange(false));
+ var disableLabel = document.createElement('label');
+ disableLabel.setAttribute('class', 'btn btn-sm btn-outline-danger');
+ disableLabel.textContent = 'Disabled';
+ disableLabel.appendChild(this.disableBtn);
+
+ var divBtns = document.createElement('div');
+ divBtns.setAttribute('class', 'btn-group btn-group-toggle');
+ divBtns.dataset.toggle = 'buttons';
+ divBtns.appendChild(enableLabel);
+ divBtns.appendChild(disableLabel);
+
+ this.enableCell = document.createElement('td');
+ this.enableCell.setAttribute('style', 'vertical-align: middle; text-align: center;');
+ this.enableCell.appendChild(divBtns);
+
+ var line = document.createElement('tr');
+ line.appendChild(cell1);
+ line.appendChild(cell2);
+ line.appendChild(cell3);
+ line.appendChild(this.enableCell);
+
+ document.getElementById('validators-body').appendChild(line);
+
+ this.update(info);
+ }
+
+ update(info) {
+ if (this.toggling)
+ return;
+
+ this.enabled = info.Enabled;
+
+ if (this.enableCell.dataset.ordervalue == Number(this.enabled))
+ return;
+
+ if (this.enabled) {
+ this.enableBtn.parentNode.classList.add('active');
+ this.enableBtn.setAttribute('checked', '');
+ this.disableBtn.removeAttribute('checked');
+ this.disableBtn.parentNode.classList.remove('active');
+ } else {
+ this.disableBtn.parentNode.classList.add('active');
+ this.disableBtn.setAttribute('checked', '');
+ this.enableBtn.removeAttribute('checked');
+ this.enableBtn.parentNode.classList.remove('active');
+ }
+ this.enableCell.dataset.ordervalue = Number(this.enabled);
+
+ this._updateTable();
+ }
+
+ _getOnChange(enabled) {
+ var _this = this;
+ return function() {
+ _this._toggle(enabled);
+ };
+ }
+
+ _toggle(enabled) {
+ if (this.toggling || this.enabled == enabled)
+ return;
+
+ this.toggling = true;
+ this.enabled = enabled;
+
+ if (enabled) {
+ this.disableBtn.classList.add('disabled');
+ this.disableBtn.parentNode.classList.add('disabled');
+ } else {
+ this.enableBtn.parentNode.classList.add('disabled');
+ this.enableBtn.classList.add('disabled');
+ }
+
+ this._sendToggle();
+ }
+
+ _sendToggle() {
+ var url = 'cms/api/json/toggleconfigvalidator?';
+ url += 'name=' + this.name;
+ url += '&enable=' + (+this.enabled);
+ var _this = this;
+ $.get(url)
+ .done(function(data) {
+ _this._onToggleFinished(data);
+ })
+ .fail(function() {
+ _this._onToggleFailed();
+ });
+ }
+
+ _onToggleFinished(data) {
+ if (data['Status']['Code'] != 'SUCCESS') {
+ this._onToggleFailed(data);
+ return;
+ }
+
+ $('#update-validator-error').html('');
+
+ this.enableBtn.parentNode.classList.remove('disabled');
+ this.enableBtn.classList.remove('disabled');
+ this.disableBtn.parentNode.classList.remove('disabled');
+ this.disableBtn.classList.remove('disabled');
+
+ this.toggling = false;
+ this.enableCell.dataset.ordervalue = Number(this.enabled);
+
+ this._updateTable();
+ }
+
+ _onToggleFailed(data) {
+ console.log('_onToggleFailed');
+ console.log(data);
+ if (data && data['Status'] && data['Status']['Reason'])
+ $('#update-validator-error').html(data['Status']['Reason']);
+ else
+ $('#update-validator-error').html("Cannot update validator state");
+
+ var _this = this;
+ setTimeout(function(){ _this._sendToggle() }, ValidatorsState.retryInterval);
+ }
+
+ _updateTable() {
+ $("#validators-table").trigger("update", [true]);
+ }
+}
+
+function onValidatorsLoaded(data) {
+ if (data['Status']['Code'] != 'SUCCESS') {
+ onValidatorsFailed(data);
+ return;
+ }
+
+ $('#validators-error').html('');
+
+ var validators = data.Validators;
+ if (!validators)
+ validators = [];
+
+ for (var info of validators) {
+ if (ValidatorsState.validators.has(info.Name)) {
+ ValidatorsState.validators.get(info.Name).update(info);
+ } else {
+ ValidatorsState.validators.set(info.Name, new Validator(info));
+ }
+ }
+
+ setTimeout(loadValidators, ValidatorsState.updateInterval);
+}
+
+function onValidatorsFailed(data) {
+ if (data && data['Status'] && data['Status']['Reason'])
+ $('#validators-error').html(data['Status']['Reason']);
+ else
+ $('#validators-error').html("Cannot get validators state");
+ setTimeout(loadValidators, ValidatorsState.retryInterval);
+}
+
+function loadValidators() {
+ var url = 'cms/api/json/configvalidators';
+ $.get(url).done(onValidatorsLoaded).fail(onValidatorsFailed);
+}
+
+function initValidatorsTab() {
+ $("#validators-table").tablesorter({
+ theme: 'blue',
+ sortList: [[0,0]],
+ headers: {
+ 1: {
+ sorter: false,
+ },
+ 2: {
+ sorter: 'numeric-ordervalue',
+ },
+ 3: {
+ sorter: 'numeric-ordervalue',
+ },
+ },
+ widgets : ['zebra'],
+ });
+
+ cmsEnums
+ .add('ItemKinds', 'NKikimrConsole::TConfigItem::EKind')
+ .done(loadValidators);
+}
diff --git a/ydb/core/cms/ut/ya.make b/ydb/core/cms/ut/ya.make
index 3f3497f6483..91fb1cd823e 100644
--- a/ydb/core/cms/ut/ya.make
+++ b/ydb/core/cms/ut/ya.make
@@ -1,10 +1,10 @@
UNITTEST_FOR(ydb/core/cms)
-
+
OWNER(
ienkovich
g:kikimr
)
-
+
SPLIT_FACTOR(30)
FORK_SUBTESTS()
@@ -12,23 +12,23 @@ FORK_SUBTESTS()
SIZE(MEDIUM)
TIMEOUT(600)
-
-PEERDIR(
+
+PEERDIR(
library/cpp/getopt
library/cpp/svnversion
ydb/core/testlib
-)
-
+)
+
YQL_LAST_ABI_VERSION()
-SRCS(
- cluster_info_ut.cpp
- cms_ut.cpp
+SRCS(
+ cluster_info_ut.cpp
+ cms_ut.cpp
cms_tenants_ut.cpp
- cms_ut_common.cpp
+ cms_ut_common.cpp
cms_ut_common.h
downtime_ut.cpp
ut_helpers.cpp
-)
-
-END()
+)
+
+END()
diff --git a/ydb/core/cms/ut_helpers.h b/ydb/core/cms/ut_helpers.h
index 78d33e5450d..ba2a0fa0505 100644
--- a/ydb/core/cms/ut_helpers.h
+++ b/ydb/core/cms/ut_helpers.h
@@ -1,374 +1,374 @@
-#pragma once
-#include "cms.h"
-
+#pragma once
+#include "cms.h"
+
#include <ydb/core/blobstorage/base/blobstorage_events.h>
#include <ydb/core/protos/cms.pb.h>
#include <ydb/library/aclib/aclib.h>
-
-namespace NKikimr {
-namespace NCmsTest {
-
-inline void AddServices(NKikimrCms::TAction &action, const TString &service)
-{
- *action.AddServices() = service;
-}
-
-template<typename... Ts>
-void AddServices(NKikimrCms::TAction &action, const TString &service, Ts... services)
-{
- AddServices(action, service);
- AddServices(action, services...);
-}
-
-inline void AddDevices(NKikimrCms::TAction &action, const TString &device)
-{
- *action.AddDevices() = device;
-}
-
-template<typename... Ts>
-void AddDevices(NKikimrCms::TAction &action, const TString &device, Ts... devices)
-{
- AddDevices(action, device);
- AddDevices(action, devices...);
-}
-
-inline NKikimrCms::TAction MakeAction(NKikimrCms::TAction::EType type, const TString &host, ui64 duration)
-{
- NKikimrCms::TAction action;
- action.SetType(type);
- action.SetHost(host);
- action.SetDuration(duration);
- return action;
-}
-
-inline NKikimrCms::TAction MakeAction(NKikimrCms::TAction::EType type, ui32 nodeId, ui64 duration)
-{
- return MakeAction(type, ToString(nodeId), duration);
-}
-
-template<typename... Ts>
-NKikimrCms::TAction MakeAction(NKikimrCms::TAction::EType type, const TString &host, ui64 duration, Ts... items)
-{
- NKikimrCms::TAction action = MakeAction(type, host, duration);
- if (type == NKikimrCms::TAction::START_SERVICES
- || type == NKikimrCms::TAction::RESTART_SERVICES
- || type == NKikimrCms::TAction::STOP_SERVICES)
- AddServices(action, items...);
- else
- AddDevices(action, items...);
- return action;
-}
-
-template<typename... Ts>
-NKikimrCms::TAction MakeAction(NKikimrCms::TAction::EType type, ui32 nodeId, ui64 duration, Ts... items)
-{
- return MakeAction(type, ToString(nodeId), duration, items...);
-}
-
-inline void AddActions(TAutoPtr<NCms::TEvCms::TEvPermissionRequest> &event,
- const NKikimrCms::TAction &action)
-{
- event->Record.AddActions()->CopyFrom(action);
-}
-
-template<typename... Ts>
-void AddActions(TAutoPtr<NCms::TEvCms::TEvPermissionRequest> &event,
- const NKikimrCms::TAction &action, Ts... actions)
-{
- AddActions(event, action);
- AddActions(event, actions...);
-}
-
-template<typename... Ts>
-TAutoPtr<NCms::TEvCms::TEvPermissionRequest> MakePermissionRequest(const TString &user, bool partial, bool dry, bool schedule, Ts... actions)
-{
- TAutoPtr<NCms::TEvCms::TEvPermissionRequest> event = new NCms::TEvCms::TEvPermissionRequest;
- event->Record.SetUser(user);
- event->Record.SetPartialPermissionAllowed(partial);
- event->Record.SetDryRun(dry);
- event->Record.SetSchedule(schedule);
- AddActions(event, actions...);
-
- return event;
-}
-
-inline void AddPermissions(TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest> &ev,
- const TString &id)
-{
- *ev->Record.AddPermissions() = id;
-}
-
-template<typename... Ts>
-void AddPermissions(TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest> &ev,
- const TString &id,
- Ts... ids)
-{
- AddPermissions(ev, id);
- AddPermissions(ev, ids...);
-}
-
-inline TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest>
-MakeManagePermissionRequest(const TString &user,
- NKikimrCms::TManagePermissionRequest::ECommand cmd,
- bool dry)
-{
- TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest> event
- = new NCms::TEvCms::TEvManagePermissionRequest;
- event->Record.SetUser(user);
- event->Record.SetCommand(cmd);
- event->Record.SetDryRun(dry);
- return event;
-}
-
-template<typename... Ts>
-TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest>
-MakeManagePermissionRequest(const TString &user,
- NKikimrCms::TManagePermissionRequest::ECommand cmd,
- bool dry,
- Ts... ids)
-{
- auto event = MakeManagePermissionRequest(user, cmd, dry);
- AddPermissions(event, ids...);
- return event;
-}
-
-inline TAutoPtr<NCms::TEvCms::TEvManageRequestRequest>
-MakeManageRequestRequest(const TString &user,
- NKikimrCms::TManageRequestRequest::ECommand cmd,
- bool dry)
-{
- TAutoPtr<NCms::TEvCms::TEvManageRequestRequest> event
- = new NCms::TEvCms::TEvManageRequestRequest;
- event->Record.SetUser(user);
- event->Record.SetCommand(cmd);
- event->Record.SetDryRun(dry);
- return event;
-}
-
-inline TAutoPtr<NCms::TEvCms::TEvManageRequestRequest>
-MakeManageRequestRequest(const TString &user,
- NKikimrCms::TManageRequestRequest::ECommand cmd,
- const TString &id,
- bool dry)
-{
- TAutoPtr<NCms::TEvCms::TEvManageRequestRequest> event
- = new NCms::TEvCms::TEvManageRequestRequest;
- event->Record.SetUser(user);
- event->Record.SetCommand(cmd);
- event->Record.SetRequestId(id);
- event->Record.SetDryRun(dry);
- return event;
-}
-
-inline TAutoPtr<NCms::TEvCms::TEvCheckRequest>
-MakeCheckRequest(const TString &user,
- const TString &id,
- bool dry,
- NKikimrCms::EAvailabilityMode availabilityMode = NKikimrCms::MODE_MAX_AVAILABILITY)
-{
- TAutoPtr<NCms::TEvCms::TEvCheckRequest> event = new NCms::TEvCms::TEvCheckRequest;
- event->Record.SetUser(user);
- event->Record.SetRequestId(id);
- event->Record.SetDryRun(dry);
- event->Record.SetAvailabilityMode(availabilityMode);
- return event;
-}
-
-inline void AddHosts(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> &ev,
- ui32 node)
-{
- *ev->Record.AddHosts() = ToString(node);
-}
-
-template<typename... Ts>
-void AddHosts(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> &ev,
- ui32 node,
- Ts... nodes)
-{
- AddHosts(ev, node);
- AddHosts(ev, nodes...);
-}
-
-inline void AddHosts(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> &ev,
- const TString &host)
-{
- *ev->Record.AddHosts() = host;
-}
-
-template<typename... Ts>
-void AddHosts(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> &ev,
- const TString &host,
- Ts... hosts)
-{
- AddHosts(ev, host);
- AddHosts(ev, hosts...);
-}
-
-template<typename... Ts>
-TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest>
-MakeWalleCreateRequest(const TString &id,
- const TString &action,
- bool dry,
- Ts... hosts)
-{
- TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> res
- = new NCms::TEvCms::TEvWalleCreateTaskRequest;
- res->Record.SetTaskId(id);
- res->Record.SetType("automated");
- res->Record.SetIssuer("UT");
- res->Record.SetAction(action);
- res->Record.SetDryRun(dry);
- AddHosts(res, hosts...);
- return res;
-}
-
-template<typename T>
-void AddHosts(NKikimrCms::TWalleTaskInfo &task,
- T node)
-{
- *task.AddHosts() = ToString(node);
-}
-
-template<typename T, typename... Ts>
-void AddHosts(NKikimrCms::TWalleTaskInfo &task,
- T node,
- Ts... nodes)
-{
- AddHosts(task, node);
- AddHosts(task, nodes...);
-}
-
-template<typename... Ts>
-NKikimrCms::TWalleTaskInfo MakeTaskInfo(const TString &id,
- const TString &status,
- Ts... nodes)
-{
- NKikimrCms::TWalleTaskInfo task;
- task.SetTaskId(id);
- task.SetStatus(status);
- AddHosts(task, nodes...);
- return task;
-}
-
-inline void AddActions(TAutoPtr<NCms::TEvCms::TEvNotification> &event,
- const NKikimrCms::TAction &action)
-{
- event->Record.AddActions()->CopyFrom(action);
-}
-
-template<typename... Ts>
-void AddActions(TAutoPtr<NCms::TEvCms::TEvNotification> &event,
- const NKikimrCms::TAction &action,
- Ts... actions)
-{
- AddActions(event, action);
- AddActions(event, actions...);
-}
-
-template<typename... Ts>
-TAutoPtr<NCms::TEvCms::TEvNotification>
-MakeNotification(const TString &user,
- TInstant when,
- Ts... actions)
-{
- TAutoPtr<NCms::TEvCms::TEvNotification> event
- = new NCms::TEvCms::TEvNotification;
- if (user)
- event->Record.SetUser(user);
- event->Record.SetTime(when.GetValue());
- AddActions(event, actions...);
- return event;
-}
-
-inline void AddItems(NKikimrCms::TItems &)
-{
-}
-
-inline void AddItem(NKikimrCms::TItems &items, const TString &host)
-{
- items.AddHosts(host);
-}
-
-inline void AddItem(NKikimrCms::TItems &items, ui32 nodeId)
-{
- items.AddNodes(nodeId);
-}
-
-inline void AddItem(NKikimrCms::TItems &items, const NCms::TPDiskID &pdisk)
-{
- auto &rec = *items.AddPDisks();
- rec.SetNodeId(pdisk.NodeId);
- rec.SetDiskId(pdisk.DiskId);
-}
-
-inline void AddItem(NKikimrCms::TItems &items, const TVDiskID &vdisk)
-{
- VDiskIDFromVDiskID(vdisk, items.AddVDisks());
-}
-
-template<typename T, typename... Ts>
-void AddItems(NKikimrCms::TItems &items, T item, Ts... args)
-{
- AddItem(items, item);
- AddItems(items, args...);
-}
-
-template<typename... Ts>
-TAutoPtr<NCms::TEvCms::TEvSetMarkerRequest>
-MakeSetMarkerRequest(NKikimrCms::EMarker marker,
- const TString &token,
- Ts... args)
-{
- TAutoPtr<NCms::TEvCms::TEvSetMarkerRequest> event
- = new NCms::TEvCms::TEvSetMarkerRequest;
- event->Record.SetMarker(marker);
- AddItems(*event->Record.MutableItems(), args...);
- if (token) {
- NACLib::TUserToken t(token, {});
- event->Record.SetUserToken(t.SerializeAsString());
- }
- return event;
-}
-
-template<typename... Ts>
-TAutoPtr<NCms::TEvCms::TEvResetMarkerRequest>
-MakeResetMarkerRequest(NKikimrCms::EMarker marker,
- const TString &token,
- Ts... args)
-{
- TAutoPtr<NCms::TEvCms::TEvResetMarkerRequest> event
- = new NCms::TEvCms::TEvResetMarkerRequest;
- event->Record.SetMarker(marker);
- AddItems(*event->Record.MutableItems(), args...);
- if (token) {
- NACLib::TUserToken t(token, {});
- event->Record.SetUserToken(t.SerializeAsString());
- }
- return event;
-}
-
-struct TIsUpdateStatusConfigRequest {
-public:
- TIsUpdateStatusConfigRequest(NKikimrBlobStorage::EDriveStatus status)
- : Status(status)
- {
- }
-
- bool operator()(IEventHandle& ev) {
- if (ev.GetTypeRewrite() == TEvBlobStorage::EvControllerConfigRequest) {
- auto &rec = ev.Get<TEvBlobStorage::TEvControllerConfigRequest>()->Record;
- if (rec.GetRequest().CommandSize()
- && rec.GetRequest().GetCommand(0).HasUpdateDriveStatus()
- && rec.GetRequest().GetCommand(0).GetUpdateDriveStatus().GetStatus() == Status)
- return true;
- }
- return false;
- }
-
-private:
- NKikimrBlobStorage::EDriveStatus Status;
-};
-
+
+namespace NKikimr {
+namespace NCmsTest {
+
+inline void AddServices(NKikimrCms::TAction &action, const TString &service)
+{
+ *action.AddServices() = service;
+}
+
+template<typename... Ts>
+void AddServices(NKikimrCms::TAction &action, const TString &service, Ts... services)
+{
+ AddServices(action, service);
+ AddServices(action, services...);
+}
+
+inline void AddDevices(NKikimrCms::TAction &action, const TString &device)
+{
+ *action.AddDevices() = device;
+}
+
+template<typename... Ts>
+void AddDevices(NKikimrCms::TAction &action, const TString &device, Ts... devices)
+{
+ AddDevices(action, device);
+ AddDevices(action, devices...);
+}
+
+inline NKikimrCms::TAction MakeAction(NKikimrCms::TAction::EType type, const TString &host, ui64 duration)
+{
+ NKikimrCms::TAction action;
+ action.SetType(type);
+ action.SetHost(host);
+ action.SetDuration(duration);
+ return action;
+}
+
+inline NKikimrCms::TAction MakeAction(NKikimrCms::TAction::EType type, ui32 nodeId, ui64 duration)
+{
+ return MakeAction(type, ToString(nodeId), duration);
+}
+
+template<typename... Ts>
+NKikimrCms::TAction MakeAction(NKikimrCms::TAction::EType type, const TString &host, ui64 duration, Ts... items)
+{
+ NKikimrCms::TAction action = MakeAction(type, host, duration);
+ if (type == NKikimrCms::TAction::START_SERVICES
+ || type == NKikimrCms::TAction::RESTART_SERVICES
+ || type == NKikimrCms::TAction::STOP_SERVICES)
+ AddServices(action, items...);
+ else
+ AddDevices(action, items...);
+ return action;
+}
+
+template<typename... Ts>
+NKikimrCms::TAction MakeAction(NKikimrCms::TAction::EType type, ui32 nodeId, ui64 duration, Ts... items)
+{
+ return MakeAction(type, ToString(nodeId), duration, items...);
+}
+
+inline void AddActions(TAutoPtr<NCms::TEvCms::TEvPermissionRequest> &event,
+ const NKikimrCms::TAction &action)
+{
+ event->Record.AddActions()->CopyFrom(action);
+}
+
+template<typename... Ts>
+void AddActions(TAutoPtr<NCms::TEvCms::TEvPermissionRequest> &event,
+ const NKikimrCms::TAction &action, Ts... actions)
+{
+ AddActions(event, action);
+ AddActions(event, actions...);
+}
+
+template<typename... Ts>
+TAutoPtr<NCms::TEvCms::TEvPermissionRequest> MakePermissionRequest(const TString &user, bool partial, bool dry, bool schedule, Ts... actions)
+{
+ TAutoPtr<NCms::TEvCms::TEvPermissionRequest> event = new NCms::TEvCms::TEvPermissionRequest;
+ event->Record.SetUser(user);
+ event->Record.SetPartialPermissionAllowed(partial);
+ event->Record.SetDryRun(dry);
+ event->Record.SetSchedule(schedule);
+ AddActions(event, actions...);
+
+ return event;
+}
+
+inline void AddPermissions(TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest> &ev,
+ const TString &id)
+{
+ *ev->Record.AddPermissions() = id;
+}
+
+template<typename... Ts>
+void AddPermissions(TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest> &ev,
+ const TString &id,
+ Ts... ids)
+{
+ AddPermissions(ev, id);
+ AddPermissions(ev, ids...);
+}
+
+inline TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest>
+MakeManagePermissionRequest(const TString &user,
+ NKikimrCms::TManagePermissionRequest::ECommand cmd,
+ bool dry)
+{
+ TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest> event
+ = new NCms::TEvCms::TEvManagePermissionRequest;
+ event->Record.SetUser(user);
+ event->Record.SetCommand(cmd);
+ event->Record.SetDryRun(dry);
+ return event;
+}
+
+template<typename... Ts>
+TAutoPtr<NCms::TEvCms::TEvManagePermissionRequest>
+MakeManagePermissionRequest(const TString &user,
+ NKikimrCms::TManagePermissionRequest::ECommand cmd,
+ bool dry,
+ Ts... ids)
+{
+ auto event = MakeManagePermissionRequest(user, cmd, dry);
+ AddPermissions(event, ids...);
+ return event;
+}
+
+inline TAutoPtr<NCms::TEvCms::TEvManageRequestRequest>
+MakeManageRequestRequest(const TString &user,
+ NKikimrCms::TManageRequestRequest::ECommand cmd,
+ bool dry)
+{
+ TAutoPtr<NCms::TEvCms::TEvManageRequestRequest> event
+ = new NCms::TEvCms::TEvManageRequestRequest;
+ event->Record.SetUser(user);
+ event->Record.SetCommand(cmd);
+ event->Record.SetDryRun(dry);
+ return event;
+}
+
+inline TAutoPtr<NCms::TEvCms::TEvManageRequestRequest>
+MakeManageRequestRequest(const TString &user,
+ NKikimrCms::TManageRequestRequest::ECommand cmd,
+ const TString &id,
+ bool dry)
+{
+ TAutoPtr<NCms::TEvCms::TEvManageRequestRequest> event
+ = new NCms::TEvCms::TEvManageRequestRequest;
+ event->Record.SetUser(user);
+ event->Record.SetCommand(cmd);
+ event->Record.SetRequestId(id);
+ event->Record.SetDryRun(dry);
+ return event;
+}
+
+inline TAutoPtr<NCms::TEvCms::TEvCheckRequest>
+MakeCheckRequest(const TString &user,
+ const TString &id,
+ bool dry,
+ NKikimrCms::EAvailabilityMode availabilityMode = NKikimrCms::MODE_MAX_AVAILABILITY)
+{
+ TAutoPtr<NCms::TEvCms::TEvCheckRequest> event = new NCms::TEvCms::TEvCheckRequest;
+ event->Record.SetUser(user);
+ event->Record.SetRequestId(id);
+ event->Record.SetDryRun(dry);
+ event->Record.SetAvailabilityMode(availabilityMode);
+ return event;
+}
+
+inline void AddHosts(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> &ev,
+ ui32 node)
+{
+ *ev->Record.AddHosts() = ToString(node);
+}
+
+template<typename... Ts>
+void AddHosts(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> &ev,
+ ui32 node,
+ Ts... nodes)
+{
+ AddHosts(ev, node);
+ AddHosts(ev, nodes...);
+}
+
+inline void AddHosts(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> &ev,
+ const TString &host)
+{
+ *ev->Record.AddHosts() = host;
+}
+
+template<typename... Ts>
+void AddHosts(TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> &ev,
+ const TString &host,
+ Ts... hosts)
+{
+ AddHosts(ev, host);
+ AddHosts(ev, hosts...);
+}
+
+template<typename... Ts>
+TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest>
+MakeWalleCreateRequest(const TString &id,
+ const TString &action,
+ bool dry,
+ Ts... hosts)
+{
+ TAutoPtr<NCms::TEvCms::TEvWalleCreateTaskRequest> res
+ = new NCms::TEvCms::TEvWalleCreateTaskRequest;
+ res->Record.SetTaskId(id);
+ res->Record.SetType("automated");
+ res->Record.SetIssuer("UT");
+ res->Record.SetAction(action);
+ res->Record.SetDryRun(dry);
+ AddHosts(res, hosts...);
+ return res;
+}
+
+template<typename T>
+void AddHosts(NKikimrCms::TWalleTaskInfo &task,
+ T node)
+{
+ *task.AddHosts() = ToString(node);
+}
+
+template<typename T, typename... Ts>
+void AddHosts(NKikimrCms::TWalleTaskInfo &task,
+ T node,
+ Ts... nodes)
+{
+ AddHosts(task, node);
+ AddHosts(task, nodes...);
+}
+
+template<typename... Ts>
+NKikimrCms::TWalleTaskInfo MakeTaskInfo(const TString &id,
+ const TString &status,
+ Ts... nodes)
+{
+ NKikimrCms::TWalleTaskInfo task;
+ task.SetTaskId(id);
+ task.SetStatus(status);
+ AddHosts(task, nodes...);
+ return task;
+}
+
+inline void AddActions(TAutoPtr<NCms::TEvCms::TEvNotification> &event,
+ const NKikimrCms::TAction &action)
+{
+ event->Record.AddActions()->CopyFrom(action);
+}
+
+template<typename... Ts>
+void AddActions(TAutoPtr<NCms::TEvCms::TEvNotification> &event,
+ const NKikimrCms::TAction &action,
+ Ts... actions)
+{
+ AddActions(event, action);
+ AddActions(event, actions...);
+}
+
+template<typename... Ts>
+TAutoPtr<NCms::TEvCms::TEvNotification>
+MakeNotification(const TString &user,
+ TInstant when,
+ Ts... actions)
+{
+ TAutoPtr<NCms::TEvCms::TEvNotification> event
+ = new NCms::TEvCms::TEvNotification;
+ if (user)
+ event->Record.SetUser(user);
+ event->Record.SetTime(when.GetValue());
+ AddActions(event, actions...);
+ return event;
+}
+
+inline void AddItems(NKikimrCms::TItems &)
+{
+}
+
+inline void AddItem(NKikimrCms::TItems &items, const TString &host)
+{
+ items.AddHosts(host);
+}
+
+inline void AddItem(NKikimrCms::TItems &items, ui32 nodeId)
+{
+ items.AddNodes(nodeId);
+}
+
+inline void AddItem(NKikimrCms::TItems &items, const NCms::TPDiskID &pdisk)
+{
+ auto &rec = *items.AddPDisks();
+ rec.SetNodeId(pdisk.NodeId);
+ rec.SetDiskId(pdisk.DiskId);
+}
+
+inline void AddItem(NKikimrCms::TItems &items, const TVDiskID &vdisk)
+{
+ VDiskIDFromVDiskID(vdisk, items.AddVDisks());
+}
+
+template<typename T, typename... Ts>
+void AddItems(NKikimrCms::TItems &items, T item, Ts... args)
+{
+ AddItem(items, item);
+ AddItems(items, args...);
+}
+
+template<typename... Ts>
+TAutoPtr<NCms::TEvCms::TEvSetMarkerRequest>
+MakeSetMarkerRequest(NKikimrCms::EMarker marker,
+ const TString &token,
+ Ts... args)
+{
+ TAutoPtr<NCms::TEvCms::TEvSetMarkerRequest> event
+ = new NCms::TEvCms::TEvSetMarkerRequest;
+ event->Record.SetMarker(marker);
+ AddItems(*event->Record.MutableItems(), args...);
+ if (token) {
+ NACLib::TUserToken t(token, {});
+ event->Record.SetUserToken(t.SerializeAsString());
+ }
+ return event;
+}
+
+template<typename... Ts>
+TAutoPtr<NCms::TEvCms::TEvResetMarkerRequest>
+MakeResetMarkerRequest(NKikimrCms::EMarker marker,
+ const TString &token,
+ Ts... args)
+{
+ TAutoPtr<NCms::TEvCms::TEvResetMarkerRequest> event
+ = new NCms::TEvCms::TEvResetMarkerRequest;
+ event->Record.SetMarker(marker);
+ AddItems(*event->Record.MutableItems(), args...);
+ if (token) {
+ NACLib::TUserToken t(token, {});
+ event->Record.SetUserToken(t.SerializeAsString());
+ }
+ return event;
+}
+
+struct TIsUpdateStatusConfigRequest {
+public:
+ TIsUpdateStatusConfigRequest(NKikimrBlobStorage::EDriveStatus status)
+ : Status(status)
+ {
+ }
+
+ bool operator()(IEventHandle& ev) {
+ if (ev.GetTypeRewrite() == TEvBlobStorage::EvControllerConfigRequest) {
+ auto &rec = ev.Get<TEvBlobStorage::TEvControllerConfigRequest>()->Record;
+ if (rec.GetRequest().CommandSize()
+ && rec.GetRequest().GetCommand(0).HasUpdateDriveStatus()
+ && rec.GetRequest().GetCommand(0).GetUpdateDriveStatus().GetStatus() == Status)
+ return true;
+ }
+ return false;
+ }
+
+private:
+ NKikimrBlobStorage::EDriveStatus Status;
+};
+
inline NKikimrWhiteboard::TSystemStateInfo MakeSystemStateInfo(const TString& version, const TVector<TString>& roles = {}) {
NKikimrWhiteboard::TSystemStateInfo result;
@@ -380,5 +380,5 @@ inline NKikimrWhiteboard::TSystemStateInfo MakeSystemStateInfo(const TString& ve
return result;
}
-} // NCmsTest
-} // NKikimr
+} // NCmsTest
+} // NKikimr
diff --git a/ydb/core/cms/walle.h b/ydb/core/cms/walle.h
index 31859d82217..9a08bb45758 100644
--- a/ydb/core/cms/walle.h
+++ b/ydb/core/cms/walle.h
@@ -1,39 +1,39 @@
-#pragma once
-
+#pragma once
+
#include "audit_log.h"
-#include "cms_state.h"
-#include "base_handler.h"
-#include "cms.h"
-
-#include <util/generic/set.h>
-#include <util/generic/string.h>
-
-namespace NKikimr {
-namespace NCms {
-
-constexpr const char *WALLE_CMS_USER = "Wall-E";
-constexpr const char *WALLE_API_URL_PREFIX = "/api/walle/v11/";
-
+#include "cms_state.h"
+#include "base_handler.h"
+#include "cms.h"
+
+#include <util/generic/set.h>
+#include <util/generic/string.h>
+
+namespace NKikimr {
+namespace NCms {
+
+constexpr const char *WALLE_CMS_USER = "Wall-E";
+constexpr const char *WALLE_API_URL_PREFIX = "/api/walle/v11/";
+
IActor *CreateWalleAdapter(TEvCms::TEvWalleCreateTaskRequest::TPtr &ev, TActorId cms);
-IActor *CreateWalleAdapter(TEvCms::TEvWalleListTasksRequest::TPtr &ev, const TCmsStatePtr state);
+IActor *CreateWalleAdapter(TEvCms::TEvWalleListTasksRequest::TPtr &ev, const TCmsStatePtr state);
IActor *CreateWalleAdapter(TEvCms::TEvWalleCheckTaskRequest::TPtr &ev, const TCmsStatePtr state, TActorId cms);
IActor *CreateWalleAdapter(TEvCms::TEvWalleRemoveTaskRequest::TPtr &ev, const TCmsStatePtr state, TActorId cms);
-
-IActor *CreateWalleApiHandler(NMon::TEvHttpInfo::TPtr &event);
-
-class TWalleApiHandler : public TApiMethodHandlerBase {
-public:
- virtual ~TWalleApiHandler() = default;
-
- virtual IActor *CreateHandlerActor(NMon::TEvHttpInfo::TPtr &event)
- {
- return CreateWalleApiHandler(event);
- }
-};
-
+
+IActor *CreateWalleApiHandler(NMon::TEvHttpInfo::TPtr &event);
+
+class TWalleApiHandler : public TApiMethodHandlerBase {
+public:
+ virtual ~TWalleApiHandler() = default;
+
+ virtual IActor *CreateHandlerActor(NMon::TEvHttpInfo::TPtr &event)
+ {
+ return CreateWalleApiHandler(event);
+ }
+};
+
inline void WalleAuditLog(const IEventBase* request, const IEventBase* response, const TActorContext& ctx) {
AuditLog("Wall-E adapter", request, response, ctx);
}
-
-} // NCms
-} // NKikimr
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/walle_api_handler.cpp b/ydb/core/cms/walle_api_handler.cpp
index c60933f7ef7..7b62f3275a9 100644
--- a/ydb/core/cms/walle_api_handler.cpp
+++ b/ydb/core/cms/walle_api_handler.cpp
@@ -1,5 +1,5 @@
-#include "walle.h"
-
+#include "walle.h"
+
#include <library/cpp/actors/core/actor.h>
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
@@ -8,307 +8,307 @@
#include <ydb/core/base/appdata.h>
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/cms/cms.h>
-
+
#include <library/cpp/json/json_reader.h>
#include <library/cpp/json/json_writer.h>
-
-namespace NKikimr {
-namespace NCms {
-
-using namespace NKikimrCms;
-
-class TWalleCrateTaskHandler : public TActorBootstrapped<TWalleCrateTaskHandler> {
-public:
- using TBase = TActorBootstrapped<TWalleCrateTaskHandler>;
-
+
+namespace NKikimr {
+namespace NCms {
+
+using namespace NKikimrCms;
+
+class TWalleCrateTaskHandler : public TActorBootstrapped<TWalleCrateTaskHandler> {
+public:
+ using TBase = TActorBootstrapped<TWalleCrateTaskHandler>;
+
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::CMS_SERVICE_PROXY;
- }
-
- TWalleCrateTaskHandler(NMon::TEvHttpInfo::TPtr &event)
- : RequestEvent(event)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- NMon::TEvHttpInfo *msg = RequestEvent->Get();
-
+ }
+
+ TWalleCrateTaskHandler(NMon::TEvHttpInfo::TPtr &event)
+ : RequestEvent(event)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ NMon::TEvHttpInfo *msg = RequestEvent->Get();
+
TString path {msg->Request.GetPathInfo().substr(strlen(WALLE_API_URL_PREFIX))};
-
-
- if (path == "tasks") {
+
+
+ if (path == "tasks") {
if (msg->Request.GetMethod() == HTTP_METHOD_GET)
- ProcessListTasksRequest(ctx);
+ ProcessListTasksRequest(ctx);
else if (msg->Request.GetMethod() == HTTP_METHOD_POST)
ProcessCreateTasksRequest(msg->Request, ctx);
- else
+ else
ReplyWithError("HTTP/1.1 405 Method Not Allowed\r\n\r\n", ctx);
- } else if (path.StartsWith("tasks/")) {
- TString id = path.substr(strlen("tasks/"));
+ } else if (path.StartsWith("tasks/")) {
+ TString id = path.substr(strlen("tasks/"));
if (msg->Request.GetMethod() == HTTP_METHOD_GET)
- ProcessCheckTaskRequest(id, ctx);
+ ProcessCheckTaskRequest(id, ctx);
else if (msg->Request.GetMethod() == HTTP_METHOD_DELETE)
- ProcessRemoveTaskRequest(id, ctx);
- else
+ ProcessRemoveTaskRequest(id, ctx);
+ else
ReplyWithError("HTTP/1.1 405 Method Not Allowed\r\n\r\n", ctx);
- } else {
+ } else {
ReplyWithError(NMonitoring::HTTPNOTFOUND, ctx);
- }
- }
-
-private:
- //////////////////////////////////////////////
- // Create task
- //////////////////////////////////////////////
+ }
+ }
+
+private:
+ //////////////////////////////////////////////
+ // Create task
+ //////////////////////////////////////////////
void ProcessCreateTasksRequest(const NMonitoring::IMonHttpRequest &http, const TActorContext &ctx)
- {
- NJson::TJsonValue json;
-
- try {
- ReadJsonTree(http.GetPostContent(), &json, true);
- } catch (yexception e) {
+ {
+ NJson::TJsonValue json;
+
+ try {
+ ReadJsonTree(http.GetPostContent(), &json, true);
+ } catch (yexception e) {
ReplyWithError(TString("HTTP/1.1 400 Bad Request\r\n\r\nCan't parse provided JSON: ") + e.what(), ctx);
- return;
- }
-
- TAutoPtr<TEvCms::TEvWalleCreateTaskRequest> request = new TEvCms::TEvWalleCreateTaskRequest;
- auto map = json.GetMap();
-
- request->Record.SetTaskId(map["id"].GetString());
- request->Record.SetType(map["type"].GetString());
- request->Record.SetIssuer(map["issuer"].GetString());
- request->Record.SetAction(map["action"].GetString());
-
- auto &hosts = map["hosts"].GetArray();
- for (auto &host : hosts)
- *request->Record.AddHosts() = host.GetString();
-
- const auto &params = http.GetParams();
+ return;
+ }
+
+ TAutoPtr<TEvCms::TEvWalleCreateTaskRequest> request = new TEvCms::TEvWalleCreateTaskRequest;
+ auto map = json.GetMap();
+
+ request->Record.SetTaskId(map["id"].GetString());
+ request->Record.SetType(map["type"].GetString());
+ request->Record.SetIssuer(map["issuer"].GetString());
+ request->Record.SetAction(map["action"].GetString());
+
+ auto &hosts = map["hosts"].GetArray();
+ for (auto &host : hosts)
+ *request->Record.AddHosts() = host.GetString();
+
+ const auto &params = http.GetParams();
if (params.contains("dry_run"))
- request->Record.SetDryRun(params.find("dry_run")->second == "true");
-
+ request->Record.SetDryRun(params.find("dry_run")->second == "true");
+
SendToCms(request.Release(), ctx);
- Become(&TThis::StateCreateTask, ctx, TDuration::Seconds(60), new TEvents::TEvWakeup());
- }
-
- STFUNC(StateCreateTask)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvCms::TEvWalleCreateTaskResponse, Handle);
+ Become(&TThis::StateCreateTask, ctx, TDuration::Seconds(60), new TEvents::TEvWakeup());
+ }
+
+ STFUNC(StateCreateTask)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvCms::TEvWalleCreateTaskResponse, Handle);
HFunc(TEvTabletPipe::TEvClientConnected, Handle);
HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
- CFunc(TEvents::TSystem::Wakeup, Timeout);
- default:
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TWalleApiHandler::StateCreateTask ignored event type: %" PRIx32 " event: %s",
+ CFunc(TEvents::TSystem::Wakeup, Timeout);
+ default:
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TWalleApiHandler::StateCreateTask ignored event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
+ }
+ }
+
void Reply(const TWalleCreateTaskResponse &resp, const TActorContext &ctx)
- {
- TString status;
- if (!CheckStatus(resp.GetStatus(), status, false, ctx))
- return;
-
- NJson::TJsonValue hosts(NJson::JSON_ARRAY);
- for (auto &host : resp.GetHosts())
- hosts.AppendValue(host);
- NJson::TJsonValue map;
- map.InsertValue("id", resp.GetTaskId());
- map.InsertValue("hosts", hosts);
- map.InsertValue("status", status);
- map.InsertValue("message", resp.GetStatus().GetReason());
-
+ {
+ TString status;
+ if (!CheckStatus(resp.GetStatus(), status, false, ctx))
+ return;
+
+ NJson::TJsonValue hosts(NJson::JSON_ARRAY);
+ for (auto &host : resp.GetHosts())
+ hosts.AppendValue(host);
+ NJson::TJsonValue map;
+ map.InsertValue("id", resp.GetTaskId());
+ map.InsertValue("hosts", hosts);
+ map.InsertValue("status", status);
+ map.InsertValue("message", resp.GetStatus().GetReason());
+
Reply(WriteJson(map), ctx);
- }
-
- void Handle(TEvCms::TEvWalleCreateTaskResponse::TPtr &ev, const TActorContext &ctx)
- {
+ }
+
+ void Handle(TEvCms::TEvWalleCreateTaskResponse::TPtr &ev, const TActorContext &ctx)
+ {
Reply(ev->Get()->Record, ctx);
- }
-
- //////////////////////////////////////////////
- // List tasks
- //////////////////////////////////////////////
- void ProcessListTasksRequest(const TActorContext &ctx)
- {
- TAutoPtr<TEvCms::TEvWalleListTasksRequest> request = new TEvCms::TEvWalleListTasksRequest;
-
+ }
+
+ //////////////////////////////////////////////
+ // List tasks
+ //////////////////////////////////////////////
+ void ProcessListTasksRequest(const TActorContext &ctx)
+ {
+ TAutoPtr<TEvCms::TEvWalleListTasksRequest> request = new TEvCms::TEvWalleListTasksRequest;
+
SendToCms(request.Release(), ctx);
- Become(&TThis::StateListTasks, ctx, TDuration::Seconds(60), new TEvents::TEvWakeup());
- }
-
- STFUNC(StateListTasks)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvCms::TEvWalleListTasksResponse, Handle);
+ Become(&TThis::StateListTasks, ctx, TDuration::Seconds(60), new TEvents::TEvWakeup());
+ }
+
+ STFUNC(StateListTasks)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvCms::TEvWalleListTasksResponse, Handle);
HFunc(TEvTabletPipe::TEvClientConnected, Handle);
HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
- CFunc(TEvents::TSystem::Wakeup, Timeout);
- default:
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TWalleApiHandler::StateListTasks ignored event type: %" PRIx32 " event: %s",
+ CFunc(TEvents::TSystem::Wakeup, Timeout);
+ default:
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TWalleApiHandler::StateListTasks ignored event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
+ }
+ }
+
void Reply(const TWalleListTasksResponse &resp, const TActorContext &ctx)
- {
- NJson::TJsonValue tasks(NJson::JSON_ARRAY);
- for (auto &task : resp.GetTasks()) {
- NJson::TJsonValue hosts(NJson::JSON_ARRAY);
- for (auto &host : task.GetHosts())
- hosts.AppendValue(host);
- NJson::TJsonValue map;
- map.InsertValue("id", task.GetTaskId());
- map.InsertValue("hosts", hosts);
- map.InsertValue("status", task.GetStatus());
-
- tasks.AppendValue(map);
- }
-
- NJson::TJsonValue res;
- res.InsertValue("result", tasks);
-
+ {
+ NJson::TJsonValue tasks(NJson::JSON_ARRAY);
+ for (auto &task : resp.GetTasks()) {
+ NJson::TJsonValue hosts(NJson::JSON_ARRAY);
+ for (auto &host : task.GetHosts())
+ hosts.AppendValue(host);
+ NJson::TJsonValue map;
+ map.InsertValue("id", task.GetTaskId());
+ map.InsertValue("hosts", hosts);
+ map.InsertValue("status", task.GetStatus());
+
+ tasks.AppendValue(map);
+ }
+
+ NJson::TJsonValue res;
+ res.InsertValue("result", tasks);
+
Reply(WriteJson(res), ctx);
- }
-
- void Handle(TEvCms::TEvWalleListTasksResponse::TPtr &ev, const TActorContext &ctx)
- {
+ }
+
+ void Handle(TEvCms::TEvWalleListTasksResponse::TPtr &ev, const TActorContext &ctx)
+ {
Reply(ev->Get()->Record, ctx);
- }
-
- //////////////////////////////////////////////
- // Check task
- //////////////////////////////////////////////
- void ProcessCheckTaskRequest(const TString &id, const TActorContext &ctx)
- {
- TAutoPtr<TEvCms::TEvWalleCheckTaskRequest> request = new TEvCms::TEvWalleCheckTaskRequest;
- request->Record.SetTaskId(id);
-
+ }
+
+ //////////////////////////////////////////////
+ // Check task
+ //////////////////////////////////////////////
+ void ProcessCheckTaskRequest(const TString &id, const TActorContext &ctx)
+ {
+ TAutoPtr<TEvCms::TEvWalleCheckTaskRequest> request = new TEvCms::TEvWalleCheckTaskRequest;
+ request->Record.SetTaskId(id);
+
SendToCms(request.Release(), ctx);
- Become(&TThis::StateCheckTask, ctx, TDuration::Seconds(60), new TEvents::TEvWakeup());
- }
-
- STFUNC(StateCheckTask)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvCms::TEvWalleCheckTaskResponse, Handle);
+ Become(&TThis::StateCheckTask, ctx, TDuration::Seconds(60), new TEvents::TEvWakeup());
+ }
+
+ STFUNC(StateCheckTask)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvCms::TEvWalleCheckTaskResponse, Handle);
HFunc(TEvTabletPipe::TEvClientConnected, Handle);
HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
- CFunc(TEvents::TSystem::Wakeup, Timeout);
- default:
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TWalleApiHandler::StateCheckTask ignored event type: %" PRIx32 " event: %s",
+ CFunc(TEvents::TSystem::Wakeup, Timeout);
+ default:
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TWalleApiHandler::StateCheckTask ignored event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
+ }
+ }
+
void Reply(const TWalleCheckTaskResponse &resp, const TActorContext &ctx)
- {
- TString status;
- if (!CheckStatus(resp.GetStatus(), status, true, ctx))
- return;
-
- NJson::TJsonValue hosts(NJson::JSON_ARRAY);
- for (auto &host : resp.GetTask().GetHosts())
- hosts.AppendValue(host);
- NJson::TJsonValue map;
- map.InsertValue("id", resp.GetTask().GetTaskId());
- map.InsertValue("hosts", hosts);
- map.InsertValue("status", status);
- map.InsertValue("message", resp.GetStatus().GetReason());
-
+ {
+ TString status;
+ if (!CheckStatus(resp.GetStatus(), status, true, ctx))
+ return;
+
+ NJson::TJsonValue hosts(NJson::JSON_ARRAY);
+ for (auto &host : resp.GetTask().GetHosts())
+ hosts.AppendValue(host);
+ NJson::TJsonValue map;
+ map.InsertValue("id", resp.GetTask().GetTaskId());
+ map.InsertValue("hosts", hosts);
+ map.InsertValue("status", status);
+ map.InsertValue("message", resp.GetStatus().GetReason());
+
Reply(WriteJson(map), ctx);
- }
-
- void Handle(TEvCms::TEvWalleCheckTaskResponse::TPtr &ev, const TActorContext &ctx)
- {
+ }
+
+ void Handle(TEvCms::TEvWalleCheckTaskResponse::TPtr &ev, const TActorContext &ctx)
+ {
Reply(ev->Get()->Record, ctx);
- }
-
- //////////////////////////////////////////////
- // Remove task
- //////////////////////////////////////////////
- void ProcessRemoveTaskRequest(const TString &id, const TActorContext &ctx)
- {
- TAutoPtr<TEvCms::TEvWalleRemoveTaskRequest> request = new TEvCms::TEvWalleRemoveTaskRequest;
- request->Record.SetTaskId(id);
-
+ }
+
+ //////////////////////////////////////////////
+ // Remove task
+ //////////////////////////////////////////////
+ void ProcessRemoveTaskRequest(const TString &id, const TActorContext &ctx)
+ {
+ TAutoPtr<TEvCms::TEvWalleRemoveTaskRequest> request = new TEvCms::TEvWalleRemoveTaskRequest;
+ request->Record.SetTaskId(id);
+
SendToCms(request.Release(), ctx);
- Become(&TThis::StateRemoveTask, ctx, TDuration::Seconds(60), new TEvents::TEvWakeup());
- }
-
- STFUNC(StateRemoveTask)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvCms::TEvWalleRemoveTaskResponse, Handle);
+ Become(&TThis::StateRemoveTask, ctx, TDuration::Seconds(60), new TEvents::TEvWakeup());
+ }
+
+ STFUNC(StateRemoveTask)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvCms::TEvWalleRemoveTaskResponse, Handle);
HFunc(TEvTabletPipe::TEvClientConnected, Handle);
HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
- CFunc(TEvents::TSystem::Wakeup, Timeout);
- default:
- LOG_DEBUG(ctx, NKikimrServices::CMS, "TWalleApiHandler::StateRemoveTask ignored event type: %" PRIx32 " event: %s",
+ CFunc(TEvents::TSystem::Wakeup, Timeout);
+ default:
+ LOG_DEBUG(ctx, NKikimrServices::CMS, "TWalleApiHandler::StateRemoveTask ignored event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
+ }
+ }
+
void Reply(const TWalleRemoveTaskResponse &resp, const TActorContext &ctx)
- {
- TString status;
- if (!CheckStatus(resp.GetStatus(), status, true, ctx))
- return;
-
+ {
+ TString status;
+ if (!CheckStatus(resp.GetStatus(), status, true, ctx))
+ return;
+
Reply("", ctx);
- }
-
- void Handle(TEvCms::TEvWalleRemoveTaskResponse::TPtr &ev, const TActorContext &ctx)
- {
+ }
+
+ void Handle(TEvCms::TEvWalleRemoveTaskResponse::TPtr &ev, const TActorContext &ctx)
+ {
Reply(ev->Get()->Record, ctx);
- }
-
- //////////////////////////////////////////////
- // Common section
- //////////////////////////////////////////////
- bool CheckStatus(const TStatus &status, TString &out, bool use404, const TActorContext &ctx)
- {
- if (status.GetCode() == TStatus::OK
- || status.GetCode() == TStatus::ALLOW) {
- out = "ok";
- return true;
- }
-
- if (status.GetCode() == TStatus::DISALLOW_TEMP) {
- out = "in-process";
- return true;
- }
-
- if (status.GetCode() == TStatus::DISALLOW) {
- out = "reject";
- return true;
- }
-
- if (status.GetCode() == TStatus::WRONG_REQUEST) {
- TString err;
- if (use404)
- err = NMonitoring::HTTPNOTFOUND;
- else
+ }
+
+ //////////////////////////////////////////////
+ // Common section
+ //////////////////////////////////////////////
+ bool CheckStatus(const TStatus &status, TString &out, bool use404, const TActorContext &ctx)
+ {
+ if (status.GetCode() == TStatus::OK
+ || status.GetCode() == TStatus::ALLOW) {
+ out = "ok";
+ return true;
+ }
+
+ if (status.GetCode() == TStatus::DISALLOW_TEMP) {
+ out = "in-process";
+ return true;
+ }
+
+ if (status.GetCode() == TStatus::DISALLOW) {
+ out = "reject";
+ return true;
+ }
+
+ if (status.GetCode() == TStatus::WRONG_REQUEST) {
+ TString err;
+ if (use404)
+ err = NMonitoring::HTTPNOTFOUND;
+ else
err = Sprintf("HTTP/1.1 400 Bad Request\r\n\r\n%s", status.GetReason().data());
ReplyWithError(err, ctx);
- return false;
- }
-
+ return false;
+ }
+
auto err = Sprintf("HTTP/1.1 500 Internal Server Error\r\n\r\n%s", status.GetReason().data());
ReplyWithError(err, ctx);
- return false;
- }
-
+ return false;
+ }
+
void ReplyWithError(const TString &err, const TActorContext &ctx)
- {
+ {
return ReplyAndDie(err, ctx);
- }
-
+ }
+
void Reply(const TString &json, const TActorContext &ctx)
- {
+ {
const TString header = json ? NMonitoring::HTTPOKJSON : NMonitoring::HTTPNOCONTENT;
return ReplyAndDie(header + json, ctx);
}
@@ -316,20 +316,20 @@ private:
void ReplyAndDie(const TString &data, const TActorContext &ctx) {
AuditLog("Wall-E handler", RequestEvent, data, ctx);
ctx.Send(RequestEvent->Sender, new NMon::TEvHttpInfoRes(data, 0, NMon::IEvHttpInfoRes::EContentType::Custom));
- Die(ctx);
- }
-
- void Die(const TActorContext& ctx) override
- {
- NTabletPipe::CloseClient(ctx, CmsPipe);
- TBase::Die(ctx);
- }
-
- void Timeout(const TActorContext& ctx)
- {
+ Die(ctx);
+ }
+
+ void Die(const TActorContext& ctx) override
+ {
+ NTabletPipe::CloseClient(ctx, CmsPipe);
+ TBase::Die(ctx);
+ }
+
+ void Timeout(const TActorContext& ctx)
+ {
ReplyWithError(TString("HTTP/1.1 408 Request Timeout\r\n\r\nCMS request timeout"), ctx);
- }
-
+ }
+
void SendToCms(IEventBase* ev, const TActorContext &ctx) {
Y_VERIFY(!CmsPipe);
@@ -371,15 +371,15 @@ private:
Bootstrap(ctx);
}
- NMon::TEvHttpInfo::TPtr RequestEvent;
+ NMon::TEvHttpInfo::TPtr RequestEvent;
TActorId CmsPipe;
-};
-
-
-IActor *CreateWalleApiHandler(NMon::TEvHttpInfo::TPtr &event)
-{
- return new TWalleCrateTaskHandler(event);
-}
-
-} // NCms
-} // NKikimr
+};
+
+
+IActor *CreateWalleApiHandler(NMon::TEvHttpInfo::TPtr &event)
+{
+ return new TWalleCrateTaskHandler(event);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/walle_check_task_adapter.cpp b/ydb/core/cms/walle_check_task_adapter.cpp
index ff848151d02..e5570c9af91 100644
--- a/ydb/core/cms/walle_check_task_adapter.cpp
+++ b/ydb/core/cms/walle_check_task_adapter.cpp
@@ -1,128 +1,128 @@
-#include "walle.h"
-
+#include "walle.h"
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
-
-namespace NKikimr {
-namespace NCms {
-
-using namespace NKikimrCms;
-using namespace NNodeWhiteboard;
-
-class TWalleCheckTaskAdapter : public TActorBootstrapped<TWalleCheckTaskAdapter> {
-public:
+
+namespace NKikimr {
+namespace NCms {
+
+using namespace NKikimrCms;
+using namespace NNodeWhiteboard;
+
+class TWalleCheckTaskAdapter : public TActorBootstrapped<TWalleCheckTaskAdapter> {
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::CMS_WALLE_REQ;
}
- TWalleCheckTaskAdapter(TEvCms::TEvWalleCheckTaskRequest::TPtr &event,
+ TWalleCheckTaskAdapter(TEvCms::TEvWalleCheckTaskRequest::TPtr &event,
const TCmsStatePtr state, TActorId cms)
- : RequestEvent(event)
- , State(state)
- , Cms(cms)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- TString id = RequestEvent->Get()->Record.GetTaskId();
-
+ : RequestEvent(event)
+ , State(state)
+ , Cms(cms)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ TString id = RequestEvent->Get()->Record.GetTaskId();
+
LOG_INFO(ctx, NKikimrServices::CMS, "Processing Wall-E request: %s",
RequestEvent->Get()->Record.ShortDebugString().data());
-
+
if (!State->WalleTasks.contains(id)) {
- ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "Unknown task", ctx);
- return;
- }
-
- Response = new TEvCms::TEvWalleCheckTaskResponse;
- auto &info = *Response->Record.MutableTask();
- auto &task = State->WalleTasks.find(id)->second;
- info.SetTaskId(id);
-
+ ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "Unknown task", ctx);
+ return;
+ }
+
+ Response = new TEvCms::TEvWalleCheckTaskResponse;
+ auto &info = *Response->Record.MutableTask();
+ auto &task = State->WalleTasks.find(id)->second;
+ info.SetTaskId(id);
+
if (State->ScheduledRequests.contains(task.RequestId)) {
- auto &req = State->ScheduledRequests.find(task.RequestId)->second;
-
- for (auto &action : req.Request.GetActions())
- *info.AddHosts() = action.GetHost();
-
- TAutoPtr<TEvCms::TEvCheckRequest> event = new TEvCms::TEvCheckRequest;
- event->Record.SetUser(WALLE_CMS_USER);
- event->Record.SetRequestId(task.RequestId);
-
- ctx.Send(Cms, event.Release());
-
- Become(&TThis::StateWork, ctx, TDuration::Seconds(10), new TEvents::TEvWakeup());
- } else {
- for (auto &id : task.Permissions) {
+ auto &req = State->ScheduledRequests.find(task.RequestId)->second;
+
+ for (auto &action : req.Request.GetActions())
+ *info.AddHosts() = action.GetHost();
+
+ TAutoPtr<TEvCms::TEvCheckRequest> event = new TEvCms::TEvCheckRequest;
+ event->Record.SetUser(WALLE_CMS_USER);
+ event->Record.SetRequestId(task.RequestId);
+
+ ctx.Send(Cms, event.Release());
+
+ Become(&TThis::StateWork, ctx, TDuration::Seconds(10), new TEvents::TEvWakeup());
+ } else {
+ for (auto &id : task.Permissions) {
if (State->Permissions.contains(id))
- *info.AddHosts() = State->Permissions.find(id)->second.Action.GetHost();
- }
-
- if (!info.HostsSize()) {
- ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "Empty task", ctx);
- return;
- }
-
- Response->Record.MutableStatus()->SetCode(TStatus::ALLOW);
-
- ReplyAndDie(Response, ctx);
- }
- }
-
-private:
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvCms::TEvPermissionResponse, Handle);
- CFunc(TEvents::TSystem::Wakeup, Timeout);
- default:
- LOG_DEBUG(ctx, NKikimrServices::CMS,
- "TWalleRemoveTaskAdapter::StateWork ignored event type: %" PRIx32 " event: %s",
+ *info.AddHosts() = State->Permissions.find(id)->second.Action.GetHost();
+ }
+
+ if (!info.HostsSize()) {
+ ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "Empty task", ctx);
+ return;
+ }
+
+ Response->Record.MutableStatus()->SetCode(TStatus::ALLOW);
+
+ ReplyAndDie(Response, ctx);
+ }
+ }
+
+private:
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvCms::TEvPermissionResponse, Handle);
+ CFunc(TEvents::TSystem::Wakeup, Timeout);
+ default:
+ LOG_DEBUG(ctx, NKikimrServices::CMS,
+ "TWalleRemoveTaskAdapter::StateWork ignored event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
- void ReplyWithErrorAndDie(TStatus::ECode code, const TString &err, const TActorContext &ctx)
- {
- TAutoPtr<TEvCms::TEvWalleCheckTaskResponse> resp = new TEvCms::TEvWalleCheckTaskResponse;
- resp->Record.MutableStatus()->SetCode(code);
- resp->Record.MutableStatus()->SetReason(err);
- ReplyAndDie(resp.Release(), ctx);
- }
-
- void ReplyAndDie(TAutoPtr<TEvCms::TEvWalleCheckTaskResponse> resp, const TActorContext &ctx)
- {
+ }
+ }
+
+ void ReplyWithErrorAndDie(TStatus::ECode code, const TString &err, const TActorContext &ctx)
+ {
+ TAutoPtr<TEvCms::TEvWalleCheckTaskResponse> resp = new TEvCms::TEvWalleCheckTaskResponse;
+ resp->Record.MutableStatus()->SetCode(code);
+ resp->Record.MutableStatus()->SetReason(err);
+ ReplyAndDie(resp.Release(), ctx);
+ }
+
+ void ReplyAndDie(TAutoPtr<TEvCms::TEvWalleCheckTaskResponse> resp, const TActorContext &ctx)
+ {
WalleAuditLog(RequestEvent->Get(), resp.Get(), ctx);
- ctx.Send(RequestEvent->Sender, resp.Release());
- Die(ctx);
- }
-
- void Handle(TEvCms::TEvPermissionResponse::TPtr &ev, const TActorContext &ctx)
- {
- auto &rec = ev->Get()->Record;
-
- Response->Record.MutableStatus()->CopyFrom(rec.GetStatus());
- ReplyAndDie(Response, ctx);
- }
-
- void Timeout(const TActorContext& ctx)
- {
- ReplyWithErrorAndDie(TStatus::ERROR_TEMP, "Timeout", ctx);
- }
-
- TEvCms::TEvWalleCheckTaskRequest::TPtr RequestEvent;
- TAutoPtr<TEvCms::TEvWalleCheckTaskResponse> Response;
- const TCmsStatePtr State;
+ ctx.Send(RequestEvent->Sender, resp.Release());
+ Die(ctx);
+ }
+
+ void Handle(TEvCms::TEvPermissionResponse::TPtr &ev, const TActorContext &ctx)
+ {
+ auto &rec = ev->Get()->Record;
+
+ Response->Record.MutableStatus()->CopyFrom(rec.GetStatus());
+ ReplyAndDie(Response, ctx);
+ }
+
+ void Timeout(const TActorContext& ctx)
+ {
+ ReplyWithErrorAndDie(TStatus::ERROR_TEMP, "Timeout", ctx);
+ }
+
+ TEvCms::TEvWalleCheckTaskRequest::TPtr RequestEvent;
+ TAutoPtr<TEvCms::TEvWalleCheckTaskResponse> Response;
+ const TCmsStatePtr State;
TActorId Cms;
-};
-
-
-IActor *CreateWalleAdapter(TEvCms::TEvWalleCheckTaskRequest::TPtr &ev,
+};
+
+
+IActor *CreateWalleAdapter(TEvCms::TEvWalleCheckTaskRequest::TPtr &ev,
const TCmsStatePtr state, TActorId cms)
-{
- return new TWalleCheckTaskAdapter(ev, state, cms);
-}
-
-} // NCms
-} // NKikimr
+{
+ return new TWalleCheckTaskAdapter(ev, state, cms);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/walle_create_task_adapter.cpp b/ydb/core/cms/walle_create_task_adapter.cpp
index d141e56fcf2..56989e2db03 100644
--- a/ydb/core/cms/walle_create_task_adapter.cpp
+++ b/ydb/core/cms/walle_create_task_adapter.cpp
@@ -1,173 +1,173 @@
-#include "walle.h"
-#include "info_collector.h"
-#include "cms_impl.h"
-
+#include "walle.h"
+#include "info_collector.h"
+#include "cms_impl.h"
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
-
-namespace NKikimr {
-namespace NCms {
-
-using namespace NKikimrCms;
-
-class TWalleCreateTaskAdapter : public TActorBootstrapped<TWalleCreateTaskAdapter> {
-public:
+
+namespace NKikimr {
+namespace NCms {
+
+using namespace NKikimrCms;
+
+class TWalleCreateTaskAdapter : public TActorBootstrapped<TWalleCreateTaskAdapter> {
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::CMS_WALLE_REQ;
}
TWalleCreateTaskAdapter(TEvCms::TEvWalleCreateTaskRequest::TPtr &event, TActorId cms)
- : RequestEvent(event)
- , Cms(cms)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- auto &rec = RequestEvent->Get()->Record;
-
+ : RequestEvent(event)
+ , Cms(cms)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ auto &rec = RequestEvent->Get()->Record;
+
LOG_INFO(ctx, NKikimrServices::CMS, "Processing Wall-E request: %s",
rec.ShortDebugString().data());
-
- if (rec.GetAction() != "reboot"
- && rec.GetAction() != "power-off"
- && rec.GetAction() != "change-disk"
- && rec.GetAction() != "change-memory"
- && rec.GetAction() != "profile"
- && rec.GetAction() != "redeploy"
- && rec.GetAction() != "prepare"
+
+ if (rec.GetAction() != "reboot"
+ && rec.GetAction() != "power-off"
+ && rec.GetAction() != "change-disk"
+ && rec.GetAction() != "change-memory"
+ && rec.GetAction() != "profile"
+ && rec.GetAction() != "redeploy"
+ && rec.GetAction() != "prepare"
&& rec.GetAction() != "repair-link"
&& rec.GetAction() != "repair-bmc"
&& rec.GetAction() != "repair-overheat"
&& rec.GetAction() != "repair-capping"
- && rec.GetAction() != "deactivate") {
- ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "Unsupported action", ctx);
- return;
- }
-
- if (!rec.HostsSize()) {
- ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "No hosts specified", ctx);
- return;
- }
-
- auto collector = CreateInfoCollector(SelfId(), TDuration::Seconds(15));
+ && rec.GetAction() != "deactivate") {
+ ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "Unsupported action", ctx);
+ return;
+ }
+
+ if (!rec.HostsSize()) {
+ ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "No hosts specified", ctx);
+ return;
+ }
+
+ auto collector = CreateInfoCollector(SelfId(), TDuration::Seconds(15));
ctx.RegisterWithSameMailbox(collector);
-
- Become(&TThis::StateWork);
- }
-
-private:
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvCms::TEvPermissionResponse, Handle);
- HFunc(TCms::TEvPrivate::TEvClusterInfo, Handle);
- CFunc(TEvCms::EvWalleTaskStored, Finish);
- default:
- LOG_DEBUG(ctx, NKikimrServices::CMS,
- "TWalleCreateTaskAdapter::StateWork ignored event type: %" PRIx32 " event: %s",
+
+ Become(&TThis::StateWork);
+ }
+
+private:
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvCms::TEvPermissionResponse, Handle);
+ HFunc(TCms::TEvPrivate::TEvClusterInfo, Handle);
+ CFunc(TEvCms::EvWalleTaskStored, Finish);
+ default:
+ LOG_DEBUG(ctx, NKikimrServices::CMS,
+ "TWalleCreateTaskAdapter::StateWork ignored event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
- void ReplyWithErrorAndDie(TStatus::ECode code, const TString &err, const TActorContext &ctx)
- {
- auto &rec = RequestEvent->Get()->Record;
- TAutoPtr<TEvCms::TEvWalleCreateTaskResponse> resp = new TEvCms::TEvWalleCreateTaskResponse;
- resp->Record.MutableStatus()->SetCode(code);
- resp->Record.MutableStatus()->SetReason(err);
- resp->Record.SetTaskId(rec.GetTaskId());
- resp->Record.MutableHosts()->CopyFrom(rec.GetHosts());
- ReplyAndDie(resp.Release(), ctx);
- }
-
- void ReplyAndDie(TAutoPtr<TEvCms::TEvWalleCreateTaskResponse> resp, const TActorContext &ctx)
- {
+ }
+ }
+
+ void ReplyWithErrorAndDie(TStatus::ECode code, const TString &err, const TActorContext &ctx)
+ {
+ auto &rec = RequestEvent->Get()->Record;
+ TAutoPtr<TEvCms::TEvWalleCreateTaskResponse> resp = new TEvCms::TEvWalleCreateTaskResponse;
+ resp->Record.MutableStatus()->SetCode(code);
+ resp->Record.MutableStatus()->SetReason(err);
+ resp->Record.SetTaskId(rec.GetTaskId());
+ resp->Record.MutableHosts()->CopyFrom(rec.GetHosts());
+ ReplyAndDie(resp.Release(), ctx);
+ }
+
+ void ReplyAndDie(TAutoPtr<TEvCms::TEvWalleCreateTaskResponse> resp, const TActorContext &ctx)
+ {
WalleAuditLog(RequestEvent->Get(), resp.Get(), ctx);
- ctx.Send(RequestEvent->Sender, resp.Release());
- Die(ctx);
- }
-
- void Handle(TEvCms::TEvPermissionResponse::TPtr &ev, const TActorContext &ctx)
- {
- auto &rec = ev->Get()->Record;
-
- Response = new TEvCms::TEvWalleCreateTaskResponse;
- Response->Record.MutableStatus()->CopyFrom(rec.GetStatus());
- Response->Record.SetTaskId(RequestEvent->Get()->Record.GetTaskId());
- Response->Record.MutableHosts()->CopyFrom(RequestEvent->Get()->Record.GetHosts());
-
- // In case of success or scheduled request we have to store
- // task information.
- if ((rec.GetStatus().GetCode() == TStatus::ALLOW
- || rec.GetStatus().GetCode() == TStatus::DISALLOW_TEMP)
- && !RequestEvent->Get()->Record.GetDryRun()) {
- TAutoPtr<TEvCms::TEvStoreWalleTask> event = new TEvCms::TEvStoreWalleTask;
- event->Task.TaskId = RequestEvent->Get()->Record.GetTaskId();
- event->Task.RequestId = rec.GetRequestId();
-
- for (auto &permission : rec.GetPermissions())
- event->Task.Permissions.insert(permission.GetId());
-
- ctx.Send(Cms, event.Release());
- return;
- }
-
- ReplyAndDie(Response, ctx);
- }
-
-
- void Handle(TCms::TEvPrivate::TEvClusterInfo::TPtr &ev, const TActorContext &ctx)
- {
- if (!ev->Get()->Success) {
- ReplyWithErrorAndDie(TStatus::ERROR_TEMP, "Cannot collect cluster info", ctx);
- return;
- }
-
- auto cluster = ev->Get()->Info;
- auto &task = RequestEvent->Get()->Record;
-
- for (auto &host : task.GetHosts()) {
- if (!cluster->HasNode(host)) {
- ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "Unknown host " + host, ctx);
- return;
- }
- }
-
- TAutoPtr<TEvCms::TEvPermissionRequest> request = new TEvCms::TEvPermissionRequest;
- request->Record.SetUser(WALLE_CMS_USER);
- request->Record.SetSchedule(true);
- request->Record.SetDryRun(task.GetDryRun());
-
- TAction action;
- if (task.GetAction() == "prepare"
- || task.GetAction() == "deactivate") {
- TAutoPtr<TEvCms::TEvWalleCreateTaskResponse> resp = new TEvCms::TEvWalleCreateTaskResponse;
- resp->Record.SetTaskId(task.GetTaskId());
- resp->Record.MutableHosts()->CopyFrom(task.GetHosts());
- resp->Record.MutableStatus()->SetCode(TStatus::OK);
- ReplyAndDie(resp.Release(), ctx);
- return;
- } else {
+ ctx.Send(RequestEvent->Sender, resp.Release());
+ Die(ctx);
+ }
+
+ void Handle(TEvCms::TEvPermissionResponse::TPtr &ev, const TActorContext &ctx)
+ {
+ auto &rec = ev->Get()->Record;
+
+ Response = new TEvCms::TEvWalleCreateTaskResponse;
+ Response->Record.MutableStatus()->CopyFrom(rec.GetStatus());
+ Response->Record.SetTaskId(RequestEvent->Get()->Record.GetTaskId());
+ Response->Record.MutableHosts()->CopyFrom(RequestEvent->Get()->Record.GetHosts());
+
+ // In case of success or scheduled request we have to store
+ // task information.
+ if ((rec.GetStatus().GetCode() == TStatus::ALLOW
+ || rec.GetStatus().GetCode() == TStatus::DISALLOW_TEMP)
+ && !RequestEvent->Get()->Record.GetDryRun()) {
+ TAutoPtr<TEvCms::TEvStoreWalleTask> event = new TEvCms::TEvStoreWalleTask;
+ event->Task.TaskId = RequestEvent->Get()->Record.GetTaskId();
+ event->Task.RequestId = rec.GetRequestId();
+
+ for (auto &permission : rec.GetPermissions())
+ event->Task.Permissions.insert(permission.GetId());
+
+ ctx.Send(Cms, event.Release());
+ return;
+ }
+
+ ReplyAndDie(Response, ctx);
+ }
+
+
+ void Handle(TCms::TEvPrivate::TEvClusterInfo::TPtr &ev, const TActorContext &ctx)
+ {
+ if (!ev->Get()->Success) {
+ ReplyWithErrorAndDie(TStatus::ERROR_TEMP, "Cannot collect cluster info", ctx);
+ return;
+ }
+
+ auto cluster = ev->Get()->Info;
+ auto &task = RequestEvent->Get()->Record;
+
+ for (auto &host : task.GetHosts()) {
+ if (!cluster->HasNode(host)) {
+ ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "Unknown host " + host, ctx);
+ return;
+ }
+ }
+
+ TAutoPtr<TEvCms::TEvPermissionRequest> request = new TEvCms::TEvPermissionRequest;
+ request->Record.SetUser(WALLE_CMS_USER);
+ request->Record.SetSchedule(true);
+ request->Record.SetDryRun(task.GetDryRun());
+
+ TAction action;
+ if (task.GetAction() == "prepare"
+ || task.GetAction() == "deactivate") {
+ TAutoPtr<TEvCms::TEvWalleCreateTaskResponse> resp = new TEvCms::TEvWalleCreateTaskResponse;
+ resp->Record.SetTaskId(task.GetTaskId());
+ resp->Record.MutableHosts()->CopyFrom(task.GetHosts());
+ resp->Record.MutableStatus()->SetCode(TStatus::OK);
+ ReplyAndDie(resp.Release(), ctx);
+ return;
+ } else {
// We always use infinite duration.
// Wall-E MUST delete processed tasks.
- if (task.GetAction() == "reboot") {
- action.SetType(TAction::SHUTDOWN_HOST);
+ if (task.GetAction() == "reboot") {
+ action.SetType(TAction::SHUTDOWN_HOST);
action.SetDuration(TDuration::Max().GetValue());
- } else if (task.GetAction() == "power-off") {
- action.SetType(TAction::SHUTDOWN_HOST);
+ } else if (task.GetAction() == "power-off") {
+ action.SetType(TAction::SHUTDOWN_HOST);
action.SetDuration(TDuration::Max().GetValue());
- } else if (task.GetAction() == "change-disk") {
- action.SetType(TAction::REPLACE_DEVICES);
+ } else if (task.GetAction() == "change-disk") {
+ action.SetType(TAction::REPLACE_DEVICES);
action.SetDuration(TDuration::Max().GetValue());
- } else if (task.GetAction() == "change-memory") {
- action.SetType(TAction::SHUTDOWN_HOST);
+ } else if (task.GetAction() == "change-memory") {
+ action.SetType(TAction::SHUTDOWN_HOST);
action.SetDuration(TDuration::Max().GetValue());
- } else if (task.GetAction() == "profile") {
- action.SetType(TAction::SHUTDOWN_HOST);
+ } else if (task.GetAction() == "profile") {
+ action.SetType(TAction::SHUTDOWN_HOST);
action.SetDuration(TDuration::Max().GetValue());
- } else if (task.GetAction() == "redeploy") {
- action.SetType(TAction::SHUTDOWN_HOST);
+ } else if (task.GetAction() == "redeploy") {
+ action.SetType(TAction::SHUTDOWN_HOST);
action.SetDuration(TDuration::Max().GetValue());
} else if (task.GetAction() == "repair-link") {
action.SetType(TAction::SHUTDOWN_HOST);
@@ -181,41 +181,41 @@ private:
} else if (task.GetAction() == "repair-capping") {
action.SetType(TAction::SHUTDOWN_HOST);
action.SetDuration(TDuration::Max().GetValue());
- } else
- Y_FAIL("Unknown action");
-
-
- for (auto &host : task.GetHosts()) {
- auto &hostAction = *request->Record.AddActions();
- hostAction.CopyFrom(action);
- hostAction.SetHost(host);
- if (action.GetType() == TAction::REPLACE_DEVICES) {
+ } else
+ Y_FAIL("Unknown action");
+
+
+ for (auto &host : task.GetHosts()) {
+ auto &hostAction = *request->Record.AddActions();
+ hostAction.CopyFrom(action);
+ hostAction.SetHost(host);
+ if (action.GetType() == TAction::REPLACE_DEVICES) {
for (const auto node : cluster->HostNodes(host)) {
for (auto &pdiskId : node->PDisks)
*hostAction.AddDevices() = cluster->PDisk(pdiskId).GetDeviceName();
}
- }
- }
- }
-
- ctx.Send(Cms, request.Release());
- }
-
- void Finish(const TActorContext& ctx)
- {
- ReplyAndDie(Response, ctx);
- }
-
- TEvCms::TEvWalleCreateTaskRequest::TPtr RequestEvent;
- TAutoPtr<TEvCms::TEvWalleCreateTaskResponse> Response;
+ }
+ }
+ }
+
+ ctx.Send(Cms, request.Release());
+ }
+
+ void Finish(const TActorContext& ctx)
+ {
+ ReplyAndDie(Response, ctx);
+ }
+
+ TEvCms::TEvWalleCreateTaskRequest::TPtr RequestEvent;
+ TAutoPtr<TEvCms::TEvWalleCreateTaskResponse> Response;
TActorId Cms;
-};
-
-
+};
+
+
IActor *CreateWalleAdapter(TEvCms::TEvWalleCreateTaskRequest::TPtr &ev, TActorId cms)
-{
- return new TWalleCreateTaskAdapter(ev, cms);
-}
-
-} // NCms
-} // NKikimr
+{
+ return new TWalleCreateTaskAdapter(ev, cms);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/walle_list_tasks_adapter.cpp b/ydb/core/cms/walle_list_tasks_adapter.cpp
index bb648118265..d256294cc18 100644
--- a/ydb/core/cms/walle_list_tasks_adapter.cpp
+++ b/ydb/core/cms/walle_list_tasks_adapter.cpp
@@ -1,74 +1,74 @@
-#include "walle.h"
-
+#include "walle.h"
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
-
-namespace NKikimr {
-namespace NCms {
-
-using namespace NKikimrCms;
-using namespace NNodeWhiteboard;
-
-class TWalleListTasksAdapter : public TActorBootstrapped<TWalleListTasksAdapter> {
-public:
+
+namespace NKikimr {
+namespace NCms {
+
+using namespace NKikimrCms;
+using namespace NNodeWhiteboard;
+
+class TWalleListTasksAdapter : public TActorBootstrapped<TWalleListTasksAdapter> {
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::CMS_WALLE_REQ;
}
- TWalleListTasksAdapter(TEvCms::TEvWalleListTasksRequest::TPtr &event, const TCmsStatePtr state)
- : RequestEvent(event)
- , State(state)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
+ TWalleListTasksAdapter(TEvCms::TEvWalleListTasksRequest::TPtr &event, const TCmsStatePtr state)
+ : RequestEvent(event)
+ , State(state)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
auto &rec = RequestEvent->Get()->Record;
LOG_INFO(ctx, NKikimrServices::CMS, "Processing Wall-E request: %s",
rec.ShortDebugString().data());
- TAutoPtr<TEvCms::TEvWalleListTasksResponse> response = new TEvCms::TEvWalleListTasksResponse;
-
- for (auto &entry : State->WalleTasks) {
- auto &task = entry.second;
- auto &info = *response->Record.AddTasks();
-
- info.SetTaskId(task.TaskId);
+ TAutoPtr<TEvCms::TEvWalleListTasksResponse> response = new TEvCms::TEvWalleListTasksResponse;
+
+ for (auto &entry : State->WalleTasks) {
+ auto &task = entry.second;
+ auto &info = *response->Record.AddTasks();
+
+ info.SetTaskId(task.TaskId);
if (State->ScheduledRequests.contains(task.RequestId)) {
- auto &req = State->ScheduledRequests.find(task.RequestId)->second;
- for (auto &action : req.Request.GetActions())
- *info.AddHosts() = action.GetHost();
- info.SetStatus("in-process");
- } else {
- for (auto &id : task.Permissions) {
+ auto &req = State->ScheduledRequests.find(task.RequestId)->second;
+ for (auto &action : req.Request.GetActions())
+ *info.AddHosts() = action.GetHost();
+ info.SetStatus("in-process");
+ } else {
+ for (auto &id : task.Permissions) {
if (State->Permissions.contains(id))
- *info.AddHosts() = State->Permissions.find(id)->second.Action.GetHost();
- }
- info.SetStatus("ok");
- }
- }
-
- ReplyAndDie(response, ctx);
- }
-
-private:
- void ReplyAndDie(TAutoPtr<TEvCms::TEvWalleListTasksResponse> resp, const TActorContext &ctx)
- {
+ *info.AddHosts() = State->Permissions.find(id)->second.Action.GetHost();
+ }
+ info.SetStatus("ok");
+ }
+ }
+
+ ReplyAndDie(response, ctx);
+ }
+
+private:
+ void ReplyAndDie(TAutoPtr<TEvCms::TEvWalleListTasksResponse> resp, const TActorContext &ctx)
+ {
WalleAuditLog(RequestEvent->Get(), resp.Get(), ctx);
- ctx.Send(RequestEvent->Sender, resp.Release());
- Die(ctx);
- }
-
- TEvCms::TEvWalleListTasksRequest::TPtr RequestEvent;
- const TCmsStatePtr State;
-};
-
-
-IActor *CreateWalleAdapter(TEvCms::TEvWalleListTasksRequest::TPtr &ev, const TCmsStatePtr state)
-{
- return new TWalleListTasksAdapter(ev, state);
-}
-
-} // NCms
-} // NKikimr
+ ctx.Send(RequestEvent->Sender, resp.Release());
+ Die(ctx);
+ }
+
+ TEvCms::TEvWalleListTasksRequest::TPtr RequestEvent;
+ const TCmsStatePtr State;
+};
+
+
+IActor *CreateWalleAdapter(TEvCms::TEvWalleListTasksRequest::TPtr &ev, const TCmsStatePtr state)
+{
+ return new TWalleListTasksAdapter(ev, state);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/walle_remove_task_adapter.cpp b/ydb/core/cms/walle_remove_task_adapter.cpp
index f3cc0bd6c7f..899d4848250 100644
--- a/ydb/core/cms/walle_remove_task_adapter.cpp
+++ b/ydb/core/cms/walle_remove_task_adapter.cpp
@@ -1,96 +1,96 @@
-#include "walle.h"
-
+#include "walle.h"
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
-
-namespace NKikimr {
-namespace NCms {
-
-using namespace NKikimrCms;
-using namespace NNodeWhiteboard;
-
-class TWalleRemoveTaskAdapter : public TActorBootstrapped<TWalleRemoveTaskAdapter> {
-public:
+
+namespace NKikimr {
+namespace NCms {
+
+using namespace NKikimrCms;
+using namespace NNodeWhiteboard;
+
+class TWalleRemoveTaskAdapter : public TActorBootstrapped<TWalleRemoveTaskAdapter> {
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::CMS_WALLE_REQ;
}
TWalleRemoveTaskAdapter(TEvCms::TEvWalleRemoveTaskRequest::TPtr &event, const TCmsStatePtr state, TActorId cms)
- : RequestEvent(event)
- , State(state)
- , Cms(cms)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- TAutoPtr<TEvCms::TEvWalleRemoveTaskResponse> response = new TEvCms::TEvWalleRemoveTaskResponse;
- TString id = RequestEvent->Get()->Record.GetTaskId();
-
+ : RequestEvent(event)
+ , State(state)
+ , Cms(cms)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ TAutoPtr<TEvCms::TEvWalleRemoveTaskResponse> response = new TEvCms::TEvWalleRemoveTaskResponse;
+ TString id = RequestEvent->Get()->Record.GetTaskId();
+
LOG_INFO(ctx, NKikimrServices::CMS, "Processing Wall-E request: %s",
RequestEvent->Get()->Record.ShortDebugString().data());
-
+
if (!State->WalleTasks.contains(id)) {
- ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "Unknown task", ctx);
- return;
- }
-
- TAutoPtr<TEvCms::TEvRemoveWalleTask> event = new TEvCms::TEvRemoveWalleTask;
- event->TaskId = id;
- ctx.Send(Cms, event.Release());
-
- Become(&TThis::StateWork, ctx, TDuration::Seconds(10), new TEvents::TEvWakeup()); }
-
-private:
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- CFunc(TEvents::TSystem::Wakeup, Timeout);
- CFunc(TEvCms::EvWalleTaskRemoved, Finish);
- default:
- LOG_DEBUG(ctx, NKikimrServices::CMS,
- "TWalleRemoveTaskAdapter::StateWork ignored event type: %" PRIx32 " event: %s",
+ ReplyWithErrorAndDie(TStatus::WRONG_REQUEST, "Unknown task", ctx);
+ return;
+ }
+
+ TAutoPtr<TEvCms::TEvRemoveWalleTask> event = new TEvCms::TEvRemoveWalleTask;
+ event->TaskId = id;
+ ctx.Send(Cms, event.Release());
+
+ Become(&TThis::StateWork, ctx, TDuration::Seconds(10), new TEvents::TEvWakeup()); }
+
+private:
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ CFunc(TEvents::TSystem::Wakeup, Timeout);
+ CFunc(TEvCms::EvWalleTaskRemoved, Finish);
+ default:
+ LOG_DEBUG(ctx, NKikimrServices::CMS,
+ "TWalleRemoveTaskAdapter::StateWork ignored event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
- void ReplyWithErrorAndDie(TStatus::ECode code, const TString &err, const TActorContext &ctx)
- {
- TAutoPtr<TEvCms::TEvWalleRemoveTaskResponse> resp = new TEvCms::TEvWalleRemoveTaskResponse;
- resp->Record.MutableStatus()->SetCode(code);
- resp->Record.MutableStatus()->SetReason(err);
- ReplyAndDie(resp.Release(), ctx);
- }
-
- void ReplyAndDie(TAutoPtr<TEvCms::TEvWalleRemoveTaskResponse> resp, const TActorContext &ctx)
- {
+ }
+ }
+
+ void ReplyWithErrorAndDie(TStatus::ECode code, const TString &err, const TActorContext &ctx)
+ {
+ TAutoPtr<TEvCms::TEvWalleRemoveTaskResponse> resp = new TEvCms::TEvWalleRemoveTaskResponse;
+ resp->Record.MutableStatus()->SetCode(code);
+ resp->Record.MutableStatus()->SetReason(err);
+ ReplyAndDie(resp.Release(), ctx);
+ }
+
+ void ReplyAndDie(TAutoPtr<TEvCms::TEvWalleRemoveTaskResponse> resp, const TActorContext &ctx)
+ {
WalleAuditLog(RequestEvent->Get(), resp.Get(), ctx);
- ctx.Send(RequestEvent->Sender, resp.Release());
- Die(ctx);
- }
-
- void Timeout(const TActorContext& ctx)
- {
- ReplyWithErrorAndDie(TStatus::ERROR_TEMP, "Timeout", ctx);
- }
-
- void Finish(const TActorContext& ctx)
- {
- TAutoPtr<TEvCms::TEvWalleRemoveTaskResponse> resp = new TEvCms::TEvWalleRemoveTaskResponse;
- resp->Record.MutableStatus()->SetCode(TStatus::OK);
- ReplyAndDie(resp, ctx);
- }
-
- TEvCms::TEvWalleRemoveTaskRequest::TPtr RequestEvent;
- const TCmsStatePtr State;
+ ctx.Send(RequestEvent->Sender, resp.Release());
+ Die(ctx);
+ }
+
+ void Timeout(const TActorContext& ctx)
+ {
+ ReplyWithErrorAndDie(TStatus::ERROR_TEMP, "Timeout", ctx);
+ }
+
+ void Finish(const TActorContext& ctx)
+ {
+ TAutoPtr<TEvCms::TEvWalleRemoveTaskResponse> resp = new TEvCms::TEvWalleRemoveTaskResponse;
+ resp->Record.MutableStatus()->SetCode(TStatus::OK);
+ ReplyAndDie(resp, ctx);
+ }
+
+ TEvCms::TEvWalleRemoveTaskRequest::TPtr RequestEvent;
+ const TCmsStatePtr State;
TActorId Cms;
-};
-
-
+};
+
+
IActor *CreateWalleAdapter(TEvCms::TEvWalleRemoveTaskRequest::TPtr &ev, const TCmsStatePtr state, TActorId cms)
-{
- return new TWalleRemoveTaskAdapter(ev, state, cms);
-}
-
-} // NCms
-} // NKikimr
+{
+ return new TWalleRemoveTaskAdapter(ev, state, cms);
+}
+
+} // NCms
+} // NKikimr
diff --git a/ydb/core/cms/ya.make b/ydb/core/cms/ya.make
index 519fdc9eef3..b341c4a0d09 100644
--- a/ydb/core/cms/ya.make
+++ b/ydb/core/cms/ya.make
@@ -1,93 +1,93 @@
-LIBRARY()
-
-OWNER(
- ienkovich
+LIBRARY()
+
+OWNER(
+ ienkovich
g:kikimr
-)
-
-SRCS(
+)
+
+SRCS(
audit_log.cpp
- base_handler.h
- cluster_info.cpp
- cluster_info.h
- cms.cpp
- cms.h
- cms_impl.h
- cms_state.h
- cms_tx_get_log_tail.cpp
- cms_tx_init_scheme.cpp
- cms_tx_load_state.cpp
- cms_tx_log_and_send.cpp
- cms_tx_log_cleanup.cpp
- cms_tx_process_notification.cpp
- cms_tx_reject_notification.cpp
- cms_tx_remove_expired_notifications.cpp
- cms_tx_remove_permissions.cpp
- cms_tx_remove_request.cpp
- cms_tx_remove_walle_task.cpp
- cms_tx_store_permissions.cpp
- cms_tx_store_walle_task.cpp
- cms_tx_update_config.cpp
- cms_tx_update_downtimes.cpp
- defs.h
- downtime.h
- downtime.cpp
- http.cpp
- http.h
- info_collector.cpp
- info_collector.h
- json_proxy.h
- json_proxy_config_items.h
- json_proxy_config_updates.h
- json_proxy_config_validators.h
- json_proxy_log.h
- json_proxy_operations.h
- json_proxy_proto.h
- json_proxy_toggle_config_validator.h
- logger.cpp
- logger.h
- log_formatter.h
- pdiskid.h
- scheme.h
+ base_handler.h
+ cluster_info.cpp
+ cluster_info.h
+ cms.cpp
+ cms.h
+ cms_impl.h
+ cms_state.h
+ cms_tx_get_log_tail.cpp
+ cms_tx_init_scheme.cpp
+ cms_tx_load_state.cpp
+ cms_tx_log_and_send.cpp
+ cms_tx_log_cleanup.cpp
+ cms_tx_process_notification.cpp
+ cms_tx_reject_notification.cpp
+ cms_tx_remove_expired_notifications.cpp
+ cms_tx_remove_permissions.cpp
+ cms_tx_remove_request.cpp
+ cms_tx_remove_walle_task.cpp
+ cms_tx_store_permissions.cpp
+ cms_tx_store_walle_task.cpp
+ cms_tx_update_config.cpp
+ cms_tx_update_downtimes.cpp
+ defs.h
+ downtime.h
+ downtime.cpp
+ http.cpp
+ http.h
+ info_collector.cpp
+ info_collector.h
+ json_proxy.h
+ json_proxy_config_items.h
+ json_proxy_config_updates.h
+ json_proxy_config_validators.h
+ json_proxy_log.h
+ json_proxy_operations.h
+ json_proxy_proto.h
+ json_proxy_toggle_config_validator.h
+ logger.cpp
+ logger.h
+ log_formatter.h
+ pdiskid.h
+ scheme.h
sentinel.cpp
services.cpp
- walle.h
- walle_api_handler.cpp
- walle_check_task_adapter.cpp
- walle_create_task_adapter.cpp
- walle_list_tasks_adapter.cpp
- walle_remove_task_adapter.cpp
-)
-
-RESOURCE(
- ui/index.html cms/ui/index.html
- ui/cms.css cms/ui/cms.css
- ui/cms.js cms/ui/cms.js
- ui/cms_log.js cms/ui/cms_log.js
- ui/common.css cms/ui/common.css
- ui/common.js cms/ui/common.js
- ui/configs.js cms/ui/configs.js
- ui/config_forms.js cms/ui/config_forms.js
- ui/datashard.css cms/ui/datashard.css
- ui/datashard.js cms/ui/datashard.js
- ui/datashard_hist.js cms/ui/datashard_hist.js
- ui/datashard_info.js cms/ui/datashard_info.js
- ui/datashard_op.js cms/ui/datashard_op.js
- ui/datashard_ops_list.js cms/ui/datashard_ops_list.js
- ui/datashard_rs.js cms/ui/datashard_rs.js
- ui/datashard_slow_ops.js cms/ui/datashard_slow_ops.js
- ui/enums.js cms/ui/enums.js
- ui/ext/bootstrap.min.css cms/ui/ext/bootstrap.min.css
- ui/ext/bootstrap.bundle.min.js cms/ui/ext/bootstrap.bundle.min.js
- ui/ext/theme.blue.css cms/ui/ext/theme.blue.css
- ui/proto_types.js cms/ui/proto_types.js
- ui/res/edit.png cms/ui/res/edit.png
- ui/res/help.png cms/ui/res/help.png
- ui/res/remove.png cms/ui/res/remove.png
- ui/validators.js cms/ui/validators.js
-)
-
-PEERDIR(
+ walle.h
+ walle_api_handler.cpp
+ walle_check_task_adapter.cpp
+ walle_create_task_adapter.cpp
+ walle_list_tasks_adapter.cpp
+ walle_remove_task_adapter.cpp
+)
+
+RESOURCE(
+ ui/index.html cms/ui/index.html
+ ui/cms.css cms/ui/cms.css
+ ui/cms.js cms/ui/cms.js
+ ui/cms_log.js cms/ui/cms_log.js
+ ui/common.css cms/ui/common.css
+ ui/common.js cms/ui/common.js
+ ui/configs.js cms/ui/configs.js
+ ui/config_forms.js cms/ui/config_forms.js
+ ui/datashard.css cms/ui/datashard.css
+ ui/datashard.js cms/ui/datashard.js
+ ui/datashard_hist.js cms/ui/datashard_hist.js
+ ui/datashard_info.js cms/ui/datashard_info.js
+ ui/datashard_op.js cms/ui/datashard_op.js
+ ui/datashard_ops_list.js cms/ui/datashard_ops_list.js
+ ui/datashard_rs.js cms/ui/datashard_rs.js
+ ui/datashard_slow_ops.js cms/ui/datashard_slow_ops.js
+ ui/enums.js cms/ui/enums.js
+ ui/ext/bootstrap.min.css cms/ui/ext/bootstrap.min.css
+ ui/ext/bootstrap.bundle.min.js cms/ui/ext/bootstrap.bundle.min.js
+ ui/ext/theme.blue.css cms/ui/ext/theme.blue.css
+ ui/proto_types.js cms/ui/proto_types.js
+ ui/res/edit.png cms/ui/res/edit.png
+ ui/res/help.png cms/ui/res/help.png
+ ui/res/remove.png cms/ui/res/remove.png
+ ui/validators.js cms/ui/validators.js
+)
+
+PEERDIR(
library/cpp/actors/core
ydb/core/actorlib_impl
ydb/core/base
@@ -103,11 +103,11 @@ PEERDIR(
ydb/core/tablet_flat
ydb/core/tx/datashard
ydb/library/aclib
-)
-
+)
+
GENERATE_ENUM_SERIALIZATION(services.h)
-END()
+END()
RECURSE(
console
diff --git a/ydb/core/control/immediate_control_board_actor.cpp b/ydb/core/control/immediate_control_board_actor.cpp
index a6c5ade2b27..bcb4a3344c3 100644
--- a/ydb/core/control/immediate_control_board_actor.cpp
+++ b/ydb/core/control/immediate_control_board_actor.cpp
@@ -48,7 +48,7 @@ public:
const TIntrusivePtr<NMonitoring::TDynamicCounters>& counters)
: Board(board)
{
- TIntrusivePtr<NMonitoring::TDynamicCounters> IcbGroup = GetServiceCounters(counters, "utils");
+ TIntrusivePtr<NMonitoring::TDynamicCounters> IcbGroup = GetServiceCounters(counters, "utils");
HasChanged = IcbGroup->GetCounter("Icb/HasChangedContol");
ChangedCount = IcbGroup->GetCounter("Icb/ChangedControlsCount");
}
diff --git a/ydb/core/control/immediate_control_board_actor_ut.cpp b/ydb/core/control/immediate_control_board_actor_ut.cpp
index 37c9438d852..2753077d936 100644
--- a/ydb/core/control/immediate_control_board_actor_ut.cpp
+++ b/ydb/core/control/immediate_control_board_actor_ut.cpp
@@ -135,7 +135,7 @@ static void Run(i64 instances = 1) {
logSettings->SetLevel(NLog::PRI_EMERG, NKikimrServices::BS_PDISK, explanation);
NActors::TLoggerActor *loggerActor = new NActors::TLoggerActor(logSettings, NActors::CreateStderrBackend(),
- GetServiceCounters(Counters, "utils"));
+ GetServiceCounters(Counters, "utils"));
NActors::TActorSetupCmd loggerActorCmd(loggerActor, NActors::TMailboxType::Simple, 2);
std::pair<NActors::TActorId, NActors::TActorSetupCmd> loggerActorPair(loggerActorId, loggerActorCmd);
setup->LocalServices.push_back(loggerActorPair);
diff --git a/ydb/core/control/immediate_control_board_impl.cpp b/ydb/core/control/immediate_control_board_impl.cpp
index f972259b022..fa26926fae5 100644
--- a/ydb/core/control/immediate_control_board_impl.cpp
+++ b/ydb/core/control/immediate_control_board_impl.cpp
@@ -28,13 +28,13 @@ void TControlBoard::RestoreDefaults() {
}
}
-void TControlBoard::RestoreDefault(TString name) {
+void TControlBoard::RestoreDefault(TString name) {
TIntrusivePtr<TControl> control;
if (Board.Get(name, control)) {
control->RestoreDefault();
}
-}
-
+}
+
bool TControlBoard::SetValue(TString name, TAtomic value, TAtomic &outPrevValue) {
TIntrusivePtr<TControl> control;
if (Board.Get(name, control)) {
diff --git a/ydb/core/control/immediate_control_board_impl.h b/ydb/core/control/immediate_control_board_impl.h
index efab67bf673..a01e09f4d6c 100644
--- a/ydb/core/control/immediate_control_board_impl.h
+++ b/ydb/core/control/immediate_control_board_impl.h
@@ -18,8 +18,8 @@ public:
void RestoreDefaults();
- void RestoreDefault(TString name);
-
+ void RestoreDefault(TString name);
+
bool SetValue(TString name, TAtomic value, TAtomic &outPrevValue);
// Only for tests
diff --git a/ydb/core/driver_lib/cli_base/cli_cmds_db.cpp b/ydb/core/driver_lib/cli_base/cli_cmds_db.cpp
index 0a1e05f2697..450d4135c6c 100644
--- a/ydb/core/driver_lib/cli_base/cli_cmds_db.cpp
+++ b/ydb/core/driver_lib/cli_base/cli_cmds_db.cpp
@@ -1,6 +1,6 @@
#include "cli.h"
#include "cli_cmds.h"
-
+
#include <ydb/core/tx/schemeshard/schemeshard_user_attr_limits.h>
#include <ydb/library/aclib/aclib.h>
@@ -12,10 +12,10 @@
#include <ydb/public/api/grpc/ydb_table_v1.grpc.pb.h>
#include <ydb/public/sdk/cpp/client/ydb_table/table.h>
-
+
#include <util/generic/hash.h>
#include <util/string/split.h>
-#include <util/string/join.h>
+#include <util/string/join.h>
#include <util/string/printf.h>
namespace NKikimr {
@@ -466,8 +466,8 @@ public:
type = "<dir>";
break;
case NKikimrSchemeOp::EPathTypeSubDomain:
- type = "<database>";
- break;
+ type = "<database>";
+ break;
case NKikimrSchemeOp::EPathTypeTable:
type = "<table>";
break;
@@ -803,124 +803,124 @@ public:
}
};
-class TClientCommandSchemaTableOptions : public TClientCommand {
-public:
+class TClientCommandSchemaTableOptions : public TClientCommand {
+public:
NGrpc::TGRpcClientConfig ClientConfig;
-
- TClientCommandSchemaTableOptions()
- : TClientCommand("options", {}, "Describe table options")
- {}
-
- virtual void Config(TConfig& config) override {
- TClientCommand::Config(config);
- }
-
- virtual void Parse(TConfig& config) override {
- TClientCommand::Parse(config);
-
+
+ TClientCommandSchemaTableOptions()
+ : TClientCommand("options", {}, "Describe table options")
+ {}
+
+ virtual void Config(TConfig& config) override {
+ TClientCommand::Config(config);
+ }
+
+ virtual void Parse(TConfig& config) override {
+ TClientCommand::Parse(config);
+
if (CommandConfig.ClientConfig.Defined()) {
auto *p = std::get_if<NGrpc::TGRpcClientConfig>(&CommandConfig.ClientConfig.GetRef());
- if (p) {
- ClientConfig.Locator = p->Locator;
- ClientConfig.Timeout = p->Timeout;
- ClientConfig.MaxMessageSize = p->MaxMessageSize;
- ClientConfig.MaxInFlight = p->MaxInFlight;
+ if (p) {
+ ClientConfig.Locator = p->Locator;
+ ClientConfig.Timeout = p->Timeout;
+ ClientConfig.MaxMessageSize = p->MaxMessageSize;
+ ClientConfig.MaxInFlight = p->MaxInFlight;
ClientConfig.EnableSsl = p->EnableSsl;
ClientConfig.SslCaCert = p->SslCaCert;
- }
- }
- }
-
- template<typename T>
- void PrintLabels(const T &rec) {
- for (auto &pr : rec.labels())
- Cout << " " << pr.first << ": " << pr.second << Endl;
- }
-
- template<typename T>
- void PrintPolicies(const T &array) {
- for (auto &policy : array) {
- Cout << " - " << policy.name() << Endl;
- PrintLabels(policy);
- }
- }
-
- virtual int Run(TConfig& config) override {
- int res = 0;
-
- if (!ClientConfig.Locator) {
- Cerr << "GRPC call error: GRPC server is not specified (MBus protocol is not supported for this command)." << Endl;
- return -2;
- }
-
+ }
+ }
+ }
+
+ template<typename T>
+ void PrintLabels(const T &rec) {
+ for (auto &pr : rec.labels())
+ Cout << " " << pr.first << ": " << pr.second << Endl;
+ }
+
+ template<typename T>
+ void PrintPolicies(const T &array) {
+ for (auto &policy : array) {
+ Cout << " - " << policy.name() << Endl;
+ PrintLabels(policy);
+ }
+ }
+
+ virtual int Run(TConfig& config) override {
+ int res = 0;
+
+ if (!ClientConfig.Locator) {
+ Cerr << "GRPC call error: GRPC server is not specified (MBus protocol is not supported for this command)." << Endl;
+ return -2;
+ }
+
NGrpc::TCallMeta meta;
if (config.SecurityToken) {
meta.Aux.push_back({NYdb::YDB_AUTH_TICKET_HEADER, config.SecurityToken});
}
- Ydb::Operations::Operation response;
+ Ydb::Operations::Operation response;
NGrpc::TResponseCallback<Ydb::Table::DescribeTableOptionsResponse> responseCb =
[&res, &response](NGrpc::TGrpcStatus &&grpcStatus, Ydb::Table::DescribeTableOptionsResponse &&resp) -> void {
- res = (int)grpcStatus.GRpcStatusCode;
- if (!res) {
- response.CopyFrom(resp.operation());
- } else {
- Cerr << "GRPC call error: " << grpcStatus.Msg << Endl;
- }
- };
-
- {
+ res = (int)grpcStatus.GRpcStatusCode;
+ if (!res) {
+ response.CopyFrom(resp.operation());
+ } else {
+ Cerr << "GRPC call error: " << grpcStatus.Msg << Endl;
+ }
+ };
+
+ {
NGrpc::TGRpcClientLow clientLow;
- Ydb::Table::DescribeTableOptionsRequest request;
+ Ydb::Table::DescribeTableOptionsRequest request;
auto connection = clientLow.CreateGRpcServiceConnection<Ydb::Table::V1::TableService>(ClientConfig);
connection->DoRequest(request, std::move(responseCb), &Ydb::Table::V1::TableService::Stub::AsyncDescribeTableOptions, meta);
- }
-
- if (!res) {
- Y_VERIFY(response.ready());
- if (response.status() == Ydb::StatusIds::SUCCESS) {
- Ydb::Table::DescribeTableOptionsResult result;
- response.result().UnpackTo(&result);
- Cout << "Table profiles" << Endl;
- for (auto &profile : result.table_profile_presets()) {
- Cout << " - " << profile.name() << Endl
- << " Compaction policy: " << profile.default_compaction_policy() << Endl
- << " Execution policy: " << profile.default_execution_policy() << Endl
- << " Partitioning policy: " << profile.default_partitioning_policy() << Endl
- << " Storage policy: " << profile.default_storage_policy() << Endl
- << " Replication policy: " << profile.default_replication_policy() << Endl
- << " Caching policy: " << profile.default_caching_policy() << Endl
- << " Allowed compaction policies: " << JoinSeq(", ", profile.allowed_compaction_policies()) << Endl
- << " Allowed execution policies: " << JoinSeq(", ", profile.allowed_execution_policies()) << Endl
- << " Allowed partitioning policies: " << JoinSeq(", ", profile.allowed_partitioning_policies()) << Endl
- << " Allowed storage policies: " << JoinSeq(", ", profile.allowed_storage_policies()) << Endl
- << " Allowed replication policies: " << JoinSeq(", ", profile.allowed_replication_policies()) << Endl
- << " Allowed caching policies: " << JoinSeq(", ", profile.allowed_caching_policies()) << Endl;
- PrintLabels(profile);
- }
- Cout << "Compaction policies" << Endl;
- PrintPolicies(result.compaction_policy_presets());
- Cout << "Execution policies" << Endl;
- PrintPolicies(result.execution_policy_presets());
- Cout << "Partitioning policies" << Endl;
- PrintPolicies(result.partitioning_policy_presets());
- Cout << "Storage policies" << Endl;
- PrintPolicies(result.storage_policy_presets());
- Cout << "Replication policies" << Endl;
- PrintPolicies(result.replication_policy_presets());
- Cout << "Caching policies" << Endl;
- PrintPolicies(result.caching_policy_presets());
- } else {
- Cerr << "ERROR: " << response.status() << Endl;
- for (auto &issue : response.issues())
- Cerr << issue.message() << Endl;
- }
- }
-
- return res;
- }
-};
-
+ }
+
+ if (!res) {
+ Y_VERIFY(response.ready());
+ if (response.status() == Ydb::StatusIds::SUCCESS) {
+ Ydb::Table::DescribeTableOptionsResult result;
+ response.result().UnpackTo(&result);
+ Cout << "Table profiles" << Endl;
+ for (auto &profile : result.table_profile_presets()) {
+ Cout << " - " << profile.name() << Endl
+ << " Compaction policy: " << profile.default_compaction_policy() << Endl
+ << " Execution policy: " << profile.default_execution_policy() << Endl
+ << " Partitioning policy: " << profile.default_partitioning_policy() << Endl
+ << " Storage policy: " << profile.default_storage_policy() << Endl
+ << " Replication policy: " << profile.default_replication_policy() << Endl
+ << " Caching policy: " << profile.default_caching_policy() << Endl
+ << " Allowed compaction policies: " << JoinSeq(", ", profile.allowed_compaction_policies()) << Endl
+ << " Allowed execution policies: " << JoinSeq(", ", profile.allowed_execution_policies()) << Endl
+ << " Allowed partitioning policies: " << JoinSeq(", ", profile.allowed_partitioning_policies()) << Endl
+ << " Allowed storage policies: " << JoinSeq(", ", profile.allowed_storage_policies()) << Endl
+ << " Allowed replication policies: " << JoinSeq(", ", profile.allowed_replication_policies()) << Endl
+ << " Allowed caching policies: " << JoinSeq(", ", profile.allowed_caching_policies()) << Endl;
+ PrintLabels(profile);
+ }
+ Cout << "Compaction policies" << Endl;
+ PrintPolicies(result.compaction_policy_presets());
+ Cout << "Execution policies" << Endl;
+ PrintPolicies(result.execution_policy_presets());
+ Cout << "Partitioning policies" << Endl;
+ PrintPolicies(result.partitioning_policy_presets());
+ Cout << "Storage policies" << Endl;
+ PrintPolicies(result.storage_policy_presets());
+ Cout << "Replication policies" << Endl;
+ PrintPolicies(result.replication_policy_presets());
+ Cout << "Caching policies" << Endl;
+ PrintPolicies(result.caching_policy_presets());
+ } else {
+ Cerr << "ERROR: " << response.status() << Endl;
+ for (auto &issue : response.issues())
+ Cerr << issue.message() << Endl;
+ }
+ }
+
+ return res;
+ }
+};
+
class TClientCommandSchemaTableCopy : public TClientCommand {
public:
NGrpc::TGRpcClientConfig ClientConfig;
@@ -1009,16 +1009,16 @@ public:
}
};
-class TClientCommandSchemaTable : public TClientCommandTree {
-public:
- TClientCommandSchemaTable()
- : TClientCommandTree("table", {}, "Table operations")
- {
+class TClientCommandSchemaTable : public TClientCommandTree {
+public:
+ TClientCommandSchemaTable()
+ : TClientCommandTree("table", {}, "Table operations")
+ {
AddCommand(std::make_unique<TClientCommandSchemaTableOptions>());
AddCommand(std::make_unique<TClientCommandSchemaTableCopy>());
- }
-};
-
+ }
+};
+
class TClientCommandSchemaUserAttributeGet: public TClientCommand {
public:
TClientCommandSchemaUserAttributeGet()
diff --git a/ydb/core/driver_lib/cli_utils/cli_cmds.h b/ydb/core/driver_lib/cli_utils/cli_cmds.h
index 46abb6c867e..b25db5a7be7 100644
--- a/ydb/core/driver_lib/cli_utils/cli_cmds.h
+++ b/ydb/core/driver_lib/cli_utils/cli_cmds.h
@@ -31,20 +31,20 @@ public:
TClientCommandNode();
};
-class TClientCommandTenant : public TClientCommandTree {
-public:
- TClientCommandTenant();
-};
-
-class TClientCommandConsole : public TClientCommandTree {
-public:
- TClientCommandConsole();
-};
-
-class TClientCommandCms : public TClientCommandTree {
-public:
- TClientCommandCms();
-};
-
+class TClientCommandTenant : public TClientCommandTree {
+public:
+ TClientCommandTenant();
+};
+
+class TClientCommandConsole : public TClientCommandTree {
+public:
+ TClientCommandConsole();
+};
+
+class TClientCommandCms : public TClientCommandTree {
+public:
+ TClientCommandCms();
+};
+
}
}
diff --git a/ydb/core/driver_lib/cli_utils/cli_cmds_cms.cpp b/ydb/core/driver_lib/cli_utils/cli_cmds_cms.cpp
index 9d506dba0f7..8d8e54af65f 100644
--- a/ydb/core/driver_lib/cli_utils/cli_cmds_cms.cpp
+++ b/ydb/core/driver_lib/cli_utils/cli_cmds_cms.cpp
@@ -1,52 +1,52 @@
-#include "cli.h"
-#include "cli_cmds.h"
-
+#include "cli.h"
+#include "cli_cmds.h"
+
#include <ydb/library/aclib/aclib.h>
-
+
#include <util/string/split.h>
-#include <util/string/join.h>
-#include <util/string/printf.h>
-
-namespace NKikimr {
-namespace NDriverClient {
-
+#include <util/string/join.h>
+#include <util/string/printf.h>
+
+namespace NKikimr {
+namespace NDriverClient {
+
class TCmsClientCommand : public TClientCommandConfig {
-public:
- TString Domain;
- NKikimrClient::TCmsRequest Request;
-
- TCmsClientCommand(const TString &name,
- const std::initializer_list<TString> &aliases,
- const TString &description)
+public:
+ TString Domain;
+ NKikimrClient::TCmsRequest Request;
+
+ TCmsClientCommand(const TString &name,
+ const std::initializer_list<TString> &aliases,
+ const TString &description)
: TClientCommandConfig(name, aliases, description)
- {
- }
-
- void Config(TConfig &config) override
- {
- TClientCommand::Config(config);
-
- Domain = "";
-
- config.Opts->AddLongOption("domain", "Set target domain (required for clusters with multiple domains)")
- .RequiredArgument("NAME").StoreResult(&Domain);
- }
-
- void Parse(TConfig& config) override
- {
- TClientCommand::Parse(config);
-
- if (Domain)
- Request.SetDomainName(Domain);
- }
-
- int Run(TConfig &config) override
- {
- TAutoPtr<NMsgBusProxy::TBusCmsRequest> request(new NMsgBusProxy::TBusCmsRequest);
- request->Record.CopyFrom(Request);
-
- auto handler = [this](const NMsgBusProxy::TBusCmsResponse &response) -> int {
- auto &rec = response.Record;
+ {
+ }
+
+ void Config(TConfig &config) override
+ {
+ TClientCommand::Config(config);
+
+ Domain = "";
+
+ config.Opts->AddLongOption("domain", "Set target domain (required for clusters with multiple domains)")
+ .RequiredArgument("NAME").StoreResult(&Domain);
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TClientCommand::Parse(config);
+
+ if (Domain)
+ Request.SetDomainName(Domain);
+ }
+
+ int Run(TConfig &config) override
+ {
+ TAutoPtr<NMsgBusProxy::TBusCmsRequest> request(new NMsgBusProxy::TBusCmsRequest);
+ request->Record.CopyFrom(Request);
+
+ auto handler = [this](const NMsgBusProxy::TBusCmsResponse &response) -> int {
+ auto &rec = response.Record;
switch (rec.GetStatus().GetCode()) {
case NKikimrCms::TStatus::OK:
case NKikimrCms::TStatus::ALLOW:
@@ -54,25 +54,25 @@ public:
PrintOkResponse(rec);
return 0;
default:
- PrintErrorResponse(rec);
- return 1;
- }
- };
-
- int result = MessageBusCall<NMsgBusProxy::TBusCmsRequest,
- NMsgBusProxy::TBusCmsResponse>(config, request, handler);
- return result;
- }
-
- virtual void PrintErrorResponse(const NKikimrClient::TCmsResponse &response)
- {
+ PrintErrorResponse(rec);
+ return 1;
+ }
+ };
+
+ int result = MessageBusCall<NMsgBusProxy::TBusCmsRequest,
+ NMsgBusProxy::TBusCmsResponse>(config, request, handler);
+ return result;
+ }
+
+ virtual void PrintErrorResponse(const NKikimrClient::TCmsResponse &response)
+ {
PrintResponse(response);
- }
-
- virtual void PrintOkResponse(const NKikimrClient::TCmsResponse &response)
- {
+ }
+
+ virtual void PrintOkResponse(const NKikimrClient::TCmsResponse &response)
+ {
PrintResponse(response);
- }
+ }
void PrintResponse(const NKikimrClient::TCmsResponse &response)
{
@@ -82,291 +82,291 @@ public:
Cerr << issues << Endl;
}
}
-};
-
-class TClientCommandState : public TCmsClientCommand {
-public:
+};
+
+class TClientCommandState : public TCmsClientCommand {
+public:
TVector<TString> Hosts;
-
- TClientCommandState()
- : TCmsClientCommand("state", {}, "Get cluster state")
- {
- }
-
- void Config(TConfig &config) override
- {
- TCmsClientCommand::Config(config);
-
- config.Opts->AddLongOption("host", "Get state for specified host(s)")
- .RequiredArgument("NAME").AppendTo(&Hosts);
+
+ TClientCommandState()
+ : TCmsClientCommand("state", {}, "Get cluster state")
+ {
+ }
+
+ void Config(TConfig &config) override
+ {
+ TCmsClientCommand::Config(config);
+
+ config.Opts->AddLongOption("host", "Get state for specified host(s)")
+ .RequiredArgument("NAME").AppendTo(&Hosts);
config.SetFreeArgsNum(0);
- }
-
- void Parse(TConfig& config) override
- {
- TCmsClientCommand::Parse(config);
-
- auto &rec = *Request.MutableClusterStateRequest();
- for (auto &host : Hosts)
- *rec.AddHosts() = host;
- }
-
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TCmsClientCommand::Parse(config);
+
+ auto &rec = *Request.MutableClusterStateRequest();
+ for (auto &host : Hosts)
+ *rec.AddHosts() = host;
+ }
+
void PrintOkResponse(const NKikimrClient::TCmsResponse &response) override
- {
- auto &state = response.GetClusterStateResponse().GetState();
-
+ {
+ auto &state = response.GetClusterStateResponse().GetState();
+
TInstant timestamp = TInstant::MicroSeconds(state.GetTimestamp());
- Cout << "Cluster state at " << timestamp.ToStringLocalUpToSeconds() << Endl;
-
+ Cout << "Cluster state at " << timestamp.ToStringLocalUpToSeconds() << Endl;
+
TMultiMap<TString, const NKikimrCms::THostState*> hosts;
- for (auto &host : state.GetHosts())
- hosts.emplace(host.GetName(), &host);
-
- for (auto &pr : hosts)
- PrintHost(*pr.second);
- }
-
- void PrintHost(const NKikimrCms::THostState &host)
- {
- Cout << "Host " << host.GetName() << ":" << host.GetInterconnectPort()
- << " (" << host.GetNodeId() << ")"
- << " is " << host.GetState() << Endl;
-
- if (host.MarkersSize()) {
- TVector<NKikimrCms::EMarker> markers;
- for (size_t i = 0; i < host.MarkersSize(); ++i)
- markers.push_back(host.GetMarkers(i));
- Cout << " Markers: " << JoinSeq(", ", markers) << Endl;
- }
-
+ for (auto &host : state.GetHosts())
+ hosts.emplace(host.GetName(), &host);
+
+ for (auto &pr : hosts)
+ PrintHost(*pr.second);
+ }
+
+ void PrintHost(const NKikimrCms::THostState &host)
+ {
+ Cout << "Host " << host.GetName() << ":" << host.GetInterconnectPort()
+ << " (" << host.GetNodeId() << ")"
+ << " is " << host.GetState() << Endl;
+
+ if (host.MarkersSize()) {
+ TVector<NKikimrCms::EMarker> markers;
+ for (size_t i = 0; i < host.MarkersSize(); ++i)
+ markers.push_back(host.GetMarkers(i));
+ Cout << " Markers: " << JoinSeq(", ", markers) << Endl;
+ }
+
TMultiMap<TString, const NKikimrCms::TServiceState*> services;
- for (auto &service : host.GetServices())
- services.emplace(service.GetName(), &service);
-
- for (auto &pr : services)
- PrintService(*pr.second);
-
+ for (auto &service : host.GetServices())
+ services.emplace(service.GetName(), &service);
+
+ for (auto &pr : services)
+ PrintService(*pr.second);
+
TMultiMap<TString, const NKikimrCms::TDeviceState*> devices;
- for (auto &device : host.GetDevices())
- devices.emplace(device.GetName(), &device);
-
- for (auto &pr : devices)
- PrintDevice(*pr.second);
- }
-
- void PrintDevice(const NKikimrCms::TDeviceState &device)
- {
- Cout << " Device " << device.GetName() << " is " << device.GetState() << Endl;
- if (device.MarkersSize()) {
- TVector<NKikimrCms::EMarker> markers;
- for (size_t i = 0; i < device.MarkersSize(); ++i)
- markers.push_back(device.GetMarkers(i));
- Cout << " Markers: " << JoinSeq(", ", markers) << Endl;
- }
- }
-
- void PrintService(const NKikimrCms::TServiceState &service)
- {
- Cout << " Service " << service.GetName() << " is " << service.GetState() << Endl;
- }
-};
-
-class TClientCommandManageRequest : public TCmsClientCommand
-{
-public:
- NKikimrCms::TManageRequestRequest::ECommand Command;
- TString User;
- bool DryRun;
- bool HasId;
-
- TClientCommandManageRequest(const TString &name,
- const std::initializer_list<TString> &aliases,
- const TString &description,
- NKikimrCms::TManageRequestRequest::ECommand cmd,
- bool hasId)
- : TCmsClientCommand(name, aliases, description)
- , Command(cmd)
- , HasId(hasId)
- {
- }
-
- void Config(TConfig &config) override
- {
- TCmsClientCommand::Config(config);
-
- User = "";
- DryRun = false;
-
- config.Opts->AddLongOption("user", "User name").Required()
- .RequiredArgument("NAME").StoreResult(&User);
- if (HasId) {
+ for (auto &device : host.GetDevices())
+ devices.emplace(device.GetName(), &device);
+
+ for (auto &pr : devices)
+ PrintDevice(*pr.second);
+ }
+
+ void PrintDevice(const NKikimrCms::TDeviceState &device)
+ {
+ Cout << " Device " << device.GetName() << " is " << device.GetState() << Endl;
+ if (device.MarkersSize()) {
+ TVector<NKikimrCms::EMarker> markers;
+ for (size_t i = 0; i < device.MarkersSize(); ++i)
+ markers.push_back(device.GetMarkers(i));
+ Cout << " Markers: " << JoinSeq(", ", markers) << Endl;
+ }
+ }
+
+ void PrintService(const NKikimrCms::TServiceState &service)
+ {
+ Cout << " Service " << service.GetName() << " is " << service.GetState() << Endl;
+ }
+};
+
+class TClientCommandManageRequest : public TCmsClientCommand
+{
+public:
+ NKikimrCms::TManageRequestRequest::ECommand Command;
+ TString User;
+ bool DryRun;
+ bool HasId;
+
+ TClientCommandManageRequest(const TString &name,
+ const std::initializer_list<TString> &aliases,
+ const TString &description,
+ NKikimrCms::TManageRequestRequest::ECommand cmd,
+ bool hasId)
+ : TCmsClientCommand(name, aliases, description)
+ , Command(cmd)
+ , HasId(hasId)
+ {
+ }
+
+ void Config(TConfig &config) override
+ {
+ TCmsClientCommand::Config(config);
+
+ User = "";
+ DryRun = false;
+
+ config.Opts->AddLongOption("user", "User name").Required()
+ .RequiredArgument("NAME").StoreResult(&User);
+ if (HasId) {
config.SetFreeArgsNum(1);
SetFreeArgTitle(0, "<ID>", "Request ID");
- } else {
+ } else {
config.SetFreeArgsNum(0);
- }
- config.Opts->AddLongOption("dry", "Dry run").NoArgument().SetFlag(&DryRun);
- }
-
- void Parse(TConfig& config) override
- {
- TCmsClientCommand::Parse(config);
-
- auto &rec = *Request.MutableManageRequestRequest();
- rec.SetUser(User);
- rec.SetCommand(Command);
- if (HasId)
- rec.SetRequestId(config.ParseResult->GetFreeArgs()[0]);
- if (DryRun)
- rec.SetDryRun(DryRun);
- }
-};
-
-class TClientCommandGetRequest : public TClientCommandManageRequest
-{
-public:
- TClientCommandGetRequest()
- : TClientCommandManageRequest("get", {}, "Get scheduled request",
- NKikimrCms::TManageRequestRequest::GET, true)
- {
- }
-};
-
-class TClientCommandListRequest : public TClientCommandManageRequest
-{
-public:
- TClientCommandListRequest()
- : TClientCommandManageRequest("list", {}, "List scheduled requests",
- NKikimrCms::TManageRequestRequest::LIST, false)
- {
- }
-};
-
-class TClientCommandRejectRequest : public TClientCommandManageRequest
-{
-public:
- TClientCommandRejectRequest()
- : TClientCommandManageRequest("reject", {}, "Reject scheduled request",
- NKikimrCms::TManageRequestRequest::REJECT, true)
- {
- }
-};
-
-class TClientCommandCheckRequest : public TCmsClientCommand
-{
-public:
- TString User;
- TString Id;
- bool DryRun;
- bool HasId;
-
- TClientCommandCheckRequest()
- : TCmsClientCommand("check", {}, "check scheduled request")
- {
- }
-
- void Config(TConfig &config) override
- {
- TCmsClientCommand::Config(config);
-
- User = "";
- DryRun = false;
-
- config.Opts->AddLongOption("user", "User name").Required()
- .RequiredArgument("NAME").StoreResult(&User);
+ }
+ config.Opts->AddLongOption("dry", "Dry run").NoArgument().SetFlag(&DryRun);
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TCmsClientCommand::Parse(config);
+
+ auto &rec = *Request.MutableManageRequestRequest();
+ rec.SetUser(User);
+ rec.SetCommand(Command);
+ if (HasId)
+ rec.SetRequestId(config.ParseResult->GetFreeArgs()[0]);
+ if (DryRun)
+ rec.SetDryRun(DryRun);
+ }
+};
+
+class TClientCommandGetRequest : public TClientCommandManageRequest
+{
+public:
+ TClientCommandGetRequest()
+ : TClientCommandManageRequest("get", {}, "Get scheduled request",
+ NKikimrCms::TManageRequestRequest::GET, true)
+ {
+ }
+};
+
+class TClientCommandListRequest : public TClientCommandManageRequest
+{
+public:
+ TClientCommandListRequest()
+ : TClientCommandManageRequest("list", {}, "List scheduled requests",
+ NKikimrCms::TManageRequestRequest::LIST, false)
+ {
+ }
+};
+
+class TClientCommandRejectRequest : public TClientCommandManageRequest
+{
+public:
+ TClientCommandRejectRequest()
+ : TClientCommandManageRequest("reject", {}, "Reject scheduled request",
+ NKikimrCms::TManageRequestRequest::REJECT, true)
+ {
+ }
+};
+
+class TClientCommandCheckRequest : public TCmsClientCommand
+{
+public:
+ TString User;
+ TString Id;
+ bool DryRun;
+ bool HasId;
+
+ TClientCommandCheckRequest()
+ : TCmsClientCommand("check", {}, "check scheduled request")
+ {
+ }
+
+ void Config(TConfig &config) override
+ {
+ TCmsClientCommand::Config(config);
+
+ User = "";
+ DryRun = false;
+
+ config.Opts->AddLongOption("user", "User name").Required()
+ .RequiredArgument("NAME").StoreResult(&User);
config.SetFreeArgsNum(1);
SetFreeArgTitle(0, "<ID>", "Request ID");
- config.Opts->AddLongOption("dry", "Dry run").NoArgument().SetFlag(&DryRun);
- }
-
- void Parse(TConfig& config) override
- {
- TCmsClientCommand::Parse(config);
-
- auto &rec = *Request.MutableCheckRequest();
- rec.SetUser(User);
- rec.SetRequestId(config.ParseResult->GetFreeArgs()[0]);
- if (DryRun)
- rec.SetDryRun(DryRun);
- }
-};
-
-class TClientCommandWithAction : public TCmsClientCommand {
-public:
- enum EFreeField {
+ config.Opts->AddLongOption("dry", "Dry run").NoArgument().SetFlag(&DryRun);
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TCmsClientCommand::Parse(config);
+
+ auto &rec = *Request.MutableCheckRequest();
+ rec.SetUser(User);
+ rec.SetRequestId(config.ParseResult->GetFreeArgs()[0]);
+ if (DryRun)
+ rec.SetDryRun(DryRun);
+ }
+};
+
+class TClientCommandWithAction : public TCmsClientCommand {
+public:
+ enum EFreeField {
FF_TENANT,
- FF_HOST,
- FF_SERVICE,
- FF_DEVICE
- };
-
- TVector<NKikimrCms::TAction> Actions;
- NKikimrCms::TAction::EType Type;
- EFreeField FreeArgField;
- bool HasDuration;
- TString Host;
- ui32 Duration;
-
- TClientCommandWithAction(const TString &description,
- NKikimrCms::TAction::EType type,
- EFreeField freeArgField,
- bool hasDuration)
+ FF_HOST,
+ FF_SERVICE,
+ FF_DEVICE
+ };
+
+ TVector<NKikimrCms::TAction> Actions;
+ NKikimrCms::TAction::EType Type;
+ EFreeField FreeArgField;
+ bool HasDuration;
+ TString Host;
+ ui32 Duration;
+
+ TClientCommandWithAction(const TString &description,
+ NKikimrCms::TAction::EType type,
+ EFreeField freeArgField,
+ bool hasDuration)
: TCmsClientCommand(CommandName(freeArgField), {}, description)
- , Type(type)
- , FreeArgField(freeArgField)
- , HasDuration(hasDuration)
- {
- }
-
- void Config(TConfig &config) override
- {
- TCmsClientCommand::Config(config);
-
- Host = "";
- Duration = 0;
-
+ , Type(type)
+ , FreeArgField(freeArgField)
+ , HasDuration(hasDuration)
+ {
+ }
+
+ void Config(TConfig &config) override
+ {
+ TCmsClientCommand::Config(config);
+
+ Host = "";
+ Duration = 0;
+
if (FreeArgField == FF_SERVICE || FreeArgField == FF_DEVICE)
- config.Opts->AddLongOption("host", "Host name").Required()
- .RequiredArgument("NAME").StoreResult(&Host);
- if (HasDuration)
- config.Opts->AddLongOption("duration", "Action duration in minutes")
- .Required().RequiredArgument("NUM").StoreResult(&Duration);
+ config.Opts->AddLongOption("host", "Host name").Required()
+ .RequiredArgument("NAME").StoreResult(&Host);
+ if (HasDuration)
+ config.Opts->AddLongOption("duration", "Action duration in minutes")
+ .Required().RequiredArgument("NUM").StoreResult(&Duration);
config.SetFreeArgsMin(1);
config.Opts->SetFreeArgDefaultTitle("<NAME>", FreeArgDescr(FreeArgField));
- }
-
- void Parse(TConfig& config) override
- {
- TCmsClientCommand::Parse(config);
-
- for (auto &param : config.ParseResult->GetFreeArgs()) {
- Actions.emplace_back();
- auto &action = Actions.back();
- action.SetType(Type);
- if (Host)
- action.SetHost(Host);
- if (param) {
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TCmsClientCommand::Parse(config);
+
+ for (auto &param : config.ParseResult->GetFreeArgs()) {
+ Actions.emplace_back();
+ auto &action = Actions.back();
+ action.SetType(Type);
+ if (Host)
+ action.SetHost(Host);
+ if (param) {
switch (FreeArgField) {
case FF_TENANT:
action.SetTenant(param);
break;
case FF_HOST:
- action.SetHost(param);
+ action.SetHost(param);
break;
case FF_SERVICE:
*action.AddServices() = param;
break;
case FF_DEVICE:
- *action.AddDevices() = param;
+ *action.AddDevices() = param;
break;
default:
Y_FAIL("Unknown free arg field");
}
- }
- if (Duration)
- action.SetDuration(TDuration::Minutes(Duration).GetValue());
- }
- }
+ }
+ if (Duration)
+ action.SetDuration(TDuration::Minutes(Duration).GetValue());
+ }
+ }
private:
static TString CommandName(EFreeField freeArgField) {
@@ -398,83 +398,83 @@ private:
Y_FAIL("Unknown free arg field");
}
}
-};
-
-class TClientCommandMakeRequest : public TClientCommandWithAction {
-public:
- TString User;
- TString Reason;
- bool DryRun;
- bool Schedule;
- bool AllowPartial;
- ui32 Hours;
- ui32 Minutes;
- TString TenantPolicy;
+};
+
+class TClientCommandMakeRequest : public TClientCommandWithAction {
+public:
+ TString User;
+ TString Reason;
+ bool DryRun;
+ bool Schedule;
+ bool AllowPartial;
+ ui32 Hours;
+ ui32 Minutes;
+ TString TenantPolicy;
TString AvailabilityMode;
-
- TClientCommandMakeRequest(const TString &description,
- NKikimrCms::TAction::EType type,
- EFreeField freeArgField,
- bool hasDuration)
- : TClientCommandWithAction(description, type, freeArgField, hasDuration)
- {
- }
-
- void Config(TConfig &config) override
- {
- TClientCommandWithAction::Config(config);
-
- User = "";
- Reason = "";
- DryRun = false;
- Schedule = false;
- AllowPartial = false;
- Hours = 0;
- Minutes = 0;
-
- config.Opts->AddLongOption("user", "User name").Required()
- .RequiredArgument("NAME").StoreResult(&User);
- config.Opts->AddLongOption("dry", "Dry run").NoArgument().SetFlag(&DryRun);
- config.Opts->AddLongOption("reason", "Informational request description")
- .RequiredArgument("STRING").StoreResult(&Reason);
- config.Opts->AddLongOption("schedule", "Schedule action in CMS if it's disallowed right now")
- .NoArgument().SetFlag(&Schedule);
- config.Opts->AddLongOption("hours", "Permission duration")
- .RequiredArgument("NUM").StoreResult(&Hours);
- config.Opts->AddLongOption("minutes", "Permission duration")
- .RequiredArgument("NUM").StoreResult(&Minutes);
- config.Opts->AddLongOption("tenant-policy", "Policy for computation node restart")
- .RequiredArgument("none|default").StoreResult(&TenantPolicy);
- config.Opts->AddLongOption("allow-partial", "Allow partial permission")
- .NoArgument().SetFlag(&AllowPartial);
+
+ TClientCommandMakeRequest(const TString &description,
+ NKikimrCms::TAction::EType type,
+ EFreeField freeArgField,
+ bool hasDuration)
+ : TClientCommandWithAction(description, type, freeArgField, hasDuration)
+ {
+ }
+
+ void Config(TConfig &config) override
+ {
+ TClientCommandWithAction::Config(config);
+
+ User = "";
+ Reason = "";
+ DryRun = false;
+ Schedule = false;
+ AllowPartial = false;
+ Hours = 0;
+ Minutes = 0;
+
+ config.Opts->AddLongOption("user", "User name").Required()
+ .RequiredArgument("NAME").StoreResult(&User);
+ config.Opts->AddLongOption("dry", "Dry run").NoArgument().SetFlag(&DryRun);
+ config.Opts->AddLongOption("reason", "Informational request description")
+ .RequiredArgument("STRING").StoreResult(&Reason);
+ config.Opts->AddLongOption("schedule", "Schedule action in CMS if it's disallowed right now")
+ .NoArgument().SetFlag(&Schedule);
+ config.Opts->AddLongOption("hours", "Permission duration")
+ .RequiredArgument("NUM").StoreResult(&Hours);
+ config.Opts->AddLongOption("minutes", "Permission duration")
+ .RequiredArgument("NUM").StoreResult(&Minutes);
+ config.Opts->AddLongOption("tenant-policy", "Policy for computation node restart")
+ .RequiredArgument("none|default").StoreResult(&TenantPolicy);
+ config.Opts->AddLongOption("allow-partial", "Allow partial permission")
+ .NoArgument().SetFlag(&AllowPartial);
config.Opts->AddLongOption("availability-mode", "Availability mode")
.RequiredArgument("max|keep|force").DefaultValue("max").StoreResult(&AvailabilityMode);
- }
-
- void Parse(TConfig& config) override
- {
- TClientCommandWithAction::Parse(config);
-
- auto &rec = *Request.MutablePermissionRequest();
- for (auto &action : Actions)
- rec.AddActions()->CopyFrom(action);
- rec.SetUser(User);
- if (DryRun)
- rec.SetDryRun(DryRun);
- if (Reason)
- rec.SetReason(Reason);
- if (Schedule)
- rec.SetSchedule(Schedule);
- if (AllowPartial)
- rec.SetPartialPermissionAllowed(AllowPartial);
- if (TenantPolicy) {
- if (TenantPolicy == "none")
- rec.SetTenantPolicy(NKikimrCms::NONE);
- else if (TenantPolicy == "default")
- rec.SetTenantPolicy(NKikimrCms::DEFAULT);
- else
- ythrow yexception() << "unknown tenant policy '" << TenantPolicy << "'";
- }
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TClientCommandWithAction::Parse(config);
+
+ auto &rec = *Request.MutablePermissionRequest();
+ for (auto &action : Actions)
+ rec.AddActions()->CopyFrom(action);
+ rec.SetUser(User);
+ if (DryRun)
+ rec.SetDryRun(DryRun);
+ if (Reason)
+ rec.SetReason(Reason);
+ if (Schedule)
+ rec.SetSchedule(Schedule);
+ if (AllowPartial)
+ rec.SetPartialPermissionAllowed(AllowPartial);
+ if (TenantPolicy) {
+ if (TenantPolicy == "none")
+ rec.SetTenantPolicy(NKikimrCms::NONE);
+ else if (TenantPolicy == "default")
+ rec.SetTenantPolicy(NKikimrCms::DEFAULT);
+ else
+ ythrow yexception() << "unknown tenant policy '" << TenantPolicy << "'";
+ }
if (AvailabilityMode) {
if (AvailabilityMode == "max")
rec.SetAvailabilityMode(NKikimrCms::MODE_MAX_AVAILABILITY);
@@ -485,686 +485,686 @@ public:
else
ythrow yexception() << "unknown availability mode '" << AvailabilityMode << "'";
}
- if (Hours || Minutes) {
- auto duration = TDuration::Minutes(Minutes) + TDuration::Hours(Hours);
- rec.SetDuration(duration.GetValue());
- }
- }
-};
-
-class TClientCommandSingleRequest : public TClientCommandTree {
-public:
- TClientCommandSingleRequest(const TString &name,
- const TString &description,
- const TString &requestDescription,
- NKikimrCms::TAction::EType type,
- TClientCommandWithAction::EFreeField freeArgField,
- bool hasDuration)
+ if (Hours || Minutes) {
+ auto duration = TDuration::Minutes(Minutes) + TDuration::Hours(Hours);
+ rec.SetDuration(duration.GetValue());
+ }
+ }
+};
+
+class TClientCommandSingleRequest : public TClientCommandTree {
+public:
+ TClientCommandSingleRequest(const TString &name,
+ const TString &description,
+ const TString &requestDescription,
+ NKikimrCms::TAction::EType type,
+ TClientCommandWithAction::EFreeField freeArgField,
+ bool hasDuration)
: TClientCommandTree(name, {}, description)
- {
+ {
AddCommand(std::make_unique<TClientCommandMakeRequest>(requestDescription, type, freeArgField, hasDuration));
- }
-};
-
-class TClientCommandAddRequest : public TClientCommandTree {
-public:
- TClientCommandAddRequest()
- : TClientCommandTree("add", {}, "")
- {
+ }
+};
+
+class TClientCommandAddRequest : public TClientCommandTree {
+public:
+ TClientCommandAddRequest()
+ : TClientCommandTree("add", {}, "")
+ {
AddCommand(std::make_unique<TClientCommandMakeRequest>("Ask for permission to add host",
- NKikimrCms::TAction::ADD_HOST,
- TClientCommandWithAction::FF_HOST,
- false));
+ NKikimrCms::TAction::ADD_HOST,
+ TClientCommandWithAction::FF_HOST,
+ false));
AddCommand(std::make_unique<TClientCommandMakeRequest>("Ask for permission to add device",
- NKikimrCms::TAction::ADD_DEVICES,
- TClientCommandWithAction::FF_DEVICE,
- false));
- }
-};
-
-class TClientCommandRestartRequest : public TClientCommandTree {
-public:
- TClientCommandRestartRequest()
- : TClientCommandTree("restart", {}, "")
- {
+ NKikimrCms::TAction::ADD_DEVICES,
+ TClientCommandWithAction::FF_DEVICE,
+ false));
+ }
+};
+
+class TClientCommandRestartRequest : public TClientCommandTree {
+public:
+ TClientCommandRestartRequest()
+ : TClientCommandTree("restart", {}, "")
+ {
AddCommand(std::make_unique<TClientCommandMakeRequest>("Ask for permission to restart service",
- NKikimrCms::TAction::RESTART_SERVICES,
- TClientCommandWithAction::FF_SERVICE,
- true));
+ NKikimrCms::TAction::RESTART_SERVICES,
+ TClientCommandWithAction::FF_SERVICE,
+ true));
AddCommand(std::make_unique<TClientCommandMakeRequest>("Ask for permission to restart host",
- NKikimrCms::TAction::SHUTDOWN_HOST,
- TClientCommandWithAction::FF_HOST,
- true));
+ NKikimrCms::TAction::SHUTDOWN_HOST,
+ TClientCommandWithAction::FF_HOST,
+ true));
AddCommand(std::make_unique<TClientCommandMakeRequest>("Ask for permission to restart tenant's hosts",
NKikimrCms::TAction::SHUTDOWN_HOST,
TClientCommandWithAction::FF_TENANT,
true));
- }
-};
-
-class TClientCommandRequest : public TClientCommandTree
-{
-public:
- TClientCommandRequest()
- : TClientCommandTree("request", {}, "Make and manage permission requests")
- {
+ }
+};
+
+class TClientCommandRequest : public TClientCommandTree
+{
+public:
+ TClientCommandRequest()
+ : TClientCommandTree("request", {}, "Make and manage permission requests")
+ {
//AddCommand(std::make_unique<TClientCommandSingleRequest>("start", "", "Ask for permission to start service",
- // NKikimrCms::TAction::START_SERVICES,
- // TClientCommandWithAction::FF_SERVICE,
- // false));
+ // NKikimrCms::TAction::START_SERVICES,
+ // TClientCommandWithAction::FF_SERVICE,
+ // false));
//AddCommand(std::make_unique<TClientCommandSingleRequest>("stop", "", "Ask for permission to stop service",
- // NKikimrCms::TAction::STOP_SERVICES,
- // TClientCommandWithAction::FF_SERVICE,
- // false));
+ // NKikimrCms::TAction::STOP_SERVICES,
+ // TClientCommandWithAction::FF_SERVICE,
+ // false));
//AddCommand(std::make_unique<TClientCommandSingleRequest>("decommission", "", "Ask for permission to decommission host",
- // NKikimrCms::TAction::DECOMMISSION_HOST,
- // TClientCommandWithAction::FF_HOST,
- // false));
+ // NKikimrCms::TAction::DECOMMISSION_HOST,
+ // TClientCommandWithAction::FF_HOST,
+ // false));
AddCommand(std::make_unique<TClientCommandSingleRequest>("replace", "", "Ask for permission to replace device",
- NKikimrCms::TAction::REPLACE_DEVICES,
- TClientCommandWithAction::FF_DEVICE,
- true));
+ NKikimrCms::TAction::REPLACE_DEVICES,
+ TClientCommandWithAction::FF_DEVICE,
+ true));
//AddCommand(std::make_unique<TClientCommandSingleRequest>("remove", "", "Ask for permission to remove device",
- // NKikimrCms::TAction::REMOVE_DEVICES,
- // TClientCommandWithAction::FF_DEVICE,
- // false));
+ // NKikimrCms::TAction::REMOVE_DEVICES,
+ // TClientCommandWithAction::FF_DEVICE,
+ // false));
//AddCommand(std::make_unique<TClientCommandAddRequest>());
AddCommand(std::make_unique<TClientCommandRestartRequest>());
AddCommand(std::make_unique<TClientCommandGetRequest>());
AddCommand(std::make_unique<TClientCommandListRequest>());
AddCommand(std::make_unique<TClientCommandRejectRequest>());
AddCommand(std::make_unique<TClientCommandCheckRequest>());
- }
-};
-
-class TClientCommandSendNotification : public TClientCommandWithAction {
-public:
- TString User;
- TString Reason;
- ui32 Delay;
-
- TClientCommandSendNotification(const TString &description,
- NKikimrCms::TAction::EType type,
- EFreeField freeArgField,
- bool hasDuration)
- : TClientCommandWithAction(description, type, freeArgField, hasDuration)
- {
- }
-
- void Config(TConfig &config) override
- {
- TClientCommandWithAction::Config(config);
-
- User = "";
- Reason = "";
- Delay = 0;
-
- config.Opts->AddLongOption("user", "User name").Required()
- .RequiredArgument("NAME").StoreResult(&User);
- config.Opts->AddLongOption("reason", "Informational notification description")
- .RequiredArgument("STRING").StoreResult(&Reason);
- config.Opts->AddLongOption("delay", "Minutes until action happens")
- .RequiredArgument("NUM").StoreResult(&Delay);
- }
-
- void Parse(TConfig& config) override
- {
- TClientCommandWithAction::Parse(config);
-
- auto &rec = *Request.MutableNotification();
- for (auto &action : Actions)
- rec.AddActions()->CopyFrom(action);
- rec.SetUser(User);
- if (Reason)
- rec.SetReason(Reason);
- auto time = Now() + TDuration::Minutes(Delay);
- rec.SetTime(time.GetValue());
- }
-};
-
-class TClientCommandSingleNotify : public TClientCommandTree {
-public:
- TClientCommandSingleNotify(const TString &name,
- const TString &description,
- const TString &requestDescription,
- NKikimrCms::TAction::EType type,
- TClientCommandWithAction::EFreeField freeArgField,
- bool hasDuration)
+ }
+};
+
+class TClientCommandSendNotification : public TClientCommandWithAction {
+public:
+ TString User;
+ TString Reason;
+ ui32 Delay;
+
+ TClientCommandSendNotification(const TString &description,
+ NKikimrCms::TAction::EType type,
+ EFreeField freeArgField,
+ bool hasDuration)
+ : TClientCommandWithAction(description, type, freeArgField, hasDuration)
+ {
+ }
+
+ void Config(TConfig &config) override
+ {
+ TClientCommandWithAction::Config(config);
+
+ User = "";
+ Reason = "";
+ Delay = 0;
+
+ config.Opts->AddLongOption("user", "User name").Required()
+ .RequiredArgument("NAME").StoreResult(&User);
+ config.Opts->AddLongOption("reason", "Informational notification description")
+ .RequiredArgument("STRING").StoreResult(&Reason);
+ config.Opts->AddLongOption("delay", "Minutes until action happens")
+ .RequiredArgument("NUM").StoreResult(&Delay);
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TClientCommandWithAction::Parse(config);
+
+ auto &rec = *Request.MutableNotification();
+ for (auto &action : Actions)
+ rec.AddActions()->CopyFrom(action);
+ rec.SetUser(User);
+ if (Reason)
+ rec.SetReason(Reason);
+ auto time = Now() + TDuration::Minutes(Delay);
+ rec.SetTime(time.GetValue());
+ }
+};
+
+class TClientCommandSingleNotify : public TClientCommandTree {
+public:
+ TClientCommandSingleNotify(const TString &name,
+ const TString &description,
+ const TString &requestDescription,
+ NKikimrCms::TAction::EType type,
+ TClientCommandWithAction::EFreeField freeArgField,
+ bool hasDuration)
: TClientCommandTree(name, {}, description)
- {
+ {
AddCommand(std::make_unique<TClientCommandSendNotification>(requestDescription, type, freeArgField, hasDuration));
- }
-};
-
-class TClientCommandNotifyAdd : public TClientCommandTree {
-public:
- TClientCommandNotifyAdd()
- : TClientCommandTree("add", {}, "")
- {
+ }
+};
+
+class TClientCommandNotifyAdd : public TClientCommandTree {
+public:
+ TClientCommandNotifyAdd()
+ : TClientCommandTree("add", {}, "")
+ {
AddCommand(std::make_unique<TClientCommandSendNotification>("Notify about new host",
- NKikimrCms::TAction::ADD_HOST,
- TClientCommandWithAction::FF_HOST,
- false));
+ NKikimrCms::TAction::ADD_HOST,
+ TClientCommandWithAction::FF_HOST,
+ false));
AddCommand(std::make_unique<TClientCommandSendNotification>("Notify about new device",
- NKikimrCms::TAction::ADD_DEVICES,
- TClientCommandWithAction::FF_DEVICE,
- false));
- }
-};
-
-class TClientCommandNotifyRestart : public TClientCommandTree {
-public:
- TClientCommandNotifyRestart()
- : TClientCommandTree("restart", {}, "")
- {
+ NKikimrCms::TAction::ADD_DEVICES,
+ TClientCommandWithAction::FF_DEVICE,
+ false));
+ }
+};
+
+class TClientCommandNotifyRestart : public TClientCommandTree {
+public:
+ TClientCommandNotifyRestart()
+ : TClientCommandTree("restart", {}, "")
+ {
AddCommand(std::make_unique<TClientCommandSendNotification>("Notify about service restart",
- NKikimrCms::TAction::RESTART_SERVICES,
- TClientCommandWithAction::FF_SERVICE,
- true));
+ NKikimrCms::TAction::RESTART_SERVICES,
+ TClientCommandWithAction::FF_SERVICE,
+ true));
AddCommand(std::make_unique<TClientCommandSendNotification>("Notify about host restart",
- NKikimrCms::TAction::SHUTDOWN_HOST,
- TClientCommandWithAction::FF_HOST,
- true));
- }
-};
-
-class TClientCommandManageNotification : public TCmsClientCommand
-{
-public:
- NKikimrCms::TManageNotificationRequest::ECommand Command;
- TString User;
- bool DryRun;
- bool HasId;
-
- TClientCommandManageNotification(const TString &name,
- const std::initializer_list<TString> &aliases,
- const TString &description,
- NKikimrCms::TManageNotificationRequest::ECommand cmd,
- bool hasId)
- : TCmsClientCommand(name, aliases, description)
- , Command(cmd)
- , HasId(hasId)
- {
- }
-
- void Config(TConfig &config) override
- {
- TCmsClientCommand::Config(config);
-
- User = "";
- DryRun = false;
-
- config.Opts->AddLongOption("user", "User name").Required()
- .RequiredArgument("NAME").StoreResult(&User);
- if (HasId) {
+ NKikimrCms::TAction::SHUTDOWN_HOST,
+ TClientCommandWithAction::FF_HOST,
+ true));
+ }
+};
+
+class TClientCommandManageNotification : public TCmsClientCommand
+{
+public:
+ NKikimrCms::TManageNotificationRequest::ECommand Command;
+ TString User;
+ bool DryRun;
+ bool HasId;
+
+ TClientCommandManageNotification(const TString &name,
+ const std::initializer_list<TString> &aliases,
+ const TString &description,
+ NKikimrCms::TManageNotificationRequest::ECommand cmd,
+ bool hasId)
+ : TCmsClientCommand(name, aliases, description)
+ , Command(cmd)
+ , HasId(hasId)
+ {
+ }
+
+ void Config(TConfig &config) override
+ {
+ TCmsClientCommand::Config(config);
+
+ User = "";
+ DryRun = false;
+
+ config.Opts->AddLongOption("user", "User name").Required()
+ .RequiredArgument("NAME").StoreResult(&User);
+ if (HasId) {
config.SetFreeArgsNum(1);
SetFreeArgTitle(0, "<ID>", "Notification ID");
- } else {
+ } else {
config.SetFreeArgsNum(0);
- }
- config.Opts->AddLongOption("dry", "Dry run").NoArgument().SetFlag(&DryRun);
- }
-
- void Parse(TConfig& config) override
- {
- TCmsClientCommand::Parse(config);
-
- auto &rec = *Request.MutableManageNotificationRequest();
- rec.SetUser(User);
- rec.SetCommand(Command);
- if (HasId)
- rec.SetNotificationId(config.ParseResult->GetFreeArgs()[0]);
- if (DryRun)
- rec.SetDryRun(DryRun);
- }
-};
-
-class TClientCommandGetNotification : public TClientCommandManageNotification
-{
-public:
- TClientCommandGetNotification()
- : TClientCommandManageNotification("get", {}, "Get stored notification",
- NKikimrCms::TManageNotificationRequest::GET, true)
- {
- }
-};
-
-class TClientCommandListNotification : public TClientCommandManageNotification
-{
-public:
- TClientCommandListNotification()
- : TClientCommandManageNotification("list", {}, "List stored notifications",
- NKikimrCms::TManageNotificationRequest::LIST, false)
- {
- }
-};
-
-class TClientCommandRejectNotification : public TClientCommandManageNotification
-{
-public:
- TClientCommandRejectNotification()
- : TClientCommandManageNotification("reject", {}, "Reject stored notification",
- NKikimrCms::TManageNotificationRequest::REJECT, true)
- {
- }
-};
-
-class TClientCommandNotify : public TClientCommandTree
-{
-public:
- TClientCommandNotify()
- : TClientCommandTree("notify", {}, "Send and manage notifications")
- {
+ }
+ config.Opts->AddLongOption("dry", "Dry run").NoArgument().SetFlag(&DryRun);
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TCmsClientCommand::Parse(config);
+
+ auto &rec = *Request.MutableManageNotificationRequest();
+ rec.SetUser(User);
+ rec.SetCommand(Command);
+ if (HasId)
+ rec.SetNotificationId(config.ParseResult->GetFreeArgs()[0]);
+ if (DryRun)
+ rec.SetDryRun(DryRun);
+ }
+};
+
+class TClientCommandGetNotification : public TClientCommandManageNotification
+{
+public:
+ TClientCommandGetNotification()
+ : TClientCommandManageNotification("get", {}, "Get stored notification",
+ NKikimrCms::TManageNotificationRequest::GET, true)
+ {
+ }
+};
+
+class TClientCommandListNotification : public TClientCommandManageNotification
+{
+public:
+ TClientCommandListNotification()
+ : TClientCommandManageNotification("list", {}, "List stored notifications",
+ NKikimrCms::TManageNotificationRequest::LIST, false)
+ {
+ }
+};
+
+class TClientCommandRejectNotification : public TClientCommandManageNotification
+{
+public:
+ TClientCommandRejectNotification()
+ : TClientCommandManageNotification("reject", {}, "Reject stored notification",
+ NKikimrCms::TManageNotificationRequest::REJECT, true)
+ {
+ }
+};
+
+class TClientCommandNotify : public TClientCommandTree
+{
+public:
+ TClientCommandNotify()
+ : TClientCommandTree("notify", {}, "Send and manage notifications")
+ {
//AddCommand(std::make_unique<TClientCommandSingleNotify>("start", "", "Notify about service start",
- // NKikimrCms::TAction::START_SERVICES,
- // TClientCommandWithAction::FF_SERVICE,
- // false));
+ // NKikimrCms::TAction::START_SERVICES,
+ // TClientCommandWithAction::FF_SERVICE,
+ // false));
//AddCommand(std::make_unique<TClientCommandSingleNotify>("stop", "", "Notify about service stop",
- // NKikimrCms::TAction::STOP_SERVICES,
- // TClientCommandWithAction::FF_SERVICE,
- // false));
+ // NKikimrCms::TAction::STOP_SERVICES,
+ // TClientCommandWithAction::FF_SERVICE,
+ // false));
//AddCommand(std::make_unique<TClientCommandSingleNotify>("decommission", "", "Notify about host decomission",
- // NKikimrCms::TAction::DECOMMISSION_HOST,
- // TClientCommandWithAction::FF_HOST,
- // false));
+ // NKikimrCms::TAction::DECOMMISSION_HOST,
+ // TClientCommandWithAction::FF_HOST,
+ // false));
AddCommand(std::make_unique<TClientCommandSingleNotify>("replace", "", "Notify about device replacement",
- NKikimrCms::TAction::REPLACE_DEVICES,
- TClientCommandWithAction::FF_DEVICE,
- true));
+ NKikimrCms::TAction::REPLACE_DEVICES,
+ TClientCommandWithAction::FF_DEVICE,
+ true));
//AddCommand(std::make_unique<TClientCommandSingleNotify>("remove", "", "Notify about device removal",
- // NKikimrCms::TAction::REMOVE_DEVICES,
- // TClientCommandWithAction::FF_DEVICE,
- // false));
+ // NKikimrCms::TAction::REMOVE_DEVICES,
+ // TClientCommandWithAction::FF_DEVICE,
+ // false));
//AddCommand(std::make_unique<TClientCommandNotifyAdd>());
AddCommand(std::make_unique<TClientCommandNotifyRestart>());
AddCommand(std::make_unique<TClientCommandGetNotification>());
AddCommand(std::make_unique<TClientCommandListNotification>());
AddCommand(std::make_unique<TClientCommandRejectNotification>());
- }
-};
-
-class TClientCommandManagePermission : public TCmsClientCommand
-{
-public:
- NKikimrCms::TManagePermissionRequest::ECommand Command;
- TString User;
- ui32 Hours;
- ui32 Minutes;
- bool DryRun;
- bool HasId;
- bool HasDeadline;
-
- TClientCommandManagePermission(const TString &name,
- const std::initializer_list<TString> &aliases,
- const TString &description,
- NKikimrCms::TManagePermissionRequest::ECommand cmd,
- bool hasId,
- bool hasDeadline)
- : TCmsClientCommand(name, aliases, description)
- , Command(cmd)
- , HasId(hasId)
- , HasDeadline(hasDeadline)
- {
- }
-
- void Config(TConfig &config) override
- {
- TCmsClientCommand::Config(config);
-
- User = "";
- Hours = 0;
- Minutes = 0;
- DryRun = false;
-
- config.Opts->AddLongOption("user", "User name").Required()
- .RequiredArgument("NAME").StoreResult(&User);
- if (HasId) {
+ }
+};
+
+class TClientCommandManagePermission : public TCmsClientCommand
+{
+public:
+ NKikimrCms::TManagePermissionRequest::ECommand Command;
+ TString User;
+ ui32 Hours;
+ ui32 Minutes;
+ bool DryRun;
+ bool HasId;
+ bool HasDeadline;
+
+ TClientCommandManagePermission(const TString &name,
+ const std::initializer_list<TString> &aliases,
+ const TString &description,
+ NKikimrCms::TManagePermissionRequest::ECommand cmd,
+ bool hasId,
+ bool hasDeadline)
+ : TCmsClientCommand(name, aliases, description)
+ , Command(cmd)
+ , HasId(hasId)
+ , HasDeadline(hasDeadline)
+ {
+ }
+
+ void Config(TConfig &config) override
+ {
+ TCmsClientCommand::Config(config);
+
+ User = "";
+ Hours = 0;
+ Minutes = 0;
+ DryRun = false;
+
+ config.Opts->AddLongOption("user", "User name").Required()
+ .RequiredArgument("NAME").StoreResult(&User);
+ if (HasId) {
config.SetFreeArgsNum(1);
SetFreeArgTitle(0, "<ID>", "Permission ID");
- } else {
+ } else {
config.SetFreeArgsNum(0);
- }
- if (HasDeadline) {
- config.Opts->AddLongOption("hours", "New permission duration")
- .RequiredArgument("NUM").StoreResult(&Hours);
- config.Opts->AddLongOption("minutes", "New permission duration")
- .RequiredArgument("NUM").StoreResult(&Minutes);
- }
- config.Opts->AddLongOption("dry", "Dry run").NoArgument().SetFlag(&DryRun);
- }
-
- void Parse(TConfig& config) override
- {
- TCmsClientCommand::Parse(config);
-
- auto &rec = *Request.MutableManagePermissionRequest();
- rec.SetUser(User);
- rec.SetCommand(Command);
- if (HasId)
- *rec.AddPermissions() = config.ParseResult->GetFreeArgs()[0];
- if (Hours || Minutes) {
- auto deadline = Now() + TDuration::Minutes(Minutes) + TDuration::Hours(Hours);
- rec.SetDeadline(deadline.GetValue());
- }
- if (DryRun)
- rec.SetDryRun(DryRun);
- }
-};
-
-class TClientCommandGetPermission : public TClientCommandManagePermission
-{
-public:
- TClientCommandGetPermission()
- : TClientCommandManagePermission("get", {}, "Get permission",
- NKikimrCms::TManagePermissionRequest::GET,
- true, false)
- {
- }
-};
-
-class TClientCommandListPermission : public TClientCommandManagePermission
-{
-public:
- TClientCommandListPermission()
- : TClientCommandManagePermission("list", {}, "List permissions",
- NKikimrCms::TManagePermissionRequest::LIST,
- false, false)
- {
- }
-};
-
-class TClientCommandDonePermission : public TClientCommandManagePermission
-{
-public:
- TClientCommandDonePermission()
- : TClientCommandManagePermission("done", {}, "Done with permission",
- NKikimrCms::TManagePermissionRequest::DONE,
- true, false)
- {
- }
-};
-
-class TClientCommandExtendPermission : public TClientCommandManagePermission
-{
-public:
- TClientCommandExtendPermission()
- : TClientCommandManagePermission("extend", {}, "Extend permission",
- NKikimrCms::TManagePermissionRequest::EXTEND,
- true, true)
- {
- }
-};
-
-class TClientCommandRejectPermission : public TClientCommandManagePermission
-{
-public:
- TClientCommandRejectPermission()
- : TClientCommandManagePermission("reject", {}, "Decline permission",
- NKikimrCms::TManagePermissionRequest::REJECT,
- true, false)
- {
- }
-};
-
-class TClientCommandPermission : public TClientCommandTree
-{
-public:
- TClientCommandPermission()
- : TClientCommandTree("permission", {}, "Manage issued permissions")
- {
+ }
+ if (HasDeadline) {
+ config.Opts->AddLongOption("hours", "New permission duration")
+ .RequiredArgument("NUM").StoreResult(&Hours);
+ config.Opts->AddLongOption("minutes", "New permission duration")
+ .RequiredArgument("NUM").StoreResult(&Minutes);
+ }
+ config.Opts->AddLongOption("dry", "Dry run").NoArgument().SetFlag(&DryRun);
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TCmsClientCommand::Parse(config);
+
+ auto &rec = *Request.MutableManagePermissionRequest();
+ rec.SetUser(User);
+ rec.SetCommand(Command);
+ if (HasId)
+ *rec.AddPermissions() = config.ParseResult->GetFreeArgs()[0];
+ if (Hours || Minutes) {
+ auto deadline = Now() + TDuration::Minutes(Minutes) + TDuration::Hours(Hours);
+ rec.SetDeadline(deadline.GetValue());
+ }
+ if (DryRun)
+ rec.SetDryRun(DryRun);
+ }
+};
+
+class TClientCommandGetPermission : public TClientCommandManagePermission
+{
+public:
+ TClientCommandGetPermission()
+ : TClientCommandManagePermission("get", {}, "Get permission",
+ NKikimrCms::TManagePermissionRequest::GET,
+ true, false)
+ {
+ }
+};
+
+class TClientCommandListPermission : public TClientCommandManagePermission
+{
+public:
+ TClientCommandListPermission()
+ : TClientCommandManagePermission("list", {}, "List permissions",
+ NKikimrCms::TManagePermissionRequest::LIST,
+ false, false)
+ {
+ }
+};
+
+class TClientCommandDonePermission : public TClientCommandManagePermission
+{
+public:
+ TClientCommandDonePermission()
+ : TClientCommandManagePermission("done", {}, "Done with permission",
+ NKikimrCms::TManagePermissionRequest::DONE,
+ true, false)
+ {
+ }
+};
+
+class TClientCommandExtendPermission : public TClientCommandManagePermission
+{
+public:
+ TClientCommandExtendPermission()
+ : TClientCommandManagePermission("extend", {}, "Extend permission",
+ NKikimrCms::TManagePermissionRequest::EXTEND,
+ true, true)
+ {
+ }
+};
+
+class TClientCommandRejectPermission : public TClientCommandManagePermission
+{
+public:
+ TClientCommandRejectPermission()
+ : TClientCommandManagePermission("reject", {}, "Decline permission",
+ NKikimrCms::TManagePermissionRequest::REJECT,
+ true, false)
+ {
+ }
+};
+
+class TClientCommandPermission : public TClientCommandTree
+{
+public:
+ TClientCommandPermission()
+ : TClientCommandTree("permission", {}, "Manage issued permissions")
+ {
AddCommand(std::make_unique<TClientCommandGetPermission>());
AddCommand(std::make_unique<TClientCommandListPermission>());
AddCommand(std::make_unique<TClientCommandDonePermission>());
//AddCommand(std::make_unique<TClientCommandExtendPermission>());
AddCommand(std::make_unique<TClientCommandRejectPermission>());
- }
-};
-
-class TClientCommandGetConfig : public TCmsClientCommand {
-public:
- TClientCommandGetConfig()
- : TCmsClientCommand("get", {}, "Get CMS config")
- {
- }
-
- void Parse(TConfig& config) override
- {
- TCmsClientCommand::Parse(config);
-
- Request.MutableGetConfigRequest();
- }
-};
-
-class TClientCommandSetConfig : public TCmsClientCommand {
-public:
- TClientCommandSetConfig()
- : TCmsClientCommand("set", {}, "Set CMS config")
- {
- }
-
- virtual void Config(TConfig& config) override {
- TCmsClientCommand::Config(config);
-
+ }
+};
+
+class TClientCommandGetConfig : public TCmsClientCommand {
+public:
+ TClientCommandGetConfig()
+ : TCmsClientCommand("get", {}, "Get CMS config")
+ {
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TCmsClientCommand::Parse(config);
+
+ Request.MutableGetConfigRequest();
+ }
+};
+
+class TClientCommandSetConfig : public TCmsClientCommand {
+public:
+ TClientCommandSetConfig()
+ : TCmsClientCommand("set", {}, "Set CMS config")
+ {
+ }
+
+ virtual void Config(TConfig& config) override {
+ TCmsClientCommand::Config(config);
+
config.SetFreeArgsNum(1);
SetFreeArgTitle(0, "<CONFIG>", "Config protobuf or file with config protobuf");
- }
-
- void Parse(TConfig& config) override
- {
- TCmsClientCommand::Parse(config);
-
- auto proto = config.ParseResult->GetFreeArgs().at(0);
- auto request = GetProtobuf<NKikimrCms::TCmsConfig>(proto);
- Request.MutableSetConfigRequest()->MutableConfig()->CopyFrom(*request);
- }
-};
-
-class TClientCommandManageConfig : public TClientCommandTree
-{
-public:
- TClientCommandManageConfig()
- : TClientCommandTree("config", {}, "Manage CMS config")
- {
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TCmsClientCommand::Parse(config);
+
+ auto proto = config.ParseResult->GetFreeArgs().at(0);
+ auto request = GetProtobuf<NKikimrCms::TCmsConfig>(proto);
+ Request.MutableSetConfigRequest()->MutableConfig()->CopyFrom(*request);
+ }
+};
+
+class TClientCommandManageConfig : public TClientCommandTree
+{
+public:
+ TClientCommandManageConfig()
+ : TClientCommandTree("config", {}, "Manage CMS config")
+ {
AddCommand(std::make_unique<TClientCommandGetConfig>());
AddCommand(std::make_unique<TClientCommandSetConfig>());
- }
-};
-
-class TClientCommandManageMarker : public TCmsClientCommand {
-private:
- TVector<TString> Hosts;
- TVector<ui32> Nodes;
- TVector<TString> PDisks;
-
-protected:
- NKikimrCms::EMarker Marker;
- NKikimrCms::TItems Items;
-
-public:
- TClientCommandManageMarker(const TString &name,
- const std::initializer_list<TString> &aliases,
- const TString &description)
- : TCmsClientCommand(name, aliases, description)
- {
- }
-
- virtual void Config(TConfig& config) override {
- TCmsClientCommand::Config(config);
-
- TVector<NKikimrCms::EMarker> allMarkers;
- for (ui32 i = NKikimrCms::EMarker_MIN + 1; i <= NKikimrCms::EMarker_MAX; ++i)
- if (NKikimrCms::EMarker_IsValid(i))
- allMarkers.push_back(static_cast<NKikimrCms::EMarker>(i));
+ }
+};
+
+class TClientCommandManageMarker : public TCmsClientCommand {
+private:
+ TVector<TString> Hosts;
+ TVector<ui32> Nodes;
+ TVector<TString> PDisks;
+
+protected:
+ NKikimrCms::EMarker Marker;
+ NKikimrCms::TItems Items;
+
+public:
+ TClientCommandManageMarker(const TString &name,
+ const std::initializer_list<TString> &aliases,
+ const TString &description)
+ : TCmsClientCommand(name, aliases, description)
+ {
+ }
+
+ virtual void Config(TConfig& config) override {
+ TCmsClientCommand::Config(config);
+
+ TVector<NKikimrCms::EMarker> allMarkers;
+ for (ui32 i = NKikimrCms::EMarker_MIN + 1; i <= NKikimrCms::EMarker_MAX; ++i)
+ if (NKikimrCms::EMarker_IsValid(i))
+ allMarkers.push_back(static_cast<NKikimrCms::EMarker>(i));
TString desc = Sprintf("Marker name (%s)", JoinSeq(", ", allMarkers).data());
-
+
config.SetFreeArgsNum(1);
SetFreeArgTitle(0, "<MARKER>", desc);
- config.Opts->AddLongOption("host", "Host(s) to mark")
- .RequiredArgument("NAME").AppendTo(&Hosts);
- config.Opts->AddLongOption("node", "Node(s) to mark")
- .RequiredArgument("ID").AppendTo(&Nodes);
- config.Opts->AddLongOption("pdisk", "PDisk(s) to mark")
- .RequiredArgument("<NODE>:<ID>").AppendTo(&PDisks);
- }
-
- void Parse(TConfig& config) override
- {
- TCmsClientCommand::Parse(config);
-
- if (!NKikimrCms::EMarker_Parse(config.ParseResult->GetFreeArgs().at(0), &Marker))
- ythrow yexception() << "invalid marker name " << config.ParseResult->GetFreeArgs().at(0);
-
- for (auto &host : Hosts)
- Items.AddHosts(host);
- for (auto &nodeId : Nodes)
- Items.AddNodes(nodeId);
- for (auto &pdiskId : PDisks) {
- TVector<TString> parts = StringSplitter(pdiskId).Split(':').ToList<TString>();
- if (parts.size() != 2)
- ythrow yexception() << "bad PDisk ID format in '" + pdiskId + "'";
- ui32 nodeId;
- ui32 diskId;
- if (!TryFromString<ui32>(parts[0], nodeId)
- || !TryFromString<ui32>(parts[1], diskId))
- ythrow yexception() << "bad PDisk ID format in '" + pdiskId + "'";
- auto &pdisk = *Items.AddPDisks();
- pdisk.SetNodeId(nodeId);
- pdisk.SetDiskId(diskId);
- }
- }
-};
-
-class TClientCommandSetMarker : public TClientCommandManageMarker {
-public:
- TClientCommandSetMarker()
- : TClientCommandManageMarker("set", {}, "Set marker")
- {
- }
-
- void Parse(TConfig& config) override
- {
- TClientCommandManageMarker::Parse(config);
-
- auto &req = *Request.MutableSetMarkerRequest();
- req.SetMarker(Marker);
- req.MutableItems()->CopyFrom(Items);
- }
-};
-
-class TClientCommandResetMarker : public TClientCommandManageMarker {
-public:
- TClientCommandResetMarker()
- : TClientCommandManageMarker("reset", {}, "Reset marker")
- {
- }
-
- void Parse(TConfig& config) override
- {
- TClientCommandManageMarker::Parse(config);
-
- auto &req = *Request.MutableResetMarkerRequest();
- req.SetMarker(Marker);
- req.MutableItems()->CopyFrom(Items);
- }
-};
-
-class TClientCommandMarker : public TClientCommandTree
-{
-public:
- TClientCommandMarker()
- : TClientCommandTree("marker", {}, "Manage markers")
- {
+ config.Opts->AddLongOption("host", "Host(s) to mark")
+ .RequiredArgument("NAME").AppendTo(&Hosts);
+ config.Opts->AddLongOption("node", "Node(s) to mark")
+ .RequiredArgument("ID").AppendTo(&Nodes);
+ config.Opts->AddLongOption("pdisk", "PDisk(s) to mark")
+ .RequiredArgument("<NODE>:<ID>").AppendTo(&PDisks);
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TCmsClientCommand::Parse(config);
+
+ if (!NKikimrCms::EMarker_Parse(config.ParseResult->GetFreeArgs().at(0), &Marker))
+ ythrow yexception() << "invalid marker name " << config.ParseResult->GetFreeArgs().at(0);
+
+ for (auto &host : Hosts)
+ Items.AddHosts(host);
+ for (auto &nodeId : Nodes)
+ Items.AddNodes(nodeId);
+ for (auto &pdiskId : PDisks) {
+ TVector<TString> parts = StringSplitter(pdiskId).Split(':').ToList<TString>();
+ if (parts.size() != 2)
+ ythrow yexception() << "bad PDisk ID format in '" + pdiskId + "'";
+ ui32 nodeId;
+ ui32 diskId;
+ if (!TryFromString<ui32>(parts[0], nodeId)
+ || !TryFromString<ui32>(parts[1], diskId))
+ ythrow yexception() << "bad PDisk ID format in '" + pdiskId + "'";
+ auto &pdisk = *Items.AddPDisks();
+ pdisk.SetNodeId(nodeId);
+ pdisk.SetDiskId(diskId);
+ }
+ }
+};
+
+class TClientCommandSetMarker : public TClientCommandManageMarker {
+public:
+ TClientCommandSetMarker()
+ : TClientCommandManageMarker("set", {}, "Set marker")
+ {
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TClientCommandManageMarker::Parse(config);
+
+ auto &req = *Request.MutableSetMarkerRequest();
+ req.SetMarker(Marker);
+ req.MutableItems()->CopyFrom(Items);
+ }
+};
+
+class TClientCommandResetMarker : public TClientCommandManageMarker {
+public:
+ TClientCommandResetMarker()
+ : TClientCommandManageMarker("reset", {}, "Reset marker")
+ {
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TClientCommandManageMarker::Parse(config);
+
+ auto &req = *Request.MutableResetMarkerRequest();
+ req.SetMarker(Marker);
+ req.MutableItems()->CopyFrom(Items);
+ }
+};
+
+class TClientCommandMarker : public TClientCommandTree
+{
+public:
+ TClientCommandMarker()
+ : TClientCommandTree("marker", {}, "Manage markers")
+ {
AddCommand(std::make_unique<TClientCommandSetMarker>());
AddCommand(std::make_unique<TClientCommandResetMarker>());
- }
-};
-
-class TClientCommandLogTail : public TCmsClientCommand {
-private:
- ui64 Offset = 0;
- ui64 Limit = 50;
- NKikimrCms::TLogRecordData::EType RecType = NKikimrCms::TLogRecordData::UNKNOWN;
- NKikimrCms::ETextFormat Format = NKikimrCms::TEXT_FORMAT_SHORT;
-
-public:
- TClientCommandLogTail()
- : TCmsClientCommand("tail", {}, "Print log tail")
- {
- }
-
- virtual void Config(TConfig& config) override {
- TCmsClientCommand::Config(config);
-
- TVector<NKikimrCms::TLogRecordData::EType> allTypes;
- for (ui32 i = NKikimrCms::TLogRecordData::EType_MIN + 1;
- i <= NKikimrCms::TLogRecordData::EType_MAX;
- ++i)
- if (NKikimrCms::TLogRecordData::EType_IsValid(i))
- allTypes.push_back(static_cast<NKikimrCms::TLogRecordData::EType>(i));
+ }
+};
+
+class TClientCommandLogTail : public TCmsClientCommand {
+private:
+ ui64 Offset = 0;
+ ui64 Limit = 50;
+ NKikimrCms::TLogRecordData::EType RecType = NKikimrCms::TLogRecordData::UNKNOWN;
+ NKikimrCms::ETextFormat Format = NKikimrCms::TEXT_FORMAT_SHORT;
+
+public:
+ TClientCommandLogTail()
+ : TCmsClientCommand("tail", {}, "Print log tail")
+ {
+ }
+
+ virtual void Config(TConfig& config) override {
+ TCmsClientCommand::Config(config);
+
+ TVector<NKikimrCms::TLogRecordData::EType> allTypes;
+ for (ui32 i = NKikimrCms::TLogRecordData::EType_MIN + 1;
+ i <= NKikimrCms::TLogRecordData::EType_MAX;
+ ++i)
+ if (NKikimrCms::TLogRecordData::EType_IsValid(i))
+ allTypes.push_back(static_cast<NKikimrCms::TLogRecordData::EType>(i));
TString desc = Sprintf("Filter log records by type (%s)", JoinSeq(", ", allTypes).data());
-
- config.Opts->AddLongOption("detailed", "Show more detailed log messages")
- .NoArgument();
- config.Opts->AddLongOption("page", "Show Nth log page from the bottom")
- .RequiredArgument("N").StoreResult(&Offset);
- config.Opts->AddLongOption("limit", "Limit number of fetched entries (50 by default)")
- .RequiredArgument("COUNT").StoreResult(&Limit);
- config.Opts->AddLongOption("type", desc)
- .RequiredArgument("NAME");
- }
-
- void Parse(TConfig& config) override
- {
- TCmsClientCommand::Parse(config);
-
- if (config.ParseResult->Has("type")) {
- TString recType = config.ParseResult->Get("type");
- if (!NKikimrCms::TLogRecordData::EType_Parse(recType, &RecType))
- ythrow yexception() << "invalid record type name " << recType;
- }
-
- if (!Limit)
- ythrow yexception() << "log size limit shouldn't be zero";
-
- Offset *= Limit;
-
- if (config.ParseResult->Has("detailed"))
- Format = NKikimrCms::TEXT_FORMAT_DETAILED;
-
- auto &req = *Request.MutableGetLogTailRequest();
- req.SetTextFormat(Format);
- req.MutableLogFilter()->SetRecordType(RecType);
- req.MutableLogFilter()->SetLimit(Limit);
- req.MutableLogFilter()->SetOffset(Offset);
- }
-
+
+ config.Opts->AddLongOption("detailed", "Show more detailed log messages")
+ .NoArgument();
+ config.Opts->AddLongOption("page", "Show Nth log page from the bottom")
+ .RequiredArgument("N").StoreResult(&Offset);
+ config.Opts->AddLongOption("limit", "Limit number of fetched entries (50 by default)")
+ .RequiredArgument("COUNT").StoreResult(&Limit);
+ config.Opts->AddLongOption("type", desc)
+ .RequiredArgument("NAME");
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TCmsClientCommand::Parse(config);
+
+ if (config.ParseResult->Has("type")) {
+ TString recType = config.ParseResult->Get("type");
+ if (!NKikimrCms::TLogRecordData::EType_Parse(recType, &RecType))
+ ythrow yexception() << "invalid record type name " << recType;
+ }
+
+ if (!Limit)
+ ythrow yexception() << "log size limit shouldn't be zero";
+
+ Offset *= Limit;
+
+ if (config.ParseResult->Has("detailed"))
+ Format = NKikimrCms::TEXT_FORMAT_DETAILED;
+
+ auto &req = *Request.MutableGetLogTailRequest();
+ req.SetTextFormat(Format);
+ req.MutableLogFilter()->SetRecordType(RecType);
+ req.MutableLogFilter()->SetLimit(Limit);
+ req.MutableLogFilter()->SetOffset(Offset);
+ }
+
void PrintOkResponse(const NKikimrClient::TCmsResponse &response) override
- {
- if (!response.GetGetLogTailResponse().LogRecordsSize())
- Cout << "<empty>" << Endl;
-
- for (auto &rec : response.GetGetLogTailResponse().GetLogRecords()) {
- TInstant timestamp = TInstant::FromValue(rec.GetTimestamp());
- Cout << timestamp << " "
- << static_cast<NKikimrCms::TLogRecordData::EType>(rec.GetRecordType())
- << " " << rec.GetMessage() << Endl;
- }
- }
-};
-
-class TClientCommandLog : public TClientCommandTree
-{
-public:
- TClientCommandLog()
- : TClientCommandTree("log", {}, "Inspect log records")
- {
+ {
+ if (!response.GetGetLogTailResponse().LogRecordsSize())
+ Cout << "<empty>" << Endl;
+
+ for (auto &rec : response.GetGetLogTailResponse().GetLogRecords()) {
+ TInstant timestamp = TInstant::FromValue(rec.GetTimestamp());
+ Cout << timestamp << " "
+ << static_cast<NKikimrCms::TLogRecordData::EType>(rec.GetRecordType())
+ << " " << rec.GetMessage() << Endl;
+ }
+ }
+};
+
+class TClientCommandLog : public TClientCommandTree
+{
+public:
+ TClientCommandLog()
+ : TClientCommandTree("log", {}, "Inspect log records")
+ {
AddCommand(std::make_unique<TClientCommandLogTail>());
- }
-};
-
-TClientCommandCms::TClientCommandCms()
- : TClientCommandTree("cms", {}, "CMS requests")
-{
+ }
+};
+
+TClientCommandCms::TClientCommandCms()
+ : TClientCommandTree("cms", {}, "CMS requests")
+{
AddCommand(std::make_unique<TClientCommandState>());
AddCommand(std::make_unique<TClientCommandRequest>());
AddCommand(std::make_unique<TClientCommandNotify>());
@@ -1172,7 +1172,7 @@ TClientCommandCms::TClientCommandCms()
AddCommand(std::make_unique<TClientCommandManageConfig>());
AddCommand(std::make_unique<TClientCommandMarker>());
AddCommand(std::make_unique<TClientCommandLog>());
-}
-
-} // namespace NDriverClient
-} // namespace NKikimr
+}
+
+} // namespace NDriverClient
+} // namespace NKikimr
diff --git a/ydb/core/driver_lib/cli_utils/cli_cmds_console.cpp b/ydb/core/driver_lib/cli_utils/cli_cmds_console.cpp
index 4bbebf08821..0497d4ea8fe 100644
--- a/ydb/core/driver_lib/cli_utils/cli_cmds_console.cpp
+++ b/ydb/core/driver_lib/cli_utils/cli_cmds_console.cpp
@@ -1,541 +1,541 @@
-#include <util/string/type.h>
-#include "cli.h"
-#include "cli_cmds.h"
-
+#include <util/string/type.h>
+#include "cli.h"
+#include "cli_cmds.h"
+
#include <util/string/split.h>
-#include <util/system/fs.h>
-
-namespace NKikimr {
-namespace NDriverClient {
-
+#include <util/system/fs.h>
+
+namespace NKikimr {
+namespace NDriverClient {
+
class TConsoleClientCommand : public TClientCommandConfig {
-public:
- TString Domain;
- ui32 Retries;
- NKikimrClient::TConsoleRequest Request;
-
- TConsoleClientCommand(const TString &name,
- const std::initializer_list<TString> &aliases,
- const TString &description)
+public:
+ TString Domain;
+ ui32 Retries;
+ NKikimrClient::TConsoleRequest Request;
+
+ TConsoleClientCommand(const TString &name,
+ const std::initializer_list<TString> &aliases,
+ const TString &description)
: TClientCommandConfig(name, aliases, description)
- , Retries(0)
- {
- }
-
- void Config(TConfig &config) override
- {
- TClientCommand::Config(config);
-
- Domain = "";
-
- config.Opts->AddLongOption("domain", "Set target domain (required for clusters with multiple domains)")
- .RequiredArgument("NAME").StoreResult(&Domain);
- config.Opts->AddLongOption("retry", "Set how many times retriable statuses should be retried")
- .RequiredArgument("COUNT").StoreResult(&Retries);
- }
-
- void Parse(TConfig& config) override
- {
- TClientCommand::Parse(config);
-
- if (Domain)
- Request.SetDomainName(Domain);
- }
-
- int Run(TConfig &config) override
- {
- bool retry = false;
- auto handler = [this, &retry](const NMsgBusProxy::TBusConsoleResponse &response) -> int {
- auto status = response.Record.GetStatus().GetCode();
- if ((status == Ydb::StatusIds::UNAVAILABLE
- || status == Ydb::StatusIds::TIMEOUT)
- && Retries) {
- TConsoleClientCommand::PrintResponse(response.Record);
- --Retries;
- retry = true;
-
- TString s = (Retries == 1 ? "" : "s");
- TString ss = (Retries == 1 ? "s" : "");
- Cout << "Retrying... (" << Retries << " attempt" << s
- << " remain" << ss << ")" << Endl;
-
- return -1;
- }
- retry = false;
- PrintResponse(response.Record);
- return status == Ydb::StatusIds::SUCCESS ? 0 : -1;
- };
-
- int result;
- do {
- TAutoPtr<NMsgBusProxy::TBusConsoleRequest> request(new NMsgBusProxy::TBusConsoleRequest);
- request->Record.CopyFrom(Request);
- result = MessageBusCall<NMsgBusProxy::TBusConsoleRequest,
- NMsgBusProxy::TBusConsoleResponse>(config, request, handler);
- } while (retry);
-
- return result;
- }
-
- virtual void PrintResponse(const NKikimrClient::TConsoleResponse &response)
- {
+ , Retries(0)
+ {
+ }
+
+ void Config(TConfig &config) override
+ {
+ TClientCommand::Config(config);
+
+ Domain = "";
+
+ config.Opts->AddLongOption("domain", "Set target domain (required for clusters with multiple domains)")
+ .RequiredArgument("NAME").StoreResult(&Domain);
+ config.Opts->AddLongOption("retry", "Set how many times retriable statuses should be retried")
+ .RequiredArgument("COUNT").StoreResult(&Retries);
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TClientCommand::Parse(config);
+
+ if (Domain)
+ Request.SetDomainName(Domain);
+ }
+
+ int Run(TConfig &config) override
+ {
+ bool retry = false;
+ auto handler = [this, &retry](const NMsgBusProxy::TBusConsoleResponse &response) -> int {
+ auto status = response.Record.GetStatus().GetCode();
+ if ((status == Ydb::StatusIds::UNAVAILABLE
+ || status == Ydb::StatusIds::TIMEOUT)
+ && Retries) {
+ TConsoleClientCommand::PrintResponse(response.Record);
+ --Retries;
+ retry = true;
+
+ TString s = (Retries == 1 ? "" : "s");
+ TString ss = (Retries == 1 ? "s" : "");
+ Cout << "Retrying... (" << Retries << " attempt" << s
+ << " remain" << ss << ")" << Endl;
+
+ return -1;
+ }
+ retry = false;
+ PrintResponse(response.Record);
+ return status == Ydb::StatusIds::SUCCESS ? 0 : -1;
+ };
+
+ int result;
+ do {
+ TAutoPtr<NMsgBusProxy::TBusConsoleRequest> request(new NMsgBusProxy::TBusConsoleRequest);
+ request->Record.CopyFrom(Request);
+ result = MessageBusCall<NMsgBusProxy::TBusConsoleRequest,
+ NMsgBusProxy::TBusConsoleResponse>(config, request, handler);
+ } while (retry);
+
+ return result;
+ }
+
+ virtual void PrintResponse(const NKikimrClient::TConsoleResponse &response)
+ {
if (response.GetStatus().GetCode() == Ydb::StatusIds::SUCCESS)
- Cout << response.DebugString();
- else
- Cout << "ERROR: " << response.GetStatus().GetCode()
- << " (" << response.GetStatus().GetReason() << ")" << Endl;
- }
-
- void ParseStoragePools(TConfig &config, TVector<std::pair<TString, ui32>> &pools)
- {
- for (auto &arg : config.ParseResult->GetFreeArgs()) {
- TVector<TString> items = StringSplitter(arg).Split(':').ToList<TString>();
- if (items.size() != 2)
- ythrow yexception() << "bad format in '" + arg + "'";
- ui32 size = FromString<ui32>(items[1]);
- if (!size)
- ythrow yexception() << "bad pool size '" + arg + "'";
- pools.push_back(std::make_pair(items[0], size));
- }
- }
-};
-
-class TConfigWriter {
-public:
- TConfigWriter()
- {
- ConfigFiles["ActorSystemConfig"] = "sys.txt";
- ConfigFiles["LogConfig"] = "log.txt";
- ConfigFiles["NameserviceConfig"] = "names.txt";
- ConfigFiles["InterconnectConfig"] = "ic.txt";
- ConfigFiles["DomainsConfig"] = "domains.txt";
- ConfigFiles["BlobStorageConfig"] = "bs.txt";
- ConfigFiles["ChannelProfileConfig"] = "channels.txt";
- ConfigFiles["BootstrapConfig"] = "boot.txt";
- ConfigFiles["VDiskConfig"] = "vdisks.txt";
- ConfigFiles["KQPConfig"] = "kqp.txt";
- ConfigFiles["GRpcConfig"] = "grpc.txt";
- ConfigFiles["CmsConfig"] = "cms.txt";
- ConfigFiles["FeatureFlags"] = "feature_flags.txt";
- ConfigFiles["SqsConfig"] = "sqs.txt";
- ConfigFiles["PQConfig"] = "pq.txt";
+ Cout << response.DebugString();
+ else
+ Cout << "ERROR: " << response.GetStatus().GetCode()
+ << " (" << response.GetStatus().GetReason() << ")" << Endl;
+ }
+
+ void ParseStoragePools(TConfig &config, TVector<std::pair<TString, ui32>> &pools)
+ {
+ for (auto &arg : config.ParseResult->GetFreeArgs()) {
+ TVector<TString> items = StringSplitter(arg).Split(':').ToList<TString>();
+ if (items.size() != 2)
+ ythrow yexception() << "bad format in '" + arg + "'";
+ ui32 size = FromString<ui32>(items[1]);
+ if (!size)
+ ythrow yexception() << "bad pool size '" + arg + "'";
+ pools.push_back(std::make_pair(items[0], size));
+ }
+ }
+};
+
+class TConfigWriter {
+public:
+ TConfigWriter()
+ {
+ ConfigFiles["ActorSystemConfig"] = "sys.txt";
+ ConfigFiles["LogConfig"] = "log.txt";
+ ConfigFiles["NameserviceConfig"] = "names.txt";
+ ConfigFiles["InterconnectConfig"] = "ic.txt";
+ ConfigFiles["DomainsConfig"] = "domains.txt";
+ ConfigFiles["BlobStorageConfig"] = "bs.txt";
+ ConfigFiles["ChannelProfileConfig"] = "channels.txt";
+ ConfigFiles["BootstrapConfig"] = "boot.txt";
+ ConfigFiles["VDiskConfig"] = "vdisks.txt";
+ ConfigFiles["KQPConfig"] = "kqp.txt";
+ ConfigFiles["GRpcConfig"] = "grpc.txt";
+ ConfigFiles["CmsConfig"] = "cms.txt";
+ ConfigFiles["FeatureFlags"] = "feature_flags.txt";
+ ConfigFiles["SqsConfig"] = "sqs.txt";
+ ConfigFiles["PQConfig"] = "pq.txt";
ConfigFiles["PQClusterDiscoveryConfig"] = "pqcd.txt";
ConfigFiles["NetClassifierConfig"] = "netclassifier.txt";
- ConfigFiles["KeyConfig"] = "key.txt";
+ ConfigFiles["KeyConfig"] = "key.txt";
ConfigFiles["PDiskKeyConfig"] = "pdisk_key.txt";
- ConfigFiles["ClusterYamlConfig"] = "cluster.yaml";
- }
-
- void Write(const TString &outDir,
- NKikimrConfig::TAppConfig config)
- {
- NFs::RemoveRecursive(outDir);
-
- if (!NFs::MakeDirectoryRecursive(outDir))
- ythrow yexception() << "Cannot create directory " << outDir << Endl;
-
- TUnbufferedFileOutput ffs(outDir + "/full.txt");
- ffs << config.Utf8DebugString();
-
- auto *desc = config.GetDescriptor();
- auto *reflection = config.GetReflection();
- std::vector<const NProtoBuf::FieldDescriptor *> otherFields;
- for (int i = 0; i < desc->field_count(); ++i) {
- auto *field = desc->field(i);
- TString fname;
-
- if (ConfigFiles.contains(field->name()))
- fname = ConfigFiles.at(field->name());
- else
- fname = field->name() + ".txt";
-
- if (field->is_repeated()) {
- if (reflection->FieldSize(config, field)) {
- TUnbufferedFileOutput fs(outDir + "/" + fname);
- NKikimrConfig::TAppConfig cfg;
- reflection->SwapFields(&config, &cfg, {field});
- fs << cfg.Utf8DebugString();
- }
- } else if (reflection->HasField(config, field)) {
- TUnbufferedFileOutput fs(outDir + "/" + fname);
- if (field->type() == ::google::protobuf::FieldDescriptor::TYPE_MESSAGE)
- fs << reflection->MutableMessage(&config, field)->Utf8DebugString();
- else if (field->type() == ::google::protobuf::FieldDescriptor::TYPE_STRING)
- fs << reflection->GetString(config, field);
- else {
- NKikimrConfig::TAppConfig cfg;
- reflection->SwapFields(&config, &cfg, {field});
- fs << cfg.Utf8DebugString();
- }
- }
- }
- }
-
-private:
- THashMap<TString, TString> ConfigFiles;
-};
-
-class TClientCommandConsoleConfigsUpdate : public TConsoleClientCommand {
- bool DryRun;
- TString OutDir;
-
-public:
- TClientCommandConsoleConfigsUpdate()
- : TConsoleClientCommand("update", {}, "Execute Console configure request")
- , DryRun(false)
- {
- }
-
- virtual void Config(TConfig& config) override {
- TConsoleClientCommand::Config(config);
- config.Opts->AddLongOption("dry-run", "Execute configure request in dry-run mode")
- .NoArgument().SetFlag(&DryRun);
- config.Opts->AddLongOption("out-dir", "Output affected configs into specified directory")
- .RequiredArgument("PATH").StoreResult(&OutDir);
- config.SetFreeArgsNum(1);
- SetFreeArgTitle(0, "<CONFIGURE-PROTO>", "Console configure request protobuf or file with protobuf");
- }
-
- virtual void Parse(TConfig& config) override {
- TConsoleClientCommand::Parse(config);
-
- ParseProtobuf(Request.MutableConfigureRequest(), config.ParseResult->GetFreeArgs()[0]);
- if (DryRun)
- Request.MutableConfigureRequest()->SetDryRun(DryRun);
- if (OutDir)
- Request.MutableConfigureRequest()->SetFillAffectedConfigs(true);
- }
-
+ ConfigFiles["ClusterYamlConfig"] = "cluster.yaml";
+ }
+
+ void Write(const TString &outDir,
+ NKikimrConfig::TAppConfig config)
+ {
+ NFs::RemoveRecursive(outDir);
+
+ if (!NFs::MakeDirectoryRecursive(outDir))
+ ythrow yexception() << "Cannot create directory " << outDir << Endl;
+
+ TUnbufferedFileOutput ffs(outDir + "/full.txt");
+ ffs << config.Utf8DebugString();
+
+ auto *desc = config.GetDescriptor();
+ auto *reflection = config.GetReflection();
+ std::vector<const NProtoBuf::FieldDescriptor *> otherFields;
+ for (int i = 0; i < desc->field_count(); ++i) {
+ auto *field = desc->field(i);
+ TString fname;
+
+ if (ConfigFiles.contains(field->name()))
+ fname = ConfigFiles.at(field->name());
+ else
+ fname = field->name() + ".txt";
+
+ if (field->is_repeated()) {
+ if (reflection->FieldSize(config, field)) {
+ TUnbufferedFileOutput fs(outDir + "/" + fname);
+ NKikimrConfig::TAppConfig cfg;
+ reflection->SwapFields(&config, &cfg, {field});
+ fs << cfg.Utf8DebugString();
+ }
+ } else if (reflection->HasField(config, field)) {
+ TUnbufferedFileOutput fs(outDir + "/" + fname);
+ if (field->type() == ::google::protobuf::FieldDescriptor::TYPE_MESSAGE)
+ fs << reflection->MutableMessage(&config, field)->Utf8DebugString();
+ else if (field->type() == ::google::protobuf::FieldDescriptor::TYPE_STRING)
+ fs << reflection->GetString(config, field);
+ else {
+ NKikimrConfig::TAppConfig cfg;
+ reflection->SwapFields(&config, &cfg, {field});
+ fs << cfg.Utf8DebugString();
+ }
+ }
+ }
+ }
+
+private:
+ THashMap<TString, TString> ConfigFiles;
+};
+
+class TClientCommandConsoleConfigsUpdate : public TConsoleClientCommand {
+ bool DryRun;
+ TString OutDir;
+
+public:
+ TClientCommandConsoleConfigsUpdate()
+ : TConsoleClientCommand("update", {}, "Execute Console configure request")
+ , DryRun(false)
+ {
+ }
+
+ virtual void Config(TConfig& config) override {
+ TConsoleClientCommand::Config(config);
+ config.Opts->AddLongOption("dry-run", "Execute configure request in dry-run mode")
+ .NoArgument().SetFlag(&DryRun);
+ config.Opts->AddLongOption("out-dir", "Output affected configs into specified directory")
+ .RequiredArgument("PATH").StoreResult(&OutDir);
+ config.SetFreeArgsNum(1);
+ SetFreeArgTitle(0, "<CONFIGURE-PROTO>", "Console configure request protobuf or file with protobuf");
+ }
+
+ virtual void Parse(TConfig& config) override {
+ TConsoleClientCommand::Parse(config);
+
+ ParseProtobuf(Request.MutableConfigureRequest(), config.ParseResult->GetFreeArgs()[0]);
+ if (DryRun)
+ Request.MutableConfigureRequest()->SetDryRun(DryRun);
+ if (OutDir)
+ Request.MutableConfigureRequest()->SetFillAffectedConfigs(true);
+ }
+
virtual void PrintResponse(const NKikimrClient::TConsoleResponse &response) override
- {
- if (response.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
- Cout << "ERROR: " << response.GetStatus().GetCode()
- << " (" << response.GetStatus().GetReason() << ")" << Endl;
- return;
- }
-
- Cout << "OK" << Endl;
-
- if (OutDir)
- NFs::RemoveRecursive(OutDir);
-
- auto &resp = response.GetConfigureResponse();
- if (resp.AffectedConfigsSize()) {
- Cout << "Affected configs:" << Endl;
- for (auto &entry : resp.GetAffectedConfigs()) {
- TString dirName;
-
- Cout << " ";
- if (entry.GetTenant()) {
- Cout << "Tenant: '" << entry.GetTenant() << "' ";
- dirName = entry.GetTenant();
- }
- if (entry.GetNodeType()) {
- Cout << "Node type: '" << entry.GetNodeType() << "' ";
- if (dirName)
- dirName += "-";
- dirName += entry.GetNodeType();
- }
- if (!entry.GetTenant() && !entry.GetNodeType()) {
- Cout << "Domain";
- dirName = "domain";
- }
- Cout << Endl;
-
- if (OutDir) {
- TConfigWriter writer;
- writer.Write(OutDir + "/" + dirName + "/current", entry.GetOldConfig());
- writer.Write(OutDir + "/" + dirName + "/modified", entry.GetNewConfig());
- }
- }
- }
- }
-};
-
-class TClientCommandConsoleConfigsLoad : public TConsoleClientCommand {
- TString Tenant;
- TString NodeType;
- TString Host;
- ui32 NodeId;
- TString OutDir;
- TString Kind;
-
-public:
- TClientCommandConsoleConfigsLoad()
- : TConsoleClientCommand("load", {}, "Load config from CMS for node with specified attributes")
- , NodeId(0)
- {
- }
-
- virtual void Config(TConfig& config) override {
- TConsoleClientCommand::Config(config);
- config.Opts->AddLongOption("out-dir", "Output directory for configs")
- .RequiredArgument("PATH").StoreResult(&OutDir).Required();
- config.Opts->AddLongOption("tenant", "Tenant attribute for requested config")
- .RequiredArgument("NAME").StoreResult(&Tenant);
- config.Opts->AddLongOption("node-type", "Node type attribute for requested config")
- .RequiredArgument("TYPE").StoreResult(&NodeType);
- config.Opts->AddLongOption("node-id", "Tenant attribute for requested config")
- .RequiredArgument("ID").StoreResult(&NodeId);
- config.Opts->AddLongOption("host", "Host attribute for requested config")
- .RequiredArgument("FQDN").StoreResult(&Host);
- config.SetFreeArgsNum(0);
- }
-
- virtual void Parse(TConfig& config) override {
- TConsoleClientCommand::Parse(config);
-
- auto &rec = *Request.MutableGetNodeConfigRequest();
- if (Tenant)
- rec.MutableNode()->SetTenant(Tenant);
- if (NodeType)
- rec.MutableNode()->SetNodeType(NodeType);
- if (NodeId)
- rec.MutableNode()->SetNodeId(NodeId);
- if (Host)
- rec.MutableNode()->SetHost(Host);
- }
-
+ {
+ if (response.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
+ Cout << "ERROR: " << response.GetStatus().GetCode()
+ << " (" << response.GetStatus().GetReason() << ")" << Endl;
+ return;
+ }
+
+ Cout << "OK" << Endl;
+
+ if (OutDir)
+ NFs::RemoveRecursive(OutDir);
+
+ auto &resp = response.GetConfigureResponse();
+ if (resp.AffectedConfigsSize()) {
+ Cout << "Affected configs:" << Endl;
+ for (auto &entry : resp.GetAffectedConfigs()) {
+ TString dirName;
+
+ Cout << " ";
+ if (entry.GetTenant()) {
+ Cout << "Tenant: '" << entry.GetTenant() << "' ";
+ dirName = entry.GetTenant();
+ }
+ if (entry.GetNodeType()) {
+ Cout << "Node type: '" << entry.GetNodeType() << "' ";
+ if (dirName)
+ dirName += "-";
+ dirName += entry.GetNodeType();
+ }
+ if (!entry.GetTenant() && !entry.GetNodeType()) {
+ Cout << "Domain";
+ dirName = "domain";
+ }
+ Cout << Endl;
+
+ if (OutDir) {
+ TConfigWriter writer;
+ writer.Write(OutDir + "/" + dirName + "/current", entry.GetOldConfig());
+ writer.Write(OutDir + "/" + dirName + "/modified", entry.GetNewConfig());
+ }
+ }
+ }
+ }
+};
+
+class TClientCommandConsoleConfigsLoad : public TConsoleClientCommand {
+ TString Tenant;
+ TString NodeType;
+ TString Host;
+ ui32 NodeId;
+ TString OutDir;
+ TString Kind;
+
+public:
+ TClientCommandConsoleConfigsLoad()
+ : TConsoleClientCommand("load", {}, "Load config from CMS for node with specified attributes")
+ , NodeId(0)
+ {
+ }
+
+ virtual void Config(TConfig& config) override {
+ TConsoleClientCommand::Config(config);
+ config.Opts->AddLongOption("out-dir", "Output directory for configs")
+ .RequiredArgument("PATH").StoreResult(&OutDir).Required();
+ config.Opts->AddLongOption("tenant", "Tenant attribute for requested config")
+ .RequiredArgument("NAME").StoreResult(&Tenant);
+ config.Opts->AddLongOption("node-type", "Node type attribute for requested config")
+ .RequiredArgument("TYPE").StoreResult(&NodeType);
+ config.Opts->AddLongOption("node-id", "Tenant attribute for requested config")
+ .RequiredArgument("ID").StoreResult(&NodeId);
+ config.Opts->AddLongOption("host", "Host attribute for requested config")
+ .RequiredArgument("FQDN").StoreResult(&Host);
+ config.SetFreeArgsNum(0);
+ }
+
+ virtual void Parse(TConfig& config) override {
+ TConsoleClientCommand::Parse(config);
+
+ auto &rec = *Request.MutableGetNodeConfigRequest();
+ if (Tenant)
+ rec.MutableNode()->SetTenant(Tenant);
+ if (NodeType)
+ rec.MutableNode()->SetNodeType(NodeType);
+ if (NodeId)
+ rec.MutableNode()->SetNodeId(NodeId);
+ if (Host)
+ rec.MutableNode()->SetHost(Host);
+ }
+
virtual void PrintResponse(const NKikimrClient::TConsoleResponse &response) override
- {
- if (response.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
- Cout << "ERROR: " << response.GetStatus().GetCode()
- << " (" << response.GetStatus().GetReason() << ")" << Endl;
- return;
- }
-
- Cout << "OK" << Endl;
-
- TConfigWriter writer;
- writer.Write(OutDir, response.GetGetNodeConfigResponse().GetConfig());
- }
-};
-
-class TClientCommandConsoleConfigs : public TClientCommandTree {
-public:
- TClientCommandConsoleConfigs()
- : TClientCommandTree("configs", {}, "")
- {
+ {
+ if (response.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
+ Cout << "ERROR: " << response.GetStatus().GetCode()
+ << " (" << response.GetStatus().GetReason() << ")" << Endl;
+ return;
+ }
+
+ Cout << "OK" << Endl;
+
+ TConfigWriter writer;
+ writer.Write(OutDir, response.GetGetNodeConfigResponse().GetConfig());
+ }
+};
+
+class TClientCommandConsoleConfigs : public TClientCommandTree {
+public:
+ TClientCommandConsoleConfigs()
+ : TClientCommandTree("configs", {}, "")
+ {
AddCommand(std::make_unique<TClientCommandConsoleConfigsLoad>());
AddCommand(std::make_unique<TClientCommandConsoleConfigsUpdate>());
- }
-};
-
-class TClientCommandConsoleExecute : public TConsoleClientCommand {
-public:
- TClientCommandConsoleExecute()
- : TConsoleClientCommand("execute", { "exec" }, "Execute console request protobuf")
- {}
-
- virtual void Config(TConfig& config) override {
- TConsoleClientCommand::Config(config);
+ }
+};
+
+class TClientCommandConsoleExecute : public TConsoleClientCommand {
+public:
+ TClientCommandConsoleExecute()
+ : TConsoleClientCommand("execute", { "exec" }, "Execute console request protobuf")
+ {}
+
+ virtual void Config(TConfig& config) override {
+ TConsoleClientCommand::Config(config);
config.SetFreeArgsNum(1);
SetFreeArgTitle(0, "<SCHEMA-PROTO>", "Console request protobuf or file with protobuf");
- }
-
- virtual void Parse(TConfig& config) override {
- TConsoleClientCommand::Parse(config);
-
- ParseProtobuf(&Request, config.ParseResult->GetFreeArgs()[0]);
- }
-};
-
-class TClientCommandConsoleConfigGet : public TConsoleClientCommand {
-public:
- TClientCommandConsoleConfigGet()
- : TConsoleClientCommand("get", {}, "Get current Console config")
- {}
-
- virtual void Config(TConfig& config) override {
- TConsoleClientCommand::Config(config);
- }
-
- virtual void Parse(TConfig& config) override {
- TConsoleClientCommand::Parse(config);
- Request.MutableGetConfigRequest();
- }
-
- void PrintResponse(const NKikimrClient::TConsoleResponse &response) override
- {
+ }
+
+ virtual void Parse(TConfig& config) override {
+ TConsoleClientCommand::Parse(config);
+
+ ParseProtobuf(&Request, config.ParseResult->GetFreeArgs()[0]);
+ }
+};
+
+class TClientCommandConsoleConfigGet : public TConsoleClientCommand {
+public:
+ TClientCommandConsoleConfigGet()
+ : TConsoleClientCommand("get", {}, "Get current Console config")
+ {}
+
+ virtual void Config(TConfig& config) override {
+ TConsoleClientCommand::Config(config);
+ }
+
+ virtual void Parse(TConfig& config) override {
+ TConsoleClientCommand::Parse(config);
+ Request.MutableGetConfigRequest();
+ }
+
+ void PrintResponse(const NKikimrClient::TConsoleResponse &response) override
+ {
if (response.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
- TConsoleClientCommand::PrintResponse(response);
- } else {
- Cout << "Curent Console config: " << Endl
- << response.GetGetConfigResponse().GetConfig().DebugString();
- }
- }
-};
-
-class TClientCommandConsoleConfigSet : public TConsoleClientCommand {
-private:
- bool Merge = false;
- bool MergeOverwriteRepeated = false;
-
-public:
- TClientCommandConsoleConfigSet()
- : TConsoleClientCommand("set", {}, "Modify Console config")
- {}
-
- virtual void Config(TConfig& config) override {
- TConsoleClientCommand::Config(config);
- config.Opts->AddLongOption("merge", "Merge provided config with the current one")
- .NoArgument().SetFlag(&Merge);
- config.Opts->AddLongOption("merge-overwrite-repeated", "Merge provided config with the current one"
- " but overwrite those repeated field which are not empty in provided config")
- .NoArgument().SetFlag(&MergeOverwriteRepeated);
+ TConsoleClientCommand::PrintResponse(response);
+ } else {
+ Cout << "Curent Console config: " << Endl
+ << response.GetGetConfigResponse().GetConfig().DebugString();
+ }
+ }
+};
+
+class TClientCommandConsoleConfigSet : public TConsoleClientCommand {
+private:
+ bool Merge = false;
+ bool MergeOverwriteRepeated = false;
+
+public:
+ TClientCommandConsoleConfigSet()
+ : TConsoleClientCommand("set", {}, "Modify Console config")
+ {}
+
+ virtual void Config(TConfig& config) override {
+ TConsoleClientCommand::Config(config);
+ config.Opts->AddLongOption("merge", "Merge provided config with the current one")
+ .NoArgument().SetFlag(&Merge);
+ config.Opts->AddLongOption("merge-overwrite-repeated", "Merge provided config with the current one"
+ " but overwrite those repeated field which are not empty in provided config")
+ .NoArgument().SetFlag(&MergeOverwriteRepeated);
config.SetFreeArgsNum(1);
SetFreeArgTitle(0, "<CONFIG-PROTO>", "Console config protobuf or file with protobuf");
- }
-
- virtual void Parse(TConfig& config) override {
- TConsoleClientCommand::Parse(config);
-
- ParseProtobuf(Request.MutableSetConfigRequest()->MutableConfig(),
- config.ParseResult->GetFreeArgs()[0]);
-
- if (Merge && MergeOverwriteRepeated)
- ythrow yexception() << "can't apply both --merge and --merge-overwrite-repeated";
-
- if (Merge)
- Request.MutableSetConfigRequest()->SetMerge(NKikimrConsole::TConfigItem::MERGE);
- else if (MergeOverwriteRepeated)
- Request.MutableSetConfigRequest()->SetMerge(NKikimrConsole::TConfigItem::MERGE_OVERWRITE_REPEATED);
- }
-
- void PrintResponse(const NKikimrClient::TConsoleResponse &response) override
- {
+ }
+
+ virtual void Parse(TConfig& config) override {
+ TConsoleClientCommand::Parse(config);
+
+ ParseProtobuf(Request.MutableSetConfigRequest()->MutableConfig(),
+ config.ParseResult->GetFreeArgs()[0]);
+
+ if (Merge && MergeOverwriteRepeated)
+ ythrow yexception() << "can't apply both --merge and --merge-overwrite-repeated";
+
+ if (Merge)
+ Request.MutableSetConfigRequest()->SetMerge(NKikimrConsole::TConfigItem::MERGE);
+ else if (MergeOverwriteRepeated)
+ Request.MutableSetConfigRequest()->SetMerge(NKikimrConsole::TConfigItem::MERGE_OVERWRITE_REPEATED);
+ }
+
+ void PrintResponse(const NKikimrClient::TConsoleResponse &response) override
+ {
if (response.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
- TConsoleClientCommand::PrintResponse(response);
- } else {
- Cout << "OK" << Endl;
- }
- }
-};
-
-class TClientCommandConsoleConfig : public TClientCommandTree {
-public:
- TClientCommandConsoleConfig()
- : TClientCommandTree("config", {}, "")
- {
+ TConsoleClientCommand::PrintResponse(response);
+ } else {
+ Cout << "OK" << Endl;
+ }
+ }
+};
+
+class TClientCommandConsoleConfig : public TClientCommandTree {
+public:
+ TClientCommandConsoleConfig()
+ : TClientCommandTree("config", {}, "")
+ {
AddCommand(std::make_unique<TClientCommandConsoleConfigGet>());
AddCommand(std::make_unique<TClientCommandConsoleConfigSet>());
- }
-};
-
-class TClientCommandConsoleToggleValidator : public TConsoleClientCommand {
-private:
- bool Disable;
-
-public:
- TClientCommandConsoleToggleValidator(const TString &name,
- const TString &descr,
- bool disable)
- : TConsoleClientCommand(name, {}, descr)
- , Disable(disable)
- {}
-
- virtual void Config(TConfig& config) override {
- TConsoleClientCommand::Config(config);
- config.SetFreeArgsNum(1);
- SetFreeArgTitle(0, "<NAME>", "Config validator name");
- }
-
- virtual void Parse(TConfig& config) override {
- TConsoleClientCommand::Parse(config);
-
- auto &rec = *Request.MutableToggleConfigValidatorRequest();
- rec.SetName(config.ParseResult->GetFreeArgs()[0]);
- rec.SetDisable(Disable);
- }
-
- void PrintResponse(const NKikimrClient::TConsoleResponse &response) override
- {
- if (response.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
- TConsoleClientCommand::PrintResponse(response);
- } else {
- Cout << "OK" << Endl;
- }
- }
-};
-
-class TClientCommandConsoleValidatorEnable : public TClientCommandConsoleToggleValidator {
-private:
-
-public:
- TClientCommandConsoleValidatorEnable()
- : TClientCommandConsoleToggleValidator("enable", "Enable config validator", false)
- {}
-};
-
-class TClientCommandConsoleValidatorDisable : public TClientCommandConsoleToggleValidator {
-private:
-
-public:
- TClientCommandConsoleValidatorDisable()
- : TClientCommandConsoleToggleValidator("disable", "Disable config validator", true)
- {}
-};
-
-class TClientCommandConsoleValidatorList : public TConsoleClientCommand {
-private:
-
-public:
- TClientCommandConsoleValidatorList()
- : TConsoleClientCommand("list", {}, "List config validators")
- {}
-
- virtual void Config(TConfig& config) override {
- TConsoleClientCommand::Config(config);
- }
-
- virtual void Parse(TConfig& config) override {
- TConsoleClientCommand::Parse(config);
-
- Request.MutableListConfigValidatorsRequest();
- }
-
- void PrintResponse(const NKikimrClient::TConsoleResponse &response) override
- {
- if (response.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
- TConsoleClientCommand::PrintResponse(response);
- } else {
- for (auto &rec : response.GetListConfigValidatorsResponse().GetValidators()) {
- Cout << "- " << rec.GetName()
- << (rec.GetEnabled() ? " ENABLED" : " DISABLED") << Endl
- << " " << rec.GetDescription() << Endl
- << " CheckedItems:";
-
- if (rec.CheckedItemKindsSize()) {
- for (auto &kind : rec.GetCheckedItemKinds())
- Cout << " " << static_cast<NKikimrConsole::TConfigItem::EKind>(kind);
- } else {
- Cout << " ALL";
- }
- Cout << Endl;
- }
- }
- }
-};
-
-class TClientCommandConsoleValidator : public TClientCommandTree {
-public:
- TClientCommandConsoleValidator()
- : TClientCommandTree("validator", {}, "")
- {
+ }
+};
+
+class TClientCommandConsoleToggleValidator : public TConsoleClientCommand {
+private:
+ bool Disable;
+
+public:
+ TClientCommandConsoleToggleValidator(const TString &name,
+ const TString &descr,
+ bool disable)
+ : TConsoleClientCommand(name, {}, descr)
+ , Disable(disable)
+ {}
+
+ virtual void Config(TConfig& config) override {
+ TConsoleClientCommand::Config(config);
+ config.SetFreeArgsNum(1);
+ SetFreeArgTitle(0, "<NAME>", "Config validator name");
+ }
+
+ virtual void Parse(TConfig& config) override {
+ TConsoleClientCommand::Parse(config);
+
+ auto &rec = *Request.MutableToggleConfigValidatorRequest();
+ rec.SetName(config.ParseResult->GetFreeArgs()[0]);
+ rec.SetDisable(Disable);
+ }
+
+ void PrintResponse(const NKikimrClient::TConsoleResponse &response) override
+ {
+ if (response.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
+ TConsoleClientCommand::PrintResponse(response);
+ } else {
+ Cout << "OK" << Endl;
+ }
+ }
+};
+
+class TClientCommandConsoleValidatorEnable : public TClientCommandConsoleToggleValidator {
+private:
+
+public:
+ TClientCommandConsoleValidatorEnable()
+ : TClientCommandConsoleToggleValidator("enable", "Enable config validator", false)
+ {}
+};
+
+class TClientCommandConsoleValidatorDisable : public TClientCommandConsoleToggleValidator {
+private:
+
+public:
+ TClientCommandConsoleValidatorDisable()
+ : TClientCommandConsoleToggleValidator("disable", "Disable config validator", true)
+ {}
+};
+
+class TClientCommandConsoleValidatorList : public TConsoleClientCommand {
+private:
+
+public:
+ TClientCommandConsoleValidatorList()
+ : TConsoleClientCommand("list", {}, "List config validators")
+ {}
+
+ virtual void Config(TConfig& config) override {
+ TConsoleClientCommand::Config(config);
+ }
+
+ virtual void Parse(TConfig& config) override {
+ TConsoleClientCommand::Parse(config);
+
+ Request.MutableListConfigValidatorsRequest();
+ }
+
+ void PrintResponse(const NKikimrClient::TConsoleResponse &response) override
+ {
+ if (response.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
+ TConsoleClientCommand::PrintResponse(response);
+ } else {
+ for (auto &rec : response.GetListConfigValidatorsResponse().GetValidators()) {
+ Cout << "- " << rec.GetName()
+ << (rec.GetEnabled() ? " ENABLED" : " DISABLED") << Endl
+ << " " << rec.GetDescription() << Endl
+ << " CheckedItems:";
+
+ if (rec.CheckedItemKindsSize()) {
+ for (auto &kind : rec.GetCheckedItemKinds())
+ Cout << " " << static_cast<NKikimrConsole::TConfigItem::EKind>(kind);
+ } else {
+ Cout << " ALL";
+ }
+ Cout << Endl;
+ }
+ }
+ }
+};
+
+class TClientCommandConsoleValidator : public TClientCommandTree {
+public:
+ TClientCommandConsoleValidator()
+ : TClientCommandTree("validator", {}, "")
+ {
AddCommand(std::make_unique<TClientCommandConsoleValidatorDisable>());
AddCommand(std::make_unique<TClientCommandConsoleValidatorEnable>());
AddCommand(std::make_unique<TClientCommandConsoleValidatorList>());
- }
-};
-
-TClientCommandConsole::TClientCommandConsole()
- : TClientCommandTree("console", {}, "Console commands")
-{
+ }
+};
+
+TClientCommandConsole::TClientCommandConsole()
+ : TClientCommandTree("console", {}, "Console commands")
+{
AddCommand(std::make_unique<TClientCommandConsoleConfig>());
AddCommand(std::make_unique<TClientCommandConsoleConfigs>());
AddCommand(std::make_unique<TClientCommandConsoleExecute>());
AddCommand(std::make_unique<TClientCommandConsoleValidator>());
-}
-
-}
-}
+}
+
+}
+}
diff --git a/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp b/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp
index 68554fcc0d2..6766dd31719 100644
--- a/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp
+++ b/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp
@@ -5,14 +5,14 @@
#include <ydb/core/driver_lib/run/run.h>
#include <ydb/library/yaml_config/yaml_config_parser.h>
#include <ydb/public/lib/deprecated/kicli/kicli.h>
-#include <util/digest/city.h>
+#include <util/digest/city.h>
#include <util/random/random.h>
#include <util/string/cast.h>
#include <util/system/file.h>
#include <util/system/fs.h>
-#include <util/system/hostname.h>
+#include <util/system/hostname.h>
#include <google/protobuf/text_format.h>
-
+
extern TAutoPtr<NKikimrConfig::TActorSystemConfig> DummyActorSystemConfig();
extern TAutoPtr<NKikimrConfig::TAllocatorConfig> DummyAllocatorConfig();
@@ -34,7 +34,7 @@ protected:
TString ClusterName; // log settings
ui32 NodeId;
- TString NodeIdValue;
+ TString NodeIdValue;
ui32 DefaultInterconnectPort = 19001;
ui32 BusProxyPort;
NBus::TBusQueueConfig ProxyBusQueueConfig;
@@ -50,29 +50,29 @@ protected:
TVector<TString> UDFsPaths;
TString HostLabelOverride;
TString TenantName;
- TString TenantDomain;
- TString TenantSlotType;
- TString TenantSlotId;
+ TString TenantDomain;
+ TString TenantSlotType;
+ TString TenantSlotId;
ui64 TenantCPU;
ui64 TenantMemory;
ui64 TenantNetwork;
TVector<TString> NodeBrokerAddresses;
- ui32 NodeBrokerPort;
+ ui32 NodeBrokerPort;
bool NodeBrokerUseTls;
- bool FixedNodeID;
- bool IgnoreCmsConfigs;
+ bool FixedNodeID;
+ bool IgnoreCmsConfigs;
bool HierarchicalCfg;
TString NodeAddress;
TString NodeHost;
- TString NodeResolveHost;
- TString NodeDomain;
- ui32 InterconnectPort;
+ TString NodeResolveHost;
+ TString NodeDomain;
+ ui32 InterconnectPort;
ui32 SqsHttpPort;
- TString NodeType;
- TString DataCenter;
- TString Rack;
- ui32 Body;
- ui32 GRpcPort;
+ TString NodeType;
+ TString DataCenter;
+ TString Rack;
+ ui32 Body;
+ ui32 GRpcPort;
ui32 GRpcsPort;
TString GRpcPublicHost;
ui32 GRpcPublicPort;
@@ -98,28 +98,28 @@ protected:
LogSamplingRate = 0;
NodeId = 0;
- NodeIdValue = "";
+ NodeIdValue = "";
BusProxyPort = NMsgBusProxy::TProtocol::DefaultPort;
MonitoringPort = 0;
MonitoringThreads = 10;
RestartsCountFile = "";
CompileInflightLimit = 100000;
TenantName = "";
- TenantSlotType = "default";
- TenantSlotId = "";
+ TenantSlotType = "default";
+ TenantSlotId = "";
TenantCPU = 0;
TenantMemory = 0;
TenantNetwork = 0;
- NodeBrokerPort = 0;
+ NodeBrokerPort = 0;
NodeBrokerUseTls = false;
- FixedNodeID = false;
- InterconnectPort = 0;
+ FixedNodeID = false;
+ InterconnectPort = 0;
SqsHttpPort = 0;
- IgnoreCmsConfigs = false;
- DataCenter = "";
- Rack = "";
- Body = 0;
- GRpcPort = 0;
+ IgnoreCmsConfigs = false;
+ DataCenter = "";
+ Rack = "";
+ Body = 0;
+ GRpcPort = 0;
GRpcsPort = 0;
GRpcPublicHost = "";
GRpcPublicPort = 0;
@@ -144,36 +144,36 @@ protected:
config.Opts->AddLongOption("syslog-service-tag", "unique tag for syslog").RequiredArgument("NAME").StoreResult(&SysLogServiceTag);
config.Opts->AddLongOption("log-file-name", "file name for log backend").RequiredArgument("NAME").StoreResult(&LogFileName);
config.Opts->AddLongOption("tcp", "start tcp interconnect").NoArgument();
- config.Opts->AddLongOption('n', "node", "Node ID or 'static' to auto-detect using naming file and ic-port, or 'dynamic' for dynamic nodes, or 'dynamic-fixed' for dynamic nodes with infinite node ID lease (for dynamic storage nodes)")
- .RequiredArgument("[NUM|static|dynamic]").StoreResult(&NodeIdValue);
- config.Opts->AddLongOption("node-broker", "node broker address host:port")
+ config.Opts->AddLongOption('n', "node", "Node ID or 'static' to auto-detect using naming file and ic-port, or 'dynamic' for dynamic nodes, or 'dynamic-fixed' for dynamic nodes with infinite node ID lease (for dynamic storage nodes)")
+ .RequiredArgument("[NUM|static|dynamic]").StoreResult(&NodeIdValue);
+ config.Opts->AddLongOption("node-broker", "node broker address host:port")
.RequiredArgument("ADDR").AppendTo(&NodeBrokerAddresses);
- config.Opts->AddLongOption("node-broker-port", "node broker port (hosts from naming file are used)")
- .RequiredArgument("PORT").StoreResult(&NodeBrokerPort);
+ config.Opts->AddLongOption("node-broker-port", "node broker port (hosts from naming file are used)")
+ .RequiredArgument("PORT").StoreResult(&NodeBrokerPort);
config.Opts->AddLongOption("node-broker-use-tls", "use tls for node broker (hosts from naming file are used)")
.RequiredArgument("PORT").StoreResult(&NodeBrokerUseTls);
config.Opts->AddLongOption("node-address", "address for dynamic node")
.RequiredArgument("ADDR").StoreResult(&NodeAddress);
config.Opts->AddLongOption("node-host", "hostname for dynamic node")
.RequiredArgument("NAME").StoreResult(&NodeHost);
- config.Opts->AddLongOption("node-resolve-host", "resolve hostname for dynamic node")
- .RequiredArgument("NAME").StoreResult(&NodeResolveHost);
- config.Opts->AddLongOption("node-domain", "domain for dynamic node to register in")
- .RequiredArgument("NAME").StoreResult(&NodeDomain);
- config.Opts->AddLongOption("ic-port", "interconnect port")
- .RequiredArgument("NUM").StoreResult(&InterconnectPort);
+ config.Opts->AddLongOption("node-resolve-host", "resolve hostname for dynamic node")
+ .RequiredArgument("NAME").StoreResult(&NodeResolveHost);
+ config.Opts->AddLongOption("node-domain", "domain for dynamic node to register in")
+ .RequiredArgument("NAME").StoreResult(&NodeDomain);
+ config.Opts->AddLongOption("ic-port", "interconnect port")
+ .RequiredArgument("NUM").StoreResult(&InterconnectPort);
config.Opts->AddLongOption("sqs-port", "sqs port")
.RequiredArgument("NUM").StoreResult(&SqsHttpPort);
config.Opts->AddLongOption("proxy", "Bind to proxy(-ies)").RequiredArgument("ADDR").AppendTo(&ProxyBindToProxy);
config.Opts->AddLongOption("host-label-override", "overrides host label for slot").RequiredArgument("NAME").StoreResult(&HostLabelOverride);
- config.Opts->AddLongOption("tenant", "add binding for Local service to specified tenant, might be one of {'no', 'dynamic', '/<root>', '/<root>/<path_to_user>'}")
+ config.Opts->AddLongOption("tenant", "add binding for Local service to specified tenant, might be one of {'no', 'dynamic', '/<root>', '/<root>/<path_to_user>'}")
.RequiredArgument("NAME").StoreResult(&TenantName);
- config.Opts->AddLongOption("tenant-slot-type", "set tenant slot type for dynamic tenant")
- .RequiredArgument("NAME").StoreResult(&TenantSlotType);
- config.Opts->AddLongOption("tenant-slot-id", "set tenant slot id (for static tenants it is used for monitoring)")
- .RequiredArgument("NAME").StoreResult(&TenantSlotId);
- config.Opts->AddLongOption("tenant-domain", "specify domain for dynamic tenant")
- .RequiredArgument("NAME").StoreResult(&TenantDomain);
+ config.Opts->AddLongOption("tenant-slot-type", "set tenant slot type for dynamic tenant")
+ .RequiredArgument("NAME").StoreResult(&TenantSlotType);
+ config.Opts->AddLongOption("tenant-slot-id", "set tenant slot id (for static tenants it is used for monitoring)")
+ .RequiredArgument("NAME").StoreResult(&TenantSlotId);
+ config.Opts->AddLongOption("tenant-domain", "specify domain for dynamic tenant")
+ .RequiredArgument("NAME").StoreResult(&TenantDomain);
config.Opts->AddLongOption("tenant-cpu", "specify CPU limit tenant binding")
.RequiredArgument("NUM").StoreResult(&TenantCPU);
config.Opts->AddLongOption("tenant-memory", "specify Memory limit for tenant binding")
@@ -188,16 +188,16 @@ protected:
// config.Opts->AddLongOption('u', "url-base", "url base to request configs from").OptionalArgument("URL");
config.Opts->AddLongOption("sys-file", "actor system config file (use dummy config by default)").OptionalArgument("PATH");
config.Opts->AddLongOption("naming-file", "static nameservice config file").OptionalArgument("PATH");
- config.Opts->AddLongOption("domains-file", "domain config file").OptionalArgument("PATH");
+ config.Opts->AddLongOption("domains-file", "domain config file").OptionalArgument("PATH");
config.Opts->AddLongOption("bs-file", "blobstorage config file").OptionalArgument("PATH");
config.Opts->AddLongOption("log-file", "log config file").OptionalArgument("PATH");
config.Opts->AddLongOption("ic-file", "interconnect config file").OptionalArgument("PATH");
- config.Opts->AddLongOption("channels-file", "tablet channel profile config file").OptionalArgument("PATH");
+ config.Opts->AddLongOption("channels-file", "tablet channel profile config file").OptionalArgument("PATH");
config.Opts->AddLongOption("vdisk-file", "vdisk kind config file").OptionalArgument("PATH");
config.Opts->AddLongOption("drivemodel-file", "drive model config file").OptionalArgument("PATH");
config.Opts->AddLongOption("grpc-file", "gRPC config file").OptionalArgument("PATH");
- config.Opts->AddLongOption("tenant-pool-file", "Tenant Pool service config file").OptionalArgument("PATH");
- config.Opts->AddLongOption("grpc-port", "enable gRPC server on port").RequiredArgument("PORT").StoreResult(&GRpcPort);
+ config.Opts->AddLongOption("tenant-pool-file", "Tenant Pool service config file").OptionalArgument("PATH");
+ config.Opts->AddLongOption("grpc-port", "enable gRPC server on port").RequiredArgument("PORT").StoreResult(&GRpcPort);
config.Opts->AddLongOption("grpcs-port", "enable gRPC SSL server on port").RequiredArgument("PORT").StoreResult(&GRpcsPort);
config.Opts->AddLongOption("grpc-public-host", "set public gRPC host for discovery").RequiredArgument("HOST").StoreResult(&GRpcPublicHost);
config.Opts->AddLongOption("grpc-public-port", "set public gRPC port for discovery").RequiredArgument("PORT").StoreResult(&GRpcPublicPort);
@@ -217,8 +217,8 @@ protected:
config.Opts->AddLongOption("pdisk-key-file", "pdisk encryption key configuration").OptionalArgument("PATH");
config.Opts->AddLongOption("sqs-file", "SQS config file").OptionalArgument("PATH");
config.Opts->AddLongOption("bootstrap-file", "Bootstrap config file").OptionalArgument("PATH");
- config.Opts->AddLongOption("dyn-nodes-file", "Dynamic nodes config file").OptionalArgument("PATH");
- config.Opts->AddLongOption("cms-file", "CMS config file").OptionalArgument("PATH");
+ config.Opts->AddLongOption("dyn-nodes-file", "Dynamic nodes config file").OptionalArgument("PATH");
+ config.Opts->AddLongOption("cms-file", "CMS config file").OptionalArgument("PATH");
config.Opts->AddLongOption("alloc-file", "Allocator config file").OptionalArgument("PATH");
config.Opts->AddLongOption("yql-file", "Yql Analytics config file").OptionalArgument("PATH");
config.Opts->AddLongOption("yq-file", "Yandex Query config file").OptionalArgument("PATH");
@@ -230,19 +230,19 @@ protected:
config.Opts->AddLongOption("compile-inflight-limit", "Limit on parallel programs compilation").OptionalArgument("NUM").StoreResult(&CompileInflightLimit);
config.Opts->AddLongOption("udf", "Load shared library with UDF by given path").AppendTo(&UDFsPaths);
config.Opts->AddLongOption("udfs-dir", "Load all shared libraries with UDFs found in given directory").StoreResult(&UDFsDir);
- config.Opts->AddLongOption("node-type", "Type of the node")
- .RequiredArgument("NAME").StoreResult(&NodeType);
- config.Opts->AddLongOption("ignore-cms-configs", "Don't load configs from CMS")
- .NoArgument().SetFlag(&IgnoreCmsConfigs);
+ config.Opts->AddLongOption("node-type", "Type of the node")
+ .RequiredArgument("NAME").StoreResult(&NodeType);
+ config.Opts->AddLongOption("ignore-cms-configs", "Don't load configs from CMS")
+ .NoArgument().SetFlag(&IgnoreCmsConfigs);
config.Opts->AddLongOption("cert", "Path to client certificate file (PEM)").RequiredArgument("PATH").StoreResult(&PathToCert);
config.Opts->AddLongOption("key", "Path to private key file (PEM)").RequiredArgument("PATH").StoreResult(&PathToPKey);
config.Opts->AddLongOption("ca", "Path to certificate authority file (PEM)").RequiredArgument("PATH").StoreResult(&PathToCA);
- config.Opts->AddLongOption("data-center", "data center name (used to describe dynamic node location)")
- .RequiredArgument("NAME").StoreResult(&DataCenter);
- config.Opts->AddLongOption("rack", "rack name (used to describe dynamic node location)")
- .RequiredArgument("NAME").StoreResult(&Rack);
- config.Opts->AddLongOption("body", "body name (used to describe dynamic node location)")
- .RequiredArgument("NUM").StoreResult(&Body);
+ config.Opts->AddLongOption("data-center", "data center name (used to describe dynamic node location)")
+ .RequiredArgument("NAME").StoreResult(&DataCenter);
+ config.Opts->AddLongOption("rack", "rack name (used to describe dynamic node location)")
+ .RequiredArgument("NAME").StoreResult(&Rack);
+ config.Opts->AddLongOption("body", "body name (used to describe dynamic node location)")
+ .RequiredArgument("NUM").StoreResult(&Body);
config.Opts->AddLongOption("yaml-config", "Yaml config").OptionalArgument("PATH").AppendTo(&YamlConfigFiles);
config.Opts->AddLongOption("cms-config-cache-file", "Path to CMS cache config file").OptionalArgument("PATH")
.StoreResult(&RunConfig.PathToConfigCacheFile);
@@ -326,79 +326,79 @@ protected:
}
OPTION("naming-file", NameserviceConfig);
-
- if (config.ParseResult->Has("node")) {
- if (NodeIdValue == "static") {
+
+ if (config.ParseResult->Has("node")) {
+ if (NodeIdValue == "static") {
if (!AppConfig.HasNameserviceConfig() || !InterconnectPort)
- ythrow yexception() << "'--node static' requires naming file and IC port to be specified";
- TString hostname;
- try {
- hostname = HostName();
- hostname.to_lower();
- const NKikimrConfig::TStaticNameserviceConfig& nameserviceConfig = AppConfig.GetNameserviceConfig();
- for (const auto& node : nameserviceConfig.GetNode()) {
- if (node.GetHost() == hostname && InterconnectPort == node.GetPort()) {
- NodeId = node.GetNodeId();
- break;
- }
- }
- } catch(TSystemError& e) {
- ythrow yexception() << "cannot detect host name: " << e.what();
- }
- if (!NodeId)
- ythrow yexception() << "cannot detect node ID for " << hostname << ":" << InterconnectPort;
- Cout << "Determined node ID: " << NodeId << Endl;
- } else if (NodeIdValue == "dynamic") {
- } else if (NodeIdValue == "dynamic-fixed") {
- FixedNodeID = true;
- } else {
- if (!TryFromString(NodeIdValue, NodeId))
- ythrow yexception() << "wrong '--node' value (should be NUM, 'static', or 'dynamic')";
- }
- }
-
- if (config.ParseResult->Has("tenant")) {
- if (!IsStartWithSlash(TenantName) && TenantName != "no" && TenantName != "dynamic") {
- ythrow yexception() << "lead / in --tenant parametr is always required except from 'no' and 'dynamic'";
- }
- if (TenantName != "no" && NodeId) {
- ythrow yexception() << "opt '--node' compatible only with '--tenant no', opt 'node' incompatible with any other values of opt '--tenant'";
- }
- if (config.ParseResult->Has("tenant-pool-file")) {
- ythrow yexception() << "opt '--tenant' is incompatible with --tenant-pool-file";
- }
- }
-
- MaybeRegisterAndLoadConfigs();
-
+ ythrow yexception() << "'--node static' requires naming file and IC port to be specified";
+ TString hostname;
+ try {
+ hostname = HostName();
+ hostname.to_lower();
+ const NKikimrConfig::TStaticNameserviceConfig& nameserviceConfig = AppConfig.GetNameserviceConfig();
+ for (const auto& node : nameserviceConfig.GetNode()) {
+ if (node.GetHost() == hostname && InterconnectPort == node.GetPort()) {
+ NodeId = node.GetNodeId();
+ break;
+ }
+ }
+ } catch(TSystemError& e) {
+ ythrow yexception() << "cannot detect host name: " << e.what();
+ }
+ if (!NodeId)
+ ythrow yexception() << "cannot detect node ID for " << hostname << ":" << InterconnectPort;
+ Cout << "Determined node ID: " << NodeId << Endl;
+ } else if (NodeIdValue == "dynamic") {
+ } else if (NodeIdValue == "dynamic-fixed") {
+ FixedNodeID = true;
+ } else {
+ if (!TryFromString(NodeIdValue, NodeId))
+ ythrow yexception() << "wrong '--node' value (should be NUM, 'static', or 'dynamic')";
+ }
+ }
+
+ if (config.ParseResult->Has("tenant")) {
+ if (!IsStartWithSlash(TenantName) && TenantName != "no" && TenantName != "dynamic") {
+ ythrow yexception() << "lead / in --tenant parametr is always required except from 'no' and 'dynamic'";
+ }
+ if (TenantName != "no" && NodeId) {
+ ythrow yexception() << "opt '--node' compatible only with '--tenant no', opt 'node' incompatible with any other values of opt '--tenant'";
+ }
+ if (config.ParseResult->Has("tenant-pool-file")) {
+ ythrow yexception() << "opt '--tenant' is incompatible with --tenant-pool-file";
+ }
+ }
+
+ MaybeRegisterAndLoadConfigs();
+
LoadYamlConfig();
OPTION("sys-file", ActorSystemConfig);
- if (!AppConfig.HasActorSystemConfig()) {
+ if (!AppConfig.HasActorSystemConfig()) {
AppConfig.MutableActorSystemConfig()->CopyFrom(*DummyActorSystemConfig());
- }
-
+ }
+
OPTION("domains-file", DomainsConfig);
OPTION("bs-file", BlobStorageConfig);
if (auto logConfig = OPTION("log-file", LogConfig)) {
- if (config.ParseResult->Has("syslog"))
- logConfig->SetSysLog(true);
- if (config.ParseResult->Has("log-level"))
- logConfig->SetDefaultLevel(LogLevel);
- if (config.ParseResult->Has("log-sampling-level"))
- logConfig->SetDefaultSamplingLevel(LogSamplingLevel);
- if (config.ParseResult->Has("log-sampling-rate"))
- logConfig->SetDefaultSamplingRate(LogSamplingRate);
- if (config.ParseResult->Has("log-format"))
- logConfig->SetFormat(LogFormat);
- if (config.ParseResult->Has("cluster-name"))
- logConfig->SetClusterName(ClusterName);
+ if (config.ParseResult->Has("syslog"))
+ logConfig->SetSysLog(true);
+ if (config.ParseResult->Has("log-level"))
+ logConfig->SetDefaultLevel(LogLevel);
+ if (config.ParseResult->Has("log-sampling-level"))
+ logConfig->SetDefaultSamplingLevel(LogSamplingLevel);
+ if (config.ParseResult->Has("log-sampling-rate"))
+ logConfig->SetDefaultSamplingRate(LogSamplingRate);
+ if (config.ParseResult->Has("log-format"))
+ logConfig->SetFormat(LogFormat);
+ if (config.ParseResult->Has("cluster-name"))
+ logConfig->SetClusterName(ClusterName);
}
- // This flag is set per node and we prefer flag over CMS.
- if (config.ParseResult->Has("syslog-service-tag")
- && !AppConfig.GetLogConfig().GetSysLogService())
- AppConfig.MutableLogConfig()->SetSysLogService(SysLogServiceTag);
+ // This flag is set per node and we prefer flag over CMS.
+ if (config.ParseResult->Has("syslog-service-tag")
+ && !AppConfig.GetLogConfig().GetSysLogService())
+ AppConfig.MutableLogConfig()->SetSysLogService(SysLogServiceTag);
if (config.ParseResult->Has("log-file-name"))
AppConfig.MutableLogConfig()->SetBackendFileName(LogFileName);
@@ -470,8 +470,8 @@ protected:
Y_VERIFY(RunConfig.ScopeId.IsEmpty());
RunConfig.ScopeId = TKikimrScopeId::DynamicTenantScopeId;
}
- if (NodeId)
- RunConfig.NodeId = NodeId;
+ if (NodeId)
+ RunConfig.NodeId = NodeId;
if (AppConfig.HasNameserviceConfig() && NodeId) {
bool nodeIdMatchesConfig = false;
TString localhost("localhost");
@@ -505,31 +505,31 @@ protected:
}
}
- // apply options affecting UDF paths
- if (!AppConfig.HasUDFsDir())
- AppConfig.SetUDFsDir(UDFsDir);
- if (!AppConfig.UDFsPathsSize()) {
- for (const auto& path : UDFsPaths) {
- AppConfig.AddUDFsPaths(path);
- }
- }
-
- if (!AppConfig.HasMonitoringConfig())
- AppConfig.MutableMonitoringConfig()->SetMonitoringThreads(MonitoringThreads);
- if (!AppConfig.HasRestartsCountConfig() && RestartsCountFile)
- AppConfig.MutableRestartsCountConfig()->SetRestartsCountFile(RestartsCountFile);
-
- // Ports and node type are always applied (event if config was loaded from CMS).
- if (MonitoringPort)
- AppConfig.MutableMonitoringConfig()->SetMonitoringPort(MonitoringPort);
+ // apply options affecting UDF paths
+ if (!AppConfig.HasUDFsDir())
+ AppConfig.SetUDFsDir(UDFsDir);
+ if (!AppConfig.UDFsPathsSize()) {
+ for (const auto& path : UDFsPaths) {
+ AppConfig.AddUDFsPaths(path);
+ }
+ }
+
+ if (!AppConfig.HasMonitoringConfig())
+ AppConfig.MutableMonitoringConfig()->SetMonitoringThreads(MonitoringThreads);
+ if (!AppConfig.HasRestartsCountConfig() && RestartsCountFile)
+ AppConfig.MutableRestartsCountConfig()->SetRestartsCountFile(RestartsCountFile);
+
+ // Ports and node type are always applied (event if config was loaded from CMS).
+ if (MonitoringPort)
+ AppConfig.MutableMonitoringConfig()->SetMonitoringPort(MonitoringPort);
if (MonitoringAddress)
AppConfig.MutableMonitoringConfig()->SetMonitoringAddress(MonitoringAddress);
if (SqsHttpPort)
RunConfig.AppConfig.MutableSqsConfig()->MutableHttpServerConfig()->SetPort(SqsHttpPort);
- if (GRpcPort) {
- auto& conf = *AppConfig.MutableGRpcConfig();
- conf.SetStartGRpcProxy(true);
- conf.SetPort(GRpcPort);
+ if (GRpcPort) {
+ auto& conf = *AppConfig.MutableGRpcConfig();
+ conf.SetStartGRpcProxy(true);
+ conf.SetPort(GRpcPort);
}
if (GRpcsPort) {
auto& conf = *AppConfig.MutableGRpcConfig();
@@ -557,9 +557,9 @@ protected:
if (GRpcPublicTargetNameOverride) {
AppConfig.MutableGRpcConfig()->SetPublicTargetNameOverride(GRpcPublicTargetNameOverride);
}
- if (config.ParseResult->Has("node-type"))
- AppConfig.MutableTenantPoolConfig()->SetNodeType(NodeType);
-
+ if (config.ParseResult->Has("node-type"))
+ AppConfig.MutableTenantPoolConfig()->SetNodeType(NodeType);
+
if (config.ParseResult->Has("host-label-override")) {
AppConfig.MutableMonitoringConfig()->SetHostLabelOverride(HostLabelOverride);
} else {
@@ -578,55 +578,55 @@ protected:
AppConfig.MutableMonitoringConfig()->SetProcessLocation(HostAndICPort());
}
- // Add binding.
- if (!AppConfig.HasTenantPoolConfig() && config.ParseResult->Has("tenant")) {
- if (TenantName == "no") {
- AppConfig.MutableTenantPoolConfig()->SetIsEnabled(false);
- } else {
- auto &slot = *AppConfig.MutableTenantPoolConfig()->AddSlots();
- if (TenantName == "dynamic") {
- TString tenantDomain = DeduceTenantDomain();
- if (!tenantDomain) {
- ythrow yexception() << "cannot deduce domain for dynamic tenant, use '--tenant-domain' opt";
- }
- slot.SetId(TenantSlotId ? TenantSlotId : "dynamic-slot");
- slot.SetDomainName(tenantDomain);
- slot.SetIsDynamic(true);
- slot.SetType(TenantSlotType);
- } else {
- slot.SetId(TenantSlotId ? TenantSlotId : "static-slot");
- slot.SetTenantName(TenantName);
- slot.SetIsDynamic(false);
- }
- if (config.ParseResult->Has("tenant-cpu"))
- slot.MutableResourceLimit()->SetCPU(TenantCPU);
- if (config.ParseResult->Has("tenant-memory"))
- slot.MutableResourceLimit()->SetMemory(TenantMemory);
- if (config.ParseResult->Has("tenant-network"))
- slot.MutableResourceLimit()->SetNetwork(TenantNetwork);
- }
- }
-
+ // Add binding.
+ if (!AppConfig.HasTenantPoolConfig() && config.ParseResult->Has("tenant")) {
+ if (TenantName == "no") {
+ AppConfig.MutableTenantPoolConfig()->SetIsEnabled(false);
+ } else {
+ auto &slot = *AppConfig.MutableTenantPoolConfig()->AddSlots();
+ if (TenantName == "dynamic") {
+ TString tenantDomain = DeduceTenantDomain();
+ if (!tenantDomain) {
+ ythrow yexception() << "cannot deduce domain for dynamic tenant, use '--tenant-domain' opt";
+ }
+ slot.SetId(TenantSlotId ? TenantSlotId : "dynamic-slot");
+ slot.SetDomainName(tenantDomain);
+ slot.SetIsDynamic(true);
+ slot.SetType(TenantSlotType);
+ } else {
+ slot.SetId(TenantSlotId ? TenantSlotId : "static-slot");
+ slot.SetTenantName(TenantName);
+ slot.SetIsDynamic(false);
+ }
+ if (config.ParseResult->Has("tenant-cpu"))
+ slot.MutableResourceLimit()->SetCPU(TenantCPU);
+ if (config.ParseResult->Has("tenant-memory"))
+ slot.MutableResourceLimit()->SetMemory(TenantMemory);
+ if (config.ParseResult->Has("tenant-network"))
+ slot.MutableResourceLimit()->SetNetwork(TenantNetwork);
+ }
+ }
+
// MessageBus options.
- if (!AppConfig.HasMessageBusConfig()) {
- auto messageBusConfig = AppConfig.MutableMessageBusConfig();
- messageBusConfig->SetStartBusProxy(config.ParseResult->Has(config.Opts->FindLongOption("mbus")));
- messageBusConfig->SetBusProxyPort(BusProxyPort);
-
- if (!messageBusConfig->GetStartBusProxy()) {
- for (const auto &option : config.Opts->Opts_) {
- for (const TString &longName : option->GetLongNames()) {
- if (longName.StartsWith("mbus-") && config.ParseResult->Has(option.Get())) {
- ythrow yexception() << "option --" << longName << " is useless without --mbus option";
- }
+ if (!AppConfig.HasMessageBusConfig()) {
+ auto messageBusConfig = AppConfig.MutableMessageBusConfig();
+ messageBusConfig->SetStartBusProxy(config.ParseResult->Has(config.Opts->FindLongOption("mbus")));
+ messageBusConfig->SetBusProxyPort(BusProxyPort);
+
+ if (!messageBusConfig->GetStartBusProxy()) {
+ for (const auto &option : config.Opts->Opts_) {
+ for (const TString &longName : option->GetLongNames()) {
+ if (longName.StartsWith("mbus-") && config.ParseResult->Has(option.Get())) {
+ ythrow yexception() << "option --" << longName << " is useless without --mbus option";
+ }
}
}
}
- auto queueConfig = messageBusConfig->MutableProxyBusQueueConfig();
- queueConfig->SetName(ProxyBusQueueConfig.Name);
- queueConfig->SetNumWorkers(ProxyBusQueueConfig.NumWorkers);
+ auto queueConfig = messageBusConfig->MutableProxyBusQueueConfig();
+ queueConfig->SetName(ProxyBusQueueConfig.Name);
+ queueConfig->SetNumWorkers(ProxyBusQueueConfig.NumWorkers);
auto sessionConfig = messageBusConfig->MutableProxyBusSessionConfig();
@@ -656,11 +656,11 @@ protected:
sessionConfig->SetExecuteOnReplyInWorkerPool(ProxyBusSessionConfig.ExecuteOnReplyInWorkerPool);
sessionConfig->SetListenPort(ProxyBusSessionConfig.ListenPort);
- for (auto proxy : ProxyBindToProxy) {
- messageBusConfig->AddProxyBindToProxy(proxy);
- }
- messageBusConfig->SetStartTracingBusProxy(!!TracePath);
- messageBusConfig->SetTracePath(TracePath);
+ for (auto proxy : ProxyBindToProxy) {
+ messageBusConfig->AddProxyBindToProxy(proxy);
+ }
+ messageBusConfig->SetStartTracingBusProxy(!!TracePath);
+ messageBusConfig->SetTracePath(TracePath);
}
}
@@ -788,34 +788,34 @@ protected:
}
}
- TString DeduceTenantDomain() {
- if (TenantDomain)
- return TenantDomain;
- if (AppConfig.GetDomainsConfig().DomainSize() == 1)
- return AppConfig.GetDomainsConfig().GetDomain(0).GetName();
- if (NodeDomain)
- return NodeDomain;
- return "";
- }
-
- TString DeduceNodeDomain() {
- if (NodeDomain)
- return NodeDomain;
- if (AppConfig.GetDomainsConfig().DomainSize() == 1)
- return AppConfig.GetDomainsConfig().GetDomain(0).GetName();
- if (TenantDomain)
- return TenantDomain;
- if (AppConfig.GetTenantPoolConfig().SlotsSize() == 1) {
- auto &slot = AppConfig.GetTenantPoolConfig().GetSlots(0);
- if (slot.GetDomainName())
- return slot.GetDomainName();
- auto &tenantName = slot.GetTenantName();
- if (IsStartWithSlash(tenantName))
- return ToString(ExtractDomain(tenantName));
- }
- return "";
- }
-
+ TString DeduceTenantDomain() {
+ if (TenantDomain)
+ return TenantDomain;
+ if (AppConfig.GetDomainsConfig().DomainSize() == 1)
+ return AppConfig.GetDomainsConfig().GetDomain(0).GetName();
+ if (NodeDomain)
+ return NodeDomain;
+ return "";
+ }
+
+ TString DeduceNodeDomain() {
+ if (NodeDomain)
+ return NodeDomain;
+ if (AppConfig.GetDomainsConfig().DomainSize() == 1)
+ return AppConfig.GetDomainsConfig().GetDomain(0).GetName();
+ if (TenantDomain)
+ return TenantDomain;
+ if (AppConfig.GetTenantPoolConfig().SlotsSize() == 1) {
+ auto &slot = AppConfig.GetTenantPoolConfig().GetSlots(0);
+ if (slot.GetDomainName())
+ return slot.GetDomainName();
+ auto &tenantName = slot.GetTenantName();
+ if (IsStartWithSlash(tenantName))
+ return ToString(ExtractDomain(tenantName));
+ }
+ return "";
+ }
+
bool GetCachedConfig(NKikimrConfig::TAppConfig &appConfig) {
Y_VERIFY_DEBUG(RunConfig.PathToConfigCacheFile, "GetCachedConfig called with a cms config cache file set");
@@ -839,23 +839,23 @@ protected:
}
}
- void MaybeRegisterAndLoadConfigs()
- {
+ void MaybeRegisterAndLoadConfigs()
+ {
// static node
if (NodeBrokerAddresses.empty() && !NodeBrokerPort) {
- if (!NodeId)
- ythrow yexception() << "Either --node [NUM|'static'] or --node-broker[-port] should be specified";
+ if (!NodeId)
+ ythrow yexception() << "Either --node [NUM|'static'] or --node-broker[-port] should be specified";
if (!HierarchicalCfg && RunConfig.PathToConfigCacheFile)
LoadCachedConfigsForStaticNode();
- return;
- }
-
- RegisterDynamicNode();
+ return;
+ }
+
+ RegisterDynamicNode();
if (!HierarchicalCfg && !IgnoreCmsConfigs)
LoadConfigForDynamicNode();
}
-
+
THolder<NClient::TRegistrationResult> TryToRegisterDynamicNode(
const TString &addr,
const TString &domainName,
@@ -864,14 +864,14 @@ protected:
const TString &nodeResolveHost,
const TMaybe<TString>& path) {
NClient::TKikimr kikimr(GetKikimr(addr));
- auto registrant = kikimr.GetNodeRegistrant();
+ auto registrant = kikimr.GetNodeRegistrant();
NActorsInterconnect::TNodeLocation location;
location.SetDataCenter(DataCenter);
location.SetRack(Rack);
location.SetUnit(ToString(Body));
TNodeLocation loc(location);
-
+
NActorsInterconnect::TNodeLocation legacy;
legacy.SetDataCenterNum(DataCenterFromString(DataCenter));
legacy.SetRoomNum(0);
@@ -879,33 +879,33 @@ protected:
legacy.SetBodyNum(Body);
loc.InheritLegacyValue(TNodeLocation(legacy));
- Cout << "Trying to register at " << addr << Endl;
-
- return MakeHolder<NClient::TRegistrationResult>
- (registrant.SyncRegisterNode(ToString(domainName),
+ Cout << "Trying to register at " << addr << Endl;
+
+ return MakeHolder<NClient::TRegistrationResult>
+ (registrant.SyncRegisterNode(ToString(domainName),
nodeHost,
- InterconnectPort,
+ InterconnectPort,
nodeAddress,
nodeResolveHost,
std::move(loc),
FixedNodeID,
path));
- }
-
- void FillClusterEndpoints(TVector<TString> &addrs) {
+ }
+
+ void FillClusterEndpoints(TVector<TString> &addrs) {
if (!NodeBrokerAddresses.empty()) {
for (auto addr: NodeBrokerAddresses) {
addrs.push_back(addr);
}
- } else {
- Y_VERIFY(NodeBrokerPort);
- for (auto &node : RunConfig.AppConfig.MutableNameserviceConfig()->GetNode()) {
+ } else {
+ Y_VERIFY(NodeBrokerPort);
+ for (auto &node : RunConfig.AppConfig.MutableNameserviceConfig()->GetNode()) {
addrs.emplace_back(TStringBuilder() << (NodeBrokerUseTls ? "grpcs://" : "") << node.GetHost() << ':' << NodeBrokerPort);
- }
- }
- ShuffleRange(addrs);
- }
-
+ }
+ }
+ ShuffleRange(addrs);
+ }
+
TString HostAndICPort() {
try {
auto hostname = to_lower(HostName());
@@ -923,64 +923,64 @@ protected:
return {};
}
- void RegisterDynamicNode() {
- TVector<TString> addrs;
- auto &dnConfig = *RunConfig.AppConfig.MutableDynamicNodeConfig();
-
- FillClusterEndpoints(addrs);
-
- if (!InterconnectPort)
- ythrow yexception() << "Either --node or --ic-port should be specified";
-
- if (addrs.empty()) {
- ythrow yexception() << "List of Node Broker end-points is empty";
- }
-
- TString domainName = DeduceNodeDomain();
- if (!NodeHost)
- NodeHost = FQDNHostName();
- if (!NodeResolveHost)
- NodeResolveHost = NodeHost;
-
- THolder<NClient::TRegistrationResult> result;
+ void RegisterDynamicNode() {
+ TVector<TString> addrs;
+ auto &dnConfig = *RunConfig.AppConfig.MutableDynamicNodeConfig();
+
+ FillClusterEndpoints(addrs);
+
+ if (!InterconnectPort)
+ ythrow yexception() << "Either --node or --ic-port should be specified";
+
+ if (addrs.empty()) {
+ ythrow yexception() << "List of Node Broker end-points is empty";
+ }
+
+ TString domainName = DeduceNodeDomain();
+ if (!NodeHost)
+ NodeHost = FQDNHostName();
+ if (!NodeResolveHost)
+ NodeResolveHost = NodeHost;
+
+ THolder<NClient::TRegistrationResult> result;
while (!result || !result->IsSuccess()) {
- for (auto addr : addrs) {
+ for (auto addr : addrs) {
result = TryToRegisterDynamicNode(addr, domainName, NodeHost, NodeAddress, NodeResolveHost, GetSchemePath());
- if (result->IsSuccess()) {
- Cout << "Success. Registered as " << result->GetNodeId() << Endl;
- break;
- }
- Cerr << "Registration error: " << result->GetErrorMessage() << Endl;
- }
- if (!result || !result->IsSuccess())
- Sleep(TDuration::Seconds(1));
- }
- Y_VERIFY(result);
-
- if (!result->IsSuccess())
- ythrow yexception() << "Cannot register dynamic node: " << result->GetErrorMessage();
-
- RunConfig.NodeId = result->GetNodeId();
+ if (result->IsSuccess()) {
+ Cout << "Success. Registered as " << result->GetNodeId() << Endl;
+ break;
+ }
+ Cerr << "Registration error: " << result->GetErrorMessage() << Endl;
+ }
+ if (!result || !result->IsSuccess())
+ Sleep(TDuration::Seconds(1));
+ }
+ Y_VERIFY(result);
+
+ if (!result->IsSuccess())
+ ythrow yexception() << "Cannot register dynamic node: " << result->GetErrorMessage();
+
+ RunConfig.NodeId = result->GetNodeId();
RunConfig.ScopeId = TKikimrScopeId(result->GetScopeId());
- auto &nsConfig = *RunConfig.AppConfig.MutableNameserviceConfig();
-
- nsConfig.ClearNode();
-
- for (auto &node : result->Record().GetNodes()) {
- if (node.GetNodeId() == result->GetNodeId()) {
- dnConfig.MutableNodeInfo()->CopyFrom(node);
+ auto &nsConfig = *RunConfig.AppConfig.MutableNameserviceConfig();
+
+ nsConfig.ClearNode();
+
+ for (auto &node : result->Record().GetNodes()) {
+ if (node.GetNodeId() == result->GetNodeId()) {
+ dnConfig.MutableNodeInfo()->CopyFrom(node);
} else {
- auto &info = *nsConfig.AddNode();
- info.SetNodeId(node.GetNodeId());
- info.SetAddress(node.GetAddress());
- info.SetPort(node.GetPort());
- info.SetHost(node.GetHost());
- info.SetInterconnectHost(node.GetResolveHost());
- info.MutableLocation()->CopyFrom(node.GetLocation());
- }
- }
- }
-
+ auto &info = *nsConfig.AddNode();
+ info.SetNodeId(node.GetNodeId());
+ info.SetAddress(node.GetAddress());
+ info.SetPort(node.GetPort());
+ info.SetHost(node.GetHost());
+ info.SetInterconnectHost(node.GetResolveHost());
+ info.MutableLocation()->CopyFrom(node.GetLocation());
+ }
+ }
+ }
+
void ApplyConfigForNode(NKikimrConfig::TAppConfig &appConfig) {
AppConfig.Swap(&appConfig);
// Dynamic node config is defined by options and Node Broker response.
@@ -1018,27 +1018,27 @@ protected:
bool TryToLoadConfigForDynamicNodeFromCMS(const TString &addr, TString &error) {
NClient::TKikimr kikimr(GetKikimr(addr));
- auto configurator = kikimr.GetNodeConfigurator();
-
- Cout << "Trying to get configs from " << addr << Endl;
-
- auto result = configurator.SyncGetNodeConfig(RunConfig.NodeId,
- FQDNHostName(),
- TenantName,
- NodeType,
+ auto configurator = kikimr.GetNodeConfigurator();
+
+ Cout << "Trying to get configs from " << addr << Endl;
+
+ auto result = configurator.SyncGetNodeConfig(RunConfig.NodeId,
+ FQDNHostName(),
+ TenantName,
+ NodeType,
DeduceNodeDomain(),
AppConfig.GetAuthConfig().GetStaffApiUserToken());
-
- if (!result.IsSuccess()) {
- error = result.GetErrorMessage();
- Cerr << "Configuration error: " << error << Endl;
- return false;
- }
-
- Cout << "Success." << Endl;
-
- auto appConfig = result.GetConfig();
-
+
+ if (!result.IsSuccess()) {
+ error = result.GetErrorMessage();
+ Cerr << "Configuration error: " << error << Endl;
+ return false;
+ }
+
+ Cout << "Success." << Endl;
+
+ auto appConfig = result.GetConfig();
+
if (RunConfig.PathToConfigCacheFile) {
Cout << "Saving config to cache file " << RunConfig.PathToConfigCacheFile << Endl;
if (!SaveConfigForNodeToCache(appConfig)) {
@@ -1048,9 +1048,9 @@ protected:
ApplyConfigForNode(appConfig);
- return true;
- }
-
+ return true;
+ }
+
bool LoadConfigForDynamicNodeFromCache() {
NKikimrConfig::TAppConfig config;
if (GetCachedConfig(config)) {
@@ -1061,27 +1061,27 @@ protected:
}
void LoadConfigForDynamicNode() {
- auto res = false;
- TString error;
- TVector<TString> addrs;
-
- FillClusterEndpoints(addrs);
-
+ auto res = false;
+ TString error;
+ TVector<TString> addrs;
+
+ FillClusterEndpoints(addrs);
+
SetRandomSeed(TInstant::Now().MicroSeconds());
- int minAttempts = 10;
- int attempts = 0;
- while (!res && attempts < minAttempts) {
- for (auto addr : addrs) {
+ int minAttempts = 10;
+ int attempts = 0;
+ while (!res && attempts < minAttempts) {
+ for (auto addr : addrs) {
res = TryToLoadConfigForDynamicNodeFromCMS(addr, error);
- ++attempts;
- if (res)
- break;
- }
+ ++attempts;
+ if (res)
+ break;
+ }
// Randomized backoff
- if (!res)
+ if (!res)
Sleep(TDuration::MilliSeconds(500 + RandomNumber<ui64>(1000)));
- }
-
+ }
+
if (!res) {
Cerr << "WARNING: couldn't load config from CMS: " << error << Endl;
if (RunConfig.PathToConfigCacheFile) {
@@ -1093,7 +1093,7 @@ protected:
Cerr << "couldn't load config from cache file" << Endl;
}
}
- }
+ }
private:
NClient::TKikimr GetKikimr(const TString& addr) {
diff --git a/ydb/core/driver_lib/cli_utils/cli_cmds_tenant.cpp b/ydb/core/driver_lib/cli_utils/cli_cmds_tenant.cpp
index d56cc369af8..db44a3a5165 100644
--- a/ydb/core/driver_lib/cli_utils/cli_cmds_tenant.cpp
+++ b/ydb/core/driver_lib/cli_utils/cli_cmds_tenant.cpp
@@ -1,355 +1,355 @@
-#include "cli.h"
-#include "cli_cmds.h"
-
+#include "cli.h"
+#include "cli_cmds.h"
+
#include <library/cpp/grpc/client/grpc_client_low.h>
#include <ydb/public/sdk/cpp/client/resources/ydb_resources.h>
#include <ydb/public/api/grpc/ydb_operation_v1.grpc.pb.h>
#include <ydb/public/api/grpc/ydb_cms_v1.grpc.pb.h>
-
+
#include <util/string/split.h>
-#include <util/string/join.h>
-#include <util/string/type.h>
-
-namespace NKikimr {
-namespace NDriverClient {
-
-class TTenantClientCommand : public TClientCommand {
-public:
- TString Domain;
- NKikimrClient::TConsoleRequest Request;
-
- TTenantClientCommand(const TString &name,
- const std::initializer_list<TString> &aliases,
- const TString &description)
- : TClientCommand(name, aliases, description)
- {
- }
-
- void Config(TConfig &config) override
- {
- TClientCommand::Config(config);
-
- Domain = "";
-
- config.Opts->AddLongOption("domain", "Set target domain (required for clusters with multiple domains)")
- .RequiredArgument("NAME").StoreResult(&Domain);
- }
-
- void Parse(TConfig& config) override
- {
- TClientCommand::Parse(config);
-
- if (Domain)
- Request.SetDomainName(Domain);
- }
-
- int Run(TConfig &config) override
- {
- TAutoPtr<NMsgBusProxy::TBusConsoleRequest> request(new NMsgBusProxy::TBusConsoleRequest);
- request->Record.CopyFrom(Request);
-
- auto handler = [this](const NMsgBusProxy::TBusConsoleResponse &response) -> int {
- PrintResponse(response.Record);
- return 0;
- };
-
- int result = MessageBusCall<NMsgBusProxy::TBusConsoleRequest,
- NMsgBusProxy::TBusConsoleResponse>(config, request, handler);
- return result;
- }
-
- virtual void PrintResponse(const NKikimrClient::TConsoleResponse &response)
- {
+#include <util/string/join.h>
+#include <util/string/type.h>
+
+namespace NKikimr {
+namespace NDriverClient {
+
+class TTenantClientCommand : public TClientCommand {
+public:
+ TString Domain;
+ NKikimrClient::TConsoleRequest Request;
+
+ TTenantClientCommand(const TString &name,
+ const std::initializer_list<TString> &aliases,
+ const TString &description)
+ : TClientCommand(name, aliases, description)
+ {
+ }
+
+ void Config(TConfig &config) override
+ {
+ TClientCommand::Config(config);
+
+ Domain = "";
+
+ config.Opts->AddLongOption("domain", "Set target domain (required for clusters with multiple domains)")
+ .RequiredArgument("NAME").StoreResult(&Domain);
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TClientCommand::Parse(config);
+
+ if (Domain)
+ Request.SetDomainName(Domain);
+ }
+
+ int Run(TConfig &config) override
+ {
+ TAutoPtr<NMsgBusProxy::TBusConsoleRequest> request(new NMsgBusProxy::TBusConsoleRequest);
+ request->Record.CopyFrom(Request);
+
+ auto handler = [this](const NMsgBusProxy::TBusConsoleResponse &response) -> int {
+ PrintResponse(response.Record);
+ return 0;
+ };
+
+ int result = MessageBusCall<NMsgBusProxy::TBusConsoleRequest,
+ NMsgBusProxy::TBusConsoleResponse>(config, request, handler);
+ return result;
+ }
+
+ virtual void PrintResponse(const NKikimrClient::TConsoleResponse &response)
+ {
if (response.GetStatus().GetCode() == Ydb::StatusIds::SUCCESS)
- Cout << response.DebugString();
- else
- Cout << "ERROR: " << response.GetStatus().GetCode()
- << " (" << response.GetStatus().GetReason() << ")" << Endl;
- }
-
+ Cout << response.DebugString();
+ else
+ Cout << "ERROR: " << response.GetStatus().GetCode()
+ << " (" << response.GetStatus().GetReason() << ")" << Endl;
+ }
+
virtual void PrintResponse(const Ydb::Operations::Operation &response)
- {
+ {
if (response.status() == Ydb::StatusIds::SUCCESS)
- Cout << "OK" << Endl;
- else {
- Cout << "ERROR: " << response.status() << Endl;
- for (auto &issue : response.issues())
- Cout << issue.message() << Endl;
- }
- }
-
- void ParseStoragePools(TConfig &config, TVector<std::pair<TString, ui64>> &pools)
- {
- for (auto &arg : config.ParseResult->GetFreeArgs()) {
- TVector<TString> items = StringSplitter(arg).Split(':').ToList<TString>();
- if (items.size() != 2)
- ythrow yexception() << "bad format in '" + arg + "'";
- ui64 size = FromString<ui64>(items[1]);
- if (!size)
- ythrow yexception() << "bad pool size '" + arg + "'";
- pools.push_back(std::make_pair(items[0], size));
- }
- }
-
- void ParseUnits(TConfig &config, THashMap<std::pair<TString, TString>, ui64> &units)
- {
- for (auto &arg : config.ParseResult->GetFreeArgs()) {
- TString kind;
- TString zone;
- ui64 count = 0;
-
- TVector<TString> items = StringSplitter(arg).Split(':').ToList<TString>();
- if (items.size() > 3)
- ythrow yexception() << "bad format in '" + arg + "'";
- auto it = items.rbegin();
- count = FromString<ui64>(*it++);
- if (it != items.rend()) {
- kind = *it++;
- if (it != items.rend()) {
- zone = *it;
- }
- }
- units[std::make_pair(kind, zone)] += count;
- }
- }
-};
-
-template <typename TService, typename TRequest, typename TResponse,
- typename TFunction, TFunction function>
-class TTenantClientGRpcCommand : public TTenantClientCommand {
-public:
- TRequest GRpcRequest;
+ Cout << "OK" << Endl;
+ else {
+ Cout << "ERROR: " << response.status() << Endl;
+ for (auto &issue : response.issues())
+ Cout << issue.message() << Endl;
+ }
+ }
+
+ void ParseStoragePools(TConfig &config, TVector<std::pair<TString, ui64>> &pools)
+ {
+ for (auto &arg : config.ParseResult->GetFreeArgs()) {
+ TVector<TString> items = StringSplitter(arg).Split(':').ToList<TString>();
+ if (items.size() != 2)
+ ythrow yexception() << "bad format in '" + arg + "'";
+ ui64 size = FromString<ui64>(items[1]);
+ if (!size)
+ ythrow yexception() << "bad pool size '" + arg + "'";
+ pools.push_back(std::make_pair(items[0], size));
+ }
+ }
+
+ void ParseUnits(TConfig &config, THashMap<std::pair<TString, TString>, ui64> &units)
+ {
+ for (auto &arg : config.ParseResult->GetFreeArgs()) {
+ TString kind;
+ TString zone;
+ ui64 count = 0;
+
+ TVector<TString> items = StringSplitter(arg).Split(':').ToList<TString>();
+ if (items.size() > 3)
+ ythrow yexception() << "bad format in '" + arg + "'";
+ auto it = items.rbegin();
+ count = FromString<ui64>(*it++);
+ if (it != items.rend()) {
+ kind = *it++;
+ if (it != items.rend()) {
+ zone = *it;
+ }
+ }
+ units[std::make_pair(kind, zone)] += count;
+ }
+ }
+};
+
+template <typename TService, typename TRequest, typename TResponse,
+ typename TFunction, TFunction function>
+class TTenantClientGRpcCommand : public TTenantClientCommand {
+public:
+ TRequest GRpcRequest;
NGrpc::TGRpcClientConfig ClientConfig;
-
- TTenantClientGRpcCommand(const TString &name,
- const std::initializer_list<TString> &aliases,
- const TString &description)
- : TTenantClientCommand(name, aliases, description)
- {
- }
-
- void Parse(TConfig& config) override
- {
- TTenantClientCommand::Parse(config);
-
+
+ TTenantClientGRpcCommand(const TString &name,
+ const std::initializer_list<TString> &aliases,
+ const TString &description)
+ : TTenantClientCommand(name, aliases, description)
+ {
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TTenantClientCommand::Parse(config);
+
if (CommandConfig.ClientConfig.Defined()) {
auto *p = std::get_if<NGrpc::TGRpcClientConfig>(&CommandConfig.ClientConfig.GetRef());
- if (p) {
- ClientConfig.Locator = p->Locator;
- ClientConfig.Timeout = p->Timeout;
- ClientConfig.MaxMessageSize = p->MaxMessageSize;
- ClientConfig.MaxInFlight = p->MaxInFlight;
+ if (p) {
+ ClientConfig.Locator = p->Locator;
+ ClientConfig.Timeout = p->Timeout;
+ ClientConfig.MaxMessageSize = p->MaxMessageSize;
+ ClientConfig.MaxInFlight = p->MaxInFlight;
ClientConfig.EnableSsl = p->EnableSsl;
ClientConfig.SslCaCert = p->SslCaCert;
- }
- }
- }
-
- int Run(TConfig &config) override
- {
+ }
+ }
+ }
+
+ int Run(TConfig &config) override
+ {
Ydb::Operations::Operation response;
- int res;
-
- res = DoGRpcRequest<TService, TRequest, TResponse, TFunction>
- (ClientConfig, GRpcRequest, response, function, config.SecurityToken);
-
- if (!res) {
- PrintResponse(response);
- }
-
- return res;
- }
-};
-
-class TClientCommandTenantList
+ int res;
+
+ res = DoGRpcRequest<TService, TRequest, TResponse, TFunction>
+ (ClientConfig, GRpcRequest, response, function, config.SecurityToken);
+
+ if (!res) {
+ PrintResponse(response);
+ }
+
+ return res;
+ }
+};
+
+class TClientCommandTenantList
: public TTenantClientGRpcCommand<Ydb::Cms::V1::CmsService,
Ydb::Cms::ListDatabasesRequest,
Ydb::Cms::ListDatabasesResponse,
decltype(&Ydb::Cms::V1::CmsService::Stub::AsyncListDatabases),
&Ydb::Cms::V1::CmsService::Stub::AsyncListDatabases> {
-public:
- TClientCommandTenantList()
- : TTenantClientGRpcCommand("list", {}, "List existing databases")
- {}
-
- using TTenantClientGRpcCommand::PrintResponse;
-
+public:
+ TClientCommandTenantList()
+ : TTenantClientGRpcCommand("list", {}, "List existing databases")
+ {}
+
+ using TTenantClientGRpcCommand::PrintResponse;
+
void PrintResponse(const Ydb::Operations::Operation &response) override
- {
+ {
if (response.status() != Ydb::StatusIds::SUCCESS) {
- TTenantClientGRpcCommand::PrintResponse(response);
- } else {
+ TTenantClientGRpcCommand::PrintResponse(response);
+ } else {
Ydb::Cms::ListDatabasesResult result;
- Y_VERIFY(response.result().UnpackTo(&result));
-
- Cout << "Databases:" << Endl;
- for (auto &path : result.paths())
- Cout << " " << path << Endl;
- }
- }
-};
-
-class TClientCommandTenantOptions
+ Y_VERIFY(response.result().UnpackTo(&result));
+
+ Cout << "Databases:" << Endl;
+ for (auto &path : result.paths())
+ Cout << " " << path << Endl;
+ }
+ }
+};
+
+class TClientCommandTenantOptions
: public TTenantClientGRpcCommand<Ydb::Cms::V1::CmsService,
- Ydb::Cms::DescribeDatabaseOptionsRequest,
- Ydb::Cms::DescribeDatabaseOptionsResponse,
+ Ydb::Cms::DescribeDatabaseOptionsRequest,
+ Ydb::Cms::DescribeDatabaseOptionsResponse,
decltype(&Ydb::Cms::V1::CmsService::Stub::AsyncDescribeDatabaseOptions),
&Ydb::Cms::V1::CmsService::Stub::AsyncDescribeDatabaseOptions> {
-public:
- TClientCommandTenantOptions()
- : TTenantClientGRpcCommand("options", {}, "Describe available database options")
- {}
-
- using TTenantClientGRpcCommand::PrintResponse;
-
- void PrintResponse(const Ydb::Operations::Operation &response) override
- {
- if (response.status() != Ydb::StatusIds::SUCCESS) {
- TTenantClientGRpcCommand::PrintResponse(response);
- } else {
- Ydb::Cms::DescribeDatabaseOptionsResult result;
- Y_VERIFY(response.result().UnpackTo(&result));
-
- Cout << "Storage units" << Endl;
- for (auto &unit : result.storage_units()) {
- Cout << " - " << unit.kind() << Endl;
- for (auto &pr : unit.labels())
- Cout << " " << pr.first << ": " << pr.second << Endl;
- }
- Cout << "Availability zones" << Endl;
- for (auto &zone : result.availability_zones()) {
- Cout << " - " << zone.name() << Endl;
- for (auto &pr : zone.labels())
- Cout << " " << pr.first << ": " << pr.second << Endl;
- }
- Cout << "Computational units" << Endl;
- for (auto &unit : result.computational_units()) {
- Cout << " - " << unit.kind() << Endl;
- Cout << " Allowed zones: " << JoinSeq(", ", unit.allowed_availability_zones()) << Endl;
- for (auto &pr : unit.labels())
- Cout << " " << pr.first << ": " << pr.second << Endl;
- }
- }
- }
-};
-
-class TClientCommandTenantStatus
+public:
+ TClientCommandTenantOptions()
+ : TTenantClientGRpcCommand("options", {}, "Describe available database options")
+ {}
+
+ using TTenantClientGRpcCommand::PrintResponse;
+
+ void PrintResponse(const Ydb::Operations::Operation &response) override
+ {
+ if (response.status() != Ydb::StatusIds::SUCCESS) {
+ TTenantClientGRpcCommand::PrintResponse(response);
+ } else {
+ Ydb::Cms::DescribeDatabaseOptionsResult result;
+ Y_VERIFY(response.result().UnpackTo(&result));
+
+ Cout << "Storage units" << Endl;
+ for (auto &unit : result.storage_units()) {
+ Cout << " - " << unit.kind() << Endl;
+ for (auto &pr : unit.labels())
+ Cout << " " << pr.first << ": " << pr.second << Endl;
+ }
+ Cout << "Availability zones" << Endl;
+ for (auto &zone : result.availability_zones()) {
+ Cout << " - " << zone.name() << Endl;
+ for (auto &pr : zone.labels())
+ Cout << " " << pr.first << ": " << pr.second << Endl;
+ }
+ Cout << "Computational units" << Endl;
+ for (auto &unit : result.computational_units()) {
+ Cout << " - " << unit.kind() << Endl;
+ Cout << " Allowed zones: " << JoinSeq(", ", unit.allowed_availability_zones()) << Endl;
+ for (auto &pr : unit.labels())
+ Cout << " " << pr.first << ": " << pr.second << Endl;
+ }
+ }
+ }
+};
+
+class TClientCommandTenantStatus
: public TTenantClientGRpcCommand<Ydb::Cms::V1::CmsService,
Ydb::Cms::GetDatabaseStatusRequest,
Ydb::Cms::GetDatabaseStatusResponse,
decltype(&Ydb::Cms::V1::CmsService::Stub::AsyncGetDatabaseStatus),
&Ydb::Cms::V1::CmsService::Stub::AsyncGetDatabaseStatus> {
-public:
- TClientCommandTenantStatus()
- : TTenantClientGRpcCommand("status", {}, "Get database status")
- {}
-
- void Config(TConfig &config) override
- {
- TTenantClientGRpcCommand::Config(config);
- }
-
- void Parse(TConfig& config) override
- {
- TTenantClientGRpcCommand::Parse(config);
-
- GRpcRequest.set_path(config.Tenant);
- }
-
- using TTenantClientGRpcCommand::PrintResponse;
-
+public:
+ TClientCommandTenantStatus()
+ : TTenantClientGRpcCommand("status", {}, "Get database status")
+ {}
+
+ void Config(TConfig &config) override
+ {
+ TTenantClientGRpcCommand::Config(config);
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TTenantClientGRpcCommand::Parse(config);
+
+ GRpcRequest.set_path(config.Tenant);
+ }
+
+ using TTenantClientGRpcCommand::PrintResponse;
+
void PrintResponse(const Ydb::Operations::Operation &response) override
- {
+ {
if (response.status() != Ydb::StatusIds::SUCCESS) {
- TTenantClientGRpcCommand::PrintResponse(response);
- } else {
+ TTenantClientGRpcCommand::PrintResponse(response);
+ } else {
Ydb::Cms::GetDatabaseStatusResult result;
- Y_VERIFY(response.result().UnpackTo(&result));
- // type -> <required, allocated>
- THashMap<TString, std::pair<ui64, ui64>> pools;
- // <type, dc> -> <required, allocated>
- THashMap<std::pair<TString, TString>, std::pair<ui64, ui64>> units;
-
- for (auto &unit : result.required_resources().storage_units())
- pools[unit.unit_kind()] = std::make_pair(unit.count(), 0U);
-
- for (auto &unit : result.required_resources().computational_units()) {
- auto key = std::make_pair(unit.unit_kind(), unit.availability_zone());
- units[key] = std::make_pair(unit.count(), 0ULL);
- }
-
- for (auto &unit : result.allocated_resources().storage_units())
- pools[unit.unit_kind()].second = unit.count();
-
- for (auto &unit : result.allocated_resources().computational_units()) {
- auto key = std::make_pair(unit.unit_kind(), unit.availability_zone());
- units[key].second = unit.count();
- }
-
- Cout << "Database " << result.path() << " status:" << Endl
- << " State: " << result.state() << Endl;
- Cout << " Allocated pools:" << Endl;
- for (auto &pr : pools)
- Cout << " " << pr.first << ": "
- << pr.second.second << "/" << pr.second.first << Endl;
- Cout << " Allocated units:" << Endl;
- for (auto &pr : units)
- Cout << " [" << (pr.first.first ? pr.first.first : "ANY") << ":"
- << (pr.first.second ? ToString(pr.first.second) : "ANY") << "]: "
- << pr.second.second << "/" << pr.second.first << Endl;
- Cout << " Registered units:" << Endl;
- for (auto &unit : result.registered_resources()) {
- Cout << " " << unit.host() << ":" << unit.port() << " - " << unit.unit_kind() << Endl;
- }
- }
- }
-};
-
-class TClientCommandTenantCreate
+ Y_VERIFY(response.result().UnpackTo(&result));
+ // type -> <required, allocated>
+ THashMap<TString, std::pair<ui64, ui64>> pools;
+ // <type, dc> -> <required, allocated>
+ THashMap<std::pair<TString, TString>, std::pair<ui64, ui64>> units;
+
+ for (auto &unit : result.required_resources().storage_units())
+ pools[unit.unit_kind()] = std::make_pair(unit.count(), 0U);
+
+ for (auto &unit : result.required_resources().computational_units()) {
+ auto key = std::make_pair(unit.unit_kind(), unit.availability_zone());
+ units[key] = std::make_pair(unit.count(), 0ULL);
+ }
+
+ for (auto &unit : result.allocated_resources().storage_units())
+ pools[unit.unit_kind()].second = unit.count();
+
+ for (auto &unit : result.allocated_resources().computational_units()) {
+ auto key = std::make_pair(unit.unit_kind(), unit.availability_zone());
+ units[key].second = unit.count();
+ }
+
+ Cout << "Database " << result.path() << " status:" << Endl
+ << " State: " << result.state() << Endl;
+ Cout << " Allocated pools:" << Endl;
+ for (auto &pr : pools)
+ Cout << " " << pr.first << ": "
+ << pr.second.second << "/" << pr.second.first << Endl;
+ Cout << " Allocated units:" << Endl;
+ for (auto &pr : units)
+ Cout << " [" << (pr.first.first ? pr.first.first : "ANY") << ":"
+ << (pr.first.second ? ToString(pr.first.second) : "ANY") << "]: "
+ << pr.second.second << "/" << pr.second.first << Endl;
+ Cout << " Registered units:" << Endl;
+ for (auto &unit : result.registered_resources()) {
+ Cout << " " << unit.host() << ":" << unit.port() << " - " << unit.unit_kind() << Endl;
+ }
+ }
+ }
+};
+
+class TClientCommandTenantCreate
: public TTenantClientGRpcCommand<Ydb::Cms::V1::CmsService,
Ydb::Cms::CreateDatabaseRequest,
Ydb::Cms::CreateDatabaseResponse,
decltype(&Ydb::Cms::V1::CmsService::Stub::AsyncCreateDatabase),
&Ydb::Cms::V1::CmsService::Stub::AsyncCreateDatabase> {
- TVector<TString> Attributes;
+ TVector<TString> Attributes;
bool Serverless = false;
-
-public:
- TClientCommandTenantCreate()
- : TTenantClientGRpcCommand("create", {}, "Create new database")
- {}
-
- void Config(TConfig &config) override
- {
- TTenantClientGRpcCommand::Config(config);
-
+
+public:
+ TClientCommandTenantCreate()
+ : TTenantClientGRpcCommand("create", {}, "Create new database")
+ {}
+
+ void Config(TConfig &config) override
+ {
+ TTenantClientGRpcCommand::Config(config);
+
config.Opts->AddLongOption("no-tx", "Disable tenant services for database")
- .NoArgument();
- config.Opts->AddLongOption("attr", "Attach attribute name=value to database")
- .RequiredArgument("NAME=VALUE").AppendTo(&Attributes);
+ .NoArgument();
+ config.Opts->AddLongOption("attr", "Attach attribute name=value to database")
+ .RequiredArgument("NAME=VALUE").AppendTo(&Attributes);
config.Opts->AddLongOption("serverless", "Create a serverless database (free arg must specify shared database for resources)")
.NoArgument().StoreTrue(&Serverless);
config.SetFreeArgsMin(1);
- config.Opts->SetFreeArgDefaultTitle("<pool type>:<pool size>", "Pairs describing storage pool type and size (number of groups).");
- }
-
- void Parse(TConfig& config) override
- {
- TTenantClientGRpcCommand::Parse(config);
-
- GRpcRequest.set_path(config.Tenant);
- if (config.ParseResult->Has("no-tx"))
- GRpcRequest.mutable_options()->set_disable_tx_service(true);
-
- for (auto &attr : Attributes) {
- TVector<TString> items = StringSplitter(attr).Split('=').ToList<TString>();
- if (items.size() != 2)
- ythrow yexception() << "bad format in attr '" + attr + "'";
+ config.Opts->SetFreeArgDefaultTitle("<pool type>:<pool size>", "Pairs describing storage pool type and size (number of groups).");
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TTenantClientGRpcCommand::Parse(config);
+
+ GRpcRequest.set_path(config.Tenant);
+ if (config.ParseResult->Has("no-tx"))
+ GRpcRequest.mutable_options()->set_disable_tx_service(true);
+
+ for (auto &attr : Attributes) {
+ TVector<TString> items = StringSplitter(attr).Split('=').ToList<TString>();
+ if (items.size() != 2)
+ ythrow yexception() << "bad format in attr '" + attr + "'";
(*GRpcRequest.mutable_attributes())[items[0]] = items[1];
- }
-
+ }
+
if (Serverless) {
const auto& args = config.ParseResult->GetFreeArgs();
if (args.size() != 1)
@@ -358,290 +358,290 @@ public:
return;
}
- TVector<std::pair<TString, ui64>> pools;
- ParseStoragePools(config, pools);
- for (auto &pool : pools) {
- auto &protoPool = *GRpcRequest.mutable_resources()->add_storage_units();
- protoPool.set_unit_kind(pool.first);
- protoPool.set_count(pool.second);
- }
- }
-};
-
-class TClientCommandTenantRemove
+ TVector<std::pair<TString, ui64>> pools;
+ ParseStoragePools(config, pools);
+ for (auto &pool : pools) {
+ auto &protoPool = *GRpcRequest.mutable_resources()->add_storage_units();
+ protoPool.set_unit_kind(pool.first);
+ protoPool.set_count(pool.second);
+ }
+ }
+};
+
+class TClientCommandTenantRemove
: public TTenantClientGRpcCommand<Ydb::Cms::V1::CmsService,
Ydb::Cms::RemoveDatabaseRequest,
Ydb::Cms::RemoveDatabaseResponse,
decltype(&Ydb::Cms::V1::CmsService::Stub::AsyncRemoveDatabase),
&Ydb::Cms::V1::CmsService::Stub::AsyncRemoveDatabase> {
-private:
+private:
Ydb::Cms::RemoveDatabaseRequest Request;
- bool Force;
-
-public:
- TClientCommandTenantRemove()
- : TTenantClientGRpcCommand("remove", {}, "Remove database")
- , Force(false)
- {}
-
- void Config(TConfig &config) override
- {
- TTenantClientGRpcCommand::Config(config);
- config.Opts->AddLongOption("force", "Force command execution")
- .NoArgument().SetFlag(&Force);
- }
-
- void Parse(TConfig& config) override
- {
- TTenantClientGRpcCommand::Parse(config);
-
- GRpcRequest.set_path(config.Tenant);
- }
-
- int Run(TConfig &config) override
- {
- TString answer;
- while (!Force && answer != "yes") {
- Cout << "!!WARNING!! This action will completely remove database with all data. Continue? [yes/no] ";
- Cin >> answer;
- if (answer == "no")
- return 1;
- }
-
- return TTenantClientGRpcCommand::Run(config);
- }
-};
-
-class TClientCommandTenantAddUnits
+ bool Force;
+
+public:
+ TClientCommandTenantRemove()
+ : TTenantClientGRpcCommand("remove", {}, "Remove database")
+ , Force(false)
+ {}
+
+ void Config(TConfig &config) override
+ {
+ TTenantClientGRpcCommand::Config(config);
+ config.Opts->AddLongOption("force", "Force command execution")
+ .NoArgument().SetFlag(&Force);
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TTenantClientGRpcCommand::Parse(config);
+
+ GRpcRequest.set_path(config.Tenant);
+ }
+
+ int Run(TConfig &config) override
+ {
+ TString answer;
+ while (!Force && answer != "yes") {
+ Cout << "!!WARNING!! This action will completely remove database with all data. Continue? [yes/no] ";
+ Cin >> answer;
+ if (answer == "no")
+ return 1;
+ }
+
+ return TTenantClientGRpcCommand::Run(config);
+ }
+};
+
+class TClientCommandTenantAddUnits
: public TTenantClientGRpcCommand<Ydb::Cms::V1::CmsService,
Ydb::Cms::AlterDatabaseRequest,
Ydb::Cms::AlterDatabaseResponse,
decltype(&Ydb::Cms::V1::CmsService::Stub::AsyncAlterDatabase),
&Ydb::Cms::V1::CmsService::Stub::AsyncAlterDatabase> {
-public:
- TClientCommandTenantAddUnits()
- : TTenantClientGRpcCommand("add", {}, "Add computational units for database")
- {}
-
- void Config(TConfig& config) override {
- TTenantClientGRpcCommand::Config(config);
+public:
+ TClientCommandTenantAddUnits()
+ : TTenantClientGRpcCommand("add", {}, "Add computational units for database")
+ {}
+
+ void Config(TConfig& config) override {
+ TTenantClientGRpcCommand::Config(config);
config.SetFreeArgsMin(0);
- config.Opts->SetFreeArgDefaultTitle("[[<availability zone>:]<unit kind>:]<units count>", "Triples describing units.");
- }
-
- void Parse(TConfig& config) override
- {
- TTenantClientGRpcCommand::Parse(config);
-
- // <type, zone> -> count
- THashMap<std::pair<TString, TString>, ui64> units;
- ParseUnits(config, units);
-
- GRpcRequest.set_path(config.Tenant);
- for (auto &pr : units) {
- auto &unit = *GRpcRequest.add_computational_units_to_add();
- unit.set_unit_kind(pr.first.first);
- unit.set_availability_zone(pr.first.second);
- unit.set_count(pr.second);
- }
- }
-};
-
-class TClientCommandTenantRemoveUnits
+ config.Opts->SetFreeArgDefaultTitle("[[<availability zone>:]<unit kind>:]<units count>", "Triples describing units.");
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TTenantClientGRpcCommand::Parse(config);
+
+ // <type, zone> -> count
+ THashMap<std::pair<TString, TString>, ui64> units;
+ ParseUnits(config, units);
+
+ GRpcRequest.set_path(config.Tenant);
+ for (auto &pr : units) {
+ auto &unit = *GRpcRequest.add_computational_units_to_add();
+ unit.set_unit_kind(pr.first.first);
+ unit.set_availability_zone(pr.first.second);
+ unit.set_count(pr.second);
+ }
+ }
+};
+
+class TClientCommandTenantRemoveUnits
: public TTenantClientGRpcCommand<Ydb::Cms::V1::CmsService,
Ydb::Cms::AlterDatabaseRequest,
Ydb::Cms::AlterDatabaseResponse,
decltype(&Ydb::Cms::V1::CmsService::Stub::AsyncAlterDatabase),
&Ydb::Cms::V1::CmsService::Stub::AsyncAlterDatabase> {
-public:
- TClientCommandTenantRemoveUnits()
- : TTenantClientGRpcCommand("remove", {}, "Remove computational units from database")
- {}
-
- void Config(TConfig& config) override {
- TTenantClientGRpcCommand::Config(config);
+public:
+ TClientCommandTenantRemoveUnits()
+ : TTenantClientGRpcCommand("remove", {}, "Remove computational units from database")
+ {}
+
+ void Config(TConfig& config) override {
+ TTenantClientGRpcCommand::Config(config);
config.SetFreeArgsMin(0);
- config.Opts->SetFreeArgDefaultTitle("[[<availability zone>:]<unit kind>:]<units count>", "Triples describing units.");
- }
-
- void Parse(TConfig& config) override
- {
- TTenantClientGRpcCommand::Parse(config);
-
- // <type, zone> -> count
- THashMap<std::pair<TString, TString>, ui64> units;
- ParseUnits(config, units);
-
- GRpcRequest.set_path(config.Tenant);
- for (auto &pr : units) {
- auto &unit = *GRpcRequest.add_computational_units_to_remove();
- unit.set_unit_kind(pr.first.first);
- unit.set_availability_zone(pr.first.second);
- unit.set_count(pr.second);
- }
- }
-};
-
-class TClientCommandTenantRegisterUnits
+ config.Opts->SetFreeArgDefaultTitle("[[<availability zone>:]<unit kind>:]<units count>", "Triples describing units.");
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TTenantClientGRpcCommand::Parse(config);
+
+ // <type, zone> -> count
+ THashMap<std::pair<TString, TString>, ui64> units;
+ ParseUnits(config, units);
+
+ GRpcRequest.set_path(config.Tenant);
+ for (auto &pr : units) {
+ auto &unit = *GRpcRequest.add_computational_units_to_remove();
+ unit.set_unit_kind(pr.first.first);
+ unit.set_availability_zone(pr.first.second);
+ unit.set_count(pr.second);
+ }
+ }
+};
+
+class TClientCommandTenantRegisterUnits
: public TTenantClientGRpcCommand<Ydb::Cms::V1::CmsService,
Ydb::Cms::AlterDatabaseRequest,
Ydb::Cms::AlterDatabaseResponse,
decltype(&Ydb::Cms::V1::CmsService::Stub::AsyncAlterDatabase),
&Ydb::Cms::V1::CmsService::Stub::AsyncAlterDatabase> {
-public:
- TClientCommandTenantRegisterUnits()
- : TTenantClientGRpcCommand("register", {}, "Register computational units for database")
- {}
-
- void Config(TConfig& config) override {
- TTenantClientGRpcCommand::Config(config);
+public:
+ TClientCommandTenantRegisterUnits()
+ : TTenantClientGRpcCommand("register", {}, "Register computational units for database")
+ {}
+
+ void Config(TConfig& config) override {
+ TTenantClientGRpcCommand::Config(config);
config.SetFreeArgsMin(0);
- config.Opts->SetFreeArgDefaultTitle("<host>:<port>:<kind>", "Triples describing registered units.");
- }
-
- void Parse(TConfig& config) override
- {
- TTenantClientGRpcCommand::Parse(config);
-
- GRpcRequest.set_path(config.Tenant);
- for (auto &arg : config.ParseResult->GetFreeArgs()) {
- TString host;
- ui32 port;
- TString kind;
-
- TVector<TString> items = StringSplitter(arg).Split(':').ToList<TString>();
- if (items.size() != 3)
- ythrow yexception() << "bad format in '" + arg + "'";
- if (!TryFromString(items[1], port))
- ythrow yexception() << "bad port in '" + arg + "'";
-
- auto &unit = *GRpcRequest.add_computational_units_to_register();
- unit.set_host(items[0]);
- unit.set_port(port);
- unit.set_unit_kind(items[2]);
- }
- }
-};
-
-class TClientCommandTenantDeregisterUnits
+ config.Opts->SetFreeArgDefaultTitle("<host>:<port>:<kind>", "Triples describing registered units.");
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TTenantClientGRpcCommand::Parse(config);
+
+ GRpcRequest.set_path(config.Tenant);
+ for (auto &arg : config.ParseResult->GetFreeArgs()) {
+ TString host;
+ ui32 port;
+ TString kind;
+
+ TVector<TString> items = StringSplitter(arg).Split(':').ToList<TString>();
+ if (items.size() != 3)
+ ythrow yexception() << "bad format in '" + arg + "'";
+ if (!TryFromString(items[1], port))
+ ythrow yexception() << "bad port in '" + arg + "'";
+
+ auto &unit = *GRpcRequest.add_computational_units_to_register();
+ unit.set_host(items[0]);
+ unit.set_port(port);
+ unit.set_unit_kind(items[2]);
+ }
+ }
+};
+
+class TClientCommandTenantDeregisterUnits
: public TTenantClientGRpcCommand<Ydb::Cms::V1::CmsService,
Ydb::Cms::AlterDatabaseRequest,
Ydb::Cms::AlterDatabaseResponse,
decltype(&Ydb::Cms::V1::CmsService::Stub::AsyncAlterDatabase),
&Ydb::Cms::V1::CmsService::Stub::AsyncAlterDatabase> {
-public:
- TClientCommandTenantDeregisterUnits()
- : TTenantClientGRpcCommand("deregister", {}, "Deregister computational units for database")
- {}
-
- void Config(TConfig& config) override {
- TTenantClientGRpcCommand::Config(config);
+public:
+ TClientCommandTenantDeregisterUnits()
+ : TTenantClientGRpcCommand("deregister", {}, "Deregister computational units for database")
+ {}
+
+ void Config(TConfig& config) override {
+ TTenantClientGRpcCommand::Config(config);
config.SetFreeArgsMin(0);
- config.Opts->SetFreeArgDefaultTitle("<host>:<port>", "Pairs describing deregistered units.");
- }
-
- void Parse(TConfig& config) override
- {
- TTenantClientGRpcCommand::Parse(config);
-
- GRpcRequest.set_path(config.Tenant);
- for (auto &arg : config.ParseResult->GetFreeArgs()) {
- TString host;
- ui32 port;
-
- TVector<TString> items = StringSplitter(arg).Split(':').ToList<TString>();
- if (items.size() != 2)
- ythrow yexception() << "bad format in '" + arg + "'";
- if (!TryFromString(items[1], port))
- ythrow yexception() << "bad port in '" + arg + "'";
-
- auto &unit = *GRpcRequest.add_computational_units_to_deregister();
- unit.set_host(items[0]);
- unit.set_port(port);
- }
- }
-};
-
-class TClientCommandTenantAddPools
+ config.Opts->SetFreeArgDefaultTitle("<host>:<port>", "Pairs describing deregistered units.");
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TTenantClientGRpcCommand::Parse(config);
+
+ GRpcRequest.set_path(config.Tenant);
+ for (auto &arg : config.ParseResult->GetFreeArgs()) {
+ TString host;
+ ui32 port;
+
+ TVector<TString> items = StringSplitter(arg).Split(':').ToList<TString>();
+ if (items.size() != 2)
+ ythrow yexception() << "bad format in '" + arg + "'";
+ if (!TryFromString(items[1], port))
+ ythrow yexception() << "bad port in '" + arg + "'";
+
+ auto &unit = *GRpcRequest.add_computational_units_to_deregister();
+ unit.set_host(items[0]);
+ unit.set_port(port);
+ }
+ }
+};
+
+class TClientCommandTenantAddPools
: public TTenantClientGRpcCommand<Ydb::Cms::V1::CmsService,
Ydb::Cms::AlterDatabaseRequest,
Ydb::Cms::AlterDatabaseResponse,
decltype(&Ydb::Cms::V1::CmsService::Stub::AsyncAlterDatabase),
&Ydb::Cms::V1::CmsService::Stub::AsyncAlterDatabase> {
-public:
- TClientCommandTenantAddPools()
- : TTenantClientGRpcCommand("add", {}, "Add storage resources for database")
- {}
-
- void Config(TConfig& config) override {
- TTenantClientGRpcCommand::Config(config);
+public:
+ TClientCommandTenantAddPools()
+ : TTenantClientGRpcCommand("add", {}, "Add storage resources for database")
+ {}
+
+ void Config(TConfig& config) override {
+ TTenantClientGRpcCommand::Config(config);
config.SetFreeArgsMin(1);
- config.Opts->SetFreeArgDefaultTitle("<pool kind>:<pool size>", "Pairs describing storage pool type and size (number of groups).");
- }
-
- void Parse(TConfig& config) override
- {
- TTenantClientGRpcCommand::Parse(config);
-
- TVector<std::pair<TString, ui64>> pools;
- ParseStoragePools(config, pools);
-
- GRpcRequest.set_path(config.Tenant);
- for (auto &pool : pools) {
- auto &unit = *GRpcRequest.add_storage_units_to_add();
- unit.set_unit_kind(pool.first);
- unit.set_count(pool.second);
- }
- }
-};
-
-class TClientCommandTenantUnits : public TClientCommandTree {
-public:
- TClientCommandTenantUnits()
- : TClientCommandTree("units", {}, "")
- {
+ config.Opts->SetFreeArgDefaultTitle("<pool kind>:<pool size>", "Pairs describing storage pool type and size (number of groups).");
+ }
+
+ void Parse(TConfig& config) override
+ {
+ TTenantClientGRpcCommand::Parse(config);
+
+ TVector<std::pair<TString, ui64>> pools;
+ ParseStoragePools(config, pools);
+
+ GRpcRequest.set_path(config.Tenant);
+ for (auto &pool : pools) {
+ auto &unit = *GRpcRequest.add_storage_units_to_add();
+ unit.set_unit_kind(pool.first);
+ unit.set_count(pool.second);
+ }
+ }
+};
+
+class TClientCommandTenantUnits : public TClientCommandTree {
+public:
+ TClientCommandTenantUnits()
+ : TClientCommandTree("units", {}, "")
+ {
AddCommand(std::make_unique<TClientCommandTenantAddUnits>());
AddCommand(std::make_unique<TClientCommandTenantRemoveUnits>());
AddCommand(std::make_unique<TClientCommandTenantRegisterUnits>());
AddCommand(std::make_unique<TClientCommandTenantDeregisterUnits>());
- }
-};
-
-class TClientCommandTenantPools : public TClientCommandTree {
-public:
- TClientCommandTenantPools()
- : TClientCommandTree("pools", {}, "")
- {
+ }
+};
+
+class TClientCommandTenantPools : public TClientCommandTree {
+public:
+ TClientCommandTenantPools()
+ : TClientCommandTree("pools", {}, "")
+ {
AddCommand(std::make_unique<TClientCommandTenantAddPools>());
- }
-};
-
-class TClientCommandTenantName : public TClientCommandTree {
-public:
- TClientCommandTenantName()
- : TClientCommandTree("*", {}, "<database name>")
- {
+ }
+};
+
+class TClientCommandTenantName : public TClientCommandTree {
+public:
+ TClientCommandTenantName()
+ : TClientCommandTree("*", {}, "<database name>")
+ {
AddCommand(std::make_unique<TClientCommandTenantCreate>());
AddCommand(std::make_unique<TClientCommandTenantPools>());
AddCommand(std::make_unique<TClientCommandTenantRemove>());
AddCommand(std::make_unique<TClientCommandTenantStatus>());
AddCommand(std::make_unique<TClientCommandTenantUnits>());
- }
-
- virtual void Parse(TConfig& config) override {
- config.Tenant = config.Tokens.back();
-
- TClientCommandTree::Parse(config);
- }
-};
-
-TClientCommandTenant::TClientCommandTenant()
- : TClientCommandTree("database", {"db", "tenant"}, "Database administration")
-{
+ }
+
+ virtual void Parse(TConfig& config) override {
+ config.Tenant = config.Tokens.back();
+
+ TClientCommandTree::Parse(config);
+ }
+};
+
+TClientCommandTenant::TClientCommandTenant()
+ : TClientCommandTree("database", {"db", "tenant"}, "Database administration")
+{
AddCommand(std::make_unique<TClientCommandTenantName>());
AddCommand(std::make_unique<TClientCommandTenantList>());
AddCommand(std::make_unique<TClientCommandTenantOptions>());
-}
-
-}
-}
+}
+
+}
+}
diff --git a/ydb/core/driver_lib/cli_utils/ya.make b/ydb/core/driver_lib/cli_utils/ya.make
index c5a5f287ca8..cb1f9670bea 100644
--- a/ydb/core/driver_lib/cli_utils/ya.make
+++ b/ydb/core/driver_lib/cli_utils/ya.make
@@ -11,9 +11,9 @@ SRCS(
cli_cmds.h
cli_cmds_admin.cpp
cli_cmds_bs.cpp
- cli_cmds_cms.cpp
+ cli_cmds_cms.cpp
cli_cmds_config.cpp
- cli_cmds_console.cpp
+ cli_cmds_console.cpp
cli_cmds_debug.cpp
cli_cmds_disk.cpp
cli_cmds_genconfig.cpp
@@ -23,7 +23,7 @@ SRCS(
cli_cmds_root.cpp
cli_cmds_server.cpp
cli_cmds_tablet.cpp
- cli_cmds_tenant.cpp
+ cli_cmds_tenant.cpp
cli_fakeinitshard.cpp
cli_keyvalue.cpp
cli_persqueue.cpp
diff --git a/ydb/core/driver_lib/run/config.h b/ydb/core/driver_lib/run/config.h
index cf6f69712e7..faf1797413e 100644
--- a/ydb/core/driver_lib/run/config.h
+++ b/ydb/core/driver_lib/run/config.h
@@ -23,7 +23,7 @@ union TBasicKikimrServicesMask {
bool EnableLogger:1;
bool EnableSchedulerActor:1;
bool EnableProfiler:1;
- bool EnableResourceBroker:1;
+ bool EnableResourceBroker:1;
bool EnableTabletResolver:1;
bool EnableTabletMonitoringProxy:1;
bool EnableTabletCountersAggregator:1;
@@ -44,12 +44,12 @@ union TBasicKikimrServicesMask {
bool EnableMemoryLog:1;
bool EnableGRpcService:1;
bool EnableNodeIdentifier:1;
- bool EnableCms:1;
- bool EnableNodeTable:1;
+ bool EnableCms:1;
+ bool EnableNodeTable:1;
bool EnableGRpcProxyStatus:1;
bool EnablePQ:1;
bool EnableSqs:1;
- bool EnableConfigsDispatcher:1;
+ bool EnableConfigsDispatcher:1;
bool EnableSecurityServices:1;
bool EnableTabletInfo:1;
bool EnableQuoterService:1;
diff --git a/ydb/core/driver_lib/run/driver.h b/ydb/core/driver_lib/run/driver.h
index f822b54e23d..7ad96718d11 100644
--- a/ydb/core/driver_lib/run/driver.h
+++ b/ydb/core/driver_lib/run/driver.h
@@ -22,7 +22,7 @@ namespace NKikimr {
XX(EDM_DEBUG, "debug", "admin running kikimr") \
XX(EDM_BS, "bs", "admin running kikimr") \
XX(EDM_BLOBSTORAGE, "blobstorage", "admin running kikimr") \
- XX(EDM_CMS, "cms", "admin running kikimr") \
+ XX(EDM_CMS, "cms", "admin running kikimr") \
XX(EDM_DISCOVERY, "discovery", "discover endpoints") \
XX(EDM_WHOAMI, "whoami", "admin running kikimr") \
XX(EDM_FORMAT_INFO, "format-info", "read pdisk format info") \
diff --git a/ydb/core/driver_lib/run/kikimr_services_initializers.cpp b/ydb/core/driver_lib/run/kikimr_services_initializers.cpp
index c8c91c00296..819c1478d19 100644
--- a/ydb/core/driver_lib/run/kikimr_services_initializers.cpp
+++ b/ydb/core/driver_lib/run/kikimr_services_initializers.cpp
@@ -130,7 +130,7 @@
#include <ydb/core/viewer/viewer.h>
#include <ydb/public/lib/deprecated/client/msgbus_client.h>
-
+
#include <ydb/core/ymq/actor/serviceid.h>
#include <ydb/core/yq/libs/init/init.h>
@@ -170,7 +170,7 @@
#include <library/cpp/actors/interconnect/poller_actor.h>
#include <library/cpp/actors/interconnect/poller_tcp.h>
#include <library/cpp/actors/util/affinity.h>
-
+
#include <library/cpp/logger/global/global.h>
#include <library/cpp/logger/log.h>
@@ -180,7 +180,7 @@
#include <library/cpp/lwtrace/mon/mon_lwtrace.h>
-#include <util/digest/city.h>
+#include <util/digest/city.h>
#include <util/generic/algorithm.h>
#include <util/generic/size_literals.h>
@@ -556,11 +556,11 @@ void TBasicServicesInitializer::InitializeServices(NActors::TActorSystemSetup* s
const TString addr = resolveHost ? TString() : node.GetAddress();
TNodeLocation location;
- if (node.HasWalleLocation()) {
+ if (node.HasWalleLocation()) {
location = TNodeLocation(node.GetWalleLocation());
} else if (node.HasLocation()) {
location = TNodeLocation(node.GetLocation());
- }
+ }
table->StaticNodeTable[nodeId] = TTableNameserverSetup::TNodeInfo(addr, host, resolveHost, port, location);
@@ -576,7 +576,7 @@ void TBasicServicesInitializer::InitializeServices(NActors::TActorSystemSetup* s
resolverId,
TActorSetupCmd(resolver, TMailboxType::HTSwap, systemPoolId));
- IActor *nameservice;
+ IActor *nameservice;
switch (nsConfig.GetType()) {
case NKikimrConfig::TStaticNameserviceConfig::NS_FIXED:
@@ -595,10 +595,10 @@ void TBasicServicesInitializer::InitializeServices(NActors::TActorSystemSetup* s
nameservice = NActors::CreateDynamicNameserver(table, TDuration::Seconds(3), appData->IOPoolId);
break;
}
-
+
setup->LocalServices.emplace_back(
nameserviceId,
- TActorSetupCmd(nameservice, TMailboxType::HTSwap, systemPoolId));
+ TActorSetupCmd(nameservice, TMailboxType::HTSwap, systemPoolId));
if (Config.HasInterconnectConfig() && Config.GetInterconnectConfig().GetStartTcp()) {
const auto& icConfig = Config.GetInterconnectConfig();
@@ -631,7 +631,7 @@ void TBasicServicesInitializer::InitializeServices(NActors::TActorSystemSetup* s
TIntrusivePtr<TInterconnectProxyCommon> icCommon;
icCommon.Reset(new TInterconnectProxyCommon);
icCommon->NameserviceId = nameserviceId;
- icCommon->MonCounters = GetServiceCounters(counters, "interconnect");
+ icCommon->MonCounters = GetServiceCounters(counters, "interconnect");
icCommon->ChannelsConfig = channels;
icCommon->Settings = settings;
icCommon->DestructorId = GetDestructActorID();
@@ -718,11 +718,11 @@ void TBasicServicesInitializer::InitializeServices(NActors::TActorSystemSetup* s
} else {
TYandexQueryInitializer::SetIcPort(node.second.second);
icCommon->TechnicalSelfHostName = node.second.Host;
- TString address = "::"; //bind ipv6 interfaces by default
- if (node.second.first)
- address = node.second.first;
+ TString address = "::"; //bind ipv6 interfaces by default
+ if (node.second.first)
+ address = node.second.first;
auto listener = new TInterconnectListenerTCP(
- address, node.second.second, icCommon);
+ address, node.second.second, icCommon);
if (int err = listener->Bind()) {
Cerr << "Failed to set up IC listener on port " << node.second.second
<< " errno# " << err << " (" << strerror(err) << ")" << Endl;
@@ -733,11 +733,11 @@ void TBasicServicesInitializer::InitializeServices(NActors::TActorSystemSetup* s
}
}
- // Prepare listener for dynamic node.
- if (Config.GetDynamicNodeConfig().HasNodeInfo()) {
- auto &info = Config.GetDynamicNodeConfig().GetNodeInfo();
- icCommon->TechnicalSelfHostName = info.GetHost();
-
+ // Prepare listener for dynamic node.
+ if (Config.GetDynamicNodeConfig().HasNodeInfo()) {
+ auto &info = Config.GetDynamicNodeConfig().GetNodeInfo();
+ icCommon->TechnicalSelfHostName = info.GetHost();
+
TString address = "::"; //bind ipv6 interfaces by default
if (info.GetAddress()) {
address = info.GetAddress();
@@ -750,8 +750,8 @@ void TBasicServicesInitializer::InitializeServices(NActors::TActorSystemSetup* s
}
setup->LocalServices.emplace_back(MakeInterconnectListenerActorId(true), TActorSetupCmd(listener,
TMailboxType::ReadAsFilled, interconnectPoolId));
- }
-
+ }
+
// create load responder for interconnect
// TODO(alexvru): pool?
setup->LocalServices.emplace_back(NInterconnect::MakeLoadResponderActorId(NodeId),
@@ -776,10 +776,10 @@ void TImmediateControlBoardInitializer::InitializeServices(NActors::TActorSystem
));
setup->LocalServices.push_back(std::pair<TActorId, TActorSetupCmd>(
TActorId(),
- TActorSetupCmd(NConsole::CreateImmediateControlsConfigurator(appData->Icb,
- Config.GetImmediateControlsConfig()),
- TMailboxType::ReadAsFilled, appData->UserPoolId)
- ));
+ TActorSetupCmd(NConsole::CreateImmediateControlsConfigurator(appData->Icb,
+ Config.GetImmediateControlsConfig()),
+ TMailboxType::ReadAsFilled, appData->UserPoolId)
+ ));
}
@@ -791,7 +791,7 @@ TBSNodeWardenInitializer::TBSNodeWardenInitializer(const TKikimrRunConfig& runCo
void TBSNodeWardenInitializer::InitializeServices(NActors::TActorSystemSetup* setup,
const NKikimr::TAppData* appData) {
- TIntrusivePtr<TNodeWardenConfig> nodeWardenConfig(new TNodeWardenConfig(new TRealPDiskServiceFactory()));
+ TIntrusivePtr<TNodeWardenConfig> nodeWardenConfig(new TNodeWardenConfig(new TRealPDiskServiceFactory()));
if (Config.HasBlobStorageConfig()) {
const auto& bsc = Config.GetBlobStorageConfig();
appData->StaticBlobStorageConfig->MergeFrom(bsc.GetServiceSet());
@@ -809,15 +809,15 @@ void TBSNodeWardenInitializer::InitializeServices(NActors::TActorSystemSetup* se
nodeWardenConfig->CachePDisks = bsc.GetCachePDisks();
nodeWardenConfig->CacheVDisks = bsc.GetCacheVDisks();
nodeWardenConfig->EnableVDiskCooldownTimeout = true;
- }
+ }
ObtainTenantKey(&nodeWardenConfig->TenantKey, Config.GetKeyConfig());
ObtainStaticKey(&nodeWardenConfig->StaticKey);
ObtainPDiskKey(&nodeWardenConfig->PDiskKey, Config.GetPDiskKeyConfig());
setup->LocalServices.push_back(std::pair<TActorId, TActorSetupCmd>(MakeBlobStorageNodeWardenID(NodeId),
- TActorSetupCmd(CreateBSNodeWarden(nodeWardenConfig.Release()),
- TMailboxType::ReadAsFilled, appData->SystemPoolId)));
+ TActorSetupCmd(CreateBSNodeWarden(nodeWardenConfig.Release()),
+ TMailboxType::ReadAsFilled, appData->SystemPoolId)));
setup->LocalServices.emplace_back(MakeUniversalSchedulerActorId(), TActorSetupCmd(CreateUniversalSchedulerActor(),
TMailboxType::ReadAsFilled, appData->SystemPoolId));
@@ -899,7 +899,7 @@ void TLocalServiceInitializer::InitializeServices(
}
// setup local
- TLocalConfig::TPtr localConfig(new TLocalConfig());
+ TLocalConfig::TPtr localConfig(new TLocalConfig());
localConfig->TabletClassInfo[appData->DefaultTabletTypes.SchemeShard] = TLocalConfig::TTabletClassInfo(
new TTabletSetupInfo(&CreateFlatTxSchemeShard, TMailboxType::ReadAsFilled, appData->UserPoolId, TMailboxType::ReadAsFilled, appData->SystemPoolId));
localConfig->TabletClassInfo[appData->DefaultTabletTypes.DataShard] = TLocalConfig::TTabletClassInfo(
@@ -929,26 +929,26 @@ void TLocalServiceInitializer::InitializeServices(
localConfig->TabletClassInfo[appData->DefaultTabletTypes.ReplicationController] = TLocalConfig::TTabletClassInfo(
new TTabletSetupInfo(&NReplication::CreateController, TMailboxType::ReadAsFilled, appData->UserPoolId, TMailboxType::ReadAsFilled, appData->SystemPoolId));
- TTenantPoolConfig::TPtr tenantPoolConfig = new TTenantPoolConfig(Config.GetTenantPoolConfig(), localConfig);
- if (!tenantPoolConfig->IsEnabled
- && (!tenantPoolConfig->StaticSlots.empty() || !tenantPoolConfig->DynamicSlots.empty()))
- Y_FAIL("Tenant slots are not allowed in disabled pool");
- // If there are no slots configured then bind to all domains and serve '/' and '/{domain}' together as usual
- if (tenantPoolConfig->IsEnabled
- && tenantPoolConfig->StaticSlots.empty()
- && tenantPoolConfig->DynamicSlots.empty()) {
- for (const auto &domain : Config.GetDomainsConfig().GetDomain()) {
- tenantPoolConfig->AddStaticSlot(domain.GetName());
- }
+ TTenantPoolConfig::TPtr tenantPoolConfig = new TTenantPoolConfig(Config.GetTenantPoolConfig(), localConfig);
+ if (!tenantPoolConfig->IsEnabled
+ && (!tenantPoolConfig->StaticSlots.empty() || !tenantPoolConfig->DynamicSlots.empty()))
+ Y_FAIL("Tenant slots are not allowed in disabled pool");
+ // If there are no slots configured then bind to all domains and serve '/' and '/{domain}' together as usual
+ if (tenantPoolConfig->IsEnabled
+ && tenantPoolConfig->StaticSlots.empty()
+ && tenantPoolConfig->DynamicSlots.empty()) {
+ for (const auto &domain : Config.GetDomainsConfig().GetDomain()) {
+ tenantPoolConfig->AddStaticSlot(domain.GetName());
+ }
}
setup->LocalServices.push_back(std::make_pair(MakeTenantPoolRootID(),
- TActorSetupCmd(CreateTenantPool(tenantPoolConfig), TMailboxType::ReadAsFilled, 0)));
-
- setup->LocalServices.push_back(std::make_pair(
+ TActorSetupCmd(CreateTenantPool(tenantPoolConfig), TMailboxType::ReadAsFilled, 0)));
+
+ setup->LocalServices.push_back(std::make_pair(
TActorId(),
- TActorSetupCmd(CreateLabelsMaintainer(Config.GetMonitoringConfig()),
- TMailboxType::ReadAsFilled, 0)));
+ TActorSetupCmd(CreateLabelsMaintainer(Config.GetMonitoringConfig()),
+ TMailboxType::ReadAsFilled, 0)));
setup->LocalServices.emplace_back(NTestShard::MakeStateServerInterfaceActorId(), TActorSetupCmd(
NTestShard::CreateStateServerInterfaceActor(), TMailboxType::ReadAsFilled, 0));
@@ -978,7 +978,7 @@ void TSharedCacheInitializer::InitializeServices(
config->TotalAsyncQueueInFlyLimit = cfg.GetAsyncQueueInFlyLimit();
config->TotalScanQueueInFlyLimit = cfg.GetScanQueueInFlyLimit();
- TIntrusivePtr<NMonitoring::TDynamicCounters> tabletGroup = GetServiceCounters(appData->Counters, "tablets");
+ TIntrusivePtr<NMonitoring::TDynamicCounters> tabletGroup = GetServiceCounters(appData->Counters, "tablets");
TIntrusivePtr<NMonitoring::TDynamicCounters> sausageGroup = tabletGroup->GetSubgroup("type", "S_CACHE");
config->CacheConfig = new TCacheCacheConfig(cfg.GetMemoryLimit(),
@@ -1028,14 +1028,14 @@ TLoggerInitializer::TLoggerInitializer(const TKikimrRunConfig& runConfig,
void TLoggerInitializer::InitializeServices(
NActors::TActorSystemSetup* setup,
const NKikimr::TAppData* appData) {
- const TIntrusivePtr<NMonitoring::TDynamicCounters> utilsCounters = GetServiceCounters(appData->Counters, "utils");
+ const TIntrusivePtr<NMonitoring::TDynamicCounters> utilsCounters = GetServiceCounters(appData->Counters, "utils");
// log settings must be initialized before calling this method
NActors::TLoggerActor *loggerActor = new NActors::TLoggerActor(LogSettings, LogBackend, utilsCounters);
NActors::TActorSetupCmd loggerActorCmd(loggerActor, NActors::TMailboxType::HTSwap, appData->IOPoolId);
std::pair<NActors::TActorId, NActors::TActorSetupCmd> loggerActorPair(LogSettings->LoggerActorId, loggerActorCmd);
setup->LocalServices.push_back(loggerActorPair);
-
+
IActor *configurator;
if (PathToConfigCacheFile && !appData->FeatureFlags.GetEnableConfigurationCache()) {
configurator = NConsole::CreateLogSettingsConfigurator(PathToConfigCacheFile);
@@ -1044,7 +1044,7 @@ void TLoggerInitializer::InitializeServices(
}
setup->LocalServices.emplace_back(TActorId(),
- TActorSetupCmd(configurator, TMailboxType::HTSwap, appData->UserPoolId));
+ TActorSetupCmd(configurator, TMailboxType::HTSwap, appData->UserPoolId));
}
// TSchedulerActorInitializer
@@ -1073,19 +1073,19 @@ TProfilerInitializer::TProfilerInitializer(const TKikimrRunConfig& runConfig)
void TProfilerInitializer::InitializeServices(
NActors::TActorSystemSetup* setup,
const NKikimr::TAppData* appData) {
- const TIntrusivePtr<NMonitoring::TDynamicCounters> utilsCounters = GetServiceCounters(appData->Counters, "utils");
+ const TIntrusivePtr<NMonitoring::TDynamicCounters> utilsCounters = GetServiceCounters(appData->Counters, "utils");
TActorSetupCmd profilerSetup(CreateProfilerActor(utilsCounters, "/var/tmp"), TMailboxType::HTSwap, 0);
setup->LocalServices.push_back(std::pair<TActorId, TActorSetupCmd>(MakeProfilerID(NodeId), profilerSetup));
}
-// TResourceBrokerInitializer
+// TResourceBrokerInitializer
-TResourceBrokerInitializer::TResourceBrokerInitializer(const TKikimrRunConfig& runConfig)
+TResourceBrokerInitializer::TResourceBrokerInitializer(const TKikimrRunConfig& runConfig)
: IKikimrServicesInitializer(runConfig) {
}
-void TResourceBrokerInitializer::InitializeServices(
+void TResourceBrokerInitializer::InitializeServices(
NActors::TActorSystemSetup* setup,
const NKikimr::TAppData* appData) {
NKikimrResourceBroker::TResourceBrokerConfig config = NResourceBroker::MakeDefaultConfig();
@@ -1093,19 +1093,19 @@ void TResourceBrokerInitializer::InitializeServices(
if (Config.HasBootstrapConfig() && Config.GetBootstrapConfig().HasCompactionBroker()) {
Y_FAIL("Legacy CompactionBroker configuration is no longer supported");
}
-
+
if (Config.HasBootstrapConfig() && Config.GetBootstrapConfig().HasResourceBroker()) {
NResourceBroker::MergeConfigUpdates(config, Config.GetBootstrapConfig().GetResourceBroker());
}
-
+
if (Config.HasResourceBrokerConfig()) {
NResourceBroker::MergeConfigUpdates(config, Config.GetResourceBrokerConfig());
}
- auto counters = GetServiceCounters(appData->Counters, "tablets");
+ auto counters = GetServiceCounters(appData->Counters, "tablets");
TActorSetupCmd actorSetup = { NResourceBroker::CreateResourceBrokerActor(config, counters),
- TMailboxType::ReadAsFilled, appData->UserPoolId };
- setup->LocalServices.push_back(std::make_pair(NResourceBroker::MakeResourceBrokerID(), actorSetup));
+ TMailboxType::ReadAsFilled, appData->UserPoolId };
+ setup->LocalServices.push_back(std::make_pair(NResourceBroker::MakeResourceBrokerID(), actorSetup));
}
// TRestartsCountPublisher
@@ -1133,7 +1133,7 @@ void TRestartsCountPublisher::InitializeServices(
NActors::TActorSystemSetup* setup,
const NKikimr::TAppData* appData) {
Y_UNUSED(setup);
- const TIntrusivePtr<NMonitoring::TDynamicCounters> utilsCounters = GetServiceCounters(appData->Counters, "utils");
+ const TIntrusivePtr<NMonitoring::TDynamicCounters> utilsCounters = GetServiceCounters(appData->Counters, "utils");
if (Config.HasRestartsCountConfig()) {
const auto& restartsCountConfig = Config.GetRestartsCountConfig();
@@ -1405,13 +1405,13 @@ void TMiniKQLCompileServiceInitializer::InitializeServices(NActors::TActorSystem
}
static bool IsServiceInitialized(NActors::TActorSystemSetup* setup, TActorId service)
-{
- for (auto &pr : setup->LocalServices)
- if (pr.first == service)
- return true;
- return false;
-}
-
+{
+ for (auto &pr : setup->LocalServices)
+ if (pr.first == service)
+ return true;
+ return false;
+}
+
// TMessageBusServicesInitializer
TMessageBusServicesInitializer::TMessageBusServicesInitializer(const TKikimrRunConfig& runConfig,
@@ -1467,23 +1467,23 @@ void TSecurityServicesInitializer::InitializeServices(NActors::TActorSystemSetup
TActorSetupCmd(ticketParser, TMailboxType::HTSwap, appData->UserPoolId)));
}
}
-}
-
-// TGRpcServicesInitializer
-
+}
+
+// TGRpcServicesInitializer
+
TGRpcServicesInitializer::TGRpcServicesInitializer(
const TKikimrRunConfig& runConfig,
std::shared_ptr<TModuleFactories> factories
)
- : IKikimrServicesInitializer(runConfig)
+ : IKikimrServicesInitializer(runConfig)
, Factories(factories)
{}
-
-void TGRpcServicesInitializer::InitializeServices(NActors::TActorSystemSetup* setup,
- const NKikimr::TAppData* appData)
-{
- if (!IsServiceInitialized(setup, NMsgBusProxy::CreateMsgBusProxyId())
- && Config.HasGRpcConfig() && Config.GetGRpcConfig().GetStartGRpcProxy()) {
+
+void TGRpcServicesInitializer::InitializeServices(NActors::TActorSystemSetup* setup,
+ const NKikimr::TAppData* appData)
+{
+ if (!IsServiceInitialized(setup, NMsgBusProxy::CreateMsgBusProxyId())
+ && Config.HasGRpcConfig() && Config.GetGRpcConfig().GetStartGRpcProxy()) {
IActor * proxy = NMsgBusProxy::CreateMessageBusServerProxy(
nullptr,
Factories ? Factories->PQReadSessionsInfoWorkerFactory : nullptr
@@ -1682,7 +1682,7 @@ void TSelfPingInitializer::InitializeServices(
? TDuration::MicroSeconds(Config.GetActorSystemConfig().GetSelfPingInterval())
: TDuration::MilliSeconds(10);
- const auto counters = GetServiceCounters(appData->Counters, "utils");
+ const auto counters = GetServiceCounters(appData->Counters, "utils");
for (size_t poolId = 0; poolId < setup->GetExecutorsCount(); ++poolId) {
const auto& poolName = setup->GetPoolName(poolId);
@@ -1824,7 +1824,7 @@ void TPersQueueL2CacheInitializer::InitializeServices(NActors::TActorSystemSetup
params.KeepTime = TDuration::Seconds(cfg.GetCacheKeepTimeSec());
}
- TIntrusivePtr<NMonitoring::TDynamicCounters> tabletGroup = GetServiceCounters(appData->Counters, "tablets");
+ TIntrusivePtr<NMonitoring::TDynamicCounters> tabletGroup = GetServiceCounters(appData->Counters, "tablets");
TIntrusivePtr<NMonitoring::TDynamicCounters> pqCacheGroup = tabletGroup->GetSubgroup("type", "PQ_CACHE");
IActor* actor = NPQ::CreateNodePersQueueL2Cache(params, pqCacheGroup);
@@ -2002,24 +2002,24 @@ void TMemoryLogInitializer::InitializeServices(
}
}
-TCmsServiceInitializer::TCmsServiceInitializer(const TKikimrRunConfig& runConfig)
- : IKikimrServicesInitializer(runConfig)
-{
-}
-
-void TCmsServiceInitializer::InitializeServices(NActors::TActorSystemSetup* setup,
- const NKikimr::TAppData* appData)
-{
- auto http = NCms::CreateCmsHttp();
+TCmsServiceInitializer::TCmsServiceInitializer(const TKikimrRunConfig& runConfig)
+ : IKikimrServicesInitializer(runConfig)
+{
+}
+
+void TCmsServiceInitializer::InitializeServices(NActors::TActorSystemSetup* setup,
+ const NKikimr::TAppData* appData)
+{
+ auto http = NCms::CreateCmsHttp();
setup->LocalServices.emplace_back(TActorId(),
- TActorSetupCmd(http, TMailboxType::HTSwap, appData->UserPoolId));
-}
-
+ TActorSetupCmd(http, TMailboxType::HTSwap, appData->UserPoolId));
+}
+
TTxProxyInitializer::TTxProxyInitializer(const TKikimrRunConfig &runConfig)
: IKikimrServicesInitializer(runConfig)
{
}
-
+
TVector<ui64> TTxProxyInitializer::CollectAllAllocatorsFromAllDomains(const TAppData *appData) {
TVector<ui64> allocators;
for (auto it: appData->DomainsInfo->Domains) {
@@ -2067,29 +2067,29 @@ void TSequenceProxyServiceInitializer::InitializeServices(TActorSystemSetup *set
TActorSetupCmd(actor, TMailboxType::ReadAsFilled, appData->UserPoolId)));
}
-TLeaseHolderInitializer::TLeaseHolderInitializer(const TKikimrRunConfig& runConfig)
- : IKikimrServicesInitializer(runConfig)
-{
-}
+TLeaseHolderInitializer::TLeaseHolderInitializer(const TKikimrRunConfig& runConfig)
+ : IKikimrServicesInitializer(runConfig)
+{
+}
-void TLeaseHolderInitializer::InitializeServices(NActors::TActorSystemSetup* setup,
- const NKikimr::TAppData* appData)
-{
- // Lease holder is required for dynamic nodes only.
- if (Config.GetDynamicNodeConfig().HasNodeInfo()) {
+void TLeaseHolderInitializer::InitializeServices(NActors::TActorSystemSetup* setup,
+ const NKikimr::TAppData* appData)
+{
+ // Lease holder is required for dynamic nodes only.
+ if (Config.GetDynamicNodeConfig().HasNodeInfo()) {
TInstant expire = TInstant::MicroSeconds(Config.GetDynamicNodeConfig().GetNodeInfo().GetExpire());
- auto holder = NNodeBroker::CreateLeaseHolder(expire);
+ auto holder = NNodeBroker::CreateLeaseHolder(expire);
setup->LocalServices.emplace_back(TActorId(),
- TActorSetupCmd(holder, TMailboxType::HTSwap, appData->UserPoolId));
- }
-}
-
+ TActorSetupCmd(holder, TMailboxType::HTSwap, appData->UserPoolId));
+ }
+}
+
TSqsServiceInitializer::TSqsServiceInitializer(const TKikimrRunConfig& runConfig, const std::shared_ptr<TModuleFactories>& factories)
: IKikimrServicesInitializer(runConfig)
, Factories(factories)
{
}
-
+
void TSqsServiceInitializer::InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) {
if (Config.GetSqsConfig().GetEnableSqs()) {
ui32 grpcPort = 0;
@@ -2114,18 +2114,18 @@ void TSqsServiceInitializer::InitializeServices(NActors::TActorSystemSetup* setu
}
}
-TConfigsDispatcherInitializer::TConfigsDispatcherInitializer(const TKikimrRunConfig& runConfig)
- : IKikimrServicesInitializer(runConfig)
-{
-}
-
-void TConfigsDispatcherInitializer::InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) {
- IActor* actor = NConsole::CreateConfigsDispatcher(Config);
+TConfigsDispatcherInitializer::TConfigsDispatcherInitializer(const TKikimrRunConfig& runConfig)
+ : IKikimrServicesInitializer(runConfig)
+{
+}
+
+void TConfigsDispatcherInitializer::InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) {
+ IActor* actor = NConsole::CreateConfigsDispatcher(Config);
setup->LocalServices.push_back(std::pair<TActorId, TActorSetupCmd>(
- NConsole::MakeConfigsDispatcherID(NodeId),
- TActorSetupCmd(actor, TMailboxType::HTSwap, appData->UserPoolId)));
-}
-
+ NConsole::MakeConfigsDispatcherID(NodeId),
+ TActorSetupCmd(actor, TMailboxType::HTSwap, appData->UserPoolId)));
+}
+
TConfigsCacheInitializer::TConfigsCacheInitializer(const TKikimrRunConfig& runConfig)
: IKikimrServicesInitializer(runConfig)
, PathToConfigCacheFile(runConfig.PathToConfigCacheFile)
@@ -2142,7 +2142,7 @@ void TConfigsCacheInitializer::InitializeServices(NActors::TActorSystemSetup* se
}
// TTabletInfoInitializer
-
+
TTabletInfoInitializer::TTabletInfoInitializer(const TKikimrRunConfig& runConfig)
: IKikimrServicesInitializer(runConfig) {
}
@@ -2154,22 +2154,22 @@ void TTabletInfoInitializer::InitializeServices(
setup->LocalServices.push_back(std::pair<TActorId, TActorSetupCmd>(NTabletInfo::MakeTabletInfoID(), tabletInfoSetup));
}
-TConfigValidatorsInitializer::TConfigValidatorsInitializer(const TKikimrRunConfig& runConfig)
- : IKikimrServicesInitializer(runConfig)
-{
-}
+TConfigValidatorsInitializer::TConfigValidatorsInitializer(const TKikimrRunConfig& runConfig)
+ : IKikimrServicesInitializer(runConfig)
+{
+}
+
+void TConfigValidatorsInitializer::InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) {
+ Y_UNUSED(setup);
+ Y_UNUSED(appData);
+ NConsole::RegisterCoreValidators();
+}
-void TConfigValidatorsInitializer::InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) {
- Y_UNUSED(setup);
- Y_UNUSED(appData);
- NConsole::RegisterCoreValidators();
-}
-
TSysViewServiceInitializer::TSysViewServiceInitializer(const TKikimrRunConfig& runConfig)
: IKikimrServicesInitializer(runConfig)
{
}
-
+
void TSysViewServiceInitializer::InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) {
NSysView::TExtCountersConfig config;
for (ui32 i = 0; i < setup->GetExecutorsCount(); ++i) {
diff --git a/ydb/core/driver_lib/run/kikimr_services_initializers.h b/ydb/core/driver_lib/run/kikimr_services_initializers.h
index e721ef5c044..407ce1bb7ba 100644
--- a/ydb/core/driver_lib/run/kikimr_services_initializers.h
+++ b/ydb/core/driver_lib/run/kikimr_services_initializers.h
@@ -125,9 +125,9 @@ public:
void InitializeServices(NActors::TActorSystemSetup *setup, const NKikimr::TAppData *appData) override;
};
-class TResourceBrokerInitializer : public IKikimrServicesInitializer {
+class TResourceBrokerInitializer : public IKikimrServicesInitializer {
public:
- TResourceBrokerInitializer(const TKikimrRunConfig& runConfig);
+ TResourceBrokerInitializer(const TKikimrRunConfig& runConfig);
void InitializeServices(NActors::TActorSystemSetup *setup, const NKikimr::TAppData *appData) override;
};
@@ -252,17 +252,17 @@ public:
void InitializeServices(NActors::TActorSystemSetup *setup, const NKikimr::TAppData *appData) override;
};
-// grpc_proxy
-class TGRpcServicesInitializer : public IKikimrServicesInitializer {
+// grpc_proxy
+class TGRpcServicesInitializer : public IKikimrServicesInitializer {
private:
std::shared_ptr<TModuleFactories> Factories;
-public:
+public:
TGRpcServicesInitializer(const TKikimrRunConfig& runConfig, std::shared_ptr<TModuleFactories> factories);
-
+
void InitializeServices(NActors::TActorSystemSetup *setup, const NKikimr::TAppData *appData) override;
-};
-
+};
+
#ifdef ACTORSLIB_COLLECT_EXEC_STATS
// stats_collector, procstats_collector
class TStatsCollectorInitializer : public IKikimrServicesInitializer {
@@ -397,20 +397,20 @@ public:
void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override;
};
-class TCmsServiceInitializer : public IKikimrServicesInitializer {
-public:
- TCmsServiceInitializer(const TKikimrRunConfig& runConfig);
-
+class TCmsServiceInitializer : public IKikimrServicesInitializer {
+public:
+ TCmsServiceInitializer(const TKikimrRunConfig& runConfig);
+
void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override;
-};
-
-class TLeaseHolderInitializer : public IKikimrServicesInitializer {
-public:
- TLeaseHolderInitializer(const TKikimrRunConfig& runConfig);
-
+};
+
+class TLeaseHolderInitializer : public IKikimrServicesInitializer {
+public:
+ TLeaseHolderInitializer(const TKikimrRunConfig& runConfig);
+
void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override;
-};
-
+};
+
class TSqsServiceInitializer : public IKikimrServicesInitializer {
public:
TSqsServiceInitializer(const TKikimrRunConfig& runConfig, const std::shared_ptr<TModuleFactories>& factories);
@@ -421,13 +421,13 @@ private:
std::shared_ptr<TModuleFactories> Factories;
};
-class TConfigsDispatcherInitializer : public IKikimrServicesInitializer {
-public:
- TConfigsDispatcherInitializer(const TKikimrRunConfig& runConfig);
-
- void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override;
-};
-
+class TConfigsDispatcherInitializer : public IKikimrServicesInitializer {
+public:
+ TConfigsDispatcherInitializer(const TKikimrRunConfig& runConfig);
+
+ void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override;
+};
+
class TConfigsCacheInitializer : public IKikimrServicesInitializer {
private:
TString PathToConfigCacheFile;
@@ -440,21 +440,21 @@ public:
class TTabletInfoInitializer : public IKikimrServicesInitializer {
public:
TTabletInfoInitializer(const TKikimrRunConfig& runConfig);
-
+
void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override;
};
-class TConfigValidatorsInitializer : public IKikimrServicesInitializer {
-public:
- TConfigValidatorsInitializer(const TKikimrRunConfig& runConfig);
+class TConfigValidatorsInitializer : public IKikimrServicesInitializer {
+public:
+ TConfigValidatorsInitializer(const TKikimrRunConfig& runConfig);
+
+ void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override;
+};
- void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override;
-};
-
class TSysViewServiceInitializer : public IKikimrServicesInitializer {
public:
TSysViewServiceInitializer(const TKikimrRunConfig& runConfig);
-
+
void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override;
};
diff --git a/ydb/core/driver_lib/run/main.cpp b/ydb/core/driver_lib/run/main.cpp
index dd9861ba275..f0a9315685b 100644
--- a/ydb/core/driver_lib/run/main.cpp
+++ b/ydb/core/driver_lib/run/main.cpp
@@ -116,7 +116,7 @@ int MainRun(const TKikimrRunConfig& runConfig, std::shared_ptr<TModuleFactories>
case EDM_BS:
case EDM_BLOBSTORAGE:
case EDM_SERVER:
- case EDM_CMS:
+ case EDM_CMS:
case EDM_DISCOVERY:
case EDM_WHOAMI:
return NDriverClient::NewClient(argc + freeArgsPos, argv - freeArgsPos, factories);
diff --git a/ydb/core/driver_lib/run/run.cpp b/ydb/core/driver_lib/run/run.cpp
index 3026b93b4a6..a4f74aa4e0f 100644
--- a/ydb/core/driver_lib/run/run.cpp
+++ b/ydb/core/driver_lib/run/run.cpp
@@ -146,10 +146,10 @@ public:
const ui64 planResolution = domain.HasPlanResolution() ? domain.GetPlanResolution() : 500;
const TString domainName = domain.HasName() ? domain.GetName() : Sprintf("domain-%" PRIu32, domainId);
TDomainsInfo::TDomain::TStoragePoolKinds poolTypes;
- for (auto &type : domain.GetStoragePoolTypes()) {
+ for (auto &type : domain.GetStoragePoolTypes()) {
Y_VERIFY(!poolTypes.contains(type.GetKind()), "duplicated slot type");
poolTypes[type.GetKind()] = type.GetPoolConfig();
- }
+ }
bool isExplicitTabletIds = domain.ExplicitCoordinatorsSize() + domain.ExplicitMediatorsSize() + domain.ExplicitAllocatorsSize();
@@ -163,7 +163,7 @@ public:
domainPtr = TDomainsInfo::TDomain::ConstructDomainWithExplicitTabletIds(domainName, domainId, schemeRoot,
defaultSSId, schemeBoardSSId, domain.GetSSId(),
domainId, domain.GetHiveUid(),
- planResolution,
+ planResolution,
domain.GetExplicitCoordinators(),
domain.GetExplicitMediators(),
domain.GetExplicitAllocators(),
@@ -172,7 +172,7 @@ public:
domainPtr = TDomainsInfo::TDomain::ConstructDomain(domainName, domainId, schemeRoot,
defaultSSId, schemeBoardSSId, domain.GetSSId(),
domainId, domain.GetHiveUid(),
- planResolution,
+ planResolution,
domain.GetCoordinator(), domain.GetMediator(),
domain.GetProxy(), poolTypes);
}
@@ -281,42 +281,42 @@ public:
};
-class TDynamicNameserviceInitializer : public IAppDataInitializer {
- const NKikimrConfig::TAppConfig& Config;
-
-public:
- TDynamicNameserviceInitializer(const TKikimrRunConfig& runConfig)
- : Config(runConfig.AppConfig)
- {
- }
-
- virtual void Initialize(NKikimr::TAppData* appData) override
- {
- auto &dnConfig = Config.GetDynamicNameserviceConfig();
- TIntrusivePtr<TDynamicNameserviceConfig> config = new TDynamicNameserviceConfig;
- config->MaxStaticNodeId = dnConfig.GetMaxStaticNodeId();
- config->MaxDynamicNodeId = dnConfig.GetMaxDynamicNodeId();
- appData->DynamicNameserviceConfig = config;
- }
-};
-
-
-class TCmsInitializer : public IAppDataInitializer {
- const NKikimrConfig::TAppConfig& Config;
-
-public:
- TCmsInitializer(const TKikimrRunConfig& runConfig)
- : Config(runConfig.AppConfig)
- {
- }
-
- virtual void Initialize(NKikimr::TAppData* appData) override
- {
- if (Config.HasCmsConfig())
+class TDynamicNameserviceInitializer : public IAppDataInitializer {
+ const NKikimrConfig::TAppConfig& Config;
+
+public:
+ TDynamicNameserviceInitializer(const TKikimrRunConfig& runConfig)
+ : Config(runConfig.AppConfig)
+ {
+ }
+
+ virtual void Initialize(NKikimr::TAppData* appData) override
+ {
+ auto &dnConfig = Config.GetDynamicNameserviceConfig();
+ TIntrusivePtr<TDynamicNameserviceConfig> config = new TDynamicNameserviceConfig;
+ config->MaxStaticNodeId = dnConfig.GetMaxStaticNodeId();
+ config->MaxDynamicNodeId = dnConfig.GetMaxDynamicNodeId();
+ appData->DynamicNameserviceConfig = config;
+ }
+};
+
+
+class TCmsInitializer : public IAppDataInitializer {
+ const NKikimrConfig::TAppConfig& Config;
+
+public:
+ TCmsInitializer(const TKikimrRunConfig& runConfig)
+ : Config(runConfig.AppConfig)
+ {
+ }
+
+ virtual void Initialize(NKikimr::TAppData* appData) override
+ {
+ if (Config.HasCmsConfig())
appData->DefaultCmsConfig = MakeHolder<NKikimrCms::TCmsConfig>(Config.GetCmsConfig());
- }
-};
-
+ }
+};
+
TKikimrRunner::TKikimrRunner(std::shared_ptr<TModuleFactories> factories)
: ModuleFactories(std::move(factories))
, Counters(MakeIntrusive<NMonitoring::TDynamicCounters>())
@@ -869,11 +869,11 @@ void TKikimrRunner::InitializeAppData(const TKikimrRunConfig& runConfig)
AppData->PollerThreads = PollerThreads;
AppData->LocalScopeId = runConfig.ScopeId;
- // setup streaming config
+ // setup streaming config
if (runConfig.AppConfig.GetGRpcConfig().HasStreamingConfig()) {
- AppData->StreamingConfig.CopyFrom(runConfig.AppConfig.GetGRpcConfig().GetStreamingConfig());
+ AppData->StreamingConfig.CopyFrom(runConfig.AppConfig.GetGRpcConfig().GetStreamingConfig());
}
-
+
if (runConfig.AppConfig.HasPQConfig()) {
AppData->PQConfig.CopyFrom(runConfig.AppConfig.GetPQConfig());
}
@@ -914,11 +914,11 @@ void TKikimrRunner::InitializeAppData(const TKikimrRunConfig& runConfig)
AppData->MeteringConfig = runConfig.AppConfig.GetMeteringConfig();
}
- // setup resource profiles
- AppData->ResourceProfiles = new TResourceProfiles;
- if (runConfig.AppConfig.GetBootstrapConfig().ResourceProfilesSize())
- AppData->ResourceProfiles->LoadProfiles(runConfig.AppConfig.GetBootstrapConfig().GetResourceProfiles());
-
+ // setup resource profiles
+ AppData->ResourceProfiles = new TResourceProfiles;
+ if (runConfig.AppConfig.GetBootstrapConfig().ResourceProfilesSize())
+ AppData->ResourceProfiles->LoadProfiles(runConfig.AppConfig.GetBootstrapConfig().GetResourceProfiles());
+
if (runConfig.AppConfig.GetBootstrapConfig().HasEnableIntrospection())
AppData->EnableIntrospection = runConfig.AppConfig.GetBootstrapConfig().GetEnableIntrospection();
@@ -929,10 +929,10 @@ void TKikimrRunner::InitializeAppData(const TKikimrRunConfig& runConfig)
appDataInitializers.AddAppDataInitializer(new TChannelProfilesInitializer(runConfig));
// setup proxy scheme cache
appDataInitializers.AddAppDataInitializer(new TProxySchemeCacheInitializer(runConfig));
- // setup dynamic nameservice
- appDataInitializers.AddAppDataInitializer(new TDynamicNameserviceInitializer(runConfig));
- // setup cms
- appDataInitializers.AddAppDataInitializer(new TCmsInitializer(runConfig));
+ // setup dynamic nameservice
+ appDataInitializers.AddAppDataInitializer(new TDynamicNameserviceInitializer(runConfig));
+ // setup cms
+ appDataInitializers.AddAppDataInitializer(new TCmsInitializer(runConfig));
appDataInitializers.Initialize(AppData.Get());
}
@@ -1015,9 +1015,9 @@ void TKikimrRunner::ApplyLogSettings(const TKikimrRunConfig& runConfig)
}
TString explanation;
- if (entry.HasLevel()) {
- Y_VERIFY(LogSettings->SetLevel((NLog::EPriority)entry.GetLevel(), component, explanation) == 0);
- }
+ if (entry.HasLevel()) {
+ Y_VERIFY(LogSettings->SetLevel((NLog::EPriority)entry.GetLevel(), component, explanation) == 0);
+ }
if (entry.HasSamplingLevel()) {
Y_VERIFY(LogSettings->SetSamplingLevel((NLog::EPriority)entry.GetSamplingLevel(), component, explanation) == 0);
}
@@ -1177,8 +1177,8 @@ TIntrusivePtr<TServiceInitializersList> TKikimrRunner::CreateServiceInitializers
if (serviceMask.EnableProfiler) {
sil->AddServiceInitializer(new TProfilerInitializer(runConfig));
}
- if (serviceMask.EnableResourceBroker) {
- sil->AddServiceInitializer(new TResourceBrokerInitializer(runConfig));
+ if (serviceMask.EnableResourceBroker) {
+ sil->AddServiceInitializer(new TResourceBrokerInitializer(runConfig));
}
if (serviceMask.EnableTabletResolver) {
sil->AddServiceInitializer(new TTabletResolverInitializer(runConfig));
@@ -1222,10 +1222,10 @@ TIntrusivePtr<TServiceInitializersList> TKikimrRunner::CreateServiceInitializers
sil->AddServiceInitializer(new THealthCheckInitializer(runConfig));
}
- if (serviceMask.EnableGRpcService) {
+ if (serviceMask.EnableGRpcService) {
sil->AddServiceInitializer(new TGRpcServicesInitializer(runConfig, ModuleFactories));
- }
-
+ }
+
#ifdef ACTORSLIB_COLLECT_EXEC_STATS
if (serviceMask.EnableStatsCollector) {
sil->AddServiceInitializer(new TStatsCollectorInitializer(runConfig));
@@ -1272,18 +1272,18 @@ TIntrusivePtr<TServiceInitializersList> TKikimrRunner::CreateServiceInitializers
sil->AddServiceInitializer(new TKqpServiceInitializer(runConfig, ModuleFactories));
}
- if (serviceMask.EnableCms) {
- sil->AddServiceInitializer(new TCmsServiceInitializer(runConfig));
- }
-
+ if (serviceMask.EnableCms) {
+ sil->AddServiceInitializer(new TCmsServiceInitializer(runConfig));
+ }
+
if (serviceMask.EnableSqs) {
sil->AddServiceInitializer(new TSqsServiceInitializer(runConfig, ModuleFactories));
}
- if (serviceMask.EnableConfigsDispatcher) {
- sil->AddServiceInitializer(new TConfigsDispatcherInitializer(runConfig));
- }
-
+ if (serviceMask.EnableConfigsDispatcher) {
+ sil->AddServiceInitializer(new TConfigsDispatcherInitializer(runConfig));
+ }
+
if (serviceMask.EnableConfigsCache) {
sil->AddServiceInitializer(new TConfigsCacheInitializer(runConfig));
}
@@ -1292,9 +1292,9 @@ TIntrusivePtr<TServiceInitializersList> TKikimrRunner::CreateServiceInitializers
sil->AddServiceInitializer(new TTabletInfoInitializer(runConfig));
}
- sil->AddServiceInitializer(new TLeaseHolderInitializer(runConfig));
- sil->AddServiceInitializer(new TConfigValidatorsInitializer(runConfig));
-
+ sil->AddServiceInitializer(new TLeaseHolderInitializer(runConfig));
+ sil->AddServiceInitializer(new TConfigValidatorsInitializer(runConfig));
+
if (serviceMask.EnableQuoterService) {
sil->AddServiceInitializer(new TQuoterServiceInitializer(runConfig));
}
diff --git a/ydb/core/engine/kikimr_program_builder.cpp b/ydb/core/engine/kikimr_program_builder.cpp
index 3826efb0d19..fd32a772ee9 100644
--- a/ydb/core/engine/kikimr_program_builder.cpp
+++ b/ydb/core/engine/kikimr_program_builder.cpp
@@ -1,7 +1,7 @@
#include "kikimr_program_builder.h"
#include <ydb/public/lib/scheme_types/scheme_type_id.h>
-
+
#include <ydb/library/yql/minikql/mkql_node_cast.h>
#include <ydb/library/yql/minikql/mkql_node_visitor.h>
#include <ydb/library/yql/minikql/mkql_node_printer.h>
@@ -24,14 +24,14 @@ TType* ValidateColumns(
tagsBuilder.Reserve(columns.size());
for (auto& col : columns) {
MKQL_ENSURE(col.SchemeType != 0, "Null type is not allowed");
- TDataType *dataType;
- if (col.SchemeType == NYql::NProto::TypeIds::Decimal)
- dataType = TDataDecimalType::Create(
- NScheme::DECIMAL_PRECISION,
- NScheme::DECIMAL_SCALE,
- builder->GetTypeEnvironment());
- else
- dataType = TDataType::Create(col.SchemeType, builder->GetTypeEnvironment());
+ TDataType *dataType;
+ if (col.SchemeType == NYql::NProto::TypeIds::Decimal)
+ dataType = TDataDecimalType::Create(
+ NScheme::DECIMAL_PRECISION,
+ NScheme::DECIMAL_SCALE,
+ builder->GetTypeEnvironment());
+ else
+ dataType = TDataType::Create(col.SchemeType, builder->GetTypeEnvironment());
auto optType = TOptionalType::Create(dataType, builder->GetTypeEnvironment());
rowTypeBuilder.Add(col.Label, optType);
tagsBuilder.Add(col.Label, builder->NewDataLiteral<ui32>(col.ColumnId));
diff --git a/ydb/core/engine/minikql/minikql_engine_host.cpp b/ydb/core/engine/minikql/minikql_engine_host.cpp
index 56fab8a43c7..36c35f32cc4 100644
--- a/ydb/core/engine/minikql/minikql_engine_host.cpp
+++ b/ydb/core/engine/minikql/minikql_engine_host.cpp
@@ -282,11 +282,11 @@ NUdf::TUnboxedValue TEngineHost::SelectRow(const TTableId& tableId, const TArray
TSmallVec<NTable::TTag> systemColumnTags;
AnalyzeRowType(columnIds, tags, systemColumnTags);
- TSmallVec<NScheme::TTypeId> cellTypes;
- cellTypes.reserve(tags.size());
- for (size_t i = 0; i < tags.size(); ++i)
- cellTypes.emplace_back(tableInfo->Columns.at(tags[i]).PType);
-
+ TSmallVec<NScheme::TTypeId> cellTypes;
+ cellTypes.reserve(tags.size());
+ for (size_t i = 0; i < tags.size(); ++i)
+ cellTypes.emplace_back(tableInfo->Columns.at(tags[i]).PType);
+
NTable::TRowState dbRow;
if (key.size() != Db.GetScheme().GetTableInfo(localTid)->KeyColumns.size())
@@ -317,7 +317,7 @@ NUdf::TUnboxedValue TEngineHost::SelectRow(const TTableId& tableId, const TArray
ui64 rowBytes = 0;
for (ui32 i = 0; i < tags.size(); ++i) {
- rowItems[i] = GetCellValue(dbRow.Get(i), cellTypes[i]);
+ rowItems[i] = GetCellValue(dbRow.Get(i), cellTypes[i]);
rowBytes += dbRow.Get(i).IsNull() ? 1 : dbRow.Get(i).Size();
}
for (ui32 i = 0; i < systemColumnTags.size(); ++i) {
@@ -959,7 +959,7 @@ void AnalyzeRowType(TStructLiteral* columnIds, TSmallVec<NTable::TTag>& tags, TS
}
}
-NUdf::TUnboxedValue GetCellValue(const TCell& cell, NScheme::TTypeId type) {
+NUdf::TUnboxedValue GetCellValue(const TCell& cell, NScheme::TTypeId type) {
if (cell.IsNull()) {
return NUdf::TUnboxedValue();
}
@@ -1030,7 +1030,7 @@ NUdf::TUnboxedValue GetCellValue(const TCell& cell, NScheme::TTypeId type) {
default:
Y_VERIFY_DEBUG(false, "Unsupported type: %" PRIu16, type);
return MakeString(NUdf::TStringRef(cell.Data(), cell.Size()));
- }
+ }
}
}}
diff --git a/ydb/core/engine/mkql_engine_flat.cpp b/ydb/core/engine/mkql_engine_flat.cpp
index ea6fbc07792..c7fe388eef8 100644
--- a/ydb/core/engine/mkql_engine_flat.cpp
+++ b/ydb/core/engine/mkql_engine_flat.cpp
@@ -1188,9 +1188,9 @@ public:
catch (TNotReadyTabletException&) {
throw;
}
- catch (TMemoryLimitExceededException&) {
- throw;
- }
+ catch (TMemoryLimitExceededException&) {
+ throw;
+ }
catch (yexception& e) {
Alloc.InvalidateMemInfo();
HandleException("PrepareOutgoingReadsets", __LINE__, e);
@@ -1219,10 +1219,10 @@ public:
AreOutgoingReadSetsExtracted = true;
}
- bool IsAfterOutgoingReadsetsExtracted() noexcept override {
- return AreOutgoingReadSetsExtracted;
- }
-
+ bool IsAfterOutgoingReadsetsExtracted() noexcept override {
+ return AreOutgoingReadSetsExtracted;
+ }
+
EResult PrepareIncomingReadsets() override {
Y_VERIFY(!AreIncomingReadsetsPrepared, "PrepareIncomingReadsets is already called");
Y_VERIFY(Settings.Host, "Host is not set");
@@ -1403,9 +1403,9 @@ public:
catch (TNotReadyTabletException&) {
throw;
}
- catch (TMemoryLimitExceededException&) {
- throw;
- }
+ catch (TMemoryLimitExceededException&) {
+ throw;
+ }
catch (TDeadlineExceededException&) {
Cancel();
IsExecuted = true;
@@ -1433,26 +1433,26 @@ public:
return it->second;
}
- size_t GetMemoryUsed() const noexcept override {
- return Alloc.GetUsed();
- }
-
- size_t GetMemoryAllocated() const noexcept override {
- return Alloc.GetAllocated();
- }
-
- size_t GetMemoryLimit() const noexcept override {
- return Alloc.GetLimit();
- }
-
- void SetMemoryLimit(size_t limit) noexcept override {
- Alloc.SetLimit(limit);
- }
-
- void ReleaseUnusedMemory() noexcept override {
- Alloc.ReleaseFreePages();
- }
-
+ size_t GetMemoryUsed() const noexcept override {
+ return Alloc.GetUsed();
+ }
+
+ size_t GetMemoryAllocated() const noexcept override {
+ return Alloc.GetAllocated();
+ }
+
+ size_t GetMemoryLimit() const noexcept override {
+ return Alloc.GetLimit();
+ }
+
+ void SetMemoryLimit(size_t limit) noexcept override {
+ Alloc.SetLimit(limit);
+ }
+
+ void ReleaseUnusedMemory() noexcept override {
+ Alloc.ReleaseFreePages();
+ }
+
void SetDeadline(const TInstant& deadline) noexcept override {
if (!ReadOnlyOriginPrograms) {
return;
diff --git a/ydb/core/engine/mkql_engine_flat.h b/ydb/core/engine/mkql_engine_flat.h
index 091e1a73406..7bee67584b9 100644
--- a/ydb/core/engine/mkql_engine_flat.h
+++ b/ydb/core/engine/mkql_engine_flat.h
@@ -174,7 +174,7 @@ public:
TValidationInfo(const TValidationInfo&) = delete;
bool HasWrites() const { return WritesCount > 0; }
- bool HasReads() const { return ReadsCount > 0; }
+ bool HasReads() const { return ReadsCount > 0; }
void Clear() {
Keys.clear();
@@ -220,7 +220,7 @@ public:
virtual ui32 GetOutgoingReadsetsCount() const noexcept = 0;
virtual TReadSet GetOutgoingReadset(ui32 index) const = 0;
virtual void AfterOutgoingReadsetsExtracted() noexcept = 0;
- virtual bool IsAfterOutgoingReadsetsExtracted() noexcept = 0;
+ virtual bool IsAfterOutgoingReadsetsExtracted() noexcept = 0;
virtual EResult PrepareIncomingReadsets() = 0;
virtual ui32 GetExpectedIncomingReadsetsCount() const noexcept = 0;
@@ -231,16 +231,16 @@ public:
virtual EResult PinPages(ui64 pageFaultCount = 0) = 0;
virtual EResult Execute() = 0;
virtual TString GetShardReply(ui64 origin) const noexcept = 0;
-
- virtual size_t GetMemoryUsed() const noexcept = 0;
- virtual size_t GetMemoryAllocated() const noexcept = 0;
-
- virtual size_t GetMemoryLimit() const noexcept = 0;
- virtual void SetMemoryLimit(size_t limit) noexcept = 0;
-
+
+ virtual size_t GetMemoryUsed() const noexcept = 0;
+ virtual size_t GetMemoryAllocated() const noexcept = 0;
+
+ virtual size_t GetMemoryLimit() const noexcept = 0;
+ virtual void SetMemoryLimit(size_t limit) noexcept = 0;
+
virtual void SetDeadline(const TInstant& deadline) noexcept = 0;
- virtual void ReleaseUnusedMemory() noexcept = 0;
+ virtual void ReleaseUnusedMemory() noexcept = 0;
};
} // namespace NMiniKQL
diff --git a/ydb/core/engine/mkql_engine_flat_extfunc.cpp b/ydb/core/engine/mkql_engine_flat_extfunc.cpp
index 667f0a1b5c0..414d3aeeb45 100644
--- a/ydb/core/engine/mkql_engine_flat_extfunc.cpp
+++ b/ydb/core/engine/mkql_engine_flat_extfunc.cpp
@@ -13,8 +13,8 @@ namespace NKikimr {
namespace NMiniKQL {
namespace {
-
- TCell ExtractCell(TRuntimeNode value, const TTypeEnvironment& env) {
+
+ TCell ExtractCell(TRuntimeNode value, const TTypeEnvironment& env) {
TRuntimeNode data = value;
if (value.GetStaticType()->IsOptional()) {
auto opt = AS_VALUE(TOptionalLiteral, value);
@@ -26,14 +26,14 @@ namespace {
}
const auto literal = AS_VALUE(TDataLiteral, data);
- return MakeCell(literal->GetType()->GetSchemeType(), literal->AsValue(), env, false);
+ return MakeCell(literal->GetType()->GetSchemeType(), literal->AsValue(), env, false);
}
- void ExtractRow(TVector<TCell>& row, TTupleLiteral* tupleNode, const TTypeEnvironment& env) {
+ void ExtractRow(TVector<TCell>& row, TTupleLiteral* tupleNode, const TTypeEnvironment& env) {
row.resize(tupleNode->GetValuesCount());
for (ui32 i = 0; i < tupleNode->GetValuesCount(); ++i) {
auto value = tupleNode->GetValue(i);
- row[i] = ExtractCell(value, env);
+ row[i] = ExtractCell(value, env);
}
}
@@ -486,7 +486,7 @@ namespace {
{
TUnboxedValueVector values;
if (localReadCallables.contains(callable.GetUniqueId())) {
- values.push_back(PerformLocalSelectRow(callable, *host, ctx.HolderFactory, ctx.Env));
+ values.push_back(PerformLocalSelectRow(callable, *host, ctx.HolderFactory, ctx.Env));
}
auto returnType = callable.GetType()->GetReturnType();
@@ -576,7 +576,7 @@ namespace {
{
TUnboxedValueVector values;
if (localReadCallables.contains(callable.GetUniqueId())) {
- values.push_back(PerformLocalSelectRange(callable, *host, ctx.HolderFactory, ctx.Env));
+ values.push_back(PerformLocalSelectRange(callable, *host, ctx.HolderFactory, ctx.Env));
}
auto returnType = GetActualReturnType(callable, ctx.Env, strings);
@@ -952,14 +952,14 @@ TComputationNodeFactory GetFlatProxyExecutionFactory(TProxyExecData& execData)
}
NUdf::TUnboxedValue PerformLocalSelectRow(TCallable& callable, IEngineFlatHost& engineHost,
- const THolderFactory& holderFactory, const TTypeEnvironment& env)
+ const THolderFactory& holderFactory, const TTypeEnvironment& env)
{
MKQL_ENSURE(callable.GetInputsCount() == 5, "Expected 5 args");
auto tableNode = callable.GetInput(0);
const auto tableId = ExtractTableId(tableNode);
auto tupleNode = AS_VALUE(TTupleLiteral, callable.GetInput(3));
TVector<TCell> row;
- ExtractRow(row, tupleNode, env);
+ ExtractRow(row, tupleNode, env);
auto returnType = callable.GetType()->GetReturnType();
MKQL_ENSURE(callable.GetInput(1).GetNode()->GetType()->IsType(), "Expected type");
@@ -970,7 +970,7 @@ NUdf::TUnboxedValue PerformLocalSelectRow(TCallable& callable, IEngineFlatHost&
}
NUdf::TUnboxedValue PerformLocalSelectRange(TCallable& callable, IEngineFlatHost& engineHost,
- const THolderFactory& holderFactory, const TTypeEnvironment& env)
+ const THolderFactory& holderFactory, const TTypeEnvironment& env)
{
MKQL_ENSURE(callable.GetInputsCount() >= 9 && callable.GetInputsCount() <= 13, "Expected 9 to 13 args");
auto tableNode = callable.GetInput(0);
@@ -981,8 +981,8 @@ NUdf::TUnboxedValue PerformLocalSelectRange(TCallable& callable, IEngineFlatHost
TVector<TCell> fromValues;
TVector<TCell> toValues;
- ExtractRow(fromValues, AS_VALUE(TTupleLiteral, callable.GetInput(3)), env);
- ExtractRow(toValues, AS_VALUE(TTupleLiteral, callable.GetInput(4)), env);
+ ExtractRow(fromValues, AS_VALUE(TTupleLiteral, callable.GetInput(3)), env);
+ ExtractRow(toValues, AS_VALUE(TTupleLiteral, callable.GetInput(4)), env);
bool inclusiveFrom = !(flags & TReadRangeOptions::TFlags::ExcludeInitValue);
bool inclusiveTo = !(flags & TReadRangeOptions::TFlags::ExcludeTermValue);
diff --git a/ydb/core/engine/mkql_engine_flat_impl.h b/ydb/core/engine/mkql_engine_flat_impl.h
index fdc4b6c8366..bb232a52aae 100644
--- a/ydb/core/engine/mkql_engine_flat_impl.h
+++ b/ydb/core/engine/mkql_engine_flat_impl.h
@@ -120,9 +120,9 @@ namespace NMiniKQL {
TComputationNodeFactory GetFlatProxyExecutionFactory(TProxyExecData& execData);
NUdf::TUnboxedValue PerformLocalSelectRow(TCallable& callable, IEngineFlatHost& engineHost,
- const THolderFactory& holderFactory, const TTypeEnvironment& env);
+ const THolderFactory& holderFactory, const TTypeEnvironment& env);
NUdf::TUnboxedValue PerformLocalSelectRange(TCallable& callable, IEngineFlatHost& engineHost,
- const THolderFactory& holderFactory, const TTypeEnvironment& env);
+ const THolderFactory& holderFactory, const TTypeEnvironment& env);
struct TEngineFlatApplyContext : public NUdf::IApplyContext {
bool IsAborted = false;
diff --git a/ydb/core/engine/mkql_keys.cpp b/ydb/core/engine/mkql_keys.cpp
index d66b1d89967..05afb89adc2 100644
--- a/ydb/core/engine/mkql_keys.cpp
+++ b/ydb/core/engine/mkql_keys.cpp
@@ -244,24 +244,24 @@ THolder<TKeyDesc> ExtractEraseRow(TCallable& callable, const TTypeEnvironment& e
#define MAKE_PRIMITIVE_TYPE_CELL(type, layout) \
case NUdf::TDataType<type>::Id: return MakeCell<layout>(value);
-TCell MakeCell(NUdf::TDataTypeId typeId, const NUdf::TUnboxedValuePod& value, const TTypeEnvironment& env, bool copy) {
+TCell MakeCell(NUdf::TDataTypeId typeId, const NUdf::TUnboxedValuePod& value, const TTypeEnvironment& env, bool copy) {
if (!value)
return TCell();
switch(typeId) {
KNOWN_FIXED_VALUE_TYPES(MAKE_PRIMITIVE_TYPE_CELL)
- case NUdf::TDataType<NUdf::TDecimal>::Id:
- {
- auto intVal = value.GetInt128();
- const auto& val = env.NewString(sizeof(intVal));
- std::memcpy(val.Data(), reinterpret_cast<const char*>(&intVal), sizeof(intVal));
- return TCell(val.Data(), val.Size());
- }
- break;
+ case NUdf::TDataType<NUdf::TDecimal>::Id:
+ {
+ auto intVal = value.GetInt128();
+ const auto& val = env.NewString(sizeof(intVal));
+ std::memcpy(val.Data(), reinterpret_cast<const char*>(&intVal), sizeof(intVal));
+ return TCell(val.Data(), val.Size());
+ }
+ break;
}
const auto& ref = value.AsStringRef();
- if (!copy || value.IsString() || TCell::CanInline(ref.Size()))
+ if (!copy || value.IsString() || TCell::CanInline(ref.Size()))
return TCell(ref.Data(), ref.Size());
const auto& val = env.NewString(ref.Size());
diff --git a/ydb/core/engine/mkql_keys.h b/ydb/core/engine/mkql_keys.h
index 7edb48606b4..635ad3ce147 100644
--- a/ydb/core/engine/mkql_keys.h
+++ b/ydb/core/engine/mkql_keys.h
@@ -44,7 +44,7 @@ struct TTableStrings {
THolder<TKeyDesc> ExtractTableKey(TCallable& callable, const TTableStrings& strings, const TTypeEnvironment& env);
TVector<THolder<TKeyDesc>> ExtractTableKeys(TExploringNodeVisitor& explorer, const TTypeEnvironment& env);
TTableId ExtractTableId(const TRuntimeNode& node);
-TCell MakeCell(NUdf::TDataTypeId typeId, const NUdf::TUnboxedValuePod& value, const TTypeEnvironment& env, bool copy = true);
+TCell MakeCell(NUdf::TDataTypeId typeId, const NUdf::TUnboxedValuePod& value, const TTypeEnvironment& env, bool copy = true);
void FillKeyTupleValue(const NUdf::TUnboxedValue& row, const TVector<ui32>& rowIndices,
const TVector<NUdf::TDataTypeId>& rowTypes, TVector<TCell>& cells, const TTypeEnvironment& env);
diff --git a/ydb/core/grpc_services/base/base.h b/ydb/core/grpc_services/base/base.h
index 0dc063188ac..44b25c4a5f9 100644
--- a/ydb/core/grpc_services/base/base.h
+++ b/ydb/core/grpc_services/base/base.h
@@ -71,18 +71,18 @@ struct TRpcServices {
EvPrepareDataQuery,
EvExecuteDataQuery,
EvExecuteSchemeQuery,
- EvCreateTenant,
- EvAlterTenant,
- EvGetTenantStatus,
- EvListTenants,
- EvRemoveTenant,
+ EvCreateTenant,
+ EvAlterTenant,
+ EvGetTenantStatus,
+ EvListTenants,
+ EvRemoveTenant,
EvBeginTransaction,
EvCommitTransaction,
EvRollbackTransaction,
EvModifyPermissions,
EvListEndpoints,
- EvDescribeTenantOptions,
- EvDescribeTableOptions,
+ EvDescribeTenantOptions,
+ EvDescribeTableOptions,
EvCreateCoordinationNode,
EvAlterCoordinationNode,
EvDropCoordinationNode,
diff --git a/ydb/core/grpc_services/grpc_request_proxy.h b/ydb/core/grpc_services/grpc_request_proxy.h
index a4487689645..97315f6e9fb 100644
--- a/ydb/core/grpc_services/grpc_request_proxy.h
+++ b/ydb/core/grpc_services/grpc_request_proxy.h
@@ -75,8 +75,8 @@ protected:
void Handle(TEvCommitTransactionRequest::TPtr& ev, const TActorContext& ctx);
void Handle(TEvRollbackTransactionRequest::TPtr& ev, const TActorContext& ctx);
void Handle(TEvListEndpointsRequest::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvDescribeTenantOptionsRequest::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvDescribeTableOptionsRequest::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvDescribeTenantOptionsRequest::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvDescribeTableOptionsRequest::TPtr& ev, const TActorContext& ctx);
void Handle(TEvCreateCoordinationNode::TPtr& ev, const TActorContext& ctx);
void Handle(TEvAlterCoordinationNode::TPtr& ev, const TActorContext& ctx);
void Handle(TEvDropCoordinationNode::TPtr& ev, const TActorContext& ctx);
diff --git a/ydb/core/grpc_services/rpc_cms.cpp b/ydb/core/grpc_services/rpc_cms.cpp
index 09bea48d3b1..78450233069 100644
--- a/ydb/core/grpc_services/rpc_cms.cpp
+++ b/ydb/core/grpc_services/rpc_cms.cpp
@@ -1,60 +1,60 @@
-#include "grpc_request_proxy.h"
-
-#include "rpc_calls.h"
-#include "rpc_deferrable.h"
-
+#include "grpc_request_proxy.h"
+
+#include "rpc_calls.h"
+#include "rpc_deferrable.h"
+
#include <ydb/core/base/appdata.h>
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/cms/console/console.h>
-
-namespace NKikimr {
-namespace NGRpcService {
-
-using namespace NActors;
-using namespace NConsole;
+
+namespace NKikimr {
+namespace NGRpcService {
+
+using namespace NActors;
+using namespace NConsole;
using namespace Ydb;
-
-template <typename TRequest, typename TCmsRequest, typename TCmsResponse>
+
+template <typename TRequest, typename TCmsRequest, typename TCmsResponse>
class TCmsRPC : public TRpcOperationRequestActor<TCmsRPC<TRequest, TCmsRequest, TCmsResponse>, TRequest> {
- using TThis = TCmsRPC<TRequest, TCmsRequest, TCmsResponse>;
+ using TThis = TCmsRPC<TRequest, TCmsRequest, TCmsResponse>;
using TBase = TRpcOperationRequestActor<TThis, TRequest>;
-
+
TActorId CmsPipe;
-
-public:
- TCmsRPC(TRequest* msg)
+
+public:
+ TCmsRPC(TRequest* msg)
: TBase(msg)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
TBase::Bootstrap(ctx);
- auto dinfo = AppData(ctx)->DomainsInfo;
- auto domain = dinfo->Domains.begin()->second;
- ui32 group = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
-
- NTabletPipe::TClientConfig pipeConfig;
+ auto dinfo = AppData(ctx)->DomainsInfo;
+ auto domain = dinfo->Domains.begin()->second;
+ ui32 group = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
+
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = {.RetryLimitCount = 10};
- auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeConsoleID(group), pipeConfig);
+ auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeConsoleID(group), pipeConfig);
CmsPipe = ctx.RegisterWithSameMailbox(pipe);
-
- SendRequest(ctx);
-
- this->Become(&TThis::StateWork);
- }
-
-private:
- void Die(const TActorContext &ctx)
- {
- NTabletPipe::CloseClient(ctx, CmsPipe);
- TBase::Die(ctx);
- }
-
+
+ SendRequest(ctx);
+
+ this->Become(&TThis::StateWork);
+ }
+
+private:
+ void Die(const TActorContext &ctx)
+ {
+ NTabletPipe::CloseClient(ctx, CmsPipe);
+ TBase::Die(ctx);
+ }
+
template<typename T>
void HandleWithOperationParams(T& ev, const TActorContext& ctx)
- {
+ {
const auto& response = ev->Get()->Record.GetResponse();
if (response.operation().ready() == false
&& this->GetProtoRequest()->operation_params().operation_mode() == Ydb::Operations::OperationParams::SYNC) {
@@ -82,9 +82,9 @@ private:
{
auto& response = ev->Get()->Record.GetResponse();
TProtoResponseHelper::SendProtoResponse(response, response.operation().status(), this->Request_);
- Die(ctx);
- }
-
+ Die(ctx);
+ }
+
void Handle(TEvConsole::TEvOperationCompletionNotification::TPtr& ev, const TActorContext& ctx)
{
this->Request_->SendOperation(ev->Get()->Record.GetResponse().operation());
@@ -99,79 +99,79 @@ private:
}
}
- void Undelivered(const TActorContext &ctx) {
+ void Undelivered(const TActorContext &ctx) {
this->Request_->RaiseIssue(NYql::TIssue("CMS is unavailable"));
this->Request_->ReplyWithYdbStatus(Ydb::StatusIds::UNAVAILABLE);
- Die(ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) noexcept
- {
- if (ev->Get()->Status != NKikimrProto::OK)
- Undelivered(ctx);
- }
-
+ Die(ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ if (ev->Get()->Status != NKikimrProto::OK)
+ Undelivered(ctx);
+ }
+
void StateWork(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TCmsResponse, Handle);
- CFunc(TEvTabletPipe::EvClientDestroyed, Undelivered);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TCmsResponse, Handle);
+ CFunc(TEvTabletPipe::EvClientDestroyed, Undelivered);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
HFunc(TEvConsole::TEvOperationCompletionNotification, Handle);
HFunc(TEvConsole::TEvNotifyOperationCompletionResponse, Handle);
default: TBase::StateFuncBase(ev, ctx);
- }
- }
-
- void SendRequest(const TActorContext &ctx)
- {
- auto request = MakeHolder<TCmsRequest>();
+ }
+ }
+
+ void SendRequest(const TActorContext &ctx)
+ {
+ auto request = MakeHolder<TCmsRequest>();
request->Record.MutableRequest()->CopyFrom(*this->GetProtoRequest());
- request->Record.SetUserToken(this->Request_->GetInternalToken());
- NTabletPipe::SendData(ctx, CmsPipe, request.Release());
- }
-};
-
-void TGRpcRequestProxy::Handle(TEvCreateTenantRequest::TPtr& ev, const TActorContext& ctx)
-{
- ctx.Register(new TCmsRPC<TEvCreateTenantRequest,
- TEvConsole::TEvCreateTenantRequest,
- TEvConsole::TEvCreateTenantResponse>(ev->Release().Release()));
-}
-
-void TGRpcRequestProxy::Handle(TEvAlterTenantRequest::TPtr& ev, const TActorContext& ctx)
-{
- ctx.Register(new TCmsRPC<TEvAlterTenantRequest,
- TEvConsole::TEvAlterTenantRequest,
- TEvConsole::TEvAlterTenantResponse>(ev->Release().Release()));
-}
-
-void TGRpcRequestProxy::Handle(TEvGetTenantStatusRequest::TPtr& ev, const TActorContext& ctx)
-{
- ctx.Register(new TCmsRPC<TEvGetTenantStatusRequest,
- TEvConsole::TEvGetTenantStatusRequest,
- TEvConsole::TEvGetTenantStatusResponse>(ev->Release().Release()));
-}
-
-void TGRpcRequestProxy::Handle(TEvListTenantsRequest::TPtr& ev, const TActorContext& ctx)
-{
- ctx.Register(new TCmsRPC<TEvListTenantsRequest,
- TEvConsole::TEvListTenantsRequest,
- TEvConsole::TEvListTenantsResponse>(ev->Release().Release()));
-}
-
-void TGRpcRequestProxy::Handle(TEvRemoveTenantRequest::TPtr& ev, const TActorContext& ctx)
-{
- ctx.Register(new TCmsRPC<TEvRemoveTenantRequest,
- TEvConsole::TEvRemoveTenantRequest,
- TEvConsole::TEvRemoveTenantResponse>(ev->Release().Release()));
-}
-
-void TGRpcRequestProxy::Handle(TEvDescribeTenantOptionsRequest::TPtr& ev, const TActorContext& ctx)
-{
- ctx.Register(new TCmsRPC<TEvDescribeTenantOptionsRequest,
- TEvConsole::TEvDescribeTenantOptionsRequest,
- TEvConsole::TEvDescribeTenantOptionsResponse>(ev->Release().Release()));
-}
-
-} // namespace NGRpcService
-} // namespace NKikimr
+ request->Record.SetUserToken(this->Request_->GetInternalToken());
+ NTabletPipe::SendData(ctx, CmsPipe, request.Release());
+ }
+};
+
+void TGRpcRequestProxy::Handle(TEvCreateTenantRequest::TPtr& ev, const TActorContext& ctx)
+{
+ ctx.Register(new TCmsRPC<TEvCreateTenantRequest,
+ TEvConsole::TEvCreateTenantRequest,
+ TEvConsole::TEvCreateTenantResponse>(ev->Release().Release()));
+}
+
+void TGRpcRequestProxy::Handle(TEvAlterTenantRequest::TPtr& ev, const TActorContext& ctx)
+{
+ ctx.Register(new TCmsRPC<TEvAlterTenantRequest,
+ TEvConsole::TEvAlterTenantRequest,
+ TEvConsole::TEvAlterTenantResponse>(ev->Release().Release()));
+}
+
+void TGRpcRequestProxy::Handle(TEvGetTenantStatusRequest::TPtr& ev, const TActorContext& ctx)
+{
+ ctx.Register(new TCmsRPC<TEvGetTenantStatusRequest,
+ TEvConsole::TEvGetTenantStatusRequest,
+ TEvConsole::TEvGetTenantStatusResponse>(ev->Release().Release()));
+}
+
+void TGRpcRequestProxy::Handle(TEvListTenantsRequest::TPtr& ev, const TActorContext& ctx)
+{
+ ctx.Register(new TCmsRPC<TEvListTenantsRequest,
+ TEvConsole::TEvListTenantsRequest,
+ TEvConsole::TEvListTenantsResponse>(ev->Release().Release()));
+}
+
+void TGRpcRequestProxy::Handle(TEvRemoveTenantRequest::TPtr& ev, const TActorContext& ctx)
+{
+ ctx.Register(new TCmsRPC<TEvRemoveTenantRequest,
+ TEvConsole::TEvRemoveTenantRequest,
+ TEvConsole::TEvRemoveTenantResponse>(ev->Release().Release()));
+}
+
+void TGRpcRequestProxy::Handle(TEvDescribeTenantOptionsRequest::TPtr& ev, const TActorContext& ctx)
+{
+ ctx.Register(new TCmsRPC<TEvDescribeTenantOptionsRequest,
+ TEvConsole::TEvDescribeTenantOptionsRequest,
+ TEvConsole::TEvDescribeTenantOptionsResponse>(ev->Release().Release()));
+}
+
+} // namespace NGRpcService
+} // namespace NKikimr
diff --git a/ydb/core/grpc_services/rpc_create_table.cpp b/ydb/core/grpc_services/rpc_create_table.cpp
index 551b0f97ded..302dfde57a8 100644
--- a/ydb/core/grpc_services/rpc_create_table.cpp
+++ b/ydb/core/grpc_services/rpc_create_table.cpp
@@ -3,7 +3,7 @@
#include "rpc_calls.h"
#include "rpc_scheme_base.h"
#include "rpc_common.h"
-#include "table_profiles.h"
+#include "table_profiles.h"
#include "table_settings.h"
#include <ydb/core/cms/console/configs_dispatcher.h>
@@ -17,7 +17,7 @@ namespace NGRpcService {
using namespace NSchemeShard;
using namespace NActors;
-using namespace NConsole;
+using namespace NConsole;
using namespace Ydb;
using namespace Ydb::Table;
@@ -31,44 +31,44 @@ public:
void Bootstrap(const TActorContext &ctx) {
TBase::Bootstrap(ctx);
- SendConfigRequest(ctx);
+ SendConfigRequest(ctx);
ctx.Schedule(TDuration::Seconds(15), new TEvents::TEvWakeup(WakeupTagGetConfig));
- Become(&TCreateTableRPC::StateGetConfig);
- }
-
-private:
- void StateGetConfig(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConfigsDispatcher::TEvGetConfigResponse, Handle);
- HFunc(TEvents::TEvUndelivered, Handle);
+ Become(&TCreateTableRPC::StateGetConfig);
+ }
+
+private:
+ void StateGetConfig(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConfigsDispatcher::TEvGetConfigResponse, Handle);
+ HFunc(TEvents::TEvUndelivered, Handle);
HFunc(TEvents::TEvWakeup, HandleWakeup);
default: TBase::StateFuncBase(ev, ctx);
- }
- }
-
+ }
+ }
+
void StateWork(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) {
switch (ev->GetTypeRewrite()) {
default: TBase::StateWork(ev, ctx);
}
}
- void Handle(TEvents::TEvUndelivered::TPtr &/*ev*/, const TActorContext &ctx)
- {
+ void Handle(TEvents::TEvUndelivered::TPtr &/*ev*/, const TActorContext &ctx)
+ {
LOG_CRIT_S(ctx, NKikimrServices::GRPC_PROXY,
- "TCreateTableRPC: cannot deliver config request to Configs Dispatcher"
- " (empty default profile is available only)");
+ "TCreateTableRPC: cannot deliver config request to Configs Dispatcher"
+ " (empty default profile is available only)");
+ SendProposeRequest(ctx);
+ Become(&TCreateTableRPC::StateWork);
+ }
+
+ void Handle(TEvConfigsDispatcher::TEvGetConfigResponse::TPtr &ev, const TActorContext &ctx) {
+ auto &config = ev->Get()->Config->GetTableProfilesConfig();
+ Profiles.Load(config);
+
SendProposeRequest(ctx);
Become(&TCreateTableRPC::StateWork);
}
- void Handle(TEvConfigsDispatcher::TEvGetConfigResponse::TPtr &ev, const TActorContext &ctx) {
- auto &config = ev->Get()->Config->GetTableProfilesConfig();
- Profiles.Load(config);
-
- SendProposeRequest(ctx);
- Become(&TCreateTableRPC::StateWork);
- }
-
void HandleWakeup(TEvents::TEvWakeup::TPtr &ev, const TActorContext &ctx) {
switch (ev->Get()->Tag) {
case WakeupTagGetConfig: {
@@ -80,15 +80,15 @@ private:
default:
TBase::HandleWakeup(ev, ctx);
}
- }
-
- void SendConfigRequest(const TActorContext &ctx) {
- ui32 configKind = (ui32)NKikimrConsole::TConfigItem::TableProfilesConfigItem;
- ctx.Send(MakeConfigsDispatcherID(ctx.SelfID.NodeId()),
- new TEvConfigsDispatcher::TEvGetConfigRequest(configKind),
- IEventHandle::FlagTrackDelivery);
- }
-
+ }
+
+ void SendConfigRequest(const TActorContext &ctx) {
+ ui32 configKind = (ui32)NKikimrConsole::TConfigItem::TableProfilesConfigItem;
+ ctx.Send(MakeConfigsDispatcherID(ctx.SelfID.NodeId()),
+ new TEvConfigsDispatcher::TEvGetConfigRequest(configKind),
+ IEventHandle::FlagTrackDelivery);
+ }
+
// Mutually exclusive settings
void MEWarning(const TString& settingName) {
Request_->RaiseIssue(
@@ -221,9 +221,9 @@ private:
ctx.Send(MakeTxProxyID(), proposeRequest.release());
}
-
-private:
- TTableProfiles Profiles;
+
+private:
+ TTableProfiles Profiles;
};
void TGRpcRequestProxy::Handle(TEvCreateTableRequest::TPtr& ev, const TActorContext& ctx) {
diff --git a/ydb/core/grpc_services/rpc_describe_table_options.cpp b/ydb/core/grpc_services/rpc_describe_table_options.cpp
index faa185443e4..6d77e3cff71 100644
--- a/ydb/core/grpc_services/rpc_describe_table_options.cpp
+++ b/ydb/core/grpc_services/rpc_describe_table_options.cpp
@@ -1,210 +1,210 @@
-#include "grpc_request_proxy.h"
-
-#include "rpc_calls.h"
+#include "grpc_request_proxy.h"
+
+#include "rpc_calls.h"
#include "rpc_scheme_base.h"
-#include "rpc_common.h"
-#include "table_profiles.h"
-
+#include "rpc_common.h"
+#include "table_profiles.h"
+
#include <ydb/core/cms/console/configs_dispatcher.h>
#include <ydb/core/protos/console_config.pb.h>
-
-namespace NKikimr {
-namespace NGRpcService {
-
+
+namespace NKikimr {
+namespace NGRpcService {
+
using namespace NSchemeShard;
-using namespace NActors;
-using namespace NConsole;
-using namespace Ydb;
-using namespace Ydb::Table;
-
+using namespace NActors;
+using namespace NConsole;
+using namespace Ydb;
+using namespace Ydb::Table;
+
class TDescribeTableOptionsRPC : public TRpcSchemeRequestActor<TDescribeTableOptionsRPC, TEvDescribeTableOptionsRequest> {
using TBase = TRpcSchemeRequestActor<TDescribeTableOptionsRPC, TEvDescribeTableOptionsRequest>;
-public:
- TDescribeTableOptionsRPC(TEvDescribeTableOptionsRequest* msg)
+public:
+ TDescribeTableOptionsRPC(TEvDescribeTableOptionsRequest* msg)
: TBase(msg) {}
-
- void Bootstrap(const TActorContext &ctx) {
+
+ void Bootstrap(const TActorContext &ctx) {
TBase::Bootstrap(ctx);
- SendConfigRequest(ctx);
+ SendConfigRequest(ctx);
ctx.Schedule(TDuration::Seconds(15), new TEvents::TEvWakeup(WakeupTagGetConfig));
- Become(&TDescribeTableOptionsRPC::StateGetConfig);
- }
-
-private:
- void StateGetConfig(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConfigsDispatcher::TEvGetConfigResponse, Handle);
- HFunc(TEvents::TEvUndelivered, Handle);
+ Become(&TDescribeTableOptionsRPC::StateGetConfig);
+ }
+
+private:
+ void StateGetConfig(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConfigsDispatcher::TEvGetConfigResponse, Handle);
+ HFunc(TEvents::TEvUndelivered, Handle);
HFunc(TEvents::TEvWakeup, HandleWakeup);
default: TBase::StateFuncBase(ev, ctx);
- }
- }
-
+ }
+ }
+
void StateWork(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) {
switch (ev->GetTypeRewrite()) {
default: TBase::StateWork(ev, ctx);
}
}
- void Handle(TEvents::TEvUndelivered::TPtr &/*ev*/, const TActorContext &ctx)
- {
+ void Handle(TEvents::TEvUndelivered::TPtr &/*ev*/, const TActorContext &ctx)
+ {
LOG_CRIT_S(ctx, NKikimrServices::GRPC_PROXY,
- "TDescribeTableOptionsRPC: cannot deliver config request to Configs Dispatcher");
- NYql::TIssues issues;
- issues.AddIssue(NYql::TIssue("Cannot get table profiles (service unavailable)"));
- Reply(Ydb::StatusIds::UNAVAILABLE, issues, ctx);
- }
-
- void Handle(TEvConfigsDispatcher::TEvGetConfigResponse::TPtr &ev, const TActorContext &ctx) {
- auto &config = ev->Get()->Config->GetTableProfilesConfig();
- Profiles.Load(config);
-
- Ydb::Table::DescribeTableOptionsResult result;
-
- for (auto &pr: Profiles.CompactionPolicies) {
- auto &description = *result.add_compaction_policy_presets();
- description.set_name(pr.first);
- auto &labels = *description.mutable_labels();
- if (pr.second.HasCompactionPolicy())
- labels["generations"] = ToString(pr.second.GetCompactionPolicy().GenerationSize());
- }
-
- for (auto &pr: Profiles.ExecutionPolicies) {
- auto &description = *result.add_execution_policy_presets();
- description.set_name(pr.first);
- auto &labels = *description.mutable_labels();
- labels["out_of_order"] = pr.second.GetPipelineConfig().GetEnableOutOfOrder() ? "enabled" : "disabled";
- if (pr.second.GetPipelineConfig().GetEnableOutOfOrder())
- labels["pipeline_width"] = ToString(pr.second.GetPipelineConfig().GetNumActiveTx());
- labels["immediate_tx"] = pr.second.GetPipelineConfig().GetDisableImmediate() ? "disabled" : "enabled";
- labels["bloom_filter"] = pr.second.GetEnableFilterByKey() ? "enabled" : "disabled";
- if (pr.second.HasTxReadSizeLimit())
- labels["tx_read_limit"] = ToString(pr.second.GetTxReadSizeLimit());
- }
-
- for (auto &pr: Profiles.PartitioningPolicies) {
- auto &description = *result.add_partitioning_policy_presets();
- description.set_name(pr.first);
- auto &labels = *description.mutable_labels();
- if (pr.second.GetUniformPartitionsCount())
- labels["uniform_parts"] = ToString(pr.second.GetUniformPartitionsCount());
- labels["auto_split"] = pr.second.GetAutoSplit() ? "enabled" : "disabled";
- labels["auto_merge"] = pr.second.GetAutoMerge() ? "enabled" : "disabled";
- if (pr.second.GetAutoSplit() && pr.second.HasSizeToSplit())
- labels["split_threshold"] = ToString(pr.second.GetSizeToSplit());
- }
-
- for (auto &pr: Profiles.StoragePolicies) {
- auto &description = *result.add_storage_policy_presets();
- description.set_name(pr.first);
- auto &labels = *description.mutable_labels();
- for (size_t i = 0; i < pr.second.ColumnFamiliesSize(); ++i) {
- auto &family = pr.second.GetColumnFamilies(i);
- if (family.GetId() == 0) {
+ "TDescribeTableOptionsRPC: cannot deliver config request to Configs Dispatcher");
+ NYql::TIssues issues;
+ issues.AddIssue(NYql::TIssue("Cannot get table profiles (service unavailable)"));
+ Reply(Ydb::StatusIds::UNAVAILABLE, issues, ctx);
+ }
+
+ void Handle(TEvConfigsDispatcher::TEvGetConfigResponse::TPtr &ev, const TActorContext &ctx) {
+ auto &config = ev->Get()->Config->GetTableProfilesConfig();
+ Profiles.Load(config);
+
+ Ydb::Table::DescribeTableOptionsResult result;
+
+ for (auto &pr: Profiles.CompactionPolicies) {
+ auto &description = *result.add_compaction_policy_presets();
+ description.set_name(pr.first);
+ auto &labels = *description.mutable_labels();
+ if (pr.second.HasCompactionPolicy())
+ labels["generations"] = ToString(pr.second.GetCompactionPolicy().GenerationSize());
+ }
+
+ for (auto &pr: Profiles.ExecutionPolicies) {
+ auto &description = *result.add_execution_policy_presets();
+ description.set_name(pr.first);
+ auto &labels = *description.mutable_labels();
+ labels["out_of_order"] = pr.second.GetPipelineConfig().GetEnableOutOfOrder() ? "enabled" : "disabled";
+ if (pr.second.GetPipelineConfig().GetEnableOutOfOrder())
+ labels["pipeline_width"] = ToString(pr.second.GetPipelineConfig().GetNumActiveTx());
+ labels["immediate_tx"] = pr.second.GetPipelineConfig().GetDisableImmediate() ? "disabled" : "enabled";
+ labels["bloom_filter"] = pr.second.GetEnableFilterByKey() ? "enabled" : "disabled";
+ if (pr.second.HasTxReadSizeLimit())
+ labels["tx_read_limit"] = ToString(pr.second.GetTxReadSizeLimit());
+ }
+
+ for (auto &pr: Profiles.PartitioningPolicies) {
+ auto &description = *result.add_partitioning_policy_presets();
+ description.set_name(pr.first);
+ auto &labels = *description.mutable_labels();
+ if (pr.second.GetUniformPartitionsCount())
+ labels["uniform_parts"] = ToString(pr.second.GetUniformPartitionsCount());
+ labels["auto_split"] = pr.second.GetAutoSplit() ? "enabled" : "disabled";
+ labels["auto_merge"] = pr.second.GetAutoMerge() ? "enabled" : "disabled";
+ if (pr.second.GetAutoSplit() && pr.second.HasSizeToSplit())
+ labels["split_threshold"] = ToString(pr.second.GetSizeToSplit());
+ }
+
+ for (auto &pr: Profiles.StoragePolicies) {
+ auto &description = *result.add_storage_policy_presets();
+ description.set_name(pr.first);
+ auto &labels = *description.mutable_labels();
+ for (size_t i = 0; i < pr.second.ColumnFamiliesSize(); ++i) {
+ auto &family = pr.second.GetColumnFamilies(i);
+ if (family.GetId() == 0) {
if (family.GetColumnCache() == NKikimrSchemeOp::ColumnCacheEver)
- labels["in_memory"] = "true";
- else
- labels["in_memory"] = "false";
- if (family.GetStorageConfig().HasSysLog())
- labels["syslog"] = family.GetStorageConfig().GetSysLog().GetPreferredPoolKind();
- if (family.GetStorageConfig().HasLog())
- labels["log"] = family.GetStorageConfig().GetLog().GetPreferredPoolKind();
- if (family.GetStorageConfig().HasData())
- labels["data"] = family.GetStorageConfig().GetData().GetPreferredPoolKind();
- if (family.GetStorageConfig().HasExternal())
- labels["external"] = family.GetStorageConfig().GetExternal().GetPreferredPoolKind();
- if (family.GetStorageConfig().GetDataThreshold())
- labels["medium_threshold"] = ToString(family.GetStorageConfig().GetDataThreshold());
- if (family.GetStorageConfig().GetExternalThreshold())
- labels["external_threshold"] = ToString(family.GetStorageConfig().GetExternalThreshold());
+ labels["in_memory"] = "true";
+ else
+ labels["in_memory"] = "false";
+ if (family.GetStorageConfig().HasSysLog())
+ labels["syslog"] = family.GetStorageConfig().GetSysLog().GetPreferredPoolKind();
+ if (family.GetStorageConfig().HasLog())
+ labels["log"] = family.GetStorageConfig().GetLog().GetPreferredPoolKind();
+ if (family.GetStorageConfig().HasData())
+ labels["data"] = family.GetStorageConfig().GetData().GetPreferredPoolKind();
+ if (family.GetStorageConfig().HasExternal())
+ labels["external"] = family.GetStorageConfig().GetExternal().GetPreferredPoolKind();
+ if (family.GetStorageConfig().GetDataThreshold())
+ labels["medium_threshold"] = ToString(family.GetStorageConfig().GetDataThreshold());
+ if (family.GetStorageConfig().GetExternalThreshold())
+ labels["external_threshold"] = ToString(family.GetStorageConfig().GetExternalThreshold());
if (family.GetColumnCodec() == NKikimrSchemeOp::ColumnCodecLZ4)
- labels["codec"] = "lz4";
- else
- labels["codec"] = "none";
- break;
- }
- }
- }
-
- for (auto &pr: Profiles.ReplicationPolicies) {
- auto &description = *result.add_replication_policy_presets();
- description.set_name(pr.first);
- auto &labels = *description.mutable_labels();
+ labels["codec"] = "lz4";
+ else
+ labels["codec"] = "none";
+ break;
+ }
+ }
+ }
+
+ for (auto &pr: Profiles.ReplicationPolicies) {
+ auto &description = *result.add_replication_policy_presets();
+ description.set_name(pr.first);
+ auto &labels = *description.mutable_labels();
if (pr.second.GetFollowerCount()) {
labels["followers"] = ToString(pr.second.GetFollowerCount());
labels["promotion"] = pr.second.GetAllowFollowerPromotion() ? "enabled" : "disabled";
- labels["per_zone"] = pr.second.GetCrossDataCenter() ? "true" : "false";
- } else {
+ labels["per_zone"] = pr.second.GetCrossDataCenter() ? "true" : "false";
+ } else {
labels["followers"] = "disabled";
- }
- }
-
- for (auto &pr: Profiles.CachingPolicies) {
- auto &description = *result.add_caching_policy_presets();
- description.set_name(pr.first);
- auto &labels = *description.mutable_labels();
- if (pr.second.GetExecutorCacheSize())
- labels["executor_cache"] = ToString(pr.second.GetExecutorCacheSize());
- }
-
- for (auto &pr: Profiles.TableProfiles) {
- auto &description = *result.add_table_profile_presets();
- description.set_name(pr.first);
- description.set_default_storage_policy(pr.second.GetStoragePolicy());
- for (auto &pr : Profiles.StoragePolicies)
- description.add_allowed_storage_policies(pr.first);
- description.set_default_compaction_policy(pr.second.GetCompactionPolicy());
- for (auto &pr : Profiles.CompactionPolicies)
- description.add_allowed_compaction_policies(pr.first);
- description.set_default_partitioning_policy(pr.second.GetPartitioningPolicy());
- for (auto &pr : Profiles.PartitioningPolicies)
- description.add_allowed_partitioning_policies(pr.first);
- description.set_default_execution_policy(pr.second.GetExecutionPolicy());
- for (auto &pr : Profiles.ExecutionPolicies)
- description.add_allowed_execution_policies(pr.first);
- description.set_default_replication_policy(pr.second.GetReplicationPolicy());
- for (auto &pr : Profiles.ReplicationPolicies)
- description.add_allowed_replication_policies(pr.first);
- description.set_default_caching_policy(pr.second.GetCachingPolicy());
- for (auto &pr : Profiles.CachingPolicies)
- description.add_allowed_caching_policies(pr.first);
- }
-
+ }
+ }
+
+ for (auto &pr: Profiles.CachingPolicies) {
+ auto &description = *result.add_caching_policy_presets();
+ description.set_name(pr.first);
+ auto &labels = *description.mutable_labels();
+ if (pr.second.GetExecutorCacheSize())
+ labels["executor_cache"] = ToString(pr.second.GetExecutorCacheSize());
+ }
+
+ for (auto &pr: Profiles.TableProfiles) {
+ auto &description = *result.add_table_profile_presets();
+ description.set_name(pr.first);
+ description.set_default_storage_policy(pr.second.GetStoragePolicy());
+ for (auto &pr : Profiles.StoragePolicies)
+ description.add_allowed_storage_policies(pr.first);
+ description.set_default_compaction_policy(pr.second.GetCompactionPolicy());
+ for (auto &pr : Profiles.CompactionPolicies)
+ description.add_allowed_compaction_policies(pr.first);
+ description.set_default_partitioning_policy(pr.second.GetPartitioningPolicy());
+ for (auto &pr : Profiles.PartitioningPolicies)
+ description.add_allowed_partitioning_policies(pr.first);
+ description.set_default_execution_policy(pr.second.GetExecutionPolicy());
+ for (auto &pr : Profiles.ExecutionPolicies)
+ description.add_allowed_execution_policies(pr.first);
+ description.set_default_replication_policy(pr.second.GetReplicationPolicy());
+ for (auto &pr : Profiles.ReplicationPolicies)
+ description.add_allowed_replication_policies(pr.first);
+ description.set_default_caching_policy(pr.second.GetCachingPolicy());
+ for (auto &pr : Profiles.CachingPolicies)
+ description.add_allowed_caching_policies(pr.first);
+ }
+
this->Request_->SendResult(result, Ydb::StatusIds::SUCCESS);
- Die(ctx);
- }
-
+ Die(ctx);
+ }
+
void HandleWakeup(TEvents::TEvWakeup::TPtr &ev, const TActorContext &ctx) {
switch (ev->Get()->Tag) {
case WakeupTagGetConfig: {
LOG_CRIT_S(ctx, NKikimrServices::GRPC_PROXY,
- "TDescribeTableOptionsRPC: cannot get table profiles (timeout)");
+ "TDescribeTableOptionsRPC: cannot get table profiles (timeout)");
NYql::TIssues issues;
issues.AddIssue(NYql::TIssue("Tables profiles config not available."));
return Reply(Ydb::StatusIds::UNAVAILABLE, issues, ctx);
}
-
+
default:
TBase::HandleWakeup(ev, ctx);
}
}
- void SendConfigRequest(const TActorContext &ctx) {
- ui32 configKind = (ui32)NKikimrConsole::TConfigItem::TableProfilesConfigItem;
- ctx.Send(MakeConfigsDispatcherID(ctx.SelfID.NodeId()),
- new TEvConfigsDispatcher::TEvGetConfigRequest(configKind),
- IEventHandle::FlagTrackDelivery);
- }
-
-private:
- TTableProfiles Profiles;
-};
-
-void TGRpcRequestProxy::Handle(TEvDescribeTableOptionsRequest::TPtr& ev, const TActorContext& ctx) {
- ctx.Register(new TDescribeTableOptionsRPC(ev->Release().Release()));
-}
-
-} // namespace NGRpcService
-} // namespace NKikimr
+ void SendConfigRequest(const TActorContext &ctx) {
+ ui32 configKind = (ui32)NKikimrConsole::TConfigItem::TableProfilesConfigItem;
+ ctx.Send(MakeConfigsDispatcherID(ctx.SelfID.NodeId()),
+ new TEvConfigsDispatcher::TEvGetConfigRequest(configKind),
+ IEventHandle::FlagTrackDelivery);
+ }
+
+private:
+ TTableProfiles Profiles;
+};
+
+void TGRpcRequestProxy::Handle(TEvDescribeTableOptionsRequest::TPtr& ev, const TActorContext& ctx) {
+ ctx.Register(new TDescribeTableOptionsRPC(ev->Release().Release()));
+}
+
+} // namespace NGRpcService
+} // namespace NKikimr
diff --git a/ydb/core/grpc_services/rpc_get_operation.cpp b/ydb/core/grpc_services/rpc_get_operation.cpp
index 2cb5e9b5059..6f7a1406863 100644
--- a/ydb/core/grpc_services/rpc_get_operation.cpp
+++ b/ydb/core/grpc_services/rpc_get_operation.cpp
@@ -70,13 +70,13 @@ public:
void Bootstrap(const TActorContext &ctx) {
const auto req = Request->GetProtoRequest();
-
- try {
+
+ try {
OperationId_ = TOperationId(req->id());
switch (OperationId_.GetKind()) {
case TOperationId::CMS_REQUEST:
- SendCheckCmsOperation(ctx);
+ SendCheckCmsOperation(ctx);
break;
case TOperationId::EXPORT:
case TOperationId::IMPORT:
@@ -87,13 +87,13 @@ public:
ResolveDatabase();
break;
default:
- SendNotifyTxCompletion(ctx);
+ SendNotifyTxCompletion(ctx);
break;
}
- } catch (const yexception& ex) {
+ } catch (const yexception& ex) {
return ReplyWithStatus(StatusIds::BAD_REQUEST);
- }
-
+ }
+
Become(&TGetOperationRPC::AwaitState);
}
STFUNC(AwaitState) {
@@ -101,7 +101,7 @@ public:
HFunc(TEvTxUserProxy::TEvProposeTransactionStatus, HandleResponse);
HFunc(NSchemeShard::TEvSchemeShard::TEvNotifyTxCompletionResult, Handle);
HFunc(NSchemeShard::TEvSchemeShard::TEvNotifyTxCompletionRegistered, Handle);
- HFunc(NConsole::TEvConsole::TEvGetOperationResponse, Handle);
+ HFunc(NConsole::TEvConsole::TEvGetOperationResponse, Handle);
HFunc(NSchemeShard::TEvExport::TEvGetExportResponse, Handle);
HFunc(NSchemeShard::TEvImport::TEvGetImportResponse, Handle);
HFunc(NSchemeShard::TEvIndexBuilder::TEvGetResponse, Handle);
@@ -119,45 +119,45 @@ private:
ReplyGetOperationResponse(true, ctx);
}
- void Handle(NConsole::TEvConsole::TEvGetOperationResponse::TPtr &ev, const TActorContext& ctx) {
- auto &rec = ev->Get()->Record.GetResponse();
+ void Handle(NConsole::TEvConsole::TEvGetOperationResponse::TPtr &ev, const TActorContext& ctx) {
+ auto &rec = ev->Get()->Record.GetResponse();
if (rec.operation().ready())
- ReplyWithError(rec.operation().status(), rec.operation().issues(), ctx);
- else
- ReplyGetOperationResponse(false, ctx);
- }
-
+ ReplyWithError(rec.operation().status(), rec.operation().issues(), ctx);
+ else
+ ReplyGetOperationResponse(false, ctx);
+ }
+
void HandleResponse(typename TEvTxUserProxy::TEvProposeTransactionStatus::TPtr& ev, const TActorContext& ctx) {
Y_UNUSED(ev);
Y_UNUSED(ctx);
}
- void SendCheckCmsOperation(const TActorContext& ctx) {
- ui64 tid;
-
- try {
+ void SendCheckCmsOperation(const TActorContext& ctx) {
+ ui64 tid;
+
+ try {
const auto& cmsIds = OperationId_.GetValue("cmstid");
- if (cmsIds.size() != 1) {
+ if (cmsIds.size() != 1) {
return ReplyWithStatus(StatusIds::BAD_REQUEST);
- }
- if (!TryFromString(*cmsIds[0], tid)) {
+ }
+ if (!TryFromString(*cmsIds[0], tid)) {
return ReplyWithStatus(StatusIds::BAD_REQUEST);
- }
- } catch (const yexception& ex) {
+ }
+ } catch (const yexception& ex) {
Request->RaiseIssue(NYql::ExceptionToIssue(ex));
return ReplyWithStatus(StatusIds::BAD_REQUEST);
- }
-
- IActor* pipeActor = NTabletPipe::CreateClient(ctx.SelfID, tid);
- Y_VERIFY(pipeActor);
- PipeActorId_ = ctx.ExecutorThread.RegisterActor(pipeActor);
-
- auto request = MakeHolder<NConsole::TEvConsole::TEvGetOperationRequest>();
+ }
+
+ IActor* pipeActor = NTabletPipe::CreateClient(ctx.SelfID, tid);
+ Y_VERIFY(pipeActor);
+ PipeActorId_ = ctx.ExecutorThread.RegisterActor(pipeActor);
+
+ auto request = MakeHolder<NConsole::TEvConsole::TEvGetOperationRequest>();
request->Record.MutableRequest()->set_id(Request->GetProtoRequest()->id());
request->Record.SetUserToken(Request->GetInternalToken());
- NTabletPipe::SendData(ctx, PipeActorId_, request.Release());
- }
-
+ NTabletPipe::SendData(ctx, PipeActorId_, request.Release());
+ }
+
void SendNotifyTxCompletion(const TActorContext& ctx) {
ui64 txId;
ui64 schemeShardTabletId;
@@ -177,11 +177,11 @@ private:
IActor* pipeActor = NTabletPipe::CreateClient(ctx.SelfID, schemeShardTabletId);
Y_VERIFY(pipeActor);
- PipeActorId_ = ctx.ExecutorThread.RegisterActor(pipeActor);
+ PipeActorId_ = ctx.ExecutorThread.RegisterActor(pipeActor);
auto request = MakeHolder<NSchemeShard::TEvSchemeShard::TEvNotifyTxCompletion>();
request->Record.SetTxId(txId);
- NTabletPipe::SendData(ctx, PipeActorId_, request.Release());
+ NTabletPipe::SendData(ctx, PipeActorId_, request.Release());
}
void Handle(NSchemeShard::TEvExport::TEvGetExportResponse::TPtr& ev, const TActorContext& ctx) {
@@ -223,15 +223,15 @@ private:
}
void ReplyWithError(const StatusIds::StatusCode status,
- const google::protobuf::RepeatedPtrField<Ydb::Issue::IssueMessage> &issues,
- const TActorContext &ctx) {
+ const google::protobuf::RepeatedPtrField<Ydb::Issue::IssueMessage> &issues,
+ const TActorContext &ctx) {
TEvGetOperationRequest::TResponse resp;
auto deferred = resp.mutable_operation();
deferred->set_id(Request->GetProtoRequest()->id());
deferred->set_ready(true);
deferred->set_status(status);
- if (issues.size())
- deferred->mutable_issues()->CopyFrom(issues);
+ if (issues.size())
+ deferred->mutable_issues()->CopyFrom(issues);
Reply(resp, ctx);
}
diff --git a/ydb/core/grpc_services/rpc_read_table.cpp b/ydb/core/grpc_services/rpc_read_table.cpp
index 224b85fef63..bbb87907289 100644
--- a/ydb/core/grpc_services/rpc_read_table.cpp
+++ b/ydb/core/grpc_services/rpc_read_table.cpp
@@ -164,7 +164,7 @@ private:
HFunc(TEvents::TEvPoisonPill, HandlePoison)
HFunc(TEvents::TEvSubscribe, Handle);
HFunc(TEvents::TEvWakeup, Handle);
- HFunc(TEvDataShard::TEvGetReadTableStreamStateRequest, Handle);
+ HFunc(TEvDataShard::TEvGetReadTableStreamStateRequest, Handle);
default:
Y_FAIL("TRequestHandler: unexpected event 0x%08" PRIx32, ev->GetTypeRewrite());
}
@@ -403,33 +403,33 @@ private:
SetTimeoutTimer(timeout, ctx);
}
- void Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr &ev, const TActorContext &ctx)
- {
- auto *response = new TEvDataShard::TEvGetReadTableStreamStateResponse;
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- //response->Record.SetReady(IsStreamReady);
- //response->Record.SetFinished(IsStreamFinished);
- response->Record.SetResponseQueueSize(LeftInGRpcAdaptorQueue_);
- for (auto &ev : QuotaRequestQueue_)
- response->Record.AddQuotaRequests()->SetId(ev->Get()->Record.GetShardId());
- for (auto &pr : QuotaByShard_) {
- auto &quota = *response->Record.AddShardQuotas();
- quota.SetShardId(pr.first);
- quota.SetQuota(pr.second);
- }
- response->Record.SetQuotaLimit(QuotaLimit_);
- response->Record.SetQuotaReserved(QuotaReserved_);
- for (auto shard : ReleasedShards_)
- response->Record.AddReleasedShards()->SetId(shard);
- response->Record.SetInactiveClientTimeout(InactiveClientTimeout_.GetValue());
- response->Record.SetInactiveServerTimeout(InactiveServerTimeout_.GetValue());
- response->Record.SetLastDataStreamTimestamp(LastDataStreamTimestamp_.GetValue());
- response->Record.SetLastStatusTimestamp(LastStatusTimestamp_.GetValue());
-
- ctx.Send(ev->Sender, response);
- }
-
+ void Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr &ev, const TActorContext &ctx)
+ {
+ auto *response = new TEvDataShard::TEvGetReadTableStreamStateResponse;
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+
+ //response->Record.SetReady(IsStreamReady);
+ //response->Record.SetFinished(IsStreamFinished);
+ response->Record.SetResponseQueueSize(LeftInGRpcAdaptorQueue_);
+ for (auto &ev : QuotaRequestQueue_)
+ response->Record.AddQuotaRequests()->SetId(ev->Get()->Record.GetShardId());
+ for (auto &pr : QuotaByShard_) {
+ auto &quota = *response->Record.AddShardQuotas();
+ quota.SetShardId(pr.first);
+ quota.SetQuota(pr.second);
+ }
+ response->Record.SetQuotaLimit(QuotaLimit_);
+ response->Record.SetQuotaReserved(QuotaReserved_);
+ for (auto shard : ReleasedShards_)
+ response->Record.AddReleasedShards()->SetId(shard);
+ response->Record.SetInactiveClientTimeout(InactiveClientTimeout_.GetValue());
+ response->Record.SetInactiveServerTimeout(InactiveServerTimeout_.GetValue());
+ response->Record.SetLastDataStreamTimestamp(LastDataStreamTimestamp_.GetValue());
+ response->Record.SetLastStatusTimestamp(LastStatusTimestamp_.GetValue());
+
+ ctx.Send(ev->Sender, response);
+ }
+
void SendProposeRequest(const TActorContext &ctx) {
const auto req = Request_->GetProtoRequest();
auto actorId = SelfId();
@@ -567,7 +567,7 @@ private:
LOG_DEBUG_S(ctx, NKikimrServices::READ_TABLE_API,
SelfId() << " Send zero quota to Shard " << rec.GetShardId()
<< ", TxId " << rec.GetTxId());
- ctx.Send(request->Sender, response.Release(), 0, request->Cookie);
+ ctx.Send(request->Sender, response.Release(), 0, request->Cookie);
}
for (const auto& id : StreamSubscribers_) {
diff --git a/ydb/core/grpc_services/table_profiles.cpp b/ydb/core/grpc_services/table_profiles.cpp
index ee06bf6a5f9..367de4cc89e 100644
--- a/ydb/core/grpc_services/table_profiles.cpp
+++ b/ydb/core/grpc_services/table_profiles.cpp
@@ -1,50 +1,50 @@
-#include "table_profiles.h"
-
+#include "table_profiles.h"
+
#include <ydb/core/base/appdata.h>
#include <ydb/core/protos/flat_scheme_op.pb.h>
#include <ydb/core/ydb_convert/table_description.h>
#include <ydb/core/ydb_convert/ydb_convert.h>
-
-#include <util/string/printf.h>
-
-namespace NKikimr {
-namespace NGRpcService {
-
-TTableProfiles::TTableProfiles()
-{
-}
-
-TTableProfiles::TTableProfiles(const NKikimrConfig::TTableProfilesConfig &config)
-{
- Load(config);
-}
-
-void TTableProfiles::Load(const NKikimrConfig::TTableProfilesConfig &config)
-{
- CompactionPolicies.clear();
- ExecutionPolicies.clear();
- PartitioningPolicies.clear();
- StoragePolicies.clear();
- ReplicationPolicies.clear();
- CachingPolicies.clear();
- TableProfiles.clear();
-
- for (auto &profile : config.GetTableProfiles())
- TableProfiles[profile.GetName()] = profile;
- for (auto &policy : config.GetCompactionPolicies())
- CompactionPolicies[policy.GetName()] = policy;
- for (auto &policy : config.GetExecutionPolicies())
- ExecutionPolicies[policy.GetName()] = policy;
- for (auto &policy : config.GetPartitioningPolicies())
- PartitioningPolicies[policy.GetName()] = policy;
- for (auto &policy : config.GetStoragePolicies())
- StoragePolicies[policy.GetName()] = policy;
- for (auto &policy : config.GetReplicationPolicies())
- ReplicationPolicies[policy.GetName()] = policy;
- for (auto &policy : config.GetCachingPolicies())
- CachingPolicies[policy.GetName()] = policy;
-}
-
+
+#include <util/string/printf.h>
+
+namespace NKikimr {
+namespace NGRpcService {
+
+TTableProfiles::TTableProfiles()
+{
+}
+
+TTableProfiles::TTableProfiles(const NKikimrConfig::TTableProfilesConfig &config)
+{
+ Load(config);
+}
+
+void TTableProfiles::Load(const NKikimrConfig::TTableProfilesConfig &config)
+{
+ CompactionPolicies.clear();
+ ExecutionPolicies.clear();
+ PartitioningPolicies.clear();
+ StoragePolicies.clear();
+ ReplicationPolicies.clear();
+ CachingPolicies.clear();
+ TableProfiles.clear();
+
+ for (auto &profile : config.GetTableProfiles())
+ TableProfiles[profile.GetName()] = profile;
+ for (auto &policy : config.GetCompactionPolicies())
+ CompactionPolicies[policy.GetName()] = policy;
+ for (auto &policy : config.GetExecutionPolicies())
+ ExecutionPolicies[policy.GetName()] = policy;
+ for (auto &policy : config.GetPartitioningPolicies())
+ PartitioningPolicies[policy.GetName()] = policy;
+ for (auto &policy : config.GetStoragePolicies())
+ StoragePolicies[policy.GetName()] = policy;
+ for (auto &policy : config.GetReplicationPolicies())
+ ReplicationPolicies[policy.GetName()] = policy;
+ for (auto &policy : config.GetCachingPolicies())
+ CachingPolicies[policy.GetName()] = policy;
+}
+
NKikimrSchemeOp::TFamilyDescription *TTableProfiles::GetNamedFamilyDescription(NKikimrConfig::TStoragePolicy &policy, const TString& name) const {
for (size_t i = 0; i < policy.ColumnFamiliesSize(); ++i) {
const auto& family = policy.GetColumnFamilies(i);
@@ -63,163 +63,163 @@ NKikimrSchemeOp::TFamilyDescription *TTableProfiles::GetDefaultFamilyDescription
if ((family.HasId() && family.GetId() == 0) ||
(!family.HasId() && !family.HasName()))
{
- return policy.MutableColumnFamilies(i);
+ return policy.MutableColumnFamilies(i);
}
}
- auto res = policy.AddColumnFamilies();
- res->SetId(0);
- return res;
-}
-
+ auto res = policy.AddColumnFamilies();
+ res->SetId(0);
+ return res;
+}
+
NKikimrSchemeOp::TStorageConfig *TTableProfiles::GetDefaultStorageConfig(NKikimrConfig::TStoragePolicy &policy) const {
- return GetDefaultFamilyDescription(policy)->MutableStorageConfig();
-}
-
+ return GetDefaultFamilyDescription(policy)->MutableStorageConfig();
+}
+
bool TTableProfiles::HasPresetName(const TString &presetName) const {
return TableProfiles.contains(presetName);
}
-bool TTableProfiles::ApplyTableProfile(const Ydb::Table::TableProfile &profile,
+bool TTableProfiles::ApplyTableProfile(const Ydb::Table::TableProfile &profile,
NKikimrSchemeOp::TTableDescription &tableDesc,
- Ydb::StatusIds::StatusCode &code,
- TString &error) const
-{
- NKikimrConfig::TCompactionPolicy compactionPolicy;
- NKikimrConfig::TExecutionPolicy executionPolicy;
- NKikimrConfig::TPartitioningPolicy partitioningPolicy;
- NKikimrConfig::TStoragePolicy storagePolicy;
- NKikimrConfig::TReplicationPolicy replicationPolicy;
- NKikimrConfig::TCachingPolicy cachingPolicy;
+ Ydb::StatusIds::StatusCode &code,
+ TString &error) const
+{
+ NKikimrConfig::TCompactionPolicy compactionPolicy;
+ NKikimrConfig::TExecutionPolicy executionPolicy;
+ NKikimrConfig::TPartitioningPolicy partitioningPolicy;
+ NKikimrConfig::TStoragePolicy storagePolicy;
+ NKikimrConfig::TReplicationPolicy replicationPolicy;
+ NKikimrConfig::TCachingPolicy cachingPolicy;
auto &partitionConfig = *tableDesc.MutablePartitionConfig();
-
+
if (profile.preset_name() && !TableProfiles.contains(profile.preset_name())) {
- code = Ydb::StatusIds::BAD_REQUEST;
+ code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("unknown table profile preset '%s'", profile.preset_name().data());
- return false;
- }
-
- TString name = profile.preset_name() ? profile.preset_name() : "default";
- NKikimrConfig::TTableProfile tableProfile;
+ return false;
+ }
+
+ TString name = profile.preset_name() ? profile.preset_name() : "default";
+ NKikimrConfig::TTableProfile tableProfile;
if (TableProfiles.contains(name))
- tableProfile = TableProfiles.at(name);
-
- // Determine used compaction policy.
- if (profile.has_compaction_policy()) {
- auto &policy = profile.compaction_policy();
+ tableProfile = TableProfiles.at(name);
+
+ // Determine used compaction policy.
+ if (profile.has_compaction_policy()) {
+ auto &policy = profile.compaction_policy();
if (!CompactionPolicies.contains(policy.preset_name())) {
- code = Ydb::StatusIds::BAD_REQUEST;
+ code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("unknown compaction policy preset '%s'", policy.preset_name().data());
- return false;
- }
- compactionPolicy = CompactionPolicies.at(policy.preset_name());
+ return false;
+ }
+ compactionPolicy = CompactionPolicies.at(policy.preset_name());
} else if (CompactionPolicies.contains(tableProfile.GetCompactionPolicy())) {
- compactionPolicy = CompactionPolicies.at(tableProfile.GetCompactionPolicy());
- }
-
- // Determine used execution policy.
- if (profile.has_execution_policy()) {
- auto &policy = profile.execution_policy();
+ compactionPolicy = CompactionPolicies.at(tableProfile.GetCompactionPolicy());
+ }
+
+ // Determine used execution policy.
+ if (profile.has_execution_policy()) {
+ auto &policy = profile.execution_policy();
if (!ExecutionPolicies.contains(policy.preset_name())) {
- code = Ydb::StatusIds::BAD_REQUEST;
+ code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("unknown execution policy preset '%s'", policy.preset_name().data());
- return false;
- }
- executionPolicy = ExecutionPolicies.at(policy.preset_name());
+ return false;
+ }
+ executionPolicy = ExecutionPolicies.at(policy.preset_name());
} else if (ExecutionPolicies.contains(tableProfile.GetExecutionPolicy())) {
- executionPolicy = ExecutionPolicies.at(tableProfile.GetExecutionPolicy());
- }
-
- // Determine used partitioning policy.
- if (profile.has_partitioning_policy()) {
- auto &policy = profile.partitioning_policy();
- if (policy.preset_name()) {
+ executionPolicy = ExecutionPolicies.at(tableProfile.GetExecutionPolicy());
+ }
+
+ // Determine used partitioning policy.
+ if (profile.has_partitioning_policy()) {
+ auto &policy = profile.partitioning_policy();
+ if (policy.preset_name()) {
if (!PartitioningPolicies.contains(policy.preset_name())) {
- code = Ydb::StatusIds::BAD_REQUEST;
+ code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("unknown partitioning policy preset '%s'", policy.preset_name().data());
- return false;
- }
- partitioningPolicy = PartitioningPolicies.at(policy.preset_name());
+ return false;
+ }
+ partitioningPolicy = PartitioningPolicies.at(policy.preset_name());
} else if (PartitioningPolicies.contains(tableProfile.GetPartitioningPolicy())) {
- partitioningPolicy = PartitioningPolicies.at(tableProfile.GetPartitioningPolicy());
- }
- // Apply auto partitioning overwrites.
- switch (policy.auto_partitioning()) {
- case Ydb::Table::PartitioningPolicy::AUTO_PARTITIONING_POLICY_UNSPECIFIED:
- break;
- case Ydb::Table::PartitioningPolicy::DISABLED:
- partitioningPolicy.SetAutoSplit(false);
- partitioningPolicy.SetAutoMerge(false);
- break;
- case Ydb::Table::PartitioningPolicy::AUTO_SPLIT:
- partitioningPolicy.SetAutoSplit(true);
- partitioningPolicy.SetAutoMerge(false);
- break;
- case Ydb::Table::PartitioningPolicy::AUTO_SPLIT_MERGE:
- partitioningPolicy.SetAutoSplit(true);
- partitioningPolicy.SetAutoMerge(true);
- break;
- default:
- code = Ydb::StatusIds::BAD_REQUEST;
- error = Sprintf("unknown auto partitioning policy %" PRIu32,
- (ui32)policy.auto_partitioning());
- return false;
- }
- // Apply uniform partitions overwrites.
- switch (policy.partitions_case()) {
- case Ydb::Table::PartitioningPolicy::kUniformPartitions:
- partitioningPolicy.SetUniformPartitionsCount(policy.uniform_partitions());
- break;
- case Ydb::Table::PartitioningPolicy::kExplicitPartitions:
+ partitioningPolicy = PartitioningPolicies.at(tableProfile.GetPartitioningPolicy());
+ }
+ // Apply auto partitioning overwrites.
+ switch (policy.auto_partitioning()) {
+ case Ydb::Table::PartitioningPolicy::AUTO_PARTITIONING_POLICY_UNSPECIFIED:
+ break;
+ case Ydb::Table::PartitioningPolicy::DISABLED:
+ partitioningPolicy.SetAutoSplit(false);
+ partitioningPolicy.SetAutoMerge(false);
+ break;
+ case Ydb::Table::PartitioningPolicy::AUTO_SPLIT:
+ partitioningPolicy.SetAutoSplit(true);
+ partitioningPolicy.SetAutoMerge(false);
+ break;
+ case Ydb::Table::PartitioningPolicy::AUTO_SPLIT_MERGE:
+ partitioningPolicy.SetAutoSplit(true);
+ partitioningPolicy.SetAutoMerge(true);
+ break;
+ default:
+ code = Ydb::StatusIds::BAD_REQUEST;
+ error = Sprintf("unknown auto partitioning policy %" PRIu32,
+ (ui32)policy.auto_partitioning());
+ return false;
+ }
+ // Apply uniform partitions overwrites.
+ switch (policy.partitions_case()) {
+ case Ydb::Table::PartitioningPolicy::kUniformPartitions:
+ partitioningPolicy.SetUniformPartitionsCount(policy.uniform_partitions());
+ break;
+ case Ydb::Table::PartitioningPolicy::kExplicitPartitions:
if (!CopyExplicitPartitions(tableDesc, policy.explicit_partitions(), code, error))
- return false;
- break;
- default:
- break;
- }
+ return false;
+ break;
+ default:
+ break;
+ }
} else if (PartitioningPolicies.contains(tableProfile.GetPartitioningPolicy())) {
- partitioningPolicy = PartitioningPolicies.at(tableProfile.GetPartitioningPolicy());
- }
-
- // Determine used storage policy.
- if (profile.has_storage_policy()) {
- auto &policy = profile.storage_policy();
- if (policy.preset_name()) {
+ partitioningPolicy = PartitioningPolicies.at(tableProfile.GetPartitioningPolicy());
+ }
+
+ // Determine used storage policy.
+ if (profile.has_storage_policy()) {
+ auto &policy = profile.storage_policy();
+ if (policy.preset_name()) {
if (!StoragePolicies.contains(policy.preset_name())) {
- code = Ydb::StatusIds::BAD_REQUEST;
+ code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("unknown storage policy preset '%s'", policy.preset_name().data());
- return false;
- }
- storagePolicy = StoragePolicies.at(policy.preset_name());
+ return false;
+ }
+ storagePolicy = StoragePolicies.at(policy.preset_name());
} else if (StoragePolicies.contains(tableProfile.GetStoragePolicy())) {
- storagePolicy = StoragePolicies.at(tableProfile.GetStoragePolicy());
- }
- // Apply overwritten storage settings for syslog.
- if (policy.has_syslog()) {
- auto &settings = *GetDefaultStorageConfig(storagePolicy)->MutableSysLog();
+ storagePolicy = StoragePolicies.at(tableProfile.GetStoragePolicy());
+ }
+ // Apply overwritten storage settings for syslog.
+ if (policy.has_syslog()) {
+ auto &settings = *GetDefaultStorageConfig(storagePolicy)->MutableSysLog();
settings.SetPreferredPoolKind(policy.syslog().media());
- settings.SetAllowOtherKinds(false);
- }
- // Apply overwritten storage settings for log.
- if (policy.has_log()) {
- auto &settings = *GetDefaultStorageConfig(storagePolicy)->MutableLog();
+ settings.SetAllowOtherKinds(false);
+ }
+ // Apply overwritten storage settings for log.
+ if (policy.has_log()) {
+ auto &settings = *GetDefaultStorageConfig(storagePolicy)->MutableLog();
settings.SetPreferredPoolKind(policy.log().media());
- settings.SetAllowOtherKinds(false);
- }
- // Apply overwritten storage settings for data.
- if (policy.has_data()) {
- auto &settings = *GetDefaultStorageConfig(storagePolicy)->MutableData();
+ settings.SetAllowOtherKinds(false);
+ }
+ // Apply overwritten storage settings for data.
+ if (policy.has_data()) {
+ auto &settings = *GetDefaultStorageConfig(storagePolicy)->MutableData();
settings.SetPreferredPoolKind(policy.data().media());
- settings.SetAllowOtherKinds(false);
- }
- // Apply overwritten storage settings for external.
- if (policy.has_external()) {
- auto &settings = *GetDefaultStorageConfig(storagePolicy)->MutableExternal();
+ settings.SetAllowOtherKinds(false);
+ }
+ // Apply overwritten storage settings for external.
+ if (policy.has_external()) {
+ auto &settings = *GetDefaultStorageConfig(storagePolicy)->MutableExternal();
settings.SetPreferredPoolKind(policy.external().media());
- settings.SetAllowOtherKinds(false);
- }
- switch (policy.keep_in_memory()) {
+ settings.SetAllowOtherKinds(false);
+ }
+ switch (policy.keep_in_memory()) {
case Ydb::FeatureFlag::STATUS_UNSPECIFIED:
- break;
+ break;
case Ydb::FeatureFlag::ENABLED:
if (!AppData()->FeatureFlags.GetEnablePublicApiKeepInMemory()) {
code = Ydb::StatusIds::BAD_REQUEST;
@@ -227,16 +227,16 @@ bool TTableProfiles::ApplyTableProfile(const Ydb::Table::TableProfile &profile,
return false;
}
GetDefaultFamilyDescription(storagePolicy)->SetColumnCache(NKikimrSchemeOp::ColumnCacheEver);
- break;
+ break;
case Ydb::FeatureFlag::DISABLED:
- GetDefaultFamilyDescription(storagePolicy)->ClearColumnCache();
- break;
- default:
- code = Ydb::StatusIds::BAD_REQUEST;
- error = Sprintf("unknown keep-in-memory featrure flag status %" PRIu32,
- (ui32)policy.keep_in_memory());
- return false;
- }
+ GetDefaultFamilyDescription(storagePolicy)->ClearColumnCache();
+ break;
+ default:
+ code = Ydb::StatusIds::BAD_REQUEST;
+ error = Sprintf("unknown keep-in-memory featrure flag status %" PRIu32,
+ (ui32)policy.keep_in_memory());
+ return false;
+ }
// Perform the same overrides for each named policy there is
for (auto& family : policy.column_families()) {
@@ -306,87 +306,87 @@ bool TTableProfiles::ApplyTableProfile(const Ydb::Table::TableProfile &profile,
}
}
} else if (StoragePolicies.contains(tableProfile.GetStoragePolicy())) {
- storagePolicy = StoragePolicies.at(tableProfile.GetStoragePolicy());
- }
-
- // Determine used replication policy.
- if (profile.has_replication_policy()) {
- auto &policy = profile.replication_policy();
- if (policy.preset_name()) {
+ storagePolicy = StoragePolicies.at(tableProfile.GetStoragePolicy());
+ }
+
+ // Determine used replication policy.
+ if (profile.has_replication_policy()) {
+ auto &policy = profile.replication_policy();
+ if (policy.preset_name()) {
if (!ReplicationPolicies.contains(policy.preset_name())) {
- code = Ydb::StatusIds::BAD_REQUEST;
+ code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("unknown replciation policy preset '%s'", policy.preset_name().data());
- return false;
- }
- replicationPolicy = ReplicationPolicies.at(policy.preset_name());
+ return false;
+ }
+ replicationPolicy = ReplicationPolicies.at(policy.preset_name());
} else if (ReplicationPolicies.contains(tableProfile.GetReplicationPolicy())) {
- replicationPolicy = ReplicationPolicies.at(tableProfile.GetReplicationPolicy());
- }
- if (policy.replicas_count())
+ replicationPolicy = ReplicationPolicies.at(tableProfile.GetReplicationPolicy());
+ }
+ if (policy.replicas_count())
replicationPolicy.SetFollowerCount(policy.replicas_count());
- switch (policy.create_per_availability_zone()) {
+ switch (policy.create_per_availability_zone()) {
case Ydb::FeatureFlag::STATUS_UNSPECIFIED:
- break;
+ break;
case Ydb::FeatureFlag::ENABLED:
- replicationPolicy.SetCrossDataCenter(true);
- break;
+ replicationPolicy.SetCrossDataCenter(true);
+ break;
case Ydb::FeatureFlag::DISABLED:
- replicationPolicy.SetCrossDataCenter(false);
- break;
- default:
- code = Ydb::StatusIds::BAD_REQUEST;
- error = Sprintf("unknown create_per_availability_zone featrure flag status %" PRIu32,
- (ui32)policy.create_per_availability_zone());
- return false;
- }
- switch (policy.allow_promotion()) {
+ replicationPolicy.SetCrossDataCenter(false);
+ break;
+ default:
+ code = Ydb::StatusIds::BAD_REQUEST;
+ error = Sprintf("unknown create_per_availability_zone featrure flag status %" PRIu32,
+ (ui32)policy.create_per_availability_zone());
+ return false;
+ }
+ switch (policy.allow_promotion()) {
case Ydb::FeatureFlag::STATUS_UNSPECIFIED:
- break;
+ break;
case Ydb::FeatureFlag::ENABLED:
replicationPolicy.SetAllowFollowerPromotion(true);
- break;
+ break;
case Ydb::FeatureFlag::DISABLED:
replicationPolicy.SetAllowFollowerPromotion(false);
- break;
- default:
- code = Ydb::StatusIds::BAD_REQUEST;
- error = Sprintf("unknown allow_promotion featrure flag status %" PRIu32,
- (ui32)policy.allow_promotion());
- return false;
- }
+ break;
+ default:
+ code = Ydb::StatusIds::BAD_REQUEST;
+ error = Sprintf("unknown allow_promotion featrure flag status %" PRIu32,
+ (ui32)policy.allow_promotion());
+ return false;
+ }
} else if (ReplicationPolicies.contains(tableProfile.GetReplicationPolicy())) {
- replicationPolicy = ReplicationPolicies.at(tableProfile.GetReplicationPolicy());
- }
-
- // Determine used caching policy.
- if (profile.has_caching_policy()) {
- auto &policy = profile.caching_policy();
+ replicationPolicy = ReplicationPolicies.at(tableProfile.GetReplicationPolicy());
+ }
+
+ // Determine used caching policy.
+ if (profile.has_caching_policy()) {
+ auto &policy = profile.caching_policy();
if (!CachingPolicies.contains(policy.preset_name())) {
- code = Ydb::StatusIds::BAD_REQUEST;
+ code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("unknown caching policy preset '%s'", policy.preset_name().data());
- return false;
- }
- cachingPolicy = CachingPolicies.at(policy.preset_name());
+ return false;
+ }
+ cachingPolicy = CachingPolicies.at(policy.preset_name());
} else if (CachingPolicies.contains(tableProfile.GetCachingPolicy())) {
- cachingPolicy = CachingPolicies.at(tableProfile.GetCachingPolicy());
- }
-
- // Apply compaction policy to table description.
- if (compactionPolicy.HasCompactionPolicy())
- partitionConfig.MutableCompactionPolicy()->CopyFrom(compactionPolicy.GetCompactionPolicy());
-
- // Apply execution policy.
- if (executionPolicy.HasPipelineConfig())
- partitionConfig.MutablePipelineConfig()->CopyFrom(executionPolicy.GetPipelineConfig());
- if (executionPolicy.HasResourceProfile())
- partitionConfig.SetResourceProfile(executionPolicy.GetResourceProfile());
- if (executionPolicy.HasEnableFilterByKey())
- partitionConfig.SetEnableFilterByKey(executionPolicy.GetEnableFilterByKey());
- if (executionPolicy.HasExecutorFastLogPolicy())
- partitionConfig.SetExecutorFastLogPolicy(executionPolicy.GetExecutorFastLogPolicy());
- if (executionPolicy.HasTxReadSizeLimit())
- partitionConfig.SetTxReadSizeLimit(executionPolicy.GetTxReadSizeLimit());
-
+ cachingPolicy = CachingPolicies.at(tableProfile.GetCachingPolicy());
+ }
+
+ // Apply compaction policy to table description.
+ if (compactionPolicy.HasCompactionPolicy())
+ partitionConfig.MutableCompactionPolicy()->CopyFrom(compactionPolicy.GetCompactionPolicy());
+
+ // Apply execution policy.
+ if (executionPolicy.HasPipelineConfig())
+ partitionConfig.MutablePipelineConfig()->CopyFrom(executionPolicy.GetPipelineConfig());
+ if (executionPolicy.HasResourceProfile())
+ partitionConfig.SetResourceProfile(executionPolicy.GetResourceProfile());
+ if (executionPolicy.HasEnableFilterByKey())
+ partitionConfig.SetEnableFilterByKey(executionPolicy.GetEnableFilterByKey());
+ if (executionPolicy.HasExecutorFastLogPolicy())
+ partitionConfig.SetExecutorFastLogPolicy(executionPolicy.GetExecutorFastLogPolicy());
+ if (executionPolicy.HasTxReadSizeLimit())
+ partitionConfig.SetTxReadSizeLimit(executionPolicy.GetTxReadSizeLimit());
+
if (executionPolicy.HasEnableEraseCache())
partitionConfig.SetEnableEraseCache(executionPolicy.GetEnableEraseCache());
if (executionPolicy.HasEraseCacheMinRows())
@@ -394,54 +394,54 @@ bool TTableProfiles::ApplyTableProfile(const Ydb::Table::TableProfile &profile,
if (executionPolicy.HasEraseCacheMaxBytes())
partitionConfig.SetEraseCacheMaxBytes(executionPolicy.GetEraseCacheMaxBytes());
- // Apply partitioning policy.
- if (partitioningPolicy.HasUniformPartitionsCount())
- tableDesc.SetUniformPartitionsCount(partitioningPolicy.GetUniformPartitionsCount());
- if (partitioningPolicy.GetAutoSplit()) {
- auto &policy = *partitionConfig.MutablePartitioningPolicy();
- policy.SetSizeToSplit(partitioningPolicy.GetSizeToSplit());
- if (!policy.GetSizeToSplit())
- policy.SetSizeToSplit(1 << 30);
- if (partitioningPolicy.HasMaxPartitionsCount())
- policy.SetMaxPartitionsCount(partitioningPolicy.GetMaxPartitionsCount());
- if (partitioningPolicy.GetAutoMerge()) {
- policy.SetMinPartitionsCount(1);
- if (policy.GetMinPartitionsCount() < partitioningPolicy.GetUniformPartitionsCount())
- policy.SetMinPartitionsCount(partitioningPolicy.GetUniformPartitionsCount());
+ // Apply partitioning policy.
+ if (partitioningPolicy.HasUniformPartitionsCount())
+ tableDesc.SetUniformPartitionsCount(partitioningPolicy.GetUniformPartitionsCount());
+ if (partitioningPolicy.GetAutoSplit()) {
+ auto &policy = *partitionConfig.MutablePartitioningPolicy();
+ policy.SetSizeToSplit(partitioningPolicy.GetSizeToSplit());
+ if (!policy.GetSizeToSplit())
+ policy.SetSizeToSplit(1 << 30);
+ if (partitioningPolicy.HasMaxPartitionsCount())
+ policy.SetMaxPartitionsCount(partitioningPolicy.GetMaxPartitionsCount());
+ if (partitioningPolicy.GetAutoMerge()) {
+ policy.SetMinPartitionsCount(1);
+ if (policy.GetMinPartitionsCount() < partitioningPolicy.GetUniformPartitionsCount())
+ policy.SetMinPartitionsCount(partitioningPolicy.GetUniformPartitionsCount());
if (policy.GetMinPartitionsCount() < (ui32)tableDesc.GetSplitBoundary().size() + 1)
policy.SetMinPartitionsCount(tableDesc.GetSplitBoundary().size() + 1);
- }
- }
-
- // Apply storage config.
- for (auto &family : storagePolicy.GetColumnFamilies())
- partitionConfig.AddColumnFamilies()->CopyFrom(family);
-
- // Apply replication policy.
+ }
+ }
+
+ // Apply storage config.
+ for (auto &family : storagePolicy.GetColumnFamilies())
+ partitionConfig.AddColumnFamilies()->CopyFrom(family);
+
+ // Apply replication policy.
if (replicationPolicy.GetFollowerCount()) {
auto& followerGroup = *partitionConfig.AddFollowerGroups();
followerGroup.SetFollowerCount(replicationPolicy.GetFollowerCount());
- if (replicationPolicy.GetCrossDataCenter())
+ if (replicationPolicy.GetCrossDataCenter())
followerGroup.SetRequireAllDataCenters(true);
- else
+ else
followerGroup.SetRequireAllDataCenters(false);
if (replicationPolicy.HasAllowFollowerPromotion()) {
followerGroup.SetAllowLeaderPromotion(replicationPolicy.GetAllowFollowerPromotion());
}
- }
-
- if (cachingPolicy.HasExecutorCacheSize())
- partitionConfig.SetExecutorCacheSize(cachingPolicy.GetExecutorCacheSize());
-
- return true;
-}
-
+ }
+
+ if (cachingPolicy.HasExecutorCacheSize())
+ partitionConfig.SetExecutorCacheSize(cachingPolicy.GetExecutorCacheSize());
+
+ return true;
+}
+
bool TTableProfiles::ApplyCompactionPolicy(const TString &name,
NKikimrSchemeOp::TPartitionConfig &partitionConfig, Ydb::StatusIds::StatusCode &code,
TString &error, const TAppData* appData) const
{
NKikimrConfig::TCompactionPolicy compactionPolicy;
-
+
if (!CompactionPolicies.contains(name)) {
code = Ydb::StatusIds::BAD_REQUEST;
error = Sprintf("unknown compaction policy preset '%s'", name.c_str());
@@ -459,5 +459,5 @@ bool TTableProfiles::ApplyCompactionPolicy(const TString &name,
}
-} // namespace NGRpcService
-} // namespace NKikimr
+} // namespace NGRpcService
+} // namespace NKikimr
diff --git a/ydb/core/grpc_services/table_profiles.h b/ydb/core/grpc_services/table_profiles.h
index 8c8e3c5c7bc..2acec6f115e 100644
--- a/ydb/core/grpc_services/table_profiles.h
+++ b/ydb/core/grpc_services/table_profiles.h
@@ -1,45 +1,45 @@
-#pragma once
-
+#pragma once
+
#include <ydb/core/protos/console_config.pb.h>
#include <ydb/core/base/appdata.h>
#include <ydb/public/api/protos/ydb_status_codes.pb.h>
#include <ydb/public/api/protos/ydb_table.pb.h>
-
-#include <util/generic/hash.h>
-
-namespace NKikimr {
-namespace NGRpcService {
-
-class TTableProfiles {
-public:
- TTableProfiles();
- TTableProfiles(const NKikimrConfig::TTableProfilesConfig &config);
-
- void Load(const NKikimrConfig::TTableProfilesConfig &config);
-
+
+#include <util/generic/hash.h>
+
+namespace NKikimr {
+namespace NGRpcService {
+
+class TTableProfiles {
+public:
+ TTableProfiles();
+ TTableProfiles(const NKikimrConfig::TTableProfilesConfig &config);
+
+ void Load(const NKikimrConfig::TTableProfilesConfig &config);
+
bool HasPresetName(const TString& presetName) const;
- bool ApplyTableProfile(const Ydb::Table::TableProfile &profile,
+ bool ApplyTableProfile(const Ydb::Table::TableProfile &profile,
NKikimrSchemeOp::TTableDescription &tableDesc,
- Ydb::StatusIds::StatusCode &code,
- TString &error) const;
+ Ydb::StatusIds::StatusCode &code,
+ TString &error) const;
bool ApplyCompactionPolicy(const TString &name, NKikimrSchemeOp::TPartitionConfig &partitionConfig,
Ydb::StatusIds::StatusCode &code, TString &error, const TAppData* appData = nullptr) const;
-private:
+private:
NKikimrSchemeOp::TFamilyDescription *GetNamedFamilyDescription(NKikimrConfig::TStoragePolicy &policy, const TString& name) const;
NKikimrSchemeOp::TFamilyDescription *GetDefaultFamilyDescription(NKikimrConfig::TStoragePolicy &policy) const;
NKikimrSchemeOp::TStorageConfig *GetDefaultStorageConfig(NKikimrConfig::TStoragePolicy &policy) const;
-public:
- THashMap<TString, NKikimrConfig::TCompactionPolicy> CompactionPolicies;
- THashMap<TString, NKikimrConfig::TExecutionPolicy> ExecutionPolicies;
- THashMap<TString, NKikimrConfig::TPartitioningPolicy> PartitioningPolicies;
- THashMap<TString, NKikimrConfig::TStoragePolicy> StoragePolicies;
- THashMap<TString, NKikimrConfig::TReplicationPolicy> ReplicationPolicies;
- THashMap<TString, NKikimrConfig::TCachingPolicy> CachingPolicies;
- THashMap<TString, NKikimrConfig::TTableProfile> TableProfiles;
-};
-
-} // namespace NGRpcService
-} // namespace NKikimr
+public:
+ THashMap<TString, NKikimrConfig::TCompactionPolicy> CompactionPolicies;
+ THashMap<TString, NKikimrConfig::TExecutionPolicy> ExecutionPolicies;
+ THashMap<TString, NKikimrConfig::TPartitioningPolicy> PartitioningPolicies;
+ THashMap<TString, NKikimrConfig::TStoragePolicy> StoragePolicies;
+ THashMap<TString, NKikimrConfig::TReplicationPolicy> ReplicationPolicies;
+ THashMap<TString, NKikimrConfig::TCachingPolicy> CachingPolicies;
+ THashMap<TString, NKikimrConfig::TTableProfile> TableProfiles;
+};
+
+} // namespace NGRpcService
+} // namespace NKikimr
diff --git a/ydb/core/grpc_services/ya.make b/ydb/core/grpc_services/ya.make
index 0e8eaa12db1..05b156bf043 100644
--- a/ydb/core/grpc_services/ya.make
+++ b/ydb/core/grpc_services/ya.make
@@ -19,7 +19,7 @@ SRCS(
rpc_begin_transaction.cpp
rpc_calls.cpp
rpc_cancel_operation.cpp
- rpc_cms.cpp
+ rpc_cms.cpp
rpc_commit_transaction.cpp
rpc_copy_table.cpp
rpc_copy_tables.cpp
@@ -31,7 +31,7 @@ SRCS(
rpc_describe_coordination_node.cpp
rpc_describe_path.cpp
rpc_describe_table.cpp
- rpc_describe_table_options.cpp
+ rpc_describe_table_options.cpp
rpc_drop_coordination_node.cpp
rpc_drop_table.cpp
rpc_discovery.cpp
@@ -70,7 +70,7 @@ SRCS(
rpc_stream_execute_yql_script.cpp
rpc_whoami.cpp
rpc_yq.cpp
- table_profiles.cpp
+ table_profiles.cpp
table_settings.cpp
rpc_analytics_internal.cpp
)
diff --git a/ydb/core/kqp/counters/kqp_counters.cpp b/ydb/core/kqp/counters/kqp_counters.cpp
index 83aead3b8b2..26a28a0249a 100644
--- a/ydb/core/kqp/counters/kqp_counters.cpp
+++ b/ydb/core/kqp/counters/kqp_counters.cpp
@@ -5,7 +5,7 @@
#include <ydb/core/protos/issue_id.pb.h>
#include <ydb/core/sys_view/service/db_counters.h>
#include <ydb/core/sys_view/service/sysview_service.h>
-
+
#include <library/cpp/actors/core/log.h>
#include <util/generic/size_literals.h>
diff --git a/ydb/core/kqp/kqp_ic_gateway.cpp b/ydb/core/kqp/kqp_ic_gateway.cpp
index b62430b0a13..47489a9bd54 100644
--- a/ydb/core/kqp/kqp_ic_gateway.cpp
+++ b/ydb/core/kqp/kqp_ic_gateway.cpp
@@ -2342,9 +2342,9 @@ private:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecCancelled:
status = TIssuesIds::KIKIMR_OPERATION_CANCELLED;
break;
- case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::WrongRequest:
- status = TIssuesIds::KIKIMR_BAD_REQUEST;
- break;
+ case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::WrongRequest:
+ status = TIssuesIds::KIKIMR_BAD_REQUEST;
+ break;
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyShardUnknown:
case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::CoordinatorUnknown:
status = TIssuesIds::KIKIMR_OPERATION_STATE_UNKNOWN;
diff --git a/ydb/core/kqp/provider/yql_kikimr_provider.cpp b/ydb/core/kqp/provider/yql_kikimr_provider.cpp
index 040b2cd2c01..635d1648279 100644
--- a/ydb/core/kqp/provider/yql_kikimr_provider.cpp
+++ b/ydb/core/kqp/provider/yql_kikimr_provider.cpp
@@ -172,16 +172,16 @@ bool TKikimrTableDescription::Load(TExprContext& ctx, bool withSystemColumns) {
for (auto pair : Metadata->Columns) {
auto& column = pair.second;
- // Currently Kikimr doesn't have parametrized types and Decimal type
- // is passed with no params. It's known to always be Decimal(22,9),
- // so we transform Decimal type here.
+ // Currently Kikimr doesn't have parametrized types and Decimal type
+ // is passed with no params. It's known to always be Decimal(22,9),
+ // so we transform Decimal type here.
const TTypeAnnotationNode *type;
- if (to_lower(column.Type) == "decimal")
- type = ctx.MakeType<TDataExprParamsType>(
+ if (to_lower(column.Type) == "decimal")
+ type = ctx.MakeType<TDataExprParamsType>(
NKikimr::NUdf::GetDataSlot(column.Type),
- ToString(NKikimr::NScheme::DECIMAL_PRECISION),
- ToString(NKikimr::NScheme::DECIMAL_SCALE));
- else
+ ToString(NKikimr::NScheme::DECIMAL_PRECISION),
+ ToString(NKikimr::NScheme::DECIMAL_SCALE));
+ else
type = ctx.MakeType<TDataExprType>(NKikimr::NUdf::GetDataSlot(column.Type));
if (!column.NotNull) {
diff --git a/ydb/core/kqp/proxy/kqp_proxy_service.cpp b/ydb/core/kqp/proxy/kqp_proxy_service.cpp
index 25ae383fb55..decd2cb3011 100644
--- a/ydb/core/kqp/proxy/kqp_proxy_service.cpp
+++ b/ydb/core/kqp/proxy/kqp_proxy_service.cpp
@@ -458,7 +458,7 @@ public:
LogConfig.Swap(event.MutableConfig()->MutableLogConfig());
UpdateYqlLogLevels();
- auto responseEv = MakeHolder<NConsole::TEvConsole::TEvConfigNotificationResponse>(event);
+ auto responseEv = MakeHolder<NConsole::TEvConsole::TEvConfigNotificationResponse>(event);
Send(ev->Sender, responseEv.Release(), IEventHandle::FlagTrackDelivery, ev->Cookie);
StartCollectPeerProxyData();
PublishResourceUsage();
diff --git a/ydb/core/mind/dynamic_nameserver.cpp b/ydb/core/mind/dynamic_nameserver.cpp
index 0399618043f..6f4f147982a 100644
--- a/ydb/core/mind/dynamic_nameserver.cpp
+++ b/ydb/core/mind/dynamic_nameserver.cpp
@@ -1,200 +1,200 @@
-#include "dynamic_nameserver_impl.h"
-
+#include "dynamic_nameserver_impl.h"
+
#include <ydb/core/base/appdata.h>
#include <ydb/core/mon/mon.h>
#include <ydb/core/protos/services.pb.h>
-
-namespace NKikimr {
-namespace NNodeBroker {
-
+
+namespace NKikimr {
+namespace NNodeBroker {
+
static void ResetInterconnectProxyConfig(ui32 nodeId, const TActorContext &ctx)
-{
+{
auto aid = TActivationContext::InterconnectProxy(nodeId);
- if (!aid)
- return;
- ctx.Send(aid, new TEvInterconnect::TEvDisconnect);
-}
-
-void TDynamicNodeResolverBase::Bootstrap(const TActorContext &ctx)
-{
- auto dinfo = AppData(ctx)->DomainsInfo;
+ if (!aid)
+ return;
+ ctx.Send(aid, new TEvInterconnect::TEvDisconnect);
+}
+
+void TDynamicNodeResolverBase::Bootstrap(const TActorContext &ctx)
+{
+ auto dinfo = AppData(ctx)->DomainsInfo;
auto domain = NodeIdToDomain(NodeId, *dinfo);
-
+
if (!dinfo->Domains.contains(domain)) {
- ReplyWithErrorAndDie(ctx);
- return;
- }
-
+ ReplyWithErrorAndDie(ctx);
+ return;
+ }
+
NTabletPipe::TClientRetryPolicy retryPolicy = {
.RetryLimitCount = 12,
.MinRetryTime = TDuration::MilliSeconds(50),
.MaxRetryTime = TDuration::Seconds(2)
};
- ui32 group = dinfo->GetDefaultStateStorageGroup(domain);
+ ui32 group = dinfo->GetDefaultStateStorageGroup(domain);
auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeNodeBrokerID(group), NTabletPipe::TClientConfig(retryPolicy));
NodeBrokerPipe = ctx.RegisterWithSameMailbox(pipe);
-
- TAutoPtr<TEvNodeBroker::TEvResolveNode> request = new TEvNodeBroker::TEvResolveNode;
- request->Record.SetNodeId(NodeId);
- NTabletPipe::SendData(ctx, NodeBrokerPipe, request.Release());
-
- Become(&TDynamicNodeResolverBase::StateWork);
+
+ TAutoPtr<TEvNodeBroker::TEvResolveNode> request = new TEvNodeBroker::TEvResolveNode;
+ request->Record.SetNodeId(NodeId);
+ NTabletPipe::SendData(ctx, NodeBrokerPipe, request.Release());
+
+ Become(&TDynamicNodeResolverBase::StateWork);
if (Deadline != TInstant::Max()) {
Schedule(Deadline, new TEvents::TEvWakeup);
}
-}
-
-void TDynamicNodeResolverBase::Die(const TActorContext &ctx)
-{
- if (NodeBrokerPipe)
- NTabletPipe::CloseClient(ctx, NodeBrokerPipe);
- TBase::Die(ctx);
-}
-
-void TDynamicNodeResolverBase::ReplyWithErrorAndDie(const TActorContext &ctx)
-{
- OnError(ctx);
- Die(ctx);
-}
-
-void TDynamicNodeResolverBase::Handle(TEvNodeBroker::TEvResolvedNode::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
- TDynamicConfig::TDynamicNodeInfo oldNode;
- auto it = Config->DynamicNodes.find(NodeId);
- bool exists = it != Config->DynamicNodes.end();
-
- if (exists) {
- oldNode = it->second;
- Config->DynamicNodes.erase(it);
- }
-
- if (rec.GetStatus().GetCode() != NKikimrNodeBroker::TStatus::OK) {
- // Reset proxy if node expired.
- if (exists)
- ResetInterconnectProxyConfig(NodeId, ctx);
- ReplyWithErrorAndDie(ctx);
- return;
- }
-
- TDynamicConfig::TDynamicNodeInfo node(rec.GetNode());
-
- // If ID is re-used by another node then proxy has to be reset.
- if (exists && !oldNode.EqualExceptExpire(node))
- ResetInterconnectProxyConfig(NodeId, ctx);
- Config->DynamicNodes.emplace(NodeId, node);
-
- OnSuccess(ctx);
- Die(ctx);
-}
-
-void TDynamicNodeResolverBase::Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx)
-{
- if (ev->Get()->Status != NKikimrProto::OK)
- ReplyWithErrorAndDie(ctx);
-}
-
-void TDynamicNodeResolver::OnSuccess(const TActorContext &ctx)
-{
- ctx.Send(OrigRequest);
-}
-
-void TDynamicNodeResolver::OnError(const TActorContext &ctx)
-{
- auto reply = new TEvLocalNodeInfo;
- reply->NodeId = NodeId;
- ctx.Send(OrigRequest->Sender, reply);
-}
-
-void TDynamicNodeSearcher::OnSuccess(const TActorContext &ctx)
-{
- THolder<TEvInterconnect::TEvNodeInfo> reply(new TEvInterconnect::TEvNodeInfo(NodeId));
- auto it = Config->DynamicNodes.find(NodeId);
- if (it != Config->DynamicNodes.end())
+}
+
+void TDynamicNodeResolverBase::Die(const TActorContext &ctx)
+{
+ if (NodeBrokerPipe)
+ NTabletPipe::CloseClient(ctx, NodeBrokerPipe);
+ TBase::Die(ctx);
+}
+
+void TDynamicNodeResolverBase::ReplyWithErrorAndDie(const TActorContext &ctx)
+{
+ OnError(ctx);
+ Die(ctx);
+}
+
+void TDynamicNodeResolverBase::Handle(TEvNodeBroker::TEvResolvedNode::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+ TDynamicConfig::TDynamicNodeInfo oldNode;
+ auto it = Config->DynamicNodes.find(NodeId);
+ bool exists = it != Config->DynamicNodes.end();
+
+ if (exists) {
+ oldNode = it->second;
+ Config->DynamicNodes.erase(it);
+ }
+
+ if (rec.GetStatus().GetCode() != NKikimrNodeBroker::TStatus::OK) {
+ // Reset proxy if node expired.
+ if (exists)
+ ResetInterconnectProxyConfig(NodeId, ctx);
+ ReplyWithErrorAndDie(ctx);
+ return;
+ }
+
+ TDynamicConfig::TDynamicNodeInfo node(rec.GetNode());
+
+ // If ID is re-used by another node then proxy has to be reset.
+ if (exists && !oldNode.EqualExceptExpire(node))
+ ResetInterconnectProxyConfig(NodeId, ctx);
+ Config->DynamicNodes.emplace(NodeId, node);
+
+ OnSuccess(ctx);
+ Die(ctx);
+}
+
+void TDynamicNodeResolverBase::Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx)
+{
+ if (ev->Get()->Status != NKikimrProto::OK)
+ ReplyWithErrorAndDie(ctx);
+}
+
+void TDynamicNodeResolver::OnSuccess(const TActorContext &ctx)
+{
+ ctx.Send(OrigRequest);
+}
+
+void TDynamicNodeResolver::OnError(const TActorContext &ctx)
+{
+ auto reply = new TEvLocalNodeInfo;
+ reply->NodeId = NodeId;
+ ctx.Send(OrigRequest->Sender, reply);
+}
+
+void TDynamicNodeSearcher::OnSuccess(const TActorContext &ctx)
+{
+ THolder<TEvInterconnect::TEvNodeInfo> reply(new TEvInterconnect::TEvNodeInfo(NodeId));
+ auto it = Config->DynamicNodes.find(NodeId);
+ if (it != Config->DynamicNodes.end())
reply->Node = MakeHolder<TEvInterconnect::TNodeInfo>(it->first, it->second.Address,
- it->second.Host, it->second.ResolveHost,
- it->second.Port, it->second.Location);
- ctx.Send(OrigRequest->Sender, reply.Release());
-}
-
-void TDynamicNodeSearcher::OnError(const TActorContext &ctx)
-{
- THolder<TEvInterconnect::TEvNodeInfo> reply(new TEvInterconnect::TEvNodeInfo(NodeId));
- ctx.Send(OrigRequest->Sender, reply.Release());
-}
-
-void TDynamicNameserver::Bootstrap(const TActorContext &ctx)
-{
- NActors::TMon* mon = AppData(ctx)->Mon;
- if (mon) {
- NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors");
- mon->RegisterActorPage(actorsMonPage, "dnameserver", "Dynamic nameserver",
- false, ctx.ExecutorThread.ActorSystem, ctx.SelfID);
- }
-
- auto dinfo = AppData(ctx)->DomainsInfo;
- for (auto &pr : dinfo->Domains)
- RequestEpochUpdate(pr.first, 1, ctx);
-
- Become(&TDynamicNameserver::StateFunc);
-}
-
-void TDynamicNameserver::Die(const TActorContext &ctx)
-{
- for (auto &pipe : NodeBrokerPipes) {
- if (pipe)
- NTabletPipe::CloseClient(ctx, pipe);
- }
- TBase::Die(ctx);
-}
-
-void TDynamicNameserver::OpenPipe(ui32 domain,
- const TActorContext &ctx)
-{
- auto dinfo = AppData(ctx)->DomainsInfo;
- ui32 group = dinfo->Domains[domain]->DefaultStateStorageGroup;
-
- if (!NodeBrokerPipes[domain]) {
- auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeNodeBrokerID(group));
+ it->second.Host, it->second.ResolveHost,
+ it->second.Port, it->second.Location);
+ ctx.Send(OrigRequest->Sender, reply.Release());
+}
+
+void TDynamicNodeSearcher::OnError(const TActorContext &ctx)
+{
+ THolder<TEvInterconnect::TEvNodeInfo> reply(new TEvInterconnect::TEvNodeInfo(NodeId));
+ ctx.Send(OrigRequest->Sender, reply.Release());
+}
+
+void TDynamicNameserver::Bootstrap(const TActorContext &ctx)
+{
+ NActors::TMon* mon = AppData(ctx)->Mon;
+ if (mon) {
+ NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors");
+ mon->RegisterActorPage(actorsMonPage, "dnameserver", "Dynamic nameserver",
+ false, ctx.ExecutorThread.ActorSystem, ctx.SelfID);
+ }
+
+ auto dinfo = AppData(ctx)->DomainsInfo;
+ for (auto &pr : dinfo->Domains)
+ RequestEpochUpdate(pr.first, 1, ctx);
+
+ Become(&TDynamicNameserver::StateFunc);
+}
+
+void TDynamicNameserver::Die(const TActorContext &ctx)
+{
+ for (auto &pipe : NodeBrokerPipes) {
+ if (pipe)
+ NTabletPipe::CloseClient(ctx, pipe);
+ }
+ TBase::Die(ctx);
+}
+
+void TDynamicNameserver::OpenPipe(ui32 domain,
+ const TActorContext &ctx)
+{
+ auto dinfo = AppData(ctx)->DomainsInfo;
+ ui32 group = dinfo->Domains[domain]->DefaultStateStorageGroup;
+
+ if (!NodeBrokerPipes[domain]) {
+ auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeNodeBrokerID(group));
NodeBrokerPipes[domain] = ctx.RegisterWithSameMailbox(pipe);
- }
-}
-
-void TDynamicNameserver::RequestEpochUpdate(ui32 domain,
- ui32 epoch,
- const TActorContext &ctx)
-{
- OpenPipe(domain, ctx);
-
- TAutoPtr<TEvNodeBroker::TEvListNodes> request = new TEvNodeBroker::TEvListNodes;
- request->Record.SetMinEpoch(epoch);
- NTabletPipe::SendData(ctx, NodeBrokerPipes[domain], request.Release());
- EpochUpdates[domain] = epoch;
-}
-
+ }
+}
+
+void TDynamicNameserver::RequestEpochUpdate(ui32 domain,
+ ui32 epoch,
+ const TActorContext &ctx)
+{
+ OpenPipe(domain, ctx);
+
+ TAutoPtr<TEvNodeBroker::TEvListNodes> request = new TEvNodeBroker::TEvListNodes;
+ request->Record.SetMinEpoch(epoch);
+ NTabletPipe::SendData(ctx, NodeBrokerPipes[domain], request.Release());
+ EpochUpdates[domain] = epoch;
+}
+
void TDynamicNameserver::ResolveStaticNode(ui32 nodeId, TActorId sender, TInstant deadline, const TActorContext &ctx)
-{
+{
auto it = StaticConfig->StaticNodeTable.find(nodeId);
-
+
if (it == StaticConfig->StaticNodeTable.end()) {
auto reply = new TEvLocalNodeInfo;
reply->NodeId = nodeId;
ctx.Send(sender, reply);
return;
}
-
+
RegisterWithSameMailbox(CreateResolveActor(it->second.ResolveHost, it->second.Port, nodeId, it->second.Address, sender, SelfId(), deadline));
-}
-
-void TDynamicNameserver::ResolveDynamicNode(ui32 nodeId,
- TAutoPtr<IEventHandle> ev,
+}
+
+void TDynamicNameserver::ResolveDynamicNode(ui32 nodeId,
+ TAutoPtr<IEventHandle> ev,
TInstant deadline,
const TActorContext &ctx)
-{
+{
ui32 domain = NodeIdToDomain(nodeId, *AppData(ctx)->DomainsInfo);
auto it = DynamicConfigs[domain]->DynamicNodes.find(nodeId);
-
+
if (it != DynamicConfigs[domain]->DynamicNodes.end()
&& it->second.Expire > ctx.Now())
{
@@ -206,237 +206,237 @@ void TDynamicNameserver::ResolveDynamicNode(ui32 nodeId,
ctx.Send(ev->Sender, reply);
} else {
ctx.RegisterWithSameMailbox(new TDynamicNodeResolver(SelfId(), nodeId, DynamicConfigs[domain], ev, deadline));
- }
-}
-
+ }
+}
+
void TDynamicNameserver::SendNodesList(const TActorContext &ctx)
-{
- auto now = ctx.Now();
- for (auto &sender : ListNodesQueue) {
- THolder<TEvInterconnect::TEvNodesInfo> reply(new TEvInterconnect::TEvNodesInfo);
- for (const auto &pr : StaticConfig->StaticNodeTable) {
- reply->Nodes.emplace_back(pr.first,
- pr.second.Address, pr.second.Host, pr.second.ResolveHost,
- pr.second.Port, pr.second.Location);
- }
-
- for (auto &config : DynamicConfigs) {
- for (auto &pr : config->DynamicNodes) {
- if (pr.second.Expire > now)
- reply->Nodes.emplace_back(pr.first, pr.second.Address,
- pr.second.Host, pr.second.ResolveHost,
- pr.second.Port, pr.second.Location);
- }
- }
-
- ctx.Send(sender, reply.Release());
- }
- ListNodesQueue.clear();
-}
-
+{
+ auto now = ctx.Now();
+ for (auto &sender : ListNodesQueue) {
+ THolder<TEvInterconnect::TEvNodesInfo> reply(new TEvInterconnect::TEvNodesInfo);
+ for (const auto &pr : StaticConfig->StaticNodeTable) {
+ reply->Nodes.emplace_back(pr.first,
+ pr.second.Address, pr.second.Host, pr.second.ResolveHost,
+ pr.second.Port, pr.second.Location);
+ }
+
+ for (auto &config : DynamicConfigs) {
+ for (auto &pr : config->DynamicNodes) {
+ if (pr.second.Expire > now)
+ reply->Nodes.emplace_back(pr.first, pr.second.Address,
+ pr.second.Host, pr.second.ResolveHost,
+ pr.second.Port, pr.second.Location);
+ }
+ }
+
+ ctx.Send(sender, reply.Release());
+ }
+ ListNodesQueue.clear();
+}
+
void TDynamicNameserver::PendingRequestAnswered(ui32 domain, const TActorContext &ctx)
-{
- PendingRequests.Reset(domain);
- if (PendingRequests.Empty())
- SendNodesList(ctx);
-}
-
-void TDynamicNameserver::UpdateState(const NKikimrNodeBroker::TNodesInfo &rec,
- const TActorContext &ctx)
-{
- ui32 domain = rec.GetDomain();
- auto &config = DynamicConfigs[domain];
-
- if (rec.GetEpoch().GetVersion() <= config->Epoch.Version)
- return;
-
- // In case of new epoch we need to fully update state.
- // Otherwise only add new nodes.
- if (rec.GetEpoch().GetId() > config->Epoch.Id) {
- THashSet<ui32> toRemove;
- for (auto &pr : config->DynamicNodes)
- toRemove.insert(pr.first);
-
- for (auto &node : rec.GetNodes()) {
- auto nodeId = node.GetNodeId();
-
- toRemove.erase(nodeId);
-
- TDynamicConfig::TDynamicNodeInfo info(node);
- auto it = config->DynamicNodes.find(nodeId);
- if (it == config->DynamicNodes.end()) {
- config->DynamicNodes.emplace(nodeId, info);
- } else {
- if (it->second.EqualExceptExpire(info)) {
- it->second.Expire = info.Expire;
- } else {
- ResetInterconnectProxyConfig(nodeId, ctx);
- it->second = info;
- }
- }
- }
-
- for (auto id : toRemove)
- config->DynamicNodes.erase(id);
-
- config->ExpiredNodes.clear();
- for (auto &node : rec.GetExpiredNodes()) {
- TDynamicConfig::TDynamicNodeInfo info(node);
- config->ExpiredNodes.emplace(node.GetNodeId(), info);
- }
-
- config->Epoch = rec.GetEpoch();
- ctx.Schedule(config->Epoch.End - ctx.Now(),
- new TEvPrivate::TEvUpdateEpoch(domain, config->Epoch.Id + 1));
- } else {
- for (auto &node : rec.GetNodes()) {
- auto nodeId = node.GetNodeId();
+{
+ PendingRequests.Reset(domain);
+ if (PendingRequests.Empty())
+ SendNodesList(ctx);
+}
+
+void TDynamicNameserver::UpdateState(const NKikimrNodeBroker::TNodesInfo &rec,
+ const TActorContext &ctx)
+{
+ ui32 domain = rec.GetDomain();
+ auto &config = DynamicConfigs[domain];
+
+ if (rec.GetEpoch().GetVersion() <= config->Epoch.Version)
+ return;
+
+ // In case of new epoch we need to fully update state.
+ // Otherwise only add new nodes.
+ if (rec.GetEpoch().GetId() > config->Epoch.Id) {
+ THashSet<ui32> toRemove;
+ for (auto &pr : config->DynamicNodes)
+ toRemove.insert(pr.first);
+
+ for (auto &node : rec.GetNodes()) {
+ auto nodeId = node.GetNodeId();
+
+ toRemove.erase(nodeId);
+
+ TDynamicConfig::TDynamicNodeInfo info(node);
+ auto it = config->DynamicNodes.find(nodeId);
+ if (it == config->DynamicNodes.end()) {
+ config->DynamicNodes.emplace(nodeId, info);
+ } else {
+ if (it->second.EqualExceptExpire(info)) {
+ it->second.Expire = info.Expire;
+ } else {
+ ResetInterconnectProxyConfig(nodeId, ctx);
+ it->second = info;
+ }
+ }
+ }
+
+ for (auto id : toRemove)
+ config->DynamicNodes.erase(id);
+
+ config->ExpiredNodes.clear();
+ for (auto &node : rec.GetExpiredNodes()) {
+ TDynamicConfig::TDynamicNodeInfo info(node);
+ config->ExpiredNodes.emplace(node.GetNodeId(), info);
+ }
+
+ config->Epoch = rec.GetEpoch();
+ ctx.Schedule(config->Epoch.End - ctx.Now(),
+ new TEvPrivate::TEvUpdateEpoch(domain, config->Epoch.Id + 1));
+ } else {
+ for (auto &node : rec.GetNodes()) {
+ auto nodeId = node.GetNodeId();
if (!config->DynamicNodes.contains(nodeId))
- config->DynamicNodes.emplace(nodeId, node);
- }
- config->Epoch = rec.GetEpoch();
- }
-}
-
-void TDynamicNameserver::OnPipeDestroyed(ui32 domain,
- const TActorContext &ctx)
-{
+ config->DynamicNodes.emplace(nodeId, node);
+ }
+ config->Epoch = rec.GetEpoch();
+ }
+}
+
+void TDynamicNameserver::OnPipeDestroyed(ui32 domain,
+ const TActorContext &ctx)
+{
NodeBrokerPipes[domain] = TActorId();
- PendingRequestAnswered(domain, ctx);
-
+ PendingRequestAnswered(domain, ctx);
+
if (EpochUpdates.contains(domain)) {
- ctx.Schedule(TDuration::Seconds(1),
- new TEvPrivate::TEvUpdateEpoch(domain, EpochUpdates.at(domain)));
- EpochUpdates.erase(domain);
- }
-}
-
-void TDynamicNameserver::Handle(TEvInterconnect::TEvResolveNode::TPtr &ev,
+ ctx.Schedule(TDuration::Seconds(1),
+ new TEvPrivate::TEvUpdateEpoch(domain, EpochUpdates.at(domain)));
+ EpochUpdates.erase(domain);
+ }
+}
+
+void TDynamicNameserver::Handle(TEvInterconnect::TEvResolveNode::TPtr &ev,
const TActorContext &ctx)
-{
+{
auto& record = ev->Get()->Record;
const ui32 nodeId = record.GetNodeId();
const TInstant deadline = record.HasDeadline() ? TInstant::FromValue(record.GetDeadline()) : TInstant::Max();
- auto config = AppData(ctx)->DynamicNameserviceConfig;
-
- if (!config || nodeId <= config->MaxStaticNodeId)
+ auto config = AppData(ctx)->DynamicNameserviceConfig;
+
+ if (!config || nodeId <= config->MaxStaticNodeId)
ResolveStaticNode(nodeId, ev->Sender, deadline, ctx);
- else
+ else
ResolveDynamicNode(nodeId, ev.Release(), deadline, ctx);
-}
-
+}
+
void TDynamicNameserver::Handle(TEvResolveAddress::TPtr &ev, const TActorContext &ctx) {
Y_UNUSED(ctx);
-
+
const TEvResolveAddress* request = ev->Get();
-
+
RegisterWithSameMailbox(CreateResolveActor(request->Address, request->Port, ev->Sender, SelfId(), TInstant::Max()));
-}
-
-void TDynamicNameserver::Handle(TEvInterconnect::TEvListNodes::TPtr &ev,
+}
+
+void TDynamicNameserver::Handle(TEvInterconnect::TEvListNodes::TPtr &ev,
const TActorContext &ctx)
-{
- if (ListNodesQueue.empty()) {
- auto dinfo = AppData(ctx)->DomainsInfo;
-
- for (auto &entry : dinfo->Domains) {
- ui32 domain = entry.first;
-
- OpenPipe(domain, ctx);
-
- TAutoPtr<TEvNodeBroker::TEvListNodes> request = new TEvNodeBroker::TEvListNodes;
- request->Record.SetCachedVersion(DynamicConfigs[domain]->Epoch.Version);
- NTabletPipe::SendData(ctx, NodeBrokerPipes[domain], request.Release());
- PendingRequests.Set(domain);
- }
- }
- ListNodesQueue.push_back(ev->Sender);
-}
-
+{
+ if (ListNodesQueue.empty()) {
+ auto dinfo = AppData(ctx)->DomainsInfo;
+
+ for (auto &entry : dinfo->Domains) {
+ ui32 domain = entry.first;
+
+ OpenPipe(domain, ctx);
+
+ TAutoPtr<TEvNodeBroker::TEvListNodes> request = new TEvNodeBroker::TEvListNodes;
+ request->Record.SetCachedVersion(DynamicConfigs[domain]->Epoch.Version);
+ NTabletPipe::SendData(ctx, NodeBrokerPipes[domain], request.Release());
+ PendingRequests.Set(domain);
+ }
+ }
+ ListNodesQueue.push_back(ev->Sender);
+}
+
void TDynamicNameserver::Handle(TEvInterconnect::TEvGetNode::TPtr &ev, const TActorContext &ctx)
-{
- ui32 nodeId = ev->Get()->NodeId;
- THolder<TEvInterconnect::TEvNodeInfo> reply(new TEvInterconnect::TEvNodeInfo(nodeId));
- auto config = AppData(ctx)->DynamicNameserviceConfig;
-
- if (!config || nodeId <= config->MaxStaticNodeId) {
- auto it = StaticConfig->StaticNodeTable.find(nodeId);
- if (it != StaticConfig->StaticNodeTable.end())
+{
+ ui32 nodeId = ev->Get()->NodeId;
+ THolder<TEvInterconnect::TEvNodeInfo> reply(new TEvInterconnect::TEvNodeInfo(nodeId));
+ auto config = AppData(ctx)->DynamicNameserviceConfig;
+
+ if (!config || nodeId <= config->MaxStaticNodeId) {
+ auto it = StaticConfig->StaticNodeTable.find(nodeId);
+ if (it != StaticConfig->StaticNodeTable.end())
reply->Node = MakeHolder<TEvInterconnect::TNodeInfo>(it->first, it->second.Address,
- it->second.Host, it->second.ResolveHost,
- it->second.Port, it->second.Location);
- ctx.Send(ev->Sender, reply.Release());
- } else {
+ it->second.Host, it->second.ResolveHost,
+ it->second.Port, it->second.Location);
+ ctx.Send(ev->Sender, reply.Release());
+ } else {
ui32 domain = NodeIdToDomain(nodeId, *AppData(ctx)->DomainsInfo);
- auto it = DynamicConfigs[domain]->DynamicNodes.find(nodeId);
- if (it != DynamicConfigs[domain]->DynamicNodes.end() && it->second.Expire > ctx.Now()) {
+ auto it = DynamicConfigs[domain]->DynamicNodes.find(nodeId);
+ if (it != DynamicConfigs[domain]->DynamicNodes.end() && it->second.Expire > ctx.Now()) {
reply->Node = MakeHolder<TEvInterconnect::TNodeInfo>(it->first, it->second.Address,
- it->second.Host, it->second.ResolveHost,
- it->second.Port, it->second.Location);
- ctx.Send(ev->Sender, reply.Release());
+ it->second.Host, it->second.ResolveHost,
+ it->second.Port, it->second.Location);
+ ctx.Send(ev->Sender, reply.Release());
} else if (DynamicConfigs[domain]->ExpiredNodes.contains(nodeId)
- && ctx.Now() < DynamicConfigs[domain]->Epoch.End) {
- ctx.Send(ev->Sender, reply.Release());
- } else {
+ && ctx.Now() < DynamicConfigs[domain]->Epoch.End) {
+ ctx.Send(ev->Sender, reply.Release());
+ } else {
const TInstant deadline = ev->Get()->Deadline;
ctx.RegisterWithSameMailbox(new TDynamicNodeSearcher(SelfId(), nodeId, DynamicConfigs[domain], ev.Release(),
deadline));
- }
- }
-}
-
+ }
+ }
+}
+
void TDynamicNameserver::Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx)
-{
- ui32 domain = AppData(ctx)->DomainsInfo->GetDomainUidByTabletId(ev->Get()->TabletId);
- if (NodeBrokerPipes[domain] == ev->Get()->ClientId)
- OnPipeDestroyed(domain, ctx);
-}
-
+{
+ ui32 domain = AppData(ctx)->DomainsInfo->GetDomainUidByTabletId(ev->Get()->TabletId);
+ if (NodeBrokerPipes[domain] == ev->Get()->ClientId)
+ OnPipeDestroyed(domain, ctx);
+}
+
void TDynamicNameserver::Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx)
-{
- if (ev->Get()->Status != NKikimrProto::OK) {
- ui32 domain = AppData(ctx)->DomainsInfo->GetDomainUidByTabletId(ev->Get()->TabletId);
- if (NodeBrokerPipes[domain] == ev->Get()->ClientId) {
- NTabletPipe::CloseClient(ctx, NodeBrokerPipes[domain]);
- OnPipeDestroyed(domain, ctx);
- }
- }
-}
-
-void TDynamicNameserver::Handle(TEvNodeBroker::TEvNodesInfo::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->GetRecord();
- Y_VERIFY(rec.HasDomain());
- ui32 domain = rec.GetDomain();
-
- if (rec.GetEpoch().GetVersion() != DynamicConfigs[domain]->Epoch.Version)
- UpdateState(rec, ctx);
-
+{
+ if (ev->Get()->Status != NKikimrProto::OK) {
+ ui32 domain = AppData(ctx)->DomainsInfo->GetDomainUidByTabletId(ev->Get()->TabletId);
+ if (NodeBrokerPipes[domain] == ev->Get()->ClientId) {
+ NTabletPipe::CloseClient(ctx, NodeBrokerPipes[domain]);
+ OnPipeDestroyed(domain, ctx);
+ }
+ }
+}
+
+void TDynamicNameserver::Handle(TEvNodeBroker::TEvNodesInfo::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->GetRecord();
+ Y_VERIFY(rec.HasDomain());
+ ui32 domain = rec.GetDomain();
+
+ if (rec.GetEpoch().GetVersion() != DynamicConfigs[domain]->Epoch.Version)
+ UpdateState(rec, ctx);
+
if (EpochUpdates.contains(domain) && EpochUpdates.at(domain) <= rec.GetEpoch().GetId())
- EpochUpdates.erase(domain);
-
- PendingRequestAnswered(rec.GetDomain(), ctx);
-}
-
-void TDynamicNameserver::Handle(TEvPrivate::TEvUpdateEpoch::TPtr &ev, const TActorContext &ctx)
-{
- ui32 domain = ev->Get()->Domain;
- ui64 epoch = ev->Get()->Epoch;
-
- if (DynamicConfigs[domain]->Epoch.Id < epoch
+ EpochUpdates.erase(domain);
+
+ PendingRequestAnswered(rec.GetDomain(), ctx);
+}
+
+void TDynamicNameserver::Handle(TEvPrivate::TEvUpdateEpoch::TPtr &ev, const TActorContext &ctx)
+{
+ ui32 domain = ev->Get()->Domain;
+ ui64 epoch = ev->Get()->Epoch;
+
+ if (DynamicConfigs[domain]->Epoch.Id < epoch
&& (!EpochUpdates.contains(domain)
- || EpochUpdates.at(domain) < epoch))
- RequestEpochUpdate(domain, epoch, ctx);
-}
-
+ || EpochUpdates.at(domain) < epoch))
+ RequestEpochUpdate(domain, epoch, ctx);
+}
+
IActor *CreateDynamicNameserver(const TIntrusivePtr<TTableNameserverSetup> &setup, ui32 poolId) {
- return new TDynamicNameserver(setup, poolId);
-}
-
-IActor *CreateDynamicNameserver(const TIntrusivePtr<TTableNameserverSetup> &setup,
+ return new TDynamicNameserver(setup, poolId);
+}
+
+IActor *CreateDynamicNameserver(const TIntrusivePtr<TTableNameserverSetup> &setup,
const NKikimrNodeBroker::TNodeInfo &node, const TDomainsInfo &domains, ui32 poolId) {
return new TDynamicNameserver(setup, node, domains, poolId);
-}
-
-} // NNodeBroker
-} // NKikimr
+}
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/dynamic_nameserver.h b/ydb/core/mind/dynamic_nameserver.h
index 5d0ebfe443d..38b9b7e8422 100644
--- a/ydb/core/mind/dynamic_nameserver.h
+++ b/ydb/core/mind/dynamic_nameserver.h
@@ -1,24 +1,24 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <library/cpp/actors/core/actor.h>
#include <library/cpp/actors/interconnect/interconnect.h>
#include <ydb/core/base/domain.h>
#include <ydb/core/protos/node_broker.pb.h>
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-// Create nameservice for static node.
-IActor *CreateDynamicNameserver(const TIntrusivePtr<TTableNameserverSetup> &setup,
- ui32 poolId = 0);
-
-// Create nameservice for dynamic node providing its info.
-IActor *CreateDynamicNameserver(const TIntrusivePtr<TTableNameserverSetup> &setup,
- const NKikimrNodeBroker::TNodeInfo &node,
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+// Create nameservice for static node.
+IActor *CreateDynamicNameserver(const TIntrusivePtr<TTableNameserverSetup> &setup,
+ ui32 poolId = 0);
+
+// Create nameservice for dynamic node providing its info.
+IActor *CreateDynamicNameserver(const TIntrusivePtr<TTableNameserverSetup> &setup,
+ const NKikimrNodeBroker::TNodeInfo &node,
const TDomainsInfo &domains,
- ui32 poolId = 0);
-
-} // NNodeBroker
-} // NKikimr
+ ui32 poolId = 0);
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/dynamic_nameserver_impl.h b/ydb/core/mind/dynamic_nameserver_impl.h
index d3aef6eabb7..ae0e1889511 100644
--- a/ydb/core/mind/dynamic_nameserver_impl.h
+++ b/ydb/core/mind/dynamic_nameserver_impl.h
@@ -1,255 +1,255 @@
-#pragma once
-
-#include "dynamic_nameserver.h"
-#include "node_broker.h"
-
+#pragma once
+
+#include "dynamic_nameserver.h"
+#include "node_broker.h"
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/interconnect/events_local.h>
#include <library/cpp/actors/interconnect/interconnect_impl.h>
#include <library/cpp/actors/interconnect/interconnect_address.h>
#include <ydb/core/base/tablet_pipe.h>
-
+
#include <ydb/core/protos/services.pb.h>
#include <library/cpp/actors/core/hfunc.h>
-
-#include <util/generic/bitmap.h>
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-struct TDynamicConfig : public TThrRefBase {
- struct TDynamicNodeInfo : public TTableNameserverSetup::TNodeInfo {
- TDynamicNodeInfo()
- {
- }
-
- TDynamicNodeInfo(const TString &address,
- const TString &host,
- const TString &resolveHost,
- ui16 port,
+
+#include <util/generic/bitmap.h>
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+struct TDynamicConfig : public TThrRefBase {
+ struct TDynamicNodeInfo : public TTableNameserverSetup::TNodeInfo {
+ TDynamicNodeInfo()
+ {
+ }
+
+ TDynamicNodeInfo(const TString &address,
+ const TString &host,
+ const TString &resolveHost,
+ ui16 port,
const TNodeLocation &location,
- TInstant expire)
- : TNodeInfo(address, host, resolveHost, port, location)
- , Expire(expire)
- {
- }
-
- TDynamicNodeInfo(const NKikimrNodeBroker::TNodeInfo &info)
- : TDynamicNodeInfo(info.GetAddress(),
- info.GetHost(),
- info.GetResolveHost(),
- (ui16)info.GetPort(),
+ TInstant expire)
+ : TNodeInfo(address, host, resolveHost, port, location)
+ , Expire(expire)
+ {
+ }
+
+ TDynamicNodeInfo(const NKikimrNodeBroker::TNodeInfo &info)
+ : TDynamicNodeInfo(info.GetAddress(),
+ info.GetHost(),
+ info.GetResolveHost(),
+ (ui16)info.GetPort(),
TNodeLocation(info.GetLocation()),
TInstant::MicroSeconds(info.GetExpire()))
- {
- }
-
- TDynamicNodeInfo(const TDynamicNodeInfo &other) = default;
-
+ {
+ }
+
+ TDynamicNodeInfo(const TDynamicNodeInfo &other) = default;
+
bool EqualExceptExpire(const TDynamicNodeInfo &other) const
- {
- return Host == other.Host
- && Address == other.Address
- && ResolveHost == other.ResolveHost
- && Port == other.Port
- && Location == other.Location;
- }
-
- TInstant Expire;
- };
-
+ {
+ return Host == other.Host
+ && Address == other.Address
+ && ResolveHost == other.ResolveHost
+ && Port == other.Port
+ && Location == other.Location;
+ }
+
+ TInstant Expire;
+ };
+
THashMap<ui32, TDynamicNodeInfo> DynamicNodes;
- THashMap<ui32, TDynamicNodeInfo> ExpiredNodes;
- TEpochInfo Epoch;
-};
-
-using TDynamicConfigPtr = TIntrusivePtr<TDynamicConfig>;
-
-class TDynamicNodeResolverBase : public TActorBootstrapped<TDynamicNodeResolverBase> {
-public:
- using TBase = TActorBootstrapped<TDynamicNodeResolverBase>;
-
+ THashMap<ui32, TDynamicNodeInfo> ExpiredNodes;
+ TEpochInfo Epoch;
+};
+
+using TDynamicConfigPtr = TIntrusivePtr<TDynamicConfig>;
+
+class TDynamicNodeResolverBase : public TActorBootstrapped<TDynamicNodeResolverBase> {
+public:
+ using TBase = TActorBootstrapped<TDynamicNodeResolverBase>;
+
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::NAMESERVICE;
- }
-
+ }
+
TDynamicNodeResolverBase(TActorId owner, ui32 nodeId, TDynamicConfigPtr config,
TAutoPtr<IEventHandle> origRequest, TInstant deadline)
- : Owner(owner)
- , NodeId(nodeId)
- , Config(config)
- , OrigRequest(origRequest)
+ : Owner(owner)
+ , NodeId(nodeId)
+ , Config(config)
+ , OrigRequest(origRequest)
, Deadline(deadline)
- {
- }
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- CFunc(TEvTabletPipe::EvClientDestroyed, ReplyWithErrorAndDie);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- HFunc(TEvNodeBroker::TEvResolvedNode, Handle);
+ {
+ }
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ CFunc(TEvTabletPipe::EvClientDestroyed, ReplyWithErrorAndDie);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ HFunc(TEvNodeBroker::TEvResolvedNode, Handle);
CFunc(TEvents::TSystem::Wakeup, ReplyWithErrorAndDie);
- }
- }
-
- void Bootstrap(const TActorContext &ctx);
- void Die(const TActorContext &ctx) override;
-
- virtual void OnSuccess(const TActorContext &ctx)
- {
- Y_UNUSED(ctx);
- }
-
- virtual void OnError(const TActorContext &ctx)
- {
- Y_UNUSED(ctx);
- }
-
-private:
- void ReplyWithErrorAndDie(const TActorContext &ctx);
- void Handle(TEvNodeBroker::TEvResolvedNode::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx);
-
-protected:
+ }
+ }
+
+ void Bootstrap(const TActorContext &ctx);
+ void Die(const TActorContext &ctx) override;
+
+ virtual void OnSuccess(const TActorContext &ctx)
+ {
+ Y_UNUSED(ctx);
+ }
+
+ virtual void OnError(const TActorContext &ctx)
+ {
+ Y_UNUSED(ctx);
+ }
+
+private:
+ void ReplyWithErrorAndDie(const TActorContext &ctx);
+ void Handle(TEvNodeBroker::TEvResolvedNode::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx);
+
+protected:
TActorId Owner;
- ui32 NodeId;
- TDynamicConfigPtr Config;
- TAutoPtr<IEventHandle> OrigRequest;
+ ui32 NodeId;
+ TDynamicConfigPtr Config;
+ TAutoPtr<IEventHandle> OrigRequest;
const TInstant Deadline;
-
-private:
+
+private:
TActorId NodeBrokerPipe;
-};
-
-class TDynamicNodeResolver : public TDynamicNodeResolverBase {
-public:
+};
+
+class TDynamicNodeResolver : public TDynamicNodeResolverBase {
+public:
TDynamicNodeResolver(TActorId owner, ui32 nodeId, TDynamicConfigPtr config,
TAutoPtr<IEventHandle> origRequest, TInstant deadline)
: TDynamicNodeResolverBase(owner, nodeId, config, origRequest, deadline)
- {
- }
-
- void OnSuccess(const TActorContext &ctx) override;
- void OnError(const TActorContext &ctx) override;
-};
-
-class TDynamicNodeSearcher : public TDynamicNodeResolverBase {
-public:
+ {
+ }
+
+ void OnSuccess(const TActorContext &ctx) override;
+ void OnError(const TActorContext &ctx) override;
+};
+
+class TDynamicNodeSearcher : public TDynamicNodeResolverBase {
+public:
TDynamicNodeSearcher(TActorId owner, ui32 nodeId, TDynamicConfigPtr config,
TAutoPtr<IEventHandle> origRequest, TInstant deadline)
: TDynamicNodeResolverBase(owner, nodeId, config, origRequest, deadline)
- {
- }
-
- void OnSuccess(const TActorContext &ctx) override;
- void OnError(const TActorContext &ctx) override;
-};
-
-class TDynamicNameserver : public TActorBootstrapped<TDynamicNameserver> {
-public:
- using TBase = TActorBootstrapped<TDynamicNameserver>;
-
+ {
+ }
+
+ void OnSuccess(const TActorContext &ctx) override;
+ void OnError(const TActorContext &ctx) override;
+};
+
+class TDynamicNameserver : public TActorBootstrapped<TDynamicNameserver> {
+public:
+ using TBase = TActorBootstrapped<TDynamicNameserver>;
+
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::NAMESERVICE;
- }
-
- struct TEvPrivate {
- enum EEv {
- EvUpdateEpoch = EventSpaceBegin(TEvents::ES_PRIVATE),
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
-
- struct TEvUpdateEpoch : public TEventLocal<TEvUpdateEpoch, EvUpdateEpoch> {
- TEvUpdateEpoch(ui32 domain, ui64 epoch)
- : Domain(domain)
- , Epoch(epoch)
- {
- }
-
- ui32 Domain;
- ui64 Epoch;
- };
- };
-
+ }
+
+ struct TEvPrivate {
+ enum EEv {
+ EvUpdateEpoch = EventSpaceBegin(TEvents::ES_PRIVATE),
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
+
+ struct TEvUpdateEpoch : public TEventLocal<TEvUpdateEpoch, EvUpdateEpoch> {
+ TEvUpdateEpoch(ui32 domain, ui64 epoch)
+ : Domain(domain)
+ , Epoch(epoch)
+ {
+ }
+
+ ui32 Domain;
+ ui64 Epoch;
+ };
+ };
+
TDynamicNameserver(const TIntrusivePtr<TTableNameserverSetup> &setup, ui32 resolvePoolId)
- : StaticConfig(setup)
- , ResolvePoolId(resolvePoolId)
- {
- Y_VERIFY(StaticConfig->IsEntriesUnique());
-
- for (size_t i = 0; i < DynamicConfigs.size(); ++i)
- DynamicConfigs[i] = new TDynamicConfig;
- }
-
- TDynamicNameserver(const TIntrusivePtr<TTableNameserverSetup> &setup,
+ : StaticConfig(setup)
+ , ResolvePoolId(resolvePoolId)
+ {
+ Y_VERIFY(StaticConfig->IsEntriesUnique());
+
+ for (size_t i = 0; i < DynamicConfigs.size(); ++i)
+ DynamicConfigs[i] = new TDynamicConfig;
+ }
+
+ TDynamicNameserver(const TIntrusivePtr<TTableNameserverSetup> &setup,
const NKikimrNodeBroker::TNodeInfo &node,
const TDomainsInfo &domains,
ui32 resolvePoolId)
- : TDynamicNameserver(setup, resolvePoolId)
- {
+ : TDynamicNameserver(setup, resolvePoolId)
+ {
ui32 domain = NodeIdToDomain(node.GetNodeId(), domains);
- TDynamicConfig::TDynamicNodeInfo info(node);
- DynamicConfigs[domain]->DynamicNodes.emplace(node.GetNodeId(), info);
- }
-
- STFUNC(StateFunc) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvInterconnect::TEvResolveNode, Handle);
- HFunc(TEvResolveAddress, Handle);
- HFunc(TEvInterconnect::TEvListNodes, Handle);
- HFunc(TEvInterconnect::TEvGetNode, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
- HFunc(TEvNodeBroker::TEvNodesInfo, Handle);
- HFunc(TEvPrivate::TEvUpdateEpoch, Handle);
- HFunc(NMon::TEvHttpInfo, Handle);
- }
- }
-
- void Bootstrap(const TActorContext &ctx);
- void Die(const TActorContext &ctx) override;
-
-private:
- void OpenPipe(ui32 domain,
- const TActorContext &ctx);
- void RequestEpochUpdate(ui32 domain,
- ui32 epoch,
- const TActorContext &ctx);
+ TDynamicConfig::TDynamicNodeInfo info(node);
+ DynamicConfigs[domain]->DynamicNodes.emplace(node.GetNodeId(), info);
+ }
+
+ STFUNC(StateFunc) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvInterconnect::TEvResolveNode, Handle);
+ HFunc(TEvResolveAddress, Handle);
+ HFunc(TEvInterconnect::TEvListNodes, Handle);
+ HFunc(TEvInterconnect::TEvGetNode, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ HFunc(TEvNodeBroker::TEvNodesInfo, Handle);
+ HFunc(TEvPrivate::TEvUpdateEpoch, Handle);
+ HFunc(NMon::TEvHttpInfo, Handle);
+ }
+ }
+
+ void Bootstrap(const TActorContext &ctx);
+ void Die(const TActorContext &ctx) override;
+
+private:
+ void OpenPipe(ui32 domain,
+ const TActorContext &ctx);
+ void RequestEpochUpdate(ui32 domain,
+ ui32 epoch,
+ const TActorContext &ctx);
void ResolveStaticNode(ui32 nodeId, TActorId sender, TInstant deadline, const TActorContext &ctx);
void ResolveDynamicNode(ui32 nodeId, TAutoPtr<IEventHandle> ev, TInstant deadline, const TActorContext &ctx);
void SendNodesList(const TActorContext &ctx);
void PendingRequestAnswered(ui32 domain, const TActorContext &ctx);
- void UpdateState(const NKikimrNodeBroker::TNodesInfo &rec,
- const TActorContext &ctx);
-
- void OnPipeDestroyed(ui32 domain,
- const TActorContext &ctx);
-
+ void UpdateState(const NKikimrNodeBroker::TNodesInfo &rec,
+ const TActorContext &ctx);
+
+ void OnPipeDestroyed(ui32 domain,
+ const TActorContext &ctx);
+
void Handle(TEvInterconnect::TEvResolveNode::TPtr &ev, const TActorContext &ctx);
void Handle(TEvResolveAddress::TPtr &ev, const TActorContext &ctx);
void Handle(TEvInterconnect::TEvListNodes::TPtr &ev, const TActorContext &ctx);
void Handle(TEvInterconnect::TEvGetNode::TPtr &ev, const TActorContext &ctx);
void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx);
void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvNodeBroker::TEvNodesInfo::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvUpdateEpoch::TPtr &ev, const TActorContext &ctx);
- void Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx);
-
-private:
- TIntrusivePtr<TTableNameserverSetup> StaticConfig;
- std::array<TDynamicConfigPtr, DOMAINS_COUNT> DynamicConfigs;
+ void Handle(TEvNodeBroker::TEvNodesInfo::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvUpdateEpoch::TPtr &ev, const TActorContext &ctx);
+ void Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx);
+
+private:
+ TIntrusivePtr<TTableNameserverSetup> StaticConfig;
+ std::array<TDynamicConfigPtr, DOMAINS_COUNT> DynamicConfigs;
TVector<TActorId> ListNodesQueue;
std::array<TActorId, DOMAINS_COUNT> NodeBrokerPipes;
- // When ListNodes requests are sent to NodeBroker tablets this
- // bitmap indicates domains which didn't answer yet.
+ // When ListNodes requests are sent to NodeBroker tablets this
+ // bitmap indicates domains which didn't answer yet.
TBitMap<DOMAINS_COUNT> PendingRequests;
- // Domain -> Epoch ID.
- THashMap<ui32, ui64> EpochUpdates;
- ui32 ResolvePoolId;
-};
-
-} // NNodeBroker
-} // NKikimr
+ // Domain -> Epoch ID.
+ THashMap<ui32, ui64> EpochUpdates;
+ ui32 ResolvePoolId;
+};
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/dynamic_nameserver_mon.cpp b/ydb/core/mind/dynamic_nameserver_mon.cpp
index 2d110c73511..65a3b9664e4 100644
--- a/ydb/core/mind/dynamic_nameserver_mon.cpp
+++ b/ydb/core/mind/dynamic_nameserver_mon.cpp
@@ -1,195 +1,195 @@
-#include "dynamic_nameserver_impl.h"
-
+#include "dynamic_nameserver_impl.h"
+
#include <ydb/core/base/appdata.h>
#include <ydb/core/base/location.h>
-
+
#include <library/cpp/monlib/service/pages/templates.h>
-
-#include <util/generic/set.h>
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-namespace {
-
-TString ToString(TInstant t)
-{
- if (t == TInstant::Max())
- return "NEVER";
- return t.FormatLocalTime("%d %b %Y %H:%M:%S %Z");
-}
-
-void OutputStaticContent(IOutputStream &str)
-{
- str << R"__(
- <style>
- .right-align {
- text-align: right;
- }
-
- .center-align {
- text-align: center;
- }
-
- table {
- margin-top: 20px;
- }
-
- table.nodes {
- border-bottom-style: solid;
- border-top-style: solid;
- border-width: 1px;
- border-color: darkgrey;
- }
-
- caption {
- font-size: 120%;
- color: black;
- padding: 0px 0px 0px 10px;
- }
-
- thead {
- border-bottom-style: solid;
- border-width: 1px;
- border-color: darkgrey;
- }
-
- th {
- font-weight: 700;
- padding-left: 10px;
- padding-right: 10px;
- }
-
- td {
- padding-left: 5px;
- padding-right: 5px;
- }
-
- .gray {
- color: gray;
- }
- </style>
- )__";
-}
-
-void OutputNodeInfo(ui32 nodeId,
- const TTableNameserverSetup::TNodeInfo &info,
- IOutputStream &str,
- TInstant expire = TInstant::Zero(),
- const TString &cl = "")
-{
- str << "<tr class='" << cl << "'>" << Endl
- << " <td>" << nodeId << "</td>" << Endl
- << " <td>" << info.Host << ":" << info.Port << "</td>" << Endl
- << " <td>" << info.ResolveHost << "</td>" << Endl
- << " <td>" << info.Address << "</td>" << Endl
+
+#include <util/generic/set.h>
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+namespace {
+
+TString ToString(TInstant t)
+{
+ if (t == TInstant::Max())
+ return "NEVER";
+ return t.FormatLocalTime("%d %b %Y %H:%M:%S %Z");
+}
+
+void OutputStaticContent(IOutputStream &str)
+{
+ str << R"__(
+ <style>
+ .right-align {
+ text-align: right;
+ }
+
+ .center-align {
+ text-align: center;
+ }
+
+ table {
+ margin-top: 20px;
+ }
+
+ table.nodes {
+ border-bottom-style: solid;
+ border-top-style: solid;
+ border-width: 1px;
+ border-color: darkgrey;
+ }
+
+ caption {
+ font-size: 120%;
+ color: black;
+ padding: 0px 0px 0px 10px;
+ }
+
+ thead {
+ border-bottom-style: solid;
+ border-width: 1px;
+ border-color: darkgrey;
+ }
+
+ th {
+ font-weight: 700;
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+
+ td {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+
+ .gray {
+ color: gray;
+ }
+ </style>
+ )__";
+}
+
+void OutputNodeInfo(ui32 nodeId,
+ const TTableNameserverSetup::TNodeInfo &info,
+ IOutputStream &str,
+ TInstant expire = TInstant::Zero(),
+ const TString &cl = "")
+{
+ str << "<tr class='" << cl << "'>" << Endl
+ << " <td>" << nodeId << "</td>" << Endl
+ << " <td>" << info.Host << ":" << info.Port << "</td>" << Endl
+ << " <td>" << info.ResolveHost << "</td>" << Endl
+ << " <td>" << info.Address << "</td>" << Endl
<< " <td>" << info.Location.GetDataCenterId() << "</td>" << Endl
<< " <td>" << info.Location.ToString() << "</td>" << Endl;
- if (expire)
- str << "<td>" << ToString(expire) << "</td>" << Endl;
- str << "</tr>" << Endl;
-}
-
-void OutputStaticNodes(const TTableNameserverSetup &setup,
- IOutputStream &str)
-{
- str << "<div><table class='nodes'>" << Endl
- << " <caption>Static nodes</caption>" << Endl
- << " <thead>" << Endl
- << " <tr>" << Endl
- << " <th>Node ID</th>" << Endl
- << " <th>Host</th>" << Endl
- << " <th>Resolve Host</th>" << Endl
- << " <th>Address</th>" << Endl
- << " <th>Data Center</th>" << Endl
+ if (expire)
+ str << "<td>" << ToString(expire) << "</td>" << Endl;
+ str << "</tr>" << Endl;
+}
+
+void OutputStaticNodes(const TTableNameserverSetup &setup,
+ IOutputStream &str)
+{
+ str << "<div><table class='nodes'>" << Endl
+ << " <caption>Static nodes</caption>" << Endl
+ << " <thead>" << Endl
+ << " <tr>" << Endl
+ << " <th>Node ID</th>" << Endl
+ << " <th>Host</th>" << Endl
+ << " <th>Resolve Host</th>" << Endl
+ << " <th>Address</th>" << Endl
+ << " <th>Data Center</th>" << Endl
<< " <th>Location</th>" << Endl
- << " </tr>" << Endl
- << " </thead>" << Endl
- << " <tbody class='center-align'>" << Endl;
- for (auto &pr : setup.StaticNodeTable)
- OutputNodeInfo(pr.first, pr.second, str);
- str << " </tbody>" << Endl
- << "</table></div>" << Endl;
-}
-
-void OutputDynamicNodes(const TString &domain,
- TDynamicConfigPtr config,
- IOutputStream &str)
-{
- str << "<div><table class='nodes'>" << Endl
- << " <caption>Dynamic nodes in " << domain
- << " (epoch #" << config->Epoch.Id << "." << config->Epoch.Version
- << " expiring " << ToString(config->Epoch.End) << ")</caption>" << Endl
- << " <thead>" << Endl
- << " <tr>" << Endl
- << " <th>Node ID</th>" << Endl
- << " <th>Host</th>" << Endl
- << " <th>Resolve Host</th>" << Endl
- << " <th>Address</th>" << Endl
- << " <th>Data Center</th>" << Endl
- << " <th>Room</th>" << Endl
- << " <th>Rack</th>" << Endl
- << " <th>Body</th>" << Endl
- << " <th>Expire</th>" << Endl
- << " </tr>" << Endl
- << " </thead>" << Endl
- << " <tbody class='center-align'>" << Endl;
-
- TSet<ui32> ids;
- for (auto &pr : config->DynamicNodes)
- ids.insert(pr.first);
- for (auto id : ids) {
- auto &node = config->DynamicNodes.at(id);
- OutputNodeInfo(id, node, str, node.Expire);
- }
-
- ids.clear();
- for (auto &pr : config->ExpiredNodes)
- ids.insert(pr.first);
- for (auto id : ids) {
- auto &node = config->ExpiredNodes.at(id);
- OutputNodeInfo(id, node, str, node.Expire, "gray");
- }
-
- str << " </tbody>" << Endl
- << "</table></div>" << Endl;
-}
-
-} // anonymous namespace
-
-void TDynamicNameserver::Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx)
-{
- TStringStream str;
- HTML(str) {
- OutputStaticContent(str);
-
- auto config = AppData(ctx)->DynamicNameserviceConfig;
- if (config)
- str << "<div><table class='config'>" << Endl
- << " <caption>Config</caption>" << Endl
- << " <tbody>" << Endl
- << " <tr>" << Endl
- << " <td class='right-align'>Max static node ID:</td>" << Endl
- << " <td>" << config->MaxStaticNodeId << "</td>" << Endl
- << " </tr>" << Endl
- << " <tr>" << Endl
- << " <td class='right-align'>Max dynamic node ID:</td>" << Endl
- << " <td>" << config->MaxDynamicNodeId << "</td>" << Endl
- << " </tr>" << Endl
- << " </tbody>" << Endl
- << "</table></div>" << Endl;
-
- OutputStaticNodes(*StaticConfig, str);
-
- auto dinfo = AppData(ctx)->DomainsInfo;
- for (auto &pr : dinfo->Domains) {
- auto name = pr.second->Name;
- auto config = DynamicConfigs[pr.first];
- OutputDynamicNodes(name, config, str);
- }
- }
- ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str()));
-}
-
-} // NNodeBroker
-} // NKikimr
+ << " </tr>" << Endl
+ << " </thead>" << Endl
+ << " <tbody class='center-align'>" << Endl;
+ for (auto &pr : setup.StaticNodeTable)
+ OutputNodeInfo(pr.first, pr.second, str);
+ str << " </tbody>" << Endl
+ << "</table></div>" << Endl;
+}
+
+void OutputDynamicNodes(const TString &domain,
+ TDynamicConfigPtr config,
+ IOutputStream &str)
+{
+ str << "<div><table class='nodes'>" << Endl
+ << " <caption>Dynamic nodes in " << domain
+ << " (epoch #" << config->Epoch.Id << "." << config->Epoch.Version
+ << " expiring " << ToString(config->Epoch.End) << ")</caption>" << Endl
+ << " <thead>" << Endl
+ << " <tr>" << Endl
+ << " <th>Node ID</th>" << Endl
+ << " <th>Host</th>" << Endl
+ << " <th>Resolve Host</th>" << Endl
+ << " <th>Address</th>" << Endl
+ << " <th>Data Center</th>" << Endl
+ << " <th>Room</th>" << Endl
+ << " <th>Rack</th>" << Endl
+ << " <th>Body</th>" << Endl
+ << " <th>Expire</th>" << Endl
+ << " </tr>" << Endl
+ << " </thead>" << Endl
+ << " <tbody class='center-align'>" << Endl;
+
+ TSet<ui32> ids;
+ for (auto &pr : config->DynamicNodes)
+ ids.insert(pr.first);
+ for (auto id : ids) {
+ auto &node = config->DynamicNodes.at(id);
+ OutputNodeInfo(id, node, str, node.Expire);
+ }
+
+ ids.clear();
+ for (auto &pr : config->ExpiredNodes)
+ ids.insert(pr.first);
+ for (auto id : ids) {
+ auto &node = config->ExpiredNodes.at(id);
+ OutputNodeInfo(id, node, str, node.Expire, "gray");
+ }
+
+ str << " </tbody>" << Endl
+ << "</table></div>" << Endl;
+}
+
+} // anonymous namespace
+
+void TDynamicNameserver::Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx)
+{
+ TStringStream str;
+ HTML(str) {
+ OutputStaticContent(str);
+
+ auto config = AppData(ctx)->DynamicNameserviceConfig;
+ if (config)
+ str << "<div><table class='config'>" << Endl
+ << " <caption>Config</caption>" << Endl
+ << " <tbody>" << Endl
+ << " <tr>" << Endl
+ << " <td class='right-align'>Max static node ID:</td>" << Endl
+ << " <td>" << config->MaxStaticNodeId << "</td>" << Endl
+ << " </tr>" << Endl
+ << " <tr>" << Endl
+ << " <td class='right-align'>Max dynamic node ID:</td>" << Endl
+ << " <td>" << config->MaxDynamicNodeId << "</td>" << Endl
+ << " </tr>" << Endl
+ << " </tbody>" << Endl
+ << "</table></div>" << Endl;
+
+ OutputStaticNodes(*StaticConfig, str);
+
+ auto dinfo = AppData(ctx)->DomainsInfo;
+ for (auto &pr : dinfo->Domains) {
+ auto name = pr.second->Name;
+ auto config = DynamicConfigs[pr.first];
+ OutputDynamicNodes(name, config, str);
+ }
+ }
+ ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str()));
+}
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/hive/hive_impl.cpp b/ydb/core/mind/hive/hive_impl.cpp
index 12526f3edb8..58ca2ac3e43 100644
--- a/ydb/core/mind/hive/hive_impl.cpp
+++ b/ydb/core/mind/hive/hive_impl.cpp
@@ -7,7 +7,7 @@
#include <ydb/core/util/yverify_stream.h>
#include <library/cpp/actors/interconnect/interconnect.h>
#include <util/generic/array_ref.h>
-
+
template <>
inline IOutputStream& operator <<(IOutputStream& out, const TArrayRef<const NKikimrHive::TDataCentersGroup*>& vec) {
out << '[';
@@ -509,11 +509,11 @@ void THive::OnTabletDead(TEvTablet::TEvTabletDead::TPtr&, const TActorContext&)
}
void THive::BuildLocalConfig() {
- LocalConfig.Clear();
- if (ResourceProfiles)
- ResourceProfiles->StoreProfiles(*LocalConfig.MutableResourceProfiles());
-}
-
+ LocalConfig.Clear();
+ if (ResourceProfiles)
+ ResourceProfiles->StoreProfiles(*LocalConfig.MutableResourceProfiles());
+}
+
void THive::BuildCurrentConfig() {
BLOG_D("THive::BuildCurrentConfig ClusterConfig = " << ClusterConfig.ShortDebugString());
CurrentConfig = ClusterConfig;
@@ -630,11 +630,11 @@ void THive::Handle(TEvInterconnect::TEvNodeInfo::TPtr &ev) {
}
}
}
-}
-
+}
+
void THive::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev) {
THashSet<TDataCenterId> dataCenters;
- for (const TEvInterconnect::TNodeInfo& node : ev->Get()->Nodes) {
+ for (const TEvInterconnect::TNodeInfo& node : ev->Get()->Nodes) {
NodesInfo[node.NodeId] = node;
dataCenters.insert(node.Location.GetDataCenterId());
}
@@ -838,7 +838,7 @@ void THive::OnActivateExecutor(const TActorContext&) {
RootDomainName = "/" + domain.Name;
Executor()->RegisterExternalTabletCounters(TabletCountersPtr);
ResourceProfiles = AppData()->ResourceProfiles ? AppData()->ResourceProfiles : new TResourceProfiles;
- BuildLocalConfig();
+ BuildLocalConfig();
ClusterConfig = AppData()->HiveConfig;
Send(NConsole::MakeConfigsDispatcherID(SelfId().NodeId()),
new NConsole::TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest(NKikimrConsole::TConfigItem::HiveConfigItem));
@@ -1281,9 +1281,9 @@ THive::TBestNodeResult THive::FindBestNode(const TTabletInfo& tablet) {
}
const TNodeLocation& THive::GetNodeLocation(TNodeId nodeId) const {
- auto it = NodesInfo.find(nodeId);
- if (it != NodesInfo.end())
- return it->second.Location;
+ auto it = NodesInfo.find(nodeId);
+ if (it != NodesInfo.end())
+ return it->second.Location;
static TNodeLocation defaultLocation;
return defaultLocation;
}
diff --git a/ydb/core/mind/hive/hive_impl.h b/ydb/core/mind/hive/hive_impl.h
index 0d0cf8f77c3..70c4530fee0 100644
--- a/ydb/core/mind/hive/hive_impl.h
+++ b/ydb/core/mind/hive/hive_impl.h
@@ -357,7 +357,7 @@ protected:
bool ProcessBootQueueScheduled = false;
bool ProcessBootQueuePostponed = false;
- THashMap<ui32, TEvInterconnect::TNodeInfo> NodesInfo;
+ THashMap<ui32, TEvInterconnect::TNodeInfo> NodesInfo;
TTabletCountersBase* TabletCounters;
TAutoPtr<TTabletCountersBase> TabletCountersPtr;
i32 BalancerProgress; // all values below 0 mean that balancer is not active (-1 = dead, -2 = starting)
@@ -382,7 +382,7 @@ protected:
//TDuration ResourceChangeReactionPeriod = TDuration::Seconds(10);
TVector<ISubActor*> SubActors;
TResourceProfilesPtr ResourceProfiles;
- NKikimrLocal::TLocalConfig LocalConfig;
+ NKikimrLocal::TLocalConfig LocalConfig;
bool ReadyForConnections = false; // is Hive ready for incoming connections?
ui64 NextTabletUnlockSeqNo = 1; // sequence number for unlock events
bool SpreadNeighbours = true; // spread tablets of the same object across cluster
@@ -429,7 +429,7 @@ protected:
return true;
}
- void BuildLocalConfig();
+ void BuildLocalConfig();
void BuildCurrentConfig();
void Cleanup();
@@ -774,7 +774,7 @@ protected:
THiveStats GetStats() const;
void RemoveSubActor(ISubActor* subActor);
- const NKikimrLocal::TLocalConfig &GetLocalConfig() const { return LocalConfig; }
+ const NKikimrLocal::TLocalConfig &GetLocalConfig() const { return LocalConfig; }
NKikimrTabletBase::TMetrics GetDefaultResourceValuesForObject(TObjectId objectId);
NKikimrTabletBase::TMetrics GetDefaultResourceValuesForTabletType(TTabletTypes::EType type);
NKikimrTabletBase::TMetrics GetDefaultResourceValuesForProfile(TTabletTypes::EType type, const TString& resourceProfile);
diff --git a/ydb/core/mind/hive/hive_ut.cpp b/ydb/core/mind/hive/hive_ut.cpp
index bca7b6d645a..0383d49a123 100644
--- a/ydb/core/mind/hive/hive_ut.cpp
+++ b/ydb/core/mind/hive/hive_ut.cpp
@@ -44,7 +44,7 @@ static constexpr bool ENABLE_DETAILED_HIVE_LOG = true;
#else
static constexpr bool ENABLE_DETAILED_HIVE_LOG = false;
#endif
-const char *DOMAIN_NAME = "dc-1";
+const char *DOMAIN_NAME = "dc-1";
namespace NKikimr {
namespace {
@@ -228,7 +228,7 @@ namespace {
TTenantPoolConfig::TPtr tenantPoolConfig = new TTenantPoolConfig(localConfig);
tenantPoolConfig->AddStaticSlot(DOMAIN_NAME);
- runtime.AddLocalService(MakeTenantPoolRootID(), TActorSetupCmd(
+ runtime.AddLocalService(MakeTenantPoolRootID(), TActorSetupCmd(
CreateTenantPool(tenantPoolConfig), TMailboxType::Revolving, 0), nodeIndex);
}
}
@@ -641,13 +641,13 @@ Y_UNIT_TEST_SUITE(THiveTest) {
TMailboxType::Simple, 0,
TMailboxType::Simple, 0);
}
- TTenantPoolConfig::TPtr tenantPoolConfig = new TTenantPoolConfig(localConfig);
- tenantPoolConfig->AddStaticSlot(DOMAIN_NAME);
+ TTenantPoolConfig::TPtr tenantPoolConfig = new TTenantPoolConfig(localConfig);
+ tenantPoolConfig->AddStaticSlot(DOMAIN_NAME);
TActorId actorId = runtime.Register(
- CreateTenantPool(tenantPoolConfig), nodeIndex, 0, TMailboxType::Revolving, 0);
+ CreateTenantPool(tenantPoolConfig), nodeIndex, 0, TMailboxType::Revolving, 0);
runtime.EnableScheduleForActor(actorId, true);
- runtime.RegisterService(MakeTenantPoolRootID(), actorId, nodeIndex);
+ runtime.RegisterService(MakeTenantPoolRootID(), actorId, nodeIndex);
}
void CreateLocalForTenant(TTestActorRuntime &runtime, ui32 nodeIndex, const TString& tenant) {
@@ -2051,16 +2051,16 @@ Y_UNIT_TEST_SUITE(THiveTest) {
// Start local only when transaction is complete
{
- TLocalConfig::TPtr localConfig(new TLocalConfig());
+ TLocalConfig::TPtr localConfig(new TLocalConfig());
localConfig->TabletClassInfo[TTabletTypes::Dummy].SetupInfo = new TTabletSetupInfo(&CreateFlatDummyTablet,
TMailboxType::Simple, 0,
TMailboxType::Simple, 0);
- TTenantPoolConfig::TPtr tenantPoolConfig = new TTenantPoolConfig(localConfig);
- tenantPoolConfig->AddStaticSlot(DOMAIN_NAME);
+ TTenantPoolConfig::TPtr tenantPoolConfig = new TTenantPoolConfig(localConfig);
+ tenantPoolConfig->AddStaticSlot(DOMAIN_NAME);
TActorId actorId = runtime.Register(CreateTenantPool(tenantPoolConfig));
runtime.EnableScheduleForActor(actorId, true);
- runtime.RegisterService(MakeTenantPoolRootID(), actorId);
+ runtime.RegisterService(MakeTenantPoolRootID(), actorId);
}
MakeSureTabletIsUp(runtime, tabletId, 0);
@@ -2983,7 +2983,7 @@ Y_UNIT_TEST_SUITE(THiveTest) {
tablets.emplace_back(tabletId);
}
- // checking distribution, new tablets should go to less loaded nodes (7,6,5)
+ // checking distribution, new tablets should go to less loaded nodes (7,6,5)
{
std::array<int, NUM_NODES> nodeTablets = {};
{
diff --git a/ydb/core/mind/labels_maintainer.cpp b/ydb/core/mind/labels_maintainer.cpp
index d96e0d09cb4..19138c7d23b 100644
--- a/ydb/core/mind/labels_maintainer.cpp
+++ b/ydb/core/mind/labels_maintainer.cpp
@@ -1,122 +1,122 @@
-#include "labels_maintainer.h"
-#include "tenant_pool.h"
-
+#include "labels_maintainer.h"
+#include "tenant_pool.h"
+
#include <ydb/core/base/counters.h>
#include <ydb/core/cms/console/configs_dispatcher.h>
#include <ydb/core/cms/console/console.h>
-
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
#include <library/cpp/actors/core/log.h>
-
-namespace NKikimr {
-
-using namespace NConsole;
-
-class TLabelsMaintainer : public TActorBootstrapped<TLabelsMaintainer> {
- using TActorBase = TActorBootstrapped<TLabelsMaintainer>;
-
-public:
+
+namespace NKikimr {
+
+using namespace NConsole;
+
+class TLabelsMaintainer : public TActorBootstrapped<TLabelsMaintainer> {
+ using TActorBase = TActorBootstrapped<TLabelsMaintainer>;
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::LABELS_MAINTAINER_ACTOR;
- }
-
- TLabelsMaintainer(const NKikimrConfig::TMonitoringConfig &config)
+ }
+
+ TLabelsMaintainer(const NKikimrConfig::TMonitoringConfig &config)
: InitializedLocalOptions(false)
, CurrentHostLabel("")
- {
- ParseConfig(config);
- }
-
- STFUNC(StateWork) {
- TRACE_EVENT(NKikimrServices::LABELS_MAINTAINER);
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
- HFunc(TEvTenantPool::TEvTenantPoolStatus, Handle);
- IgnoreFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
- ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- LOG_DEBUG(ctx, NKikimrServices::LABELS_MAINTAINER, "Bootstrap");
-
- Send(MakeTenantPoolRootID(), new TEvents::TEvSubscribe);
- SubscribeForConfig(ctx);
+ {
+ ParseConfig(config);
+ }
+
+ STFUNC(StateWork) {
+ TRACE_EVENT(NKikimrServices::LABELS_MAINTAINER);
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvConsole::TEvConfigNotificationRequest, Handle);
+ HFunc(TEvTenantPool::TEvTenantPoolStatus, Handle);
+ IgnoreFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
+ break;
+ }
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ LOG_DEBUG(ctx, NKikimrServices::LABELS_MAINTAINER, "Bootstrap");
+
+ Send(MakeTenantPoolRootID(), new TEvents::TEvSubscribe);
+ SubscribeForConfig(ctx);
ReportHistoryCounter(ctx);
-
- Become(&TThis::StateWork);
- }
-
-private:
- void SubscribeForConfig(const TActorContext &ctx)
- {
- auto kind = (ui32)NKikimrConsole::TConfigItem::MonitoringConfigItem;
- ctx.Send(MakeConfigsDispatcherID(ctx.SelfID.NodeId()),
- new TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest(kind));
- }
-
- /**
- * Add or update tenant labels for service counters.
- * List of affected services is obtained via GetTenantSensorServices.
- * If there is a single tenant assigned then tenant label holds its
- * name. If multiple tenants are attached then tenant label is 'multiple'.
- * If no tenant is attached then tenant label becomes 'none'.
- * If dynamic tenant is attached then there is an attached slot name to
- * be used for slot label. Otherwise slot type is used as slot label
- *('static' or 'dynamic').
- *
- * If ForceDatabaseLabels is set to 'false' then labels for unassigned
- * nodes and nodes assigned to domain are omitted.
- */
- void UpdateDatabaseLabels(const TActorContext &ctx)
- {
- auto res = RecomputeLabels();
- if (res.first) {
- RemoveLabels(ctx);
- ResetDerivCounters(ctx);
- AddLabels(ctx);
- } else if (res.second) {
- ResetDerivCounters(ctx);
- }
- }
-
- std::pair<bool, bool> RecomputeLabels()
- {
- THashSet<TString> tenants;
- THashMap<TString, TString> attrs;
- TString database;
+
+ Become(&TThis::StateWork);
+ }
+
+private:
+ void SubscribeForConfig(const TActorContext &ctx)
+ {
+ auto kind = (ui32)NKikimrConsole::TConfigItem::MonitoringConfigItem;
+ ctx.Send(MakeConfigsDispatcherID(ctx.SelfID.NodeId()),
+ new TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest(kind));
+ }
+
+ /**
+ * Add or update tenant labels for service counters.
+ * List of affected services is obtained via GetTenantSensorServices.
+ * If there is a single tenant assigned then tenant label holds its
+ * name. If multiple tenants are attached then tenant label is 'multiple'.
+ * If no tenant is attached then tenant label becomes 'none'.
+ * If dynamic tenant is attached then there is an attached slot name to
+ * be used for slot label. Otherwise slot type is used as slot label
+ *('static' or 'dynamic').
+ *
+ * If ForceDatabaseLabels is set to 'false' then labels for unassigned
+ * nodes and nodes assigned to domain are omitted.
+ */
+ void UpdateDatabaseLabels(const TActorContext &ctx)
+ {
+ auto res = RecomputeLabels();
+ if (res.first) {
+ RemoveLabels(ctx);
+ ResetDerivCounters(ctx);
+ AddLabels(ctx);
+ } else if (res.second) {
+ ResetDerivCounters(ctx);
+ }
+ }
+
+ std::pair<bool, bool> RecomputeLabels()
+ {
+ THashSet<TString> tenants;
+ THashMap<TString, TString> attrs;
+ TString database;
TString host = "";
- TString slot;
-
- for (auto &slotStatus : CurrentStatus.GetSlots()) {
- if (!slotStatus.GetAssignedTenant())
- continue;
- slot = slotStatus.GetLabel();
- for (auto &attr : slotStatus.GetTenantAttributes())
- attrs[attr.GetKey()] = attr.GetValue();
- tenants.insert(slotStatus.GetAssignedTenant());
- }
-
- if (tenants.empty()) {
+ TString slot;
+
+ for (auto &slotStatus : CurrentStatus.GetSlots()) {
+ if (!slotStatus.GetAssignedTenant())
+ continue;
+ slot = slotStatus.GetLabel();
+ for (auto &attr : slotStatus.GetTenantAttributes())
+ attrs[attr.GetKey()] = attr.GetValue();
+ tenants.insert(slotStatus.GetAssignedTenant());
+ }
+
+ if (tenants.empty()) {
host = ForceDatabaseLabels ? "unassigned": "";
database = ForceDatabaseLabels ? NoneDatabasetLabelValue : "";
- } else if (tenants.size() == 1) {
- database = *tenants.begin();
- TString domain = TString(ExtractDomain(database));
- if (IsEqualPaths(database, domain)) {
- if (ForceDatabaseLabels)
- database = CanonizePath(database);
- else {
- database = "";
- }
- }
+ } else if (tenants.size() == 1) {
+ database = *tenants.begin();
+ TString domain = TString(ExtractDomain(database));
+ if (IsEqualPaths(database, domain)) {
+ if (ForceDatabaseLabels)
+ database = CanonizePath(database);
+ else {
+ database = "";
+ }
+ }
if (slot.StartsWith("slot-")) {
// dynamic slot
host = slot;
@@ -127,62 +127,62 @@ private:
if (!HostLabelOverride.empty())
host = HostLabelOverride;
}
- } else {
+ } else {
host = "multiple";
- database = MultipleDatabaseLabelValue;
- attrs.clear();
- }
-
- std::pair<bool, bool> res;
- res.first = (CurrentDatabaseLabel != database
+ database = MultipleDatabaseLabelValue;
+ attrs.clear();
+ }
+
+ std::pair<bool, bool> res;
+ res.first = (CurrentDatabaseLabel != database
|| CurrentHostLabel != host
- || CurrentAttributes != attrs);
- res.second = CurrentTenants != tenants;
-
- CurrentDatabaseLabel = database;
+ || CurrentAttributes != attrs);
+ res.second = CurrentTenants != tenants;
+
+ CurrentDatabaseLabel = database;
CurrentHostLabel = host;
- CurrentAttributes = attrs;
- CurrentTenants = tenants;
-
- return res;
- }
-
- void ResetDerivCounters(const TActorContext &ctx)
- {
- auto root = AppData(ctx)->Counters;
- for (auto &service : DatabaseSensorServices) {
- LOG_DEBUG_S(ctx, NKikimrServices::LABELS_MAINTAINER,
- "Reset counters for " << service.data());
-
- auto serviceGroup = GetServiceCounters(root, service);
- serviceGroup->ResetCounters(true);
- }
- for (auto &service : DatabaseAttributeSensorServices) {
- LOG_DEBUG_S(ctx, NKikimrServices::LABELS_MAINTAINER,
- "Reset counters for " << service.data());
-
- auto serviceGroup = GetServiceCounters(root, service);
- serviceGroup->ResetCounters(true);
- }
- }
-
- void RemoveLabels(const TActorContext &ctx)
- {
- RemoveDatabaseLabels(ctx);
- RemoveAttributeLabels(ctx);
- }
-
- void RemoveDatabaseLabels(const TActorContext &ctx)
- {
- auto root = AppData(ctx)->Counters;
- for (auto &service : DatabaseSensorServices) {
- LOG_DEBUG_S(ctx, NKikimrServices::LABELS_MAINTAINER,
- "Removing database labels from " << service << " counters");
-
+ CurrentAttributes = attrs;
+ CurrentTenants = tenants;
+
+ return res;
+ }
+
+ void ResetDerivCounters(const TActorContext &ctx)
+ {
+ auto root = AppData(ctx)->Counters;
+ for (auto &service : DatabaseSensorServices) {
+ LOG_DEBUG_S(ctx, NKikimrServices::LABELS_MAINTAINER,
+ "Reset counters for " << service.data());
+
+ auto serviceGroup = GetServiceCounters(root, service);
+ serviceGroup->ResetCounters(true);
+ }
+ for (auto &service : DatabaseAttributeSensorServices) {
+ LOG_DEBUG_S(ctx, NKikimrServices::LABELS_MAINTAINER,
+ "Reset counters for " << service.data());
+
+ auto serviceGroup = GetServiceCounters(root, service);
+ serviceGroup->ResetCounters(true);
+ }
+ }
+
+ void RemoveLabels(const TActorContext &ctx)
+ {
+ RemoveDatabaseLabels(ctx);
+ RemoveAttributeLabels(ctx);
+ }
+
+ void RemoveDatabaseLabels(const TActorContext &ctx)
+ {
+ auto root = AppData(ctx)->Counters;
+ for (auto &service : DatabaseSensorServices) {
+ LOG_DEBUG_S(ctx, NKikimrServices::LABELS_MAINTAINER,
+ "Removing database labels from " << service << " counters");
+
ReplaceSubgroup(root, service);
- }
- }
-
+ }
+ }
+
void ReportHistoryCounter(const TActorContext &ctx)
{
if (!ProcessLocation.empty()) {
@@ -192,60 +192,60 @@ private:
}
}
- void RemoveAttributeLabels(const TActorContext &ctx)
- {
- auto root = AppData(ctx)->Counters;
- for (auto &service : DatabaseAttributeSensorServices) {
- LOG_DEBUG_S(ctx, NKikimrServices::LABELS_MAINTAINER,
- "Removing database attribute labels from " << service << " counters");
-
+ void RemoveAttributeLabels(const TActorContext &ctx)
+ {
+ auto root = AppData(ctx)->Counters;
+ for (auto &service : DatabaseAttributeSensorServices) {
+ LOG_DEBUG_S(ctx, NKikimrServices::LABELS_MAINTAINER,
+ "Removing database attribute labels from " << service << " counters");
+
ReplaceSubgroup(root, service);
- }
- }
-
- void AddLabels(const TActorContext &ctx)
- {
- AddDatabaseLabels(ctx);
- AddAttributeLabels(ctx);
- }
-
- void AddDatabaseLabels(const TActorContext &ctx)
- {
- if (!DatabaseLabelsEnabled)
- return;
-
- if (!CurrentDatabaseLabel)
- return;
-
- auto root = AppData(ctx)->Counters;
+ }
+ }
+
+ void AddLabels(const TActorContext &ctx)
+ {
+ AddDatabaseLabels(ctx);
+ AddAttributeLabels(ctx);
+ }
+
+ void AddDatabaseLabels(const TActorContext &ctx)
+ {
+ if (!DatabaseLabelsEnabled)
+ return;
+
+ if (!CurrentDatabaseLabel)
+ return;
+
+ auto root = AppData(ctx)->Counters;
TSmallVec<std::pair<TString, TString>> labels;
if (GroupAllMetrics) {
labels.push_back({DATABASE_LABEL, ""});
} else {
labels.push_back({DATABASE_LABEL, CurrentDatabaseLabel});
}
-
+
labels.push_back({SLOT_LABEL, "static"});
if (!CurrentHostLabel.empty()) {
labels.push_back({"host", CurrentHostLabel});
- }
+ }
AddLabelsToServices(ctx, labels, DatabaseSensorServices);
- }
-
+ }
+
void AddLabelsToServices(const TActorContext& ctx, const TSmallVec<std::pair<TString, TString>> &labels, const THashSet<TString> &services) {
- if (!labels.empty()) {
- auto root = AppData(ctx)->Counters;
+ if (!labels.empty()) {
+ auto root = AppData(ctx)->Counters;
for(auto &service: services) {
- LOG_DEBUG_S(ctx, NKikimrServices::LABELS_MAINTAINER,
+ LOG_DEBUG_S(ctx, NKikimrServices::LABELS_MAINTAINER,
"Add labels to service " << service << " counters"
<< " labels=" << PrintLabels(labels));
const auto &[svc, subSvc] = ExtractSubServiceName(service);
auto oldGroup = root->GetSubgroup("counters", svc);
if (!subSvc.empty())
oldGroup = oldGroup->GetSubgroup("subsystem", subSvc);
- TIntrusivePtr<NMonitoring::TDynamicCounters> serviceGroup = new NMonitoring::TDynamicCounters;
- TIntrusivePtr<NMonitoring::TDynamicCounters> curGroup = serviceGroup;
+ TIntrusivePtr<NMonitoring::TDynamicCounters> serviceGroup = new NMonitoring::TDynamicCounters;
+ TIntrusivePtr<NMonitoring::TDynamicCounters> curGroup = serviceGroup;
const auto* actualLabels = &labels;
@@ -268,10 +268,10 @@ private:
auto rt = GetServiceCountersRoot(root, service);
rt->ReplaceSubgroup(subSvc.empty() ? "counters" : "subsystem", subSvc.empty() ? svc : subSvc, serviceGroup);
- }
- }
- }
-
+ }
+ }
+ }
+
void AddAttributeLabels(const TActorContext &ctx)
{
if (!DatabaseAttributeLabelsEnabled)
@@ -285,42 +285,42 @@ private:
AddLabelsToServices(ctx, labels, DatabaseAttributeSensorServices);
}
- void ApplyConfig(const NKikimrConfig::TMonitoringConfig &config,
- const TActorContext &ctx)
- {
- RemoveLabels(ctx);
- ResetDerivCounters(ctx);
- ParseConfig(config);
- // Reset one more time because services set might change.
- ResetDerivCounters(ctx);
- RecomputeLabels();
- AddLabels(ctx);
- }
-
- void ParseConfig(const NKikimrConfig::TMonitoringConfig &config)
- {
- ForceDatabaseLabels = config.GetForceDatabaseLabels();
-
- auto &dbLabels = config.GetDatabaseLabels();
- DatabaseLabelsEnabled = dbLabels.GetEnabled();
+ void ApplyConfig(const NKikimrConfig::TMonitoringConfig &config,
+ const TActorContext &ctx)
+ {
+ RemoveLabels(ctx);
+ ResetDerivCounters(ctx);
+ ParseConfig(config);
+ // Reset one more time because services set might change.
+ ResetDerivCounters(ctx);
+ RecomputeLabels();
+ AddLabels(ctx);
+ }
+
+ void ParseConfig(const NKikimrConfig::TMonitoringConfig &config)
+ {
+ ForceDatabaseLabels = config.GetForceDatabaseLabels();
+
+ auto &dbLabels = config.GetDatabaseLabels();
+ DatabaseLabelsEnabled = dbLabels.GetEnabled();
GroupAllMetrics = dbLabels.GetGroupAllMetrics();
- DatabaseSensorServices.clear();
- for (auto &service : dbLabels.GetServices())
- DatabaseSensorServices.insert(service);
- if (DatabaseSensorServices.empty())
- DatabaseSensorServices = GetDatabaseSensorServices();
-
- NoneDatabasetLabelValue = dbLabels.GetNoneDatabasetLabelValue();
- MultipleDatabaseLabelValue = dbLabels.GetMultipleDatabaseLabelValue();
-
- auto &attrLabels = config.GetDatabaseAttributeLabels();
- DatabaseAttributeLabelsEnabled = attrLabels.GetEnabled();
- DatabaseAttributeSensorServices.clear();
- for (auto &group : attrLabels.GetAttributeGroups())
- for (auto &service : group.GetServices())
- DatabaseAttributeSensorServices.insert(service);
- if (DatabaseAttributeSensorServices.empty())
- DatabaseAttributeSensorServices = GetDatabaseAttributeSensorServices();
+ DatabaseSensorServices.clear();
+ for (auto &service : dbLabels.GetServices())
+ DatabaseSensorServices.insert(service);
+ if (DatabaseSensorServices.empty())
+ DatabaseSensorServices = GetDatabaseSensorServices();
+
+ NoneDatabasetLabelValue = dbLabels.GetNoneDatabasetLabelValue();
+ MultipleDatabaseLabelValue = dbLabels.GetMultipleDatabaseLabelValue();
+
+ auto &attrLabels = config.GetDatabaseAttributeLabels();
+ DatabaseAttributeLabelsEnabled = attrLabels.GetEnabled();
+ DatabaseAttributeSensorServices.clear();
+ for (auto &group : attrLabels.GetAttributeGroups())
+ for (auto &service : group.GetServices())
+ DatabaseAttributeSensorServices.insert(service);
+ if (DatabaseAttributeSensorServices.empty())
+ DatabaseAttributeSensorServices = GetDatabaseAttributeSensorServices();
if (!InitializedLocalOptions) {
InitializedLocalOptions = true;
@@ -328,72 +328,72 @@ private:
HostLabelOverride = config.GetHostLabelOverride();
ProcessLocation = config.GetProcessLocation();
}
- }
-
+ }
+
TString PrintLabels(const TSmallVec<std::pair<TString, TString>> &labels) const
- {
- TStringStream ss;
- for (auto &pr : labels)
- ss << "(" << pr.first << ":" << pr.second << ")";
- return ss.Str();
- }
-
- void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx)
- {
- auto &rec = ev->Get()->Record;
-
- LOG_INFO_S(ctx, NKikimrServices::LABELS_MAINTAINER,
- "Got new config: " << rec.GetConfig().ShortDebugString());
-
- ApplyConfig(rec.GetConfig().GetMonitoringConfig(), ctx);
-
- auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
-
- LOG_TRACE_S(ctx, NKikimrServices::LABELS_MAINTAINER,
- "Send TEvConfigNotificationResponse: " << resp->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
- }
-
- void Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev,
- const TActorContext &ctx)
- {
- CurrentStatus.CopyFrom(ev->Get()->Record);
-
- LOG_INFO_S(ctx, NKikimrServices::LABELS_MAINTAINER,
- "Got new pool status: " << CurrentStatus.ShortDebugString());
-
- UpdateDatabaseLabels(ctx);
- }
-
-private:
- bool DatabaseLabelsEnabled;
+ {
+ TStringStream ss;
+ for (auto &pr : labels)
+ ss << "(" << pr.first << ":" << pr.second << ")";
+ return ss.Str();
+ }
+
+ void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx)
+ {
+ auto &rec = ev->Get()->Record;
+
+ LOG_INFO_S(ctx, NKikimrServices::LABELS_MAINTAINER,
+ "Got new config: " << rec.GetConfig().ShortDebugString());
+
+ ApplyConfig(rec.GetConfig().GetMonitoringConfig(), ctx);
+
+ auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
+
+ LOG_TRACE_S(ctx, NKikimrServices::LABELS_MAINTAINER,
+ "Send TEvConfigNotificationResponse: " << resp->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+ }
+
+ void Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev,
+ const TActorContext &ctx)
+ {
+ CurrentStatus.CopyFrom(ev->Get()->Record);
+
+ LOG_INFO_S(ctx, NKikimrServices::LABELS_MAINTAINER,
+ "Got new pool status: " << CurrentStatus.ShortDebugString());
+
+ UpdateDatabaseLabels(ctx);
+ }
+
+private:
+ bool DatabaseLabelsEnabled;
bool GroupAllMetrics;
- bool DatabaseAttributeLabelsEnabled;
- bool ForceDatabaseLabels;
+ bool DatabaseAttributeLabelsEnabled;
+ bool ForceDatabaseLabels;
bool InitializedLocalOptions;
-
- THashSet<TString> DatabaseSensorServices;
- THashSet<TString> DatabaseAttributeSensorServices;
-
- TString NoneDatabasetLabelValue;
- TString MultipleDatabaseLabelValue;
- TString CurrentDatabaseLabel;
-
+
+ THashSet<TString> DatabaseSensorServices;
+ THashSet<TString> DatabaseAttributeSensorServices;
+
+ TString NoneDatabasetLabelValue;
+ TString MultipleDatabaseLabelValue;
+ TString CurrentDatabaseLabel;
+
TString CurrentHostLabel;
TString HostLabelOverride;
TString DataCenter;
TString ProcessLocation;
-
- THashSet<TString> CurrentTenants;
- THashMap<TString, TString> CurrentAttributes;
- NKikimrTenantPool::TTenantPoolStatus CurrentStatus;
-};
-
-IActor* CreateLabelsMaintainer(const NKikimrConfig::TMonitoringConfig &config)
-{
- return new TLabelsMaintainer(config);
-}
-
-} // namespace NKikimr
+
+ THashSet<TString> CurrentTenants;
+ THashMap<TString, TString> CurrentAttributes;
+ NKikimrTenantPool::TTenantPoolStatus CurrentStatus;
+};
+
+IActor* CreateLabelsMaintainer(const NKikimrConfig::TMonitoringConfig &config)
+{
+ return new TLabelsMaintainer(config);
+}
+
+} // namespace NKikimr
diff --git a/ydb/core/mind/labels_maintainer.h b/ydb/core/mind/labels_maintainer.h
index 223191f5d8a..61a4a0d637c 100644
--- a/ydb/core/mind/labels_maintainer.h
+++ b/ydb/core/mind/labels_maintainer.h
@@ -1,10 +1,10 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <ydb/core/protos/config.pb.h>
-
-namespace NKikimr {
-
-IActor *CreateLabelsMaintainer(const NKikimrConfig::TMonitoringConfig &config);
-
-} // namespace NKikimr
+
+namespace NKikimr {
+
+IActor *CreateLabelsMaintainer(const NKikimrConfig::TMonitoringConfig &config);
+
+} // namespace NKikimr
diff --git a/ydb/core/mind/lease_holder.cpp b/ydb/core/mind/lease_holder.cpp
index a685c08a6d0..5d47d04c71f 100644
--- a/ydb/core/mind/lease_holder.cpp
+++ b/ydb/core/mind/lease_holder.cpp
@@ -1,261 +1,261 @@
-#include "lease_holder.h"
-#include "node_broker.h"
-
+#include "lease_holder.h"
+#include "node_broker.h"
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
#include <ydb/core/mon/mon.h>
#include <library/cpp/actors/core/mon.h>
#include <ydb/core/base/appdata.h>
#include <ydb/core/base/tablet_pipe.h>
-
+
#include <library/cpp/monlib/service/pages/templates.h>
-
-#include <util/random/random.h>
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-using namespace NMon;
-
-class TLeaseHolder : public TActorBootstrapped<TLeaseHolder> {
-private:
- struct TEvPrivate {
- enum EEv {
- EvExpire = EventSpaceBegin(TEvents::ES_PRIVATE),
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TEvents::ES_PRIVATE)");
-
- struct TEvExpire : TEventLocal<TEvExpire, EvExpire> {};
- };
-
-public:
- using TBase = TActorBootstrapped<TLeaseHolder>;
-
+
+#include <util/random/random.h>
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+using namespace NMon;
+
+class TLeaseHolder : public TActorBootstrapped<TLeaseHolder> {
+private:
+ struct TEvPrivate {
+ enum EEv {
+ EvExpire = EventSpaceBegin(TEvents::ES_PRIVATE),
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TEvents::ES_PRIVATE)");
+
+ struct TEvExpire : TEventLocal<TEvExpire, EvExpire> {};
+ };
+
+public:
+ using TBase = TActorBootstrapped<TLeaseHolder>;
+
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::NODE_BROKER_LEASE_HOLDER;
}
- TLeaseHolder(TInstant expire)
- : LastPingEpoch(0)
- , Expire(expire)
- {
-
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- NActors::TMon* mon = AppData(ctx)->Mon;
- if (mon) {
- NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors");
- mon->RegisterActorPage(actorsMonPage, "lease", "Dynamic node lease status",
- false, ctx.ExecutorThread.ActorSystem, ctx.SelfID);
- }
-
- Become(&TThis::StatePing);
-
- ScheduleExpire(ctx);
- Ping(ctx);
- }
-
-private:
- STFUNC(StateIdle)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvents::TEvWakeup, HandleIdle);
- HFunc(TEvHttpInfo, Handle);
- HFunc(TEvPrivate::TEvExpire, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, HandleIdle);
- HFunc(TEvTabletPipe::TEvClientConnected, HandleIdle);
- IgnoreFunc(TEvNodeBroker::TEvExtendLeaseResponse);
-
- default:
- Y_FAIL("TLeaseHolder::StateIdle unexpected event type: %" PRIx32 " event: %s",
+ TLeaseHolder(TInstant expire)
+ : LastPingEpoch(0)
+ , Expire(expire)
+ {
+
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ NActors::TMon* mon = AppData(ctx)->Mon;
+ if (mon) {
+ NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors");
+ mon->RegisterActorPage(actorsMonPage, "lease", "Dynamic node lease status",
+ false, ctx.ExecutorThread.ActorSystem, ctx.SelfID);
+ }
+
+ Become(&TThis::StatePing);
+
+ ScheduleExpire(ctx);
+ Ping(ctx);
+ }
+
+private:
+ STFUNC(StateIdle)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvents::TEvWakeup, HandleIdle);
+ HFunc(TEvHttpInfo, Handle);
+ HFunc(TEvPrivate::TEvExpire, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, HandleIdle);
+ HFunc(TEvTabletPipe::TEvClientConnected, HandleIdle);
+ IgnoreFunc(TEvNodeBroker::TEvExtendLeaseResponse);
+
+ default:
+ Y_FAIL("TLeaseHolder::StateIdle unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
- STFUNC(StatePing)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvHttpInfo, Handle);
- HFunc(TEvNodeBroker::TEvExtendLeaseResponse, Handle);
- HFunc(TEvPrivate::TEvExpire, Handle);
- HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
- HFunc(TEvTabletPipe::TEvClientConnected, Handle);
-
- default:
- Y_FAIL("TLeaseHolder::StatePing unexpected event type: %" PRIx32 " event: %s",
+ }
+ }
+
+ STFUNC(StatePing)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvHttpInfo, Handle);
+ HFunc(TEvNodeBroker::TEvExtendLeaseResponse, Handle);
+ HFunc(TEvPrivate::TEvExpire, Handle);
+ HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+
+ default:
+ Y_FAIL("TLeaseHolder::StatePing unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
- void Die(const TActorContext &ctx)
- {
- if (NodeBrokerPipe)
- NTabletPipe::CloseClient(ctx, NodeBrokerPipe);
- TBase::Die(ctx);
- }
-
- void OnPipeDestroyedIdle(const TActorContext &ctx)
- {
- NTabletPipe::CloseClient(ctx, NodeBrokerPipe);
+ }
+ }
+
+ void Die(const TActorContext &ctx)
+ {
+ if (NodeBrokerPipe)
+ NTabletPipe::CloseClient(ctx, NodeBrokerPipe);
+ TBase::Die(ctx);
+ }
+
+ void OnPipeDestroyedIdle(const TActorContext &ctx)
+ {
+ NTabletPipe::CloseClient(ctx, NodeBrokerPipe);
NodeBrokerPipe = TActorId();
- }
-
- void HandleIdle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) {
- if (ev->Get()->ClientId == NodeBrokerPipe && ev->Get()->Status != NKikimrProto::OK)
- OnPipeDestroyedIdle(ctx);
- }
-
- void HandleIdle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx) {
- if (ev->Get()->ClientId == NodeBrokerPipe)
- OnPipeDestroyedIdle(ctx);
- }
-
- void HandleIdle(TEvents::TEvWakeup::TPtr &, const TActorContext &ctx) {
- Become(&TThis::StatePing);
- Ping(ctx);
- }
-
- void OnPipeDestroyed(const TActorContext &ctx)
- {
- NTabletPipe::CloseClient(ctx, NodeBrokerPipe);
+ }
+
+ void HandleIdle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) {
+ if (ev->Get()->ClientId == NodeBrokerPipe && ev->Get()->Status != NKikimrProto::OK)
+ OnPipeDestroyedIdle(ctx);
+ }
+
+ void HandleIdle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx) {
+ if (ev->Get()->ClientId == NodeBrokerPipe)
+ OnPipeDestroyedIdle(ctx);
+ }
+
+ void HandleIdle(TEvents::TEvWakeup::TPtr &, const TActorContext &ctx) {
+ Become(&TThis::StatePing);
+ Ping(ctx);
+ }
+
+ void OnPipeDestroyed(const TActorContext &ctx)
+ {
+ NTabletPipe::CloseClient(ctx, NodeBrokerPipe);
NodeBrokerPipe = TActorId();
-
- Ping(ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) {
- if (ev->Get()->ClientId == NodeBrokerPipe && ev->Get()->Status != NKikimrProto::OK)
- OnPipeDestroyed(ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx) {
- if (ev->Get()->ClientId == NodeBrokerPipe)
- OnPipeDestroyed(ctx);
- }
-
- void Connect(const TActorContext &ctx)
- {
+
+ Ping(ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) {
+ if (ev->Get()->ClientId == NodeBrokerPipe && ev->Get()->Status != NKikimrProto::OK)
+ OnPipeDestroyed(ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx) {
+ if (ev->Get()->ClientId == NodeBrokerPipe)
+ OnPipeDestroyed(ctx);
+ }
+
+ void Connect(const TActorContext &ctx)
+ {
auto dinfo = AppData(ctx)->DomainsInfo;
auto &domain = dinfo->GetDomain(NodeIdToDomain(ctx.SelfID.NodeId(), *dinfo));
- ui32 group = domain.DefaultStateStorageGroup;
-
- NTabletPipe::TClientConfig config;
+ ui32 group = domain.DefaultStateStorageGroup;
+
+ NTabletPipe::TClientConfig config;
config.RetryPolicy = NTabletPipe::TClientRetryPolicy::WithRetries();
- auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeNodeBrokerID(group), config);
- NodeBrokerPipe = ctx.Register(pipe);
- }
-
- void Handle(TEvNodeBroker::TEvExtendLeaseResponse::TPtr &ev, const TActorContext &ctx) noexcept
- {
- auto &rec = ev->Get()->Record;
-
- // Error means Node Broker doesn't know about this node.
- // Node is either already expired or its ID is banned.
- Y_VERIFY(rec.GetNodeId() == ctx.SelfID.NodeId());
- if (rec.GetStatus().GetCode() != NKikimrNodeBroker::TStatus::OK) {
- LOG_ERROR(ctx, NKikimrServices::NODE_BROKER, "Cannot extend lease: %s",
+ auto pipe = NTabletPipe::CreateClient(ctx.SelfID, MakeNodeBrokerID(group), config);
+ NodeBrokerPipe = ctx.Register(pipe);
+ }
+
+ void Handle(TEvNodeBroker::TEvExtendLeaseResponse::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ auto &rec = ev->Get()->Record;
+
+ // Error means Node Broker doesn't know about this node.
+ // Node is either already expired or its ID is banned.
+ Y_VERIFY(rec.GetNodeId() == ctx.SelfID.NodeId());
+ if (rec.GetStatus().GetCode() != NKikimrNodeBroker::TStatus::OK) {
+ LOG_ERROR(ctx, NKikimrServices::NODE_BROKER, "Cannot extend lease: %s",
rec.GetStatus().GetReason().data());
- return;
- }
-
+ return;
+ }
+
Expire = TInstant::MicroSeconds(rec.GetExpire());
- LastResponse = ctx.Now();
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "Node has now extended lease expiring " << ToString(Expire));
-
- if (rec.HasEpoch()) {
- LastPingEpoch = rec.GetEpoch().GetId();
- EpochEnd = TInstant::FromValue(rec.GetEpoch().GetEnd());
-
- if (Expire != TInstant::Max()) {
- Y_VERIFY(Expire > EpochEnd);
- Y_VERIFY(rec.GetExpire() == rec.GetEpoch().GetNextEnd());
-
- ui64 window = (Expire - EpochEnd).GetValue() / 2;
- Y_VERIFY(window);
-
- NextPing = EpochEnd + TDuration::FromValue(RandomNumber<ui64>(window));
- }
- } else {
- NextPing = ctx.Now() + (Expire - ctx.Now()) / 2;
- }
-
- if (Expire != TInstant::Max())
- ctx.Schedule(NextPing - ctx.Now(), new TEvents::TEvWakeup());
- else
- NextPing = TInstant::Max();
-
- Become(&TThis::StateIdle);
- }
-
- void Ping(const TActorContext &ctx)
- {
- if (!NodeBrokerPipe)
- Connect(ctx);
-
- auto request = MakeHolder<TEvNodeBroker::TEvExtendLeaseRequest>();
- request->Record.SetNodeId(ctx.SelfID.NodeId());
- NTabletPipe::SendData(ctx, NodeBrokerPipe, request.Release());
- }
-
- void Handle(TEvHttpInfo::TPtr& ev, const TActorContext& ctx) {
- TStringStream str;
- HTML(str) {
- PRE() {
- str << "Lease expires: " << ToString(Expire) << Endl
- << "Last lease extension: " << ToString(LastResponse) << Endl
- << "Last ping epoch: " << LastPingEpoch << Endl
- << "Epoch end: " << ToString(EpochEnd) << Endl
- << "Next ping at: " << ToString(NextPing) << Endl;
- }
- }
- ctx.Send(ev->Sender, new TEvHttpInfoRes(str.Str()));
- }
-
- void ScheduleExpire(const TActorContext &ctx)
- {
- if (Expire != TInstant::Max())
- ctx.Schedule(Expire - ctx.Now(), new TEvPrivate::TEvExpire);
- }
-
- void Handle(TEvPrivate::TEvExpire::TPtr &,const TActorContext &ctx)
- {
- if (Expire <= ctx.Now())
- StopNode(ctx);
- else
- ScheduleExpire(ctx);
- }
-
- void StopNode(const TActorContext &ctx)
- {
+ LastResponse = ctx.Now();
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "Node has now extended lease expiring " << ToString(Expire));
+
+ if (rec.HasEpoch()) {
+ LastPingEpoch = rec.GetEpoch().GetId();
+ EpochEnd = TInstant::FromValue(rec.GetEpoch().GetEnd());
+
+ if (Expire != TInstant::Max()) {
+ Y_VERIFY(Expire > EpochEnd);
+ Y_VERIFY(rec.GetExpire() == rec.GetEpoch().GetNextEnd());
+
+ ui64 window = (Expire - EpochEnd).GetValue() / 2;
+ Y_VERIFY(window);
+
+ NextPing = EpochEnd + TDuration::FromValue(RandomNumber<ui64>(window));
+ }
+ } else {
+ NextPing = ctx.Now() + (Expire - ctx.Now()) / 2;
+ }
+
+ if (Expire != TInstant::Max())
+ ctx.Schedule(NextPing - ctx.Now(), new TEvents::TEvWakeup());
+ else
+ NextPing = TInstant::Max();
+
+ Become(&TThis::StateIdle);
+ }
+
+ void Ping(const TActorContext &ctx)
+ {
+ if (!NodeBrokerPipe)
+ Connect(ctx);
+
+ auto request = MakeHolder<TEvNodeBroker::TEvExtendLeaseRequest>();
+ request->Record.SetNodeId(ctx.SelfID.NodeId());
+ NTabletPipe::SendData(ctx, NodeBrokerPipe, request.Release());
+ }
+
+ void Handle(TEvHttpInfo::TPtr& ev, const TActorContext& ctx) {
+ TStringStream str;
+ HTML(str) {
+ PRE() {
+ str << "Lease expires: " << ToString(Expire) << Endl
+ << "Last lease extension: " << ToString(LastResponse) << Endl
+ << "Last ping epoch: " << LastPingEpoch << Endl
+ << "Epoch end: " << ToString(EpochEnd) << Endl
+ << "Next ping at: " << ToString(NextPing) << Endl;
+ }
+ }
+ ctx.Send(ev->Sender, new TEvHttpInfoRes(str.Str()));
+ }
+
+ void ScheduleExpire(const TActorContext &ctx)
+ {
+ if (Expire != TInstant::Max())
+ ctx.Schedule(Expire - ctx.Now(), new TEvPrivate::TEvExpire);
+ }
+
+ void Handle(TEvPrivate::TEvExpire::TPtr &,const TActorContext &ctx)
+ {
+ if (Expire <= ctx.Now())
+ StopNode(ctx);
+ else
+ ScheduleExpire(ctx);
+ }
+
+ void StopNode(const TActorContext &ctx)
+ {
LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER, "Stop node upon lease expiration (exit code 2)");
AppData(ctx)->KikimrShouldContinue->ShouldStop(2);
- }
-
- TString ToString(TInstant t) const
- {
- if (t == TInstant::Max())
- return "NEVER";
- return t.ToRfc822StringLocal();
- }
-
-private:
+ }
+
+ TString ToString(TInstant t) const
+ {
+ if (t == TInstant::Max())
+ return "NEVER";
+ return t.ToRfc822StringLocal();
+ }
+
+private:
TActorId NodeBrokerPipe;
- ui64 LastPingEpoch;
- TInstant EpochEnd;
- TInstant Expire;
- TInstant LastResponse;
- TInstant NextPing;
-};
-
-IActor *CreateLeaseHolder(TInstant expire)
-{
- return new TLeaseHolder(expire);
-}
-
-} // NNodeBroker
-} // NKikimr
+ ui64 LastPingEpoch;
+ TInstant EpochEnd;
+ TInstant Expire;
+ TInstant LastResponse;
+ TInstant NextPing;
+};
+
+IActor *CreateLeaseHolder(TInstant expire)
+{
+ return new TLeaseHolder(expire);
+}
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/lease_holder.h b/ydb/core/mind/lease_holder.h
index 57c3d7a939b..bb1bc5ff934 100644
--- a/ydb/core/mind/lease_holder.h
+++ b/ydb/core/mind/lease_holder.h
@@ -1,18 +1,18 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <library/cpp/actors/core/actor.h>
-
-/**
- * Lease Holder actor is used to keep dynamic node alive by extending its
- * lease in Node Broker.
- */
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-IActor *CreateLeaseHolder(TInstant expire);
-
-} // NNodeBroker
-} // NKikimr
+
+/**
+ * Lease Holder actor is used to keep dynamic node alive by extending its
+ * lease in Node Broker.
+ */
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+IActor *CreateLeaseHolder(TInstant expire);
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/local.cpp b/ydb/core/mind/local.cpp
index 1de1c5fe180..09fc15f76dd 100644
--- a/ydb/core/mind/local.cpp
+++ b/ydb/core/mind/local.cpp
@@ -1,5 +1,5 @@
#include "local.h"
-
+
#include <ydb/core/base/appdata.h>
#include <ydb/core/base/counters.h>
#include <ydb/core/base/hive.h>
@@ -9,11 +9,11 @@
#include <ydb/core/tx/schemeshard/schemeshard.h>
#include <ydb/core/tx/scheme_board/scheme_board.h>
#include <ydb/core/util/tuples.h>
-
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
#include <library/cpp/actors/core/log.h>
-
+
#include <util/system/info.h>
#include <unordered_map>
@@ -115,8 +115,8 @@ class TLocalNodeRegistrar : public TActorBootstrapped<TLocalNodeRegistrar> {
NKikimrTabletBase::TMetrics ResourceLimit;
TResourceProfilesPtr ResourceProfiles;
TSharedQuotaPtr TxCacheQuota;
- NMonitoring::TDynamicCounterPtr Counters;
-
+ NMonitoring::TDynamicCounterPtr Counters;
+
NMonitoring::TDynamicCounters::TCounterPtr CounterStartAttempts;
NMonitoring::TDynamicCounters::TCounterPtr CounterFollowerAttempts;
NMonitoring::TDynamicCounters::TCounterPtr CounterRestored;
@@ -265,12 +265,12 @@ class TLocalNodeRegistrar : public TActorBootstrapped<TLocalNodeRegistrar> {
HandlePipeDestroyed(ctx);
}
- void SendStatusOk(const TActorContext &ctx) {
+ void SendStatusOk(const TActorContext &ctx) {
LOG_DEBUG_S(ctx, NKikimrServices::LOCAL, "TLocalNodeRegistrar SendStatusOk");
- TAutoPtr<TEvLocal::TEvStatus> eventStatus = new TEvLocal::TEvStatus(TEvLocal::TEvStatus::StatusOk);
- auto& record = eventStatus->Record;
- record.SetStartTime(StartTime.GetValue());
- record.MutableResourceMaximum()->CopyFrom(ResourceLimit);
+ TAutoPtr<TEvLocal::TEvStatus> eventStatus = new TEvLocal::TEvStatus(TEvLocal::TEvStatus::StatusOk);
+ auto& record = eventStatus->Record;
+ record.SetStartTime(StartTime.GetValue());
+ record.MutableResourceMaximum()->CopyFrom(ResourceLimit);
if (!record.GetResourceMaximum().HasCPU()) {
TExecutorPoolStats poolStats;
TVector<TExecutorThreadStats> statsCopy;
@@ -287,8 +287,8 @@ class TLocalNodeRegistrar : public TActorBootstrapped<TLocalNodeRegistrar> {
}
}
NTabletPipe::SendData(ctx, HivePipeClient, eventStatus.Release());
- }
-
+ }
+
void Handle(TEvLocal::TEvReconnect::TPtr& ev, const TActorContext& ctx) {
LOG_DEBUG(ctx, NKikimrServices::LOCAL, "TLocalNodeRegistrar::Handle TEvLocal::TEvReconnect");
const TActorId& sender = ev->Sender;
@@ -349,7 +349,7 @@ class TLocalNodeRegistrar : public TActorBootstrapped<TLocalNodeRegistrar> {
tablet->SetFollowerId(pr.first.second);
tablet->SetGeneration(pr.second.Generation);
tablet->SetBootMode(pr.second.BootMode);
-
+
ctx.Send(pr.second.Tablet, new TEvTablet::TEvUpdateConfig(ResourceProfiles));
}
for (const auto& pr : OnlineTablets) {
@@ -366,12 +366,12 @@ class TLocalNodeRegistrar : public TActorBootstrapped<TLocalNodeRegistrar> {
Connected = true;
LOG_DEBUG_S(ctx, NKikimrServices::LOCAL, "TLocalNodeRegistrar TEvPing - CONNECTED");
}
-
+
HiveGeneration = hiveGen;
BootQueue = sender;
// we send status of the 'local' to become online and available for new tablets
- SendStatusOk(ctx);
+ SendStatusOk(ctx);
ScheduleSendTabletMetrics(ctx);
}
@@ -401,7 +401,7 @@ class TLocalNodeRegistrar : public TActorBootstrapped<TLocalNodeRegistrar> {
}
LOG_DEBUG_S(ctx, NKikimrServices::LOCAL, "TLocalNodeRegistrar: Handle TEvLocal::TEvBootTablet tabletType:"
- << tabletType << " tabletId:" << tabletId << " suggestedGen:" << suggestedGen);
+ << tabletType << " tabletId:" << tabletId << " suggestedGen:" << suggestedGen);
TMap<TTabletTypes::EType, TLocalConfig::TTabletClassInfo>::const_iterator it = Config->TabletClassInfo.find(tabletType);
if (it == Config->TabletClassInfo.end()) {
@@ -447,7 +447,7 @@ class TLocalNodeRegistrar : public TActorBootstrapped<TLocalNodeRegistrar> {
TTabletSetupInfo *setupInfo = it->second.SetupInfo.Get();
switch (record.GetBootMode()) {
case NKikimrLocal::BOOT_MODE_LEADER:
- entry.Tablet = setupInfo->Tablet(info.Get(), ctx.SelfID, ctx, suggestedGen, ResourceProfiles, TxCacheQuota);
+ entry.Tablet = setupInfo->Tablet(info.Get(), ctx.SelfID, ctx, suggestedGen, ResourceProfiles, TxCacheQuota);
CounterStartAttempts->Inc();
break;
case NKikimrLocal::BOOT_MODE_FOLLOWER:
@@ -660,18 +660,18 @@ class TLocalNodeRegistrar : public TActorBootstrapped<TLocalNodeRegistrar> {
}
}
- void Handle(TEvLocal::TEvAlterTenant::TPtr &ev, const TActorContext &ctx) {
- auto &info = ev->Get()->TenantInfo;
- ResourceLimit = info.ResourceLimit;
-
- LOG_DEBUG_S(ctx, NKikimrServices::LOCAL, "Updated resoure limit: "
- << ResourceLimit.ShortDebugString());
-
- UpdateCacheQuota();
-
- SendStatusOk(ctx);
- }
-
+ void Handle(TEvLocal::TEvAlterTenant::TPtr &ev, const TActorContext &ctx) {
+ auto &info = ev->Get()->TenantInfo;
+ ResourceLimit = info.ResourceLimit;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::LOCAL, "Updated resoure limit: "
+ << ResourceLimit.ShortDebugString());
+
+ UpdateCacheQuota();
+
+ SendStatusOk(ctx);
+ }
+
void MarkRunningTablet(TTabletId tabletId, ui32 generation, const TActorContext& ctx) {
auto inbootIt = InbootTablets.find(tabletId);
if (inbootIt == InbootTablets.end())
@@ -848,22 +848,22 @@ class TLocalNodeRegistrar : public TActorBootstrapped<TLocalNodeRegistrar> {
}
}
- void UpdateCacheQuota() {
- ui64 mem = ResourceLimit.GetMemory();
- if (mem)
- TxCacheQuota->ChangeQuota(mem / 4);
- else
- TxCacheQuota->ChangeQuota(Max<i64>());
- }
-
+ void UpdateCacheQuota() {
+ ui64 mem = ResourceLimit.GetMemory();
+ if (mem)
+ TxCacheQuota->ChangeQuota(mem / 4);
+ else
+ TxCacheQuota->ChangeQuota(Max<i64>());
+ }
+
public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::LOCAL_ACTOR;
}
TLocalNodeRegistrar(const TActorId &owner, ui64 hiveId, TVector<TSubDomainKey> servicedDomains,
- const NKikimrTabletBase::TMetrics &resourceLimit, TIntrusivePtr<TLocalConfig> config,
- NMonitoring::TDynamicCounterPtr counters)
+ const NKikimrTabletBase::TMetrics &resourceLimit, TIntrusivePtr<TLocalConfig> config,
+ NMonitoring::TDynamicCounterPtr counters)
: Owner(owner)
, HiveId(hiveId)
, ServicedDomains(std::move(servicedDomains))
@@ -871,12 +871,12 @@ public:
, Config(config)
, HiveGeneration(0)
, SendTabletMetricsInProgress(false)
- , ResourceLimit(resourceLimit)
- , Counters(counters)
+ , ResourceLimit(resourceLimit)
+ , Counters(counters)
{
Y_VERIFY(!ServicedDomains.empty());
- TxCacheQuota = new TSharedQuota(Counters->GetCounter("UsedTxDataCache"),
- Counters->GetCounter("TxDataCacheSize"));
+ TxCacheQuota = new TSharedQuota(Counters->GetCounter("UsedTxDataCache"),
+ Counters->GetCounter("TxDataCacheSize"));
CounterStartAttempts = Counters->GetCounter("Local_StartAttempts", true);
CounterFollowerAttempts = Counters->GetCounter("Local_FollowerAttempts", true);
@@ -895,7 +895,7 @@ public:
CounterCancelDemotedByBS = Counters->GetCounter("Local_CancelDemotedByBS", true);
CounterCancelUnknownReason = Counters->GetCounter("Local_CancelUnknownReason", true);
- UpdateCacheQuota();
+ UpdateCacheQuota();
}
void Bootstrap(const TActorContext &ctx) {
@@ -918,7 +918,7 @@ public:
HFunc(TEvLocal::TEvEnumerateTablets, Handle);
HFunc(TEvLocal::TEvTabletMetrics, Handle);
HFunc(TEvLocal::TEvTabletMetricsAck, Handle);
- HFunc(TEvLocal::TEvAlterTenant, Handle);
+ HFunc(TEvLocal::TEvAlterTenant, Handle);
HFunc(TEvLocal::TEvReconnect, Handle);
HFunc(TEvTabletPipe::TEvClientConnected, Handle);
HFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
@@ -938,179 +938,179 @@ public:
};
-class TDomainLocal : public TActorBootstrapped<TDomainLocal> {
- struct TResolveTask {
- TRegistrationInfo Info;
+class TDomainLocal : public TActorBootstrapped<TDomainLocal> {
+ struct TResolveTask {
+ TRegistrationInfo Info;
TVector<TActorId> Senders;
- };
+ };
- struct TTenantInfo {
+ struct TTenantInfo {
TTenantInfo(const TRegistrationInfo &info, const TSubDomainKey &domainKey)
- : Info(info)
+ : Info(info)
, DomainKey(domainKey)
- {}
+ {}
- TTenantInfo(const TTenantInfo &other) = default;
- TTenantInfo(TTenantInfo &&other) = default;
-
- TRegistrationInfo Info;
+ TTenantInfo(const TTenantInfo &other) = default;
+ TTenantInfo(TTenantInfo &&other) = default;
+
+ TRegistrationInfo Info;
TVector<TActorId> Locals;
TActorId Subscriber;
TVector<TTabletId> HiveIds;
- THashMap<TString, TString> Attributes;
+ THashMap<TString, TString> Attributes;
TSubDomainKey DomainKey;
- };
+ };
- TString Domain;
- ui64 SchemeRoot;
- TVector<ui64> HiveIds;
+ TString Domain;
+ ui64 SchemeRoot;
+ TVector<ui64> HiveIds;
TActorId SchemeShardPipe;
- NTabletPipe::TClientConfig PipeConfig;
- THashMap<TString, TResolveTask> ResolveTasks;
- TIntrusivePtr<TLocalConfig> Config;
- THashMap<TString, TTenantInfo> RunningTenants;
- TString LogPrefix;
-
- void OpenPipe(const TActorContext &ctx)
- {
- ClosePipe(ctx);
+ NTabletPipe::TClientConfig PipeConfig;
+ THashMap<TString, TResolveTask> ResolveTasks;
+ TIntrusivePtr<TLocalConfig> Config;
+ THashMap<TString, TTenantInfo> RunningTenants;
+ TString LogPrefix;
+
+ void OpenPipe(const TActorContext &ctx)
+ {
+ ClosePipe(ctx);
SchemeShardPipe = ctx.RegisterWithSameMailbox(NTabletPipe::CreateClient(ctx.SelfID, SchemeRoot, PipeConfig));
- }
+ }
- void ClosePipe(const TActorContext &ctx)
- {
- if (SchemeShardPipe) {
- NTabletPipe::CloseClient(ctx, SchemeShardPipe);
+ void ClosePipe(const TActorContext &ctx)
+ {
+ if (SchemeShardPipe) {
+ NTabletPipe::CloseClient(ctx, SchemeShardPipe);
SchemeShardPipe = TActorId();
- }
- }
+ }
+ }
- void SendResolveRequest(const TRegistrationInfo &info, const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
- LogPrefix << "Send resolve request for " << info.TenantName
- << " to schemeshard " << SchemeRoot);
+ void SendResolveRequest(const TRegistrationInfo &info, const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
+ LogPrefix << "Send resolve request for " << info.TenantName
+ << " to schemeshard " << SchemeRoot);
auto request = MakeHolder<NSchemeShard::TEvSchemeShard::TEvDescribeScheme>(info.TenantName);
- NTabletPipe::SendData(ctx.SelfID, SchemeShardPipe, request.Release());
- }
+ NTabletPipe::SendData(ctx.SelfID, SchemeShardPipe, request.Release());
+ }
- void SendStatus(const TString &tenant,
+ void SendStatus(const TString &tenant,
TActorId recipient,
- const TActorContext &ctx)
- {
- TAutoPtr<TEvLocal::TEvTenantStatus> ev;
-
- auto it = RunningTenants.find(tenant);
- if (it != RunningTenants.end())
- ev = new TEvLocal::TEvTenantStatus(tenant,
- TEvLocal::TEvTenantStatus::STARTED,
- it->second.Info.ResourceLimit,
+ const TActorContext &ctx)
+ {
+ TAutoPtr<TEvLocal::TEvTenantStatus> ev;
+
+ auto it = RunningTenants.find(tenant);
+ if (it != RunningTenants.end())
+ ev = new TEvLocal::TEvTenantStatus(tenant,
+ TEvLocal::TEvTenantStatus::STARTED,
+ it->second.Info.ResourceLimit,
it->second.Attributes,
it->second.DomainKey);
-
- else
- ev = new TEvLocal::TEvTenantStatus(tenant,
- TEvLocal::TEvTenantStatus::STOPPED);
- ctx.Send(recipient, ev.Release());
- }
+ else
+ ev = new TEvLocal::TEvTenantStatus(tenant,
+ TEvLocal::TEvTenantStatus::STOPPED);
+
+ ctx.Send(recipient, ev.Release());
+ }
- void SendStatus(const TString &tenant,
- TEvLocal::TEvTenantStatus::EStatus status,
- const TString &msg,
+ void SendStatus(const TString &tenant,
+ TEvLocal::TEvTenantStatus::EStatus status,
+ const TString &msg,
TActorId recipient,
- const TActorContext &ctx)
- {
- TAutoPtr<TEvLocal::TEvTenantStatus> ev = new TEvLocal::TEvTenantStatus(tenant, status, msg);
- ctx.Send(recipient, ev.Release());
+ const TActorContext &ctx)
+ {
+ TAutoPtr<TEvLocal::TEvTenantStatus> ev = new TEvLocal::TEvTenantStatus(tenant, status, msg);
+ ctx.Send(recipient, ev.Release());
}
- void SendStatus(const TString &tenant,
+ void SendStatus(const TString &tenant,
const TVector<TActorId> &recipients,
- const TActorContext &ctx)
- {
- for (auto &r : recipients)
- SendStatus(tenant, r, ctx);
+ const TActorContext &ctx)
+ {
+ for (auto &r : recipients)
+ SendStatus(tenant, r, ctx);
}
- void SendStatus(const TString &tenant,
- TEvLocal::TEvTenantStatus::EStatus status,
- const TString &msg,
+ void SendStatus(const TString &tenant,
+ TEvLocal::TEvTenantStatus::EStatus status,
+ const TString &msg,
const TVector<TActorId> &recipients,
- const TActorContext &ctx)
- {
- for (auto &r : recipients)
- SendStatus(tenant, status, msg, r, ctx);
- }
-
- void RegisterLocalNode(const TString &tenant,
- const NKikimrTabletBase::TMetrics &resourceLimit,
+ const TActorContext &ctx)
+ {
+ for (auto &r : recipients)
+ SendStatus(tenant, status, msg, r, ctx);
+ }
+
+ void RegisterLocalNode(const TString &tenant,
+ const NKikimrTabletBase::TMetrics &resourceLimit,
ui64 hiveId,
- const TVector<TSubDomainKey> &servicedDomains,
+ const TVector<TSubDomainKey> &servicedDomains,
const TActorContext &ctx)
{
- auto counters = GetServiceCounters(AppData(ctx)->Counters, "tablets");
- auto actor = new TLocalNodeRegistrar(SelfId(), hiveId, servicedDomains, resourceLimit, Config, counters);
+ auto counters = GetServiceCounters(AppData(ctx)->Counters, "tablets");
+ auto actor = new TLocalNodeRegistrar(SelfId(), hiveId, servicedDomains, resourceLimit, Config, counters);
TActorId actorId = ctx.Register(actor);
- RunningTenants.at(tenant).Locals.push_back(actorId);
+ RunningTenants.at(tenant).Locals.push_back(actorId);
TActorId localRegistrarServiceId = MakeLocalRegistrarID(ctx.SelfID.NodeId(), hiveId);
ctx.ExecutorThread.ActorSystem->RegisterLocalService(localRegistrarServiceId, actorId);
- }
-
- void RegisterAsDomain(const TRegistrationInfo &info,
+ }
+
+ void RegisterAsDomain(const TRegistrationInfo &info,
const TActorContext &ctx)
{
Y_VERIFY(!RunningTenants.contains(info.TenantName));
const auto domainKey = TSubDomainKey(SchemeRoot, 1);
RunningTenants.emplace(std::make_pair(info.TenantName, TTenantInfo(info, domainKey)));
- for (auto id : HiveIds) {
+ for (auto id : HiveIds) {
RegisterLocalNode(info.TenantName, info.ResourceLimit, id, {domainKey}, ctx);
-
- LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
- LogPrefix << "Binding to hive " << id <<
- " at domain " << info.DomainName <<
- " (allocated resources: " << info.ResourceLimit.ShortDebugString() << ")");
- }
+
+ LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
+ LogPrefix << "Binding to hive " << id <<
+ " at domain " << info.DomainName <<
+ " (allocated resources: " << info.ResourceLimit.ShortDebugString() << ")");
+ }
}
void RegisterAsSubDomain(const NKikimrScheme::TEvDescribeSchemeResult &rec,
- const TResolveTask &task,
+ const TResolveTask &task,
const TVector<TTabletId> hiveIds,
- const TActorContext &ctx)
- {
- const auto &domainDesc = rec.GetPathDescription().GetDomainDescription();
+ const TActorContext &ctx)
+ {
+ const auto &domainDesc = rec.GetPathDescription().GetDomainDescription();
const auto domainKey = TSubDomainKey(domainDesc.GetDomainKey());
Y_VERIFY(!RunningTenants.contains(task.Info.TenantName));
TTenantInfo info(task.Info, domainKey);
- for (auto &attr : rec.GetPathDescription().GetUserAttributes())
- info.Attributes.emplace(std::make_pair(attr.GetKey(), attr.GetValue()));
- RunningTenants.emplace(std::make_pair(task.Info.TenantName, info));
+ for (auto &attr : rec.GetPathDescription().GetUserAttributes())
+ info.Attributes.emplace(std::make_pair(attr.GetKey(), attr.GetValue()));
+ RunningTenants.emplace(std::make_pair(task.Info.TenantName, info));
const TActorId whiteboardServiceId(NNodeWhiteboard::MakeNodeWhiteboardServiceId(SelfId().NodeId()));
Send(whiteboardServiceId, new NNodeWhiteboard::TEvWhiteboard::TEvSystemStateAddRole("Tenant"));
Send(whiteboardServiceId, new NNodeWhiteboard::TEvWhiteboard::TEvSystemStateSetTenant(task.Info.TenantName));
for (TTabletId hId : hiveIds) {
- LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
- LogPrefix << "Binding tenant " << task.Info.TenantName
+ LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
+ LogPrefix << "Binding tenant " << task.Info.TenantName
<< " to hive " << hId
- << " (allocated resources: " << task.Info.ResourceLimit.ShortDebugString() << ")");
+ << " (allocated resources: " << task.Info.ResourceLimit.ShortDebugString() << ")");
RegisterLocalNode(task.Info.TenantName, task.Info.ResourceLimit, hId, {domainKey}, ctx);
}
}
-
- void HandlePoison(const TActorContext &ctx)
+
+ void HandlePoison(const TActorContext &ctx)
{
- LOG_DEBUG_S(ctx, NKikimrServices::LOCAL, LogPrefix << "HandlePoison");
-
+ LOG_DEBUG_S(ctx, NKikimrServices::LOCAL, LogPrefix << "HandlePoison");
+
for (auto &pr : RunningTenants) {
- for (auto aid : pr.second.Locals) {
- LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
- LogPrefix << "Send poison pill to local of " << pr.second.Info.TenantName);
- ctx.Send(aid, new TEvents::TEvPoisonPill);
- }
+ for (auto aid : pr.second.Locals) {
+ LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
+ LogPrefix << "Send poison pill to local of " << pr.second.Info.TenantName);
+ ctx.Send(aid, new TEvents::TEvPoisonPill);
+ }
if (pr.second.Subscriber) {
LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
LogPrefix << "Send poison pill to scheme subscriber of " << pr.second.Info.TenantName);
@@ -1120,66 +1120,66 @@ class TDomainLocal : public TActorBootstrapped<TDomainLocal> {
ctx.Send(NNodeWhiteboard::MakeNodeWhiteboardServiceId(ctx.SelfID.NodeId()),
new NNodeWhiteboard::TEvWhiteboard::TEvSystemStateRemoveTenant(pr.first));
}
-
+
ClosePipe(ctx);
- Die(ctx);
+ Die(ctx);
}
- void HandlePipe(TEvTabletPipe::TEvClientConnected::TPtr ev, const TActorContext &ctx)
- {
+ void HandlePipe(TEvTabletPipe::TEvClientConnected::TPtr ev, const TActorContext &ctx)
+ {
TEvTabletPipe::TEvClientConnected *msg = ev->Get();
LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
- LogPrefix << "TDomainLocal::TEvClientConnected for " << Domain
- << " shard " << msg->TabletId);
+ LogPrefix << "TDomainLocal::TEvClientConnected for " << Domain
+ << " shard " << msg->TabletId);
- if (msg->Status != NKikimrProto::EReplyStatus::OK) {
- OpenPipe(ctx);
+ if (msg->Status != NKikimrProto::EReplyStatus::OK) {
+ OpenPipe(ctx);
return;
}
- for (auto &pr : ResolveTasks)
- SendResolveRequest(pr.second.Info, ctx);
+ for (auto &pr : ResolveTasks)
+ SendResolveRequest(pr.second.Info, ctx);
}
- void HandlePipe(TEvTabletPipe::TEvClientDestroyed::TPtr ev, const TActorContext &ctx)
- {
+ void HandlePipe(TEvTabletPipe::TEvClientDestroyed::TPtr ev, const TActorContext &ctx)
+ {
TEvTabletPipe::TEvClientDestroyed *msg = ev->Get();
LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
- LogPrefix << "TEvTabletPipe::TEvClientDestroyed from tablet " << msg->TabletId);
+ LogPrefix << "TEvTabletPipe::TEvClientDestroyed from tablet " << msg->TabletId);
- OpenPipe(ctx);
+ OpenPipe(ctx);
}
void HandleResolve(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult::TPtr ev, const TActorContext &ctx)
- {
+ {
const NKikimrScheme::TEvDescribeSchemeResult &rec = ev->Get()->GetRecord();
LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
- LogPrefix << "HandleResolve from schemeshard " << SchemeRoot
- << ": " << rec.ShortDebugString());
+ LogPrefix << "HandleResolve from schemeshard " << SchemeRoot
+ << ": " << rec.ShortDebugString());
if (!ResolveTasks.contains(rec.GetPath())) {
- LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
- LogPrefix << "Missing task for " << rec.GetPath());
+ LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
+ LogPrefix << "Missing task for " << rec.GetPath());
return;
}
- const TResolveTask &task = ResolveTasks.find(rec.GetPath())->second;
+ const TResolveTask &task = ResolveTasks.find(rec.GetPath())->second;
using EDescStatus = NKikimrScheme::EStatus;
if (rec.GetStatus() != EDescStatus::StatusSuccess) {
- LOG_ERROR_S(ctx, NKikimrServices::LOCAL,
- LogPrefix << " Receive TEvDescribeSchemeResult with bad status "
+ LOG_ERROR_S(ctx, NKikimrServices::LOCAL,
+ LogPrefix << " Receive TEvDescribeSchemeResult with bad status "
<< NKikimrScheme::EStatus_Name(rec.GetStatus()) <<
- " reason is <" << rec.GetReason() << ">" <<
- " while resolving subdomain " << task.Info.DomainName);
-
- SendStatus(rec.GetPath(), TEvLocal::TEvTenantStatus::UNKNOWN_TENANT,
- rec.GetReason(), task.Senders, ctx);
- ResolveTasks.erase(rec.GetPath());
- return;
+ " reason is <" << rec.GetReason() << ">" <<
+ " while resolving subdomain " << task.Info.DomainName);
+
+ SendStatus(rec.GetPath(), TEvLocal::TEvTenantStatus::UNKNOWN_TENANT,
+ rec.GetReason(), task.Senders, ctx);
+ ResolveTasks.erase(rec.GetPath());
+ return;
}
Y_VERIFY(rec.HasPathDescription());
@@ -1187,14 +1187,14 @@ class TDomainLocal : public TActorBootstrapped<TDomainLocal> {
if (rec.GetPathDescription().GetSelf().GetPathType() != NKikimrSchemeOp::EPathTypeSubDomain
&& rec.GetPathDescription().GetSelf().GetPathType() != NKikimrSchemeOp::EPathTypeExtSubDomain) {
LOG_CRIT_S(ctx, NKikimrServices::LOCAL,
- LogPrefix << " Resolve subdomain fail, requested path "
- << task.Info.DomainName << " has invalid path type "
+ LogPrefix << " Resolve subdomain fail, requested path "
+ << task.Info.DomainName << " has invalid path type "
<< NKikimrSchemeOp::EPathType_Name(rec.GetPathDescription().GetSelf().GetPathType()));
-
- SendStatus(rec.GetPath(), TEvLocal::TEvTenantStatus::UNKNOWN_TENANT,
- rec.GetPath() + " is not a tenant path", task.Senders, ctx);
- ResolveTasks.erase(rec.GetPath());
- return;
+
+ SendStatus(rec.GetPath(), TEvLocal::TEvTenantStatus::UNKNOWN_TENANT,
+ rec.GetPath() + " is not a tenant path", task.Senders, ctx);
+ ResolveTasks.erase(rec.GetPath());
+ return;
}
Y_VERIFY(rec.GetPathDescription().HasDomainDescription());
Y_VERIFY(rec.GetPathDescription().GetDomainDescription().GetDomainKey().GetSchemeShard() == SchemeRoot);
@@ -1228,8 +1228,8 @@ class TDomainLocal : public TActorBootstrapped<TDomainLocal> {
LOG_WARN_S(ctx, NKikimrServices::LOCAL,
LogPrefix << " Local tenant info not found, requested path " << task.Info.DomainName);
}
- }
-
+ }
+
void HandleSchemeBoard(TSchemeBoardEvents::TEvNotifyUpdate::TPtr &ev, const TActorContext &ctx)
{
TString path = ev->Get()->DescribeSchemeResult.GetPath();
@@ -1260,61 +1260,61 @@ class TDomainLocal : public TActorBootstrapped<TDomainLocal> {
Y_UNUSED(ctx);
}
- void HandleTenant(TEvLocal::TEvAddTenant::TPtr &ev, const TActorContext &ctx)
- {
- auto &info = ev->Get()->TenantInfo;
-
- // Already started?
+ void HandleTenant(TEvLocal::TEvAddTenant::TPtr &ev, const TActorContext &ctx)
+ {
+ auto &info = ev->Get()->TenantInfo;
+
+ // Already started?
if (RunningTenants.contains(info.TenantName)) {
- SendStatus(info.TenantName, ev->Sender, ctx);
- return;
+ SendStatus(info.TenantName, ev->Sender, ctx);
+ return;
}
-
- // In-fly?
- auto it = ResolveTasks.find(info.TenantName);
- if (it != ResolveTasks.end()) {
- it->second.Senders.push_back(ev->Sender);
- return;
- }
-
- if (info.TenantIsDomain()) {
- RegisterAsDomain(info, ctx);
- SendStatus(info.TenantName, ev->Sender, ctx);
- } else {
- ResolveTasks.emplace(info.TenantName, TResolveTask{info, {ev->Sender}});
- if (SchemeShardPipe)
- SendResolveRequest(info, ctx);
- else
- OpenPipe(ctx);
- }
- }
-
- void HandleTenant(TEvLocal::TEvRemoveTenant::TPtr &ev, const TActorContext &ctx)
- {
- auto &tenant = ev->Get()->TenantName;
-
- // In-fly?
- auto it = ResolveTasks.find(tenant);
- if (it != ResolveTasks.end()) {
+
+ // In-fly?
+ auto it = ResolveTasks.find(info.TenantName);
+ if (it != ResolveTasks.end()) {
+ it->second.Senders.push_back(ev->Sender);
+ return;
+ }
+
+ if (info.TenantIsDomain()) {
+ RegisterAsDomain(info, ctx);
+ SendStatus(info.TenantName, ev->Sender, ctx);
+ } else {
+ ResolveTasks.emplace(info.TenantName, TResolveTask{info, {ev->Sender}});
+ if (SchemeShardPipe)
+ SendResolveRequest(info, ctx);
+ else
+ OpenPipe(ctx);
+ }
+ }
+
+ void HandleTenant(TEvLocal::TEvRemoveTenant::TPtr &ev, const TActorContext &ctx)
+ {
+ auto &tenant = ev->Get()->TenantName;
+
+ // In-fly?
+ auto it = ResolveTasks.find(tenant);
+ if (it != ResolveTasks.end()) {
Y_VERIFY(!RunningTenants.contains(tenant));
- SendStatus(tenant, it->second.Senders, ctx);
- ResolveTasks.erase(it);
- } else {
- auto it = RunningTenants.find(tenant);
- if (it != RunningTenants.end()) {
- for (auto aid : it->second.Locals)
- ctx.Send(aid, new TEvents::TEvPoisonPill());
+ SendStatus(tenant, it->second.Senders, ctx);
+ ResolveTasks.erase(it);
+ } else {
+ auto it = RunningTenants.find(tenant);
+ if (it != RunningTenants.end()) {
+ for (auto aid : it->second.Locals)
+ ctx.Send(aid, new TEvents::TEvPoisonPill());
if (it->second.Subscriber) {
ctx.Send(it->second.Subscriber, new TEvents::TEvPoisonPill());
it->second.Subscriber = TActorId();
}
ctx.Send(NNodeWhiteboard::MakeNodeWhiteboardServiceId(ctx.SelfID.NodeId()),
new NNodeWhiteboard::TEvWhiteboard::TEvSystemStateRemoveTenant(it->first));
- RunningTenants.erase(it);
- }
- }
- SendStatus(ev->Get()->TenantName, ev->Sender, ctx);
- }
+ RunningTenants.erase(it);
+ }
+ }
+ SendStatus(ev->Get()->TenantName, ev->Sender, ctx);
+ }
void HandleDrain(TEvLocal::TEvLocalDrainNode::TPtr &ev, const TActorContext& ctx) {
for(auto& hiveId: HiveIds) {
@@ -1326,50 +1326,50 @@ class TDomainLocal : public TActorBootstrapped<TDomainLocal> {
ev->Get()->DrainProgress->OnReceive();
}
- void HandleTenant(TEvLocal::TEvAlterTenant::TPtr &ev, const TActorContext &ctx)
- {
- auto &info = ev->Get()->TenantInfo;
+ void HandleTenant(TEvLocal::TEvAlterTenant::TPtr &ev, const TActorContext &ctx)
+ {
+ auto &info = ev->Get()->TenantInfo;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
+ LogPrefix << "Alter tenant " << info.TenantName);
- LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
- LogPrefix << "Alter tenant " << info.TenantName);
-
- auto it = RunningTenants.find(info.TenantName);
- if (it != RunningTenants.end()) {
- it->second.Info = info;
- for (auto &aid : it->second.Locals)
- ctx.Send(aid, new TEvLocal::TEvAlterTenant(info));
+ auto it = RunningTenants.find(info.TenantName);
+ if (it != RunningTenants.end()) {
+ it->second.Info = info;
+ for (auto &aid : it->second.Locals)
+ ctx.Send(aid, new TEvLocal::TEvAlterTenant(info));
}
-
- SendStatus(info.TenantName, ev->Sender, ctx);
+
+ SendStatus(info.TenantName, ev->Sender, ctx);
}
-public:
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::LOCAL_ACTOR;
- }
-
- TDomainLocal(const TDomainsInfo &domainsInfo, const TDomainsInfo::TDomain &domain,
- TIntrusivePtr<TLocalConfig> config)
- : Domain(domain.Name)
- , SchemeRoot(domain.SchemeRoot)
- , Config(config)
- {
- for (auto hiveUid : domain.HiveUids)
- HiveIds.push_back(domainsInfo.GetHive(hiveUid));
+ }
+
+ TDomainLocal(const TDomainsInfo &domainsInfo, const TDomainsInfo::TDomain &domain,
+ TIntrusivePtr<TLocalConfig> config)
+ : Domain(domain.Name)
+ , SchemeRoot(domain.SchemeRoot)
+ , Config(config)
+ {
+ for (auto hiveUid : domain.HiveUids)
+ HiveIds.push_back(domainsInfo.GetHive(hiveUid));
PipeConfig.RetryPolicy = NTabletPipe::TClientRetryPolicy::WithRetries();
-
+
LogPrefix = Sprintf("TDomainLocal(%s): ", Domain.data());
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- LOG_DEBUG_S(ctx, NKikimrServices::LOCAL, LogPrefix << "Bootstrap");
-
- Become(&TThis::StateWork);
- }
-
- STFUNC(StateWork) {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::LOCAL, LogPrefix << "Bootstrap");
+
+ Become(&TThis::StateWork);
+ }
+
+ STFUNC(StateWork) {
switch (ev->GetTypeRewrite()) {
CFunc(TEvents::TSystem::PoisonPill, HandlePoison);
@@ -1378,92 +1378,92 @@ public:
HFunc(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult, HandleResolve);
- HFunc(TEvLocal::TEvAddTenant, HandleTenant);
- HFunc(TEvLocal::TEvRemoveTenant, HandleTenant);
- HFunc(TEvLocal::TEvAlterTenant, HandleTenant);
-
+ HFunc(TEvLocal::TEvAddTenant, HandleTenant);
+ HFunc(TEvLocal::TEvRemoveTenant, HandleTenant);
+ HFunc(TEvLocal::TEvAlterTenant, HandleTenant);
+
HFunc(TSchemeBoardEvents::TEvNotifyUpdate, HandleSchemeBoard);
HFunc(TSchemeBoardEvents::TEvNotifyDelete, HandleSchemeBoard);
HFunc(TEvLocal::TEvLocalDrainNode, HandleDrain);
- default:
- Y_FAIL("Unexpected event for TDomainLocal");
- break;
+ default:
+ Y_FAIL("Unexpected event for TDomainLocal");
+ break;
}
}
};
-class TLocal : public TActorBootstrapped<TLocal> {
- TIntrusivePtr<TLocalConfig> Config;
+class TLocal : public TActorBootstrapped<TLocal> {
+ TIntrusivePtr<TLocalConfig> Config;
THashMap<TString, TActorId> DomainLocals;
-
-public:
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::LOCAL_ACTOR;
- }
-
- TLocal(TLocalConfig *cfg)
- : Config(cfg)
- {}
-
- void HandlePoison(const TActorContext &ctx) {
- LOG_DEBUG(ctx, NKikimrServices::LOCAL, "TLocal: HandlePoison");
- for (auto &pr : DomainLocals)
- ctx.Send(pr.second, new TEvents::TEvPoisonPill());
- Die(ctx);
- }
-
- void Bootstrap(const TActorContext &ctx) {
- LOG_DEBUG(ctx, NKikimrServices::LOCAL, "TLocal::Bootstrap");
- Become(&TThis::StateWork);
- }
-
- bool ForwardToDomainLocal(TAutoPtr<IEventHandle> ev, const TString &domainName, const TActorContext &ctx)
- {
- auto &domainsInfo = *AppData(ctx)->DomainsInfo;
- auto *domain = domainsInfo.GetDomainByName(domainName);
- if (!domain) {
- LOG_ERROR_S(ctx, NKikimrServices::LOCAL, "Unknown domain " << domainName);
- return false;
- }
-
+ }
+
+ TLocal(TLocalConfig *cfg)
+ : Config(cfg)
+ {}
+
+ void HandlePoison(const TActorContext &ctx) {
+ LOG_DEBUG(ctx, NKikimrServices::LOCAL, "TLocal: HandlePoison");
+ for (auto &pr : DomainLocals)
+ ctx.Send(pr.second, new TEvents::TEvPoisonPill());
+ Die(ctx);
+ }
+
+ void Bootstrap(const TActorContext &ctx) {
+ LOG_DEBUG(ctx, NKikimrServices::LOCAL, "TLocal::Bootstrap");
+ Become(&TThis::StateWork);
+ }
+
+ bool ForwardToDomainLocal(TAutoPtr<IEventHandle> ev, const TString &domainName, const TActorContext &ctx)
+ {
+ auto &domainsInfo = *AppData(ctx)->DomainsInfo;
+ auto *domain = domainsInfo.GetDomainByName(domainName);
+ if (!domain) {
+ LOG_ERROR_S(ctx, NKikimrServices::LOCAL, "Unknown domain " << domainName);
+ return false;
+ }
+
if (!DomainLocals.contains(domainName)) {
- auto actor = new TDomainLocal(domainsInfo, *domain, Config);
- DomainLocals[domainName] = ctx.Register(actor);
- }
-
- ctx.Send(ev->Forward(DomainLocals[domainName]));
- return true;
- }
-
+ auto actor = new TDomainLocal(domainsInfo, *domain, Config);
+ DomainLocals[domainName] = ctx.Register(actor);
+ }
+
+ ctx.Send(ev->Forward(DomainLocals[domainName]));
+ return true;
+ }
+
void SendUnknownDomain(const TString &tenant, TActorId sender, const TActorContext &ctx)
- {
- TAutoPtr<TEvLocal::TEvTenantStatus> ev
- = new TEvLocal::TEvTenantStatus(tenant, TEvLocal::TEvTenantStatus::UNKNOWN_TENANT,
- "Tenant is in unknown domain");
- ctx.Send(sender, ev.Release());
- }
-
- void ForwardOrReplyError(TAutoPtr<IEventHandle> ev, const TRegistrationInfo &info, const TActorContext &ctx)
- {
- auto sender = ev->Sender;
-
- if (!ForwardToDomainLocal(std::move(ev), info.DomainName, ctx))
- SendUnknownDomain(info.TenantName, sender, ctx);
- }
-
- void HandleTenant(TEvLocal::TEvAddTenant::TPtr &ev, const TActorContext &ctx)
- {
- TRegistrationInfo info = ev->Get()->TenantInfo;
- ForwardOrReplyError(ev.Release(), info, ctx);
- }
-
- void HandleTenant(TEvLocal::TEvRemoveTenant::TPtr &ev, const TActorContext &ctx)
- {
- TRegistrationInfo info(ev->Get()->TenantName);
- ForwardOrReplyError(ev.Release(), info, ctx);
- }
-
+ {
+ TAutoPtr<TEvLocal::TEvTenantStatus> ev
+ = new TEvLocal::TEvTenantStatus(tenant, TEvLocal::TEvTenantStatus::UNKNOWN_TENANT,
+ "Tenant is in unknown domain");
+ ctx.Send(sender, ev.Release());
+ }
+
+ void ForwardOrReplyError(TAutoPtr<IEventHandle> ev, const TRegistrationInfo &info, const TActorContext &ctx)
+ {
+ auto sender = ev->Sender;
+
+ if (!ForwardToDomainLocal(std::move(ev), info.DomainName, ctx))
+ SendUnknownDomain(info.TenantName, sender, ctx);
+ }
+
+ void HandleTenant(TEvLocal::TEvAddTenant::TPtr &ev, const TActorContext &ctx)
+ {
+ TRegistrationInfo info = ev->Get()->TenantInfo;
+ ForwardOrReplyError(ev.Release(), info, ctx);
+ }
+
+ void HandleTenant(TEvLocal::TEvRemoveTenant::TPtr &ev, const TActorContext &ctx)
+ {
+ TRegistrationInfo info(ev->Get()->TenantName);
+ ForwardOrReplyError(ev.Release(), info, ctx);
+ }
+
void HandleDrain(TEvLocal::TEvLocalDrainNode::TPtr &ev, const TActorContext& ctx) {
for(auto& x: DomainLocals) {
ev->Get()->DrainProgress->OnSend();
@@ -1472,37 +1472,37 @@ public:
ev->Get()->DrainProgress->OnReceive();
}
- void HandleTenant(TEvLocal::TEvAlterTenant::TPtr &ev, const TActorContext &ctx)
- {
- TRegistrationInfo info = ev->Get()->TenantInfo;
- ForwardOrReplyError(ev.Release(), info, ctx);
- }
-
- void HandleTenant(TEvLocal::TEvTenantStatus::TPtr &ev, const TActorContext &/*ctx*/)
- {
- Y_VERIFY(ev->Get()->Status != TEvLocal::TEvTenantStatus::UNKNOWN_TENANT,
+ void HandleTenant(TEvLocal::TEvAlterTenant::TPtr &ev, const TActorContext &ctx)
+ {
+ TRegistrationInfo info = ev->Get()->TenantInfo;
+ ForwardOrReplyError(ev.Release(), info, ctx);
+ }
+
+ void HandleTenant(TEvLocal::TEvTenantStatus::TPtr &ev, const TActorContext &/*ctx*/)
+ {
+ Y_VERIFY(ev->Get()->Status != TEvLocal::TEvTenantStatus::UNKNOWN_TENANT,
"Unknown tenant %s", ev->Get()->TenantName.data());
- }
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- CFunc(TEvents::TSystem::PoisonPill, HandlePoison);
-
- HFunc(TEvLocal::TEvAddTenant, HandleTenant);
- HFunc(TEvLocal::TEvRemoveTenant, HandleTenant);
- HFunc(TEvLocal::TEvAlterTenant, HandleTenant);
- HFunc(TEvLocal::TEvTenantStatus, HandleTenant);
+ }
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ CFunc(TEvents::TSystem::PoisonPill, HandlePoison);
+
+ HFunc(TEvLocal::TEvAddTenant, HandleTenant);
+ HFunc(TEvLocal::TEvRemoveTenant, HandleTenant);
+ HFunc(TEvLocal::TEvAlterTenant, HandleTenant);
+ HFunc(TEvLocal::TEvTenantStatus, HandleTenant);
HFunc(TEvLocal::TEvLocalDrainNode, HandleDrain);
-
- default:
- LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
- "TLocal: Unhandled in StateResolveSubDomain type: " << ev->GetTypeRewrite() <<
+
+ default:
+ LOG_DEBUG_S(ctx, NKikimrServices::LOCAL,
+ "TLocal: Unhandled in StateResolveSubDomain type: " << ev->GetTypeRewrite() <<
" event: " << ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-};
-
+ break;
+ }
+ }
+};
+
IActor* CreateLocal(TLocalConfig *config) {
return new TLocal(config);
}
diff --git a/ydb/core/mind/local.h b/ydb/core/mind/local.h
index ebabedc8b69..05c9bdc48eb 100644
--- a/ydb/core/mind/local.h
+++ b/ydb/core/mind/local.h
@@ -11,37 +11,37 @@
#include <ydb/core/tablet/tablet_metrics.h>
namespace NKikimr {
-
-struct TRegistrationInfo {
- TString DomainName;
- TString TenantName;
- NKikimrTabletBase::TMetrics ResourceLimit;
-
- TRegistrationInfo(const TString &domainPath)
- {
- DomainName = ExtractDomain(domainPath);
- TenantName = domainPath;
- }
-
- TRegistrationInfo(const TString &domainName, NKikimrTabletBase::TMetrics resourceLimit)
- : TRegistrationInfo(domainName)
- {
- ResourceLimit.Swap(&resourceLimit);
- }
-
- bool TenantIsDomain() const {
- return IsEqualPaths(DomainName, TenantName);
- }
-
- TString GetDomain() const {
- return DomainName;
- }
-
- TString GetTenant() const {
- return TenantName;
- }
-};
-
+
+struct TRegistrationInfo {
+ TString DomainName;
+ TString TenantName;
+ NKikimrTabletBase::TMetrics ResourceLimit;
+
+ TRegistrationInfo(const TString &domainPath)
+ {
+ DomainName = ExtractDomain(domainPath);
+ TenantName = domainPath;
+ }
+
+ TRegistrationInfo(const TString &domainName, NKikimrTabletBase::TMetrics resourceLimit)
+ : TRegistrationInfo(domainName)
+ {
+ ResourceLimit.Swap(&resourceLimit);
+ }
+
+ bool TenantIsDomain() const {
+ return IsEqualPaths(DomainName, TenantName);
+ }
+
+ TString GetDomain() const {
+ return DomainName;
+ }
+
+ TString GetTenant() const {
+ return TenantName;
+ }
+};
+
struct TDrainProgress : public TThrRefBase {
std::atomic_uint64_t Events = 0;
@@ -85,11 +85,11 @@ struct TEvLocal {
EvEnumerateTabletsResult,
EvTabletMetricsAck,
- EvAddTenant = EvRegisterNode + 1024,
- EvRemoveTenant,
- EvAlterTenant,
- EvTenantStatus,
-
+ EvAddTenant = EvRegisterNode + 1024,
+ EvRemoveTenant,
+ EvAlterTenant,
+ EvTenantStatus,
+
EvLocalDrainNode,
EvEnd
@@ -111,11 +111,11 @@ struct TEvLocal {
TEvPing()
{}
- TEvPing(ui64 hiveId, ui32 hiveGeneration, bool purge, const NKikimrLocal::TLocalConfig &config) {
+ TEvPing(ui64 hiveId, ui32 hiveGeneration, bool purge, const NKikimrLocal::TLocalConfig &config) {
Record.SetHiveId(hiveId);
Record.SetHiveGeneration(hiveGeneration);
Record.SetPurge(purge);
- Record.MutableConfig()->CopyFrom(config);
+ Record.MutableConfig()->CopyFrom(config);
}
};
@@ -262,83 +262,83 @@ struct TEvLocal {
struct TEvTabletMetricsAck : public TEventPB<TEvTabletMetricsAck, NKikimrLocal::TEvTabletMetricsAck, EvTabletMetricsAck> {
};
- struct TEvAddTenant : public TEventLocal<TEvAddTenant, EvAddTenant> {
- TRegistrationInfo TenantInfo;
+ struct TEvAddTenant : public TEventLocal<TEvAddTenant, EvAddTenant> {
+ TRegistrationInfo TenantInfo;
+
+ TEvAddTenant(const TString &domainName)
+ : TenantInfo(domainName)
+ {}
+
+ TEvAddTenant(const TString &domainName, NKikimrTabletBase::TMetrics resourceLimit)
+ : TenantInfo(domainName, resourceLimit)
+ {}
+
+ TEvAddTenant(const TRegistrationInfo &info)
+ : TenantInfo(info)
+ {}
+ };
+
+ struct TEvRemoveTenant : public TEventLocal<TEvRemoveTenant, EvRemoveTenant> {
+ TString TenantName;
+
+ TEvRemoveTenant(const TString &name)
+ : TenantName(name)
+ {}
+ };
+
+ struct TEvAlterTenant : public TEventLocal<TEvAlterTenant, EvAlterTenant> {
+ TRegistrationInfo TenantInfo;
- TEvAddTenant(const TString &domainName)
- : TenantInfo(domainName)
- {}
+ TEvAlterTenant(const TString &domainName)
+ : TenantInfo(domainName)
+ {}
- TEvAddTenant(const TString &domainName, NKikimrTabletBase::TMetrics resourceLimit)
- : TenantInfo(domainName, resourceLimit)
+ TEvAlterTenant(const TString &domainName, NKikimrTabletBase::TMetrics resourceLimit)
+ : TenantInfo(domainName, resourceLimit)
{}
- TEvAddTenant(const TRegistrationInfo &info)
- : TenantInfo(info)
+ TEvAlterTenant(const TRegistrationInfo &info)
+ : TenantInfo(info)
{}
};
- struct TEvRemoveTenant : public TEventLocal<TEvRemoveTenant, EvRemoveTenant> {
+ struct TEvTenantStatus : public TEventLocal<TEvTenantStatus, EvTenantStatus> {
+ enum EStatus {
+ STARTED,
+ STOPPED,
+ UNKNOWN_TENANT
+ };
+
TString TenantName;
-
- TEvRemoveTenant(const TString &name)
- : TenantName(name)
- {}
- };
-
- struct TEvAlterTenant : public TEventLocal<TEvAlterTenant, EvAlterTenant> {
- TRegistrationInfo TenantInfo;
-
- TEvAlterTenant(const TString &domainName)
- : TenantInfo(domainName)
- {}
-
- TEvAlterTenant(const TString &domainName, NKikimrTabletBase::TMetrics resourceLimit)
- : TenantInfo(domainName, resourceLimit)
- {}
-
- TEvAlterTenant(const TRegistrationInfo &info)
- : TenantInfo(info)
- {}
- };
-
- struct TEvTenantStatus : public TEventLocal<TEvTenantStatus, EvTenantStatus> {
- enum EStatus {
- STARTED,
- STOPPED,
- UNKNOWN_TENANT
- };
-
- TString TenantName;
- EStatus Status;
+ EStatus Status;
NKikimrTabletBase::TMetrics ResourceLimit;
- TString Error;
- THashMap<TString, TString> Attributes;
+ TString Error;
+ THashMap<TString, TString> Attributes;
TSubDomainKey DomainKey;
-
- TEvTenantStatus(const TString &tenant, EStatus status)
- : TenantName(tenant)
- , Status(status)
- {}
-
- TEvTenantStatus(const TString &tenant, EStatus status, const TString &error)
- : TenantName(tenant)
- , Status(status)
- , Error(error)
- {}
-
- TEvTenantStatus(const TString &tenant,
- EStatus status,
- NKikimrTabletBase::TMetrics resourceLimit,
+
+ TEvTenantStatus(const TString &tenant, EStatus status)
+ : TenantName(tenant)
+ , Status(status)
+ {}
+
+ TEvTenantStatus(const TString &tenant, EStatus status, const TString &error)
+ : TenantName(tenant)
+ , Status(status)
+ , Error(error)
+ {}
+
+ TEvTenantStatus(const TString &tenant,
+ EStatus status,
+ NKikimrTabletBase::TMetrics resourceLimit,
const THashMap<TString, TString> &attrs,
const TSubDomainKey &domainKey)
- : TenantName(tenant)
- , Status(status)
- , ResourceLimit(resourceLimit)
- , Attributes(attrs)
+ : TenantName(tenant)
+ , Status(status)
+ , ResourceLimit(resourceLimit)
+ , Attributes(attrs)
, DomainKey(domainKey)
- {}
- };
+ {}
+ };
struct TEvLocalDrainNode : public TEventLocal<TEvLocalDrainNode, EvLocalDrainNode> {
TIntrusivePtr<TDrainProgress> DrainProgress;
@@ -347,23 +347,23 @@ struct TEvLocal {
: DrainProgress(drainProgress)
{}
};
-};
+};
-struct TLocalConfig : public TThrRefBase {
- using TPtr = TIntrusivePtr<TLocalConfig>;
+struct TLocalConfig : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TLocalConfig>;
- struct TTabletClassInfo {
- TTabletSetupInfo::TPtr SetupInfo;
+ struct TTabletClassInfo {
+ TTabletSetupInfo::TPtr SetupInfo;
ui64 MaxCount = 0; // maximum allowed number of running tablets, 0 means unlimited
- TTabletClassInfo()
- {}
-
- TTabletClassInfo(TTabletSetupInfo::TPtr setupInfo)
- : SetupInfo(setupInfo)
- {}
- };
-
+ TTabletClassInfo()
+ {}
+
+ TTabletClassInfo(TTabletSetupInfo::TPtr setupInfo)
+ : SetupInfo(setupInfo)
+ {}
+ };
+
TMap<TTabletTypes::EType, TTabletClassInfo> TabletClassInfo;
};
diff --git a/ydb/core/mind/node_broker.cpp b/ydb/core/mind/node_broker.cpp
index 38daac5e981..a2ef9383691 100644
--- a/ydb/core/mind/node_broker.cpp
+++ b/ydb/core/mind/node_broker.cpp
@@ -1,6 +1,6 @@
-#include "node_broker_impl.h"
-#include "node_broker__scheme.h"
-
+#include "node_broker_impl.h"
+#include "node_broker__scheme.h"
+
#include <ydb/core/actorlib_impl/long_timer.h>
#include <ydb/core/base/appdata.h>
#include <ydb/core/base/path.h>
@@ -8,199 +8,199 @@
#include <ydb/core/protos/node_broker.pb.h>
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
#include <ydb/core/tx/scheme_cache/scheme_cache.h>
-
+
#include <library/cpp/monlib/service/pages/templates.h>
-
-#include <util/generic/set.h>
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-using namespace NKikimrNodeBroker;
-
-namespace {
-
-template <typename T>
-bool IsReady(T &t)
-{
- return t.IsReady();
-}
-
-template <typename T, typename ...Ts>
-bool IsReady(T &t, Ts &...args)
-{
- return t.IsReady() && IsReady(args...);
-}
-
-} // anonymous namespace
-
-void TNodeBroker::OnActivateExecutor(const TActorContext &ctx)
-{
+
+#include <util/generic/set.h>
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+using namespace NKikimrNodeBroker;
+
+namespace {
+
+template <typename T>
+bool IsReady(T &t)
+{
+ return t.IsReady();
+}
+
+template <typename T, typename ...Ts>
+bool IsReady(T &t, Ts &...args)
+{
+ return t.IsReady() && IsReady(args...);
+}
+
+} // anonymous namespace
+
+void TNodeBroker::OnActivateExecutor(const TActorContext &ctx)
+{
const auto *appData = AppData(ctx);
-
+
DomainId = appData->DomainsInfo->GetDomainUidByTabletId(TabletID());
Y_VERIFY(DomainId < DOMAINS_COUNT);
SingleDomain = appData->DomainsInfo->Domains.size() == 1;
SingleDomainAlloc = SingleDomain && appData->FeatureFlags.GetEnableNodeBrokerSingleDomainMode();
-
+
MaxStaticId = Min(appData->DynamicNameserviceConfig->MaxStaticNodeId, TActorId::MaxNodeId);
MaxDynamicId = Min(appData->DynamicNameserviceConfig->MaxDynamicNodeId, TActorId::MaxNodeId);
- ClearState();
-
- ProcessTx(CreateTxInitScheme(), ctx);
-}
-
-void TNodeBroker::OnDetach(const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TNodeBroker::OnDetach");
-
- Die(ctx);
-}
-
-void TNodeBroker::OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev,
- const TActorContext &ctx)
-{
- Y_UNUSED(ev);
-
- LOG_INFO(ctx, NKikimrServices::NODE_BROKER, "OnTabletDead: %" PRIu64, TabletID());
-
- Die(ctx);
-}
-
-void TNodeBroker::Enqueue(TAutoPtr<IEventHandle> &ev,
- const TActorContext &ctx)
-{
- switch (ev->GetTypeRewrite()) {
- case TEvNodeBroker::EvListNodes:
- case TEvNodeBroker::EvResolveNode:
- case TEvNodeBroker::EvRegistrationRequest:
- EnqueuedEvents.push_back(ev);
+ ClearState();
+
+ ProcessTx(CreateTxInitScheme(), ctx);
+}
+
+void TNodeBroker::OnDetach(const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TNodeBroker::OnDetach");
+
+ Die(ctx);
+}
+
+void TNodeBroker::OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev,
+ const TActorContext &ctx)
+{
+ Y_UNUSED(ev);
+
+ LOG_INFO(ctx, NKikimrServices::NODE_BROKER, "OnTabletDead: %" PRIu64, TabletID());
+
+ Die(ctx);
+}
+
+void TNodeBroker::Enqueue(TAutoPtr<IEventHandle> &ev,
+ const TActorContext &ctx)
+{
+ switch (ev->GetTypeRewrite()) {
+ case TEvNodeBroker::EvListNodes:
+ case TEvNodeBroker::EvResolveNode:
+ case TEvNodeBroker::EvRegistrationRequest:
+ EnqueuedEvents.push_back(ev);
[[fallthrough]]; // AUTOGENERATED_FALLTHROUGH_FIXME
- default:
- TTabletExecutedFlat::Enqueue(ev, ctx);
- }
-}
-
-bool TNodeBroker::OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev,
- const TActorContext &ctx)
-{
- if (!ev)
- return true;
-
- TStringStream str;
- HTML(str) {
- PRE() {
- str << "Served domain: " << AppData(ctx)->DomainsInfo->Domains.at(DomainId)->Name << Endl
- << "DynamicNameserviceConfig:" << Endl
- << " MaxStaticNodeId: " << AppData(ctx)->DynamicNameserviceConfig->MaxStaticNodeId << Endl
- << " MaxDynamicNodeId: " << AppData(ctx)->DynamicNameserviceConfig->MaxDynamicNodeId << Endl
- << " EpochDuration: " << EpochDuration << Endl
- << " BannedIds:";
- for (auto &pr : BannedIds)
- str << " [" << pr.first << ", " << pr.second << "]";
- str << Endl << Endl;
- str << "Registered nodes:" << Endl;
-
- TSet<ui32> ids;
- for (auto &pr : Nodes)
- ids.insert(pr.first);
- for (auto id : ids) {
- auto &node = Nodes.at(id);
- str << " - " << id << Endl
- << " Address: " << node.Address << Endl
- << " Host: " << node.Host << Endl
- << " ResolveHost: " << node.ResolveHost << Endl
- << " Port: " << node.Port << Endl
+ default:
+ TTabletExecutedFlat::Enqueue(ev, ctx);
+ }
+}
+
+bool TNodeBroker::OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev,
+ const TActorContext &ctx)
+{
+ if (!ev)
+ return true;
+
+ TStringStream str;
+ HTML(str) {
+ PRE() {
+ str << "Served domain: " << AppData(ctx)->DomainsInfo->Domains.at(DomainId)->Name << Endl
+ << "DynamicNameserviceConfig:" << Endl
+ << " MaxStaticNodeId: " << AppData(ctx)->DynamicNameserviceConfig->MaxStaticNodeId << Endl
+ << " MaxDynamicNodeId: " << AppData(ctx)->DynamicNameserviceConfig->MaxDynamicNodeId << Endl
+ << " EpochDuration: " << EpochDuration << Endl
+ << " BannedIds:";
+ for (auto &pr : BannedIds)
+ str << " [" << pr.first << ", " << pr.second << "]";
+ str << Endl << Endl;
+ str << "Registered nodes:" << Endl;
+
+ TSet<ui32> ids;
+ for (auto &pr : Nodes)
+ ids.insert(pr.first);
+ for (auto id : ids) {
+ auto &node = Nodes.at(id);
+ str << " - " << id << Endl
+ << " Address: " << node.Address << Endl
+ << " Host: " << node.Host << Endl
+ << " ResolveHost: " << node.ResolveHost << Endl
+ << " Port: " << node.Port << Endl
<< " DataCenter: " << node.Location.GetDataCenterId() << Endl
<< " Location: " << node.Location.ToString() << Endl
- << " Lease: " << node.Lease << Endl
- << " Expire: " << node.ExpirationString() << Endl;
- }
- str << Endl;
-
- str << "Free Node IDs count: " << FreeIds.Count() << Endl;
- }
- }
-
- ctx.Send(ev->Sender, new NMon::TEvRemoteHttpInfoRes(str.Str()));
- return true;
-}
-
-void TNodeBroker::Cleanup(const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TNodeBroker::Cleanup");
-
- TxProcessor->Clear();
-}
-
-void TNodeBroker::Die(const TActorContext &ctx)
-{
- Cleanup(ctx);
- TActorBase::Die(ctx);
-}
-
-void TNodeBroker::ClearState()
-{
- Nodes.clear();
- ExpiredNodes.clear();
- Hosts.clear();
-
- RecomputeFreeIds();
-}
-
-void TNodeBroker::AddNode(const TNodeInfo &info)
-{
+ << " Lease: " << node.Lease << Endl
+ << " Expire: " << node.ExpirationString() << Endl;
+ }
+ str << Endl;
+
+ str << "Free Node IDs count: " << FreeIds.Count() << Endl;
+ }
+ }
+
+ ctx.Send(ev->Sender, new NMon::TEvRemoteHttpInfoRes(str.Str()));
+ return true;
+}
+
+void TNodeBroker::Cleanup(const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TNodeBroker::Cleanup");
+
+ TxProcessor->Clear();
+}
+
+void TNodeBroker::Die(const TActorContext &ctx)
+{
+ Cleanup(ctx);
+ TActorBase::Die(ctx);
+}
+
+void TNodeBroker::ClearState()
+{
+ Nodes.clear();
+ ExpiredNodes.clear();
+ Hosts.clear();
+
+ RecomputeFreeIds();
+}
+
+void TNodeBroker::AddNode(const TNodeInfo &info)
+{
FreeIds.Reset(info.NodeId);
-
- if (info.Expire > Epoch.Start) {
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Added node " << info.IdString());
-
+
+ if (info.Expire > Epoch.Start) {
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Added node " << info.IdString());
+
Hosts.emplace(std::make_tuple(info.Host, info.Address, info.Port), info.NodeId);
- Nodes.emplace(info.NodeId, info);
- } else {
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Added expired node " << info.IdString());
-
- ExpiredNodes.emplace(info.NodeId, info);
- }
-}
-
-void TNodeBroker::ExtendLease(TNodeInfo &node)
-{
- ++node.Lease;
- node.Expire = Epoch.NextEnd;
-
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Extended lease of " << node.IdString() << " up to "
- << node.ExpirationString() << " (lease " << node.Lease << ")");
-}
-
-void TNodeBroker::FixNodeId(TNodeInfo &node)
-{
- ++node.Lease;
- node.Expire = TInstant::Max();
-
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Fix ID for node " << node.IdString());
-}
-
-void TNodeBroker::RecomputeFreeIds()
-{
+ Nodes.emplace(info.NodeId, info);
+ } else {
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Added expired node " << info.IdString());
+
+ ExpiredNodes.emplace(info.NodeId, info);
+ }
+}
+
+void TNodeBroker::ExtendLease(TNodeInfo &node)
+{
+ ++node.Lease;
+ node.Expire = Epoch.NextEnd;
+
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Extended lease of " << node.IdString() << " up to "
+ << node.ExpirationString() << " (lease " << node.Lease << ")");
+}
+
+void TNodeBroker::FixNodeId(TNodeInfo &node)
+{
+ ++node.Lease;
+ node.Expire = TInstant::Max();
+
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Fix ID for node " << node.IdString());
+}
+
+void TNodeBroker::RecomputeFreeIds()
+{
FreeIds.Clear();
-
+
if (SingleDomainAlloc) {
FreeIds.Set(MaxStaticId + 1, MaxDynamicId + 1);
} else {
auto firstId = RewriteNodeId(MaxStaticId + 1);
if (firstId <= MaxStaticId)
firstId += NodeIdStep();
-
+
auto lastId = RewriteNodeId(MaxDynamicId);
if (lastId > MaxDynamicId)
lastId -= NodeIdStep();
-
+
// Only ids marked with our domain id are available
FreeIds.Reserve(lastId + 1);
for (ui32 id = firstId; id <= lastId; id += NodeIdStep()) {
@@ -208,256 +208,256 @@ void TNodeBroker::RecomputeFreeIds()
}
}
- // Remove all allocated IDs from the set.
- for (auto &pr : Nodes)
+ // Remove all allocated IDs from the set.
+ for (auto &pr : Nodes)
FreeIds.Reset(pr.first);
- for (auto &pr : ExpiredNodes)
+ for (auto &pr : ExpiredNodes)
FreeIds.Reset(pr.first);
-
- // Remove banned intervals from the set.
- for (auto &pr : BannedIds) {
+
+ // Remove banned intervals from the set.
+ for (auto &pr : BannedIds) {
FreeIds.Reset(pr.first, pr.second + 1);
- }
-}
-
-bool TNodeBroker::IsBannedId(ui32 id) const
-{
- for (auto &pr : BannedIds)
- if (id >= pr.first && id <= pr.second)
- return true;
- return false;
-}
-
-void TNodeBroker::AddDelayedListNodesRequest(ui64 epoch,
- TEvNodeBroker::TEvListNodes::TPtr &ev)
-{
- Y_VERIFY(epoch > Epoch.Id);
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Delaying list nodes request for epoch #" << epoch);
-
- DelayedListNodesRequests.emplace(epoch, ev);
-}
-
-void TNodeBroker::ProcessListNodesRequest(TEvNodeBroker::TEvListNodes::TPtr &ev)
-{
- ui64 version = ev->Get()->Record.GetCachedVersion();
-
- NKikimrNodeBroker::TNodesInfo info;
- Epoch.Serialize(*info.MutableEpoch());
- info.SetDomain(DomainId);
- TAutoPtr<TEvNodeBroker::TEvNodesInfo> resp = new TEvNodeBroker::TEvNodesInfo(info);
- if (version != Epoch.Version)
- resp->PreSerializedData = EpochCache;
-
- LOG_TRACE_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Send TEvNodesInfo for epoch " << Epoch.ToString());
-
- Send(ev->Sender, resp.Release());
-}
-
-void TNodeBroker::ProcessDelayedListNodesRequests()
-{
- while (!DelayedListNodesRequests.empty()) {
- auto it = DelayedListNodesRequests.begin();
- if (it->first > Epoch.Id)
- break;
-
- ProcessListNodesRequest(it->second);
- DelayedListNodesRequests.erase(it);
- }
-}
-
-void TNodeBroker::ScheduleEpochUpdate(const TActorContext &ctx)
-{
- auto now = ctx.Now();
- if (now >= Epoch.End) {
- ctx.Schedule(TDuration::Zero(), new TEvPrivate::TEvUpdateEpoch);
- } else {
- auto *ev = new IEventHandle(SelfId(), SelfId(), new TEvPrivate::TEvUpdateEpoch);
- EpochTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
- CreateLongTimer(ctx, Epoch.End - now, ev, AppData(ctx)->SystemPoolId,
- EpochTimerCookieHolder.Get());
-
- LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
- "Scheduled epoch update at " << Epoch.End);
- }
-}
-
-void TNodeBroker::ProcessEnqueuedEvents(const TActorContext &ctx)
-{
- for (auto &ev : EnqueuedEvents)
- Receive(ev, ctx);
- EnqueuedEvents.clear();
-}
-
-void TNodeBroker::FillNodeInfo(const TNodeInfo &node,
- NKikimrNodeBroker::TNodeInfo &info) const
-{
- info.SetNodeId(node.NodeId);
- info.SetHost(node.Host);
- info.SetPort(node.Port);
- info.SetResolveHost(node.ResolveHost);
- info.SetAddress(node.Address);
- info.SetExpire(node.Expire.GetValue());
+ }
+}
+
+bool TNodeBroker::IsBannedId(ui32 id) const
+{
+ for (auto &pr : BannedIds)
+ if (id >= pr.first && id <= pr.second)
+ return true;
+ return false;
+}
+
+void TNodeBroker::AddDelayedListNodesRequest(ui64 epoch,
+ TEvNodeBroker::TEvListNodes::TPtr &ev)
+{
+ Y_VERIFY(epoch > Epoch.Id);
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Delaying list nodes request for epoch #" << epoch);
+
+ DelayedListNodesRequests.emplace(epoch, ev);
+}
+
+void TNodeBroker::ProcessListNodesRequest(TEvNodeBroker::TEvListNodes::TPtr &ev)
+{
+ ui64 version = ev->Get()->Record.GetCachedVersion();
+
+ NKikimrNodeBroker::TNodesInfo info;
+ Epoch.Serialize(*info.MutableEpoch());
+ info.SetDomain(DomainId);
+ TAutoPtr<TEvNodeBroker::TEvNodesInfo> resp = new TEvNodeBroker::TEvNodesInfo(info);
+ if (version != Epoch.Version)
+ resp->PreSerializedData = EpochCache;
+
+ LOG_TRACE_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Send TEvNodesInfo for epoch " << Epoch.ToString());
+
+ Send(ev->Sender, resp.Release());
+}
+
+void TNodeBroker::ProcessDelayedListNodesRequests()
+{
+ while (!DelayedListNodesRequests.empty()) {
+ auto it = DelayedListNodesRequests.begin();
+ if (it->first > Epoch.Id)
+ break;
+
+ ProcessListNodesRequest(it->second);
+ DelayedListNodesRequests.erase(it);
+ }
+}
+
+void TNodeBroker::ScheduleEpochUpdate(const TActorContext &ctx)
+{
+ auto now = ctx.Now();
+ if (now >= Epoch.End) {
+ ctx.Schedule(TDuration::Zero(), new TEvPrivate::TEvUpdateEpoch);
+ } else {
+ auto *ev = new IEventHandle(SelfId(), SelfId(), new TEvPrivate::TEvUpdateEpoch);
+ EpochTimerCookieHolder.Reset(ISchedulerCookie::Make2Way());
+ CreateLongTimer(ctx, Epoch.End - now, ev, AppData(ctx)->SystemPoolId,
+ EpochTimerCookieHolder.Get());
+
+ LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
+ "Scheduled epoch update at " << Epoch.End);
+ }
+}
+
+void TNodeBroker::ProcessEnqueuedEvents(const TActorContext &ctx)
+{
+ for (auto &ev : EnqueuedEvents)
+ Receive(ev, ctx);
+ EnqueuedEvents.clear();
+}
+
+void TNodeBroker::FillNodeInfo(const TNodeInfo &node,
+ NKikimrNodeBroker::TNodeInfo &info) const
+{
+ info.SetNodeId(node.NodeId);
+ info.SetHost(node.Host);
+ info.SetPort(node.Port);
+ info.SetResolveHost(node.ResolveHost);
+ info.SetAddress(node.Address);
+ info.SetExpire(node.Expire.GetValue());
node.Location.Serialize(info.MutableLocation());
-}
-
-void TNodeBroker::ComputeNextEpochDiff(TStateDiff &diff)
-{
- for (auto &pr : Nodes) {
- if (pr.second.Expire <= Epoch.End)
- diff.NodesToExpire.push_back(pr.first);
- }
-
- for (auto &pr : ExpiredNodes)
- diff.NodesToRemove.push_back(pr.first);
-
- diff.NewEpoch.Id = Epoch.Id + 1;
- diff.NewEpoch.Version = Epoch.Version + 1;
- diff.NewEpoch.Start = Epoch.End;
- diff.NewEpoch.End = Epoch.NextEnd;
- diff.NewEpoch.NextEnd = diff.NewEpoch.End + EpochDuration;
-}
-
-void TNodeBroker::ApplyStateDiff(const TStateDiff &diff)
-{
- for (auto id : diff.NodesToExpire) {
- auto it = Nodes.find(id);
- Y_VERIFY(it != Nodes.end());
-
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Node " << it->second.IdString() << " has expired");
-
+}
+
+void TNodeBroker::ComputeNextEpochDiff(TStateDiff &diff)
+{
+ for (auto &pr : Nodes) {
+ if (pr.second.Expire <= Epoch.End)
+ diff.NodesToExpire.push_back(pr.first);
+ }
+
+ for (auto &pr : ExpiredNodes)
+ diff.NodesToRemove.push_back(pr.first);
+
+ diff.NewEpoch.Id = Epoch.Id + 1;
+ diff.NewEpoch.Version = Epoch.Version + 1;
+ diff.NewEpoch.Start = Epoch.End;
+ diff.NewEpoch.End = Epoch.NextEnd;
+ diff.NewEpoch.NextEnd = diff.NewEpoch.End + EpochDuration;
+}
+
+void TNodeBroker::ApplyStateDiff(const TStateDiff &diff)
+{
+ for (auto id : diff.NodesToExpire) {
+ auto it = Nodes.find(id);
+ Y_VERIFY(it != Nodes.end());
+
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Node " << it->second.IdString() << " has expired");
+
Hosts.erase(std::make_tuple(it->second.Host, it->second.Address, it->second.Port));
- ExpiredNodes.emplace(id, std::move(it->second));
- Nodes.erase(it);
- }
-
- for (auto id : diff.NodesToRemove) {
- auto it = ExpiredNodes.find(id);
- Y_VERIFY(it != ExpiredNodes.end());
-
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Remove node " << it->second.IdString());
-
- ExpiredNodes.erase(it);
+ ExpiredNodes.emplace(id, std::move(it->second));
+ Nodes.erase(it);
+ }
+
+ for (auto id : diff.NodesToRemove) {
+ auto it = ExpiredNodes.find(id);
+ Y_VERIFY(it != ExpiredNodes.end());
+
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Remove node " << it->second.IdString());
+
+ ExpiredNodes.erase(it);
if (!IsBannedId(id) && NodeIdDomain(id) == DomainId)
FreeIds.Set(id);
- }
-
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Move to new epoch " << diff.NewEpoch.ToString());
-
- Epoch = diff.NewEpoch;
-}
-
-void TNodeBroker::UpdateEpochVersion()
-{
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Update current epoch version from " << Epoch.Version
- << " to " << Epoch.Version + 1);
-
- ++Epoch.Version;
-}
-
-void TNodeBroker::PrepareEpochCache()
-{
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Preparing nodes list cache for epoch #" << Epoch.Id
- << " nodes=" << Nodes.size() << " expired=" << ExpiredNodes.size());
-
- NKikimrNodeBroker::TNodesInfo info;
- for (auto &entry : Nodes)
- FillNodeInfo(entry.second, *info.AddNodes());
- for (auto &entry : ExpiredNodes)
- FillNodeInfo(entry.second, *info.AddExpiredNodes());
-
+ }
+
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Move to new epoch " << diff.NewEpoch.ToString());
+
+ Epoch = diff.NewEpoch;
+}
+
+void TNodeBroker::UpdateEpochVersion()
+{
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Update current epoch version from " << Epoch.Version
+ << " to " << Epoch.Version + 1);
+
+ ++Epoch.Version;
+}
+
+void TNodeBroker::PrepareEpochCache()
+{
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Preparing nodes list cache for epoch #" << Epoch.Id
+ << " nodes=" << Nodes.size() << " expired=" << ExpiredNodes.size());
+
+ NKikimrNodeBroker::TNodesInfo info;
+ for (auto &entry : Nodes)
+ FillNodeInfo(entry.second, *info.AddNodes());
+ for (auto &entry : ExpiredNodes)
+ FillNodeInfo(entry.second, *info.AddExpiredNodes());
+
Y_PROTOBUF_SUPPRESS_NODISCARD info.SerializeToString(&EpochCache);
-}
-
-void TNodeBroker::AddNodeToEpochCache(const TNodeInfo &node)
-{
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Add node " << node.IdString() << " to epoch cache");
-
- NKikimrNodeBroker::TNodesInfo info;
- FillNodeInfo(node, *info.AddNodes());
-
- TString delta;
+}
+
+void TNodeBroker::AddNodeToEpochCache(const TNodeInfo &node)
+{
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Add node " << node.IdString() << " to epoch cache");
+
+ NKikimrNodeBroker::TNodesInfo info;
+ FillNodeInfo(node, *info.AddNodes());
+
+ TString delta;
Y_PROTOBUF_SUPPRESS_NODISCARD info.SerializeToString(&delta);
-
- EpochCache += delta;
-}
-
-void TNodeBroker::SubscribeForConfigUpdates(const TActorContext &ctx)
-{
- if (ConfigSubscriptionId)
- return;
-
- ui32 item = (ui32)NKikimrConsole::TConfigItem::NodeBrokerConfigItem;
- ctx.Register(NConsole::CreateConfigSubscriber(TabletID(),
- {item},
- "",
- ctx.SelfID));
-}
-
-void TNodeBroker::ProcessTx(ITransaction *tx,
- const TActorContext &ctx)
-{
- TxProcessor->ProcessTx(tx, ctx);
-}
-
-void TNodeBroker::ProcessTx(ui32 nodeId,
- ITransaction *tx,
- const TActorContext &ctx)
-{
- TxProcessor->GetSubProcessor(ToString(nodeId), ctx)->ProcessTx(tx, ctx);
-}
-
-void TNodeBroker::TxCompleted(ITransaction *tx,
- const TActorContext &ctx)
-{
- TxProcessor->TxCompleted(tx, ctx);
-}
-
-void TNodeBroker::TxCompleted(ui32 nodeId,
- ITransaction *tx,
- const TActorContext &ctx)
-{
- TxProcessor->GetSubProcessor(ToString(nodeId), ctx)->TxCompleted(tx, ctx);
-}
-
-void TNodeBroker::LoadConfigFromProto(const NKikimrNodeBroker::TConfig &config)
-{
- Config = config;
-
- EpochDuration = TDuration::MicroSeconds(config.GetEpochDuration());
- if (EpochDuration < MIN_LEASE_DURATION) {
- LOG_ERROR_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Configured lease duration (" << EpochDuration << ") is too"
- " small. Using min. value: " << MIN_LEASE_DURATION);
- EpochDuration = MIN_LEASE_DURATION;
- }
-
- BannedIds.clear();
- for (auto &banned : config.GetBannedNodeIds())
- BannedIds.emplace_back(banned.GetFrom(), banned.GetTo());
- RecomputeFreeIds();
-}
-
-void TNodeBroker::DbAddNode(const TNodeInfo &node,
- TTransactionContext &txc)
-{
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Adding node " << node.IdString() << " to database"
- << " resolvehost=" << node.ResolveHost
- << " address=" << node.Address
+
+ EpochCache += delta;
+}
+
+void TNodeBroker::SubscribeForConfigUpdates(const TActorContext &ctx)
+{
+ if (ConfigSubscriptionId)
+ return;
+
+ ui32 item = (ui32)NKikimrConsole::TConfigItem::NodeBrokerConfigItem;
+ ctx.Register(NConsole::CreateConfigSubscriber(TabletID(),
+ {item},
+ "",
+ ctx.SelfID));
+}
+
+void TNodeBroker::ProcessTx(ITransaction *tx,
+ const TActorContext &ctx)
+{
+ TxProcessor->ProcessTx(tx, ctx);
+}
+
+void TNodeBroker::ProcessTx(ui32 nodeId,
+ ITransaction *tx,
+ const TActorContext &ctx)
+{
+ TxProcessor->GetSubProcessor(ToString(nodeId), ctx)->ProcessTx(tx, ctx);
+}
+
+void TNodeBroker::TxCompleted(ITransaction *tx,
+ const TActorContext &ctx)
+{
+ TxProcessor->TxCompleted(tx, ctx);
+}
+
+void TNodeBroker::TxCompleted(ui32 nodeId,
+ ITransaction *tx,
+ const TActorContext &ctx)
+{
+ TxProcessor->GetSubProcessor(ToString(nodeId), ctx)->TxCompleted(tx, ctx);
+}
+
+void TNodeBroker::LoadConfigFromProto(const NKikimrNodeBroker::TConfig &config)
+{
+ Config = config;
+
+ EpochDuration = TDuration::MicroSeconds(config.GetEpochDuration());
+ if (EpochDuration < MIN_LEASE_DURATION) {
+ LOG_ERROR_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Configured lease duration (" << EpochDuration << ") is too"
+ " small. Using min. value: " << MIN_LEASE_DURATION);
+ EpochDuration = MIN_LEASE_DURATION;
+ }
+
+ BannedIds.clear();
+ for (auto &banned : config.GetBannedNodeIds())
+ BannedIds.emplace_back(banned.GetFrom(), banned.GetTo());
+ RecomputeFreeIds();
+}
+
+void TNodeBroker::DbAddNode(const TNodeInfo &node,
+ TTransactionContext &txc)
+{
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Adding node " << node.IdString() << " to database"
+ << " resolvehost=" << node.ResolveHost
+ << " address=" << node.Address
<< " dc=" << node.Location.GetDataCenterId()
<< " location=" << node.Location.ToString()
- << " lease=" << node.Lease
- << " expire=" << node.ExpirationString());
-
- NIceDb::TNiceDb db(txc.DB);
+ << " lease=" << node.Lease
+ << " expire=" << node.ExpirationString());
+
+ NIceDb::TNiceDb db(txc.DB);
using T = Schema::Nodes;
db.Table<T>().Key(node.NodeId)
.Update<T::Host>(node.Host)
@@ -471,113 +471,113 @@ void TNodeBroker::DbAddNode(const TNodeInfo &node,
// to be removed
const auto& x = node.Location.GetLegacyValue();
db.Table<T>().Key(node.NodeId).Update<T::DataCenter, T::Room, T::Rack, T::Body>(x.DataCenter, x.Room, x.Rack, x.Body);
-}
-
-void TNodeBroker::DbApplyStateDiff(const TStateDiff &diff,
- TTransactionContext &txc)
-{
- DbRemoveNodes(diff.NodesToRemove, txc);
- DbUpdateEpoch(diff.NewEpoch, txc);
-}
-
-void TNodeBroker::DbFixNodeId(const TNodeInfo &node,
- TTransactionContext &txc)
-{
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Fix ID for node: " << node.IdString());
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Nodes>().Key(node.NodeId)
- .Update<Schema::Nodes::Lease>(node.Lease + 1)
- .Update<Schema::Nodes::Expire>(TInstant::Max().GetValue());
-}
-
-bool TNodeBroker::DbLoadState(TTransactionContext &txc,
- const TActorContext &ctx)
-{
- NIceDb::TNiceDb db(txc.DB);
- bool updateEpoch = false;
-
- if (!db.Precharge<Schema>())
- return false;
-
- auto configRow = db.Table<Schema::Config>()
- .Key(ConfigKeyConfig).Select<Schema::Config::Value>();
- auto subscriptionRow = db.Table<Schema::Params>()
- .Key(ParamKeyConfigSubscription).Select<Schema::Params::Value>();
- auto currentEpochIdRow = db.Table<Schema::Params>()
- .Key(ParamKeyCurrentEpochId).Select<Schema::Params::Value>();
- auto currentEpochVersionRow = db.Table<Schema::Params>()
- .Key(ParamKeyCurrentEpochVersion).Select<Schema::Params::Value>();
- auto currentEpochStartRow = db.Table<Schema::Params>()
- .Key(ParamKeyCurrentEpochStart).Select<Schema::Params::Value>();
- auto currentEpochEndRow = db.Table<Schema::Params>()
- .Key(ParamKeyCurrentEpochEnd).Select<Schema::Params::Value>();
- auto nextEpochEndRow = db.Table<Schema::Params>()
- .Key(ParamKeyNextEpochEnd).Select<Schema::Params::Value>();
- auto nodesRowset = db.Table<Schema::Nodes>()
- .Range().Select<Schema::Nodes::TColumns>();
-
- if (!IsReady(configRow, subscriptionRow, currentEpochIdRow,
- currentEpochVersionRow, currentEpochStartRow,
- currentEpochEndRow, nextEpochEndRow, nodesRowset))
- return false;
-
- ClearState();
-
- if (configRow.IsValid()) {
- auto configString = configRow.GetValue<Schema::Config::Value>();
- NKikimrNodeBroker::TConfig config;
+}
+
+void TNodeBroker::DbApplyStateDiff(const TStateDiff &diff,
+ TTransactionContext &txc)
+{
+ DbRemoveNodes(diff.NodesToRemove, txc);
+ DbUpdateEpoch(diff.NewEpoch, txc);
+}
+
+void TNodeBroker::DbFixNodeId(const TNodeInfo &node,
+ TTransactionContext &txc)
+{
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Fix ID for node: " << node.IdString());
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Nodes>().Key(node.NodeId)
+ .Update<Schema::Nodes::Lease>(node.Lease + 1)
+ .Update<Schema::Nodes::Expire>(TInstant::Max().GetValue());
+}
+
+bool TNodeBroker::DbLoadState(TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ NIceDb::TNiceDb db(txc.DB);
+ bool updateEpoch = false;
+
+ if (!db.Precharge<Schema>())
+ return false;
+
+ auto configRow = db.Table<Schema::Config>()
+ .Key(ConfigKeyConfig).Select<Schema::Config::Value>();
+ auto subscriptionRow = db.Table<Schema::Params>()
+ .Key(ParamKeyConfigSubscription).Select<Schema::Params::Value>();
+ auto currentEpochIdRow = db.Table<Schema::Params>()
+ .Key(ParamKeyCurrentEpochId).Select<Schema::Params::Value>();
+ auto currentEpochVersionRow = db.Table<Schema::Params>()
+ .Key(ParamKeyCurrentEpochVersion).Select<Schema::Params::Value>();
+ auto currentEpochStartRow = db.Table<Schema::Params>()
+ .Key(ParamKeyCurrentEpochStart).Select<Schema::Params::Value>();
+ auto currentEpochEndRow = db.Table<Schema::Params>()
+ .Key(ParamKeyCurrentEpochEnd).Select<Schema::Params::Value>();
+ auto nextEpochEndRow = db.Table<Schema::Params>()
+ .Key(ParamKeyNextEpochEnd).Select<Schema::Params::Value>();
+ auto nodesRowset = db.Table<Schema::Nodes>()
+ .Range().Select<Schema::Nodes::TColumns>();
+
+ if (!IsReady(configRow, subscriptionRow, currentEpochIdRow,
+ currentEpochVersionRow, currentEpochStartRow,
+ currentEpochEndRow, nextEpochEndRow, nodesRowset))
+ return false;
+
+ ClearState();
+
+ if (configRow.IsValid()) {
+ auto configString = configRow.GetValue<Schema::Config::Value>();
+ NKikimrNodeBroker::TConfig config;
Y_PROTOBUF_SUPPRESS_NODISCARD config.ParseFromArray(configString.data(), configString.size());
- LoadConfigFromProto(config);
-
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "Loaded config:" << Endl << config.DebugString());
- } else {
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "Using default config.");
-
- LoadConfigFromProto(NKikimrNodeBroker::TConfig());
- }
-
- if (subscriptionRow.IsValid()) {
- ConfigSubscriptionId = subscriptionRow.GetValue<Schema::Params::Value>();
-
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "Loaded config subscription: " << ConfigSubscriptionId);
- }
-
- if (currentEpochIdRow.IsValid()) {
- Y_VERIFY(currentEpochVersionRow.IsValid());
- Y_VERIFY(currentEpochStartRow.IsValid());
- Y_VERIFY(currentEpochEndRow.IsValid());
- Y_VERIFY(nextEpochEndRow.IsValid());
- TString val;
-
- Epoch.Id = currentEpochIdRow.GetValue<Schema::Params::Value>();
- Epoch.Version = currentEpochVersionRow.GetValue<Schema::Params::Value>();
- Epoch.Start = TInstant::FromValue(currentEpochStartRow.GetValue<Schema::Params::Value>());
- Epoch.End = TInstant::FromValue(currentEpochEndRow.GetValue<Schema::Params::Value>());
- Epoch.NextEnd = TInstant::FromValue(nextEpochEndRow.GetValue<Schema::Params::Value>());
-
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "Loaded current epoch: " << Epoch.ToString());
- } else {
- // If there is no epoch start the first one.
- Epoch.Id = 1;
- Epoch.Version = 1;
- Epoch.Start = ctx.Now();
- Epoch.End = Epoch.Start + EpochDuration;
- Epoch.NextEnd = Epoch.End + EpochDuration;
-
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "Starting the first epoch: " << Epoch.ToString());
-
- updateEpoch = true;
- }
-
- TVector<ui32> toRemove;
- while (!nodesRowset.EndOfSet()) {
+ LoadConfigFromProto(config);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "Loaded config:" << Endl << config.DebugString());
+ } else {
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "Using default config.");
+
+ LoadConfigFromProto(NKikimrNodeBroker::TConfig());
+ }
+
+ if (subscriptionRow.IsValid()) {
+ ConfigSubscriptionId = subscriptionRow.GetValue<Schema::Params::Value>();
+
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "Loaded config subscription: " << ConfigSubscriptionId);
+ }
+
+ if (currentEpochIdRow.IsValid()) {
+ Y_VERIFY(currentEpochVersionRow.IsValid());
+ Y_VERIFY(currentEpochStartRow.IsValid());
+ Y_VERIFY(currentEpochEndRow.IsValid());
+ Y_VERIFY(nextEpochEndRow.IsValid());
+ TString val;
+
+ Epoch.Id = currentEpochIdRow.GetValue<Schema::Params::Value>();
+ Epoch.Version = currentEpochVersionRow.GetValue<Schema::Params::Value>();
+ Epoch.Start = TInstant::FromValue(currentEpochStartRow.GetValue<Schema::Params::Value>());
+ Epoch.End = TInstant::FromValue(currentEpochEndRow.GetValue<Schema::Params::Value>());
+ Epoch.NextEnd = TInstant::FromValue(nextEpochEndRow.GetValue<Schema::Params::Value>());
+
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "Loaded current epoch: " << Epoch.ToString());
+ } else {
+ // If there is no epoch start the first one.
+ Epoch.Id = 1;
+ Epoch.Version = 1;
+ Epoch.Start = ctx.Now();
+ Epoch.End = Epoch.Start + EpochDuration;
+ Epoch.NextEnd = Epoch.End + EpochDuration;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "Starting the first epoch: " << Epoch.ToString());
+
+ updateEpoch = true;
+ }
+
+ TVector<ui32> toRemove;
+ while (!nodesRowset.EndOfSet()) {
using T = Schema::Nodes;
auto id = nodesRowset.GetValue<T::ID>();
// We don't remove nodes with a different domain id when there's a
@@ -586,16 +586,16 @@ bool TNodeBroker::DbLoadState(TTransactionContext &txc,
// should still support nodes that have been registered before we
// restarted, even though it's not available for allocation.
if (!SingleDomain && NodeIdDomain(id) != DomainId) {
- LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
- "Ignoring node with wrong ID " << id << " from domain "
+ LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
+ "Ignoring node with wrong ID " << id << " from domain "
<< NodeIdDomain(id) << " (expected " << DomainId << ")");
- toRemove.push_back(id);
- } else if (id <= MaxStaticId || id > MaxDynamicId) {
- LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
- "Ignoring node with wrong ID " << id << " not in range ("
- << MaxStaticId << ", " << MaxDynamicId << "]");
- toRemove.push_back(id);
- } else {
+ toRemove.push_back(id);
+ } else if (id <= MaxStaticId || id > MaxDynamicId) {
+ LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
+ "Ignoring node with wrong ID " << id << " not in range ("
+ << MaxStaticId << ", " << MaxDynamicId << "]");
+ toRemove.push_back(id);
+ } else {
auto expire = TInstant::FromValue(nodesRowset.GetValue<T::Expire>());
std::optional<TNodeLocation> legacyLocation, modernLocation;
if (nodesRowset.HaveValue<T::DataCenter>() && nodesRowset.HaveValue<T::Room>() &&
@@ -639,109 +639,109 @@ bool TNodeBroker::DbLoadState(TTransactionContext &txc,
location,
legacyLocation && !modernLocation}; // format update pending
info.Lease = nodesRowset.GetValue<T::Lease>();
- info.Expire = expire;
-
- AddNode(info);
-
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "Loaded node " << info.IdString()
- << " expiring " << info.ExpirationString());
- }
-
- if (!nodesRowset.Next())
- return false;
- }
-
- DbRemoveNodes(toRemove, txc);
- if (updateEpoch)
- DbUpdateEpoch(Epoch, txc);
-
- return true;
-}
-
-void TNodeBroker::DbRemoveNodes(const TVector<ui32> &nodes,
- TTransactionContext &txc)
-{
- NIceDb::TNiceDb db(txc.DB);
- for (auto id : nodes) {
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Removing node #" << id << " from database");
-
- db.Table<Schema::Nodes>().Key(id).Delete();
- }
-}
-
-void TNodeBroker::DbUpdateConfig(const NKikimrNodeBroker::TConfig &config,
- TTransactionContext &txc)
-{
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Update config in database"
- << " config=" << config.ShortDebugString());
-
- TString value;
+ info.Expire = expire;
+
+ AddNode(info);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "Loaded node " << info.IdString()
+ << " expiring " << info.ExpirationString());
+ }
+
+ if (!nodesRowset.Next())
+ return false;
+ }
+
+ DbRemoveNodes(toRemove, txc);
+ if (updateEpoch)
+ DbUpdateEpoch(Epoch, txc);
+
+ return true;
+}
+
+void TNodeBroker::DbRemoveNodes(const TVector<ui32> &nodes,
+ TTransactionContext &txc)
+{
+ NIceDb::TNiceDb db(txc.DB);
+ for (auto id : nodes) {
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Removing node #" << id << " from database");
+
+ db.Table<Schema::Nodes>().Key(id).Delete();
+ }
+}
+
+void TNodeBroker::DbUpdateConfig(const NKikimrNodeBroker::TConfig &config,
+ TTransactionContext &txc)
+{
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Update config in database"
+ << " config=" << config.ShortDebugString());
+
+ TString value;
Y_PROTOBUF_SUPPRESS_NODISCARD config.SerializeToString(&value);
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Config>().Key(ConfigKeyConfig)
- .Update<Schema::Config::Value>(value);
-}
-
-void TNodeBroker::DbUpdateConfigSubscription(ui64 subscriptionId,
- TTransactionContext &txc)
-{
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Update config subscription in database"
- << " id=" << subscriptionId);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Params>().Key(ParamKeyConfigSubscription)
- .Update<Schema::Params::Value>(subscriptionId);
-}
-
-void TNodeBroker::DbUpdateEpoch(const TEpochInfo &epoch,
- TTransactionContext &txc)
-{
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Update epoch in database: " << epoch.ToString());
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Params>().Key(ParamKeyCurrentEpochId)
- .Update<Schema::Params::Value>(epoch.Id);
- db.Table<Schema::Params>().Key(ParamKeyCurrentEpochVersion)
- .Update<Schema::Params::Value>(epoch.Version);
- db.Table<Schema::Params>().Key(ParamKeyCurrentEpochStart)
- .Update<Schema::Params::Value>(epoch.Start.GetValue());
- db.Table<Schema::Params>().Key(ParamKeyCurrentEpochEnd)
- .Update<Schema::Params::Value>(epoch.End.GetValue());
- db.Table<Schema::Params>().Key(ParamKeyNextEpochEnd)
- .Update<Schema::Params::Value>(epoch.NextEnd.GetValue());
-}
-
-void TNodeBroker::DbUpdateEpochVersion(ui64 version,
- TTransactionContext &txc)
-{
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Update epoch version in database"
- << " version=" << version);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Params>().Key(ParamKeyCurrentEpochVersion)
- .Update<Schema::Params::Value>(version);
-}
-
-void TNodeBroker::DbUpdateNodeLease(const TNodeInfo &node,
- TTransactionContext &txc)
-{
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
- "Update node " << node.IdString() << " lease in database"
- << " lease=" << node.Lease + 1
- << " expire=" << Epoch.NextEnd);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Nodes>().Key(node.NodeId)
- .Update<Schema::Nodes::Lease>(node.Lease + 1)
- .Update<Schema::Nodes::Expire>(Epoch.NextEnd.GetValue());
-}
-
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Config>().Key(ConfigKeyConfig)
+ .Update<Schema::Config::Value>(value);
+}
+
+void TNodeBroker::DbUpdateConfigSubscription(ui64 subscriptionId,
+ TTransactionContext &txc)
+{
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Update config subscription in database"
+ << " id=" << subscriptionId);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Params>().Key(ParamKeyConfigSubscription)
+ .Update<Schema::Params::Value>(subscriptionId);
+}
+
+void TNodeBroker::DbUpdateEpoch(const TEpochInfo &epoch,
+ TTransactionContext &txc)
+{
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Update epoch in database: " << epoch.ToString());
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Params>().Key(ParamKeyCurrentEpochId)
+ .Update<Schema::Params::Value>(epoch.Id);
+ db.Table<Schema::Params>().Key(ParamKeyCurrentEpochVersion)
+ .Update<Schema::Params::Value>(epoch.Version);
+ db.Table<Schema::Params>().Key(ParamKeyCurrentEpochStart)
+ .Update<Schema::Params::Value>(epoch.Start.GetValue());
+ db.Table<Schema::Params>().Key(ParamKeyCurrentEpochEnd)
+ .Update<Schema::Params::Value>(epoch.End.GetValue());
+ db.Table<Schema::Params>().Key(ParamKeyNextEpochEnd)
+ .Update<Schema::Params::Value>(epoch.NextEnd.GetValue());
+}
+
+void TNodeBroker::DbUpdateEpochVersion(ui64 version,
+ TTransactionContext &txc)
+{
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Update epoch version in database"
+ << " version=" << version);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Params>().Key(ParamKeyCurrentEpochVersion)
+ .Update<Schema::Params::Value>(version);
+}
+
+void TNodeBroker::DbUpdateNodeLease(const TNodeInfo &node,
+ TTransactionContext &txc)
+{
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::NODE_BROKER,
+ "Update node " << node.IdString() << " lease in database"
+ << " lease=" << node.Lease + 1
+ << " expire=" << Epoch.NextEnd);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Nodes>().Key(node.NodeId)
+ .Update<Schema::Nodes::Lease>(node.Lease + 1)
+ .Update<Schema::Nodes::Expire>(Epoch.NextEnd.GetValue());
+}
+
void TNodeBroker::DbUpdateNodeLocation(const TNodeInfo &node,
TTransactionContext &txc)
{
@@ -758,71 +758,71 @@ void TNodeBroker::DbUpdateNodeLocation(const TNodeInfo &node,
db.Table<T>().Key(node.NodeId).Update<T::DataCenter, T::Room, T::Rack, T::Body>(x.DataCenter, x.Room, x.Rack, x.Body);
}
-void TNodeBroker::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- ProcessTx(CreateTxUpdateConfig(ev), ctx);
-}
-
-void TNodeBroker::Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
- const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
- if (rec.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
- LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
- "Cannot subscribe for config updates: " << rec.GetStatus().GetCode()
- << " " << rec.GetStatus().GetReason());
- return;
- }
-
- ProcessTx(0, CreateTxUpdateConfigSubscription(ev), ctx);
-}
-
-void TNodeBroker::Handle(TEvents::TEvPoisonPill::TPtr &ev,
- const TActorContext &ctx)
-{
- Y_UNUSED(ev);
- ctx.Send(Tablet(), new TEvents::TEvPoisonPill);
-}
-
-void TNodeBroker::Handle(TEvNodeBroker::TEvListNodes::TPtr &ev,
- const TActorContext &)
-{
- auto &rec = ev->Get()->Record;
-
- ui64 epoch = rec.GetMinEpoch();
- if (epoch > Epoch.Id) {
- AddDelayedListNodesRequest(epoch, ev);
- return;
- }
-
- ProcessListNodesRequest(ev);
-}
-
-void TNodeBroker::Handle(TEvNodeBroker::TEvResolveNode::TPtr &ev,
- const TActorContext &ctx)
-{
- ui32 nodeId = ev->Get()->Record.GetNodeId();
- TAutoPtr<TEvNodeBroker::TEvResolvedNode> resp = new TEvNodeBroker::TEvResolvedNode;
-
- auto it = Nodes.find(nodeId);
- if (it != Nodes.end() && it->second.Expire > ctx.Now()) {
- resp->Record.MutableStatus()->SetCode(TStatus::OK);
- FillNodeInfo(it->second, *resp->Record.MutableNode());
- } else {
- resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
- resp->Record.MutableStatus()->SetReason("Unknown node");
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
- "Send TEvResolvedNode: " << resp->ToString());
-
- ctx.Send(ev->Sender, resp.Release());
-}
-
-void TNodeBroker::Handle(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev,
- const TActorContext &ctx)
-{
+void TNodeBroker::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ProcessTx(CreateTxUpdateConfig(ev), ctx);
+}
+
+void TNodeBroker::Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
+ const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+ if (rec.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
+ LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
+ "Cannot subscribe for config updates: " << rec.GetStatus().GetCode()
+ << " " << rec.GetStatus().GetReason());
+ return;
+ }
+
+ ProcessTx(0, CreateTxUpdateConfigSubscription(ev), ctx);
+}
+
+void TNodeBroker::Handle(TEvents::TEvPoisonPill::TPtr &ev,
+ const TActorContext &ctx)
+{
+ Y_UNUSED(ev);
+ ctx.Send(Tablet(), new TEvents::TEvPoisonPill);
+}
+
+void TNodeBroker::Handle(TEvNodeBroker::TEvListNodes::TPtr &ev,
+ const TActorContext &)
+{
+ auto &rec = ev->Get()->Record;
+
+ ui64 epoch = rec.GetMinEpoch();
+ if (epoch > Epoch.Id) {
+ AddDelayedListNodesRequest(epoch, ev);
+ return;
+ }
+
+ ProcessListNodesRequest(ev);
+}
+
+void TNodeBroker::Handle(TEvNodeBroker::TEvResolveNode::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ui32 nodeId = ev->Get()->Record.GetNodeId();
+ TAutoPtr<TEvNodeBroker::TEvResolvedNode> resp = new TEvNodeBroker::TEvResolvedNode;
+
+ auto it = Nodes.find(nodeId);
+ if (it != Nodes.end() && it->second.Expire > ctx.Now()) {
+ resp->Record.MutableStatus()->SetCode(TStatus::OK);
+ FillNodeInfo(it->second, *resp->Record.MutableNode());
+ } else {
+ resp->Record.MutableStatus()->SetCode(TStatus::WRONG_REQUEST);
+ resp->Record.MutableStatus()->SetReason("Unknown node");
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
+ "Send TEvResolvedNode: " << resp->ToString());
+
+ ctx.Send(ev->Sender, resp.Release());
+}
+
+void TNodeBroker::Handle(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER, "Handle TEvNodeBroker::TEvRegistrationRequest"
<< ": request# " << ev->Get()->Record.ShortDebugString());
@@ -899,52 +899,52 @@ void TNodeBroker::Handle(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev,
})
};
ctx.RegisterWithSameMailbox(new TRegisterNodeActor(ev, this));
-}
-
-void TNodeBroker::Handle(TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- ui32 nodeId = ev->Get()->Record.GetNodeId();
- ProcessTx(nodeId, CreateTxExtendLease(ev), ctx);
-}
-
-void TNodeBroker::Handle(TEvNodeBroker::TEvGetConfigRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- auto resp = MakeHolder<TEvNodeBroker::TEvGetConfigResponse>();
- resp->Record.MutableConfig()->CopyFrom(Config);
-
- LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
- "Send TEvGetConfigResponse: " << resp->ToString());
-
- ctx.Send(ev->Sender, resp.Release());
-}
-
-void TNodeBroker::Handle(TEvNodeBroker::TEvSetConfigRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- ProcessTx(CreateTxUpdateConfig(ev), ctx);
-}
-
-void TNodeBroker::Handle(TEvPrivate::TEvUpdateEpoch::TPtr &ev,
- const TActorContext &ctx)
-{
- Y_UNUSED(ev);
- if (Epoch.End > ctx.Now()) {
- LOG_INFO_S(ctx, NKikimrServices::NODE_BROKER,
- "Epoch update event is too early");
- ScheduleEpochUpdate(ctx);
- return;
- }
-
- ProcessTx(CreateTxUpdateEpoch(), ctx);
-}
-
+}
+
+void TNodeBroker::Handle(TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ui32 nodeId = ev->Get()->Record.GetNodeId();
+ ProcessTx(nodeId, CreateTxExtendLease(ev), ctx);
+}
+
+void TNodeBroker::Handle(TEvNodeBroker::TEvGetConfigRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ auto resp = MakeHolder<TEvNodeBroker::TEvGetConfigResponse>();
+ resp->Record.MutableConfig()->CopyFrom(Config);
+
+ LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
+ "Send TEvGetConfigResponse: " << resp->ToString());
+
+ ctx.Send(ev->Sender, resp.Release());
+}
+
+void TNodeBroker::Handle(TEvNodeBroker::TEvSetConfigRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ProcessTx(CreateTxUpdateConfig(ev), ctx);
+}
+
+void TNodeBroker::Handle(TEvPrivate::TEvUpdateEpoch::TPtr &ev,
+ const TActorContext &ctx)
+{
+ Y_UNUSED(ev);
+ if (Epoch.End > ctx.Now()) {
+ LOG_INFO_S(ctx, NKikimrServices::NODE_BROKER,
+ "Epoch update event is too early");
+ ScheduleEpochUpdate(ctx);
+ return;
+ }
+
+ ProcessTx(CreateTxUpdateEpoch(), ctx);
+}
+
IActor *CreateNodeBroker(const TActorId &tablet,
- TTabletStorageInfo *info)
-{
- return new TNodeBroker(tablet, info);
-}
-
-} // NNodeBroker
-} // NKikimr
+ TTabletStorageInfo *info)
+{
+ return new TNodeBroker(tablet, info);
+}
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/node_broker.h b/ydb/core/mind/node_broker.h
index c2ed452a85b..c86edfe0e7a 100644
--- a/ydb/core/mind/node_broker.h
+++ b/ydb/core/mind/node_broker.h
@@ -1,191 +1,191 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <library/cpp/actors/interconnect/events_local.h>
#include <library/cpp/actors/core/actor.h>
#include <ydb/core/base/blobstorage.h>
#include <ydb/core/base/domain.h>
#include <ydb/core/protos/node_broker.pb.h>
-
-/**
- * Node Broker tablet is used to allocate Node IDs for dynamic cluster nodes.
- * Nodes are registered to get ID which are leased for a limited time. Nodes
- * can extend lease time. Repeated registration of the same node will re-use
- * previously allocated ID.
- *
- * Node Broker can be used to resolve nodes by ID. Node ID lease time is never
- * reduced which allows nameservices to cache dynamic nodes info.
- *
- * IDs are allocated from a range specified by dynamic nameservice config.
- * Domains use non-overlapping ID sets (lower bits of dynamic node ID hold
- * Domain ID).
- */
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-struct TEpochInfo {
- ui64 Id = 0;
- ui64 Version = 0;
- TInstant Start;
- TInstant End;
- TInstant NextEnd;
-
- TEpochInfo()
- : Id(0)
- , Version(0)
- {
- }
-
- TEpochInfo(const NKikimrNodeBroker::TEpoch &rec)
- : Id(rec.GetId())
- , Version(rec.GetVersion())
- , Start(TInstant::FromValue(rec.GetStart()))
- , End(TInstant::FromValue(rec.GetEnd()))
- , NextEnd(TInstant::FromValue(rec.GetNextEnd()))
- {
- }
-
- TEpochInfo(const TEpochInfo &other) = default;
- TEpochInfo(TEpochInfo &&other) = default;
-
- TEpochInfo &operator=(const TEpochInfo &other) = default;
- TEpochInfo &operator=(TEpochInfo &&other) = default;
-
- TEpochInfo &operator=(const NKikimrNodeBroker::TEpoch &rec)
- {
- return *this = TEpochInfo(rec);
- }
-
- TString ToString() const
- {
- return TStringBuilder() << "#" << Id << "." << Version
- << " " << Start << " - " << End
- << " - " << NextEnd;
- }
-
- void Serialize(NKikimrNodeBroker::TEpoch &rec)
- {
- rec.SetId(Id);
- rec.SetVersion(Version);
- rec.SetStart(Start.GetValue());
- rec.SetEnd(End.GetValue());
- rec.SetNextEnd(NextEnd.GetValue());
- }
-};
-
-struct TEvNodeBroker {
- enum EEv {
- // requests
- EvListNodes = EventSpaceBegin(TKikimrEvents::ES_NODE_BROKER),
- EvResolveNode,
- EvRegistrationRequest,
- EvExtendLeaseRequest,
-
- // responses
- EvNodesInfo,
- EvResolvedNode,
- EvRegistrationResponse,
- EvExtendLeaseResponse,
-
- // config
- EvGetConfigRequest,
- EvGetConfigResponse,
- EvSetConfigRequest,
- EvSetConfigResponse,
-
- // TODO: remove
- // internal
- //EvNodeExpire = EvListNodes + 512,
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_NODE_BROKER),
- "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_NODE_BROKER)");
-
+
+/**
+ * Node Broker tablet is used to allocate Node IDs for dynamic cluster nodes.
+ * Nodes are registered to get ID which are leased for a limited time. Nodes
+ * can extend lease time. Repeated registration of the same node will re-use
+ * previously allocated ID.
+ *
+ * Node Broker can be used to resolve nodes by ID. Node ID lease time is never
+ * reduced which allows nameservices to cache dynamic nodes info.
+ *
+ * IDs are allocated from a range specified by dynamic nameservice config.
+ * Domains use non-overlapping ID sets (lower bits of dynamic node ID hold
+ * Domain ID).
+ */
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+struct TEpochInfo {
+ ui64 Id = 0;
+ ui64 Version = 0;
+ TInstant Start;
+ TInstant End;
+ TInstant NextEnd;
+
+ TEpochInfo()
+ : Id(0)
+ , Version(0)
+ {
+ }
+
+ TEpochInfo(const NKikimrNodeBroker::TEpoch &rec)
+ : Id(rec.GetId())
+ , Version(rec.GetVersion())
+ , Start(TInstant::FromValue(rec.GetStart()))
+ , End(TInstant::FromValue(rec.GetEnd()))
+ , NextEnd(TInstant::FromValue(rec.GetNextEnd()))
+ {
+ }
+
+ TEpochInfo(const TEpochInfo &other) = default;
+ TEpochInfo(TEpochInfo &&other) = default;
+
+ TEpochInfo &operator=(const TEpochInfo &other) = default;
+ TEpochInfo &operator=(TEpochInfo &&other) = default;
+
+ TEpochInfo &operator=(const NKikimrNodeBroker::TEpoch &rec)
+ {
+ return *this = TEpochInfo(rec);
+ }
+
+ TString ToString() const
+ {
+ return TStringBuilder() << "#" << Id << "." << Version
+ << " " << Start << " - " << End
+ << " - " << NextEnd;
+ }
+
+ void Serialize(NKikimrNodeBroker::TEpoch &rec)
+ {
+ rec.SetId(Id);
+ rec.SetVersion(Version);
+ rec.SetStart(Start.GetValue());
+ rec.SetEnd(End.GetValue());
+ rec.SetNextEnd(NextEnd.GetValue());
+ }
+};
+
+struct TEvNodeBroker {
+ enum EEv {
+ // requests
+ EvListNodes = EventSpaceBegin(TKikimrEvents::ES_NODE_BROKER),
+ EvResolveNode,
+ EvRegistrationRequest,
+ EvExtendLeaseRequest,
+
+ // responses
+ EvNodesInfo,
+ EvResolvedNode,
+ EvRegistrationResponse,
+ EvExtendLeaseResponse,
+
+ // config
+ EvGetConfigRequest,
+ EvGetConfigResponse,
+ EvSetConfigRequest,
+ EvSetConfigResponse,
+
+ // TODO: remove
+ // internal
+ //EvNodeExpire = EvListNodes + 512,
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_NODE_BROKER),
+ "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_NODE_BROKER)");
+
template <typename TEv, typename TRecord, ui32 TEventType>
using TEventPB = TEventShortDebugPB<TEv, TRecord, TEventType>;
- struct TEvListNodes : public TEventPB<TEvListNodes,
- NKikimrNodeBroker::TListNodes,
+ struct TEvListNodes : public TEventPB<TEvListNodes,
+ NKikimrNodeBroker::TListNodes,
EvListNodes> {
- };
-
- struct TEvResolveNode : public TEventPB<TEvResolveNode,
- NKikimrNodeBroker::TResolveNode,
+ };
+
+ struct TEvResolveNode : public TEventPB<TEvResolveNode,
+ NKikimrNodeBroker::TResolveNode,
EvResolveNode> {
- };
-
- struct TEvRegistrationRequest : public TEventPB<TEvRegistrationRequest,
- NKikimrNodeBroker::TRegistrationRequest,
+ };
+
+ struct TEvRegistrationRequest : public TEventPB<TEvRegistrationRequest,
+ NKikimrNodeBroker::TRegistrationRequest,
EvRegistrationRequest> {
- };
-
- struct TEvExtendLeaseRequest : public TEventPB<TEvExtendLeaseRequest,
- NKikimrNodeBroker::TExtendLeaseRequest,
+ };
+
+ struct TEvExtendLeaseRequest : public TEventPB<TEvExtendLeaseRequest,
+ NKikimrNodeBroker::TExtendLeaseRequest,
EvExtendLeaseRequest> {
- };
-
- struct TEvNodesInfo : public TEventPreSerializedPB<TEvNodesInfo,
- NKikimrNodeBroker::TNodesInfo,
- EvNodesInfo> {
- TEvNodesInfo()
- {
- }
-
- TEvNodesInfo(const NKikimrNodeBroker::TNodesInfo &info)
- : TEventPreSerializedPB(info)
- {
- }
- };
-
- struct TEvResolvedNode : public TEventPB<TEvResolvedNode,
- NKikimrNodeBroker::TResolvedNode,
+ };
+
+ struct TEvNodesInfo : public TEventPreSerializedPB<TEvNodesInfo,
+ NKikimrNodeBroker::TNodesInfo,
+ EvNodesInfo> {
+ TEvNodesInfo()
+ {
+ }
+
+ TEvNodesInfo(const NKikimrNodeBroker::TNodesInfo &info)
+ : TEventPreSerializedPB(info)
+ {
+ }
+ };
+
+ struct TEvResolvedNode : public TEventPB<TEvResolvedNode,
+ NKikimrNodeBroker::TResolvedNode,
EvResolvedNode> {
- };
-
- struct TEvRegistrationResponse : public TEventPB<TEvRegistrationResponse,
- NKikimrNodeBroker::TRegistrationResponse,
+ };
+
+ struct TEvRegistrationResponse : public TEventPB<TEvRegistrationResponse,
+ NKikimrNodeBroker::TRegistrationResponse,
EvRegistrationResponse> {
- };
-
- struct TEvExtendLeaseResponse : public TEventPB<TEvExtendLeaseResponse,
- NKikimrNodeBroker::TExtendLeaseResponse,
+ };
+
+ struct TEvExtendLeaseResponse : public TEventPB<TEvExtendLeaseResponse,
+ NKikimrNodeBroker::TExtendLeaseResponse,
EvExtendLeaseResponse> {
- };
-
- struct TEvGetConfigRequest : public TEventPB<TEvGetConfigRequest,
- NKikimrNodeBroker::TGetConfigRequest,
- EvGetConfigRequest> {
- };
-
- struct TEvGetConfigResponse : public TEventPB<TEvGetConfigResponse,
- NKikimrNodeBroker::TGetConfigResponse,
- EvGetConfigResponse> {
- };
-
- struct TEvSetConfigRequest : public TEventPB<TEvSetConfigRequest,
- NKikimrNodeBroker::TSetConfigRequest,
- EvSetConfigRequest> {
- };
-
- struct TEvSetConfigResponse : public TEventPB<TEvSetConfigResponse,
- NKikimrNodeBroker::TSetConfigResponse,
- EvSetConfigResponse> {
- };
-};
-
-constexpr ui32 DOMAIN_BITS = TDomainsInfo::DomainBits;
-constexpr ui32 DOMAINS_COUNT = 1 << DOMAIN_BITS;
-constexpr ui32 DOMAIN_MASK = (1 << DOMAIN_BITS) - 1;
-
-inline ui32 NodeIdToDomain(ui32 nodeId)
-{
- return nodeId & DOMAIN_MASK;
-}
-
+ };
+
+ struct TEvGetConfigRequest : public TEventPB<TEvGetConfigRequest,
+ NKikimrNodeBroker::TGetConfigRequest,
+ EvGetConfigRequest> {
+ };
+
+ struct TEvGetConfigResponse : public TEventPB<TEvGetConfigResponse,
+ NKikimrNodeBroker::TGetConfigResponse,
+ EvGetConfigResponse> {
+ };
+
+ struct TEvSetConfigRequest : public TEventPB<TEvSetConfigRequest,
+ NKikimrNodeBroker::TSetConfigRequest,
+ EvSetConfigRequest> {
+ };
+
+ struct TEvSetConfigResponse : public TEventPB<TEvSetConfigResponse,
+ NKikimrNodeBroker::TSetConfigResponse,
+ EvSetConfigResponse> {
+ };
+};
+
+constexpr ui32 DOMAIN_BITS = TDomainsInfo::DomainBits;
+constexpr ui32 DOMAINS_COUNT = 1 << DOMAIN_BITS;
+constexpr ui32 DOMAIN_MASK = (1 << DOMAIN_BITS) - 1;
+
+inline ui32 NodeIdToDomain(ui32 nodeId)
+{
+ return nodeId & DOMAIN_MASK;
+}
+
inline ui32 NodeIdToDomain(ui32 nodeId, const TDomainsInfo& domains) {
// All nodes belong to the same domain when it's the only one defined
if (Y_LIKELY(domains.Domains.size() == 1)) {
@@ -196,6 +196,6 @@ inline ui32 NodeIdToDomain(ui32 nodeId, const TDomainsInfo& domains) {
}
IActor *CreateNodeBroker(const TActorId &tablet, TTabletStorageInfo *info);
-
-} // NNodeBroker
-} // NKikimr
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/node_broker__extend_lease.cpp b/ydb/core/mind/node_broker__extend_lease.cpp
index a11de8035a9..11176642660 100644
--- a/ydb/core/mind/node_broker__extend_lease.cpp
+++ b/ydb/core/mind/node_broker__extend_lease.cpp
@@ -1,99 +1,99 @@
-#include "node_broker_impl.h"
-#include "node_broker__scheme.h"
-
+#include "node_broker_impl.h"
+#include "node_broker__scheme.h"
+
#include <ydb/core/base/appdata.h>
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-using namespace NKikimrNodeBroker;
-
-class TNodeBroker::TTxExtendLease : public TTransactionBase<TNodeBroker> {
-public:
- TTxExtendLease(TNodeBroker *self, TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev)
- : TBase(self)
- , Event(ev)
- , Update(false)
- {
- }
-
- bool Error(TStatus::ECode code,
- const TString &reason,
- const TActorContext &ctx)
- {
- auto nodeId = Event->Get()->Record.GetNodeId();
-
- LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
- "Cannot extend lease for node #" << nodeId
- << ": " << code << ": " << reason);
-
- Response->Record.MutableStatus()->SetCode(code);
- Response->Record.MutableStatus()->SetReason(reason);
-
- return true;
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- auto nodeId = Event->Get()->Record.GetNodeId();
-
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "TTxExtendLease Execute node #" << nodeId);
-
- Response = new TEvNodeBroker::TEvExtendLeaseResponse;
- Response->Record.SetNodeId(nodeId);
-
- auto it = Self->Nodes.find(nodeId);
- if (it == Self->Nodes.end()) {
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+using namespace NKikimrNodeBroker;
+
+class TNodeBroker::TTxExtendLease : public TTransactionBase<TNodeBroker> {
+public:
+ TTxExtendLease(TNodeBroker *self, TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev)
+ : TBase(self)
+ , Event(ev)
+ , Update(false)
+ {
+ }
+
+ bool Error(TStatus::ECode code,
+ const TString &reason,
+ const TActorContext &ctx)
+ {
+ auto nodeId = Event->Get()->Record.GetNodeId();
+
+ LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
+ "Cannot extend lease for node #" << nodeId
+ << ": " << code << ": " << reason);
+
+ Response->Record.MutableStatus()->SetCode(code);
+ Response->Record.MutableStatus()->SetReason(reason);
+
+ return true;
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ auto nodeId = Event->Get()->Record.GetNodeId();
+
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "TTxExtendLease Execute node #" << nodeId);
+
+ Response = new TEvNodeBroker::TEvExtendLeaseResponse;
+ Response->Record.SetNodeId(nodeId);
+
+ auto it = Self->Nodes.find(nodeId);
+ if (it == Self->Nodes.end()) {
if (Self->ExpiredNodes.contains(nodeId))
- return Error(TStatus::WRONG_REQUEST, "Node has expired", ctx);
- else
- return Error(TStatus::WRONG_REQUEST, "Unknown node", ctx);
- }
-
- if (Self->IsBannedId(nodeId))
- return Error(TStatus::WRONG_REQUEST, "Node ID is banned", ctx);
-
- auto &node = it->second;
- if (!node.IsFixed()) {
- Self->DbUpdateNodeLease(node, txc);
- Response->Record.SetExpire(Self->Epoch.NextEnd.GetValue());
- Update = true;
- } else {
- Response->Record.SetExpire(TInstant::Max().GetValue());
- }
-
- Response->Record.MutableStatus()->SetCode(TStatus::OK);
- Self->Epoch.Serialize(*Response->Record.MutableEpoch());
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxExtendLease Complete");
-
- Y_VERIFY(Response);
- LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
- "TTxExtendLease reply with: " << Response->ToString());
- ctx.Send(Event->Sender, Response.Release());
-
- if (Update)
- Self->ExtendLease(Self->Nodes.at(Event->Get()->Record.GetNodeId()));
-
- Self->TxCompleted(Event->Get()->Record.GetNodeId(), this, ctx);
- }
-
-private:
- TEvNodeBroker::TEvExtendLeaseRequest::TPtr Event;
- TAutoPtr<TEvNodeBroker::TEvExtendLeaseResponse> Response;
- bool Update;
-};
-
-ITransaction *TNodeBroker::CreateTxExtendLease(TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev)
-{
- return new TTxExtendLease(this, ev);
-}
-
-} // NNodeBroker
-} // NKikimr
+ return Error(TStatus::WRONG_REQUEST, "Node has expired", ctx);
+ else
+ return Error(TStatus::WRONG_REQUEST, "Unknown node", ctx);
+ }
+
+ if (Self->IsBannedId(nodeId))
+ return Error(TStatus::WRONG_REQUEST, "Node ID is banned", ctx);
+
+ auto &node = it->second;
+ if (!node.IsFixed()) {
+ Self->DbUpdateNodeLease(node, txc);
+ Response->Record.SetExpire(Self->Epoch.NextEnd.GetValue());
+ Update = true;
+ } else {
+ Response->Record.SetExpire(TInstant::Max().GetValue());
+ }
+
+ Response->Record.MutableStatus()->SetCode(TStatus::OK);
+ Self->Epoch.Serialize(*Response->Record.MutableEpoch());
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxExtendLease Complete");
+
+ Y_VERIFY(Response);
+ LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
+ "TTxExtendLease reply with: " << Response->ToString());
+ ctx.Send(Event->Sender, Response.Release());
+
+ if (Update)
+ Self->ExtendLease(Self->Nodes.at(Event->Get()->Record.GetNodeId()));
+
+ Self->TxCompleted(Event->Get()->Record.GetNodeId(), this, ctx);
+ }
+
+private:
+ TEvNodeBroker::TEvExtendLeaseRequest::TPtr Event;
+ TAutoPtr<TEvNodeBroker::TEvExtendLeaseResponse> Response;
+ bool Update;
+};
+
+ITransaction *TNodeBroker::CreateTxExtendLease(TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev)
+{
+ return new TTxExtendLease(this, ev);
+}
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/node_broker__init_scheme.cpp b/ydb/core/mind/node_broker__init_scheme.cpp
index 526200f51db..bc0c011c34a 100644
--- a/ydb/core/mind/node_broker__init_scheme.cpp
+++ b/ydb/core/mind/node_broker__init_scheme.cpp
@@ -1,38 +1,38 @@
-#include "node_broker_impl.h"
-#include "node_broker__scheme.h"
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-class TNodeBroker::TTxInitScheme : public TTransactionBase<TNodeBroker> {
-public:
- TTxInitScheme(TNodeBroker *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxInitScheme Execute");
-
- NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxInitScheme Complete");
-
- Self->ProcessTx(Self->CreateTxLoadState(), ctx);
- Self->TxCompleted(this, ctx);
- }
-};
-
-ITransaction *TNodeBroker::CreateTxInitScheme()
-{
- return new TTxInitScheme(this);
-}
-
-} // NNodeBroker
-} // NKikimr
+#include "node_broker_impl.h"
+#include "node_broker__scheme.h"
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+class TNodeBroker::TTxInitScheme : public TTransactionBase<TNodeBroker> {
+public:
+ TTxInitScheme(TNodeBroker *self)
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxInitScheme Execute");
+
+ NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxInitScheme Complete");
+
+ Self->ProcessTx(Self->CreateTxLoadState(), ctx);
+ Self->TxCompleted(this, ctx);
+ }
+};
+
+ITransaction *TNodeBroker::CreateTxInitScheme()
+{
+ return new TTxInitScheme(this);
+}
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/node_broker__load_state.cpp b/ydb/core/mind/node_broker__load_state.cpp
index 8cf4a4b2537..3518e147814 100644
--- a/ydb/core/mind/node_broker__load_state.cpp
+++ b/ydb/core/mind/node_broker__load_state.cpp
@@ -1,56 +1,56 @@
-#include "node_broker_impl.h"
-#include "node_broker__scheme.h"
-
+#include "node_broker_impl.h"
+#include "node_broker__scheme.h"
+
#include <ydb/core/base/appdata.h>
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-class TNodeBroker::TTxLoadState : public TTransactionBase<TNodeBroker> {
-public:
- TTxLoadState(TNodeBroker *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxLoadState Execute");
-
- if (!Self->DbLoadState(txc, ctx))
- return false;
-
- // Move epoch if required.
- auto now = ctx.Now();
- while (now > Self->Epoch.End) {
- TStateDiff diff;
- Self->ComputeNextEpochDiff(diff);
- Self->DbApplyStateDiff(diff, txc);
- Self->ApplyStateDiff(diff);
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxLoadState Complete");
-
- Self->Become(&TNodeBroker::StateWork);
- Self->SubscribeForConfigUpdates(ctx);
- Self->ScheduleEpochUpdate(ctx);
- Self->PrepareEpochCache();
- Self->ProcessEnqueuedEvents(ctx);
- Self->TxCompleted(this, ctx);
- }
-
-private:
-};
-
-ITransaction *TNodeBroker::CreateTxLoadState()
-{
- return new TTxLoadState(this);
-}
-
-} // NNodeBroker
-} // NKikimr
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+class TNodeBroker::TTxLoadState : public TTransactionBase<TNodeBroker> {
+public:
+ TTxLoadState(TNodeBroker *self)
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxLoadState Execute");
+
+ if (!Self->DbLoadState(txc, ctx))
+ return false;
+
+ // Move epoch if required.
+ auto now = ctx.Now();
+ while (now > Self->Epoch.End) {
+ TStateDiff diff;
+ Self->ComputeNextEpochDiff(diff);
+ Self->DbApplyStateDiff(diff, txc);
+ Self->ApplyStateDiff(diff);
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxLoadState Complete");
+
+ Self->Become(&TNodeBroker::StateWork);
+ Self->SubscribeForConfigUpdates(ctx);
+ Self->ScheduleEpochUpdate(ctx);
+ Self->PrepareEpochCache();
+ Self->ProcessEnqueuedEvents(ctx);
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+};
+
+ITransaction *TNodeBroker::CreateTxLoadState()
+{
+ return new TTxLoadState(this);
+}
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/node_broker__register_node.cpp b/ydb/core/mind/node_broker__register_node.cpp
index d271a04bf29..b656297837b 100644
--- a/ydb/core/mind/node_broker__register_node.cpp
+++ b/ydb/core/mind/node_broker__register_node.cpp
@@ -1,78 +1,78 @@
-#include "node_broker_impl.h"
-#include "node_broker__scheme.h"
-
+#include "node_broker_impl.h"
+#include "node_broker__scheme.h"
+
#include <ydb/core/base/appdata.h>
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-using namespace NKikimrNodeBroker;
-
-class TNodeBroker::TTxRegisterNode : public TTransactionBase<TNodeBroker> {
-public:
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+using namespace NKikimrNodeBroker;
+
+class TNodeBroker::TTxRegisterNode : public TTransactionBase<TNodeBroker> {
+public:
TTxRegisterNode(TNodeBroker *self, TEvNodeBroker::TEvRegistrationRequest::TPtr &ev, const NActors::TScopeId& scopeId)
- : TBase(self)
- , Event(ev)
+ : TBase(self)
+ , Event(ev)
, ScopeId(scopeId)
- , NodeId(0)
- , ExtendLease(false)
- , FixNodeId(false)
- {
- }
-
- bool Error(TStatus::ECode code,
- const TString &reason,
- const TActorContext &ctx)
- {
+ , NodeId(0)
+ , ExtendLease(false)
+ , FixNodeId(false)
+ {
+ }
+
+ bool Error(TStatus::ECode code,
+ const TString &reason,
+ const TActorContext &ctx)
+ {
const auto &rec = Event->Get()->Record;
auto host = rec.GetHost();
auto port = rec.GetPort();
- LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
+ LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
"Cannot register node " << host << ":" << port << ": " << code << ": " << reason);
-
- Response->Record.MutableStatus()->SetCode(code);
- Response->Record.MutableStatus()->SetReason(reason);
-
- return true;
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- auto &rec = Event->Get()->Record;
- auto host = rec.GetHost();
- ui16 port = (ui16)rec.GetPort();
+
+ Response->Record.MutableStatus()->SetCode(code);
+ Response->Record.MutableStatus()->SetReason(reason);
+
+ return true;
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ auto &rec = Event->Get()->Record;
+ auto host = rec.GetHost();
+ ui16 port = (ui16)rec.GetPort();
TString addr = rec.GetAddress();
- auto expire = rec.GetFixedNodeId() ? TInstant::Max() : Self->Epoch.NextEnd;
-
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxRegisterNode Execute");
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "Registration request from " << host << ":" << port << " "
+ auto expire = rec.GetFixedNodeId() ? TInstant::Max() : Self->Epoch.NextEnd;
+
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxRegisterNode Execute");
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "Registration request from " << host << ":" << port << " "
<< (rec.GetFixedNodeId() ? "(fixed)" : "(not fixed)") << " "
<< "tenant: " << (rec.HasPath() ? rec.GetPath() : "<unspecified>"));
-
+
TNodeLocation loc(rec.GetLocation());
-
- Response = new TEvNodeBroker::TEvRegistrationResponse;
-
+
+ Response = new TEvNodeBroker::TEvRegistrationResponse;
+
if (rec.HasPath() && ScopeId == NActors::TScopeId()) {
return Error(TStatus::ERROR,
TStringBuilder() << "Cannot resolve scope id for path" << rec.GetPath(),
ctx);
}
- // Already registered?
+ // Already registered?
auto it = Self->Hosts.find(std::make_tuple(host, addr, port));
- if (it != Self->Hosts.end()) {
- auto &node = Self->Nodes.find(it->second)->second;
- NodeId = node.NodeId;
-
- if (node.Address != rec.GetAddress()
- || node.ResolveHost != rec.GetResolveHost())
- return Error(TStatus::WRONG_REQUEST,
- TStringBuilder() << "Another address is registered for "
- << host << ":" << port,
- ctx);
-
+ if (it != Self->Hosts.end()) {
+ auto &node = Self->Nodes.find(it->second)->second;
+ NodeId = node.NodeId;
+
+ if (node.Address != rec.GetAddress()
+ || node.ResolveHost != rec.GetResolveHost())
+ return Error(TStatus::WRONG_REQUEST,
+ TStringBuilder() << "Another address is registered for "
+ << host << ":" << port,
+ ctx);
+
if (node.Location != loc && node.Location != TNodeLocation()) {
return Error(TStatus::WRONG_REQUEST,
TStringBuilder() << "Another location is registered for "
@@ -83,58 +83,58 @@ public:
Self->DbUpdateNodeLocation(node, txc);
node.LegacyUpdatePending = false;
}
-
- if (!node.IsFixed() && rec.GetFixedNodeId()) {
- Self->DbFixNodeId(node, txc);
- FixNodeId = true;
- } else if (!node.IsFixed() && node.Expire < expire) {
- Self->DbUpdateNodeLease(node, txc);
- ExtendLease = true;
- }
-
- Response->Record.MutableStatus()->SetCode(TStatus::OK);
- Self->FillNodeInfo(node, *Response->Record.MutableNode());
-
- return true;
- }
-
- if (Self->FreeIds.Empty())
- return Error(TStatus::ERROR_TEMP, "No free node IDs", ctx);
-
+
+ if (!node.IsFixed() && rec.GetFixedNodeId()) {
+ Self->DbFixNodeId(node, txc);
+ FixNodeId = true;
+ } else if (!node.IsFixed() && node.Expire < expire) {
+ Self->DbUpdateNodeLease(node, txc);
+ ExtendLease = true;
+ }
+
+ Response->Record.MutableStatus()->SetCode(TStatus::OK);
+ Self->FillNodeInfo(node, *Response->Record.MutableNode());
+
+ return true;
+ }
+
+ if (Self->FreeIds.Empty())
+ return Error(TStatus::ERROR_TEMP, "No free node IDs", ctx);
+
NodeId = Self->FreeIds.FirstNonZeroBit();
Self->FreeIds.Reset(NodeId);
Node = MakeHolder<TNodeInfo>(NodeId, rec.GetAddress(), host, rec.GetResolveHost(), port, loc, false);
- Node->Lease = 1;
- Node->Expire = expire;
-
- Response->Record.MutableStatus()->SetCode(TStatus::OK);
-
- Self->DbAddNode(*Node, txc);
+ Node->Lease = 1;
+ Node->Expire = expire;
+
+ Response->Record.MutableStatus()->SetCode(TStatus::OK);
+
+ Self->DbAddNode(*Node, txc);
Self->DbUpdateEpochVersion(Self->Epoch.Version + 1, txc);
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxRegisterNode Complete");
-
- if (Node) {
- Self->AddNode(*Node);
- Self->UpdateEpochVersion();
- Self->AddNodeToEpochCache(*Node);
- } else if (ExtendLease)
- Self->ExtendLease(Self->Nodes.at(NodeId));
- else if (FixNodeId)
- Self->FixNodeId(Self->Nodes.at(NodeId));
-
- Y_VERIFY(Response);
- // With all modifications applied we may fill node info.
- if (Response->Record.GetStatus().GetCode() == TStatus::OK)
- Self->FillNodeInfo(Self->Nodes.at(NodeId), *Response->Record.MutableNode());
- LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
- "TTxRegisterNode reply with: " << Response->Record.ShortDebugString());
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxRegisterNode Complete");
+
+ if (Node) {
+ Self->AddNode(*Node);
+ Self->UpdateEpochVersion();
+ Self->AddNodeToEpochCache(*Node);
+ } else if (ExtendLease)
+ Self->ExtendLease(Self->Nodes.at(NodeId));
+ else if (FixNodeId)
+ Self->FixNodeId(Self->Nodes.at(NodeId));
+
+ Y_VERIFY(Response);
+ // With all modifications applied we may fill node info.
+ if (Response->Record.GetStatus().GetCode() == TStatus::OK)
+ Self->FillNodeInfo(Self->Nodes.at(NodeId), *Response->Record.MutableNode());
+ LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
+ "TTxRegisterNode reply with: " << Response->Record.ShortDebugString());
if (ScopeId != NActors::TScopeId()) {
auto& record = Response->Record;
@@ -142,25 +142,25 @@ public:
record.SetScopePathId(ScopeId.second);
}
- ctx.Send(Event->Sender, Response.Release());
-
- Self->TxCompleted(this, ctx);
- }
-
-private:
- TEvNodeBroker::TEvRegistrationRequest::TPtr Event;
+ ctx.Send(Event->Sender, Response.Release());
+
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvNodeBroker::TEvRegistrationRequest::TPtr Event;
const NActors::TScopeId ScopeId;
- TAutoPtr<TEvNodeBroker::TEvRegistrationResponse> Response;
- THolder<TNodeInfo> Node;
- ui32 NodeId;
- bool ExtendLease;
- bool FixNodeId;
-};
-
+ TAutoPtr<TEvNodeBroker::TEvRegistrationResponse> Response;
+ THolder<TNodeInfo> Node;
+ ui32 NodeId;
+ bool ExtendLease;
+ bool FixNodeId;
+};
+
ITransaction *TNodeBroker::CreateTxRegisterNode(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev, const NActors::TScopeId& scopeId)
-{
+{
return new TTxRegisterNode(this, ev, scopeId);
-}
-
-} // NNodeBroker
-} // NKikimr
+}
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/node_broker__scheme.h b/ydb/core/mind/node_broker__scheme.h
index 5e0e1369f5a..ee12a28cd78 100644
--- a/ydb/core/mind/node_broker__scheme.h
+++ b/ydb/core/mind/node_broker__scheme.h
@@ -1,53 +1,53 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <ydb/core/scheme/scheme_types_defs.h>
#include <ydb/core/tablet_flat/flat_cxx_database.h>
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-struct Schema : NIceDb::Schema {
- struct Nodes : Table<1> {
- struct ID : Column<1, NScheme::NTypeIds::Uint32> {};
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+struct Schema : NIceDb::Schema {
+ struct Nodes : Table<1> {
+ struct ID : Column<1, NScheme::NTypeIds::Uint32> {};
struct Host : Column<2, NScheme::NTypeIds::Utf8> {};
- struct Port : Column<3, NScheme::NTypeIds::Uint32> {};
+ struct Port : Column<3, NScheme::NTypeIds::Uint32> {};
struct ResolveHost : Column<4, NScheme::NTypeIds::Utf8> {};
struct Address : Column<5, NScheme::NTypeIds::Utf8> {};
- struct DataCenter : Column<6, NScheme::NTypeIds::Uint64> {};
- struct Room : Column<7, NScheme::NTypeIds::Uint64> {};
- struct Rack : Column<8, NScheme::NTypeIds::Uint64> {};
- struct Body : Column<9, NScheme::NTypeIds::Uint64> {};
- struct Lease : Column<10, NScheme::NTypeIds::Uint32> {};
- struct Expire : Column<11, NScheme::NTypeIds::Uint64> {};
+ struct DataCenter : Column<6, NScheme::NTypeIds::Uint64> {};
+ struct Room : Column<7, NScheme::NTypeIds::Uint64> {};
+ struct Rack : Column<8, NScheme::NTypeIds::Uint64> {};
+ struct Body : Column<9, NScheme::NTypeIds::Uint64> {};
+ struct Lease : Column<10, NScheme::NTypeIds::Uint32> {};
+ struct Expire : Column<11, NScheme::NTypeIds::Uint64> {};
struct Location : Column<12, NScheme::NTypeIds::String> {};
-
- using TKey = TableKey<ID>;
+
+ using TKey = TableKey<ID>;
using TColumns = TableColumns<ID, Host, Port, ResolveHost, Address, DataCenter, Room, Rack, Body, Lease, Expire,
Location>;
- };
-
- struct Config : Table<2> {
- struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
- struct Value : Column<2, NScheme::NTypeIds::String> {};
-
- using TKey = TableKey<Key>;
- using TColumns = TableColumns<Key, Value>;
- };
-
- struct Params : Table<3> {
- struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
- struct Value : Column<2, NScheme::NTypeIds::Uint64> {};
-
- using TKey = TableKey<Key>;
- using TColumns = TableColumns<Key, Value>;
- };
-
- using TTables = SchemaTables<Nodes, Config, Params>;
- using TSettings = SchemaSettings<ExecutorLogBatching<true>,
- ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
-};
-
-} // NNodeBroker
-} // NKikimr
+ };
+
+ struct Config : Table<2> {
+ struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct Value : Column<2, NScheme::NTypeIds::String> {};
+
+ using TKey = TableKey<Key>;
+ using TColumns = TableColumns<Key, Value>;
+ };
+
+ struct Params : Table<3> {
+ struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct Value : Column<2, NScheme::NTypeIds::Uint64> {};
+
+ using TKey = TableKey<Key>;
+ using TColumns = TableColumns<Key, Value>;
+ };
+
+ using TTables = SchemaTables<Nodes, Config, Params>;
+ using TSettings = SchemaSettings<ExecutorLogBatching<true>,
+ ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
+};
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/node_broker__update_config.cpp b/ydb/core/mind/node_broker__update_config.cpp
index 347788ec0e8..d741cefae54 100644
--- a/ydb/core/mind/node_broker__update_config.cpp
+++ b/ydb/core/mind/node_broker__update_config.cpp
@@ -1,114 +1,114 @@
-#include "node_broker_impl.h"
-#include "node_broker__scheme.h"
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-class TNodeBroker::TTxUpdateConfig : public TTransactionBase<TNodeBroker> {
-public:
- TTxUpdateConfig(TNodeBroker *self,
- TEvConsole::TEvConfigNotificationRequest::TPtr notification)
- : TBase(self)
- , Notification(std::move(notification))
- , Config(Notification->Get()->Record.GetConfig().GetNodeBrokerConfig())
- , Modify(false)
- {
- }
-
- TTxUpdateConfig(TNodeBroker *self,
- TEvNodeBroker::TEvSetConfigRequest::TPtr request)
- : TBase(self)
- , Request(std::move(request))
- , Config(Request->Get()->Record.GetConfig())
- , Modify(false)
- {
- }
-
- bool ProcessNotification(const TActorContext &ctx)
- {
- auto &rec = Notification->Get()->Record;
-
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "TTxUpdateConfig Execute " << rec.ShortDebugString());
-
- if (rec.GetSubscriptionId() != Self->ConfigSubscriptionId) {
- LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
- "Config subscription id mismatch (" << rec.GetSubscriptionId()
- << " vs expected " << Self->ConfigSubscriptionId << ")");
- return false;
- }
-
- auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
- Response = new IEventHandle(Notification->Sender, Self->SelfId(), resp.Release(),
- 0, Notification->Cookie);
-
- return true;
- }
-
- bool ProcessRequest(const TActorContext &ctx)
- {
- auto &rec = Request->Get()->Record;
-
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "TTxUpdateConfig Execute " << rec.ShortDebugString());
-
- auto resp = MakeHolder<TEvNodeBroker::TEvSetConfigResponse>();
- resp->Record.MutableStatus()->SetCode(NKikimrNodeBroker::TStatus::OK);
- Response = new IEventHandle(Request->Sender, Self->SelfId(), resp.Release(),
- 0, Request->Cookie);
-
- return true;
- }
-
- bool Execute(TTransactionContext &txc,
- const TActorContext &ctx) override
- {
- if (Notification && !ProcessNotification(ctx))
- return true;
-
- if (Request && !ProcessRequest(ctx))
- return true;
-
- Self->DbUpdateConfig(Config, txc);
-
- Modify = true;
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxUpdateConfig Complete");
-
- if (Modify)
- Self->LoadConfigFromProto(Config);
-
- if (Response) {
- LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
- "TTxUpdateConfig reply with: " << Response->GetBase()->ToString());
- ctx.Send(Response);
- }
-
- Self->TxCompleted(this, ctx);
- }
-
-private:
- TEvConsole::TEvConfigNotificationRequest::TPtr Notification;
- TEvNodeBroker::TEvSetConfigRequest::TPtr Request;
- TAutoPtr<IEventHandle> Response;
- const NKikimrNodeBroker::TConfig &Config;
- bool Modify;
-};
-
-ITransaction *TNodeBroker::CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev)
-{
- return new TTxUpdateConfig(this, std::move(ev));
-}
-
-ITransaction *TNodeBroker::CreateTxUpdateConfig(TEvNodeBroker::TEvSetConfigRequest::TPtr &ev)
-{
- return new TTxUpdateConfig(this, std::move(ev));
-}
-
-} // NNodeBroker
-} // NKikimr
+#include "node_broker_impl.h"
+#include "node_broker__scheme.h"
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+class TNodeBroker::TTxUpdateConfig : public TTransactionBase<TNodeBroker> {
+public:
+ TTxUpdateConfig(TNodeBroker *self,
+ TEvConsole::TEvConfigNotificationRequest::TPtr notification)
+ : TBase(self)
+ , Notification(std::move(notification))
+ , Config(Notification->Get()->Record.GetConfig().GetNodeBrokerConfig())
+ , Modify(false)
+ {
+ }
+
+ TTxUpdateConfig(TNodeBroker *self,
+ TEvNodeBroker::TEvSetConfigRequest::TPtr request)
+ : TBase(self)
+ , Request(std::move(request))
+ , Config(Request->Get()->Record.GetConfig())
+ , Modify(false)
+ {
+ }
+
+ bool ProcessNotification(const TActorContext &ctx)
+ {
+ auto &rec = Notification->Get()->Record;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "TTxUpdateConfig Execute " << rec.ShortDebugString());
+
+ if (rec.GetSubscriptionId() != Self->ConfigSubscriptionId) {
+ LOG_ERROR_S(ctx, NKikimrServices::NODE_BROKER,
+ "Config subscription id mismatch (" << rec.GetSubscriptionId()
+ << " vs expected " << Self->ConfigSubscriptionId << ")");
+ return false;
+ }
+
+ auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
+ Response = new IEventHandle(Notification->Sender, Self->SelfId(), resp.Release(),
+ 0, Notification->Cookie);
+
+ return true;
+ }
+
+ bool ProcessRequest(const TActorContext &ctx)
+ {
+ auto &rec = Request->Get()->Record;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "TTxUpdateConfig Execute " << rec.ShortDebugString());
+
+ auto resp = MakeHolder<TEvNodeBroker::TEvSetConfigResponse>();
+ resp->Record.MutableStatus()->SetCode(NKikimrNodeBroker::TStatus::OK);
+ Response = new IEventHandle(Request->Sender, Self->SelfId(), resp.Release(),
+ 0, Request->Cookie);
+
+ return true;
+ }
+
+ bool Execute(TTransactionContext &txc,
+ const TActorContext &ctx) override
+ {
+ if (Notification && !ProcessNotification(ctx))
+ return true;
+
+ if (Request && !ProcessRequest(ctx))
+ return true;
+
+ Self->DbUpdateConfig(Config, txc);
+
+ Modify = true;
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxUpdateConfig Complete");
+
+ if (Modify)
+ Self->LoadConfigFromProto(Config);
+
+ if (Response) {
+ LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER,
+ "TTxUpdateConfig reply with: " << Response->GetBase()->ToString());
+ ctx.Send(Response);
+ }
+
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvConsole::TEvConfigNotificationRequest::TPtr Notification;
+ TEvNodeBroker::TEvSetConfigRequest::TPtr Request;
+ TAutoPtr<IEventHandle> Response;
+ const NKikimrNodeBroker::TConfig &Config;
+ bool Modify;
+};
+
+ITransaction *TNodeBroker::CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev)
+{
+ return new TTxUpdateConfig(this, std::move(ev));
+}
+
+ITransaction *TNodeBroker::CreateTxUpdateConfig(TEvNodeBroker::TEvSetConfigRequest::TPtr &ev)
+{
+ return new TTxUpdateConfig(this, std::move(ev));
+}
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/node_broker__update_config_subscription.cpp b/ydb/core/mind/node_broker__update_config_subscription.cpp
index 422b7eeadf0..e192e2ed6e2 100644
--- a/ydb/core/mind/node_broker__update_config_subscription.cpp
+++ b/ydb/core/mind/node_broker__update_config_subscription.cpp
@@ -1,54 +1,54 @@
-#include "node_broker_impl.h"
-#include "node_broker__scheme.h"
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-class TNodeBroker::TTxUpdateConfigSubscription : public TTransactionBase<TNodeBroker> {
-public:
- TTxUpdateConfigSubscription(TNodeBroker *self,
- TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr event)
- : TBase(self)
- , Event(std::move(event))
- , SubscriptionId(0)
- {
- }
-
- bool Execute(TTransactionContext &txc,
- const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxUpdateConfigSubscription Execute");
-
- auto &rec = Event->Get()->Record;
- Y_VERIFY(rec.GetStatus().GetCode() == Ydb::StatusIds::SUCCESS);
-
- SubscriptionId = rec.GetSubscriptionId();
- Self->DbUpdateConfigSubscription(SubscriptionId, txc);
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxUpdateConfigSubscription Complete");
-
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
- "Using new subscription id=" << SubscriptionId);
-
- Self->ConfigSubscriptionId = SubscriptionId;
-
- Self->TxCompleted(0, this, ctx);
- }
-
-private:
- TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr Event;
- ui64 SubscriptionId;
-};
-
-ITransaction *TNodeBroker::CreateTxUpdateConfigSubscription(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev)
-{
- return new TTxUpdateConfigSubscription(this, std::move(ev));
-}
-
-} // NNodeBroker
-} // NKikimr
+#include "node_broker_impl.h"
+#include "node_broker__scheme.h"
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+class TNodeBroker::TTxUpdateConfigSubscription : public TTransactionBase<TNodeBroker> {
+public:
+ TTxUpdateConfigSubscription(TNodeBroker *self,
+ TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr event)
+ : TBase(self)
+ , Event(std::move(event))
+ , SubscriptionId(0)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc,
+ const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxUpdateConfigSubscription Execute");
+
+ auto &rec = Event->Get()->Record;
+ Y_VERIFY(rec.GetStatus().GetCode() == Ydb::StatusIds::SUCCESS);
+
+ SubscriptionId = rec.GetSubscriptionId();
+ Self->DbUpdateConfigSubscription(SubscriptionId, txc);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxUpdateConfigSubscription Complete");
+
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER,
+ "Using new subscription id=" << SubscriptionId);
+
+ Self->ConfigSubscriptionId = SubscriptionId;
+
+ Self->TxCompleted(0, this, ctx);
+ }
+
+private:
+ TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr Event;
+ ui64 SubscriptionId;
+};
+
+ITransaction *TNodeBroker::CreateTxUpdateConfigSubscription(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev)
+{
+ return new TTxUpdateConfigSubscription(this, std::move(ev));
+}
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/node_broker__update_epoch.cpp b/ydb/core/mind/node_broker__update_epoch.cpp
index 99988b2ae75..acaa0e6df50 100644
--- a/ydb/core/mind/node_broker__update_epoch.cpp
+++ b/ydb/core/mind/node_broker__update_epoch.cpp
@@ -1,46 +1,46 @@
-#include "node_broker_impl.h"
-#include "node_broker__scheme.h"
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-class TNodeBroker::TTxUpdateEpoch : public TTransactionBase<TNodeBroker> {
-public:
- TTxUpdateEpoch(TNodeBroker *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER, "TTxUpdateEpoch Execute");
-
- Self->ComputeNextEpochDiff(Diff);
- Self->DbApplyStateDiff(Diff, txc);
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxUpdateEpoch Complete");
-
- Self->ApplyStateDiff(Diff);
- Self->ScheduleEpochUpdate(ctx);
- Self->PrepareEpochCache();
- Self->ProcessDelayedListNodesRequests();
-
- Self->TxCompleted(this, ctx);
- }
-
-private:
- TStateDiff Diff;
-};
-
-ITransaction *TNodeBroker::CreateTxUpdateEpoch()
-{
- return new TTxUpdateEpoch(this);
-}
-
-} // NNodeBroker
-} // NKikimr
+#include "node_broker_impl.h"
+#include "node_broker__scheme.h"
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+class TNodeBroker::TTxUpdateEpoch : public TTransactionBase<TNodeBroker> {
+public:
+ TTxUpdateEpoch(TNodeBroker *self)
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::NODE_BROKER, "TTxUpdateEpoch Execute");
+
+ Self->ComputeNextEpochDiff(Diff);
+ Self->DbApplyStateDiff(Diff, txc);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "TTxUpdateEpoch Complete");
+
+ Self->ApplyStateDiff(Diff);
+ Self->ScheduleEpochUpdate(ctx);
+ Self->PrepareEpochCache();
+ Self->ProcessDelayedListNodesRequests();
+
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+ TStateDiff Diff;
+};
+
+ITransaction *TNodeBroker::CreateTxUpdateEpoch()
+{
+ return new TTxUpdateEpoch(this);
+}
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/node_broker_impl.h b/ydb/core/mind/node_broker_impl.h
index a32c585bd6a..e3b68b0587b 100644
--- a/ydb/core/mind/node_broker_impl.h
+++ b/ydb/core/mind/node_broker_impl.h
@@ -1,195 +1,195 @@
-#pragma once
-
-#include "node_broker.h"
-
+#pragma once
+
+#include "node_broker.h"
+
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/cms/console/console.h>
#include <ydb/core/cms/console/tx_processor.h>
#include <ydb/core/engine/minikql/flat_local_tx_factory.h>
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
-
+
#include <library/cpp/actors/core/hfunc.h>
#include <library/cpp/actors/core/interconnect.h>
-
-#include <util/generic/bitmap.h>
-
-namespace NKikimr {
-namespace NNodeBroker {
-
-using NTabletFlatExecutor::TTabletExecutedFlat;
-using NTabletFlatExecutor::ITransaction;
-using NTabletFlatExecutor::TTransactionBase;
-using NTabletFlatExecutor::TTransactionContext;
-using NConsole::TEvConsole;
-using NConsole::ITxExecutor;
-using NConsole::TTxProcessor;
-
-class TNodeBroker : public TActor<TNodeBroker>
- , public TTabletExecutedFlat
- , public ITxExecutor {
-public:
- struct TEvPrivate {
- enum EEv {
- EvUpdateEpoch = EventSpaceBegin(TEvents::ES_PRIVATE),
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
-
- struct TEvUpdateEpoch : public TEventLocal<TEvUpdateEpoch, EvUpdateEpoch> {};
- };
-
-private:
- using TActorBase = TActor<TNodeBroker>;
-
- static constexpr TDuration MIN_LEASE_DURATION = TDuration::Minutes(5);
-
- enum EConfigKey {
- ConfigKeyConfig = 1,
- };
-
- enum EParamKey {
- ParamKeyConfigSubscription = 1,
- ParamKeyCurrentEpochId,
- ParamKeyCurrentEpochVersion,
- ParamKeyCurrentEpochStart,
- ParamKeyCurrentEpochEnd,
- ParamKeyNextEpochEnd,
- };
-
- struct TNodeInfo : public TEvInterconnect::TNodeInfo {
+
+#include <util/generic/bitmap.h>
+
+namespace NKikimr {
+namespace NNodeBroker {
+
+using NTabletFlatExecutor::TTabletExecutedFlat;
+using NTabletFlatExecutor::ITransaction;
+using NTabletFlatExecutor::TTransactionBase;
+using NTabletFlatExecutor::TTransactionContext;
+using NConsole::TEvConsole;
+using NConsole::ITxExecutor;
+using NConsole::TTxProcessor;
+
+class TNodeBroker : public TActor<TNodeBroker>
+ , public TTabletExecutedFlat
+ , public ITxExecutor {
+public:
+ struct TEvPrivate {
+ enum EEv {
+ EvUpdateEpoch = EventSpaceBegin(TEvents::ES_PRIVATE),
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
+
+ struct TEvUpdateEpoch : public TEventLocal<TEvUpdateEpoch, EvUpdateEpoch> {};
+ };
+
+private:
+ using TActorBase = TActor<TNodeBroker>;
+
+ static constexpr TDuration MIN_LEASE_DURATION = TDuration::Minutes(5);
+
+ enum EConfigKey {
+ ConfigKeyConfig = 1,
+ };
+
+ enum EParamKey {
+ ParamKeyConfigSubscription = 1,
+ ParamKeyCurrentEpochId,
+ ParamKeyCurrentEpochVersion,
+ ParamKeyCurrentEpochStart,
+ ParamKeyCurrentEpochEnd,
+ ParamKeyNextEpochEnd,
+ };
+
+ struct TNodeInfo : public TEvInterconnect::TNodeInfo {
TNodeInfo() = delete;
- TNodeInfo(ui32 nodeId,
- const TString &address,
- const TString &host,
- const TString &resolveHost,
- ui16 port,
+ TNodeInfo(ui32 nodeId,
+ const TString &address,
+ const TString &host,
+ const TString &resolveHost,
+ ui16 port,
const TNodeLocation &location,
bool legacyUpdatePending)
- : TEvInterconnect::TNodeInfo(nodeId, address, host, resolveHost,
- port, location)
- , Lease(0)
+ : TEvInterconnect::TNodeInfo(nodeId, address, host, resolveHost,
+ port, location)
+ , Lease(0)
, LegacyUpdatePending(legacyUpdatePending)
- {
- }
-
- TNodeInfo(const TNodeInfo &other) = default;
-
- bool IsFixed() const
- {
- return Expire == TInstant::Max();
- }
-
- static TString ExpirationString(TInstant expire)
- {
- if (expire == TInstant::Max())
- return "NEVER";
- return expire.ToRfc822StringLocal();
- }
-
- TString IdString() const
- {
- return TStringBuilder() << "#" << NodeId << " " << Host << ":" << Port;
- }
-
- TString ExpirationString() const
- {
- return ExpirationString(Expire);
- }
-
- // Lease is incremented each time node extends its lifetime.
- ui32 Lease;
- TInstant Expire;
+ {
+ }
+
+ TNodeInfo(const TNodeInfo &other) = default;
+
+ bool IsFixed() const
+ {
+ return Expire == TInstant::Max();
+ }
+
+ static TString ExpirationString(TInstant expire)
+ {
+ if (expire == TInstant::Max())
+ return "NEVER";
+ return expire.ToRfc822StringLocal();
+ }
+
+ TString IdString() const
+ {
+ return TStringBuilder() << "#" << NodeId << " " << Host << ":" << Port;
+ }
+
+ TString ExpirationString() const
+ {
+ return ExpirationString(Expire);
+ }
+
+ // Lease is incremented each time node extends its lifetime.
+ ui32 Lease;
+ TInstant Expire;
bool LegacyUpdatePending = false;
- };
-
- // State changes to apply while moving to the next epoch.
- struct TStateDiff {
- TVector<ui32> NodesToExpire;
- TVector<ui32> NodesToRemove;
- TEpochInfo NewEpoch;
- };
-
- class TTxExtendLease;
- class TTxInitScheme;
- class TTxLoadState;
- class TTxRegisterNode;
- class TTxUpdateConfig;
- class TTxUpdateConfigSubscription;
- class TTxUpdateEpoch;
-
- ITransaction *CreateTxExtendLease(TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev);
- ITransaction *CreateTxInitScheme();
- ITransaction *CreateTxLoadState();
+ };
+
+ // State changes to apply while moving to the next epoch.
+ struct TStateDiff {
+ TVector<ui32> NodesToExpire;
+ TVector<ui32> NodesToRemove;
+ TEpochInfo NewEpoch;
+ };
+
+ class TTxExtendLease;
+ class TTxInitScheme;
+ class TTxLoadState;
+ class TTxRegisterNode;
+ class TTxUpdateConfig;
+ class TTxUpdateConfigSubscription;
+ class TTxUpdateEpoch;
+
+ ITransaction *CreateTxExtendLease(TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev);
+ ITransaction *CreateTxInitScheme();
+ ITransaction *CreateTxLoadState();
ITransaction *CreateTxRegisterNode(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev, const NActors::TScopeId& scopeId);
- ITransaction *CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev);
- ITransaction *CreateTxUpdateConfig(TEvNodeBroker::TEvSetConfigRequest::TPtr &ev);
- ITransaction *CreateTxUpdateConfigSubscription(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev);
- ITransaction *CreateTxUpdateEpoch();
-
- void OnActivateExecutor(const TActorContext &ctx) override;
- void OnDetach(const TActorContext &ctx) override;
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev,
- const TActorContext &ctx) override;
- void Enqueue(TAutoPtr<IEventHandle> &ev,
- const TActorContext &ctx) override;
- bool OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev,
- const TActorContext &ctx) override;
- void Cleanup(const TActorContext &ctx);
- void Die(const TActorContext &ctx) override;
-
- template<typename TResponseEvent>
+ ITransaction *CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev);
+ ITransaction *CreateTxUpdateConfig(TEvNodeBroker::TEvSetConfigRequest::TPtr &ev);
+ ITransaction *CreateTxUpdateConfigSubscription(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev);
+ ITransaction *CreateTxUpdateEpoch();
+
+ void OnActivateExecutor(const TActorContext &ctx) override;
+ void OnDetach(const TActorContext &ctx) override;
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev,
+ const TActorContext &ctx) override;
+ void Enqueue(TAutoPtr<IEventHandle> &ev,
+ const TActorContext &ctx) override;
+ bool OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev,
+ const TActorContext &ctx) override;
+ void Cleanup(const TActorContext &ctx);
+ void Die(const TActorContext &ctx) override;
+
+ template<typename TResponseEvent>
void ReplyWithError(TActorId sender,
- NKikimrNodeBroker::TStatus::ECode code,
- const TString &reason,
- const TActorContext &ctx)
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "Reply with %s (%s)",
+ NKikimrNodeBroker::TStatus::ECode code,
+ const TString &reason,
+ const TActorContext &ctx)
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "Reply with %s (%s)",
NKikimrNodeBroker::TStatus::ECode_Name(code).data(), reason.data());
-
- TAutoPtr<TResponseEvent> resp = new TResponseEvent;
- resp->Record.MutableStatus()->SetCode(code);
- resp->Record.MutableStatus()->SetReason(reason);
- ctx.Send(sender, resp.Release());
- }
-
- STFUNC(StateInit)
- {
- LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "StateInit event type: %" PRIx32 " event: %s",
+
+ TAutoPtr<TResponseEvent> resp = new TResponseEvent;
+ resp->Record.MutableStatus()->SetCode(code);
+ resp->Record.MutableStatus()->SetReason(reason);
+ ctx.Send(sender, resp.Release());
+ }
+
+ STFUNC(StateInit)
+ {
+ LOG_DEBUG(ctx, NKikimrServices::NODE_BROKER, "StateInit event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- StateInitImpl(ev, ctx);
- }
-
- STFUNC(StateWork)
- {
- TRACE_EVENT(NKikimrServices::NODE_BROKER);
- switch (ev->GetTypeRewrite()) {
- HFuncTraced(TEvConsole::TEvConfigNotificationRequest, Handle);
- HFuncTraced(TEvConsole::TEvReplaceConfigSubscriptionsResponse, Handle);
- HFuncTraced(TEvents::TEvPoisonPill, Handle);
- HFuncTraced(TEvNodeBroker::TEvListNodes, Handle);
- HFuncTraced(TEvNodeBroker::TEvResolveNode, Handle);
- HFuncTraced(TEvNodeBroker::TEvRegistrationRequest, Handle);
- HFuncTraced(TEvNodeBroker::TEvExtendLeaseRequest, Handle);
- HFuncTraced(TEvNodeBroker::TEvGetConfigRequest, Handle);
- HFuncTraced(TEvNodeBroker::TEvSetConfigRequest, Handle);
- HFuncTraced(TEvPrivate::TEvUpdateEpoch, Handle);
- IgnoreFunc(TEvTabletPipe::TEvServerConnected);
- IgnoreFunc(TEvTabletPipe::TEvServerDisconnected);
-
- default:
- if (!HandleDefaultEvents(ev, ctx)) {
- Y_FAIL("TNodeBroker::StateWork unexpected event type: %" PRIx32 " event: %s from %s",
+ StateInitImpl(ev, ctx);
+ }
+
+ STFUNC(StateWork)
+ {
+ TRACE_EVENT(NKikimrServices::NODE_BROKER);
+ switch (ev->GetTypeRewrite()) {
+ HFuncTraced(TEvConsole::TEvConfigNotificationRequest, Handle);
+ HFuncTraced(TEvConsole::TEvReplaceConfigSubscriptionsResponse, Handle);
+ HFuncTraced(TEvents::TEvPoisonPill, Handle);
+ HFuncTraced(TEvNodeBroker::TEvListNodes, Handle);
+ HFuncTraced(TEvNodeBroker::TEvResolveNode, Handle);
+ HFuncTraced(TEvNodeBroker::TEvRegistrationRequest, Handle);
+ HFuncTraced(TEvNodeBroker::TEvExtendLeaseRequest, Handle);
+ HFuncTraced(TEvNodeBroker::TEvGetConfigRequest, Handle);
+ HFuncTraced(TEvNodeBroker::TEvSetConfigRequest, Handle);
+ HFuncTraced(TEvPrivate::TEvUpdateEpoch, Handle);
+ IgnoreFunc(TEvTabletPipe::TEvServerConnected);
+ IgnoreFunc(TEvTabletPipe::TEvServerDisconnected);
+
+ default:
+ if (!HandleDefaultEvents(ev, ctx)) {
+ Y_FAIL("TNodeBroker::StateWork unexpected event type: %" PRIx32 " event: %s from %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?",
ev->Sender.ToString().data());
- }
- }
- }
-
- void ClearState();
-
+ }
+ }
+ }
+
+ void ClearState();
+
ui32 NodeIdStep() const {
return SingleDomainAlloc ? 1 : (1 << DOMAIN_BITS);
}
@@ -202,140 +202,140 @@ private:
return SingleDomainAlloc ? nodeId : ((nodeId & ~DOMAIN_MASK) | DomainId);
}
- // Internal state modifiers. Don't affect DB.
- void AddNode(const TNodeInfo &info);
- void RemoveNode(ui32 nodeId);
- void ExtendLease(TNodeInfo &node);
- void FixNodeId(TNodeInfo &node);
- void RecomputeFreeIds();
- bool IsBannedId(ui32 id) const;
-
- void AddDelayedListNodesRequest(ui64 epoch,
- TEvNodeBroker::TEvListNodes::TPtr &ev);
- void ProcessListNodesRequest(TEvNodeBroker::TEvListNodes::TPtr &ev);
- void ProcessDelayedListNodesRequests();
-
- void ScheduleEpochUpdate(const TActorContext &ctx);
- void ProcessEnqueuedEvents(const TActorContext &ctx);
- void FillNodeInfo(const TNodeInfo &node,
- NKikimrNodeBroker::TNodeInfo &info) const;
-
- void ComputeNextEpochDiff(TStateDiff &diff);
- void ApplyStateDiff(const TStateDiff &diff);
- void UpdateEpochVersion();
- void PrepareEpochCache();
- void AddNodeToEpochCache(const TNodeInfo &node);
-
- void SubscribeForConfigUpdates(const TActorContext &ctx);
-
- void ProcessTx(ITransaction *tx,
- const TActorContext &ctx);
- void ProcessTx(ui32 nodeId,
- ITransaction *tx,
- const TActorContext &ctx);
- void TxCompleted(ITransaction *tx,
- const TActorContext &ctx);
- void TxCompleted(ui32 nodeId,
- ITransaction *tx,
- const TActorContext &ctx);
-
- void LoadConfigFromProto(const NKikimrNodeBroker::TConfig &config);
-
- // Local database manipulations.
- void DbAddNode(const TNodeInfo &node,
- TTransactionContext &txc);
- void DbApplyStateDiff(const TStateDiff &diff,
- TTransactionContext &txc);
- void DbFixNodeId(const TNodeInfo &node,
- TTransactionContext &txc);
- bool DbLoadState(TTransactionContext &txc,
- const TActorContext &ctx);
- void DbRemoveNodes(const TVector<ui32> &nodes,
- TTransactionContext &txc);
- void DbUpdateConfig(const NKikimrNodeBroker::TConfig &config,
- TTransactionContext &txc);
- void DbUpdateConfigSubscription(ui64 subscriptionId,
- TTransactionContext &txc);
- void DbUpdateEpoch(const TEpochInfo &epoch,
- TTransactionContext &txc);
- void DbUpdateEpochVersion(ui64 version,
- TTransactionContext &txc);
- void DbUpdateNodeLease(const TNodeInfo &node,
- TTransactionContext &txc);
+ // Internal state modifiers. Don't affect DB.
+ void AddNode(const TNodeInfo &info);
+ void RemoveNode(ui32 nodeId);
+ void ExtendLease(TNodeInfo &node);
+ void FixNodeId(TNodeInfo &node);
+ void RecomputeFreeIds();
+ bool IsBannedId(ui32 id) const;
+
+ void AddDelayedListNodesRequest(ui64 epoch,
+ TEvNodeBroker::TEvListNodes::TPtr &ev);
+ void ProcessListNodesRequest(TEvNodeBroker::TEvListNodes::TPtr &ev);
+ void ProcessDelayedListNodesRequests();
+
+ void ScheduleEpochUpdate(const TActorContext &ctx);
+ void ProcessEnqueuedEvents(const TActorContext &ctx);
+ void FillNodeInfo(const TNodeInfo &node,
+ NKikimrNodeBroker::TNodeInfo &info) const;
+
+ void ComputeNextEpochDiff(TStateDiff &diff);
+ void ApplyStateDiff(const TStateDiff &diff);
+ void UpdateEpochVersion();
+ void PrepareEpochCache();
+ void AddNodeToEpochCache(const TNodeInfo &node);
+
+ void SubscribeForConfigUpdates(const TActorContext &ctx);
+
+ void ProcessTx(ITransaction *tx,
+ const TActorContext &ctx);
+ void ProcessTx(ui32 nodeId,
+ ITransaction *tx,
+ const TActorContext &ctx);
+ void TxCompleted(ITransaction *tx,
+ const TActorContext &ctx);
+ void TxCompleted(ui32 nodeId,
+ ITransaction *tx,
+ const TActorContext &ctx);
+
+ void LoadConfigFromProto(const NKikimrNodeBroker::TConfig &config);
+
+ // Local database manipulations.
+ void DbAddNode(const TNodeInfo &node,
+ TTransactionContext &txc);
+ void DbApplyStateDiff(const TStateDiff &diff,
+ TTransactionContext &txc);
+ void DbFixNodeId(const TNodeInfo &node,
+ TTransactionContext &txc);
+ bool DbLoadState(TTransactionContext &txc,
+ const TActorContext &ctx);
+ void DbRemoveNodes(const TVector<ui32> &nodes,
+ TTransactionContext &txc);
+ void DbUpdateConfig(const NKikimrNodeBroker::TConfig &config,
+ TTransactionContext &txc);
+ void DbUpdateConfigSubscription(ui64 subscriptionId,
+ TTransactionContext &txc);
+ void DbUpdateEpoch(const TEpochInfo &epoch,
+ TTransactionContext &txc);
+ void DbUpdateEpochVersion(ui64 version,
+ TTransactionContext &txc);
+ void DbUpdateNodeLease(const TNodeInfo &node,
+ TTransactionContext &txc);
void DbUpdateNodeLocation(const TNodeInfo &node,
TTransactionContext &txc);
-
- void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvents::TEvPoisonPill::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvNodeBroker::TEvListNodes::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvNodeBroker::TEvResolveNode::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvNodeBroker::TEvGetConfigRequest::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvNodeBroker::TEvSetConfigRequest::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvPrivate::TEvUpdateEpoch::TPtr &ev,
- const TActorContext &ctx);
-
- // ID of domain node broker is responsible for.
- ui32 DomainId;
- // All registered dynamic nodes.
+
+ void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvents::TEvPoisonPill::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvNodeBroker::TEvListNodes::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvNodeBroker::TEvResolveNode::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvNodeBroker::TEvGetConfigRequest::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvNodeBroker::TEvSetConfigRequest::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvUpdateEpoch::TPtr &ev,
+ const TActorContext &ctx);
+
+ // ID of domain node broker is responsible for.
+ ui32 DomainId;
+ // All registered dynamic nodes.
THashMap<ui32, TNodeInfo> Nodes;
- THashMap<ui32, TNodeInfo> ExpiredNodes;
+ THashMap<ui32, TNodeInfo> ExpiredNodes;
// Maps <Host/Addr:Port> to NodeID.
THashMap<std::tuple<TString, TString, ui16>, ui32> Hosts;
- // Bitmap with free Node IDs (with no lower 5 bits).
- TDynBitMap FreeIds;
- // Epoch info.
- TEpochInfo Epoch;
- // Current config.
- NKikimrNodeBroker::TConfig Config;
- ui64 MaxStaticId;
- ui64 MaxDynamicId;
- TDuration EpochDuration;
- TVector<std::pair<ui32, ui32>> BannedIds;
- ui64 ConfigSubscriptionId;
-
- // Events collected during initialization phase.
+ // Bitmap with free Node IDs (with no lower 5 bits).
+ TDynBitMap FreeIds;
+ // Epoch info.
+ TEpochInfo Epoch;
+ // Current config.
+ NKikimrNodeBroker::TConfig Config;
+ ui64 MaxStaticId;
+ ui64 MaxDynamicId;
+ TDuration EpochDuration;
+ TVector<std::pair<ui32, ui32>> BannedIds;
+ ui64 ConfigSubscriptionId;
+
+ // Events collected during initialization phase.
TVector<TAutoPtr<IEventHandle>> EnqueuedEvents;
- TMultiMap<ui64, TEvNodeBroker::TEvListNodes::TPtr> DelayedListNodesRequests;
- // Transactions queue.
- TTxProcessor::TPtr TxProcessor;
- TSchedulerCookieHolder EpochTimerCookieHolder;
- TString EpochCache;
-
+ TMultiMap<ui64, TEvNodeBroker::TEvListNodes::TPtr> DelayedListNodesRequests;
+ // Transactions queue.
+ TTxProcessor::TPtr TxProcessor;
+ TSchedulerCookieHolder EpochTimerCookieHolder;
+ TString EpochCache;
+
bool SingleDomain = false;
bool SingleDomainAlloc = false;
-public:
+public:
TNodeBroker(const TActorId &tablet, TTabletStorageInfo *info)
- : TActor(&TThis::StateInit)
+ : TActor(&TThis::StateInit)
, TTabletExecutedFlat(info, tablet, new NMiniKQL::TMiniKQLFactory)
- , EpochDuration(TDuration::Hours(1))
- , ConfigSubscriptionId(0)
- , TxProcessor(new TTxProcessor(*this, "root", NKikimrServices::NODE_BROKER))
- {
- }
-
+ , EpochDuration(TDuration::Hours(1))
+ , ConfigSubscriptionId(0)
+ , TxProcessor(new TTxProcessor(*this, "root", NKikimrServices::NODE_BROKER))
+ {
+ }
+
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::NODE_BROKER_ACTOR;
- }
-
- void Execute(ITransaction *transaction, const TActorContext &ctx) override
- {
- TTabletExecutedFlat::Execute(transaction, ctx);
- }
-};
-
-} // NNodeBroker
-} // NKikimr
+ }
+
+ void Execute(ITransaction *transaction, const TActorContext &ctx) override
+ {
+ TTabletExecutedFlat::Execute(transaction, ctx);
+ }
+};
+
+} // NNodeBroker
+} // NKikimr
diff --git a/ydb/core/mind/node_broker_ut.cpp b/ydb/core/mind/node_broker_ut.cpp
index dc8dbf71bbd..0d9498ddcdd 100644
--- a/ydb/core/mind/node_broker_ut.cpp
+++ b/ydb/core/mind/node_broker_ut.cpp
@@ -1,11 +1,11 @@
-#include "node_broker_impl.h"
-#include "dynamic_nameserver_impl.h"
-
+#include "node_broker_impl.h"
+#include "dynamic_nameserver_impl.h"
+
#include <ydb/core/testlib/basics/appdata.h>
#include <ydb/core/testlib/basics/storage.h>
#include <ydb/core/testlib/basics/helpers.h>
#include <ydb/core/testlib/tablet_helpers.h>
-
+
#include <library/cpp/actors/interconnect/events_local.h>
#include <library/cpp/actors/interconnect/interconnect_impl.h>
#include <ydb/core/node_whiteboard/node_whiteboard.h>
@@ -13,1010 +13,1010 @@
#include <ydb/core/base/statestorage_impl.h>
#include <ydb/core/blobstorage/crypto/default.h>
#include <ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h>
-
+
#include <google/protobuf/text_format.h>
#include <library/cpp/malloc/api/malloc.h>
#include <library/cpp/svnversion/svnversion.h>
#include <library/cpp/testing/unittest/registar.h>
-
-#include <util/string/printf.h>
-#include <util/string/subst.h>
-#include <util/system/hostname.h>
-
-const bool STRAND_PDISK = true;
-#ifndef NDEBUG
-const bool ENABLE_DETAILED_NODE_BROKER_LOG = true;
-#else
-const bool ENABLE_DETAILED_NODE_BROKER_LOG = false;
-#endif
-
-namespace NKikimr {
-
-using namespace NNodeBroker;
-using namespace NKikimrNodeBroker;
-
-namespace {
-
-void SetupLogging(TTestActorRuntime& runtime)
-{
- NActors::NLog::EPriority priority = ENABLE_DETAILED_NODE_BROKER_LOG ? NLog::PRI_TRACE : NLog::PRI_ERROR;
-
- runtime.SetLogPriority(NKikimrServices::NODE_BROKER, priority);
-}
-
+
+#include <util/string/printf.h>
+#include <util/string/subst.h>
+#include <util/system/hostname.h>
+
+const bool STRAND_PDISK = true;
+#ifndef NDEBUG
+const bool ENABLE_DETAILED_NODE_BROKER_LOG = true;
+#else
+const bool ENABLE_DETAILED_NODE_BROKER_LOG = false;
+#endif
+
+namespace NKikimr {
+
+using namespace NNodeBroker;
+using namespace NKikimrNodeBroker;
+
+namespace {
+
+void SetupLogging(TTestActorRuntime& runtime)
+{
+ NActors::NLog::EPriority priority = ENABLE_DETAILED_NODE_BROKER_LOG ? NLog::PRI_TRACE : NLog::PRI_ERROR;
+
+ runtime.SetLogPriority(NKikimrServices::NODE_BROKER, priority);
+}
+
THashMap<ui32, TIntrusivePtr<TNodeWardenConfig>> NodeWardenConfigs;
-
-void SetupServices(TTestActorRuntime &runtime,
+
+void SetupServices(TTestActorRuntime &runtime,
ui32 maxDynNodes,
bool singleDomainMode)
-{
- const ui32 domainsNum = 1;
- const ui32 disksInDomain = 1;
-
+{
+ const ui32 domainsNum = 1;
+ const ui32 disksInDomain = 1;
+
// setup domain info
TAppPrepare app;
app.ClearDomainsAndHive();
app.AddDomain(TDomainsInfo::TDomain::ConstructEmptyDomain("dc-1").Release());
- { // setup channel profiles
- TIntrusivePtr<TChannelProfiles> channelProfiles = new TChannelProfiles;
- channelProfiles->Profiles.emplace_back();
+ { // setup channel profiles
+ TIntrusivePtr<TChannelProfiles> channelProfiles = new TChannelProfiles;
+ channelProfiles->Profiles.emplace_back();
TChannelProfiles::TProfile &profile = channelProfiles->Profiles.back();
- for (ui32 channelIdx = 0; channelIdx < 3; ++channelIdx) {
- profile.Channels.push_back(
- TChannelProfiles::TProfile::TChannel(TBlobStorageGroupType::ErasureNone, 0, NKikimrBlobStorage::TVDiskKind::Default));
- }
+ for (ui32 channelIdx = 0; channelIdx < 3; ++channelIdx) {
+ profile.Channels.push_back(
+ TChannelProfiles::TProfile::TChannel(TBlobStorageGroupType::ErasureNone, 0, NKikimrBlobStorage::TVDiskKind::Default));
+ }
app.SetChannels(std::move(channelProfiles));
- }
-
- for (ui32 nodeIndex = 0; nodeIndex < runtime.GetNodeCount(); ++nodeIndex) {
+ }
+
+ for (ui32 nodeIndex = 0; nodeIndex < runtime.GetNodeCount(); ++nodeIndex) {
SetupStateStorage(runtime, nodeIndex);
-
- TString staticConfig("AvailabilityDomains: 0 "
- "PDisks { NodeID: $Node1 PDiskID: 0 PDiskGuid: 1 Path: \"pdisk0.dat\" }"
- "VDisks { VDiskID { GroupID: 0 GroupGeneration: 1 Ring: 0 Domain: 0 VDisk: 0 }"
- " VDiskLocation { NodeID: $Node1 PDiskID: 0 PDiskGuid: 1 VDiskSlotID: 0 }"
- "}"
- "Groups { GroupID: 0 GroupGeneration: 1 ErasureSpecies: 0 "// None
- " Rings {"
- " FailDomains { VDiskLocations { NodeID: $Node1 PDiskID: 0 VDiskSlotID: 0 PDiskGuid: 1 } }"
- " }"
- "}");
-
- SubstGlobal(staticConfig, "$Node1", Sprintf("%" PRIu32, runtime.GetNodeId(0)));
-
- TIntrusivePtr<TNodeWardenConfig> nodeWardenConfig =
- new TNodeWardenConfig(STRAND_PDISK && !runtime.IsRealThreads()
- ? static_cast<IPDiskServiceFactory*>(new TStrandedPDiskServiceFactory(runtime))
- : static_cast<IPDiskServiceFactory*>(new TRealPDiskServiceFactory()));
- google::protobuf::TextFormat::ParseFromString(staticConfig, &nodeWardenConfig->ServiceSet);
-
- TIntrusivePtr<TNodeWardenConfig> existingNodeWardenConfig = NodeWardenConfigs[nodeIndex];
- if (existingNodeWardenConfig != nullptr) {
+
+ TString staticConfig("AvailabilityDomains: 0 "
+ "PDisks { NodeID: $Node1 PDiskID: 0 PDiskGuid: 1 Path: \"pdisk0.dat\" }"
+ "VDisks { VDiskID { GroupID: 0 GroupGeneration: 1 Ring: 0 Domain: 0 VDisk: 0 }"
+ " VDiskLocation { NodeID: $Node1 PDiskID: 0 PDiskGuid: 1 VDiskSlotID: 0 }"
+ "}"
+ "Groups { GroupID: 0 GroupGeneration: 1 ErasureSpecies: 0 "// None
+ " Rings {"
+ " FailDomains { VDiskLocations { NodeID: $Node1 PDiskID: 0 VDiskSlotID: 0 PDiskGuid: 1 } }"
+ " }"
+ "}");
+
+ SubstGlobal(staticConfig, "$Node1", Sprintf("%" PRIu32, runtime.GetNodeId(0)));
+
+ TIntrusivePtr<TNodeWardenConfig> nodeWardenConfig =
+ new TNodeWardenConfig(STRAND_PDISK && !runtime.IsRealThreads()
+ ? static_cast<IPDiskServiceFactory*>(new TStrandedPDiskServiceFactory(runtime))
+ : static_cast<IPDiskServiceFactory*>(new TRealPDiskServiceFactory()));
+ google::protobuf::TextFormat::ParseFromString(staticConfig, &nodeWardenConfig->ServiceSet);
+
+ TIntrusivePtr<TNodeWardenConfig> existingNodeWardenConfig = NodeWardenConfigs[nodeIndex];
+ if (existingNodeWardenConfig != nullptr) {
//std::swap(nodeWardenConfig->SectorMaps, existingNodeWardenConfig->SectorMaps);
- }
-
- if (nodeIndex == 0) {
- TString pDiskPath;
+ }
+
+ if (nodeIndex == 0) {
+ TString pDiskPath;
TIntrusivePtr<NPDisk::TSectorMap> sectorMap;
ui64 pDiskSize = 32ull << 30ull;
- ui64 pDiskChunkSize = 32u << 20u;
- if (true /*in memory*/) {
- pDiskPath = "/TString/pdisk0.dat";
+ ui64 pDiskChunkSize = 32u << 20u;
+ if (true /*in memory*/) {
+ pDiskPath = "/TString/pdisk0.dat";
auto& existing = nodeWardenConfig->SectorMaps[pDiskPath];
if (existing && existing->DeviceSize == pDiskSize) {
sectorMap = existing;
- } else {
+ } else {
sectorMap.Reset(new NPDisk::TSectorMap(pDiskSize));
nodeWardenConfig->SectorMaps[pDiskPath] = sectorMap;
- }
- } else {
- static TTempDir tempDir;
- pDiskPath = tempDir() + "/pdisk0.dat";
- }
- nodeWardenConfig->ServiceSet.MutablePDisks(0)->SetPath(pDiskPath);
- ui64 pDiskGuid = 1;
- static ui64 iteration = 0;
- ++iteration;
- FormatPDisk(pDiskPath,
- pDiskSize,
- 4 << 10,
- pDiskChunkSize,
- pDiskGuid,
+ }
+ } else {
+ static TTempDir tempDir;
+ pDiskPath = tempDir() + "/pdisk0.dat";
+ }
+ nodeWardenConfig->ServiceSet.MutablePDisks(0)->SetPath(pDiskPath);
+ ui64 pDiskGuid = 1;
+ static ui64 iteration = 0;
+ ++iteration;
+ FormatPDisk(pDiskPath,
+ pDiskSize,
+ 4 << 10,
+ pDiskChunkSize,
+ pDiskGuid,
0x1234567890 + iteration,
0x4567890123 + iteration,
0x7890123456 + iteration,
NPDisk::YdbDefaultPDiskSequence,
- TString(""),
- false,
+ TString(""),
+ false,
false,
sectorMap);
- }
-
- NodeWardenConfigs[nodeIndex] = nodeWardenConfig;
-
+ }
+
+ NodeWardenConfigs[nodeIndex] = nodeWardenConfig;
+
SetupBSNodeWarden(runtime, nodeIndex, nodeWardenConfig);
SetupNodeWhiteboard(runtime, nodeIndex);
SetupTabletResolver(runtime, nodeIndex);
- }
-
+ }
+
runtime.Initialize(app.Unwrap());
-
- runtime.GetAppData().DynamicNameserviceConfig = new TDynamicNameserviceConfig;
- auto dnConfig = runtime.GetAppData().DynamicNameserviceConfig;
- dnConfig->MaxStaticNodeId = 1023;
+
+ runtime.GetAppData().DynamicNameserviceConfig = new TDynamicNameserviceConfig;
+ auto dnConfig = runtime.GetAppData().DynamicNameserviceConfig;
+ dnConfig->MaxStaticNodeId = 1023;
dnConfig->MaxDynamicNodeId = 1024 + (singleDomainMode ? (maxDynNodes - 1) : 32 * (maxDynNodes - 1));
runtime.GetAppData().FeatureFlags.SetEnableNodeBrokerSingleDomainMode(singleDomainMode);
-
- if (!runtime.IsRealThreads()) {
- TDispatchOptions options;
- options.FinalEvents.push_back(TDispatchOptions::TFinalEventCondition(TEvBlobStorage::EvLocalRecoveryDone,
- domainsNum * disksInDomain));
- runtime.DispatchEvents(options);
- }
-
+
+ if (!runtime.IsRealThreads()) {
+ TDispatchOptions options;
+ options.FinalEvents.push_back(TDispatchOptions::TFinalEventCondition(TEvBlobStorage::EvLocalRecoveryDone,
+ domainsNum * disksInDomain));
+ runtime.DispatchEvents(options);
+ }
+
auto aid = CreateTestBootstrapper(runtime, CreateTestTabletInfo(MakeNodeBrokerID(0), TTabletTypes::NODE_BROKER), &CreateNodeBroker);
- runtime.EnableScheduleForActor(aid, true);
-}
-
-void SetConfig(TTestActorRuntime& runtime,
+ runtime.EnableScheduleForActor(aid, true);
+}
+
+void SetConfig(TTestActorRuntime& runtime,
TActorId sender,
- const NKikimrNodeBroker::TConfig &config)
-{
- auto event = MakeHolder<TEvNodeBroker::TEvSetConfigRequest>();
- event->Record.MutableConfig()->CopyFrom(config);
- runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvNodeBroker::TEvSetConfigResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), TStatus::OK);
-}
-
-void SetEpochDuration(TTestActorRuntime& runtime,
+ const NKikimrNodeBroker::TConfig &config)
+{
+ auto event = MakeHolder<TEvNodeBroker::TEvSetConfigRequest>();
+ event->Record.MutableConfig()->CopyFrom(config);
+ runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvNodeBroker::TEvSetConfigResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), TStatus::OK);
+}
+
+void SetEpochDuration(TTestActorRuntime& runtime,
TActorId sender,
- TDuration lease)
-{
- NKikimrNodeBroker::TConfig config;
- config.SetEpochDuration(lease.GetValue());
- SetConfig(runtime, sender, config);
-}
-
-void SetBannedIds(TTestActorRuntime& runtime,
+ TDuration lease)
+{
+ NKikimrNodeBroker::TConfig config;
+ config.SetEpochDuration(lease.GetValue());
+ SetConfig(runtime, sender, config);
+}
+
+void SetBannedIds(TTestActorRuntime& runtime,
TActorId sender,
- const TVector<std::pair<ui32, ui32>> ids)
-{
- NKikimrNodeBroker::TConfig config;
- for (auto &pr : ids) {
- auto &entry = *config.AddBannedNodeIds();
- entry.SetFrom(pr.first);
- entry.SetTo(pr.second);
- }
- SetConfig(runtime, sender, config);
-}
-
-void Setup(TTestActorRuntime& runtime,
+ const TVector<std::pair<ui32, ui32>> ids)
+{
+ NKikimrNodeBroker::TConfig config;
+ for (auto &pr : ids) {
+ auto &entry = *config.AddBannedNodeIds();
+ entry.SetFrom(pr.first);
+ entry.SetTo(pr.second);
+ }
+ SetConfig(runtime, sender, config);
+}
+
+void Setup(TTestActorRuntime& runtime,
ui32 maxDynNodes = 3,
bool singleDomainMode = false)
-{
- using namespace NMalloc;
- TMallocInfo mallocInfo = MallocInfo();
- mallocInfo.SetParam("FillMemoryOnAllocation", "false");
-
+{
+ using namespace NMalloc;
+ TMallocInfo mallocInfo = MallocInfo();
+ mallocInfo.SetParam("FillMemoryOnAllocation", "false");
+
auto scheduledFilter = [](TTestActorRuntimeBase& runtime, TAutoPtr<IEventHandle>& event, TDuration delay, TInstant& deadline) {
- if (event->HasEvent()
- && (dynamic_cast<TDynamicNameserver::TEvPrivate::TEvUpdateEpoch*>(event->GetBase())))
- return false;
+ if (event->HasEvent()
+ && (dynamic_cast<TDynamicNameserver::TEvPrivate::TEvUpdateEpoch*>(event->GetBase())))
+ return false;
return TTestActorRuntime::DefaultScheduledFilterFunc(runtime, event, delay, deadline);
- };
- runtime.SetScheduledEventFilter(scheduledFilter);
-
- SetupLogging(runtime);
+ };
+ runtime.SetScheduledEventFilter(scheduledFilter);
+
+ SetupLogging(runtime);
SetupServices(runtime, maxDynNodes, singleDomainMode);
-}
-
-bool IsTabletActiveEvent(IEventHandle& ev)
-{
- if (ev.GetTypeRewrite() == NNodeWhiteboard::TEvWhiteboard::EvTabletStateUpdate) {
- if (ev.Get<NNodeWhiteboard::TEvWhiteboard::TEvTabletStateUpdate>()->Record.GetState()
- == NKikimrWhiteboard::TTabletStateInfo::Active) {
- return true;
- }
- }
- return false;
-}
-
-TAutoPtr<TEvNodeBroker::TEvRegistrationRequest>
-MakeRegistrationRequest(const TString &host,
- ui16 port,
- const TString &resolveHost,
- const TString &address,
- ui64 dc = 0,
- ui64 room = 0,
- ui64 rack = 0,
- ui64 body = 0,
- bool fixed = false)
-{
- TAutoPtr<TEvNodeBroker::TEvRegistrationRequest> event = new TEvNodeBroker::TEvRegistrationRequest;
- event->Record.SetHost(host);
- event->Record.SetPort(port);
- event->Record.SetResolveHost(resolveHost);
- event->Record.SetAddress(address);
- auto &loc = *event->Record.MutableLocation();
+}
+
+bool IsTabletActiveEvent(IEventHandle& ev)
+{
+ if (ev.GetTypeRewrite() == NNodeWhiteboard::TEvWhiteboard::EvTabletStateUpdate) {
+ if (ev.Get<NNodeWhiteboard::TEvWhiteboard::TEvTabletStateUpdate>()->Record.GetState()
+ == NKikimrWhiteboard::TTabletStateInfo::Active) {
+ return true;
+ }
+ }
+ return false;
+}
+
+TAutoPtr<TEvNodeBroker::TEvRegistrationRequest>
+MakeRegistrationRequest(const TString &host,
+ ui16 port,
+ const TString &resolveHost,
+ const TString &address,
+ ui64 dc = 0,
+ ui64 room = 0,
+ ui64 rack = 0,
+ ui64 body = 0,
+ bool fixed = false)
+{
+ TAutoPtr<TEvNodeBroker::TEvRegistrationRequest> event = new TEvNodeBroker::TEvRegistrationRequest;
+ event->Record.SetHost(host);
+ event->Record.SetPort(port);
+ event->Record.SetResolveHost(resolveHost);
+ event->Record.SetAddress(address);
+ auto &loc = *event->Record.MutableLocation();
loc.SetDataCenter(ToString(dc));
loc.SetModule(ToString(room));
loc.SetRack(ToString(rack));
loc.SetUnit(ToString(body));
- event->Record.SetFixedNodeId(fixed);
- return event;
-}
-
-void CheckRegistration(TTestActorRuntime &runtime,
+ event->Record.SetFixedNodeId(fixed);
+ return event;
+}
+
+void CheckRegistration(TTestActorRuntime &runtime,
TActorId sender,
- const TString &host,
- ui16 port,
- const TString &resolveHost,
- const TString &address,
- ui64 dc = 0,
- ui64 room = 0,
- ui64 rack = 0,
- ui64 body = 0,
- TStatus::ECode code = TStatus::OK,
- ui32 nodeId = 0,
- ui64 expire = 0,
- bool fixed = false)
-{
- auto event = MakeRegistrationRequest(host, port, resolveHost, address, dc, room, rack, body, fixed);
- runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvRegistrationResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
-
- if (code == TStatus::OK) {
- if (nodeId)
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetNodeId(), nodeId);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetHost(), host);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetPort(), port);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetResolveHost(), resolveHost);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetAddress(), address);
+ const TString &host,
+ ui16 port,
+ const TString &resolveHost,
+ const TString &address,
+ ui64 dc = 0,
+ ui64 room = 0,
+ ui64 rack = 0,
+ ui64 body = 0,
+ TStatus::ECode code = TStatus::OK,
+ ui32 nodeId = 0,
+ ui64 expire = 0,
+ bool fixed = false)
+{
+ auto event = MakeRegistrationRequest(host, port, resolveHost, address, dc, room, rack, body, fixed);
+ runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvRegistrationResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+
+ if (code == TStatus::OK) {
+ if (nodeId)
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetNodeId(), nodeId);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetHost(), host);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetPort(), port);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetResolveHost(), resolveHost);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetAddress(), address);
UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetLocation().GetDataCenter(), ToString(dc));
UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetLocation().GetModule(), ToString(room));
UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetLocation().GetRack(), ToString(rack));
UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetLocation().GetUnit(), ToString(body));
- if (expire)
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetExpire(), expire);
- }
-}
-
-NKikimrNodeBroker::TEpoch GetEpoch(TTestActorRuntime &runtime,
+ if (expire)
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetExpire(), expire);
+ }
+}
+
+NKikimrNodeBroker::TEpoch GetEpoch(TTestActorRuntime &runtime,
TActorId sender)
-{
- TAutoPtr<TEvNodeBroker::TEvListNodes> event = new TEvNodeBroker::TEvListNodes;
- runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvNodesInfo>(handle);
- return reply->GetRecord().GetEpoch();
-}
-
-NKikimrNodeBroker::TEpoch WaitForEpochUpdate(TTestActorRuntime &runtime,
+{
+ TAutoPtr<TEvNodeBroker::TEvListNodes> event = new TEvNodeBroker::TEvListNodes;
+ runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvNodesInfo>(handle);
+ return reply->GetRecord().GetEpoch();
+}
+
+NKikimrNodeBroker::TEpoch WaitForEpochUpdate(TTestActorRuntime &runtime,
TActorId sender)
-{
- auto epoch = GetEpoch(runtime, sender);
-
- if (runtime.GetCurrentTime() < TInstant::FromValue(epoch.GetEnd())) {
- runtime.UpdateCurrentTime(TInstant::FromValue(epoch.GetEnd() + 1));
-
- struct TIsEvUpdateEpoch {
- bool operator()(IEventHandle &ev) {
- if (ev.HasEvent()
- && (dynamic_cast<TNodeBroker::TEvPrivate::TEvUpdateEpoch*>(ev.GetBase())))
- return true;
- return false;
- }
- };
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TIsEvUpdateEpoch(), 1);
- runtime.DispatchEvents(options);
- }
-
- ui64 reqEpoch = epoch.GetId() + 1;
- while (epoch.GetId() != reqEpoch) {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(NKikimr::TEvents::TEvFlushLog::EventType, 1);
- runtime.DispatchEvents(options, TDuration::MilliSeconds(100));
- epoch = GetEpoch(runtime, sender);
- }
-
- return epoch;
-}
-
-void CheckNodesListResponse(const NKikimrNodeBroker::TNodesInfo &rec,
- TSet<ui64> ids,
- TSet<ui64> expiredIds)
-{
- UNIT_ASSERT_VALUES_EQUAL(rec.NodesSize(), ids.size());
- for (auto &node : rec.GetNodes()) {
+{
+ auto epoch = GetEpoch(runtime, sender);
+
+ if (runtime.GetCurrentTime() < TInstant::FromValue(epoch.GetEnd())) {
+ runtime.UpdateCurrentTime(TInstant::FromValue(epoch.GetEnd() + 1));
+
+ struct TIsEvUpdateEpoch {
+ bool operator()(IEventHandle &ev) {
+ if (ev.HasEvent()
+ && (dynamic_cast<TNodeBroker::TEvPrivate::TEvUpdateEpoch*>(ev.GetBase())))
+ return true;
+ return false;
+ }
+ };
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TIsEvUpdateEpoch(), 1);
+ runtime.DispatchEvents(options);
+ }
+
+ ui64 reqEpoch = epoch.GetId() + 1;
+ while (epoch.GetId() != reqEpoch) {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(NKikimr::TEvents::TEvFlushLog::EventType, 1);
+ runtime.DispatchEvents(options, TDuration::MilliSeconds(100));
+ epoch = GetEpoch(runtime, sender);
+ }
+
+ return epoch;
+}
+
+void CheckNodesListResponse(const NKikimrNodeBroker::TNodesInfo &rec,
+ TSet<ui64> ids,
+ TSet<ui64> expiredIds)
+{
+ UNIT_ASSERT_VALUES_EQUAL(rec.NodesSize(), ids.size());
+ for (auto &node : rec.GetNodes()) {
UNIT_ASSERT(ids.contains(node.GetNodeId()));
- ids.erase(node.GetNodeId());
- }
- UNIT_ASSERT_VALUES_EQUAL(rec.ExpiredNodesSize(), expiredIds.size());
- for (auto &node : rec.GetExpiredNodes()) {
+ ids.erase(node.GetNodeId());
+ }
+ UNIT_ASSERT_VALUES_EQUAL(rec.ExpiredNodesSize(), expiredIds.size());
+ for (auto &node : rec.GetExpiredNodes()) {
UNIT_ASSERT(expiredIds.contains(node.GetNodeId()));
- expiredIds.erase(node.GetNodeId());
- }
-}
-
-NKikimrNodeBroker::TEpoch CheckFilteredNodesList(TTestActorRuntime &runtime,
+ expiredIds.erase(node.GetNodeId());
+ }
+}
+
+NKikimrNodeBroker::TEpoch CheckFilteredNodesList(TTestActorRuntime &runtime,
TActorId sender,
- TSet<ui64> ids,
- TSet<ui64> expiredIds,
- ui64 minEpoch,
- ui64 cachedVersion = 0)
-{
- UNIT_ASSERT(!minEpoch || !cachedVersion);
- UNIT_ASSERT(minEpoch || cachedVersion);
-
- auto epoch = GetEpoch(runtime, sender);
-
- TAutoPtr<IEventHandle> handle;
- TAutoPtr<TEvNodeBroker::TEvListNodes> event = new TEvNodeBroker::TEvListNodes;
- if (minEpoch)
- event->Record.SetMinEpoch(minEpoch);
- if (cachedVersion)
- event->Record.SetCachedVersion(cachedVersion);
- runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- if (minEpoch) {
- while (minEpoch > epoch.GetId()) {
- auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvNodesInfo>(handle, TDuration::Seconds(1));
- UNIT_ASSERT(!reply);
-
- if (minEpoch > epoch.GetId() + 1) {
- WaitForEpochUpdate(runtime, sender);
- epoch = GetEpoch(runtime, sender);
- } else {
- runtime.UpdateCurrentTime(TInstant::FromValue(epoch.GetEnd() + 1));
- break;
- }
- }
- }
-
- auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvNodesInfo>(handle, TDuration::Seconds(1));
- UNIT_ASSERT(reply);
- const auto &rec = reply->GetRecord();
- CheckNodesListResponse(rec, ids, expiredIds);
-
- return rec.GetEpoch();
-}
-
-NKikimrNodeBroker::TEpoch CheckNodesList(TTestActorRuntime &runtime,
+ TSet<ui64> ids,
+ TSet<ui64> expiredIds,
+ ui64 minEpoch,
+ ui64 cachedVersion = 0)
+{
+ UNIT_ASSERT(!minEpoch || !cachedVersion);
+ UNIT_ASSERT(minEpoch || cachedVersion);
+
+ auto epoch = GetEpoch(runtime, sender);
+
+ TAutoPtr<IEventHandle> handle;
+ TAutoPtr<TEvNodeBroker::TEvListNodes> event = new TEvNodeBroker::TEvListNodes;
+ if (minEpoch)
+ event->Record.SetMinEpoch(minEpoch);
+ if (cachedVersion)
+ event->Record.SetCachedVersion(cachedVersion);
+ runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ if (minEpoch) {
+ while (minEpoch > epoch.GetId()) {
+ auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvNodesInfo>(handle, TDuration::Seconds(1));
+ UNIT_ASSERT(!reply);
+
+ if (minEpoch > epoch.GetId() + 1) {
+ WaitForEpochUpdate(runtime, sender);
+ epoch = GetEpoch(runtime, sender);
+ } else {
+ runtime.UpdateCurrentTime(TInstant::FromValue(epoch.GetEnd() + 1));
+ break;
+ }
+ }
+ }
+
+ auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvNodesInfo>(handle, TDuration::Seconds(1));
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->GetRecord();
+ CheckNodesListResponse(rec, ids, expiredIds);
+
+ return rec.GetEpoch();
+}
+
+NKikimrNodeBroker::TEpoch CheckNodesList(TTestActorRuntime &runtime,
TActorId sender,
- TSet<ui64> ids,
- TSet<ui64> expiredIds,
- ui64 epoch)
-{
- TAutoPtr<TEvNodeBroker::TEvListNodes> event = new TEvNodeBroker::TEvListNodes;
- runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvNodesInfo>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->GetRecord();
- CheckNodesListResponse(rec, ids, expiredIds);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetEpoch().GetId(), epoch);
-
- return rec.GetEpoch();
-}
-
-void CheckNodeInfo(TTestActorRuntime &runtime,
+ TSet<ui64> ids,
+ TSet<ui64> expiredIds,
+ ui64 epoch)
+{
+ TAutoPtr<TEvNodeBroker::TEvListNodes> event = new TEvNodeBroker::TEvListNodes;
+ runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvNodesInfo>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->GetRecord();
+ CheckNodesListResponse(rec, ids, expiredIds);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetEpoch().GetId(), epoch);
+
+ return rec.GetEpoch();
+}
+
+void CheckNodeInfo(TTestActorRuntime &runtime,
TActorId sender,
- ui32 nodeId,
- TStatus::ECode code)
-{
- TAutoPtr<TEvNodeBroker::TEvResolveNode> event = new TEvNodeBroker::TEvResolveNode;
- event->Record.SetNodeId(nodeId);
- runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvResolvedNode>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
-}
-
-void CheckNodeInfo(TTestActorRuntime &runtime,
+ ui32 nodeId,
+ TStatus::ECode code)
+{
+ TAutoPtr<TEvNodeBroker::TEvResolveNode> event = new TEvNodeBroker::TEvResolveNode;
+ event->Record.SetNodeId(nodeId);
+ runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvResolvedNode>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+}
+
+void CheckNodeInfo(TTestActorRuntime &runtime,
TActorId sender,
- ui32 nodeId,
- const TString &host,
- ui16 port,
- const TString &resolveHost,
- const TString &address,
- ui64 dc = 0,
- ui64 room = 0,
- ui64 rack = 0,
- ui64 body = 0,
- ui64 expire = 0)
-{
- TAutoPtr<TEvNodeBroker::TEvResolveNode> event = new TEvNodeBroker::TEvResolveNode;
- event->Record.SetNodeId(nodeId);
- runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvResolvedNode>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), TStatus::OK);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetNodeId(), nodeId);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetHost(), host);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetPort(), port);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetResolveHost(), resolveHost);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetAddress(), address);
+ ui32 nodeId,
+ const TString &host,
+ ui16 port,
+ const TString &resolveHost,
+ const TString &address,
+ ui64 dc = 0,
+ ui64 room = 0,
+ ui64 rack = 0,
+ ui64 body = 0,
+ ui64 expire = 0)
+{
+ TAutoPtr<TEvNodeBroker::TEvResolveNode> event = new TEvNodeBroker::TEvResolveNode;
+ event->Record.SetNodeId(nodeId);
+ runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvResolvedNode>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), TStatus::OK);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetNodeId(), nodeId);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetHost(), host);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetPort(), port);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetResolveHost(), resolveHost);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetAddress(), address);
UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetLocation().GetDataCenter(), ToString(dc));
UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetLocation().GetModule(), ToString(room));
UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetLocation().GetRack(), ToString(rack));
UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetLocation().GetUnit(), ToString(body));
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetExpire(), expire);
-}
-
-void CheckLeaseExtension(TTestActorRuntime &runtime,
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNode().GetExpire(), expire);
+}
+
+void CheckLeaseExtension(TTestActorRuntime &runtime,
TActorId sender,
- ui32 nodeId,
- TStatus::ECode code,
- const NKikimrNodeBroker::TEpoch &epoch = {},
- bool fixed = false)
-{
- TAutoPtr<TEvNodeBroker::TEvExtendLeaseRequest> event = new TEvNodeBroker::TEvExtendLeaseRequest;
- event->Record.SetNodeId(nodeId);
- runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvExtendLeaseResponse>(handle);
- UNIT_ASSERT(reply);
- const auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
- if (code == TStatus::OK) {
- UNIT_ASSERT_VALUES_EQUAL(rec.GetNodeId(), nodeId);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetEpoch().DebugString(), epoch.DebugString());
- if (fixed)
- UNIT_ASSERT_VALUES_EQUAL(rec.GetExpire(), Max<ui64>());
- else
- UNIT_ASSERT_VALUES_EQUAL(rec.GetExpire(), epoch.GetNextEnd());
- }
-}
-
-TString AddrToString(const struct sockaddr *sa)
-{
- char str[INET6_ADDRSTRLEN];
- switch(sa->sa_family) {
- case AF_INET:
- inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr), str, INET6_ADDRSTRLEN);
- break;
- case AF_INET6:
- inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr), str, INET6_ADDRSTRLEN);
- break;
- default:
- return "unknown";
- }
- return str;
-}
-
-void CheckResolveNode(TTestActorRuntime &runtime,
+ ui32 nodeId,
+ TStatus::ECode code,
+ const NKikimrNodeBroker::TEpoch &epoch = {},
+ bool fixed = false)
+{
+ TAutoPtr<TEvNodeBroker::TEvExtendLeaseRequest> event = new TEvNodeBroker::TEvExtendLeaseRequest;
+ event->Record.SetNodeId(nodeId);
+ runtime.SendToPipe(MakeNodeBrokerID(0), sender, event.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvNodeBroker::TEvExtendLeaseResponse>(handle);
+ UNIT_ASSERT(reply);
+ const auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus().GetCode(), code);
+ if (code == TStatus::OK) {
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetNodeId(), nodeId);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetEpoch().DebugString(), epoch.DebugString());
+ if (fixed)
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetExpire(), Max<ui64>());
+ else
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetExpire(), epoch.GetNextEnd());
+ }
+}
+
+TString AddrToString(const struct sockaddr *sa)
+{
+ char str[INET6_ADDRSTRLEN];
+ switch(sa->sa_family) {
+ case AF_INET:
+ inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr), str, INET6_ADDRSTRLEN);
+ break;
+ case AF_INET6:
+ inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr), str, INET6_ADDRSTRLEN);
+ break;
+ default:
+ return "unknown";
+ }
+ return str;
+}
+
+void CheckResolveNode(TTestActorRuntime &runtime,
TActorId sender,
- ui32 nodeId,
- const TString &addr)
-{
- TAutoPtr<TEvInterconnect::TEvResolveNode> event = new TEvInterconnect::TEvResolveNode(nodeId);
+ ui32 nodeId,
+ const TString &addr)
+{
+ TAutoPtr<TEvInterconnect::TEvResolveNode> event = new TEvInterconnect::TEvResolveNode(nodeId);
runtime.Send(new IEventHandle(GetNameserviceActorId(), sender, event.Release()));
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvLocalNodeInfo>(handle);
- UNIT_ASSERT(reply);
-
- UNIT_ASSERT_VALUES_EQUAL(reply->NodeId, nodeId);
- UNIT_ASSERT_VALUES_EQUAL(AddrToString(reply->Address->Addr()), addr);
-}
-
-void CheckResolveUnknownNode(TTestActorRuntime &runtime,
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvLocalNodeInfo>(handle);
+ UNIT_ASSERT(reply);
+
+ UNIT_ASSERT_VALUES_EQUAL(reply->NodeId, nodeId);
+ UNIT_ASSERT_VALUES_EQUAL(AddrToString(reply->Address->Addr()), addr);
+}
+
+void CheckResolveUnknownNode(TTestActorRuntime &runtime,
TActorId sender,
- ui32 nodeId)
-{
- TAutoPtr<TEvInterconnect::TEvResolveNode> event = new TEvInterconnect::TEvResolveNode(nodeId);
+ ui32 nodeId)
+{
+ TAutoPtr<TEvInterconnect::TEvResolveNode> event = new TEvInterconnect::TEvResolveNode(nodeId);
runtime.Send(new IEventHandle(GetNameserviceActorId(), sender, event.Release()));
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvLocalNodeInfo>(handle);
- UNIT_ASSERT(reply);
-
- UNIT_ASSERT_VALUES_EQUAL(reply->NodeId, nodeId);
- UNIT_ASSERT(!reply->Address);
-}
-
-void GetNameserverNodesList(TTestActorRuntime &runtime,
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvLocalNodeInfo>(handle);
+ UNIT_ASSERT(reply);
+
+ UNIT_ASSERT_VALUES_EQUAL(reply->NodeId, nodeId);
+ UNIT_ASSERT(!reply->Address);
+}
+
+void GetNameserverNodesList(TTestActorRuntime &runtime,
TActorId sender,
- THashMap<ui32, TEvInterconnect::TNodeInfo> &nodes,
- bool includeStatic)
-{
- ui32 maxStaticNodeId = runtime.GetAppData().DynamicNameserviceConfig->MaxStaticNodeId;
- TAutoPtr<TEvInterconnect::TEvListNodes> event = new TEvInterconnect::TEvListNodes;
+ THashMap<ui32, TEvInterconnect::TNodeInfo> &nodes,
+ bool includeStatic)
+{
+ ui32 maxStaticNodeId = runtime.GetAppData().DynamicNameserviceConfig->MaxStaticNodeId;
+ TAutoPtr<TEvInterconnect::TEvListNodes> event = new TEvInterconnect::TEvListNodes;
runtime.Send(new IEventHandle(GetNameserviceActorId(), sender, event.Release()));
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvInterconnect::TEvNodesInfo>(handle);
- UNIT_ASSERT(reply);
-
- for (auto &node : reply->Nodes)
- if (includeStatic || node.NodeId > maxStaticNodeId)
- nodes.emplace(node.NodeId, node);
-}
-
-void CheckNameserverNodesList(TTestActorRuntime &runtime,
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvInterconnect::TEvNodesInfo>(handle);
+ UNIT_ASSERT(reply);
+
+ for (auto &node : reply->Nodes)
+ if (includeStatic || node.NodeId > maxStaticNodeId)
+ nodes.emplace(node.NodeId, node);
+}
+
+void CheckNameserverNodesList(TTestActorRuntime &runtime,
TActorId sender,
- size_t count)
-{
+ size_t count)
+{
THashMap<ui32, TEvInterconnect::TNodeInfo> nodes;
- GetNameserverNodesList(runtime, sender, nodes, true);
- UNIT_ASSERT_VALUES_EQUAL(nodes.size(), count);
-}
-
-TEvInterconnect::TNodeInfo MakeICNodeInfo(ui32 nodeId,
- const TString &host,
- ui16 port,
- const TString &resolveHost,
- const TString &address,
- ui64 dc,
- ui64 room,
- ui64 rack,
- ui64 body)
-{
+ GetNameserverNodesList(runtime, sender, nodes, true);
+ UNIT_ASSERT_VALUES_EQUAL(nodes.size(), count);
+}
+
+TEvInterconnect::TNodeInfo MakeICNodeInfo(ui32 nodeId,
+ const TString &host,
+ ui16 port,
+ const TString &resolveHost,
+ const TString &address,
+ ui64 dc,
+ ui64 room,
+ ui64 rack,
+ ui64 body)
+{
NActorsInterconnect::TNodeLocation location;
location.SetDataCenter(ToString(dc));
location.SetModule(ToString(room));
location.SetRack(ToString(rack));
location.SetUnit(ToString(body));
return TEvInterconnect::TNodeInfo(nodeId, address, host, resolveHost, port, TNodeLocation(location));
-}
-
-void CheckNameserverDynamicNodesList(const THashMap<ui32, TEvInterconnect::TNodeInfo> &nodes,
- const TEvInterconnect::TNodeInfo &node)
-{
- auto it = nodes.find(node.NodeId);
- UNIT_ASSERT(it != nodes.end());
- UNIT_ASSERT_VALUES_EQUAL(it->second.Address, node.Address);
- UNIT_ASSERT_VALUES_EQUAL(it->second.Host, node.Host);
- UNIT_ASSERT_VALUES_EQUAL(it->second.ResolveHost, node.ResolveHost);
- UNIT_ASSERT_VALUES_EQUAL(it->second.Port, node.Port);
- UNIT_ASSERT_EQUAL(it->second.Location, node.Location);
-}
-
-template<typename... Ts>
-void CheckNameserverDynamicNodesList(const THashMap<ui32, TEvInterconnect::TNodeInfo> &nodes,
- const TEvInterconnect::TNodeInfo &node,
- Ts... args)
-{
- CheckNameserverDynamicNodesList(nodes, node);
- CheckNameserverDynamicNodesList(nodes, args...);
-}
-
-template<typename... Ts>
-void CheckNameserverDynamicNodesList(TTestActorRuntime &runtime,
+}
+
+void CheckNameserverDynamicNodesList(const THashMap<ui32, TEvInterconnect::TNodeInfo> &nodes,
+ const TEvInterconnect::TNodeInfo &node)
+{
+ auto it = nodes.find(node.NodeId);
+ UNIT_ASSERT(it != nodes.end());
+ UNIT_ASSERT_VALUES_EQUAL(it->second.Address, node.Address);
+ UNIT_ASSERT_VALUES_EQUAL(it->second.Host, node.Host);
+ UNIT_ASSERT_VALUES_EQUAL(it->second.ResolveHost, node.ResolveHost);
+ UNIT_ASSERT_VALUES_EQUAL(it->second.Port, node.Port);
+ UNIT_ASSERT_EQUAL(it->second.Location, node.Location);
+}
+
+template<typename... Ts>
+void CheckNameserverDynamicNodesList(const THashMap<ui32, TEvInterconnect::TNodeInfo> &nodes,
+ const TEvInterconnect::TNodeInfo &node,
+ Ts... args)
+{
+ CheckNameserverDynamicNodesList(nodes, node);
+ CheckNameserverDynamicNodesList(nodes, args...);
+}
+
+template<typename... Ts>
+void CheckNameserverDynamicNodesList(TTestActorRuntime &runtime,
TActorId sender,
- size_t count,
- Ts... args)
-{
+ size_t count,
+ Ts... args)
+{
THashMap<ui32, TEvInterconnect::TNodeInfo> nodes;
- GetNameserverNodesList(runtime, sender, nodes, false);
- UNIT_ASSERT_VALUES_EQUAL(nodes.size(), count);
- CheckNameserverDynamicNodesList(nodes, args...);
-}
-
-void CheckGetNode(TTestActorRuntime &runtime,
+ GetNameserverNodesList(runtime, sender, nodes, false);
+ UNIT_ASSERT_VALUES_EQUAL(nodes.size(), count);
+ CheckNameserverDynamicNodesList(nodes, args...);
+}
+
+void CheckGetNode(TTestActorRuntime &runtime,
TActorId sender,
- ui32 nodeId,
- bool exists)
-{
- TAutoPtr<TEvInterconnect::TEvGetNode> event = new TEvInterconnect::TEvGetNode(nodeId);
+ ui32 nodeId,
+ bool exists)
+{
+ TAutoPtr<TEvInterconnect::TEvGetNode> event = new TEvInterconnect::TEvGetNode(nodeId);
runtime.Send(new IEventHandle(GetNameserviceActorId(), sender, event.Release()));
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvInterconnect::TEvNodeInfo>(handle);
- UNIT_ASSERT(reply);
-
- UNIT_ASSERT_VALUES_EQUAL((bool)reply->Node, exists);
-}
-
-void RestartNodeBroker(TTestActorRuntime &runtime)
-{
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- runtime.Register(CreateTabletKiller(MakeNodeBrokerID(0)));
- runtime.DispatchEvents(options);
-}
-
-} // anonymous namespace
-
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvInterconnect::TEvNodeInfo>(handle);
+ UNIT_ASSERT(reply);
+
+ UNIT_ASSERT_VALUES_EQUAL((bool)reply->Node, exists);
+}
+
+void RestartNodeBroker(TTestActorRuntime &runtime)
+{
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ runtime.Register(CreateTabletKiller(MakeNodeBrokerID(0)));
+ runtime.DispatchEvents(options);
+}
+
+} // anonymous namespace
+
Y_UNIT_TEST_SUITE(TNodeBrokerTest) {
Y_UNIT_TEST(BasicFunctionality)
- {
+ {
TTestBasicRuntime runtime(8, false);
Setup(runtime, 4);
TActorId sender = runtime.AllocateEdgeActor();
-
- // There should be no dynamic nodes initially.
- auto epoch = GetEpoch(runtime, sender);
- // Register node 1024.
- CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 4, TStatus::OK, 1024, epoch.GetNextEnd());
- // Check node 1024 exists.
- CheckNodeInfo(runtime, sender, 1024, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 4, epoch.GetNextEnd());
- // Nodes list now has 1 node.
- CheckNodesList(runtime, sender, {1024}, {}, 1);
- // There is no node 1025.
- CheckNodeInfo(runtime, sender, 1025, TStatus::WRONG_REQUEST);
- // Register node 1056.
- CheckRegistration(runtime, sender, "host2", 1001, "host2.yandex.net", "1.2.3.5",
- 1, 2, 3, 5, TStatus::OK, 1056, epoch.GetNextEnd());
-
- // Wait until epoch expiration.
- WaitForEpochUpdate(runtime, sender);
- epoch = CheckNodesList(runtime, sender, {1024, 1056}, {}, 2);
-
- // Extend lease for node 1024.
- CheckLeaseExtension(runtime, sender, 1024, TStatus::OK, epoch);
-
- // Kill tablet, wait for node 1056 expiration and check state is restored correctly.
- runtime.UpdateCurrentTime(TInstant::FromValue(epoch.GetEnd() + 1));
-
- RestartNodeBroker(runtime);
-
- epoch = CheckNodesList(runtime, sender, {1024}, {1056}, 3);
- CheckNodeInfo(runtime, sender, 1024, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 4, epoch.GetEnd());
- CheckNodeInfo(runtime, sender, 1056, TStatus::WRONG_REQUEST);
-
- // Register node 1088.
- CheckRegistration(runtime, sender, "host3", 1001, "host3.yandex.net", "1.2.3.6",
- 1, 2, 3, 6, TStatus::OK, 1088, epoch.GetNextEnd());
- // Register node with existing lease, this should extend lease to the next epoch.
- CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 4, TStatus::OK, 1024, epoch.GetNextEnd());
- // Registration of existing node with different location.
- CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 5, TStatus::WRONG_REQUEST, 1024);
+
+ // There should be no dynamic nodes initially.
+ auto epoch = GetEpoch(runtime, sender);
+ // Register node 1024.
+ CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 4, TStatus::OK, 1024, epoch.GetNextEnd());
+ // Check node 1024 exists.
+ CheckNodeInfo(runtime, sender, 1024, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 4, epoch.GetNextEnd());
+ // Nodes list now has 1 node.
+ CheckNodesList(runtime, sender, {1024}, {}, 1);
+ // There is no node 1025.
+ CheckNodeInfo(runtime, sender, 1025, TStatus::WRONG_REQUEST);
+ // Register node 1056.
+ CheckRegistration(runtime, sender, "host2", 1001, "host2.yandex.net", "1.2.3.5",
+ 1, 2, 3, 5, TStatus::OK, 1056, epoch.GetNextEnd());
+
+ // Wait until epoch expiration.
+ WaitForEpochUpdate(runtime, sender);
+ epoch = CheckNodesList(runtime, sender, {1024, 1056}, {}, 2);
+
+ // Extend lease for node 1024.
+ CheckLeaseExtension(runtime, sender, 1024, TStatus::OK, epoch);
+
+ // Kill tablet, wait for node 1056 expiration and check state is restored correctly.
+ runtime.UpdateCurrentTime(TInstant::FromValue(epoch.GetEnd() + 1));
+
+ RestartNodeBroker(runtime);
+
+ epoch = CheckNodesList(runtime, sender, {1024}, {1056}, 3);
+ CheckNodeInfo(runtime, sender, 1024, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 4, epoch.GetEnd());
+ CheckNodeInfo(runtime, sender, 1056, TStatus::WRONG_REQUEST);
+
+ // Register node 1088.
+ CheckRegistration(runtime, sender, "host3", 1001, "host3.yandex.net", "1.2.3.6",
+ 1, 2, 3, 6, TStatus::OK, 1088, epoch.GetNextEnd());
+ // Register node with existing lease, this should extend lease to the next epoch.
+ CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 4, TStatus::OK, 1024, epoch.GetNextEnd());
+ // Registration of existing node with different location.
+ CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 5, TStatus::WRONG_REQUEST, 1024);
// Registration of existing node with different address, expect new node id.
- CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.14",
+ CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.14",
1, 2, 3, 4, TStatus::OK, 1120, epoch.GetNextEnd());
- // There should be no more free IDs.
- CheckRegistration(runtime, sender, "host4", 1001, "host4.yandex.net", "1.2.3.7",
- 1, 2, 3, 7, TStatus::ERROR_TEMP);
-
- // Extend lease for expired node.
- CheckLeaseExtension(runtime, sender, 1056, TStatus::WRONG_REQUEST);
- // Extend lease for unknown node.
- CheckLeaseExtension(runtime, sender, 1025, TStatus::WRONG_REQUEST);
-
- epoch = WaitForEpochUpdate(runtime, sender);
+ // There should be no more free IDs.
+ CheckRegistration(runtime, sender, "host4", 1001, "host4.yandex.net", "1.2.3.7",
+ 1, 2, 3, 7, TStatus::ERROR_TEMP);
+
+ // Extend lease for expired node.
+ CheckLeaseExtension(runtime, sender, 1056, TStatus::WRONG_REQUEST);
+ // Extend lease for unknown node.
+ CheckLeaseExtension(runtime, sender, 1025, TStatus::WRONG_REQUEST);
+
+ epoch = WaitForEpochUpdate(runtime, sender);
CheckNodesList(runtime, sender, {1024, 1088, 1120}, {}, 4);
-
- // Register node and re-use 1056 node ID.
- CheckRegistration(runtime, sender, "host4", 1001, "host4.yandex.net", "1.2.3.7",
- 1, 2, 3, 7, TStatus::OK, 1056, epoch.GetNextEnd());
- epoch.SetVersion(epoch.GetVersion() + 1);
- CheckLeaseExtension(runtime, sender, 1024, TStatus::OK, epoch);
-
- WaitForEpochUpdate(runtime, sender);
+
+ // Register node and re-use 1056 node ID.
+ CheckRegistration(runtime, sender, "host4", 1001, "host4.yandex.net", "1.2.3.7",
+ 1, 2, 3, 7, TStatus::OK, 1056, epoch.GetNextEnd());
+ epoch.SetVersion(epoch.GetVersion() + 1);
+ CheckLeaseExtension(runtime, sender, 1024, TStatus::OK, epoch);
+
+ WaitForEpochUpdate(runtime, sender);
CheckNodesList(runtime, sender, {1024, 1056}, {1088, 1120}, 5);
-
- WaitForEpochUpdate(runtime, sender);
- CheckNodesList(runtime, sender, {}, {1024, 1056}, 6);
- }
-
- Y_UNIT_TEST(FixedNodeId)
- {
- TTestBasicRuntime runtime(8, false);
- Setup(runtime);
+
+ WaitForEpochUpdate(runtime, sender);
+ CheckNodesList(runtime, sender, {}, {1024, 1056}, 6);
+ }
+
+ Y_UNIT_TEST(FixedNodeId)
+ {
+ TTestBasicRuntime runtime(8, false);
+ Setup(runtime);
TActorId sender = runtime.AllocateEdgeActor();
-
- auto epoch = GetEpoch(runtime, sender);
- // Register node 1024 with fixed ID.
- CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 4, TStatus::OK, 1024, Max<ui64>(), true);
- epoch.SetVersion(epoch.GetVersion() + 1);
- // Check node 1024 exists and has infinite lease.
- CheckNodeInfo(runtime, sender, 1024, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 4, Max<ui64>());
- // Lease extension should work fine and report infinite lease.
- CheckLeaseExtension(runtime, sender, 1024, TStatus::OK, epoch, true);
- // Register node 1024 without fixed ID option. This shouldn't unfix ID.
- CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 4, TStatus::OK, 1024, Max<ui64>(), false);
- // Check node still has infinite lease.
- CheckNodeInfo(runtime, sender, 1024, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 4, Max<ui64>());
-
- // Register node 1056.
- CheckRegistration(runtime, sender, "host2", 1001, "host2.yandex.net", "1.2.3.5",
- 1, 2, 3, 5, TStatus::OK, 1056, epoch.GetNextEnd(), false);
- epoch.SetVersion(epoch.GetVersion() + 1);
- // Now register it again but with fixed ID.
- CheckRegistration(runtime, sender, "host2", 1001, "host2.yandex.net", "1.2.3.5",
- 1, 2, 3, 5, TStatus::OK, 1056, Max<ui64>(), true);
- // Check node 1056 has infinite lease and ping doesn't affect it.
- CheckNodeInfo(runtime, sender, 1056, "host2", 1001, "host2.yandex.net", "1.2.3.5",
- 1, 2, 3, 5, Max<ui64>());
- CheckLeaseExtension(runtime, sender, 1056, TStatus::OK, epoch, true);
- CheckNodeInfo(runtime, sender, 1056, "host2", 1001, "host2.yandex.net", "1.2.3.5",
- 1, 2, 3, 5, Max<ui64>());
- // Check tegular registration doesn't affect infinite lease.
- CheckRegistration(runtime, sender, "host2", 1001, "host2.yandex.net", "1.2.3.5",
- 1, 2, 3, 5, TStatus::OK, 1056, Max<ui64>(), false);
- CheckLeaseExtension(runtime, sender, 1056, TStatus::OK, epoch, true);
- }
-
- Y_UNIT_TEST(TestListNodes)
- {
- TTestBasicRuntime runtime(8, false);
- Setup(runtime, 10);
+
+ auto epoch = GetEpoch(runtime, sender);
+ // Register node 1024 with fixed ID.
+ CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 4, TStatus::OK, 1024, Max<ui64>(), true);
+ epoch.SetVersion(epoch.GetVersion() + 1);
+ // Check node 1024 exists and has infinite lease.
+ CheckNodeInfo(runtime, sender, 1024, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 4, Max<ui64>());
+ // Lease extension should work fine and report infinite lease.
+ CheckLeaseExtension(runtime, sender, 1024, TStatus::OK, epoch, true);
+ // Register node 1024 without fixed ID option. This shouldn't unfix ID.
+ CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 4, TStatus::OK, 1024, Max<ui64>(), false);
+ // Check node still has infinite lease.
+ CheckNodeInfo(runtime, sender, 1024, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 4, Max<ui64>());
+
+ // Register node 1056.
+ CheckRegistration(runtime, sender, "host2", 1001, "host2.yandex.net", "1.2.3.5",
+ 1, 2, 3, 5, TStatus::OK, 1056, epoch.GetNextEnd(), false);
+ epoch.SetVersion(epoch.GetVersion() + 1);
+ // Now register it again but with fixed ID.
+ CheckRegistration(runtime, sender, "host2", 1001, "host2.yandex.net", "1.2.3.5",
+ 1, 2, 3, 5, TStatus::OK, 1056, Max<ui64>(), true);
+ // Check node 1056 has infinite lease and ping doesn't affect it.
+ CheckNodeInfo(runtime, sender, 1056, "host2", 1001, "host2.yandex.net", "1.2.3.5",
+ 1, 2, 3, 5, Max<ui64>());
+ CheckLeaseExtension(runtime, sender, 1056, TStatus::OK, epoch, true);
+ CheckNodeInfo(runtime, sender, 1056, "host2", 1001, "host2.yandex.net", "1.2.3.5",
+ 1, 2, 3, 5, Max<ui64>());
+ // Check tegular registration doesn't affect infinite lease.
+ CheckRegistration(runtime, sender, "host2", 1001, "host2.yandex.net", "1.2.3.5",
+ 1, 2, 3, 5, TStatus::OK, 1056, Max<ui64>(), false);
+ CheckLeaseExtension(runtime, sender, 1056, TStatus::OK, epoch, true);
+ }
+
+ Y_UNIT_TEST(TestListNodes)
+ {
+ TTestBasicRuntime runtime(8, false);
+ Setup(runtime, 10);
TActorId sender = runtime.AllocateEdgeActor();
-
- WaitForEpochUpdate(runtime, sender);
- WaitForEpochUpdate(runtime, sender);
- auto epoch = GetEpoch(runtime, sender);
- // Register node 1024.
- CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 4, TStatus::OK, 1024, epoch.GetNextEnd());
- epoch = CheckFilteredNodesList(runtime, sender, {1024}, {}, epoch.GetId(), 0);
- CheckFilteredNodesList(runtime, sender, {}, {}, 0, epoch.GetVersion());
- CheckFilteredNodesList(runtime, sender, {1024}, {}, 0, epoch.GetVersion() - 1);
- CheckFilteredNodesList(runtime, sender, {1024}, {}, 0, epoch.GetVersion() + 1);
- auto epoch1 = CheckFilteredNodesList(runtime, sender, {1024}, {}, epoch.GetId() - 1, 0);
- UNIT_ASSERT_VALUES_EQUAL(epoch1.GetId(), epoch.GetId());
- epoch1 = CheckFilteredNodesList(runtime, sender, {1024}, {}, epoch.GetId() + 1, 0);
- UNIT_ASSERT_VALUES_EQUAL(epoch1.GetId(), epoch.GetId() + 1);
- epoch1 = CheckFilteredNodesList(runtime, sender, {}, {1024}, epoch.GetId() + 2, 0);
- UNIT_ASSERT_VALUES_EQUAL(epoch1.GetId(), epoch.GetId() + 2);
- epoch1 = CheckFilteredNodesList(runtime, sender, {}, {}, epoch.GetId() + 5, 0);
- UNIT_ASSERT_VALUES_EQUAL(epoch1.GetId(), epoch.GetId() + 5);
- }
-
- Y_UNIT_TEST(TestRandomActions)
- {
- TTestBasicRuntime runtime(8, false);
- Setup(runtime, 10);
+
+ WaitForEpochUpdate(runtime, sender);
+ WaitForEpochUpdate(runtime, sender);
+ auto epoch = GetEpoch(runtime, sender);
+ // Register node 1024.
+ CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 4, TStatus::OK, 1024, epoch.GetNextEnd());
+ epoch = CheckFilteredNodesList(runtime, sender, {1024}, {}, epoch.GetId(), 0);
+ CheckFilteredNodesList(runtime, sender, {}, {}, 0, epoch.GetVersion());
+ CheckFilteredNodesList(runtime, sender, {1024}, {}, 0, epoch.GetVersion() - 1);
+ CheckFilteredNodesList(runtime, sender, {1024}, {}, 0, epoch.GetVersion() + 1);
+ auto epoch1 = CheckFilteredNodesList(runtime, sender, {1024}, {}, epoch.GetId() - 1, 0);
+ UNIT_ASSERT_VALUES_EQUAL(epoch1.GetId(), epoch.GetId());
+ epoch1 = CheckFilteredNodesList(runtime, sender, {1024}, {}, epoch.GetId() + 1, 0);
+ UNIT_ASSERT_VALUES_EQUAL(epoch1.GetId(), epoch.GetId() + 1);
+ epoch1 = CheckFilteredNodesList(runtime, sender, {}, {1024}, epoch.GetId() + 2, 0);
+ UNIT_ASSERT_VALUES_EQUAL(epoch1.GetId(), epoch.GetId() + 2);
+ epoch1 = CheckFilteredNodesList(runtime, sender, {}, {}, epoch.GetId() + 5, 0);
+ UNIT_ASSERT_VALUES_EQUAL(epoch1.GetId(), epoch.GetId() + 5);
+ }
+
+ Y_UNIT_TEST(TestRandomActions)
+ {
+ TTestBasicRuntime runtime(8, false);
+ Setup(runtime, 10);
TActorId sender = runtime.AllocateEdgeActor();
-
- TVector<TString> hosts =
- { "host1", "host2", "host3", "host4", "host5",
- "host6", "host7", "host8", "host9", "host10",
- "host11", "host12", "host13", "host14", "host15" };
-
- enum EAction {
- REGISTER,
- PING,
- RESTART,
- RESOLVE_NODE,
- LIST_NODES,
- MOVE_EPOCH,
- };
-
- struct TState {
- ui64 NodeId = 0;
- ui64 PingEpoch = 0;
- };
- auto epoch = GetEpoch(runtime, sender);
-
- THashMap<TString, TState> state;
- TSet<ui64> expired;
- TSet<ui64> freeIds = {
- 1024, 1056, 1088, 1120, 1152,
- 1184, 1216, 1248, 1280, 1312
- };
-
- TVector<EAction> actions = {
- REGISTER, REGISTER, REGISTER, REGISTER, REGISTER,
- PING, PING, PING, PING, PING, PING, PING,
- RESTART, RESOLVE_NODE, RESOLVE_NODE, LIST_NODES,
- MOVE_EPOCH
- };
-
+
+ TVector<TString> hosts =
+ { "host1", "host2", "host3", "host4", "host5",
+ "host6", "host7", "host8", "host9", "host10",
+ "host11", "host12", "host13", "host14", "host15" };
+
+ enum EAction {
+ REGISTER,
+ PING,
+ RESTART,
+ RESOLVE_NODE,
+ LIST_NODES,
+ MOVE_EPOCH,
+ };
+
+ struct TState {
+ ui64 NodeId = 0;
+ ui64 PingEpoch = 0;
+ };
+ auto epoch = GetEpoch(runtime, sender);
+
+ THashMap<TString, TState> state;
+ TSet<ui64> expired;
+ TSet<ui64> freeIds = {
+ 1024, 1056, 1088, 1120, 1152,
+ 1184, 1216, 1248, 1280, 1312
+ };
+
+ TVector<EAction> actions = {
+ REGISTER, REGISTER, REGISTER, REGISTER, REGISTER,
+ PING, PING, PING, PING, PING, PING, PING,
+ RESTART, RESOLVE_NODE, RESOLVE_NODE, LIST_NODES,
+ MOVE_EPOCH
+ };
+
for (size_t i = 0; i < 3000; ++i) {
- EAction action = actions[RandomNumber<ui64>(actions.size())];
- switch (action) {
- case REGISTER:
- {
- ui64 no = RandomNumber<ui64>(hosts.size());
- TString host = hosts[no];
- TStatus::ECode code = TStatus::OK;
- ui64 nodeId = 0;
+ EAction action = actions[RandomNumber<ui64>(actions.size())];
+ switch (action) {
+ case REGISTER:
+ {
+ ui64 no = RandomNumber<ui64>(hosts.size());
+ TString host = hosts[no];
+ TStatus::ECode code = TStatus::OK;
+ ui64 nodeId = 0;
if (state.contains(host)) {
- nodeId = state[host].NodeId;
- if (state[host].PingEpoch != epoch.GetId()) {
- //epoch.SetVersion(epoch.GetVersion() + 1);
- state[host].PingEpoch = epoch.GetId();
- }
- } else {
- if (freeIds.empty())
- code = TStatus::ERROR_TEMP;
- else {
- nodeId = *freeIds.begin();
- freeIds.erase(nodeId);
- state[host] = TState{nodeId, epoch.GetId()};
- epoch.SetVersion(epoch.GetVersion() + 1);
- }
- }
- CheckRegistration(runtime, sender, host, no, host, host,
- no, no, no, no, code, nodeId,
- epoch.GetNextEnd(), false);
- }
- break;
- case MOVE_EPOCH:
- {
- epoch.SetVersion(epoch.GetVersion() + 1);
- epoch.SetId(epoch.GetId() + 1);
- ui64 expire = epoch.GetNextEnd() * 2 - epoch.GetEnd();
- epoch.SetStart(epoch.GetEnd());
- epoch.SetEnd(epoch.GetNextEnd());
- epoch.SetNextEnd(expire);
- TVector<TString> toRemove;
- for (auto id : expired) {
- freeIds.insert(id);
- }
- expired.clear();
- for (auto it = state.begin(); it != state.end(); ) {
- auto next = it;
- ++next;
- if (it->second.PingEpoch == (epoch.GetId() - 2)) {
- expired.insert(it->second.NodeId);
- state.erase(it);
- }
- it = next;
- }
- WaitForEpochUpdate(runtime, sender);
- auto e = GetEpoch(runtime, sender);
- UNIT_ASSERT_VALUES_EQUAL(epoch.DebugString(), e.DebugString());
- }
- break;
- case PING:
- {
- ui64 no = RandomNumber<ui64>(hosts.size());
- TString host = hosts[no];
- TStatus::ECode code = TStatus::OK;
- ui64 nodeId = 0;
-
+ nodeId = state[host].NodeId;
+ if (state[host].PingEpoch != epoch.GetId()) {
+ //epoch.SetVersion(epoch.GetVersion() + 1);
+ state[host].PingEpoch = epoch.GetId();
+ }
+ } else {
+ if (freeIds.empty())
+ code = TStatus::ERROR_TEMP;
+ else {
+ nodeId = *freeIds.begin();
+ freeIds.erase(nodeId);
+ state[host] = TState{nodeId, epoch.GetId()};
+ epoch.SetVersion(epoch.GetVersion() + 1);
+ }
+ }
+ CheckRegistration(runtime, sender, host, no, host, host,
+ no, no, no, no, code, nodeId,
+ epoch.GetNextEnd(), false);
+ }
+ break;
+ case MOVE_EPOCH:
+ {
+ epoch.SetVersion(epoch.GetVersion() + 1);
+ epoch.SetId(epoch.GetId() + 1);
+ ui64 expire = epoch.GetNextEnd() * 2 - epoch.GetEnd();
+ epoch.SetStart(epoch.GetEnd());
+ epoch.SetEnd(epoch.GetNextEnd());
+ epoch.SetNextEnd(expire);
+ TVector<TString> toRemove;
+ for (auto id : expired) {
+ freeIds.insert(id);
+ }
+ expired.clear();
+ for (auto it = state.begin(); it != state.end(); ) {
+ auto next = it;
+ ++next;
+ if (it->second.PingEpoch == (epoch.GetId() - 2)) {
+ expired.insert(it->second.NodeId);
+ state.erase(it);
+ }
+ it = next;
+ }
+ WaitForEpochUpdate(runtime, sender);
+ auto e = GetEpoch(runtime, sender);
+ UNIT_ASSERT_VALUES_EQUAL(epoch.DebugString(), e.DebugString());
+ }
+ break;
+ case PING:
+ {
+ ui64 no = RandomNumber<ui64>(hosts.size());
+ TString host = hosts[no];
+ TStatus::ECode code = TStatus::OK;
+ ui64 nodeId = 0;
+
if (state.contains(host)) {
- nodeId = state[host].NodeId;
- if (state[host].PingEpoch == epoch.GetId()) {
- // no modifications
- } else if (state[host].PingEpoch == (epoch.GetId() - 1)) {
- state[host].PingEpoch = epoch.GetId();
- //epoch.SetVersion(epoch.GetVersion() + 1);
- } else {
- code = TStatus::WRONG_REQUEST;
- }
- } else {
- if (!freeIds.empty())
- nodeId = *freeIds.begin();
- else if (!expired.empty())
- nodeId = *expired.begin();
- code = TStatus::WRONG_REQUEST;
- }
-
- CheckLeaseExtension(runtime, sender, nodeId, code, epoch);
- }
- break;
- case RESOLVE_NODE:
- {
- ui64 no = RandomNumber<ui64>(hosts.size());
- TString host = hosts[no];
- TStatus::ECode code = TStatus::OK;
- ui64 nodeId = 0;
- ui64 expire = 0;
-
+ nodeId = state[host].NodeId;
+ if (state[host].PingEpoch == epoch.GetId()) {
+ // no modifications
+ } else if (state[host].PingEpoch == (epoch.GetId() - 1)) {
+ state[host].PingEpoch = epoch.GetId();
+ //epoch.SetVersion(epoch.GetVersion() + 1);
+ } else {
+ code = TStatus::WRONG_REQUEST;
+ }
+ } else {
+ if (!freeIds.empty())
+ nodeId = *freeIds.begin();
+ else if (!expired.empty())
+ nodeId = *expired.begin();
+ code = TStatus::WRONG_REQUEST;
+ }
+
+ CheckLeaseExtension(runtime, sender, nodeId, code, epoch);
+ }
+ break;
+ case RESOLVE_NODE:
+ {
+ ui64 no = RandomNumber<ui64>(hosts.size());
+ TString host = hosts[no];
+ TStatus::ECode code = TStatus::OK;
+ ui64 nodeId = 0;
+ ui64 expire = 0;
+
if (state.contains(host)) {
- nodeId = state[host].NodeId;
- if (state[host].PingEpoch == epoch.GetId())
- expire = epoch.GetNextEnd();
- else
- expire = epoch.GetEnd();
- } else {
- if (!freeIds.empty())
- nodeId = *freeIds.begin();
- else if (!expired.empty())
- nodeId = *expired.begin();
- code = TStatus::WRONG_REQUEST;
- }
-
- if (code != TStatus::OK)
- CheckNodeInfo(runtime, sender, nodeId, code);
- else
- CheckNodeInfo(runtime, sender, nodeId, host, no, host, host,
- no, no, no, no, expire);
- }
- break;
- case LIST_NODES:
- {
- TSet<ui64> nodes;
- for (auto &pr : state)
- nodes.insert(pr.second.NodeId);
- CheckNodesList(runtime, sender, nodes, expired, epoch.GetId());
- }
- break;
- case RESTART:
- {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- runtime.Register(CreateTabletKiller(MakeNodeBrokerID(0)));
- runtime.DispatchEvents(options);
- }
- break;
- }
- }
- }
-
- Y_UNIT_TEST(BannedIds)
- {
- TTestBasicRuntime runtime(8, false);
- Setup(runtime, 10);
+ nodeId = state[host].NodeId;
+ if (state[host].PingEpoch == epoch.GetId())
+ expire = epoch.GetNextEnd();
+ else
+ expire = epoch.GetEnd();
+ } else {
+ if (!freeIds.empty())
+ nodeId = *freeIds.begin();
+ else if (!expired.empty())
+ nodeId = *expired.begin();
+ code = TStatus::WRONG_REQUEST;
+ }
+
+ if (code != TStatus::OK)
+ CheckNodeInfo(runtime, sender, nodeId, code);
+ else
+ CheckNodeInfo(runtime, sender, nodeId, host, no, host, host,
+ no, no, no, no, expire);
+ }
+ break;
+ case LIST_NODES:
+ {
+ TSet<ui64> nodes;
+ for (auto &pr : state)
+ nodes.insert(pr.second.NodeId);
+ CheckNodesList(runtime, sender, nodes, expired, epoch.GetId());
+ }
+ break;
+ case RESTART:
+ {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ runtime.Register(CreateTabletKiller(MakeNodeBrokerID(0)));
+ runtime.DispatchEvents(options);
+ }
+ break;
+ }
+ }
+ }
+
+ Y_UNIT_TEST(BannedIds)
+ {
+ TTestBasicRuntime runtime(8, false);
+ Setup(runtime, 10);
TActorId sender = runtime.AllocateEdgeActor();
-
- SetBannedIds(runtime, sender, {{1025, 1280}});
-
- // There should be no dynamic nodes initially.
- auto epoch = GetEpoch(runtime, sender);
- // Register node 1024.
- CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 4, TStatus::OK, 1024, epoch.GetNextEnd());
- // Register node 1312.
- CheckRegistration(runtime, sender, "host2", 1001, "host2.yandex.net", "1.2.3.5",
- 1, 2, 3, 5, TStatus::OK, 1312, epoch.GetNextEnd());
- // No more free IDs.
- CheckRegistration(runtime, sender, "host3", 1001, "host3.yandex.net", "1.2.3.6",
- 1, 2, 3, 6, TStatus::ERROR_TEMP);
-
- SetBannedIds(runtime, sender, {{1056, 1183}, {1185, 1311}});
- // Register node 1184.
- CheckRegistration(runtime, sender, "host3", 1001, "host3.yandex.net", "1.2.3.6",
- 1, 2, 3, 6, TStatus::OK, 1184, epoch.GetNextEnd());
- // No more free IDs.
- CheckRegistration(runtime, sender, "host4", 1001, "host4.yandex.net", "1.2.3.7",
- 1, 2, 3, 7, TStatus::ERROR_TEMP);
-
- epoch = GetEpoch(runtime, sender);
-
- // Now ban registered node and check lease extension.
- SetBannedIds(runtime, sender, {{1024, 1183}, {1185, 1311}});
- CheckLeaseExtension(runtime, sender, 1024, TStatus::WRONG_REQUEST);
- CheckLeaseExtension(runtime, sender, 1184, TStatus::OK, epoch);
- CheckLeaseExtension(runtime, sender, 1312, TStatus::OK, epoch);
-
- CheckNodeInfo(runtime, sender, 1024, "host1", 1001, "host1.yandex.net", "1.2.3.4",
- 1, 2, 3, 4, epoch.GetNextEnd());
-
- // Wait until node 1024 expires.
- WaitForEpochUpdate(runtime, sender);
- epoch = GetEpoch(runtime, sender);
- CheckLeaseExtension(runtime, sender, 1184, TStatus::OK, epoch);
- CheckLeaseExtension(runtime, sender, 1312, TStatus::OK, epoch);
- WaitForEpochUpdate(runtime, sender);
-
- CheckNodeInfo(runtime, sender, 1024, TStatus::WRONG_REQUEST);
- // No more free IDs still.
- CheckRegistration(runtime, sender, "host4", 1001, "host4.yandex.net", "1.2.3.7",
- 1, 2, 3, 7, TStatus::ERROR_TEMP);
-
- RestartNodeBroker(runtime);
-
- CheckRegistration(runtime, sender, "host4", 1001, "host4.yandex.net", "1.2.3.7",
- 1, 2, 3, 7, TStatus::ERROR_TEMP);
- }
+
+ SetBannedIds(runtime, sender, {{1025, 1280}});
+
+ // There should be no dynamic nodes initially.
+ auto epoch = GetEpoch(runtime, sender);
+ // Register node 1024.
+ CheckRegistration(runtime, sender, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 4, TStatus::OK, 1024, epoch.GetNextEnd());
+ // Register node 1312.
+ CheckRegistration(runtime, sender, "host2", 1001, "host2.yandex.net", "1.2.3.5",
+ 1, 2, 3, 5, TStatus::OK, 1312, epoch.GetNextEnd());
+ // No more free IDs.
+ CheckRegistration(runtime, sender, "host3", 1001, "host3.yandex.net", "1.2.3.6",
+ 1, 2, 3, 6, TStatus::ERROR_TEMP);
+
+ SetBannedIds(runtime, sender, {{1056, 1183}, {1185, 1311}});
+ // Register node 1184.
+ CheckRegistration(runtime, sender, "host3", 1001, "host3.yandex.net", "1.2.3.6",
+ 1, 2, 3, 6, TStatus::OK, 1184, epoch.GetNextEnd());
+ // No more free IDs.
+ CheckRegistration(runtime, sender, "host4", 1001, "host4.yandex.net", "1.2.3.7",
+ 1, 2, 3, 7, TStatus::ERROR_TEMP);
+
+ epoch = GetEpoch(runtime, sender);
+
+ // Now ban registered node and check lease extension.
+ SetBannedIds(runtime, sender, {{1024, 1183}, {1185, 1311}});
+ CheckLeaseExtension(runtime, sender, 1024, TStatus::WRONG_REQUEST);
+ CheckLeaseExtension(runtime, sender, 1184, TStatus::OK, epoch);
+ CheckLeaseExtension(runtime, sender, 1312, TStatus::OK, epoch);
+
+ CheckNodeInfo(runtime, sender, 1024, "host1", 1001, "host1.yandex.net", "1.2.3.4",
+ 1, 2, 3, 4, epoch.GetNextEnd());
+
+ // Wait until node 1024 expires.
+ WaitForEpochUpdate(runtime, sender);
+ epoch = GetEpoch(runtime, sender);
+ CheckLeaseExtension(runtime, sender, 1184, TStatus::OK, epoch);
+ CheckLeaseExtension(runtime, sender, 1312, TStatus::OK, epoch);
+ WaitForEpochUpdate(runtime, sender);
+
+ CheckNodeInfo(runtime, sender, 1024, TStatus::WRONG_REQUEST);
+ // No more free IDs still.
+ CheckRegistration(runtime, sender, "host4", 1001, "host4.yandex.net", "1.2.3.7",
+ 1, 2, 3, 7, TStatus::ERROR_TEMP);
+
+ RestartNodeBroker(runtime);
+
+ CheckRegistration(runtime, sender, "host4", 1001, "host4.yandex.net", "1.2.3.7",
+ 1, 2, 3, 7, TStatus::ERROR_TEMP);
+ }
Y_UNIT_TEST(SingleDomainModeBannedIds) {
TTestBasicRuntime runtime(1, false);
@@ -1074,161 +1074,161 @@ Y_UNIT_TEST_SUITE(TNodeBrokerTest) {
CheckRegistration(runtime, sender, "host4", 1001, "host4.yandex.net", "1.2.3.7",
1, 2, 3, 7, TStatus::ERROR_TEMP);
}
-}
-
+}
+
Y_UNIT_TEST_SUITE(TDynamicNameserverTest) {
Y_UNIT_TEST(BasicFunctionality)
- {
+ {
TTestBasicRuntime runtime(8, false);
- Setup(runtime);
+ Setup(runtime);
TActorId sender = runtime.AllocateEdgeActor();
-
- // Register node 1024.
- SetEpochDuration(runtime, sender, TDuration::Seconds(10));
- CheckRegistration(runtime, sender, "host1", 1001, "host1.host1.host1", "1.2.3.4",
- 1, 2, 3, 4, TStatus::OK, 1024);
- // Try to resolve node.
- CheckResolveNode(runtime, sender, 1024, "1.2.3.4");
- // Resolve unknown node in another domain.
- CheckResolveUnknownNode(runtime, sender, 1025);
- // Resolve unknown node the same domain.
- CheckResolveUnknownNode(runtime, sender, 1056);
- // Move to the next epoch.
- WaitForEpochUpdate(runtime, sender);
- // Register node 1056.
- CheckRegistration(runtime, sender, "host2", 1001, "host2.host2.host2", "1.2.3.5",
- 1, 2, 3, 5, TStatus::OK, 1056);
- // Check nodes list.
- CheckNameserverNodesList(runtime, sender, 10);
- CheckNameserverDynamicNodesList(runtime, sender, 2,
- MakeICNodeInfo(1024, "host1", 1001, "host1.host1.host1", "1.2.3.4", 1, 2, 3, 4),
- MakeICNodeInfo(1056, "host2", 1001, "host2.host2.host2", "1.2.3.5", 1, 2, 3, 5));
- // Check 1056 node is resolved.
- CheckResolveNode(runtime, sender, 1056, "1.2.3.5");
- // Move to the next epoch. Node 1024 should expire.
- WaitForEpochUpdate(runtime, sender);
- CheckResolveUnknownNode(runtime, sender, 1024);
- CheckResolveNode(runtime, sender, 1056, "1.2.3.5");
- CheckNameserverDynamicNodesList(runtime, sender, 1,
- MakeICNodeInfo(1056, "host2", 1001, "host2.host2.host2", "1.2.3.5", 1, 2, 3, 5));
- // Get existing static node.
- CheckGetNode(runtime, sender, runtime.GetNodeId(0), true);
- // Get unknown static node.
- CheckGetNode(runtime, sender, runtime.GetNodeId(7) + 1, false);
- // Get existing dynamic node.
- CheckGetNode(runtime, sender, 1056, true);
- // Get unknown dynamic node.
- CheckGetNode(runtime, sender, 1057, false);
- }
-
- Y_UNIT_TEST(TestCacheUsage)
- {
- TTestBasicRuntime runtime(1, false);
- Setup(runtime);
+
+ // Register node 1024.
+ SetEpochDuration(runtime, sender, TDuration::Seconds(10));
+ CheckRegistration(runtime, sender, "host1", 1001, "host1.host1.host1", "1.2.3.4",
+ 1, 2, 3, 4, TStatus::OK, 1024);
+ // Try to resolve node.
+ CheckResolveNode(runtime, sender, 1024, "1.2.3.4");
+ // Resolve unknown node in another domain.
+ CheckResolveUnknownNode(runtime, sender, 1025);
+ // Resolve unknown node the same domain.
+ CheckResolveUnknownNode(runtime, sender, 1056);
+ // Move to the next epoch.
+ WaitForEpochUpdate(runtime, sender);
+ // Register node 1056.
+ CheckRegistration(runtime, sender, "host2", 1001, "host2.host2.host2", "1.2.3.5",
+ 1, 2, 3, 5, TStatus::OK, 1056);
+ // Check nodes list.
+ CheckNameserverNodesList(runtime, sender, 10);
+ CheckNameserverDynamicNodesList(runtime, sender, 2,
+ MakeICNodeInfo(1024, "host1", 1001, "host1.host1.host1", "1.2.3.4", 1, 2, 3, 4),
+ MakeICNodeInfo(1056, "host2", 1001, "host2.host2.host2", "1.2.3.5", 1, 2, 3, 5));
+ // Check 1056 node is resolved.
+ CheckResolveNode(runtime, sender, 1056, "1.2.3.5");
+ // Move to the next epoch. Node 1024 should expire.
+ WaitForEpochUpdate(runtime, sender);
+ CheckResolveUnknownNode(runtime, sender, 1024);
+ CheckResolveNode(runtime, sender, 1056, "1.2.3.5");
+ CheckNameserverDynamicNodesList(runtime, sender, 1,
+ MakeICNodeInfo(1056, "host2", 1001, "host2.host2.host2", "1.2.3.5", 1, 2, 3, 5));
+ // Get existing static node.
+ CheckGetNode(runtime, sender, runtime.GetNodeId(0), true);
+ // Get unknown static node.
+ CheckGetNode(runtime, sender, runtime.GetNodeId(7) + 1, false);
+ // Get existing dynamic node.
+ CheckGetNode(runtime, sender, 1056, true);
+ // Get unknown dynamic node.
+ CheckGetNode(runtime, sender, 1057, false);
+ }
+
+ Y_UNIT_TEST(TestCacheUsage)
+ {
+ TTestBasicRuntime runtime(1, false);
+ Setup(runtime);
TActorId sender = runtime.AllocateEdgeActor();
-
- TVector<NKikimrNodeBroker::TListNodes> listRequests;
- TVector<NKikimrNodeBroker::TResolveNode> resolveRequests;
-
+
+ TVector<NKikimrNodeBroker::TListNodes> listRequests;
+ TVector<NKikimrNodeBroker::TResolveNode> resolveRequests;
+
auto logRequests = [&](TTestActorRuntimeBase &, TAutoPtr<IEventHandle> &event) -> auto {
- if (event->GetTypeRewrite() == TEvNodeBroker::EvListNodes)
- listRequests.push_back(event->Get<TEvNodeBroker::TEvListNodes>()->Record);
- else if (event->GetTypeRewrite() == TEvNodeBroker::EvResolveNode)
- resolveRequests.push_back(event->Get<TEvNodeBroker::TEvResolveNode>()->Record);
- return TTestActorRuntime::EEventAction::PROCESS;
- };
-
- struct TIsEvUpdateEpoch {
- bool operator()(IEventHandle &ev) {
- if (ev.HasEvent()
- && (dynamic_cast<TDynamicNameserver::TEvPrivate::TEvUpdateEpoch*>(ev.GetBase())))
- return true;
- return false;
- }
- };
-
- // Static assignemt with mixed slots should take place first.
- runtime.SetObserverFunc(logRequests);
-
- // Expect nameservice to request nodes list to cache current epoch.
- {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvNodeBroker::EvNodesInfo, 1);
- runtime.DispatchEvents(options);
- }
-
- CheckRegistration(runtime, sender, "host1", 1001, "host1.host1.host1", "1.2.3.4",
- 1, 2, 3, 4, TStatus::OK, 1024);
-
- listRequests.clear();
- resolveRequests.clear();
-
- // This request should go to Node Broker.
- CheckResolveNode(runtime, sender, 1024, "1.2.3.4");
- UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 1);
- // The next request for the same node should use cache.
- CheckResolveNode(runtime, sender, 1024, "1.2.3.4");
- UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 1);
- // Unknown node resolve always should cause request to Node Broker.
- CheckResolveUnknownNode(runtime, sender, 1056);
- UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 2);
- CheckResolveUnknownNode(runtime, sender, 1056);
- UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 3);
-
- // Nodes list request should always cause request to Node Broker.
- CheckNameserverDynamicNodesList(runtime, sender, 1,
- MakeICNodeInfo(1024, "host1", 1001, "host1.host1.host1", "1.2.3.4", 1, 2, 3, 4));
- UNIT_ASSERT_VALUES_EQUAL(listRequests.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(listRequests[0].GetCachedVersion(), 1);
-
- CheckNameserverDynamicNodesList(runtime, sender, 1,
- MakeICNodeInfo(1024, "host1", 1001, "host1.host1.host1", "1.2.3.4", 1, 2, 3, 4));
- UNIT_ASSERT_VALUES_EQUAL(listRequests.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(listRequests[1].GetCachedVersion(), 2);
-
- auto epoch = GetEpoch(runtime, sender);
- runtime.UpdateCurrentTime(TInstant::FromValue(epoch.GetEnd() + 1));
- listRequests.clear();
-
- {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TIsEvUpdateEpoch(), 1);
- runtime.DispatchEvents(options);
- }
- UNIT_ASSERT_VALUES_EQUAL(listRequests.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(listRequests[0].GetMinEpoch(), 2);
-
- CheckRegistration(runtime, sender, "host2", 1001, "host2.host2.host2", "1.2.3.5",
- 1, 2, 3, 5, TStatus::OK, 1056);
-
- CheckNameserverDynamicNodesList(runtime, sender, 2,
- MakeICNodeInfo(1024, "host1", 1001, "host1.host1.host1", "1.2.3.4", 1, 2, 3, 4),
- MakeICNodeInfo(1056, "host2", 1001, "host2.host2.host2", "1.2.3.5", 1, 2, 3, 5));
- UNIT_ASSERT_VALUES_EQUAL(listRequests.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(listRequests[1].GetCachedVersion(), 3);
-
- // This node should be cached.
- CheckResolveNode(runtime, sender, 1056, "1.2.3.5");
- UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 3);
-
- // Go to the next epoch.
- epoch = GetEpoch(runtime, sender);
- runtime.UpdateCurrentTime(TInstant::FromValue(epoch.GetEnd() + 1));
- listRequests.clear();
-
- {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvNodeBroker::EvNodesInfo, 1);
- runtime.DispatchEvents(options);
- }
- UNIT_ASSERT_VALUES_EQUAL(listRequests.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(listRequests[0].GetMinEpoch(), 3);
-
- // Both live and expired nodes should be resolved from the cache.
- CheckResolveUnknownNode(runtime, sender, 1024);
- CheckResolveNode(runtime, sender, 1056, "1.2.3.5");
- UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 3);
- }
-}
-
-} // NKikimr
+ if (event->GetTypeRewrite() == TEvNodeBroker::EvListNodes)
+ listRequests.push_back(event->Get<TEvNodeBroker::TEvListNodes>()->Record);
+ else if (event->GetTypeRewrite() == TEvNodeBroker::EvResolveNode)
+ resolveRequests.push_back(event->Get<TEvNodeBroker::TEvResolveNode>()->Record);
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+
+ struct TIsEvUpdateEpoch {
+ bool operator()(IEventHandle &ev) {
+ if (ev.HasEvent()
+ && (dynamic_cast<TDynamicNameserver::TEvPrivate::TEvUpdateEpoch*>(ev.GetBase())))
+ return true;
+ return false;
+ }
+ };
+
+ // Static assignemt with mixed slots should take place first.
+ runtime.SetObserverFunc(logRequests);
+
+ // Expect nameservice to request nodes list to cache current epoch.
+ {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvNodeBroker::EvNodesInfo, 1);
+ runtime.DispatchEvents(options);
+ }
+
+ CheckRegistration(runtime, sender, "host1", 1001, "host1.host1.host1", "1.2.3.4",
+ 1, 2, 3, 4, TStatus::OK, 1024);
+
+ listRequests.clear();
+ resolveRequests.clear();
+
+ // This request should go to Node Broker.
+ CheckResolveNode(runtime, sender, 1024, "1.2.3.4");
+ UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 1);
+ // The next request for the same node should use cache.
+ CheckResolveNode(runtime, sender, 1024, "1.2.3.4");
+ UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 1);
+ // Unknown node resolve always should cause request to Node Broker.
+ CheckResolveUnknownNode(runtime, sender, 1056);
+ UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 2);
+ CheckResolveUnknownNode(runtime, sender, 1056);
+ UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 3);
+
+ // Nodes list request should always cause request to Node Broker.
+ CheckNameserverDynamicNodesList(runtime, sender, 1,
+ MakeICNodeInfo(1024, "host1", 1001, "host1.host1.host1", "1.2.3.4", 1, 2, 3, 4));
+ UNIT_ASSERT_VALUES_EQUAL(listRequests.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(listRequests[0].GetCachedVersion(), 1);
+
+ CheckNameserverDynamicNodesList(runtime, sender, 1,
+ MakeICNodeInfo(1024, "host1", 1001, "host1.host1.host1", "1.2.3.4", 1, 2, 3, 4));
+ UNIT_ASSERT_VALUES_EQUAL(listRequests.size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(listRequests[1].GetCachedVersion(), 2);
+
+ auto epoch = GetEpoch(runtime, sender);
+ runtime.UpdateCurrentTime(TInstant::FromValue(epoch.GetEnd() + 1));
+ listRequests.clear();
+
+ {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TIsEvUpdateEpoch(), 1);
+ runtime.DispatchEvents(options);
+ }
+ UNIT_ASSERT_VALUES_EQUAL(listRequests.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(listRequests[0].GetMinEpoch(), 2);
+
+ CheckRegistration(runtime, sender, "host2", 1001, "host2.host2.host2", "1.2.3.5",
+ 1, 2, 3, 5, TStatus::OK, 1056);
+
+ CheckNameserverDynamicNodesList(runtime, sender, 2,
+ MakeICNodeInfo(1024, "host1", 1001, "host1.host1.host1", "1.2.3.4", 1, 2, 3, 4),
+ MakeICNodeInfo(1056, "host2", 1001, "host2.host2.host2", "1.2.3.5", 1, 2, 3, 5));
+ UNIT_ASSERT_VALUES_EQUAL(listRequests.size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(listRequests[1].GetCachedVersion(), 3);
+
+ // This node should be cached.
+ CheckResolveNode(runtime, sender, 1056, "1.2.3.5");
+ UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 3);
+
+ // Go to the next epoch.
+ epoch = GetEpoch(runtime, sender);
+ runtime.UpdateCurrentTime(TInstant::FromValue(epoch.GetEnd() + 1));
+ listRequests.clear();
+
+ {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvNodeBroker::EvNodesInfo, 1);
+ runtime.DispatchEvents(options);
+ }
+ UNIT_ASSERT_VALUES_EQUAL(listRequests.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(listRequests[0].GetMinEpoch(), 3);
+
+ // Both live and expired nodes should be resolved from the cache.
+ CheckResolveUnknownNode(runtime, sender, 1024);
+ CheckResolveNode(runtime, sender, 1056, "1.2.3.5");
+ UNIT_ASSERT_VALUES_EQUAL(resolveRequests.size(), 3);
+ }
+}
+
+} // NKikimr
diff --git a/ydb/core/mind/tenant_pool.cpp b/ydb/core/mind/tenant_pool.cpp
index a4b515a9476..80236570b9e 100644
--- a/ydb/core/mind/tenant_pool.cpp
+++ b/ydb/core/mind/tenant_pool.cpp
@@ -1,7 +1,7 @@
-#include "local.h"
-#include "tenant_pool.h"
-#include "tenant_slot_broker.h"
-
+#include "local.h"
+#include "tenant_pool.h"
+#include "tenant_slot_broker.h"
+
#include <ydb/core/base/appdata.h>
#include <ydb/core/base/counters.h>
#include <ydb/core/base/subdomain.h>
@@ -11,103 +11,103 @@
#include <ydb/core/cms/console/configs_dispatcher.h>
#include <ydb/core/cms/console/console.h>
#include <ydb/core/mon/mon.h>
-
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
#include <library/cpp/actors/core/log.h>
#include <library/cpp/actors/core/mon.h>
#include <library/cpp/monlib/service/pages/templates.h>
-
-#include <util/generic/queue.h>
-#include <util/generic/hash.h>
-
-namespace NKikimr {
-namespace {
-
-using namespace NTenantSlotBroker;
-using namespace NConsole;
-
-struct TTenantInfo;
-
-struct TDynamicSlotInfo : public TThrRefBase {
- using TPtr = TIntrusivePtr<TDynamicSlotInfo>;
-
- TString Id;
- TString Type;
- TIntrusivePtr<TTenantInfo> AssignedTenant;
- NKikimrTabletBase::TMetrics ResourceLimit;
- TAutoPtr<IEventHandle> ActiveAction;
- TQueue<THolder<IEventHandle>> PendingActions;
- TString Label;
-};
-
-struct TTenantInfo : public TThrRefBase {
- using TPtr = TIntrusivePtr<TTenantInfo>;
+
+#include <util/generic/queue.h>
+#include <util/generic/hash.h>
+
+namespace NKikimr {
+namespace {
+
+using namespace NTenantSlotBroker;
+using namespace NConsole;
+
+struct TTenantInfo;
+
+struct TDynamicSlotInfo : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TDynamicSlotInfo>;
+
+ TString Id;
+ TString Type;
+ TIntrusivePtr<TTenantInfo> AssignedTenant;
+ NKikimrTabletBase::TMetrics ResourceLimit;
+ TAutoPtr<IEventHandle> ActiveAction;
+ TQueue<THolder<IEventHandle>> PendingActions;
+ TString Label;
+};
+
+struct TTenantInfo : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TTenantInfo>;
using EState = NKikimrTenantPool::EState;
-
- TTenantInfo(const TString &name)
- : Name(name)
- , HasStaticSlot(false)
- , LastStatus(TEvLocal::TEvTenantStatus::STOPPED)
+
+ TTenantInfo(const TString &name)
+ : Name(name)
+ , HasStaticSlot(false)
+ , LastStatus(TEvLocal::TEvTenantStatus::STOPPED)
, State(EState::TENANT_ASSIGNED)
- {
- }
-
- void AddResourceLimit(const NKikimrTabletBase::TMetrics &limit)
- {
- if (ResourceLimit.HasCPU() && limit.HasCPU())
- ResourceLimit.SetCPU(ResourceLimit.GetCPU() + limit.GetCPU());
- else
- ResourceLimit.ClearCPU();
-
- if (ResourceLimit.HasMemory() && limit.HasMemory())
- ResourceLimit.SetMemory(ResourceLimit.GetMemory() + limit.GetMemory());
- else
- ResourceLimit.ClearMemory();
-
- if (ResourceLimit.HasNetwork() && limit.HasNetwork())
- ResourceLimit.SetNetwork(ResourceLimit.GetNetwork() + limit.GetNetwork());
- else
- ResourceLimit.ClearNetwork();
- }
-
- void ComputeResourceLimit()
- {
- ResourceLimit = StaticResourceLimit;
-
- auto it = AssignedSlots.begin();
- if (!HasStaticSlot && AssignedSlots.size()) {
-
- ResourceLimit = (*it)->ResourceLimit;
- ++it;
- }
-
- for (; it != AssignedSlots.end(); ++it)
- AddResourceLimit((*it)->ResourceLimit);
- }
-
- bool CompareLimit(const NKikimrTabletBase::TMetrics &limit)
- {
- if (ResourceLimit.GetCPU() != limit.GetCPU())
- return false;
- if (ResourceLimit.GetMemory() != limit.GetMemory())
- return false;
- if (ResourceLimit.GetNetwork() != limit.GetNetwork())
- return false;
- return true;
- }
-
- TString Name;
- THashSet<TDynamicSlotInfo::TPtr, TPtrHash> AssignedSlots;
- bool HasStaticSlot;
- NKikimrTabletBase::TMetrics StaticResourceLimit;
- NKikimrTabletBase::TMetrics ResourceLimit;
- TEvLocal::TEvTenantStatus::EStatus LastStatus;
+ {
+ }
+
+ void AddResourceLimit(const NKikimrTabletBase::TMetrics &limit)
+ {
+ if (ResourceLimit.HasCPU() && limit.HasCPU())
+ ResourceLimit.SetCPU(ResourceLimit.GetCPU() + limit.GetCPU());
+ else
+ ResourceLimit.ClearCPU();
+
+ if (ResourceLimit.HasMemory() && limit.HasMemory())
+ ResourceLimit.SetMemory(ResourceLimit.GetMemory() + limit.GetMemory());
+ else
+ ResourceLimit.ClearMemory();
+
+ if (ResourceLimit.HasNetwork() && limit.HasNetwork())
+ ResourceLimit.SetNetwork(ResourceLimit.GetNetwork() + limit.GetNetwork());
+ else
+ ResourceLimit.ClearNetwork();
+ }
+
+ void ComputeResourceLimit()
+ {
+ ResourceLimit = StaticResourceLimit;
+
+ auto it = AssignedSlots.begin();
+ if (!HasStaticSlot && AssignedSlots.size()) {
+
+ ResourceLimit = (*it)->ResourceLimit;
+ ++it;
+ }
+
+ for (; it != AssignedSlots.end(); ++it)
+ AddResourceLimit((*it)->ResourceLimit);
+ }
+
+ bool CompareLimit(const NKikimrTabletBase::TMetrics &limit)
+ {
+ if (ResourceLimit.GetCPU() != limit.GetCPU())
+ return false;
+ if (ResourceLimit.GetMemory() != limit.GetMemory())
+ return false;
+ if (ResourceLimit.GetNetwork() != limit.GetNetwork())
+ return false;
+ return true;
+ }
+
+ TString Name;
+ THashSet<TDynamicSlotInfo::TPtr, TPtrHash> AssignedSlots;
+ bool HasStaticSlot;
+ NKikimrTabletBase::TMetrics StaticResourceLimit;
+ NKikimrTabletBase::TMetrics ResourceLimit;
+ TEvLocal::TEvTenantStatus::EStatus LastStatus;
EState State;
- THashMap<TString, TString> Attributes;
+ THashMap<TString, TString> Attributes;
TSubDomainKey DomainKey;
-};
-
+};
+
struct TTenantSlotBrokerInfo {
ui64 TabletId = 0;
ui64 Generation = 0;
@@ -116,233 +116,233 @@ struct TTenantSlotBrokerInfo {
TActorId Pipe;
};
-class TDomainTenantPool : public TActorBootstrapped<TDomainTenantPool> {
- using TActorBase = TActorBootstrapped<TDomainTenantPool>;
-
- TString DomainName;
- TString LogPrefix;
+class TDomainTenantPool : public TActorBootstrapped<TDomainTenantPool> {
+ using TActorBase = TActorBootstrapped<TDomainTenantPool>;
+
+ TString DomainName;
+ TString LogPrefix;
TActorId LocalID;
TTenantSlotBrokerInfo TenantSlotBroker;
- TTenantPoolConfig::TPtr Config;
- THashMap<TString, TDynamicSlotInfo::TPtr> DynamicSlots;
- THashMap<TString, TTenantInfo::TPtr> Tenants;
+ TTenantPoolConfig::TPtr Config;
+ THashMap<TString, TDynamicSlotInfo::TPtr> DynamicSlots;
+ THashMap<TString, TTenantInfo::TPtr> Tenants;
THashSet<TActorId> StatusSubscribers;
-
-public:
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::TENANT_POOL_ACTOR;
- }
-
+ }
+
TDomainTenantPool(const TString &domain, TActorId localID, TTenantPoolConfig::TPtr config)
- : DomainName(domain)
- , LocalID(localID)
- , Config(config)
- {
- LogPrefix = TStringBuilder() << "TDomainTenantPool(" << DomainName << ") ";
- }
-
- ~TDomainTenantPool()
- {
- for (auto &pr : Tenants)
- pr.second->AssignedSlots.clear();
- for (auto &pr : DynamicSlots)
- pr.second->AssignedTenant = nullptr;
- }
-
- void Die(const TActorContext &ctx) override
- {
+ : DomainName(domain)
+ , LocalID(localID)
+ , Config(config)
+ {
+ LogPrefix = TStringBuilder() << "TDomainTenantPool(" << DomainName << ") ";
+ }
+
+ ~TDomainTenantPool()
+ {
+ for (auto &pr : Tenants)
+ pr.second->AssignedSlots.clear();
+ for (auto &pr : DynamicSlots)
+ pr.second->AssignedTenant = nullptr;
+ }
+
+ void Die(const TActorContext &ctx) override
+ {
NTabletPipe::CloseAndForgetClient(SelfId(), TenantSlotBroker.Pipe);
- ctx.Send(LocalID, new TEvents::TEvPoisonPill);
-
- TActorBase::Die(ctx);
- }
-
- void TryToRegister(const TActorContext &ctx)
- {
+ ctx.Send(LocalID, new TEvents::TEvPoisonPill);
+
+ TActorBase::Die(ctx);
+ }
+
+ void TryToRegister(const TActorContext &ctx)
+ {
Y_VERIFY(!TenantSlotBroker.Pipe);
-
- NTabletPipe::TClientConfig pipeConfig;
+
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = {
.MinRetryTime = TDuration::MilliSeconds(10),
.MaxRetryTime = TDuration::Seconds(1),
};
auto pipe = NTabletPipe::CreateClient(ctx.SelfID, TenantSlotBroker.TabletId, pipeConfig);
TenantSlotBroker.Pipe = ctx.ExecutorThread.RegisterActor(pipe);
-
- auto request = MakeHolder<TEvTenantSlotBroker::TEvRegisterPool>();
+
+ auto request = MakeHolder<TEvTenantSlotBroker::TEvRegisterPool>();
ActorIdToProto(TenantSlotBroker.Pipe, request->Record.MutableClientId());
request->Record.SetSeqNo(++TenantSlotBroker.SeqNo);
NTabletPipe::SendData(ctx, TenantSlotBroker.Pipe, request.Release());
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "try to register in tenant slot broker (pipe "
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "try to register in tenant slot broker (pipe "
<< TenantSlotBroker.Pipe << ")");
- }
-
- void HandlePipeDestroyed(const TActorContext &ctx) {
+ }
+
+ void HandlePipeDestroyed(const TActorContext &ctx) {
NTabletPipe::CloseAndForgetClient(SelfId(), TenantSlotBroker.Pipe);
- TryToRegister(ctx);
- }
-
- TTenantInfo::TPtr MaybeAddTenant(const TString &name)
- {
- auto &tenant = Tenants[name];
- if (!tenant)
- tenant = new TTenantInfo(name);
- return tenant;
- }
-
- void FillSlotStatus(TDynamicSlotInfo::TPtr slot, NKikimrTenantPool::TSlotStatus &status)
- {
- status.SetId(slot->Id);
- status.SetType(slot->Type);
- if (slot->AssignedTenant) {
- status.SetAssignedTenant(slot->AssignedTenant->Name);
- status.SetLabel(slot->Label);
- for (auto &pr : slot->AssignedTenant->Attributes) {
- auto &attr = *status.AddTenantAttributes();
- attr.SetKey(pr.first);
- attr.SetValue(pr.second);
- }
+ TryToRegister(ctx);
+ }
+
+ TTenantInfo::TPtr MaybeAddTenant(const TString &name)
+ {
+ auto &tenant = Tenants[name];
+ if (!tenant)
+ tenant = new TTenantInfo(name);
+ return tenant;
+ }
+
+ void FillSlotStatus(TDynamicSlotInfo::TPtr slot, NKikimrTenantPool::TSlotStatus &status)
+ {
+ status.SetId(slot->Id);
+ status.SetType(slot->Type);
+ if (slot->AssignedTenant) {
+ status.SetAssignedTenant(slot->AssignedTenant->Name);
+ status.SetLabel(slot->Label);
+ for (auto &pr : slot->AssignedTenant->Attributes) {
+ auto &attr = *status.AddTenantAttributes();
+ attr.SetKey(pr.first);
+ attr.SetValue(pr.second);
+ }
status.SetState(slot->AssignedTenant->State);
*status.MutableDomainKey() = NKikimrSubDomains::TDomainKey(slot->AssignedTenant->DomainKey);
- }
- status.MutableResourceLimit()->CopyFrom(slot->ResourceLimit);
- }
-
- void SendSlotStatus(TDynamicSlotInfo::TPtr slot, NKikimrTenantPool::EStatus status,
- const TString &error, const TActorContext &ctx)
- {
- Y_VERIFY(slot->ActiveAction);
- auto event = MakeHolder<TEvTenantPool::TEvConfigureSlotResult>();
- event->Record.SetStatus(status);
- event->Record.SetError(error);
- FillSlotStatus(slot, *event->Record.MutableSlotStatus());
- ctx.Send(slot->ActiveAction->Sender, event.Release(), 0, slot->ActiveAction->Cookie);
- slot->ActiveAction.Reset();
- }
-
- void SendTenantStatus(TTenantInfo::TPtr tenant, NKikimrTenantPool::EStatus status,
- const TString &error, const TActorContext &ctx)
- {
- for (auto &slot : tenant->AssignedSlots) {
- if (slot->ActiveAction) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "slot '" << slot->Id << "' configure for '"
- << tenant->Name << "' finished with status " << status);
-
- SendSlotStatus(slot, status, error, ctx);
- }
- }
- }
-
- void SendConfigureError(TEvTenantPool::TEvConfigureSlot::TPtr &ev, const TString &slotId,
- NKikimrTenantPool::EStatus status, const TString &error, const TActorContext &ctx)
- {
- auto event = MakeHolder<TEvTenantPool::TEvConfigureSlotResult>();
- event->Record.SetStatus(status);
- event->Record.SetError(error);
- event->Record.MutableSlotStatus()->SetId(slotId);
- ctx.Send(ev->Sender, event.Release(), 0, ev->Cookie);
- }
-
- void ProcessPendingActions(const THashSet<TDynamicSlotInfo::TPtr, TPtrHash> &slots, const TActorContext &ctx)
- {
- for (auto &slot : slots) {
- Y_VERIFY(!slot->ActiveAction);
- if (slot->PendingActions) {
- slot->ActiveAction = std::move(slot->PendingActions.front());
- slot->PendingActions.pop();
- ProcessActiveAction(slot, ctx);
- }
- }
- }
-
- void SendTenantStatus(TTenantInfo::TPtr tenant, NKikimrTenantPool::EStatus status,
- const TActorContext &ctx)
- {
- SendTenantStatus(tenant, status, "", ctx);
- }
-
- void SendStatusUpdates(const TActorContext &ctx)
- {
- for (auto &subscriber : StatusSubscribers) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "send status update to " << subscriber);
+ }
+ status.MutableResourceLimit()->CopyFrom(slot->ResourceLimit);
+ }
+
+ void SendSlotStatus(TDynamicSlotInfo::TPtr slot, NKikimrTenantPool::EStatus status,
+ const TString &error, const TActorContext &ctx)
+ {
+ Y_VERIFY(slot->ActiveAction);
+ auto event = MakeHolder<TEvTenantPool::TEvConfigureSlotResult>();
+ event->Record.SetStatus(status);
+ event->Record.SetError(error);
+ FillSlotStatus(slot, *event->Record.MutableSlotStatus());
+ ctx.Send(slot->ActiveAction->Sender, event.Release(), 0, slot->ActiveAction->Cookie);
+ slot->ActiveAction.Reset();
+ }
+
+ void SendTenantStatus(TTenantInfo::TPtr tenant, NKikimrTenantPool::EStatus status,
+ const TString &error, const TActorContext &ctx)
+ {
+ for (auto &slot : tenant->AssignedSlots) {
+ if (slot->ActiveAction) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "slot '" << slot->Id << "' configure for '"
+ << tenant->Name << "' finished with status " << status);
+
+ SendSlotStatus(slot, status, error, ctx);
+ }
+ }
+ }
+
+ void SendConfigureError(TEvTenantPool::TEvConfigureSlot::TPtr &ev, const TString &slotId,
+ NKikimrTenantPool::EStatus status, const TString &error, const TActorContext &ctx)
+ {
+ auto event = MakeHolder<TEvTenantPool::TEvConfigureSlotResult>();
+ event->Record.SetStatus(status);
+ event->Record.SetError(error);
+ event->Record.MutableSlotStatus()->SetId(slotId);
+ ctx.Send(ev->Sender, event.Release(), 0, ev->Cookie);
+ }
+
+ void ProcessPendingActions(const THashSet<TDynamicSlotInfo::TPtr, TPtrHash> &slots, const TActorContext &ctx)
+ {
+ for (auto &slot : slots) {
+ Y_VERIFY(!slot->ActiveAction);
+ if (slot->PendingActions) {
+ slot->ActiveAction = std::move(slot->PendingActions.front());
+ slot->PendingActions.pop();
+ ProcessActiveAction(slot, ctx);
+ }
+ }
+ }
+
+ void SendTenantStatus(TTenantInfo::TPtr tenant, NKikimrTenantPool::EStatus status,
+ const TActorContext &ctx)
+ {
+ SendTenantStatus(tenant, status, "", ctx);
+ }
+
+ void SendStatusUpdates(const TActorContext &ctx)
+ {
+ for (auto &subscriber : StatusSubscribers) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "send status update to " << subscriber);
ctx.Send(subscriber, BuildStatusEvent(true));
- }
- }
-
- void UpdateTenant(TTenantInfo::TPtr tenant, const TActorContext &ctx)
- {
- tenant->ComputeResourceLimit();
- if (tenant->LastStatus == TEvLocal::TEvTenantStatus::STOPPED
- || tenant->LastStatus == TEvLocal::TEvTenantStatus::UNKNOWN_TENANT) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "send request to add tenant " << tenant->Name
- << " with resources " << tenant->ResourceLimit.ShortDebugString());
-
- auto event = MakeHolder<TEvLocal::TEvAddTenant>(tenant->Name,
- tenant->ResourceLimit);
- ctx.Send(LocalID, event.Release());
- } else if (tenant->LastStatus == TEvLocal::TEvTenantStatus::STARTED) {
- if (tenant->HasStaticSlot || tenant->AssignedSlots) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "send request to alter tenant " << tenant->Name
- << " with resources " << tenant->ResourceLimit.ShortDebugString());
-
- auto event = MakeHolder<TEvLocal::TEvAlterTenant>(tenant->Name,
- tenant->ResourceLimit);
- ctx.Send(LocalID, event.Release());
- } else {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "send request to remove tenant" << tenant->Name);
-
- auto event = MakeHolder<TEvLocal::TEvRemoveTenant>(tenant->Name);
- ctx.Send(LocalID, event.Release());
- }
- } else {
- Y_FAIL("unexpected tenant status");
- }
- }
-
- void AttachSlot(TDynamicSlotInfo::TPtr slot, TTenantInfo::TPtr tenant,
- const TString &label, const TActorContext &ctx)
- {
- Y_VERIFY(!slot->AssignedTenant);
+ }
+ }
+
+ void UpdateTenant(TTenantInfo::TPtr tenant, const TActorContext &ctx)
+ {
+ tenant->ComputeResourceLimit();
+ if (tenant->LastStatus == TEvLocal::TEvTenantStatus::STOPPED
+ || tenant->LastStatus == TEvLocal::TEvTenantStatus::UNKNOWN_TENANT) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "send request to add tenant " << tenant->Name
+ << " with resources " << tenant->ResourceLimit.ShortDebugString());
+
+ auto event = MakeHolder<TEvLocal::TEvAddTenant>(tenant->Name,
+ tenant->ResourceLimit);
+ ctx.Send(LocalID, event.Release());
+ } else if (tenant->LastStatus == TEvLocal::TEvTenantStatus::STARTED) {
+ if (tenant->HasStaticSlot || tenant->AssignedSlots) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "send request to alter tenant " << tenant->Name
+ << " with resources " << tenant->ResourceLimit.ShortDebugString());
+
+ auto event = MakeHolder<TEvLocal::TEvAlterTenant>(tenant->Name,
+ tenant->ResourceLimit);
+ ctx.Send(LocalID, event.Release());
+ } else {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "send request to remove tenant" << tenant->Name);
+
+ auto event = MakeHolder<TEvLocal::TEvRemoveTenant>(tenant->Name);
+ ctx.Send(LocalID, event.Release());
+ }
+ } else {
+ Y_FAIL("unexpected tenant status");
+ }
+ }
+
+ void AttachSlot(TDynamicSlotInfo::TPtr slot, TTenantInfo::TPtr tenant,
+ const TString &label, const TActorContext &ctx)
+ {
+ Y_VERIFY(!slot->AssignedTenant);
Y_VERIFY(!tenant->AssignedSlots.contains(slot));
- slot->AssignedTenant = tenant;
- slot->Label = label;
- tenant->AssignedSlots.insert(slot);
-
- LOG_NOTICE_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "attached tenant " << tenant->Name << " to slot "
- << slot->Id << " with label " << label);
- }
-
- void DetachSlot(TDynamicSlotInfo::TPtr slot, const TActorContext &ctx)
- {
- Y_VERIFY(slot->AssignedTenant);
+ slot->AssignedTenant = tenant;
+ slot->Label = label;
+ tenant->AssignedSlots.insert(slot);
+
+ LOG_NOTICE_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "attached tenant " << tenant->Name << " to slot "
+ << slot->Id << " with label " << label);
+ }
+
+ void DetachSlot(TDynamicSlotInfo::TPtr slot, const TActorContext &ctx)
+ {
+ Y_VERIFY(slot->AssignedTenant);
Y_VERIFY(slot->AssignedTenant->AssignedSlots.contains(slot));
-
- LOG_NOTICE_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "detach tenant " << slot->AssignedTenant->Name
- << " from slot " << slot->Id << " with label " << slot->Label);
-
- slot->AssignedTenant->AssignedSlots.erase(slot);
- slot->AssignedTenant = nullptr;
- slot->Label = "";
- }
-
- void DetachAllSlots(TTenantInfo::TPtr tenant, const TActorContext &ctx)
- {
- while (tenant->AssignedSlots)
- DetachSlot(*tenant->AssignedSlots.begin(), ctx);
- }
-
+
+ LOG_NOTICE_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "detach tenant " << slot->AssignedTenant->Name
+ << " from slot " << slot->Id << " with label " << slot->Label);
+
+ slot->AssignedTenant->AssignedSlots.erase(slot);
+ slot->AssignedTenant = nullptr;
+ slot->Label = "";
+ }
+
+ void DetachAllSlots(TTenantInfo::TPtr tenant, const TActorContext &ctx)
+ {
+ while (tenant->AssignedSlots)
+ DetachSlot(*tenant->AssignedSlots.begin(), ctx);
+ }
+
THolder<TEvTenantPool::TEvTenantPoolStatus> BuildStatusEvent(bool listStatic = false)
- {
+ {
THolder<TEvTenantPool::TEvTenantPoolStatus> ev = MakeHolder<TEvTenantPool::TEvTenantPoolStatus>();
if (listStatic) {
for (auto& pr : Config->StaticSlots) {
@@ -352,151 +352,151 @@ public:
slotStatus.SetType(slotConfig.GetType());
slotStatus.SetAssignedTenant(slotConfig.GetTenantName());
slotStatus.MutableResourceLimit()->CopyFrom(slotConfig.GetResourceLimit());
- slotStatus.SetLabel(Config->StaticSlotLabel);
-
- auto it = Tenants.find(slotConfig.GetTenantName());
- if (it != Tenants.end()) {
- for (auto &pr : it->second->Attributes) {
- auto &attr = *slotStatus.AddTenantAttributes();
- attr.SetKey(pr.first);
- attr.SetValue(pr.second);
- }
+ slotStatus.SetLabel(Config->StaticSlotLabel);
+
+ auto it = Tenants.find(slotConfig.GetTenantName());
+ if (it != Tenants.end()) {
+ for (auto &pr : it->second->Attributes) {
+ auto &attr = *slotStatus.AddTenantAttributes();
+ attr.SetKey(pr.first);
+ attr.SetValue(pr.second);
+ }
slotStatus.SetState(it->second->State);
*slotStatus.MutableDomainKey() = NKikimrSubDomains::TDomainKey(it->second->DomainKey);
- }
+ }
}
}
- for (auto &pr : DynamicSlots)
- FillSlotStatus(pr.second, *ev->Record.AddSlots());
- ev->Record.SetNodeType(Config->NodeType);
- return ev;
- }
-
- void ProcessActiveAction(TDynamicSlotInfo::TPtr slot, const TActorContext &ctx)
- {
- Y_VERIFY(slot->ActiveAction);
- Y_VERIFY(slot->ActiveAction->GetTypeRewrite() == TEvTenantPool::EvConfigureSlot);
- auto &rec = slot->ActiveAction->Get<TEvTenantPool::TEvConfigureSlot>()->Record;
- bool ready = true;
- bool updated = false;
-
- if (slot->AssignedTenant && slot->AssignedTenant->Name != rec.GetAssignedTenant()) {
- auto tenant = slot->AssignedTenant;
- DetachSlot(slot, ctx);
- UpdateTenant(tenant, ctx);
- updated = true;
- }
-
- if (rec.GetAssignedTenant()
- && (!slot->AssignedTenant || slot->AssignedTenant->Name != rec.GetAssignedTenant())) {
- auto tenant = MaybeAddTenant(rec.GetAssignedTenant());
- AttachSlot(slot, tenant, rec.GetLabel(), ctx);
- UpdateTenant(tenant, ctx);
- ready = tenant->LastStatus == TEvLocal::TEvTenantStatus::STARTED;
- updated = true;
- }
-
- if (updated)
- SendStatusUpdates(ctx);
-
- if (ready) {
- SendSlotStatus(slot, NKikimrTenantPool::SUCCESS, "", ctx);
- ProcessPendingActions({slot}, ctx);
- }
- }
-
- void Bootstrap(const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "Bootstrap");
-
- SubscribeForConfig(ctx);
-
- auto domain = AppData(ctx)->DomainsInfo->GetDomainByName(DomainName);
- Y_VERIFY(domain);
+ for (auto &pr : DynamicSlots)
+ FillSlotStatus(pr.second, *ev->Record.AddSlots());
+ ev->Record.SetNodeType(Config->NodeType);
+ return ev;
+ }
+
+ void ProcessActiveAction(TDynamicSlotInfo::TPtr slot, const TActorContext &ctx)
+ {
+ Y_VERIFY(slot->ActiveAction);
+ Y_VERIFY(slot->ActiveAction->GetTypeRewrite() == TEvTenantPool::EvConfigureSlot);
+ auto &rec = slot->ActiveAction->Get<TEvTenantPool::TEvConfigureSlot>()->Record;
+ bool ready = true;
+ bool updated = false;
+
+ if (slot->AssignedTenant && slot->AssignedTenant->Name != rec.GetAssignedTenant()) {
+ auto tenant = slot->AssignedTenant;
+ DetachSlot(slot, ctx);
+ UpdateTenant(tenant, ctx);
+ updated = true;
+ }
+
+ if (rec.GetAssignedTenant()
+ && (!slot->AssignedTenant || slot->AssignedTenant->Name != rec.GetAssignedTenant())) {
+ auto tenant = MaybeAddTenant(rec.GetAssignedTenant());
+ AttachSlot(slot, tenant, rec.GetLabel(), ctx);
+ UpdateTenant(tenant, ctx);
+ ready = tenant->LastStatus == TEvLocal::TEvTenantStatus::STARTED;
+ updated = true;
+ }
+
+ if (updated)
+ SendStatusUpdates(ctx);
+
+ if (ready) {
+ SendSlotStatus(slot, NKikimrTenantPool::SUCCESS, "", ctx);
+ ProcessPendingActions({slot}, ctx);
+ }
+ }
+
+ void Bootstrap(const TActorContext &ctx) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "Bootstrap");
+
+ SubscribeForConfig(ctx);
+
+ auto domain = AppData(ctx)->DomainsInfo->GetDomainByName(DomainName);
+ Y_VERIFY(domain);
TenantSlotBroker.TabletId = MakeTenantSlotBrokerID(domain->DefaultStateStorageGroup);
-
- for (auto &pr : Config->StaticSlots) {
- TTenantInfo::TPtr tenant = new TTenantInfo(pr.second.GetTenantName());
- tenant->StaticResourceLimit = pr.second.GetResourceLimit();
- tenant->HasStaticSlot = true;
- Tenants.emplace(tenant->Name, tenant);
- }
-
- for (auto &pr : Config->DynamicSlots) {
- TDynamicSlotInfo::TPtr slot = new TDynamicSlotInfo;
- slot->Id = pr.second.GetId();
- slot->Type = pr.second.GetType();
- slot->ResourceLimit = pr.second.GetResourceLimit();
- auto &tenantName = pr.second.GetTenantName();
- if (tenantName) {
- auto tenant = MaybeAddTenant(tenantName);
- AttachSlot(slot, tenant, Config->DynamicSlotLabel, ctx);
- }
- DynamicSlots.emplace(slot->Id, slot);
-
- LOG_NOTICE_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "registered dynamic slot '" << slot->Id
- << "' (type: " << slot->Type << " resources: "
- << slot->ResourceLimit.ShortDebugString() << ")");
- }
-
- for (auto &pr : Tenants)
- UpdateTenant(pr.second, ctx);
-
- if (!DynamicSlots.empty())
- TryToRegister(ctx);
-
- SendStatusUpdates(ctx);
-
- Become(&TThis::StateWork);
- }
-
- void SubscribeForConfig(const TActorContext &ctx)
- {
- auto kind = (ui32)NKikimrConsole::TConfigItem::MonitoringConfigItem;
- ctx.Send(MakeConfigsDispatcherID(ctx.SelfID.NodeId()),
- new TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest(kind));
- }
-
- void ApplyConfig(const NKikimrConfig::TMonitoringConfig &config,
- const TActorContext &ctx)
- {
- auto &staticSlotLabel = config.GetDatabaseLabels().GetStaticSlotLabelValue();
- auto &dynamicSlotLabel = config.GetDatabaseLabels().GetDynamicSlotLabelValue();
- bool modified = false;
-
- if (Config->StaticSlotLabel != staticSlotLabel) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "static slot label modified from "
- << Config->StaticSlotLabel << " to " << staticSlotLabel);
- if (Config->StaticSlots.size())
- modified = true;
- Config->StaticSlotLabel = staticSlotLabel;
- }
-
- if (Config->DynamicSlotLabel != dynamicSlotLabel) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "dynamic slot label modified from "
- << Config->DynamicSlotLabel << " to " << dynamicSlotLabel);
- for (auto &pr : DynamicSlots) {
- if (pr.second->Label == Config->DynamicSlotLabel) {
- pr.second->Label = dynamicSlotLabel;
- modified = true;
- }
- }
- Config->DynamicSlotLabel = dynamicSlotLabel;
- }
-
- if (modified)
- SendStatusUpdates(ctx);
- }
-
- void HandlePoison(const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "HandlePoison");
- Die(ctx);
- }
-
+
+ for (auto &pr : Config->StaticSlots) {
+ TTenantInfo::TPtr tenant = new TTenantInfo(pr.second.GetTenantName());
+ tenant->StaticResourceLimit = pr.second.GetResourceLimit();
+ tenant->HasStaticSlot = true;
+ Tenants.emplace(tenant->Name, tenant);
+ }
+
+ for (auto &pr : Config->DynamicSlots) {
+ TDynamicSlotInfo::TPtr slot = new TDynamicSlotInfo;
+ slot->Id = pr.second.GetId();
+ slot->Type = pr.second.GetType();
+ slot->ResourceLimit = pr.second.GetResourceLimit();
+ auto &tenantName = pr.second.GetTenantName();
+ if (tenantName) {
+ auto tenant = MaybeAddTenant(tenantName);
+ AttachSlot(slot, tenant, Config->DynamicSlotLabel, ctx);
+ }
+ DynamicSlots.emplace(slot->Id, slot);
+
+ LOG_NOTICE_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "registered dynamic slot '" << slot->Id
+ << "' (type: " << slot->Type << " resources: "
+ << slot->ResourceLimit.ShortDebugString() << ")");
+ }
+
+ for (auto &pr : Tenants)
+ UpdateTenant(pr.second, ctx);
+
+ if (!DynamicSlots.empty())
+ TryToRegister(ctx);
+
+ SendStatusUpdates(ctx);
+
+ Become(&TThis::StateWork);
+ }
+
+ void SubscribeForConfig(const TActorContext &ctx)
+ {
+ auto kind = (ui32)NKikimrConsole::TConfigItem::MonitoringConfigItem;
+ ctx.Send(MakeConfigsDispatcherID(ctx.SelfID.NodeId()),
+ new TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest(kind));
+ }
+
+ void ApplyConfig(const NKikimrConfig::TMonitoringConfig &config,
+ const TActorContext &ctx)
+ {
+ auto &staticSlotLabel = config.GetDatabaseLabels().GetStaticSlotLabelValue();
+ auto &dynamicSlotLabel = config.GetDatabaseLabels().GetDynamicSlotLabelValue();
+ bool modified = false;
+
+ if (Config->StaticSlotLabel != staticSlotLabel) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "static slot label modified from "
+ << Config->StaticSlotLabel << " to " << staticSlotLabel);
+ if (Config->StaticSlots.size())
+ modified = true;
+ Config->StaticSlotLabel = staticSlotLabel;
+ }
+
+ if (Config->DynamicSlotLabel != dynamicSlotLabel) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "dynamic slot label modified from "
+ << Config->DynamicSlotLabel << " to " << dynamicSlotLabel);
+ for (auto &pr : DynamicSlots) {
+ if (pr.second->Label == Config->DynamicSlotLabel) {
+ pr.second->Label = dynamicSlotLabel;
+ modified = true;
+ }
+ }
+ Config->DynamicSlotLabel = dynamicSlotLabel;
+ }
+
+ if (modified)
+ SendStatusUpdates(ctx);
+ }
+
+ void HandlePoison(const TActorContext &ctx) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "HandlePoison");
+ Die(ctx);
+ }
+
void Handle(TEvents::TEvSubscribe::TPtr &ev, const TActorContext &ctx) {
Y_UNUSED(ctx);
StatusSubscribers.insert(ev->Sender);
@@ -508,160 +508,160 @@ public:
StatusSubscribers.erase(ev->Sender);
}
- void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx)
- {
- auto &rec = ev->Get()->Record;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "Got new monitoring config: "
- << rec.GetConfig().ShortDebugString());
-
- ApplyConfig(rec.GetConfig().GetMonitoringConfig(), ctx);
-
- auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
-
- LOG_TRACE_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "Send TEvConfigNotificationResponse: "
- << resp->Record.ShortDebugString());
-
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
- }
-
- void Handle(TEvLocal::TEvTenantStatus::TPtr &ev, const TActorContext &ctx)
- {
- auto tenant = Tenants[ev->Get()->TenantName];
- Y_VERIFY(tenant, "status for unknown tenant");
- Y_VERIFY(!tenant->HasStaticSlot || ev->Get()->Status == TEvLocal::TEvTenantStatus::STARTED,
+ void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx)
+ {
+ auto &rec = ev->Get()->Record;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "Got new monitoring config: "
+ << rec.GetConfig().ShortDebugString());
+
+ ApplyConfig(rec.GetConfig().GetMonitoringConfig(), ctx);
+
+ auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
+
+ LOG_TRACE_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "Send TEvConfigNotificationResponse: "
+ << resp->Record.ShortDebugString());
+
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+ }
+
+ void Handle(TEvLocal::TEvTenantStatus::TPtr &ev, const TActorContext &ctx)
+ {
+ auto tenant = Tenants[ev->Get()->TenantName];
+ Y_VERIFY(tenant, "status for unknown tenant");
+ Y_VERIFY(!tenant->HasStaticSlot || ev->Get()->Status == TEvLocal::TEvTenantStatus::STARTED,
"Cannot start static tenant %s: %s", ev->Get()->TenantName.data(), ev->Get()->Error.data());
-
+
bool modified = false;
bool processPendingActions = false;
TTenantInfo::EState state = tenant->State;
- tenant->LastStatus = ev->Get()->Status;
- THashSet<TDynamicSlotInfo::TPtr, TPtrHash> toProcess = tenant->AssignedSlots;
- switch(ev->Get()->Status) {
- case TEvLocal::TEvTenantStatus::STARTED:
+ tenant->LastStatus = ev->Get()->Status;
+ THashSet<TDynamicSlotInfo::TPtr, TPtrHash> toProcess = tenant->AssignedSlots;
+ switch(ev->Get()->Status) {
+ case TEvLocal::TEvTenantStatus::STARTED:
state = TTenantInfo::EState::TENANT_OK;
- if (!tenant->HasStaticSlot && !tenant->AssignedSlots.size()) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "started tenant " << tenant->Name
- << " which should be stopped");
- UpdateTenant(tenant, ctx);
- } else if (!tenant->CompareLimit(ev->Get()->ResourceLimit)) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "started tenant " << tenant->Name
- << " has wrong resource limit");
- UpdateTenant(tenant, ctx);
- } else {
- LOG_NOTICE_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "started tenant " << tenant->Name);
- if (tenant->Attributes != ev->Get()->Attributes) {
- tenant->Attributes = std::move(ev->Get()->Attributes);
+ if (!tenant->HasStaticSlot && !tenant->AssignedSlots.size()) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "started tenant " << tenant->Name
+ << " which should be stopped");
+ UpdateTenant(tenant, ctx);
+ } else if (!tenant->CompareLimit(ev->Get()->ResourceLimit)) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "started tenant " << tenant->Name
+ << " has wrong resource limit");
+ UpdateTenant(tenant, ctx);
+ } else {
+ LOG_NOTICE_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "started tenant " << tenant->Name);
+ if (tenant->Attributes != ev->Get()->Attributes) {
+ tenant->Attributes = std::move(ev->Get()->Attributes);
modified = true;
- }
+ }
if (tenant->DomainKey != ev->Get()->DomainKey) {
tenant->DomainKey = ev->Get()->DomainKey;
modified = true;
}
- SendTenantStatus(tenant, NKikimrTenantPool::SUCCESS, ctx);
+ SendTenantStatus(tenant, NKikimrTenantPool::SUCCESS, ctx);
processPendingActions = true;
- }
- break;
- case TEvLocal::TEvTenantStatus::STOPPED:
+ }
+ break;
+ case TEvLocal::TEvTenantStatus::STOPPED:
state = TTenantInfo::EState::TENANT_OK;
- if (tenant->AssignedSlots.size()) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "stopped tenant " << tenant->Name
- << " which should be started");
- UpdateTenant(tenant, ctx);
- } else {
- LOG_NOTICE_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "stopped tenant " << tenant->Name);
- }
- break;
- case TEvLocal::TEvTenantStatus::UNKNOWN_TENANT:
+ if (tenant->AssignedSlots.size()) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "stopped tenant " << tenant->Name
+ << " which should be started");
+ UpdateTenant(tenant, ctx);
+ } else {
+ LOG_NOTICE_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "stopped tenant " << tenant->Name);
+ }
+ break;
+ case TEvLocal::TEvTenantStatus::UNKNOWN_TENANT:
modified = true;
state = TTenantInfo::EState::TENANT_UNKNOWN;
- LOG_ERROR_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "couldn't start unknown tenant "
- << tenant->Name);
- SendTenantStatus(tenant, NKikimrTenantPool::UNKNOWN_TENANT,
- ev->Get()->Error, ctx);
- DetachAllSlots(tenant, ctx);
+ LOG_ERROR_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "couldn't start unknown tenant "
+ << tenant->Name);
+ SendTenantStatus(tenant, NKikimrTenantPool::UNKNOWN_TENANT,
+ ev->Get()->Error, ctx);
+ DetachAllSlots(tenant, ctx);
processPendingActions = true;
break;
}
if (modified || tenant->State != state) {
tenant->State = state;
- SendStatusUpdates(ctx);
+ SendStatusUpdates(ctx);
}
if (processPendingActions) {
- ProcessPendingActions(toProcess, ctx);
- }
- }
-
- void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) {
- TEvTabletPipe::TEvClientConnected *msg = ev->Get();
+ ProcessPendingActions(toProcess, ctx);
+ }
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) {
+ TEvTabletPipe::TEvClientConnected *msg = ev->Get();
if (msg->ClientId != TenantSlotBroker.Pipe)
- return;
- if (msg->Status == NKikimrProto::OK)
- return;
- HandlePipeDestroyed(ctx);
- }
-
- void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx) {
- TEvTabletPipe::TEvClientDestroyed *msg = ev->Get();
+ return;
+ if (msg->Status == NKikimrProto::OK)
+ return;
+ HandlePipeDestroyed(ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr &ev, const TActorContext &ctx) {
+ TEvTabletPipe::TEvClientDestroyed *msg = ev->Get();
if (msg->ClientId != TenantSlotBroker.Pipe)
- return;
- HandlePipeDestroyed(ctx);
- }
-
- void Handle(TEvTenantPool::TEvGetStatus::TPtr &ev, const TActorContext &ctx)
- {
+ return;
+ HandlePipeDestroyed(ctx);
+ }
+
+ void Handle(TEvTenantPool::TEvGetStatus::TPtr &ev, const TActorContext &ctx)
+ {
auto& rec = ev->Get()->Record;
auto event = BuildStatusEvent(rec.GetListStaticSlots());
ctx.Send(ev->Sender, std::move(event), 0, ev->Cookie);
- }
-
- void Handle(TEvTenantPool::TEvConfigureSlot::TPtr &ev, const TActorContext &ctx)
- {
- auto &rec = ev->Get()->Record;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << ev->Sender << " configures slot '" << rec.GetSlotId()
- << "' for tenant '" << rec.GetAssignedTenant() << "'");
-
+ }
+
+ void Handle(TEvTenantPool::TEvConfigureSlot::TPtr &ev, const TActorContext &ctx)
+ {
+ auto &rec = ev->Get()->Record;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << ev->Sender << " configures slot '" << rec.GetSlotId()
+ << "' for tenant '" << rec.GetAssignedTenant() << "'");
+
if (ev->Sender != TenantSlotBroker.ActorId) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "configure sender " << ev->Sender << " doesn't own pool");
- SendConfigureError(ev, rec.GetSlotId(), NKikimrTenantPool::NOT_OWNER,
- "pool is not owned by request sender", ctx);
- return;
- }
-
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "configure sender " << ev->Sender << " doesn't own pool");
+ SendConfigureError(ev, rec.GetSlotId(), NKikimrTenantPool::NOT_OWNER,
+ "pool is not owned by request sender", ctx);
+ return;
+ }
+
if (!DynamicSlots.contains(rec.GetSlotId())) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
- LogPrefix << "got configure for unknown slot " << rec.GetSlotId());
- SendConfigureError(ev, rec.GetSlotId(), NKikimrTenantPool::UNKNOWN_SLOT,
- "unknown slot id", ctx);
- return;
- }
-
- auto slot = DynamicSlots[rec.GetSlotId()];
- if (slot->ActiveAction) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LogPrefix << "got configure for unknown slot " << rec.GetSlotId());
+ SendConfigureError(ev, rec.GetSlotId(), NKikimrTenantPool::UNKNOWN_SLOT,
+ "unknown slot id", ctx);
+ return;
+ }
+
+ auto slot = DynamicSlots[rec.GetSlotId()];
+ if (slot->ActiveAction) {
slot->PendingActions.emplace(ev.Release());
- return;
- }
-
- slot->ActiveAction = ev.Release();
- ProcessActiveAction(slot, ctx);
- }
-
- void Handle(TEvTenantPool::TEvTakeOwnership::TPtr &ev, const TActorContext &ctx)
- {
+ return;
+ }
+
+ slot->ActiveAction = ev.Release();
+ ProcessActiveAction(slot, ctx);
+ }
+
+ void Handle(TEvTenantPool::TEvTakeOwnership::TPtr &ev, const TActorContext &ctx)
+ {
const auto& record = ev->Get()->Record;
const bool isOldStyle = !record.HasGeneration() && !record.HasSeqNo();
const ui64 generation = isOldStyle ? 0 : record.GetGeneration();
@@ -687,174 +687,174 @@ public:
}
TenantSlotBroker.ActorId = ev->Sender;
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_POOL,
LogPrefix << TenantSlotBroker.ActorId << " took ownership");
- }
-
+ }
+
auto event = BuildStatusEvent();
ctx.Send(ev->Sender, std::move(event), 0, ev->Cookie);
- }
- }
-
- TString EventToString(IEventHandle *ev) {
- if (!ev)
- return "no event";
- return Sprintf("%" PRIx32 " event %s", ev->GetTypeRewrite(),
+ }
+ }
+
+ TString EventToString(IEventHandle *ev) {
+ if (!ev)
+ return "no event";
+ return Sprintf("%" PRIx32 " event %s", ev->GetTypeRewrite(),
ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized");
- }
-
- void Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx)
- {
- TStringStream str;
- str << NMonitoring::HTTPOKHTML;
- HTML(str) {
- PRE() {
- str << "Tenant pool for " << DomainName << Endl
- << "LocalID: " << LocalID << Endl
+ }
+
+ void Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx)
+ {
+ TStringStream str;
+ str << NMonitoring::HTTPOKHTML;
+ HTML(str) {
+ PRE() {
+ str << "Tenant pool for " << DomainName << Endl
+ << "LocalID: " << LocalID << Endl
<< "TenantSlotBroker:" << Endl
<< " TabletId: " << TenantSlotBroker.TabletId << Endl
<< " Generation: " << TenantSlotBroker.Generation << Endl
<< " ActorId: " << TenantSlotBroker.ActorId << Endl << Endl;
-
- str << "Config:" << Endl
- << " IsEnabled: " << Config->IsEnabled << Endl
+
+ str << "Config:" << Endl
+ << " IsEnabled: " << Config->IsEnabled << Endl
<< " NodeType: " << Config->NodeType << Endl
- << " StaticSlotLabel: " << Config->StaticSlotLabel << Endl
- << " DynamicSlotLabel: " << Config->DynamicSlotLabel << Endl
- << " StaticSlots:" << Endl;
- for (auto &pr : Config->StaticSlots)
- str << " " << pr.second.ShortDebugString() << Endl;
- str << " DynamicSlots:" << Endl;
- for (auto &pr : Config->DynamicSlots)
- str << " " << pr.second.ShortDebugString() << Endl;
-
- str << "Dynamic slots:" << Endl;
- for (auto &pr : DynamicSlots) {
- str << " - ID: " << pr.second->Id << Endl
- << " Type: " << pr.second->Type << Endl
- << " AssignedTenant: "
- << (pr.second->AssignedTenant ? pr.second->AssignedTenant->Name : TString()) << Endl
- << " ResourceLimit: " << pr.second->ResourceLimit.ShortDebugString() << Endl
- << " ActiveAction: " << EventToString(pr.second->ActiveAction.Get()) << Endl;
-
- str << " PendingActions: " << pr.second->PendingActions.size() << Endl;
- }
- str << Endl;
-
- str << "Tenants:" << Endl;
- for (auto &pr : Tenants) {
- str << " - Name: " << pr.second->Name << Endl
- << " HasStaticSlot: " << pr.second->HasStaticSlot << Endl
- << " StaticResourceLimit: " << pr.second->StaticResourceLimit.ShortDebugString() << Endl
- << " ResourceLimit: " << pr.second->ResourceLimit.ShortDebugString() << Endl
+ << " StaticSlotLabel: " << Config->StaticSlotLabel << Endl
+ << " DynamicSlotLabel: " << Config->DynamicSlotLabel << Endl
+ << " StaticSlots:" << Endl;
+ for (auto &pr : Config->StaticSlots)
+ str << " " << pr.second.ShortDebugString() << Endl;
+ str << " DynamicSlots:" << Endl;
+ for (auto &pr : Config->DynamicSlots)
+ str << " " << pr.second.ShortDebugString() << Endl;
+
+ str << "Dynamic slots:" << Endl;
+ for (auto &pr : DynamicSlots) {
+ str << " - ID: " << pr.second->Id << Endl
+ << " Type: " << pr.second->Type << Endl
+ << " AssignedTenant: "
+ << (pr.second->AssignedTenant ? pr.second->AssignedTenant->Name : TString()) << Endl
+ << " ResourceLimit: " << pr.second->ResourceLimit.ShortDebugString() << Endl
+ << " ActiveAction: " << EventToString(pr.second->ActiveAction.Get()) << Endl;
+
+ str << " PendingActions: " << pr.second->PendingActions.size() << Endl;
+ }
+ str << Endl;
+
+ str << "Tenants:" << Endl;
+ for (auto &pr : Tenants) {
+ str << " - Name: " << pr.second->Name << Endl
+ << " HasStaticSlot: " << pr.second->HasStaticSlot << Endl
+ << " StaticResourceLimit: " << pr.second->StaticResourceLimit.ShortDebugString() << Endl
+ << " ResourceLimit: " << pr.second->ResourceLimit.ShortDebugString() << Endl
<< " LastStatus: " << (int)pr.second->LastStatus << Endl
<< " State: " << (int)pr.second->State << Endl
<< " DomainKey: " << pr.second->DomainKey << Endl;
-
- str << " AssignedSlots:" << Endl;
- for (auto &slot : pr.second->AssignedSlots)
- str << " " << slot->Id << Endl;
- }
- }
- }
-
- ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str(), 0,
- NMon::IEvHttpInfoRes::EContentType::Custom));
- }
-
- STFUNC(StateWork) {
- TRACE_EVENT(NKikimrServices::TENANT_POOL);
- switch (ev->GetTypeRewrite()) {
- CFunc(TEvents::TSystem::PoisonPill, HandlePoison);
+
+ str << " AssignedSlots:" << Endl;
+ for (auto &slot : pr.second->AssignedSlots)
+ str << " " << slot->Id << Endl;
+ }
+ }
+ }
+
+ ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str(), 0,
+ NMon::IEvHttpInfoRes::EContentType::Custom));
+ }
+
+ STFUNC(StateWork) {
+ TRACE_EVENT(NKikimrServices::TENANT_POOL);
+ switch (ev->GetTypeRewrite()) {
+ CFunc(TEvents::TSystem::PoisonPill, HandlePoison);
HFuncTraced(TEvents::TEvSubscribe, Handle);
HFuncTraced(TEvents::TEvUnsubscribe, Handle);
- HFuncTraced(TEvConsole::TEvConfigNotificationRequest, Handle);
- HFuncTraced(TEvLocal::TEvTenantStatus, Handle);
- HFuncTraced(TEvTabletPipe::TEvClientConnected, Handle);
- HFuncTraced(TEvTabletPipe::TEvClientDestroyed, Handle);
- HFuncTraced(TEvTenantPool::TEvGetStatus, Handle);
- HFuncTraced(TEvTenantPool::TEvConfigureSlot, Handle);
- HFuncTraced(TEvTenantPool::TEvTakeOwnership, Handle);
- HFuncTraced(NMon::TEvHttpInfo, Handle);
- IgnoreFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ HFuncTraced(TEvConsole::TEvConfigNotificationRequest, Handle);
+ HFuncTraced(TEvLocal::TEvTenantStatus, Handle);
+ HFuncTraced(TEvTabletPipe::TEvClientConnected, Handle);
+ HFuncTraced(TEvTabletPipe::TEvClientDestroyed, Handle);
+ HFuncTraced(TEvTenantPool::TEvGetStatus, Handle);
+ HFuncTraced(TEvTenantPool::TEvConfigureSlot, Handle);
+ HFuncTraced(TEvTenantPool::TEvTakeOwnership, Handle);
+ HFuncTraced(NMon::TEvHttpInfo, Handle);
+ IgnoreFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-};
-
-class TTenantPool : public TActorBootstrapped<TTenantPool> {
- TTenantPoolConfig::TPtr Config;
+ break;
+ }
+ }
+};
+
+class TTenantPool : public TActorBootstrapped<TTenantPool> {
+ TTenantPoolConfig::TPtr Config;
TActorId LocalID;
THashMap<TString, TActorId> DomainTenantPools;
- const TString DomainPrefix;
-
-public:
+ const TString DomainPrefix;
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::TENANT_POOL_ACTOR;
- }
-
- TTenantPool(TTenantPoolConfig::TPtr config)
- : Config(config)
- , DomainPrefix("/domain/")
- {
- }
-
- void HandlePoison(const TActorContext &ctx) {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_POOL, "TTenantPool: HandlePoison");
- if (LocalID)
- ctx.Send(LocalID, new TEvents::TEvPoisonPill());
- for (auto &pr : DomainTenantPools)
- ctx.Send(pr.second, new TEvents::TEvPoisonPill());
- Die(ctx);
- }
-
- void Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx)
- {
- NMon::TEvHttpInfo *msg = ev->Get();
- // Check for index page.
+ }
+
+ TTenantPool(TTenantPoolConfig::TPtr config)
+ : Config(config)
+ , DomainPrefix("/domain/")
+ {
+ }
+
+ void HandlePoison(const TActorContext &ctx) {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_POOL, "TTenantPool: HandlePoison");
+ if (LocalID)
+ ctx.Send(LocalID, new TEvents::TEvPoisonPill());
+ for (auto &pr : DomainTenantPools)
+ ctx.Send(pr.second, new TEvents::TEvPoisonPill());
+ Die(ctx);
+ }
+
+ void Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx)
+ {
+ NMon::TEvHttpInfo *msg = ev->Get();
+ // Check for index page.
if (msg->Request.GetPathInfo() == "" || msg->Request.GetPathInfo() == "/") {
- TStringStream str;
- if (!DomainTenantPools.size()) {
- str << "No domains are handled";
- } else if (DomainTenantPools.size() == 1) {
- ctx.Send(ev->Forward(DomainTenantPools.begin()->second));
- return;
- } else {
- for (auto &pr : DomainTenantPools) {
- str << "<br/><a href=\"" << DomainPrefix << pr.first << "\">"
- << pr.first << "</a>";
- }
- }
- ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str(), 0,
- NMon::IEvHttpInfoRes::EContentType::Html));
+ TStringStream str;
+ if (!DomainTenantPools.size()) {
+ str << "No domains are handled";
+ } else if (DomainTenantPools.size() == 1) {
+ ctx.Send(ev->Forward(DomainTenantPools.begin()->second));
+ return;
+ } else {
+ for (auto &pr : DomainTenantPools) {
+ str << "<br/><a href=\"" << DomainPrefix << pr.first << "\">"
+ << pr.first << "</a>";
+ }
+ }
+ ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str(), 0,
+ NMon::IEvHttpInfoRes::EContentType::Html));
} else if (msg->Request.GetPathInfo().StartsWith(DomainPrefix)) {
TString domain{msg->Request.GetPathInfo().substr(DomainPrefix.size())};
if (!DomainTenantPools.contains(domain)) {
- ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes("Unknown domain " + domain, 0,
- NMon::IEvHttpInfoRes::EContentType::Html));
- } else {
- ctx.Send(ev->Forward(DomainTenantPools.find(domain)->second));
- }
- } else {
- ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes("Bad link", 0,
- NMon::IEvHttpInfoRes::EContentType::Html));
- }
- }
-
- TTenantPoolConfig::TPtr CreateDomainConfig()
- {
- TTenantPoolConfig::TPtr res = new TTenantPoolConfig;
- res->NodeType = Config->NodeType;
- res->StaticSlotLabel = Config->StaticSlotLabel;
- res->DynamicSlotLabel = Config->DynamicSlotLabel;
- return res;
- }
-
+ ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes("Unknown domain " + domain, 0,
+ NMon::IEvHttpInfoRes::EContentType::Html));
+ } else {
+ ctx.Send(ev->Forward(DomainTenantPools.find(domain)->second));
+ }
+ } else {
+ ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes("Bad link", 0,
+ NMon::IEvHttpInfoRes::EContentType::Html));
+ }
+ }
+
+ TTenantPoolConfig::TPtr CreateDomainConfig()
+ {
+ TTenantPoolConfig::TPtr res = new TTenantPoolConfig;
+ res->NodeType = Config->NodeType;
+ res->StaticSlotLabel = Config->StaticSlotLabel;
+ res->DynamicSlotLabel = Config->DynamicSlotLabel;
+ return res;
+ }
+
void Handle(TEvents::TEvSubscribe::TPtr &ev, const TActorContext &ctx) {
for (auto &pr : DomainTenantPools)
ctx.Send(new IEventHandle(pr.second, ev->Sender, new TEvents::TEvSubscribe()));
@@ -870,151 +870,151 @@ public:
ctx.Send(ev->Forward(LocalID));
}
- void Bootstrap(const TActorContext &ctx) {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_POOL, "TTenantPool::Bootstrap");
-
- NActors::TMon *mon = AppData(ctx)->Mon;
- if (mon) {
- NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors");
- mon->RegisterActorPage(actorsMonPage, "tenant_pool", "Tenant Pool", false, ctx.ExecutorThread.ActorSystem, ctx.SelfID);
- }
-
- if (!Config->IsEnabled) {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_POOL, "TenantPool is disabled");
- return;
- }
-
- auto *local = CreateLocal(Config->LocalConfig.Get());
- LocalID = ctx.ExecutorThread.RegisterActor(local, TMailboxType::ReadAsFilled, 0);
- ctx.ExecutorThread.ActorSystem->RegisterLocalService(MakeLocalID(SelfId().NodeId()), LocalID);
-
- THashMap<TString, TTenantPoolConfig::TPtr> domainConfigs;
-
- for (auto &pr : Config->StaticSlots) {
- TString domain = TString(ExtractDomain(pr.second.GetTenantName()));
- Y_VERIFY(domain, "cannot extract domain from tenant name");
+ void Bootstrap(const TActorContext &ctx) {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_POOL, "TTenantPool::Bootstrap");
+
+ NActors::TMon *mon = AppData(ctx)->Mon;
+ if (mon) {
+ NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors");
+ mon->RegisterActorPage(actorsMonPage, "tenant_pool", "Tenant Pool", false, ctx.ExecutorThread.ActorSystem, ctx.SelfID);
+ }
+
+ if (!Config->IsEnabled) {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_POOL, "TenantPool is disabled");
+ return;
+ }
+
+ auto *local = CreateLocal(Config->LocalConfig.Get());
+ LocalID = ctx.ExecutorThread.RegisterActor(local, TMailboxType::ReadAsFilled, 0);
+ ctx.ExecutorThread.ActorSystem->RegisterLocalService(MakeLocalID(SelfId().NodeId()), LocalID);
+
+ THashMap<TString, TTenantPoolConfig::TPtr> domainConfigs;
+
+ for (auto &pr : Config->StaticSlots) {
+ TString domain = TString(ExtractDomain(pr.second.GetTenantName()));
+ Y_VERIFY(domain, "cannot extract domain from tenant name");
if (!domainConfigs.contains(domain))
- domainConfigs[domain] = CreateDomainConfig();
- domainConfigs[domain]->AddStaticSlot(pr.second);
- }
-
- for (auto &pr : Config->DynamicSlots) {
- TString domain = pr.second.GetDomainName();
- Y_VERIFY(domain, "empty domain for dynamic slot");
- Y_VERIFY(pr.second.GetType(), "empty type for dynamic slot");
+ domainConfigs[domain] = CreateDomainConfig();
+ domainConfigs[domain]->AddStaticSlot(pr.second);
+ }
+
+ for (auto &pr : Config->DynamicSlots) {
+ TString domain = pr.second.GetDomainName();
+ Y_VERIFY(domain, "empty domain for dynamic slot");
+ Y_VERIFY(pr.second.GetType(), "empty type for dynamic slot");
if (!domainConfigs.contains(domain))
- domainConfigs[domain] = CreateDomainConfig();
- domainConfigs[domain]->AddDynamicSlot(pr.second);
- }
-
- auto domains = AppData(ctx)->DomainsInfo;
- for (auto &pr : domainConfigs) {
- auto *domain = domains->GetDomainByName(pr.first);
+ domainConfigs[domain] = CreateDomainConfig();
+ domainConfigs[domain]->AddDynamicSlot(pr.second);
+ }
+
+ auto domains = AppData(ctx)->DomainsInfo;
+ for (auto &pr : domainConfigs) {
+ auto *domain = domains->GetDomainByName(pr.first);
Y_VERIFY(domain, "unknown domain %s in Tenant Pool config", pr.first.data());
auto aid = ctx.RegisterWithSameMailbox(new TDomainTenantPool(pr.first, LocalID, pr.second));
- DomainTenantPools[pr.first] = aid;
- auto serviceId = MakeTenantPoolID(SelfId().NodeId(), domain->DomainUid);
- ctx.ExecutorThread.ActorSystem->RegisterLocalService(serviceId, aid);
- }
-
- Become(&TThis::StateWork);
- }
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- CFunc(TEvents::TSystem::PoisonPill, HandlePoison);
+ DomainTenantPools[pr.first] = aid;
+ auto serviceId = MakeTenantPoolID(SelfId().NodeId(), domain->DomainUid);
+ ctx.ExecutorThread.ActorSystem->RegisterLocalService(serviceId, aid);
+ }
+
+ Become(&TThis::StateWork);
+ }
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ CFunc(TEvents::TSystem::PoisonPill, HandlePoison);
HFunc(TEvents::TEvSubscribe, Handle);
HFunc(TEvents::TEvUnsubscribe, Handle);
- HFunc(NMon::TEvHttpInfo, Handle);
+ HFunc(NMon::TEvHttpInfo, Handle);
HFunc(TEvLocal::TEvLocalDrainNode, Handle);
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-};
-
-} // anonymous namespace
-
-TTenantPoolConfig::TTenantPoolConfig(TLocalConfig::TPtr localConfig)
- : TTenantPoolConfig(NKikimrTenantPool::TTenantPoolConfig(),
- NKikimrConfig::TMonitoringConfig(),
- localConfig)
-{
-}
-
-TTenantPoolConfig::TTenantPoolConfig(const NKikimrTenantPool::TTenantPoolConfig &config,
- const NKikimrConfig::TMonitoringConfig &monCfg,
- TLocalConfig::TPtr localConfig)
- : LocalConfig(localConfig)
-{
- for (auto &slot : config.GetSlots()) {
- if (slot.GetIsDynamic())
- AddDynamicSlot(slot);
- else
- AddStaticSlot(slot);
- }
- IsEnabled = config.GetIsEnabled();
- NodeType = config.GetNodeType();
-
- StaticSlotLabel = monCfg.GetDatabaseLabels().GetStaticSlotLabelValue();
- DynamicSlotLabel = monCfg.GetDatabaseLabels().GetDynamicSlotLabelValue();
-}
-
-TTenantPoolConfig::TTenantPoolConfig(const NKikimrTenantPool::TTenantPoolConfig &config,
- TLocalConfig::TPtr localConfig)
- : TTenantPoolConfig(config,
- NKikimrConfig::TMonitoringConfig(),
- localConfig)
-{
-}
-
-void TTenantPoolConfig::AddStaticSlot(const NKikimrTenantPool::TSlotConfig &slot)
-{
- TString name = CanonizePath(slot.GetTenantName());
- Y_VERIFY(IsEnabled);
+ break;
+ }
+ }
+};
+
+} // anonymous namespace
+
+TTenantPoolConfig::TTenantPoolConfig(TLocalConfig::TPtr localConfig)
+ : TTenantPoolConfig(NKikimrTenantPool::TTenantPoolConfig(),
+ NKikimrConfig::TMonitoringConfig(),
+ localConfig)
+{
+}
+
+TTenantPoolConfig::TTenantPoolConfig(const NKikimrTenantPool::TTenantPoolConfig &config,
+ const NKikimrConfig::TMonitoringConfig &monCfg,
+ TLocalConfig::TPtr localConfig)
+ : LocalConfig(localConfig)
+{
+ for (auto &slot : config.GetSlots()) {
+ if (slot.GetIsDynamic())
+ AddDynamicSlot(slot);
+ else
+ AddStaticSlot(slot);
+ }
+ IsEnabled = config.GetIsEnabled();
+ NodeType = config.GetNodeType();
+
+ StaticSlotLabel = monCfg.GetDatabaseLabels().GetStaticSlotLabelValue();
+ DynamicSlotLabel = monCfg.GetDatabaseLabels().GetDynamicSlotLabelValue();
+}
+
+TTenantPoolConfig::TTenantPoolConfig(const NKikimrTenantPool::TTenantPoolConfig &config,
+ TLocalConfig::TPtr localConfig)
+ : TTenantPoolConfig(config,
+ NKikimrConfig::TMonitoringConfig(),
+ localConfig)
+{
+}
+
+void TTenantPoolConfig::AddStaticSlot(const NKikimrTenantPool::TSlotConfig &slot)
+{
+ TString name = CanonizePath(slot.GetTenantName());
+ Y_VERIFY(IsEnabled);
Y_VERIFY(!StaticSlots.contains(name),
"two static slots for the same tenant '%s'", name.data());
- StaticSlots[name] = slot;
- StaticSlots[name].SetTenantName(name);
-}
-
-void TTenantPoolConfig::AddStaticSlot(const TString &tenant,
- const NKikimrTabletBase::TMetrics &limit)
-{
- NKikimrTenantPool::TSlotConfig slot;
- slot.SetTenantName(tenant);
- slot.SetIsDynamic(false);
- slot.MutableResourceLimit()->CopyFrom(limit);
- AddStaticSlot(slot);
-}
-
-void TTenantPoolConfig::AddDynamicSlot(const NKikimrTenantPool::TSlotConfig &slot)
-{
- Y_VERIFY(IsEnabled);
+ StaticSlots[name] = slot;
+ StaticSlots[name].SetTenantName(name);
+}
+
+void TTenantPoolConfig::AddStaticSlot(const TString &tenant,
+ const NKikimrTabletBase::TMetrics &limit)
+{
+ NKikimrTenantPool::TSlotConfig slot;
+ slot.SetTenantName(tenant);
+ slot.SetIsDynamic(false);
+ slot.MutableResourceLimit()->CopyFrom(limit);
+ AddStaticSlot(slot);
+}
+
+void TTenantPoolConfig::AddDynamicSlot(const NKikimrTenantPool::TSlotConfig &slot)
+{
+ Y_VERIFY(IsEnabled);
Y_VERIFY(!DynamicSlots.contains(slot.GetId()),
"two dynamic slots with the same id '%s'", slot.GetId().data());
- DynamicSlots[slot.GetId()] = slot;
- DynamicSlots[slot.GetId()].SetTenantName(CanonizePath(slot.GetTenantName()));
-}
-
-void TTenantPoolConfig::AddDynamicSlot(const TString &id, const TString &type, const TString &domain,
- const TString &tenant, const NKikimrTabletBase::TMetrics &limit)
-{
- NKikimrTenantPool::TSlotConfig slot;
- slot.SetId(id);
- slot.SetDomainName(domain);
- slot.SetTenantName(tenant);
- slot.SetIsDynamic(true);
- slot.SetType(type);
- slot.MutableResourceLimit()->CopyFrom(limit);
- AddDynamicSlot(slot);
-}
-
-IActor* CreateTenantPool(TTenantPoolConfig::TPtr config)
-{
- return new TTenantPool(config);
-}
-
-} // namespace NKikimr
+ DynamicSlots[slot.GetId()] = slot;
+ DynamicSlots[slot.GetId()].SetTenantName(CanonizePath(slot.GetTenantName()));
+}
+
+void TTenantPoolConfig::AddDynamicSlot(const TString &id, const TString &type, const TString &domain,
+ const TString &tenant, const NKikimrTabletBase::TMetrics &limit)
+{
+ NKikimrTenantPool::TSlotConfig slot;
+ slot.SetId(id);
+ slot.SetDomainName(domain);
+ slot.SetTenantName(tenant);
+ slot.SetIsDynamic(true);
+ slot.SetType(type);
+ slot.MutableResourceLimit()->CopyFrom(limit);
+ AddDynamicSlot(slot);
+}
+
+IActor* CreateTenantPool(TTenantPoolConfig::TPtr config)
+{
+ return new TTenantPool(config);
+}
+
+} // namespace NKikimr
diff --git a/ydb/core/mind/tenant_pool.h b/ydb/core/mind/tenant_pool.h
index 197f6f23004..0202ba78634 100644
--- a/ydb/core/mind/tenant_pool.h
+++ b/ydb/core/mind/tenant_pool.h
@@ -1,103 +1,103 @@
-#pragma once
-#include "defs.h"
-#include "local.h"
-
+#pragma once
+#include "defs.h"
+#include "local.h"
+
#include <ydb/core/protos/tenant_pool.pb.h>
-
-#include <util/generic/hash.h>
-#include <util/generic/ptr.h>
-
-namespace NKikimr {
-
-struct TEvTenantPool {
- enum EEv {
- EvGetStatus = EventSpaceBegin(TKikimrEvents::ES_TENANT_POOL),
- EvTenantPoolStatus,
- EvConfigureSlot,
- EvConfigureSlotResult,
- EvTakeOwnership,
- EvLostOwnership,
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_TENANT_POOL),
- "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_TENANT_POOL)");
-
- struct TEvGetStatus : public TEventPB<TEvGetStatus, NKikimrTenantPool::TGetStatus, EvGetStatus> {
- TEvGetStatus(bool listStatic = false)
- {
- Record.SetListStaticSlots(listStatic);
- }
- };
-
- struct TEvTenantPoolStatus : public TEventPB<TEvTenantPoolStatus, NKikimrTenantPool::TTenantPoolStatus, EvTenantPoolStatus> {};
-
- struct TEvConfigureSlot : public TEventPB<TEvConfigureSlot, NKikimrTenantPool::TConfigureSlot, EvConfigureSlot> {
- TEvConfigureSlot() {}
-
- TEvConfigureSlot(const TString &slotId, const TString &tenantName, const TString &label)
- {
- Record.SetSlotId(slotId);
- Record.SetAssignedTenant(tenantName);
- Record.SetLabel(label);
- }
- };
-
- struct TEvConfigureSlotResult : public TEventPB<TEvConfigureSlotResult, NKikimrTenantPool::TConfigureSlotResult, EvConfigureSlotResult> {};
-
+
+#include <util/generic/hash.h>
+#include <util/generic/ptr.h>
+
+namespace NKikimr {
+
+struct TEvTenantPool {
+ enum EEv {
+ EvGetStatus = EventSpaceBegin(TKikimrEvents::ES_TENANT_POOL),
+ EvTenantPoolStatus,
+ EvConfigureSlot,
+ EvConfigureSlotResult,
+ EvTakeOwnership,
+ EvLostOwnership,
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_TENANT_POOL),
+ "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_TENANT_POOL)");
+
+ struct TEvGetStatus : public TEventPB<TEvGetStatus, NKikimrTenantPool::TGetStatus, EvGetStatus> {
+ TEvGetStatus(bool listStatic = false)
+ {
+ Record.SetListStaticSlots(listStatic);
+ }
+ };
+
+ struct TEvTenantPoolStatus : public TEventPB<TEvTenantPoolStatus, NKikimrTenantPool::TTenantPoolStatus, EvTenantPoolStatus> {};
+
+ struct TEvConfigureSlot : public TEventPB<TEvConfigureSlot, NKikimrTenantPool::TConfigureSlot, EvConfigureSlot> {
+ TEvConfigureSlot() {}
+
+ TEvConfigureSlot(const TString &slotId, const TString &tenantName, const TString &label)
+ {
+ Record.SetSlotId(slotId);
+ Record.SetAssignedTenant(tenantName);
+ Record.SetLabel(label);
+ }
+ };
+
+ struct TEvConfigureSlotResult : public TEventPB<TEvConfigureSlotResult, NKikimrTenantPool::TConfigureSlotResult, EvConfigureSlotResult> {};
+
struct TEvTakeOwnership : public TEventPB<TEvTakeOwnership, NKikimrTenantPool::TTakeOwnership, EvTakeOwnership> {
TEvTakeOwnership() = default;
-
+
TEvTakeOwnership(ui64 generation, ui64 seqNo = Max<ui64>()) {
Record.SetGeneration(generation);
Record.SetSeqNo(seqNo);
}
};
- struct TEvLostOwnership : public TEventPB<TEvLostOwnership, NKikimrTenantPool::TLostOwnership, EvLostOwnership> {};
-};
-
-class TTenantPoolConfig : public TThrRefBase {
-public:
- using TPtr = TIntrusivePtr<TTenantPoolConfig>;
-
- TTenantPoolConfig(TLocalConfig::TPtr localConfig = nullptr);
- TTenantPoolConfig(const NKikimrTenantPool::TTenantPoolConfig &config,
- TLocalConfig::TPtr localConfig = nullptr);
- TTenantPoolConfig(const NKikimrTenantPool::TTenantPoolConfig &config,
- const NKikimrConfig::TMonitoringConfig &monCfg,
- TLocalConfig::TPtr localConfig = nullptr);
-
- void AddStaticSlot(const NKikimrTenantPool::TSlotConfig &slot);
- void AddStaticSlot(const TString &tenant,
- const NKikimrTabletBase::TMetrics &limit = NKikimrTabletBase::TMetrics());
- void AddDynamicSlot(const NKikimrTenantPool::TSlotConfig &slot);
- void AddDynamicSlot(const TString &id, const TString &type, const TString &domain,
- const TString &tenant = TString(),
- const NKikimrTabletBase::TMetrics &limit = NKikimrTabletBase::TMetrics());
-
- bool IsEnabled = true;
- TString NodeType;
- THashMap<TString, NKikimrTenantPool::TSlotConfig> StaticSlots;
- THashMap<TString, NKikimrTenantPool::TSlotConfig> DynamicSlots;
- TLocalConfig::TPtr LocalConfig;
- TString StaticSlotLabel;
- TString DynamicSlotLabel;
-};
-
-IActor* CreateTenantPool(TTenantPoolConfig::TPtr config);
-
+ struct TEvLostOwnership : public TEventPB<TEvLostOwnership, NKikimrTenantPool::TLostOwnership, EvLostOwnership> {};
+};
+
+class TTenantPoolConfig : public TThrRefBase {
+public:
+ using TPtr = TIntrusivePtr<TTenantPoolConfig>;
+
+ TTenantPoolConfig(TLocalConfig::TPtr localConfig = nullptr);
+ TTenantPoolConfig(const NKikimrTenantPool::TTenantPoolConfig &config,
+ TLocalConfig::TPtr localConfig = nullptr);
+ TTenantPoolConfig(const NKikimrTenantPool::TTenantPoolConfig &config,
+ const NKikimrConfig::TMonitoringConfig &monCfg,
+ TLocalConfig::TPtr localConfig = nullptr);
+
+ void AddStaticSlot(const NKikimrTenantPool::TSlotConfig &slot);
+ void AddStaticSlot(const TString &tenant,
+ const NKikimrTabletBase::TMetrics &limit = NKikimrTabletBase::TMetrics());
+ void AddDynamicSlot(const NKikimrTenantPool::TSlotConfig &slot);
+ void AddDynamicSlot(const TString &id, const TString &type, const TString &domain,
+ const TString &tenant = TString(),
+ const NKikimrTabletBase::TMetrics &limit = NKikimrTabletBase::TMetrics());
+
+ bool IsEnabled = true;
+ TString NodeType;
+ THashMap<TString, NKikimrTenantPool::TSlotConfig> StaticSlots;
+ THashMap<TString, NKikimrTenantPool::TSlotConfig> DynamicSlots;
+ TLocalConfig::TPtr LocalConfig;
+ TString StaticSlotLabel;
+ TString DynamicSlotLabel;
+};
+
+IActor* CreateTenantPool(TTenantPoolConfig::TPtr config);
+
inline TActorId MakeTenantPoolID(ui32 node = 0, ui32 domain = 0) {
- Y_VERIFY(domain < 32);
- char x[12] = { 't', 'e', 'n', 'a', 'n', 't', 'p', 'o', 'o', 'l' };
- x[10] = static_cast<char>(domain);
+ Y_VERIFY(domain < 32);
+ char x[12] = { 't', 'e', 'n', 'a', 'n', 't', 'p', 'o', 'o', 'l' };
+ x[10] = static_cast<char>(domain);
return TActorId(node, TStringBuf(x, 12));
-}
-
+}
+
inline TActorId MakeTenantPoolRootID() {
char x[12] = { 't', 'e', 'n', 'a', 'n', 't', 'p', 'o', 'o', 'l', 'r', 't' };
return TActorId(0, TStringBuf(x, 12));
}
-
-} // namespace NKikimr
+
+} // namespace NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker.cpp b/ydb/core/mind/tenant_slot_broker.cpp
index 8a5de6316c7..65f7a86328b 100644
--- a/ydb/core/mind/tenant_slot_broker.cpp
+++ b/ydb/core/mind/tenant_slot_broker.cpp
@@ -1,1578 +1,1578 @@
-#include "tenant_slot_broker_impl.h"
-
+#include "tenant_slot_broker_impl.h"
+
#include <ydb/core/base/counters.h>
#include <ydb/core/cms/console/config_helpers.h>
-
+
#include <library/cpp/monlib/service/pages/templates.h>
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-const ui32 TTenantSlotBroker::ConfigKey_Config = 1;
-
-void TTenantSlotBroker::TCollocationGroup::SetPreferredDataCenter(const TString &dc)
-{
- PreferredDataCenter = dc;
- for (auto allocation : Allocations)
- allocation->RecomputeSplitCount();
-}
-
-bool TTenantSlotBroker::TSlotsAllocation::IsSlotOk(const TString &type,
- const TString &dc,
- bool strictMatch) const
-{
- if (type != Description.SlotType
- && Description.SlotType != ANY_SLOT_TYPE)
- return false;
- if (dc != Description.DataCenter
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+const ui32 TTenantSlotBroker::ConfigKey_Config = 1;
+
+void TTenantSlotBroker::TCollocationGroup::SetPreferredDataCenter(const TString &dc)
+{
+ PreferredDataCenter = dc;
+ for (auto allocation : Allocations)
+ allocation->RecomputeSplitCount();
+}
+
+bool TTenantSlotBroker::TSlotsAllocation::IsSlotOk(const TString &type,
+ const TString &dc,
+ bool strictMatch) const
+{
+ if (type != Description.SlotType
+ && Description.SlotType != ANY_SLOT_TYPE)
+ return false;
+ if (dc != Description.DataCenter
&& Description.DataCenter != ANY_DATA_CENTER) {
- if (strictMatch || Description.ForceLocation)
- return false;
- }
- if (Group) {
- if (Group->GetPreferredDataCenter() != dc
+ if (strictMatch || Description.ForceLocation)
+ return false;
+ }
+ if (Group) {
+ if (Group->GetPreferredDataCenter() != dc
&& Group->GetPreferredDataCenter() != ANY_DATA_CENTER) {
- if (strictMatch || Description.ForceCollocation)
- return false;
- }
- }
- return true;
-}
-
-void TTenantSlotBroker::TSlotsAllocation::RecomputeSplitCount()
-{
- ui64 count = 0;
- if (Group) {
- for (auto slot : AssignedSlots) {
- if (slot->DataCenter != Group->GetPreferredDataCenter())
- ++count;
- }
- }
- SetSplit(count);
-}
-
-const TSlotDescription TTenantSlotBroker::TTenant::PinnedSlotDescription = {PIN_DATA_CENTER, PIN_SLOT_TYPE};
-
-void TTenantSlotBroker::TTenant::AddSlotsAllocation(const TSlotDescription &descr,
- ui64 count)
-{
+ if (strictMatch || Description.ForceCollocation)
+ return false;
+ }
+ }
+ return true;
+}
+
+void TTenantSlotBroker::TSlotsAllocation::RecomputeSplitCount()
+{
+ ui64 count = 0;
+ if (Group) {
+ for (auto slot : AssignedSlots) {
+ if (slot->DataCenter != Group->GetPreferredDataCenter())
+ ++count;
+ }
+ }
+ SetSplit(count);
+}
+
+const TSlotDescription TTenantSlotBroker::TTenant::PinnedSlotDescription = {PIN_DATA_CENTER, PIN_SLOT_TYPE};
+
+void TTenantSlotBroker::TTenant::AddSlotsAllocation(const TSlotDescription &descr,
+ ui64 count)
+{
Y_VERIFY(!Allocations.contains(descr));
- TSlotsAllocation::TPtr allocation = new TSlotsAllocation(descr, Stats);
- Allocations[descr] = allocation;
- if (descr.CollocationGroup
+ TSlotsAllocation::TPtr allocation = new TSlotsAllocation(descr, Stats);
+ Allocations[descr] = allocation;
+ if (descr.CollocationGroup
&& (descr.DataCenter == ANY_DATA_CENTER
- || !descr.ForceLocation)) {
- auto group = GetOrCreateCollocationGroup(descr.CollocationGroup);
- group->Allocations.insert(allocation);
- allocation->Group = group;
- }
- allocation->SetRequired(count);
- allocation->SetMissing(count);
-}
-
-TTenantSlotBroker::TSlotsAllocation::TPtr
-TTenantSlotBroker::TTenant::GetOrCreateAllocation(const TSlotDescription &descr)
-{
+ || !descr.ForceLocation)) {
+ auto group = GetOrCreateCollocationGroup(descr.CollocationGroup);
+ group->Allocations.insert(allocation);
+ allocation->Group = group;
+ }
+ allocation->SetRequired(count);
+ allocation->SetMissing(count);
+}
+
+TTenantSlotBroker::TSlotsAllocation::TPtr
+TTenantSlotBroker::TTenant::GetOrCreateAllocation(const TSlotDescription &descr)
+{
if (!Allocations.contains(descr))
- AddSlotsAllocation(descr, 0);
- return Allocations.at(descr);
-}
-
-void TTenantSlotBroker::TTenant::ClearEmptyAllocations()
-{
- auto it = Allocations.begin();
- while (it != Allocations.end()) {
- auto allocation = it->second;
-
- if (allocation->RequiredCount
- || allocation->PinnedCount) {
- ++it;
- continue;
- }
-
- if (allocation->Group)
- allocation->Group->Allocations.erase(allocation);
-
- Y_VERIFY(!allocation->MissingCount);
- Y_VERIFY(!allocation->PendingCount);
- auto cur = it;
- ++it;
- Allocations.erase(cur);
- }
-}
-
-TTenantSlotBroker::TCollocationGroup::TPtr
-TTenantSlotBroker::TTenant::GetOrCreateCollocationGroup(ui32 group)
-{
- auto it = Groups.find(group);
- if (it != Groups.end())
- return it->second;
-
- TCollocationGroup::TPtr res = new TCollocationGroup(group);
- Groups[group] = res;
- return res;
-}
-
-void TTenantSlotBroker::TTenant::DetermineDataCenterForCollocationGroups()
-{
- for (auto &pr : Groups) {
- THashMap<TString, ui32> slots;
-
- for (auto allocation : pr.second->Allocations) {
- for (auto slot : allocation->AssignedSlots) {
+ AddSlotsAllocation(descr, 0);
+ return Allocations.at(descr);
+}
+
+void TTenantSlotBroker::TTenant::ClearEmptyAllocations()
+{
+ auto it = Allocations.begin();
+ while (it != Allocations.end()) {
+ auto allocation = it->second;
+
+ if (allocation->RequiredCount
+ || allocation->PinnedCount) {
+ ++it;
+ continue;
+ }
+
+ if (allocation->Group)
+ allocation->Group->Allocations.erase(allocation);
+
+ Y_VERIFY(!allocation->MissingCount);
+ Y_VERIFY(!allocation->PendingCount);
+ auto cur = it;
+ ++it;
+ Allocations.erase(cur);
+ }
+}
+
+TTenantSlotBroker::TCollocationGroup::TPtr
+TTenantSlotBroker::TTenant::GetOrCreateCollocationGroup(ui32 group)
+{
+ auto it = Groups.find(group);
+ if (it != Groups.end())
+ return it->second;
+
+ TCollocationGroup::TPtr res = new TCollocationGroup(group);
+ Groups[group] = res;
+ return res;
+}
+
+void TTenantSlotBroker::TTenant::DetermineDataCenterForCollocationGroups()
+{
+ for (auto &pr : Groups) {
+ THashMap<TString, ui32> slots;
+
+ for (auto allocation : pr.second->Allocations) {
+ for (auto slot : allocation->AssignedSlots) {
if (slot->DataCenter != ANY_DATA_CENTER)
- slots[slot->DataCenter] += 1;
- }
- }
-
- // If there are no assigned slots then leave it until we are
- // going to assign some slot.
- if (slots.empty())
- continue;
-
- auto max = slots.begin();
- for (auto it = slots.begin(); it != slots.end(); ++it)
- if (it->second > max->second)
- max = it;
-
- pr.second->SetPreferredDataCenter(max->first);
- }
-}
-
-TString TTenantSlotBroker::TTenant::SlotLabelByNo(ui64 no) const
-{
- return Sprintf("slot-%" PRIu64, no);
-}
-
-void TTenantSlotBroker::TTenant::AddSlotLabels(ui64 count,
- TTransactionContext &txc)
-{
- NIceDb::TNiceDb db(txc.DB);
- ui64 no = 1;
- while (count) {
- auto label = SlotLabelByNo(no);
+ slots[slot->DataCenter] += 1;
+ }
+ }
+
+ // If there are no assigned slots then leave it until we are
+ // going to assign some slot.
+ if (slots.empty())
+ continue;
+
+ auto max = slots.begin();
+ for (auto it = slots.begin(); it != slots.end(); ++it)
+ if (it->second > max->second)
+ max = it;
+
+ pr.second->SetPreferredDataCenter(max->first);
+ }
+}
+
+TString TTenantSlotBroker::TTenant::SlotLabelByNo(ui64 no) const
+{
+ return Sprintf("slot-%" PRIu64, no);
+}
+
+void TTenantSlotBroker::TTenant::AddSlotLabels(ui64 count,
+ TTransactionContext &txc)
+{
+ NIceDb::TNiceDb db(txc.DB);
+ ui64 no = 1;
+ while (count) {
+ auto label = SlotLabelByNo(no);
if (!UsedSlotLabels.contains(label) && !UnusedSlotLabels.contains(label)) {
- db.Table<Schema::SlotLabels>().Key(Name, label).Update();
- UnusedSlotLabels.insert(label);
- --count;
- }
- ++no;
- }
-}
-
-void TTenantSlotBroker::TTenant::RemoveSlotLabels(ui64 count,
- TTransactionContext &txc)
-{
- Y_VERIFY(UnusedSlotLabels.size() >= count);
- NIceDb::TNiceDb db(txc.DB);
- auto first = UnusedSlotLabels.begin();
- std::advance(first, UnusedSlotLabels.size() - count);
- for (auto it = first; it != UnusedSlotLabels.end(); ++it)
- db.Table<Schema::SlotLabels>().Key(Name, *it).Delete();
- UnusedSlotLabels.erase(first, UnusedSlotLabels.end());
-}
-
-TString TTenantSlotBroker::TTenant::MakePinnedSlotLabel()
-{
- ui64 no = 1;
- while (true) {
- auto label = Sprintf("pinned-%" PRIu64, no);
+ db.Table<Schema::SlotLabels>().Key(Name, label).Update();
+ UnusedSlotLabels.insert(label);
+ --count;
+ }
+ ++no;
+ }
+}
+
+void TTenantSlotBroker::TTenant::RemoveSlotLabels(ui64 count,
+ TTransactionContext &txc)
+{
+ Y_VERIFY(UnusedSlotLabels.size() >= count);
+ NIceDb::TNiceDb db(txc.DB);
+ auto first = UnusedSlotLabels.begin();
+ std::advance(first, UnusedSlotLabels.size() - count);
+ for (auto it = first; it != UnusedSlotLabels.end(); ++it)
+ db.Table<Schema::SlotLabels>().Key(Name, *it).Delete();
+ UnusedSlotLabels.erase(first, UnusedSlotLabels.end());
+}
+
+TString TTenantSlotBroker::TTenant::MakePinnedSlotLabel()
+{
+ ui64 no = 1;
+ while (true) {
+ auto label = Sprintf("pinned-%" PRIu64, no);
if (!PinnedSlotLabels.contains(label)) {
- AddPinnedSlotLabel(label);
- return label;
- }
- ++no;
- }
-}
-
-void TTenantSlotBroker::TTenant::AddPinnedSlotLabel(const TString &label)
-{
+ AddPinnedSlotLabel(label);
+ return label;
+ }
+ ++no;
+ }
+}
+
+void TTenantSlotBroker::TTenant::AddPinnedSlotLabel(const TString &label)
+{
Y_VERIFY(!PinnedSlotLabels.contains(label));
- PinnedSlotLabels.insert(label);
-}
-
-void TTenantSlotBroker::TTenant::RemovePinnedSlotLabel(const TString &label)
-{
+ PinnedSlotLabels.insert(label);
+}
+
+void TTenantSlotBroker::TTenant::RemovePinnedSlotLabel(const TString &label)
+{
Y_VERIFY(PinnedSlotLabels.contains(label));
- PinnedSlotLabels.erase(label);
-}
-
-void TTenantSlotBroker::TTenant::MarkSlotLabelAsUsed(const TString &label)
-{
+ PinnedSlotLabels.erase(label);
+}
+
+void TTenantSlotBroker::TTenant::MarkSlotLabelAsUsed(const TString &label)
+{
Y_VERIFY(UnusedSlotLabels.contains(label));
Y_VERIFY(!UsedSlotLabels.contains(label));
-
- UnusedSlotLabels.erase(label);
- UsedSlotLabels.insert(label);
-}
-
-void TTenantSlotBroker::TTenant::MarkSlotLabelAsUnused(const TString &label)
-{
+
+ UnusedSlotLabels.erase(label);
+ UsedSlotLabels.insert(label);
+}
+
+void TTenantSlotBroker::TTenant::MarkSlotLabelAsUnused(const TString &label)
+{
Y_VERIFY(!UnusedSlotLabels.contains(label));
Y_VERIFY(UsedSlotLabels.contains(label));
-
- UnusedSlotLabels.insert(label);
- UsedSlotLabels.erase(label);
-}
-
-TString TTenantSlotBroker::TTenant::GetFirstUnusedSlotLabel() const
-{
+
+ UnusedSlotLabels.insert(label);
+ UsedSlotLabels.erase(label);
+}
+
+TString TTenantSlotBroker::TTenant::GetFirstUnusedSlotLabel() const
+{
Y_VERIFY(!UnusedSlotLabels.empty(), "tenant %s has no unused slot labels", Name.data());
- return *UnusedSlotLabels.begin();
-}
-
-void TTenantSlotBroker::TTenant::AddUnusedSlotLabel(const TString &label)
-{
- UnusedSlotLabels.insert(label);
-}
-
-void TTenantSlotBroker::TTenant::AddPinnedSlot(TSlot::TPtr slot)
-{
- Y_VERIFY(!slot->AssignedTenant);
- auto allocation = GetOrCreateAllocation(PinnedSlotDescription);
- allocation->AddAssignedSlot(slot);
- allocation->IncPinned();
- slot->AssignedTenant = this;
- slot->UsedAs = PinnedSlotDescription;
- if (slot->IsPending())
- allocation->IncPending();
-}
-
-void TTenantSlotBroker::TTenant::RemovePinnedSlot(TSlot::TPtr slot)
-{
- Y_VERIFY(slot->AssignedTenant == this);
- auto allocation = Allocations.at(PinnedSlotDescription);
- allocation->RemoveAssignedSlot(slot);
- allocation->DecPinned();
-
- if (slot->IsPending())
- allocation->DecPending();
- slot->AssignedTenant = nullptr;
-
- if (!allocation->PinnedCount)
- Allocations.erase(PinnedSlotDescription);
-}
-
-bool TTenantSlotBroker::TTenant::CanBeRemoved() const
-{
- return !GetTotalRequired() && PinnedSlotLabels.empty();
-}
-
-void TTenantSlotBroker::TTenant::DbUpdateAllocation(const TSlotDescription &key,
- TTransactionContext &txc)
-{
- auto allocation = Allocations.at(key);
- auto &loc = allocation->Description;
- NIceDb::TNiceDb db(txc.DB);
-
- // Check if slot can be written in the old format to support downgrade.
- // TODO: remove this code and use only new format in 18.8.
- if (loc.DataCenter.size() <= 4
- && loc.ForceLocation
- && !loc.CollocationGroup
- && !loc.ForceCollocation) {
- auto row = db.Table<Schema::RequiredSlots>().Key(Name,
- allocation->Description.SlotType,
- DataCenterFromString(loc.DataCenter));
- if (allocation->RequiredCount)
- row.Update(NIceDb::TUpdate<Schema::RequiredSlots::Count>(allocation->RequiredCount));
- else
- row.Delete();
- } else {
- auto row = db.Table<Schema::SlotsAllocations>().Key(Name,
- allocation->Description.SlotType,
- loc.DataCenter,
- loc.CollocationGroup,
- loc.ForceLocation,
- loc.ForceCollocation);
- if (allocation->RequiredCount)
- row.Update(NIceDb::TUpdate<Schema::SlotsAllocations::Count>(allocation->RequiredCount));
- else
- row.Delete();
- }
-}
-
-void TTenantSlotBroker::TFreeSlotsIndex::Add(TSlot::TPtr slot)
-{
- FreeSlotsByType[slot->Type][slot->DataCenter].insert(slot);
- FreeSlotsByDataCenter[slot->DataCenter][slot->Type].insert(slot);
-}
-
-void TTenantSlotBroker::TFreeSlotsIndex::Remove(TSlot::TPtr slot)
-{
- auto it1 = FreeSlotsByType.find(slot->Type);
- Y_VERIFY(it1 != FreeSlotsByType.end());
- auto it2 = it1->second.find(slot->DataCenter);
- Y_VERIFY(it2 != it1->second.end());
- it2->second.erase(slot);
- if (it2->second.empty()) {
- it1->second.erase(it2);
- if (it1->second.empty())
- FreeSlotsByType.erase(it1);
- }
-
- auto it3 = FreeSlotsByDataCenter.find(slot->DataCenter);
- Y_VERIFY(it3 != FreeSlotsByDataCenter.end());
- auto it4 = it3->second.find(slot->Type);
- Y_VERIFY(it4 != it3->second.end());
- it4->second.erase(slot);
- if (it4->second.empty()) {
- it3->second.erase(it4);
- if (it3->second.empty())
- FreeSlotsByDataCenter.erase(it3);
- }
-}
-
-TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::TFreeSlotsIndex::Find()
-{
- if (FreeSlotsByType.empty())
- return nullptr;
-
- auto maxIt = FreeSlotsByType.begin();
- ui64 maxCount = 0;
- for (auto &pr : maxIt->second)
- maxCount += pr.second.size();
-
- auto it = maxIt;
- for (++it; it != FreeSlotsByType.end(); ++it) {
- ui64 count = 0;
- for (auto &pr : it->second)
- count += pr.second.size();
- if (count > maxCount) {
- maxCount = count;
- maxIt = it;
- }
- }
-
- return FindByType(maxIt->first);
-}
-
-TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::TFreeSlotsIndex::FindByType(const TString &type)
-{
- auto it1 = FreeSlotsByType.find(type);
- if (it1 == FreeSlotsByType.end())
- return nullptr;
-
- auto maxIt = it1->second.begin();
- auto it2 = maxIt;
- for (++it2; it2 != it1->second.end(); ++it2)
- if (it2->second.size() > maxIt->second.size())
- maxIt = it2;
-
- return *maxIt->second.begin();
-}
-
-TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::TFreeSlotsIndex::FindByDC(const TString &dataCenter)
-{
- auto it1 = FreeSlotsByDataCenter.find(dataCenter);
- if (it1 == FreeSlotsByDataCenter.end())
- return nullptr;
-
- auto maxIt = it1->second.begin();
- auto it2 = maxIt;
- for (++it2; it2 != it1->second.end(); ++it2)
- if (it2->second.size() > maxIt->second.size())
- maxIt = it2;
-
- return *maxIt->second.begin();
-}
-
-TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::TFreeSlotsIndex::Find(const TString &type,
- const TString &dataCenter)
-{
+ return *UnusedSlotLabels.begin();
+}
+
+void TTenantSlotBroker::TTenant::AddUnusedSlotLabel(const TString &label)
+{
+ UnusedSlotLabels.insert(label);
+}
+
+void TTenantSlotBroker::TTenant::AddPinnedSlot(TSlot::TPtr slot)
+{
+ Y_VERIFY(!slot->AssignedTenant);
+ auto allocation = GetOrCreateAllocation(PinnedSlotDescription);
+ allocation->AddAssignedSlot(slot);
+ allocation->IncPinned();
+ slot->AssignedTenant = this;
+ slot->UsedAs = PinnedSlotDescription;
+ if (slot->IsPending())
+ allocation->IncPending();
+}
+
+void TTenantSlotBroker::TTenant::RemovePinnedSlot(TSlot::TPtr slot)
+{
+ Y_VERIFY(slot->AssignedTenant == this);
+ auto allocation = Allocations.at(PinnedSlotDescription);
+ allocation->RemoveAssignedSlot(slot);
+ allocation->DecPinned();
+
+ if (slot->IsPending())
+ allocation->DecPending();
+ slot->AssignedTenant = nullptr;
+
+ if (!allocation->PinnedCount)
+ Allocations.erase(PinnedSlotDescription);
+}
+
+bool TTenantSlotBroker::TTenant::CanBeRemoved() const
+{
+ return !GetTotalRequired() && PinnedSlotLabels.empty();
+}
+
+void TTenantSlotBroker::TTenant::DbUpdateAllocation(const TSlotDescription &key,
+ TTransactionContext &txc)
+{
+ auto allocation = Allocations.at(key);
+ auto &loc = allocation->Description;
+ NIceDb::TNiceDb db(txc.DB);
+
+ // Check if slot can be written in the old format to support downgrade.
+ // TODO: remove this code and use only new format in 18.8.
+ if (loc.DataCenter.size() <= 4
+ && loc.ForceLocation
+ && !loc.CollocationGroup
+ && !loc.ForceCollocation) {
+ auto row = db.Table<Schema::RequiredSlots>().Key(Name,
+ allocation->Description.SlotType,
+ DataCenterFromString(loc.DataCenter));
+ if (allocation->RequiredCount)
+ row.Update(NIceDb::TUpdate<Schema::RequiredSlots::Count>(allocation->RequiredCount));
+ else
+ row.Delete();
+ } else {
+ auto row = db.Table<Schema::SlotsAllocations>().Key(Name,
+ allocation->Description.SlotType,
+ loc.DataCenter,
+ loc.CollocationGroup,
+ loc.ForceLocation,
+ loc.ForceCollocation);
+ if (allocation->RequiredCount)
+ row.Update(NIceDb::TUpdate<Schema::SlotsAllocations::Count>(allocation->RequiredCount));
+ else
+ row.Delete();
+ }
+}
+
+void TTenantSlotBroker::TFreeSlotsIndex::Add(TSlot::TPtr slot)
+{
+ FreeSlotsByType[slot->Type][slot->DataCenter].insert(slot);
+ FreeSlotsByDataCenter[slot->DataCenter][slot->Type].insert(slot);
+}
+
+void TTenantSlotBroker::TFreeSlotsIndex::Remove(TSlot::TPtr slot)
+{
+ auto it1 = FreeSlotsByType.find(slot->Type);
+ Y_VERIFY(it1 != FreeSlotsByType.end());
+ auto it2 = it1->second.find(slot->DataCenter);
+ Y_VERIFY(it2 != it1->second.end());
+ it2->second.erase(slot);
+ if (it2->second.empty()) {
+ it1->second.erase(it2);
+ if (it1->second.empty())
+ FreeSlotsByType.erase(it1);
+ }
+
+ auto it3 = FreeSlotsByDataCenter.find(slot->DataCenter);
+ Y_VERIFY(it3 != FreeSlotsByDataCenter.end());
+ auto it4 = it3->second.find(slot->Type);
+ Y_VERIFY(it4 != it3->second.end());
+ it4->second.erase(slot);
+ if (it4->second.empty()) {
+ it3->second.erase(it4);
+ if (it3->second.empty())
+ FreeSlotsByDataCenter.erase(it3);
+ }
+}
+
+TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::TFreeSlotsIndex::Find()
+{
+ if (FreeSlotsByType.empty())
+ return nullptr;
+
+ auto maxIt = FreeSlotsByType.begin();
+ ui64 maxCount = 0;
+ for (auto &pr : maxIt->second)
+ maxCount += pr.second.size();
+
+ auto it = maxIt;
+ for (++it; it != FreeSlotsByType.end(); ++it) {
+ ui64 count = 0;
+ for (auto &pr : it->second)
+ count += pr.second.size();
+ if (count > maxCount) {
+ maxCount = count;
+ maxIt = it;
+ }
+ }
+
+ return FindByType(maxIt->first);
+}
+
+TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::TFreeSlotsIndex::FindByType(const TString &type)
+{
+ auto it1 = FreeSlotsByType.find(type);
+ if (it1 == FreeSlotsByType.end())
+ return nullptr;
+
+ auto maxIt = it1->second.begin();
+ auto it2 = maxIt;
+ for (++it2; it2 != it1->second.end(); ++it2)
+ if (it2->second.size() > maxIt->second.size())
+ maxIt = it2;
+
+ return *maxIt->second.begin();
+}
+
+TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::TFreeSlotsIndex::FindByDC(const TString &dataCenter)
+{
+ auto it1 = FreeSlotsByDataCenter.find(dataCenter);
+ if (it1 == FreeSlotsByDataCenter.end())
+ return nullptr;
+
+ auto maxIt = it1->second.begin();
+ auto it2 = maxIt;
+ for (++it2; it2 != it1->second.end(); ++it2)
+ if (it2->second.size() > maxIt->second.size())
+ maxIt = it2;
+
+ return *maxIt->second.begin();
+}
+
+TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::TFreeSlotsIndex::Find(const TString &type,
+ const TString &dataCenter)
+{
if (type == ANY_SLOT_TYPE && dataCenter == ANY_DATA_CENTER)
- return Find();
- if (type == ANY_SLOT_TYPE)
- return FindByDC(dataCenter);
+ return Find();
+ if (type == ANY_SLOT_TYPE)
+ return FindByDC(dataCenter);
if (dataCenter == ANY_DATA_CENTER)
- return FindByType(type);
-
- auto it1 = FreeSlotsByType.find(type);
- if (it1 == FreeSlotsByType.end())
- return nullptr;
-
- auto it2 = it1->second.find(dataCenter);
- if (it2 == it1->second.end())
- return nullptr;
-
- return *it2->second.begin();
-}
-
+ return FindByType(type);
+
+ auto it1 = FreeSlotsByType.find(type);
+ if (it1 == FreeSlotsByType.end())
+ return nullptr;
+
+ auto it2 = it1->second.find(dataCenter);
+ if (it2 == it1->second.end())
+ return nullptr;
+
+ return *it2->second.begin();
+}
+
ui64 TTenantSlotBroker::Generation() const {
return Executor()->Generation();
}
-void TTenantSlotBroker::OnActivateExecutor(const TActorContext &ctx)
-{
- RequestId = Now().GetValue();
-
- auto domains = AppData(ctx)->DomainsInfo;
- DomainId = domains->GetDomainUidByTabletId(TabletID());
- Y_VERIFY(DomainId != TDomainsInfo::BadDomainId);
- DomainName = domains->Domains.at(DomainId)->Name;
-
- auto tabletCounters = GetServiceCounters(AppData(ctx)->Counters, "tablets");
- tabletCounters->RemoveSubgroup("type", "TENANT_SLOT_BROKER");
- Counters = new TCounters(tabletCounters->GetSubgroup("type", "TENANT_SLOT_BROKER"));
-
- ctx.Register(NConsole::CreateConfigSubscriber(TabletID(),
- {(ui32)NKikimrConsole::TConfigItem::TenantSlotBrokerConfigItem},
- "",
- ctx.SelfID));
-
- ProcessTx(CreateTxInitScheme(), ctx);
-}
-
-void TTenantSlotBroker::OnDetach(const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "OnDetach");
- Die(ctx);
-}
-
-void TTenantSlotBroker::OnTabletDead(TEvTablet::TEvTabletDead::TPtr &,
- const TActorContext &ctx)
-{
- LOG_INFO(ctx, NKikimrServices::TENANT_SLOT_BROKER, "OnTabletDead: %" PRIu64, TabletID());
-
- if (Counters)
- Counters->Counters->ResetCounters();
-
- Die(ctx);
-}
-
-void TTenantSlotBroker::Enqueue(TAutoPtr<IEventHandle> &ev,
- const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Enqueue: %" PRIu64 ", event type: %" PRIu32 " event: %s",
+void TTenantSlotBroker::OnActivateExecutor(const TActorContext &ctx)
+{
+ RequestId = Now().GetValue();
+
+ auto domains = AppData(ctx)->DomainsInfo;
+ DomainId = domains->GetDomainUidByTabletId(TabletID());
+ Y_VERIFY(DomainId != TDomainsInfo::BadDomainId);
+ DomainName = domains->Domains.at(DomainId)->Name;
+
+ auto tabletCounters = GetServiceCounters(AppData(ctx)->Counters, "tablets");
+ tabletCounters->RemoveSubgroup("type", "TENANT_SLOT_BROKER");
+ Counters = new TCounters(tabletCounters->GetSubgroup("type", "TENANT_SLOT_BROKER"));
+
+ ctx.Register(NConsole::CreateConfigSubscriber(TabletID(),
+ {(ui32)NKikimrConsole::TConfigItem::TenantSlotBrokerConfigItem},
+ "",
+ ctx.SelfID));
+
+ ProcessTx(CreateTxInitScheme(), ctx);
+}
+
+void TTenantSlotBroker::OnDetach(const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "OnDetach");
+ Die(ctx);
+}
+
+void TTenantSlotBroker::OnTabletDead(TEvTablet::TEvTabletDead::TPtr &,
+ const TActorContext &ctx)
+{
+ LOG_INFO(ctx, NKikimrServices::TENANT_SLOT_BROKER, "OnTabletDead: %" PRIu64, TabletID());
+
+ if (Counters)
+ Counters->Counters->ResetCounters();
+
+ Die(ctx);
+}
+
+void TTenantSlotBroker::Enqueue(TAutoPtr<IEventHandle> &ev,
+ const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Enqueue: %" PRIu64 ", event type: %" PRIu32 " event: %s",
TabletID(), ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- InitQueue.push_back(ev);
-}
-
-bool TTenantSlotBroker::OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev,
- const TActorContext &ctx)
-{
- if (!ev)
- return true;
-
- TStringStream str;
- HTML(str) {
- PRE() {
- str << "Served domain: " << AppData(ctx)->DomainsInfo->Domains.at(DomainId)->Name << Endl
- << "Used timeout for pending slots: " << PendingTimeout.ToString() << Endl
- << "PendingAssignFreeSlots: " << PendingAssignFreeSlots << Endl;
-
- str << "Node ID to Data Center map:";
- ui64 count = 0;
- TSet<ui32> nodes;
- for (auto &pr : NodeIdToDataCenter)
- nodes.insert(pr.first);
- for (auto node : nodes) {
- if (count % 10 == 0)
- str << Endl;
- str << " " << node << " -> " << NodeIdToDataCenter.at(node);
- ++count;
- }
- str << Endl << Endl;
-
- TSet<TString> names;
- str << "Tenants:" << Endl;
- for (auto &pr : Tenants)
- names.insert(pr.first);
- for (auto &name : names) {
- auto tenant = Tenants.at(name);
- str << " - " << tenant->Name << Endl
- << " Total required slots: " << tenant->GetTotalRequired() << Endl
- << " Total missing slots: " << tenant->GetTotalMissing() << Endl
- << " Total pending slots: " << tenant->GetTotalPending() << Endl
- << " Total misplaced slots: " << tenant->GetTotalMisplaced() << Endl
- << " Total split slots: " << tenant->GetTotalSplit() << Endl;
-
- if (tenant->GetTotalRequired())
- str << " Slots (allocated + pending + missing [misplaced, split]):" << Endl;
-
- for (auto &pr : tenant->GetAllocations()) {
- auto allocation = pr.second;
- ui64 required = allocation->RequiredCount;
- ui64 pending = allocation->PendingCount;
- ui64 missing = allocation->MissingCount;
- ui64 misplaced = allocation->MisplacedCount;
- ui64 split = allocation->SplitCount;
- ui64 pinned = allocation->PinnedCount;
- ui64 allocated = required - pending - missing;
- if (pinned) {
- str << " Pinned slots:";
- } else {
- str << " " << allocation->Description.ToString() << ": "
- << allocated << " + " << pending << " + " << missing
- << " [" << misplaced << ", " << split << "]" << Endl;
- str << " Assigned slots:";
- }
- count = 0;
- for (auto &slot : allocation->AssignedSlots) {
- if (count && count % 5 == 0)
- str << Endl << " ";
- str << " " << slot->IdString();
- ++count;
- }
- str << Endl;
- }
- }
- str << Endl;
-
- str << "Unhappy tenants:";
- for (auto &tenant : UnhappyTenants)
- str << " " << tenant->Name;
- str << Endl << Endl;
-
- str << "Slots:" << Endl;
- TSet<TSlotId> keys;
- for (auto &pr : Slots)
- keys.insert(pr.first);
- for (auto &key : keys) {
- auto slot = Slots.at(key);
- str << " " << slot->IdString() << ": " << slot->Type << " in " << slot->DataCenter
- << (slot->IsConnected ? " connected " : " disconnected ");
- if (slot->AssignedTenant)
- str << "used by " << slot->AssignedTenant->Name << " as " << slot->UsedAs.ToString()
- << " labeled '" << slot->Label << "'";
- else
- str << "free";
- if (slot->IsBanned)
- str << " banned";
- if (slot->IsPinned)
- str << " pinned";
- if (slot->LastRequestId)
- str << " pending assignment confirmation (RequestId: " << slot->LastRequestId << ")";
- str << Endl;
- }
- str << Endl;
-
- str << "Free slots by type:" << Endl;
- for (auto &pr1 : FreeSlots.FreeSlotsByType) {
- str << " - " << pr1.first << Endl;
- for (auto &pr2 : pr1.second) {
- str << " Data Center " << pr2.first << ":";
- count = 0;
- for (auto &slot : pr2.second) {
- if (count && count % 5 == 0)
- str << Endl << " ";
- str << " " << slot->IdString();
- ++count;
- }
- str << Endl;
- }
- }
- str << Endl;
-
- str << "Free slots by data center:" << Endl;
- for (auto &pr1 : FreeSlots.FreeSlotsByDataCenter) {
- str << " - Data Center " << pr1.first << Endl;
- for (auto &pr2 : pr1.second) {
- str << " " << pr2.first << ":";
- count = 0;
- for (auto &slot : pr2.second) {
- if (count && count % 5 == 0)
- str << Endl << " ";
- str << " " << slot->IdString();
- ++count;
- }
- str << Endl;
- }
- }
- str << Endl;
-
- str << "Slots by node ID:" << Endl;
- nodes.clear();
- for (auto pr: SlotsByNodeId)
- nodes.insert(pr.first);
- for (auto node : nodes) {
- str << " " << node << ":";
- for (auto &slot : SlotsByNodeId.at(node))
- str << " " << slot->IdString();
- str << Endl;
- }
- str << Endl;
-
- str << "Tenant Slot Broker counters:" << Endl;
- Counters->AllCounters()->OutputPlainText(str, " ");
- str << Endl;
-
- str << "Known pool pipes:";
- count = 0;
- for (auto &pipe : KnownPoolPipes) {
- if (count % 10 == 0)
- str << Endl;
- str << " " << pipe;
- }
- str << Endl;
- }
- }
- ctx.Send(ev->Sender, new NMon::TEvRemoteHttpInfoRes(str.Str()));
- return true;
-}
-
-void TTenantSlotBroker::Cleanup(const TActorContext &ctx)
-{
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "Cleanup");
-}
-
-void TTenantSlotBroker::Die(const TActorContext &ctx)
-{
- Cleanup(ctx);
- TActorBase::Die(ctx);
-}
-
-void TTenantSlotBroker::LoadConfigFromProto(const NKikimrTenantSlotBroker::TConfig &config)
-{
+ InitQueue.push_back(ev);
+}
+
+bool TTenantSlotBroker::OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev,
+ const TActorContext &ctx)
+{
+ if (!ev)
+ return true;
+
+ TStringStream str;
+ HTML(str) {
+ PRE() {
+ str << "Served domain: " << AppData(ctx)->DomainsInfo->Domains.at(DomainId)->Name << Endl
+ << "Used timeout for pending slots: " << PendingTimeout.ToString() << Endl
+ << "PendingAssignFreeSlots: " << PendingAssignFreeSlots << Endl;
+
+ str << "Node ID to Data Center map:";
+ ui64 count = 0;
+ TSet<ui32> nodes;
+ for (auto &pr : NodeIdToDataCenter)
+ nodes.insert(pr.first);
+ for (auto node : nodes) {
+ if (count % 10 == 0)
+ str << Endl;
+ str << " " << node << " -> " << NodeIdToDataCenter.at(node);
+ ++count;
+ }
+ str << Endl << Endl;
+
+ TSet<TString> names;
+ str << "Tenants:" << Endl;
+ for (auto &pr : Tenants)
+ names.insert(pr.first);
+ for (auto &name : names) {
+ auto tenant = Tenants.at(name);
+ str << " - " << tenant->Name << Endl
+ << " Total required slots: " << tenant->GetTotalRequired() << Endl
+ << " Total missing slots: " << tenant->GetTotalMissing() << Endl
+ << " Total pending slots: " << tenant->GetTotalPending() << Endl
+ << " Total misplaced slots: " << tenant->GetTotalMisplaced() << Endl
+ << " Total split slots: " << tenant->GetTotalSplit() << Endl;
+
+ if (tenant->GetTotalRequired())
+ str << " Slots (allocated + pending + missing [misplaced, split]):" << Endl;
+
+ for (auto &pr : tenant->GetAllocations()) {
+ auto allocation = pr.second;
+ ui64 required = allocation->RequiredCount;
+ ui64 pending = allocation->PendingCount;
+ ui64 missing = allocation->MissingCount;
+ ui64 misplaced = allocation->MisplacedCount;
+ ui64 split = allocation->SplitCount;
+ ui64 pinned = allocation->PinnedCount;
+ ui64 allocated = required - pending - missing;
+ if (pinned) {
+ str << " Pinned slots:";
+ } else {
+ str << " " << allocation->Description.ToString() << ": "
+ << allocated << " + " << pending << " + " << missing
+ << " [" << misplaced << ", " << split << "]" << Endl;
+ str << " Assigned slots:";
+ }
+ count = 0;
+ for (auto &slot : allocation->AssignedSlots) {
+ if (count && count % 5 == 0)
+ str << Endl << " ";
+ str << " " << slot->IdString();
+ ++count;
+ }
+ str << Endl;
+ }
+ }
+ str << Endl;
+
+ str << "Unhappy tenants:";
+ for (auto &tenant : UnhappyTenants)
+ str << " " << tenant->Name;
+ str << Endl << Endl;
+
+ str << "Slots:" << Endl;
+ TSet<TSlotId> keys;
+ for (auto &pr : Slots)
+ keys.insert(pr.first);
+ for (auto &key : keys) {
+ auto slot = Slots.at(key);
+ str << " " << slot->IdString() << ": " << slot->Type << " in " << slot->DataCenter
+ << (slot->IsConnected ? " connected " : " disconnected ");
+ if (slot->AssignedTenant)
+ str << "used by " << slot->AssignedTenant->Name << " as " << slot->UsedAs.ToString()
+ << " labeled '" << slot->Label << "'";
+ else
+ str << "free";
+ if (slot->IsBanned)
+ str << " banned";
+ if (slot->IsPinned)
+ str << " pinned";
+ if (slot->LastRequestId)
+ str << " pending assignment confirmation (RequestId: " << slot->LastRequestId << ")";
+ str << Endl;
+ }
+ str << Endl;
+
+ str << "Free slots by type:" << Endl;
+ for (auto &pr1 : FreeSlots.FreeSlotsByType) {
+ str << " - " << pr1.first << Endl;
+ for (auto &pr2 : pr1.second) {
+ str << " Data Center " << pr2.first << ":";
+ count = 0;
+ for (auto &slot : pr2.second) {
+ if (count && count % 5 == 0)
+ str << Endl << " ";
+ str << " " << slot->IdString();
+ ++count;
+ }
+ str << Endl;
+ }
+ }
+ str << Endl;
+
+ str << "Free slots by data center:" << Endl;
+ for (auto &pr1 : FreeSlots.FreeSlotsByDataCenter) {
+ str << " - Data Center " << pr1.first << Endl;
+ for (auto &pr2 : pr1.second) {
+ str << " " << pr2.first << ":";
+ count = 0;
+ for (auto &slot : pr2.second) {
+ if (count && count % 5 == 0)
+ str << Endl << " ";
+ str << " " << slot->IdString();
+ ++count;
+ }
+ str << Endl;
+ }
+ }
+ str << Endl;
+
+ str << "Slots by node ID:" << Endl;
+ nodes.clear();
+ for (auto pr: SlotsByNodeId)
+ nodes.insert(pr.first);
+ for (auto node : nodes) {
+ str << " " << node << ":";
+ for (auto &slot : SlotsByNodeId.at(node))
+ str << " " << slot->IdString();
+ str << Endl;
+ }
+ str << Endl;
+
+ str << "Tenant Slot Broker counters:" << Endl;
+ Counters->AllCounters()->OutputPlainText(str, " ");
+ str << Endl;
+
+ str << "Known pool pipes:";
+ count = 0;
+ for (auto &pipe : KnownPoolPipes) {
+ if (count % 10 == 0)
+ str << Endl;
+ str << " " << pipe;
+ }
+ str << Endl;
+ }
+ }
+ ctx.Send(ev->Sender, new NMon::TEvRemoteHttpInfoRes(str.Str()));
+ return true;
+}
+
+void TTenantSlotBroker::Cleanup(const TActorContext &ctx)
+{
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "Cleanup");
+}
+
+void TTenantSlotBroker::Die(const TActorContext &ctx)
+{
+ Cleanup(ctx);
+ TActorBase::Die(ctx);
+}
+
+void TTenantSlotBroker::LoadConfigFromProto(const NKikimrTenantSlotBroker::TConfig &config)
+{
PendingTimeout = TDuration::MicroSeconds(config.GetPendingSlotTimeout());
-}
-
-void TTenantSlotBroker::ProcessEnqueuedEvents(const TActorContext &ctx)
-{
- while (!InitQueue.empty()) {
- TAutoPtr<IEventHandle> &ev = InitQueue.front();
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Dequeue: %" PRIu64 ", event type: %" PRIu32 " event: %s",
+}
+
+void TTenantSlotBroker::ProcessEnqueuedEvents(const TActorContext &ctx)
+{
+ while (!InitQueue.empty()) {
+ TAutoPtr<IEventHandle> &ev = InitQueue.front();
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Dequeue: %" PRIu64 ", event type: %" PRIu32 " event: %s",
TabletID(), ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- ctx.ExecutorThread.Send(ev.Release());
- InitQueue.pop_front();
- }
-}
-
-void TTenantSlotBroker::ClearState()
-{
- // Break cross-references.
- for (auto &pr : Slots)
- pr.second->AssignedTenant = nullptr;
-
- NodeIdToDataCenter.clear();
- Tenants.clear();
- Slots.clear();
- SlotsByNodeId.clear();
- FreeSlots.FreeSlotsByType.clear();
- FreeSlots.FreeSlotsByDataCenter.clear();
- Tenants.clear();
- UnhappyTenants.clear();
- if (Counters)
- Counters->Clear();
-}
-
-TTenantSlotBroker::TTenant::TPtr TTenantSlotBroker::GetTenant(const TString &name)
-{
- auto it = Tenants.find(name);
- if (it != Tenants.end())
- return it->second;
- return nullptr;
-}
-
-TTenantSlotBroker::TTenant::TPtr TTenantSlotBroker::AddTenant(const TString &name)
-{
+ ctx.ExecutorThread.Send(ev.Release());
+ InitQueue.pop_front();
+ }
+}
+
+void TTenantSlotBroker::ClearState()
+{
+ // Break cross-references.
+ for (auto &pr : Slots)
+ pr.second->AssignedTenant = nullptr;
+
+ NodeIdToDataCenter.clear();
+ Tenants.clear();
+ Slots.clear();
+ SlotsByNodeId.clear();
+ FreeSlots.FreeSlotsByType.clear();
+ FreeSlots.FreeSlotsByDataCenter.clear();
+ Tenants.clear();
+ UnhappyTenants.clear();
+ if (Counters)
+ Counters->Clear();
+}
+
+TTenantSlotBroker::TTenant::TPtr TTenantSlotBroker::GetTenant(const TString &name)
+{
+ auto it = Tenants.find(name);
+ if (it != Tenants.end())
+ return it->second;
+ return nullptr;
+}
+
+TTenantSlotBroker::TTenant::TPtr TTenantSlotBroker::AddTenant(const TString &name)
+{
Y_VERIFY(!Tenants.contains(name));
- auto tenant = new TTenant(name, Counters);
- Tenants.emplace(name, tenant);
- *Counters->KnownTenants = Tenants.size();
- return tenant;
-}
-
-TTenantSlotBroker::TTenant::TPtr TTenantSlotBroker::GetOrCreateTenant(const TString &name)
-{
- auto tenant = GetTenant(name);
- if (!tenant)
- tenant = AddTenant(name);
- return tenant;
-}
-
-void TTenantSlotBroker::MaybeRemoveTenant(TTenant::TPtr tenant)
-{
- if (!tenant->CanBeRemoved())
- return;
-
- LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::TENANT_SLOT_BROKER,
- "Remove tenant " << tenant->Name);
- Tenants.erase(tenant->Name);
- *Counters->KnownTenants = Tenants.size();
-}
-
-void TTenantSlotBroker::AddUnhappyTenant(TTenant::TPtr tenant)
-{
- if (tenant->GetTotalMissing()) {
- UnhappyTenants.insert(tenant);
- *Counters->UnhappyTenants = UnhappyTenants.size();
- }
- if (tenant->GetTotalMisplaced()) {
- MisplacedTenants.insert(tenant);
- *Counters->MisplacedTenants = MisplacedTenants.size();
- }
- if (tenant->GetTotalSplit()) {
- SplitTenants.insert(tenant);
- *Counters->SplitTenants = SplitTenants.size();
- }
-}
-
-void TTenantSlotBroker::RemoveUnhappyTenant(TTenant::TPtr tenant)
-{
- if (tenant->GetTotalMissing()) {
- UnhappyTenants.erase(tenant);
- *Counters->UnhappyTenants = UnhappyTenants.size();
- }
- if (tenant->GetTotalMisplaced()) {
- MisplacedTenants.erase(tenant);
- *Counters->MisplacedTenants = MisplacedTenants.size();
- }
- if (tenant->GetTotalSplit()) {
- SplitTenants.erase(tenant);
- *Counters->SplitTenants = SplitTenants.size();
- }
-}
-
-bool TTenantSlotBroker::HasUnhappyTenant() const
-{
- return (!UnhappyTenants.empty()
- || !MisplacedTenants.empty()
- || !SplitTenants.empty());
-}
-
-TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::GetSlot(const TSlotId &id)
-{
- auto it = Slots.find(id);
- if (it != Slots.end())
- return it->second;
- return nullptr;
-}
-
-TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::GetSlot(ui32 nodeId,
- const TString &id)
-{
- return GetSlot(TSlotId(nodeId, id));
-}
-
-void TTenantSlotBroker::AddSlot(TSlot::TPtr slot)
-{
- Slots.emplace(slot->Id, slot);
- SlotsByNodeId[slot->Id.NodeId].insert(slot);
-
- if (slot->IsFree())
- FreeSlots.Add(slot);
-
- AddSlotToCounters(slot);
-}
-
-void TTenantSlotBroker::AddSlot(TSlot::TPtr slot,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Added new " << slot->IdString(true));
-
- Y_VERIFY(!slot->AssignedTenant);
-
- AddSlot(slot);
-
- NIceDb::TNiceDb db(txc.DB);
- auto row = db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId);
+ auto tenant = new TTenant(name, Counters);
+ Tenants.emplace(name, tenant);
+ *Counters->KnownTenants = Tenants.size();
+ return tenant;
+}
+
+TTenantSlotBroker::TTenant::TPtr TTenantSlotBroker::GetOrCreateTenant(const TString &name)
+{
+ auto tenant = GetTenant(name);
+ if (!tenant)
+ tenant = AddTenant(name);
+ return tenant;
+}
+
+void TTenantSlotBroker::MaybeRemoveTenant(TTenant::TPtr tenant)
+{
+ if (!tenant->CanBeRemoved())
+ return;
+
+ LOG_DEBUG_S(TActorContext::AsActorContext(), NKikimrServices::TENANT_SLOT_BROKER,
+ "Remove tenant " << tenant->Name);
+ Tenants.erase(tenant->Name);
+ *Counters->KnownTenants = Tenants.size();
+}
+
+void TTenantSlotBroker::AddUnhappyTenant(TTenant::TPtr tenant)
+{
+ if (tenant->GetTotalMissing()) {
+ UnhappyTenants.insert(tenant);
+ *Counters->UnhappyTenants = UnhappyTenants.size();
+ }
+ if (tenant->GetTotalMisplaced()) {
+ MisplacedTenants.insert(tenant);
+ *Counters->MisplacedTenants = MisplacedTenants.size();
+ }
+ if (tenant->GetTotalSplit()) {
+ SplitTenants.insert(tenant);
+ *Counters->SplitTenants = SplitTenants.size();
+ }
+}
+
+void TTenantSlotBroker::RemoveUnhappyTenant(TTenant::TPtr tenant)
+{
+ if (tenant->GetTotalMissing()) {
+ UnhappyTenants.erase(tenant);
+ *Counters->UnhappyTenants = UnhappyTenants.size();
+ }
+ if (tenant->GetTotalMisplaced()) {
+ MisplacedTenants.erase(tenant);
+ *Counters->MisplacedTenants = MisplacedTenants.size();
+ }
+ if (tenant->GetTotalSplit()) {
+ SplitTenants.erase(tenant);
+ *Counters->SplitTenants = SplitTenants.size();
+ }
+}
+
+bool TTenantSlotBroker::HasUnhappyTenant() const
+{
+ return (!UnhappyTenants.empty()
+ || !MisplacedTenants.empty()
+ || !SplitTenants.empty());
+}
+
+TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::GetSlot(const TSlotId &id)
+{
+ auto it = Slots.find(id);
+ if (it != Slots.end())
+ return it->second;
+ return nullptr;
+}
+
+TTenantSlotBroker::TSlot::TPtr TTenantSlotBroker::GetSlot(ui32 nodeId,
+ const TString &id)
+{
+ return GetSlot(TSlotId(nodeId, id));
+}
+
+void TTenantSlotBroker::AddSlot(TSlot::TPtr slot)
+{
+ Slots.emplace(slot->Id, slot);
+ SlotsByNodeId[slot->Id.NodeId].insert(slot);
+
+ if (slot->IsFree())
+ FreeSlots.Add(slot);
+
+ AddSlotToCounters(slot);
+}
+
+void TTenantSlotBroker::AddSlot(TSlot::TPtr slot,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Added new " << slot->IdString(true));
+
+ Y_VERIFY(!slot->AssignedTenant);
+
+ AddSlot(slot);
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto row = db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId);
row.Update(NIceDb::TUpdate<Schema::Slots::SlotType>(slot->Type.data()),
- NIceDb::TUpdate<Schema::Slots::DataCenter>(DataCenterFromString(slot->DataCenter)),
- NIceDb::TUpdate<Schema::Slots::DataCenterName>(slot->DataCenter),
- NIceDb::TUpdate<Schema::Slots::AssignedTenant>(""),
- NIceDb::TUpdate<Schema::Slots::UsedAsType>(""),
- NIceDb::TUpdate<Schema::Slots::UsedAsDataCenter>(0),
- NIceDb::TUpdate<Schema::Slots::UsedAsDataCenterName>(""),
- NIceDb::TUpdate<Schema::Slots::UsedAsCollocationGroup>(0),
- NIceDb::TUpdate<Schema::Slots::UsedAsForceLocation>(true),
- NIceDb::TUpdate<Schema::Slots::UsedAsForceCollocation>(false));
-}
-
-void TTenantSlotBroker::SlotConnected(TSlot::TPtr slot)
-{
- if (!slot->IsConnected) {
- slot->IsConnected = true;
- Counters->ConnectedSlots(slot->Type, slot->DataCenter)->Inc();
- Counters->DisconnectedSlots(slot->Type, slot->DataCenter)->Dec();
- }
-}
-
-void TTenantSlotBroker::SlotDisconnected(TSlot::TPtr slot)
-{
- if (slot->IsConnected) {
- slot->IsConnected = false;
- Counters->ConnectedSlots(slot->Type, slot->DataCenter)->Dec();
- Counters->DisconnectedSlots(slot->Type, slot->DataCenter)->Inc();
- }
-}
-
-bool TTenantSlotBroker::UpdateSlotDataCenter(TSlot::TPtr slot,
- const TString &dataCenter,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- if (slot->DataCenter == dataCenter)
- return false;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Update data center (" << dataCenter << ") for "
- << slot->IdString(true));
-
- bool res = false;
- // Check if slot has to be detached due to updated data center.
- if (slot->AssignedTenant
- && !slot->IsPinned
+ NIceDb::TUpdate<Schema::Slots::DataCenter>(DataCenterFromString(slot->DataCenter)),
+ NIceDb::TUpdate<Schema::Slots::DataCenterName>(slot->DataCenter),
+ NIceDb::TUpdate<Schema::Slots::AssignedTenant>(""),
+ NIceDb::TUpdate<Schema::Slots::UsedAsType>(""),
+ NIceDb::TUpdate<Schema::Slots::UsedAsDataCenter>(0),
+ NIceDb::TUpdate<Schema::Slots::UsedAsDataCenterName>(""),
+ NIceDb::TUpdate<Schema::Slots::UsedAsCollocationGroup>(0),
+ NIceDb::TUpdate<Schema::Slots::UsedAsForceLocation>(true),
+ NIceDb::TUpdate<Schema::Slots::UsedAsForceCollocation>(false));
+}
+
+void TTenantSlotBroker::SlotConnected(TSlot::TPtr slot)
+{
+ if (!slot->IsConnected) {
+ slot->IsConnected = true;
+ Counters->ConnectedSlots(slot->Type, slot->DataCenter)->Inc();
+ Counters->DisconnectedSlots(slot->Type, slot->DataCenter)->Dec();
+ }
+}
+
+void TTenantSlotBroker::SlotDisconnected(TSlot::TPtr slot)
+{
+ if (slot->IsConnected) {
+ slot->IsConnected = false;
+ Counters->ConnectedSlots(slot->Type, slot->DataCenter)->Dec();
+ Counters->DisconnectedSlots(slot->Type, slot->DataCenter)->Inc();
+ }
+}
+
+bool TTenantSlotBroker::UpdateSlotDataCenter(TSlot::TPtr slot,
+ const TString &dataCenter,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ if (slot->DataCenter == dataCenter)
+ return false;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Update data center (" << dataCenter << ") for "
+ << slot->IdString(true));
+
+ bool res = false;
+ // Check if slot has to be detached due to updated data center.
+ if (slot->AssignedTenant
+ && !slot->IsPinned
&& (slot->UsedAs.DataCenter != ANY_DATA_CENTER
- || slot->UsedAs.CollocationGroup)) {
- DetachSlot(slot, txc, ctx);
- res = true;
- }
-
- if (slot->IsFree())
- FreeSlots.Remove(slot);
-
- RemoveSlotFromCounters(slot);
-
- slot->DataCenter = dataCenter;
-
- AddSlotToCounters(slot);
-
- NIceDb::TNiceDb db(txc.DB);
- auto row = db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId);
- row.Update(NIceDb::TUpdate<Schema::Slots::DataCenterName>(dataCenter));
- row.Update(NIceDb::TUpdate<Schema::Slots::DataCenter>(DataCenterFromString(dataCenter)));
-
- if (slot->IsFree()) {
- FreeSlots.Add(slot);
- res = true;
- }
-
- return res;
-}
-
-bool TTenantSlotBroker::UpdateSlotType(TSlot::TPtr slot,
- const TString &type,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- if (slot->Type == type)
- return false;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Update type (" << type << ") for " << slot->IdString(true));
-
- bool res = false;
- // Check if slot has to be detached due to updated type.
- if (slot->AssignedTenant
- && !slot->IsPinned
- && slot->UsedAs.SlotType != ANY_SLOT_TYPE
- && slot->UsedAs.SlotType != type) {
- DetachSlot(slot, txc, ctx);
- res = true;
- }
-
- if (slot->IsFree())
- FreeSlots.Remove(slot);
-
- RemoveSlotFromCounters(slot);
-
- slot->Type = type;
-
- AddSlotToCounters(slot);
-
- NIceDb::TNiceDb db(txc.DB);
- auto row = db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId);
- row.Update(NIceDb::TUpdate<Schema::Slots::SlotType>(type));
-
- if (slot->IsFree()) {
- FreeSlots.Add(slot);
- res = true;
- }
-
- return res;
-}
-
-void TTenantSlotBroker::RemoveSlot(TSlot::TPtr slot,
- TTransactionContext &txc,
- const TActorContext &/*ctx*/)
-{
- if (slot->IsPinned)
- slot->AssignedTenant->RemovePinnedSlot(slot);
- else if (slot->AssignedTenant)
- DetachSlotNoConfigureNoDb(slot);
- if (slot->IsFree())
- FreeSlots.Remove(slot);
- Slots.erase(slot->Id);
-
- RemoveSlotFromCounters(slot);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId).Delete();
-
- auto &slots = SlotsByNodeId[slot->Id.NodeId];
- slots.erase(slot);
- if (slots.empty()) {
- SlotsByNodeId.erase(slot->Id.NodeId);
- }
-}
-
-void TTenantSlotBroker::AddSlotToCounters(TSlot::TPtr slot)
-{
- if (slot->IsConnected)
- Counters->ConnectedSlots(slot->Type, slot->DataCenter)->Inc();
- else
- Counters->DisconnectedSlots(slot->Type, slot->DataCenter)->Inc();
-
- if (slot->IsPinned)
- Counters->PinnedSlots(slot->Type, slot->DataCenter)->Inc();
- else if (slot->AssignedTenant)
- Counters->AssignedSlots(slot->Type, slot->DataCenter)->Inc();
- else if (slot->IsBanned)
- Counters->BannedSlots(slot->Type, slot->DataCenter)->Inc();
- else
- Counters->FreeSlots(slot->Type, slot->DataCenter)->Inc();
-}
-
-void TTenantSlotBroker::RemoveSlotFromCounters(TSlot::TPtr slot)
-{
- if (slot->IsConnected)
- Counters->ConnectedSlots(slot->Type, slot->DataCenter)->Dec();
- else
- Counters->DisconnectedSlots(slot->Type, slot->DataCenter)->Dec();
-
- if (slot->IsPinned)
- Counters->PinnedSlots(slot->Type, slot->DataCenter)->Dec();
- else if (slot->AssignedTenant)
- Counters->AssignedSlots(slot->Type, slot->DataCenter)->Dec();
- else if (slot->IsBanned)
- Counters->BannedSlots(slot->Type, slot->DataCenter)->Dec();
- else
- Counters->FreeSlots(slot->Type, slot->DataCenter)->Dec();
-}
-
-void TTenantSlotBroker::DetachSlotNoConfigureNoDb(TSlot::TPtr slot,
- bool updateUnhappy)
-{
- auto tenant = slot->AssignedTenant;
- if (!tenant)
- return;
-
- if (updateUnhappy)
- RemoveUnhappyTenant(tenant);
-
+ || slot->UsedAs.CollocationGroup)) {
+ DetachSlot(slot, txc, ctx);
+ res = true;
+ }
+
+ if (slot->IsFree())
+ FreeSlots.Remove(slot);
+
+ RemoveSlotFromCounters(slot);
+
+ slot->DataCenter = dataCenter;
+
+ AddSlotToCounters(slot);
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto row = db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId);
+ row.Update(NIceDb::TUpdate<Schema::Slots::DataCenterName>(dataCenter));
+ row.Update(NIceDb::TUpdate<Schema::Slots::DataCenter>(DataCenterFromString(dataCenter)));
+
+ if (slot->IsFree()) {
+ FreeSlots.Add(slot);
+ res = true;
+ }
+
+ return res;
+}
+
+bool TTenantSlotBroker::UpdateSlotType(TSlot::TPtr slot,
+ const TString &type,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ if (slot->Type == type)
+ return false;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Update type (" << type << ") for " << slot->IdString(true));
+
+ bool res = false;
+ // Check if slot has to be detached due to updated type.
+ if (slot->AssignedTenant
+ && !slot->IsPinned
+ && slot->UsedAs.SlotType != ANY_SLOT_TYPE
+ && slot->UsedAs.SlotType != type) {
+ DetachSlot(slot, txc, ctx);
+ res = true;
+ }
+
+ if (slot->IsFree())
+ FreeSlots.Remove(slot);
+
+ RemoveSlotFromCounters(slot);
+
+ slot->Type = type;
+
+ AddSlotToCounters(slot);
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto row = db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId);
+ row.Update(NIceDb::TUpdate<Schema::Slots::SlotType>(type));
+
+ if (slot->IsFree()) {
+ FreeSlots.Add(slot);
+ res = true;
+ }
+
+ return res;
+}
+
+void TTenantSlotBroker::RemoveSlot(TSlot::TPtr slot,
+ TTransactionContext &txc,
+ const TActorContext &/*ctx*/)
+{
+ if (slot->IsPinned)
+ slot->AssignedTenant->RemovePinnedSlot(slot);
+ else if (slot->AssignedTenant)
+ DetachSlotNoConfigureNoDb(slot);
+ if (slot->IsFree())
+ FreeSlots.Remove(slot);
+ Slots.erase(slot->Id);
+
+ RemoveSlotFromCounters(slot);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId).Delete();
+
+ auto &slots = SlotsByNodeId[slot->Id.NodeId];
+ slots.erase(slot);
+ if (slots.empty()) {
+ SlotsByNodeId.erase(slot->Id.NodeId);
+ }
+}
+
+void TTenantSlotBroker::AddSlotToCounters(TSlot::TPtr slot)
+{
+ if (slot->IsConnected)
+ Counters->ConnectedSlots(slot->Type, slot->DataCenter)->Inc();
+ else
+ Counters->DisconnectedSlots(slot->Type, slot->DataCenter)->Inc();
+
+ if (slot->IsPinned)
+ Counters->PinnedSlots(slot->Type, slot->DataCenter)->Inc();
+ else if (slot->AssignedTenant)
+ Counters->AssignedSlots(slot->Type, slot->DataCenter)->Inc();
+ else if (slot->IsBanned)
+ Counters->BannedSlots(slot->Type, slot->DataCenter)->Inc();
+ else
+ Counters->FreeSlots(slot->Type, slot->DataCenter)->Inc();
+}
+
+void TTenantSlotBroker::RemoveSlotFromCounters(TSlot::TPtr slot)
+{
+ if (slot->IsConnected)
+ Counters->ConnectedSlots(slot->Type, slot->DataCenter)->Dec();
+ else
+ Counters->DisconnectedSlots(slot->Type, slot->DataCenter)->Dec();
+
+ if (slot->IsPinned)
+ Counters->PinnedSlots(slot->Type, slot->DataCenter)->Dec();
+ else if (slot->AssignedTenant)
+ Counters->AssignedSlots(slot->Type, slot->DataCenter)->Dec();
+ else if (slot->IsBanned)
+ Counters->BannedSlots(slot->Type, slot->DataCenter)->Dec();
+ else
+ Counters->FreeSlots(slot->Type, slot->DataCenter)->Dec();
+}
+
+void TTenantSlotBroker::DetachSlotNoConfigureNoDb(TSlot::TPtr slot,
+ bool updateUnhappy)
+{
+ auto tenant = slot->AssignedTenant;
+ if (!tenant)
+ return;
+
+ if (updateUnhappy)
+ RemoveUnhappyTenant(tenant);
+
Y_VERIFY_DEBUG(!UnhappyTenants.contains(tenant));
Y_VERIFY_DEBUG(!MisplacedTenants.contains(tenant));
Y_VERIFY_DEBUG(!SplitTenants.contains(tenant));
-
- auto allocation = tenant->GetAllocation(slot->UsedAs);
- allocation->RemoveAssignedSlot(slot);
- if (slot->IsPending())
- allocation->DecPending();
- allocation->IncMissing();
+
+ auto allocation = tenant->GetAllocation(slot->UsedAs);
+ allocation->RemoveAssignedSlot(slot);
+ if (slot->IsPending())
+ allocation->DecPending();
+ allocation->IncMissing();
if (allocation->Description.DataCenter != ANY_DATA_CENTER
- && allocation->Description.DataCenter != slot->DataCenter)
- allocation->DecMisplaced();
- if (allocation->Group
- && allocation->Group->GetPreferredDataCenter() != slot->DataCenter)
- allocation->DecSplit();
-
- slot->AssignedTenant = nullptr;
- tenant->MarkSlotLabelAsUnused(slot->Label);
-
- Counters->AssignedSlots(slot->Type, slot->DataCenter)->Dec();
- Counters->FreeSlots(slot->Type, slot->DataCenter)->Inc();
-
- if (updateUnhappy)
- AddUnhappyTenant(tenant);
- if (slot->IsFree())
- FreeSlots.Add(slot);
-}
-
-void TTenantSlotBroker::DetachSlotNoConfigure(TSlot::TPtr slot,
- TTransactionContext &txc,
- bool updateUnhappy)
-{
- NIceDb::TNiceDb db(txc.DB);
- auto row = db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId);
- row.Update(NIceDb::TUpdate<Schema::Slots::AssignedTenant>(""),
- NIceDb::TUpdate<Schema::Slots::Label>(""));
-
- DetachSlotNoConfigureNoDb(slot, updateUnhappy);
-}
-
-void TTenantSlotBroker::DetachSlot(TSlot::TPtr slot,
- TTransactionContext &txc,
- const TActorContext &ctx,
- bool updateUnhappy)
-{
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Detach tenant from " << slot->IdString(true));
-
- DetachSlotNoConfigure(slot, txc, updateUnhappy);
-
- if (slot->IsConnected)
- SendConfigureSlot(slot, ctx);
-}
-
-void TTenantSlotBroker::AttachSlotNoConfigureNoDb(TSlot::TPtr slot,
- TTenant::TPtr tenant,
- const TSlotDescription &usedAs,
- const TString &label)
-{
- Y_VERIFY(!slot->AssignedTenant);
+ && allocation->Description.DataCenter != slot->DataCenter)
+ allocation->DecMisplaced();
+ if (allocation->Group
+ && allocation->Group->GetPreferredDataCenter() != slot->DataCenter)
+ allocation->DecSplit();
+
+ slot->AssignedTenant = nullptr;
+ tenant->MarkSlotLabelAsUnused(slot->Label);
+
+ Counters->AssignedSlots(slot->Type, slot->DataCenter)->Dec();
+ Counters->FreeSlots(slot->Type, slot->DataCenter)->Inc();
+
+ if (updateUnhappy)
+ AddUnhappyTenant(tenant);
+ if (slot->IsFree())
+ FreeSlots.Add(slot);
+}
+
+void TTenantSlotBroker::DetachSlotNoConfigure(TSlot::TPtr slot,
+ TTransactionContext &txc,
+ bool updateUnhappy)
+{
+ NIceDb::TNiceDb db(txc.DB);
+ auto row = db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId);
+ row.Update(NIceDb::TUpdate<Schema::Slots::AssignedTenant>(""),
+ NIceDb::TUpdate<Schema::Slots::Label>(""));
+
+ DetachSlotNoConfigureNoDb(slot, updateUnhappy);
+}
+
+void TTenantSlotBroker::DetachSlot(TSlot::TPtr slot,
+ TTransactionContext &txc,
+ const TActorContext &ctx,
+ bool updateUnhappy)
+{
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Detach tenant from " << slot->IdString(true));
+
+ DetachSlotNoConfigure(slot, txc, updateUnhappy);
+
+ if (slot->IsConnected)
+ SendConfigureSlot(slot, ctx);
+}
+
+void TTenantSlotBroker::AttachSlotNoConfigureNoDb(TSlot::TPtr slot,
+ TTenant::TPtr tenant,
+ const TSlotDescription &usedAs,
+ const TString &label)
+{
+ Y_VERIFY(!slot->AssignedTenant);
Y_VERIFY_DEBUG(!UnhappyTenants.contains(tenant));
-
- if (slot->IsFree())
- FreeSlots.Remove(slot);
-
- slot->AssignedTenant = tenant;
- slot->UsedAs = usedAs;
- slot->Label = label;
-
- tenant->MarkSlotLabelAsUsed(label);
-
- auto allocation = tenant->GetAllocation(usedAs);
- allocation->AddAssignedSlot(slot);
- allocation->DecMissing();
+
+ if (slot->IsFree())
+ FreeSlots.Remove(slot);
+
+ slot->AssignedTenant = tenant;
+ slot->UsedAs = usedAs;
+ slot->Label = label;
+
+ tenant->MarkSlotLabelAsUsed(label);
+
+ auto allocation = tenant->GetAllocation(usedAs);
+ allocation->AddAssignedSlot(slot);
+ allocation->DecMissing();
if (allocation->Description.DataCenter != ANY_DATA_CENTER
- && allocation->Description.DataCenter != slot->DataCenter)
- allocation->IncMisplaced();
- if (allocation->Group
- && allocation->Group->GetPreferredDataCenter() != slot->DataCenter)
- allocation->IncSplit();
-
- Counters->FreeSlots(slot->Type, slot->DataCenter)->Dec();
- Counters->AssignedSlots(slot->Type, slot->DataCenter)->Inc();
-
- if (slot->IsPending())
- allocation->IncPending();
-}
-
-void TTenantSlotBroker::AttachSlotNoConfigure(TSlot::TPtr slot,
- TTenant::TPtr tenant,
- const TSlotDescription &usedAs,
- const TString &label,
- TTransactionContext &txc)
-{
- AttachSlotNoConfigureNoDb(slot, tenant, usedAs, label);
-
- NIceDb::TNiceDb db(txc.DB);
- auto row = db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId);
- row.Update(NIceDb::TUpdate<Schema::Slots::AssignedTenant>(tenant->Name),
- NIceDb::TUpdate<Schema::Slots::UsedAsType>(usedAs.SlotType),
- NIceDb::TUpdate<Schema::Slots::UsedAsDataCenter>(DataCenterFromString(usedAs.DataCenter)),
- NIceDb::TUpdate<Schema::Slots::Label>(label),
- NIceDb::TUpdate<Schema::Slots::UsedAsDataCenterName>(usedAs.DataCenter),
- NIceDb::TUpdate<Schema::Slots::UsedAsCollocationGroup>(usedAs.CollocationGroup),
- NIceDb::TUpdate<Schema::Slots::UsedAsForceLocation>(usedAs.ForceLocation),
- NIceDb::TUpdate<Schema::Slots::UsedAsForceCollocation>(usedAs.ForceCollocation));
-}
-
-void TTenantSlotBroker::AttachSlot(TSlot::TPtr slot,
- TTenant::TPtr tenant,
- const TSlotDescription &usedAs,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Attach tenant " << tenant->Name << " to " << slot->IdString(true));
-
- AttachSlotNoConfigure(slot, tenant, usedAs, tenant->GetFirstUnusedSlotLabel(), txc);
-
- if (slot->IsConnected)
- SendConfigureSlot(slot, ctx);
-}
-
-bool TTenantSlotBroker::MoveMisplacedSlots(TTenant::TPtr tenant,
- TSlotsAllocation::TPtr allocation,
- bool singleSlot,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- bool assigned = false;
- Y_VERIFY(!allocation->Group);
- Y_VERIFY(!allocation->Description.ForceLocation);
- while (allocation->MisplacedCount) {
- TSlot::TPtr freeSlot = FreeSlots.Find(allocation->Description.SlotType,
- allocation->Description.DataCenter);
-
- if (!freeSlot)
- break;
-
- // Find misplaced slot and detach it.
- // TODO: probably misplaced slots index should be added.
- for (auto slot : allocation->AssignedSlots) {
- if (slot->DataCenter != allocation->Description.DataCenter) {
- DetachSlot(slot, txc, ctx, false);
- break;
- }
- }
-
- AttachSlot(freeSlot, tenant, allocation->Description, txc, ctx);
- assigned = true;
-
- if (singleSlot)
- break;
- }
- return assigned;
-}
-
-bool TTenantSlotBroker::AssignFreeSlots(TTenant::TPtr tenant,
- bool singleSlot,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- bool assigned = false;
- THashSet<ui32> visitedGroups;
- auto prev = tenant->GetMissing().end();
- while (!tenant->GetMissing().empty()
- && !FreeSlots.FreeSlotsByDataCenter.empty()) {
- // Slots allocation for group may remove current and some of following
- // allocations from set of missing. So we keep iterator for prev which
- // is guaranteed to stay valid and use it to get current allocation.
- auto cur = prev;
- if (cur == tenant->GetMissing().end())
- cur = tenant->GetMissing().begin();
- else
- ++cur;
-
- if (cur == tenant->GetMissing().end())
- break;
-
- auto allocation = *cur;
-
- if (allocation->Group) {
+ && allocation->Description.DataCenter != slot->DataCenter)
+ allocation->IncMisplaced();
+ if (allocation->Group
+ && allocation->Group->GetPreferredDataCenter() != slot->DataCenter)
+ allocation->IncSplit();
+
+ Counters->FreeSlots(slot->Type, slot->DataCenter)->Dec();
+ Counters->AssignedSlots(slot->Type, slot->DataCenter)->Inc();
+
+ if (slot->IsPending())
+ allocation->IncPending();
+}
+
+void TTenantSlotBroker::AttachSlotNoConfigure(TSlot::TPtr slot,
+ TTenant::TPtr tenant,
+ const TSlotDescription &usedAs,
+ const TString &label,
+ TTransactionContext &txc)
+{
+ AttachSlotNoConfigureNoDb(slot, tenant, usedAs, label);
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto row = db.Table<Schema::Slots>().Key(slot->Id.NodeId, slot->Id.SlotId);
+ row.Update(NIceDb::TUpdate<Schema::Slots::AssignedTenant>(tenant->Name),
+ NIceDb::TUpdate<Schema::Slots::UsedAsType>(usedAs.SlotType),
+ NIceDb::TUpdate<Schema::Slots::UsedAsDataCenter>(DataCenterFromString(usedAs.DataCenter)),
+ NIceDb::TUpdate<Schema::Slots::Label>(label),
+ NIceDb::TUpdate<Schema::Slots::UsedAsDataCenterName>(usedAs.DataCenter),
+ NIceDb::TUpdate<Schema::Slots::UsedAsCollocationGroup>(usedAs.CollocationGroup),
+ NIceDb::TUpdate<Schema::Slots::UsedAsForceLocation>(usedAs.ForceLocation),
+ NIceDb::TUpdate<Schema::Slots::UsedAsForceCollocation>(usedAs.ForceCollocation));
+}
+
+void TTenantSlotBroker::AttachSlot(TSlot::TPtr slot,
+ TTenant::TPtr tenant,
+ const TSlotDescription &usedAs,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Attach tenant " << tenant->Name << " to " << slot->IdString(true));
+
+ AttachSlotNoConfigure(slot, tenant, usedAs, tenant->GetFirstUnusedSlotLabel(), txc);
+
+ if (slot->IsConnected)
+ SendConfigureSlot(slot, ctx);
+}
+
+bool TTenantSlotBroker::MoveMisplacedSlots(TTenant::TPtr tenant,
+ TSlotsAllocation::TPtr allocation,
+ bool singleSlot,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ bool assigned = false;
+ Y_VERIFY(!allocation->Group);
+ Y_VERIFY(!allocation->Description.ForceLocation);
+ while (allocation->MisplacedCount) {
+ TSlot::TPtr freeSlot = FreeSlots.Find(allocation->Description.SlotType,
+ allocation->Description.DataCenter);
+
+ if (!freeSlot)
+ break;
+
+ // Find misplaced slot and detach it.
+ // TODO: probably misplaced slots index should be added.
+ for (auto slot : allocation->AssignedSlots) {
+ if (slot->DataCenter != allocation->Description.DataCenter) {
+ DetachSlot(slot, txc, ctx, false);
+ break;
+ }
+ }
+
+ AttachSlot(freeSlot, tenant, allocation->Description, txc, ctx);
+ assigned = true;
+
+ if (singleSlot)
+ break;
+ }
+ return assigned;
+}
+
+bool TTenantSlotBroker::AssignFreeSlots(TTenant::TPtr tenant,
+ bool singleSlot,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ bool assigned = false;
+ THashSet<ui32> visitedGroups;
+ auto prev = tenant->GetMissing().end();
+ while (!tenant->GetMissing().empty()
+ && !FreeSlots.FreeSlotsByDataCenter.empty()) {
+ // Slots allocation for group may remove current and some of following
+ // allocations from set of missing. So we keep iterator for prev which
+ // is guaranteed to stay valid and use it to get current allocation.
+ auto cur = prev;
+ if (cur == tenant->GetMissing().end())
+ cur = tenant->GetMissing().begin();
+ else
+ ++cur;
+
+ if (cur == tenant->GetMissing().end())
+ break;
+
+ auto allocation = *cur;
+
+ if (allocation->Group) {
if (!visitedGroups.contains(allocation->Group->Id)) {
- if (AssignFreeSlotsForGroup(tenant, allocation->Group, txc, ctx))
- assigned = true;
- visitedGroups.insert(allocation->Group->Id);
- }
- } else {
- while (allocation->MissingCount) {
- TSlot::TPtr freeSlot = FreeSlots.Find(allocation->Description.SlotType,
- allocation->Description.DataCenter);
-
- // Try to find slot in another data center if allowed.
- if (!freeSlot && !allocation->Description.ForceLocation)
- freeSlot = FreeSlots.Find(allocation->Description.SlotType,
+ if (AssignFreeSlotsForGroup(tenant, allocation->Group, txc, ctx))
+ assigned = true;
+ visitedGroups.insert(allocation->Group->Id);
+ }
+ } else {
+ while (allocation->MissingCount) {
+ TSlot::TPtr freeSlot = FreeSlots.Find(allocation->Description.SlotType,
+ allocation->Description.DataCenter);
+
+ // Try to find slot in another data center if allowed.
+ if (!freeSlot && !allocation->Description.ForceLocation)
+ freeSlot = FreeSlots.Find(allocation->Description.SlotType,
ANY_DATA_CENTER);
-
- if (!freeSlot)
- break;
-
- AttachSlot(freeSlot, tenant, allocation->Description, txc, ctx);
- assigned = true;
- if (singleSlot)
- break;
- }
- }
-
- if (singleSlot && assigned)
- break;
-
- // Move prev iterator only if current allocation was not removed.
- if (allocation->MissingCount) {
- if (prev == tenant->GetMissing().end()) {
- prev = tenant->GetMissing().begin();
- Y_VERIFY(*prev == allocation);
- } else {
- ++prev;
- }
- }
- }
-
- return assigned;
-}
-
-TTenantSlotBroker::TSlot::TPtr
-TTenantSlotBroker::ExtractSlot(TFreeSlotsIndex &primary,
- TFreeSlotsIndex &secondary,
- const TString &type,
- const TString &dc) const
-{
- auto res = primary.Find(type, dc);
- if (res) {
- primary.Remove(res);
- } else {
- res = secondary.Find(type, dc);
- if (res)
- secondary.Remove(res);
- }
- return res;
-}
-
-TTenantSlotBroker::TLayout::TPtr
-TTenantSlotBroker::ComputeLayoutForGroup(TCollocationGroup::TPtr group,
- const TString &dc)
-{
- TLayout::TPtr layout = new TLayout;
- TFreeSlotsIndex index = FreeSlots;
- // Currently assigned slots are more prioritized to avoid useless detach.
- TFreeSlotsIndex current;
-
- for (auto allocation : group->Allocations) {
- for (auto slot : allocation->AssignedSlots) {
- current.Add(slot);
- }
- }
-
- // On the first round we assign slots to allocations with no preferred
- // data center or with preferred data center equal to the group one.
- // Assign only perfectly matching slots.
- for (auto allocation : group->Allocations) {
- auto &assigned = layout->AssignedSlots[allocation];
-
+
+ if (!freeSlot)
+ break;
+
+ AttachSlot(freeSlot, tenant, allocation->Description, txc, ctx);
+ assigned = true;
+ if (singleSlot)
+ break;
+ }
+ }
+
+ if (singleSlot && assigned)
+ break;
+
+ // Move prev iterator only if current allocation was not removed.
+ if (allocation->MissingCount) {
+ if (prev == tenant->GetMissing().end()) {
+ prev = tenant->GetMissing().begin();
+ Y_VERIFY(*prev == allocation);
+ } else {
+ ++prev;
+ }
+ }
+ }
+
+ return assigned;
+}
+
+TTenantSlotBroker::TSlot::TPtr
+TTenantSlotBroker::ExtractSlot(TFreeSlotsIndex &primary,
+ TFreeSlotsIndex &secondary,
+ const TString &type,
+ const TString &dc) const
+{
+ auto res = primary.Find(type, dc);
+ if (res) {
+ primary.Remove(res);
+ } else {
+ res = secondary.Find(type, dc);
+ if (res)
+ secondary.Remove(res);
+ }
+ return res;
+}
+
+TTenantSlotBroker::TLayout::TPtr
+TTenantSlotBroker::ComputeLayoutForGroup(TCollocationGroup::TPtr group,
+ const TString &dc)
+{
+ TLayout::TPtr layout = new TLayout;
+ TFreeSlotsIndex index = FreeSlots;
+ // Currently assigned slots are more prioritized to avoid useless detach.
+ TFreeSlotsIndex current;
+
+ for (auto allocation : group->Allocations) {
+ for (auto slot : allocation->AssignedSlots) {
+ current.Add(slot);
+ }
+ }
+
+ // On the first round we assign slots to allocations with no preferred
+ // data center or with preferred data center equal to the group one.
+ // Assign only perfectly matching slots.
+ for (auto allocation : group->Allocations) {
+ auto &assigned = layout->AssignedSlots[allocation];
+
if (allocation->Description.DataCenter != ANY_DATA_CENTER
- && allocation->Description.DataCenter != dc)
- continue;
-
- while (assigned.size() < allocation->RequiredCount) {
- auto slot = ExtractSlot(current, index, allocation->Description.SlotType, dc);
- if (slot) {
- assigned.insert(slot);
- } else {
- break;
- }
- }
- }
-
- // On the second round we process allocations mith mismatched preferred
- // data centers. Assign only either misplaced or split slots (not both).
- for (auto allocation : group->Allocations) {
- auto &assigned = layout->AssignedSlots[allocation];
-
+ && allocation->Description.DataCenter != dc)
+ continue;
+
+ while (assigned.size() < allocation->RequiredCount) {
+ auto slot = ExtractSlot(current, index, allocation->Description.SlotType, dc);
+ if (slot) {
+ assigned.insert(slot);
+ } else {
+ break;
+ }
+ }
+ }
+
+ // On the second round we process allocations mith mismatched preferred
+ // data centers. Assign only either misplaced or split slots (not both).
+ for (auto allocation : group->Allocations) {
+ auto &assigned = layout->AssignedSlots[allocation];
+
if (allocation->Description.DataCenter == ANY_DATA_CENTER
- || allocation->Description.DataCenter == dc)
- continue;
-
- while (assigned.size() < allocation->RequiredCount) {
- auto slot = ExtractSlot(current, index, allocation->Description.SlotType, dc);
- if (slot) {
- assigned.insert(slot);
- ++layout->MisplacedCount;
- } else {
- break;
- }
- }
-
- if (allocation->Description.ForceCollocation)
- continue;
-
- while (assigned.size() < allocation->RequiredCount) {
- auto slot = ExtractSlot(current, index, allocation->Description.SlotType,
- allocation->Description.DataCenter);
- if (slot) {
- assigned.insert(slot);
- ++layout->SplitCount;
- } else {
- break;
- }
- }
- }
-
- // On the third round we assign the rest of slots.
- for (auto allocation : group->Allocations) {
- auto &assigned = layout->AssignedSlots[allocation];
-
- if (allocation->Description.ForceCollocation)
- continue;
-
- while (assigned.size() < allocation->RequiredCount) {
- auto slot = ExtractSlot(current, index, allocation->Description.SlotType,
+ || allocation->Description.DataCenter == dc)
+ continue;
+
+ while (assigned.size() < allocation->RequiredCount) {
+ auto slot = ExtractSlot(current, index, allocation->Description.SlotType, dc);
+ if (slot) {
+ assigned.insert(slot);
+ ++layout->MisplacedCount;
+ } else {
+ break;
+ }
+ }
+
+ if (allocation->Description.ForceCollocation)
+ continue;
+
+ while (assigned.size() < allocation->RequiredCount) {
+ auto slot = ExtractSlot(current, index, allocation->Description.SlotType,
+ allocation->Description.DataCenter);
+ if (slot) {
+ assigned.insert(slot);
+ ++layout->SplitCount;
+ } else {
+ break;
+ }
+ }
+ }
+
+ // On the third round we assign the rest of slots.
+ for (auto allocation : group->Allocations) {
+ auto &assigned = layout->AssignedSlots[allocation];
+
+ if (allocation->Description.ForceCollocation)
+ continue;
+
+ while (assigned.size() < allocation->RequiredCount) {
+ auto slot = ExtractSlot(current, index, allocation->Description.SlotType,
ANY_DATA_CENTER);
- if (slot) {
- assigned.insert(slot);
+ if (slot) {
+ assigned.insert(slot);
if (allocation->Description.DataCenter != ANY_DATA_CENTER
- && allocation->Description.DataCenter != slot->DataCenter)
- ++layout->MisplacedCount;
- Y_VERIFY(slot->DataCenter != dc);
- ++layout->SplitCount;
- } else {
- break;
- }
- }
- }
-
- // Compute total missing.
- for (auto allocation : group->Allocations)
- layout->MissingCount += allocation->RequiredCount - layout->AssignedSlots[allocation].size();
- // Compute total detached.
- for (auto &pr1 : current.FreeSlotsByType)
- for (auto &pr2 : pr1.second)
- layout->DetachCount += pr2.second.size();
-
- return layout;
-}
-
-double TTenantSlotBroker::ComputeLayoutPenalty(ui64 required,
- ui64 missing,
- ui64 misplaced,
- ui64 split,
- ui64 detached) const
-{
- double res = 0;
- Y_UNUSED(required);
- res += (double)missing;
- res += (double)misplaced * 0.1;
- res += (double)split * 0.95;
- res += (double)detached * 0.05;
- return res;
-}
-
-void TTenantSlotBroker::ApplyLayout(TTenant::TPtr tenant,
- TLayout::TPtr layout,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- THashSet<TSlot::TPtr> allAssignedSlots;
-
- for (auto &pr : layout->AssignedSlots)
- for (auto &slot : pr.second)
- allAssignedSlots.insert(slot);
-
- for (auto &pr : layout->AssignedSlots) {
- auto allocation = pr.first;
- auto &slots = pr.second;
-
- for (auto it = allocation->AssignedSlots.begin(); it != allocation->AssignedSlots.end(); ) {
- auto slot = *(it++);
+ && allocation->Description.DataCenter != slot->DataCenter)
+ ++layout->MisplacedCount;
+ Y_VERIFY(slot->DataCenter != dc);
+ ++layout->SplitCount;
+ } else {
+ break;
+ }
+ }
+ }
+
+ // Compute total missing.
+ for (auto allocation : group->Allocations)
+ layout->MissingCount += allocation->RequiredCount - layout->AssignedSlots[allocation].size();
+ // Compute total detached.
+ for (auto &pr1 : current.FreeSlotsByType)
+ for (auto &pr2 : pr1.second)
+ layout->DetachCount += pr2.second.size();
+
+ return layout;
+}
+
+double TTenantSlotBroker::ComputeLayoutPenalty(ui64 required,
+ ui64 missing,
+ ui64 misplaced,
+ ui64 split,
+ ui64 detached) const
+{
+ double res = 0;
+ Y_UNUSED(required);
+ res += (double)missing;
+ res += (double)misplaced * 0.1;
+ res += (double)split * 0.95;
+ res += (double)detached * 0.05;
+ return res;
+}
+
+void TTenantSlotBroker::ApplyLayout(TTenant::TPtr tenant,
+ TLayout::TPtr layout,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ THashSet<TSlot::TPtr> allAssignedSlots;
+
+ for (auto &pr : layout->AssignedSlots)
+ for (auto &slot : pr.second)
+ allAssignedSlots.insert(slot);
+
+ for (auto &pr : layout->AssignedSlots) {
+ auto allocation = pr.first;
+ auto &slots = pr.second;
+
+ for (auto it = allocation->AssignedSlots.begin(); it != allocation->AssignedSlots.end(); ) {
+ auto slot = *(it++);
if (!allAssignedSlots.contains(slot))
- DetachSlot(slot, txc, ctx, false);
- }
-
- for (auto slot : slots) {
+ DetachSlot(slot, txc, ctx, false);
+ }
+
+ for (auto slot : slots) {
if (!allocation->AssignedSlots.contains(slot)) {
- if (slot->AssignedTenant) {
- auto label = slot->Label;
- // Currently we are not expected to change slot's owner.
- Y_VERIFY(slot->AssignedTenant == tenant);
- DetachSlotNoConfigureNoDb(slot, false);
- AttachSlotNoConfigure(slot, tenant, allocation->Description, label, txc);
- } else {
- AttachSlot(slot, tenant, allocation->Description, txc, ctx);
- }
- }
- }
- }
-}
-
-bool TTenantSlotBroker::AssignFreeSlotsForGroup(TTenant::TPtr tenant,
- TCollocationGroup::TPtr group,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- // DataCenter -> Layout
- THashMap<TString, TLayout::TPtr> layouts;
-
- THashSet<TString> preferredDCs;
- ui64 required = 0;
- ui64 currentMissing = 0;
- ui64 currentMisplaced = 0;
- ui64 currentSplit = 0;
- TString currentDC = group->GetPreferredDataCenter();
- for (auto allocation : group->Allocations) {
- required += allocation->RequiredCount;
- currentMissing += allocation->MissingCount;
- currentMisplaced += allocation->MisplacedCount;
- currentSplit += allocation->SplitCount;
+ if (slot->AssignedTenant) {
+ auto label = slot->Label;
+ // Currently we are not expected to change slot's owner.
+ Y_VERIFY(slot->AssignedTenant == tenant);
+ DetachSlotNoConfigureNoDb(slot, false);
+ AttachSlotNoConfigure(slot, tenant, allocation->Description, label, txc);
+ } else {
+ AttachSlot(slot, tenant, allocation->Description, txc, ctx);
+ }
+ }
+ }
+ }
+}
+
+bool TTenantSlotBroker::AssignFreeSlotsForGroup(TTenant::TPtr tenant,
+ TCollocationGroup::TPtr group,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ // DataCenter -> Layout
+ THashMap<TString, TLayout::TPtr> layouts;
+
+ THashSet<TString> preferredDCs;
+ ui64 required = 0;
+ ui64 currentMissing = 0;
+ ui64 currentMisplaced = 0;
+ ui64 currentSplit = 0;
+ TString currentDC = group->GetPreferredDataCenter();
+ for (auto allocation : group->Allocations) {
+ required += allocation->RequiredCount;
+ currentMissing += allocation->MissingCount;
+ currentMisplaced += allocation->MisplacedCount;
+ currentSplit += allocation->SplitCount;
if (allocation->Description.DataCenter != ANY_DATA_CENTER) {
- Y_VERIFY(!allocation->Description.ForceLocation);
- preferredDCs.insert(allocation->Description.DataCenter);
- }
- }
-
- // For each preferred data center check if we can find perfect layout.
- // Instantly apply one if found.
- for (auto &dc : preferredDCs) {
- auto layout = ComputeLayoutForGroup(group, dc);
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Computed layout for group " << group->Id << " in "
- << dc << ": " << layout->ToString());
- if (!layout->MissingCount && !layout->MisplacedCount && !layout->SplitCount) {
- group->SetPreferredDataCenter(dc);
- ApplyLayout(tenant, layout, txc, ctx);
- return true;
- }
- layouts[dc] = layout;
- }
-
- // Check if it's OK to stay in current data center.
+ Y_VERIFY(!allocation->Description.ForceLocation);
+ preferredDCs.insert(allocation->Description.DataCenter);
+ }
+ }
+
+ // For each preferred data center check if we can find perfect layout.
+ // Instantly apply one if found.
+ for (auto &dc : preferredDCs) {
+ auto layout = ComputeLayoutForGroup(group, dc);
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Computed layout for group " << group->Id << " in "
+ << dc << ": " << layout->ToString());
+ if (!layout->MissingCount && !layout->MisplacedCount && !layout->SplitCount) {
+ group->SetPreferredDataCenter(dc);
+ ApplyLayout(tenant, layout, txc, ctx);
+ return true;
+ }
+ layouts[dc] = layout;
+ }
+
+ // Check if it's OK to stay in current data center.
if (currentDC && !layouts.contains(currentDC)) {
- auto layout = ComputeLayoutForGroup(group, currentDC);
- layouts[currentDC] = layout;
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Computed layout for group " << group->Id << " in "
- << currentDC << ": " << layout->ToString());
- if (!layout->MissingCount && !layout->MisplacedCount && !layout->SplitCount) {
- group->SetPreferredDataCenter(currentDC);
- ApplyLayout(tenant, layout, txc, ctx);
- return true;
- }
- }
-
- // Compute layouts for other data centers.
- for (auto &pr : FreeSlots.FreeSlotsByDataCenter) {
+ auto layout = ComputeLayoutForGroup(group, currentDC);
+ layouts[currentDC] = layout;
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Computed layout for group " << group->Id << " in "
+ << currentDC << ": " << layout->ToString());
+ if (!layout->MissingCount && !layout->MisplacedCount && !layout->SplitCount) {
+ group->SetPreferredDataCenter(currentDC);
+ ApplyLayout(tenant, layout, txc, ctx);
+ return true;
+ }
+ }
+
+ // Compute layouts for other data centers.
+ for (auto &pr : FreeSlots.FreeSlotsByDataCenter) {
if (!layouts.contains(pr.first)) {
- layouts[pr.first] = ComputeLayoutForGroup(group, pr.first);
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Computed layout for group " << group->Id << " in "
- << pr.first << ": " << layouts[pr.first]->ToString());
- }
- }
-
- // We expect at least one layout to be computed.
- if (layouts.empty())
- LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "AssignFreeSlotsForGroup: no computed layouts for group " << group->Id);
-
- // Now choose the best layout and apply it if it is better than the
- // current one.
- auto best = layouts.end();
- double bestPenalty = ComputeLayoutPenalty(required, currentMissing, currentMisplaced,
- currentSplit, 0);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Current layout in " << currentDC << " has penalty " << bestPenalty);
-
- for (auto it = layouts.begin(); it != layouts.end(); ++it) {
- auto layout = it->second;
- auto penalty = ComputeLayoutPenalty(required, layout->MissingCount, layout->MisplacedCount,
- layout->SplitCount, layout->DetachCount);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Layout in " << it->first << " has penalty " << penalty);
-
- if (bestPenalty > penalty) {
- best = it;
- bestPenalty = penalty;
- }
- }
-
- if (best != layouts.end()) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Layout in " << best->first << " was chosen");
- if (best->first != currentDC)
- group->SetPreferredDataCenter(best->first);
- ApplyLayout(tenant, best->second, txc, ctx);
- return true;
- } else {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Better layout was not found");
- }
-
- return false;
-}
-
+ layouts[pr.first] = ComputeLayoutForGroup(group, pr.first);
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Computed layout for group " << group->Id << " in "
+ << pr.first << ": " << layouts[pr.first]->ToString());
+ }
+ }
+
+ // We expect at least one layout to be computed.
+ if (layouts.empty())
+ LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "AssignFreeSlotsForGroup: no computed layouts for group " << group->Id);
+
+ // Now choose the best layout and apply it if it is better than the
+ // current one.
+ auto best = layouts.end();
+ double bestPenalty = ComputeLayoutPenalty(required, currentMissing, currentMisplaced,
+ currentSplit, 0);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Current layout in " << currentDC << " has penalty " << bestPenalty);
+
+ for (auto it = layouts.begin(); it != layouts.end(); ++it) {
+ auto layout = it->second;
+ auto penalty = ComputeLayoutPenalty(required, layout->MissingCount, layout->MisplacedCount,
+ layout->SplitCount, layout->DetachCount);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Layout in " << it->first << " has penalty " << penalty);
+
+ if (bestPenalty > penalty) {
+ best = it;
+ bestPenalty = penalty;
+ }
+ }
+
+ if (best != layouts.end()) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Layout in " << best->first << " was chosen");
+ if (best->first != currentDC)
+ group->SetPreferredDataCenter(best->first);
+ ApplyLayout(tenant, best->second, txc, ctx);
+ return true;
+ } else {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Better layout was not found");
+ }
+
+ return false;
+}
+
void TTenantSlotBroker::OnClientDisconnected(TActorId clientId,
- const TActorContext &ctx)
-{
+ const TActorContext &ctx)
+{
if (KnownPoolPipes.contains(clientId)) {
- ui32 nodeId = clientId.NodeId();
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Pipe disconnected from pool on node " << nodeId);
-
- // Same dynamic node may be allocated in another data center next time.
- auto config = AppData(ctx)->DynamicNameserviceConfig;
- if (config && nodeId > config->MaxStaticNodeId)
- NodeIdToDataCenter.erase(nodeId);
-
- KnownPoolPipes.erase(clientId);
- *Counters->ConnectedPools = KnownPoolPipes.size();
-
- DisconnectNodeSlots(nodeId, ctx);
- }
-}
-
-void TTenantSlotBroker::DisconnectNodeSlots(ui32 nodeId,
- const TActorContext &ctx)
-{
- auto it = SlotsByNodeId.find(nodeId);
- if (it == SlotsByNodeId.end())
- return;
-
- for (auto &slot : it->second) {
- if (slot->IsConnected) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Mark slot " << slot->IdString() << " as disconnected");
-
- if (slot->IsFree()) {
- FreeSlots.Remove(slot);
- } else if (slot->AssignedTenant && !slot->IsPending()) {
- slot->AssignedTenant->GetAllocation(slot->UsedAs)->IncPending();
- }
-
- SlotDisconnected(slot);
- }
-
- slot->LastRequestId = RequestId++;
- ctx.Schedule(PendingTimeout, new TEvPrivate::TEvCheckSlotStatus(slot, slot->LastRequestId)) ;
- }
-}
-
-void TTenantSlotBroker::SendConfigureSlot(TSlot::TPtr slot,
- const TActorContext &ctx)
-{
- auto event = MakeHolder<TEvTenantPool::TEvConfigureSlot>();
- event->Record.SetSlotId(slot->Id.SlotId);
- if (slot->AssignedTenant) {
- if (!slot->IsPending())
- slot->AssignedTenant->GetAllocation(slot->UsedAs)->IncPending();
- event->Record.SetAssignedTenant(slot->AssignedTenant->Name);
- event->Record.SetLabel(slot->Label);
- } else if (slot->IsFree()) {
- // Slot is not considered free until it confirms detach.
- FreeSlots.Remove(slot);
- }
- slot->LastRequestId = RequestId++;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Send configuration request " << slot->LastRequestId << " for " << slot->IdString(true));
-
- auto serviceId = MakeTenantPoolID(slot->Id.NodeId, DomainId);
- ctx.Send(serviceId, event.Release(), IEventHandle::FlagTrackDelivery, slot->LastRequestId);
- ctx.Schedule(PendingTimeout, new TEvPrivate::TEvCheckSlotStatus(slot, slot->LastRequestId));
-}
-
-void TTenantSlotBroker::FillTenantState(const TString &name,
- NKikimrTenantSlotBroker::TTenantState &state)
-{
- state.SetTenantName(name);
-
- auto tenant = GetTenant(name);
- if (tenant) {
- for (auto &pr : tenant->GetAllocations()) {
- auto allocation = pr.second;
-
- if (allocation->RequiredCount) {
- auto &required = *state.AddRequiredSlots();
- allocation->Description.Serialize(required);
- required.SetCount(allocation->RequiredCount);
- }
-
- if (allocation->MissingCount) {
- auto &missing = *state.AddMissingSlots();
- allocation->Description.Serialize(missing);
- missing.SetCount(allocation->MissingCount);
- }
-
- if (allocation->PendingCount) {
- auto &pending = *state.AddPendingSlots();
- allocation->Description.Serialize(pending);
- pending.SetCount(allocation->PendingCount);
- }
-
- if (allocation->MisplacedCount) {
- auto &misplaced = *state.AddMisplacedSlots();
- allocation->Description.Serialize(misplaced);
- misplaced.SetCount(allocation->MisplacedCount);
- }
-
- if (allocation->SplitCount) {
- auto &split = *state.AddSplitSlots();
- allocation->Description.Serialize(split);
- split.SetCount(allocation->SplitCount);
- }
-
- if (allocation->PinnedCount) {
- auto &pinned = *state.AddPinnedSlots();
- allocation->Description.Serialize(pinned);
- pinned.SetCount(allocation->PinnedCount);
- }
+ ui32 nodeId = clientId.NodeId();
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Pipe disconnected from pool on node " << nodeId);
+
+ // Same dynamic node may be allocated in another data center next time.
+ auto config = AppData(ctx)->DynamicNameserviceConfig;
+ if (config && nodeId > config->MaxStaticNodeId)
+ NodeIdToDataCenter.erase(nodeId);
+
+ KnownPoolPipes.erase(clientId);
+ *Counters->ConnectedPools = KnownPoolPipes.size();
+
+ DisconnectNodeSlots(nodeId, ctx);
+ }
+}
+
+void TTenantSlotBroker::DisconnectNodeSlots(ui32 nodeId,
+ const TActorContext &ctx)
+{
+ auto it = SlotsByNodeId.find(nodeId);
+ if (it == SlotsByNodeId.end())
+ return;
+
+ for (auto &slot : it->second) {
+ if (slot->IsConnected) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Mark slot " << slot->IdString() << " as disconnected");
+
+ if (slot->IsFree()) {
+ FreeSlots.Remove(slot);
+ } else if (slot->AssignedTenant && !slot->IsPending()) {
+ slot->AssignedTenant->GetAllocation(slot->UsedAs)->IncPending();
+ }
+
+ SlotDisconnected(slot);
+ }
+
+ slot->LastRequestId = RequestId++;
+ ctx.Schedule(PendingTimeout, new TEvPrivate::TEvCheckSlotStatus(slot, slot->LastRequestId)) ;
+ }
+}
+
+void TTenantSlotBroker::SendConfigureSlot(TSlot::TPtr slot,
+ const TActorContext &ctx)
+{
+ auto event = MakeHolder<TEvTenantPool::TEvConfigureSlot>();
+ event->Record.SetSlotId(slot->Id.SlotId);
+ if (slot->AssignedTenant) {
+ if (!slot->IsPending())
+ slot->AssignedTenant->GetAllocation(slot->UsedAs)->IncPending();
+ event->Record.SetAssignedTenant(slot->AssignedTenant->Name);
+ event->Record.SetLabel(slot->Label);
+ } else if (slot->IsFree()) {
+ // Slot is not considered free until it confirms detach.
+ FreeSlots.Remove(slot);
+ }
+ slot->LastRequestId = RequestId++;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Send configuration request " << slot->LastRequestId << " for " << slot->IdString(true));
+
+ auto serviceId = MakeTenantPoolID(slot->Id.NodeId, DomainId);
+ ctx.Send(serviceId, event.Release(), IEventHandle::FlagTrackDelivery, slot->LastRequestId);
+ ctx.Schedule(PendingTimeout, new TEvPrivate::TEvCheckSlotStatus(slot, slot->LastRequestId));
+}
+
+void TTenantSlotBroker::FillTenantState(const TString &name,
+ NKikimrTenantSlotBroker::TTenantState &state)
+{
+ state.SetTenantName(name);
+
+ auto tenant = GetTenant(name);
+ if (tenant) {
+ for (auto &pr : tenant->GetAllocations()) {
+ auto allocation = pr.second;
+
+ if (allocation->RequiredCount) {
+ auto &required = *state.AddRequiredSlots();
+ allocation->Description.Serialize(required);
+ required.SetCount(allocation->RequiredCount);
+ }
+
+ if (allocation->MissingCount) {
+ auto &missing = *state.AddMissingSlots();
+ allocation->Description.Serialize(missing);
+ missing.SetCount(allocation->MissingCount);
+ }
+
+ if (allocation->PendingCount) {
+ auto &pending = *state.AddPendingSlots();
+ allocation->Description.Serialize(pending);
+ pending.SetCount(allocation->PendingCount);
+ }
+
+ if (allocation->MisplacedCount) {
+ auto &misplaced = *state.AddMisplacedSlots();
+ allocation->Description.Serialize(misplaced);
+ misplaced.SetCount(allocation->MisplacedCount);
+ }
+
+ if (allocation->SplitCount) {
+ auto &split = *state.AddSplitSlots();
+ allocation->Description.Serialize(split);
+ split.SetCount(allocation->SplitCount);
+ }
+
+ if (allocation->PinnedCount) {
+ auto &pinned = *state.AddPinnedSlots();
+ allocation->Description.Serialize(pinned);
+ pinned.SetCount(allocation->PinnedCount);
+ }
for (auto &slot : allocation->AssignedSlots) {
const auto &slotId = slot->Id;
@@ -1580,210 +1580,210 @@ void TTenantSlotBroker::FillTenantState(const TString &name,
assigned.SetNodeId(slotId.NodeId);
assigned.SetSlotId(slotId.SlotId);
}
- }
- }
-}
-
-void TTenantSlotBroker::ScheduleTxAssignFreeSlots(const TActorContext &ctx)
-{
- if (PendingAssignFreeSlots)
- return;
-
- PendingAssignFreeSlots = true;
- ProcessTx(CreateTxAssignFreeSlots(), ctx);
-}
-
-void TTenantSlotBroker::ProcessTx(ITransaction *tx,
- const TActorContext &ctx)
-{
- Y_VERIFY(tx);
+ }
+ }
+}
+
+void TTenantSlotBroker::ScheduleTxAssignFreeSlots(const TActorContext &ctx)
+{
+ if (PendingAssignFreeSlots)
+ return;
+
+ PendingAssignFreeSlots = true;
+ ProcessTx(CreateTxAssignFreeSlots(), ctx);
+}
+
+void TTenantSlotBroker::ProcessTx(ITransaction *tx,
+ const TActorContext &ctx)
+{
+ Y_VERIFY(tx);
TxQueue.emplace_back(tx);
- ProcessNextTx(ctx);
-}
-
-void TTenantSlotBroker::TxCompleted(ITransaction *tx,
- const TActorContext &ctx)
-{
- Y_VERIFY(tx == ActiveTx);
- ActiveTx = nullptr;
- ProcessNextTx(ctx);
-}
-
-void TTenantSlotBroker::ProcessNextTx(const TActorContext &ctx)
-{
- if (TxQueue.empty() || ActiveTx)
- return;
-
- ActiveTx = TxQueue.front().Release();
- TxQueue.pop_front();
-
- Y_VERIFY(ActiveTx);
- Execute(ActiveTx, ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- ProcessTx(CreateTxUpdateConfig(ev), ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
- const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
- if (rec.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
- LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Cannot subscribe for config updates: " << rec.GetStatus().GetCode()
- << " " << rec.GetStatus().GetReason());
- return;
- }
-
- ConfigSubscriptionId = rec.GetSubscriptionId();
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Got config subscription id=" << ConfigSubscriptionId);
-}
-
-void TTenantSlotBroker::Handle(TEvents::TEvPoisonPill::TPtr &ev,
- const TActorContext &ctx)
-{
- Y_UNUSED(ev);
- ctx.Send(Tablet(), new TEvents::TEvPoisonPill);
-}
-
-void TTenantSlotBroker::Handle(TEvents::TEvUndelivered::TPtr &ev,
- const TActorContext &ctx)
-{
- ui32 nodeId = ev->Sender.NodeId();
-
- if (ev->Sender != MakeTenantPoolID(nodeId, DomainId))
- return;
-
- DisconnectNodeSlots(nodeId, ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvInterconnect::TEvNodeInfo::TPtr &ev,
- const TActorContext &ctx)
-{
- ProcessTx(CreateTxUpdateNodeLocation(ev), ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvPrivate::TEvCheckSlotStatus::TPtr &ev,
- const TActorContext &ctx)
-{
- ProcessTx(CreateTxCheckSlotStatus(ev->Get()->RequestId, ev->Get()->Slot), ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvPrivate::TEvCheckAllSlotsStatus::TPtr &ev,
- const TActorContext &ctx)
-{
- ProcessTx(CreateTxCheckSlotStatus(ev->Get()->RequestId), ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvTenantPool::TEvLostOwnership::TPtr &ev,
- const TActorContext &ctx)
-{
- ui32 nodeId = ev->Sender.NodeId();
- LOG_CRIT_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Tenant pool ownership is lost on node " << nodeId);
-
- DisconnectNodeSlots(nodeId, ctx);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Re-taking ownership of tenant pool on node " << nodeId);
-
+ ProcessNextTx(ctx);
+}
+
+void TTenantSlotBroker::TxCompleted(ITransaction *tx,
+ const TActorContext &ctx)
+{
+ Y_VERIFY(tx == ActiveTx);
+ ActiveTx = nullptr;
+ ProcessNextTx(ctx);
+}
+
+void TTenantSlotBroker::ProcessNextTx(const TActorContext &ctx)
+{
+ if (TxQueue.empty() || ActiveTx)
+ return;
+
+ ActiveTx = TxQueue.front().Release();
+ TxQueue.pop_front();
+
+ Y_VERIFY(ActiveTx);
+ Execute(ActiveTx, ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ProcessTx(CreateTxUpdateConfig(ev), ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
+ const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+ if (rec.GetStatus().GetCode() != Ydb::StatusIds::SUCCESS) {
+ LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Cannot subscribe for config updates: " << rec.GetStatus().GetCode()
+ << " " << rec.GetStatus().GetReason());
+ return;
+ }
+
+ ConfigSubscriptionId = rec.GetSubscriptionId();
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Got config subscription id=" << ConfigSubscriptionId);
+}
+
+void TTenantSlotBroker::Handle(TEvents::TEvPoisonPill::TPtr &ev,
+ const TActorContext &ctx)
+{
+ Y_UNUSED(ev);
+ ctx.Send(Tablet(), new TEvents::TEvPoisonPill);
+}
+
+void TTenantSlotBroker::Handle(TEvents::TEvUndelivered::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ui32 nodeId = ev->Sender.NodeId();
+
+ if (ev->Sender != MakeTenantPoolID(nodeId, DomainId))
+ return;
+
+ DisconnectNodeSlots(nodeId, ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvInterconnect::TEvNodeInfo::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ProcessTx(CreateTxUpdateNodeLocation(ev), ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvPrivate::TEvCheckSlotStatus::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ProcessTx(CreateTxCheckSlotStatus(ev->Get()->RequestId, ev->Get()->Slot), ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvPrivate::TEvCheckAllSlotsStatus::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ProcessTx(CreateTxCheckSlotStatus(ev->Get()->RequestId), ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvTenantPool::TEvLostOwnership::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ui32 nodeId = ev->Sender.NodeId();
+ LOG_CRIT_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Tenant pool ownership is lost on node " << nodeId);
+
+ DisconnectNodeSlots(nodeId, ctx);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Re-taking ownership of tenant pool on node " << nodeId);
+
ctx.Send(MakeTenantPoolID(nodeId, DomainId), new TEvTenantPool::TEvTakeOwnership(Generation()));
-}
-
-void TTenantSlotBroker::Handle(TEvTabletPipe::TEvServerConnected::TPtr &ev,
- const TActorContext &ctx)
-{
- Y_UNUSED(ev);
- Y_UNUSED(ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvTabletPipe::TEvServerDestroyed::TPtr &ev,
- const TActorContext &ctx)
-{
- OnClientDisconnected(ev->Get()->ClientId, ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvTabletPipe::TEvServerDisconnected::TPtr &ev,
- const TActorContext &ctx)
-{
- OnClientDisconnected(ev->Get()->ClientId, ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvTenantPool::TEvConfigureSlotResult::TPtr &ev,
- const TActorContext &ctx)
-{
- ProcessTx(CreateTxUpdateSlotStatus(ev), ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev,
- const TActorContext &ctx)
-{
- ProcessTx(CreateTxUpdatePoolStatus(ev), ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvTenantSlotBroker::TEvAlterTenant::TPtr &ev,
- const TActorContext &ctx)
-{
- ProcessTx(CreateTxAlterTenant(ev), ctx);
-}
-
-void TTenantSlotBroker::Handle(TEvTenantSlotBroker::TEvGetSlotStats::TPtr &ev,
- const TActorContext &ctx)
-{
- auto resp = MakeHolder<TEvTenantSlotBroker::TEvSlotStats>();
- Counters->FillSlotStats(resp->Record);
-
- LOG_TRACE_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Send TEvTenantSlotBroker::TEvSlotStats: " << resp->ToString());
-
- ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
-}
-
-void TTenantSlotBroker::Handle(TEvTenantSlotBroker::TEvGetTenantState::TPtr &ev,
- const TActorContext &ctx)
-{
- auto resp = MakeHolder<TEvTenantSlotBroker::TEvTenantState>();
- FillTenantState(ev->Get()->Record.GetTenantName(), resp->Record);
-
- LOG_TRACE_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Send TEvTenantSlotBroker::TEvTenantState: " << resp->ToString());
-
- ctx.Send(ev->Sender, resp.Release());
-}
-
-void TTenantSlotBroker::Handle(TEvTenantSlotBroker::TEvListTenants::TPtr &ev,
- const TActorContext &ctx)
-{
- auto resp = MakeHolder<TEvTenantSlotBroker::TEvTenantsList>();
- for (auto &pr : Tenants)
- FillTenantState(pr.first, *resp->Record.AddTenants());
- ctx.Send(ev->Sender, resp.Release());
-}
-
-
-void TTenantSlotBroker::Handle(TEvTenantSlotBroker::TEvRegisterPool::TPtr &ev,
- const TActorContext &ctx)
-{
+}
+
+void TTenantSlotBroker::Handle(TEvTabletPipe::TEvServerConnected::TPtr &ev,
+ const TActorContext &ctx)
+{
+ Y_UNUSED(ev);
+ Y_UNUSED(ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvTabletPipe::TEvServerDestroyed::TPtr &ev,
+ const TActorContext &ctx)
+{
+ OnClientDisconnected(ev->Get()->ClientId, ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvTabletPipe::TEvServerDisconnected::TPtr &ev,
+ const TActorContext &ctx)
+{
+ OnClientDisconnected(ev->Get()->ClientId, ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvTenantPool::TEvConfigureSlotResult::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ProcessTx(CreateTxUpdateSlotStatus(ev), ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ProcessTx(CreateTxUpdatePoolStatus(ev), ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvTenantSlotBroker::TEvAlterTenant::TPtr &ev,
+ const TActorContext &ctx)
+{
+ ProcessTx(CreateTxAlterTenant(ev), ctx);
+}
+
+void TTenantSlotBroker::Handle(TEvTenantSlotBroker::TEvGetSlotStats::TPtr &ev,
+ const TActorContext &ctx)
+{
+ auto resp = MakeHolder<TEvTenantSlotBroker::TEvSlotStats>();
+ Counters->FillSlotStats(resp->Record);
+
+ LOG_TRACE_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Send TEvTenantSlotBroker::TEvSlotStats: " << resp->ToString());
+
+ ctx.Send(ev->Sender, resp.Release(), 0, ev->Cookie);
+}
+
+void TTenantSlotBroker::Handle(TEvTenantSlotBroker::TEvGetTenantState::TPtr &ev,
+ const TActorContext &ctx)
+{
+ auto resp = MakeHolder<TEvTenantSlotBroker::TEvTenantState>();
+ FillTenantState(ev->Get()->Record.GetTenantName(), resp->Record);
+
+ LOG_TRACE_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Send TEvTenantSlotBroker::TEvTenantState: " << resp->ToString());
+
+ ctx.Send(ev->Sender, resp.Release());
+}
+
+void TTenantSlotBroker::Handle(TEvTenantSlotBroker::TEvListTenants::TPtr &ev,
+ const TActorContext &ctx)
+{
+ auto resp = MakeHolder<TEvTenantSlotBroker::TEvTenantsList>();
+ for (auto &pr : Tenants)
+ FillTenantState(pr.first, *resp->Record.AddTenants());
+ ctx.Send(ev->Sender, resp.Release());
+}
+
+
+void TTenantSlotBroker::Handle(TEvTenantSlotBroker::TEvRegisterPool::TPtr &ev,
+ const TActorContext &ctx)
+{
const auto &record = ev->Get()->Record;
- auto nodeId = ev->Sender.NodeId();
-
+ auto nodeId = ev->Sender.NodeId();
+
KnownPoolPipes.insert(ActorIdFromProto(record.GetClientId()));
- *Counters->ConnectedPools = KnownPoolPipes.size();
-
- DisconnectNodeSlots(nodeId, ctx);
+ *Counters->ConnectedPools = KnownPoolPipes.size();
+
+ DisconnectNodeSlots(nodeId, ctx);
ctx.Send(ev->Sender, new TEvTenantPool::TEvTakeOwnership(Generation(), record.GetSeqNo()));
-}
-
+}
+
IActor *CreateTenantSlotBroker(const TActorId &tablet,
- TTabletStorageInfo *info)
-{
- return new TTenantSlotBroker(tablet, info);
-}
-
-} // NTenantSlotBroker
-} // namespace NKikimr
+ TTabletStorageInfo *info)
+{
+ return new TTenantSlotBroker(tablet, info);
+}
+
+} // NTenantSlotBroker
+} // namespace NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker.h b/ydb/core/mind/tenant_slot_broker.h
index 54bafc9cb25..922924fb14d 100644
--- a/ydb/core/mind/tenant_slot_broker.h
+++ b/ydb/core/mind/tenant_slot_broker.h
@@ -1,59 +1,59 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <ydb/core/base/blobstorage.h>
#include <ydb/core/protos/tenant_slot_broker.pb.h>
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
static const TString ANY_DATA_CENTER = "";
-constexpr char ANY_SLOT_TYPE[] = "";
-
-constexpr char PIN_DATA_CENTER[] = "pinned";
-constexpr char PIN_SLOT_TYPE[] = "pinned";
-
-struct TEvTenantSlotBroker {
- enum EEv {
- // requests
- EvGetTenantState = EventSpaceBegin(TKikimrEvents::ES_TENANT_SLOT_BROKER),
- EvAlterTenant,
- EvRegisterPool,
- EvListTenants,
-
- // responses
- EvTenantState,
- EvTenantsList,
-
- // slot stats
- EvGetSlotStats,
- EvSlotStats,
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_TENANT_SLOT_BROKER),
- "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_TENANT_SLOT_BROKER)");
-
- struct TEvGetTenantState : public TEventPB<TEvGetTenantState, NKikimrTenantSlotBroker::TGetTenantState, EvGetTenantState> {};
-
- struct TEvAlterTenant : public TEventPB<TEvAlterTenant, NKikimrTenantSlotBroker::TAlterTenant, EvAlterTenant> {};
-
- struct TEvRegisterPool : public TEventPB<TEvRegisterPool, NKikimrTenantSlotBroker::TRegisterPool, EvRegisterPool> {};
-
- struct TEvListTenants : public TEventPB<TEvListTenants, NKikimrTenantSlotBroker::TListTenants, EvListTenants> {};
-
- struct TEvTenantState : public TEventPB<TEvTenantState, NKikimrTenantSlotBroker::TTenantState, EvTenantState> {};
-
- struct TEvTenantsList : public TEventPB<TEvTenantsList, NKikimrTenantSlotBroker::TTenantsList, EvTenantsList> {};
-
- struct TEvGetSlotStats : public TEventPB<TEvGetSlotStats, NKikimrTenantSlotBroker::TGetSlotStats, EvGetSlotStats> {};
-
- struct TEvSlotStats : public TEventPB<TEvSlotStats, NKikimrTenantSlotBroker::TSlotStats, EvSlotStats> {};
-
-};
-
+constexpr char ANY_SLOT_TYPE[] = "";
+
+constexpr char PIN_DATA_CENTER[] = "pinned";
+constexpr char PIN_SLOT_TYPE[] = "pinned";
+
+struct TEvTenantSlotBroker {
+ enum EEv {
+ // requests
+ EvGetTenantState = EventSpaceBegin(TKikimrEvents::ES_TENANT_SLOT_BROKER),
+ EvAlterTenant,
+ EvRegisterPool,
+ EvListTenants,
+
+ // responses
+ EvTenantState,
+ EvTenantsList,
+
+ // slot stats
+ EvGetSlotStats,
+ EvSlotStats,
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_TENANT_SLOT_BROKER),
+ "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_TENANT_SLOT_BROKER)");
+
+ struct TEvGetTenantState : public TEventPB<TEvGetTenantState, NKikimrTenantSlotBroker::TGetTenantState, EvGetTenantState> {};
+
+ struct TEvAlterTenant : public TEventPB<TEvAlterTenant, NKikimrTenantSlotBroker::TAlterTenant, EvAlterTenant> {};
+
+ struct TEvRegisterPool : public TEventPB<TEvRegisterPool, NKikimrTenantSlotBroker::TRegisterPool, EvRegisterPool> {};
+
+ struct TEvListTenants : public TEventPB<TEvListTenants, NKikimrTenantSlotBroker::TListTenants, EvListTenants> {};
+
+ struct TEvTenantState : public TEventPB<TEvTenantState, NKikimrTenantSlotBroker::TTenantState, EvTenantState> {};
+
+ struct TEvTenantsList : public TEventPB<TEvTenantsList, NKikimrTenantSlotBroker::TTenantsList, EvTenantsList> {};
+
+ struct TEvGetSlotStats : public TEventPB<TEvGetSlotStats, NKikimrTenantSlotBroker::TGetSlotStats, EvGetSlotStats> {};
+
+ struct TEvSlotStats : public TEventPB<TEvSlotStats, NKikimrTenantSlotBroker::TSlotStats, EvSlotStats> {};
+
+};
+
IActor *CreateTenantSlotBroker(const TActorId &tablet, TTabletStorageInfo *info);
-
-} // NTenantSlotBroker
-} // namespace NKikimr
+
+} // NTenantSlotBroker
+} // namespace NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker__alter_tenant.cpp b/ydb/core/mind/tenant_slot_broker__alter_tenant.cpp
index 5f8cc2b0b71..6b3066e7d7f 100644
--- a/ydb/core/mind/tenant_slot_broker__alter_tenant.cpp
+++ b/ydb/core/mind/tenant_slot_broker__alter_tenant.cpp
@@ -1,242 +1,242 @@
-#include "tenant_slot_broker_impl.h"
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-class TTenantSlotBroker::TTxAlterTenant : public TTransactionBase<TTenantSlotBroker> {
-public:
- TTxAlterTenant(TTenantSlotBroker *self, TEvTenantSlotBroker::TEvAlterTenant::TPtr ev)
- : TBase(self)
- , Event(std::move(ev))
- , Modified(false)
- {
- }
-
- void DetachSlots(TTenant::TPtr tenant,
- THashMap<TSlotDescription, ui64> &detach,
- TSlotsAllocation::TPtr allocation,
- bool onlySplit,
- bool onlyMisplaced,
- TTransactionContext &txc,
- const TActorContext &ctx)
- {
- auto it = detach.find(allocation->Description);
- if (it == detach.end())
- return;
-
- for (auto slotIt = allocation->AssignedSlots.begin();
- slotIt != allocation->AssignedSlots.end();
- ) {
- auto slot = *slotIt;
- // Avoid iterator invalidation by slot detach.
- ++slotIt;
-
- if (onlySplit) {
- Y_VERIFY(!onlyMisplaced);
- Y_VERIFY(allocation->Group);
- if (!allocation->SplitCount)
- return;
- if (slot->DataCenter == allocation->Group->GetPreferredDataCenter())
- continue;
- } else if (onlyMisplaced) {
- Y_VERIFY(!onlySplit);
+#include "tenant_slot_broker_impl.h"
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+class TTenantSlotBroker::TTxAlterTenant : public TTransactionBase<TTenantSlotBroker> {
+public:
+ TTxAlterTenant(TTenantSlotBroker *self, TEvTenantSlotBroker::TEvAlterTenant::TPtr ev)
+ : TBase(self)
+ , Event(std::move(ev))
+ , Modified(false)
+ {
+ }
+
+ void DetachSlots(TTenant::TPtr tenant,
+ THashMap<TSlotDescription, ui64> &detach,
+ TSlotsAllocation::TPtr allocation,
+ bool onlySplit,
+ bool onlyMisplaced,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+ {
+ auto it = detach.find(allocation->Description);
+ if (it == detach.end())
+ return;
+
+ for (auto slotIt = allocation->AssignedSlots.begin();
+ slotIt != allocation->AssignedSlots.end();
+ ) {
+ auto slot = *slotIt;
+ // Avoid iterator invalidation by slot detach.
+ ++slotIt;
+
+ if (onlySplit) {
+ Y_VERIFY(!onlyMisplaced);
+ Y_VERIFY(allocation->Group);
+ if (!allocation->SplitCount)
+ return;
+ if (slot->DataCenter == allocation->Group->GetPreferredDataCenter())
+ continue;
+ } else if (onlyMisplaced) {
+ Y_VERIFY(!onlySplit);
Y_VERIFY(allocation->Description.DataCenter != ANY_DATA_CENTER);
- if (!allocation->MisplacedCount)
- return;
- if (slot->DataCenter == allocation->Description.DataCenter)
- continue;
- }
-
- // Check if slot is still OK to use by tenant.
- bool reattached = false;
- TSlotDescription key;
-
- // Check if slot may actually be left assigned
- // by another allocation.
- for (auto allocation : tenant->GetMissing()) {
+ if (!allocation->MisplacedCount)
+ return;
+ if (slot->DataCenter == allocation->Description.DataCenter)
+ continue;
+ }
+
+ // Check if slot is still OK to use by tenant.
+ bool reattached = false;
+ TSlotDescription key;
+
+ // Check if slot may actually be left assigned
+ // by another allocation.
+ for (auto allocation : tenant->GetMissing()) {
if (detach.contains(allocation->Description))
- continue;
- if (allocation->IsSlotOk(slot->Type, slot->DataCenter)) {
- reattached = true;
- key = allocation->Description;
- break;
- }
- }
-
- if (reattached) {
- Y_VERIFY(slot->UsedAs != key);
- Self->DetachSlotNoConfigureNoDb(slot, false);
- Self->AttachSlotNoConfigure(slot, tenant, key, slot->Label, txc);
- } else {
- Self->DetachSlot(slot, txc, ctx, false);
- Modified = true;
- }
-
- if (it->second == 1) {
- detach.erase(it);
- return;
- } else {
- --it->second;
- }
- }
- }
-
- void DetachSlots(TTenant::TPtr tenant,
- THashMap<TSlotDescription, ui64> &detach,
- TSlotsAllocation::TPtr allocation,
- TTransactionContext &txc,
- const TActorContext &ctx)
- {
- if (allocation->SplitCount)
- DetachSlots(tenant, detach, allocation, true, false, txc, ctx);
- if (allocation->MisplacedCount)
- DetachSlots(tenant, detach, allocation, false, true, txc, ctx);
- DetachSlots(tenant, detach, allocation, false, false, txc, ctx);
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- auto &rec = Event->Get()->Record;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxAlterTenant "
- << rec.ShortDebugString());
-
- THashMap<TSlotDescription, ui64> newSlots;
- for (auto &slot : rec.GetRequiredSlots()) {
- if (slot.GetCount() == 0)
- continue;
- TSlotDescription key(slot);
+ continue;
+ if (allocation->IsSlotOk(slot->Type, slot->DataCenter)) {
+ reattached = true;
+ key = allocation->Description;
+ break;
+ }
+ }
+
+ if (reattached) {
+ Y_VERIFY(slot->UsedAs != key);
+ Self->DetachSlotNoConfigureNoDb(slot, false);
+ Self->AttachSlotNoConfigure(slot, tenant, key, slot->Label, txc);
+ } else {
+ Self->DetachSlot(slot, txc, ctx, false);
+ Modified = true;
+ }
+
+ if (it->second == 1) {
+ detach.erase(it);
+ return;
+ } else {
+ --it->second;
+ }
+ }
+ }
+
+ void DetachSlots(TTenant::TPtr tenant,
+ THashMap<TSlotDescription, ui64> &detach,
+ TSlotsAllocation::TPtr allocation,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+ {
+ if (allocation->SplitCount)
+ DetachSlots(tenant, detach, allocation, true, false, txc, ctx);
+ if (allocation->MisplacedCount)
+ DetachSlots(tenant, detach, allocation, false, true, txc, ctx);
+ DetachSlots(tenant, detach, allocation, false, false, txc, ctx);
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ auto &rec = Event->Get()->Record;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxAlterTenant "
+ << rec.ShortDebugString());
+
+ THashMap<TSlotDescription, ui64> newSlots;
+ for (auto &slot : rec.GetRequiredSlots()) {
+ if (slot.GetCount() == 0)
+ continue;
+ TSlotDescription key(slot);
if (newSlots.contains(key))
- newSlots[key] += slot.GetCount();
- else
- newSlots[key] = slot.GetCount();
- }
-
- NIceDb::TNiceDb db(txc.DB);
- auto &name = rec.GetTenantName();
- TTenant::TPtr tenant;
- auto it = Self->Tenants.find(name);
- if (it == Self->Tenants.end()) {
- // Don't create tenant with no slots.
- if (!newSlots.empty()) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Create new tenant " << name);
-
- tenant = Self->AddTenant(name);
-
- for (auto &pr : newSlots) {
- tenant->AddSlotsAllocation(pr.first, pr.second);
- tenant->DbUpdateAllocation(pr.first, txc);
- }
-
- tenant->AddSlotLabels(tenant->GetTotalRequired(), txc);
- }
-
- } else {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Alter existing tenant " << name);
-
- tenant = it->second;
- Self->RemoveUnhappyTenant(tenant);
-
- auto total = tenant->GetTotalRequired();
- THashSet<TSlotDescription> oldSlots;
- for (auto &pr : tenant->GetAllocations())
- oldSlots.insert(pr.first);
-
- // Update required slots for tenant. Fill map
- // with slot counts to detach.
- THashMap<TSlotDescription, ui64> detach;
- for (auto &pr : newSlots) {
- auto &key = pr.first;
- ui64 newRequired = pr.second;
- auto allocation = tenant->GetAllocation(key);
-
- if (allocation) {
- auto required = allocation->RequiredCount;
- auto missing = allocation->MissingCount;
-
- if (required > newRequired && missing < required - newRequired)
- detach[key] = required - newRequired - missing;
-
- allocation->SetRequired(newRequired);
- // It's OK to have negative value here. It will be back
- // to normal after extra slots are detached.
- allocation->IncMissing(newRequired - required);
- } else {
- tenant->AddSlotsAllocation(key, newRequired);
- }
-
- tenant->DbUpdateAllocation(key, txc);
- }
-
- // Handle required slots not mentioned in new tenant config.
- for (auto &key : oldSlots) {
+ newSlots[key] += slot.GetCount();
+ else
+ newSlots[key] = slot.GetCount();
+ }
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto &name = rec.GetTenantName();
+ TTenant::TPtr tenant;
+ auto it = Self->Tenants.find(name);
+ if (it == Self->Tenants.end()) {
+ // Don't create tenant with no slots.
+ if (!newSlots.empty()) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Create new tenant " << name);
+
+ tenant = Self->AddTenant(name);
+
+ for (auto &pr : newSlots) {
+ tenant->AddSlotsAllocation(pr.first, pr.second);
+ tenant->DbUpdateAllocation(pr.first, txc);
+ }
+
+ tenant->AddSlotLabels(tenant->GetTotalRequired(), txc);
+ }
+
+ } else {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Alter existing tenant " << name);
+
+ tenant = it->second;
+ Self->RemoveUnhappyTenant(tenant);
+
+ auto total = tenant->GetTotalRequired();
+ THashSet<TSlotDescription> oldSlots;
+ for (auto &pr : tenant->GetAllocations())
+ oldSlots.insert(pr.first);
+
+ // Update required slots for tenant. Fill map
+ // with slot counts to detach.
+ THashMap<TSlotDescription, ui64> detach;
+ for (auto &pr : newSlots) {
+ auto &key = pr.first;
+ ui64 newRequired = pr.second;
+ auto allocation = tenant->GetAllocation(key);
+
+ if (allocation) {
+ auto required = allocation->RequiredCount;
+ auto missing = allocation->MissingCount;
+
+ if (required > newRequired && missing < required - newRequired)
+ detach[key] = required - newRequired - missing;
+
+ allocation->SetRequired(newRequired);
+ // It's OK to have negative value here. It will be back
+ // to normal after extra slots are detached.
+ allocation->IncMissing(newRequired - required);
+ } else {
+ tenant->AddSlotsAllocation(key, newRequired);
+ }
+
+ tenant->DbUpdateAllocation(key, txc);
+ }
+
+ // Handle required slots not mentioned in new tenant config.
+ for (auto &key : oldSlots) {
if (newSlots.contains(key))
- continue;
-
- auto allocation = tenant->GetAllocation(key);
- ui64 connected = allocation->RequiredCount - allocation->MissingCount;
- if (connected)
- detach[key] = connected;
-
- allocation->SetRequired(0);
- allocation->SetMissing(-connected);
- tenant->DbUpdateAllocation(key, txc);
- }
-
- for (auto &pr : tenant->GetAllocations())
+ continue;
+
+ auto allocation = tenant->GetAllocation(key);
+ ui64 connected = allocation->RequiredCount - allocation->MissingCount;
+ if (connected)
+ detach[key] = connected;
+
+ allocation->SetRequired(0);
+ allocation->SetMissing(-connected);
+ tenant->DbUpdateAllocation(key, txc);
+ }
+
+ for (auto &pr : tenant->GetAllocations())
if (detach.contains(pr.first))
- DetachSlots(tenant, detach, pr.second, txc, ctx);
-
- Y_VERIFY(detach.empty());
-
- // Add/remove sot labels for tenant.
- if (tenant->GetTotalRequired() > total)
- tenant->AddSlotLabels(tenant->GetTotalRequired() - total, txc);
- else
- tenant->RemoveSlotLabels(total - tenant->GetTotalRequired(), txc);
-
- tenant->ClearEmptyAllocations();
- Self->MaybeRemoveTenant(tenant);
- }
-
- if (tenant) {
- if (tenant->GetTotalMissing())
- Self->AssignFreeSlots(tenant, false, txc, ctx);
- Self->AddUnhappyTenant(tenant);
- }
-
- TenantState = MakeHolder<TEvTenantSlotBroker::TEvTenantState>();
- Self->FillTenantState(name, TenantState->Record);
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- auto &name = Event->Get()->Record.GetTenantName();
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxAlterTenant "
- << name << " complete");
-
- ctx.Send(Event->Sender, TenantState.Release());
-
- if (Modified && Self->HasUnhappyTenant())
- Self->ScheduleTxAssignFreeSlots(ctx);
-
- Self->TxCompleted(this, ctx);
- }
-
-private:
- TEvTenantSlotBroker::TEvAlterTenant::TPtr Event;
- THolder<TEvTenantSlotBroker::TEvTenantState> TenantState;
- bool Modified;
-};
-
-ITransaction *TTenantSlotBroker::CreateTxAlterTenant(TEvTenantSlotBroker::TEvAlterTenant::TPtr &ev)
-{
- return new TTxAlterTenant(this, std::move(ev));
-}
-
-} // NTenantSlotBroker
-} // NKikimr
+ DetachSlots(tenant, detach, pr.second, txc, ctx);
+
+ Y_VERIFY(detach.empty());
+
+ // Add/remove sot labels for tenant.
+ if (tenant->GetTotalRequired() > total)
+ tenant->AddSlotLabels(tenant->GetTotalRequired() - total, txc);
+ else
+ tenant->RemoveSlotLabels(total - tenant->GetTotalRequired(), txc);
+
+ tenant->ClearEmptyAllocations();
+ Self->MaybeRemoveTenant(tenant);
+ }
+
+ if (tenant) {
+ if (tenant->GetTotalMissing())
+ Self->AssignFreeSlots(tenant, false, txc, ctx);
+ Self->AddUnhappyTenant(tenant);
+ }
+
+ TenantState = MakeHolder<TEvTenantSlotBroker::TEvTenantState>();
+ Self->FillTenantState(name, TenantState->Record);
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ auto &name = Event->Get()->Record.GetTenantName();
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxAlterTenant "
+ << name << " complete");
+
+ ctx.Send(Event->Sender, TenantState.Release());
+
+ if (Modified && Self->HasUnhappyTenant())
+ Self->ScheduleTxAssignFreeSlots(ctx);
+
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvTenantSlotBroker::TEvAlterTenant::TPtr Event;
+ THolder<TEvTenantSlotBroker::TEvTenantState> TenantState;
+ bool Modified;
+};
+
+ITransaction *TTenantSlotBroker::CreateTxAlterTenant(TEvTenantSlotBroker::TEvAlterTenant::TPtr &ev)
+{
+ return new TTxAlterTenant(this, std::move(ev));
+}
+
+} // NTenantSlotBroker
+} // NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker__assign_free_slots.cpp b/ydb/core/mind/tenant_slot_broker__assign_free_slots.cpp
index 2c6d0acb855..e2520d7256b 100644
--- a/ydb/core/mind/tenant_slot_broker__assign_free_slots.cpp
+++ b/ydb/core/mind/tenant_slot_broker__assign_free_slots.cpp
@@ -1,185 +1,185 @@
-#include "tenant_slot_broker_impl.h"
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-class TTenantSlotBroker::TTxAssignFreeSlots : public TTransactionBase<TTenantSlotBroker> {
-public:
- TTxAssignFreeSlots(TTenantSlotBroker *self)
- : TBase(self)
- {
- }
-
- void AssignMissingSlots(TTransactionContext &txc,
- const TActorContext &ctx)
- {
- auto prev = Self->UnhappyTenants.end();
- while (!Self->UnhappyTenants.empty()
- && !Self->FreeSlots.FreeSlotsByDataCenter.empty()) {
- auto cur = prev;
- if (cur == Self->UnhappyTenants.end())
- cur = Self->UnhappyTenants.begin();
- else
- ++cur;
-
- if (cur == Self->UnhappyTenants.end())
- break;
-
- auto tenant = *cur;
-
- Self->RemoveUnhappyTenant(tenant);
- auto assigned = Self->AssignFreeSlots(tenant, true, txc, ctx);
- Self->AddUnhappyTenant(tenant);
-
- if (!assigned) {
- if (prev == Self->UnhappyTenants.end()) {
- prev = Self->UnhappyTenants.begin();
- Y_VERIFY(*prev == tenant);
- } else {
- ++prev;
- }
- }
- }
- }
-
- void AssignSplitSlots(THashSet<TCollocationGroup::TPtr> &visitedGroups,
- TTransactionContext &txc,
- const TActorContext &ctx)
- {
- auto prev = Self->SplitTenants.end();
- while (!Self->SplitTenants.empty()
- && !Self->FreeSlots.FreeSlotsByDataCenter.empty()) {
- auto cur = prev;
- if (cur == Self->SplitTenants.end())
- cur = Self->SplitTenants.begin();
- else
- ++cur;
-
- if (cur == Self->SplitTenants.end())
- break;
-
- auto tenant = *cur;
-
- bool assigned = false;
- for (auto it = tenant->GetSplit().begin();
- !assigned && it != tenant->GetSplit().end();
- ) {
- auto allocation = *(it++);
-
- Y_VERIFY(allocation->Group);
+#include "tenant_slot_broker_impl.h"
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+class TTenantSlotBroker::TTxAssignFreeSlots : public TTransactionBase<TTenantSlotBroker> {
+public:
+ TTxAssignFreeSlots(TTenantSlotBroker *self)
+ : TBase(self)
+ {
+ }
+
+ void AssignMissingSlots(TTransactionContext &txc,
+ const TActorContext &ctx)
+ {
+ auto prev = Self->UnhappyTenants.end();
+ while (!Self->UnhappyTenants.empty()
+ && !Self->FreeSlots.FreeSlotsByDataCenter.empty()) {
+ auto cur = prev;
+ if (cur == Self->UnhappyTenants.end())
+ cur = Self->UnhappyTenants.begin();
+ else
+ ++cur;
+
+ if (cur == Self->UnhappyTenants.end())
+ break;
+
+ auto tenant = *cur;
+
+ Self->RemoveUnhappyTenant(tenant);
+ auto assigned = Self->AssignFreeSlots(tenant, true, txc, ctx);
+ Self->AddUnhappyTenant(tenant);
+
+ if (!assigned) {
+ if (prev == Self->UnhappyTenants.end()) {
+ prev = Self->UnhappyTenants.begin();
+ Y_VERIFY(*prev == tenant);
+ } else {
+ ++prev;
+ }
+ }
+ }
+ }
+
+ void AssignSplitSlots(THashSet<TCollocationGroup::TPtr> &visitedGroups,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+ {
+ auto prev = Self->SplitTenants.end();
+ while (!Self->SplitTenants.empty()
+ && !Self->FreeSlots.FreeSlotsByDataCenter.empty()) {
+ auto cur = prev;
+ if (cur == Self->SplitTenants.end())
+ cur = Self->SplitTenants.begin();
+ else
+ ++cur;
+
+ if (cur == Self->SplitTenants.end())
+ break;
+
+ auto tenant = *cur;
+
+ bool assigned = false;
+ for (auto it = tenant->GetSplit().begin();
+ !assigned && it != tenant->GetSplit().end();
+ ) {
+ auto allocation = *(it++);
+
+ Y_VERIFY(allocation->Group);
if (visitedGroups.contains(allocation->Group))
- continue;
-
- visitedGroups.insert(allocation->Group);
-
- Self->RemoveUnhappyTenant(tenant);
- assigned = Self->AssignFreeSlotsForGroup(tenant, allocation->Group, txc, ctx);
- Self->AddUnhappyTenant(tenant);
- }
-
- if (!assigned) {
- if (prev == Self->SplitTenants.end()) {
- prev = Self->SplitTenants.begin();
- Y_VERIFY(*prev == tenant);
- } else {
- ++prev;
- }
- }
- }
- }
-
- void AssignMisplacedSlots(THashSet<TCollocationGroup::TPtr> &visitedGroups,
- TTransactionContext &txc,
- const TActorContext &ctx)
- {
- auto prev = Self->MisplacedTenants.end();
- while (!Self->MisplacedTenants.empty()
- && !Self->FreeSlots.FreeSlotsByDataCenter.empty()) {
- auto cur = prev;
- if (cur == Self->MisplacedTenants.end())
- cur = Self->MisplacedTenants.begin();
- else
- ++cur;
-
- if (cur == Self->MisplacedTenants.end())
- break;
-
- auto tenant = *cur;
-
- bool assigned = false;
- for (auto it = tenant->GetMisplaced().begin();
- !assigned && it != tenant->GetMisplaced().end();
- ) {
- auto allocation = *(it++);
-
+ continue;
+
+ visitedGroups.insert(allocation->Group);
+
+ Self->RemoveUnhappyTenant(tenant);
+ assigned = Self->AssignFreeSlotsForGroup(tenant, allocation->Group, txc, ctx);
+ Self->AddUnhappyTenant(tenant);
+ }
+
+ if (!assigned) {
+ if (prev == Self->SplitTenants.end()) {
+ prev = Self->SplitTenants.begin();
+ Y_VERIFY(*prev == tenant);
+ } else {
+ ++prev;
+ }
+ }
+ }
+ }
+
+ void AssignMisplacedSlots(THashSet<TCollocationGroup::TPtr> &visitedGroups,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+ {
+ auto prev = Self->MisplacedTenants.end();
+ while (!Self->MisplacedTenants.empty()
+ && !Self->FreeSlots.FreeSlotsByDataCenter.empty()) {
+ auto cur = prev;
+ if (cur == Self->MisplacedTenants.end())
+ cur = Self->MisplacedTenants.begin();
+ else
+ ++cur;
+
+ if (cur == Self->MisplacedTenants.end())
+ break;
+
+ auto tenant = *cur;
+
+ bool assigned = false;
+ for (auto it = tenant->GetMisplaced().begin();
+ !assigned && it != tenant->GetMisplaced().end();
+ ) {
+ auto allocation = *(it++);
+
if (allocation->Group && visitedGroups.contains(allocation->Group))
- continue;
-
- Self->RemoveUnhappyTenant(tenant);
- if (allocation->Group) {
- assigned = Self->AssignFreeSlotsForGroup(tenant, allocation->Group, txc, ctx);
- visitedGroups.insert(allocation->Group);
- } else {
- assigned = Self->MoveMisplacedSlots(tenant, allocation, false, txc, ctx);
- }
- Self->AddUnhappyTenant(tenant);
- }
-
- if (!assigned) {
- if (prev == Self->MisplacedTenants.end()) {
- prev = Self->MisplacedTenants.begin();
- Y_VERIFY(*prev == tenant);
- } else {
- ++prev;
- }
- }
- }
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxAssignFreeSlots Execute");
-
- // Remember which collocation groups are going to be visited during
- // missing slots processing. Don't revisit them later for split and
- // misplaced slots.
- THashSet<TCollocationGroup::TPtr> visitedGroups;
- for (auto tenant : Self->UnhappyTenants) {
- for (auto allocation : tenant->GetMissing()) {
- if (allocation->Group)
- visitedGroups.insert(allocation->Group);
- }
- }
-
- // First process tenants with missing slots.
- AssignMissingSlots(txc, ctx);
-
- // Now try to find better layout for collocation groups which don't have
- // missing slot but have split ones.
- AssignSplitSlots(visitedGroups, txc, ctx);
-
- // Finally try to move some misplaced slots to better positions.
- AssignMisplacedSlots(visitedGroups, txc, ctx);
-
- Y_VERIFY(Self->PendingAssignFreeSlots);
- Self->PendingAssignFreeSlots = false;
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxAssignFreeSlots Complete");
- Self->TxCompleted(this, ctx);
- }
-
-private:
-};
-
-ITransaction *TTenantSlotBroker::CreateTxAssignFreeSlots()
-{
- return new TTxAssignFreeSlots(this);
-}
-
-} // NTenantSlotBroker
-} // NKikimr
+ continue;
+
+ Self->RemoveUnhappyTenant(tenant);
+ if (allocation->Group) {
+ assigned = Self->AssignFreeSlotsForGroup(tenant, allocation->Group, txc, ctx);
+ visitedGroups.insert(allocation->Group);
+ } else {
+ assigned = Self->MoveMisplacedSlots(tenant, allocation, false, txc, ctx);
+ }
+ Self->AddUnhappyTenant(tenant);
+ }
+
+ if (!assigned) {
+ if (prev == Self->MisplacedTenants.end()) {
+ prev = Self->MisplacedTenants.begin();
+ Y_VERIFY(*prev == tenant);
+ } else {
+ ++prev;
+ }
+ }
+ }
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxAssignFreeSlots Execute");
+
+ // Remember which collocation groups are going to be visited during
+ // missing slots processing. Don't revisit them later for split and
+ // misplaced slots.
+ THashSet<TCollocationGroup::TPtr> visitedGroups;
+ for (auto tenant : Self->UnhappyTenants) {
+ for (auto allocation : tenant->GetMissing()) {
+ if (allocation->Group)
+ visitedGroups.insert(allocation->Group);
+ }
+ }
+
+ // First process tenants with missing slots.
+ AssignMissingSlots(txc, ctx);
+
+ // Now try to find better layout for collocation groups which don't have
+ // missing slot but have split ones.
+ AssignSplitSlots(visitedGroups, txc, ctx);
+
+ // Finally try to move some misplaced slots to better positions.
+ AssignMisplacedSlots(visitedGroups, txc, ctx);
+
+ Y_VERIFY(Self->PendingAssignFreeSlots);
+ Self->PendingAssignFreeSlots = false;
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxAssignFreeSlots Complete");
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+};
+
+ITransaction *TTenantSlotBroker::CreateTxAssignFreeSlots()
+{
+ return new TTxAssignFreeSlots(this);
+}
+
+} // NTenantSlotBroker
+} // NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker__check_slot_status.cpp b/ydb/core/mind/tenant_slot_broker__check_slot_status.cpp
index 8c1f2f74940..f01c8115078 100644
--- a/ydb/core/mind/tenant_slot_broker__check_slot_status.cpp
+++ b/ydb/core/mind/tenant_slot_broker__check_slot_status.cpp
@@ -1,79 +1,79 @@
-#include "tenant_slot_broker_impl.h"
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-class TTenantSlotBroker::TTxCheckSlotStatus : public TTransactionBase<TTenantSlotBroker> {
-public:
- TTxCheckSlotStatus(TTenantSlotBroker *self, ui64 requestId, TSlot::TPtr slot)
- : TBase(self)
- , RequestId(requestId)
- , Slot(slot)
- , ReassignSlots(false)
- {
- }
-
- void CheckSlot(TSlot::TPtr slot, const TActorContext &ctx) {
- if (slot->LastRequestId != RequestId)
- return;
-
- if (!slot->IsConnected) {
- SlotsToRemove.push_back(slot);
- } else {
- LOG_WARN_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Repeat timeouted request " << RequestId << " for " << slot->IdString(true));
- Self->SendConfigureSlot(slot, ctx);
- }
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "TTxCheckSlotStatus Execute "
- << (Slot ? Slot->IdString() : TString("all slots")));
-
- if (Slot) {
- // Check slot wasn't re-created.
- auto curSlot = Self->GetSlot(Slot->Id);
- if (curSlot != Slot)
- return true;
-
- CheckSlot(Slot, ctx);
- } else {
- for (auto &pr : Self->Slots)
- CheckSlot(pr.second, ctx);
- }
-
- for (auto &slot : SlotsToRemove) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Removing slot " << slot->IdString() << " due to connection timeout");
- if (slot->AssignedTenant)
- ReassignSlots = true;
- Self->RemoveSlot(slot, txc, ctx);
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxCheckSlotStatus Complete");
- if (ReassignSlots)
- Self->ScheduleTxAssignFreeSlots(ctx);
- Self->TxCompleted(this, ctx);
- }
-
-private:
- ui64 RequestId;
- TSlot::TPtr Slot;
- TVector<TSlot::TPtr> SlotsToRemove;
- bool ReassignSlots;
-};
-
-ITransaction *TTenantSlotBroker::CreateTxCheckSlotStatus(ui64 requestId, TSlot::TPtr slot)
-{
- return new TTxCheckSlotStatus(this, requestId, slot);
-}
-
-} // NTenantSlotBroker
-} // NKikimr
+#include "tenant_slot_broker_impl.h"
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+class TTenantSlotBroker::TTxCheckSlotStatus : public TTransactionBase<TTenantSlotBroker> {
+public:
+ TTxCheckSlotStatus(TTenantSlotBroker *self, ui64 requestId, TSlot::TPtr slot)
+ : TBase(self)
+ , RequestId(requestId)
+ , Slot(slot)
+ , ReassignSlots(false)
+ {
+ }
+
+ void CheckSlot(TSlot::TPtr slot, const TActorContext &ctx) {
+ if (slot->LastRequestId != RequestId)
+ return;
+
+ if (!slot->IsConnected) {
+ SlotsToRemove.push_back(slot);
+ } else {
+ LOG_WARN_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Repeat timeouted request " << RequestId << " for " << slot->IdString(true));
+ Self->SendConfigureSlot(slot, ctx);
+ }
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "TTxCheckSlotStatus Execute "
+ << (Slot ? Slot->IdString() : TString("all slots")));
+
+ if (Slot) {
+ // Check slot wasn't re-created.
+ auto curSlot = Self->GetSlot(Slot->Id);
+ if (curSlot != Slot)
+ return true;
+
+ CheckSlot(Slot, ctx);
+ } else {
+ for (auto &pr : Self->Slots)
+ CheckSlot(pr.second, ctx);
+ }
+
+ for (auto &slot : SlotsToRemove) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Removing slot " << slot->IdString() << " due to connection timeout");
+ if (slot->AssignedTenant)
+ ReassignSlots = true;
+ Self->RemoveSlot(slot, txc, ctx);
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxCheckSlotStatus Complete");
+ if (ReassignSlots)
+ Self->ScheduleTxAssignFreeSlots(ctx);
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+ ui64 RequestId;
+ TSlot::TPtr Slot;
+ TVector<TSlot::TPtr> SlotsToRemove;
+ bool ReassignSlots;
+};
+
+ITransaction *TTenantSlotBroker::CreateTxCheckSlotStatus(ui64 requestId, TSlot::TPtr slot)
+{
+ return new TTxCheckSlotStatus(this, requestId, slot);
+}
+
+} // NTenantSlotBroker
+} // NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker__init_scheme.cpp b/ydb/core/mind/tenant_slot_broker__init_scheme.cpp
index 4bd0f0749f1..fbafe18ee6f 100644
--- a/ydb/core/mind/tenant_slot_broker__init_scheme.cpp
+++ b/ydb/core/mind/tenant_slot_broker__init_scheme.cpp
@@ -1,37 +1,37 @@
-#include "tenant_slot_broker_impl.h"
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-class TTenantSlotBroker::TTxInitScheme : public TTransactionBase<TTenantSlotBroker> {
-public:
- TTxInitScheme(TTenantSlotBroker *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxInitScheme Execute");
-
- NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxInitScheme Complete");
-
- Self->ProcessTx(Self->CreateTxLoadState(), ctx);
- Self->TxCompleted(this, ctx);
- }
-};
-
-ITransaction *TTenantSlotBroker::CreateTxInitScheme()
-{
- return new TTxInitScheme(this);
-}
-
-} // NTenantSlotBroker
-} // NKikimr
+#include "tenant_slot_broker_impl.h"
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+class TTenantSlotBroker::TTxInitScheme : public TTransactionBase<TTenantSlotBroker> {
+public:
+ TTxInitScheme(TTenantSlotBroker *self)
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxInitScheme Execute");
+
+ NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxInitScheme Complete");
+
+ Self->ProcessTx(Self->CreateTxLoadState(), ctx);
+ Self->TxCompleted(this, ctx);
+ }
+};
+
+ITransaction *TTenantSlotBroker::CreateTxInitScheme()
+{
+ return new TTxInitScheme(this);
+}
+
+} // NTenantSlotBroker
+} // NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker__load_state.cpp b/ydb/core/mind/tenant_slot_broker__load_state.cpp
index 94844b7d927..345b131ea3c 100644
--- a/ydb/core/mind/tenant_slot_broker__load_state.cpp
+++ b/ydb/core/mind/tenant_slot_broker__load_state.cpp
@@ -1,176 +1,176 @@
-#include "tenant_slot_broker_impl.h"
-
+#include "tenant_slot_broker_impl.h"
+
#include <ydb/core/base/appdata.h>
#include <library/cpp/actors/interconnect/interconnect.h>
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-class TTenantSlotBroker::TTxLoadState : public TTransactionBase<TTenantSlotBroker> {
-public:
- TTxLoadState(TTenantSlotBroker *self)
- : TBase(self)
- {
- }
-
- template <typename T>
- bool IsReady(T &t)
- {
- return t.IsReady();
- }
-
- template <typename T, typename ...Ts>
- bool IsReady(T &t, Ts &...args)
- {
- return t.IsReady() && IsReady(args...);
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxLoadState Execute");
-
- ui64 reqId = Self->RequestId++;
- NIceDb::TNiceDb db(txc.DB);
- auto configRow = db.Table<Schema::Config>().Key(ConfigKey_Config).Select<Schema::Config::TColumns>();
- auto tenantRowset = db.Table<Schema::RequiredSlots>().Range().Select<Schema::RequiredSlots::TColumns>();
- auto allocationRowset = db.Table<Schema::SlotsAllocations>().Range().Select<Schema::SlotsAllocations::TColumns>();
- auto slotRowset = db.Table<Schema::Slots>().Range().Select<Schema::Slots::TColumns>();
- auto labelRowset = db.Table<Schema::SlotLabels>().Range().Select<Schema::SlotLabels::TColumns>();
- auto bannedSlotRowset = db.Table<Schema::BannedSlots>().Range().Select<Schema::BannedSlots::TColumns>();
- auto pinnedSlotRowset = db.Table<Schema::PinnedSlots>().Range().Select<Schema::PinnedSlots::TColumns>();
-
- if (!db.Precharge<Schema>())
- return false;
-
- if (!IsReady(configRow, tenantRowset, allocationRowset, slotRowset, labelRowset, bannedSlotRowset, pinnedSlotRowset))
- return false;
-
- if (configRow.IsValid()) {
- auto configString = configRow.GetValue<Schema::Config::Value>();
- NKikimrTenantSlotBroker::TConfig config;
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+class TTenantSlotBroker::TTxLoadState : public TTransactionBase<TTenantSlotBroker> {
+public:
+ TTxLoadState(TTenantSlotBroker *self)
+ : TBase(self)
+ {
+ }
+
+ template <typename T>
+ bool IsReady(T &t)
+ {
+ return t.IsReady();
+ }
+
+ template <typename T, typename ...Ts>
+ bool IsReady(T &t, Ts &...args)
+ {
+ return t.IsReady() && IsReady(args...);
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxLoadState Execute");
+
+ ui64 reqId = Self->RequestId++;
+ NIceDb::TNiceDb db(txc.DB);
+ auto configRow = db.Table<Schema::Config>().Key(ConfigKey_Config).Select<Schema::Config::TColumns>();
+ auto tenantRowset = db.Table<Schema::RequiredSlots>().Range().Select<Schema::RequiredSlots::TColumns>();
+ auto allocationRowset = db.Table<Schema::SlotsAllocations>().Range().Select<Schema::SlotsAllocations::TColumns>();
+ auto slotRowset = db.Table<Schema::Slots>().Range().Select<Schema::Slots::TColumns>();
+ auto labelRowset = db.Table<Schema::SlotLabels>().Range().Select<Schema::SlotLabels::TColumns>();
+ auto bannedSlotRowset = db.Table<Schema::BannedSlots>().Range().Select<Schema::BannedSlots::TColumns>();
+ auto pinnedSlotRowset = db.Table<Schema::PinnedSlots>().Range().Select<Schema::PinnedSlots::TColumns>();
+
+ if (!db.Precharge<Schema>())
+ return false;
+
+ if (!IsReady(configRow, tenantRowset, allocationRowset, slotRowset, labelRowset, bannedSlotRowset, pinnedSlotRowset))
+ return false;
+
+ if (configRow.IsValid()) {
+ auto configString = configRow.GetValue<Schema::Config::Value>();
+ NKikimrTenantSlotBroker::TConfig config;
Y_PROTOBUF_SUPPRESS_NODISCARD config.ParseFromArray(configString.data(), configString.size());
- Self->LoadConfigFromProto(config);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Loaded config:" << Endl << config.DebugString());
- } else {
- Self->LoadConfigFromProto(NKikimrTenantSlotBroker::TConfig());
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "Using default config.");
- }
-
- Self->ClearState();
-
- while (!tenantRowset.EndOfSet()) {
- TString tenantName = tenantRowset.GetValue<Schema::RequiredSlots::TenantName>();
- TTenant::TPtr tenant = Self->GetOrCreateTenant(tenantName);
-
- TSlotDescription descr;
- descr.SlotType = tenantRowset.GetValue<Schema::RequiredSlots::SlotType>();
- ui64 dc = tenantRowset.GetValue<Schema::RequiredSlots::DataCenter>();
- descr.DataCenter = DataCenterToString((ui32)dc);
-
- auto count = tenantRowset.GetValue<Schema::RequiredSlots::Count>();
- tenant->AddSlotsAllocation(descr, count);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Loaded required slots " << descr.ToString() << " for tenant " << tenantName);
-
- if (!tenantRowset.Next())
- return false;
- }
-
- while (!allocationRowset.EndOfSet()) {
- TString tenantName = allocationRowset.GetValue<Schema::SlotsAllocations::TenantName>();
- TTenant::TPtr tenant = Self->GetOrCreateTenant(tenantName);
-
- TSlotDescription descr;
- descr.SlotType = allocationRowset.GetValue<Schema::SlotsAllocations::SlotType>();
- descr.DataCenter = allocationRowset.GetValue<Schema::SlotsAllocations::DataCenter>();
- descr.ForceLocation = allocationRowset.GetValue<Schema::SlotsAllocations::ForceLocation>();
- descr.CollocationGroup = allocationRowset.GetValue<Schema::SlotsAllocations::CollocationGroup>();
- descr.ForceCollocation = allocationRowset.GetValue<Schema::SlotsAllocations::ForceCollocation>();
-
- auto count = allocationRowset.GetValue<Schema::SlotsAllocations::Count>();
- tenant->AddSlotsAllocation(descr, count);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Loaded required slots " << descr.ToString() << " for tenant " << tenantName);
-
- if (!allocationRowset.Next())
- return false;
- }
-
- while (!labelRowset.EndOfSet()) {
- TString tenantName = labelRowset.GetValue<Schema::SlotLabels::TenantName>();
- TString label = labelRowset.GetValue<Schema::SlotLabels::Label>();
-
- TTenant::TPtr tenant = Self->GetTenant(tenantName);
- Y_VERIFY(tenant);
- tenant->AddUnusedSlotLabel(label);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Loaded slot label " << label << " for tenant " << tenantName);
-
- if (!labelRowset.Next())
- return false;
- }
-
- while (!slotRowset.EndOfSet()) {
- TSlotId id(slotRowset.GetValue<Schema::Slots::NodeId>(),
- slotRowset.GetValue<Schema::Slots::SlotId>());
- TString slotType = slotRowset.GetValue<Schema::Slots::SlotType>();
- TString assignedTenantName = slotRowset.GetValue<Schema::Slots::AssignedTenant>();
- TString dataCenter;
-
- if (slotRowset.HaveValue<Schema::Slots::DataCenterName>()) {
- dataCenter = slotRowset.GetValue<Schema::Slots::DataCenterName>();
- } else {
- dataCenter = DataCenterToString(slotRowset.GetValue<Schema::Slots::DataCenter>());
- }
-
+ Self->LoadConfigFromProto(config);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Loaded config:" << Endl << config.DebugString());
+ } else {
+ Self->LoadConfigFromProto(NKikimrTenantSlotBroker::TConfig());
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "Using default config.");
+ }
+
+ Self->ClearState();
+
+ while (!tenantRowset.EndOfSet()) {
+ TString tenantName = tenantRowset.GetValue<Schema::RequiredSlots::TenantName>();
+ TTenant::TPtr tenant = Self->GetOrCreateTenant(tenantName);
+
+ TSlotDescription descr;
+ descr.SlotType = tenantRowset.GetValue<Schema::RequiredSlots::SlotType>();
+ ui64 dc = tenantRowset.GetValue<Schema::RequiredSlots::DataCenter>();
+ descr.DataCenter = DataCenterToString((ui32)dc);
+
+ auto count = tenantRowset.GetValue<Schema::RequiredSlots::Count>();
+ tenant->AddSlotsAllocation(descr, count);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Loaded required slots " << descr.ToString() << " for tenant " << tenantName);
+
+ if (!tenantRowset.Next())
+ return false;
+ }
+
+ while (!allocationRowset.EndOfSet()) {
+ TString tenantName = allocationRowset.GetValue<Schema::SlotsAllocations::TenantName>();
+ TTenant::TPtr tenant = Self->GetOrCreateTenant(tenantName);
+
+ TSlotDescription descr;
+ descr.SlotType = allocationRowset.GetValue<Schema::SlotsAllocations::SlotType>();
+ descr.DataCenter = allocationRowset.GetValue<Schema::SlotsAllocations::DataCenter>();
+ descr.ForceLocation = allocationRowset.GetValue<Schema::SlotsAllocations::ForceLocation>();
+ descr.CollocationGroup = allocationRowset.GetValue<Schema::SlotsAllocations::CollocationGroup>();
+ descr.ForceCollocation = allocationRowset.GetValue<Schema::SlotsAllocations::ForceCollocation>();
+
+ auto count = allocationRowset.GetValue<Schema::SlotsAllocations::Count>();
+ tenant->AddSlotsAllocation(descr, count);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Loaded required slots " << descr.ToString() << " for tenant " << tenantName);
+
+ if (!allocationRowset.Next())
+ return false;
+ }
+
+ while (!labelRowset.EndOfSet()) {
+ TString tenantName = labelRowset.GetValue<Schema::SlotLabels::TenantName>();
+ TString label = labelRowset.GetValue<Schema::SlotLabels::Label>();
+
+ TTenant::TPtr tenant = Self->GetTenant(tenantName);
+ Y_VERIFY(tenant);
+ tenant->AddUnusedSlotLabel(label);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Loaded slot label " << label << " for tenant " << tenantName);
+
+ if (!labelRowset.Next())
+ return false;
+ }
+
+ while (!slotRowset.EndOfSet()) {
+ TSlotId id(slotRowset.GetValue<Schema::Slots::NodeId>(),
+ slotRowset.GetValue<Schema::Slots::SlotId>());
+ TString slotType = slotRowset.GetValue<Schema::Slots::SlotType>();
+ TString assignedTenantName = slotRowset.GetValue<Schema::Slots::AssignedTenant>();
+ TString dataCenter;
+
+ if (slotRowset.HaveValue<Schema::Slots::DataCenterName>()) {
+ dataCenter = slotRowset.GetValue<Schema::Slots::DataCenterName>();
+ } else {
+ dataCenter = DataCenterToString(slotRowset.GetValue<Schema::Slots::DataCenter>());
+ }
+
Y_VERIFY(!Self->Slots.contains(id));
- TSlot::TPtr slot = new TSlot(id, slotType, dataCenter);
- slot->LastRequestId = reqId;
- Self->AddSlot(slot);
-
- if (assignedTenantName) {
- Y_VERIFY(!slot->IsBanned);
- TSlotDescription usedAs;
- usedAs.SlotType = slotRowset.GetValue<Schema::Slots::UsedAsType>();
- if (slotRowset.HaveValue<Schema::Slots::UsedAsDataCenterName>()) {
- usedAs.DataCenter = slotRowset.GetValue<Schema::Slots::UsedAsDataCenterName>();
- usedAs.ForceLocation = slotRowset.GetValue<Schema::Slots::UsedAsForceLocation>();
- usedAs.CollocationGroup = slotRowset.GetValue<Schema::Slots::UsedAsCollocationGroup>();
- usedAs.ForceCollocation = slotRowset.GetValue<Schema::Slots::UsedAsForceCollocation>();
- } else {
- auto dc = slotRowset.GetValue<Schema::Slots::UsedAsDataCenter>();
- usedAs.DataCenter = DataCenterToString(dc);
- }
- auto label = slotRowset.GetValue<Schema::Slots::Label>();
- auto tenant = Self->GetTenant(assignedTenantName);
- Y_VERIFY(tenant);
-
- Self->AttachSlotNoConfigureNoDb(slot, tenant, usedAs, label);
- }
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "Loaded " << slot->IdString(true));
-
- if (!slotRowset.Next())
- return false;
- }
-
- // Determine preferred data centers for collocation groups and
- // fill unhappy tenants.
- for (auto &pr : Self->Tenants) {
- pr.second->DetermineDataCenterForCollocationGroups();
- Self->AddUnhappyTenant(pr.second);
- }
-
- // Request node info to check slot's data center.
- for (auto &pr : Self->SlotsByNodeId) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Taking ownership of tenant pool on node " << pr.first);
-
+ TSlot::TPtr slot = new TSlot(id, slotType, dataCenter);
+ slot->LastRequestId = reqId;
+ Self->AddSlot(slot);
+
+ if (assignedTenantName) {
+ Y_VERIFY(!slot->IsBanned);
+ TSlotDescription usedAs;
+ usedAs.SlotType = slotRowset.GetValue<Schema::Slots::UsedAsType>();
+ if (slotRowset.HaveValue<Schema::Slots::UsedAsDataCenterName>()) {
+ usedAs.DataCenter = slotRowset.GetValue<Schema::Slots::UsedAsDataCenterName>();
+ usedAs.ForceLocation = slotRowset.GetValue<Schema::Slots::UsedAsForceLocation>();
+ usedAs.CollocationGroup = slotRowset.GetValue<Schema::Slots::UsedAsCollocationGroup>();
+ usedAs.ForceCollocation = slotRowset.GetValue<Schema::Slots::UsedAsForceCollocation>();
+ } else {
+ auto dc = slotRowset.GetValue<Schema::Slots::UsedAsDataCenter>();
+ usedAs.DataCenter = DataCenterToString(dc);
+ }
+ auto label = slotRowset.GetValue<Schema::Slots::Label>();
+ auto tenant = Self->GetTenant(assignedTenantName);
+ Y_VERIFY(tenant);
+
+ Self->AttachSlotNoConfigureNoDb(slot, tenant, usedAs, label);
+ }
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "Loaded " << slot->IdString(true));
+
+ if (!slotRowset.Next())
+ return false;
+ }
+
+ // Determine preferred data centers for collocation groups and
+ // fill unhappy tenants.
+ for (auto &pr : Self->Tenants) {
+ pr.second->DetermineDataCenterForCollocationGroups();
+ Self->AddUnhappyTenant(pr.second);
+ }
+
+ // Request node info to check slot's data center.
+ for (auto &pr : Self->SlotsByNodeId) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Taking ownership of tenant pool on node " << pr.first);
+
ctx.Send(MakeTenantPoolID(pr.first, Self->DomainId), new TEvTenantPool::TEvTakeOwnership(Self->Generation()));
ctx.Send(GetNameserviceActorId(), new TEvInterconnect::TEvGetNode(pr.first));
@@ -179,27 +179,27 @@ public:
const TDuration pendingTimeout = Self->PendingTimeout + TDuration::FromValue(randomDelay);
ctx.Schedule(pendingTimeout, new TEvPrivate::TEvCheckSlotStatus(slot, reqId));
}
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxLoadState Complete");
-
- Self->Become(&TTenantSlotBroker::StateWork);
- Self->ProcessEnqueuedEvents(ctx);
- Self->TxCompleted(this, ctx);
- }
-
-private:
-};
-
-ITransaction *TTenantSlotBroker::CreateTxLoadState()
-{
- return new TTxLoadState(this);
-}
-
-} // NTenantSlotBroker
-} // NKikimr
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxLoadState Complete");
+
+ Self->Become(&TTenantSlotBroker::StateWork);
+ Self->ProcessEnqueuedEvents(ctx);
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+};
+
+ITransaction *TTenantSlotBroker::CreateTxLoadState()
+{
+ return new TTxLoadState(this);
+}
+
+} // NTenantSlotBroker
+} // NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker__scheme.h b/ydb/core/mind/tenant_slot_broker__scheme.h
index af995bb6330..88b6ba06297 100644
--- a/ydb/core/mind/tenant_slot_broker__scheme.h
+++ b/ydb/core/mind/tenant_slot_broker__scheme.h
@@ -1,97 +1,97 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <ydb/core/scheme/scheme_types_defs.h>
#include <ydb/core/tablet_flat/flat_cxx_database.h>
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-struct Schema : NIceDb::Schema {
- struct Config : Table<1> {
- struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
- struct Value : Column<2, NScheme::NTypeIds::Utf8> {};
-
- using TKey = TableKey<Key>;
- using TColumns = TableColumns<Key, Value>;
- };
-
- struct RequiredSlots : Table<2> {
- struct TenantName : Column<1, NScheme::NTypeIds::Utf8> {};
- struct SlotType : Column<2, NScheme::NTypeIds::Utf8> {};
- struct DataCenter : Column<3, NScheme::NTypeIds::Uint64> {};
- struct Count : Column<4, NScheme::NTypeIds::Uint64> {};
-
- using TKey = TableKey<TenantName, SlotType, DataCenter>;
- using TColumns = TableColumns<TenantName, SlotType, DataCenter, Count>;
- };
-
- struct Slots : Table<3> {
- struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
- struct SlotId : Column<2, NScheme::NTypeIds::Utf8> {};
- struct SlotType : Column<3, NScheme::NTypeIds::Utf8> {};
- struct DataCenter : Column<4, NScheme::NTypeIds::Uint64> {};
- struct AssignedTenant : Column<5, NScheme::NTypeIds::Utf8> {};
- struct UsedAsType : Column<6, NScheme::NTypeIds::Utf8> {};
- struct UsedAsDataCenter : Column<7, NScheme::NTypeIds::Uint64> {};
- struct Label : Column<8, NScheme::NTypeIds::Utf8> {};
- struct DataCenterName : Column<9, NScheme::NTypeIds::Utf8> {};
- struct UsedAsDataCenterName : Column<10, NScheme::NTypeIds::Utf8> {};
- struct UsedAsCollocationGroup : Column<11, NScheme::NTypeIds::Uint32> {};
- struct UsedAsForceLocation : Column<12, NScheme::NTypeIds::Bool> {};
- struct UsedAsForceCollocation : Column<13, NScheme::NTypeIds::Bool> {};
-
- using TKey = TableKey<NodeId, SlotId>;
- using TColumns = TableColumns<NodeId, SlotId, SlotType, DataCenter, AssignedTenant, UsedAsType, UsedAsDataCenter, Label,
- DataCenterName, UsedAsDataCenterName, UsedAsCollocationGroup, UsedAsForceLocation, UsedAsForceCollocation>;
- };
-
- struct SlotLabels : Table<4> {
- struct TenantName : Column<1, NScheme::NTypeIds::Utf8> {};
- struct Label : Column<2, NScheme::NTypeIds::Utf8> {};
-
- using TKey = TableKey<TenantName, Label>;
- using TColumns = TableColumns<TenantName, Label>;
- };
-
- // TODO: move location into global table and reference it by ID here and in Slots UsedBy;
- struct SlotsAllocations : Table<5> {
- struct TenantName : Column<1, NScheme::NTypeIds::Utf8> {};
- struct SlotType : Column<2, NScheme::NTypeIds::Utf8> {};
- struct DataCenter : Column<3, NScheme::NTypeIds::Utf8> {};
- struct CollocationGroup : Column<4, NScheme::NTypeIds::Uint32> {};
- struct ForceLocation : Column<5, NScheme::NTypeIds::Bool> {};
- struct ForceCollocation : Column<6, NScheme::NTypeIds::Bool> {};
- struct Count : Column<7, NScheme::NTypeIds::Uint64> {};
-
- using TKey = TableKey<TenantName, SlotType, DataCenter, CollocationGroup, ForceLocation, ForceCollocation>;
- using TColumns = TableColumns<TenantName, SlotType, DataCenter, CollocationGroup, ForceLocation, ForceCollocation, Count>;
- };
-
- struct BannedSlots : Table<6> {
- struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
- struct SlotId : Column<2, NScheme::NTypeIds::Utf8> {};
-
- using TKey = TableKey<NodeId, SlotId>;
- using TColumns = TableColumns<NodeId, SlotId>;
- };
-
- struct PinnedSlots : Table<7> {
- struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
- struct SlotId : Column<2, NScheme::NTypeIds::Utf8> {};
- struct TenantName : Column<3, NScheme::NTypeIds::Utf8> {};
- struct Label : Column<4, NScheme::NTypeIds::Utf8> {};
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+struct Schema : NIceDb::Schema {
+ struct Config : Table<1> {
+ struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct Value : Column<2, NScheme::NTypeIds::Utf8> {};
+
+ using TKey = TableKey<Key>;
+ using TColumns = TableColumns<Key, Value>;
+ };
+
+ struct RequiredSlots : Table<2> {
+ struct TenantName : Column<1, NScheme::NTypeIds::Utf8> {};
+ struct SlotType : Column<2, NScheme::NTypeIds::Utf8> {};
+ struct DataCenter : Column<3, NScheme::NTypeIds::Uint64> {};
+ struct Count : Column<4, NScheme::NTypeIds::Uint64> {};
+
+ using TKey = TableKey<TenantName, SlotType, DataCenter>;
+ using TColumns = TableColumns<TenantName, SlotType, DataCenter, Count>;
+ };
+
+ struct Slots : Table<3> {
+ struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct SlotId : Column<2, NScheme::NTypeIds::Utf8> {};
+ struct SlotType : Column<3, NScheme::NTypeIds::Utf8> {};
+ struct DataCenter : Column<4, NScheme::NTypeIds::Uint64> {};
+ struct AssignedTenant : Column<5, NScheme::NTypeIds::Utf8> {};
+ struct UsedAsType : Column<6, NScheme::NTypeIds::Utf8> {};
+ struct UsedAsDataCenter : Column<7, NScheme::NTypeIds::Uint64> {};
+ struct Label : Column<8, NScheme::NTypeIds::Utf8> {};
+ struct DataCenterName : Column<9, NScheme::NTypeIds::Utf8> {};
+ struct UsedAsDataCenterName : Column<10, NScheme::NTypeIds::Utf8> {};
+ struct UsedAsCollocationGroup : Column<11, NScheme::NTypeIds::Uint32> {};
+ struct UsedAsForceLocation : Column<12, NScheme::NTypeIds::Bool> {};
+ struct UsedAsForceCollocation : Column<13, NScheme::NTypeIds::Bool> {};
+
+ using TKey = TableKey<NodeId, SlotId>;
+ using TColumns = TableColumns<NodeId, SlotId, SlotType, DataCenter, AssignedTenant, UsedAsType, UsedAsDataCenter, Label,
+ DataCenterName, UsedAsDataCenterName, UsedAsCollocationGroup, UsedAsForceLocation, UsedAsForceCollocation>;
+ };
+
+ struct SlotLabels : Table<4> {
+ struct TenantName : Column<1, NScheme::NTypeIds::Utf8> {};
+ struct Label : Column<2, NScheme::NTypeIds::Utf8> {};
+
+ using TKey = TableKey<TenantName, Label>;
+ using TColumns = TableColumns<TenantName, Label>;
+ };
+
+ // TODO: move location into global table and reference it by ID here and in Slots UsedBy;
+ struct SlotsAllocations : Table<5> {
+ struct TenantName : Column<1, NScheme::NTypeIds::Utf8> {};
+ struct SlotType : Column<2, NScheme::NTypeIds::Utf8> {};
+ struct DataCenter : Column<3, NScheme::NTypeIds::Utf8> {};
+ struct CollocationGroup : Column<4, NScheme::NTypeIds::Uint32> {};
+ struct ForceLocation : Column<5, NScheme::NTypeIds::Bool> {};
+ struct ForceCollocation : Column<6, NScheme::NTypeIds::Bool> {};
+ struct Count : Column<7, NScheme::NTypeIds::Uint64> {};
+
+ using TKey = TableKey<TenantName, SlotType, DataCenter, CollocationGroup, ForceLocation, ForceCollocation>;
+ using TColumns = TableColumns<TenantName, SlotType, DataCenter, CollocationGroup, ForceLocation, ForceCollocation, Count>;
+ };
+
+ struct BannedSlots : Table<6> {
+ struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct SlotId : Column<2, NScheme::NTypeIds::Utf8> {};
+
+ using TKey = TableKey<NodeId, SlotId>;
+ using TColumns = TableColumns<NodeId, SlotId>;
+ };
+
+ struct PinnedSlots : Table<7> {
+ struct NodeId : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct SlotId : Column<2, NScheme::NTypeIds::Utf8> {};
+ struct TenantName : Column<3, NScheme::NTypeIds::Utf8> {};
+ struct Label : Column<4, NScheme::NTypeIds::Utf8> {};
struct Deadline : Column<5, NScheme::NTypeIds::Uint64> {};
-
- using TKey = TableKey<NodeId, SlotId>;
+
+ using TKey = TableKey<NodeId, SlotId>;
using TColumns = TableColumns<NodeId, SlotId, TenantName, Label, Deadline>;
- };
-
- using TTables = SchemaTables<Config, RequiredSlots, Slots, SlotLabels, SlotsAllocations, BannedSlots, PinnedSlots>;
- using TSettings = SchemaSettings<ExecutorLogBatching<true>,
- ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
-};
-
-} // NTenantSlotBroker
-} // NKikimr
+ };
+
+ using TTables = SchemaTables<Config, RequiredSlots, Slots, SlotLabels, SlotsAllocations, BannedSlots, PinnedSlots>;
+ using TSettings = SchemaSettings<ExecutorLogBatching<true>,
+ ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
+};
+
+} // NTenantSlotBroker
+} // NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker__update_config.cpp b/ydb/core/mind/tenant_slot_broker__update_config.cpp
index c301bf19aa5..360b28d9c16 100644
--- a/ydb/core/mind/tenant_slot_broker__update_config.cpp
+++ b/ydb/core/mind/tenant_slot_broker__update_config.cpp
@@ -1,66 +1,66 @@
-#include "tenant_slot_broker_impl.h"
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-class TTenantSlotBroker::TTxUpdateConfig : public TTransactionBase<TTenantSlotBroker> {
-public:
- TTxUpdateConfig(TTenantSlotBroker *self, TEvConsole::TEvConfigNotificationRequest::TPtr ev)
- : TBase(self)
- , Event(std::move(ev))
- , Modify(false)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- auto &rec = Event->Get()->Record;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "TTxUpdateConfig Execute " << rec.ShortDebugString());
-
- if (rec.GetSubscriptionId() != Self->ConfigSubscriptionId) {
- LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Config subscription id mismatch (" << rec.GetSubscriptionId()
- << " vs expected " << Self->ConfigSubscriptionId << ")");
- return true;
- }
-
- NIceDb::TNiceDb db(txc.DB);
- TString config;
+#include "tenant_slot_broker_impl.h"
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+class TTenantSlotBroker::TTxUpdateConfig : public TTransactionBase<TTenantSlotBroker> {
+public:
+ TTxUpdateConfig(TTenantSlotBroker *self, TEvConsole::TEvConfigNotificationRequest::TPtr ev)
+ : TBase(self)
+ , Event(std::move(ev))
+ , Modify(false)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ auto &rec = Event->Get()->Record;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "TTxUpdateConfig Execute " << rec.ShortDebugString());
+
+ if (rec.GetSubscriptionId() != Self->ConfigSubscriptionId) {
+ LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Config subscription id mismatch (" << rec.GetSubscriptionId()
+ << " vs expected " << Self->ConfigSubscriptionId << ")");
+ return true;
+ }
+
+ NIceDb::TNiceDb db(txc.DB);
+ TString config;
Y_PROTOBUF_SUPPRESS_NODISCARD rec.GetConfig().GetTenantSlotBrokerConfig().SerializeToString(&config);
- db.Table<Schema::Config>().Key(ConfigKey_Config)
- .Update(NIceDb::TUpdate<Schema::Config::Value>(config));
-
- Modify = true;
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdateConfig Complete");
-
- if (Modify) {
- auto &rec = Event->Get()->Record;
- Self->LoadConfigFromProto(rec.GetConfig().GetTenantSlotBrokerConfig());
-
- auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
- ctx.Send(Event->Sender, resp.Release(), 0, Event->Cookie);
- }
-
- Self->TxCompleted(this, ctx);
- }
-
-private:
- TEvConsole::TEvConfigNotificationRequest::TPtr Event;
- bool Modify;
-};
-
-ITransaction *TTenantSlotBroker::CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev)
-{
- return new TTxUpdateConfig(this, std::move(ev));
-}
-
-} // NTenantSlotBroker
-} // NKikimr
+ db.Table<Schema::Config>().Key(ConfigKey_Config)
+ .Update(NIceDb::TUpdate<Schema::Config::Value>(config));
+
+ Modify = true;
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdateConfig Complete");
+
+ if (Modify) {
+ auto &rec = Event->Get()->Record;
+ Self->LoadConfigFromProto(rec.GetConfig().GetTenantSlotBrokerConfig());
+
+ auto resp = MakeHolder<TEvConsole::TEvConfigNotificationResponse>(rec);
+ ctx.Send(Event->Sender, resp.Release(), 0, Event->Cookie);
+ }
+
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvConsole::TEvConfigNotificationRequest::TPtr Event;
+ bool Modify;
+};
+
+ITransaction *TTenantSlotBroker::CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev)
+{
+ return new TTxUpdateConfig(this, std::move(ev));
+}
+
+} // NTenantSlotBroker
+} // NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker__update_node_location.cpp b/ydb/core/mind/tenant_slot_broker__update_node_location.cpp
index fa3d808a603..3ed528dcbc3 100644
--- a/ydb/core/mind/tenant_slot_broker__update_node_location.cpp
+++ b/ydb/core/mind/tenant_slot_broker__update_node_location.cpp
@@ -1,70 +1,70 @@
-#include "tenant_slot_broker_impl.h"
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-class TTenantSlotBroker::TTxUpdateNodeLocation : public TTransactionBase<TTenantSlotBroker> {
-public:
- TTxUpdateNodeLocation(TTenantSlotBroker *self, TEvInterconnect::TEvNodeInfo::TPtr ev)
- : TBase(self)
- , Event(std::move(ev))
- , Modified(false)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdateNodeLocation Execute");
-
- auto nodeId = Event->Get()->NodeId;
- auto &nodeInfo = Event->Get()->Node;
-
- // We probably have no access to NodeBroker now and cannot
- // determine node's DC. In this case keep the previous value.
- if (!nodeInfo)
- return true;
-
+#include "tenant_slot_broker_impl.h"
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+class TTenantSlotBroker::TTxUpdateNodeLocation : public TTransactionBase<TTenantSlotBroker> {
+public:
+ TTxUpdateNodeLocation(TTenantSlotBroker *self, TEvInterconnect::TEvNodeInfo::TPtr ev)
+ : TBase(self)
+ , Event(std::move(ev))
+ , Modified(false)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdateNodeLocation Execute");
+
+ auto nodeId = Event->Get()->NodeId;
+ auto &nodeInfo = Event->Get()->Node;
+
+ // We probably have no access to NodeBroker now and cannot
+ // determine node's DC. In this case keep the previous value.
+ if (!nodeInfo)
+ return true;
+
auto dc = nodeInfo->Location.GetDataCenterId();
-
+
if (Self->NodeIdToDataCenter.contains(nodeId)
- && Self->NodeIdToDataCenter[nodeId] == dc)
- return true;
-
- Self->NodeIdToDataCenter[nodeId] = dc;
-
- // Update data center for affected slots.
- auto it = Self->SlotsByNodeId.find(nodeId);
- if (it == Self->SlotsByNodeId.end())
- return true;
-
- NIceDb::TNiceDb db(txc.DB);
- for (auto &slot : it->second) {
- Modified = Self->UpdateSlotDataCenter(slot, dc, txc, ctx) || Modified;
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdateNodeLocation Complete");
-
- if (Modified && Self->HasUnhappyTenant())
- Self->ScheduleTxAssignFreeSlots(ctx);
-
- Self->TxCompleted(this, ctx);
- }
-
-private:
- TEvInterconnect::TEvNodeInfo::TPtr Event;
- TVector<TSlot::TPtr> ToConfigure;
- bool Modified;
-};
-
-ITransaction *TTenantSlotBroker::CreateTxUpdateNodeLocation(TEvInterconnect::TEvNodeInfo::TPtr &ev)
-{
- return new TTxUpdateNodeLocation(this, std::move(ev));
-}
-
-} // NTenantSlotBroker
-} // NKikimr
+ && Self->NodeIdToDataCenter[nodeId] == dc)
+ return true;
+
+ Self->NodeIdToDataCenter[nodeId] = dc;
+
+ // Update data center for affected slots.
+ auto it = Self->SlotsByNodeId.find(nodeId);
+ if (it == Self->SlotsByNodeId.end())
+ return true;
+
+ NIceDb::TNiceDb db(txc.DB);
+ for (auto &slot : it->second) {
+ Modified = Self->UpdateSlotDataCenter(slot, dc, txc, ctx) || Modified;
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdateNodeLocation Complete");
+
+ if (Modified && Self->HasUnhappyTenant())
+ Self->ScheduleTxAssignFreeSlots(ctx);
+
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvInterconnect::TEvNodeInfo::TPtr Event;
+ TVector<TSlot::TPtr> ToConfigure;
+ bool Modified;
+};
+
+ITransaction *TTenantSlotBroker::CreateTxUpdateNodeLocation(TEvInterconnect::TEvNodeInfo::TPtr &ev)
+{
+ return new TTxUpdateNodeLocation(this, std::move(ev));
+}
+
+} // NTenantSlotBroker
+} // NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker__update_pool_status.cpp b/ydb/core/mind/tenant_slot_broker__update_pool_status.cpp
index 415eff0b0e1..1e43062762c 100644
--- a/ydb/core/mind/tenant_slot_broker__update_pool_status.cpp
+++ b/ydb/core/mind/tenant_slot_broker__update_pool_status.cpp
@@ -1,110 +1,110 @@
-#include "tenant_slot_broker_impl.h"
-
+#include "tenant_slot_broker_impl.h"
+
#include <library/cpp/actors/interconnect/interconnect.h>
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-class TTenantSlotBroker::TTxUpdatePoolStatus : public TTransactionBase<TTenantSlotBroker> {
-public:
- TTxUpdatePoolStatus(TTenantSlotBroker *self, TEvTenantPool::TEvTenantPoolStatus::TPtr ev)
- : TBase(self)
- , Event(std::move(ev))
- , NewFreeSlot(false)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- ui32 nodeId = Event->Sender.NodeId();
- auto &rec = Event->Get()->Record;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdatePoolStatus execute for node " << nodeId);
-
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+class TTenantSlotBroker::TTxUpdatePoolStatus : public TTransactionBase<TTenantSlotBroker> {
+public:
+ TTxUpdatePoolStatus(TTenantSlotBroker *self, TEvTenantPool::TEvTenantPoolStatus::TPtr ev)
+ : TBase(self)
+ , Event(std::move(ev))
+ , NewFreeSlot(false)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ ui32 nodeId = Event->Sender.NodeId();
+ auto &rec = Event->Get()->Record;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdatePoolStatus execute for node " << nodeId);
+
TString dc = ANY_DATA_CENTER;
if (Self->NodeIdToDataCenter.contains(nodeId))
- dc = Self->NodeIdToDataCenter[nodeId];
-
- for (auto &slotProto : rec.GetSlots()) {
- auto &slotId = slotProto.GetId();
- auto &slotType = slotProto.GetType();
- auto &tenantName = slotProto.GetAssignedTenant();
-
- auto it = Self->Slots.find(TSlotId(nodeId, slotId));
- if (it == Self->Slots.end()) {
- // Add new known slot, detach any tenant from it.
- TSlot::TPtr slot = new TSlot({nodeId, slotId}, slotType, dc);
- slot->IsConnected = true;
-
- Self->AddSlot(slot, txc, ctx);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "New slot connected " << slot->IdString(true));
-
- if (slot->IsFree())
- NewFreeSlot = true;
-
- if (tenantName || slot->IsPinned)
- ToConfigure.push_back(slot);
- } else {
- auto &slot = it->second;
-
- if (slot->IsPending())
- slot->AssignedTenant->GetAllocation(slot->UsedAs)->DecPending();
-
- Self->SlotConnected(slot);
- slot->LastRequestId = 0;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Reconnected to " << slot->IdString(true));
-
- if (slot->IsFree()) {
- Self->FreeSlots.Add(slot);
- NewFreeSlot = true;
- }
-
- bool detached = Self->UpdateSlotType(slot, slotType, txc, ctx) && !slot->IsFree();
-
- // Check if re-configuration is required or assigned resource is confirmed.
- if ((!detached && !slot->AssignedTenant && tenantName)
- || (slot->AssignedTenant && slot->AssignedTenant->Name != tenantName)
- || (slot->AssignedTenant && slot->Label != slotProto.GetLabel())) {
- ToConfigure.push_back(slot);
- }
- }
- }
-
+ dc = Self->NodeIdToDataCenter[nodeId];
+
+ for (auto &slotProto : rec.GetSlots()) {
+ auto &slotId = slotProto.GetId();
+ auto &slotType = slotProto.GetType();
+ auto &tenantName = slotProto.GetAssignedTenant();
+
+ auto it = Self->Slots.find(TSlotId(nodeId, slotId));
+ if (it == Self->Slots.end()) {
+ // Add new known slot, detach any tenant from it.
+ TSlot::TPtr slot = new TSlot({nodeId, slotId}, slotType, dc);
+ slot->IsConnected = true;
+
+ Self->AddSlot(slot, txc, ctx);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "New slot connected " << slot->IdString(true));
+
+ if (slot->IsFree())
+ NewFreeSlot = true;
+
+ if (tenantName || slot->IsPinned)
+ ToConfigure.push_back(slot);
+ } else {
+ auto &slot = it->second;
+
+ if (slot->IsPending())
+ slot->AssignedTenant->GetAllocation(slot->UsedAs)->DecPending();
+
+ Self->SlotConnected(slot);
+ slot->LastRequestId = 0;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Reconnected to " << slot->IdString(true));
+
+ if (slot->IsFree()) {
+ Self->FreeSlots.Add(slot);
+ NewFreeSlot = true;
+ }
+
+ bool detached = Self->UpdateSlotType(slot, slotType, txc, ctx) && !slot->IsFree();
+
+ // Check if re-configuration is required or assigned resource is confirmed.
+ if ((!detached && !slot->AssignedTenant && tenantName)
+ || (slot->AssignedTenant && slot->AssignedTenant->Name != tenantName)
+ || (slot->AssignedTenant && slot->Label != slotProto.GetLabel())) {
+ ToConfigure.push_back(slot);
+ }
+ }
+ }
+
if (!Self->NodeIdToDataCenter.contains(nodeId))
ctx.Send(GetNameserviceActorId(), new TEvInterconnect::TEvGetNode(nodeId));
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- ui32 nodeId = Event->Sender.NodeId();
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdatePoolStatus complete for node " << nodeId);
-
- for (auto &slot : ToConfigure) {
- Self->SendConfigureSlot(slot, ctx);
- }
-
- if (NewFreeSlot && Self->HasUnhappyTenant())
- Self->ScheduleTxAssignFreeSlots(ctx);
-
- Self->TxCompleted(this, ctx);
- }
-
-private:
- TEvTenantPool::TEvTenantPoolStatus::TPtr Event;
- TVector<TSlot::TPtr> ToConfigure;
- bool NewFreeSlot;
-};
-
-ITransaction *TTenantSlotBroker::CreateTxUpdatePoolStatus(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev)
-{
- return new TTxUpdatePoolStatus(this, std::move(ev));
-}
-
-} // NTenantSlotBroker
-} // NKikimr
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ ui32 nodeId = Event->Sender.NodeId();
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdatePoolStatus complete for node " << nodeId);
+
+ for (auto &slot : ToConfigure) {
+ Self->SendConfigureSlot(slot, ctx);
+ }
+
+ if (NewFreeSlot && Self->HasUnhappyTenant())
+ Self->ScheduleTxAssignFreeSlots(ctx);
+
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvTenantPool::TEvTenantPoolStatus::TPtr Event;
+ TVector<TSlot::TPtr> ToConfigure;
+ bool NewFreeSlot;
+};
+
+ITransaction *TTenantSlotBroker::CreateTxUpdatePoolStatus(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev)
+{
+ return new TTxUpdatePoolStatus(this, std::move(ev));
+}
+
+} // NTenantSlotBroker
+} // NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker__update_slot_status.cpp b/ydb/core/mind/tenant_slot_broker__update_slot_status.cpp
index 0a7699b0fbb..73538e38d60 100644
--- a/ydb/core/mind/tenant_slot_broker__update_slot_status.cpp
+++ b/ydb/core/mind/tenant_slot_broker__update_slot_status.cpp
@@ -1,150 +1,150 @@
-#include "tenant_slot_broker_impl.h"
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-class TTenantSlotBroker::TTxUpdateSlotStatus : public TTransactionBase<TTenantSlotBroker> {
-public:
- TTxUpdateSlotStatus(TTenantSlotBroker *self, TEvTenantPool::TEvConfigureSlotResult::TPtr ev)
- : TBase(self)
- , Event(std::move(ev))
- , Modified(false)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
- auto nodeId = Event->Sender.NodeId();
- auto &rec = Event->Get()->Record;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdateSlotStatus for node "
- << nodeId << ": " << rec.ShortDebugString());
-
- auto slot = Self->GetSlot(nodeId, rec.GetSlotStatus().GetId());
- if (!slot) {
- LOG_WARN_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "update for unknown slot <"
- << nodeId << ", " << rec.GetSlotStatus().GetId() << ">");
- return true;
- }
-
- if (!slot->IsConnected) {
- LOG_WARN_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "update for disconnected slot "
- << slot->IdString());
- return true;
- }
-
- if (Event->Cookie != slot->LastRequestId) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "late response for "
- << slot->IdString(true) << " " << Event->Cookie << ":" << slot->LastRequestId);
- return true;
- }
- slot->LastRequestId = 0;
-
- if (rec.GetStatus() == NKikimrTenantPool::ERROR) {
- LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "configure error for "
- << slot->IdString(true) << ": " << rec.GetError());
-
- Modified = slot->AssignedTenant != nullptr;
- Self->RemoveSlot(slot, txc, ctx);
- return true;
- }
-
- if (rec.GetStatus() == NKikimrTenantPool::NOT_OWNER) {
- LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "cannot configure " << slot->IdString(true) << " because of lack of ownership");
-
- Self->DisconnectNodeSlots(nodeId, ctx);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Taking ownership of tenant pool on node " << nodeId);
-
+#include "tenant_slot_broker_impl.h"
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+class TTenantSlotBroker::TTxUpdateSlotStatus : public TTransactionBase<TTenantSlotBroker> {
+public:
+ TTxUpdateSlotStatus(TTenantSlotBroker *self, TEvTenantPool::TEvConfigureSlotResult::TPtr ev)
+ : TBase(self)
+ , Event(std::move(ev))
+ , Modified(false)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
+ auto nodeId = Event->Sender.NodeId();
+ auto &rec = Event->Get()->Record;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdateSlotStatus for node "
+ << nodeId << ": " << rec.ShortDebugString());
+
+ auto slot = Self->GetSlot(nodeId, rec.GetSlotStatus().GetId());
+ if (!slot) {
+ LOG_WARN_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "update for unknown slot <"
+ << nodeId << ", " << rec.GetSlotStatus().GetId() << ">");
+ return true;
+ }
+
+ if (!slot->IsConnected) {
+ LOG_WARN_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "update for disconnected slot "
+ << slot->IdString());
+ return true;
+ }
+
+ if (Event->Cookie != slot->LastRequestId) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "late response for "
+ << slot->IdString(true) << " " << Event->Cookie << ":" << slot->LastRequestId);
+ return true;
+ }
+ slot->LastRequestId = 0;
+
+ if (rec.GetStatus() == NKikimrTenantPool::ERROR) {
+ LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, "configure error for "
+ << slot->IdString(true) << ": " << rec.GetError());
+
+ Modified = slot->AssignedTenant != nullptr;
+ Self->RemoveSlot(slot, txc, ctx);
+ return true;
+ }
+
+ if (rec.GetStatus() == NKikimrTenantPool::NOT_OWNER) {
+ LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "cannot configure " << slot->IdString(true) << " because of lack of ownership");
+
+ Self->DisconnectNodeSlots(nodeId, ctx);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Taking ownership of tenant pool on node " << nodeId);
+
ctx.Send(MakeTenantPoolID(nodeId, Self->DomainId), new TEvTenantPool::TEvTakeOwnership(Self->Generation()));
- return true;
- }
-
- if (rec.GetStatus() == NKikimrTenantPool::UNKNOWN_SLOT) {
- LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, slot->IdString(true)
- << " is reported to be unknown");
-
- Modified = slot->AssignedTenant != nullptr;
- Self->RemoveSlot(slot, txc, ctx);
- return true;
- }
-
- if (rec.GetStatus() == NKikimrTenantPool::UNKNOWN_TENANT) {
- LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, slot->IdString(true)
- << " cannot be assigned to tenant: " << rec.GetError());
-
+ return true;
+ }
+
+ if (rec.GetStatus() == NKikimrTenantPool::UNKNOWN_SLOT) {
+ LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, slot->IdString(true)
+ << " is reported to be unknown");
+
+ Modified = slot->AssignedTenant != nullptr;
+ Self->RemoveSlot(slot, txc, ctx);
+ return true;
+ }
+
+ if (rec.GetStatus() == NKikimrTenantPool::UNKNOWN_TENANT) {
+ LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER, slot->IdString(true)
+ << " cannot be assigned to tenant: " << rec.GetError());
+
Modified = false; // prevent infinite loop (attach-detach-attach...)
if (slot->AssignedTenant) {
slot->AssignedTenant->GetAllocation(slot->UsedAs)->DecPending();
}
- Self->DetachSlotNoConfigure(slot, txc);
- return true;
- }
-
- if (rec.GetStatus() != NKikimrTenantPool::SUCCESS) {
- LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "Unknown status for " << slot->IdString(true) << ": "
- << NKikimrTenantPool::EStatus_Name(rec.GetStatus()) << " " << rec.GetError());
-
- Modified = slot->AssignedTenant != nullptr;
- Self->RemoveSlot(slot, txc, ctx);
- return true;
- }
-
- if (slot->AssignedTenant) {
- if (slot->AssignedTenant->Name != rec.GetSlotStatus().GetAssignedTenant()) {
- LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "configure result for " << slot->IdString(true) << " has wrong tenant");
-
- Self->SendConfigureSlot(slot, ctx);
- } else {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "confirmed resource assignment for " << slot->IdString(true));
-
- slot->AssignedTenant->GetAllocation(slot->UsedAs)->DecPending();
- }
- } else {
- if (rec.GetSlotStatus().GetAssignedTenant()) {
- LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- slot->IdString(true) << " has wrongly assigned tenant");
-
- Self->SendConfigureSlot(slot, ctx);
- } else if (slot->IsFree()) {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "confirmed free slot " << slot->IdString());
-
- Self->FreeSlots.Add(slot);
- Modified = true;
- } else {
- LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
- "confirmed detached slot " << slot->IdString());
- }
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
- LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdateSlotStatus Complete");
-
- if (Modified && Self->HasUnhappyTenant())
- Self->ScheduleTxAssignFreeSlots(ctx);
-
- Self->TxCompleted(this, ctx);
- }
-
-private:
- TEvTenantPool::TEvConfigureSlotResult::TPtr Event;
- bool Modified;
-};
-
-ITransaction *TTenantSlotBroker::CreateTxUpdateSlotStatus(TEvTenantPool::TEvConfigureSlotResult::TPtr &ev)
-{
- return new TTxUpdateSlotStatus(this, std::move(ev));
-}
-
-} // NTenantSlotBroker
-} // NKikimr
+ Self->DetachSlotNoConfigure(slot, txc);
+ return true;
+ }
+
+ if (rec.GetStatus() != NKikimrTenantPool::SUCCESS) {
+ LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "Unknown status for " << slot->IdString(true) << ": "
+ << NKikimrTenantPool::EStatus_Name(rec.GetStatus()) << " " << rec.GetError());
+
+ Modified = slot->AssignedTenant != nullptr;
+ Self->RemoveSlot(slot, txc, ctx);
+ return true;
+ }
+
+ if (slot->AssignedTenant) {
+ if (slot->AssignedTenant->Name != rec.GetSlotStatus().GetAssignedTenant()) {
+ LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "configure result for " << slot->IdString(true) << " has wrong tenant");
+
+ Self->SendConfigureSlot(slot, ctx);
+ } else {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "confirmed resource assignment for " << slot->IdString(true));
+
+ slot->AssignedTenant->GetAllocation(slot->UsedAs)->DecPending();
+ }
+ } else {
+ if (rec.GetSlotStatus().GetAssignedTenant()) {
+ LOG_ERROR_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ slot->IdString(true) << " has wrongly assigned tenant");
+
+ Self->SendConfigureSlot(slot, ctx);
+ } else if (slot->IsFree()) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "confirmed free slot " << slot->IdString());
+
+ Self->FreeSlots.Add(slot);
+ Modified = true;
+ } else {
+ LOG_DEBUG_S(ctx, NKikimrServices::TENANT_SLOT_BROKER,
+ "confirmed detached slot " << slot->IdString());
+ }
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
+ LOG_DEBUG(ctx, NKikimrServices::TENANT_SLOT_BROKER, "TTxUpdateSlotStatus Complete");
+
+ if (Modified && Self->HasUnhappyTenant())
+ Self->ScheduleTxAssignFreeSlots(ctx);
+
+ Self->TxCompleted(this, ctx);
+ }
+
+private:
+ TEvTenantPool::TEvConfigureSlotResult::TPtr Event;
+ bool Modified;
+};
+
+ITransaction *TTenantSlotBroker::CreateTxUpdateSlotStatus(TEvTenantPool::TEvConfigureSlotResult::TPtr &ev)
+{
+ return new TTxUpdateSlotStatus(this, std::move(ev));
+}
+
+} // NTenantSlotBroker
+} // NKikimr
diff --git a/ydb/core/mind/tenant_slot_broker_impl.h b/ydb/core/mind/tenant_slot_broker_impl.h
index cd837c9e8bb..b5e3b107ab5 100644
--- a/ydb/core/mind/tenant_slot_broker_impl.h
+++ b/ydb/core/mind/tenant_slot_broker_impl.h
@@ -1,8 +1,8 @@
-#pragma once
-
-#include "tenant_slot_broker.h"
-#include "tenant_slot_broker__scheme.h"
-
+#pragma once
+
+#include "tenant_slot_broker.h"
+#include "tenant_slot_broker__scheme.h"
+
#include <ydb/core/base/location.h>
#include <ydb/core/base/tablet_pipe.h>
#include <ydb/core/cms/console/console.h>
@@ -10,1174 +10,1174 @@
#include <ydb/core/mind/tenant_pool.h>
#include <ydb/core/protos/tenant_slot_broker.pb.h>
#include <ydb/core/tablet_flat/tablet_flat_executed.h>
-
+
#include <library/cpp/actors/core/hfunc.h>
#include <library/cpp/actors/core/interconnect.h>
-
+
#include <util/datetime/base.h>
#include <util/generic/map.h>
-#include <util/generic/set.h>
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-struct TSlotId {
- ui32 NodeId = 0;
- TString SlotId;
-
- TSlotId(ui32 nodeId = 0,
- const TString &slotId = "")
- : NodeId(nodeId)
- , SlotId(slotId)
- {
- }
-
- TSlotId(const NKikimrTenantSlotBroker::TSlotId &rec)
- {
- Load(rec);
- }
-
- void Load(const NKikimrTenantSlotBroker::TSlotId &rec)
- {
- NodeId = rec.GetNodeId();
- SlotId = rec.GetSlotId();
- }
-
- bool operator==(const TSlotId &other) const
- {
- return (NodeId == other.NodeId
- && SlotId == other.SlotId);
- }
-
- bool operator!=(const TSlotId &other) const
- {
- return !(*this == other);
- }
-
- bool operator<(const NKikimr::NTenantSlotBroker::TSlotId &rhs) const
- {
- if (NodeId == rhs.NodeId)
- return SlotId < rhs.SlotId;
- return NodeId < rhs.NodeId;
- }
-
- TString ToString() const
- {
- return TStringBuilder() << "[" << NodeId << ", " << SlotId << "]";
- }
-};
-
-struct TSlotDescription {
- TString DataCenter;
- bool ForceLocation = true;
- ui32 CollocationGroup = 0;
- bool ForceCollocation = false;
- TString SlotType;
-
- TSlotDescription() = default;
-
- TSlotDescription(const TString &type,
- const TString &dc,
- bool forceLocation = true,
- ui32 group = 0,
- bool forceCollocation = false)
- : DataCenter(dc)
- , ForceLocation(forceLocation)
- , CollocationGroup(group)
- , ForceCollocation(forceCollocation)
- , SlotType(type)
- {
- }
-
- TSlotDescription(const NKikimrTenantSlotBroker::TSlotAllocation &slot)
- {
- SlotType = slot.GetType();
+#include <util/generic/set.h>
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+struct TSlotId {
+ ui32 NodeId = 0;
+ TString SlotId;
+
+ TSlotId(ui32 nodeId = 0,
+ const TString &slotId = "")
+ : NodeId(nodeId)
+ , SlotId(slotId)
+ {
+ }
+
+ TSlotId(const NKikimrTenantSlotBroker::TSlotId &rec)
+ {
+ Load(rec);
+ }
+
+ void Load(const NKikimrTenantSlotBroker::TSlotId &rec)
+ {
+ NodeId = rec.GetNodeId();
+ SlotId = rec.GetSlotId();
+ }
+
+ bool operator==(const TSlotId &other) const
+ {
+ return (NodeId == other.NodeId
+ && SlotId == other.SlotId);
+ }
+
+ bool operator!=(const TSlotId &other) const
+ {
+ return !(*this == other);
+ }
+
+ bool operator<(const NKikimr::NTenantSlotBroker::TSlotId &rhs) const
+ {
+ if (NodeId == rhs.NodeId)
+ return SlotId < rhs.SlotId;
+ return NodeId < rhs.NodeId;
+ }
+
+ TString ToString() const
+ {
+ return TStringBuilder() << "[" << NodeId << ", " << SlotId << "]";
+ }
+};
+
+struct TSlotDescription {
+ TString DataCenter;
+ bool ForceLocation = true;
+ ui32 CollocationGroup = 0;
+ bool ForceCollocation = false;
+ TString SlotType;
+
+ TSlotDescription() = default;
+
+ TSlotDescription(const TString &type,
+ const TString &dc,
+ bool forceLocation = true,
+ ui32 group = 0,
+ bool forceCollocation = false)
+ : DataCenter(dc)
+ , ForceLocation(forceLocation)
+ , CollocationGroup(group)
+ , ForceCollocation(forceCollocation)
+ , SlotType(type)
+ {
+ }
+
+ TSlotDescription(const NKikimrTenantSlotBroker::TSlotAllocation &slot)
+ {
+ SlotType = slot.GetType();
DataCenter = slot.HasDataCenter() ? slot.GetDataCenter() : DataCenterToString(slot.GetDataCenterNum());
- ForceLocation = slot.GetForceLocation();
- CollocationGroup = slot.GetCollocationGroup();
- ForceCollocation = slot.GetForceCollocation();
- }
-
- TSlotDescription(const TSlotDescription &) = default;
- TSlotDescription(TSlotDescription &&) = default;
-
- TSlotDescription &operator=(const TSlotDescription &) = default;
- TSlotDescription &operator=(TSlotDescription &&) = default;
-
- bool operator==(const NKikimr::NTenantSlotBroker::TSlotDescription &rhs) const
- {
- return (DataCenter == rhs.DataCenter
- && CollocationGroup == rhs.CollocationGroup
- && ForceLocation == rhs.ForceLocation
- && ForceCollocation == rhs.ForceCollocation
- && SlotType == rhs.SlotType);
- }
-
- bool operator!=(const NKikimr::NTenantSlotBroker::TSlotDescription &rhs) const
- {
- return !(*this == rhs);
- }
-
- void Serialize(NKikimrTenantSlotBroker::TSlotAllocation &slot) const
- {
- slot.SetType(SlotType);
+ ForceLocation = slot.GetForceLocation();
+ CollocationGroup = slot.GetCollocationGroup();
+ ForceCollocation = slot.GetForceCollocation();
+ }
+
+ TSlotDescription(const TSlotDescription &) = default;
+ TSlotDescription(TSlotDescription &&) = default;
+
+ TSlotDescription &operator=(const TSlotDescription &) = default;
+ TSlotDescription &operator=(TSlotDescription &&) = default;
+
+ bool operator==(const NKikimr::NTenantSlotBroker::TSlotDescription &rhs) const
+ {
+ return (DataCenter == rhs.DataCenter
+ && CollocationGroup == rhs.CollocationGroup
+ && ForceLocation == rhs.ForceLocation
+ && ForceCollocation == rhs.ForceCollocation
+ && SlotType == rhs.SlotType);
+ }
+
+ bool operator!=(const NKikimr::NTenantSlotBroker::TSlotDescription &rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+ void Serialize(NKikimrTenantSlotBroker::TSlotAllocation &slot) const
+ {
+ slot.SetType(SlotType);
slot.SetDataCenterNum(DataCenterFromString(DataCenter));
slot.SetDataCenter(DataCenter);
- slot.SetForceLocation(ForceLocation);
- slot.SetCollocationGroup(CollocationGroup);
- slot.SetForceCollocation(ForceCollocation);
- }
-
- std::pair<TString, TString> CountersKey() const
- {
- return std::make_pair(SlotType, DataCenter);
- }
-
- TString ToString() const
- {
- TStringBuilder str;
- str << "[" << SlotType << ", " << DataCenter;
- if (!ForceLocation)
- str << "*";
- if (CollocationGroup)
- str << "(" << CollocationGroup
- << (ForceCollocation ? "" : "*") << ")";
- str << "]";
- return str;
- }
-};
-
-} // NTenantSlotBroker
-} // NKikimr
-
-template<>
-struct THash<NKikimr::NTenantSlotBroker::TSlotId> {
- inline size_t operator()(const NKikimr::NTenantSlotBroker::TSlotId &id) const {
- auto t = std::make_pair(id.NodeId, id.SlotId);
- return THash<decltype(t)>()(t);
- }
-};
-
-template<>
-struct THash<NKikimr::NTenantSlotBroker::TSlotDescription> {
- inline size_t operator()(const NKikimr::NTenantSlotBroker::TSlotDescription &descr) const {
- auto t = std::make_tuple(descr.DataCenter, descr.ForceLocation, descr.CollocationGroup,
- descr.ForceCollocation, descr.SlotType);
- return THash<decltype(t)>()(t);
- }
-};
-
-namespace NKikimr {
-namespace NTenantSlotBroker {
-
-using NConsole::TEvConsole;
-using NTabletFlatExecutor::TTabletExecutedFlat;
-using NTabletFlatExecutor::ITransaction;
-using NTabletFlatExecutor::TTransactionBase;
-using NTabletFlatExecutor::TTransactionContext;
-using NMonitoring::TDynamicCounterPtr;
-using NMonitoring::TDynamicCounters;
-
-class TTenantSlotBroker : public TActor<TTenantSlotBroker>, public TTabletExecutedFlat {
-private:
- using TActorBase = TActor<TTenantSlotBroker>;
-
- static const ui32 ConfigKey_Config;
-
- class TCounters : public TThrRefBase {
- public:
- using TPtr = TIntrusivePtr<TCounters>;
-
- private:
- enum ESlotKind {
- KIND_FREE = 0,
- KIND_ASSIGNED,
- KIND_PENDING,
- KIND_MISSING,
- KIND_REQUIRED,
- KIND_CONNECTED,
- KIND_DISCONNECTED,
- KIND_MISPLACED,
- KIND_SPLIT,
- KIND_BANNED,
- KIND_PINNED,
- KIND_COUNT
- };
-
- using TCountersMap = THashMap<std::pair<TString, TString>, TDynamicCounters::TCounterPtr>;
-
- const std::array<TString, KIND_COUNT> SlotSensorNames = {{
- { "FreeSlots" },
- { "AssignedSlots" },
- { "PendingSlots" },
- { "MissingSlots" },
- { "RequiredSlots" },
- { "ConnectedSlots" },
- { "DisconnectedSlots" },
- { "MisplacedSlots" },
- { "SplitSlots" },
- { "BannedSlots" },
- { "PinnedSlots" } }};
-
- std::array<TCountersMap, KIND_COUNT> SlotCounters;
-
- TDynamicCounters::TCounterPtr Slots(const std::pair<TString, TString> &key, ESlotKind kind)
- {
- auto &counters = SlotCounters[kind];
- auto it = counters.find(key);
- if (it != counters.end())
- return it->second;
-
- auto type = Counters->GetSubgroup("SlotType", key.first);
- auto dc = type->GetSubgroup("SlotDataCenter", key.second);
- auto counter = dc->GetCounter(SlotSensorNames[kind]);
-
- counters[key] = counter;
- return counter;
- }
-
- public:
- TDynamicCounterPtr Counters;
- TDynamicCounters::TCounterPtr KnownTenants;
- TDynamicCounters::TCounterPtr UnhappyTenants;
- TDynamicCounters::TCounterPtr MisplacedTenants;
- TDynamicCounters::TCounterPtr SplitTenants;
- TDynamicCounters::TCounterPtr ConnectedPools;
-
- TCounters(TDynamicCounterPtr counters)
- : Counters(counters)
- {
- KnownTenants = Counters->GetCounter("KnownTenants");
- UnhappyTenants = Counters->GetCounter("UnhappyTenants");
- MisplacedTenants = Counters->GetCounter("MisplacedTenants");
- SplitTenants = Counters->GetCounter("SplitTenants");
- ConnectedPools = Counters->GetCounter("ConnectedPools");
- }
-
- void Clear()
- {
- *KnownTenants = 0;
- *UnhappyTenants = 0;
- *MisplacedTenants = 0;
- *SplitTenants = 0;
- *ConnectedPools = 0;
- for (auto &slots : SlotCounters)
- for (auto &pr : slots)
- *pr.second = 0;
- }
-
- TDynamicCounterPtr AllCounters() { return Counters; }
-
- TDynamicCounters::TCounterPtr FreeSlots(const std::pair<TString, TString> &key)
- {
- return Slots(key, KIND_FREE);
- }
-
- TDynamicCounters::TCounterPtr FreeSlots(const TString &type, const TString &dc)
- {
- return Slots(std::make_pair(type, dc), KIND_FREE);
- }
-
- TDynamicCounters::TCounterPtr AssignedSlots(const std::pair<TString, TString> &key)
- {
- return Slots(key, KIND_ASSIGNED);
- }
-
- TDynamicCounters::TCounterPtr AssignedSlots(const TString &type, const TString &dc)
- {
- return Slots(std::make_pair(type, dc), KIND_ASSIGNED);
- }
-
- TDynamicCounters::TCounterPtr PendingSlots(const std::pair<TString, TString> &key)
- {
- return Slots(key, KIND_PENDING);
- }
-
- TDynamicCounters::TCounterPtr PendingSlots(const TString &type, const TString &dc)
- {
- return Slots(std::make_pair(type, dc), KIND_PENDING);
- }
-
- TDynamicCounters::TCounterPtr MissingSlots(const std::pair<TString, TString> &key)
- {
- return Slots(key, KIND_MISSING);
- }
-
- TDynamicCounters::TCounterPtr MissingSlots(const TString &type, const TString &dc)
- {
- return Slots(std::make_pair(type, dc), KIND_MISSING);
- }
-
- TDynamicCounters::TCounterPtr RequiredSlots(const std::pair<TString, TString> &key)
- {
- return Slots(key, KIND_REQUIRED);
- }
-
- TDynamicCounters::TCounterPtr RequiredSlots(const TString &type, const TString &dc)
- {
- return Slots(std::make_pair(type, dc), KIND_REQUIRED);
- }
-
- TDynamicCounters::TCounterPtr ConnectedSlots(const std::pair<TString, TString> &key)
- {
- return Slots(key, KIND_CONNECTED);
- }
-
- TDynamicCounters::TCounterPtr ConnectedSlots(const TString &type, const TString &dc)
- {
- return Slots(std::make_pair(type, dc), KIND_CONNECTED);
- }
-
- TDynamicCounters::TCounterPtr DisconnectedSlots(const std::pair<TString, TString> &key)
- {
- return Slots(key, KIND_DISCONNECTED);
- }
-
- TDynamicCounters::TCounterPtr DisconnectedSlots(const TString &type, const TString &dc)
- {
- return Slots(std::make_pair(type, dc), KIND_DISCONNECTED);
- }
-
- TDynamicCounters::TCounterPtr MisplacedSlots(const std::pair<TString, TString> &key)
- {
- return Slots(key, KIND_MISPLACED);
- }
-
- TDynamicCounters::TCounterPtr MisplacedSlots(const TString &type, const TString &dc)
- {
- return Slots(std::make_pair(type, dc), KIND_MISPLACED);
- }
-
- TDynamicCounters::TCounterPtr SplitSlots(const std::pair<TString, TString> &key)
- {
- return Slots(key, KIND_SPLIT);
- }
-
- TDynamicCounters::TCounterPtr SplitSlots(const TString &type, const TString &dc)
- {
- return Slots(std::make_pair(type, dc), KIND_SPLIT);
- }
-
- TDynamicCounters::TCounterPtr BannedSlots(const std::pair<TString, TString> &key)
- {
- return Slots(key, KIND_BANNED);
- }
-
- TDynamicCounters::TCounterPtr BannedSlots(const TString &type, const TString &dc)
- {
- return Slots(std::make_pair(type, dc), KIND_BANNED);
- }
-
- TDynamicCounters::TCounterPtr PinnedSlots(const std::pair<TString, TString> &key)
- {
- return Slots(key, KIND_PINNED);
- }
-
- TDynamicCounters::TCounterPtr PinnedSlots(const TString &type, const TString &dc)
- {
- return Slots(std::make_pair(type, dc), KIND_PINNED);
- }
-
- void FillSlotStats(NKikimrTenantSlotBroker::TSlotStats &stats)
- {
- // <Type, DataCenter> -> <Connected, Free>
- THashMap<std::pair<TString, TString>, std::pair<ui64, ui64>> counts;
- auto count = [&counts, this](const TString& name, const TString& value) {
- if (name != "SlotType")
- return;
- auto group = Counters->GetSubgroup(name, value);
- group->EnumerateSubgroups([&counts, this, type = value, group](const TString& name, const TString& value) {
- if (name != "SlotDataCenter")
- return;
- auto dcGroup = group->GetSubgroup(name, value);
- if (dcGroup) {
- auto connected = dcGroup->GetCounter(SlotSensorNames[KIND_CONNECTED])->Val();
- auto free = dcGroup->GetCounter(SlotSensorNames[KIND_FREE])->Val();
- if (connected)
- counts[std::make_pair(type, value)] = std::make_pair(connected, free);
- }
- });
- };
-
- // Fill counts map.
- Counters->EnumerateSubgroups(count);
-
- for (auto &pr : counts) {
- auto &rec = *stats.AddSlotCounters();
- rec.SetType(pr.first.first);
- rec.SetDataCenter(pr.first.second);
- rec.SetConnected(pr.second.first);
- rec.SetFree(pr.second.second);
- }
- }
- };
-
- struct TSlotsAllocation;
-
- struct TTenantStatistics : public TThrRefBase {
- using TPtr = TIntrusivePtr<TTenantStatistics>;
-
- TTenantStatistics(TCounters::TPtr counters)
- : TotalRequired(0)
- , TotalMissing(0)
- , TotalPending(0)
- , TotalMisplaced(0)
- , TotalSplit(0)
- , TotalPinned(0)
- , Counters(counters)
- {
- }
-
- void Clear()
- {
- Pending.clear();
- Missing.clear();
- Misplaced.clear();
- Split.clear();
- }
-
- ui64 TotalRequired;
- ui64 TotalMissing;
- ui64 TotalPending;
- ui64 TotalMisplaced;
- ui64 TotalSplit;
- ui64 TotalPinned;
- TCounters::TPtr Counters;
- THashSet<TIntrusivePtr<TSlotsAllocation>> Pending;
- THashSet<TIntrusivePtr<TSlotsAllocation>> Missing;
- THashSet<TIntrusivePtr<TSlotsAllocation>> Misplaced;
- THashSet<TIntrusivePtr<TSlotsAllocation>> Split;
- };
-
- class TTenant;
-
- struct TSlot : public TThrRefBase {
- using TPtr = TIntrusivePtr<TSlot>;
-
- TSlot(const TSlotId &id, const TString &type, const TString &dc)
- : Id(id)
- , Type(type)
- , DataCenter(dc)
- , IsConnected(false)
- , IsBanned(false)
- , IsPinned(false)
- , LastRequestId(0)
- {
- }
-
- TString IdString(bool full = false)
- {
- if (!full)
- return Id.ToString();
- TStringBuilder str;
- if (!AssignedTenant)
- str << "free ";
- str << "slot [" << Id.NodeId << ", " << Id.SlotId << ", " << Type << ", " << DataCenter << "]";
- if (IsBanned)
- str << " banned";
- if (AssignedTenant)
- str << (IsPinned ? " pinned to " : " used by ")
- << AssignedTenant->Name << " as " << Label;
- return str;
- }
-
- bool IsFree() const { return !AssignedTenant && !LastRequestId && !IsBanned && !IsPinned; }
- bool IsPending() const { return AssignedTenant && LastRequestId; }
-
- TSlotId Id;
- TString Type;
- TString DataCenter;
- TIntrusivePtr<TTenant> AssignedTenant;
- TSlotDescription UsedAs;
- bool IsConnected;
- bool IsBanned;
- bool IsPinned;
- // Non-zero value means resource is pending.
- ui64 LastRequestId;
- // Each assigned slot has a label used in monitoring.
- // Labels should be unique for slots of a single tenant.
- TString Label;
- };
-
- struct TPinnedSlotInfo {
- TString TenantName;
- TString Label;
+ slot.SetForceLocation(ForceLocation);
+ slot.SetCollocationGroup(CollocationGroup);
+ slot.SetForceCollocation(ForceCollocation);
+ }
+
+ std::pair<TString, TString> CountersKey() const
+ {
+ return std::make_pair(SlotType, DataCenter);
+ }
+
+ TString ToString() const
+ {
+ TStringBuilder str;
+ str << "[" << SlotType << ", " << DataCenter;
+ if (!ForceLocation)
+ str << "*";
+ if (CollocationGroup)
+ str << "(" << CollocationGroup
+ << (ForceCollocation ? "" : "*") << ")";
+ str << "]";
+ return str;
+ }
+};
+
+} // NTenantSlotBroker
+} // NKikimr
+
+template<>
+struct THash<NKikimr::NTenantSlotBroker::TSlotId> {
+ inline size_t operator()(const NKikimr::NTenantSlotBroker::TSlotId &id) const {
+ auto t = std::make_pair(id.NodeId, id.SlotId);
+ return THash<decltype(t)>()(t);
+ }
+};
+
+template<>
+struct THash<NKikimr::NTenantSlotBroker::TSlotDescription> {
+ inline size_t operator()(const NKikimr::NTenantSlotBroker::TSlotDescription &descr) const {
+ auto t = std::make_tuple(descr.DataCenter, descr.ForceLocation, descr.CollocationGroup,
+ descr.ForceCollocation, descr.SlotType);
+ return THash<decltype(t)>()(t);
+ }
+};
+
+namespace NKikimr {
+namespace NTenantSlotBroker {
+
+using NConsole::TEvConsole;
+using NTabletFlatExecutor::TTabletExecutedFlat;
+using NTabletFlatExecutor::ITransaction;
+using NTabletFlatExecutor::TTransactionBase;
+using NTabletFlatExecutor::TTransactionContext;
+using NMonitoring::TDynamicCounterPtr;
+using NMonitoring::TDynamicCounters;
+
+class TTenantSlotBroker : public TActor<TTenantSlotBroker>, public TTabletExecutedFlat {
+private:
+ using TActorBase = TActor<TTenantSlotBroker>;
+
+ static const ui32 ConfigKey_Config;
+
+ class TCounters : public TThrRefBase {
+ public:
+ using TPtr = TIntrusivePtr<TCounters>;
+
+ private:
+ enum ESlotKind {
+ KIND_FREE = 0,
+ KIND_ASSIGNED,
+ KIND_PENDING,
+ KIND_MISSING,
+ KIND_REQUIRED,
+ KIND_CONNECTED,
+ KIND_DISCONNECTED,
+ KIND_MISPLACED,
+ KIND_SPLIT,
+ KIND_BANNED,
+ KIND_PINNED,
+ KIND_COUNT
+ };
+
+ using TCountersMap = THashMap<std::pair<TString, TString>, TDynamicCounters::TCounterPtr>;
+
+ const std::array<TString, KIND_COUNT> SlotSensorNames = {{
+ { "FreeSlots" },
+ { "AssignedSlots" },
+ { "PendingSlots" },
+ { "MissingSlots" },
+ { "RequiredSlots" },
+ { "ConnectedSlots" },
+ { "DisconnectedSlots" },
+ { "MisplacedSlots" },
+ { "SplitSlots" },
+ { "BannedSlots" },
+ { "PinnedSlots" } }};
+
+ std::array<TCountersMap, KIND_COUNT> SlotCounters;
+
+ TDynamicCounters::TCounterPtr Slots(const std::pair<TString, TString> &key, ESlotKind kind)
+ {
+ auto &counters = SlotCounters[kind];
+ auto it = counters.find(key);
+ if (it != counters.end())
+ return it->second;
+
+ auto type = Counters->GetSubgroup("SlotType", key.first);
+ auto dc = type->GetSubgroup("SlotDataCenter", key.second);
+ auto counter = dc->GetCounter(SlotSensorNames[kind]);
+
+ counters[key] = counter;
+ return counter;
+ }
+
+ public:
+ TDynamicCounterPtr Counters;
+ TDynamicCounters::TCounterPtr KnownTenants;
+ TDynamicCounters::TCounterPtr UnhappyTenants;
+ TDynamicCounters::TCounterPtr MisplacedTenants;
+ TDynamicCounters::TCounterPtr SplitTenants;
+ TDynamicCounters::TCounterPtr ConnectedPools;
+
+ TCounters(TDynamicCounterPtr counters)
+ : Counters(counters)
+ {
+ KnownTenants = Counters->GetCounter("KnownTenants");
+ UnhappyTenants = Counters->GetCounter("UnhappyTenants");
+ MisplacedTenants = Counters->GetCounter("MisplacedTenants");
+ SplitTenants = Counters->GetCounter("SplitTenants");
+ ConnectedPools = Counters->GetCounter("ConnectedPools");
+ }
+
+ void Clear()
+ {
+ *KnownTenants = 0;
+ *UnhappyTenants = 0;
+ *MisplacedTenants = 0;
+ *SplitTenants = 0;
+ *ConnectedPools = 0;
+ for (auto &slots : SlotCounters)
+ for (auto &pr : slots)
+ *pr.second = 0;
+ }
+
+ TDynamicCounterPtr AllCounters() { return Counters; }
+
+ TDynamicCounters::TCounterPtr FreeSlots(const std::pair<TString, TString> &key)
+ {
+ return Slots(key, KIND_FREE);
+ }
+
+ TDynamicCounters::TCounterPtr FreeSlots(const TString &type, const TString &dc)
+ {
+ return Slots(std::make_pair(type, dc), KIND_FREE);
+ }
+
+ TDynamicCounters::TCounterPtr AssignedSlots(const std::pair<TString, TString> &key)
+ {
+ return Slots(key, KIND_ASSIGNED);
+ }
+
+ TDynamicCounters::TCounterPtr AssignedSlots(const TString &type, const TString &dc)
+ {
+ return Slots(std::make_pair(type, dc), KIND_ASSIGNED);
+ }
+
+ TDynamicCounters::TCounterPtr PendingSlots(const std::pair<TString, TString> &key)
+ {
+ return Slots(key, KIND_PENDING);
+ }
+
+ TDynamicCounters::TCounterPtr PendingSlots(const TString &type, const TString &dc)
+ {
+ return Slots(std::make_pair(type, dc), KIND_PENDING);
+ }
+
+ TDynamicCounters::TCounterPtr MissingSlots(const std::pair<TString, TString> &key)
+ {
+ return Slots(key, KIND_MISSING);
+ }
+
+ TDynamicCounters::TCounterPtr MissingSlots(const TString &type, const TString &dc)
+ {
+ return Slots(std::make_pair(type, dc), KIND_MISSING);
+ }
+
+ TDynamicCounters::TCounterPtr RequiredSlots(const std::pair<TString, TString> &key)
+ {
+ return Slots(key, KIND_REQUIRED);
+ }
+
+ TDynamicCounters::TCounterPtr RequiredSlots(const TString &type, const TString &dc)
+ {
+ return Slots(std::make_pair(type, dc), KIND_REQUIRED);
+ }
+
+ TDynamicCounters::TCounterPtr ConnectedSlots(const std::pair<TString, TString> &key)
+ {
+ return Slots(key, KIND_CONNECTED);
+ }
+
+ TDynamicCounters::TCounterPtr ConnectedSlots(const TString &type, const TString &dc)
+ {
+ return Slots(std::make_pair(type, dc), KIND_CONNECTED);
+ }
+
+ TDynamicCounters::TCounterPtr DisconnectedSlots(const std::pair<TString, TString> &key)
+ {
+ return Slots(key, KIND_DISCONNECTED);
+ }
+
+ TDynamicCounters::TCounterPtr DisconnectedSlots(const TString &type, const TString &dc)
+ {
+ return Slots(std::make_pair(type, dc), KIND_DISCONNECTED);
+ }
+
+ TDynamicCounters::TCounterPtr MisplacedSlots(const std::pair<TString, TString> &key)
+ {
+ return Slots(key, KIND_MISPLACED);
+ }
+
+ TDynamicCounters::TCounterPtr MisplacedSlots(const TString &type, const TString &dc)
+ {
+ return Slots(std::make_pair(type, dc), KIND_MISPLACED);
+ }
+
+ TDynamicCounters::TCounterPtr SplitSlots(const std::pair<TString, TString> &key)
+ {
+ return Slots(key, KIND_SPLIT);
+ }
+
+ TDynamicCounters::TCounterPtr SplitSlots(const TString &type, const TString &dc)
+ {
+ return Slots(std::make_pair(type, dc), KIND_SPLIT);
+ }
+
+ TDynamicCounters::TCounterPtr BannedSlots(const std::pair<TString, TString> &key)
+ {
+ return Slots(key, KIND_BANNED);
+ }
+
+ TDynamicCounters::TCounterPtr BannedSlots(const TString &type, const TString &dc)
+ {
+ return Slots(std::make_pair(type, dc), KIND_BANNED);
+ }
+
+ TDynamicCounters::TCounterPtr PinnedSlots(const std::pair<TString, TString> &key)
+ {
+ return Slots(key, KIND_PINNED);
+ }
+
+ TDynamicCounters::TCounterPtr PinnedSlots(const TString &type, const TString &dc)
+ {
+ return Slots(std::make_pair(type, dc), KIND_PINNED);
+ }
+
+ void FillSlotStats(NKikimrTenantSlotBroker::TSlotStats &stats)
+ {
+ // <Type, DataCenter> -> <Connected, Free>
+ THashMap<std::pair<TString, TString>, std::pair<ui64, ui64>> counts;
+ auto count = [&counts, this](const TString& name, const TString& value) {
+ if (name != "SlotType")
+ return;
+ auto group = Counters->GetSubgroup(name, value);
+ group->EnumerateSubgroups([&counts, this, type = value, group](const TString& name, const TString& value) {
+ if (name != "SlotDataCenter")
+ return;
+ auto dcGroup = group->GetSubgroup(name, value);
+ if (dcGroup) {
+ auto connected = dcGroup->GetCounter(SlotSensorNames[KIND_CONNECTED])->Val();
+ auto free = dcGroup->GetCounter(SlotSensorNames[KIND_FREE])->Val();
+ if (connected)
+ counts[std::make_pair(type, value)] = std::make_pair(connected, free);
+ }
+ });
+ };
+
+ // Fill counts map.
+ Counters->EnumerateSubgroups(count);
+
+ for (auto &pr : counts) {
+ auto &rec = *stats.AddSlotCounters();
+ rec.SetType(pr.first.first);
+ rec.SetDataCenter(pr.first.second);
+ rec.SetConnected(pr.second.first);
+ rec.SetFree(pr.second.second);
+ }
+ }
+ };
+
+ struct TSlotsAllocation;
+
+ struct TTenantStatistics : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TTenantStatistics>;
+
+ TTenantStatistics(TCounters::TPtr counters)
+ : TotalRequired(0)
+ , TotalMissing(0)
+ , TotalPending(0)
+ , TotalMisplaced(0)
+ , TotalSplit(0)
+ , TotalPinned(0)
+ , Counters(counters)
+ {
+ }
+
+ void Clear()
+ {
+ Pending.clear();
+ Missing.clear();
+ Misplaced.clear();
+ Split.clear();
+ }
+
+ ui64 TotalRequired;
+ ui64 TotalMissing;
+ ui64 TotalPending;
+ ui64 TotalMisplaced;
+ ui64 TotalSplit;
+ ui64 TotalPinned;
+ TCounters::TPtr Counters;
+ THashSet<TIntrusivePtr<TSlotsAllocation>> Pending;
+ THashSet<TIntrusivePtr<TSlotsAllocation>> Missing;
+ THashSet<TIntrusivePtr<TSlotsAllocation>> Misplaced;
+ THashSet<TIntrusivePtr<TSlotsAllocation>> Split;
+ };
+
+ class TTenant;
+
+ struct TSlot : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TSlot>;
+
+ TSlot(const TSlotId &id, const TString &type, const TString &dc)
+ : Id(id)
+ , Type(type)
+ , DataCenter(dc)
+ , IsConnected(false)
+ , IsBanned(false)
+ , IsPinned(false)
+ , LastRequestId(0)
+ {
+ }
+
+ TString IdString(bool full = false)
+ {
+ if (!full)
+ return Id.ToString();
+ TStringBuilder str;
+ if (!AssignedTenant)
+ str << "free ";
+ str << "slot [" << Id.NodeId << ", " << Id.SlotId << ", " << Type << ", " << DataCenter << "]";
+ if (IsBanned)
+ str << " banned";
+ if (AssignedTenant)
+ str << (IsPinned ? " pinned to " : " used by ")
+ << AssignedTenant->Name << " as " << Label;
+ return str;
+ }
+
+ bool IsFree() const { return !AssignedTenant && !LastRequestId && !IsBanned && !IsPinned; }
+ bool IsPending() const { return AssignedTenant && LastRequestId; }
+
+ TSlotId Id;
+ TString Type;
+ TString DataCenter;
+ TIntrusivePtr<TTenant> AssignedTenant;
+ TSlotDescription UsedAs;
+ bool IsConnected;
+ bool IsBanned;
+ bool IsPinned;
+ // Non-zero value means resource is pending.
+ ui64 LastRequestId;
+ // Each assigned slot has a label used in monitoring.
+ // Labels should be unique for slots of a single tenant.
+ TString Label;
+ };
+
+ struct TPinnedSlotInfo {
+ TString TenantName;
+ TString Label;
TInstant Deadline;
- };
-
+ };
+
struct TEnqueuedUnpin {
TSlotId SlotId;
bool Scheduled;
};
- using TSlotSet = THashSet<TSlot::TPtr, TPtrHash>;
-
- class TCollocationGroup : public TThrRefBase {
- public:
- using TPtr = TIntrusivePtr<TCollocationGroup>;
-
- TCollocationGroup(ui32 id)
- : Id(id)
- {
- }
-
- const TString &GetPreferredDataCenter() const { return PreferredDataCenter; }
- void SetPreferredDataCenter(const TString &dc);
-
- const ui32 Id;
- THashSet<TIntrusivePtr<TSlotsAllocation>> Allocations;
-
- private:
- TString PreferredDataCenter;
- };
-
- struct TSlotsAllocation : public TThrRefBase {
- using TPtr = TIntrusivePtr<TSlotsAllocation>;
-
- TSlotDescription Description;
- TCollocationGroup::TPtr Group;
- TSlotSet AssignedSlots;
- ui64 RequiredCount;
- ui64 MissingCount;
- ui64 PendingCount;
- ui64 MisplacedCount;
- ui64 SplitCount;
- ui64 PinnedCount;
- TTenantStatistics::TPtr Stats;
-
- TSlotsAllocation(const TSlotDescription &descr,
- TTenantStatistics::TPtr stats)
- : Description(descr)
- , RequiredCount(0)
- , MissingCount(0)
- , PendingCount(0)
- , MisplacedCount(0)
- , SplitCount(0)
- , PinnedCount(0)
- , Stats(stats)
- {
-
- }
-
- void AddAssignedSlot(TSlot::TPtr slot)
- {
+ using TSlotSet = THashSet<TSlot::TPtr, TPtrHash>;
+
+ class TCollocationGroup : public TThrRefBase {
+ public:
+ using TPtr = TIntrusivePtr<TCollocationGroup>;
+
+ TCollocationGroup(ui32 id)
+ : Id(id)
+ {
+ }
+
+ const TString &GetPreferredDataCenter() const { return PreferredDataCenter; }
+ void SetPreferredDataCenter(const TString &dc);
+
+ const ui32 Id;
+ THashSet<TIntrusivePtr<TSlotsAllocation>> Allocations;
+
+ private:
+ TString PreferredDataCenter;
+ };
+
+ struct TSlotsAllocation : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TSlotsAllocation>;
+
+ TSlotDescription Description;
+ TCollocationGroup::TPtr Group;
+ TSlotSet AssignedSlots;
+ ui64 RequiredCount;
+ ui64 MissingCount;
+ ui64 PendingCount;
+ ui64 MisplacedCount;
+ ui64 SplitCount;
+ ui64 PinnedCount;
+ TTenantStatistics::TPtr Stats;
+
+ TSlotsAllocation(const TSlotDescription &descr,
+ TTenantStatistics::TPtr stats)
+ : Description(descr)
+ , RequiredCount(0)
+ , MissingCount(0)
+ , PendingCount(0)
+ , MisplacedCount(0)
+ , SplitCount(0)
+ , PinnedCount(0)
+ , Stats(stats)
+ {
+
+ }
+
+ void AddAssignedSlot(TSlot::TPtr slot)
+ {
Y_VERIFY(!AssignedSlots.contains(slot));
- AssignedSlots.insert(slot);
- }
-
- void RemoveAssignedSlot(TSlot::TPtr slot)
- {
+ AssignedSlots.insert(slot);
+ }
+
+ void RemoveAssignedSlot(TSlot::TPtr slot)
+ {
Y_VERIFY(AssignedSlots.contains(slot));
- AssignedSlots.erase(slot);
- }
-
- void SetPending(ui64 count)
- {
- ui64 diff = count - PendingCount;
- PendingCount = count;
- Stats->TotalPending += diff;
- Stats->Counters->PendingSlots(Description.CountersKey())->Add(diff);
-
- if (count)
- Stats->Pending.insert(this);
- else
- Stats->Pending.erase(this);
- }
-
- void IncPending()
- {
- SetPending(PendingCount + 1);
- }
-
- void DecPending()
- {
+ AssignedSlots.erase(slot);
+ }
+
+ void SetPending(ui64 count)
+ {
+ ui64 diff = count - PendingCount;
+ PendingCount = count;
+ Stats->TotalPending += diff;
+ Stats->Counters->PendingSlots(Description.CountersKey())->Add(diff);
+
+ if (count)
+ Stats->Pending.insert(this);
+ else
+ Stats->Pending.erase(this);
+ }
+
+ void IncPending()
+ {
+ SetPending(PendingCount + 1);
+ }
+
+ void DecPending()
+ {
Y_VERIFY(PendingCount, "Dec zero pending for %s", Description.ToString().data());
- SetPending(PendingCount - 1);
- }
-
- void SetMissing(ui64 count)
- {
- ui64 diff = count - MissingCount;
- MissingCount = count;
- Stats->TotalMissing += diff;
- Stats->Counters->MissingSlots(Description.CountersKey())->Add(diff);
-
- if (count) {
- // Insertion of existing element to THashSet
- // can invalidate iterators and it might break
- // free slots allocation which iterates through
- // the Missing set.
- if (!Stats->Missing.contains(this))
- Stats->Missing.insert(this);
- } else
- Stats->Missing.erase(this);
- }
-
- void IncMissing(ui64 d = 1)
- {
- SetMissing(MissingCount + d);
- }
-
- void DecMissing()
- {
+ SetPending(PendingCount - 1);
+ }
+
+ void SetMissing(ui64 count)
+ {
+ ui64 diff = count - MissingCount;
+ MissingCount = count;
+ Stats->TotalMissing += diff;
+ Stats->Counters->MissingSlots(Description.CountersKey())->Add(diff);
+
+ if (count) {
+ // Insertion of existing element to THashSet
+ // can invalidate iterators and it might break
+ // free slots allocation which iterates through
+ // the Missing set.
+ if (!Stats->Missing.contains(this))
+ Stats->Missing.insert(this);
+ } else
+ Stats->Missing.erase(this);
+ }
+
+ void IncMissing(ui64 d = 1)
+ {
+ SetMissing(MissingCount + d);
+ }
+
+ void DecMissing()
+ {
Y_VERIFY(MissingCount, "Dec zero missing for %s", Description.ToString().data());
- SetMissing(MissingCount - 1);
- }
-
- void SetMisplaced(ui64 count)
- {
- ui64 diff = count - MisplacedCount;
- MisplacedCount = count;
- Stats->TotalMisplaced += diff;
- Stats->Counters->MisplacedSlots(Description.CountersKey())->Add(diff);
-
- if (count)
- Stats->Misplaced.insert(this);
- else
- Stats->Misplaced.erase(this);
- }
-
- void IncMisplaced()
- {
- SetMisplaced(MisplacedCount + 1);
- }
-
- void DecMisplaced()
- {
+ SetMissing(MissingCount - 1);
+ }
+
+ void SetMisplaced(ui64 count)
+ {
+ ui64 diff = count - MisplacedCount;
+ MisplacedCount = count;
+ Stats->TotalMisplaced += diff;
+ Stats->Counters->MisplacedSlots(Description.CountersKey())->Add(diff);
+
+ if (count)
+ Stats->Misplaced.insert(this);
+ else
+ Stats->Misplaced.erase(this);
+ }
+
+ void IncMisplaced()
+ {
+ SetMisplaced(MisplacedCount + 1);
+ }
+
+ void DecMisplaced()
+ {
Y_VERIFY(MisplacedCount, "Dec zero misplaced for %s", Description.ToString().data());
- SetMisplaced(MisplacedCount - 1);
- }
-
- void SetSplit(ui64 count)
- {
- ui64 diff = count - SplitCount;
- SplitCount = count;
- Stats->TotalSplit += diff;
- Stats->Counters->SplitSlots(Description.CountersKey())->Add(diff);
-
- if (count)
- Stats->Split.insert(this);
- else
- Stats->Split.erase(this);
- }
-
- void IncSplit()
- {
- SetSplit(SplitCount + 1);
- }
-
- void DecSplit()
- {
+ SetMisplaced(MisplacedCount - 1);
+ }
+
+ void SetSplit(ui64 count)
+ {
+ ui64 diff = count - SplitCount;
+ SplitCount = count;
+ Stats->TotalSplit += diff;
+ Stats->Counters->SplitSlots(Description.CountersKey())->Add(diff);
+
+ if (count)
+ Stats->Split.insert(this);
+ else
+ Stats->Split.erase(this);
+ }
+
+ void IncSplit()
+ {
+ SetSplit(SplitCount + 1);
+ }
+
+ void DecSplit()
+ {
Y_VERIFY(SplitCount, "Dec zero split for %s", Description.ToString().data());
- SetSplit(SplitCount - 1);
- }
-
- void SetPinned(ui64 count)
- {
- ui64 diff = count - PinnedCount;
- PinnedCount = count;
- Stats->TotalPinned += diff;
- }
-
- void IncPinned()
- {
- SetPinned(PinnedCount + 1);
- }
-
- void DecPinned()
- {
+ SetSplit(SplitCount - 1);
+ }
+
+ void SetPinned(ui64 count)
+ {
+ ui64 diff = count - PinnedCount;
+ PinnedCount = count;
+ Stats->TotalPinned += diff;
+ }
+
+ void IncPinned()
+ {
+ SetPinned(PinnedCount + 1);
+ }
+
+ void DecPinned()
+ {
Y_VERIFY(PinnedCount, "Dec zero pinned for %s", Description.ToString().data());
- SetPinned(PinnedCount - 1);
- }
-
- void SetRequired(ui64 count)
- {
- ui64 diff = count - RequiredCount;
- RequiredCount = count;
- Stats->TotalRequired += diff;
- Stats->Counters->RequiredSlots(Description.CountersKey())->Add(diff);
- }
-
- bool IsSlotOk(const TString &type,
- const TString &dc,
- bool strictMatch = true) const;
-
- void RecomputeSplitCount();
- };
-
- struct TLayout : public TThrRefBase {
- using TPtr = TIntrusivePtr<TLayout>;
-
- TString ToString() const
- {
- return TStringBuilder() << "m(" << MissingCount
- << ") mp(" << MisplacedCount
- << ") s(" << SplitCount
- << ") d(" << DetachCount << ")";
- }
-
- THashMap<TSlotsAllocation::TPtr, TSlotSet> AssignedSlots;
- ui64 MissingCount = 0;
- ui64 MisplacedCount = 0;
- ui64 SplitCount = 0;
- ui64 DetachCount = 0;
- };
-
- class TTenant : public TThrRefBase{
- public:
- using TPtr = TIntrusivePtr<TTenant>;
-
- TTenant(const TString &name, TCounters::TPtr counters)
- : Name(name)
- , Counters(counters)
- , Stats(new TTenantStatistics(counters))
- {
- }
-
- ~TTenant()
- {
- for (auto &pr : Groups)
- pr.second->Allocations.clear();
- Stats->Clear();
- }
-
- const THashMap<TSlotDescription, TSlotsAllocation::TPtr> &GetAllocations() const
- {
- return Allocations;
- }
-
- TSlotsAllocation::TPtr GetAllocation(const TSlotDescription &key) const
- {
- auto it = Allocations.find(key);
- if (it == Allocations.end())
- return nullptr;
- return it->second;
- }
-
- ui64 GetRequired(const TSlotDescription &key) const
- {
- auto it = Allocations.find(key);
- if (it == Allocations.end())
- return 0;
- return it->second->RequiredCount;
- }
-
- const THashSet<TSlotsAllocation::TPtr> &GetMissing() const
- {
- return Stats->Missing;
- }
-
- const THashSet<TSlotsAllocation::TPtr> &GetMisplaced() const
- {
- return Stats->Misplaced;
- }
-
- const THashSet<TSlotsAllocation::TPtr> &GetSplit() const
- {
- return Stats->Split;
- }
-
- void AddSlotsAllocation(const TSlotDescription &descr,
- ui64 count);
- void ClearEmptyAllocations();
- TCollocationGroup::TPtr GetOrCreateCollocationGroup(ui32 group);
- void DetermineDataCenterForCollocationGroups();
-
- TString SlotLabelByNo(ui64 no) const;
- void AddSlotLabels(ui64 count,
- TTransactionContext &txc);
- void RemoveSlotLabels(ui64 count,
- TTransactionContext &txc);
- void MarkSlotLabelAsUsed(const TString &label);
- void MarkSlotLabelAsUnused(const TString &label);
- TString GetFirstUnusedSlotLabel() const;
- void AddUnusedSlotLabel(const TString &label);
-
- // Get label for new pinned slot.
- TString MakePinnedSlotLabel();
- void AddPinnedSlotLabel(const TString &label);
- void RemovePinnedSlotLabel(const TString &label);
-
- void AddPinnedSlot(TSlot::TPtr slot);
- void RemovePinnedSlot(TSlot::TPtr slot);
-
- ui64 GetTotalMissing() const { return Stats->TotalMissing; }
- ui64 GetTotalMisplaced() const { return Stats->TotalMisplaced; }
- ui64 GetTotalPending() const { return Stats->TotalPending; }
- ui64 GetTotalRequired() const { return Stats->TotalRequired; }
- ui64 GetTotalSplit() const { return Stats->TotalSplit; }
-
- bool CanBeRemoved() const;
-
- void DbUpdateAllocation(const TSlotDescription &key,
- TTransactionContext &txc);
-
- const TString Name;
-
- private:
- TSlotsAllocation::TPtr GetOrCreateAllocation(const TSlotDescription &descr);
-
- static const TSlotDescription PinnedSlotDescription;
-
- // <Type,DataCenter> -> count
- THashMap<TSlotDescription, TSlotsAllocation::TPtr> Allocations;
- THashMap<ui32, TCollocationGroup::TPtr> Groups;
- TCounters::TPtr Counters;
- TTenantStatistics::TPtr Stats;
- TSet<TString> UsedSlotLabels;
- TSet<TString> UnusedSlotLabels;
- THashSet<TString> PinnedSlotLabels;
- };
-
- struct TTenantLessHappy {
- bool operator()(const TTenant::TPtr &lhs, const TTenant::TPtr &rhs) const
- {
- auto ratio1 = lhs->GetTotalRequired() * rhs->GetTotalMissing();
- auto ratio2 = lhs->GetTotalMissing() * rhs->GetTotalRequired();
- if (ratio1 != ratio2)
- return ratio1 < ratio2;
- return lhs.Get() < rhs.Get();
- }
- };
-
- struct TTenantMoreMisplaced {
- bool operator()(const TTenant::TPtr &lhs, const TTenant::TPtr &rhs) const
- {
- auto ratio1 = lhs->GetTotalRequired() * rhs->GetTotalMisplaced();
- auto ratio2 = lhs->GetTotalMisplaced() * rhs->GetTotalRequired();
- if (ratio1 != ratio2)
- return ratio1 < ratio2;
- return lhs.Get() < rhs.Get();
- }
- };
-
- struct TTenantMoreSplit {
- bool operator()(const TTenant::TPtr &lhs, const TTenant::TPtr &rhs) const
- {
- auto ratio1 = lhs->GetTotalRequired() * rhs->GetTotalSplit();
- auto ratio2 = lhs->GetTotalSplit() * rhs->GetTotalRequired();
- if (ratio1 != ratio2)
- return ratio1 < ratio2;
- return lhs.Get() < rhs.Get();
- }
- };
-
- struct TFreeSlotsIndex {
- void Add(TSlot::TPtr slot);
- void Remove(TSlot::TPtr slot);
-
- TSlot::TPtr Find();
- TSlot::TPtr FindByType(const TString &type);
- TSlot::TPtr FindByDC(const TString &dataCenter);
- TSlot::TPtr Find(const TString &type, const TString &dataCenter);
-
- bool Empty() const
- {
- return FreeSlotsByType.empty();
- }
-
- // Type -> {DataCenter -> {Slots}}
- THashMap<TString, THashMap<TString, TSlotSet>> FreeSlotsByType;
- // DataCenter -> {Type -> {Slots}}
- THashMap<TString, THashMap<TString, TSlotSet>> FreeSlotsByDataCenter;
- };
-
-public:
- struct TEvPrivate {
- enum EEv {
- EvCheckSlotStatus = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
- EvCheckAllSlotsStatus,
-
- EvEnd
- };
-
- static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
-
- struct TEvCheckSlotStatus : public TEventLocal<TEvCheckSlotStatus, EvCheckSlotStatus> {
- TEvCheckSlotStatus(TSlot::TPtr slot, ui64 requestId)
- : Slot(slot)
- , RequestId(requestId)
- {
- }
-
- TSlot::TPtr Slot;
- ui64 RequestId;
- };
-
- struct TEvCheckAllSlotsStatus : public TEventLocal<TEvCheckAllSlotsStatus, EvCheckAllSlotsStatus> {
- TEvCheckAllSlotsStatus(ui64 requestId)
- : RequestId(requestId)
- {
- }
-
- ui64 RequestId;
- };
-
- };
-
-private:
- class TTxAlterTenant;
- class TTxAssignFreeSlots;
- class TTxBanSlot;
- class TTxCheckSlotStatus;
- class TTxInitScheme;
- class TTxLoadState;
- class TTxPinSlot;
- class TTxUnbanSlot;
+ SetPinned(PinnedCount - 1);
+ }
+
+ void SetRequired(ui64 count)
+ {
+ ui64 diff = count - RequiredCount;
+ RequiredCount = count;
+ Stats->TotalRequired += diff;
+ Stats->Counters->RequiredSlots(Description.CountersKey())->Add(diff);
+ }
+
+ bool IsSlotOk(const TString &type,
+ const TString &dc,
+ bool strictMatch = true) const;
+
+ void RecomputeSplitCount();
+ };
+
+ struct TLayout : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TLayout>;
+
+ TString ToString() const
+ {
+ return TStringBuilder() << "m(" << MissingCount
+ << ") mp(" << MisplacedCount
+ << ") s(" << SplitCount
+ << ") d(" << DetachCount << ")";
+ }
+
+ THashMap<TSlotsAllocation::TPtr, TSlotSet> AssignedSlots;
+ ui64 MissingCount = 0;
+ ui64 MisplacedCount = 0;
+ ui64 SplitCount = 0;
+ ui64 DetachCount = 0;
+ };
+
+ class TTenant : public TThrRefBase{
+ public:
+ using TPtr = TIntrusivePtr<TTenant>;
+
+ TTenant(const TString &name, TCounters::TPtr counters)
+ : Name(name)
+ , Counters(counters)
+ , Stats(new TTenantStatistics(counters))
+ {
+ }
+
+ ~TTenant()
+ {
+ for (auto &pr : Groups)
+ pr.second->Allocations.clear();
+ Stats->Clear();
+ }
+
+ const THashMap<TSlotDescription, TSlotsAllocation::TPtr> &GetAllocations() const
+ {
+ return Allocations;
+ }
+
+ TSlotsAllocation::TPtr GetAllocation(const TSlotDescription &key) const
+ {
+ auto it = Allocations.find(key);
+ if (it == Allocations.end())
+ return nullptr;
+ return it->second;
+ }
+
+ ui64 GetRequired(const TSlotDescription &key) const
+ {
+ auto it = Allocations.find(key);
+ if (it == Allocations.end())
+ return 0;
+ return it->second->RequiredCount;
+ }
+
+ const THashSet<TSlotsAllocation::TPtr> &GetMissing() const
+ {
+ return Stats->Missing;
+ }
+
+ const THashSet<TSlotsAllocation::TPtr> &GetMisplaced() const
+ {
+ return Stats->Misplaced;
+ }
+
+ const THashSet<TSlotsAllocation::TPtr> &GetSplit() const
+ {
+ return Stats->Split;
+ }
+
+ void AddSlotsAllocation(const TSlotDescription &descr,
+ ui64 count);
+ void ClearEmptyAllocations();
+ TCollocationGroup::TPtr GetOrCreateCollocationGroup(ui32 group);
+ void DetermineDataCenterForCollocationGroups();
+
+ TString SlotLabelByNo(ui64 no) const;
+ void AddSlotLabels(ui64 count,
+ TTransactionContext &txc);
+ void RemoveSlotLabels(ui64 count,
+ TTransactionContext &txc);
+ void MarkSlotLabelAsUsed(const TString &label);
+ void MarkSlotLabelAsUnused(const TString &label);
+ TString GetFirstUnusedSlotLabel() const;
+ void AddUnusedSlotLabel(const TString &label);
+
+ // Get label for new pinned slot.
+ TString MakePinnedSlotLabel();
+ void AddPinnedSlotLabel(const TString &label);
+ void RemovePinnedSlotLabel(const TString &label);
+
+ void AddPinnedSlot(TSlot::TPtr slot);
+ void RemovePinnedSlot(TSlot::TPtr slot);
+
+ ui64 GetTotalMissing() const { return Stats->TotalMissing; }
+ ui64 GetTotalMisplaced() const { return Stats->TotalMisplaced; }
+ ui64 GetTotalPending() const { return Stats->TotalPending; }
+ ui64 GetTotalRequired() const { return Stats->TotalRequired; }
+ ui64 GetTotalSplit() const { return Stats->TotalSplit; }
+
+ bool CanBeRemoved() const;
+
+ void DbUpdateAllocation(const TSlotDescription &key,
+ TTransactionContext &txc);
+
+ const TString Name;
+
+ private:
+ TSlotsAllocation::TPtr GetOrCreateAllocation(const TSlotDescription &descr);
+
+ static const TSlotDescription PinnedSlotDescription;
+
+ // <Type,DataCenter> -> count
+ THashMap<TSlotDescription, TSlotsAllocation::TPtr> Allocations;
+ THashMap<ui32, TCollocationGroup::TPtr> Groups;
+ TCounters::TPtr Counters;
+ TTenantStatistics::TPtr Stats;
+ TSet<TString> UsedSlotLabels;
+ TSet<TString> UnusedSlotLabels;
+ THashSet<TString> PinnedSlotLabels;
+ };
+
+ struct TTenantLessHappy {
+ bool operator()(const TTenant::TPtr &lhs, const TTenant::TPtr &rhs) const
+ {
+ auto ratio1 = lhs->GetTotalRequired() * rhs->GetTotalMissing();
+ auto ratio2 = lhs->GetTotalMissing() * rhs->GetTotalRequired();
+ if (ratio1 != ratio2)
+ return ratio1 < ratio2;
+ return lhs.Get() < rhs.Get();
+ }
+ };
+
+ struct TTenantMoreMisplaced {
+ bool operator()(const TTenant::TPtr &lhs, const TTenant::TPtr &rhs) const
+ {
+ auto ratio1 = lhs->GetTotalRequired() * rhs->GetTotalMisplaced();
+ auto ratio2 = lhs->GetTotalMisplaced() * rhs->GetTotalRequired();
+ if (ratio1 != ratio2)
+ return ratio1 < ratio2;
+ return lhs.Get() < rhs.Get();
+ }
+ };
+
+ struct TTenantMoreSplit {
+ bool operator()(const TTenant::TPtr &lhs, const TTenant::TPtr &rhs) const
+ {
+ auto ratio1 = lhs->GetTotalRequired() * rhs->GetTotalSplit();
+ auto ratio2 = lhs->GetTotalSplit() * rhs->GetTotalRequired();
+ if (ratio1 != ratio2)
+ return ratio1 < ratio2;
+ return lhs.Get() < rhs.Get();
+ }
+ };
+
+ struct TFreeSlotsIndex {
+ void Add(TSlot::TPtr slot);
+ void Remove(TSlot::TPtr slot);
+
+ TSlot::TPtr Find();
+ TSlot::TPtr FindByType(const TString &type);
+ TSlot::TPtr FindByDC(const TString &dataCenter);
+ TSlot::TPtr Find(const TString &type, const TString &dataCenter);
+
+ bool Empty() const
+ {
+ return FreeSlotsByType.empty();
+ }
+
+ // Type -> {DataCenter -> {Slots}}
+ THashMap<TString, THashMap<TString, TSlotSet>> FreeSlotsByType;
+ // DataCenter -> {Type -> {Slots}}
+ THashMap<TString, THashMap<TString, TSlotSet>> FreeSlotsByDataCenter;
+ };
+
+public:
+ struct TEvPrivate {
+ enum EEv {
+ EvCheckSlotStatus = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
+ EvCheckAllSlotsStatus,
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)");
+
+ struct TEvCheckSlotStatus : public TEventLocal<TEvCheckSlotStatus, EvCheckSlotStatus> {
+ TEvCheckSlotStatus(TSlot::TPtr slot, ui64 requestId)
+ : Slot(slot)
+ , RequestId(requestId)
+ {
+ }
+
+ TSlot::TPtr Slot;
+ ui64 RequestId;
+ };
+
+ struct TEvCheckAllSlotsStatus : public TEventLocal<TEvCheckAllSlotsStatus, EvCheckAllSlotsStatus> {
+ TEvCheckAllSlotsStatus(ui64 requestId)
+ : RequestId(requestId)
+ {
+ }
+
+ ui64 RequestId;
+ };
+
+ };
+
+private:
+ class TTxAlterTenant;
+ class TTxAssignFreeSlots;
+ class TTxBanSlot;
+ class TTxCheckSlotStatus;
+ class TTxInitScheme;
+ class TTxLoadState;
+ class TTxPinSlot;
+ class TTxUnbanSlot;
class TTxUnpinSlotImpl;
- class TTxUnpinSlot;
- class TTxUpdateConfig;
- class TTxUpdateNodeLocation;
- class TTxUpdatePoolStatus;
- class TTxUpdateSlotStatus;
-
- ITransaction *CreateTxAlterTenant(TEvTenantSlotBroker::TEvAlterTenant::TPtr &ev);
- ITransaction *CreateTxAssignFreeSlots();
- ITransaction *CreateTxCheckSlotStatus(ui64 requestId,
- TSlot::TPtr slot = nullptr);
- ITransaction *CreateTxInitScheme();
- ITransaction *CreateTxLoadState();
- ITransaction *CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev);
- ITransaction *CreateTxUpdateNodeLocation(TEvInterconnect::TEvNodeInfo::TPtr &ev);
- ITransaction *CreateTxUpdatePoolStatus(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev);
- ITransaction *CreateTxUpdateSlotStatus(TEvTenantPool::TEvConfigureSlotResult::TPtr &ev);
-
+ class TTxUnpinSlot;
+ class TTxUpdateConfig;
+ class TTxUpdateNodeLocation;
+ class TTxUpdatePoolStatus;
+ class TTxUpdateSlotStatus;
+
+ ITransaction *CreateTxAlterTenant(TEvTenantSlotBroker::TEvAlterTenant::TPtr &ev);
+ ITransaction *CreateTxAssignFreeSlots();
+ ITransaction *CreateTxCheckSlotStatus(ui64 requestId,
+ TSlot::TPtr slot = nullptr);
+ ITransaction *CreateTxInitScheme();
+ ITransaction *CreateTxLoadState();
+ ITransaction *CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev);
+ ITransaction *CreateTxUpdateNodeLocation(TEvInterconnect::TEvNodeInfo::TPtr &ev);
+ ITransaction *CreateTxUpdatePoolStatus(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev);
+ ITransaction *CreateTxUpdateSlotStatus(TEvTenantPool::TEvConfigureSlotResult::TPtr &ev);
+
ui64 Generation() const;
- void OnActivateExecutor(const TActorContext &ctx) override;
- void OnDetach(const TActorContext &ctx) override;
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev,
- const TActorContext &ctx) override;
- void Enqueue(TAutoPtr<IEventHandle> &ev,
- const TActorContext &ctx) override;
- bool OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev,
- const TActorContext &ctx) override;
-
- void Cleanup(const TActorContext &ctx);
- void Die(const TActorContext &ctx) override;
-
- void LoadConfigFromProto(const NKikimrTenantSlotBroker::TConfig &config);
- void ProcessEnqueuedEvents(const TActorContext &ctx);
-
- void ClearState();
-
- TTenant::TPtr GetTenant(const TString &name);
- TTenant::TPtr AddTenant(const TString &name);
- TTenant::TPtr GetOrCreateTenant(const TString &name);
- void MaybeRemoveTenant(TTenant::TPtr tenant);
-
- void AddUnhappyTenant(TTenant::TPtr tenant);
- void RemoveUnhappyTenant(TTenant::TPtr tenant);
- bool HasUnhappyTenant() const;
-
- TSlot::TPtr GetSlot(const TSlotId &id);
- TSlot::TPtr GetSlot(ui32 nodeId, const TString &id);
- void AddSlot(TSlot::TPtr slot);
- void AddSlot(TSlot::TPtr slot,
- TTransactionContext &txc,
- const TActorContext &ctx);
-
- void SlotConnected(TSlot::TPtr slot);
- void SlotDisconnected(TSlot::TPtr slot);
- bool UpdateSlotDataCenter(TSlot::TPtr slot,
- const TString &dataCenter,
- TTransactionContext &txc,
- const TActorContext &ctx);
- bool UpdateSlotType(TSlot::TPtr slot,
- const TString &type,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void RemoveSlot(TSlot::TPtr slot,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void AddSlotToCounters(TSlot::TPtr slot);
- void RemoveSlotFromCounters(TSlot::TPtr slot);
- void DetachSlotNoConfigureNoDb(TSlot::TPtr slot,
- bool updateUnhappy = true);
- void DetachSlotNoConfigure(TSlot::TPtr slot,
- TTransactionContext &txc,
- bool updateUnhappy = true);
- void DetachSlot(TSlot::TPtr slot,
- TTransactionContext &txc,
- const TActorContext &ctx,
- bool updateUnhappy = true);
- void AttachSlotNoConfigureNoDb(TSlot::TPtr slot,
- TTenant::TPtr tenant,
- const TSlotDescription &usedAs,
- const TString &label);
- void AttachSlotNoConfigure(TSlot::TPtr slot,
- TTenant::TPtr tenant,
- const TSlotDescription &usedAs,
- const TString &label,
- TTransactionContext &txc);
- void AttachSlot(TSlot::TPtr slot,
- TTenant::TPtr tenant,
- const TSlotDescription &usedAs,
- TTransactionContext &txc,
- const TActorContext &ctx);
- bool MoveMisplacedSlots(TTenant::TPtr tenant,
- TSlotsAllocation::TPtr allocation,
- bool singleSlot,
- TTransactionContext &txc,
- const TActorContext &ctx);
- bool AssignFreeSlots(TTenant::TPtr tenant,
- bool singleSlot,
- TTransactionContext &txc,
- const TActorContext &ctx);
- TSlot::TPtr ExtractSlot(TFreeSlotsIndex &primary,
- TFreeSlotsIndex &secondary,
- const TString &type,
- const TString &dc) const;
- TLayout::TPtr ComputeLayoutForGroup(TCollocationGroup::TPtr group,
- const TString &dc);
- double ComputeLayoutPenalty(ui64 required,
- ui64 missing,
- ui64 misplaced,
- ui64 split,
- ui64 detached) const;
- void ApplyLayout(TTenant::TPtr tenant,
- TLayout::TPtr layout,
- TTransactionContext &txc,
- const TActorContext &ctx);
- bool AssignFreeSlotsForGroup(TTenant::TPtr tenant,
- TCollocationGroup::TPtr group,
- TTransactionContext &txc,
- const TActorContext &ctx);
+ void OnActivateExecutor(const TActorContext &ctx) override;
+ void OnDetach(const TActorContext &ctx) override;
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev,
+ const TActorContext &ctx) override;
+ void Enqueue(TAutoPtr<IEventHandle> &ev,
+ const TActorContext &ctx) override;
+ bool OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev,
+ const TActorContext &ctx) override;
+
+ void Cleanup(const TActorContext &ctx);
+ void Die(const TActorContext &ctx) override;
+
+ void LoadConfigFromProto(const NKikimrTenantSlotBroker::TConfig &config);
+ void ProcessEnqueuedEvents(const TActorContext &ctx);
+
+ void ClearState();
+
+ TTenant::TPtr GetTenant(const TString &name);
+ TTenant::TPtr AddTenant(const TString &name);
+ TTenant::TPtr GetOrCreateTenant(const TString &name);
+ void MaybeRemoveTenant(TTenant::TPtr tenant);
+
+ void AddUnhappyTenant(TTenant::TPtr tenant);
+ void RemoveUnhappyTenant(TTenant::TPtr tenant);
+ bool HasUnhappyTenant() const;
+
+ TSlot::TPtr GetSlot(const TSlotId &id);
+ TSlot::TPtr GetSlot(ui32 nodeId, const TString &id);
+ void AddSlot(TSlot::TPtr slot);
+ void AddSlot(TSlot::TPtr slot,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+
+ void SlotConnected(TSlot::TPtr slot);
+ void SlotDisconnected(TSlot::TPtr slot);
+ bool UpdateSlotDataCenter(TSlot::TPtr slot,
+ const TString &dataCenter,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ bool UpdateSlotType(TSlot::TPtr slot,
+ const TString &type,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void RemoveSlot(TSlot::TPtr slot,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void AddSlotToCounters(TSlot::TPtr slot);
+ void RemoveSlotFromCounters(TSlot::TPtr slot);
+ void DetachSlotNoConfigureNoDb(TSlot::TPtr slot,
+ bool updateUnhappy = true);
+ void DetachSlotNoConfigure(TSlot::TPtr slot,
+ TTransactionContext &txc,
+ bool updateUnhappy = true);
+ void DetachSlot(TSlot::TPtr slot,
+ TTransactionContext &txc,
+ const TActorContext &ctx,
+ bool updateUnhappy = true);
+ void AttachSlotNoConfigureNoDb(TSlot::TPtr slot,
+ TTenant::TPtr tenant,
+ const TSlotDescription &usedAs,
+ const TString &label);
+ void AttachSlotNoConfigure(TSlot::TPtr slot,
+ TTenant::TPtr tenant,
+ const TSlotDescription &usedAs,
+ const TString &label,
+ TTransactionContext &txc);
+ void AttachSlot(TSlot::TPtr slot,
+ TTenant::TPtr tenant,
+ const TSlotDescription &usedAs,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ bool MoveMisplacedSlots(TTenant::TPtr tenant,
+ TSlotsAllocation::TPtr allocation,
+ bool singleSlot,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ bool AssignFreeSlots(TTenant::TPtr tenant,
+ bool singleSlot,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ TSlot::TPtr ExtractSlot(TFreeSlotsIndex &primary,
+ TFreeSlotsIndex &secondary,
+ const TString &type,
+ const TString &dc) const;
+ TLayout::TPtr ComputeLayoutForGroup(TCollocationGroup::TPtr group,
+ const TString &dc);
+ double ComputeLayoutPenalty(ui64 required,
+ ui64 missing,
+ ui64 misplaced,
+ ui64 split,
+ ui64 detached) const;
+ void ApplyLayout(TTenant::TPtr tenant,
+ TLayout::TPtr layout,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ bool AssignFreeSlotsForGroup(TTenant::TPtr tenant,
+ TCollocationGroup::TPtr group,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
void OnClientDisconnected(TActorId clientId,
- const TActorContext &ctx);
- void DisconnectNodeSlots(ui32 nodeId,
- const TActorContext &ctx);
- void SendConfigureSlot(TSlot::TPtr slot,
- const TActorContext &ctx);
- void FillTenantState(const TString &name,
- NKikimrTenantSlotBroker::TTenantState &state);
- void ScheduleTxAssignFreeSlots(const TActorContext &ctx);
-
- void ProcessTx(ITransaction *tx, const TActorContext &ctx);
- void TxCompleted(ITransaction *tx, const TActorContext &ctx);
- void ProcessNextTx(const TActorContext &ctx);
-
- void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvents::TEvPoisonPill::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvents::TEvUndelivered::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvInterconnect::TEvNodeInfo::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvPrivate::TEvCheckAllSlotsStatus::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvPrivate::TEvCheckSlotStatus::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTabletPipe::TEvServerConnected::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTabletPipe::TEvServerDestroyed::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTabletPipe::TEvServerDisconnected::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTenantPool::TEvConfigureSlotResult::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTenantPool::TEvLostOwnership::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTenantSlotBroker::TEvAlterTenant::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTenantSlotBroker::TEvGetSlotStats::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTenantSlotBroker::TEvGetTenantState::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTenantSlotBroker::TEvListTenants::TPtr &ev,
- const TActorContext &ctx);
- void Handle(TEvTenantSlotBroker::TEvRegisterPool::TPtr &ev,
- const TActorContext &ctx);
-
- STFUNC(StateInit)
- {
- StateInitImpl(ev, ctx);
- }
-
- STFUNC(StateWork)
- {
- TRACE_EVENT(NKikimrServices::TENANT_SLOT_BROKER);
- switch (ev->GetTypeRewrite()) {
- HFuncTraced(TEvConsole::TEvConfigNotificationRequest, Handle);
- HFuncTraced(TEvConsole::TEvReplaceConfigSubscriptionsResponse, Handle);
- HFuncTraced(TEvents::TEvPoisonPill, Handle);
- HFuncTraced(TEvents::TEvUndelivered, Handle);
- HFuncTraced(TEvInterconnect::TEvNodeInfo, Handle);
- HFuncTraced(TEvPrivate::TEvCheckAllSlotsStatus, Handle);
- HFuncTraced(TEvPrivate::TEvCheckSlotStatus, Handle);
- HFuncTraced(TEvTabletPipe::TEvServerConnected, Handle);
- HFuncTraced(TEvTabletPipe::TEvServerDestroyed, Handle);
- HFuncTraced(TEvTabletPipe::TEvServerDisconnected, Handle);
- HFuncTraced(TEvTenantPool::TEvConfigureSlotResult, Handle);
- HFuncTraced(TEvTenantPool::TEvLostOwnership, Handle);
- HFuncTraced(TEvTenantPool::TEvTenantPoolStatus, Handle);
- HFuncTraced(TEvTenantSlotBroker::TEvAlterTenant, Handle);
- HFuncTraced(TEvTenantSlotBroker::TEvGetSlotStats, Handle);
- HFuncTraced(TEvTenantSlotBroker::TEvGetTenantState, Handle);
- HFuncTraced(TEvTenantSlotBroker::TEvListTenants, Handle);
- HFuncTraced(TEvTenantSlotBroker::TEvRegisterPool, Handle);
-
- default:
- if (!HandleDefaultEvents(ev, ctx)) {
- Y_FAIL("TTenantSlotBroker::StateWork unexpected event type: %" PRIx32 " event: %s",
+ const TActorContext &ctx);
+ void DisconnectNodeSlots(ui32 nodeId,
+ const TActorContext &ctx);
+ void SendConfigureSlot(TSlot::TPtr slot,
+ const TActorContext &ctx);
+ void FillTenantState(const TString &name,
+ NKikimrTenantSlotBroker::TTenantState &state);
+ void ScheduleTxAssignFreeSlots(const TActorContext &ctx);
+
+ void ProcessTx(ITransaction *tx, const TActorContext &ctx);
+ void TxCompleted(ITransaction *tx, const TActorContext &ctx);
+ void ProcessNextTx(const TActorContext &ctx);
+
+ void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvents::TEvPoisonPill::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvents::TEvUndelivered::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvInterconnect::TEvNodeInfo::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvCheckAllSlotsStatus::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvCheckSlotStatus::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTabletPipe::TEvServerConnected::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTabletPipe::TEvServerDestroyed::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTabletPipe::TEvServerDisconnected::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTenantPool::TEvConfigureSlotResult::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTenantPool::TEvLostOwnership::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTenantPool::TEvTenantPoolStatus::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTenantSlotBroker::TEvAlterTenant::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTenantSlotBroker::TEvGetSlotStats::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTenantSlotBroker::TEvGetTenantState::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTenantSlotBroker::TEvListTenants::TPtr &ev,
+ const TActorContext &ctx);
+ void Handle(TEvTenantSlotBroker::TEvRegisterPool::TPtr &ev,
+ const TActorContext &ctx);
+
+ STFUNC(StateInit)
+ {
+ StateInitImpl(ev, ctx);
+ }
+
+ STFUNC(StateWork)
+ {
+ TRACE_EVENT(NKikimrServices::TENANT_SLOT_BROKER);
+ switch (ev->GetTypeRewrite()) {
+ HFuncTraced(TEvConsole::TEvConfigNotificationRequest, Handle);
+ HFuncTraced(TEvConsole::TEvReplaceConfigSubscriptionsResponse, Handle);
+ HFuncTraced(TEvents::TEvPoisonPill, Handle);
+ HFuncTraced(TEvents::TEvUndelivered, Handle);
+ HFuncTraced(TEvInterconnect::TEvNodeInfo, Handle);
+ HFuncTraced(TEvPrivate::TEvCheckAllSlotsStatus, Handle);
+ HFuncTraced(TEvPrivate::TEvCheckSlotStatus, Handle);
+ HFuncTraced(TEvTabletPipe::TEvServerConnected, Handle);
+ HFuncTraced(TEvTabletPipe::TEvServerDestroyed, Handle);
+ HFuncTraced(TEvTabletPipe::TEvServerDisconnected, Handle);
+ HFuncTraced(TEvTenantPool::TEvConfigureSlotResult, Handle);
+ HFuncTraced(TEvTenantPool::TEvLostOwnership, Handle);
+ HFuncTraced(TEvTenantPool::TEvTenantPoolStatus, Handle);
+ HFuncTraced(TEvTenantSlotBroker::TEvAlterTenant, Handle);
+ HFuncTraced(TEvTenantSlotBroker::TEvGetSlotStats, Handle);
+ HFuncTraced(TEvTenantSlotBroker::TEvGetTenantState, Handle);
+ HFuncTraced(TEvTenantSlotBroker::TEvListTenants, Handle);
+ HFuncTraced(TEvTenantSlotBroker::TEvRegisterPool, Handle);
+
+ default:
+ if (!HandleDefaultEvents(ev, ctx)) {
+ Y_FAIL("TTenantSlotBroker::StateWork unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
- }
-
-public:
+ }
+ }
+ }
+
+public:
TTenantSlotBroker(const TActorId &tablet, TTabletStorageInfo *info)
- : TActor(&TThis::StateInit)
- , TTabletExecutedFlat(info, tablet, new NMiniKQL::TMiniKQLFactory)
- , PendingAssignFreeSlots(false)
- , ConfigSubscriptionId(0)
- {
- }
-
- ~TTenantSlotBroker()
- {
- ClearState();
- }
-
+ : TActor(&TThis::StateInit)
+ , TTabletExecutedFlat(info, tablet, new NMiniKQL::TMiniKQLFactory)
+ , PendingAssignFreeSlots(false)
+ , ConfigSubscriptionId(0)
+ {
+ }
+
+ ~TTenantSlotBroker()
+ {
+ ClearState();
+ }
+
static constexpr NKikimrServices::TActivity::EType ActorActivityType()
- {
+ {
return NKikimrServices::TActivity::TENANT_SLOT_BROKER_ACTOR;
- }
-
-private:
- TDeque<TAutoPtr<IEventHandle>> InitQueue;
- TDuration PendingTimeout;
- ui64 RequestId;
- ui32 DomainId;
- TString DomainName;
- // NodeId -> DataCenter
- THashMap<ui32, TString> NodeIdToDataCenter;
- // TenantName -> Tenant
- THashMap<TString, TTenant::TPtr> Tenants;
- // <NodeId, SlotId> -> Slot
- THashMap<TSlotId, TSlot::TPtr> Slots;
- THashSet<TSlotId> BannedSlots;
- THashMap<TSlotId, TPinnedSlotInfo> PinnedSlots;
+ }
+
+private:
+ TDeque<TAutoPtr<IEventHandle>> InitQueue;
+ TDuration PendingTimeout;
+ ui64 RequestId;
+ ui32 DomainId;
+ TString DomainName;
+ // NodeId -> DataCenter
+ THashMap<ui32, TString> NodeIdToDataCenter;
+ // TenantName -> Tenant
+ THashMap<TString, TTenant::TPtr> Tenants;
+ // <NodeId, SlotId> -> Slot
+ THashMap<TSlotId, TSlot::TPtr> Slots;
+ THashSet<TSlotId> BannedSlots;
+ THashMap<TSlotId, TPinnedSlotInfo> PinnedSlots;
TMap<TInstant, TEnqueuedUnpin> EnqueuedUnpins;
- // NodeId -> {Slots}
- THashMap<ui32, TSlotSet> SlotsByNodeId;
- TFreeSlotsIndex FreeSlots;
- // Tenants with missing, misplaced and split resources.
- TSet<TTenant::TPtr, TTenantLessHappy> UnhappyTenants;
- TSet<TTenant::TPtr, TTenantMoreMisplaced> MisplacedTenants;
- TSet<TTenant::TPtr, TTenantMoreSplit> SplitTenants;
- bool PendingAssignFreeSlots;
+ // NodeId -> {Slots}
+ THashMap<ui32, TSlotSet> SlotsByNodeId;
+ TFreeSlotsIndex FreeSlots;
+ // Tenants with missing, misplaced and split resources.
+ TSet<TTenant::TPtr, TTenantLessHappy> UnhappyTenants;
+ TSet<TTenant::TPtr, TTenantMoreMisplaced> MisplacedTenants;
+ TSet<TTenant::TPtr, TTenantMoreSplit> SplitTenants;
+ bool PendingAssignFreeSlots;
THashSet<TActorId> KnownPoolPipes;
- TCounters::TPtr Counters;
- ITransaction *ActiveTx = nullptr;
- TDeque<THolder<ITransaction>> TxQueue;
- ui64 ConfigSubscriptionId;
-};
-
-} // NTenantSlotBroker
-} // NKikimr
+ TCounters::TPtr Counters;
+ ITransaction *ActiveTx = nullptr;
+ TDeque<THolder<ITransaction>> TxQueue;
+ ui64 ConfigSubscriptionId;
+};
+
+} // NTenantSlotBroker
+} // NKikimr
diff --git a/ydb/core/mind/tenant_ut_broker.cpp b/ydb/core/mind/tenant_ut_broker.cpp
index 768ac4d2145..4c124b3d83b 100644
--- a/ydb/core/mind/tenant_ut_broker.cpp
+++ b/ydb/core/mind/tenant_ut_broker.cpp
@@ -1,5 +1,5 @@
-#include "tenant_slot_broker_impl.h"
-
+#include "tenant_slot_broker_impl.h"
+
#include <ydb/core/base/counters.h>
#include <ydb/core/node_whiteboard/node_whiteboard.h>
#include <ydb/core/cms/console/config_index.h>
@@ -8,1484 +8,1484 @@
#include <ydb/core/mind/tenant_slot_broker.h>
#include <ydb/core/testlib/tablet_helpers.h>
#include <ydb/core/testlib/tenant_runtime.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-#include <util/random/random.h>
-
-namespace NKikimr {
-
-using namespace NTenantSlotBroker;
-
-namespace {
-
+
+#include <util/random/random.h>
+
+namespace NKikimr {
+
+using namespace NTenantSlotBroker;
+
+namespace {
+
static const TString DATA_CENTER1 = ToString(1);
static const TString DATA_CENTER2 = ToString(2);
static const TString DATA_CENTER3 = ToString(3);
-
-const TString SLOT1 = "slot-1";
-const TString SLOT2 = "slot-2";
-const TString SLOT3 = "slot-3";
-const TString SLOT4 = "slot-4";
-const TString SLOT5 = "slot-5";
-const TString SLOT6 = "slot-6";
-
-TTenantTestConfig::TTenantPoolConfig DefaultTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}},
- {SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
- {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
- ""
- };
- return res;
-}
-
-TTenantTestConfig::TTenantPoolConfig DoubleTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}},
- {SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
- {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}},
- {SLOT4, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}},
- {SLOT5, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
- {SLOT6, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
- ""
- };
- return res;
-}
-
-TTenantTestConfig::TTenantPoolConfig ShrinkTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
- ""
- };
- return res;
-}
-
-TTenantTestConfig::TTenantPoolConfig ModifiedTypeTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {SLOT1, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
- {SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
- {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
- ""
- };
- return res;
-}
-
-TTenantTestConfig::TTenantPoolConfig AssignedTenantPoolConfig()
-{
- TTenantTestConfig::TTenantPoolConfig res = {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}},
- {SLOT2, SLOT2_TYPE, DOMAIN1_NAME, TENANT1_2_NAME, {2, 2, 2}},
- {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, TENANT1_3_NAME, {3, 3, 3}} }},
- ""
- };
- return res;
-}
-
-TTenantTestConfig TenantTestConfigSingleSlot()
-{
- TTenantTestConfig res = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME, TENANT1_2_NAME, TENANT1_3_NAME, TENANT1_4_NAME, TENANT1_5_NAME }}} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- false,
- // FakeSchemeShard
- true,
- // CreateConsole
- false,
- // Nodes {tenant_pool_config, data_center}
- {{
- // Node0
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
- ""
- }
- },
- // Node1
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}} }},
- ""
- }
- },
- // Node2
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
- ""
- }
- }
- }},
- // DataCenterCount
- 1
- };
- return res;
-}
-
-TTenantTestConfig TenantTestConfigWithConsole()
-{
- TTenantTestConfig res = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{}}} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- false,
- // FakeSchemeShard
- true,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- // Node0
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
- ""
- }
- }
- }},
- // DataCenterCount
- 1
- };
- return res;
-}
-
-TTenantTestConfig TenantTestConfig3DC()
-{
- TTenantTestConfig res = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME, TENANT1_2_NAME, TENANT1_3_NAME, TENANT1_4_NAME, TENANT1_5_NAME }}} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- false,
- // FakeSchemeShard
- true,
- // CreateConsole
- false,
- // Nodes {tenant_pool_config, data_center}
- {{
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()},
- {DefaultTenantPoolConfig()}
- }},
- // DataCenterCount
- 3
- };
- return res;
-}
-
-struct TSlotCount {
- ui64 Required;
- ui64 Pending;
- ui64 Missing;
- ui64 Misplaced;
- ui64 Split;
- ui64 Pinned;
-
- TSlotCount(ui64 required = 0,
- ui64 pending = 0,
- ui64 missing = 0,
- ui64 misplaced = 0,
- ui64 split = 0,
- ui64 pinned = 0)
- : Required(required)
- , Pending(pending)
- , Missing(missing)
- , Misplaced(misplaced)
- , Split(split)
- , Pinned(pinned)
- {
- }
-
- TSlotCount &operator+=(const TSlotCount &other)
- {
- Required += other.Required;
- Pending += other.Pending;
- Missing += other.Missing;
- Misplaced += other.Misplaced;
- Split += other.Split;
- Pinned += other.Pinned;
- return *this;
- }
-};
-
-struct TSlotRequest {
- TSlotDescription Description;
- TSlotCount Count;
-
- TSlotRequest(const TString &type,
+
+const TString SLOT1 = "slot-1";
+const TString SLOT2 = "slot-2";
+const TString SLOT3 = "slot-3";
+const TString SLOT4 = "slot-4";
+const TString SLOT5 = "slot-5";
+const TString SLOT6 = "slot-6";
+
+TTenantTestConfig::TTenantPoolConfig DefaultTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}},
+ {SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
+ {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
+ ""
+ };
+ return res;
+}
+
+TTenantTestConfig::TTenantPoolConfig DoubleTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}},
+ {SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
+ {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}},
+ {SLOT4, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}},
+ {SLOT5, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
+ {SLOT6, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
+ ""
+ };
+ return res;
+}
+
+TTenantTestConfig::TTenantPoolConfig ShrinkTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
+ ""
+ };
+ return res;
+}
+
+TTenantTestConfig::TTenantPoolConfig ModifiedTypeTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {SLOT1, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
+ {SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
+ {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
+ ""
+ };
+ return res;
+}
+
+TTenantTestConfig::TTenantPoolConfig AssignedTenantPoolConfig()
+{
+ TTenantTestConfig::TTenantPoolConfig res = {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}},
+ {SLOT2, SLOT2_TYPE, DOMAIN1_NAME, TENANT1_2_NAME, {2, 2, 2}},
+ {SLOT3, SLOT3_TYPE, DOMAIN1_NAME, TENANT1_3_NAME, {3, 3, 3}} }},
+ ""
+ };
+ return res;
+}
+
+TTenantTestConfig TenantTestConfigSingleSlot()
+{
+ TTenantTestConfig res = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME, TENANT1_2_NAME, TENANT1_3_NAME, TENANT1_4_NAME, TENANT1_5_NAME }}} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ false,
+ // FakeSchemeShard
+ true,
+ // CreateConsole
+ false,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ // Node0
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
+ ""
+ }
+ },
+ // Node1
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}} }},
+ ""
+ }
+ },
+ // Node2
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
+ ""
+ }
+ }
+ }},
+ // DataCenterCount
+ 1
+ };
+ return res;
+}
+
+TTenantTestConfig TenantTestConfigWithConsole()
+{
+ TTenantTestConfig res = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{}}} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ false,
+ // FakeSchemeShard
+ true,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ // Node0
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
+ ""
+ }
+ }
+ }},
+ // DataCenterCount
+ 1
+ };
+ return res;
+}
+
+TTenantTestConfig TenantTestConfig3DC()
+{
+ TTenantTestConfig res = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME, TENANT1_2_NAME, TENANT1_3_NAME, TENANT1_4_NAME, TENANT1_5_NAME }}} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ false,
+ // FakeSchemeShard
+ true,
+ // CreateConsole
+ false,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()},
+ {DefaultTenantPoolConfig()}
+ }},
+ // DataCenterCount
+ 3
+ };
+ return res;
+}
+
+struct TSlotCount {
+ ui64 Required;
+ ui64 Pending;
+ ui64 Missing;
+ ui64 Misplaced;
+ ui64 Split;
+ ui64 Pinned;
+
+ TSlotCount(ui64 required = 0,
+ ui64 pending = 0,
+ ui64 missing = 0,
+ ui64 misplaced = 0,
+ ui64 split = 0,
+ ui64 pinned = 0)
+ : Required(required)
+ , Pending(pending)
+ , Missing(missing)
+ , Misplaced(misplaced)
+ , Split(split)
+ , Pinned(pinned)
+ {
+ }
+
+ TSlotCount &operator+=(const TSlotCount &other)
+ {
+ Required += other.Required;
+ Pending += other.Pending;
+ Missing += other.Missing;
+ Misplaced += other.Misplaced;
+ Split += other.Split;
+ Pinned += other.Pinned;
+ return *this;
+ }
+};
+
+struct TSlotRequest {
+ TSlotDescription Description;
+ TSlotCount Count;
+
+ TSlotRequest(const TString &type,
TString dc,
- ui64 required,
- ui64 pending,
- ui64 missing,
- ui64 misplaced = 0,
- ui64 split = 0,
- ui64 pinned = 0)
+ ui64 required,
+ ui64 pending,
+ ui64 missing,
+ ui64 misplaced = 0,
+ ui64 split = 0,
+ ui64 pinned = 0)
: Description(type, dc)
- , Count(required, pending, missing, misplaced, split, pinned)
- {
- }
-
- TSlotRequest(const TString &type,
+ , Count(required, pending, missing, misplaced, split, pinned)
+ {
+ }
+
+ TSlotRequest(const TString &type,
TString dc,
- bool forceLocation,
- ui32 group,
- bool forceCollocation,
- ui64 required,
- ui64 pending,
- ui64 missing,
- ui64 misplaced,
- ui64 split,
- ui64 pinned = 0)
+ bool forceLocation,
+ ui32 group,
+ bool forceCollocation,
+ ui64 required,
+ ui64 pending,
+ ui64 missing,
+ ui64 misplaced,
+ ui64 split,
+ ui64 pinned = 0)
: Description(type, dc, forceLocation, group, forceCollocation)
- , Count(required, pending, missing, misplaced, split, pinned)
- {
- }
-};
-
-void CollectRequests(TVector<TSlotRequest> &)
-{
-}
-
+ , Count(required, pending, missing, misplaced, split, pinned)
+ {
+ }
+};
+
+void CollectRequests(TVector<TSlotRequest> &)
+{
+}
+
void CollectRequests(TVector<TSlotRequest> &requests, const TString &type, TString dataCenter, ui64 required, ui64 pending, ui64 missing)
-{
- requests.push_back({type, dataCenter, required, pending, missing});
-}
-
-template <typename ...Ts>
+{
+ requests.push_back({type, dataCenter, required, pending, missing});
+}
+
+template <typename ...Ts>
void CollectRequests(TVector<TSlotRequest> &requests, const TString &type, TString dataCenter, ui64 required, ui64 pending, ui64 missing,
- Ts... args)
-{
- CollectRequests(requests, type, dataCenter, required, pending, missing);
- CollectRequests(requests, args...);
-}
-
-void CheckState(const NKikimrTenantSlotBroker::TTenantState &rec,
- const TString &name,
- THashMap<TSlotDescription, TSlotCount> expected)
-{
- UNIT_ASSERT_VALUES_EQUAL(name, rec.GetTenantName());
- for (auto &slot : rec.GetRequiredSlots()) {
- TSlotDescription key(slot);
+ Ts... args)
+{
+ CollectRequests(requests, type, dataCenter, required, pending, missing);
+ CollectRequests(requests, args...);
+}
+
+void CheckState(const NKikimrTenantSlotBroker::TTenantState &rec,
+ const TString &name,
+ THashMap<TSlotDescription, TSlotCount> expected)
+{
+ UNIT_ASSERT_VALUES_EQUAL(name, rec.GetTenantName());
+ for (auto &slot : rec.GetRequiredSlots()) {
+ TSlotDescription key(slot);
UNIT_ASSERT(expected.contains(key));
- UNIT_ASSERT_VALUES_EQUAL(slot.GetCount(), expected[key].Required);
- expected[key].Required = 0;
- }
- for (auto &slot : rec.GetPendingSlots()) {
- TSlotDescription key(slot);
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetCount(), expected[key].Required);
+ expected[key].Required = 0;
+ }
+ for (auto &slot : rec.GetPendingSlots()) {
+ TSlotDescription key(slot);
UNIT_ASSERT(expected.contains(key));
- UNIT_ASSERT_VALUES_EQUAL(slot.GetCount(), expected[key].Pending);
- expected[key].Pending = 0;
- }
- for (auto &slot : rec.GetMissingSlots()) {
- TSlotDescription key(slot);
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetCount(), expected[key].Pending);
+ expected[key].Pending = 0;
+ }
+ for (auto &slot : rec.GetMissingSlots()) {
+ TSlotDescription key(slot);
UNIT_ASSERT(expected.contains(key));
- UNIT_ASSERT_VALUES_EQUAL(slot.GetCount(), expected[key].Missing);
- expected[key].Missing = 0;
- }
- for (auto &slot : rec.GetMisplacedSlots()) {
- TSlotDescription key(slot);
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetCount(), expected[key].Missing);
+ expected[key].Missing = 0;
+ }
+ for (auto &slot : rec.GetMisplacedSlots()) {
+ TSlotDescription key(slot);
UNIT_ASSERT(expected.contains(key));
- UNIT_ASSERT_VALUES_EQUAL(slot.GetCount(), expected[key].Misplaced);
- expected[key].Misplaced = 0;
- }
- for (auto &slot : rec.GetSplitSlots()) {
- TSlotDescription key(slot);
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetCount(), expected[key].Misplaced);
+ expected[key].Misplaced = 0;
+ }
+ for (auto &slot : rec.GetSplitSlots()) {
+ TSlotDescription key(slot);
UNIT_ASSERT(expected.contains(key));
- UNIT_ASSERT_VALUES_EQUAL(slot.GetCount(), expected[key].Split);
- expected[key].Split = 0;
- }
- for (auto &pr : expected) {
- UNIT_ASSERT_VALUES_EQUAL(pr.second.Required, 0);
- UNIT_ASSERT_VALUES_EQUAL(pr.second.Pending, 0);
- UNIT_ASSERT_VALUES_EQUAL(pr.second.Missing, 0);
- UNIT_ASSERT_VALUES_EQUAL(pr.second.Misplaced, 0);
- UNIT_ASSERT_VALUES_EQUAL(pr.second.Split, 0);
- }
-}
-
-bool CompareState(NKikimrTenantSlotBroker::TTenantState &rec, const TString &name,
- THashMap<TSlotDescription, TSlotCount> expected)
-{
- if (name != rec.GetTenantName())
- return false;
- for (auto &slot : rec.GetRequiredSlots()) {
- TSlotDescription key(slot);
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetCount(), expected[key].Split);
+ expected[key].Split = 0;
+ }
+ for (auto &pr : expected) {
+ UNIT_ASSERT_VALUES_EQUAL(pr.second.Required, 0);
+ UNIT_ASSERT_VALUES_EQUAL(pr.second.Pending, 0);
+ UNIT_ASSERT_VALUES_EQUAL(pr.second.Missing, 0);
+ UNIT_ASSERT_VALUES_EQUAL(pr.second.Misplaced, 0);
+ UNIT_ASSERT_VALUES_EQUAL(pr.second.Split, 0);
+ }
+}
+
+bool CompareState(NKikimrTenantSlotBroker::TTenantState &rec, const TString &name,
+ THashMap<TSlotDescription, TSlotCount> expected)
+{
+ if (name != rec.GetTenantName())
+ return false;
+ for (auto &slot : rec.GetRequiredSlots()) {
+ TSlotDescription key(slot);
if (!expected.contains(key))
- return false;
- if (slot.GetCount() != expected[key].Required)
- return false;
- expected[key].Required = 0;
- }
- for (auto &slot : rec.GetPendingSlots()) {
- TSlotDescription key(slot);
+ return false;
+ if (slot.GetCount() != expected[key].Required)
+ return false;
+ expected[key].Required = 0;
+ }
+ for (auto &slot : rec.GetPendingSlots()) {
+ TSlotDescription key(slot);
if (!expected.contains(key))
- return false;
- if (slot.GetCount() != expected[key].Pending)
- return false;
- expected[key].Pending = 0;
- }
- for (auto &slot : rec.GetMissingSlots()) {
- TSlotDescription key(slot);
+ return false;
+ if (slot.GetCount() != expected[key].Pending)
+ return false;
+ expected[key].Pending = 0;
+ }
+ for (auto &slot : rec.GetMissingSlots()) {
+ TSlotDescription key(slot);
if (!expected.contains(key))
- return false;
- if (slot.GetCount() != expected[key].Missing)
- return false;
- expected[key].Missing = 0;
- }
- for (auto &slot : rec.GetMisplacedSlots()) {
- TSlotDescription key(slot);
+ return false;
+ if (slot.GetCount() != expected[key].Missing)
+ return false;
+ expected[key].Missing = 0;
+ }
+ for (auto &slot : rec.GetMisplacedSlots()) {
+ TSlotDescription key(slot);
if (!expected.contains(key))
- return false;
- if (slot.GetCount() != expected[key].Misplaced)
- return false;
- expected[key].Misplaced = 0;
- }
- for (auto &slot : rec.GetSplitSlots()) {
- TSlotDescription key(slot);
+ return false;
+ if (slot.GetCount() != expected[key].Misplaced)
+ return false;
+ expected[key].Misplaced = 0;
+ }
+ for (auto &slot : rec.GetSplitSlots()) {
+ TSlotDescription key(slot);
if (!expected.contains(key))
- return false;
- if (slot.GetCount() != expected[key].Split)
- return false;
- expected[key].Split = 0;
- }
- for (auto &slot : rec.GetPinnedSlots()) {
- TSlotDescription key(slot);
+ return false;
+ if (slot.GetCount() != expected[key].Split)
+ return false;
+ expected[key].Split = 0;
+ }
+ for (auto &slot : rec.GetPinnedSlots()) {
+ TSlotDescription key(slot);
if (!expected.contains(key))
- return false;
- if (slot.GetCount() != expected[key].Pinned)
- return false;
- expected[key].Pinned = 0;
- }
- for (auto &pr : expected) {
- if (pr.second.Required || pr.second.Pending || pr.second.Missing
- || pr.second.Misplaced || pr.second.Split || pr.second.Pinned)
- return false;
- }
-
- return true;
-}
-
-void AlterTenant(TTenantTestRuntime &runtime,
- const TString &name,
- const TVector<TSlotRequest> &requests)
-{
- TAutoPtr<IEventHandle> handle;
-
- auto *event = new TEvTenantSlotBroker::TEvAlterTenant;
- event->Record.SetTenantName(name);
- for (auto &request : requests) {
- auto &slot = *event->Record.AddRequiredSlots();
- request.Description.Serialize(slot);
- slot.SetCount(request.Count.Required);
- }
-
- runtime.SendToBroker(event);
- runtime.GrabEdgeEventRethrow<TEvTenantSlotBroker::TEvTenantState>(handle);
-}
-
-void CheckAlterTenant(TTenantTestRuntime &runtime,
- const TString &name,
- const TVector<TSlotRequest> &requests)
-{
- THashMap<TSlotDescription, TSlotCount> expected;
- TAutoPtr<IEventHandle> handle;
-
- auto *event = new TEvTenantSlotBroker::TEvAlterTenant;
- event->Record.SetTenantName(name);
- for (auto &request : requests) {
- auto &slot = *event->Record.AddRequiredSlots();
- request.Description.Serialize(slot);
- slot.SetCount(request.Count.Required);
- expected[request.Description] += request.Count;
- }
-
- runtime.SendToBroker(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvTenantSlotBroker::TEvTenantState>(handle);
- CheckState(reply->Record, name, expected);
-}
-
-template <typename ...Ts>
-void AlterTenant(TTenantTestRuntime &runtime, const TString &name, Ts... args)
-{
- TVector<TSlotRequest> requests;
- CollectRequests(requests, args...);
- AlterTenant(runtime, name, requests);
-}
-
-template <typename ...Ts>
-void CheckAlterTenant(TTenantTestRuntime &runtime, const TString &name, Ts... args)
-{
- TVector<TSlotRequest> requests;
- CollectRequests(requests, args...);
- CheckAlterTenant(runtime, name, requests);
-}
-
-template <typename ...Ts>
-void CheckTenantState(TTenantTestRuntime &runtime,
- const TString &name,
- const TVector<TSlotRequest> requests)
-{
- THashMap<TSlotDescription, TSlotCount> expected;
- TAutoPtr<IEventHandle> handle;
-
- for (auto &request : requests)
- expected[request.Description] += request.Count;
-
- bool ok =false;
- while (!ok) {
- auto *event = new TEvTenantSlotBroker::TEvGetTenantState;
- event->Record.SetTenantName(name);
-
- runtime.SendToBroker(event);
- auto reply = runtime.GrabEdgeEventRethrow<TEvTenantSlotBroker::TEvTenantState>(handle);
- ok = CompareState(reply->Record, name, expected);
- runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
- if (!ok) {
- NKikimrTenantSlotBroker::TConfig config;
+ return false;
+ if (slot.GetCount() != expected[key].Pinned)
+ return false;
+ expected[key].Pinned = 0;
+ }
+ for (auto &pr : expected) {
+ if (pr.second.Required || pr.second.Pending || pr.second.Missing
+ || pr.second.Misplaced || pr.second.Split || pr.second.Pinned)
+ return false;
+ }
+
+ return true;
+}
+
+void AlterTenant(TTenantTestRuntime &runtime,
+ const TString &name,
+ const TVector<TSlotRequest> &requests)
+{
+ TAutoPtr<IEventHandle> handle;
+
+ auto *event = new TEvTenantSlotBroker::TEvAlterTenant;
+ event->Record.SetTenantName(name);
+ for (auto &request : requests) {
+ auto &slot = *event->Record.AddRequiredSlots();
+ request.Description.Serialize(slot);
+ slot.SetCount(request.Count.Required);
+ }
+
+ runtime.SendToBroker(event);
+ runtime.GrabEdgeEventRethrow<TEvTenantSlotBroker::TEvTenantState>(handle);
+}
+
+void CheckAlterTenant(TTenantTestRuntime &runtime,
+ const TString &name,
+ const TVector<TSlotRequest> &requests)
+{
+ THashMap<TSlotDescription, TSlotCount> expected;
+ TAutoPtr<IEventHandle> handle;
+
+ auto *event = new TEvTenantSlotBroker::TEvAlterTenant;
+ event->Record.SetTenantName(name);
+ for (auto &request : requests) {
+ auto &slot = *event->Record.AddRequiredSlots();
+ request.Description.Serialize(slot);
+ slot.SetCount(request.Count.Required);
+ expected[request.Description] += request.Count;
+ }
+
+ runtime.SendToBroker(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTenantSlotBroker::TEvTenantState>(handle);
+ CheckState(reply->Record, name, expected);
+}
+
+template <typename ...Ts>
+void AlterTenant(TTenantTestRuntime &runtime, const TString &name, Ts... args)
+{
+ TVector<TSlotRequest> requests;
+ CollectRequests(requests, args...);
+ AlterTenant(runtime, name, requests);
+}
+
+template <typename ...Ts>
+void CheckAlterTenant(TTenantTestRuntime &runtime, const TString &name, Ts... args)
+{
+ TVector<TSlotRequest> requests;
+ CollectRequests(requests, args...);
+ CheckAlterTenant(runtime, name, requests);
+}
+
+template <typename ...Ts>
+void CheckTenantState(TTenantTestRuntime &runtime,
+ const TString &name,
+ const TVector<TSlotRequest> requests)
+{
+ THashMap<TSlotDescription, TSlotCount> expected;
+ TAutoPtr<IEventHandle> handle;
+
+ for (auto &request : requests)
+ expected[request.Description] += request.Count;
+
+ bool ok =false;
+ while (!ok) {
+ auto *event = new TEvTenantSlotBroker::TEvGetTenantState;
+ event->Record.SetTenantName(name);
+
+ runtime.SendToBroker(event);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTenantSlotBroker::TEvTenantState>(handle);
+ ok = CompareState(reply->Record, name, expected);
+ runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
+ if (!ok) {
+ NKikimrTenantSlotBroker::TConfig config;
TDuration delay = TDuration::MicroSeconds(config.GetPendingSlotTimeout());
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TTenantSlotBroker::TEvPrivate::EvCheckSlotStatus, 1);
- runtime.DispatchEvents(options, delay);
- }
- }
-}
-
-template <typename ...Ts>
-void CheckTenantState(TTenantTestRuntime &runtime, const TString &name, Ts... args)
-{
- TVector<TSlotRequest> requests;
- CollectRequests(requests, args...);
- CheckTenantState(runtime, name, requests);
-}
-
-void CheckTenantsList(TTenantTestRuntime &runtime,
- const TVector<std::pair<TString, TVector<TSlotRequest>>> &state)
-{
- THashMap<TString, THashMap<TSlotDescription, TSlotCount>> expected;
- for (auto &tenant : state) {
- for (auto &slot : tenant.second) {
- expected[tenant.first][slot.Description] += slot.Count;
- }
- }
-
- auto *event = new TEvTenantSlotBroker::TEvListTenants;
- runtime.SendToBroker(event);
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvTenantSlotBroker::TEvTenantsList>(handle);
- for (auto &tenant : reply->Record.GetTenants()) {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TTenantSlotBroker::TEvPrivate::EvCheckSlotStatus, 1);
+ runtime.DispatchEvents(options, delay);
+ }
+ }
+}
+
+template <typename ...Ts>
+void CheckTenantState(TTenantTestRuntime &runtime, const TString &name, Ts... args)
+{
+ TVector<TSlotRequest> requests;
+ CollectRequests(requests, args...);
+ CheckTenantState(runtime, name, requests);
+}
+
+void CheckTenantsList(TTenantTestRuntime &runtime,
+ const TVector<std::pair<TString, TVector<TSlotRequest>>> &state)
+{
+ THashMap<TString, THashMap<TSlotDescription, TSlotCount>> expected;
+ for (auto &tenant : state) {
+ for (auto &slot : tenant.second) {
+ expected[tenant.first][slot.Description] += slot.Count;
+ }
+ }
+
+ auto *event = new TEvTenantSlotBroker::TEvListTenants;
+ runtime.SendToBroker(event);
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTenantSlotBroker::TEvTenantsList>(handle);
+ for (auto &tenant : reply->Record.GetTenants()) {
UNIT_ASSERT(expected.contains(tenant.GetTenantName()));
- CheckState(tenant, tenant.GetTenantName(), expected[tenant.GetTenantName()]);
- expected.erase(tenant.GetTenantName());
- }
- UNIT_ASSERT(expected.empty());
-}
-
-void RestartTenantSlotBroker(TTenantTestRuntime &runtime)
-{
- runtime.Register(CreateTabletKiller(MakeTenantSlotBrokerID(0)));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- runtime.DispatchEvents(options);
-}
-
-
-} // anonymous namespace
-
+ CheckState(tenant, tenant.GetTenantName(), expected[tenant.GetTenantName()]);
+ expected.erase(tenant.GetTenantName());
+ }
+ UNIT_ASSERT(expected.empty());
+}
+
+void RestartTenantSlotBroker(TTenantTestRuntime &runtime)
+{
+ runtime.Register(CreateTabletKiller(MakeTenantSlotBrokerID(0)));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ runtime.DispatchEvents(options);
+}
+
+
+} // anonymous namespace
+
Y_UNIT_TEST_SUITE(TTenantSlotBrokerTests) {
Y_UNIT_TEST(TestAllocateExactSlots) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0,
- SLOT2_TYPE, DATA_CENTER2, 2, 2, 0,
- SLOT3_TYPE, DATA_CENTER3, 1, 1, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 10, 10, 10}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0,
- SLOT2_TYPE, DATA_CENTER2, 2, 0, 0,
- SLOT3_TYPE, DATA_CENTER3, 1, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0,
+ SLOT2_TYPE, DATA_CENTER2, 2, 2, 0,
+ SLOT3_TYPE, DATA_CENTER3, 1, 1, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 10, 10, 10}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0,
+ SLOT2_TYPE, DATA_CENTER2, 2, 0, 0,
+ SLOT3_TYPE, DATA_CENTER3, 1, 0, 0);
+ }
+
Y_UNIT_TEST(TestAllocateExactSlotsMissing) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 4, 3, 1,
- SLOT2_TYPE, DATA_CENTER2, 5, 3, 2,
- SLOT3_TYPE, DATA_CENTER3, 6, 3, 3);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 18, 18, 18}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 4, 0, 1,
- SLOT2_TYPE, DATA_CENTER2, 5, 0, 2,
- SLOT3_TYPE, DATA_CENTER3, 6, 0, 3);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 4, 3, 1,
+ SLOT2_TYPE, DATA_CENTER2, 5, 3, 2,
+ SLOT3_TYPE, DATA_CENTER3, 6, 3, 3);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 18, 18, 18}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 4, 0, 1,
+ SLOT2_TYPE, DATA_CENTER2, 5, 0, 2,
+ SLOT3_TYPE, DATA_CENTER3, 6, 0, 3);
+ }
+
Y_UNIT_TEST(TestAllocateTypedSlots) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 3, 3, 0,
- SLOT2_TYPE, ANY_DATA_CENTER, 2, 2, 0,
- SLOT3_TYPE, ANY_DATA_CENTER, 1, 1, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 10, 10, 10}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 3, 0, 0,
- SLOT2_TYPE, ANY_DATA_CENTER, 2, 0, 0,
- SLOT3_TYPE, ANY_DATA_CENTER, 1, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 3, 3, 0,
+ SLOT2_TYPE, ANY_DATA_CENTER, 2, 2, 0,
+ SLOT3_TYPE, ANY_DATA_CENTER, 1, 1, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 10, 10, 10}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 3, 0, 0,
+ SLOT2_TYPE, ANY_DATA_CENTER, 2, 0, 0,
+ SLOT3_TYPE, ANY_DATA_CENTER, 1, 0, 0);
+ }
+
Y_UNIT_TEST(TestAllocateTypedSlotsAll) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 9, 9, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 9, 9, 9}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 9, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 9, 9, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 9, 9, 9}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 9, 0, 0);
+ }
+
Y_UNIT_TEST(TestAllocateTypedSlotsMissing) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 10, 9, 1);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 9, 9, 9}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 10, 0, 1);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 10, 9, 1);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 9, 9, 9}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 10, 0, 1);
+ }
+
Y_UNIT_TEST(TestAllocateLocatedSlots) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- ANY_SLOT_TYPE, DATA_CENTER1, 3, 3, 0,
- ANY_SLOT_TYPE, DATA_CENTER2, 3, 3, 0,
- ANY_SLOT_TYPE, DATA_CENTER3, 3, 3, 0);
- // Expect small + medium + large from each data center.
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 18, 18, 18}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- ANY_SLOT_TYPE, DATA_CENTER1, 3, 0, 0,
- ANY_SLOT_TYPE, DATA_CENTER2, 3, 0, 0,
- ANY_SLOT_TYPE, DATA_CENTER3, 3, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ ANY_SLOT_TYPE, DATA_CENTER1, 3, 3, 0,
+ ANY_SLOT_TYPE, DATA_CENTER2, 3, 3, 0,
+ ANY_SLOT_TYPE, DATA_CENTER3, 3, 3, 0);
+ // Expect small + medium + large from each data center.
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 18, 18, 18}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ ANY_SLOT_TYPE, DATA_CENTER1, 3, 0, 0,
+ ANY_SLOT_TYPE, DATA_CENTER2, 3, 0, 0,
+ ANY_SLOT_TYPE, DATA_CENTER3, 3, 0, 0);
+ }
+
Y_UNIT_TEST(TestAllocateLocatedSlotsAll) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- ANY_SLOT_TYPE, DATA_CENTER1, 9, 9, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 18, 18, 18}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- ANY_SLOT_TYPE, DATA_CENTER1, 9, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ ANY_SLOT_TYPE, DATA_CENTER1, 9, 9, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 18, 18, 18}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ ANY_SLOT_TYPE, DATA_CENTER1, 9, 0, 0);
+ }
+
Y_UNIT_TEST(TestAllocateLocatedSlotsMissing) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- ANY_SLOT_TYPE, DATA_CENTER1, 10, 9, 1);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 18, 18, 18}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- ANY_SLOT_TYPE, DATA_CENTER1, 10, 0, 1);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ ANY_SLOT_TYPE, DATA_CENTER1, 10, 9, 1);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 18, 18, 18}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ ANY_SLOT_TYPE, DATA_CENTER1, 10, 0, 1);
+ }
+
Y_UNIT_TEST(TestAlterMoreStrictAndKeep) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 1, 0, 0,
- ANY_SLOT_TYPE, DATA_CENTER1, 1, 0, 0,
- ANY_SLOT_TYPE, ANY_DATA_CENTER, 1, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 1, 0, 0,
+ ANY_SLOT_TYPE, DATA_CENTER1, 1, 0, 0,
+ ANY_SLOT_TYPE, ANY_DATA_CENTER, 1, 0, 0);
+ }
+
Y_UNIT_TEST(TestAlterLessStrictDataCenterAndKeep) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 3, 3, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 3, 0, 0);
- // Expect we got 1 slot from each data center.
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 1, 0, 0,
- SLOT1_TYPE, DATA_CENTER2, 1, 0, 0,
- SLOT1_TYPE, DATA_CENTER3, 1, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 3, 3, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 3, 0, 0);
+ // Expect we got 1 slot from each data center.
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 1, 0, 0,
+ SLOT1_TYPE, DATA_CENTER2, 1, 0, 0,
+ SLOT1_TYPE, DATA_CENTER3, 1, 0, 0);
+ }
+
Y_UNIT_TEST(TestAlterLessStrictTypeAndKeep) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- ANY_SLOT_TYPE, DATA_CENTER1, 3, 3, 0);
- // Expect we got 1 slot of each type.
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 6, 6, 6}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- ANY_SLOT_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 1, 0, 0,
- SLOT2_TYPE, DATA_CENTER1, 1, 0, 0,
- SLOT3_TYPE, DATA_CENTER1, 1, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ ANY_SLOT_TYPE, DATA_CENTER1, 3, 3, 0);
+ // Expect we got 1 slot of each type.
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 6, 6, 6}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ ANY_SLOT_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 1, 0, 0,
+ SLOT2_TYPE, DATA_CENTER1, 1, 0, 0,
+ SLOT3_TYPE, DATA_CENTER1, 1, 0, 0);
+ }
+
Y_UNIT_TEST(TestAlterLessStrictTypeAndDataCenterAndKeep) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- ANY_SLOT_TYPE, ANY_DATA_CENTER, 9, 9, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 18, 18, 18}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- ANY_SLOT_TYPE, ANY_DATA_CENTER, 9, 0, 0);
- // Expect we got 1 slot of each type in each data center
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 1, 0, 0,
- SLOT2_TYPE, DATA_CENTER1, 1, 0, 0,
- SLOT3_TYPE, DATA_CENTER1, 1, 0, 0,
- SLOT1_TYPE, DATA_CENTER2, 1, 0, 0,
- SLOT2_TYPE, DATA_CENTER2, 1, 0, 0,
- SLOT3_TYPE, DATA_CENTER2, 1, 0, 0,
- SLOT1_TYPE, DATA_CENTER3, 1, 0, 0,
- SLOT2_TYPE, DATA_CENTER3, 1, 0, 0,
- SLOT3_TYPE, DATA_CENTER3, 1, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ ANY_SLOT_TYPE, ANY_DATA_CENTER, 9, 9, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 18, 18, 18}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ ANY_SLOT_TYPE, ANY_DATA_CENTER, 9, 0, 0);
+ // Expect we got 1 slot of each type in each data center
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 1, 0, 0,
+ SLOT2_TYPE, DATA_CENTER1, 1, 0, 0,
+ SLOT3_TYPE, DATA_CENTER1, 1, 0, 0,
+ SLOT1_TYPE, DATA_CENTER2, 1, 0, 0,
+ SLOT2_TYPE, DATA_CENTER2, 1, 0, 0,
+ SLOT3_TYPE, DATA_CENTER2, 1, 0, 0,
+ SLOT1_TYPE, DATA_CENTER3, 1, 0, 0,
+ SLOT2_TYPE, DATA_CENTER3, 1, 0, 0,
+ SLOT3_TYPE, DATA_CENTER3, 1, 0, 0);
+ }
+
Y_UNIT_TEST(TestAlterAndDontKeep) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 1, 0, 0,
- SLOT2_TYPE, DATA_CENTER1, 1, 1, 0,
- SLOT1_TYPE, DATA_CENTER2, 1, 1, 0,
- SLOT2_TYPE, DATA_CENTER2, 1, 1, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 6, 6, 6}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 1, 0, 0,
- SLOT2_TYPE, DATA_CENTER1, 1, 0, 0,
- SLOT1_TYPE, DATA_CENTER2, 1, 0, 0,
- SLOT2_TYPE, DATA_CENTER2, 1, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 1, 0, 0,
+ SLOT2_TYPE, DATA_CENTER1, 1, 1, 0,
+ SLOT1_TYPE, DATA_CENTER2, 1, 1, 0,
+ SLOT2_TYPE, DATA_CENTER2, 1, 1, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 6, 6, 6}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 1, 0, 0,
+ SLOT2_TYPE, DATA_CENTER1, 1, 0, 0,
+ SLOT1_TYPE, DATA_CENTER2, 1, 0, 0,
+ SLOT2_TYPE, DATA_CENTER2, 1, 0, 0);
+ }
+
Y_UNIT_TEST(TestAlterIncrease) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 1, 1, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 1, 1, 1}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 1, 0, 0);
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 2, 1, 0,
- SLOT2_TYPE, DATA_CENTER1, 1, 1, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 4, 4, 4}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 2, 0, 0,
- SLOT2_TYPE, DATA_CENTER1, 1, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 1, 1, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 1, 1, 1}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 1, 0, 0);
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 2, 1, 0,
+ SLOT2_TYPE, DATA_CENTER1, 1, 1, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 4, 4, 4}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 2, 0, 0,
+ SLOT2_TYPE, DATA_CENTER1, 1, 0, 0);
+ }
+
Y_UNIT_TEST(TestAlterDecrease) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 2, 0, 0,
- SLOT2_TYPE, DATA_CENTER1, 1, 1, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 4, 4, 4}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 2, 0, 0,
- SLOT2_TYPE, DATA_CENTER1, 1, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 2, 0, 0,
+ SLOT2_TYPE, DATA_CENTER1, 1, 1, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 4, 4, 4}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 2, 0, 0,
+ SLOT2_TYPE, DATA_CENTER1, 1, 0, 0);
+ }
+
Y_UNIT_TEST(TestAlterRemove) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER1, 3, 3, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3},
- {TENANT1_2_NAME, 6, 6, 6}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckAlterTenant(runtime, TENANT1_1_NAME);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_2_NAME, 6, 6, 6}}});
- CheckTenantState(runtime, TENANT1_1_NAME);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER1, 3, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER1, 3, 3, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3},
+ {TENANT1_2_NAME, 6, 6, 6}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckAlterTenant(runtime, TENANT1_1_NAME);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_2_NAME, 6, 6, 6}}});
+ CheckTenantState(runtime, TENANT1_1_NAME);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER1, 3, 0, 0);
+ }
+
Y_UNIT_TEST(TestMoveSlotToAnotherTenant) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 2, 2, 0);
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, DATA_CENTER1, 2, 1, 1);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 2, 2, 2},
- {TENANT1_2_NAME, 1, 1, 1}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 2, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, DATA_CENTER1, 2, 0, 1);
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 1, 0, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 1, 1, 1},
- {TENANT1_2_NAME, 2, 2, 2}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 1, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, DATA_CENTER1, 2, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 2, 2, 0);
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 2, 1, 1);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 2, 2, 2},
+ {TENANT1_2_NAME, 1, 1, 1}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 2, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 2, 0, 1);
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 1, 0, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 1, 1, 1},
+ {TENANT1_2_NAME, 2, 2, 2}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 1, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 2, 0, 0);
+ }
+
Y_UNIT_TEST(TestMoveSlotWithFairShare) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 9, 9, 0);
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
- CheckAlterTenant(runtime, TENANT1_3_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
- CheckAlterTenant(runtime, TENANT1_4_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 9, 9, 9}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 9, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
- CheckTenantState(runtime, TENANT1_3_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
- CheckTenantState(runtime, TENANT1_4_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 3, 0, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3},
- {TENANT1_2_NAME, 2, 2, 2},
- {TENANT1_3_NAME, 2, 2, 2},
- {TENANT1_4_NAME, 2, 2, 2}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 2);
- CheckTenantState(runtime, TENANT1_3_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 2);
- CheckTenantState(runtime, TENANT1_4_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 2);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 9, 9, 0);
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
+ CheckAlterTenant(runtime, TENANT1_3_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
+ CheckAlterTenant(runtime, TENANT1_4_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 9, 9, 9}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 9, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
+ CheckTenantState(runtime, TENANT1_3_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
+ CheckTenantState(runtime, TENANT1_4_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 4);
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 3, 0, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3},
+ {TENANT1_2_NAME, 2, 2, 2},
+ {TENANT1_3_NAME, 2, 2, 2},
+ {TENANT1_4_NAME, 2, 2, 2}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 2);
+ CheckTenantState(runtime, TENANT1_3_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 2);
+ CheckTenantState(runtime, TENANT1_4_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 4, 0, 2);
+ }
+
Y_UNIT_TEST(TestDisconnectAndReconnect) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 9, 9, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 9, 9, 9}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 9, 0, 0);
-
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(1), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(2), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 6, 6, 6},
- {TENANT1_1_NAME, 6, 6, 6}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 9, 0, 3);
-
- runtime.CreateTenantPool(0);
- runtime.CreateTenantPool(1);
- runtime.CreateTenantPool(2);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 9, 9, 9}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 9, 0, 0);
-
- // Check counters are correct.
- for (ui32 i = 0; i < runtime.GetNodeCount(); ++i)
- {
- auto tablets = GetServiceCounters(runtime.GetDynamicCounters(i), "tablets");
- auto tsb = tablets->FindSubgroup("type", "TENANT_SLOT_BROKER");
-
- if (tsb) {
- auto slot = tsb->GetSubgroup("SlotType", SLOT1_TYPE);
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 9, 9, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 9, 9, 9}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 9, 0, 0);
+
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(1), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(2), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 6, 6, 6},
+ {TENANT1_1_NAME, 6, 6, 6}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 9, 0, 3);
+
+ runtime.CreateTenantPool(0);
+ runtime.CreateTenantPool(1);
+ runtime.CreateTenantPool(2);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 9, 9, 9}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 9, 0, 0);
+
+ // Check counters are correct.
+ for (ui32 i = 0; i < runtime.GetNodeCount(); ++i)
+ {
+ auto tablets = GetServiceCounters(runtime.GetDynamicCounters(i), "tablets");
+ auto tsb = tablets->FindSubgroup("type", "TENANT_SLOT_BROKER");
+
+ if (tsb) {
+ auto slot = tsb->GetSubgroup("SlotType", SLOT1_TYPE);
UNIT_ASSERT_VALUES_EQUAL(slot->GetSubgroup("SlotDataCenter", ANY_DATA_CENTER)
- ->GetCounter("FreeSlots")->Val(), 0);
+ ->GetCounter("FreeSlots")->Val(), 0);
UNIT_ASSERT_VALUES_EQUAL(slot->GetSubgroup("SlotDataCenter", ANY_DATA_CENTER)
- ->GetCounter("AssignedSlots")->Val(), 0);
+ ->GetCounter("AssignedSlots")->Val(), 0);
UNIT_ASSERT_VALUES_EQUAL(slot->GetSubgroup("SlotDataCenter", ANY_DATA_CENTER)
- ->GetCounter("ConnectedSlots")->Val(), 0);
+ ->GetCounter("ConnectedSlots")->Val(), 0);
UNIT_ASSERT_VALUES_EQUAL(slot->GetSubgroup("SlotDataCenter", ANY_DATA_CENTER)
- ->GetCounter("DisconnectedSlots")->Val(), 0);
+ ->GetCounter("DisconnectedSlots")->Val(), 0);
UNIT_ASSERT_VALUES_EQUAL(slot->GetSubgroup("SlotDataCenter", ANY_DATA_CENTER)
- ->GetCounter("RequiredSlots")->Val(), 9);
+ ->GetCounter("RequiredSlots")->Val(), 9);
UNIT_ASSERT_VALUES_EQUAL(slot->GetSubgroup("SlotDataCenter", ANY_DATA_CENTER)
- ->GetCounter("MissingSlots")->Val(), 0);
+ ->GetCounter("MissingSlots")->Val(), 0);
UNIT_ASSERT_VALUES_EQUAL(slot->GetSubgroup("SlotDataCenter", ANY_DATA_CENTER)
- ->GetCounter("PendingSlots")->Val(), 0);
+ ->GetCounter("PendingSlots")->Val(), 0);
for (auto &dc : TVector<TString>({DATA_CENTER1, DATA_CENTER2, DATA_CENTER3})) {
UNIT_ASSERT_VALUES_EQUAL(slot->GetSubgroup("SlotDataCenter", dc)
- ->GetCounter("FreeSlots")->Val(), 0);
+ ->GetCounter("FreeSlots")->Val(), 0);
UNIT_ASSERT_VALUES_EQUAL(slot->GetSubgroup("SlotDataCenter", dc)
- ->GetCounter("AssignedSlots")->Val(), 3);
+ ->GetCounter("AssignedSlots")->Val(), 3);
UNIT_ASSERT_VALUES_EQUAL(slot->GetSubgroup("SlotDataCenter", dc)
- ->GetCounter("ConnectedSlots")->Val(), 3);
+ ->GetCounter("ConnectedSlots")->Val(), 3);
UNIT_ASSERT_VALUES_EQUAL(slot->GetSubgroup("SlotDataCenter", dc)
- ->GetCounter("DisconnectedSlots")->Val(), 0);
- }
- break;
- }
- }
- }
-
+ ->GetCounter("DisconnectedSlots")->Val(), 0);
+ }
+ break;
+ }
+ }
+ }
+
Y_UNIT_TEST(TestAddSlotToPool) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 7, 6, 1);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3},
- {TENANT1_2_NAME, 6, 6, 6}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 7, 0, 1);
-
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 2, 2, 2},
- {TENANT1_2_NAME, 6, 6, 6}}});
-
- runtime.CreateTenantPool(0, DoubleTenantPoolConfig());
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3},
- {TENANT1_2_NAME, 7, 7, 7}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, ANY_DATA_CENTER, 7, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 7, 6, 1);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3},
+ {TENANT1_2_NAME, 6, 6, 6}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 7, 0, 1);
+
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 2, 2, 2},
+ {TENANT1_2_NAME, 6, 6, 6}}});
+
+ runtime.CreateTenantPool(0, DoubleTenantPoolConfig());
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3},
+ {TENANT1_2_NAME, 7, 7, 7}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, ANY_DATA_CENTER, 7, 0, 0);
+ }
+
Y_UNIT_TEST(TestRemoveSlotFromPool) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
-
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 2, 2, 2}}});
- runtime.CreateTenantPool(0, ShrinkTenantPoolConfig());
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 2, 2, 2}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 1);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 2, 2, 2}}});
+ runtime.CreateTenantPool(0, ShrinkTenantPoolConfig());
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 2, 2, 2}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 1);
+ }
+
Y_UNIT_TEST(TestChangeSlotType) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER1, 4, 3, 1);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3},
- {TENANT1_2_NAME, 6, 6, 6}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER1, 4, 0, 1);
-
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 2, 2, 2},
- {TENANT1_2_NAME, 4, 4, 4}}});
- runtime.CreateTenantPool(0, ModifiedTypeTenantPoolConfig());
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 2, 2, 2},
- {TENANT1_2_NAME, 8, 8, 8}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 1);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER1, 4, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER1, 4, 3, 1);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3},
+ {TENANT1_2_NAME, 6, 6, 6}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER1, 4, 0, 1);
+
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 2, 2, 2},
+ {TENANT1_2_NAME, 4, 4, 4}}});
+ runtime.CreateTenantPool(0, ModifiedTypeTenantPoolConfig());
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 2, 2, 2},
+ {TENANT1_2_NAME, 8, 8, 8}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 1);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER1, 4, 0, 0);
+ }
+
Y_UNIT_TEST(TestChangeSlotOwner) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT2_TYPE, DATA_CENTER1, 3, 3, 0);
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 6, 6, 6},
- {TENANT1_2_NAME, 3, 3, 3}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT2_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
-
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
- {TENANT1_1_NAME, 4, 4, 4},
- {TENANT1_2_NAME, 2, 2, 2}}});
- runtime.CreateTenantPool(0, AssignedTenantPoolConfig());
-
- TAutoPtr<IEventHandle> captured = nullptr;
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT2_TYPE, DATA_CENTER1, 3, 3, 0);
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 6, 6, 6},
+ {TENANT1_2_NAME, 3, 3, 3}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT2_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 8, 8, 8},
+ {TENANT1_1_NAME, 4, 4, 4},
+ {TENANT1_2_NAME, 2, 2, 2}}});
+ runtime.CreateTenantPool(0, AssignedTenantPoolConfig());
+
+ TAutoPtr<IEventHandle> captured = nullptr;
auto captureRegister = [&captured](TTestActorRuntimeBase&, TAutoPtr<IEventHandle> &event) -> auto {
- if (event->GetTypeRewrite() == TEvTenantSlotBroker::EvRegisterPool
- && !captured) {
- captured = event;
- return TTestActorRuntime::EEventAction::DROP;
- }
- return TTestActorRuntime::EEventAction::PROCESS;
- };
-
- // Static assignemt with mixed slots should take place first.
- runtime.SetObserverFunc(captureRegister);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 5, 5, 5},
- {TENANT1_2_NAME, 4, 4, 4},
- {TENANT1_3_NAME, 3, 3, 3}}});
- runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
- if (captured)
- runtime.Send(captured.Release());
- // But should be fixed later by broker.
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 6, 6, 6},
- {TENANT1_2_NAME, 3, 3, 3}}});
-
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT2_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
- }
-
+ if (event->GetTypeRewrite() == TEvTenantSlotBroker::EvRegisterPool
+ && !captured) {
+ captured = event;
+ return TTestActorRuntime::EEventAction::DROP;
+ }
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+
+ // Static assignemt with mixed slots should take place first.
+ runtime.SetObserverFunc(captureRegister);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 5, 5, 5},
+ {TENANT1_2_NAME, 4, 4, 4},
+ {TENANT1_3_NAME, 3, 3, 3}}});
+ runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
+ if (captured)
+ runtime.Send(captured.Release());
+ // But should be fixed later by broker.
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 6, 6, 6},
+ {TENANT1_2_NAME, 3, 3, 3}}});
+
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT2_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+ }
+
Y_UNIT_TEST(TestRestartTablet) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER2, 3, 3, 0);
- CheckAlterTenant(runtime, TENANT1_3_NAME,
- SLOT3_TYPE, DATA_CENTER3, 3, 3, 0);
- CheckAlterTenant(runtime, TENANT1_4_NAME,
- SLOT3_TYPE, DATA_CENTER1, 3, 3, 0,
- SLOT1_TYPE, DATA_CENTER2, 3, 3, 0,
- SLOT2_TYPE, DATA_CENTER3, 3, 3, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3},
- {TENANT1_2_NAME, 6, 6, 6},
- {TENANT1_3_NAME, 9, 9, 9},
- {TENANT1_4_NAME, 18, 18, 18}}});
-
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(1), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(2), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 6, 6, 6},
- {TENANT1_1_NAME, 2, 2, 2},
- {TENANT1_2_NAME, 4, 4, 4},
- {TENANT1_3_NAME, 6, 6, 6},
- {TENANT1_4_NAME, 12, 12, 12}}});
-
- runtime.Register(CreateTabletKiller(MakeTenantSlotBrokerID(0)));
- runtime.CreateTenantPool(0);
- runtime.CreateTenantPool(1);
- runtime.CreateTenantPool(2);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3},
- {TENANT1_2_NAME, 6, 6, 6},
- {TENANT1_3_NAME, 9, 9, 9},
- {TENANT1_4_NAME, 18, 18, 18}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER2, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_3_NAME,
- SLOT3_TYPE, DATA_CENTER3, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_4_NAME,
- SLOT3_TYPE, DATA_CENTER1, 3, 0, 0,
- SLOT1_TYPE, DATA_CENTER2, 3, 0, 0,
- SLOT2_TYPE, DATA_CENTER3, 3, 0, 0);
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER2, 3, 3, 0);
+ CheckAlterTenant(runtime, TENANT1_3_NAME,
+ SLOT3_TYPE, DATA_CENTER3, 3, 3, 0);
+ CheckAlterTenant(runtime, TENANT1_4_NAME,
+ SLOT3_TYPE, DATA_CENTER1, 3, 3, 0,
+ SLOT1_TYPE, DATA_CENTER2, 3, 3, 0,
+ SLOT2_TYPE, DATA_CENTER3, 3, 3, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3},
+ {TENANT1_2_NAME, 6, 6, 6},
+ {TENANT1_3_NAME, 9, 9, 9},
+ {TENANT1_4_NAME, 18, 18, 18}}});
+
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(1), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(2), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 6, 6, 6},
+ {TENANT1_1_NAME, 2, 2, 2},
+ {TENANT1_2_NAME, 4, 4, 4},
+ {TENANT1_3_NAME, 6, 6, 6},
+ {TENANT1_4_NAME, 12, 12, 12}}});
+
+ runtime.Register(CreateTabletKiller(MakeTenantSlotBrokerID(0)));
+ runtime.CreateTenantPool(0);
+ runtime.CreateTenantPool(1);
+ runtime.CreateTenantPool(2);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3},
+ {TENANT1_2_NAME, 6, 6, 6},
+ {TENANT1_3_NAME, 9, 9, 9},
+ {TENANT1_4_NAME, 18, 18, 18}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER2, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_3_NAME,
+ SLOT3_TYPE, DATA_CENTER3, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_4_NAME,
+ SLOT3_TYPE, DATA_CENTER1, 3, 0, 0,
+ SLOT1_TYPE, DATA_CENTER2, 3, 0, 0,
+ SLOT2_TYPE, DATA_CENTER3, 3, 0, 0);
+ }
+
Y_UNIT_TEST(TestListTenants) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER2, 3, 3, 0);
- CheckAlterTenant(runtime, TENANT1_3_NAME,
- SLOT3_TYPE, DATA_CENTER3, 3, 3, 0);
- CheckAlterTenant(runtime, TENANT1_4_NAME,
- SLOT3_TYPE, DATA_CENTER1, 3, 3, 0,
- SLOT1_TYPE, DATA_CENTER2, 3, 3, 0,
- SLOT2_TYPE, DATA_CENTER3, 3, 3, 0);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3},
- {TENANT1_2_NAME, 6, 6, 6},
- {TENANT1_3_NAME, 9, 9, 9},
- {TENANT1_4_NAME, 18, 18, 18}}});
-
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER2, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_3_NAME,
- SLOT3_TYPE, DATA_CENTER3, 3, 0, 0);
- CheckTenantState(runtime, TENANT1_4_NAME,
- SLOT3_TYPE, DATA_CENTER1, 3, 0, 0,
- SLOT1_TYPE, DATA_CENTER2, 3, 0, 0,
- SLOT2_TYPE, DATA_CENTER3, 3, 0, 0);
-
- CheckTenantsList(runtime,
- {{ {TENANT1_1_NAME, {{ {SLOT1_TYPE, DATA_CENTER1, 3, 0, 0} }}},
- {TENANT1_2_NAME, {{ {SLOT2_TYPE, DATA_CENTER2, 3, 0, 0} }}},
- {TENANT1_3_NAME, {{ {SLOT3_TYPE, DATA_CENTER3, 3, 0, 0} }}},
- {TENANT1_4_NAME, {{ {SLOT3_TYPE, DATA_CENTER1, 3, 0, 0},
- {SLOT1_TYPE, DATA_CENTER2, 3, 0, 0},
- {SLOT2_TYPE, DATA_CENTER3, 3, 0, 0} }}} }});
- }
-
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0);
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER2, 3, 3, 0);
+ CheckAlterTenant(runtime, TENANT1_3_NAME,
+ SLOT3_TYPE, DATA_CENTER3, 3, 3, 0);
+ CheckAlterTenant(runtime, TENANT1_4_NAME,
+ SLOT3_TYPE, DATA_CENTER1, 3, 3, 0,
+ SLOT1_TYPE, DATA_CENTER2, 3, 3, 0,
+ SLOT2_TYPE, DATA_CENTER3, 3, 3, 0);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3},
+ {TENANT1_2_NAME, 6, 6, 6},
+ {TENANT1_3_NAME, 9, 9, 9},
+ {TENANT1_4_NAME, 18, 18, 18}}});
+
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER2, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_3_NAME,
+ SLOT3_TYPE, DATA_CENTER3, 3, 0, 0);
+ CheckTenantState(runtime, TENANT1_4_NAME,
+ SLOT3_TYPE, DATA_CENTER1, 3, 0, 0,
+ SLOT1_TYPE, DATA_CENTER2, 3, 0, 0,
+ SLOT2_TYPE, DATA_CENTER3, 3, 0, 0);
+
+ CheckTenantsList(runtime,
+ {{ {TENANT1_1_NAME, {{ {SLOT1_TYPE, DATA_CENTER1, 3, 0, 0} }}},
+ {TENANT1_2_NAME, {{ {SLOT2_TYPE, DATA_CENTER2, 3, 0, 0} }}},
+ {TENANT1_3_NAME, {{ {SLOT3_TYPE, DATA_CENTER3, 3, 0, 0} }}},
+ {TENANT1_4_NAME, {{ {SLOT3_TYPE, DATA_CENTER1, 3, 0, 0},
+ {SLOT1_TYPE, DATA_CENTER2, 3, 0, 0},
+ {SLOT2_TYPE, DATA_CENTER3, 3, 0, 0} }}} }});
+ }
+
Y_UNIT_TEST(TestRandom) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
-
- constexpr int NITERS = 10;
-
- TVector<TString> type = {SLOT1_TYPE, SLOT2_TYPE, SLOT3_TYPE};
- TVector<ui64> size = {1, 2, 3};
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+
+ constexpr int NITERS = 10;
+
+ TVector<TString> type = {SLOT1_TYPE, SLOT2_TYPE, SLOT3_TYPE};
+ TVector<ui64> size = {1, 2, 3};
TVector<TString> dc = {DATA_CENTER1, DATA_CENTER2, DATA_CENTER3};
- TVector<TString> tenants = {TENANT1_1_NAME, TENANT1_2_NAME, TENANT1_3_NAME, TENANT1_4_NAME};
- for (int i = 0; i < NITERS; ++i) {
- TVector<TVector<ui64>> freeSlots = { {{3, 3, 3}}, {{3, 3, 3}}, {{3, 3, 3}} };
- TVector<TVector<TVector<ui64>>> counts = {
- {{ {{0, 0, 0}}, {{0, 0, 0}}, {{0, 0, 0}} }},
- {{ {{0, 0, 0}}, {{0, 0, 0}}, {{0, 0, 0}} }},
- {{ {{0, 0, 0}}, {{0, 0, 0}}, {{0, 0, 0}} }},
- {{ {{0, 0, 0}}, {{0, 0, 0}}, {{0, 0, 0}} }} };
- TVector<ui64> res = { 0, 0, 0, 0 };
- TSet<ui32> poolsToRestart;
-
- for (int u = 0; u < 4; ++u) {
- for (int t = 0; t < 3; ++t)
- for (int d = 0; d < 3; ++d) {
- if (u < 3)
- counts[u][t][d] = RandomNumber<ui64>(freeSlots[t][d] + 1);
- else
- counts[u][t][d] = freeSlots[t][d];;
- freeSlots[t][d] -= counts[u][t][d];
- res[u] += counts[u][t][d] * size[t];
- }
- AlterTenant(runtime, tenants[u],
- type[0], dc[0], counts[u][0][0], 0, 0,
- type[0], dc[1], counts[u][0][1], 0, 0,
- type[0], dc[2], counts[u][0][2], 0, 0,
- type[1], dc[0], counts[u][1][0], 0, 0,
- type[1], dc[1], counts[u][1][1], 0, 0,
- type[1], dc[2], counts[u][1][2], 0, 0,
- type[2], dc[0], counts[u][2][0], 0, 0,
- type[2], dc[1], counts[u][2][1], 0, 0,
- type[2], dc[2], counts[u][2][2], 0, 0);
-
- bool restartBroker = RandomNumber<ui64>(2) > 0;
- bool restartNode = RandomNumber<ui64>(2) > 0;
- if (restartBroker)
- runtime.Register(CreateTabletKiller(MakeTenantSlotBrokerID(0)));
-
- if (restartNode && false) {
- ui32 nodeId = RandomNumber<ui32>(runtime.GetNodeCount());
+ TVector<TString> tenants = {TENANT1_1_NAME, TENANT1_2_NAME, TENANT1_3_NAME, TENANT1_4_NAME};
+ for (int i = 0; i < NITERS; ++i) {
+ TVector<TVector<ui64>> freeSlots = { {{3, 3, 3}}, {{3, 3, 3}}, {{3, 3, 3}} };
+ TVector<TVector<TVector<ui64>>> counts = {
+ {{ {{0, 0, 0}}, {{0, 0, 0}}, {{0, 0, 0}} }},
+ {{ {{0, 0, 0}}, {{0, 0, 0}}, {{0, 0, 0}} }},
+ {{ {{0, 0, 0}}, {{0, 0, 0}}, {{0, 0, 0}} }},
+ {{ {{0, 0, 0}}, {{0, 0, 0}}, {{0, 0, 0}} }} };
+ TVector<ui64> res = { 0, 0, 0, 0 };
+ TSet<ui32> poolsToRestart;
+
+ for (int u = 0; u < 4; ++u) {
+ for (int t = 0; t < 3; ++t)
+ for (int d = 0; d < 3; ++d) {
+ if (u < 3)
+ counts[u][t][d] = RandomNumber<ui64>(freeSlots[t][d] + 1);
+ else
+ counts[u][t][d] = freeSlots[t][d];;
+ freeSlots[t][d] -= counts[u][t][d];
+ res[u] += counts[u][t][d] * size[t];
+ }
+ AlterTenant(runtime, tenants[u],
+ type[0], dc[0], counts[u][0][0], 0, 0,
+ type[0], dc[1], counts[u][0][1], 0, 0,
+ type[0], dc[2], counts[u][0][2], 0, 0,
+ type[1], dc[0], counts[u][1][0], 0, 0,
+ type[1], dc[1], counts[u][1][1], 0, 0,
+ type[1], dc[2], counts[u][1][2], 0, 0,
+ type[2], dc[0], counts[u][2][0], 0, 0,
+ type[2], dc[1], counts[u][2][1], 0, 0,
+ type[2], dc[2], counts[u][2][2], 0, 0);
+
+ bool restartBroker = RandomNumber<ui64>(2) > 0;
+ bool restartNode = RandomNumber<ui64>(2) > 0;
+ if (restartBroker)
+ runtime.Register(CreateTabletKiller(MakeTenantSlotBrokerID(0)));
+
+ if (restartNode && false) {
+ ui32 nodeId = RandomNumber<ui32>(runtime.GetNodeCount());
if (!poolsToRestart.contains(nodeId)) {
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(nodeId), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- poolsToRestart.insert(nodeId);
- }
- }
-
- if (restartBroker) {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- runtime.DispatchEvents(options);
- }
- }
-
- bool restartBroker = RandomNumber<ui64>(2) > 0;
- if (restartBroker)
- RestartTenantSlotBroker(runtime);
-
- for (auto nodeId : poolsToRestart)
- runtime.CreateTenantPool(nodeId);
- poolsToRestart.clear();
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {tenants[0], res[0], res[0], res[0]},
- {tenants[1], res[1], res[1], res[1]},
- {tenants[2], res[2], res[2], res[2]},
- {tenants[3], res[3], res[3], res[3]}}});
-
- for (int u = 0; u < 4; ++u)
- CheckTenantState(runtime, tenants[u],
- type[0], dc[0], counts[u][0][0], 0, 0,
- type[0], dc[1], counts[u][0][1], 0, 0,
- type[0], dc[2], counts[u][0][2], 0, 0,
- type[1], dc[0], counts[u][1][0], 0, 0,
- type[1], dc[1], counts[u][1][1], 0, 0,
- type[1], dc[2], counts[u][1][2], 0, 0,
- type[2], dc[0], counts[u][2][0], 0, 0,
- type[2], dc[1], counts[u][2][1], 0, 0,
- type[2], dc[2], counts[u][2][2], 0, 0);
- }
- }
-
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(nodeId), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ poolsToRestart.insert(nodeId);
+ }
+ }
+
+ if (restartBroker) {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ runtime.DispatchEvents(options);
+ }
+ }
+
+ bool restartBroker = RandomNumber<ui64>(2) > 0;
+ if (restartBroker)
+ RestartTenantSlotBroker(runtime);
+
+ for (auto nodeId : poolsToRestart)
+ runtime.CreateTenantPool(nodeId);
+ poolsToRestart.clear();
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {tenants[0], res[0], res[0], res[0]},
+ {tenants[1], res[1], res[1], res[1]},
+ {tenants[2], res[2], res[2], res[2]},
+ {tenants[3], res[3], res[3], res[3]}}});
+
+ for (int u = 0; u < 4; ++u)
+ CheckTenantState(runtime, tenants[u],
+ type[0], dc[0], counts[u][0][0], 0, 0,
+ type[0], dc[1], counts[u][0][1], 0, 0,
+ type[0], dc[2], counts[u][0][2], 0, 0,
+ type[1], dc[0], counts[u][1][0], 0, 0,
+ type[1], dc[1], counts[u][1][1], 0, 0,
+ type[1], dc[2], counts[u][1][2], 0, 0,
+ type[2], dc[0], counts[u][2][0], 0, 0,
+ type[2], dc[1], counts[u][2][1], 0, 0,
+ type[2], dc[2], counts[u][2][2], 0, 0);
+ }
+ }
+
Y_UNIT_TEST(TestSlotLabels) {
- TTenantTestRuntime runtime(TenantTestConfigSingleSlot());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 1, 1, 0);
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER1, 1, 1, 0);
-
- runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1},
- {TENANT1_2_NAME, 2, 2, 2}}});
-
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT1,
- MakeSlotStatus(DOMAIN1_SLOT1, SLOT1_TYPE, TENANT1_1_NAME, 1, 1, 1, "slot-1"))}}, 0);
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT2,
- MakeSlotStatus(DOMAIN1_SLOT2, SLOT2_TYPE, TENANT1_2_NAME, 2, 2, 2, "slot-1"))}}, 1);
-
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- SLOT2_TYPE, DATA_CENTER1, 1, 0, 0,
- SLOT3_TYPE, DATA_CENTER1, 1, 1, 0);
-
- runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1},
- {TENANT1_2_NAME, 5, 5, 5}}});
-
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT3,
- MakeSlotStatus(DOMAIN1_SLOT3, SLOT3_TYPE, TENANT1_2_NAME, 3, 3, 3, "slot-2"))}}, 2);
-
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- SLOT3_TYPE, DATA_CENTER1, 1, 0, 0);
-
- runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1},
- {TENANT1_2_NAME, 3, 3, 3}}});
-
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT1,
- MakeSlotStatus(DOMAIN1_SLOT1, SLOT1_TYPE, TENANT1_1_NAME, 1, 1, 1, "slot-1"))}}, 0);
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT2,
- MakeSlotStatus(DOMAIN1_SLOT2, SLOT2_TYPE, "", 2, 2, 2, ""))}}, 1);
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT3,
- MakeSlotStatus(DOMAIN1_SLOT3, SLOT3_TYPE, TENANT1_2_NAME, 3, 3, 3, "slot-2"))}}, 2);
-
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- ANY_SLOT_TYPE, ANY_DATA_CENTER, 1, 0, 0);
-
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT1,
- MakeSlotStatus(DOMAIN1_SLOT1, SLOT1_TYPE, TENANT1_1_NAME, 1, 1, 1, "slot-1"))}}, 0);
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT2,
- MakeSlotStatus(DOMAIN1_SLOT2, SLOT2_TYPE, "", 2, 2, 2, ""))}}, 1);
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT3,
- MakeSlotStatus(DOMAIN1_SLOT3, SLOT3_TYPE, TENANT1_2_NAME, 3, 3, 3, "slot-2"))}}, 2);
-
- CheckAlterTenant(runtime, TENANT1_2_NAME,
- ANY_SLOT_TYPE, ANY_DATA_CENTER, 1, 0, 0,
- SLOT2_TYPE, DATA_CENTER1, 1, 1, 0);
-
- runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1},
- {TENANT1_2_NAME, 5, 5, 5}}});
-
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT1,
- MakeSlotStatus(DOMAIN1_SLOT1, SLOT1_TYPE, TENANT1_1_NAME, 1, 1, 1, "slot-1"))}}, 0);
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT2,
- MakeSlotStatus(DOMAIN1_SLOT2, SLOT2_TYPE, TENANT1_2_NAME, 2, 2, 2, "slot-1"))}}, 1);
- CheckTenantPoolStatus(runtime, 0,
- {{std::make_pair(DOMAIN1_SLOT3,
- MakeSlotStatus(DOMAIN1_SLOT3, SLOT3_TYPE, TENANT1_2_NAME, 3, 3, 3, "slot-2"))}}, 2);
- }
-
- Y_UNIT_TEST(TestConfigSubscription) {
- TTenantTestRuntime runtime(TenantTestConfigWithConsole());
-
- // Add config for Tenant Slot Broker and wait for notification.
- auto *event = new TEvConsole::TEvConfigureRequest;
- event->Record.AddActions()->MutableAddConfigItem()->MutableConfigItem()
- ->MutableConfig()->MutableTenantSlotBrokerConfig()->SetPendingSlotTimeout(12345);
- runtime.SendToConsole(event);
-
- struct IsConfigNotificationProcessed {
- bool operator()(IEventHandle& ev)
- {
- if (ev.GetTypeRewrite() == NConsole::TEvConsole::EvConfigNotificationRequest) {
- auto &rec = ev.Get<NConsole::TEvConsole::TEvConfigNotificationRequest>()->Record;
- if (rec.GetConfig().GetTenantSlotBrokerConfig().GetPendingSlotTimeout() == 12345) {
- SubscriptionId = rec.GetSubscriptionId();
- ConfigId.Load(rec.GetConfigId());
- }
- } else if (ev.GetTypeRewrite() == NConsole::TEvConsole::EvConfigNotificationResponse) {
- auto &rec = ev.Get<NConsole::TEvConsole::TEvConfigNotificationResponse>()->Record;
- if (SubscriptionId == rec.GetSubscriptionId()
- && ConfigId == NConsole::TConfigId(rec.GetConfigId()))
- return true;
- }
-
- return false;
- }
-
- ui64 SubscriptionId = 0;
- NConsole::TConfigId ConfigId;
- };
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back(IsConfigNotificationProcessed(), 1);
- runtime.DispatchEvents(options);
- }
-
- Y_UNIT_TEST(TestPreferredDC) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 9, 9, 0, 6, 0}});
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 9, 9, 9}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 9, 0, 0, 6, 0}});
- }
-
- Y_UNIT_TEST(TestPreferredDCDetachMisplaced) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 9, 9, 0, 6, 0}});
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 9, 9, 9}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 9, 0, 0, 6, 0}});
- // Detach 6 slots and expect only misplaced slots to be detached.
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 3, 0, 0, 0, 0}});
- }
-
- Y_UNIT_TEST(TestPreferredDCMoveMisplaced) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 3, 3, 0, 0, 0}});
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 3, 0, 0, 0, 0}});
-
- // Not enough slots in preferred DC, should get one misplaced.
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 3, 0, 0, 1, 0}});
-
- // Slot in preferred DC is back and should be used.
- runtime.CreateTenantPool(0);
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 3, 0, 0, 0, 0}});
- }
-
- Y_UNIT_TEST(TestGroupForced) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 3, 1, 0, 0}});
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 3, 3, 3}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0}});
-
- // Collocation is more important and we expect slots to be moved to another DC.
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 3, 0}});
-
- // Slot in preferred DC is back and slots should be moved again.
- runtime.CreateTenantPool(0);
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0}});
- }
-
- Y_UNIT_TEST(TestGroupRelaxed) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, false, 4, 4, 0, 1, 1}});
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 4, 4, 4}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 1, 1}});
-
- // Collocation is more important and we expect slots to be moved to another DC.
- // Split slot should be placed into preferred data center.
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 3, 1}});
-
- // Slot in preferred DC is back and slots should be moved again.
- runtime.CreateTenantPool(0);
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 1, 1}});
- }
-
- Y_UNIT_TEST(TestGroupMultipleAllocations) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 3, 1, 0, 0},
- {SLOT2_TYPE, DATA_CENTER1, false, 1, true, 4, 3, 1, 0, 0},
- {SLOT3_TYPE, DATA_CENTER1, false, 1, false, 4, 4, 0, 1, 1}});
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 21, 21, 21}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0},
- {SLOT2_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0},
- {SLOT3_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 1, 1}});
-
- // Collocation is more important and we expect slots to be moved to another DC.
- // Split slot should be placed into preferred data center.
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 3, 0},
- {SLOT2_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 3, 0},
- {SLOT3_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 3, 1}});
-
- // Slot in preferred DC is back and slots should be moved again.
- runtime.CreateTenantPool(0);
- CheckTenantState(runtime, TENANT1_1_NAME,
- {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0},
- {SLOT2_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0},
- {SLOT3_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 1, 1}});
- }
-
- Y_UNIT_TEST(TestSlotStats) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
- CheckAlterTenant(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 3, 0,
- SLOT2_TYPE, DATA_CENTER2, 2, 2, 0,
- SLOT3_TYPE, DATA_CENTER3, 1, 1, 0);
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
- {TENANT1_1_NAME, 10, 10, 10}}});
- CheckTenantState(runtime, TENANT1_1_NAME,
- SLOT1_TYPE, DATA_CENTER1, 3, 0, 0,
- SLOT2_TYPE, DATA_CENTER2, 2, 0, 0,
- SLOT3_TYPE, DATA_CENTER3, 1, 0, 0);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToBroker(new TEvTenantSlotBroker::TEvGetSlotStats);
- auto reply = runtime.GrabEdgeEventRethrow<TEvTenantSlotBroker::TEvSlotStats>(handle);
- // <type, dc> -> <connected, free>
- THashMap<std::pair<TString, TString>, std::pair<ui64, ui64>> slots;
- for (auto &rec : reply->Record.GetSlotCounters())
- slots[std::make_pair(rec.GetType(), rec.GetDataCenter())]
- = std::make_pair(rec.GetConnected(), rec.GetFree());
- UNIT_ASSERT_VALUES_EQUAL(slots.size(), 9);
+ TTenantTestRuntime runtime(TenantTestConfigSingleSlot());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 1, 1, 0);
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER1, 1, 1, 0);
+
+ runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1},
+ {TENANT1_2_NAME, 2, 2, 2}}});
+
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT1,
+ MakeSlotStatus(DOMAIN1_SLOT1, SLOT1_TYPE, TENANT1_1_NAME, 1, 1, 1, "slot-1"))}}, 0);
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT2,
+ MakeSlotStatus(DOMAIN1_SLOT2, SLOT2_TYPE, TENANT1_2_NAME, 2, 2, 2, "slot-1"))}}, 1);
+
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ SLOT2_TYPE, DATA_CENTER1, 1, 0, 0,
+ SLOT3_TYPE, DATA_CENTER1, 1, 1, 0);
+
+ runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1},
+ {TENANT1_2_NAME, 5, 5, 5}}});
+
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT3,
+ MakeSlotStatus(DOMAIN1_SLOT3, SLOT3_TYPE, TENANT1_2_NAME, 3, 3, 3, "slot-2"))}}, 2);
+
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ SLOT3_TYPE, DATA_CENTER1, 1, 0, 0);
+
+ runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1},
+ {TENANT1_2_NAME, 3, 3, 3}}});
+
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT1,
+ MakeSlotStatus(DOMAIN1_SLOT1, SLOT1_TYPE, TENANT1_1_NAME, 1, 1, 1, "slot-1"))}}, 0);
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT2,
+ MakeSlotStatus(DOMAIN1_SLOT2, SLOT2_TYPE, "", 2, 2, 2, ""))}}, 1);
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT3,
+ MakeSlotStatus(DOMAIN1_SLOT3, SLOT3_TYPE, TENANT1_2_NAME, 3, 3, 3, "slot-2"))}}, 2);
+
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ ANY_SLOT_TYPE, ANY_DATA_CENTER, 1, 0, 0);
+
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT1,
+ MakeSlotStatus(DOMAIN1_SLOT1, SLOT1_TYPE, TENANT1_1_NAME, 1, 1, 1, "slot-1"))}}, 0);
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT2,
+ MakeSlotStatus(DOMAIN1_SLOT2, SLOT2_TYPE, "", 2, 2, 2, ""))}}, 1);
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT3,
+ MakeSlotStatus(DOMAIN1_SLOT3, SLOT3_TYPE, TENANT1_2_NAME, 3, 3, 3, "slot-2"))}}, 2);
+
+ CheckAlterTenant(runtime, TENANT1_2_NAME,
+ ANY_SLOT_TYPE, ANY_DATA_CENTER, 1, 0, 0,
+ SLOT2_TYPE, DATA_CENTER1, 1, 1, 0);
+
+ runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1},
+ {TENANT1_2_NAME, 5, 5, 5}}});
+
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT1,
+ MakeSlotStatus(DOMAIN1_SLOT1, SLOT1_TYPE, TENANT1_1_NAME, 1, 1, 1, "slot-1"))}}, 0);
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT2,
+ MakeSlotStatus(DOMAIN1_SLOT2, SLOT2_TYPE, TENANT1_2_NAME, 2, 2, 2, "slot-1"))}}, 1);
+ CheckTenantPoolStatus(runtime, 0,
+ {{std::make_pair(DOMAIN1_SLOT3,
+ MakeSlotStatus(DOMAIN1_SLOT3, SLOT3_TYPE, TENANT1_2_NAME, 3, 3, 3, "slot-2"))}}, 2);
+ }
+
+ Y_UNIT_TEST(TestConfigSubscription) {
+ TTenantTestRuntime runtime(TenantTestConfigWithConsole());
+
+ // Add config for Tenant Slot Broker and wait for notification.
+ auto *event = new TEvConsole::TEvConfigureRequest;
+ event->Record.AddActions()->MutableAddConfigItem()->MutableConfigItem()
+ ->MutableConfig()->MutableTenantSlotBrokerConfig()->SetPendingSlotTimeout(12345);
+ runtime.SendToConsole(event);
+
+ struct IsConfigNotificationProcessed {
+ bool operator()(IEventHandle& ev)
+ {
+ if (ev.GetTypeRewrite() == NConsole::TEvConsole::EvConfigNotificationRequest) {
+ auto &rec = ev.Get<NConsole::TEvConsole::TEvConfigNotificationRequest>()->Record;
+ if (rec.GetConfig().GetTenantSlotBrokerConfig().GetPendingSlotTimeout() == 12345) {
+ SubscriptionId = rec.GetSubscriptionId();
+ ConfigId.Load(rec.GetConfigId());
+ }
+ } else if (ev.GetTypeRewrite() == NConsole::TEvConsole::EvConfigNotificationResponse) {
+ auto &rec = ev.Get<NConsole::TEvConsole::TEvConfigNotificationResponse>()->Record;
+ if (SubscriptionId == rec.GetSubscriptionId()
+ && ConfigId == NConsole::TConfigId(rec.GetConfigId()))
+ return true;
+ }
+
+ return false;
+ }
+
+ ui64 SubscriptionId = 0;
+ NConsole::TConfigId ConfigId;
+ };
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(IsConfigNotificationProcessed(), 1);
+ runtime.DispatchEvents(options);
+ }
+
+ Y_UNIT_TEST(TestPreferredDC) {
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 9, 9, 0, 6, 0}});
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 9, 9, 9}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 9, 0, 0, 6, 0}});
+ }
+
+ Y_UNIT_TEST(TestPreferredDCDetachMisplaced) {
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 9, 9, 0, 6, 0}});
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 9, 9, 9}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 9, 0, 0, 6, 0}});
+ // Detach 6 slots and expect only misplaced slots to be detached.
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 3, 0, 0, 0, 0}});
+ }
+
+ Y_UNIT_TEST(TestPreferredDCMoveMisplaced) {
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 3, 3, 0, 0, 0}});
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 3, 0, 0, 0, 0}});
+
+ // Not enough slots in preferred DC, should get one misplaced.
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 3, 0, 0, 1, 0}});
+
+ // Slot in preferred DC is back and should be used.
+ runtime.CreateTenantPool(0);
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 0, false, 3, 0, 0, 0, 0}});
+ }
+
+ Y_UNIT_TEST(TestGroupForced) {
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 3, 1, 0, 0}});
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 3, 3, 3}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0}});
+
+ // Collocation is more important and we expect slots to be moved to another DC.
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 3, 0}});
+
+ // Slot in preferred DC is back and slots should be moved again.
+ runtime.CreateTenantPool(0);
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0}});
+ }
+
+ Y_UNIT_TEST(TestGroupRelaxed) {
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, false, 4, 4, 0, 1, 1}});
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 4, 4, 4}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 1, 1}});
+
+ // Collocation is more important and we expect slots to be moved to another DC.
+ // Split slot should be placed into preferred data center.
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 3, 1}});
+
+ // Slot in preferred DC is back and slots should be moved again.
+ runtime.CreateTenantPool(0);
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 1, 1}});
+ }
+
+ Y_UNIT_TEST(TestGroupMultipleAllocations) {
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 3, 1, 0, 0},
+ {SLOT2_TYPE, DATA_CENTER1, false, 1, true, 4, 3, 1, 0, 0},
+ {SLOT3_TYPE, DATA_CENTER1, false, 1, false, 4, 4, 0, 1, 1}});
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 21, 21, 21}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0},
+ {SLOT2_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0},
+ {SLOT3_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 1, 1}});
+
+ // Collocation is more important and we expect slots to be moved to another DC.
+ // Split slot should be placed into preferred data center.
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 3, 0},
+ {SLOT2_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 3, 0},
+ {SLOT3_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 3, 1}});
+
+ // Slot in preferred DC is back and slots should be moved again.
+ runtime.CreateTenantPool(0);
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ {{SLOT1_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0},
+ {SLOT2_TYPE, DATA_CENTER1, false, 1, true, 4, 0, 1, 0, 0},
+ {SLOT3_TYPE, DATA_CENTER1, false, 1, false, 4, 0, 0, 1, 1}});
+ }
+
+ Y_UNIT_TEST(TestSlotStats) {
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+ CheckAlterTenant(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 3, 0,
+ SLOT2_TYPE, DATA_CENTER2, 2, 2, 0,
+ SLOT3_TYPE, DATA_CENTER3, 1, 1, 0);
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 9, 9, 9},
+ {TENANT1_1_NAME, 10, 10, 10}}});
+ CheckTenantState(runtime, TENANT1_1_NAME,
+ SLOT1_TYPE, DATA_CENTER1, 3, 0, 0,
+ SLOT2_TYPE, DATA_CENTER2, 2, 0, 0,
+ SLOT3_TYPE, DATA_CENTER3, 1, 0, 0);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToBroker(new TEvTenantSlotBroker::TEvGetSlotStats);
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTenantSlotBroker::TEvSlotStats>(handle);
+ // <type, dc> -> <connected, free>
+ THashMap<std::pair<TString, TString>, std::pair<ui64, ui64>> slots;
+ for (auto &rec : reply->Record.GetSlotCounters())
+ slots[std::make_pair(rec.GetType(), rec.GetDataCenter())]
+ = std::make_pair(rec.GetConnected(), rec.GetFree());
+ UNIT_ASSERT_VALUES_EQUAL(slots.size(), 9);
UNIT_ASSERT_VALUES_EQUAL(slots[std::make_pair(SLOT1_TYPE, DATA_CENTER1)].first, 3);
UNIT_ASSERT_VALUES_EQUAL(slots[std::make_pair(SLOT1_TYPE, DATA_CENTER1)].second, 0);
UNIT_ASSERT_VALUES_EQUAL(slots[std::make_pair(SLOT1_TYPE, DATA_CENTER2)].first, 3);
@@ -1504,72 +1504,72 @@ Y_UNIT_TEST_SUITE(TTenantSlotBrokerTests) {
UNIT_ASSERT_VALUES_EQUAL(slots[std::make_pair(SLOT3_TYPE, DATA_CENTER2)].second, 3);
UNIT_ASSERT_VALUES_EQUAL(slots[std::make_pair(SLOT3_TYPE, DATA_CENTER3)].first, 3);
UNIT_ASSERT_VALUES_EQUAL(slots[std::make_pair(SLOT3_TYPE, DATA_CENTER3)].second, 2);
- }
-
- Y_UNIT_TEST(TestRandomActions) {
- TTenantTestRuntime runtime(TenantTestConfig3DC());
-
- enum EAction {
- ALTER,
- CLEAR,
- RESTART,
- POOL_DOWN,
- POOL_UP
- };
-
+ }
+
+ Y_UNIT_TEST(TestRandomActions) {
+ TTenantTestRuntime runtime(TenantTestConfig3DC());
+
+ enum EAction {
+ ALTER,
+ CLEAR,
+ RESTART,
+ POOL_DOWN,
+ POOL_UP
+ };
+
TVector<EAction> actions = { ALTER, ALTER, ALTER, CLEAR };
- TSet<std::pair<ui32, TString>> banned;
- TSet<std::pair<ui32, TString>> pinned;
- TSet<ui32> down;
- TVector<TString> slots = {SLOT1, SLOT2, SLOT3};
- TVector<TString> tenants = {TENANT1_1_NAME, TENANT1_2_NAME, TENANT1_3_NAME};
- TVector<TString> types = {SLOT1_TYPE, SLOT2_TYPE, SLOT3_TYPE, ANY_SLOT_TYPE};
+ TSet<std::pair<ui32, TString>> banned;
+ TSet<std::pair<ui32, TString>> pinned;
+ TSet<ui32> down;
+ TVector<TString> slots = {SLOT1, SLOT2, SLOT3};
+ TVector<TString> tenants = {TENANT1_1_NAME, TENANT1_2_NAME, TENANT1_3_NAME};
+ TVector<TString> types = {SLOT1_TYPE, SLOT2_TYPE, SLOT3_TYPE, ANY_SLOT_TYPE};
TVector<TString> dcs = {DATA_CENTER1, DATA_CENTER2, DATA_CENTER3, ANY_DATA_CENTER};
-
- for (int i = 0; i < 1000; ++i) {
- EAction action = actions[RandomNumber<ui64>(actions.size())];
-
- switch (action) {
- case ALTER:
- {
- auto tenant = tenants[RandomNumber<ui64>(tenants.size())];
- auto type = types[RandomNumber<ui64>(types.size())];
- auto dc = dcs[RandomNumber<ui64>(dcs.size())];
- AlterTenant(runtime, tenant, type, dc,
- RandomNumber<ui64>(5), RandomNumber<ui64>(5), RandomNumber<ui64>(5));
- }
- break;
- case CLEAR:
- {
- auto tenant = tenants[RandomNumber<ui64>(tenants.size())];
- AlterTenant(runtime, tenant);
- }
- break;
- case RESTART:
- RestartTenantSlotBroker(runtime);
- break;
- case POOL_DOWN:
- {
- auto node = RandomNumber<ui32>(runtime.GetNodeCount());
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(node), 0),
- runtime.Sender,
- new TEvents::TEvPoisonPill));
- down.insert(node);
- }
- break;
- case POOL_UP:
- if (!down.empty()) {
- auto it = down.begin();
- std::advance(it, RandomNumber<ui64>(down.size()));
- runtime.CreateTenantPool(*it);
- down.erase(it);
- }
- break;
- default:
- Y_FAIL("unknown action");
- }
- }
- }
-}
-
-} // namespace NKikimr
+
+ for (int i = 0; i < 1000; ++i) {
+ EAction action = actions[RandomNumber<ui64>(actions.size())];
+
+ switch (action) {
+ case ALTER:
+ {
+ auto tenant = tenants[RandomNumber<ui64>(tenants.size())];
+ auto type = types[RandomNumber<ui64>(types.size())];
+ auto dc = dcs[RandomNumber<ui64>(dcs.size())];
+ AlterTenant(runtime, tenant, type, dc,
+ RandomNumber<ui64>(5), RandomNumber<ui64>(5), RandomNumber<ui64>(5));
+ }
+ break;
+ case CLEAR:
+ {
+ auto tenant = tenants[RandomNumber<ui64>(tenants.size())];
+ AlterTenant(runtime, tenant);
+ }
+ break;
+ case RESTART:
+ RestartTenantSlotBroker(runtime);
+ break;
+ case POOL_DOWN:
+ {
+ auto node = RandomNumber<ui32>(runtime.GetNodeCount());
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(node), 0),
+ runtime.Sender,
+ new TEvents::TEvPoisonPill));
+ down.insert(node);
+ }
+ break;
+ case POOL_UP:
+ if (!down.empty()) {
+ auto it = down.begin();
+ std::advance(it, RandomNumber<ui64>(down.size()));
+ runtime.CreateTenantPool(*it);
+ down.erase(it);
+ }
+ break;
+ default:
+ Y_FAIL("unknown action");
+ }
+ }
+ }
+}
+
+} // namespace NKikimr
diff --git a/ydb/core/mind/tenant_ut_local.cpp b/ydb/core/mind/tenant_ut_local.cpp
index a56c20d2ccb..5aab98212de 100644
--- a/ydb/core/mind/tenant_ut_local.cpp
+++ b/ydb/core/mind/tenant_ut_local.cpp
@@ -1,176 +1,176 @@
#include <ydb/core/testlib/tenant_runtime.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace NKikimr {
-
-namespace {
-
-void CheckAddTenant(TTenantTestRuntime &runtime, const TString &tenant, TEvLocal::TEvTenantStatus::EStatus status, ui64 cpu = 1, ui64 expectedCpu = 0, ui64 memory = 1, ui64 expectedMemory = 0, ui64 network = 1, ui64 expectedNetwork = 0)
-{
- NKikimrTabletBase::TMetrics limit;
- limit.SetCPU(cpu);
- limit.SetMemory(memory);
- limit.SetNetwork(network);
- runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
- runtime.Sender,
- new TEvLocal::TEvAddTenant(tenant, limit)));
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->TenantName, tenant);
- UNIT_ASSERT_VALUES_EQUAL((int)reply->Status, (int)status);
- if (status == TEvLocal::TEvTenantStatus::STARTED) {
- if (expectedCpu)
- UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetCPU(), expectedCpu);
- else
- UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetCPU(), cpu);
- if (expectedMemory)
- UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetMemory(), expectedMemory);
- else
- UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetMemory(), memory);
- if (expectedNetwork)
- UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetNetwork(), expectedNetwork);
- else
- UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetNetwork(), network);
- }
-}
-
-void CheckAlterTenant(TTenantTestRuntime &runtime, const TString &tenant, TEvLocal::TEvTenantStatus::EStatus status, ui64 cpu = 1, ui64 memory = 1, ui64 network = 1)
-{
- NKikimrTabletBase::TMetrics limit;
- limit.SetCPU(cpu);
- limit.SetMemory(memory);
- limit.SetNetwork(network);
- runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
- runtime.Sender,
- new TEvLocal::TEvAlterTenant(tenant, limit)));
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->TenantName, tenant);
- UNIT_ASSERT(reply->Status == status);
- if (status == TEvLocal::TEvTenantStatus::STARTED) {
- UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetCPU(), cpu);
- UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetMemory(), memory);
- UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetNetwork(), network);
- }
-}
-
-}
-
+
+namespace NKikimr {
+
+namespace {
+
+void CheckAddTenant(TTenantTestRuntime &runtime, const TString &tenant, TEvLocal::TEvTenantStatus::EStatus status, ui64 cpu = 1, ui64 expectedCpu = 0, ui64 memory = 1, ui64 expectedMemory = 0, ui64 network = 1, ui64 expectedNetwork = 0)
+{
+ NKikimrTabletBase::TMetrics limit;
+ limit.SetCPU(cpu);
+ limit.SetMemory(memory);
+ limit.SetNetwork(network);
+ runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
+ runtime.Sender,
+ new TEvLocal::TEvAddTenant(tenant, limit)));
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->TenantName, tenant);
+ UNIT_ASSERT_VALUES_EQUAL((int)reply->Status, (int)status);
+ if (status == TEvLocal::TEvTenantStatus::STARTED) {
+ if (expectedCpu)
+ UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetCPU(), expectedCpu);
+ else
+ UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetCPU(), cpu);
+ if (expectedMemory)
+ UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetMemory(), expectedMemory);
+ else
+ UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetMemory(), memory);
+ if (expectedNetwork)
+ UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetNetwork(), expectedNetwork);
+ else
+ UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetNetwork(), network);
+ }
+}
+
+void CheckAlterTenant(TTenantTestRuntime &runtime, const TString &tenant, TEvLocal::TEvTenantStatus::EStatus status, ui64 cpu = 1, ui64 memory = 1, ui64 network = 1)
+{
+ NKikimrTabletBase::TMetrics limit;
+ limit.SetCPU(cpu);
+ limit.SetMemory(memory);
+ limit.SetNetwork(network);
+ runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
+ runtime.Sender,
+ new TEvLocal::TEvAlterTenant(tenant, limit)));
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->TenantName, tenant);
+ UNIT_ASSERT(reply->Status == status);
+ if (status == TEvLocal::TEvTenantStatus::STARTED) {
+ UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetCPU(), cpu);
+ UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetMemory(), memory);
+ UNIT_ASSERT_VALUES_EQUAL(reply->ResourceLimit.GetNetwork(), network);
+ }
+}
+
+}
+
Y_UNIT_TEST_SUITE(TLocalTests) {
Y_UNIT_TEST(TestAddTenant) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
-
- CheckAddTenant(runtime, TENANT1_1_NAME, TEvLocal::TEvTenantStatus::STARTED, 5);
- CheckAddTenant(runtime, TENANT1_2_NAME, TEvLocal::TEvTenantStatus::STARTED);
- CheckAddTenant(runtime, TENANT1_U_NAME, TEvLocal::TEvTenantStatus::UNKNOWN_TENANT);
- CheckAddTenant(runtime, TENANTU_1_NAME, TEvLocal::TEvTenantStatus::UNKNOWN_TENANT);
- CheckAddTenant(runtime, TENANT1_1_NAME, TEvLocal::TEvTenantStatus::STARTED, 3, 5);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
- {TENANT1_1_NAME, 5, 1, 1},
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+
+ CheckAddTenant(runtime, TENANT1_1_NAME, TEvLocal::TEvTenantStatus::STARTED, 5);
+ CheckAddTenant(runtime, TENANT1_2_NAME, TEvLocal::TEvTenantStatus::STARTED);
+ CheckAddTenant(runtime, TENANT1_U_NAME, TEvLocal::TEvTenantStatus::UNKNOWN_TENANT);
+ CheckAddTenant(runtime, TENANTU_1_NAME, TEvLocal::TEvTenantStatus::UNKNOWN_TENANT);
+ CheckAddTenant(runtime, TENANT1_1_NAME, TEvLocal::TEvTenantStatus::STARTED, 3, 5);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
+ {TENANT1_1_NAME, 5, 1, 1},
{TENANT1_2_NAME, 1, 1, 1}}});
- }
-
+ }
+
Y_UNIT_TEST(TestAlterTenant) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
-
- CheckAddTenant(runtime, TENANT1_1_NAME, TEvLocal::TEvTenantStatus::STARTED, 5, 5, 5);
- CheckAlterTenant(runtime, TENANT1_1_NAME, TEvLocal::TEvTenantStatus::STARTED, 10, 10, 10);
- CheckAlterTenant(runtime, TENANT1_2_NAME, TEvLocal::TEvTenantStatus::STOPPED);
- CheckAlterTenant(runtime, TENANT1_U_NAME, TEvLocal::TEvTenantStatus::STOPPED);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+
+ CheckAddTenant(runtime, TENANT1_1_NAME, TEvLocal::TEvTenantStatus::STARTED, 5, 5, 5);
+ CheckAlterTenant(runtime, TENANT1_1_NAME, TEvLocal::TEvTenantStatus::STARTED, 10, 10, 10);
+ CheckAlterTenant(runtime, TENANT1_2_NAME, TEvLocal::TEvTenantStatus::STOPPED);
+ CheckAlterTenant(runtime, TENANT1_U_NAME, TEvLocal::TEvTenantStatus::STOPPED);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
{TENANT1_1_NAME, 10, 10, 10}}});
- }
-
+ }
+
Y_UNIT_TEST(TestAddTenantWhileResolving) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
- TAutoPtr<IEventHandle> handle;
-
- runtime.SendToPipe(SCHEME_SHARD1_ID, runtime.Sender, new TEvTest::TEvHoldResolve(true));
- runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
-
- NKikimrTabletBase::TMetrics limit;
- limit.SetCPU(1);
- limit.SetMemory(1);
- limit.SetNetwork(1);
-
- runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
- runtime.Sender,
- new TEvLocal::TEvAddTenant(TENANT1_1_NAME, limit)));
- runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
-
- runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
- runtime.Sender,
- new TEvLocal::TEvAddTenant(TENANT1_1_NAME, limit)));
- runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
- runtime.Sender,
- new TEvLocal::TEvAddTenant(TENANT1_2_NAME, limit)));
- runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
-
- runtime.SendToPipe(SCHEME_SHARD1_ID, runtime.Sender, new TEvTest::TEvHoldResolve(false));
-
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply1->TenantName, TENANT1_1_NAME);
- UNIT_ASSERT(reply1->Status == TEvLocal::TEvTenantStatus::STARTED);
-
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply2->TenantName, TENANT1_1_NAME);
- UNIT_ASSERT(reply2->Status == TEvLocal::TEvTenantStatus::STARTED);
-
- auto reply3 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply3->TenantName, TENANT1_2_NAME);
- UNIT_ASSERT(reply3->Status == TEvLocal::TEvTenantStatus::STARTED);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
- {TENANT1_1_NAME, 1, 1, 1},
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+ TAutoPtr<IEventHandle> handle;
+
+ runtime.SendToPipe(SCHEME_SHARD1_ID, runtime.Sender, new TEvTest::TEvHoldResolve(true));
+ runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+
+ NKikimrTabletBase::TMetrics limit;
+ limit.SetCPU(1);
+ limit.SetMemory(1);
+ limit.SetNetwork(1);
+
+ runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
+ runtime.Sender,
+ new TEvLocal::TEvAddTenant(TENANT1_1_NAME, limit)));
+ runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+
+ runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
+ runtime.Sender,
+ new TEvLocal::TEvAddTenant(TENANT1_1_NAME, limit)));
+ runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
+ runtime.Sender,
+ new TEvLocal::TEvAddTenant(TENANT1_2_NAME, limit)));
+ runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+
+ runtime.SendToPipe(SCHEME_SHARD1_ID, runtime.Sender, new TEvTest::TEvHoldResolve(false));
+
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply1->TenantName, TENANT1_1_NAME);
+ UNIT_ASSERT(reply1->Status == TEvLocal::TEvTenantStatus::STARTED);
+
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply2->TenantName, TENANT1_1_NAME);
+ UNIT_ASSERT(reply2->Status == TEvLocal::TEvTenantStatus::STARTED);
+
+ auto reply3 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply3->TenantName, TENANT1_2_NAME);
+ UNIT_ASSERT(reply3->Status == TEvLocal::TEvTenantStatus::STARTED);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
+ {TENANT1_1_NAME, 1, 1, 1},
{TENANT1_2_NAME, 1, 1, 1}}});
- }
-
+ }
+
Y_UNIT_TEST(TestRemoveTenantWhileResolving) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
- TAutoPtr<IEventHandle> handle;
-
- runtime.SendToPipe(SCHEME_SHARD1_ID, runtime.Sender, new TEvTest::TEvHoldResolve(true));
- runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
-
- NKikimrTabletBase::TMetrics limit;
- limit.SetCPU(1);
- limit.SetMemory(1);
- limit.SetNetwork(1);
-
- runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
- runtime.Sender,
- new TEvLocal::TEvAddTenant(TENANT1_1_NAME, limit)));
- runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
-
- runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
- runtime.Sender,
- new TEvLocal::TEvAddTenant(TENANT1_2_NAME, limit)));
- runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
-
- runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
- runtime.Sender,
- new TEvLocal::TEvRemoveTenant(TENANT1_1_NAME)));
-
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply1->TenantName, TENANT1_1_NAME);
- UNIT_ASSERT(reply1->Status == TEvLocal::TEvTenantStatus::STOPPED);
-
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply2->TenantName, TENANT1_1_NAME);
- UNIT_ASSERT(reply2->Status == TEvLocal::TEvTenantStatus::STOPPED);
-
- runtime.SendToPipe(SCHEME_SHARD1_ID, runtime.Sender, new TEvTest::TEvHoldResolve(false));
-
- auto reply3 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply3->TenantName, TENANT1_2_NAME);
- UNIT_ASSERT(reply3->Status == TEvLocal::TEvTenantStatus::STARTED);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+ TAutoPtr<IEventHandle> handle;
+
+ runtime.SendToPipe(SCHEME_SHARD1_ID, runtime.Sender, new TEvTest::TEvHoldResolve(true));
+ runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+
+ NKikimrTabletBase::TMetrics limit;
+ limit.SetCPU(1);
+ limit.SetMemory(1);
+ limit.SetNetwork(1);
+
+ runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
+ runtime.Sender,
+ new TEvLocal::TEvAddTenant(TENANT1_1_NAME, limit)));
+ runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+
+ runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
+ runtime.Sender,
+ new TEvLocal::TEvAddTenant(TENANT1_2_NAME, limit)));
+ runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+
+ runtime.Send(new IEventHandle(MakeLocalID(runtime.GetNodeId(0)),
+ runtime.Sender,
+ new TEvLocal::TEvRemoveTenant(TENANT1_1_NAME)));
+
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply1->TenantName, TENANT1_1_NAME);
+ UNIT_ASSERT(reply1->Status == TEvLocal::TEvTenantStatus::STOPPED);
+
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply2->TenantName, TENANT1_1_NAME);
+ UNIT_ASSERT(reply2->Status == TEvLocal::TEvTenantStatus::STOPPED);
+
+ runtime.SendToPipe(SCHEME_SHARD1_ID, runtime.Sender, new TEvTest::TEvHoldResolve(false));
+
+ auto reply3 = runtime.GrabEdgeEventRethrow<TEvLocal::TEvTenantStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply3->TenantName, TENANT1_2_NAME);
+ UNIT_ASSERT(reply3->Status == TEvLocal::TEvTenantStatus::STARTED);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
{TENANT1_2_NAME, 1, 1, 1}}});
- }
-}
-
-} //namespace NKikimr
+ }
+}
+
+} //namespace NKikimr
diff --git a/ydb/core/mind/tenant_ut_pool.cpp b/ydb/core/mind/tenant_ut_pool.cpp
index 239a5e2f041..9ac6b6843c3 100644
--- a/ydb/core/mind/tenant_ut_pool.cpp
+++ b/ydb/core/mind/tenant_ut_pool.cpp
@@ -1,1201 +1,1201 @@
#include <ydb/core/base/counters.h>
#include <ydb/core/testlib/tenant_runtime.h>
#include <ydb/core/testlib/tenant_helpers.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace NKikimr {
-
-namespace {
-
-struct TAction {
- TString SlotId;
- TString TenantName;
- NKikimrTenantPool::EStatus Status;
- ui64 Cookie;
- TString Label;
-};
-
-class TActionChecker : public TActorBootstrapped<TActionChecker> {
+
+namespace NKikimr {
+
+namespace {
+
+struct TAction {
+ TString SlotId;
+ TString TenantName;
+ NKikimrTenantPool::EStatus Status;
+ ui64 Cookie;
+ TString Label;
+};
+
+class TActionChecker : public TActorBootstrapped<TActionChecker> {
TActorId EdgeActor;
- ui32 NodeId;
- ui32 Domain;
- TVector<TAction> Actions;
- THashMap<TString, TVector<TAction>> Answers;
- bool Finished;
-
-public:
+ ui32 NodeId;
+ ui32 Domain;
+ TVector<TAction> Actions;
+ THashMap<TString, TVector<TAction>> Answers;
+ bool Finished;
+
+public:
TActionChecker(TActorId edge, ui32 nodeId, ui32 domain, TVector<TAction> actions)
- : EdgeActor(edge)
- , NodeId(nodeId)
- , Domain(domain)
- , Actions(std::move(actions))
- , Finished(false)
- {
- }
-
- void Bootstrap(const TActorContext &ctx)
- {
- ctx.Send(MakeTenantPoolID(NodeId, Domain), new TEvTenantPool::TEvTakeOwnership);
- for (auto &action : Actions) {
- auto *event = new TEvTenantPool::TEvConfigureSlot;
- event->Record.SetSlotId(action.SlotId);
- event->Record.SetAssignedTenant(action.TenantName);
- event->Record.SetLabel(action.Label);
- ctx.Send(MakeTenantPoolID(NodeId, Domain), event, 0, action.Cookie);
-
- Answers[action.SlotId].push_back(action);
- }
- Become(&TThis::StateWork);
- }
-
- void Handle(TEvTenantPool::TEvConfigureSlotResult::TPtr &ev, const TActorContext &ctx)
- {
- auto &rec = ev->Get()->Record;
- auto &id = rec.GetSlotStatus().GetId();
+ : EdgeActor(edge)
+ , NodeId(nodeId)
+ , Domain(domain)
+ , Actions(std::move(actions))
+ , Finished(false)
+ {
+ }
+
+ void Bootstrap(const TActorContext &ctx)
+ {
+ ctx.Send(MakeTenantPoolID(NodeId, Domain), new TEvTenantPool::TEvTakeOwnership);
+ for (auto &action : Actions) {
+ auto *event = new TEvTenantPool::TEvConfigureSlot;
+ event->Record.SetSlotId(action.SlotId);
+ event->Record.SetAssignedTenant(action.TenantName);
+ event->Record.SetLabel(action.Label);
+ ctx.Send(MakeTenantPoolID(NodeId, Domain), event, 0, action.Cookie);
+
+ Answers[action.SlotId].push_back(action);
+ }
+ Become(&TThis::StateWork);
+ }
+
+ void Handle(TEvTenantPool::TEvConfigureSlotResult::TPtr &ev, const TActorContext &ctx)
+ {
+ auto &rec = ev->Get()->Record;
+ auto &id = rec.GetSlotStatus().GetId();
UNIT_ASSERT(Answers.contains(id));
- auto &answer = Answers[id].front();
- UNIT_ASSERT_VALUES_EQUAL((int)rec.GetStatus(), (int)answer.Status);
- UNIT_ASSERT_VALUES_EQUAL(ev->Cookie, answer.Cookie);
- if (answer.Status == NKikimrTenantPool::SUCCESS) {
- UNIT_ASSERT_VALUES_EQUAL(rec.GetSlotStatus().GetAssignedTenant(), answer.TenantName);
- UNIT_ASSERT_VALUES_EQUAL(rec.GetSlotStatus().GetLabel(), answer.Label);
- }
- Answers[id].erase(Answers[id].begin());
- if (Answers[id].empty())
- Answers.erase(id);
-
- if (Answers.empty()) {
- ctx.Send(EdgeActor, new TEvTest::TEvActionSuccess);
- Finished = true;
- }
- }
-
- void LostOwnership()
- {
- UNIT_ASSERT(Finished);
- }
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvTenantPool::TEvConfigureSlotResult, Handle);
- IgnoreFunc(TEvTenantPool::TEvTenantPoolStatus);
- cFunc(TEvTenantPool::EvLostOwnership, LostOwnership);
-
- default:
- Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
+ auto &answer = Answers[id].front();
+ UNIT_ASSERT_VALUES_EQUAL((int)rec.GetStatus(), (int)answer.Status);
+ UNIT_ASSERT_VALUES_EQUAL(ev->Cookie, answer.Cookie);
+ if (answer.Status == NKikimrTenantPool::SUCCESS) {
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetSlotStatus().GetAssignedTenant(), answer.TenantName);
+ UNIT_ASSERT_VALUES_EQUAL(rec.GetSlotStatus().GetLabel(), answer.Label);
+ }
+ Answers[id].erase(Answers[id].begin());
+ if (Answers[id].empty())
+ Answers.erase(id);
+
+ if (Answers.empty()) {
+ ctx.Send(EdgeActor, new TEvTest::TEvActionSuccess);
+ Finished = true;
+ }
+ }
+
+ void LostOwnership()
+ {
+ UNIT_ASSERT(Finished);
+ }
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvTenantPool::TEvConfigureSlotResult, Handle);
+ IgnoreFunc(TEvTenantPool::TEvTenantPoolStatus);
+ cFunc(TEvTenantPool::EvLostOwnership, LostOwnership);
+
+ default:
+ Y_FAIL("unexpected event type: %" PRIx32 " event: %s",
ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- break;
- }
- }
-};
-
-void CollectActions(TVector<TAction> &actions, ui64 cookie, const TString &slotId,
- const TString &tenantName, NKikimrTenantPool::EStatus status)
-{
- actions.push_back({slotId, tenantName, status, cookie, ""});
-}
-
-void CollectActions(TVector<TAction> &actions, ui64 cookie, const TString &slotId,
- const TString &tenantName, const TString &label,
- NKikimrTenantPool::EStatus status)
-{
- actions.push_back({slotId, tenantName, status, cookie, label});
-}
-
-template<typename ...Ts>
-void CollectActions(TVector<TAction> &actions, ui64 cookie, const TString &slotId,
- const TString &tenantName, NKikimrTenantPool::EStatus status,
- Ts ...args)
-{
- CollectActions(actions, cookie, slotId, tenantName, status);
- CollectActions(actions, cookie + 1, args...);
-}
-
-template<typename ...Ts>
-void CollectActions(TVector<TAction> &actions, ui64 cookie, const TString &slotId,
- const TString &tenantName, const TString &label,
- NKikimrTenantPool::EStatus status, Ts ...args)
-{
- CollectActions(actions, cookie, slotId, tenantName, status, label);
- CollectActions(actions, cookie + 1, args...);
-}
-
-template<typename ...Ts>
-void CheckConfigureSlot(TTenantTestRuntime &runtime, ui32 domain,
- Ts ...args)
-{
- TVector<TAction> actions;
- CollectActions(actions, 1, args...);
-
- auto *actor = new TActionChecker(runtime.Sender, runtime.GetNodeId(0), domain, actions);
- runtime.Register(actor);
-
- TAutoPtr<IEventHandle> handle;
- runtime.GrabEdgeEventRethrow<TEvTest::TEvActionSuccess>(handle);
-}
-
-void CheckTenantPoolStatus(TTenantTestRuntime &runtime,
+ break;
+ }
+ }
+};
+
+void CollectActions(TVector<TAction> &actions, ui64 cookie, const TString &slotId,
+ const TString &tenantName, NKikimrTenantPool::EStatus status)
+{
+ actions.push_back({slotId, tenantName, status, cookie, ""});
+}
+
+void CollectActions(TVector<TAction> &actions, ui64 cookie, const TString &slotId,
+ const TString &tenantName, const TString &label,
+ NKikimrTenantPool::EStatus status)
+{
+ actions.push_back({slotId, tenantName, status, cookie, label});
+}
+
+template<typename ...Ts>
+void CollectActions(TVector<TAction> &actions, ui64 cookie, const TString &slotId,
+ const TString &tenantName, NKikimrTenantPool::EStatus status,
+ Ts ...args)
+{
+ CollectActions(actions, cookie, slotId, tenantName, status);
+ CollectActions(actions, cookie + 1, args...);
+}
+
+template<typename ...Ts>
+void CollectActions(TVector<TAction> &actions, ui64 cookie, const TString &slotId,
+ const TString &tenantName, const TString &label,
+ NKikimrTenantPool::EStatus status, Ts ...args)
+{
+ CollectActions(actions, cookie, slotId, tenantName, status, label);
+ CollectActions(actions, cookie + 1, args...);
+}
+
+template<typename ...Ts>
+void CheckConfigureSlot(TTenantTestRuntime &runtime, ui32 domain,
+ Ts ...args)
+{
+ TVector<TAction> actions;
+ CollectActions(actions, 1, args...);
+
+ auto *actor = new TActionChecker(runtime.Sender, runtime.GetNodeId(0), domain, actions);
+ runtime.Register(actor);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.GrabEdgeEventRethrow<TEvTest::TEvActionSuccess>(handle);
+}
+
+void CheckTenantPoolStatus(TTenantTestRuntime &runtime,
const TString &d1s1 = "", const TString &d1s2 = "", const TString &d1s3 = "")
-{
- THashMap<TString, NKikimrTenantPool::TSlotStatus> domain1;
- domain1[DOMAIN1_SLOT1] = MakeSlotStatus(DOMAIN1_SLOT1, SLOT1_TYPE, d1s1, 1, 1, 1);
- domain1[DOMAIN1_SLOT2] = MakeSlotStatus(DOMAIN1_SLOT2, SLOT2_TYPE, d1s2, 2, 2, 2);
- domain1[DOMAIN1_SLOT3] = MakeSlotStatus(DOMAIN1_SLOT3, SLOT3_TYPE, d1s3, 3, 3, 3);
- CheckTenantPoolStatus(runtime, 0, domain1);
-}
-
-void CheckLabels(TIntrusivePtr<NMonitoring::TDynamicCounters> counters,
- const TString &database,
- const TString &slot,
- THashMap<TString, TString> attrs = {},
- const NKikimrConfig::TMonitoringConfig &config = {})
-{
- THashMap<TString, TString> dbLabels;
- THashSet<TString> dbServices;
- THashMap<TString, TString> attrLabels;
- THashSet<TString> attrServices;
- THashSet<TString> allServices;
-
- if (database)
- dbLabels[DATABASE_LABEL] = database;
- if (slot)
+{
+ THashMap<TString, NKikimrTenantPool::TSlotStatus> domain1;
+ domain1[DOMAIN1_SLOT1] = MakeSlotStatus(DOMAIN1_SLOT1, SLOT1_TYPE, d1s1, 1, 1, 1);
+ domain1[DOMAIN1_SLOT2] = MakeSlotStatus(DOMAIN1_SLOT2, SLOT2_TYPE, d1s2, 2, 2, 2);
+ domain1[DOMAIN1_SLOT3] = MakeSlotStatus(DOMAIN1_SLOT3, SLOT3_TYPE, d1s3, 3, 3, 3);
+ CheckTenantPoolStatus(runtime, 0, domain1);
+}
+
+void CheckLabels(TIntrusivePtr<NMonitoring::TDynamicCounters> counters,
+ const TString &database,
+ const TString &slot,
+ THashMap<TString, TString> attrs = {},
+ const NKikimrConfig::TMonitoringConfig &config = {})
+{
+ THashMap<TString, TString> dbLabels;
+ THashSet<TString> dbServices;
+ THashMap<TString, TString> attrLabels;
+ THashSet<TString> attrServices;
+ THashSet<TString> allServices;
+
+ if (database)
+ dbLabels[DATABASE_LABEL] = database;
+ if (slot)
dbLabels[SLOT_LABEL] = "static";
if (slot.StartsWith("slot-"))
dbLabels["host"] = slot;
- for (auto &attr : GetDatabaseAttributeLabels()) {
- if (attrs.contains(attr))
- attrLabels.insert(*attrs.find(attr));
- }
-
- for (auto &service : config.GetDatabaseLabels().GetServices())
- dbServices.insert(service);
- if (dbServices.empty())
- dbServices = GetDatabaseSensorServices();
-
- for (auto &group : config.GetDatabaseAttributeLabels().GetAttributeGroups()) {
- for (auto &service : group.GetServices())
- attrServices.insert(service);
- }
- if (attrServices.empty())
- attrServices = GetDatabaseAttributeSensorServices();
-
- allServices = dbServices;
- allServices.insert(attrServices.begin(), attrServices.end());
-
- for (auto &service : allServices) {
+ for (auto &attr : GetDatabaseAttributeLabels()) {
+ if (attrs.contains(attr))
+ attrLabels.insert(*attrs.find(attr));
+ }
+
+ for (auto &service : config.GetDatabaseLabels().GetServices())
+ dbServices.insert(service);
+ if (dbServices.empty())
+ dbServices = GetDatabaseSensorServices();
+
+ for (auto &group : config.GetDatabaseAttributeLabels().GetAttributeGroups()) {
+ for (auto &service : group.GetServices())
+ attrServices.insert(service);
+ }
+ if (attrServices.empty())
+ attrServices = GetDatabaseAttributeSensorServices();
+
+ allServices = dbServices;
+ allServices.insert(attrServices.begin(), attrServices.end());
+
+ for (auto &service : allServices) {
THashSet<TString> allLabels = GetDatabaseAttributeLabels();
allLabels.insert(DATABASE_LABEL);
allLabels.insert(SLOT_LABEL);
- THashMap<TString, TString> labels;
+ THashMap<TString, TString> labels;
if (dbServices.contains(service)) {
- labels.insert(dbLabels.begin(), dbLabels.end());
+ labels.insert(dbLabels.begin(), dbLabels.end());
if (attrServices.contains(service)) {
labels.erase(SLOT_LABEL); // no slot now
allLabels.erase(SLOT_LABEL);
}
}
- if (attrServices.contains(service))
- labels.insert(attrLabels.begin(), attrLabels.end());
+ if (attrServices.contains(service))
+ labels.insert(attrLabels.begin(), attrLabels.end());
auto serviceGroup = GetServiceCounters(counters, service, false);
- while (!labels.empty()) {
- TString name;
- TString value;
- serviceGroup->EnumerateSubgroups([&labels,&name,&value](const TString &n, const TString &v) {
- UNIT_ASSERT(labels.contains(n));
- UNIT_ASSERT_VALUES_EQUAL(v, labels[n]);
- name = n;
- value = v;
- });
- UNIT_ASSERT(name);
- UNIT_ASSERT(value);
- labels.erase(name);
- serviceGroup = serviceGroup->FindSubgroup(name, value);
- }
- serviceGroup->EnumerateSubgroups([&allLabels](const TString &name, const TString &) {
- UNIT_ASSERT(!allLabels.contains(name));
- });
- }
-}
-
-void ChangeMonitoringConfig(TTenantTestRuntime &runtime,
- const NKikimrConfig::TMonitoringConfig &monCfg,
- bool waitForPoolStatus = false)
-{
- auto *event = new NConsole::TEvConsole::TEvConfigureRequest;
- event->Record.AddActions()->MutableRemoveConfigItems()
- ->MutableCookieFilter()->AddCookies("mon-tmp");
- auto &item = *event->Record.AddActions()
- ->MutableAddConfigItem()->MutableConfigItem();
- item.MutableConfig()->MutableMonitoringConfig()->CopyFrom(monCfg);
- item.SetCookie("mon-tmp");
-
- runtime.SendToConsole(event);
-
- struct TIsConfigNotificationProcessed {
- TIsConfigNotificationProcessed(ui32 count,
- ui32 waitForPoolStatus)
- : WaitForPoolStatus(waitForPoolStatus)
- , WaitForConfigNotification(count)
- {
- }
-
- bool operator()(IEventHandle& ev)
- {
- if (ev.GetTypeRewrite() == NConsole::TEvConsole::EvConfigNotificationResponse
- && WaitForConfigNotification) {
- auto &rec = ev.Get<NConsole::TEvConsole::TEvConfigNotificationResponse>()->Record;
- if (rec.GetConfigId().ItemIdsSize() != 1 || rec.GetConfigId().GetItemIds(0).GetId())
- --WaitForConfigNotification;
- } else if (ev.GetTypeRewrite() == TEvTenantPool::EvTenantPoolStatus
- && WaitForPoolStatus) {
- --WaitForPoolStatus;
- }
-
- return !WaitForPoolStatus && !WaitForConfigNotification;
- }
-
- ui32 WaitForPoolStatus;
- ui32 WaitForConfigNotification;
- };
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back
- (TIsConfigNotificationProcessed(3 * runtime.GetNodeCount(),
- 2 * waitForPoolStatus * runtime.GetNodeCount()));
- runtime.DispatchEvents(options);
-}
-
-} // anonymous namesapce
-
+ while (!labels.empty()) {
+ TString name;
+ TString value;
+ serviceGroup->EnumerateSubgroups([&labels,&name,&value](const TString &n, const TString &v) {
+ UNIT_ASSERT(labels.contains(n));
+ UNIT_ASSERT_VALUES_EQUAL(v, labels[n]);
+ name = n;
+ value = v;
+ });
+ UNIT_ASSERT(name);
+ UNIT_ASSERT(value);
+ labels.erase(name);
+ serviceGroup = serviceGroup->FindSubgroup(name, value);
+ }
+ serviceGroup->EnumerateSubgroups([&allLabels](const TString &name, const TString &) {
+ UNIT_ASSERT(!allLabels.contains(name));
+ });
+ }
+}
+
+void ChangeMonitoringConfig(TTenantTestRuntime &runtime,
+ const NKikimrConfig::TMonitoringConfig &monCfg,
+ bool waitForPoolStatus = false)
+{
+ auto *event = new NConsole::TEvConsole::TEvConfigureRequest;
+ event->Record.AddActions()->MutableRemoveConfigItems()
+ ->MutableCookieFilter()->AddCookies("mon-tmp");
+ auto &item = *event->Record.AddActions()
+ ->MutableAddConfigItem()->MutableConfigItem();
+ item.MutableConfig()->MutableMonitoringConfig()->CopyFrom(monCfg);
+ item.SetCookie("mon-tmp");
+
+ runtime.SendToConsole(event);
+
+ struct TIsConfigNotificationProcessed {
+ TIsConfigNotificationProcessed(ui32 count,
+ ui32 waitForPoolStatus)
+ : WaitForPoolStatus(waitForPoolStatus)
+ , WaitForConfigNotification(count)
+ {
+ }
+
+ bool operator()(IEventHandle& ev)
+ {
+ if (ev.GetTypeRewrite() == NConsole::TEvConsole::EvConfigNotificationResponse
+ && WaitForConfigNotification) {
+ auto &rec = ev.Get<NConsole::TEvConsole::TEvConfigNotificationResponse>()->Record;
+ if (rec.GetConfigId().ItemIdsSize() != 1 || rec.GetConfigId().GetItemIds(0).GetId())
+ --WaitForConfigNotification;
+ } else if (ev.GetTypeRewrite() == TEvTenantPool::EvTenantPoolStatus
+ && WaitForPoolStatus) {
+ --WaitForPoolStatus;
+ }
+
+ return !WaitForPoolStatus && !WaitForConfigNotification;
+ }
+
+ ui32 WaitForPoolStatus;
+ ui32 WaitForConfigNotification;
+ };
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back
+ (TIsConfigNotificationProcessed(3 * runtime.GetNodeCount(),
+ 2 * waitForPoolStatus * runtime.GetNodeCount()));
+ runtime.DispatchEvents(options);
+}
+
+} // anonymous namesapce
+
Y_UNIT_TEST_SUITE(TTenantPoolTests) {
Y_UNIT_TEST(TestAssignTenantSimple) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT2, TENANT1_2_NAME, NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
- {TENANT1_1_NAME, 1, 1, 1},
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT2, TENANT1_2_NAME, NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
+ {TENANT1_1_NAME, 1, 1, 1},
{TENANT1_2_NAME, 2, 2, 2}}});
-
+
CheckTenantPoolStatus(runtime, TENANT1_1_NAME, TENANT1_2_NAME, "");
- }
-
+ }
+
Y_UNIT_TEST(TestAssignTenantStatic) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, DOMAIN1_NAME, NKikimrTenantPool::SUCCESS);
-
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, DOMAIN1_NAME, NKikimrTenantPool::SUCCESS);
+
runtime.WaitForHiveState({{{DOMAIN1_NAME, 2, 2, 2}}});
-
- CheckTenantPoolStatus(runtime,
+
+ CheckTenantPoolStatus(runtime,
DOMAIN1_NAME, "", "");
- }
-
+ }
+
Y_UNIT_TEST(TestAssignTenantMultiple) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT2, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT3, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT2, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT3, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
{TENANT1_1_NAME, 6, 6, 6}}});
-
- CheckTenantPoolStatus(runtime,
- TENANT1_1_NAME, TENANT1_1_NAME, TENANT1_1_NAME);
- }
-
+
+ CheckTenantPoolStatus(runtime,
+ TENANT1_1_NAME, TENANT1_1_NAME, TENANT1_1_NAME);
+ }
+
Y_UNIT_TEST(TestAssignTenantWithReassigns) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT2, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT3, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT2, TENANT1_2_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT3, DOMAIN1_NAME, NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 4, 4, 4},
- {TENANT1_1_NAME, 1, 1, 1},
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT2, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT3, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT2, TENANT1_2_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT3, DOMAIN1_NAME, NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 4, 4, 4},
+ {TENANT1_1_NAME, 1, 1, 1},
{TENANT1_2_NAME, 2, 2, 2}}});
-
- CheckTenantPoolStatus(runtime,
- TENANT1_1_NAME, TENANT1_2_NAME, DOMAIN1_NAME);
- }
-
+
+ CheckTenantPoolStatus(runtime,
+ TENANT1_1_NAME, TENANT1_2_NAME, DOMAIN1_NAME);
+ }
+
Y_UNIT_TEST(TestAssignTenantWithDetach) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT2, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT3, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT2, TENANT1_2_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT3, DOMAIN1_NAME, NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT2, "", NKikimrTenantPool::SUCCESS);
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT3, "", NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT2, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT3, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT2, TENANT1_2_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT3, DOMAIN1_NAME, NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT2, "", NKikimrTenantPool::SUCCESS);
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT3, "", NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
{TENANT1_1_NAME, 1, 1, 1}}});
-
- CheckTenantPoolStatus(runtime,
- TENANT1_1_NAME, "", "");
- }
-
+
+ CheckTenantPoolStatus(runtime,
+ TENANT1_1_NAME, "", "");
+ }
+
Y_UNIT_TEST(TestAssignTenantUnknownTenant) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, TENANT1_U_NAME, NKikimrTenantPool::UNKNOWN_TENANT);
-
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, TENANT1_U_NAME, NKikimrTenantPool::UNKNOWN_TENANT);
+
runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1}}});
-
- CheckTenantPoolStatus(runtime);
- }
-
+
+ CheckTenantPoolStatus(runtime);
+ }
+
Y_UNIT_TEST(TestAssignTenantPostponed) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS,
- DOMAIN1_SLOT2, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS,
- DOMAIN1_SLOT3, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS,
- DOMAIN1_SLOT2, TENANT1_2_NAME, NKikimrTenantPool::SUCCESS,
- DOMAIN1_SLOT3, DOMAIN1_NAME, NKikimrTenantPool::SUCCESS,
- DOMAIN1_SLOT2, "", NKikimrTenantPool::SUCCESS,
- DOMAIN1_SLOT3, "", NKikimrTenantPool::SUCCESS,
- DOMAIN1_SLOT2, TENANT1_U_NAME, NKikimrTenantPool::UNKNOWN_TENANT,
- DOMAIN1_SLOT2, TENANT1_2_NAME, NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
- {TENANT1_1_NAME, 1, 1, 1},
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS,
+ DOMAIN1_SLOT2, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS,
+ DOMAIN1_SLOT3, TENANT1_1_NAME, NKikimrTenantPool::SUCCESS,
+ DOMAIN1_SLOT2, TENANT1_2_NAME, NKikimrTenantPool::SUCCESS,
+ DOMAIN1_SLOT3, DOMAIN1_NAME, NKikimrTenantPool::SUCCESS,
+ DOMAIN1_SLOT2, "", NKikimrTenantPool::SUCCESS,
+ DOMAIN1_SLOT3, "", NKikimrTenantPool::SUCCESS,
+ DOMAIN1_SLOT2, TENANT1_U_NAME, NKikimrTenantPool::UNKNOWN_TENANT,
+ DOMAIN1_SLOT2, TENANT1_2_NAME, NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
+ {TENANT1_1_NAME, 1, 1, 1},
{TENANT1_2_NAME, 2, 2, 2}}});
-
- CheckTenantPoolStatus(runtime,
- TENANT1_1_NAME, TENANT1_2_NAME, "");
- }
-
+
+ CheckTenantPoolStatus(runtime,
+ TENANT1_1_NAME, TENANT1_2_NAME, "");
+ }
+
Y_UNIT_TEST(TestOwnership) {
- TTenantTestRuntime runtime(DefaultTenantTestConfig);
- TAutoPtr<IEventHandle> handle;
-
+ TTenantTestRuntime runtime(DefaultTenantTestConfig);
+ TAutoPtr<IEventHandle> handle;
+
TActorId sender2 = runtime.AllocateEdgeActor();
-
- // sender cannot configure slot because he is not owner
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvTenantPool::TEvConfigureSlot(DOMAIN1_SLOT1, TENANT1_1_NAME, "")));
- auto reply1 = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvConfigureSlotResult>(handle);
- UNIT_ASSERT_VALUES_EQUAL((int)reply1->Record.GetStatus(), (int)NKikimrTenantPool::NOT_OWNER);
-
- // sender takes ownership
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvTenantPool::TEvTakeOwnership));
- runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvTenantPoolStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(runtime.Sender, handle->Recipient);
-
- // now sender successfully configures slot
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvTenantPool::TEvConfigureSlot(DOMAIN1_SLOT2, TENANT1_2_NAME, "")));
- auto reply2 = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvConfigureSlotResult>(handle);
- UNIT_ASSERT_VALUES_EQUAL((int)reply2->Record.GetStatus(), (int)NKikimrTenantPool::SUCCESS);
-
- // sender2 takes ownership and sender 1 is informed
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- sender2,
- new TEvTenantPool::TEvTakeOwnership));
- runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvLostOwnership>(handle);
- UNIT_ASSERT_VALUES_EQUAL(runtime.Sender, handle->Recipient);
- runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvTenantPoolStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(sender2, handle->Recipient);
-
- // sender now cannot configure slot again
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- runtime.Sender,
- new TEvTenantPool::TEvConfigureSlot(DOMAIN1_SLOT2, TENANT1_1_NAME, "")));
- auto reply3 = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvConfigureSlotResult>(handle);
- UNIT_ASSERT_VALUES_EQUAL((int)reply3->Record.GetStatus(), (int)NKikimrTenantPool::NOT_OWNER);
-
- // sender2 successfully configures slot
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
- sender2,
- new TEvTenantPool::TEvConfigureSlot(DOMAIN1_SLOT1, TENANT1_2_NAME, "")));
- auto reply4 = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvConfigureSlotResult>(handle);
- UNIT_ASSERT_VALUES_EQUAL((int)reply4->Record.GetStatus(), (int)NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
+
+ // sender cannot configure slot because he is not owner
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvTenantPool::TEvConfigureSlot(DOMAIN1_SLOT1, TENANT1_1_NAME, "")));
+ auto reply1 = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvConfigureSlotResult>(handle);
+ UNIT_ASSERT_VALUES_EQUAL((int)reply1->Record.GetStatus(), (int)NKikimrTenantPool::NOT_OWNER);
+
+ // sender takes ownership
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvTenantPool::TEvTakeOwnership));
+ runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvTenantPoolStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(runtime.Sender, handle->Recipient);
+
+ // now sender successfully configures slot
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvTenantPool::TEvConfigureSlot(DOMAIN1_SLOT2, TENANT1_2_NAME, "")));
+ auto reply2 = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvConfigureSlotResult>(handle);
+ UNIT_ASSERT_VALUES_EQUAL((int)reply2->Record.GetStatus(), (int)NKikimrTenantPool::SUCCESS);
+
+ // sender2 takes ownership and sender 1 is informed
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ sender2,
+ new TEvTenantPool::TEvTakeOwnership));
+ runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvLostOwnership>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(runtime.Sender, handle->Recipient);
+ runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvTenantPoolStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(sender2, handle->Recipient);
+
+ // sender now cannot configure slot again
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ runtime.Sender,
+ new TEvTenantPool::TEvConfigureSlot(DOMAIN1_SLOT2, TENANT1_1_NAME, "")));
+ auto reply3 = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvConfigureSlotResult>(handle);
+ UNIT_ASSERT_VALUES_EQUAL((int)reply3->Record.GetStatus(), (int)NKikimrTenantPool::NOT_OWNER);
+
+ // sender2 successfully configures slot
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(0), 0),
+ sender2,
+ new TEvTenantPool::TEvConfigureSlot(DOMAIN1_SLOT1, TENANT1_2_NAME, "")));
+ auto reply4 = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvConfigureSlotResult>(handle);
+ UNIT_ASSERT_VALUES_EQUAL((int)reply4->Record.GetStatus(), (int)NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1},
{TENANT1_2_NAME, 3, 3, 3}}});
-
- CheckTenantPoolStatus(runtime,
- TENANT1_2_NAME, TENANT1_2_NAME, "");
- }
-
+
+ CheckTenantPoolStatus(runtime,
+ TENANT1_2_NAME, TENANT1_2_NAME, "");
+ }
+
Y_UNIT_TEST(TestSensorLabels) {
- const TTenantTestConfig config = {
- // Domains {name, schemeshard {{ subdomain_names }}}
+ const TTenantTestConfig config = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
{{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME, TENANT1_2_NAME }}} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- true,
- // CreateConsole
- false,
- // Nodes
- {{
- // Node0
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
- ""
- }
- }
- }},
- // DataCenterCount
- 1
- };
- TTenantTestRuntime runtime(config);
- auto counters = runtime.GetDynamicCounters();
- auto &services = GetDatabaseSensorServices();
- for (auto &service : services) {
- auto group = GetServiceCounters(counters, service);
- auto counter = group->GetCounter("counter", true);
- *counter = 1;
- }
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, TENANT1_1_NAME, "slot-1", NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1}}});
-
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ true,
+ // CreateConsole
+ false,
+ // Nodes
+ {{
+ // Node0
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
+ ""
+ }
+ }
+ }},
+ // DataCenterCount
+ 1
+ };
+ TTenantTestRuntime runtime(config);
+ auto counters = runtime.GetDynamicCounters();
+ auto &services = GetDatabaseSensorServices();
+ for (auto &service : services) {
+ auto group = GetServiceCounters(counters, service);
+ auto counter = group->GetCounter("counter", true);
+ *counter = 1;
+ }
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, TENANT1_1_NAME, "slot-1", NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1}}});
+
auto &attrServices = GetDatabaseAttributeSensorServices();
- for (auto &service : services) {
+ for (auto &service : services) {
auto serviceGroup = GetServiceCounters(counters, service, false);
- auto tenantGroup = serviceGroup->FindSubgroup(DATABASE_LABEL, TENANT1_1_NAME);
- UNIT_ASSERT(tenantGroup);
+ auto tenantGroup = serviceGroup->FindSubgroup(DATABASE_LABEL, TENANT1_1_NAME);
+ UNIT_ASSERT(tenantGroup);
TIntrusivePtr<NMonitoring::TDynamicCounters> slotGroup;
if (attrServices.contains(service)) {
slotGroup = tenantGroup->FindSubgroup(HOST_LABEL, "slot-1");
} else {
slotGroup = tenantGroup->FindSubgroup(SLOT_LABEL, "static")->FindSubgroup(HOST_LABEL, "slot-1");
}
- UNIT_ASSERT(slotGroup);
- auto counter = slotGroup->GetCounter("counter", true);
- UNIT_ASSERT(*counter == 0);
- *counter = 1;
- }
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, DOMAIN1_NAME, "slot-2", NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1}}});
-
- CheckLabels(counters, "", "");
- for (auto &service : services) {
+ UNIT_ASSERT(slotGroup);
+ auto counter = slotGroup->GetCounter("counter", true);
+ UNIT_ASSERT(*counter == 0);
+ *counter = 1;
+ }
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, DOMAIN1_NAME, "slot-2", NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1}}});
+
+ CheckLabels(counters, "", "");
+ for (auto &service : services) {
auto serviceGroup = GetServiceCounters(counters, service, false);
- auto counter = serviceGroup->GetCounter("counter", true);
- UNIT_ASSERT(*counter == 0);
- *counter = 1;
- }
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, "", NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({});
-
- CheckLabels(counters, "", "");
- for (auto &service : services) {
+ auto counter = serviceGroup->GetCounter("counter", true);
+ UNIT_ASSERT(*counter == 0);
+ *counter = 1;
+ }
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, "", NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({});
+
+ CheckLabels(counters, "", "");
+ for (auto &service : services) {
auto serviceGroup = GetServiceCounters(counters, service, false);
- auto counter = serviceGroup->GetCounter("counter", true);
- UNIT_ASSERT(*counter == 0);
- }
-
- }
-
- Y_UNIT_TEST(TestForcedSensorLabels) {
- const TTenantTestConfig config = {
- // Domains {name, schemeshard {{ subdomain_names }}}
+ auto counter = serviceGroup->GetCounter("counter", true);
+ UNIT_ASSERT(*counter == 0);
+ }
+
+ }
+
+ Y_UNIT_TEST(TestForcedSensorLabels) {
+ const TTenantTestConfig config = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
{{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME, TENANT1_2_NAME }}} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- true,
- // CreateConsole
- false,
- // Nodes
- {{
- // Node0
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
- "",
- }
- }
- }},
- // DataCenterCount
- 1
- };
- NKikimrConfig::TAppConfig ext;
- ext.MutableMonitoringConfig()->SetForceDatabaseLabels(true);
- TTenantTestRuntime runtime(config, ext);
- auto counters = runtime.GetDynamicCounters();
- auto &services = GetDatabaseSensorServices();
- for (auto &service : services) {
- auto group = GetServiceCounters(counters, service);
- auto counter = group->GetCounter("counter", true);
- *counter = 1;
- }
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, TENANT1_1_NAME, "slot-1", NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1}}});
-
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ true,
+ // CreateConsole
+ false,
+ // Nodes
+ {{
+ // Node0
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
+ "",
+ }
+ }
+ }},
+ // DataCenterCount
+ 1
+ };
+ NKikimrConfig::TAppConfig ext;
+ ext.MutableMonitoringConfig()->SetForceDatabaseLabels(true);
+ TTenantTestRuntime runtime(config, ext);
+ auto counters = runtime.GetDynamicCounters();
+ auto &services = GetDatabaseSensorServices();
+ for (auto &service : services) {
+ auto group = GetServiceCounters(counters, service);
+ auto counter = group->GetCounter("counter", true);
+ *counter = 1;
+ }
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, TENANT1_1_NAME, "slot-1", NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1}}});
+
auto &attrServices = GetDatabaseAttributeSensorServices();
- for (auto &service : services) {
+ for (auto &service : services) {
auto serviceGroup = GetServiceCounters(counters, service, false);
- auto tenantGroup = serviceGroup->FindSubgroup(DATABASE_LABEL, TENANT1_1_NAME);
- UNIT_ASSERT(tenantGroup);
+ auto tenantGroup = serviceGroup->FindSubgroup(DATABASE_LABEL, TENANT1_1_NAME);
+ UNIT_ASSERT(tenantGroup);
NMonitoring::TDynamicCounterPtr slotGroup;
if (attrServices.contains(service)) {
slotGroup = tenantGroup->FindSubgroup(HOST_LABEL, "slot-1");
} else {
slotGroup = tenantGroup->FindSubgroup(SLOT_LABEL, "static")->FindSubgroup(HOST_LABEL, "slot-1");
}
- UNIT_ASSERT(slotGroup);
- auto counter = slotGroup->GetCounter("counter", true);
- UNIT_ASSERT(*counter == 0);
- *counter = 1;
- }
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, DOMAIN1_NAME, "slot-2", NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1}}});
-
- for (auto &service : services) {
+ UNIT_ASSERT(slotGroup);
+ auto counter = slotGroup->GetCounter("counter", true);
+ UNIT_ASSERT(*counter == 0);
+ *counter = 1;
+ }
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, DOMAIN1_NAME, "slot-2", NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 1, 1, 1}}});
+
+ for (auto &service : services) {
auto serviceGroup = GetServiceCounters(counters, service, false);
- auto tenantGroup = serviceGroup->FindSubgroup(DATABASE_LABEL, CanonizePath(DOMAIN1_NAME));
- UNIT_ASSERT(tenantGroup);
+ auto tenantGroup = serviceGroup->FindSubgroup(DATABASE_LABEL, CanonizePath(DOMAIN1_NAME));
+ UNIT_ASSERT(tenantGroup);
NMonitoring::TDynamicCounterPtr slotGroup;
if (attrServices.contains(service)) {
slotGroup = tenantGroup;
} else {
slotGroup = tenantGroup->FindSubgroup(SLOT_LABEL, "static");
}
- UNIT_ASSERT(slotGroup);
- auto counter = slotGroup->GetCounter("counter", true);
- UNIT_ASSERT(*counter == 0);
- *counter = 1;
- }
-
- CheckConfigureSlot(runtime, 0,
- DOMAIN1_SLOT1, "", NKikimrTenantPool::SUCCESS);
-
- runtime.WaitForHiveState({});
-
- for (auto &service : services) {
+ UNIT_ASSERT(slotGroup);
+ auto counter = slotGroup->GetCounter("counter", true);
+ UNIT_ASSERT(*counter == 0);
+ *counter = 1;
+ }
+
+ CheckConfigureSlot(runtime, 0,
+ DOMAIN1_SLOT1, "", NKikimrTenantPool::SUCCESS);
+
+ runtime.WaitForHiveState({});
+
+ for (auto &service : services) {
auto serviceGroup = GetServiceCounters(counters, service, false);
- auto tenantGroup = serviceGroup->FindSubgroup(DATABASE_LABEL, "<none>");
- UNIT_ASSERT(tenantGroup);
+ auto tenantGroup = serviceGroup->FindSubgroup(DATABASE_LABEL, "<none>");
+ UNIT_ASSERT(tenantGroup);
NMonitoring::TDynamicCounterPtr slotGroup;
if (attrServices.contains(service)) {
slotGroup = tenantGroup->FindSubgroup(HOST_LABEL, "unassigned");
} else {
slotGroup = tenantGroup->FindSubgroup(SLOT_LABEL, "static")->FindSubgroup(HOST_LABEL, "unassigned");
}
- UNIT_ASSERT(slotGroup);
- auto counter = slotGroup->GetCounter("counter", true);
- UNIT_ASSERT(*counter == 0);
- }
-
- }
-
+ UNIT_ASSERT(slotGroup);
+ auto counter = slotGroup->GetCounter("counter", true);
+ UNIT_ASSERT(*counter == 0);
+ }
+
+ }
+
Y_UNIT_TEST(TestSensorLabelsForStaticConfig) {
- const TTenantTestConfig config = {
- // Domains {name, schemeshard {{ subdomain_names }}}
+ const TTenantTestConfig config = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
{{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME, TENANT1_2_NAME }}} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- true,
- // CreateConsole
- false,
- // Nodes
- {{
- // Node0
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {},
- ""
- }
- },
- // Node1
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {TENANT1_1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {},
- ""
- }
- },
- // Node2
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, DOMAIN1_NAME, {1, 1, 1}} }},
- ""
- }
- },
- // Node3
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
- ""
- }
- },
- // Node4
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
- ""
- }
- },
- // Node5
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, DOMAIN1_NAME, {1, 1, 1}} }},
- ""
- }
- },
- // Node6
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
- ""
- }
- },
- // Node7
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}},
- {DOMAIN1_SLOT2, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
- ""
- }
- },
- // Node8
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
- ""
- }
- }
-
- }},
- // DataCenterCount
- 1
- };
-
- TTenantTestRuntime runtime(config);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 6, 6, 6},
- {TENANT1_1_NAME, 5, 5, 5}}});
-
- TVector<std::pair<TString, TString>> labels = { { "", "" },
- { TENANT1_1_NAME, "static" },
- { "", "" },
- { TENANT1_1_NAME, "dynamic" },
- { "", "" },
- { "", "" },
- { "", "" },
- { TENANT1_1_NAME, "<multiple>" },
- { "<multiple>", "<multiple>"} };
- for (size_t i = 0; i < labels.size(); ++i) {
- auto counters = runtime.GetDynamicCounters(i);
- CheckLabels(counters, labels[i].first, labels[i].second);
- }
- }
-
- Y_UNIT_TEST(TestForcedSensorLabelsForStaticConfig) {
- const TTenantTestConfig config = {
- // Domains {name, schemeshard {{ subdomain_names }}}
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ true,
+ // CreateConsole
+ false,
+ // Nodes
+ {{
+ // Node0
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {},
+ ""
+ }
+ },
+ // Node1
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {TENANT1_1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {},
+ ""
+ }
+ },
+ // Node2
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, DOMAIN1_NAME, {1, 1, 1}} }},
+ ""
+ }
+ },
+ // Node3
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
+ ""
+ }
+ },
+ // Node4
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
+ ""
+ }
+ },
+ // Node5
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, DOMAIN1_NAME, {1, 1, 1}} }},
+ ""
+ }
+ },
+ // Node6
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
+ ""
+ }
+ },
+ // Node7
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}},
+ {DOMAIN1_SLOT2, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
+ ""
+ }
+ },
+ // Node8
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
+ ""
+ }
+ }
+
+ }},
+ // DataCenterCount
+ 1
+ };
+
+ TTenantTestRuntime runtime(config);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 6, 6, 6},
+ {TENANT1_1_NAME, 5, 5, 5}}});
+
+ TVector<std::pair<TString, TString>> labels = { { "", "" },
+ { TENANT1_1_NAME, "static" },
+ { "", "" },
+ { TENANT1_1_NAME, "dynamic" },
+ { "", "" },
+ { "", "" },
+ { "", "" },
+ { TENANT1_1_NAME, "<multiple>" },
+ { "<multiple>", "<multiple>"} };
+ for (size_t i = 0; i < labels.size(); ++i) {
+ auto counters = runtime.GetDynamicCounters(i);
+ CheckLabels(counters, labels[i].first, labels[i].second);
+ }
+ }
+
+ Y_UNIT_TEST(TestForcedSensorLabelsForStaticConfig) {
+ const TTenantTestConfig config = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
{{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME, TENANT1_2_NAME }}} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- true,
- // CreateConsole
- false,
- // Nodes
- {{
- // Node0
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {},
- "",
- }
- },
- // Node1
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {TENANT1_1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {},
- "",
- }
- },
- // Node2
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, DOMAIN1_NAME, {1, 1, 1}} }},
- "",
- }
- },
- // Node3
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
- "",
- }
- },
- // Node4
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
- "",
- }
- },
- // Node5
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, DOMAIN1_NAME, {1, 1, 1}} }},
- "",
- }
- },
- // Node6
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
- "",
- }
- },
- // Node7
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}},
- {DOMAIN1_SLOT2, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
- "",
- }
- },
- // Node8
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
- "",
- }
- }
-
- }},
- // DataCenterCount
- 1
- };
-
- NKikimrConfig::TAppConfig ext;
- ext.MutableMonitoringConfig()->SetForceDatabaseLabels(true);
- TTenantTestRuntime runtime(config, ext);
-
- runtime.WaitForHiveState({{{DOMAIN1_NAME, 6, 6, 6},
- {TENANT1_1_NAME, 5, 5, 5}}});
-
- TVector<std::pair<TString, TString>> labels = { { CanonizePath(DOMAIN1_NAME), "static" },
- { TENANT1_1_NAME, "static" },
- { CanonizePath(DOMAIN1_NAME), "dynamic" },
- { TENANT1_1_NAME, "dynamic" },
- { CanonizePath(DOMAIN1_NAME), "static" },
- { CanonizePath(DOMAIN1_NAME), "<multiple>" },
- { "<none>", "dynamic" },
- { TENANT1_1_NAME, "<multiple>" },
- { "<multiple>", "<multiple>"} };
- for (size_t i = 0; i < labels.size(); ++i) {
- auto counters = runtime.GetDynamicCounters(i);
- CheckLabels(counters, labels[i].first, labels[i].second);
- }
- }
-
- Y_UNIT_TEST(TestDatabaseAttributeSensorLabels) {
- const TTenantTestConfig config = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- false,
- // FakeSchemeShard
- false,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {"slot", SLOT2_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
- "node-type"
- }
- },
- }},
- // DataCenterCount
- 1
- };
- TTenantTestRuntime runtime(config);
- auto counters = runtime.GetDynamicCounters();
-
- THashMap<TString, TString> attrs;
- for (auto &l : GetDatabaseAttributeLabels())
- attrs[l] = l + "_value";
- TVector<std::pair<TString, TString>> attrsv;
- for (auto &pr : attrs)
- attrsv.push_back(pr);
-
- CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- attrsv,
- SLOT2_TYPE, ZONE_ANY, 1);
-
- runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1}}});
-
- CheckLabels(counters, TENANT1_1_NAME, "slot-1", attrs);
-
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ true,
+ // CreateConsole
+ false,
+ // Nodes
+ {{
+ // Node0
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {},
+ "",
+ }
+ },
+ // Node1
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {TENANT1_1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {},
+ "",
+ }
+ },
+ // Node2
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, DOMAIN1_NAME, {1, 1, 1}} }},
+ "",
+ }
+ },
+ // Node3
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
+ "",
+ }
+ },
+ // Node4
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
+ "",
+ }
+ },
+ // Node5
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, DOMAIN1_NAME, {1, 1, 1}} }},
+ "",
+ }
+ },
+ // Node6
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
+ "",
+ }
+ },
+ // Node7
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}},
+ {DOMAIN1_SLOT2, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
+ "",
+ }
+ },
+ // Node8
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
+ "",
+ }
+ }
+
+ }},
+ // DataCenterCount
+ 1
+ };
+
+ NKikimrConfig::TAppConfig ext;
+ ext.MutableMonitoringConfig()->SetForceDatabaseLabels(true);
+ TTenantTestRuntime runtime(config, ext);
+
+ runtime.WaitForHiveState({{{DOMAIN1_NAME, 6, 6, 6},
+ {TENANT1_1_NAME, 5, 5, 5}}});
+
+ TVector<std::pair<TString, TString>> labels = { { CanonizePath(DOMAIN1_NAME), "static" },
+ { TENANT1_1_NAME, "static" },
+ { CanonizePath(DOMAIN1_NAME), "dynamic" },
+ { TENANT1_1_NAME, "dynamic" },
+ { CanonizePath(DOMAIN1_NAME), "static" },
+ { CanonizePath(DOMAIN1_NAME), "<multiple>" },
+ { "<none>", "dynamic" },
+ { TENANT1_1_NAME, "<multiple>" },
+ { "<multiple>", "<multiple>"} };
+ for (size_t i = 0; i < labels.size(); ++i) {
+ auto counters = runtime.GetDynamicCounters(i);
+ CheckLabels(counters, labels[i].first, labels[i].second);
+ }
+ }
+
+ Y_UNIT_TEST(TestDatabaseAttributeSensorLabels) {
+ const TTenantTestConfig config = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ false,
+ // FakeSchemeShard
+ false,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {"slot", SLOT2_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
+ "node-type"
+ }
+ },
+ }},
+ // DataCenterCount
+ 1
+ };
+ TTenantTestRuntime runtime(config);
+ auto counters = runtime.GetDynamicCounters();
+
+ THashMap<TString, TString> attrs;
+ for (auto &l : GetDatabaseAttributeLabels())
+ attrs[l] = l + "_value";
+ TVector<std::pair<TString, TString>> attrsv;
+ for (auto &pr : attrs)
+ attrsv.push_back(pr);
+
+ CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ attrsv,
+ SLOT2_TYPE, ZONE_ANY, 1);
+
+ runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1}}});
+
+ CheckLabels(counters, TENANT1_1_NAME, "slot-1", attrs);
+
WaitTenantRunning(runtime, TENANT1_1_NAME); // workaround for scheme cache race
- CheckRemoveTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS);
-
- runtime.WaitForHiveState({});
-
- CheckLabels(counters, "", "");
- }
-
- Y_UNIT_TEST(TestSensorsConfigForStaticSlot) {
- const TTenantTestConfig config = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- false,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {
- {
- // Static slots {tenant, {cpu, memory, network}}
- {{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {},
- "node-type"
- }
- },
- }},
- // DataCenterCount
- 1,
- // CreateConfigsDispatcher
- true
- };
-
- TTenantTestRuntime runtime(config);
- auto counters = runtime.GetDynamicCounters();
-
- CheckLabels(counters, "", "");
-
- NKikimrConfig::TAppConfig ext;
- auto &monCfg = *ext.MutableMonitoringConfig();
- monCfg.SetForceDatabaseLabels(true);
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, CanonizePath(DOMAIN1_NAME),
- monCfg.GetDatabaseLabels().GetStaticSlotLabelValue(),
- {}, monCfg);
-
- monCfg.MutableDatabaseLabels()->SetStaticSlotLabelValue("very-static");
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, CanonizePath(DOMAIN1_NAME),
- monCfg.GetDatabaseLabels().GetStaticSlotLabelValue(),
- {}, monCfg);
-
- monCfg.MutableDatabaseLabels()->ClearStaticSlotLabelValue();
- monCfg.MutableDatabaseLabels()->AddServices("tablets");
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, CanonizePath(DOMAIN1_NAME),
- monCfg.GetDatabaseLabels().GetStaticSlotLabelValue(),
- {}, monCfg);
-
- monCfg.MutableDatabaseLabels()->SetStaticSlotLabelValue("static-again");
- monCfg.MutableDatabaseLabels()->ClearServices();
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, CanonizePath(DOMAIN1_NAME),
- monCfg.GetDatabaseLabels().GetStaticSlotLabelValue(),
- {}, monCfg);
-
- monCfg.MutableDatabaseLabels()->SetEnabled(false);
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, "", "");
-
- monCfg.MutableDatabaseLabels()->SetEnabled(true);
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, CanonizePath(DOMAIN1_NAME),
- monCfg.GetDatabaseLabels().GetStaticSlotLabelValue(),
- {}, monCfg);
-
- monCfg.SetForceDatabaseLabels(false);
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, "", "");
- }
-
- Y_UNIT_TEST(TestSensorsConfigForDynamicSlotLabelValue) {
- const TTenantTestConfig config = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME }}} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- true,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
- "node-type"
- }
- },
- }},
- // DataCenterCount
- 1,
- // CreateConfigsDispatcher
- true
- };
-
- NKikimrConfig::TAppConfig ext;
- auto &monCfg = *ext.MutableMonitoringConfig();
-
- TTenantTestRuntime runtime(config, ext);
- auto counters = runtime.GetDynamicCounters();
-
- CheckLabels(counters, TENANT1_1_NAME,
- monCfg.GetDatabaseLabels().GetDynamicSlotLabelValue(),
- {}, monCfg);
-
- monCfg.MutableDatabaseLabels()->SetDynamicSlotLabelValue("very-dynamic");
- ChangeMonitoringConfig(runtime, monCfg, true);
-
- CheckLabels(counters, TENANT1_1_NAME,
- monCfg.GetDatabaseLabels().GetDynamicSlotLabelValue(),
- {}, monCfg);
- }
-
- Y_UNIT_TEST(TestSensorsConfigForDynamicSlot) {
- const TTenantTestConfig config = {
- // Domains {name, schemeshard {{ subdomain_names }}}
- {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- false,
- // FakeSchemeShard
- false,
- // CreateConsole
- true,
- // Nodes {tenant_pool_config, data_center}
- {{
- {
- {
- // Static slots {tenant, {cpu, memory, network}}
- {},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT2_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
- "node-type"
- }
- },
- }},
- // DataCenterCount
- 1,
- // CreateConfigsDispatcher
- true
- };
-
- NKikimrConfig::TAppConfig ext;
- auto &monCfg = *ext.MutableMonitoringConfig();
-
- TTenantTestRuntime runtime(config, ext);
- auto counters = runtime.GetDynamicCounters();
-
- THashMap<TString, TString> attrs;
- for (auto &l : GetDatabaseAttributeLabels())
- attrs[l] = l + "_value";
- TVector<std::pair<TString, TString>> attrsv;
- for (auto &pr : attrs)
- attrsv.push_back(pr);
-
- CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
- {{"hdd", 1}},
- attrsv,
- SLOT2_TYPE, ZONE_ANY, 1);
-
- runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1}}});
-
- CheckLabels(counters, TENANT1_1_NAME, "slot-1", attrs, monCfg);
-
- monCfg.MutableDatabaseLabels()->AddServices("ydb");
- monCfg.MutableDatabaseAttributeLabels()->AddAttributeGroups()
- ->AddServices("tablets");
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, TENANT1_1_NAME, "slot-1", attrs, monCfg);
-
- monCfg.MutableDatabaseLabels()->SetEnabled(false);
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, "", "", attrs, monCfg);
-
- monCfg.MutableDatabaseAttributeLabels()->SetEnabled(false);
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, "", "", {}, monCfg);
-
- monCfg.MutableDatabaseLabels()->SetEnabled(true);
- monCfg.MutableDatabaseAttributeLabels()->SetEnabled(true);
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, TENANT1_1_NAME, "slot-1", attrs, monCfg);
-
- monCfg.MutableDatabaseLabels()->ClearServices();
- monCfg.MutableDatabaseAttributeLabels()->ClearAttributeGroups();
- ChangeMonitoringConfig(runtime, monCfg);
-
- CheckLabels(counters, TENANT1_1_NAME, "slot-1", attrs, monCfg);
- }
+ CheckRemoveTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS);
+
+ runtime.WaitForHiveState({});
+
+ CheckLabels(counters, "", "");
+ }
+
+ Y_UNIT_TEST(TestSensorsConfigForStaticSlot) {
+ const TTenantTestConfig config = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ false,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_NAME, {1, 1, 1}} }},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {},
+ "node-type"
+ }
+ },
+ }},
+ // DataCenterCount
+ 1,
+ // CreateConfigsDispatcher
+ true
+ };
+
+ TTenantTestRuntime runtime(config);
+ auto counters = runtime.GetDynamicCounters();
+
+ CheckLabels(counters, "", "");
+
+ NKikimrConfig::TAppConfig ext;
+ auto &monCfg = *ext.MutableMonitoringConfig();
+ monCfg.SetForceDatabaseLabels(true);
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, CanonizePath(DOMAIN1_NAME),
+ monCfg.GetDatabaseLabels().GetStaticSlotLabelValue(),
+ {}, monCfg);
+
+ monCfg.MutableDatabaseLabels()->SetStaticSlotLabelValue("very-static");
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, CanonizePath(DOMAIN1_NAME),
+ monCfg.GetDatabaseLabels().GetStaticSlotLabelValue(),
+ {}, monCfg);
+
+ monCfg.MutableDatabaseLabels()->ClearStaticSlotLabelValue();
+ monCfg.MutableDatabaseLabels()->AddServices("tablets");
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, CanonizePath(DOMAIN1_NAME),
+ monCfg.GetDatabaseLabels().GetStaticSlotLabelValue(),
+ {}, monCfg);
+
+ monCfg.MutableDatabaseLabels()->SetStaticSlotLabelValue("static-again");
+ monCfg.MutableDatabaseLabels()->ClearServices();
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, CanonizePath(DOMAIN1_NAME),
+ monCfg.GetDatabaseLabels().GetStaticSlotLabelValue(),
+ {}, monCfg);
+
+ monCfg.MutableDatabaseLabels()->SetEnabled(false);
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, "", "");
+
+ monCfg.MutableDatabaseLabels()->SetEnabled(true);
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, CanonizePath(DOMAIN1_NAME),
+ monCfg.GetDatabaseLabels().GetStaticSlotLabelValue(),
+ {}, monCfg);
+
+ monCfg.SetForceDatabaseLabels(false);
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, "", "");
+ }
+
+ Y_UNIT_TEST(TestSensorsConfigForDynamicSlotLabelValue) {
+ const TTenantTestConfig config = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME }}} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ true,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_1_NAME, {1, 1, 1}} }},
+ "node-type"
+ }
+ },
+ }},
+ // DataCenterCount
+ 1,
+ // CreateConfigsDispatcher
+ true
+ };
+
+ NKikimrConfig::TAppConfig ext;
+ auto &monCfg = *ext.MutableMonitoringConfig();
+
+ TTenantTestRuntime runtime(config, ext);
+ auto counters = runtime.GetDynamicCounters();
+
+ CheckLabels(counters, TENANT1_1_NAME,
+ monCfg.GetDatabaseLabels().GetDynamicSlotLabelValue(),
+ {}, monCfg);
+
+ monCfg.MutableDatabaseLabels()->SetDynamicSlotLabelValue("very-dynamic");
+ ChangeMonitoringConfig(runtime, monCfg, true);
+
+ CheckLabels(counters, TENANT1_1_NAME,
+ monCfg.GetDatabaseLabels().GetDynamicSlotLabelValue(),
+ {}, monCfg);
+ }
+
+ Y_UNIT_TEST(TestSensorsConfigForDynamicSlot) {
+ const TTenantTestConfig config = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
+ {{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, TVector<TString>()} }},
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ false,
+ // FakeSchemeShard
+ false,
+ // CreateConsole
+ true,
+ // Nodes {tenant_pool_config, data_center}
+ {{
+ {
+ {
+ // Static slots {tenant, {cpu, memory, network}}
+ {},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT2_TYPE, DOMAIN1_NAME, "", {1, 1, 1}} }},
+ "node-type"
+ }
+ },
+ }},
+ // DataCenterCount
+ 1,
+ // CreateConfigsDispatcher
+ true
+ };
+
+ NKikimrConfig::TAppConfig ext;
+ auto &monCfg = *ext.MutableMonitoringConfig();
+
+ TTenantTestRuntime runtime(config, ext);
+ auto counters = runtime.GetDynamicCounters();
+
+ THashMap<TString, TString> attrs;
+ for (auto &l : GetDatabaseAttributeLabels())
+ attrs[l] = l + "_value";
+ TVector<std::pair<TString, TString>> attrsv;
+ for (auto &pr : attrs)
+ attrsv.push_back(pr);
+
+ CheckCreateTenant(runtime, TENANT1_1_NAME, Ydb::StatusIds::SUCCESS,
+ {{"hdd", 1}},
+ attrsv,
+ SLOT2_TYPE, ZONE_ANY, 1);
+
+ runtime.WaitForHiveState({{{TENANT1_1_NAME, 1, 1, 1}}});
+
+ CheckLabels(counters, TENANT1_1_NAME, "slot-1", attrs, monCfg);
+
+ monCfg.MutableDatabaseLabels()->AddServices("ydb");
+ monCfg.MutableDatabaseAttributeLabels()->AddAttributeGroups()
+ ->AddServices("tablets");
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, TENANT1_1_NAME, "slot-1", attrs, monCfg);
+
+ monCfg.MutableDatabaseLabels()->SetEnabled(false);
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, "", "", attrs, monCfg);
+
+ monCfg.MutableDatabaseAttributeLabels()->SetEnabled(false);
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, "", "", {}, monCfg);
+
+ monCfg.MutableDatabaseLabels()->SetEnabled(true);
+ monCfg.MutableDatabaseAttributeLabels()->SetEnabled(true);
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, TENANT1_1_NAME, "slot-1", attrs, monCfg);
+
+ monCfg.MutableDatabaseLabels()->ClearServices();
+ monCfg.MutableDatabaseAttributeLabels()->ClearAttributeGroups();
+ ChangeMonitoringConfig(runtime, monCfg);
+
+ CheckLabels(counters, TENANT1_1_NAME, "slot-1", attrs, monCfg);
+ }
void TestState(
const TTenantTestConfig::TStaticSlotConfig& staticSlot,
@@ -1256,9 +1256,9 @@ Y_UNIT_TEST_SUITE(TTenantPoolTests) {
// After unsuccessful resolve on SS, tenant will be detached from slot, so state is unknown
TestState({}, {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, TENANT1_U_NAME, {1, 1, 1}}, NKikimrTenantPool::EState::STATE_UNKNOWN);
}
-}
-
-} //namespace NKikimr
+}
+
+} //namespace NKikimr
template <>
void Out<NKikimrTenantPool::EState>(IOutputStream& o, NKikimrTenantPool::EState x) {
diff --git a/ydb/core/mind/ut/ya.make b/ydb/core/mind/ut/ya.make
index 938fd98af24..26e6412fc74 100644
--- a/ydb/core/mind/ut/ya.make
+++ b/ydb/core/mind/ut/ya.make
@@ -35,10 +35,10 @@ PEERDIR(
)
SRCS(
- node_broker_ut.cpp
- tenant_ut_broker.cpp
- tenant_ut_local.cpp
- tenant_ut_pool.cpp
+ node_broker_ut.cpp
+ tenant_ut_broker.cpp
+ tenant_ut_local.cpp
+ tenant_ut_pool.cpp
tenant_node_enumeration_ut.cpp
)
diff --git a/ydb/core/mind/ut_fat/blobstorage_node_warden_ut_fat.cpp b/ydb/core/mind/ut_fat/blobstorage_node_warden_ut_fat.cpp
index 66733fab568..011f03d93cd 100644
--- a/ydb/core/mind/ut_fat/blobstorage_node_warden_ut_fat.cpp
+++ b/ydb/core/mind/ut_fat/blobstorage_node_warden_ut_fat.cpp
@@ -61,7 +61,7 @@ static bool IsVerbose = true;
static yexception LastException;
-constexpr ui32 DOMAIN_ID = 31;
+constexpr ui32 DOMAIN_ID = 31;
using namespace NActors;
diff --git a/ydb/core/mind/ya.make b/ydb/core/mind/ya.make
index 854af4fdcae..b9248c9d911 100644
--- a/ydb/core/mind/ya.make
+++ b/ydb/core/mind/ya.make
@@ -10,45 +10,45 @@ SRCS(
configured_tablet_bootstrapper.cpp
configured_tablet_bootstrapper.h
defs.h
- dynamic_nameserver.cpp
- dynamic_nameserver.h
- dynamic_nameserver_impl.h
- dynamic_nameserver_mon.cpp
- labels_maintainer.cpp
- labels_maintainer.h
- lease_holder.cpp
- lease_holder.h
+ dynamic_nameserver.cpp
+ dynamic_nameserver.h
+ dynamic_nameserver_impl.h
+ dynamic_nameserver_mon.cpp
+ labels_maintainer.cpp
+ labels_maintainer.h
+ lease_holder.cpp
+ lease_holder.h
local.cpp
local.h
- node_broker.cpp
- node_broker.h
- node_broker_impl.h
- node_broker__extend_lease.cpp
- node_broker__init_scheme.cpp
- node_broker__load_state.cpp
- node_broker__register_node.cpp
- node_broker__scheme.h
- node_broker__update_config.cpp
- node_broker__update_config_subscription.cpp
- node_broker__update_epoch.cpp
+ node_broker.cpp
+ node_broker.h
+ node_broker_impl.h
+ node_broker__extend_lease.cpp
+ node_broker__init_scheme.cpp
+ node_broker__load_state.cpp
+ node_broker__register_node.cpp
+ node_broker__scheme.h
+ node_broker__update_config.cpp
+ node_broker__update_config_subscription.cpp
+ node_broker__update_epoch.cpp
table_adapter.h
tenant_node_enumeration.cpp
tenant_node_enumeration.h
- tenant_pool.h
- tenant_pool.cpp
- tenant_slot_broker.cpp
- tenant_slot_broker.h
- tenant_slot_broker_impl.h
- tenant_slot_broker__alter_tenant.cpp
- tenant_slot_broker__assign_free_slots.cpp
- tenant_slot_broker__check_slot_status.cpp
- tenant_slot_broker__init_scheme.cpp
- tenant_slot_broker__load_state.cpp
- tenant_slot_broker__scheme.h
- tenant_slot_broker__update_config.cpp
- tenant_slot_broker__update_pool_status.cpp
- tenant_slot_broker__update_node_location.cpp
- tenant_slot_broker__update_slot_status.cpp
+ tenant_pool.h
+ tenant_pool.cpp
+ tenant_slot_broker.cpp
+ tenant_slot_broker.h
+ tenant_slot_broker_impl.h
+ tenant_slot_broker__alter_tenant.cpp
+ tenant_slot_broker__assign_free_slots.cpp
+ tenant_slot_broker__check_slot_status.cpp
+ tenant_slot_broker__init_scheme.cpp
+ tenant_slot_broker__load_state.cpp
+ tenant_slot_broker__scheme.h
+ tenant_slot_broker__update_config.cpp
+ tenant_slot_broker__update_pool_status.cpp
+ tenant_slot_broker__update_node_location.cpp
+ tenant_slot_broker__update_slot_status.cpp
)
PEERDIR(
diff --git a/ydb/core/persqueue/percentile_counter.cpp b/ydb/core/persqueue/percentile_counter.cpp
index 7059b24d83d..a6414e70bd8 100644
--- a/ydb/core/persqueue/percentile_counter.cpp
+++ b/ydb/core/persqueue/percentile_counter.cpp
@@ -2,7 +2,7 @@
#include <ydb/library/persqueue/topic_parser/topic_parser.h>
#include <ydb/core/base/counters.h>
-
+
namespace NKikimr {
namespace NPQ {
diff --git a/ydb/core/persqueue/type_codecs_defs.cpp b/ydb/core/persqueue/type_codecs_defs.cpp
index 7534bc86a75..f333be5cfc6 100644
--- a/ydb/core/persqueue/type_codecs_defs.cpp
+++ b/ydb/core/persqueue/type_codecs_defs.cpp
@@ -123,22 +123,22 @@ TTypeCodecs::TTypeCodecs(TTypeId typeId) {
case NTypeIds::StepOrderId:
AddFixedLen<TStepOrderId>(this);
break;
- case NTypeIds::Decimal:
- AddFixedLen<TDecimal>(this);
- break;
-
- case NTypeIds::Date:
- AddFixedLen<TDate>(this);
- break;
- case NTypeIds::Datetime:
- AddFixedLen<TDatetime>(this);
- break;
- case NTypeIds::Timestamp:
- AddFixedLen<TTimestamp>(this);
- break;
- case NTypeIds::Interval:
- AddFixedLen<TInterval>(this);
- break;
+ case NTypeIds::Decimal:
+ AddFixedLen<TDecimal>(this);
+ break;
+
+ case NTypeIds::Date:
+ AddFixedLen<TDate>(this);
+ break;
+ case NTypeIds::Datetime:
+ AddFixedLen<TDatetime>(this);
+ break;
+ case NTypeIds::Timestamp:
+ AddFixedLen<TTimestamp>(this);
+ break;
+ case NTypeIds::Interval:
+ AddFixedLen<TInterval>(this);
+ break;
}
}
diff --git a/ydb/core/protos/cms.proto b/ydb/core/protos/cms.proto
index 427e2542563..fa3e2452191 100644
--- a/ydb/core/protos/cms.proto
+++ b/ydb/core/protos/cms.proto
@@ -1,164 +1,164 @@
import "ydb/core/protos/blobstorage_config.proto";
import "ydb/core/protos/blobstorage_disk.proto";
-
-package NKikimrCms;
-option java_package = "ru.yandex.kikimr.proto";
-
-message TStatus {
- enum ECode {
- UNKNOWN = 0;
- OK = 1;
- ALLOW = 2;
- ALLOW_PARTIAL = 3;
- DISALLOW = 4;
- DISALLOW_TEMP = 5;
- WRONG_REQUEST = 6;
- ERROR = 7;
- ERROR_TEMP = 8;
- UNAUTHORIZED = 9;
+
+package NKikimrCms;
+option java_package = "ru.yandex.kikimr.proto";
+
+message TStatus {
+ enum ECode {
+ UNKNOWN = 0;
+ OK = 1;
+ ALLOW = 2;
+ ALLOW_PARTIAL = 3;
+ DISALLOW = 4;
+ DISALLOW_TEMP = 5;
+ WRONG_REQUEST = 6;
+ ERROR = 7;
+ ERROR_TEMP = 8;
+ UNAUTHORIZED = 9;
NO_SUCH_HOST = 10;
NO_SUCH_DEVICE = 11;
NO_SUCH_SERVICE = 12;
- }
-
- optional ECode Code = 1;
- optional string Reason = 2;
-}
-
-enum EState {
- // Service/host state couldn't be identified.
- UNKNOWN = 0;
- // Service/host is up.
- UP = 1;
- // Service/host is down due to planned restart.
- RESTART = 2;
- // Service/host is down off-schedule.
- DOWN = 3;
-}
-
-enum EMarker {
- MARKER_UNKNOWN = 0;
- // Can be applied to hosts, nodes and PDisks to mark
- // specific disk or all disks on the host/node as broken.
- MARKER_DISK_BROKEN = 1;
- // Can be applied to hosts, nodes and PDisks to mark
- // specific disk or all disks on the host/node as faulty.
- MARKER_DISK_FAULTY = 2;
- // Can be applied to hosts, nodes and PDisks to mark
- // specific disk or all disks on the host/node as active.
- MARKER_DISK_ACTIVE = 3;
- // Can be applied to hosts, nodes and PDisks to mark
- // specific disk or all disks on the host/node as inactive.
- MARKER_DISK_INACTIVE = 4;
-}
-
-message TServiceState {
- optional string Name = 1;
- optional EState State = 2;
- optional string Version = 3;
- optional uint64 Timestamp = 4;
-}
-
-message TDeviceState {
- optional string Name = 1;
- optional EState State = 2;
- optional uint64 Timestamp = 3;
- repeated EMarker Markers = 4;
-}
-
-message THostState {
- optional string Name = 1;
- optional EState State = 2;
- repeated TServiceState Services = 3;
- repeated TDeviceState Devices = 4;
- optional uint64 Timestamp = 5;
+ }
+
+ optional ECode Code = 1;
+ optional string Reason = 2;
+}
+
+enum EState {
+ // Service/host state couldn't be identified.
+ UNKNOWN = 0;
+ // Service/host is up.
+ UP = 1;
+ // Service/host is down due to planned restart.
+ RESTART = 2;
+ // Service/host is down off-schedule.
+ DOWN = 3;
+}
+
+enum EMarker {
+ MARKER_UNKNOWN = 0;
+ // Can be applied to hosts, nodes and PDisks to mark
+ // specific disk or all disks on the host/node as broken.
+ MARKER_DISK_BROKEN = 1;
+ // Can be applied to hosts, nodes and PDisks to mark
+ // specific disk or all disks on the host/node as faulty.
+ MARKER_DISK_FAULTY = 2;
+ // Can be applied to hosts, nodes and PDisks to mark
+ // specific disk or all disks on the host/node as active.
+ MARKER_DISK_ACTIVE = 3;
+ // Can be applied to hosts, nodes and PDisks to mark
+ // specific disk or all disks on the host/node as inactive.
+ MARKER_DISK_INACTIVE = 4;
+}
+
+message TServiceState {
+ optional string Name = 1;
+ optional EState State = 2;
+ optional string Version = 3;
+ optional uint64 Timestamp = 4;
+}
+
+message TDeviceState {
+ optional string Name = 1;
+ optional EState State = 2;
+ optional uint64 Timestamp = 3;
+ repeated EMarker Markers = 4;
+}
+
+message THostState {
+ optional string Name = 1;
+ optional EState State = 2;
+ repeated TServiceState Services = 3;
+ repeated TDeviceState Devices = 4;
+ optional uint64 Timestamp = 5;
optional uint32 NodeId = 6;
optional uint32 InterconnectPort = 7;
- repeated EMarker Markers = 8;
-}
-
-message TClusterState {
- optional string Name = 1;
- repeated THostState Hosts = 2;
- optional uint64 Timestamp = 3;
-}
-
-message TClusterStateRequest {
- repeated string Hosts = 1;
-}
-
-message TClusterStateResponse {
- optional TStatus Status = 1;
- optional TClusterState State = 2;
-}
-
-message TAction {
- enum EType {
- UNKNOWN = 0;
- START_SERVICES = 1;
- RESTART_SERVICES = 2;
- STOP_SERVICES = 3;
- ADD_HOST = 4;
- SHUTDOWN_HOST = 5;
- DECOMMISSION_HOST = 6;
- ADD_DEVICES = 7;
- REPLACE_DEVICES = 8;
- REMOVE_DEVICES = 9;
- }
-
- optional EType Type = 1;
- optional string Host = 2;
- repeated string Services = 3;
- repeated string Devices = 4;
- optional uint64 Duration = 5;
+ repeated EMarker Markers = 8;
+}
+
+message TClusterState {
+ optional string Name = 1;
+ repeated THostState Hosts = 2;
+ optional uint64 Timestamp = 3;
+}
+
+message TClusterStateRequest {
+ repeated string Hosts = 1;
+}
+
+message TClusterStateResponse {
+ optional TStatus Status = 1;
+ optional TClusterState State = 2;
+}
+
+message TAction {
+ enum EType {
+ UNKNOWN = 0;
+ START_SERVICES = 1;
+ RESTART_SERVICES = 2;
+ STOP_SERVICES = 3;
+ ADD_HOST = 4;
+ SHUTDOWN_HOST = 5;
+ DECOMMISSION_HOST = 6;
+ ADD_DEVICES = 7;
+ REPLACE_DEVICES = 8;
+ REMOVE_DEVICES = 9;
+ }
+
+ optional EType Type = 1;
+ optional string Host = 2;
+ repeated string Services = 3;
+ repeated string Devices = 4;
+ optional uint64 Duration = 5;
// If specified will be expanded to list of hosts.
optional string Tenant = 6;
-}
-
+}
+
enum ETenantPolicy {
- // No limits for computational nodes restarts.
+ // No limits for computational nodes restarts.
NONE = 0;
- // Follow TenantLimits specified in CMS config.
+ // Follow TenantLimits specified in CMS config.
DEFAULT = 1;
}
-enum EAvailabilityMode {
- // By default CMS tries to guarantee cluster availability
- // by allowing at most 1 disabled disk in each storage group.
- // For compute nodes tenant and cluster policies are followed.
- MODE_MAX_AVAILABILITY = 0;
- // This mode allows to move cluster restart/update forward
- // in case some nodes are permanently down. In this mode
- // CMS allows at most 1 locked (by permission to restart
- // node or replace device) disk in a group. But total number
- // of disabled disks for a group shouldn't exceed number
- // of parity parts in that group.
- // Compute nodes are handled as in default mode.
- MODE_KEEP_AVAILABLE = 1;
- // In this mode CMS allows at most 1 locked disk in a group
- // ignoring its parity parts count. Allows to restart nodes
- // even if multiple disks of some group are down. Using
- // this mode might cause data unavailability.
- // For compute nodes CMS follows tenant and cluster policies
- // but allows to restart at least one node for tenant or
- // cluster.
- MODE_FORCE_RESTART = 2;
-}
-
-message TPermissionRequest {
- optional string User = 1;
- repeated TAction Actions = 2;
- optional bool PartialPermissionAllowed = 3 [default = false];
- optional bool Schedule = 4;
- optional bool DryRun = 5;
- optional string Reason = 6;
- // If not specified then default duration from CMS config is used.
- optional uint64 Duration = 7;
- optional ETenantPolicy TenantPolicy = 8 [default = DEFAULT];
- // Availability mode is not preserved for scheduled events.
- optional EAvailabilityMode AvailabilityMode = 9 [default = MODE_MAX_AVAILABILITY];
-}
-
+enum EAvailabilityMode {
+ // By default CMS tries to guarantee cluster availability
+ // by allowing at most 1 disabled disk in each storage group.
+ // For compute nodes tenant and cluster policies are followed.
+ MODE_MAX_AVAILABILITY = 0;
+ // This mode allows to move cluster restart/update forward
+ // in case some nodes are permanently down. In this mode
+ // CMS allows at most 1 locked (by permission to restart
+ // node or replace device) disk in a group. But total number
+ // of disabled disks for a group shouldn't exceed number
+ // of parity parts in that group.
+ // Compute nodes are handled as in default mode.
+ MODE_KEEP_AVAILABLE = 1;
+ // In this mode CMS allows at most 1 locked disk in a group
+ // ignoring its parity parts count. Allows to restart nodes
+ // even if multiple disks of some group are down. Using
+ // this mode might cause data unavailability.
+ // For compute nodes CMS follows tenant and cluster policies
+ // but allows to restart at least one node for tenant or
+ // cluster.
+ MODE_FORCE_RESTART = 2;
+}
+
+message TPermissionRequest {
+ optional string User = 1;
+ repeated TAction Actions = 2;
+ optional bool PartialPermissionAllowed = 3 [default = false];
+ optional bool Schedule = 4;
+ optional bool DryRun = 5;
+ optional string Reason = 6;
+ // If not specified then default duration from CMS config is used.
+ optional uint64 Duration = 7;
+ optional ETenantPolicy TenantPolicy = 8 [default = DEFAULT];
+ // Availability mode is not preserved for scheduled events.
+ optional EAvailabilityMode AvailabilityMode = 9 [default = MODE_MAX_AVAILABILITY];
+}
+
enum EExtensionType {
HostInfo = 1;
}
@@ -168,236 +168,236 @@ message TPermissionExtension {
repeated THostState Hosts = 2;
}
-message TPermission {
- optional string Id = 1;
- optional TAction Action = 2;
- optional uint64 Deadline = 3;
+message TPermission {
+ optional string Id = 1;
+ optional TAction Action = 2;
+ optional uint64 Deadline = 3;
repeated TPermissionExtension Extentions = 4;
-}
-
-message TPermissionResponse {
- optional TStatus Status = 1;
- optional string RequestId = 2;
- repeated TPermission Permissions = 3;
- optional uint64 Deadline = 4;
-}
-
-message TManageRequestRequest {
- enum ECommand {
- UNKNOWN = 0;
- LIST = 1;
- GET = 2;
- REJECT = 3;
- }
-
- optional string User = 1;
- optional ECommand Command = 2;
- optional string RequestId = 3;
- optional bool DryRun = 4;
-}
-
-message TManageRequestResponse {
- message TScheduledRequest {
- optional string RequestId = 1;
- optional string Owner = 2;
- repeated TAction Actions = 3;
- optional bool PartialPermissionAllowed = 4;
- optional string Reason = 5;
- }
-
- optional TStatus Status = 1;
- repeated TScheduledRequest Requests = 2;
-}
-
-message TCheckRequest {
- optional string User = 1;
- optional string RequestId = 2;
- optional bool DryRun = 3;
- optional EAvailabilityMode AvailabilityMode = 4 [default = MODE_MAX_AVAILABILITY];
-}
-
-message TManagePermissionRequest {
- enum ECommand {
- UNKNOWN = 0;
- LIST = 1;
- GET = 2;
- DONE = 3;
- EXTEND = 4;
- REJECT = 5;
- }
-
- optional string User = 1;
- optional ECommand Command = 2;
- repeated string Permissions = 3;
- optional uint64 Deadline = 4;
- optional bool DryRun = 5;
-}
-
-message TManagePermissionResponse {
- optional TStatus Status = 1;
- repeated TPermission Permissions = 2;
-}
-
-message TVersionFilter {
- enum EType {
- UNKNOWN = 0;
- MATCH = 1;
- MISMATCH = 2;
- LOWER = 3;
- GREATER = 4;
- }
- optional EType Type = 1;
- optional string Version = 2;
-}
-
-message TNameFilter {
- enum EType {
- UNKNOWN = 0;
- ONE_OF = 1;
- NOT_IN = 2;
- }
-
- optional EType Type = 1;
- repeated string Names = 2;
-}
-
-message TServiceFilter {
- optional TNameFilter NameFilter = 1;
- optional TVersionFilter VersionFilter = 2;
-}
-
-message THostFilter {
- optional TNameFilter NameFilter = 1;
-}
-
-message TConditionalPermissionRequest {
- optional string User = 1;
- optional TAction Action = 2;
- optional TServiceFilter ServiceFilter = 3;
- optional THostFilter HostFilter = 4;
- optional bool PartialPermissionAllowed = 5;
- optional bool Schedule = 6;
- optional bool DryRun = 7;
- optional string Reason = 8;
- // If not specified then default duration from CMS config is used.
- optional uint64 Duration = 9;
-}
-
-message TNotification {
- optional string User = 1;
- repeated TAction Actions = 2;
- optional uint64 Time = 3;
- optional string Reason = 4;
-}
-
-message TNotificationResponse {
- optional TStatus Status = 1;
- optional string NotificationId = 2;
-}
-
-message TManageNotificationRequest {
- enum ECommand {
- UNKNOWN = 0;
- LIST = 1;
- GET = 2;
- REJECT = 3;
- }
-
- optional string User = 1;
- optional ECommand Command = 2;
- optional string NotificationId = 3;
- optional bool DryRun = 4;
-}
-
-message TManageNotificationResponse {
- message TStoredNotification {
- optional string NotificationId = 1;
- optional string Owner = 2;
- repeated TAction Actions = 3;
- optional uint64 Time = 4;
- optional string Reason = 5;
- }
-
- optional TStatus Status = 1;
- repeated TStoredNotification Notifications = 2;
-}
-
-message TWalleCreateTaskRequest {
- optional string TaskId = 1;
- optional string Type = 2;
- optional string Issuer = 3;
- optional string Action = 4;
- repeated string Hosts = 5;
- optional bool DryRun = 6;
-}
-
-message TWalleCreateTaskResponse {
- optional TStatus Status = 1;
- optional string TaskId = 2;
- repeated string Hosts = 3;
-}
-
-message TWalleListTasksRequest {
-}
-
-message TWalleTaskInfo {
- optional string TaskId = 1;
- repeated string Hosts = 2;
- optional string Status = 3;
-}
-
-message TWalleListTasksResponse {
- repeated TWalleTaskInfo Tasks = 1;
-}
-
-message TWalleCheckTaskRequest {
- optional string TaskId = 1;
-}
-
-message TWalleCheckTaskResponse {
- optional TStatus Status = 1;
- optional TWalleTaskInfo Task = 2;
-}
-
-message TWalleRemoveTaskRequest {
- optional string TaskId = 1;
-}
-
-message TWalleRemoveTaskResponse {
- optional TStatus Status = 1;
-}
-
-message TLimits {
- // Max number of nodes which may be disabled at once.
- // It includes down/locked nodes and nodes with
- // down/locked disks.
- optional uint32 DisabledNodesLimit = 1;
- // Works similarly to DisabledNodesLimit but specify
- // limit in percents of cluster/tenant nodes count.
- optional uint32 DisabledNodesRatioLimit = 2 [default = 10];
-}
-
-message TCmsConfig {
- message TMonitorConfig {
- // Enable monitor creation.
- optional bool EnableAutoUpdates = 1;
- // State update interval.
- optional uint64 UpdateInterval = 2 [default = 60000000];
- // Gaps between downtime periods of smaller size are
- // ignored.
- optional uint64 IgnoredDowntimeGap = 3 [default = 600000000];
- // Device gets broken status after specified timeout or in
- // advance if specified downtime is planned soon enough
- // (see BrokenPrepTimeout).
- optional uint64 BrokenTimeout = 4 [default = 7200000000];
- // Device become broken if big enough (>= BrokenTimeout)
- // downtime is planned within specified period.
- optional uint64 BrokenPrepTimeout = 5 [default = 600000000];
- // Device become faulty if big enough (>= BrokenTimeout)
- // downtime is planned within specified period.
- optional uint64 FaultyPrepTimeout = 6 [default = 3600000000];
- }
-
+}
+
+message TPermissionResponse {
+ optional TStatus Status = 1;
+ optional string RequestId = 2;
+ repeated TPermission Permissions = 3;
+ optional uint64 Deadline = 4;
+}
+
+message TManageRequestRequest {
+ enum ECommand {
+ UNKNOWN = 0;
+ LIST = 1;
+ GET = 2;
+ REJECT = 3;
+ }
+
+ optional string User = 1;
+ optional ECommand Command = 2;
+ optional string RequestId = 3;
+ optional bool DryRun = 4;
+}
+
+message TManageRequestResponse {
+ message TScheduledRequest {
+ optional string RequestId = 1;
+ optional string Owner = 2;
+ repeated TAction Actions = 3;
+ optional bool PartialPermissionAllowed = 4;
+ optional string Reason = 5;
+ }
+
+ optional TStatus Status = 1;
+ repeated TScheduledRequest Requests = 2;
+}
+
+message TCheckRequest {
+ optional string User = 1;
+ optional string RequestId = 2;
+ optional bool DryRun = 3;
+ optional EAvailabilityMode AvailabilityMode = 4 [default = MODE_MAX_AVAILABILITY];
+}
+
+message TManagePermissionRequest {
+ enum ECommand {
+ UNKNOWN = 0;
+ LIST = 1;
+ GET = 2;
+ DONE = 3;
+ EXTEND = 4;
+ REJECT = 5;
+ }
+
+ optional string User = 1;
+ optional ECommand Command = 2;
+ repeated string Permissions = 3;
+ optional uint64 Deadline = 4;
+ optional bool DryRun = 5;
+}
+
+message TManagePermissionResponse {
+ optional TStatus Status = 1;
+ repeated TPermission Permissions = 2;
+}
+
+message TVersionFilter {
+ enum EType {
+ UNKNOWN = 0;
+ MATCH = 1;
+ MISMATCH = 2;
+ LOWER = 3;
+ GREATER = 4;
+ }
+ optional EType Type = 1;
+ optional string Version = 2;
+}
+
+message TNameFilter {
+ enum EType {
+ UNKNOWN = 0;
+ ONE_OF = 1;
+ NOT_IN = 2;
+ }
+
+ optional EType Type = 1;
+ repeated string Names = 2;
+}
+
+message TServiceFilter {
+ optional TNameFilter NameFilter = 1;
+ optional TVersionFilter VersionFilter = 2;
+}
+
+message THostFilter {
+ optional TNameFilter NameFilter = 1;
+}
+
+message TConditionalPermissionRequest {
+ optional string User = 1;
+ optional TAction Action = 2;
+ optional TServiceFilter ServiceFilter = 3;
+ optional THostFilter HostFilter = 4;
+ optional bool PartialPermissionAllowed = 5;
+ optional bool Schedule = 6;
+ optional bool DryRun = 7;
+ optional string Reason = 8;
+ // If not specified then default duration from CMS config is used.
+ optional uint64 Duration = 9;
+}
+
+message TNotification {
+ optional string User = 1;
+ repeated TAction Actions = 2;
+ optional uint64 Time = 3;
+ optional string Reason = 4;
+}
+
+message TNotificationResponse {
+ optional TStatus Status = 1;
+ optional string NotificationId = 2;
+}
+
+message TManageNotificationRequest {
+ enum ECommand {
+ UNKNOWN = 0;
+ LIST = 1;
+ GET = 2;
+ REJECT = 3;
+ }
+
+ optional string User = 1;
+ optional ECommand Command = 2;
+ optional string NotificationId = 3;
+ optional bool DryRun = 4;
+}
+
+message TManageNotificationResponse {
+ message TStoredNotification {
+ optional string NotificationId = 1;
+ optional string Owner = 2;
+ repeated TAction Actions = 3;
+ optional uint64 Time = 4;
+ optional string Reason = 5;
+ }
+
+ optional TStatus Status = 1;
+ repeated TStoredNotification Notifications = 2;
+}
+
+message TWalleCreateTaskRequest {
+ optional string TaskId = 1;
+ optional string Type = 2;
+ optional string Issuer = 3;
+ optional string Action = 4;
+ repeated string Hosts = 5;
+ optional bool DryRun = 6;
+}
+
+message TWalleCreateTaskResponse {
+ optional TStatus Status = 1;
+ optional string TaskId = 2;
+ repeated string Hosts = 3;
+}
+
+message TWalleListTasksRequest {
+}
+
+message TWalleTaskInfo {
+ optional string TaskId = 1;
+ repeated string Hosts = 2;
+ optional string Status = 3;
+}
+
+message TWalleListTasksResponse {
+ repeated TWalleTaskInfo Tasks = 1;
+}
+
+message TWalleCheckTaskRequest {
+ optional string TaskId = 1;
+}
+
+message TWalleCheckTaskResponse {
+ optional TStatus Status = 1;
+ optional TWalleTaskInfo Task = 2;
+}
+
+message TWalleRemoveTaskRequest {
+ optional string TaskId = 1;
+}
+
+message TWalleRemoveTaskResponse {
+ optional TStatus Status = 1;
+}
+
+message TLimits {
+ // Max number of nodes which may be disabled at once.
+ // It includes down/locked nodes and nodes with
+ // down/locked disks.
+ optional uint32 DisabledNodesLimit = 1;
+ // Works similarly to DisabledNodesLimit but specify
+ // limit in percents of cluster/tenant nodes count.
+ optional uint32 DisabledNodesRatioLimit = 2 [default = 10];
+}
+
+message TCmsConfig {
+ message TMonitorConfig {
+ // Enable monitor creation.
+ optional bool EnableAutoUpdates = 1;
+ // State update interval.
+ optional uint64 UpdateInterval = 2 [default = 60000000];
+ // Gaps between downtime periods of smaller size are
+ // ignored.
+ optional uint64 IgnoredDowntimeGap = 3 [default = 600000000];
+ // Device gets broken status after specified timeout or in
+ // advance if specified downtime is planned soon enough
+ // (see BrokenPrepTimeout).
+ optional uint64 BrokenTimeout = 4 [default = 7200000000];
+ // Device become broken if big enough (>= BrokenTimeout)
+ // downtime is planned within specified period.
+ optional uint64 BrokenPrepTimeout = 5 [default = 600000000];
+ // Device become faulty if big enough (>= BrokenTimeout)
+ // downtime is planned within specified period.
+ optional uint64 FaultyPrepTimeout = 6 [default = 3600000000];
+ }
+
message TSentinelConfig {
message TStateLimit {
optional uint32 State = 1; // EPDiskState
@@ -425,22 +425,22 @@ message TCmsConfig {
repeated TStateLimit StateLimits = 14;
}
- message TLogConfig {
- enum ELevel {
- ENABLED = 0;
- DISABLED = 1;
- }
-
- message TComponent {
- optional uint32 RecordType = 1;
- optional ELevel Level = 2;
- }
-
- optional ELevel DefaultLevel = 1 [default = ENABLED];
- repeated TComponent ComponentLevels = 2;
- optional uint64 TTL = 3 [default = 1209600000000]; // 14 days
- }
-
+ message TLogConfig {
+ enum ELevel {
+ ENABLED = 0;
+ DISABLED = 1;
+ }
+
+ message TComponent {
+ optional uint32 RecordType = 1;
+ optional ELevel Level = 2;
+ }
+
+ optional ELevel DefaultLevel = 1 [default = ENABLED];
+ repeated TComponent ComponentLevels = 2;
+ optional uint64 TTL = 3 [default = 1209600000000]; // 14 days
+ }
+
optional uint64 DefaultRetryTime = 1 [default = 300000000];
optional uint64 DefaultPermissionDuration = 2 [default = 300000000];
optional TMonitorConfig MonitorConfig = 3;
@@ -449,141 +449,141 @@ message TCmsConfig {
optional uint64 InfoCollectionTimeout = 6 [default = 15000000];
optional TLogConfig LogConfig = 7;
optional TSentinelConfig SentinelConfig = 8;
-}
-
-message TPDiskID {
- optional uint32 NodeId = 1;
- optional uint32 DiskId = 2;
-}
-
-message TItems {
- repeated string Hosts = 1;
- repeated uint32 Nodes = 2;
- repeated TPDiskID PDisks = 3;
- repeated NKikimrBlobStorage.TVDiskID VDisks = 4;
-}
-
-message TSetMarkerRequest {
- optional EMarker Marker = 1;
- optional TItems Items = 2;
- optional string UserToken = 10;
-}
-
-message TSetMarkerResponse {
- optional TStatus Status = 1;
-}
-
-message TResetMarkerRequest {
- optional EMarker Marker = 1;
- optional TItems Items = 2;
- optional string UserToken = 10;
-}
-
-message TResetMarkerResponse {
- optional TStatus Status = 1;
-}
-
-message TGetConfigRequest {
-}
-
-message TGetConfigResponse {
- optional TStatus Status = 1;
- optional TCmsConfig Config = 2;
-}
-
-message TSetConfigRequest {
- optional TCmsConfig Config = 1;
-}
-
-message TSetConfigResponse {
- optional TStatus Status = 1;
-}
-
-message TAvailabilityStats {
- message TDowntime {
- optional uint64 Start = 1;
- optional uint64 End = 2;
- optional string Explanation = 3;
- }
-
- repeated TDowntime Downtimes = 1;
- optional uint64 IgnoredDowntimeGap = 2;
-}
-
-message TLogRecordData {
- enum EType {
- UNKNOWN = 0;
- CMS_LOADED = 1;
- PDISK_MONITOR_ACTION = 2;
- MARKERS_MODIFICATION = 3;
- }
-
- message TCmsLoaded {
- optional string Host = 1;
- optional uint32 NodeId = 2;
- optional string Version = 3;
- }
-
- message TPDiskMonitorAction {
- optional TPDiskID PDiskId = 1;
- optional NKikimrBlobStorage.EDriveStatus CurrentStatus = 2;
- optional NKikimrBlobStorage.EDriveStatus RequiredStatus = 3;
- repeated EMarker PDiskMarkers = 4;
- repeated EMarker NodeMarkers = 5;
- optional TAvailabilityStats DiskAvailabilityStats = 6;
- optional TAvailabilityStats NodeAvailabilityStats = 7;
+}
+
+message TPDiskID {
+ optional uint32 NodeId = 1;
+ optional uint32 DiskId = 2;
+}
+
+message TItems {
+ repeated string Hosts = 1;
+ repeated uint32 Nodes = 2;
+ repeated TPDiskID PDisks = 3;
+ repeated NKikimrBlobStorage.TVDiskID VDisks = 4;
+}
+
+message TSetMarkerRequest {
+ optional EMarker Marker = 1;
+ optional TItems Items = 2;
+ optional string UserToken = 10;
+}
+
+message TSetMarkerResponse {
+ optional TStatus Status = 1;
+}
+
+message TResetMarkerRequest {
+ optional EMarker Marker = 1;
+ optional TItems Items = 2;
+ optional string UserToken = 10;
+}
+
+message TResetMarkerResponse {
+ optional TStatus Status = 1;
+}
+
+message TGetConfigRequest {
+}
+
+message TGetConfigResponse {
+ optional TStatus Status = 1;
+ optional TCmsConfig Config = 2;
+}
+
+message TSetConfigRequest {
+ optional TCmsConfig Config = 1;
+}
+
+message TSetConfigResponse {
+ optional TStatus Status = 1;
+}
+
+message TAvailabilityStats {
+ message TDowntime {
+ optional uint64 Start = 1;
+ optional uint64 End = 2;
+ optional string Explanation = 3;
+ }
+
+ repeated TDowntime Downtimes = 1;
+ optional uint64 IgnoredDowntimeGap = 2;
+}
+
+message TLogRecordData {
+ enum EType {
+ UNKNOWN = 0;
+ CMS_LOADED = 1;
+ PDISK_MONITOR_ACTION = 2;
+ MARKERS_MODIFICATION = 3;
+ }
+
+ message TCmsLoaded {
+ optional string Host = 1;
+ optional uint32 NodeId = 2;
+ optional string Version = 3;
+ }
+
+ message TPDiskMonitorAction {
+ optional TPDiskID PDiskId = 1;
+ optional NKikimrBlobStorage.EDriveStatus CurrentStatus = 2;
+ optional NKikimrBlobStorage.EDriveStatus RequiredStatus = 3;
+ repeated EMarker PDiskMarkers = 4;
+ repeated EMarker NodeMarkers = 5;
+ optional TAvailabilityStats DiskAvailabilityStats = 6;
+ optional TAvailabilityStats NodeAvailabilityStats = 7;
optional string Host = 8;
optional string Reason = 9;
- }
-
- message TMarkersModification {
- oneof Item {
- string Host = 1;
- uint32 Node = 2;
- TPDiskID PDisk = 3;
- NKikimrBlobStorage.TVDiskID VDisk = 4;
- }
- repeated EMarker OldMarkers = 5;
- repeated EMarker NewMarkers = 6;
- optional string UserToken = 7;
- }
-
- optional uint32 RecordType = 1;
- oneof Data {
- TCmsLoaded CmsLoaded = 11;
- TPDiskMonitorAction PDiskMonitorAction = 12;
- TMarkersModification MarkersModification = 13;
- }
-}
-
-message TLogRecord {
- optional uint64 Timestamp = 1;
- optional uint32 RecordType = 2;
- optional TLogRecordData Data = 3;
- optional string Message = 4;
-}
-
-message TLogFilter {
- optional uint32 RecordType = 1;
- optional uint64 MinTimestamp = 2;
- optional uint64 MaxTimestamp = 3;
- optional uint32 Limit = 4 [default = 100];
- optional uint32 Offset = 5;
-}
-
-enum ETextFormat {
- TEXT_FORMAT_NONE = 0;
- TEXT_FORMAT_SHORT = 1;
- TEXT_FORMAT_DETAILED = 2;
-}
-
-message TGetLogTailRequest {
- optional TLogFilter LogFilter = 1;
- optional bool IncludeData = 2 [default = false];
- optional ETextFormat TextFormat = 3 [default = TEXT_FORMAT_SHORT];
-}
-
-message TGetLogTailResponse {
- optional TStatus Status = 1;
- repeated TLogRecord LogRecords = 2;
-}
+ }
+
+ message TMarkersModification {
+ oneof Item {
+ string Host = 1;
+ uint32 Node = 2;
+ TPDiskID PDisk = 3;
+ NKikimrBlobStorage.TVDiskID VDisk = 4;
+ }
+ repeated EMarker OldMarkers = 5;
+ repeated EMarker NewMarkers = 6;
+ optional string UserToken = 7;
+ }
+
+ optional uint32 RecordType = 1;
+ oneof Data {
+ TCmsLoaded CmsLoaded = 11;
+ TPDiskMonitorAction PDiskMonitorAction = 12;
+ TMarkersModification MarkersModification = 13;
+ }
+}
+
+message TLogRecord {
+ optional uint64 Timestamp = 1;
+ optional uint32 RecordType = 2;
+ optional TLogRecordData Data = 3;
+ optional string Message = 4;
+}
+
+message TLogFilter {
+ optional uint32 RecordType = 1;
+ optional uint64 MinTimestamp = 2;
+ optional uint64 MaxTimestamp = 3;
+ optional uint32 Limit = 4 [default = 100];
+ optional uint32 Offset = 5;
+}
+
+enum ETextFormat {
+ TEXT_FORMAT_NONE = 0;
+ TEXT_FORMAT_SHORT = 1;
+ TEXT_FORMAT_DETAILED = 2;
+}
+
+message TGetLogTailRequest {
+ optional TLogFilter LogFilter = 1;
+ optional bool IncludeData = 2 [default = false];
+ optional ETextFormat TextFormat = 3 [default = TEXT_FORMAT_SHORT];
+}
+
+message TGetLogTailResponse {
+ optional TStatus Status = 1;
+ repeated TLogRecord LogRecords = 2;
+}
diff --git a/ydb/core/protos/config.proto b/ydb/core/protos/config.proto
index 4405579e263..d64169d4fc0 100644
--- a/ydb/core/protos/config.proto
+++ b/ydb/core/protos/config.proto
@@ -1,4 +1,4 @@
-import "google/protobuf/descriptor.proto";
+import "google/protobuf/descriptor.proto";
import "library/cpp/actors/protos/interconnect.proto";
import "ydb/core/protos/blobstorage.proto";
import "ydb/core/protos/blobstorage_config.proto";
@@ -136,7 +136,7 @@ message TStaticNameserviceConfig {
optional NActorsInterconnect.TNodeLocation Location = 6;
repeated TEndpoint Endpoint = 7;
-
+
optional NActorsInterconnect.TNodeLocation WalleLocation = 8 [deprecated=true];
}
@@ -148,12 +148,12 @@ message TStaticNameserviceConfig {
optional ENameserviceType Type = 5;
}
-message TDynamicNameserviceConfig {
- optional uint32 MaxStaticNodeId = 1 [default = 1000];
+message TDynamicNameserviceConfig {
+ optional uint32 MaxStaticNodeId = 1 [default = 1000];
optional uint32 MaxDynamicNodeId = 2 [default = 200000];
- optional uint64 LeaseDuration = 3 [default = 3600000000]; // DEPRECATED
-}
-
+ optional uint64 LeaseDuration = 3 [default = 3600000000]; // DEPRECATED
+}
+
message TDomainsConfig {
message TStateStorage {
message TRing {
@@ -168,11 +168,11 @@ message TDomainsConfig {
optional TRing Ring = 2;
}
- message TStoragePoolType {
+ message TStoragePoolType {
optional string Kind = 1;
- optional NKikimrBlobStorage.TDefineStoragePool PoolConfig = 2;
- }
-
+ optional NKikimrBlobStorage.TDefineStoragePool PoolConfig = 2;
+ }
+
message TDomain {
message TTxLimits {
optional uint64 PerRequestDataSizeLimit = 1;
@@ -189,8 +189,8 @@ message TDomainsConfig {
repeated uint32 HiveUid = 7;
optional uint64 PlanResolution = 8;
optional string Name = 9;
- optional TTxLimits TxLimits = 10; // DEPRECATED
- repeated TStoragePoolType StoragePoolTypes = 11;
+ optional TTxLimits TxLimits = 10; // DEPRECATED
+ repeated TStoragePoolType StoragePoolTypes = 11;
repeated fixed64 ExplicitMediators = 12;
repeated fixed64 ExplicitCoordinators = 13;
repeated fixed64 ExplicitAllocators = 14;
@@ -319,12 +319,12 @@ message TBootstrap {
JOBRUNNER_POOL_MANAGER = 40;
FLAT_JOBRUNNER_POOL_MANAGER = 41;
- CMS = 51;
- NODE_BROKER = 52;
-
- TENANT_SLOT_BROKER = 53;
- CONSOLE = 54;
-
+ CMS = 51;
+ NODE_BROKER = 52;
+
+ TENANT_SLOT_BROKER = 53;
+ CONSOLE = 54;
+
FAKE_DATASHARD = 700;
}
@@ -344,7 +344,7 @@ message TBootstrap {
optional uint64 ProxySchemeCacheDistNodes = 3;
optional NKikimrTablet.TCompactionBroker CompactionBroker = 4;
optional NKikimrNodeLimits.TNodeLimitsConfig NodeLimits = 5;
- optional NKikimrResourceBroker.TResourceBrokerConfig ResourceBroker = 6;
+ optional NKikimrResourceBroker.TResourceBrokerConfig ResourceBroker = 6;
optional NKikimrSharedCache.TSharedCacheConfig SharedCacheConfig = 7;
repeated NKikimrSchemeOp.TResourceProfile ResourceProfiles = 8;
optional TCompileServiceConfig CompileServiceConfig = 9; //may be need special file with resource limits?
@@ -436,48 +436,48 @@ message TChannelProfileConfig {
}
message TMonitoringConfig {
- message TDatabaseLabels {
- optional bool Enabled = 1 [default = true];
- // If labels are enabled and services list is empty
- // then GetTenantSensorServices is used to get it.
- repeated string Services = 2;
- // Custom database label is not currently supported.
- // optional string DatabaseLabel = 3 [default = "database"];
- optional string NoneDatabasetLabelValue = 4 [default = "<none>"];
- optional string MultipleDatabaseLabelValue = 5 [default = "<multiple>"];
- // Custom slot label is not currently supported.
- // optional string SlotLabel = 6 [default = "slot"];
- optional string StaticSlotLabelValue = 7 [default = "static"];
- optional string DynamicSlotLabelValue = 8 [default = "dynamic"];
- optional string MultipleSlotLabelValue = 9 [default = "<multiple>"];
+ message TDatabaseLabels {
+ optional bool Enabled = 1 [default = true];
+ // If labels are enabled and services list is empty
+ // then GetTenantSensorServices is used to get it.
+ repeated string Services = 2;
+ // Custom database label is not currently supported.
+ // optional string DatabaseLabel = 3 [default = "database"];
+ optional string NoneDatabasetLabelValue = 4 [default = "<none>"];
+ optional string MultipleDatabaseLabelValue = 5 [default = "<multiple>"];
+ // Custom slot label is not currently supported.
+ // optional string SlotLabel = 6 [default = "slot"];
+ optional string StaticSlotLabelValue = 7 [default = "static"];
+ optional string DynamicSlotLabelValue = 8 [default = "dynamic"];
+ optional string MultipleSlotLabelValue = 9 [default = "<multiple>"];
optional bool GroupAllMetrics = 10;
- };
-
- message TDatabaseAttributeLabels {
- message TAttributeGroup {
- // Currently custom list of attributes is not
- // supported. GetTenantAttributeLabels is used
- // to get default list.
- //repeated string Attributes = 1;
- repeated string Services = 2;
- }
-
- optional bool Enabled = 1 [default = true];
- // If labels are enabled and no attribute group
- // is specified then default one is built using
- // GetTenantAttributeSensorServices and
- // GetTenantAttributeLabels.
- repeated TAttributeGroup AttributeGroups = 2;
- };
-
+ };
+
+ message TDatabaseAttributeLabels {
+ message TAttributeGroup {
+ // Currently custom list of attributes is not
+ // supported. GetTenantAttributeLabels is used
+ // to get default list.
+ //repeated string Attributes = 1;
+ repeated string Services = 2;
+ }
+
+ optional bool Enabled = 1 [default = true];
+ // If labels are enabled and no attribute group
+ // is specified then default one is built using
+ // GetTenantAttributeSensorServices and
+ // GetTenantAttributeLabels.
+ repeated TAttributeGroup AttributeGroups = 2;
+ };
+
optional uint32 MonitoringPort = 1 [default = 0];
optional uint32 MonitoringThreads = 2 [default = 10];
optional string MonitoringCaption = 3 [default = "YDB Monitoring"];
optional uint32 TabletMonitoringRetries = 4 [default = 1];
- optional bool ForceDatabaseLabels = 5 [default = false];
+ optional bool ForceDatabaseLabels = 5 [default = false];
optional string MonitoringAddress = 6;
- optional TDatabaseLabels DatabaseLabels = 7;
- optional TDatabaseAttributeLabels DatabaseAttributeLabels = 8;
+ optional TDatabaseLabels DatabaseLabels = 7;
+ optional TDatabaseAttributeLabels DatabaseAttributeLabels = 8;
optional string DataCenter = 9;
optional string HostLabelOverride = 10;
optional string ProcessLocation = 11;
@@ -565,7 +565,7 @@ message TGRpcConfig {
optional uint64 GRpcMemoryQuotaBytes = 5 [default = 1073741824]; // 1 GB default; 0 == unlimited
optional uint64 MaxMessageSize = 6; // default = DEFAULT_GRPC_MESSAGE_SIZE_LIMIT
optional uint32 MaxInFlight = 7; // 0 == unlimited [default]
- optional NKikimrStream.TStreamingConfig StreamingConfig = 8;
+ optional NKikimrStream.TStreamingConfig StreamingConfig = 8;
// Ssl part
optional uint32 SslPort = 9;
optional string CA = 10;
@@ -597,15 +597,15 @@ message TGRpcConfig {
repeated TGRpcConfig ExtEndpoints = 200; // run specific services on separate endpoints
}
-message TDynamicNodeConfig {
- optional string NodeBrokerAddress = 1; //DEPRECATED
- optional string DomainName = 2; //DEPRECATED
- optional uint32 InterconnectPort = 3; //DEPRECATED
- optional NKikimrNodeBroker.TNodeInfo NodeInfo = 4;
- optional string NodeAddress = 5; //DEPRECATED
- optional string NodeHost = 6; //DEPRECATED
-}
-
+message TDynamicNodeConfig {
+ optional string NodeBrokerAddress = 1; //DEPRECATED
+ optional string DomainName = 2; //DEPRECATED
+ optional uint32 InterconnectPort = 3; //DEPRECATED
+ optional NKikimrNodeBroker.TNodeInfo NodeInfo = 4;
+ optional string NodeAddress = 5; //DEPRECATED
+ optional string NodeHost = 6; //DEPRECATED
+}
+
message TFeatureFlags {
enum Tribool {
UNSET = 0;
@@ -873,77 +873,77 @@ message TSqsConfig {
optional TYdbAuthConfig AuthConfig = 67;
}
-message TConfigsDispatcherConfig {
-}
-
-message TCompactionPolicy {
- optional string Name = 1;
+message TConfigsDispatcherConfig {
+}
+
+message TCompactionPolicy {
+ optional string Name = 1;
optional NKikimrSchemeOp.TCompactionPolicy CompactionPolicy = 2;
-}
-
-message TExecutionPolicy {
- optional string Name = 1;
-
+}
+
+message TExecutionPolicy {
+ optional string Name = 1;
+
optional NKikimrSchemeOp.TPipelineConfig PipelineConfig = 2;
- optional string ResourceProfile = 3;
- optional bool EnableFilterByKey = 4 [default = false];
- optional bool ExecutorFastLogPolicy = 5 [default = true];
- optional uint64 TxReadSizeLimit = 6;
+ optional string ResourceProfile = 3;
+ optional bool EnableFilterByKey = 4 [default = false];
+ optional bool ExecutorFastLogPolicy = 5 [default = true];
+ optional uint64 TxReadSizeLimit = 6;
optional bool EnableEraseCache = 7;
optional uint32 EraseCacheMinRows = 8;
optional uint32 EraseCacheMaxBytes = 9;
-}
-
-message TPartitioningPolicy {
- optional string Name = 1;
-
- optional uint32 UniformPartitionsCount = 2;
- optional bool AutoSplit = 3;
- optional bool AutoMerge = 4;
- optional uint64 SizeToSplit = 5;
- optional uint64 MaxPartitionsCount = 6;
-}
-
-message TStoragePolicy {
- optional string Name = 1;
+}
+
+message TPartitioningPolicy {
+ optional string Name = 1;
+
+ optional uint32 UniformPartitionsCount = 2;
+ optional bool AutoSplit = 3;
+ optional bool AutoMerge = 4;
+ optional uint64 SizeToSplit = 5;
+ optional uint64 MaxPartitionsCount = 6;
+}
+
+message TStoragePolicy {
+ optional string Name = 1;
repeated NKikimrSchemeOp.TFamilyDescription ColumnFamilies = 2;
-}
-
-message TReplicationPolicy {
- optional string Name = 1;
-
+}
+
+message TReplicationPolicy {
+ optional string Name = 1;
+
optional uint64 FollowerCount = 2;
optional bool AllowFollowerPromotion = 3 [default = true];
- optional bool CrossDataCenter = 4;
-}
-
-message TCachingPolicy {
- optional string Name = 1;
-
- optional uint64 ExecutorCacheSize = 2;
-}
-
-message TTableProfile {
- optional string Name = 1;
- optional string CompactionPolicy = 2;
- optional string ExecutionPolicy = 3;
- optional string PartitioningPolicy = 4;
- optional string StoragePolicy = 5;
- optional string ReplicationPolicy = 6;
- optional string CachingPolicy = 7;
-}
-
-message TTableProfilesConfig {
- repeated TTableProfile TableProfiles = 1;
- repeated TCompactionPolicy CompactionPolicies = 2;
- repeated TExecutionPolicy ExecutionPolicies = 3;
- repeated TPartitioningPolicy PartitioningPolicies = 4;
- repeated TStoragePolicy StoragePolicies = 5;
- repeated TReplicationPolicy ReplicationPolicies = 6;
- repeated TCachingPolicy CachingPolicies = 7;
-}
-
+ optional bool CrossDataCenter = 4;
+}
+
+message TCachingPolicy {
+ optional string Name = 1;
+
+ optional uint64 ExecutorCacheSize = 2;
+}
+
+message TTableProfile {
+ optional string Name = 1;
+ optional string CompactionPolicy = 2;
+ optional string ExecutionPolicy = 3;
+ optional string PartitioningPolicy = 4;
+ optional string StoragePolicy = 5;
+ optional string ReplicationPolicy = 6;
+ optional string CachingPolicy = 7;
+}
+
+message TTableProfilesConfig {
+ repeated TTableProfile TableProfiles = 1;
+ repeated TCompactionPolicy CompactionPolicies = 2;
+ repeated TExecutionPolicy ExecutionPolicies = 3;
+ repeated TPartitioningPolicy PartitioningPolicies = 4;
+ repeated TStoragePolicy StoragePolicies = 5;
+ repeated TReplicationPolicy ReplicationPolicies = 6;
+ repeated TCachingPolicy CachingPolicies = 7;
+}
+
message TTableServiceConfig {
message TResourceManager {
optional uint32 ComputeActorsCount = 1 [default = 1000];
@@ -1084,69 +1084,69 @@ message TTableServiceConfig {
optional TQueryReplayConfig QueryReplayConfig = 21;
};
-// Config describes immediate controls and allows
-// to manage their values (not variety and limits)
-// via CMS. All fields should be either [u]int64 or
-// another message.
-//
-// Control names match field names. For embedded
-// messages field names are concatenated via '.'
-// symbol. E.g. "DataShardControls.MaxTxInFly".
-//
-// Min, max and default values are specified in
-// field options.
-message TImmediateControlOptions {
- optional string Description = 1;
- optional uint64 MinValue = 2;
- optional uint64 MaxValue = 3;
- optional uint64 DefaultValue = 4;
-}
-
-extend google.protobuf.FieldOptions {
- optional TImmediateControlOptions ControlOptions = 61001;
-}
-
-message TImmediateControlsConfig {
- message TDataShardControls {
- message TExecutionProfileOptions {
- optional uint64 LogThresholdMs = 1 [(ControlOptions) = {
- Description: "Log execution profile for slow operations",
- MinValue: 0,
- MaxValue: 86400000,
- DefaultValue: 0 }];
- optional uint64 BufferThresholdMs = 2 [(ControlOptions) = {
- Description: "Store execution profile for slow operations",
- MinValue: 0,
- MaxValue: 86400000,
- DefaultValue: 0 }];
- optional uint64 BufferSize = 3 [(ControlOptions) = {
- Description: "Slow operation profiles buffer size",
- MinValue: 0,
- MaxValue: 1000,
- DefaultValue: 100 }];
- }
-
- optional uint64 MaxTxInFly = 1 [(ControlOptions) = {
- Description: "Maximum tx queue size for single shard",
- MinValue: 0,
- MaxValue: 100000,
- DefaultValue: 15000 }];
- optional uint64 DisableByKeyFilter = 2 [(ControlOptions) = {
- Description: "Disable bloom filter usage on row selects",
- MinValue: 0,
- MaxValue: 1,
- DefaultValue: 0 }];
- optional uint64 MaxTxLagMilliseconds = 3 [(ControlOptions) = {
- Description: "Max lag in tx plan execution before shard becomes overloaded",
- MinValue: 0,
- MaxValue: 2592000000,
- DefaultValue: 300000 }];
- optional uint64 CanCancelROWithReadSets = 4 [(ControlOptions) = {
- Description: "Allow to cancel RO tx with output read sets by timeout",
- MinValue: 0,
- MaxValue: 1,
- DefaultValue: 0 }];
- optional TExecutionProfileOptions DataTxProfile = 5;
+// Config describes immediate controls and allows
+// to manage their values (not variety and limits)
+// via CMS. All fields should be either [u]int64 or
+// another message.
+//
+// Control names match field names. For embedded
+// messages field names are concatenated via '.'
+// symbol. E.g. "DataShardControls.MaxTxInFly".
+//
+// Min, max and default values are specified in
+// field options.
+message TImmediateControlOptions {
+ optional string Description = 1;
+ optional uint64 MinValue = 2;
+ optional uint64 MaxValue = 3;
+ optional uint64 DefaultValue = 4;
+}
+
+extend google.protobuf.FieldOptions {
+ optional TImmediateControlOptions ControlOptions = 61001;
+}
+
+message TImmediateControlsConfig {
+ message TDataShardControls {
+ message TExecutionProfileOptions {
+ optional uint64 LogThresholdMs = 1 [(ControlOptions) = {
+ Description: "Log execution profile for slow operations",
+ MinValue: 0,
+ MaxValue: 86400000,
+ DefaultValue: 0 }];
+ optional uint64 BufferThresholdMs = 2 [(ControlOptions) = {
+ Description: "Store execution profile for slow operations",
+ MinValue: 0,
+ MaxValue: 86400000,
+ DefaultValue: 0 }];
+ optional uint64 BufferSize = 3 [(ControlOptions) = {
+ Description: "Slow operation profiles buffer size",
+ MinValue: 0,
+ MaxValue: 1000,
+ DefaultValue: 100 }];
+ }
+
+ optional uint64 MaxTxInFly = 1 [(ControlOptions) = {
+ Description: "Maximum tx queue size for single shard",
+ MinValue: 0,
+ MaxValue: 100000,
+ DefaultValue: 15000 }];
+ optional uint64 DisableByKeyFilter = 2 [(ControlOptions) = {
+ Description: "Disable bloom filter usage on row selects",
+ MinValue: 0,
+ MaxValue: 1,
+ DefaultValue: 0 }];
+ optional uint64 MaxTxLagMilliseconds = 3 [(ControlOptions) = {
+ Description: "Max lag in tx plan execution before shard becomes overloaded",
+ MinValue: 0,
+ MaxValue: 2592000000,
+ DefaultValue: 300000 }];
+ optional uint64 CanCancelROWithReadSets = 4 [(ControlOptions) = {
+ Description: "Allow to cancel RO tx with output read sets by timeout",
+ MinValue: 0,
+ MaxValue: 1,
+ DefaultValue: 0 }];
+ optional TExecutionProfileOptions DataTxProfile = 5;
optional uint64 BackupReadAheadLo = 6 [(ControlOptions) = {
Description: "Override for backup readahead (low watermark)",
@@ -1158,35 +1158,35 @@ message TImmediateControlsConfig {
MinValue: 0,
MaxValue: 134217728,
DefaultValue: 0 }];
- }
-
- message TTxLimitControls {
- optional uint64 PerRequestDataSizeLimit = 1 [(ControlOptions) = {
- Description: "Maximum read data size per transaction",
- MinValue: 0,
+ }
+
+ message TTxLimitControls {
+ optional uint64 PerRequestDataSizeLimit = 1 [(ControlOptions) = {
+ Description: "Maximum read data size per transaction",
+ MinValue: 0,
MaxValue: 256000000000000,
- DefaultValue: 53687091200 }];
- optional uint64 PerShardReadSizeLimit = 2 [(ControlOptions) = {
- Description: "Maximum read data size per transaction per shard",
- MinValue: 0,
- MaxValue: 107374182400,
- DefaultValue: 5368709120 }];
- optional uint64 PerShardIncomingReadSetSizeLimit = 3 [(ControlOptions) = {
- Description: "Maximum input read sets size per transaction per shard",
- MinValue: 0,
- MaxValue: 5368709120,
- DefaultValue: 209715200 }];
- optional uint64 DefaultTimeoutMs = 4 [(ControlOptions) = {
- Description: "Default execution timeout for transactions",
- MinValue: 0,
- MaxValue: 3600000,
- DefaultValue: 60000 }];
- }
-
- optional TDataShardControls DataShardControls = 1;
- optional TTxLimitControls TxLimitControls = 2;
-};
-
+ DefaultValue: 53687091200 }];
+ optional uint64 PerShardReadSizeLimit = 2 [(ControlOptions) = {
+ Description: "Maximum read data size per transaction per shard",
+ MinValue: 0,
+ MaxValue: 107374182400,
+ DefaultValue: 5368709120 }];
+ optional uint64 PerShardIncomingReadSetSizeLimit = 3 [(ControlOptions) = {
+ Description: "Maximum input read sets size per transaction per shard",
+ MinValue: 0,
+ MaxValue: 5368709120,
+ DefaultValue: 209715200 }];
+ optional uint64 DefaultTimeoutMs = 4 [(ControlOptions) = {
+ Description: "Default execution timeout for transactions",
+ MinValue: 0,
+ MaxValue: 3600000,
+ DefaultValue: 60000 }];
+ }
+
+ optional TDataShardControls DataShardControls = 1;
+ optional TTxLimitControls TxLimitControls = 2;
+};
+
message TMeteringConfig {
optional string MeteringFilePath = 1;
repeated string SystemBackupSIDs = 2;
@@ -1310,16 +1310,16 @@ message TCompactionConfig {
optional TBackgroundCompactionConfig BackgroundCompactionConfig = 1;
}
-// This message is used to upload custom service configs
-// to CMS. Config name is used to identify owner and
-// data format.
+// This message is used to upload custom service configs
+// to CMS. Config name is used to identify owner and
+// data format.
// Custom config validators should b8e used to detect name
-// conflicts and check config consistency.
-message TNamedConfig {
- optional string Name = 1;
- optional bytes Config = 2;
-}
-
+// conflicts and check config consistency.
+message TNamedConfig {
+ optional string Name = 1;
+ optional bytes Config = 2;
+}
+
message TConfigItemVersion {
optional uint32 Kind = 1;
optional uint64 Id = 2;
@@ -1351,24 +1351,24 @@ message TAppConfig {
optional TKQPConfig KQPConfig = 17;
optional TMemoryLogConfig MemoryLogConfig = 19;
optional TGRpcConfig GRpcConfig = 20;
- optional TDynamicNameserviceConfig DynamicNameserviceConfig = 22;
- //optional TLocalConfig LocalConfig = 23; DEPRECATED
- optional TDynamicNodeConfig DynamicNodeConfig = 24;
- optional NKikimrCms.TCmsConfig CmsConfig = 25;
+ optional TDynamicNameserviceConfig DynamicNameserviceConfig = 22;
+ //optional TLocalConfig LocalConfig = 23; DEPRECATED
+ optional TDynamicNodeConfig DynamicNodeConfig = 24;
+ optional NKikimrCms.TCmsConfig CmsConfig = 25;
optional TFeatureFlags FeatureFlags = 26;
optional TSqsConfig SqsConfig = 27;
optional NKikimrPQ.TPQConfig PQConfig = 28;
- optional NKikimrTenantPool.TTenantPoolConfig TenantPoolConfig = 29;
+ optional NKikimrTenantPool.TTenantPoolConfig TenantPoolConfig = 29;
optional NKikimrProto.TAuthConfig AuthConfig = 30;
- optional NKikimrTenantSlotBroker.TConfig TenantSlotBrokerConfig = 32;
- optional TConfigsDispatcherConfig ConfigsDispatcherConfig = 33;
- optional TTableProfilesConfig TableProfilesConfig = 34;
+ optional NKikimrTenantSlotBroker.TConfig TenantSlotBrokerConfig = 32;
+ optional TConfigsDispatcherConfig ConfigsDispatcherConfig = 33;
+ optional TTableProfilesConfig TableProfilesConfig = 34;
optional NKikimrProto.TKeyConfig KeyConfig = 35;
optional NKikimrProto.TKeyConfig PDiskKeyConfig = 51;
- optional NKikimrNodeBroker.TConfig NodeBrokerConfig = 36;
+ optional NKikimrNodeBroker.TConfig NodeBrokerConfig = 36;
optional TTableServiceConfig TableServiceConfig = 37;
optional NKikimrSharedCache.TSharedCacheConfig SharedCacheConfig = 38; // dynamic configuration via cms
- optional TImmediateControlsConfig ImmediateControlsConfig = 39;
+ optional TImmediateControlsConfig ImmediateControlsConfig = 39;
optional TAllocatorConfig AllocatorConfig = 40;
optional NKikimrPQ.TPQClusterDiscoveryConfig PQClusterDiscoveryConfig = 41;
optional NKikimrNetClassifier.TNetClassifierConfig NetClassifierConfig = 42;
@@ -1380,8 +1380,8 @@ message TAppConfig {
optional NYq.NConfig.TConfig YandexQueryConfig = 50;
optional TCompactionConfig CompactionConfig = 52;
- repeated TNamedConfig NamedConfigs = 100;
- optional string ClusterYamlConfig = 101;
+ repeated TNamedConfig NamedConfigs = 100;
+ optional string ClusterYamlConfig = 101;
optional TConfigVersion Version = 102;
}
diff --git a/ydb/core/protos/console.proto b/ydb/core/protos/console.proto
index dd8e9c5108e..aa089db8895 100644
--- a/ydb/core/protos/console.proto
+++ b/ydb/core/protos/console.proto
@@ -1,27 +1,27 @@
import "ydb/core/protos/console_base.proto";
import "ydb/core/protos/console_tenant.proto";
import "ydb/core/protos/console_config.proto";
-
-package NKikimrConsole;
-option java_package = "ru.yandex.kikimr.proto";
-
-message TConfig {
- optional TTenantsConfig TenantsConfig = 1;
- optional TConfigsConfig ConfigsConfig = 2;
-}
-
-message TGetConfigRequest {
-}
-
-message TGetConfigResponse {
- optional TConfig Config = 1;
-}
-
-message TSetConfigRequest {
- optional TConfig Config = 1;
- optional TConfigItem.EMergeStrategy Merge = 2 [default = OVERWRITE];
-}
-
-message TSetConfigResponse {
- optional TStatus Status = 1;
-}
+
+package NKikimrConsole;
+option java_package = "ru.yandex.kikimr.proto";
+
+message TConfig {
+ optional TTenantsConfig TenantsConfig = 1;
+ optional TConfigsConfig ConfigsConfig = 2;
+}
+
+message TGetConfigRequest {
+}
+
+message TGetConfigResponse {
+ optional TConfig Config = 1;
+}
+
+message TSetConfigRequest {
+ optional TConfig Config = 1;
+ optional TConfigItem.EMergeStrategy Merge = 2 [default = OVERWRITE];
+}
+
+message TSetConfigResponse {
+ optional TStatus Status = 1;
+}
diff --git a/ydb/core/protos/console_base.proto b/ydb/core/protos/console_base.proto
index feba4801184..373311c5d15 100644
--- a/ydb/core/protos/console_base.proto
+++ b/ydb/core/protos/console_base.proto
@@ -1,9 +1,9 @@
import "ydb/public/api/protos/ydb_status_codes.proto";
-
-package NKikimrConsole;
-option java_package = "ru.yandex.kikimr.proto";
-
-message TStatus {
+
+package NKikimrConsole;
+option java_package = "ru.yandex.kikimr.proto";
+
+message TStatus {
optional Ydb.StatusIds.StatusCode Code = 1;
- optional string Reason = 2;
-}
+ optional string Reason = 2;
+}
diff --git a/ydb/core/protos/console_config.proto b/ydb/core/protos/console_config.proto
index 519d86cb88d..d5a32d05c66 100644
--- a/ydb/core/protos/console_config.proto
+++ b/ydb/core/protos/console_config.proto
@@ -2,105 +2,105 @@ import "library/cpp/actors/protos/actors.proto";
import "ydb/core/protos/config.proto";
import "ydb/core/protos/console_base.proto";
import "ydb/public/api/protos/ydb_status_codes.proto";
-
-package NKikimrConsole;
-option java_package = "ru.yandex.kikimr.proto";
-
-message TConfigItemId {
- optional uint64 Id = 1;
- optional uint64 Generation = 2;
-}
-
-message TItemIds {
- repeated uint64 Ids = 1;
-}
-
-message TNodeIds {
- repeated uint32 Nodes = 1;
-}
-
-message THosts {
- repeated string Hosts = 1;
-}
-
-message TTenants {
- repeated string Tenants = 1;
-}
-
-message TNodeTypes {
- repeated string NodeTypes = 1;
-}
-
-message TTenantAndNodeType {
- optional string Tenant = 1;
- optional string NodeType = 2;
-}
-
-message TTenantAndNodeTypes {
- repeated TTenantAndNodeType TenantAndNodeTypes = 1;
-}
-
-message TCookies {
- repeated string Cookies = 1;
-}
-
-message TUsageScope {
- oneof Filter {
- TNodeIds NodeFilter = 1;
- THosts HostFilter = 2;
- TTenantAndNodeType TenantAndNodeTypeFilter = 3;
- }
-}
-
-message TNodeAttributes {
- optional uint32 NodeId = 1;
- optional string Host = 2;
- optional string Tenant = 3;
- optional string NodeType = 4;
-}
-
-message TConfigItem {
- // Single item refers to a single field in NKikimrConfig::TAppConfig message.
- // Enum value is a field's number. Zero value (Auto) is used to automatically
- // detect kind for added items by checking set fields.
- enum EKind {
- Auto = 0;
- ActorSystemConfigItem = 1;
- LogConfigItem = 2;
- NameserviceConfigItem = 3;
- InterconnectConfigItem = 4;
- DomainsConfigItem = 5;
- BlobStorageConfigItem = 6;
- ChannelProfileConfigItem = 7;
- BootstrapConfigItem = 8;
- MonitoringConfigItem = 10;
- RestartsCountConfigItem = 11;
- MessageBusConfigItem = 12;
- TabletsConfigItem = 13;
- VDiskConfigItem = 14;
- DriveModelConfigItem = 31;
- IncrHugeConfigItem = 18;
- UDFsDirItem = 15;
- UDFsPathsItem = 16;
- KQPConfigItem = 17;
- MemoryLogConfigItem = 19;
- GRpcConfigItem = 20;
- DynamicNameserviceConfigItem = 22;
- DynamicNodeConfigItem = 24;
- CmsConfigItem = 25;
- FeatureFlagsItem = 26;
- SqsConfigItem = 27;
- PQConfigItem = 28;
- TenantPoolConfigItem = 29;
- AuthConfigItem = 30;
- TenantSlotBrokerConfigItem = 32;
- ConfigsDispatcherConfigItem = 33;
- TableProfilesConfigItem = 34;
- KeyConfigItem = 35;
- NodeBrokerConfigItem = 36;
+
+package NKikimrConsole;
+option java_package = "ru.yandex.kikimr.proto";
+
+message TConfigItemId {
+ optional uint64 Id = 1;
+ optional uint64 Generation = 2;
+}
+
+message TItemIds {
+ repeated uint64 Ids = 1;
+}
+
+message TNodeIds {
+ repeated uint32 Nodes = 1;
+}
+
+message THosts {
+ repeated string Hosts = 1;
+}
+
+message TTenants {
+ repeated string Tenants = 1;
+}
+
+message TNodeTypes {
+ repeated string NodeTypes = 1;
+}
+
+message TTenantAndNodeType {
+ optional string Tenant = 1;
+ optional string NodeType = 2;
+}
+
+message TTenantAndNodeTypes {
+ repeated TTenantAndNodeType TenantAndNodeTypes = 1;
+}
+
+message TCookies {
+ repeated string Cookies = 1;
+}
+
+message TUsageScope {
+ oneof Filter {
+ TNodeIds NodeFilter = 1;
+ THosts HostFilter = 2;
+ TTenantAndNodeType TenantAndNodeTypeFilter = 3;
+ }
+}
+
+message TNodeAttributes {
+ optional uint32 NodeId = 1;
+ optional string Host = 2;
+ optional string Tenant = 3;
+ optional string NodeType = 4;
+}
+
+message TConfigItem {
+ // Single item refers to a single field in NKikimrConfig::TAppConfig message.
+ // Enum value is a field's number. Zero value (Auto) is used to automatically
+ // detect kind for added items by checking set fields.
+ enum EKind {
+ Auto = 0;
+ ActorSystemConfigItem = 1;
+ LogConfigItem = 2;
+ NameserviceConfigItem = 3;
+ InterconnectConfigItem = 4;
+ DomainsConfigItem = 5;
+ BlobStorageConfigItem = 6;
+ ChannelProfileConfigItem = 7;
+ BootstrapConfigItem = 8;
+ MonitoringConfigItem = 10;
+ RestartsCountConfigItem = 11;
+ MessageBusConfigItem = 12;
+ TabletsConfigItem = 13;
+ VDiskConfigItem = 14;
+ DriveModelConfigItem = 31;
+ IncrHugeConfigItem = 18;
+ UDFsDirItem = 15;
+ UDFsPathsItem = 16;
+ KQPConfigItem = 17;
+ MemoryLogConfigItem = 19;
+ GRpcConfigItem = 20;
+ DynamicNameserviceConfigItem = 22;
+ DynamicNodeConfigItem = 24;
+ CmsConfigItem = 25;
+ FeatureFlagsItem = 26;
+ SqsConfigItem = 27;
+ PQConfigItem = 28;
+ TenantPoolConfigItem = 29;
+ AuthConfigItem = 30;
+ TenantSlotBrokerConfigItem = 32;
+ ConfigsDispatcherConfigItem = 33;
+ TableProfilesConfigItem = 34;
+ KeyConfigItem = 35;
+ NodeBrokerConfigItem = 36;
TableServiceConfigItem = 37;
SharedCacheConfigItem = 38;
- ImmediateControlsConfigItem = 39;
+ ImmediateControlsConfigItem = 39;
AllocatorConfigItem = 40;
PQClusterDiscoveryConfigItem = 41;
NetClassifierConfigItem = 42;
@@ -113,190 +113,190 @@ message TConfigItem {
PDiskKeyConfigItem = 51;
CompactionConfigItem = 52;
- NamedConfigsItem = 100;
- ClusterYamlConfigItem = 101;
- }
-
- enum EMergeStrategy {
- // More prioritized config fully overwrites less prioritized.
- OVERWRITE = 1;
- // More prioritized config is merged into less prioritized.
- // All defined singular fields are taken from more prioritized
- // config (embedded messages are merged), repeated fields are
- // concatenated.
- MERGE = 2;
- // Similar to MergeStrategyMerge but non-empty repeated fields
- // of more prioritized config overwrite less prioritized values.
- MERGE_OVERWRITE_REPEATED = 3;
- }
-
- optional TConfigItemId Id = 1;
- optional uint32 Kind = 2;
- optional NKikimrConfig.TAppConfig Config = 3;
- // UsageScope also defines config priority.
- // 1 - NodeIds - the most prioritized
- // 2 - Hosts
- // 3 - TenantAndNodeType with both Tenant and NodeType defined.
- // 4 - TenantAndNodeType with Tenant defined
- // 5 - TenantAndNodeType with NodeType defined
- // 6 - No filter - the least prioritized
- optional TUsageScope UsageScope = 4;
- // Config items with the same priority are applied according to Order value.
- // Greater Order value means more prioritized config.
- // There should be no two configs items with the same kind, priority and order
- // which can be applied to the same node (in other words order of config items
- // should always be deterministic for all nodes). Zero value may be used for
- // added and modified items to give an item the highest order among items with
- // the same priority and kind.
- optional uint32 Order = 5;
- // Merge strategy determines how multiple config items are merged
- // to get resulting config for a node.
- // To get final config for a node we choose all items with proper
- // filter and sort them according to priority and order. Initial
- // config value is the default protobuf. We go then through all
- // found items starting from the least prioritized and merge them
- // into current result using merge strategy of the merged item.
- optional uint32 MergeStrategy = 6 [default = 2]; // MERGE by default
- // User defined cookie value. Used to easily find or remove own configs.
- optional string Cookie = 7;
-}
-
-message TAddConfigItem {
- optional TConfigItem ConfigItem = 1;
- // If this flag is enabled then config items with Auto kind
- // may have multiple config fields defined. This will cause
- // its split into several config items (returned item ids are
- // ordered by numbers of fields used to make those items)
- optional bool EnableAutoSplit = 2;
-}
-
-message TRemoveConfigItem {
- optional TConfigItemId ConfigItemId = 1;
-}
-
-message TRemoveConfigItems {
- oneof Filter {
- TCookies CookieFilter = 1;
- }
-}
-
-message TModifyConfigItem {
- optional TConfigItem ConfigItem = 1;
-}
-
-message TConfigureAction {
- oneof Action {
- TAddConfigItem AddConfigItem = 1;
- TRemoveConfigItem RemoveConfigItem = 2;
- TModifyConfigItem ModifyConfigItem = 3;
- TRemoveConfigItems RemoveConfigItems = 4;
- }
-}
-
-message TConfigureRequest {
- repeated TConfigureAction Actions = 1;
- optional bool DryRun = 2;
- // This option allows to return all affected configs
- // (old and new version) in response. By default
- // (option is false) affected configs in response
- // have only Tenant and NodeType fields filled.
- optional bool FillAffectedConfigs = 3;
-}
-
-message TConfigureResponse {
- message TAffectedConfig {
- optional string Tenant = 1;
- optional string NodeType = 2;
- // Config fields are filled only when FillAffectedConfigs
- // is set in request.
- optional NKikimrConfig.TAppConfig OldConfig = 3;
- optional NKikimrConfig.TAppConfig NewConfig = 4;
- }
-
- optional TStatus Status = 1;
- // IDs of added item in the same order as for AddConfigItem actions
- // in related configure request.
- repeated uint64 AddedItemIds = 2;
- // List all tenant and node type pairs affected by configure
- // request. Optionally old and new configs are included.
- repeated TAffectedConfig AffectedConfigs = 3;
-}
-
-// Get items of specified kinds with specified attributes.
-// If multiple filters are specified then items complying
-// with at least one of them are returned (except kinds filter
-// which is applied to all returned items).
-// If none of filters is specified then return all items.
-message TGetConfigItemsRequest {
- // Get items with specified IDs.
- repeated uint64 ItemIds = 1;
- // Get items with node usage scope covering at least one of specified nodes.
- // If list of nodes is empty then return all items with a node usage scope.
- optional TNodeIds NodeFilter= 2;
- // Get items with host usage scope covers at least one of specified hosts.
- // If list of hosts is empty then return all items with a host usage scope.
- optional THosts HostFilter = 3;
- // Get items with tenant usage scope covering one of specified tenants.
- // If list of tenants is empty then return all items with a usage scope
- // bound to some tenant.
- optional TTenants TenantFilter = 4;
- // Get items with node type usage scope covering one of specified node types.
- // If list of node types is empty then return all items with a usage scope
- // bound to some node type.
- optional TNodeTypes NodeTypeFilter = 5;
- // Get items with usage scope matching one of specified tenant and node type
- // pair. If filter has an empty list then return all items with a usage scope
- // bound to some tenant and node type.
- optional TTenantAndNodeTypes TenantAndNodeTypeFilter = 6;
- // Get items with usage scope matching one of specified usage scopes.
- repeated TUsageScope UsageScopes = 7;
- // Get items with cookie matching one of cpecified values.
- optional TCookies CookieFilter = 8;
- // Filter items by specified kinds (return all kinds by default).
- repeated uint32 ItemKinds = 10;
-}
-
-message TGetConfigItemsResponse {
- optional TStatus Status = 1;
- repeated TConfigItem ConfigItems = 2;
-}
-
-message TGetNodeConfigItemsRequest {
- optional TNodeAttributes Node = 1;
- // Filter items by specified kinds (return all items by default).
- repeated uint32 ItemKinds = 2;
-}
-
-message TGetNodeConfigItemsResponse {
- optional TStatus Status = 1;
- repeated TConfigItem ConfigItems = 2;
-}
-
-message TGetNodeConfigRequest {
- optional TNodeAttributes Node = 1;
- // Filter items by specified kinds (return full config by default).
- repeated uint32 ItemKinds = 2;
-}
-
-message TGetNodeConfigResponse {
- optional TStatus Status = 1;
- optional NKikimrConfig.TAppConfig Config = 2;
-}
-
-message TSubscriber {
- oneof Subscriber {
- // Subscriber is a tablet.
- uint64 TabletId = 1;
- // Subscriber is an actor, it should be registered as
- // a service and use its service id.
+ NamedConfigsItem = 100;
+ ClusterYamlConfigItem = 101;
+ }
+
+ enum EMergeStrategy {
+ // More prioritized config fully overwrites less prioritized.
+ OVERWRITE = 1;
+ // More prioritized config is merged into less prioritized.
+ // All defined singular fields are taken from more prioritized
+ // config (embedded messages are merged), repeated fields are
+ // concatenated.
+ MERGE = 2;
+ // Similar to MergeStrategyMerge but non-empty repeated fields
+ // of more prioritized config overwrite less prioritized values.
+ MERGE_OVERWRITE_REPEATED = 3;
+ }
+
+ optional TConfigItemId Id = 1;
+ optional uint32 Kind = 2;
+ optional NKikimrConfig.TAppConfig Config = 3;
+ // UsageScope also defines config priority.
+ // 1 - NodeIds - the most prioritized
+ // 2 - Hosts
+ // 3 - TenantAndNodeType with both Tenant and NodeType defined.
+ // 4 - TenantAndNodeType with Tenant defined
+ // 5 - TenantAndNodeType with NodeType defined
+ // 6 - No filter - the least prioritized
+ optional TUsageScope UsageScope = 4;
+ // Config items with the same priority are applied according to Order value.
+ // Greater Order value means more prioritized config.
+ // There should be no two configs items with the same kind, priority and order
+ // which can be applied to the same node (in other words order of config items
+ // should always be deterministic for all nodes). Zero value may be used for
+ // added and modified items to give an item the highest order among items with
+ // the same priority and kind.
+ optional uint32 Order = 5;
+ // Merge strategy determines how multiple config items are merged
+ // to get resulting config for a node.
+ // To get final config for a node we choose all items with proper
+ // filter and sort them according to priority and order. Initial
+ // config value is the default protobuf. We go then through all
+ // found items starting from the least prioritized and merge them
+ // into current result using merge strategy of the merged item.
+ optional uint32 MergeStrategy = 6 [default = 2]; // MERGE by default
+ // User defined cookie value. Used to easily find or remove own configs.
+ optional string Cookie = 7;
+}
+
+message TAddConfigItem {
+ optional TConfigItem ConfigItem = 1;
+ // If this flag is enabled then config items with Auto kind
+ // may have multiple config fields defined. This will cause
+ // its split into several config items (returned item ids are
+ // ordered by numbers of fields used to make those items)
+ optional bool EnableAutoSplit = 2;
+}
+
+message TRemoveConfigItem {
+ optional TConfigItemId ConfigItemId = 1;
+}
+
+message TRemoveConfigItems {
+ oneof Filter {
+ TCookies CookieFilter = 1;
+ }
+}
+
+message TModifyConfigItem {
+ optional TConfigItem ConfigItem = 1;
+}
+
+message TConfigureAction {
+ oneof Action {
+ TAddConfigItem AddConfigItem = 1;
+ TRemoveConfigItem RemoveConfigItem = 2;
+ TModifyConfigItem ModifyConfigItem = 3;
+ TRemoveConfigItems RemoveConfigItems = 4;
+ }
+}
+
+message TConfigureRequest {
+ repeated TConfigureAction Actions = 1;
+ optional bool DryRun = 2;
+ // This option allows to return all affected configs
+ // (old and new version) in response. By default
+ // (option is false) affected configs in response
+ // have only Tenant and NodeType fields filled.
+ optional bool FillAffectedConfigs = 3;
+}
+
+message TConfigureResponse {
+ message TAffectedConfig {
+ optional string Tenant = 1;
+ optional string NodeType = 2;
+ // Config fields are filled only when FillAffectedConfigs
+ // is set in request.
+ optional NKikimrConfig.TAppConfig OldConfig = 3;
+ optional NKikimrConfig.TAppConfig NewConfig = 4;
+ }
+
+ optional TStatus Status = 1;
+ // IDs of added item in the same order as for AddConfigItem actions
+ // in related configure request.
+ repeated uint64 AddedItemIds = 2;
+ // List all tenant and node type pairs affected by configure
+ // request. Optionally old and new configs are included.
+ repeated TAffectedConfig AffectedConfigs = 3;
+}
+
+// Get items of specified kinds with specified attributes.
+// If multiple filters are specified then items complying
+// with at least one of them are returned (except kinds filter
+// which is applied to all returned items).
+// If none of filters is specified then return all items.
+message TGetConfigItemsRequest {
+ // Get items with specified IDs.
+ repeated uint64 ItemIds = 1;
+ // Get items with node usage scope covering at least one of specified nodes.
+ // If list of nodes is empty then return all items with a node usage scope.
+ optional TNodeIds NodeFilter= 2;
+ // Get items with host usage scope covers at least one of specified hosts.
+ // If list of hosts is empty then return all items with a host usage scope.
+ optional THosts HostFilter = 3;
+ // Get items with tenant usage scope covering one of specified tenants.
+ // If list of tenants is empty then return all items with a usage scope
+ // bound to some tenant.
+ optional TTenants TenantFilter = 4;
+ // Get items with node type usage scope covering one of specified node types.
+ // If list of node types is empty then return all items with a usage scope
+ // bound to some node type.
+ optional TNodeTypes NodeTypeFilter = 5;
+ // Get items with usage scope matching one of specified tenant and node type
+ // pair. If filter has an empty list then return all items with a usage scope
+ // bound to some tenant and node type.
+ optional TTenantAndNodeTypes TenantAndNodeTypeFilter = 6;
+ // Get items with usage scope matching one of specified usage scopes.
+ repeated TUsageScope UsageScopes = 7;
+ // Get items with cookie matching one of cpecified values.
+ optional TCookies CookieFilter = 8;
+ // Filter items by specified kinds (return all kinds by default).
+ repeated uint32 ItemKinds = 10;
+}
+
+message TGetConfigItemsResponse {
+ optional TStatus Status = 1;
+ repeated TConfigItem ConfigItems = 2;
+}
+
+message TGetNodeConfigItemsRequest {
+ optional TNodeAttributes Node = 1;
+ // Filter items by specified kinds (return all items by default).
+ repeated uint32 ItemKinds = 2;
+}
+
+message TGetNodeConfigItemsResponse {
+ optional TStatus Status = 1;
+ repeated TConfigItem ConfigItems = 2;
+}
+
+message TGetNodeConfigRequest {
+ optional TNodeAttributes Node = 1;
+ // Filter items by specified kinds (return full config by default).
+ repeated uint32 ItemKinds = 2;
+}
+
+message TGetNodeConfigResponse {
+ optional TStatus Status = 1;
+ optional NKikimrConfig.TAppConfig Config = 2;
+}
+
+message TSubscriber {
+ oneof Subscriber {
+ // Subscriber is a tablet.
+ uint64 TabletId = 1;
+ // Subscriber is an actor, it should be registered as
+ // a service and use its service id.
NActorsProto.TActorId ServiceId = 2;
- }
-}
-
-message TConfigId {
- repeated TConfigItemId ItemIds = 1;
-}
-
+ }
+}
+
+message TConfigId {
+ repeated TConfigItemId ItemIds = 1;
+}
+
message TConfigSubscriptionRequest {
optional uint64 Generation = 1;
optional TNodeAttributes Options = 2;
@@ -325,169 +325,169 @@ message TConfigSubscriptionNotification {
repeated uint32 AffectedKinds = 4;
}
-message TSubscription {
- // Subscription id.
- optional uint64 Id = 1;
- // Subscriber id.
- optional TSubscriber Subscriber = 2;
- // Subscription options
- optional TNodeAttributes Options = 3;
- // Config item kinds client is subscribed for.
- repeated uint32 ConfigItemKinds = 4;
-}
-
-message TAddConfigSubscriptionRequest {
- // Subscription to add. Should have zero id,
- // valid subscriber and at least one item kind.
- // If subscriber already has similar subscription
- // then no new subscription will be created and
- // ID of existing subscription will be returned.
- optional TSubscription Subscription = 1;
-}
-
-message TAddConfigSubscriptionResponse {
- optional TStatus Status = 1;
- optional uint64 SubscriptionId = 2;
-}
-
-message TGetConfigSubscriptionRequest {
- // Required. Subscription id.
- optional uint64 SubscriptionId = 1;
-}
-
-message TGetConfigSubscriptionResponse {
- optional TStatus Status = 1;
- optional TSubscription Subscription = 2;
-}
-
-message TListConfigSubscriptionsRequest {
- optional TSubscriber Subscriber = 1;
-}
-
-message TListConfigSubscriptionsResponse {
- optional TStatus Status = 1;
- repeated TSubscription Subscriptions = 2;
-}
-
-message TRemoveConfigSubscriptionRequest {
- optional uint64 SubscriptionId = 1;
-}
-
-message TRemoveConfigSubscriptionResponse {
- optional TStatus Status = 1;
-}
-
-message TRemoveConfigSubscriptionsRequest {
- optional TSubscriber Subscriber = 1;
-}
-
-message TRemoveConfigSubscriptionsResponse {
- optional TStatus Status = 1;
-}
-
-message TReplaceConfigSubscriptionsRequest {
- optional TSubscription Subscription = 1;
-}
-
-message TReplaceConfigSubscriptionsResponse {
- optional TStatus Status = 1;
- optional uint64 SubscriptionId = 2;
-}
-
-message TConfigNotificationRequest {
- // Subscription notification is generated for.
- optional uint64 SubscriptionId = 1;
- // Id of passed config. In some cases client may get multiple
- // notifications with the same config. Config id may be used to
- // check if this config has already been applied.
- optional TConfigId ConfigId = 2;
- // Updated config.
- optional NKikimrConfig.TAppConfig Config = 3;
-}
-
-message TConfigNotificationResponse {
- optional uint64 SubscriptionId = 1;
- // Id of processed config.
- optional TConfigId ConfigId = 2;
-}
-
-message TCheckConfigUpdatesRequest {
- repeated TConfigItemId BaseItemIds = 1;
-}
-
-message TCheckConfigUpdatesResponse {
- optional TStatus Status = 1;
- repeated TConfigItemId AddedItems = 2;
- repeated TConfigItemId RemovedItems = 3;
- repeated TConfigItemId UpdatedItems = 4;
-}
-
-message TListConfigValidatorsRequest {
-}
-
-message TConfigValidatorInfo {
- optional string Name = 1;
- optional string Description = 2;
- repeated uint32 CheckedItemKinds = 3;
- optional bool Enabled = 4;
-}
-
-message TListConfigValidatorsResponse {
- optional TStatus Status = 1;
- repeated TConfigValidatorInfo Validators = 2;
-}
-
-message TToggleConfigValidatorRequest {
- optional string Name = 1;
- optional bool Disable = 2;
-}
-
-message TToggleConfigValidatorResponse {
- optional TStatus Status = 1;
-}
-enum EValidationLevel {
- // Validation is disabled.
- VALIDATE_NONE = 0;
- // Only domain config is validated. It's config for node
- // with unspecified tenant, type, host and node ID.
- VALIDATE_DOMAIN = 1;
- // Configs for nodes with specified tenant are checked.
- VALIDATE_TENANTS = 2;
- // Configs for nodes with specified tenant and/or type
- // are checked.
- VALIDATE_TENANTS_AND_NODE_TYPES = 3;
-}
-
-message TConfigsConfig {
- message TUsageScopeRestrictions {
- repeated uint32 AllowedNodeIdUsageScopeKinds = 1;
- repeated uint32 AllowedHostUsageScopeKinds = 2;
- repeated uint32 AllowedTenantUsageScopeKinds = 3;
- repeated uint32 AllowedNodeTypeUsageScopeKinds = 4;
- repeated uint32 DisallowedDomainUsageScopeKinds = 5;
- }
-
- message TValidationOptions {
- optional EValidationLevel ValidationLevel = 1 [default = VALIDATE_TENANTS_AND_NODE_TYPES];
- // How many configs is allowed to validate per
- // single configure command execution. Order of
- // checks corresponds to validation levels.
- // Firstly VALIDATE_DOMAIN checks are done,
- // then VALIDATE_TENANTS checks etc.
- optional uint32 MaxConfigChecksPerModification = 2 [default = 10000];
- // If True then respond with error for configure
- // commands which caused exceeded limit on config
- // checks. Otherwise respond with SUCCESS and
- // an info message.
- optional bool FailOnExceededConfigChecksLimit = 3 [default = true];
- // If True then resulting config for each node
- // config request is validated. If validation
- // fails then response with error status is sent.
- optional bool EnableValidationOnNodeConfigRequest = 4 [default = true];
- // If True then warning issues result in failed validation.
- optional bool TreatWarningAsError = 5 [default = true];
- }
-
- optional TUsageScopeRestrictions UsageScopeRestrictions = 1;
- optional TValidationOptions ValidationOptions = 2;
+message TSubscription {
+ // Subscription id.
+ optional uint64 Id = 1;
+ // Subscriber id.
+ optional TSubscriber Subscriber = 2;
+ // Subscription options
+ optional TNodeAttributes Options = 3;
+ // Config item kinds client is subscribed for.
+ repeated uint32 ConfigItemKinds = 4;
+}
+
+message TAddConfigSubscriptionRequest {
+ // Subscription to add. Should have zero id,
+ // valid subscriber and at least one item kind.
+ // If subscriber already has similar subscription
+ // then no new subscription will be created and
+ // ID of existing subscription will be returned.
+ optional TSubscription Subscription = 1;
+}
+
+message TAddConfigSubscriptionResponse {
+ optional TStatus Status = 1;
+ optional uint64 SubscriptionId = 2;
+}
+
+message TGetConfigSubscriptionRequest {
+ // Required. Subscription id.
+ optional uint64 SubscriptionId = 1;
+}
+
+message TGetConfigSubscriptionResponse {
+ optional TStatus Status = 1;
+ optional TSubscription Subscription = 2;
+}
+
+message TListConfigSubscriptionsRequest {
+ optional TSubscriber Subscriber = 1;
+}
+
+message TListConfigSubscriptionsResponse {
+ optional TStatus Status = 1;
+ repeated TSubscription Subscriptions = 2;
+}
+
+message TRemoveConfigSubscriptionRequest {
+ optional uint64 SubscriptionId = 1;
+}
+
+message TRemoveConfigSubscriptionResponse {
+ optional TStatus Status = 1;
+}
+
+message TRemoveConfigSubscriptionsRequest {
+ optional TSubscriber Subscriber = 1;
+}
+
+message TRemoveConfigSubscriptionsResponse {
+ optional TStatus Status = 1;
+}
+
+message TReplaceConfigSubscriptionsRequest {
+ optional TSubscription Subscription = 1;
+}
+
+message TReplaceConfigSubscriptionsResponse {
+ optional TStatus Status = 1;
+ optional uint64 SubscriptionId = 2;
+}
+
+message TConfigNotificationRequest {
+ // Subscription notification is generated for.
+ optional uint64 SubscriptionId = 1;
+ // Id of passed config. In some cases client may get multiple
+ // notifications with the same config. Config id may be used to
+ // check if this config has already been applied.
+ optional TConfigId ConfigId = 2;
+ // Updated config.
+ optional NKikimrConfig.TAppConfig Config = 3;
+}
+
+message TConfigNotificationResponse {
+ optional uint64 SubscriptionId = 1;
+ // Id of processed config.
+ optional TConfigId ConfigId = 2;
+}
+
+message TCheckConfigUpdatesRequest {
+ repeated TConfigItemId BaseItemIds = 1;
+}
+
+message TCheckConfigUpdatesResponse {
+ optional TStatus Status = 1;
+ repeated TConfigItemId AddedItems = 2;
+ repeated TConfigItemId RemovedItems = 3;
+ repeated TConfigItemId UpdatedItems = 4;
+}
+
+message TListConfigValidatorsRequest {
+}
+
+message TConfigValidatorInfo {
+ optional string Name = 1;
+ optional string Description = 2;
+ repeated uint32 CheckedItemKinds = 3;
+ optional bool Enabled = 4;
+}
+
+message TListConfigValidatorsResponse {
+ optional TStatus Status = 1;
+ repeated TConfigValidatorInfo Validators = 2;
+}
+
+message TToggleConfigValidatorRequest {
+ optional string Name = 1;
+ optional bool Disable = 2;
+}
+
+message TToggleConfigValidatorResponse {
+ optional TStatus Status = 1;
+}
+enum EValidationLevel {
+ // Validation is disabled.
+ VALIDATE_NONE = 0;
+ // Only domain config is validated. It's config for node
+ // with unspecified tenant, type, host and node ID.
+ VALIDATE_DOMAIN = 1;
+ // Configs for nodes with specified tenant are checked.
+ VALIDATE_TENANTS = 2;
+ // Configs for nodes with specified tenant and/or type
+ // are checked.
+ VALIDATE_TENANTS_AND_NODE_TYPES = 3;
+}
+
+message TConfigsConfig {
+ message TUsageScopeRestrictions {
+ repeated uint32 AllowedNodeIdUsageScopeKinds = 1;
+ repeated uint32 AllowedHostUsageScopeKinds = 2;
+ repeated uint32 AllowedTenantUsageScopeKinds = 3;
+ repeated uint32 AllowedNodeTypeUsageScopeKinds = 4;
+ repeated uint32 DisallowedDomainUsageScopeKinds = 5;
+ }
+
+ message TValidationOptions {
+ optional EValidationLevel ValidationLevel = 1 [default = VALIDATE_TENANTS_AND_NODE_TYPES];
+ // How many configs is allowed to validate per
+ // single configure command execution. Order of
+ // checks corresponds to validation levels.
+ // Firstly VALIDATE_DOMAIN checks are done,
+ // then VALIDATE_TENANTS checks etc.
+ optional uint32 MaxConfigChecksPerModification = 2 [default = 10000];
+ // If True then respond with error for configure
+ // commands which caused exceeded limit on config
+ // checks. Otherwise respond with SUCCESS and
+ // an info message.
+ optional bool FailOnExceededConfigChecksLimit = 3 [default = true];
+ // If True then resulting config for each node
+ // config request is validated. If validation
+ // fails then response with error status is sent.
+ optional bool EnableValidationOnNodeConfigRequest = 4 [default = true];
+ // If True then warning issues result in failed validation.
+ optional bool TreatWarningAsError = 5 [default = true];
+ }
+
+ optional TUsageScopeRestrictions UsageScopeRestrictions = 1;
+ optional TValidationOptions ValidationOptions = 2;
}
diff --git a/ydb/core/protos/console_tenant.proto b/ydb/core/protos/console_tenant.proto
index 4dd4c8787c9..7d3c687f5ba 100644
--- a/ydb/core/protos/console_tenant.proto
+++ b/ydb/core/protos/console_tenant.proto
@@ -1,118 +1,118 @@
import "ydb/public/api/protos/ydb_cms.proto";
import "ydb/public/api/protos/ydb_operation.proto";
-
-package NKikimrConsole;
-option java_package = "ru.yandex.kikimr.proto";
-
-
-message TCreateTenantRequest {
- optional Ydb.Cms.CreateDatabaseRequest Request = 1;
- optional bytes UserToken = 2;
-}
-
-message TCreateTenantResponse {
- optional Ydb.Cms.CreateDatabaseResponse Response = 1;
-}
-
-message TGetTenantStatusRequest {
- optional Ydb.Cms.GetDatabaseStatusRequest Request = 1;
- optional bytes UserToken = 2;
-}
-
-message TGetTenantStatusResponse {
- optional Ydb.Cms.GetDatabaseStatusResponse Response = 1;
-}
-
-message TAlterTenantRequest {
- optional Ydb.Cms.AlterDatabaseRequest Request = 1;
- optional bytes UserToken = 2;
-}
-
-message TAlterTenantResponse {
- optional Ydb.Cms.AlterDatabaseResponse Response = 1;
-}
-
-message TListTenantsRequest {
- optional Ydb.Cms.ListDatabasesRequest Request = 1;
- optional bytes UserToken = 2;
-}
-
-message TListTenantsResponse {
- optional Ydb.Cms.ListDatabasesResponse Response = 1;
-}
-
-message TRemoveTenantRequest {
- optional Ydb.Cms.RemoveDatabaseRequest Request = 1;
- optional bytes UserToken = 2;
-}
-
-message TRemoveTenantResponse {
- optional Ydb.Cms.RemoveDatabaseResponse Response = 1;
-}
-
-message TGetOperationRequest {
- optional Ydb.Operations.GetOperationRequest Request = 1;
- optional bytes UserToken = 2;
-}
-
-message TGetOperationResponse {
- optional Ydb.Operations.GetOperationResponse Response = 1;
-}
-
-message TDescribeTenantOptionsRequest {
- optional Ydb.Cms.DescribeDatabaseOptionsRequest Request = 1;
- optional bytes UserToken = 2;
-}
-
-message TDescribeTenantOptionsResponse {
- optional Ydb.Cms.DescribeDatabaseOptionsResponse Response = 1;
-}
-
-message TSlotLocation {
- optional string DataCenter = 1;
- optional bool ForceLocation = 2 [default = true];
- optional uint32 CollocationGroup = 3;
- optional bool ForceCollocation = 4;
-}
-
-message TAvailabilityZoneKind {
- optional string Kind = 1;
- oneof Zone {
- string DataCenterName = 2;
- TSlotLocation SlotLocation = 3;
- }
-}
-
-message TAvailabilityZoneSet {
- optional string Name = 1;
- repeated string ZoneKinds = 2;
-}
-
-message TComputationalUnitKind {
- optional string Kind = 1;
- oneof Resource {
- string TenantSlotType = 2;
- }
- optional string AvailabilityZoneSet = 10;
-}
-
-message TClusterQuota {
- // How many computational units in percents of totally
- // available for cluster can be allocated for tenants.
- // Used to keep reserve for host/dc downtime.
- optional uint64 ComputationalUnitsLoadQuota = 1;
- // Maximum number of computational units available for
- // allocation for tenants.
- optional uint64 ComputationalUnitsQuota = 2;
- // Maximum number of tenants we can create in cluster.
- optional uint64 TenantsQuota = 3;
-}
-
-message TTenantsConfig {
- optional uint64 DefaultStorageUnitsQuota = 1;
- optional uint64 DefaultComputationalUnitsQuota = 2;
- repeated TAvailabilityZoneKind AvailabilityZoneKinds = 3;
- repeated TAvailabilityZoneSet AvailabilityZoneSets = 4;
- repeated TComputationalUnitKind ComputationalUnitKinds = 5;
- optional TClusterQuota ClusterQuota = 6;
-}
+
+package NKikimrConsole;
+option java_package = "ru.yandex.kikimr.proto";
+
+
+message TCreateTenantRequest {
+ optional Ydb.Cms.CreateDatabaseRequest Request = 1;
+ optional bytes UserToken = 2;
+}
+
+message TCreateTenantResponse {
+ optional Ydb.Cms.CreateDatabaseResponse Response = 1;
+}
+
+message TGetTenantStatusRequest {
+ optional Ydb.Cms.GetDatabaseStatusRequest Request = 1;
+ optional bytes UserToken = 2;
+}
+
+message TGetTenantStatusResponse {
+ optional Ydb.Cms.GetDatabaseStatusResponse Response = 1;
+}
+
+message TAlterTenantRequest {
+ optional Ydb.Cms.AlterDatabaseRequest Request = 1;
+ optional bytes UserToken = 2;
+}
+
+message TAlterTenantResponse {
+ optional Ydb.Cms.AlterDatabaseResponse Response = 1;
+}
+
+message TListTenantsRequest {
+ optional Ydb.Cms.ListDatabasesRequest Request = 1;
+ optional bytes UserToken = 2;
+}
+
+message TListTenantsResponse {
+ optional Ydb.Cms.ListDatabasesResponse Response = 1;
+}
+
+message TRemoveTenantRequest {
+ optional Ydb.Cms.RemoveDatabaseRequest Request = 1;
+ optional bytes UserToken = 2;
+}
+
+message TRemoveTenantResponse {
+ optional Ydb.Cms.RemoveDatabaseResponse Response = 1;
+}
+
+message TGetOperationRequest {
+ optional Ydb.Operations.GetOperationRequest Request = 1;
+ optional bytes UserToken = 2;
+}
+
+message TGetOperationResponse {
+ optional Ydb.Operations.GetOperationResponse Response = 1;
+}
+
+message TDescribeTenantOptionsRequest {
+ optional Ydb.Cms.DescribeDatabaseOptionsRequest Request = 1;
+ optional bytes UserToken = 2;
+}
+
+message TDescribeTenantOptionsResponse {
+ optional Ydb.Cms.DescribeDatabaseOptionsResponse Response = 1;
+}
+
+message TSlotLocation {
+ optional string DataCenter = 1;
+ optional bool ForceLocation = 2 [default = true];
+ optional uint32 CollocationGroup = 3;
+ optional bool ForceCollocation = 4;
+}
+
+message TAvailabilityZoneKind {
+ optional string Kind = 1;
+ oneof Zone {
+ string DataCenterName = 2;
+ TSlotLocation SlotLocation = 3;
+ }
+}
+
+message TAvailabilityZoneSet {
+ optional string Name = 1;
+ repeated string ZoneKinds = 2;
+}
+
+message TComputationalUnitKind {
+ optional string Kind = 1;
+ oneof Resource {
+ string TenantSlotType = 2;
+ }
+ optional string AvailabilityZoneSet = 10;
+}
+
+message TClusterQuota {
+ // How many computational units in percents of totally
+ // available for cluster can be allocated for tenants.
+ // Used to keep reserve for host/dc downtime.
+ optional uint64 ComputationalUnitsLoadQuota = 1;
+ // Maximum number of computational units available for
+ // allocation for tenants.
+ optional uint64 ComputationalUnitsQuota = 2;
+ // Maximum number of tenants we can create in cluster.
+ optional uint64 TenantsQuota = 3;
+}
+
+message TTenantsConfig {
+ optional uint64 DefaultStorageUnitsQuota = 1;
+ optional uint64 DefaultComputationalUnitsQuota = 2;
+ repeated TAvailabilityZoneKind AvailabilityZoneKinds = 3;
+ repeated TAvailabilityZoneSet AvailabilityZoneSets = 4;
+ repeated TComputationalUnitKind ComputationalUnitKinds = 5;
+ optional TClusterQuota ClusterQuota = 6;
+}
diff --git a/ydb/core/protos/counters.proto b/ydb/core/protos/counters.proto
index 9520338249c..05a8c93d905 100644
--- a/ydb/core/protos/counters.proto
+++ b/ydb/core/protos/counters.proto
@@ -80,7 +80,7 @@ enum ETxTypeCumulativeCounters {
COUNTER_TT_COMMITED_CPUTIME = 9 [(CounterOpts) = {Name: "CommitedCPUTime"}];
COUNTER_TT_TOUCHED_BLOCKS = 10 [(CounterOpts) = {Name: "TouchedBlocks"}];
COUNTER_TT_LOADED_BLOCKS = 11 [(CounterOpts) = {Name: "LoadedBlocks"}];
- COUNTER_TT_TERMINATED = 12 [(CounterOpts) = {Name: "Terminated"}];
+ COUNTER_TT_TERMINATED = 12 [(CounterOpts) = {Name: "Terminated"}];
COUNTER_TT_REDO_WRITTEN_BYTES = 13 [(CounterOpts) = {Name: "RedoWrittenBytes"}];
COUNTER_TT_ANNEX_WRITTEN_BYTES = 14 [(CounterOpts) = {Name: "AnnexWrittenBytes"}];
}
diff --git a/ydb/core/protos/counters_datashard.proto b/ydb/core/protos/counters_datashard.proto
index 3c2821accf7..956a1369378 100644
--- a/ydb/core/protos/counters_datashard.proto
+++ b/ydb/core/protos/counters_datashard.proto
@@ -64,7 +64,7 @@ enum ECumulativeCounters {
COUNTER_LOCKS_REMOVED = 38 [(CounterOpts) = {Name: "LocksRemoved"}];
COUNTER_LOCKS_REJECT_BROKEN = 39 [(CounterOpts) = {Name: "LocksRejectBroken"}];
COUNTER_LOCKS_LOST = 40 [(CounterOpts) = {Name: "LocksLost"}];
- COUNTER_INACTIVE_TX_DATA_RELEASES = 41 [(CounterOpts) = {Name: "InactiveTxDataReleases"}];
+ COUNTER_INACTIVE_TX_DATA_RELEASES = 41 [(CounterOpts) = {Name: "InactiveTxDataReleases"}];
COUNTER_PIPELINE_OVERLOADED = 42 [(CounterOpts) = {Name: "PipelineOverloaded"}];
COUNTER_TX_PROGRESS_DELAYED = 43 [(CounterOpts) = {Name: "TxProgressDelayed"}];
COUNTER_TX_REORDERED = 44 [(CounterOpts) = {Name: "TxReordered"}];
@@ -375,15 +375,15 @@ enum ETxTypes {
TXTYPE_INIT_SCHEMA = 26 [(TxTypeOpts) = {Name: "TxInitSchema"}];
TXTYPE_COPY_TABLE_SNAPSHOT_COMPLETE = 27 [(TxTypeOpts) = {Name: "TxCopyTableSnapshotComplete"}];
TXTYPE_FULL_SCAN_COMPLETE = 28 [(TxTypeOpts) = {Name: "TxFullScanComplete"}];
- TXTYPE_STREAM_RESPONSE_QUOTA = 29 [(TxTypeOpts) = {Name: "TxStreamResponseQuota"}];
- TXTYPE_UNDELIVERED = 30 [(TxTypeOpts) = {Name: "TxUndelivered"}];
- TXTYPE_DISCONNECTED = 31 [(TxTypeOpts) = {Name: "TxDisconnected"}];
+ TXTYPE_STREAM_RESPONSE_QUOTA = 29 [(TxTypeOpts) = {Name: "TxStreamResponseQuota"}];
+ TXTYPE_UNDELIVERED = 30 [(TxTypeOpts) = {Name: "TxUndelivered"}];
+ TXTYPE_DISCONNECTED = 31 [(TxTypeOpts) = {Name: "TxDisconnected"}];
TXTYPE_S3_LISTING = 32 [(TxTypeOpts) = {Name: "TxS3Listing"}];
TXTYPE_INITIATE_STATS_UPDATE = 33 [(TxTypeOpts) = {Name: "TTxInitiateStatsUpdate"}];
- TXTYPE_CHECK_IN_READ_SETS = 34 [(TxTypeOpts) = {Name: "TTxCheckInReadSets"}];
- TXTYPE_REMOVE_OLD_IN_READ_SETS = 35 [(TxTypeOpts) = {Name: "TTxRemoveOldInReadSets"}];
+ TXTYPE_CHECK_IN_READ_SETS = 34 [(TxTypeOpts) = {Name: "TTxCheckInReadSets"}];
+ TXTYPE_REMOVE_OLD_IN_READ_SETS = 35 [(TxTypeOpts) = {Name: "TTxRemoveOldInReadSets"}];
TXTYPE_UPLOAD_ROWS = 36 [(TxTypeOpts) = {Name: "TTxUploadRows"}];
- TXTYPE_STORE_TABLE_PATH = 37 [(TxTypeOpts) = {Name: "TTxStoreTablePath"}];
+ TXTYPE_STORE_TABLE_PATH = 37 [(TxTypeOpts) = {Name: "TTxStoreTablePath"}];
TXTYPE_READ_COLUMNS = 38 [(TxTypeOpts) = {Name: "TTxReadColumns"}];
TXTYPE_PROPOSE = 39 [(TxTypeOpts) = {Name: "TxPropose"}];
TXTYPE_STORE_SCAN_STATE = 40 [(TxTypeOpts) = {Name: "TxStoreScanState"}];
diff --git a/ydb/core/protos/flat_scheme_op.proto b/ydb/core/protos/flat_scheme_op.proto
index 33de65759cd..33e598c1c25 100644
--- a/ydb/core/protos/flat_scheme_op.proto
+++ b/ydb/core/protos/flat_scheme_op.proto
@@ -83,20 +83,20 @@ message TColumnDescription {
optional bool NotNull = 8;
}
-message TStorageSettings {
- optional string PreferredPoolKind = 1;
- optional bool AllowOtherKinds = 2 [default = true];
-}
-
-message TStorageConfig {
- optional TStorageSettings SysLog = 1;
- optional TStorageSettings Log = 2;
- optional TStorageSettings Data = 3;
- optional TStorageSettings External = 4;
+message TStorageSettings {
+ optional string PreferredPoolKind = 1;
+ optional bool AllowOtherKinds = 2 [default = true];
+}
+
+message TStorageConfig {
+ optional TStorageSettings SysLog = 1;
+ optional TStorageSettings Log = 2;
+ optional TStorageSettings Data = 3;
+ optional TStorageSettings External = 4;
optional uint32 DataThreshold = 5;
optional uint32 ExternalThreshold = 6;
-}
-
+}
+
message TFamilyDescription {
optional uint32 Id = 1;
optional uint32 Room = 2; // Used by datashard, must not be used by users
@@ -106,7 +106,7 @@ message TFamilyDescription {
optional EColumnCodec ColumnCodec = 6;
optional EColumnCache ColumnCache = 7;
optional EColumnStorage Storage = 8; // DEPRECATED: use StorageConfig
- optional TStorageConfig StorageConfig = 9;
+ optional TStorageConfig StorageConfig = 9;
}
enum ECompactionStrategy {
@@ -116,30 +116,30 @@ enum ECompactionStrategy {
}
message TCompactionPolicy {
- message TBackgroundPolicy {
- // How much (in %) of forced compaction criteria should be met to submit background task.
- optional uint32 Threshold = 1 [default = 101]; // no background compaction by default
- // Base background compaction priority value (less priority means more important task).
- // Value is used to compute real task priority basing on compaction criteria, time
- // in queue etc.
- optional uint32 PriorityBase = 2 [default = 100];
- // Submitted background task may become more prioritized over time.
- // New priority is computed as priority /= max(log(elapsed_seconds) * factor, 1);
- optional double TimeFactor = 3 [default = 1.0];
- optional uint32 TaskType = 4 [default = 5]; // DEPRECATED
- optional string ResourceBrokerTask = 5;
- }
-
+ message TBackgroundPolicy {
+ // How much (in %) of forced compaction criteria should be met to submit background task.
+ optional uint32 Threshold = 1 [default = 101]; // no background compaction by default
+ // Base background compaction priority value (less priority means more important task).
+ // Value is used to compute real task priority basing on compaction criteria, time
+ // in queue etc.
+ optional uint32 PriorityBase = 2 [default = 100];
+ // Submitted background task may become more prioritized over time.
+ // New priority is computed as priority /= max(log(elapsed_seconds) * factor, 1);
+ optional double TimeFactor = 3 [default = 1.0];
+ optional uint32 TaskType = 4 [default = 5]; // DEPRECATED
+ optional string ResourceBrokerTask = 5;
+ }
+
message TGenerationPolicy {
optional uint32 GenerationId = 1;
optional uint64 SizeToCompact = 2;
optional uint32 CountToCompact = 3;
optional uint32 ForceCountToCompact = 4; // OR one of force limits happend
optional uint64 ForceSizeToCompact = 5;
- optional uint32 CompactionBrokerQueue = 6; // DEPRECATED
+ optional uint32 CompactionBrokerQueue = 6; // DEPRECATED
optional bool KeepInCache = 7;
- optional TBackgroundPolicy BackgroundCompactionPolicy = 8;
- optional string ResourceBrokerTask = 9;
+ optional TBackgroundPolicy BackgroundCompactionPolicy = 8;
+ optional string ResourceBrokerTask = 9;
optional uint32 ExtraCompactionPercent = 10;
optional uint64 ExtraCompactionMinSize = 11;
optional uint32 ExtraCompactionExpPercent = 12;
@@ -195,17 +195,17 @@ message TCompactionPolicy {
optional uint32 InMemStepsToSnapshot = 2; // snapshot inmem state when size AND steps from last snapshot passed
optional uint32 InMemForceStepsToSnapshot = 3; // OR steps passed
optional uint64 InMemForceSizeToSnapshot = 4; // OR size reached
- optional uint32 InMemCompactionBrokerQueue = 5 [default = 0]; // DEPRECATED
+ optional uint32 InMemCompactionBrokerQueue = 5 [default = 0]; // DEPRECATED
optional uint64 ReadAheadHiThreshold = 6 [default = 67108864];
optional uint64 ReadAheadLoThreshold = 7 [default = 16777216];
optional uint32 MinDataPageSize = 8 [default = 7168]; // 7KB is smallest optimal for 512 byte sectors
- optional uint32 SnapBrokerQueue = 9 [default = 0]; // DEPRECATED
- optional uint32 BackupBrokerQueue = 11 [default = 1]; // DEPRECATED
- optional uint32 DefaultTaskPriority = 12 [default = 5];
- optional TBackgroundPolicy BackgroundSnapshotPolicy = 13;
- optional string InMemResourceBrokerTask = 14;
- optional string SnapshotResourceBrokerTask = 15;
- optional string BackupResourceBrokerTask = 16;
+ optional uint32 SnapBrokerQueue = 9 [default = 0]; // DEPRECATED
+ optional uint32 BackupBrokerQueue = 11 [default = 1]; // DEPRECATED
+ optional uint32 DefaultTaskPriority = 12 [default = 5];
+ optional TBackgroundPolicy BackgroundSnapshotPolicy = 13;
+ optional string InMemResourceBrokerTask = 14;
+ optional string SnapshotResourceBrokerTask = 15;
+ optional string BackupResourceBrokerTask = 16;
optional uint64 LogOverheadSizeToSnapshot = 17;
optional uint32 LogOverheadCountToSnapshot = 18;
optional uint32 DroppedRowsPercentToCompact = 19;
@@ -260,7 +260,7 @@ message TPartitionConfig {
optional TPartitioningPolicy PartitioningPolicy = 10;
optional TPipelineConfig PipelineConfig = 11;
repeated TFamilyDescription ColumnFamilies = 12;
- optional string ResourceProfile = 13;
+ optional string ResourceProfile = 13;
optional bool DisableStatisticsCalculation = 14; // KIKIMR-3861 hotfix
optional bool EnableFilterByKey = 15 [default = false]; // Build and use per-part bloom filter for fast key non-existence check
optional bool ExecutorFastLogPolicy = 16 [default = true]; // Commit log faster at the expense of bandwidth for cross-DC
@@ -330,7 +330,7 @@ message TTableDescription {
optional TPartitionConfig PartitionConfig = 7;
repeated TColumnDescription DropColumns = 8;
- optional string Path = 9;
+ optional string Path = 9;
// It shouldn't be there
optional bytes PartitionRangeBegin = 20;
@@ -1466,40 +1466,40 @@ message TPathDescription {
message TAlterExtraData {
optional TPartitionConfig PartitionConfig = 1;
}
-
-message TResourceProfile {
- // Here is how tablet resource profile with specified NAME and TYPE is searched:
- // 1. Search for profile NAME for tablet TYPE.
- // 2. Search for profile 'default' for tablet TYPE.
- // 3. Search for profile NAME for tablet 'Unknown'.
- // 4. Search for profile 'default' for tablet 'Unknown'.
+
+message TResourceProfile {
+ // Here is how tablet resource profile with specified NAME and TYPE is searched:
+ // 1. Search for profile NAME for tablet TYPE.
+ // 2. Search for profile 'default' for tablet TYPE.
+ // 3. Search for profile NAME for tablet 'Unknown'.
+ // 4. Search for profile 'default' for tablet 'Unknown'.
// 5. Use default NKikimrSchemeOp.TResourceProfile value.
- optional NKikimrTabletBase.TTabletTypes.EType TabletType = 1 [default = Unknown];
- optional string Name = 2;
- // Memory used by tablet (not related to transactions and executor cache).
- // Used only for new tablets with no memory usage statistics collected.
- optional uint64 DefaultTabletMemoryUsage = 3 [default = 1048576]; //1MB
- // Max static memory consumption for tablet transactions. Additional memory should
- // be requested in Resource Broker.
- optional uint64 StaticTabletTxMemoryLimit = 4 [default = 0]; // Unlimited by default.
- // Max static memory consumption for a single transaction. If transaction requires
- // more memory then it has to be requested via Resource Broker.
- optional uint64 StaticTxMemoryLimit = 5 [default = 262144000]; // 250MB.
- // Memory consumption limit for transactions. Transactions requiring more
- // memory should be terminated.
- optional uint64 TxMemoryLimit = 6 [default = 0]; // Unlimited by default.
- // Memory initially allocated for transaction data (doesn't include pages used
- // by transaction). Additional memory should be requested by transaction via
- // transaction context.
- optional uint64 InitialTxMemory = 7 [default = 4194304]; // 4MB
- // Memory consumption limit for small transactions.
- optional uint64 SmallTxMemoryLimit = 8 [default = 10485760]; // 10MB
- // Memory consumption limit for medium transactions.
- optional uint64 MediumTxMemoryLimit = 9 [default = 104857600]; // 100MB
- // Resource Broker task type for small transactions.
- optional string SmallTxTaskType = 10 [default = "transaction"];
- // Resource Broker task type for medium transactions.
- optional string MediumTxTaskType = 11 [default = "transaction"];
- // Resource Broker task type for large transactions.
- optional string LargeTxTaskType = 12 [default = "transaction"];
-}
+ optional NKikimrTabletBase.TTabletTypes.EType TabletType = 1 [default = Unknown];
+ optional string Name = 2;
+ // Memory used by tablet (not related to transactions and executor cache).
+ // Used only for new tablets with no memory usage statistics collected.
+ optional uint64 DefaultTabletMemoryUsage = 3 [default = 1048576]; //1MB
+ // Max static memory consumption for tablet transactions. Additional memory should
+ // be requested in Resource Broker.
+ optional uint64 StaticTabletTxMemoryLimit = 4 [default = 0]; // Unlimited by default.
+ // Max static memory consumption for a single transaction. If transaction requires
+ // more memory then it has to be requested via Resource Broker.
+ optional uint64 StaticTxMemoryLimit = 5 [default = 262144000]; // 250MB.
+ // Memory consumption limit for transactions. Transactions requiring more
+ // memory should be terminated.
+ optional uint64 TxMemoryLimit = 6 [default = 0]; // Unlimited by default.
+ // Memory initially allocated for transaction data (doesn't include pages used
+ // by transaction). Additional memory should be requested by transaction via
+ // transaction context.
+ optional uint64 InitialTxMemory = 7 [default = 4194304]; // 4MB
+ // Memory consumption limit for small transactions.
+ optional uint64 SmallTxMemoryLimit = 8 [default = 10485760]; // 10MB
+ // Memory consumption limit for medium transactions.
+ optional uint64 MediumTxMemoryLimit = 9 [default = 104857600]; // 100MB
+ // Resource Broker task type for small transactions.
+ optional string SmallTxTaskType = 10 [default = "transaction"];
+ // Resource Broker task type for medium transactions.
+ optional string MediumTxTaskType = 11 [default = "transaction"];
+ // Resource Broker task type for large transactions.
+ optional string LargeTxTaskType = 12 [default = "transaction"];
+}
diff --git a/ydb/core/protos/grpc.proto b/ydb/core/protos/grpc.proto
index 5451bc24718..797cc2de829 100644
--- a/ydb/core/protos/grpc.proto
+++ b/ydb/core/protos/grpc.proto
@@ -61,16 +61,16 @@ service TGRpcServer {
rpc TestShardControl(TTestShardControlRequest) returns (TResponse);
/////////////////////////////////////////////////////////////////////////////////////////////////
- // DYNAMIC NODES INTERNAL INTERFACE
- /////////////////////////////////////////////////////////////////////////////////////////////////
- rpc RegisterNode(TNodeRegistrationRequest) returns (TNodeRegistrationResponse);
-
- /////////////////////////////////////////////////////////////////////////////////////////////////
- // CMS INTERFACE
- /////////////////////////////////////////////////////////////////////////////////////////////////
- rpc CmsRequest(TCmsRequest) returns (TCmsResponse);
-
- /////////////////////////////////////////////////////////////////////////////////////////////////
+ // DYNAMIC NODES INTERNAL INTERFACE
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ rpc RegisterNode(TNodeRegistrationRequest) returns (TNodeRegistrationResponse);
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ // CMS INTERFACE
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ rpc CmsRequest(TCmsRequest) returns (TCmsResponse);
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////
// SQS INTERFACE
/////////////////////////////////////////////////////////////////////////////////////////////////
rpc SqsRequest(TSqsRequest) returns (TSqsResponse);
@@ -81,11 +81,11 @@ service TGRpcServer {
rpc S3Listing(TS3ListingRequest) returns (TS3ListingResponse);
/////////////////////////////////////////////////////////////////////////////////////////////////
- // CONSOLE INTERFACE
- /////////////////////////////////////////////////////////////////////////////////////////////////
- rpc ConsoleRequest(TConsoleRequest) returns (TConsoleResponse);
-
- /////////////////////////////////////////////////////////////////////////////////////////////////
+ // CONSOLE INTERFACE
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ rpc ConsoleRequest(TConsoleRequest) returns (TConsoleResponse);
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////
// INTROSPECTION
/////////////////////////////////////////////////////////////////////////////////////////////////
rpc LocalMKQL(TLocalMKQL) returns (TResponse);
diff --git a/ydb/core/protos/local.proto b/ydb/core/protos/local.proto
index e0f2c977c7b..a385a3cf3e1 100644
--- a/ydb/core/protos/local.proto
+++ b/ydb/core/protos/local.proto
@@ -26,15 +26,15 @@ message TEvRegisterNodeResult {
optional uint32 HiveGeneration = 3;
}
-message TLocalConfig {
+message TLocalConfig {
repeated NKikimrSchemeOp.TResourceProfile ResourceProfiles = 1;
-}
-
+}
+
message TEvPing {
optional fixed64 HiveId = 1;
optional uint32 HiveGeneration = 2;
optional bool Purge = 3;
- optional TLocalConfig Config = 4;
+ optional TLocalConfig Config = 4;
}
message TEvDeadTabletAck {
diff --git a/ydb/core/protos/msgbus.proto b/ydb/core/protos/msgbus.proto
index 4ba8162f933..df7cda59800 100644
--- a/ydb/core/protos/msgbus.proto
+++ b/ydb/core/protos/msgbus.proto
@@ -530,64 +530,64 @@ message TResolveNodeRequest {
optional uint32 NodeId = 2;
optional bool ResolveLocalNode = 3; // for compatibility of resolving local '.' node
};
-
-message TNodeRegistrationRequest {
- optional string Host = 1;
- optional uint32 Port = 2;
- optional string ResolveHost = 3;
- optional string Address = 4;
+
+message TNodeRegistrationRequest {
+ optional string Host = 1;
+ optional uint32 Port = 2;
+ optional string ResolveHost = 3;
+ optional string Address = 4;
optional NActorsInterconnect.TNodeLocation Location = 5;
- optional string DomainPath = 6;
- optional bool FixedNodeId = 7;
+ optional string DomainPath = 6;
+ optional bool FixedNodeId = 7;
optional string Path = 8;
-}
-
-message TNodeRegistrationResponse {
- optional NKikimrNodeBroker.TStatus Status = 1;
- optional uint32 NodeId = 2;
- optional string DomainPath = 3;
- optional uint64 Expire = 4;
- repeated NKikimrNodeBroker.TNodeInfo Nodes = 5;
+}
+
+message TNodeRegistrationResponse {
+ optional NKikimrNodeBroker.TStatus Status = 1;
+ optional uint32 NodeId = 2;
+ optional string DomainPath = 3;
+ optional uint64 Expire = 4;
+ repeated NKikimrNodeBroker.TNodeInfo Nodes = 5;
optional uint64 ScopeTabletId = 6;
optional uint64 ScopePathId = 7;
-}
-
-message TCmsRequest {
- oneof Request {
- NKikimrCms.TClusterStateRequest ClusterStateRequest = 1;
- NKikimrCms.TPermissionRequest PermissionRequest = 2;
- NKikimrCms.TManageRequestRequest ManageRequestRequest = 3;
- NKikimrCms.TCheckRequest CheckRequest = 4;
- NKikimrCms.TManagePermissionRequest ManagePermissionRequest = 5;
- NKikimrCms.TConditionalPermissionRequest ConditionalPermissionRequest = 6;
- NKikimrCms.TNotification Notification = 7;
- NKikimrCms.TManageNotificationRequest ManageNotificationRequest = 8;
- NKikimrCms.TGetConfigRequest GetConfigRequest = 9;
- NKikimrCms.TSetConfigRequest SetConfigRequest = 10;
- NKikimrCms.TSetMarkerRequest SetMarkerRequest = 11;
- NKikimrCms.TResetMarkerRequest ResetMarkerRequest = 12;
- NKikimrCms.TGetLogTailRequest GetLogTailRequest = 13;
- }
- optional string DomainName = 100;
- optional string SecurityToken = 101;
-}
-
-message TCmsResponse {
- oneof Response {
- NKikimrCms.TClusterStateResponse ClusterStateResponse = 1;
- NKikimrCms.TPermissionResponse PermissionResponse = 2;
- NKikimrCms.TManageRequestResponse ManageRequestResponse = 3;
- NKikimrCms.TManagePermissionResponse ManagePermissionResponse = 4;
- NKikimrCms.TNotificationResponse NotificationResponse = 5;
- NKikimrCms.TManageNotificationResponse ManageNotificationResponse = 6;
- NKikimrCms.TGetConfigResponse GetConfigResponse = 7;
- NKikimrCms.TSetConfigResponse SetConfigResponse = 8;
- NKikimrCms.TSetMarkerResponse SetMarkerResponse = 9;
- NKikimrCms.TResetMarkerResponse ResetMarkerResponse = 10;
- NKikimrCms.TGetLogTailResponse GetLogTailResponse = 11;
- }
- optional NKikimrCms.TStatus Status = 100;
-}
+}
+
+message TCmsRequest {
+ oneof Request {
+ NKikimrCms.TClusterStateRequest ClusterStateRequest = 1;
+ NKikimrCms.TPermissionRequest PermissionRequest = 2;
+ NKikimrCms.TManageRequestRequest ManageRequestRequest = 3;
+ NKikimrCms.TCheckRequest CheckRequest = 4;
+ NKikimrCms.TManagePermissionRequest ManagePermissionRequest = 5;
+ NKikimrCms.TConditionalPermissionRequest ConditionalPermissionRequest = 6;
+ NKikimrCms.TNotification Notification = 7;
+ NKikimrCms.TManageNotificationRequest ManageNotificationRequest = 8;
+ NKikimrCms.TGetConfigRequest GetConfigRequest = 9;
+ NKikimrCms.TSetConfigRequest SetConfigRequest = 10;
+ NKikimrCms.TSetMarkerRequest SetMarkerRequest = 11;
+ NKikimrCms.TResetMarkerRequest ResetMarkerRequest = 12;
+ NKikimrCms.TGetLogTailRequest GetLogTailRequest = 13;
+ }
+ optional string DomainName = 100;
+ optional string SecurityToken = 101;
+}
+
+message TCmsResponse {
+ oneof Response {
+ NKikimrCms.TClusterStateResponse ClusterStateResponse = 1;
+ NKikimrCms.TPermissionResponse PermissionResponse = 2;
+ NKikimrCms.TManageRequestResponse ManageRequestResponse = 3;
+ NKikimrCms.TManagePermissionResponse ManagePermissionResponse = 4;
+ NKikimrCms.TNotificationResponse NotificationResponse = 5;
+ NKikimrCms.TManageNotificationResponse ManageNotificationResponse = 6;
+ NKikimrCms.TGetConfigResponse GetConfigResponse = 7;
+ NKikimrCms.TSetConfigResponse SetConfigResponse = 8;
+ NKikimrCms.TSetMarkerResponse SetMarkerResponse = 9;
+ NKikimrCms.TResetMarkerResponse ResetMarkerResponse = 10;
+ NKikimrCms.TGetLogTailResponse GetLogTailResponse = 11;
+ }
+ optional NKikimrCms.TStatus Status = 100;
+}
message TSqsRequest {
oneof Request {
@@ -699,50 +699,50 @@ message TInterconnectDebug {
optional uint64 RescheduleMin = 204;
optional uint64 RescheduleMax = 205;
}
-
-message TConsoleRequest {
- oneof Request {
- NKikimrConsole.TCreateTenantRequest CreateTenantRequest = 1;
- NKikimrConsole.TGetTenantStatusRequest GetTenantStatusRequest = 2;
- NKikimrConsole.TAlterTenantRequest AlterTenantRequest = 3;
- NKikimrConsole.TListTenantsRequest ListTenantsRequest = 4;
- NKikimrConsole.TGetConfigRequest GetConfigRequest = 5;
- NKikimrConsole.TSetConfigRequest SetConfigRequest = 6;
- NKikimrConsole.TConfigureRequest ConfigureRequest = 7;
- NKikimrConsole.TGetConfigItemsRequest GetConfigItemsRequest = 8;
- NKikimrConsole.TGetNodeConfigItemsRequest GetNodeConfigItemsRequest = 9;
- NKikimrConsole.TGetNodeConfigRequest GetNodeConfigRequest = 10;
- NKikimrConsole.TRemoveTenantRequest RemoveTenantRequest = 11;
+
+message TConsoleRequest {
+ oneof Request {
+ NKikimrConsole.TCreateTenantRequest CreateTenantRequest = 1;
+ NKikimrConsole.TGetTenantStatusRequest GetTenantStatusRequest = 2;
+ NKikimrConsole.TAlterTenantRequest AlterTenantRequest = 3;
+ NKikimrConsole.TListTenantsRequest ListTenantsRequest = 4;
+ NKikimrConsole.TGetConfigRequest GetConfigRequest = 5;
+ NKikimrConsole.TSetConfigRequest SetConfigRequest = 6;
+ NKikimrConsole.TConfigureRequest ConfigureRequest = 7;
+ NKikimrConsole.TGetConfigItemsRequest GetConfigItemsRequest = 8;
+ NKikimrConsole.TGetNodeConfigItemsRequest GetNodeConfigItemsRequest = 9;
+ NKikimrConsole.TGetNodeConfigRequest GetNodeConfigRequest = 10;
+ NKikimrConsole.TRemoveTenantRequest RemoveTenantRequest = 11;
Ydb.Operations.GetOperationRequest GetOperationRequest = 12;
- NKikimrConsole.TCheckConfigUpdatesRequest CheckConfigUpdatesRequest = 13;
- NKikimrConsole.TListConfigValidatorsRequest ListConfigValidatorsRequest = 14;
- NKikimrConsole.TToggleConfigValidatorRequest ToggleConfigValidatorRequest = 15;
- }
- optional string DomainName = 100;
- optional string SecurityToken = 101;
-}
-
-message TConsoleResponse {
- oneof Response {
- NKikimrConsole.TCreateTenantResponse CreateTenantResponse = 1;
- NKikimrConsole.TGetTenantStatusResponse GetTenantStatusResponse = 2;
- NKikimrConsole.TAlterTenantResponse AlterTenantResponse = 3;
- NKikimrConsole.TListTenantsResponse ListTenantsResponse = 4;
- NKikimrConsole.TGetConfigResponse GetConfigResponse = 5;
- NKikimrConsole.TSetConfigResponse SetConfigResponse = 6;
- NKikimrConsole.TConfigureResponse ConfigureResponse = 7;
- NKikimrConsole.TGetConfigItemsResponse GetConfigItemsResponse = 8;
- NKikimrConsole.TGetNodeConfigItemsResponse GetNodeConfigItemsResponse = 9;
- NKikimrConsole.TGetNodeConfigResponse GetNodeConfigResponse = 10;
- NKikimrConsole.TRemoveTenantResponse RemoveTenantResponse = 11;
+ NKikimrConsole.TCheckConfigUpdatesRequest CheckConfigUpdatesRequest = 13;
+ NKikimrConsole.TListConfigValidatorsRequest ListConfigValidatorsRequest = 14;
+ NKikimrConsole.TToggleConfigValidatorRequest ToggleConfigValidatorRequest = 15;
+ }
+ optional string DomainName = 100;
+ optional string SecurityToken = 101;
+}
+
+message TConsoleResponse {
+ oneof Response {
+ NKikimrConsole.TCreateTenantResponse CreateTenantResponse = 1;
+ NKikimrConsole.TGetTenantStatusResponse GetTenantStatusResponse = 2;
+ NKikimrConsole.TAlterTenantResponse AlterTenantResponse = 3;
+ NKikimrConsole.TListTenantsResponse ListTenantsResponse = 4;
+ NKikimrConsole.TGetConfigResponse GetConfigResponse = 5;
+ NKikimrConsole.TSetConfigResponse SetConfigResponse = 6;
+ NKikimrConsole.TConfigureResponse ConfigureResponse = 7;
+ NKikimrConsole.TGetConfigItemsResponse GetConfigItemsResponse = 8;
+ NKikimrConsole.TGetNodeConfigItemsResponse GetNodeConfigItemsResponse = 9;
+ NKikimrConsole.TGetNodeConfigResponse GetNodeConfigResponse = 10;
+ NKikimrConsole.TRemoveTenantResponse RemoveTenantResponse = 11;
Ydb.Operations.GetOperationResponse GetOperationResponse = 12;
- NKikimrConsole.TCheckConfigUpdatesResponse CheckConfigUpdatesResponse = 13;
- NKikimrConsole.TListConfigValidatorsResponse ListConfigValidatorsResponse = 14;
- NKikimrConsole.TToggleConfigValidatorResponse ToggleConfigValidatorResponse = 15;
- }
- optional NKikimrConsole.TStatus Status = 100;
-}
-
+ NKikimrConsole.TCheckConfigUpdatesResponse CheckConfigUpdatesResponse = 13;
+ NKikimrConsole.TListConfigValidatorsResponse ListConfigValidatorsResponse = 14;
+ NKikimrConsole.TToggleConfigValidatorResponse ToggleConfigValidatorResponse = 15;
+ }
+ optional NKikimrConsole.TStatus Status = 100;
+}
+
message TTestShardControlRequest {
message TSizeInterval {
optional uint64 Weight = 1; // nonzero
diff --git a/ydb/core/protos/node_broker.proto b/ydb/core/protos/node_broker.proto
index 44f944fb6ea..ee0908902c6 100644
--- a/ydb/core/protos/node_broker.proto
+++ b/ydb/core/protos/node_broker.proto
@@ -1,117 +1,117 @@
import "library/cpp/actors/protos/interconnect.proto";
-
-package NKikimrNodeBroker;
-option java_package = "ru.yandex.kikimr.proto";
-
-message TListNodes {
- oneof Filter {
- // Response is sent only when specified epoch is reached.
- uint64 MinEpoch = 1;
- // Response with empty info if state is in specified version.
- uint64 CachedVersion = 2;
- }
-}
-
-message TNodeInfo {
- optional uint32 NodeId = 1;
- optional string Host = 2;
- optional uint32 Port = 3;
- optional string ResolveHost = 4;
- optional string Address = 5;
+
+package NKikimrNodeBroker;
+option java_package = "ru.yandex.kikimr.proto";
+
+message TListNodes {
+ oneof Filter {
+ // Response is sent only when specified epoch is reached.
+ uint64 MinEpoch = 1;
+ // Response with empty info if state is in specified version.
+ uint64 CachedVersion = 2;
+ }
+}
+
+message TNodeInfo {
+ optional uint32 NodeId = 1;
+ optional string Host = 2;
+ optional uint32 Port = 3;
+ optional string ResolveHost = 4;
+ optional string Address = 5;
optional NActorsInterconnect.TNodeLocation Location = 6;
- optional uint64 Expire = 7;
-}
-
-message TEpoch {
- optional uint64 Id = 1;
- optional uint64 Version = 2;
- optional uint64 Start = 3;
- optional uint64 End = 4;
- optional uint64 NextEnd = 5;
-}
-
-message TNodesInfo {
- optional uint32 Domain = 1;
- repeated TNodeInfo Nodes = 2;
- repeated TNodeInfo ExpiredNodes = 3;
- optional TEpoch Epoch = 4;
-}
-
-message TResolveNode {
- optional uint32 NodeId = 1;
-}
-
-message TStatus {
- enum ECode {
- UNKNOWN = 0;
- OK = 1;
- ERROR = 2;
- ERROR_TEMP = 3;
- WRONG_REQUEST = 4;
- }
-
- optional ECode Code = 1;
- optional string Reason = 2;
-}
-
-message TResolvedNode {
- optional TStatus Status = 1;
- optional TNodeInfo Node = 2;
-}
-
-message TRegistrationRequest {
- optional string Host = 1;
- optional uint32 Port = 2;
- optional string ResolveHost = 3;
- optional string Address = 4;
+ optional uint64 Expire = 7;
+}
+
+message TEpoch {
+ optional uint64 Id = 1;
+ optional uint64 Version = 2;
+ optional uint64 Start = 3;
+ optional uint64 End = 4;
+ optional uint64 NextEnd = 5;
+}
+
+message TNodesInfo {
+ optional uint32 Domain = 1;
+ repeated TNodeInfo Nodes = 2;
+ repeated TNodeInfo ExpiredNodes = 3;
+ optional TEpoch Epoch = 4;
+}
+
+message TResolveNode {
+ optional uint32 NodeId = 1;
+}
+
+message TStatus {
+ enum ECode {
+ UNKNOWN = 0;
+ OK = 1;
+ ERROR = 2;
+ ERROR_TEMP = 3;
+ WRONG_REQUEST = 4;
+ }
+
+ optional ECode Code = 1;
+ optional string Reason = 2;
+}
+
+message TResolvedNode {
+ optional TStatus Status = 1;
+ optional TNodeInfo Node = 2;
+}
+
+message TRegistrationRequest {
+ optional string Host = 1;
+ optional uint32 Port = 2;
+ optional string ResolveHost = 3;
+ optional string Address = 4;
optional NActorsInterconnect.TNodeLocation Location = 5;
- optional bool FixedNodeId = 6;
+ optional bool FixedNodeId = 6;
optional string Path = 7;
-}
-
-message TRegistrationResponse {
- optional TStatus Status = 1;
- optional TNodeInfo Node = 2;
+}
+
+message TRegistrationResponse {
+ optional TStatus Status = 1;
+ optional TNodeInfo Node = 2;
optional uint64 ScopeTabletId = 3;
optional uint64 ScopePathId = 4;
-}
-
-message TExtendLeaseRequest {
- optional uint32 NodeId = 1;
-}
-
-message TExtendLeaseResponse {
- optional TStatus Status = 1;
- optional uint32 NodeId = 2;
- optional uint64 Expire = 3;
- // Epoch at which ping happened. Lease is extended
- // until the end of the next epoch.
- optional TEpoch Epoch = 4;
-}
-
-message TConfig {
- // Both limits are inclusive.
- message TNodeIds {
- optional uint32 From = 1;
- optional uint32 To = 2;
- }
-
- optional uint64 EpochDuration = 1 [default = 3600000000];
- // Don't allocate and extend lease for IDs from banned intervals.
- repeated TNodeIds BannedNodeIds = 2;
-}
-
-message TGetConfigRequest {
-}
-
-message TGetConfigResponse {
- optional TConfig Config = 1;
-}
-
-message TSetConfigRequest {
- optional TConfig Config = 1;
-}
-
-message TSetConfigResponse {
- optional TStatus Status = 1;
-}
+}
+
+message TExtendLeaseRequest {
+ optional uint32 NodeId = 1;
+}
+
+message TExtendLeaseResponse {
+ optional TStatus Status = 1;
+ optional uint32 NodeId = 2;
+ optional uint64 Expire = 3;
+ // Epoch at which ping happened. Lease is extended
+ // until the end of the next epoch.
+ optional TEpoch Epoch = 4;
+}
+
+message TConfig {
+ // Both limits are inclusive.
+ message TNodeIds {
+ optional uint32 From = 1;
+ optional uint32 To = 2;
+ }
+
+ optional uint64 EpochDuration = 1 [default = 3600000000];
+ // Don't allocate and extend lease for IDs from banned intervals.
+ repeated TNodeIds BannedNodeIds = 2;
+}
+
+message TGetConfigRequest {
+}
+
+message TGetConfigResponse {
+ optional TConfig Config = 1;
+}
+
+message TSetConfigRequest {
+ optional TConfig Config = 1;
+}
+
+message TSetConfigResponse {
+ optional TStatus Status = 1;
+}
diff --git a/ydb/core/protos/resource_broker.proto b/ydb/core/protos/resource_broker.proto
index 740793e92c9..e5b358a1c2e 100644
--- a/ydb/core/protos/resource_broker.proto
+++ b/ydb/core/protos/resource_broker.proto
@@ -1,42 +1,42 @@
-package NKikimrResourceBroker;
-option java_package = "ru.yandex.kikimr.proto";
-
-enum EResourceType {
- CPU = 0;
- MEMORY = 1;
-};
-
-message TResources {
- // Index is EResourceType.
- repeated uint64 Resource = 1;
+package NKikimrResourceBroker;
+option java_package = "ru.yandex.kikimr.proto";
+
+enum EResourceType {
+ CPU = 0;
+ MEMORY = 1;
+};
+
+message TResources {
+ // Index is EResourceType.
+ repeated uint64 Resource = 1;
// New style settings
optional uint64 Cpu = 2;
optional uint64 Memory = 3;
-};
-
-message TQueueConfig {
- optional string Name = 1;
- optional uint32 Weight = 2;
- optional TResources Limit = 3;
-};
-
-message TTaskConfig {
- optional string Name = 1;
- // Queue task is assigned to.
- optional string QueueName = 2;
- // Task duration used as a default value before statistics is collected.
- optional uint64 DefaultDuration = 3;
-};
-
-message TResourceBrokerConfig {
- // Queue with "default" name is required.
- repeated TQueueConfig Queues = 1;
- // Task type with "unknown" name is required.
- repeated TTaskConfig Tasks = 2;
- optional TResources ResourceLimit = 3;
-};
-
-message TResourceBrokerConfigResult {
- optional bool Success = 1;
- optional string Message = 2;
-};
+};
+
+message TQueueConfig {
+ optional string Name = 1;
+ optional uint32 Weight = 2;
+ optional TResources Limit = 3;
+};
+
+message TTaskConfig {
+ optional string Name = 1;
+ // Queue task is assigned to.
+ optional string QueueName = 2;
+ // Task duration used as a default value before statistics is collected.
+ optional uint64 DefaultDuration = 3;
+};
+
+message TResourceBrokerConfig {
+ // Queue with "default" name is required.
+ repeated TQueueConfig Queues = 1;
+ // Task type with "unknown" name is required.
+ repeated TTaskConfig Tasks = 2;
+ optional TResources ResourceLimit = 3;
+};
+
+message TResourceBrokerConfigResult {
+ optional bool Success = 1;
+ optional string Message = 2;
+};
diff --git a/ydb/core/protos/scheme_log.proto b/ydb/core/protos/scheme_log.proto
index 55f0060602e..fcf4ba52b94 100644
--- a/ydb/core/protos/scheme_log.proto
+++ b/ydb/core/protos/scheme_log.proto
@@ -65,7 +65,7 @@ message TAlterRecord {
optional bool ExecutorAllowLogBatching = 102;
optional uint64 ExecutorLogFlushPeriod = 103;
optional uint32 ExecutorLimitInFlyTx = 104;
- optional string ExecutorResourceProfile = 105;
+ optional string ExecutorResourceProfile = 105;
optional bool ExecutorLogFastCommitTactic = 106;
};
diff --git a/ydb/core/protos/services.proto b/ydb/core/protos/services.proto
index 43ec3b08663..c17c8a7dc37 100644
--- a/ydb/core/protos/services.proto
+++ b/ydb/core/protos/services.proto
@@ -78,8 +78,8 @@ enum EServiceKikimr {
HIVE = 300;
LOCAL = 301;
BOOTSTRAPPER = 302;
- TENANT_POOL = 303;
- LABELS_MAINTAINER = 305;
+ TENANT_POOL = 303;
+ LABELS_MAINTAINER = 305;
// TABLET section
TABLET_EXECUTOR = 310;
@@ -193,17 +193,17 @@ enum EServiceKikimr {
MEMORY_PROFILER = 510;
DATASHARD_BACKUP = 522;
-
- CMS = 523;
+
+ CMS = 523;
HTTP = 524;
- NODE_BROKER = 525;
- TENANT_SLOT_BROKER = 526;
- CMS_TENANTS = 527;
- CMS_CONFIGS = 528;
- CMS_CLUSTER = 529;
-
+ NODE_BROKER = 525;
+ TENANT_SLOT_BROKER = 526;
+ CMS_TENANTS = 527;
+ CMS_CONFIGS = 528;
+ CMS_CLUSTER = 529;
+
KQP_PROXY = 530;
KQP_WORKER = 531;
KQP_GATEWAY = 532;
@@ -228,9 +228,9 @@ enum EServiceKikimr {
KESYS_PROXY_REQUEST = 552;
KESUS_TABLET = 553;
- CONFIGS_DISPATCHER = 560;
+ CONFIGS_DISPATCHER = 560;
CONFIGS_CACHE = 561;
-
+
// SchemeBoard section
SCHEME_BOARD_REPLICA = 570;
SCHEME_BOARD_SUBSCRIBER = 571;
diff --git a/ydb/core/protos/stream.proto b/ydb/core/protos/stream.proto
index 00bc9090499..429148ecec8 100644
--- a/ydb/core/protos/stream.proto
+++ b/ydb/core/protos/stream.proto
@@ -1,20 +1,20 @@
-package NKikimrStream;
-option java_package = "ru.yandex.kikimr.proto";
-
-message TStreamingConfig {
- message TOutputStreamConfig {
- optional uint64 MessageSizeLimit = 1 [default = 20971520];
- optional uint64 MessageBufferSize = 2 [default = 536870912];
- // Quota size is counted in response messages, not in bytes.
- optional uint32 MinQuotaSize = 3 [default = 1];
- optional uint32 MaxQuotaSize = 4 [default = 5];
- optional uint32 MaxStreamingShards = 5 [default = 5];
- // Timeouts used to interrupt inactive streams.
- optional uint64 InactiveClientTimeout = 6 [default = 60000000];
- optional uint64 InactiveServerTimeout = 7 [default = 60000000];
- }
-
+package NKikimrStream;
+option java_package = "ru.yandex.kikimr.proto";
+
+message TStreamingConfig {
+ message TOutputStreamConfig {
+ optional uint64 MessageSizeLimit = 1 [default = 20971520];
+ optional uint64 MessageBufferSize = 2 [default = 536870912];
+ // Quota size is counted in response messages, not in bytes.
+ optional uint32 MinQuotaSize = 3 [default = 1];
+ optional uint32 MaxQuotaSize = 4 [default = 5];
+ optional uint32 MaxStreamingShards = 5 [default = 5];
+ // Timeouts used to interrupt inactive streams.
+ optional uint64 InactiveClientTimeout = 6 [default = 60000000];
+ optional uint64 InactiveServerTimeout = 7 [default = 60000000];
+ }
+
optional bool EnableInputStreams = 1 [default = true];
- optional bool EnableOutputStreams = 2 [default = true];
- optional TOutputStreamConfig OutputStreamConfig = 3;
-}
+ optional bool EnableOutputStreams = 2 [default = true];
+ optional TOutputStreamConfig OutputStreamConfig = 3;
+}
diff --git a/ydb/core/protos/tablet.proto b/ydb/core/protos/tablet.proto
index 5a2bda8aaf0..f0bec238e78 100644
--- a/ydb/core/protos/tablet.proto
+++ b/ydb/core/protos/tablet.proto
@@ -34,8 +34,8 @@ message TTabletTypes {
PersQueueReadBalancer = 24;
BlockStoreVolume = 25;
BlockStorePartition = 26;
- TenantSlotBroker = 27;
- Console = 28;
+ TenantSlotBroker = 27;
+ Console = 28;
Kesus = 29;
BlockStorePartition2 = 30;
BlockStoreDiskRegistry = 31;
diff --git a/ydb/core/protos/tenant_pool.proto b/ydb/core/protos/tenant_pool.proto
index a25b241ec78..b4d39fbab71 100644
--- a/ydb/core/protos/tenant_pool.proto
+++ b/ydb/core/protos/tenant_pool.proto
@@ -1,29 +1,29 @@
import "ydb/core/protos/flat_scheme_op.proto";
import "ydb/core/protos/subdomains.proto";
import "ydb/core/protos/tablet.proto";
-
-package NKikimrTenantPool;
-option java_package = "ru.yandex.kikimr.proto";
-
-message TSlotConfig {
- optional string Id = 1;
- optional string DomainName = 2;
- optional string TenantName = 3;
- optional bool IsDynamic = 4;
- optional string Type = 5;
- optional NKikimrTabletBase.TMetrics ResourceLimit = 6;
-}
-
-message TTenantPoolConfig {
- optional bool IsEnabled = 1 [default = true];
- /**
- * Dynamic slots should have unique Id, valid DomainName and type.
- * Static slots should have valid TenantName.
- */
- repeated TSlotConfig Slots = 2;
- optional string NodeType = 3;
-}
-
+
+package NKikimrTenantPool;
+option java_package = "ru.yandex.kikimr.proto";
+
+message TSlotConfig {
+ optional string Id = 1;
+ optional string DomainName = 2;
+ optional string TenantName = 3;
+ optional bool IsDynamic = 4;
+ optional string Type = 5;
+ optional NKikimrTabletBase.TMetrics ResourceLimit = 6;
+}
+
+message TTenantPoolConfig {
+ optional bool IsEnabled = 1 [default = true];
+ /**
+ * Dynamic slots should have unique Id, valid DomainName and type.
+ * Static slots should have valid TenantName.
+ */
+ repeated TSlotConfig Slots = 2;
+ optional string NodeType = 3;
+}
+
enum EState {
STATE_UNKNOWN = 0;
TENANT_ASSIGNED = 1;
@@ -31,51 +31,51 @@ enum EState {
TENANT_UNKNOWN = 3;
}
-message TSlotStatus {
- optional string Id = 1;
- optional string Type = 2;
- optional string AssignedTenant = 3;
- optional NKikimrTabletBase.TMetrics ResourceLimit = 4;
- optional string Label = 5;
+message TSlotStatus {
+ optional string Id = 1;
+ optional string Type = 2;
+ optional string AssignedTenant = 3;
+ optional NKikimrTabletBase.TMetrics ResourceLimit = 4;
+ optional string Label = 5;
repeated NKikimrSchemeOp.TUserAttribute TenantAttributes = 6;
optional EState State = 7;
optional NKikimrSubDomains.TDomainKey DomainKey = 8;
-}
-
-message TGetStatus {
+}
+
+message TGetStatus {
optional bool ListStaticSlots = 1;
-}
-
-message TTenantPoolStatus {
- repeated TSlotStatus Slots = 1;
- optional string NodeType = 2;
-}
-
-message TConfigureSlot {
- optional string SlotId = 1;
- optional string AssignedTenant = 2;
- optional string Label = 3;
-}
-
-enum EStatus {
- UNKNOWN = 0;
- SUCCESS = 1;
- UNKNOWN_SLOT = 2;
- UNKNOWN_TENANT = 3;
- NOT_OWNER = 4;
- ERROR = 5;
-}
-
-message TConfigureSlotResult {
- optional EStatus Status = 1;
- optional string Error = 2;
- optional TSlotStatus SlotStatus = 3;
-}
-
-message TTakeOwnership {
+}
+
+message TTenantPoolStatus {
+ repeated TSlotStatus Slots = 1;
+ optional string NodeType = 2;
+}
+
+message TConfigureSlot {
+ optional string SlotId = 1;
+ optional string AssignedTenant = 2;
+ optional string Label = 3;
+}
+
+enum EStatus {
+ UNKNOWN = 0;
+ SUCCESS = 1;
+ UNKNOWN_SLOT = 2;
+ UNKNOWN_TENANT = 3;
+ NOT_OWNER = 4;
+ ERROR = 5;
+}
+
+message TConfigureSlotResult {
+ optional EStatus Status = 1;
+ optional string Error = 2;
+ optional TSlotStatus SlotStatus = 3;
+}
+
+message TTakeOwnership {
optional uint64 Generation = 1;
optional uint64 SeqNo = 2;
-}
-
-message TLostOwnership {
-}
+}
+
+message TLostOwnership {
+}
diff --git a/ydb/core/protos/tenant_slot_broker.proto b/ydb/core/protos/tenant_slot_broker.proto
index d5063f3d309..bccc7f7dc7b 100644
--- a/ydb/core/protos/tenant_slot_broker.proto
+++ b/ydb/core/protos/tenant_slot_broker.proto
@@ -1,85 +1,85 @@
import "library/cpp/actors/protos/actors.proto";
-
-package NKikimrTenantSlotBroker;
-option java_package = "ru.yandex.kikimr.proto";
-
-message TConfig {
+
+package NKikimrTenantSlotBroker;
+option java_package = "ru.yandex.kikimr.proto";
+
+message TConfig {
optional uint64 PendingSlotTimeout = 1 [default = 15000000]; // 15 seconds by default
-}
-
-message TSlotAllocation {
- // Empty string means any node type.
- optional string Type = 1;
- // If data center is 0 then any data center may be used.
+}
+
+message TSlotAllocation {
+ // Empty string means any node type.
+ optional string Type = 1;
+ // If data center is 0 then any data center may be used.
optional uint64 DataCenterNum = 2;
optional string DataCenter = 7;
- optional uint64 Count = 3;
- // This flag defines behaviour in case there are no free slots
- // available in required data center. Forced location means slot
- // should never be allocated in another data center. If flag
- // is false then slot might be allocated in another data center
- // (but should go back to preferred data center once opportunity
- // appears). Flag is ignored if data center is 0.
- optional bool ForceLocation = 4 [default = true];
- // In case data center is not forced you can define collocation
- // group. All slots with the same non-zero collocation group will
- // be allocated an a single data center.
- optional uint32 CollocationGroup = 5;
- // This flag defines what to do if there are not enough free
- // slots in any data center to place collocation group. If
- // this flag is true then only single data center will be used
- // with some slots missing. If this flag is false then multiple
- // data centers will be used.
- optional bool ForceCollocation = 6;
-}
-
-message TGetTenantState {
- optional string TenantName = 1;
-}
-
-message TTenantState {
- optional string TenantName = 1;
- repeated TSlotAllocation RequiredSlots = 2;
- repeated TSlotAllocation PendingSlots = 3;
- repeated TSlotAllocation MissingSlots = 4;
- repeated TSlotAllocation MisplacedSlots = 5;
- repeated TSlotAllocation SplitSlots = 6;
- repeated TSlotAllocation PinnedSlots = 7;
+ optional uint64 Count = 3;
+ // This flag defines behaviour in case there are no free slots
+ // available in required data center. Forced location means slot
+ // should never be allocated in another data center. If flag
+ // is false then slot might be allocated in another data center
+ // (but should go back to preferred data center once opportunity
+ // appears). Flag is ignored if data center is 0.
+ optional bool ForceLocation = 4 [default = true];
+ // In case data center is not forced you can define collocation
+ // group. All slots with the same non-zero collocation group will
+ // be allocated an a single data center.
+ optional uint32 CollocationGroup = 5;
+ // This flag defines what to do if there are not enough free
+ // slots in any data center to place collocation group. If
+ // this flag is true then only single data center will be used
+ // with some slots missing. If this flag is false then multiple
+ // data centers will be used.
+ optional bool ForceCollocation = 6;
+}
+
+message TGetTenantState {
+ optional string TenantName = 1;
+}
+
+message TTenantState {
+ optional string TenantName = 1;
+ repeated TSlotAllocation RequiredSlots = 2;
+ repeated TSlotAllocation PendingSlots = 3;
+ repeated TSlotAllocation MissingSlots = 4;
+ repeated TSlotAllocation MisplacedSlots = 5;
+ repeated TSlotAllocation SplitSlots = 6;
+ repeated TSlotAllocation PinnedSlots = 7;
repeated TSlotId AssignedSlots = 8;
-}
-
-message TAlterTenant {
- optional string TenantName = 1;
- repeated TSlotAllocation RequiredSlots = 2;
-}
-
-message TRegisterPool {
+}
+
+message TAlterTenant {
+ optional string TenantName = 1;
+ repeated TSlotAllocation RequiredSlots = 2;
+}
+
+message TRegisterPool {
optional NActorsProto.TActorId ClientId = 1;
optional uint64 SeqNo = 2;
-}
-
-message TListTenants {
-}
-
-message TTenantsList {
- repeated TTenantState Tenants = 1;
-}
-
-message TGetSlotStats {
-}
-
-message TSlotCounters {
- optional string DataCenter = 1;
- optional string Type = 2;
- optional uint64 Connected = 3;
- optional uint64 Free = 4;
-}
-
-message TSlotStats {
- repeated TSlotCounters SlotCounters = 1;
-}
-
-message TSlotId {
- optional uint32 NodeId = 1;
- optional string SlotId = 2;
-}
+}
+
+message TListTenants {
+}
+
+message TTenantsList {
+ repeated TTenantState Tenants = 1;
+}
+
+message TGetSlotStats {
+}
+
+message TSlotCounters {
+ optional string DataCenter = 1;
+ optional string Type = 2;
+ optional uint64 Connected = 3;
+ optional uint64 Free = 4;
+}
+
+message TSlotStats {
+ repeated TSlotCounters SlotCounters = 1;
+}
+
+message TSlotId {
+ optional uint32 NodeId = 1;
+ optional string SlotId = 2;
+}
diff --git a/ydb/core/protos/tx.proto b/ydb/core/protos/tx.proto
index 5018fbf4b9e..1f18e7eca6e 100644
--- a/ydb/core/protos/tx.proto
+++ b/ydb/core/protos/tx.proto
@@ -230,54 +230,54 @@ message TEvReadSetAck {
optional uint32 Flags = 6;
optional uint64 Seqno = 7; // Should be equal to TEvReadSet.Seqno which we are ACKing
}
-
-message TKeyRange {
- optional bytes From = 1;
- optional bytes To = 2;
- optional bool FromInclusive = 3;
- optional bool ToInclusive = 4;
-};
-
-message TEvStreamClearanceRequest {
- optional uint64 TxId = 1;
- optional uint64 ShardId = 2;
- optional TKeyRange KeyRange = 3;
-}
-
-message TEvStreamClearanceResponse {
- optional uint64 TxId = 1;
- optional bool Cleared = 2;
-}
-
-message TEvStreamClearancePending {
- optional uint64 TxId = 1;
-}
-
-message TEvStreamQuotaRequest {
- optional uint64 TxId = 1;
- optional uint64 ShardId = 2;
-}
-
-message TEvStreamQuotaResponse {
- optional uint64 TxId = 1;
- optional uint64 MessageSizeLimit = 2;
- optional uint32 ReservedMessages = 3;
- optional uint64 RowLimit = 4;
-}
-
-message TEvStreamQuotaRelease {
- optional uint64 TxId = 1;
- optional uint64 ShardId = 2;
-}
-
-message TEvStreamIsDead {
- optional uint64 TxId = 1;
-}
-
-message TEvInterruptTransaction {
- optional uint64 TxId = 1;
-}
-
-message TEvStreamDataAck {
+
+message TKeyRange {
+ optional bytes From = 1;
+ optional bytes To = 2;
+ optional bool FromInclusive = 3;
+ optional bool ToInclusive = 4;
+};
+
+message TEvStreamClearanceRequest {
+ optional uint64 TxId = 1;
+ optional uint64 ShardId = 2;
+ optional TKeyRange KeyRange = 3;
+}
+
+message TEvStreamClearanceResponse {
+ optional uint64 TxId = 1;
+ optional bool Cleared = 2;
+}
+
+message TEvStreamClearancePending {
+ optional uint64 TxId = 1;
+}
+
+message TEvStreamQuotaRequest {
+ optional uint64 TxId = 1;
+ optional uint64 ShardId = 2;
+}
+
+message TEvStreamQuotaResponse {
+ optional uint64 TxId = 1;
+ optional uint64 MessageSizeLimit = 2;
+ optional uint32 ReservedMessages = 3;
+ optional uint64 RowLimit = 4;
+}
+
+message TEvStreamQuotaRelease {
+ optional uint64 TxId = 1;
+ optional uint64 ShardId = 2;
+}
+
+message TEvStreamIsDead {
+ optional uint64 TxId = 1;
+}
+
+message TEvInterruptTransaction {
+ optional uint64 TxId = 1;
+}
+
+message TEvStreamDataAck {
}
diff --git a/ydb/core/protos/tx_datashard.proto b/ydb/core/protos/tx_datashard.proto
index a04a20349f6..89863b25400 100644
--- a/ydb/core/protos/tx_datashard.proto
+++ b/ydb/core/protos/tx_datashard.proto
@@ -97,21 +97,21 @@ message TTableId {
optional uint64 SchemaVersion = 3;
}
-message TReadTableTransaction {
- message TColumn {
- optional uint32 Id = 1;
- optional string Name = 2;
- optional uint32 TypeId = 3;
- }
-
- optional TTableId TableId = 1;
- repeated TColumn Columns = 2;
- optional NKikimrTx.TKeyRange Range = 3;
+message TReadTableTransaction {
+ message TColumn {
+ optional uint32 Id = 1;
+ optional string Name = 2;
+ optional uint32 TypeId = 3;
+ }
+
+ optional TTableId TableId = 1;
+ repeated TColumn Columns = 2;
+ optional NKikimrTx.TKeyRange Range = 3;
optional uint32 ApiVersion = 4;
optional uint64 SnapshotStep = 5;
optional uint64 SnapshotTxId = 6;
-}
-
+}
+
message TKqpLocks {
repeated TLock Locks = 1;
repeated uint64 SendingShards = 2; // empty at Erase
@@ -248,8 +248,8 @@ message TDataTransaction {
optional fixed64 LockTxId = 5;
optional bool NeedDiagnostics = 6;
optional bool ReadOnly = 7;
- optional TReadTableTransaction ReadTableTransaction = 8;
- optional bool StreamResponse = 9;
+ optional TReadTableTransaction ReadTableTransaction = 8;
+ optional bool StreamResponse = 9;
optional NActorsProto.TActorId Sink = 10;
optional bool LlvmRuntime = 11;
optional uint64 PerShardKeysSizeLimitBytes = 12;
@@ -397,7 +397,7 @@ message TFlatSchemeTransaction {
optional NKikimrSchemeOp.TBackupTask Backup = 6;
optional TSchemeOpSeqNo SeqNo = 7;
- optional bool ReadOnly = 8;
+ optional bool ReadOnly = 8;
reserved 9;
optional TCreatePersistentSnapshot CreatePersistentSnapshot = 10;
@@ -453,14 +453,14 @@ enum ETransactionKind {
TX_KIND_NONE = 0;
TX_KIND_DATA = 1;
TX_KIND_SCHEME = 2;
- DEPRECATED_3 = 3; //TX_KIND_BALANCE
- DEPRECATED_4 = 4; //TX_KIND_SNAPSHOT_POLICY
- TX_KIND_SCAN = 5;
+ DEPRECATED_3 = 3; //TX_KIND_BALANCE
+ DEPRECATED_4 = 4; //TX_KIND_SNAPSHOT_POLICY
+ TX_KIND_SCAN = 5;
TX_KIND_SNAPSHOT = 6;
TX_KIND_DISTRIBUTED_ERASE = 7;
TX_KIND_COMMIT_WRITES = 8;
-
- // Values [100, inf) are used for internal datashard operation
+
+ // Values [100, inf) are used for internal datashard operation
// kinds. See NKikimr::NDataShard::EOperationKind.
}
@@ -540,12 +540,12 @@ message TEvProposeTransactionResult {
ERROR = 4;
TRY_LATER = 5;
OVERLOADED = 6;
- RESPONSE_DATA = 7;
+ RESPONSE_DATA = 7;
EXEC_ERROR = 8;
RESULT_UNAVAILABLE = 9;
LOCKS_BROKEN = 10;
CANCELLED = 11;
- BAD_REQUEST = 12;
+ BAD_REQUEST = 12;
};
message TReadSetInfo {
@@ -572,8 +572,8 @@ message TEvProposeTransactionResult {
optional uint64 ReplySize = 17;
repeated TReadSetInfo OutgoingReadSetInfo = 18;
optional TTabletInfo TabletInfo = 19;
- // For read table tx result holds offsets in TxResult to cut response
- repeated uint32 RowOffsets = 20;
+ // For read table tx result holds offsets in TxResult to cut response
+ repeated uint32 RowOffsets = 20;
repeated fixed64 DomainCoordinators = 21;
optional uint32 ApiVersion = 22; // Version of TxResult response data
optional NKikimrQueryStats.TTxStats TxStats = 23;
@@ -831,324 +831,324 @@ message TEvReadColumnsResponse {
optional bool LastKeyInclusive = 6;
optional bool EndOfShard = 7;
}
-
-message TStatus {
- optional Ydb.StatusIds.StatusCode Code = 1;
- repeated Ydb.Issue.IssueMessage Issues = 2;
-}
-
-message TEvGetInfoRequest {
-}
-
-message TEvGetInfoResponse {
- message TStats {
- optional uint64 RowCount = 1;
- optional uint64 DataSize = 2;
- optional string LastAccessTime = 3;
- optional string LastUpdateTime = 4;
- optional string LastStatsUpdateTime = 5;
- optional string LastStatsReportTime = 6;
- }
-
- message TUserTable {
- optional string Name = 1;
- optional string Path = 2;
- optional uint32 LocalId = 3;
- optional uint64 PathId = 4;
+
+message TStatus {
+ optional Ydb.StatusIds.StatusCode Code = 1;
+ repeated Ydb.Issue.IssueMessage Issues = 2;
+}
+
+message TEvGetInfoRequest {
+}
+
+message TEvGetInfoResponse {
+ message TStats {
+ optional uint64 RowCount = 1;
+ optional uint64 DataSize = 2;
+ optional string LastAccessTime = 3;
+ optional string LastUpdateTime = 4;
+ optional string LastStatsUpdateTime = 5;
+ optional string LastStatsReportTime = 6;
+ }
+
+ message TUserTable {
+ optional string Name = 1;
+ optional string Path = 2;
+ optional uint32 LocalId = 3;
+ optional uint64 PathId = 4;
optional NKikimrSchemeOp.TTableDescription Description = 5;
- optional TStats Stats = 6;
+ optional TStats Stats = 6;
optional NKikimrTabletBase.TMetrics Metrics = 7;
optional uint64 SchemaVersion = 8;
- }
-
- message TTabletInfo {
- optional uint64 SchemeShard = 1;
- optional uint64 Mediator = 2;
- optional uint32 Generation = 3;
+ }
+
+ message TTabletInfo {
+ optional uint64 SchemeShard = 1;
+ optional uint64 Mediator = 2;
+ optional uint32 Generation = 3;
optional bool IsFollower = 4;
- optional string State = 5;
- optional bool IsActive = 6;
- optional bool HasSharedBlobs = 7;
- }
-
- message TNamedValue {
- optional string Name = 1;
- optional string Value = 2;
- }
-
- message TActivities {
- optional uint64 InFlyPlanned = 1;
- optional uint64 InFlyImmediate = 2;
- optional uint64 ExecutingOps = 3;
- optional uint64 WaitingOps = 4;
- optional uint64 ExecuteBlockers = 5;
- optional uint64 DataTxCached = 6;
- optional uint64 OutReadSets = 7;
- optional uint64 OutReadSetsAcks = 8;
- optional uint64 DelayedAcks = 9;
- optional uint64 Locks = 10;
- optional uint64 BrokenLocks = 11;
- optional uint64 LastPlannedTx = 12;
- optional uint64 LastPlannedStep = 13;
- optional uint64 LastCompletedTx = 14;
- optional uint64 LastCompletedStep = 15;
- optional uint64 UtmostCompletedTx = 16;
- optional uint64 UtmostCompletedStep = 17;
- optional uint64 DataTxCompleteLag = 18;
- optional uint64 ScanTxCompleteLag = 19;
- }
-
- message TPipelineConfig {
- optional bool OutOfOrderEnabled = 1;
- optional uint32 ActiveTxsLimit = 2;
- optional bool AllowImmediate = 3;
- optional bool ForceOnlineRW = 4;
- optional bool DirtyOnline = 5;
- optional bool DirtyImmediate = 6;
- optional uint32 DataTxCacheSize = 7;
- }
-
- optional TStatus Status = 1;
- repeated TUserTable UserTables = 2;
- optional TTabletInfo TabletInfo = 3;
- repeated TNamedValue Controls = 4;
- optional TActivities Activities = 5;
- repeated TNamedValue SysTable = 6;
- optional TPipelineConfig PipelineConfig = 7;
-}
-
-message TEvListOperationsRequest {
-}
-
-message TEvListOperationsResponse {
- message TOperationInfo {
- optional uint64 TxId = 1;
- optional uint64 Step = 2;
- optional string Kind = 3;
- optional bool IsImmediate = 4;
- optional bool IsReadOnly = 5;
- optional bool IsWaiting = 6;
- optional bool IsExecuting = 7;
- optional bool IsCompleted = 8;
- optional string ExecutionUnit = 9;
- optional uint64 ReceivedAt = 10;
- }
-
- optional TStatus Status = 1;
- repeated TOperationInfo Operations = 2;
-}
-
-message TEvGetOperationRequest {
- optional uint64 TxId = 1;
-}
-
-message TBasicOpInfo {
- optional uint64 TxId = 1;
- optional uint64 Step = 2;
- optional string Kind = 3;
- optional uint64 ReceivedAt = 4;
- optional uint64 MinStep = 5;
- optional uint64 MaxStep = 6;
- repeated string Flags = 7;
-}
-
-message TExecutionProfile {
- message TUnitProfile {
- optional string UnitKind = 1;
- optional uint64 WaitTime = 2;
- optional uint64 ExecuteTime = 3;
- optional uint64 CommitTime = 4;
- optional uint64 CompleteTime = 5;
- optional uint32 ExecuteCount = 6;
- }
-
- repeated TUnitProfile UnitProfiles = 1;
-}
-
-message TEvGetOperationResponse {
- message TExecutionPlan {
- repeated string Units = 1;
- optional bool IsFinished = 2;
- optional uint32 CurrentUnit = 3;
- }
-
- message TDependency {
- optional uint64 Target = 1;
- repeated string Types = 2;
- }
-
- message TDependencies {
- repeated TDependency Dependencies = 1;
- repeated TDependency Dependents = 2;
- }
-
- message TInputRS {
- optional uint64 From = 1;
- optional uint32 Received = 2;
- }
-
- message TInputData {
- repeated TInputRS InputRS = 1;
- optional uint32 RemainedInputRS = 2;
- }
-
- message TReadTableState {
- optional string State = 1;
- optional uint32 TableId = 2;
- optional uint64 SnapshotId = 3;
- optional uint64 ScanTaskId = 4;
- optional string SinkActor = 5;
- optional string ScanActor = 6;
- }
-
- optional TStatus Status = 1;
- optional TBasicOpInfo BasicInfo = 2;
- optional TExecutionPlan ExecutionPlan = 3;
- optional TDependencies Dependencies = 4;
- optional TInputData InputData = 5;
- optional TExecutionProfile ExecutionProfile = 6;
-
- optional TReadTableState ReadTableState = 10;
-}
-
-message TEvGetReadTableSinkStateRequest {
- optional uint64 TxId = 1;
-}
-
-message TShard {
- optional uint64 Id = 1;
-}
-
-message TEvGetReadTableSinkStateResponse {
- optional TStatus Status = 1;
- optional uint64 TxId = 2;
- optional uint64 WallClockAccepted = 3;
- optional uint64 WallClockResolveStarted = 4;
- optional uint64 WallClockResolved = 5;
- optional uint64 WallClockPrepared = 6;
- optional uint64 WallClockPlanned = 7;
- optional uint64 ExecTimeoutPeriod = 8;
- optional uint64 SelectedCoordinator = 9;
- optional string RequestSource = 10;
- optional uint32 RequestVersion = 11;
- optional uint32 ResponseVersion = 12;
- repeated TShard ClearanceRequests = 13;
- repeated TShard QuotaRequests = 14;
- repeated TShard StreamingShards = 15;
- repeated TShard ShardsQueue = 16;
- optional bool Ordered = 17;
- optional bool RowsLimited = 18;
- optional uint64 RowsRemain = 19;
-}
-
-message TEvGetReadTableScanStateRequest {
- optional uint64 TxId = 1;
-}
-
-message TEvGetReadTableScanStateResponse {
- optional TStatus Status = 1;
- optional uint64 TxId = 2;
- optional uint64 MessageQuota = 3;
- optional uint64 MessageSizeLimit = 4;
- optional uint64 RowsLimit = 5;
- optional uint64 PendingAcks = 6;
- optional uint64 ResultSize = 7;
- optional uint64 ResultRows = 8;
- optional bool HasUpperBorder = 9;
- optional bool Finished = 10;
- optional string Error = 11;
-}
-
-message TEvGetReadTableStreamStateRequest {
- optional uint64 TxId = 1;
-}
-
-message TEvGetReadTableStreamStateResponse {
- message TShardQuota {
- optional uint64 ShardId = 1;
- optional uint64 Quota = 2;
- }
-
- optional TStatus Status = 1;
- optional bool Ready = 2;
- optional bool Finished = 3;
- optional uint64 ResponseQueueSize = 4;
- repeated TShard QuotaRequests = 5;
- repeated TShardQuota ShardQuotas = 6;
- optional uint64 QuotaLimit = 7;
- optional uint64 QuotaReserved = 8;
- repeated TShard ReleasedShards = 9;
- optional uint64 InactiveClientTimeout = 10;
- optional uint64 InactiveServerTimeout = 11;
- optional uint64 LastDataStreamTimestamp = 12;
- optional uint64 LastStatusTimestamp = 13;
-}
-
-message TEvGetSlowOpProfilesRequest {
-}
-
-message TEvGetSlowOpProfilesResponse {
- message TOpProfile {
- optional TBasicOpInfo BasicInfo = 1;
- optional TExecutionProfile ExecutionProfile = 2;
- }
-
- optional TStatus Status = 1;
- repeated TOpProfile Profiles = 2;
-}
-
-message TEvGetRSInfoRequest {
-}
-
-message TEvGetRSInfoResponse {
- message TOutRSInfo {
- optional uint64 TxId = 1;
- optional uint64 Origin = 2;
- optional uint64 Source = 3;
- optional uint64 Destination = 4;
- optional uint64 SeqNo = 5;
- }
-
- message TRSAckInfo {
- optional uint64 TxId = 1;
- optional uint64 Step = 2;
- optional uint64 Origin = 3;
- optional uint64 Source = 4;
- optional uint64 Destination = 5;
- optional uint64 SeqNo = 6;
- }
-
- optional TStatus Status = 1;
- repeated TOutRSInfo OutReadSets = 2;
- repeated TRSAckInfo OutRSAcks = 3;
- repeated TRSAckInfo DelayedRSAcks = 4;
-}
-
-message TEvGetDataHistogramRequest {
+ optional string State = 5;
+ optional bool IsActive = 6;
+ optional bool HasSharedBlobs = 7;
+ }
+
+ message TNamedValue {
+ optional string Name = 1;
+ optional string Value = 2;
+ }
+
+ message TActivities {
+ optional uint64 InFlyPlanned = 1;
+ optional uint64 InFlyImmediate = 2;
+ optional uint64 ExecutingOps = 3;
+ optional uint64 WaitingOps = 4;
+ optional uint64 ExecuteBlockers = 5;
+ optional uint64 DataTxCached = 6;
+ optional uint64 OutReadSets = 7;
+ optional uint64 OutReadSetsAcks = 8;
+ optional uint64 DelayedAcks = 9;
+ optional uint64 Locks = 10;
+ optional uint64 BrokenLocks = 11;
+ optional uint64 LastPlannedTx = 12;
+ optional uint64 LastPlannedStep = 13;
+ optional uint64 LastCompletedTx = 14;
+ optional uint64 LastCompletedStep = 15;
+ optional uint64 UtmostCompletedTx = 16;
+ optional uint64 UtmostCompletedStep = 17;
+ optional uint64 DataTxCompleteLag = 18;
+ optional uint64 ScanTxCompleteLag = 19;
+ }
+
+ message TPipelineConfig {
+ optional bool OutOfOrderEnabled = 1;
+ optional uint32 ActiveTxsLimit = 2;
+ optional bool AllowImmediate = 3;
+ optional bool ForceOnlineRW = 4;
+ optional bool DirtyOnline = 5;
+ optional bool DirtyImmediate = 6;
+ optional uint32 DataTxCacheSize = 7;
+ }
+
+ optional TStatus Status = 1;
+ repeated TUserTable UserTables = 2;
+ optional TTabletInfo TabletInfo = 3;
+ repeated TNamedValue Controls = 4;
+ optional TActivities Activities = 5;
+ repeated TNamedValue SysTable = 6;
+ optional TPipelineConfig PipelineConfig = 7;
+}
+
+message TEvListOperationsRequest {
+}
+
+message TEvListOperationsResponse {
+ message TOperationInfo {
+ optional uint64 TxId = 1;
+ optional uint64 Step = 2;
+ optional string Kind = 3;
+ optional bool IsImmediate = 4;
+ optional bool IsReadOnly = 5;
+ optional bool IsWaiting = 6;
+ optional bool IsExecuting = 7;
+ optional bool IsCompleted = 8;
+ optional string ExecutionUnit = 9;
+ optional uint64 ReceivedAt = 10;
+ }
+
+ optional TStatus Status = 1;
+ repeated TOperationInfo Operations = 2;
+}
+
+message TEvGetOperationRequest {
+ optional uint64 TxId = 1;
+}
+
+message TBasicOpInfo {
+ optional uint64 TxId = 1;
+ optional uint64 Step = 2;
+ optional string Kind = 3;
+ optional uint64 ReceivedAt = 4;
+ optional uint64 MinStep = 5;
+ optional uint64 MaxStep = 6;
+ repeated string Flags = 7;
+}
+
+message TExecutionProfile {
+ message TUnitProfile {
+ optional string UnitKind = 1;
+ optional uint64 WaitTime = 2;
+ optional uint64 ExecuteTime = 3;
+ optional uint64 CommitTime = 4;
+ optional uint64 CompleteTime = 5;
+ optional uint32 ExecuteCount = 6;
+ }
+
+ repeated TUnitProfile UnitProfiles = 1;
+}
+
+message TEvGetOperationResponse {
+ message TExecutionPlan {
+ repeated string Units = 1;
+ optional bool IsFinished = 2;
+ optional uint32 CurrentUnit = 3;
+ }
+
+ message TDependency {
+ optional uint64 Target = 1;
+ repeated string Types = 2;
+ }
+
+ message TDependencies {
+ repeated TDependency Dependencies = 1;
+ repeated TDependency Dependents = 2;
+ }
+
+ message TInputRS {
+ optional uint64 From = 1;
+ optional uint32 Received = 2;
+ }
+
+ message TInputData {
+ repeated TInputRS InputRS = 1;
+ optional uint32 RemainedInputRS = 2;
+ }
+
+ message TReadTableState {
+ optional string State = 1;
+ optional uint32 TableId = 2;
+ optional uint64 SnapshotId = 3;
+ optional uint64 ScanTaskId = 4;
+ optional string SinkActor = 5;
+ optional string ScanActor = 6;
+ }
+
+ optional TStatus Status = 1;
+ optional TBasicOpInfo BasicInfo = 2;
+ optional TExecutionPlan ExecutionPlan = 3;
+ optional TDependencies Dependencies = 4;
+ optional TInputData InputData = 5;
+ optional TExecutionProfile ExecutionProfile = 6;
+
+ optional TReadTableState ReadTableState = 10;
+}
+
+message TEvGetReadTableSinkStateRequest {
+ optional uint64 TxId = 1;
+}
+
+message TShard {
+ optional uint64 Id = 1;
+}
+
+message TEvGetReadTableSinkStateResponse {
+ optional TStatus Status = 1;
+ optional uint64 TxId = 2;
+ optional uint64 WallClockAccepted = 3;
+ optional uint64 WallClockResolveStarted = 4;
+ optional uint64 WallClockResolved = 5;
+ optional uint64 WallClockPrepared = 6;
+ optional uint64 WallClockPlanned = 7;
+ optional uint64 ExecTimeoutPeriod = 8;
+ optional uint64 SelectedCoordinator = 9;
+ optional string RequestSource = 10;
+ optional uint32 RequestVersion = 11;
+ optional uint32 ResponseVersion = 12;
+ repeated TShard ClearanceRequests = 13;
+ repeated TShard QuotaRequests = 14;
+ repeated TShard StreamingShards = 15;
+ repeated TShard ShardsQueue = 16;
+ optional bool Ordered = 17;
+ optional bool RowsLimited = 18;
+ optional uint64 RowsRemain = 19;
+}
+
+message TEvGetReadTableScanStateRequest {
+ optional uint64 TxId = 1;
+}
+
+message TEvGetReadTableScanStateResponse {
+ optional TStatus Status = 1;
+ optional uint64 TxId = 2;
+ optional uint64 MessageQuota = 3;
+ optional uint64 MessageSizeLimit = 4;
+ optional uint64 RowsLimit = 5;
+ optional uint64 PendingAcks = 6;
+ optional uint64 ResultSize = 7;
+ optional uint64 ResultRows = 8;
+ optional bool HasUpperBorder = 9;
+ optional bool Finished = 10;
+ optional string Error = 11;
+}
+
+message TEvGetReadTableStreamStateRequest {
+ optional uint64 TxId = 1;
+}
+
+message TEvGetReadTableStreamStateResponse {
+ message TShardQuota {
+ optional uint64 ShardId = 1;
+ optional uint64 Quota = 2;
+ }
+
+ optional TStatus Status = 1;
+ optional bool Ready = 2;
+ optional bool Finished = 3;
+ optional uint64 ResponseQueueSize = 4;
+ repeated TShard QuotaRequests = 5;
+ repeated TShardQuota ShardQuotas = 6;
+ optional uint64 QuotaLimit = 7;
+ optional uint64 QuotaReserved = 8;
+ repeated TShard ReleasedShards = 9;
+ optional uint64 InactiveClientTimeout = 10;
+ optional uint64 InactiveServerTimeout = 11;
+ optional uint64 LastDataStreamTimestamp = 12;
+ optional uint64 LastStatusTimestamp = 13;
+}
+
+message TEvGetSlowOpProfilesRequest {
+}
+
+message TEvGetSlowOpProfilesResponse {
+ message TOpProfile {
+ optional TBasicOpInfo BasicInfo = 1;
+ optional TExecutionProfile ExecutionProfile = 2;
+ }
+
+ optional TStatus Status = 1;
+ repeated TOpProfile Profiles = 2;
+}
+
+message TEvGetRSInfoRequest {
+}
+
+message TEvGetRSInfoResponse {
+ message TOutRSInfo {
+ optional uint64 TxId = 1;
+ optional uint64 Origin = 2;
+ optional uint64 Source = 3;
+ optional uint64 Destination = 4;
+ optional uint64 SeqNo = 5;
+ }
+
+ message TRSAckInfo {
+ optional uint64 TxId = 1;
+ optional uint64 Step = 2;
+ optional uint64 Origin = 3;
+ optional uint64 Source = 4;
+ optional uint64 Destination = 5;
+ optional uint64 SeqNo = 6;
+ }
+
+ optional TStatus Status = 1;
+ repeated TOutRSInfo OutReadSets = 2;
+ repeated TRSAckInfo OutRSAcks = 3;
+ repeated TRSAckInfo DelayedRSAcks = 4;
+}
+
+message TEvGetDataHistogramRequest {
optional uint32 CollectKeySampleMs = 1;
optional bool ActualData = 2;
-}
-
-message TEvGetDataHistogramResponse {
- message THistogramItem {
- optional uint64 Value = 1;
- repeated string KeyValues = 2;
- }
-
- message THistogram {
- repeated THistogramItem Items = 1;
- }
-
- message TTableHistograms {
- optional string TableName = 1;
- repeated string KeyNames = 2;
- optional THistogram SizeHistogram = 3;
- optional THistogram CountHistogram = 4;
+}
+
+message TEvGetDataHistogramResponse {
+ message THistogramItem {
+ optional uint64 Value = 1;
+ repeated string KeyValues = 2;
+ }
+
+ message THistogram {
+ repeated THistogramItem Items = 1;
+ }
+
+ message TTableHistograms {
+ optional string TableName = 1;
+ repeated string KeyNames = 2;
+ optional THistogram SizeHistogram = 3;
+ optional THistogram CountHistogram = 4;
optional THistogram KeyAccessSample = 5;
- }
-
- optional TStatus Status = 1;
- repeated TTableHistograms TableHistograms = 2;
+ }
+
+ optional TStatus Status = 1;
+ repeated TTableHistograms TableHistograms = 2;
}
message TEvRefreshVolatileSnapshotRequest {
diff --git a/ydb/core/protos/tx_proxy.proto b/ydb/core/protos/tx_proxy.proto
index 805e61fde8e..dedd2f9cbb5 100644
--- a/ydb/core/protos/tx_proxy.proto
+++ b/ydb/core/protos/tx_proxy.proto
@@ -47,31 +47,31 @@ message TReadTransaction {
optional fixed64 OrderId = 3;
}
-message TKeyRange {
- // Key as a tuple of values. Missing key column values are treated as NULL.
- optional NKikimrMiniKQL.TParams From = 1;
- // Missing key column values are treated as INF.
- optional NKikimrMiniKQL.TParams To = 2;
- optional bool FromInclusive = 3 [default = true];
- optional bool ToInclusive = 4 [default = false];
-};
-
-message TReadTableTransaction {
+message TKeyRange {
+ // Key as a tuple of values. Missing key column values are treated as NULL.
+ optional NKikimrMiniKQL.TParams From = 1;
+ // Missing key column values are treated as INF.
+ optional NKikimrMiniKQL.TParams To = 2;
+ optional bool FromInclusive = 3 [default = true];
+ optional bool ToInclusive = 4 [default = false];
+};
+
+message TReadTableTransaction {
enum EVersion {
UNSPECIFIED = 0;
YDB_V1 = 1;
}
- optional string Path = 1;
- optional bool Ordered = 2 [default = false];
- optional bool AllowDuplicates = 3 [default = false];
- repeated string Columns = 4; // All by default.
- optional TKeyRange KeyRange = 5;
- optional uint64 RowLimit = 6 [default = 0]; // All rows by default.
+ optional string Path = 1;
+ optional bool Ordered = 2 [default = false];
+ optional bool AllowDuplicates = 3 [default = false];
+ repeated string Columns = 4; // All by default.
+ optional TKeyRange KeyRange = 5;
+ optional uint64 RowLimit = 6 [default = 0]; // All rows by default.
optional uint32 ApiVersion = 7;
optional uint64 SnapshotStep = 8;
optional uint64 SnapshotTxId = 9;
-};
-
+};
+
message TCreateVolatileSnapshotTx {
message TTable {
optional string TablePath = 1;
@@ -175,8 +175,8 @@ message TTransaction {
optional NKikimrSchemeOp.TModifyScheme ModifyScheme = 10;
repeated NKikimrSchemeOp.TModifyScheme TransactionalModification = 11;
-
- optional TReadTableTransaction ReadTableTransaction = 20;
+
+ optional TReadTableTransaction ReadTableTransaction = 20;
optional TCreateVolatileSnapshotTx CreateVolatileSnapshot = 30;
optional TRefreshVolatileSnapshotTx RefreshVolatileSnapshot = 31;
@@ -190,7 +190,7 @@ message TEvProposeTransaction {
optional uint64 ProxyFlags = 2;
optional uint64 ExecTimeoutPeriod = 3;
optional string UserToken = 4; // already built and serialized user's token
- optional bool StreamResponse = 5;
+ optional bool StreamResponse = 5;
optional uint64 CancelAfterMs = 6;
optional string DatabaseName = 7;
optional string RequestType = 8;
@@ -238,10 +238,10 @@ message TEvProposeTransactionStatus {
optional uint64 PathId = 34;
optional uint64 PathCreateTxId = 35;
optional uint64 PathDropTxId = 36;
-
- optional fixed64 DataShardTabletId = 40;
-
- optional bytes SerializedReadTableResponse = 50;
+
+ optional fixed64 DataShardTabletId = 40;
+
+ optional bytes SerializedReadTableResponse = 50;
optional uint32 ReadTableResponseVersion = 51;
}
diff --git a/ydb/core/protos/ya.make b/ydb/core/protos/ya.make
index ecc05094a17..70bb65514cd 100644
--- a/ydb/core/protos/ya.make
+++ b/ydb/core/protos/ya.make
@@ -29,13 +29,13 @@ SRCS(
bootstrapper.proto
change_exchange.proto
channel_purpose.proto
- cms.proto
- config.proto
+ cms.proto
+ config.proto
config_units.proto
- console.proto
- console_base.proto
- console_config.proto
- console_tenant.proto
+ console.proto
+ console_base.proto
+ console_config.proto
+ console_tenant.proto
counters_tx_allocator.proto
counters_bs_controller.proto
counters_coordinator.proto
@@ -79,12 +79,12 @@ SRCS(
msgbus_kv.proto
msgbus_pq.proto
netclassifier.proto
- node_broker.proto
+ node_broker.proto
node_limits.proto
profiler.proto
query_stats.proto
replication.proto
- resource_broker.proto
+ resource_broker.proto
scheme_log.proto
scheme_type_metadata.proto
scheme_type_operation.proto
@@ -95,7 +95,7 @@ SRCS(
follower_group.proto
ssa.proto
statestorage.proto
- stream.proto
+ stream.proto
subdomains.proto
table_stats.proto
tablet.proto
@@ -104,8 +104,8 @@ SRCS(
tablet_database.proto
tablet_pipe.proto
tablet_tx.proto
- tenant_pool.proto
- tenant_slot_broker.proto
+ tenant_pool.proto
+ tenant_slot_broker.proto
test_shard.proto
tracing.proto
tablet_tracing_signals.proto
diff --git a/ydb/core/protos/ydb_result_set_old.proto b/ydb/core/protos/ydb_result_set_old.proto
index 64132f4a37a..9f7e4ebfc4b 100644
--- a/ydb/core/protos/ydb_result_set_old.proto
+++ b/ydb/core/protos/ydb_result_set_old.proto
@@ -89,7 +89,7 @@ message Value {
string text_value = 9;
google.protobuf.NullValue null_flag_value = 10; // Set if current TValue is terminal Null
Value nested_value = 11; // Represents nested TValue for Optional<Optional<T>>(Null), or Variant<T> types
- fixed64 low_128 = 15;
+ fixed64 low_128 = 15;
}
repeated Value items = 12; // Used for List, Tuple, Struct types
repeated ValuePair pairs = 13; // Used for Dict type
diff --git a/ydb/core/scheme/scheme_tablecell.h b/ydb/core/scheme/scheme_tablecell.h
index 1850b81204b..bccfdca97db 100644
--- a/ydb/core/scheme/scheme_tablecell.h
+++ b/ydb/core/scheme/scheme_tablecell.h
@@ -53,8 +53,8 @@ public:
if (CanInline(sz)) {
IsInline_ = 1;
IntVal = 0;
- if (ptr)
- memcpy(&IntVal, ptr, sz);
+ if (ptr)
+ memcpy(&IntVal, ptr, sz);
}
}
@@ -100,7 +100,7 @@ public:
#if 1
// Optimization to store small values (<= 8 bytes) inplace
static constexpr bool CanInline(ui32 sz) { return sz <= 8; }
- static constexpr size_t MaxInlineSize() { return 8; }
+ static constexpr size_t MaxInlineSize() { return 8; }
const char* InlineData() const { Y_VERIFY_DEBUG(IsInline_); return IsNull_ ? nullptr : (char*)&IntVal; }
const char* Data() const { return IsNull_ ? nullptr : (IsInline_ ? (char*)&IntVal : Ptr); }
#else
@@ -150,10 +150,10 @@ inline int CompareTypedCells(const TCell& a, const TCell& b, NScheme::TTypeIdOrd
SIMPLE_TYPE_SWITCH(Double, double);
SIMPLE_TYPE_SWITCH(Float, float);
SIMPLE_TYPE_SWITCH(PairUi64Ui64, TPair);
- SIMPLE_TYPE_SWITCH(Date, ui16);
- SIMPLE_TYPE_SWITCH(Datetime, ui32);
- SIMPLE_TYPE_SWITCH(Timestamp, ui64);
- SIMPLE_TYPE_SWITCH(Interval, i64);
+ SIMPLE_TYPE_SWITCH(Date, ui16);
+ SIMPLE_TYPE_SWITCH(Datetime, ui32);
+ SIMPLE_TYPE_SWITCH(Timestamp, ui64);
+ SIMPLE_TYPE_SWITCH(Interval, i64);
#undef SIMPLE_TYPE_SWITCH
@@ -177,17 +177,17 @@ inline int CompareTypedCells(const TCell& a, const TCell& b, NScheme::TTypeIdOrd
return sza == szb ? 0 : ((sza < szb) != type.IsDescending() ? -1 : 1);
}
- case NKikimr::NScheme::NTypeIds::Decimal:
- {
- Y_VERIFY_DEBUG(a.Size() == sizeof(std::pair<ui64, i64>));
- Y_VERIFY_DEBUG(b.Size() == sizeof(std::pair<ui64, i64>));
- std::pair<ui64, i64> va = ReadUnaligned<std::pair<ui64, i64>>((const std::pair<ui64, i64>*)a.Data());
- std::pair<ui64, i64> vb = ReadUnaligned<std::pair<ui64, i64>>((const std::pair<ui64, i64>*)b.Data());
- if (va.second == vb.second)
+ case NKikimr::NScheme::NTypeIds::Decimal:
+ {
+ Y_VERIFY_DEBUG(a.Size() == sizeof(std::pair<ui64, i64>));
+ Y_VERIFY_DEBUG(b.Size() == sizeof(std::pair<ui64, i64>));
+ std::pair<ui64, i64> va = ReadUnaligned<std::pair<ui64, i64>>((const std::pair<ui64, i64>*)a.Data());
+ std::pair<ui64, i64> vb = ReadUnaligned<std::pair<ui64, i64>>((const std::pair<ui64, i64>*)b.Data());
+ if (va.second == vb.second)
return va.first == vb.first ? 0 : ((va.first < vb.first) != type.IsDescending() ? -1 : 1);
return (va.second < vb.second) != type.IsDescending() ? -1 : 1;
- }
-
+ }
+
default:
Y_VERIFY_DEBUG(false, "Unknown type");
};
@@ -400,41 +400,41 @@ public:
}
TSerializedCellVec() {}
-
- TSerializedCellVec(const TSerializedCellVec &other)
+
+ TSerializedCellVec(const TSerializedCellVec &other)
: Buf(other.Buf)
, Cells(other.Cells)
- {
+ {
Y_VERIFY(Buf.data() == other.Buf.data(), "Buffer must be shared");
- }
-
- TSerializedCellVec(TSerializedCellVec &&other)
- {
- *this = std::move(other);
- }
-
- TSerializedCellVec &operator=(const TSerializedCellVec &other)
- {
+ }
+
+ TSerializedCellVec(TSerializedCellVec &&other)
+ {
+ *this = std::move(other);
+ }
+
+ TSerializedCellVec &operator=(const TSerializedCellVec &other)
+ {
if (this == &other)
return *this;
TSerializedCellVec tmp(other);
*this = std::move(tmp);
- return *this;
- }
-
- TSerializedCellVec &operator=(TSerializedCellVec &&other)
- {
+ return *this;
+ }
+
+ TSerializedCellVec &operator=(TSerializedCellVec &&other)
+ {
if (this == &other)
return *this;
const char* otherPtr = other.Buf.data();
- Buf = std::move(other.Buf);
+ Buf = std::move(other.Buf);
Y_VERIFY(Buf.data() == otherPtr, "Buffer address must not change");
Cells = std::move(other.Cells);
- return *this;
- }
-
+ return *this;
+ }
+
static bool TryParse(const TString& data, TSerializedCellVec& vec) {
bool ok = DoTryParse(data, vec);
if (!ok) {
@@ -475,8 +475,8 @@ public:
return res;
}
- const TString &GetBuffer() const { return Buf; }
-
+ const TString &GetBuffer() const { return Buf; }
+
TString ReleaseBuffer() {
Cells.clear();
return std::move(Buf);
diff --git a/ydb/core/scheme/scheme_tabledefs.cpp b/ydb/core/scheme/scheme_tabledefs.cpp
index 9721fcc2741..8c91e03d0e4 100644
--- a/ydb/core/scheme/scheme_tabledefs.cpp
+++ b/ydb/core/scheme/scheme_tabledefs.cpp
@@ -10,12 +10,12 @@ bool TTableRange::IsEmptyRange(TConstArrayRef<const NScheme::TTypeId> cellTypeId
return (compares < 0);
}
-bool TSerializedTableRange::IsEmpty(TConstArrayRef<NScheme::TTypeId> type) const
-{
- auto cmp = CompareBorders<true, false>(To.GetCells(), From.GetCells(), ToInclusive, FromInclusive, type);
- return (cmp < 0);
-}
-
+bool TSerializedTableRange::IsEmpty(TConstArrayRef<NScheme::TTypeId> type) const
+{
+ auto cmp = CompareBorders<true, false>(To.GetCells(), From.GetCells(), ToInclusive, FromInclusive, type);
+ return (cmp < 0);
+}
+
void TKeyDesc::Out(IOutputStream& o, TKeyDesc::EStatus x) {
#define KEYDESCRIPTION_STATUS_TO_STRING_IMPL(name, ...) \
case EStatus::name: \
diff --git a/ydb/core/scheme/scheme_tabledefs.h b/ydb/core/scheme/scheme_tabledefs.h
index 438250969a9..190233fdeee 100644
--- a/ydb/core/scheme/scheme_tabledefs.h
+++ b/ydb/core/scheme/scheme_tabledefs.h
@@ -177,22 +177,22 @@ public:
bool IsEmptyRange(TConstArrayRef<const NScheme::TTypeId> cellTypeIds) const;
};
-class TSerializedTableRange {
-public:
- TSerializedCellVec From;
- TSerializedCellVec To;
+class TSerializedTableRange {
+public:
+ TSerializedCellVec From;
+ TSerializedCellVec To;
bool FromInclusive = false;
bool ToInclusive = false;
bool Point = false;
TSerializedTableRange() {}
-
+
TSerializedTableRange(const TString& from, const TString& to, bool fromInclusive, bool toInclusive)
- : From(from)
- , To(to)
- , FromInclusive(fromInclusive)
+ : From(from)
+ , To(to)
+ , FromInclusive(fromInclusive)
, ToInclusive(toInclusive) {}
-
+
TSerializedTableRange(TConstArrayRef<TCell> fromValues, bool inclusiveFrom, TConstArrayRef<TCell> toValues,
bool inclusiveTo)
: From(TSerializedCellVec::Serialize(fromValues))
@@ -208,24 +208,24 @@ public:
}
explicit TSerializedTableRange(const NKikimrTx::TKeyRange& range) {
- Load(range);
- }
-
- TSerializedTableRange(const TSerializedTableRange &other) = default;
- TSerializedTableRange(TSerializedTableRange &&other) = default;
- TSerializedTableRange &operator=(const TSerializedTableRange &other) = default;
- TSerializedTableRange &operator=(TSerializedTableRange &&other) = default;
-
+ Load(range);
+ }
+
+ TSerializedTableRange(const TSerializedTableRange &other) = default;
+ TSerializedTableRange(TSerializedTableRange &&other) = default;
+ TSerializedTableRange &operator=(const TSerializedTableRange &other) = default;
+ TSerializedTableRange &operator=(TSerializedTableRange &&other) = default;
+
void Load(const NKikimrTx::TKeyRange& range) {
- From.Parse(range.GetFrom());
- To.Parse(range.GetTo());
- FromInclusive = range.GetFromInclusive();
- ToInclusive = range.GetToInclusive();
- }
-
+ From.Parse(range.GetFrom());
+ To.Parse(range.GetTo());
+ FromInclusive = range.GetFromInclusive();
+ ToInclusive = range.GetToInclusive();
+ }
+
void Serialize(NKikimrTx::TKeyRange& range) const {
- range.SetFrom(From.GetBuffer());
- range.SetFromInclusive(FromInclusive);
+ range.SetFrom(From.GetBuffer());
+ range.SetFromInclusive(FromInclusive);
if (Point) {
Y_VERIFY_DEBUG(FromInclusive);
range.SetTo(From.GetBuffer());
@@ -234,15 +234,15 @@ public:
range.SetTo(To.GetBuffer());
range.SetToInclusive(ToInclusive);
}
- }
-
- bool IsEmpty(TConstArrayRef<NScheme::TTypeId> type) const;
+ }
+
+ bool IsEmpty(TConstArrayRef<NScheme::TTypeId> type) const;
TTableRange ToTableRange() const {
return TTableRange(From.GetCells(), FromInclusive, To.GetCells(), ToInclusive, Point);
}
-};
-
+};
+
template <typename T>
int ComparePointAndRange(const TConstArrayRef<TCell>& point, const TTableRange& range,
const T& pointTypes, const T& rangeTypes)
@@ -279,10 +279,10 @@ int ComparePointAndRange(const TConstArrayRef<TCell>& point, const TTableRange&
return 0;
}
-// Method used to compare range borders.
-// Template args determine where range lies regarding compared border.
-// E.g. CompareBorders<true, true>(...) compares borders of ranges lying on the left
-// of compared borders (or in other words upper range borders are compared).
+// Method used to compare range borders.
+// Template args determine where range lies regarding compared border.
+// E.g. CompareBorders<true, true>(...) compares borders of ranges lying on the left
+// of compared borders (or in other words upper range borders are compared).
template<bool FirstLeft, bool SecondLeft>
int CompareBorders(TConstArrayRef<TCell> first, TConstArrayRef<TCell> second, bool inclusiveFirst, bool inclusiveSecond,
TConstArrayRef<NScheme::TTypeId> cellTypes)
diff --git a/ydb/core/scheme_types/scheme_type_registry.cpp b/ydb/core/scheme_types/scheme_type_registry.cpp
index d5b8a8b9c71..d737254361e 100644
--- a/ydb/core/scheme_types/scheme_type_registry.cpp
+++ b/ydb/core/scheme_types/scheme_type_registry.cpp
@@ -30,11 +30,11 @@ TTypeRegistry::TTypeRegistry()
RegisterType<TYson>();
RegisterType<TJson>();
RegisterType<TJsonDocument>();
- RegisterType<TDecimal>();
- RegisterType<TDate>();
- RegisterType<TDatetime>();
- RegisterType<TTimestamp>();
- RegisterType<TInterval>();
+ RegisterType<TDecimal>();
+ RegisterType<TDate>();
+ RegisterType<TDatetime>();
+ RegisterType<TTimestamp>();
+ RegisterType<TInterval>();
RegisterType<TDyNumber>();
}
diff --git a/ydb/core/scheme_types/scheme_types_defs.cpp b/ydb/core/scheme_types/scheme_types_defs.cpp
index 39d2f0385c9..eeaba2e9af0 100644
--- a/ydb/core/scheme_types/scheme_types_defs.cpp
+++ b/ydb/core/scheme_types/scheme_types_defs.cpp
@@ -24,13 +24,13 @@ namespace NNames {
DECLARE_TYPED_TYPE_NAME(Yson);
DECLARE_TYPED_TYPE_NAME(Json);
DECLARE_TYPED_TYPE_NAME(JsonDocument);
-
- DECLARE_TYPED_TYPE_NAME(Decimal);
-
- DECLARE_TYPED_TYPE_NAME(Date);
- DECLARE_TYPED_TYPE_NAME(Datetime);
- DECLARE_TYPED_TYPE_NAME(Timestamp);
- DECLARE_TYPED_TYPE_NAME(Interval);
+
+ DECLARE_TYPED_TYPE_NAME(Decimal);
+
+ DECLARE_TYPED_TYPE_NAME(Date);
+ DECLARE_TYPED_TYPE_NAME(Datetime);
+ DECLARE_TYPED_TYPE_NAME(Timestamp);
+ DECLARE_TYPED_TYPE_NAME(Interval);
DECLARE_TYPED_TYPE_NAME(DyNumber);
}
diff --git a/ydb/core/scheme_types/scheme_types_defs.h b/ydb/core/scheme_types/scheme_types_defs.h
index 22941ec5e24..bb06b097023 100644
--- a/ydb/core/scheme_types/scheme_types_defs.h
+++ b/ydb/core/scheme_types/scheme_types_defs.h
@@ -210,26 +210,26 @@ namespace NNames {
using TSmallBoundedString = TBoundedString<0x1000, NTypeIds::String4k, NNames::SmallBoundedString>; // 4K
using TLargeBoundedString = TBoundedString<0x200000, NTypeIds::String2m, NNames::LargeBoundedString>; // 2Mb
-namespace NNames {
+namespace NNames {
extern const char Decimal[8];
-}
-
-class TDecimal : public IIntegerPair<ui64, i64, NTypeIds::Decimal, NNames::Decimal> {};
-
-////////////////////////////////////////////////////////
-/// Datetime types
-namespace NNames {
- extern const char Date[5];
- extern const char Datetime[9];
- extern const char Timestamp[10];
- extern const char Interval[9];
-}
-
-class TDate : public IIntegerTypeWithKeyString<ui16, NTypeIds::Date, NNames::Date> {};
-class TDatetime : public IIntegerTypeWithKeyString<ui32, NTypeIds::Datetime, NNames::Datetime> {};
-class TTimestamp : public IIntegerTypeWithKeyString<ui64, NTypeIds::Timestamp, NNames::Timestamp> {};
-class TInterval : public IIntegerTypeWithKeyString<i64, NTypeIds::Interval, NNames::Interval> {};
-
+}
+
+class TDecimal : public IIntegerPair<ui64, i64, NTypeIds::Decimal, NNames::Decimal> {};
+
+////////////////////////////////////////////////////////
+/// Datetime types
+namespace NNames {
+ extern const char Date[5];
+ extern const char Datetime[9];
+ extern const char Timestamp[10];
+ extern const char Interval[9];
+}
+
+class TDate : public IIntegerTypeWithKeyString<ui16, NTypeIds::Date, NNames::Date> {};
+class TDatetime : public IIntegerTypeWithKeyString<ui32, NTypeIds::Datetime, NNames::Datetime> {};
+class TTimestamp : public IIntegerTypeWithKeyString<ui64, NTypeIds::Timestamp, NNames::Timestamp> {};
+class TInterval : public IIntegerTypeWithKeyString<i64, NTypeIds::Interval, NNames::Interval> {};
+
#define KIKIMR_FOREACH_MINIKQL_TYPE_I(name, size, macro, ...) macro(name, T##name, __VA_ARGS__)
#define KIKIMR_FOREACH_MINIKQL_TYPE(xx, ...) \
@@ -249,11 +249,11 @@ class TInterval : public IIntegerTypeWithKeyString<i64, NTypeIds::Interval, NNam
xx(Yson, TYson, __VA_ARGS__) \
xx(Json, TJson, __VA_ARGS__) \
xx(JsonDocument, TJsonDocument, __VA_ARGS__) \
- xx(Decimal, TDecimal, __VA_ARGS__) \
- xx(Date, TDate, __VA_ARGS__) \
- xx(Datetime, TDatetime, __VA_ARGS__) \
- xx(Timestamp, TTimestamp, __VA_ARGS__) \
- xx(Interval, TInterval, __VA_ARGS__) \
+ xx(Decimal, TDecimal, __VA_ARGS__) \
+ xx(Date, TDate, __VA_ARGS__) \
+ xx(Datetime, TDatetime, __VA_ARGS__) \
+ xx(Timestamp, TTimestamp, __VA_ARGS__) \
+ xx(Interval, TInterval, __VA_ARGS__) \
xx(DyNumber, TDyNumber, __VA_ARGS__) \
/**/
diff --git a/ydb/core/tablet/bootstrapper.cpp b/ydb/core/tablet/bootstrapper.cpp
index c133cdd3ca7..d2e5dd8b7f3 100644
--- a/ydb/core/tablet/bootstrapper.cpp
+++ b/ydb/core/tablet/bootstrapper.cpp
@@ -221,7 +221,7 @@ class TBootstrapper : public TActor<TBootstrapper> {
ctx.Send(LookOnActorID, new TEvTablet::TEvPromoteToLeader(0, TabletInfo));
} else {
TTabletSetupInfo *x = BootstrapperInfo->SetupInfo.Get();
- LookOnActorID = x->Tablet(TabletInfo.Get(), ctx.SelfID, ctx, 0, AppData(ctx)->ResourceProfiles);
+ LookOnActorID = x->Tablet(TabletInfo.Get(), ctx.SelfID, ctx, 0, AppData(ctx)->ResourceProfiles);
}
Y_VERIFY(LookOnActorID);
diff --git a/ydb/core/tablet/node_tablet_monitor.cpp b/ydb/core/tablet/node_tablet_monitor.cpp
index 5e865812ad9..8bb34e7ea0b 100644
--- a/ydb/core/tablet/node_tablet_monitor.cpp
+++ b/ydb/core/tablet/node_tablet_monitor.cpp
@@ -69,7 +69,7 @@ public:
}
TABLEBODY() {
for (const auto& ni : NodesInfo->Nodes) {
- const TEvInterconnect::TNodeInfo &nodeInfo = ni;
+ const TEvInterconnect::TNodeInfo &nodeInfo = ni;
TABLER() {
TABLED() {str << "<a href=\"nodetabmon?action=browse_tablets&node_id=" << nodeInfo.NodeId << "\">"
<< nodeInfo.NodeId << "</a>";}
@@ -233,7 +233,7 @@ public:
continue;
auto eq_it = EqualRange(NodesInfo->Nodes.begin(), NodesInfo->Nodes.end(), ni.first);
if (eq_it.first != NodesInfo->Nodes.end() && ni.second) {
- const TEvInterconnect::TNodeInfo& nodeInfo = *eq_it.first;
+ const TEvInterconnect::TNodeInfo& nodeInfo = *eq_it.first;
for (const auto& ti : ni.second->Record.GetTabletStateInfo()) {
if (filter(ti)) {
ui64 index = EqualRange(tabletIdIndex.begin(), tabletIdIndex.end(), ti.GetTabletId()).first - tabletIdIndex.begin();
diff --git a/ydb/core/tablet/node_tablet_monitor.h b/ydb/core/tablet/node_tablet_monitor.h
index abbbf9c9c64..0fe88912003 100644
--- a/ydb/core/tablet/node_tablet_monitor.h
+++ b/ydb/core/tablet/node_tablet_monitor.h
@@ -29,7 +29,7 @@ struct ITabletStateClassifier : public TAtomicRefCount<ITabletStateClassifier>{
struct TTabletListElement {
- const TEvInterconnect::TNodeInfo* NodeInfo;
+ const TEvInterconnect::TNodeInfo* NodeInfo;
ui64 TabletIndex;
const NKikimrWhiteboard::TTabletStateInfo* TabletStateInfo;
};
diff --git a/ydb/core/tablet/node_whiteboard.cpp b/ydb/core/tablet/node_whiteboard.cpp
index 07af646e61e..783758e99d1 100644
--- a/ydb/core/tablet/node_whiteboard.cpp
+++ b/ydb/core/tablet/node_whiteboard.cpp
@@ -619,7 +619,7 @@ protected:
// TAutoPtr<TEvWhiteboard::TEvNodeStateResponse> response = new TEvWhiteboard::TEvNodeStateResponse();
// auto& record = response->Record;
// const TIntrusivePtr<NMonitoring::TDynamicCounters> &counters = AppData(ctx)->Counters;
-// TIntrusivePtr<NMonitoring::TDynamicCounters> interconnectCounters = GetServiceCounters(counters, "interconnect");
+// TIntrusivePtr<NMonitoring::TDynamicCounters> interconnectCounters = GetServiceCounters(counters, "interconnect");
// interconnectCounters->EnumerateSubgroups([&record, &interconnectCounters](const TString &name, const TString &value) -> void {
// NKikimrWhiteboard::TNodeStateInfo &nodeStateInfo = *record.AddNodeStateInfo();
// TIntrusivePtr<NMonitoring::TDynamicCounters> peerCounters = interconnectCounters->GetSubgroup(name, value);
diff --git a/ydb/core/tablet/resource_broker.cpp b/ydb/core/tablet/resource_broker.cpp
index 3b2d20b1dd8..fff30b26010 100644
--- a/ydb/core/tablet/resource_broker.cpp
+++ b/ydb/core/tablet/resource_broker.cpp
@@ -1,23 +1,23 @@
-#include "resource_broker_impl.h"
-
+#include "resource_broker_impl.h"
+
#include <ydb/core/base/localdb.h>
-
+
#include <library/cpp/monlib/service/pages/templates.h>
#include <util/generic/hash.h>
-#include <util/string/join.h>
-
-namespace NKikimr {
-namespace NResourceBroker {
-
-using namespace NKikimrResourceBroker;
-
-TResourceLimit::TResourceLimit(const NKikimrResourceBroker::TResources &limit)
-{
+#include <util/string/join.h>
+
+namespace NKikimr {
+namespace NResourceBroker {
+
+using namespace NKikimrResourceBroker;
+
+TResourceLimit::TResourceLimit(const NKikimrResourceBroker::TResources &limit)
+{
Limit.fill(Max<ui64>());
for (size_t i = 0; i < Limit.size() && i < limit.ResourceSize(); ++i) {
Limit[i] = limit.GetResource(i);
- }
+ }
if (limit.HasCpu()) {
Limit[NKikimrResourceBroker::CPU] = limit.GetCpu();
@@ -27,795 +27,795 @@ TResourceLimit::TResourceLimit(const NKikimrResourceBroker::TResources &limit)
Limit[NKikimrResourceBroker::MEMORY] = limit.GetMemory();
}
- Used.fill(0);
-}
-
-bool TResourceLimit::HasResources(const TResourceValues &values) const
-{
- for (size_t i = 0; i < values.size(); ++i)
- if (values[i] + Used[i] > Limit[i])
- return false;
- return true;
-}
-
-void TResourceLimit::HoldResources(const TResourceValues &values)
-{
- for (size_t i = 0; i < values.size(); ++i)
- Used[i] += values[i];
-}
-
-void TResourceLimit::ReleaseResources(const TResourceValues &values)
-{
- for (size_t i = 0; i < values.size(); ++i)
- Used[i] -= values[i];
-}
-
-TTask::TTask(const TEvResourceBroker::TTask &task,
+ Used.fill(0);
+}
+
+bool TResourceLimit::HasResources(const TResourceValues &values) const
+{
+ for (size_t i = 0; i < values.size(); ++i)
+ if (values[i] + Used[i] > Limit[i])
+ return false;
+ return true;
+}
+
+void TResourceLimit::HoldResources(const TResourceValues &values)
+{
+ for (size_t i = 0; i < values.size(); ++i)
+ Used[i] += values[i];
+}
+
+void TResourceLimit::ReleaseResources(const TResourceValues &values)
+{
+ for (size_t i = 0; i < values.size(); ++i)
+ Used[i] -= values[i];
+}
+
+TTask::TTask(const TEvResourceBroker::TTask &task,
const TActorId &client,
- TInstant timestamp,
- TTaskCountersPtr counters)
- : TEvResourceBroker::TTask(task)
- , Client(client)
- , InFly(false)
- , SubmitTime(timestamp)
- , Counters(counters)
-{
+ TInstant timestamp,
+ TTaskCountersPtr counters)
+ : TEvResourceBroker::TTask(task)
+ , Client(client)
+ , InFly(false)
+ , SubmitTime(timestamp)
+ , Counters(counters)
+{
IdString = Sprintf("%s (%" PRIu64 " by %s)", Name.data(), TaskId, ToString(Client).data());
-}
-
-TString TTask::GetIdString() const
-{
- return IdString;
-}
-
-void TTask::OutputState(IOutputStream &os, const TString &prefix) const
-{
- os << prefix << "Task " << Name << Endl
- << prefix << " ID: " << TaskId << Endl
- << prefix << " Client: " << Client.ToString() << Endl
- << prefix << " Type: " << ToString(Type) << Endl
+}
+
+TString TTask::GetIdString() const
+{
+ return IdString;
+}
+
+void TTask::OutputState(IOutputStream &os, const TString &prefix) const
+{
+ os << prefix << "Task " << Name << Endl
+ << prefix << " ID: " << TaskId << Endl
+ << prefix << " Client: " << Client.ToString() << Endl
+ << prefix << " Type: " << ToString(Type) << Endl
<< prefix << " Required resources: {" << JoinSeq(", ", RequiredResources) << "}" << Endl
- << prefix << " Priority: " << Priority << Endl
- << prefix << " InFly: " << InFly << Endl
- << prefix << " Queue: " << Queue->Name << Endl
- << prefix << " SubmitTime: " << SubmitTime.ToStringLocalUpToSeconds() << Endl;
- if (InFly)
- os << prefix << " StartTime: " << StartTime.ToStringLocalUpToSeconds() << Endl
- << prefix << " FinishTime: " << FinishTime.ToStringLocalUpToSeconds() << Endl;
-}
-
-TBaseCounters::TBaseCounters(const NMonitoring::TDynamicCounterPtr &counters)
-{
- Consumption[CPU] = counters->GetCounter("CPUConsumption");
- Consumption[MEMORY] = counters->GetCounter("MemoryConsumption");
- FinishedTasks = counters->GetCounter("FinishedTasks", true);
- EnqueuedTasks = counters->GetCounter("EnqueuedTasks");
- InFlyTasks = counters->GetCounter("InFlyTasks");
-}
-
-void TBaseCounters::HoldResources(const TResourceValues &values)
-{
- for (size_t i = 0; i < Min(values.size(), Consumption.size()); ++i)
- *Consumption[i] += values[i];
-}
-
-void TBaseCounters::ReleaseResources(const TResourceValues &values)
-{
- for (size_t i = 0; i < Min(values.size(), Consumption.size()); ++i)
- *Consumption[i] -= values[i];
-}
-
-TQueueCounters::TQueueCounters(const NMonitoring::TDynamicCounterPtr &counters)
- : TBaseCounters(counters)
-{
-}
-
-TTaskCounters::TTaskCounters(const NMonitoring::TDynamicCounterPtr &counters)
- : TBaseCounters(counters)
-{
-}
-
-TDurationStat::TDurationStat(TDuration def,
- size_t history)
- : Current(0)
-{
- Y_VERIFY(history > 0);
- Values.resize(history, def);
- Total = def * history;
-}
-
-void TDurationStat::Add(TDuration duration)
-{
- Total -= Values[Current];
- Values[Current] = duration;
- Total += duration;
-
- ++Current;
- if (Current == Values.size())
- Current = 0;
-}
-
-TDuration TDurationStat::GetAverage() const
-{
- return Total / Values.size();
-}
-
-bool TTaskQueue::TTaskEarlier::operator()(const TTaskPtr &l,
- const TTaskPtr &r) const
-{
- if (l->Priority != r->Priority)
- return l->Priority < r->Priority;
-
- if (l->SubmitTime != r->SubmitTime)
- return l->SubmitTime < r->SubmitTime;
-
- if (l->TaskId != r->TaskId)
- return l->TaskId < r->TaskId;
-
- return l->Client < r->Client;
-}
-
-TTaskQueue::TTaskQueue(const NKikimrResourceBroker::TQueueConfig &config,
- const NMonitoring::TDynamicCounterPtr &counters,
- TResourceLimitPtr totalLimit,
- TQueueCountersPtr totalCounters)
- : Name(config.GetName())
- , Weight(config.GetWeight())
- , QueueLimit(config.GetLimit())
- , TotalLimit(totalLimit)
- , RealResourceUsage(0)
- , PlannedResourceUsage(0)
+ << prefix << " Priority: " << Priority << Endl
+ << prefix << " InFly: " << InFly << Endl
+ << prefix << " Queue: " << Queue->Name << Endl
+ << prefix << " SubmitTime: " << SubmitTime.ToStringLocalUpToSeconds() << Endl;
+ if (InFly)
+ os << prefix << " StartTime: " << StartTime.ToStringLocalUpToSeconds() << Endl
+ << prefix << " FinishTime: " << FinishTime.ToStringLocalUpToSeconds() << Endl;
+}
+
+TBaseCounters::TBaseCounters(const NMonitoring::TDynamicCounterPtr &counters)
+{
+ Consumption[CPU] = counters->GetCounter("CPUConsumption");
+ Consumption[MEMORY] = counters->GetCounter("MemoryConsumption");
+ FinishedTasks = counters->GetCounter("FinishedTasks", true);
+ EnqueuedTasks = counters->GetCounter("EnqueuedTasks");
+ InFlyTasks = counters->GetCounter("InFlyTasks");
+}
+
+void TBaseCounters::HoldResources(const TResourceValues &values)
+{
+ for (size_t i = 0; i < Min(values.size(), Consumption.size()); ++i)
+ *Consumption[i] += values[i];
+}
+
+void TBaseCounters::ReleaseResources(const TResourceValues &values)
+{
+ for (size_t i = 0; i < Min(values.size(), Consumption.size()); ++i)
+ *Consumption[i] -= values[i];
+}
+
+TQueueCounters::TQueueCounters(const NMonitoring::TDynamicCounterPtr &counters)
+ : TBaseCounters(counters)
+{
+}
+
+TTaskCounters::TTaskCounters(const NMonitoring::TDynamicCounterPtr &counters)
+ : TBaseCounters(counters)
+{
+}
+
+TDurationStat::TDurationStat(TDuration def,
+ size_t history)
+ : Current(0)
+{
+ Y_VERIFY(history > 0);
+ Values.resize(history, def);
+ Total = def * history;
+}
+
+void TDurationStat::Add(TDuration duration)
+{
+ Total -= Values[Current];
+ Values[Current] = duration;
+ Total += duration;
+
+ ++Current;
+ if (Current == Values.size())
+ Current = 0;
+}
+
+TDuration TDurationStat::GetAverage() const
+{
+ return Total / Values.size();
+}
+
+bool TTaskQueue::TTaskEarlier::operator()(const TTaskPtr &l,
+ const TTaskPtr &r) const
+{
+ if (l->Priority != r->Priority)
+ return l->Priority < r->Priority;
+
+ if (l->SubmitTime != r->SubmitTime)
+ return l->SubmitTime < r->SubmitTime;
+
+ if (l->TaskId != r->TaskId)
+ return l->TaskId < r->TaskId;
+
+ return l->Client < r->Client;
+}
+
+TTaskQueue::TTaskQueue(const NKikimrResourceBroker::TQueueConfig &config,
+ const NMonitoring::TDynamicCounterPtr &counters,
+ TResourceLimitPtr totalLimit,
+ TQueueCountersPtr totalCounters)
+ : Name(config.GetName())
+ , Weight(config.GetWeight())
+ , QueueLimit(config.GetLimit())
+ , TotalLimit(totalLimit)
+ , RealResourceUsage(0)
+ , PlannedResourceUsage(0)
, UsageTimestamp(TInstant::MicroSeconds(0))
- , QueueCounters(counters->GetSubgroup("queue", Name))
- , TotalCounters(totalCounters)
-{
-}
-
-bool TTaskQueue::Empty() const
-{
- return Tasks.empty();
-}
-
-void TTaskQueue::InsertTask(TTaskPtr task, TInstant now)
-{
- Y_VERIFY(!task->Queue, "TTaskQueue::InsertTask: task is already in resource queue");
-
- if (task->InFly) {
- // Update resource consumption.
- HoldResources(task);
- UpdatePlannedResourceUsage(task, now, false);
- UpdateRealResourceUsage(now);
-
- // Update queue/task counters
- QueueCounters.InFlyTasks->Inc();
- TotalCounters->InFlyTasks->Inc();
- task->Counters->InFlyTasks->Inc();
- } else {
- Tasks.insert(task);
-
- // Update queue/task counters
- QueueCounters.EnqueuedTasks->Inc();
- TotalCounters->EnqueuedTasks->Inc();
- task->Counters->EnqueuedTasks->Inc();
- }
-
- task->Queue = this;
-}
-
-void TTaskQueue::EraseTask(TTaskPtr task, bool finished, TInstant now)
-{
- Y_VERIFY(task->Queue.Get() == this);
- Y_VERIFY(task->InFly || !finished);
-
- if (task->InFly) {
- // Update resources consumption.
- UpdateRealResourceUsage(now);
- UpdatePlannedResourceUsage(task, now, true);
- ReleaseResources(task);
-
- // Update queue/task counters
- QueueCounters.InFlyTasks->Dec();
- TotalCounters->InFlyTasks->Dec();
- task->Counters->InFlyTasks->Dec();
-
- if (finished) {
- QueueCounters.FinishedTasks->Inc();
- TotalCounters->FinishedTasks->Inc();
- task->Counters->FinishedTasks->Inc();
- }
- } else {
- // Removing the first element is the most common case.
- if (*Tasks.begin() == task) {
- Tasks.erase(Tasks.begin());
- } else {
- Tasks.erase(task);
- }
-
- // Update queue/task counters
- QueueCounters.EnqueuedTasks->Dec();
- TotalCounters->EnqueuedTasks->Dec();
- task->Counters->EnqueuedTasks->Dec();
- }
- task->Queue = nullptr;
-}
-
-TTaskPtr TTaskQueue::FrontTask()
-{
- Y_VERIFY(!Tasks.empty());
- return *Tasks.begin();
-}
-
-void TTaskQueue::PopTask()
-{
- Y_VERIFY(!Tasks.empty());
- EraseTask(*Tasks.begin(), false, TInstant());
-}
-
-void TTaskQueue::HoldResources(TTaskPtr task)
-{
- const TResourceValues &values = task->RequiredResources;
-
- QueueLimit.HoldResources(values);
- TotalLimit->HoldResources(values);
-
- QueueCounters.HoldResources(values);
- TotalCounters->HoldResources(values);
- task->Counters->HoldResources(values);
-}
-
-void TTaskQueue::ReleaseResources(TTaskPtr task)
-{
- const TResourceValues &values = task->RequiredResources;
-
- QueueLimit.ReleaseResources(values);
- TotalLimit->ReleaseResources(values);
-
- QueueCounters.ReleaseResources(values);
- TotalCounters->ReleaseResources(values);
- task->Counters->ReleaseResources(values);
-}
-
-void TTaskQueue::UpdateRealResourceUsage(TInstant now)
-{
- auto duration = now - UsageTimestamp;
- if (!duration)
- return;
-
- // Find dominant resource consumption and update usage
- auto dom = GetDominantResourceComponentNormalized(QueueLimit.Used);
- auto usage = RealResourceUsage + dom * duration.MilliSeconds() / Weight;
- RealResourceUsage = usage;
-
- UsageTimestamp = now;
-}
-
-void TTaskQueue::UpdatePlannedResourceUsage(TTaskPtr task,
- TInstant now,
- bool decrease)
-{
- auto duration = task->FinishTime - now;
- if (!duration)
- return;
-
- if (decrease)
- // Round up to ms when decreasing to match real and planned usage.
- // Otherwise 1ms goes to planned and doesn't go to real usage.
- duration += TDuration::MicroSeconds(999);
-
- auto dom = GetDominantResourceComponentNormalized(task->RequiredResources);
- if (decrease) {
- PlannedResourceUsage -= dom * duration.MilliSeconds() / Weight;
- PlannedResourceUsage = Max(PlannedResourceUsage, RealResourceUsage);
- } else {
- PlannedResourceUsage = Max(PlannedResourceUsage, RealResourceUsage);
- PlannedResourceUsage += dom * duration.MilliSeconds() / Weight;
- }
-}
-
-double TTaskQueue::GetDominantResourceComponentNormalized(const TResourceValues &values)
-{
- std::array<double, RESOURCE_COUNT> norm;
- for (size_t i = 0; i < norm.size(); ++i)
- norm[i] = (double)QueueLimit.Used[i] / (double)TotalLimit->Limit[i];
- size_t i = MaxElement(norm.begin(), norm.end()) - norm.begin();
- return (double)values[i] / (double)TotalLimit->Limit[i];
-}
-
-void TTaskQueue::OutputState(IOutputStream &os, const TString &prefix) const
-{
- os << prefix << "Queue " << Name << Endl
- << prefix << " Weight: " << Weight << Endl
- << prefix << " QueueLimit: {" << JoinSeq(", ", QueueLimit.Limit) << "}" << Endl
- << prefix << " QueueConsumption: {" << JoinSeq(", ", QueueLimit.Used) << "}" << Endl
- << prefix << " Real resource usage: " << RealResourceUsage << " (updated "
- << UsageTimestamp.ToStringLocalUpToSeconds() << ")" << Endl
- << prefix << " Planned resource usage: " << PlannedResourceUsage << Endl
- << prefix << " Enqueued tasks:" << Endl;
-
- for (auto it = Tasks.begin(); it != Tasks.end(); ++it)
- (*it)->OutputState(os, prefix + " ");
-}
-
-bool TScheduler::TTaskQueueLess::operator()(const TTaskQueuePtr &l,
- const TTaskQueuePtr &r) const
-{
- auto lu = Max(l->RealResourceUsage, l->PlannedResourceUsage);
- auto ru = Max(r->RealResourceUsage, r->PlannedResourceUsage);
-
- if (lu != ru)
- return lu < ru;
-
- if (l->Weight != r->Weight)
- return l->Weight > r->Weight;
-
- return l.Get() < r.Get();
-};
-
-TScheduler::TTaskConfig::TTaskConfig(const TString &name,
- TDuration defaultDuration,
- TTaskCountersPtr counters)
- : Name(name)
- , ExecTime(defaultDuration, 20)
- , Counters(counters)
-{
-}
-
-TScheduler::TScheduler(const NMonitoring::TDynamicCounterPtr &counters)
- : Counters(counters)
- , TotalCounters(new TQueueCounters(counters->GetSubgroup("queue", "total")))
- , MissingTaskTypeCounter(counters->GetCounter("MissingTaskType", true))
- , NextTaskId(1)
-{
-}
-
-TScheduler::~TScheduler()
-{
- for (auto &entry : Tasks)
- entry.second->Queue->EraseTask(entry.second, false, Now);
-}
-
+ , QueueCounters(counters->GetSubgroup("queue", Name))
+ , TotalCounters(totalCounters)
+{
+}
+
+bool TTaskQueue::Empty() const
+{
+ return Tasks.empty();
+}
+
+void TTaskQueue::InsertTask(TTaskPtr task, TInstant now)
+{
+ Y_VERIFY(!task->Queue, "TTaskQueue::InsertTask: task is already in resource queue");
+
+ if (task->InFly) {
+ // Update resource consumption.
+ HoldResources(task);
+ UpdatePlannedResourceUsage(task, now, false);
+ UpdateRealResourceUsage(now);
+
+ // Update queue/task counters
+ QueueCounters.InFlyTasks->Inc();
+ TotalCounters->InFlyTasks->Inc();
+ task->Counters->InFlyTasks->Inc();
+ } else {
+ Tasks.insert(task);
+
+ // Update queue/task counters
+ QueueCounters.EnqueuedTasks->Inc();
+ TotalCounters->EnqueuedTasks->Inc();
+ task->Counters->EnqueuedTasks->Inc();
+ }
+
+ task->Queue = this;
+}
+
+void TTaskQueue::EraseTask(TTaskPtr task, bool finished, TInstant now)
+{
+ Y_VERIFY(task->Queue.Get() == this);
+ Y_VERIFY(task->InFly || !finished);
+
+ if (task->InFly) {
+ // Update resources consumption.
+ UpdateRealResourceUsage(now);
+ UpdatePlannedResourceUsage(task, now, true);
+ ReleaseResources(task);
+
+ // Update queue/task counters
+ QueueCounters.InFlyTasks->Dec();
+ TotalCounters->InFlyTasks->Dec();
+ task->Counters->InFlyTasks->Dec();
+
+ if (finished) {
+ QueueCounters.FinishedTasks->Inc();
+ TotalCounters->FinishedTasks->Inc();
+ task->Counters->FinishedTasks->Inc();
+ }
+ } else {
+ // Removing the first element is the most common case.
+ if (*Tasks.begin() == task) {
+ Tasks.erase(Tasks.begin());
+ } else {
+ Tasks.erase(task);
+ }
+
+ // Update queue/task counters
+ QueueCounters.EnqueuedTasks->Dec();
+ TotalCounters->EnqueuedTasks->Dec();
+ task->Counters->EnqueuedTasks->Dec();
+ }
+ task->Queue = nullptr;
+}
+
+TTaskPtr TTaskQueue::FrontTask()
+{
+ Y_VERIFY(!Tasks.empty());
+ return *Tasks.begin();
+}
+
+void TTaskQueue::PopTask()
+{
+ Y_VERIFY(!Tasks.empty());
+ EraseTask(*Tasks.begin(), false, TInstant());
+}
+
+void TTaskQueue::HoldResources(TTaskPtr task)
+{
+ const TResourceValues &values = task->RequiredResources;
+
+ QueueLimit.HoldResources(values);
+ TotalLimit->HoldResources(values);
+
+ QueueCounters.HoldResources(values);
+ TotalCounters->HoldResources(values);
+ task->Counters->HoldResources(values);
+}
+
+void TTaskQueue::ReleaseResources(TTaskPtr task)
+{
+ const TResourceValues &values = task->RequiredResources;
+
+ QueueLimit.ReleaseResources(values);
+ TotalLimit->ReleaseResources(values);
+
+ QueueCounters.ReleaseResources(values);
+ TotalCounters->ReleaseResources(values);
+ task->Counters->ReleaseResources(values);
+}
+
+void TTaskQueue::UpdateRealResourceUsage(TInstant now)
+{
+ auto duration = now - UsageTimestamp;
+ if (!duration)
+ return;
+
+ // Find dominant resource consumption and update usage
+ auto dom = GetDominantResourceComponentNormalized(QueueLimit.Used);
+ auto usage = RealResourceUsage + dom * duration.MilliSeconds() / Weight;
+ RealResourceUsage = usage;
+
+ UsageTimestamp = now;
+}
+
+void TTaskQueue::UpdatePlannedResourceUsage(TTaskPtr task,
+ TInstant now,
+ bool decrease)
+{
+ auto duration = task->FinishTime - now;
+ if (!duration)
+ return;
+
+ if (decrease)
+ // Round up to ms when decreasing to match real and planned usage.
+ // Otherwise 1ms goes to planned and doesn't go to real usage.
+ duration += TDuration::MicroSeconds(999);
+
+ auto dom = GetDominantResourceComponentNormalized(task->RequiredResources);
+ if (decrease) {
+ PlannedResourceUsage -= dom * duration.MilliSeconds() / Weight;
+ PlannedResourceUsage = Max(PlannedResourceUsage, RealResourceUsage);
+ } else {
+ PlannedResourceUsage = Max(PlannedResourceUsage, RealResourceUsage);
+ PlannedResourceUsage += dom * duration.MilliSeconds() / Weight;
+ }
+}
+
+double TTaskQueue::GetDominantResourceComponentNormalized(const TResourceValues &values)
+{
+ std::array<double, RESOURCE_COUNT> norm;
+ for (size_t i = 0; i < norm.size(); ++i)
+ norm[i] = (double)QueueLimit.Used[i] / (double)TotalLimit->Limit[i];
+ size_t i = MaxElement(norm.begin(), norm.end()) - norm.begin();
+ return (double)values[i] / (double)TotalLimit->Limit[i];
+}
+
+void TTaskQueue::OutputState(IOutputStream &os, const TString &prefix) const
+{
+ os << prefix << "Queue " << Name << Endl
+ << prefix << " Weight: " << Weight << Endl
+ << prefix << " QueueLimit: {" << JoinSeq(", ", QueueLimit.Limit) << "}" << Endl
+ << prefix << " QueueConsumption: {" << JoinSeq(", ", QueueLimit.Used) << "}" << Endl
+ << prefix << " Real resource usage: " << RealResourceUsage << " (updated "
+ << UsageTimestamp.ToStringLocalUpToSeconds() << ")" << Endl
+ << prefix << " Planned resource usage: " << PlannedResourceUsage << Endl
+ << prefix << " Enqueued tasks:" << Endl;
+
+ for (auto it = Tasks.begin(); it != Tasks.end(); ++it)
+ (*it)->OutputState(os, prefix + " ");
+}
+
+bool TScheduler::TTaskQueueLess::operator()(const TTaskQueuePtr &l,
+ const TTaskQueuePtr &r) const
+{
+ auto lu = Max(l->RealResourceUsage, l->PlannedResourceUsage);
+ auto ru = Max(r->RealResourceUsage, r->PlannedResourceUsage);
+
+ if (lu != ru)
+ return lu < ru;
+
+ if (l->Weight != r->Weight)
+ return l->Weight > r->Weight;
+
+ return l.Get() < r.Get();
+};
+
+TScheduler::TTaskConfig::TTaskConfig(const TString &name,
+ TDuration defaultDuration,
+ TTaskCountersPtr counters)
+ : Name(name)
+ , ExecTime(defaultDuration, 20)
+ , Counters(counters)
+{
+}
+
+TScheduler::TScheduler(const NMonitoring::TDynamicCounterPtr &counters)
+ : Counters(counters)
+ , TotalCounters(new TQueueCounters(counters->GetSubgroup("queue", "total")))
+ , MissingTaskTypeCounter(counters->GetCounter("MissingTaskType", true))
+ , NextTaskId(1)
+{
+}
+
+TScheduler::~TScheduler()
+{
+ for (auto &entry : Tasks)
+ entry.second->Queue->EraseTask(entry.second, false, Now);
+}
+
const TTask* TScheduler::FindTask(ui64 taskId, const TActorId &client) const {
auto it = Tasks.find(std::make_pair(client, taskId));
return it != Tasks.end() ? it->second.Get() : nullptr;
}
-bool TScheduler::SubmitTask(const TEvResourceBroker::TTask &task,
+bool TScheduler::SubmitTask(const TEvResourceBroker::TTask &task,
const TActorId &client,
const TActorSystem &as)
-{
- auto &config = TaskConfig(task.Type);
- TTaskPtr newTask = new TTask(task, client, Now, config.Counters);
-
+{
+ auto &config = TaskConfig(task.Type);
+ TTaskPtr newTask = new TTask(task, client, Now, config.Counters);
+
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Submitted new %s task %s priority=%" PRIu64 " resources={%s}",
+ "Submitted new %s task %s priority=%" PRIu64 " resources={%s}",
config.Name.data(), newTask->GetIdString().data(), task.Priority,
JoinSeq(", ", task.RequiredResources).data());
-
- auto id = std::make_pair(client, task.TaskId);
- if (!task.TaskId) {
- do {
- id = std::make_pair(client, NextTaskId++);
+
+ auto id = std::make_pair(client, task.TaskId);
+ if (!task.TaskId) {
+ do {
+ id = std::make_pair(client, NextTaskId++);
} while (Tasks.contains(id));
- newTask->TaskId = id.second;
-
+ newTask->TaskId = id.second;
+
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Use ID %" PRIu64 " for submitted task",
- id.second);
+ "Use ID %" PRIu64 " for submitted task",
+ id.second);
} else if (Tasks.contains(id)) {
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
"SubmitTask failed for task %" PRIu64 " to %s: task with the same ID has been already submitted",
task.TaskId, ToString(client).c_str());
- return false;
- }
-
+ return false;
+ }
+
if (!TaskConfigs.contains(newTask->Type))
- MissingTaskTypeCounter->Inc();
-
- Tasks.emplace(id, newTask);
+ MissingTaskTypeCounter->Inc();
+
+ Tasks.emplace(id, newTask);
AssignTask(newTask, as);
-
- return true;
-}
-
-bool TScheduler::UpdateTask(ui64 taskId,
+
+ return true;
+}
+
+bool TScheduler::UpdateTask(ui64 taskId,
const TActorId &client,
- const TResourceValues &requiredResources,
- ui64 priority,
- const TString &type,
- bool resubmit,
+ const TResourceValues &requiredResources,
+ ui64 priority,
+ const TString &type,
+ bool resubmit,
const TActorSystem &as)
-{
- auto it = Tasks.find(std::make_pair(client, taskId));
- if (it == Tasks.end()) {
+{
+ auto it = Tasks.find(std::make_pair(client, taskId));
+ if (it == Tasks.end()) {
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
"UpdateTask failed for task %" PRIu64 " to %s: cannot update unknown task",
taskId, ToString(client).c_str());
- return false;
- }
-
- auto task = it->second;
+ return false;
+ }
+
+ auto task = it->second;
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Update task %s (priority=%" PRIu64 " type=%s resources={%s} resubmit=%" PRIu32 ")",
+ "Update task %s (priority=%" PRIu64 " type=%s resources={%s} resubmit=%" PRIu32 ")",
task->GetIdString().data(), priority, type.data(), JoinSeq(", ", requiredResources).data(),
- (ui32)resubmit);
-
- auto queue = task->Queue;
- queue->EraseTask(task, false, Now);
-
- task->RequiredResources = requiredResources;
- task->Priority = priority;
- task->Type = type;
- if (resubmit && task->InFly)
- task->InFly = false;
-
+ (ui32)resubmit);
+
+ auto queue = task->Queue;
+ queue->EraseTask(task, false, Now);
+
+ task->RequiredResources = requiredResources;
+ task->Priority = priority;
+ task->Type = type;
+ if (resubmit && task->InFly)
+ task->InFly = false;
+
AssignTask(task, as);
-
- return true;
-}
-
+
+ return true;
+}
+
bool TScheduler::UpdateTaskCookie(ui64 taskId,
const TActorId &client,
- TIntrusivePtr<TThrRefBase> cookie,
+ TIntrusivePtr<TThrRefBase> cookie,
const TActorSystem &as)
-{
- auto it = Tasks.find(std::make_pair(client, taskId));
- if (it == Tasks.end()) {
+{
+ auto it = Tasks.find(std::make_pair(client, taskId));
+ if (it == Tasks.end()) {
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
"UpdateTaskCookie failed for task %" PRIu64 " to %s: cannot update unknown task's cookie",
taskId, ToString(client).c_str());
return false;
- }
-
- auto task = it->second;
+ }
+
+ auto task = it->second;
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
"Update cookie for task %s", task->GetIdString().data());
-
- task->Cookie = cookie;
+
+ task->Cookie = cookie;
return true;
-}
-
+}
+
TScheduler::TTerminateTaskResult TScheduler::RemoveQueuedTask(ui64 taskId,
const TActorId &client,
const TActorSystem &as)
-{
- auto it = Tasks.find(std::make_pair(client, taskId));
- if (it == Tasks.end()) {
+{
+ auto it = Tasks.find(std::make_pair(client, taskId));
+ if (it == Tasks.end()) {
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
"RemoveQueuedTask failed for task %" PRIu64 " to %s: cannot remove unknown task",
taskId, ToString(client).c_str());
return TTerminateTaskResult(false, nullptr);
- }
-
- auto task = it->second;
- if (task->InFly) {
+ }
+
+ auto task = it->second;
+ if (task->InFly) {
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
"RemoveQueuedTask failed for task %" PRIu64 " to %s: cannot remove in-fly task",
taskId, ToString(client).c_str());
return TTerminateTaskResult(false, task);
- }
-
+ }
+
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER, "Removing task %s",
task->GetIdString().data());
-
+
EraseTask(task, false, as);
return TTerminateTaskResult(true, task);
-}
-
+}
+
TScheduler::TTerminateTaskResult TScheduler::FinishTask(ui64 taskId,
const TActorId &client,
bool cancel,
const TActorSystem &as)
-{
- auto it = Tasks.find(std::make_pair(client, taskId));
- if (it == Tasks.end()) {
+{
+ auto it = Tasks.find(std::make_pair(client, taskId));
+ if (it == Tasks.end()) {
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
"FinishTask failed for task %" PRIu64 " to %s: cannot finish unknown task",
taskId, ToString(client).c_str());
return TTerminateTaskResult(false, nullptr);
- }
-
- auto task = it->second;
- if (!task->InFly) {
+ }
+
+ auto task = it->second;
+ if (!task->InFly) {
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
"FinishTask failed for task %" PRIu64 " to %s: cannot finish queued task",
taskId, ToString(client).c_str());
return TTerminateTaskResult(false, task);
- }
-
+ }
+
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER, "Finish task %s (release resources {%s})",
task->GetIdString().data(), JoinSeq(", ", task->RequiredResources).data());
-
- // Add execution time to statistics but cancelled tasks
- // don't affect average execution time.
- auto &config = TaskConfig(task->Type);
- auto execTime = Now - task->StartTime;
- if (!cancel)
- config.ExecTime.Add(execTime);
-
+
+ // Add execution time to statistics but cancelled tasks
+ // don't affect average execution time.
+ auto &config = TaskConfig(task->Type);
+ auto execTime = Now - task->StartTime;
+ if (!cancel)
+ config.ExecTime.Add(execTime);
+
EraseTask(task, true, as);
-
+
return TTerminateTaskResult(true, task);
-}
-
+}
+
bool TScheduler::RemoveTasks(const TActorId &client, const TActorSystem &as)
-{
- bool res = false;
-
- for (auto it = Tasks.begin(); it != Tasks.end(); ) {
- if (it->first.first == client) {
- auto id = it->first.second;
- bool inFly = it->second->InFly;
-
- ++it;
-
- if (inFly)
+{
+ bool res = false;
+
+ for (auto it = Tasks.begin(); it != Tasks.end(); ) {
+ if (it->first.first == client) {
+ auto id = it->first.second;
+ bool inFly = it->second->InFly;
+
+ ++it;
+
+ if (inFly)
FinishTask(id, client, true, as);
- else
+ else
RemoveQueuedTask(id, client, as);
-
- res = true;
- } else
- ++it;
- }
-
- return res;
-}
-
+
+ res = true;
+ } else
+ ++it;
+ }
+
+ return res;
+}
+
void TScheduler::EraseTask(TTaskPtr task, bool finished, const TActorSystem &as)
-{
- auto queue = task->Queue;
- auto oldp = queue->PlannedResourceUsage;
- auto oldr = queue->RealResourceUsage;
-
- queue->EraseTask(task, finished, Now);
-
- if (oldp != queue->PlannedResourceUsage)
+{
+ auto queue = task->Queue;
+ auto oldp = queue->PlannedResourceUsage;
+ auto oldr = queue->RealResourceUsage;
+
+ queue->EraseTask(task, finished, Now);
+
+ if (oldp != queue->PlannedResourceUsage)
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Updated planned resource usage for queue %s from %f to %f (remove task %s)",
+ "Updated planned resource usage for queue %s from %f to %f (remove task %s)",
queue->Name.data(), oldp, queue->PlannedResourceUsage, task->GetIdString().data());
-
- if (oldr != queue->RealResourceUsage)
+
+ if (oldr != queue->RealResourceUsage)
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Updated real resource usage for queue %s from %f to %f",
+ "Updated real resource usage for queue %s from %f to %f",
queue->Name.data(), oldr, queue->RealResourceUsage);
-
- Tasks.erase(std::make_pair(task->Client, task->TaskId));
-}
-
+
+ Tasks.erase(std::make_pair(task->Client, task->TaskId));
+}
+
void TScheduler::ScheduleTasks(const TActorSystem &as,
std::function<void(const TTask &task)> &&onTaskSchedule)
-{
+{
UpdateResourceUsage(as);
-
+
TSet<TTaskQueuePtr, TTaskQueueLess> pending;
- for (auto &entry : Queues) {
- auto &queue = entry.second;
- if (!queue->Empty())
- pending.insert(queue);
- }
-
+ for (auto &entry : Queues) {
+ auto &queue = entry.second;
+ if (!queue->Empty())
+ pending.insert(queue);
+ }
+
ui64 blockedResources = 0;
- while (!pending.empty()) {
- auto queue = *pending.begin();
- pending.erase(pending.begin());
-
- auto task = queue->FrontTask();
+ while (!pending.empty()) {
+ auto queue = *pending.begin();
+ pending.erase(pending.begin());
+
+ auto task = queue->FrontTask();
if (task->GetRequiredResourcesMask() & blockedResources) {
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
"Skip queue %s blocked by an earlier queue",
queue->Name.c_str());
continue;
}
-
- // If task is out of total limits then we have to wait until
- // resources are released.
- // Allow resource over-usage if no tasks are running.
- if (!ResourceLimit->HasResources(task->RequiredResources)
- && *TotalCounters->InFlyTasks) {
+
+ // If task is out of total limits then we have to wait until
+ // resources are released.
+ // Allow resource over-usage if no tasks are running.
+ if (!ResourceLimit->HasResources(task->RequiredResources)
+ && *TotalCounters->InFlyTasks) {
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Not enough resources to start task %s",
+ "Not enough resources to start task %s",
task->GetIdString().data());
blockedResources |= task->GetRequiredResourcesMask();
continue;
- }
-
- // If task is out of queue limits then skip it.
- // Allow resource over-usage if no tasks are running in this queue.
- if (!queue->QueueLimit.HasResources(task->RequiredResources)
- && *queue->QueueCounters.InFlyTasks) {
+ }
+
+ // If task is out of queue limits then skip it.
+ // Allow resource over-usage if no tasks are running in this queue.
+ if (!queue->QueueLimit.HasResources(task->RequiredResources)
+ && *queue->QueueCounters.InFlyTasks) {
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Skip queue %s due to exceeded limits",
+ "Skip queue %s due to exceeded limits",
queue->Name.data());
- continue;
- }
-
+ continue;
+ }
+
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Allocate resources {%s} for task %s from queue %s",
+ "Allocate resources {%s} for task %s from queue %s",
JoinSeq(", ", task->RequiredResources).data(),
task->GetIdString().data(), queue->Name.data());
-
- queue->PopTask();
- task->InFly = true;
- task->StartTime = Now;
- task->FinishTime = Now + EstimateTaskExecutionTime(task);
+
+ queue->PopTask();
+ task->InFly = true;
+ task->StartTime = Now;
+ task->FinishTime = Now + EstimateTaskExecutionTime(task);
AssignTask(task, as);
-
+
onTaskSchedule(*task);
-
- if (!queue->Empty())
- pending.insert(queue);
- }
-}
-
+
+ if (!queue->Empty())
+ pending.insert(queue);
+ }
+}
+
void TScheduler::UpdateResourceUsage(const TActorSystem &as)
-{
- for (auto &entry : Queues) {
- auto &queue = entry.second;
- auto old = queue->RealResourceUsage;
- queue->UpdateRealResourceUsage(Now);
-
- if (old != queue->RealResourceUsage)
+{
+ for (auto &entry : Queues) {
+ auto &queue = entry.second;
+ auto old = queue->RealResourceUsage;
+ queue->UpdateRealResourceUsage(Now);
+
+ if (old != queue->RealResourceUsage)
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Updated real resource usage for queue %s from %f to %f (in-fly consumption {%s})",
+ "Updated real resource usage for queue %s from %f to %f (in-fly consumption {%s})",
queue->Name.data(), old, queue->RealResourceUsage,
JoinSeq(", ", queue->QueueLimit.Used).data());
- }
-}
-
+ }
+}
+
void TScheduler::AssignTask(TTaskPtr &task, const TActorSystem &as)
-{
- TString state = task->InFly ? "in-fly" : "waiting";
- TTaskQueuePtr queue = TaskConfig(task->Type).Queue;
-
+{
+ TString state = task->InFly ? "in-fly" : "waiting";
+ TTaskQueuePtr queue = TaskConfig(task->Type).Queue;
+
if (!TaskConfigs.contains(task->Type)) {
LOG_ERROR(as, NKikimrServices::RESOURCE_BROKER,
- "Assigning %s task '%s' of unknown type '%s' to default queue",
+ "Assigning %s task '%s' of unknown type '%s' to default queue",
state.data(), task->GetIdString().data(), task->Type.data());
- } else {
+ } else {
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Assigning %s task %s to queue %s",
+ "Assigning %s task %s to queue %s",
state.data(), task->GetIdString().data(), queue->Name.data());
- }
-
- auto oldp = queue->PlannedResourceUsage;
- auto oldr = queue->RealResourceUsage;
- double usage = Max<double>();
- bool forceUsage = false;
-
- // If queue is empty then we might need to update its resource
- // usage. Otherwise unused for a long time queue may get too
- // much priority.
- if (!task->InFly && queue->Empty()) {
- for (auto &entry : Queues) {
- if (!entry.second->Empty()) {
- usage = Min(usage, entry.second->RealResourceUsage);
- forceUsage = true;
- }
- }
- }
-
- if (forceUsage)
- queue->RealResourceUsage = Max(queue->RealResourceUsage, usage);
- queue->InsertTask(task, Now);
-
- if (oldr != queue->RealResourceUsage)
+ }
+
+ auto oldp = queue->PlannedResourceUsage;
+ auto oldr = queue->RealResourceUsage;
+ double usage = Max<double>();
+ bool forceUsage = false;
+
+ // If queue is empty then we might need to update its resource
+ // usage. Otherwise unused for a long time queue may get too
+ // much priority.
+ if (!task->InFly && queue->Empty()) {
+ for (auto &entry : Queues) {
+ if (!entry.second->Empty()) {
+ usage = Min(usage, entry.second->RealResourceUsage);
+ forceUsage = true;
+ }
+ }
+ }
+
+ if (forceUsage)
+ queue->RealResourceUsage = Max(queue->RealResourceUsage, usage);
+ queue->InsertTask(task, Now);
+
+ if (oldr != queue->RealResourceUsage)
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Updated real resource usage for queue %s from %f to %f",
+ "Updated real resource usage for queue %s from %f to %f",
queue->Name.data(), oldr, queue->RealResourceUsage);
-
- if (oldp != queue->PlannedResourceUsage)
+
+ if (oldp != queue->PlannedResourceUsage)
LOG_DEBUG(as, NKikimrServices::RESOURCE_BROKER,
- "Updated planned resource usage for queue %s from %f to %f (insert task %s)",
+ "Updated planned resource usage for queue %s from %f to %f (insert task %s)",
queue->Name.data(), oldp, queue->PlannedResourceUsage, task->GetIdString().data());
-}
-
-const TScheduler::TTaskConfig &TScheduler::TaskConfig(const TString &type) const
-{
+}
+
+const TScheduler::TTaskConfig &TScheduler::TaskConfig(const TString &type) const
+{
if (TaskConfigs.contains(type))
- return TaskConfigs.at(type);
- return TaskConfigs.at(NLocalDb::UnknownTaskName);
-}
-
-TScheduler::TTaskConfig &TScheduler::TaskConfig(const TString &type)
-{
+ return TaskConfigs.at(type);
+ return TaskConfigs.at(NLocalDb::UnknownTaskName);
+}
+
+TScheduler::TTaskConfig &TScheduler::TaskConfig(const TString &type)
+{
if (TaskConfigs.contains(type))
- return TaskConfigs.at(type);
- return TaskConfigs.at(NLocalDb::UnknownTaskName);
-}
-
-TDuration TScheduler::EstimateTaskExecutionTime(TTaskPtr task)
-{
- return TaskConfig(task->Type).ExecTime.GetAverage();
-}
-
+ return TaskConfigs.at(type);
+ return TaskConfigs.at(NLocalDb::UnknownTaskName);
+}
+
+TDuration TScheduler::EstimateTaskExecutionTime(TTaskPtr task)
+{
+ return TaskConfig(task->Type).ExecTime.GetAverage();
+}
+
void TScheduler::Configure(const TResourceBrokerConfig &config, const TActorSystem &as)
-{
- // Remove all tasks from queues.
- for (auto &entry : Tasks)
- entry.second->Queue->EraseTask(entry.second, false, Now);
- // Remove old queues.
- Queues.clear();
-
- // Replace limit with new one.
- ResourceLimit = new TResourceLimit(config.GetResourceLimit());
-
- // Create new queues.
+{
+ // Remove all tasks from queues.
+ for (auto &entry : Tasks)
+ entry.second->Queue->EraseTask(entry.second, false, Now);
+ // Remove old queues.
+ Queues.clear();
+
+ // Replace limit with new one.
+ ResourceLimit = new TResourceLimit(config.GetResourceLimit());
+
+ // Create new queues.
for (const auto &queueConfig : config.GetQueues()) {
TTaskQueuePtr queue = new TTaskQueue(queueConfig, Counters,
- ResourceLimit, TotalCounters);
- Queues.emplace(queue->Name, queue);
- }
+ ResourceLimit, TotalCounters);
+ Queues.emplace(queue->Name, queue);
+ }
Y_VERIFY(Queues.contains(NLocalDb::DefaultQueueName), "default queue '%s' wasn't found in config", NLocalDb::DefaultQueueName.data());
-
- // Read new tasks config.
- TaskConfigs.clear();
- for (auto &task : config.GetTasks()) {
- TTaskCountersPtr counters = new TTaskCounters(Counters->GetSubgroup("task", task.GetName()));
- TTaskConfig taskConfig(task.GetName(),
+
+ // Read new tasks config.
+ TaskConfigs.clear();
+ for (auto &task : config.GetTasks()) {
+ TTaskCountersPtr counters = new TTaskCounters(Counters->GetSubgroup("task", task.GetName()));
+ TTaskConfig taskConfig(task.GetName(),
TDuration::MicroSeconds(task.GetDefaultDuration()),
- counters);
+ counters);
Y_VERIFY(Queues.contains(task.GetQueueName()), " queue '%s' wasn't found in config", task.GetQueueName().data());
- taskConfig.Queue = Queues.at(task.GetQueueName());
-
- TaskConfigs.emplace(taskConfig.Name, taskConfig);
- }
+ taskConfig.Queue = Queues.at(task.GetQueueName());
+
+ TaskConfigs.emplace(taskConfig.Name, taskConfig);
+ }
Y_VERIFY(TaskConfigs.contains(NLocalDb::UnknownTaskName), "task '%s' wasn't found in config", NLocalDb::UnknownTaskName.data());
-
- // Move all tasks to queues.
- for (auto &entry : Tasks)
+
+ // Move all tasks to queues.
+ for (auto &entry : Tasks)
AssignTask(entry.second, as);
-}
-
-void TScheduler::UpdateTime(TInstant now)
-{
- Now = now;
-}
-
-void TScheduler::OutputState(IOutputStream &os) const
-{
- os << "Resource broker counters:" << Endl;
- for (auto &entry : Queues) {
- os << " queue=" << entry.first << ":" << Endl;
- Counters->GetSubgroup("queue", entry.first)->OutputPlainText(os, " ");
- }
- os << " queue=total:" << Endl;
- Counters->GetSubgroup("queue", "total")->OutputPlainText(os, " ");
- for (auto &entry : TaskConfigs) {
- os << " task=" << entry.first << ":" << Endl;
- Counters->GetSubgroup("task", entry.first)->OutputPlainText(os, " ");
- }
- os << " MissingTaskType: " << Counters->GetCounter("MissingTaskType", true)->Val() << Endl;
- os << "Scheduler resource limit: {" << JoinSeq(", ", ResourceLimit->Limit) << "}" << Endl
- << "Total resource consumption: {" << JoinSeq(", ", ResourceLimit->Used) << "}" << Endl;
-
- os << Endl << "Queues state:" << Endl;
- for (auto &entry : Queues)
- entry.second->OutputState(os, " ");
-
- os << Endl << "In-Fly tasks:" << Endl;
- for (auto &entry : Tasks)
- if (entry.second->InFly)
- entry.second->OutputState(os, " ");
-}
-
-TResourceBroker::TResourceBroker(const TResourceBrokerConfig &config,
+}
+
+void TScheduler::UpdateTime(TInstant now)
+{
+ Now = now;
+}
+
+void TScheduler::OutputState(IOutputStream &os) const
+{
+ os << "Resource broker counters:" << Endl;
+ for (auto &entry : Queues) {
+ os << " queue=" << entry.first << ":" << Endl;
+ Counters->GetSubgroup("queue", entry.first)->OutputPlainText(os, " ");
+ }
+ os << " queue=total:" << Endl;
+ Counters->GetSubgroup("queue", "total")->OutputPlainText(os, " ");
+ for (auto &entry : TaskConfigs) {
+ os << " task=" << entry.first << ":" << Endl;
+ Counters->GetSubgroup("task", entry.first)->OutputPlainText(os, " ");
+ }
+ os << " MissingTaskType: " << Counters->GetCounter("MissingTaskType", true)->Val() << Endl;
+ os << "Scheduler resource limit: {" << JoinSeq(", ", ResourceLimit->Limit) << "}" << Endl
+ << "Total resource consumption: {" << JoinSeq(", ", ResourceLimit->Used) << "}" << Endl;
+
+ os << Endl << "Queues state:" << Endl;
+ for (auto &entry : Queues)
+ entry.second->OutputState(os, " ");
+
+ os << Endl << "In-Fly tasks:" << Endl;
+ for (auto &entry : Tasks)
+ if (entry.second->InFly)
+ entry.second->OutputState(os, " ");
+}
+
+TResourceBroker::TResourceBroker(const TResourceBrokerConfig &config,
const NMonitoring::TDynamicCounterPtr &counters,
TActorSystem *actorSystem)
- : Config(config)
- , Scheduler(counters)
+ : Config(config)
+ , Scheduler(counters)
, ActorSystem(actorSystem)
-{
+{
with_lock(Lock) {
Scheduler.Configure(Config, *ActorSystem);
}
-}
-
+}
+
void TResourceBroker::Configure(const TResourceBrokerConfig &config)
-{
+{
with_lock(Lock) {
Config = config;
-
+
Scheduler.UpdateTime(ActorSystem->Timestamp());
Scheduler.Configure(Config, *ActorSystem);
Scheduler.ScheduleTasks(*ActorSystem, [this](const TTask &task) {
@@ -1106,97 +1106,97 @@ void TResourceBrokerActor::Bootstrap(const TActorContext &ctx)
{
LOG_DEBUG(ctx, NKikimrServices::RESOURCE_BROKER, "TResourceBrokerActor bootstrap");
- NActors::TMon* mon = AppData(ctx)->Mon;
- if (mon) {
- NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors");
- mon->RegisterActorPage(actorsMonPage, "rb", "Resource broker",
- false, ctx.ExecutorThread.ActorSystem, ctx.SelfID);
- }
-
+ NActors::TMon* mon = AppData(ctx)->Mon;
+ if (mon) {
+ NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors");
+ mon->RegisterActorPage(actorsMonPage, "rb", "Resource broker",
+ false, ctx.ExecutorThread.ActorSystem, ctx.SelfID);
+ }
+
ResourceBroker = MakeIntrusive<TResourceBroker>(std::move(Config), std::move(Counters), ctx.ActorSystem());
- Become(&TThis::StateWork);
-}
-
+ Become(&TThis::StateWork);
+}
+
void TResourceBrokerActor::Handle(TEvResourceBroker::TEvSubmitTask::TPtr &ev,
const TActorContext &ctx)
-{
+{
auto error = ResourceBroker->SubmitTask(*ev->Get(), ev->Sender);
if (error) {
ctx.Send(ev->Sender, error.Release());
}
-}
-
+}
+
void TResourceBrokerActor::Handle(TEvResourceBroker::TEvUpdateTask::TPtr &ev,
const TActorContext &ctx)
-{
+{
auto error = ResourceBroker->UpdateTask(*ev->Get(), ev->Sender);
if (error) {
ctx.Send(ev->Sender, error.Release());
}
-}
-
+}
+
void TResourceBrokerActor::Handle(TEvResourceBroker::TEvUpdateTaskCookie::TPtr &ev,
const TActorContext &ctx)
-{
+{
auto error = ResourceBroker->UpdateTaskCookie(*ev->Get(), ev->Sender);
if (error) {
ctx.Send(ev->Sender, error.Release());
}
-}
-
+}
+
void TResourceBrokerActor::Handle(TEvResourceBroker::TEvRemoveTask::TPtr &ev,
const TActorContext &ctx)
-{
+{
auto error = ResourceBroker->RemoveTask(*ev->Get(), ev->Sender);
if (error) {
ctx.Send(ev->Sender, error.Release());
}
-}
-
+}
+
void TResourceBrokerActor::Handle(TEvResourceBroker::TEvFinishTask::TPtr &ev,
const TActorContext &ctx)
-{
+{
auto error = ResourceBroker->FinishTask(*ev->Get(), ev->Sender);
if (error) {
ctx.Send(ev->Sender, error.Release());
}
-}
-
+}
+
void TResourceBrokerActor::Handle(TEvResourceBroker::TEvNotifyActorDied::TPtr &ev,
const TActorContext &)
-{
+{
ResourceBroker->NotifyActorDied(*ev->Get(), ev->Sender);
-}
-
+}
+
void TResourceBrokerActor::Handle(TEvResourceBroker::TEvConfigure::TPtr &ev,
const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
- TAutoPtr<TEvResourceBroker::TEvConfigureResult> response
- = new TEvResourceBroker::TEvConfigureResult;
-
- LOG_DEBUG(ctx, NKikimrServices::RESOURCE_BROKER, "New config: %s",
+{
+ auto &rec = ev->Get()->Record;
+ TAutoPtr<TEvResourceBroker::TEvConfigureResult> response
+ = new TEvResourceBroker::TEvConfigureResult;
+
+ LOG_DEBUG(ctx, NKikimrServices::RESOURCE_BROKER, "New config: %s",
rec.ShortDebugString().data());
-
+
TSet<TString> queues;
TSet<TString> tasks;
- bool success = true;
- TString error;
- for (auto &queue : rec.GetQueues())
- queues.insert(queue.GetName());
- for (auto &task : rec.GetTasks()) {
+ bool success = true;
+ TString error;
+ for (auto &queue : rec.GetQueues())
+ queues.insert(queue.GetName());
+ for (auto &task : rec.GetTasks()) {
if (!queues.contains(task.GetQueueName())) {
error = Sprintf("task '%s' uses unknown queue '%s'", task.GetName().data(), task.GetQueueName().data());
- success = false;
- break;
- }
- tasks.insert(task.GetName());
- }
+ success = false;
+ break;
+ }
+ tasks.insert(task.GetName());
+ }
if (success && !queues.contains(NLocalDb::DefaultQueueName)) {
error = Sprintf("queue '%s' is required", NLocalDb::DefaultQueueName.c_str());
success = false;
@@ -1205,28 +1205,28 @@ void TResourceBrokerActor::Handle(TEvResourceBroker::TEvConfigure::TPtr &ev,
error = Sprintf("task '%s' is required", NLocalDb::UnknownTaskName.c_str());
success = false;
}
-
- if (!success) {
- response->Record.SetSuccess(false);
- response->Record.SetMessage(error);
+
+ if (!success) {
+ response->Record.SetSuccess(false);
+ response->Record.SetMessage(error);
} else if (!queues.contains(NLocalDb::DefaultQueueName)) {
- response->Record.SetSuccess(false);
- response->Record.SetMessage("no default queue in config");
+ response->Record.SetSuccess(false);
+ response->Record.SetMessage("no default queue in config");
} else if (!tasks.contains(NLocalDb::UnknownTaskName)) {
- response->Record.SetSuccess(false);
- response->Record.SetMessage("no unknown task in config");
- } else {
- response->Record.SetSuccess(true);
-
+ response->Record.SetSuccess(false);
+ response->Record.SetMessage("no unknown task in config");
+ } else {
+ response->Record.SetSuccess(true);
+
ResourceBroker->Configure(std::move(ev->Get()->Record));
- }
-
- LOG_DEBUG(ctx, NKikimrServices::RESOURCE_BROKER, "Configure result: %s",
+ }
+
+ LOG_DEBUG(ctx, NKikimrServices::RESOURCE_BROKER, "Configure result: %s",
response->Record.ShortDebugString().data());
-
- ctx.Send(ev->Sender, response.Release());
-}
-
+
+ ctx.Send(ev->Sender, response.Release());
+}
+
void TResourceBrokerActor::Handle(TEvResourceBroker::TEvConfigRequest::TPtr& ev, const TActorContext&)
{
auto resp = MakeHolder<TEvResourceBroker::TEvConfigResponse>();
@@ -1240,7 +1240,7 @@ void TResourceBrokerActor::Handle(TEvResourceBroker::TEvConfigRequest::TPtr& ev,
}
void TResourceBrokerActor::Handle(TEvResourceBroker::TEvResourceBrokerRequest::TPtr &ev, const TActorContext &ctx)
-{
+{
auto resp = MakeHolder<TEvResourceBroker::TEvResourceBrokerResponse>();
resp->ResourceBroker = ResourceBroker;
@@ -1249,21 +1249,21 @@ void TResourceBrokerActor::Handle(TEvResourceBroker::TEvResourceBrokerRequest::T
void TResourceBrokerActor::Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx)
{
- TStringStream str;
- HTML(str) {
- PRE() {
- str << "Current config:" << Endl
- << Config.DebugString() << Endl;
+ TStringStream str;
+ HTML(str) {
+ PRE() {
+ str << "Current config:" << Endl
+ << Config.DebugString() << Endl;
ResourceBroker->OutputState(str);
- }
- }
- ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str()));
-}
-
-NKikimrResourceBroker::TResourceBrokerConfig MakeDefaultConfig()
-{
- NKikimrResourceBroker::TResourceBrokerConfig config;
-
+ }
+ }
+ ctx.Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str()));
+}
+
+NKikimrResourceBroker::TResourceBrokerConfig MakeDefaultConfig()
+{
+ NKikimrResourceBroker::TResourceBrokerConfig config;
+
const ui64 DefaultQueueCPU = 2;
const ui64 KqpRmQueueCPU = 4;
@@ -1274,51 +1274,51 @@ NKikimrResourceBroker::TResourceBrokerConfig MakeDefaultConfig()
static_assert(KqpRmQueueMemory < TotalMemory);
- auto queue = config.AddQueues();
- queue->SetName(NLocalDb::DefaultQueueName);
- queue->SetWeight(30);
+ auto queue = config.AddQueues();
+ queue->SetName(NLocalDb::DefaultQueueName);
+ queue->SetWeight(30);
queue->MutableLimit()->SetCpu(DefaultQueueCPU);
-
- queue = config.AddQueues();
- queue->SetName("queue_compaction_gen0");
- queue->SetWeight(100);
+
+ queue = config.AddQueues();
+ queue->SetName("queue_compaction_gen0");
+ queue->SetWeight(100);
queue->MutableLimit()->SetCpu(10);
-
- queue = config.AddQueues();
- queue->SetName("queue_compaction_gen1");
- queue->SetWeight(100);
+
+ queue = config.AddQueues();
+ queue->SetName("queue_compaction_gen1");
+ queue->SetWeight(100);
queue->MutableLimit()->SetCpu(6);
-
- queue = config.AddQueues();
- queue->SetName("queue_compaction_gen2");
- queue->SetWeight(100);
+
+ queue = config.AddQueues();
+ queue->SetName("queue_compaction_gen2");
+ queue->SetWeight(100);
queue->MutableLimit()->SetCpu(3);
-
- queue = config.AddQueues();
- queue->SetName("queue_compaction_gen3");
- queue->SetWeight(100);
+
+ queue = config.AddQueues();
+ queue->SetName("queue_compaction_gen3");
+ queue->SetWeight(100);
queue->MutableLimit()->SetCpu(3);
-
- queue = config.AddQueues();
+
+ queue = config.AddQueues();
queue->SetName("queue_compaction_borrowed");
queue->SetWeight(100);
queue->MutableLimit()->SetCpu(3);
queue = config.AddQueues();
- queue->SetName("queue_transaction");
- queue->SetWeight(100);
+ queue->SetName("queue_transaction");
+ queue->SetWeight(100);
queue->MutableLimit()->SetCpu(4);
-
- queue = config.AddQueues();
- queue->SetName("queue_background_compaction");
- queue->SetWeight(10);
+
+ queue = config.AddQueues();
+ queue->SetName("queue_background_compaction");
+ queue->SetWeight(10);
queue->MutableLimit()->SetCpu(1);
-
- queue = config.AddQueues();
- queue->SetName("queue_scan");
- queue->SetWeight(100);
+
+ queue = config.AddQueues();
+ queue->SetName("queue_scan");
+ queue->SetWeight(100);
queue->MutableLimit()->SetCpu(10);
-
+
queue = config.AddQueues();
queue->SetName("queue_backup");
queue->SetWeight(100);
@@ -1340,71 +1340,71 @@ NKikimrResourceBroker::TResourceBrokerConfig MakeDefaultConfig()
queue->SetWeight(100);
queue->MutableLimit()->SetCpu(10);
- auto task = config.AddTasks();
- task->SetName(NLocalDb::UnknownTaskName);
- task->SetQueueName(NLocalDb::DefaultQueueName);
- task->SetDefaultDuration(TDuration::Minutes(1).GetValue());
-
- task = config.AddTasks();
- task->SetName(NLocalDb::LegacyQueueIdToTaskName(0));
- task->SetQueueName("queue_compaction_gen0");
- task->SetDefaultDuration(TDuration::Seconds(10).GetValue());
-
- task = config.AddTasks();
- task->SetName(NLocalDb::LegacyQueueIdToTaskName(1));
- task->SetQueueName("queue_compaction_gen1");
- task->SetDefaultDuration(TDuration::Seconds(30).GetValue());
-
- task = config.AddTasks();
- task->SetName(NLocalDb::LegacyQueueIdToTaskName(2));
- task->SetQueueName("queue_compaction_gen2");
- task->SetDefaultDuration(TDuration::Minutes(2).GetValue());
-
- task = config.AddTasks();
- task->SetName(NLocalDb::LegacyQueueIdToTaskName(3));
- task->SetQueueName("queue_compaction_gen3");
- task->SetDefaultDuration(TDuration::Minutes(10).GetValue());
-
- task = config.AddTasks();
+ auto task = config.AddTasks();
+ task->SetName(NLocalDb::UnknownTaskName);
+ task->SetQueueName(NLocalDb::DefaultQueueName);
+ task->SetDefaultDuration(TDuration::Minutes(1).GetValue());
+
+ task = config.AddTasks();
+ task->SetName(NLocalDb::LegacyQueueIdToTaskName(0));
+ task->SetQueueName("queue_compaction_gen0");
+ task->SetDefaultDuration(TDuration::Seconds(10).GetValue());
+
+ task = config.AddTasks();
+ task->SetName(NLocalDb::LegacyQueueIdToTaskName(1));
+ task->SetQueueName("queue_compaction_gen1");
+ task->SetDefaultDuration(TDuration::Seconds(30).GetValue());
+
+ task = config.AddTasks();
+ task->SetName(NLocalDb::LegacyQueueIdToTaskName(2));
+ task->SetQueueName("queue_compaction_gen2");
+ task->SetDefaultDuration(TDuration::Minutes(2).GetValue());
+
+ task = config.AddTasks();
+ task->SetName(NLocalDb::LegacyQueueIdToTaskName(3));
+ task->SetQueueName("queue_compaction_gen3");
+ task->SetDefaultDuration(TDuration::Minutes(10).GetValue());
+
+ task = config.AddTasks();
task->SetName("compaction_borrowed");
task->SetQueueName("queue_compaction_borrowed");
task->SetDefaultDuration(TDuration::Minutes(10).GetValue());
task = config.AddTasks();
- task->SetName(NLocalDb::TransactionTaskName);
- task->SetQueueName("queue_transaction");
- task->SetDefaultDuration(TDuration::Minutes(10).GetValue());
-
- task = config.AddTasks();
- task->SetName("background_compaction");
- task->SetQueueName("queue_background_compaction");
- task->SetDefaultDuration(TDuration::Minutes(1).GetValue());
-
- task = config.AddTasks();
- task->SetName("background_compaction_gen0");
- task->SetQueueName("queue_background_compaction");
- task->SetDefaultDuration(TDuration::Seconds(10).GetValue());
-
- task = config.AddTasks();
- task->SetName("background_compaction_gen1");
- task->SetQueueName("queue_background_compaction");
- task->SetDefaultDuration(TDuration::Seconds(20).GetValue());
-
- task = config.AddTasks();
- task->SetName("background_compaction_gen2");
- task->SetQueueName("queue_background_compaction");
- task->SetDefaultDuration(TDuration::Minutes(1).GetValue());
-
- task = config.AddTasks();
- task->SetName("background_compaction_gen3");
- task->SetQueueName("queue_background_compaction");
- task->SetDefaultDuration(TDuration::Minutes(5).GetValue());
-
- task = config.AddTasks();
- task->SetName(NLocalDb::ScanTaskName);
- task->SetQueueName("queue_scan");
- task->SetDefaultDuration(TDuration::Minutes(5).GetValue());
-
+ task->SetName(NLocalDb::TransactionTaskName);
+ task->SetQueueName("queue_transaction");
+ task->SetDefaultDuration(TDuration::Minutes(10).GetValue());
+
+ task = config.AddTasks();
+ task->SetName("background_compaction");
+ task->SetQueueName("queue_background_compaction");
+ task->SetDefaultDuration(TDuration::Minutes(1).GetValue());
+
+ task = config.AddTasks();
+ task->SetName("background_compaction_gen0");
+ task->SetQueueName("queue_background_compaction");
+ task->SetDefaultDuration(TDuration::Seconds(10).GetValue());
+
+ task = config.AddTasks();
+ task->SetName("background_compaction_gen1");
+ task->SetQueueName("queue_background_compaction");
+ task->SetDefaultDuration(TDuration::Seconds(20).GetValue());
+
+ task = config.AddTasks();
+ task->SetName("background_compaction_gen2");
+ task->SetQueueName("queue_background_compaction");
+ task->SetDefaultDuration(TDuration::Minutes(1).GetValue());
+
+ task = config.AddTasks();
+ task->SetName("background_compaction_gen3");
+ task->SetQueueName("queue_background_compaction");
+ task->SetDefaultDuration(TDuration::Minutes(5).GetValue());
+
+ task = config.AddTasks();
+ task->SetName(NLocalDb::ScanTaskName);
+ task->SetQueueName("queue_scan");
+ task->SetDefaultDuration(TDuration::Minutes(5).GetValue());
+
task = config.AddTasks();
task->SetName("backup");
task->SetQueueName("queue_backup");
@@ -1427,10 +1427,10 @@ NKikimrResourceBroker::TResourceBrokerConfig MakeDefaultConfig()
config.MutableResourceLimit()->SetCpu(TotalCPU);
config.MutableResourceLimit()->SetMemory(TotalMemory);
-
- return config;
-}
-
+
+ return config;
+}
+
void MergeConfigResources(
NKikimrResourceBroker::TResources &dst,
const NKikimrResourceBroker::TResources &src)
@@ -1539,29 +1539,29 @@ void MergeConfigUpdates(
IActor* CreateResourceBrokerActor(const NKikimrResourceBroker::TResourceBrokerConfig &config,
const NMonitoring::TDynamicCounterPtr &counters)
-{
+{
return new TResourceBrokerActor(config, counters);
-}
-
-
-} // NResourceBroker
-} // NKikimr
-
-Y_DECLARE_OUT_SPEC(, NKikimr::NResourceBroker::TEvResourceBroker::TStatus::ECode, stream, value) {
- switch (value) {
- case NKikimr::NResourceBroker::TEvResourceBroker::TStatus::ALREADY_EXISTS:
- stream << "ALREADY_EXISTS";
- break;
- case NKikimr::NResourceBroker::TEvResourceBroker::TStatus::UNKNOWN_TASK:
- stream << "UNKNOWN_TASK";
- break;
- case NKikimr::NResourceBroker::TEvResourceBroker::TStatus::TASK_IN_FLY:
- stream << "TASK_IN_FLY";
- break;
- case NKikimr::NResourceBroker::TEvResourceBroker::TStatus::TASK_IN_QUEUE:
- stream << "TASK_IN_QUEUE";
- break;
- default:
- stream << "<UNKNOWN_CODE>";
- }
-}
+}
+
+
+} // NResourceBroker
+} // NKikimr
+
+Y_DECLARE_OUT_SPEC(, NKikimr::NResourceBroker::TEvResourceBroker::TStatus::ECode, stream, value) {
+ switch (value) {
+ case NKikimr::NResourceBroker::TEvResourceBroker::TStatus::ALREADY_EXISTS:
+ stream << "ALREADY_EXISTS";
+ break;
+ case NKikimr::NResourceBroker::TEvResourceBroker::TStatus::UNKNOWN_TASK:
+ stream << "UNKNOWN_TASK";
+ break;
+ case NKikimr::NResourceBroker::TEvResourceBroker::TStatus::TASK_IN_FLY:
+ stream << "TASK_IN_FLY";
+ break;
+ case NKikimr::NResourceBroker::TEvResourceBroker::TStatus::TASK_IN_QUEUE:
+ stream << "TASK_IN_QUEUE";
+ break;
+ default:
+ stream << "<UNKNOWN_CODE>";
+ }
+}
diff --git a/ydb/core/tablet/resource_broker.h b/ydb/core/tablet/resource_broker.h
index e74b4550e2e..095702cc19a 100644
--- a/ydb/core/tablet/resource_broker.h
+++ b/ydb/core/tablet/resource_broker.h
@@ -1,202 +1,202 @@
-#pragma once
-
-#include "defs.h"
-
+#pragma once
+
+#include "defs.h"
+
#include <ydb/core/protos/resource_broker.pb.h>
-
+
#include <library/cpp/actors/core/defs.h>
#include <library/cpp/actors/core/actor.h>
#include <library/cpp/actors/core/event.h>
#include <library/cpp/monlib/dynamic_counters/counters.h>
-
-#include <array>
-
-namespace NKikimr {
-namespace NResourceBroker {
-
-constexpr size_t LAST_RESOURCE = NKikimrResourceBroker::MEMORY;
-constexpr size_t RESOURCE_COUNT = LAST_RESOURCE + 1;
-
+
+#include <array>
+
+namespace NKikimr {
+namespace NResourceBroker {
+
+constexpr size_t LAST_RESOURCE = NKikimrResourceBroker::MEMORY;
+constexpr size_t RESOURCE_COUNT = LAST_RESOURCE + 1;
+
inline TActorId MakeResourceBrokerID(ui32 node = 0) {
- char x[12] = {'r','e','s','o','u','r','c','e','b','r','o','k'};
+ char x[12] = {'r','e','s','o','u','r','c','e','b','r','o','k'};
return TActorId(node, TStringBuf(x, 12));
-}
-
-using TResourceValues = std::array<ui64, RESOURCE_COUNT>;
-
+}
+
+using TResourceValues = std::array<ui64, RESOURCE_COUNT>;
+
class IResourceBroker;
-struct TEvResourceBroker {
- enum EEv {
- EvSubmitTask = EventSpaceBegin(TKikimrEvents::ES_RESOURCE_BROKER),
- EvUpdateTask,
- EvUpdateTaskCookie,
- EvRemoveTask,
- EvFinishTask,
- EvNotifyActorDied,
- EvConfigure,
+struct TEvResourceBroker {
+ enum EEv {
+ EvSubmitTask = EventSpaceBegin(TKikimrEvents::ES_RESOURCE_BROKER),
+ EvUpdateTask,
+ EvUpdateTaskCookie,
+ EvRemoveTask,
+ EvFinishTask,
+ EvNotifyActorDied,
+ EvConfigure,
EvConfigRequest,
EvTaskRemoved,
EvResourceBrokerRequest,
-
- EvTaskOperationError = EvSubmitTask + 512,
- EvResourceAllocated,
+
+ EvTaskOperationError = EvSubmitTask + 512,
+ EvResourceAllocated,
EvConfigureResult,
EvConfigResponse,
EvResourceBrokerResponse
- };
-
+ };
+
static_assert(EvResourceBrokerRequest < EvTaskOperationError);
- struct TTask {
- /**
- * 0 is invalid task ID value and is used to choose task ID
- * by Resource Broker (which makes it impossible to manage
- * submitted task).
- */
- ui64 TaskId;
- TString Name;
- TResourceValues RequiredResources;
- TString Type;
- ui64 Priority;
- TIntrusivePtr<TThrRefBase> Cookie;
- };
-
- struct TEvSubmitTask : public TEventLocal<TEvSubmitTask, EvSubmitTask> {
- TTask Task;
-
- TEvSubmitTask(ui64 taskId, const TString &name, const TResourceValues &resources,
- const TString &type, ui64 priority, TIntrusivePtr<TThrRefBase> cookie)
- {
- Task.TaskId = taskId;
- Task.Name = name;
- Task.RequiredResources = resources;
- Task.Type = type;
- Task.Priority = priority;
- Task.Cookie = cookie;
- }
-
- /**
- * Task ID is chosen by Resource Broker and client will get it only
- * after resource allocation.
- */
- TEvSubmitTask(const TString &name, const TResourceValues &resources,
- const TString &type, ui64 priority, TIntrusivePtr<TThrRefBase> cookie)
- {
- Task.TaskId = 0;
- Task.Name = name;
- Task.RequiredResources = resources;
- Task.Type = type;
- Task.Priority = priority;
- Task.Cookie = cookie;
- }
- };
-
- struct TStatus {
- enum ECode {
- // Cannot submit task with already used ID.
- ALREADY_EXISTS,
- // Cannot update/remove/finish task with unknown ID.
- UNKNOWN_TASK,
- // Cannot remove task in-fly.
- TASK_IN_FLY,
- // Cannot finish task which is still in queue.
- TASK_IN_QUEUE
- };
-
- ECode Code;
- TString Message;
- };
-
- struct TEvTaskOperationError : public TEventLocal<TEvTaskOperationError, EvTaskOperationError> {
- ui64 TaskId;
- TStatus Status;
- TIntrusivePtr<TThrRefBase> Cookie;
- };
-
- struct TEvUpdateTask : public TEventLocal<TEvUpdateTask, EvUpdateTask> {
- ui64 TaskId;
- TResourceValues RequiredResources;
- TString Type;
- ui64 Priority;
- bool Resubmit;
-
- TEvUpdateTask(ui64 taskId, const TResourceValues &requiredResources,
- const TString &type, ui64 priority, bool resubmit = false)
- : TaskId(taskId)
- , RequiredResources(requiredResources)
- , Type(type)
- , Priority(priority)
- , Resubmit(resubmit)
- {
- Y_VERIFY(taskId);
- }
- };
-
- struct TEvUpdateTaskCookie : public TEventLocal<TEvUpdateTaskCookie, EvUpdateTaskCookie> {
- ui64 TaskId;
- TIntrusivePtr<TThrRefBase> Cookie;
-
- TEvUpdateTaskCookie(ui64 taskId, TIntrusivePtr<TThrRefBase> cookie)
- : TaskId(taskId)
- , Cookie(cookie)
- {
- Y_VERIFY(taskId);
- }
- };
-
- struct TEvRemoveTask : public TEventLocal<TEvRemoveTask, EvRemoveTask> {
- ui64 TaskId;
+ struct TTask {
+ /**
+ * 0 is invalid task ID value and is used to choose task ID
+ * by Resource Broker (which makes it impossible to manage
+ * submitted task).
+ */
+ ui64 TaskId;
+ TString Name;
+ TResourceValues RequiredResources;
+ TString Type;
+ ui64 Priority;
+ TIntrusivePtr<TThrRefBase> Cookie;
+ };
+
+ struct TEvSubmitTask : public TEventLocal<TEvSubmitTask, EvSubmitTask> {
+ TTask Task;
+
+ TEvSubmitTask(ui64 taskId, const TString &name, const TResourceValues &resources,
+ const TString &type, ui64 priority, TIntrusivePtr<TThrRefBase> cookie)
+ {
+ Task.TaskId = taskId;
+ Task.Name = name;
+ Task.RequiredResources = resources;
+ Task.Type = type;
+ Task.Priority = priority;
+ Task.Cookie = cookie;
+ }
+
+ /**
+ * Task ID is chosen by Resource Broker and client will get it only
+ * after resource allocation.
+ */
+ TEvSubmitTask(const TString &name, const TResourceValues &resources,
+ const TString &type, ui64 priority, TIntrusivePtr<TThrRefBase> cookie)
+ {
+ Task.TaskId = 0;
+ Task.Name = name;
+ Task.RequiredResources = resources;
+ Task.Type = type;
+ Task.Priority = priority;
+ Task.Cookie = cookie;
+ }
+ };
+
+ struct TStatus {
+ enum ECode {
+ // Cannot submit task with already used ID.
+ ALREADY_EXISTS,
+ // Cannot update/remove/finish task with unknown ID.
+ UNKNOWN_TASK,
+ // Cannot remove task in-fly.
+ TASK_IN_FLY,
+ // Cannot finish task which is still in queue.
+ TASK_IN_QUEUE
+ };
+
+ ECode Code;
+ TString Message;
+ };
+
+ struct TEvTaskOperationError : public TEventLocal<TEvTaskOperationError, EvTaskOperationError> {
+ ui64 TaskId;
+ TStatus Status;
+ TIntrusivePtr<TThrRefBase> Cookie;
+ };
+
+ struct TEvUpdateTask : public TEventLocal<TEvUpdateTask, EvUpdateTask> {
+ ui64 TaskId;
+ TResourceValues RequiredResources;
+ TString Type;
+ ui64 Priority;
+ bool Resubmit;
+
+ TEvUpdateTask(ui64 taskId, const TResourceValues &requiredResources,
+ const TString &type, ui64 priority, bool resubmit = false)
+ : TaskId(taskId)
+ , RequiredResources(requiredResources)
+ , Type(type)
+ , Priority(priority)
+ , Resubmit(resubmit)
+ {
+ Y_VERIFY(taskId);
+ }
+ };
+
+ struct TEvUpdateTaskCookie : public TEventLocal<TEvUpdateTaskCookie, EvUpdateTaskCookie> {
+ ui64 TaskId;
+ TIntrusivePtr<TThrRefBase> Cookie;
+
+ TEvUpdateTaskCookie(ui64 taskId, TIntrusivePtr<TThrRefBase> cookie)
+ : TaskId(taskId)
+ , Cookie(cookie)
+ {
+ Y_VERIFY(taskId);
+ }
+ };
+
+ struct TEvRemoveTask : public TEventLocal<TEvRemoveTask, EvRemoveTask> {
+ ui64 TaskId;
bool ReplyOnSuccess;
-
+
TEvRemoveTask(ui64 taskId, bool replyOnSuccess = false)
- : TaskId(taskId)
+ : TaskId(taskId)
, ReplyOnSuccess(replyOnSuccess)
- {
- Y_VERIFY(taskId);
- }
- };
-
+ {
+ Y_VERIFY(taskId);
+ }
+ };
+
struct TEvTaskRemoved : public TEventLocal<TEvTaskRemoved, EvTaskRemoved> {
ui64 TaskId;
TIntrusivePtr<TThrRefBase> Cookie;
};
- struct TEvFinishTask : public TEventLocal<TEvFinishTask, EvFinishTask> {
- ui64 TaskId;
- bool Cancel;
-
- TEvFinishTask(ui64 taskId, bool cancel = false)
- : TaskId(taskId)
- , Cancel(cancel)
- {
- Y_VERIFY(taskId);
- }
- };
-
- struct TEvNotifyActorDied : public TEventLocal<TEvNotifyActorDied, EvNotifyActorDied> {
- };
-
- struct TEvResourceAllocated : public TEventLocal<TEvResourceAllocated, EvResourceAllocated> {
- ui64 TaskId;
- TIntrusivePtr<TThrRefBase> Cookie;
-
- TEvResourceAllocated(ui64 taskId, TIntrusivePtr<TThrRefBase> cookie)
- : TaskId(taskId)
- , Cookie(cookie)
- {
- }
- };
-
- struct TEvConfigure : public TEventPB<TEvConfigure,
- NKikimrResourceBroker::TResourceBrokerConfig,
- EvConfigure> {
- };
-
- struct TEvConfigureResult : public TEventPB<TEvConfigureResult,
- NKikimrResourceBroker::TResourceBrokerConfigResult,
- EvConfigureResult> {
- };
+ struct TEvFinishTask : public TEventLocal<TEvFinishTask, EvFinishTask> {
+ ui64 TaskId;
+ bool Cancel;
+
+ TEvFinishTask(ui64 taskId, bool cancel = false)
+ : TaskId(taskId)
+ , Cancel(cancel)
+ {
+ Y_VERIFY(taskId);
+ }
+ };
+
+ struct TEvNotifyActorDied : public TEventLocal<TEvNotifyActorDied, EvNotifyActorDied> {
+ };
+
+ struct TEvResourceAllocated : public TEventLocal<TEvResourceAllocated, EvResourceAllocated> {
+ ui64 TaskId;
+ TIntrusivePtr<TThrRefBase> Cookie;
+
+ TEvResourceAllocated(ui64 taskId, TIntrusivePtr<TThrRefBase> cookie)
+ : TaskId(taskId)
+ , Cookie(cookie)
+ {
+ }
+ };
+
+ struct TEvConfigure : public TEventPB<TEvConfigure,
+ NKikimrResourceBroker::TResourceBrokerConfig,
+ EvConfigure> {
+ };
+
+ struct TEvConfigureResult : public TEventPB<TEvConfigureResult,
+ NKikimrResourceBroker::TResourceBrokerConfigResult,
+ EvConfigureResult> {
+ };
struct TEvConfigRequest : public TEventLocal<TEvConfigRequest, EvConfigRequest> {
TString Queue;
@@ -214,8 +214,8 @@ struct TEvResourceBroker {
struct TEvResourceBrokerResponse : public TEventLocal<TEvResourceBrokerResponse, EvResourceBrokerResponse> {
TIntrusivePtr<IResourceBroker> ResourceBroker;
};
-};
-
+};
+
class IResourceBroker : public TThrRefBase {
public:
virtual bool SubmitTaskInstant(const TEvResourceBroker::TEvSubmitTask &ev, const TActorId &sender) = 0;
@@ -228,13 +228,13 @@ public:
virtual bool ReduceTaskResourcesInstant(ui64 taskId, const TResourceValues& reduceBy, const TActorId& sender) = 0;
};
-NKikimrResourceBroker::TResourceBrokerConfig MakeDefaultConfig();
-
+NKikimrResourceBroker::TResourceBrokerConfig MakeDefaultConfig();
+
void MergeConfigUpdates(NKikimrResourceBroker::TResourceBrokerConfig &config,
const NKikimrResourceBroker::TResourceBrokerConfig &updates);
IActor* CreateResourceBrokerActor(const NKikimrResourceBroker::TResourceBrokerConfig &config,
const NMonitoring::TDynamicCounterPtr& counters);
-
-} // NResourceBroker
-} // NKikimr
+
+} // NResourceBroker
+} // NKikimr
diff --git a/ydb/core/tablet/resource_broker_impl.h b/ydb/core/tablet/resource_broker_impl.h
index cf198333970..2c781692f60 100644
--- a/ydb/core/tablet/resource_broker_impl.h
+++ b/ydb/core/tablet/resource_broker_impl.h
@@ -1,60 +1,60 @@
-#pragma once
-
-#include "resource_broker.h"
-
+#pragma once
+
+#include "resource_broker.h"
+
#include <ydb/core/mon/mon.h>
#include <ydb/core/base/appdata.h>
-
+
#include <library/cpp/actors/core/hfunc.h>
-
-#include <util/generic/ptr.h>
-#include <util/generic/set.h>
-
-namespace NKikimr {
-namespace NResourceBroker {
-
-class TResourceQueue;
-using TResourceQueuePtr = TIntrusivePtr<TResourceQueue>;
-class TTaskQueue;
-using TTaskQueuePtr = TIntrusivePtr<TTaskQueue>;
-class TTaskCounters;
-using TTaskCountersPtr = TIntrusivePtr<TTaskCounters>;
-
-/**
- * Resource limit class. Limits are attached to queues to limit resource
- * consumption within a single queue. Also used to track total resource
- * consumption.
- */
-class TResourceLimit : public TThrRefBase {
-public:
- TResourceLimit(const NKikimrResourceBroker::TResources &limit);
-
- bool HasResources(const TResourceValues &values) const;
- void HoldResources(const TResourceValues &values);
- void ReleaseResources(const TResourceValues &values);
-
-public:
- TResourceValues Limit;
- TResourceValues Used;
-};
-using TResourceLimitPtr = TIntrusivePtr<TResourceLimit>;
-using TResourceLimitConstPtr = TIntrusiveConstPtr<TResourceLimit>;
-
-/**
- * Class to describe task submitted to scheduler.
- */
-class TTask : public TThrRefBase,
- public TEvResourceBroker::TTask {
-public:
+
+#include <util/generic/ptr.h>
+#include <util/generic/set.h>
+
+namespace NKikimr {
+namespace NResourceBroker {
+
+class TResourceQueue;
+using TResourceQueuePtr = TIntrusivePtr<TResourceQueue>;
+class TTaskQueue;
+using TTaskQueuePtr = TIntrusivePtr<TTaskQueue>;
+class TTaskCounters;
+using TTaskCountersPtr = TIntrusivePtr<TTaskCounters>;
+
+/**
+ * Resource limit class. Limits are attached to queues to limit resource
+ * consumption within a single queue. Also used to track total resource
+ * consumption.
+ */
+class TResourceLimit : public TThrRefBase {
+public:
+ TResourceLimit(const NKikimrResourceBroker::TResources &limit);
+
+ bool HasResources(const TResourceValues &values) const;
+ void HoldResources(const TResourceValues &values);
+ void ReleaseResources(const TResourceValues &values);
+
+public:
+ TResourceValues Limit;
+ TResourceValues Used;
+};
+using TResourceLimitPtr = TIntrusivePtr<TResourceLimit>;
+using TResourceLimitConstPtr = TIntrusiveConstPtr<TResourceLimit>;
+
+/**
+ * Class to describe task submitted to scheduler.
+ */
+class TTask : public TThrRefBase,
+ public TEvResourceBroker::TTask {
+public:
TTask(const TEvResourceBroker::TTask &task, const TActorId &client,
- TInstant timestamp, TTaskCountersPtr counters);
-
- // Get string with task's name, ID and client info.
- TString GetIdString() const;
-
- // Debug print of current state into specified stream.
- void OutputState(IOutputStream &os, const TString &prefix) const;
-
+ TInstant timestamp, TTaskCountersPtr counters);
+
+ // Get string with task's name, ID and client info.
+ TString GetIdString() const;
+
+ // Debug print of current state into specified stream.
+ void OutputState(IOutputStream &os, const TString &prefix) const;
+
// Returns the mask of required resources
ui64 GetRequiredResourcesMask() const {
ui64 mask = 0;
@@ -66,260 +66,260 @@ public:
return mask;
}
-public:
- // Actor which submitted task.
+public:
+ // Actor which submitted task.
TActorId Client;
- // Task queue task is currently attached to.
- TTaskQueuePtr Queue;
- // True if task has allocated resources.
- bool InFly;
- // When task was submitted.
- TInstant SubmitTime;
- // When task got resources.
- TInstant StartTime;
- // When task is is supposed to finish.
- TInstant FinishTime;
- // Task name used for logs.
- TString IdString;
- // Counters affected by task.
- TTaskCountersPtr Counters;
-};
-using TTaskPtr = TIntrusivePtr<TTask>;
-
-/**
- * Class to hold common counters tracked per queue and per task type.
- */
-class TBaseCounters : public TThrRefBase {
-public:
- TBaseCounters() = default;
- TBaseCounters(const NMonitoring::TDynamicCounterPtr &counters);
- TBaseCounters(const TBaseCounters &other) = default;
- TBaseCounters(TBaseCounters &&other) = default;
-
- TBaseCounters &operator=(const TBaseCounters &other) = default;
- TBaseCounters &operator=(TBaseCounters &&other) = default;
-
- void HoldResources(const TResourceValues &values);
- void ReleaseResources(const TResourceValues &values);
-
-public:
- std::array<NMonitoring::TDynamicCounters::TCounterPtr, RESOURCE_COUNT> Consumption;
- NMonitoring::TDynamicCounters::TCounterPtr FinishedTasks;
- NMonitoring::TDynamicCounters::TCounterPtr EnqueuedTasks;
- NMonitoring::TDynamicCounters::TCounterPtr InFlyTasks;
-};
-
-/**
- * Class to hold counters tracked per queue. Also used to track total counters.
- */
-class TQueueCounters : public TBaseCounters {
-public:
- TQueueCounters(const NMonitoring::TDynamicCounterPtr &counters);
-};
-using TQueueCountersPtr = TIntrusivePtr<TQueueCounters>;
-
-/**
- * Class to hold counters tracked per task type.
- */
-class TTaskCounters : public TBaseCounters {
-public:
- TTaskCounters() = default;
- TTaskCounters(const NMonitoring::TDynamicCounterPtr &counters);
- TTaskCounters(const TTaskCounters &other) = default;
- TTaskCounters(TTaskCounters &&other) = default;
-
- TTaskCounters &operator=(const TTaskCounters &other) = default;
- TTaskCounters &operator=(TTaskCounters &&other) = default;
-};
-
-/**
- * Class to hold duration statistics used to track average execution
- * time for tasks.
- */
-class TDurationStat {
-public:
- TDurationStat(TDuration def, size_t history);
- TDurationStat(const TDurationStat &other) = default;
- TDurationStat(TDurationStat &&other) = default;
-
- TDurationStat &operator=(const TDurationStat &other) = default;
- TDurationStat &operator=(TDurationStat &&other) = default;
-
- void Add(TDuration duration);
-
- TDuration GetAverage() const;
-
-private:
+ // Task queue task is currently attached to.
+ TTaskQueuePtr Queue;
+ // True if task has allocated resources.
+ bool InFly;
+ // When task was submitted.
+ TInstant SubmitTime;
+ // When task got resources.
+ TInstant StartTime;
+ // When task is is supposed to finish.
+ TInstant FinishTime;
+ // Task name used for logs.
+ TString IdString;
+ // Counters affected by task.
+ TTaskCountersPtr Counters;
+};
+using TTaskPtr = TIntrusivePtr<TTask>;
+
+/**
+ * Class to hold common counters tracked per queue and per task type.
+ */
+class TBaseCounters : public TThrRefBase {
+public:
+ TBaseCounters() = default;
+ TBaseCounters(const NMonitoring::TDynamicCounterPtr &counters);
+ TBaseCounters(const TBaseCounters &other) = default;
+ TBaseCounters(TBaseCounters &&other) = default;
+
+ TBaseCounters &operator=(const TBaseCounters &other) = default;
+ TBaseCounters &operator=(TBaseCounters &&other) = default;
+
+ void HoldResources(const TResourceValues &values);
+ void ReleaseResources(const TResourceValues &values);
+
+public:
+ std::array<NMonitoring::TDynamicCounters::TCounterPtr, RESOURCE_COUNT> Consumption;
+ NMonitoring::TDynamicCounters::TCounterPtr FinishedTasks;
+ NMonitoring::TDynamicCounters::TCounterPtr EnqueuedTasks;
+ NMonitoring::TDynamicCounters::TCounterPtr InFlyTasks;
+};
+
+/**
+ * Class to hold counters tracked per queue. Also used to track total counters.
+ */
+class TQueueCounters : public TBaseCounters {
+public:
+ TQueueCounters(const NMonitoring::TDynamicCounterPtr &counters);
+};
+using TQueueCountersPtr = TIntrusivePtr<TQueueCounters>;
+
+/**
+ * Class to hold counters tracked per task type.
+ */
+class TTaskCounters : public TBaseCounters {
+public:
+ TTaskCounters() = default;
+ TTaskCounters(const NMonitoring::TDynamicCounterPtr &counters);
+ TTaskCounters(const TTaskCounters &other) = default;
+ TTaskCounters(TTaskCounters &&other) = default;
+
+ TTaskCounters &operator=(const TTaskCounters &other) = default;
+ TTaskCounters &operator=(TTaskCounters &&other) = default;
+};
+
+/**
+ * Class to hold duration statistics used to track average execution
+ * time for tasks.
+ */
+class TDurationStat {
+public:
+ TDurationStat(TDuration def, size_t history);
+ TDurationStat(const TDurationStat &other) = default;
+ TDurationStat(TDurationStat &&other) = default;
+
+ TDurationStat &operator=(const TDurationStat &other) = default;
+ TDurationStat &operator=(TDurationStat &&other) = default;
+
+ void Add(TDuration duration);
+
+ TDuration GetAverage() const;
+
+private:
TVector<TDuration> Values;
- size_t Current;
- TDuration Total;
-};
-
-/**
- * Queue of scheduled tasks. Primary tasks order is specified by their priority
- * (lower priority value means earlier execution). Secondary tasks order is
- * specified by timestamp (FIFO).
- *
- * Tasks are stored in a heap. Heap is modified only when tasks are inserted
- * and removed from the heap. Therefore task modification should be done only
- * after removal from its queue (possibly with following insertion back).
- *
- * Each queue has attached resource limit usage, reference to total resource
- * usage limit, queue counters and total counters. Queue reflects its tasks
- * state and resource usage in all limits and counters attached to queue and
- * tasks.
- *
- * References to in-fly tasks are not stored in tasks queue but such tasks
- * still should be attached to queue using InsertTask method to get correct
- * counters, limits and usage work. Therefore resource allocation for task
- * is done in several steps:
- * queue->PopTask();
- * set task->InFly;
- * set task->StartTime;
- * set task->FinishTime; (estimated)
- * queue->InsertTask(task)
- * When InFly task is attached to queue planned resource usage is updated
- * according to resources and execution time required by the task.
- *
- * Planned resource usage is the first parameter used to schedule resource
- * allocation. Planned resource usage is modified on task insertion as
- * Up += Rd * Te / W
- * where
- * W - Queue weight.
- * Te - Estimated task execution time. Execution time is estimated basing
- * execution statistics for tasks of the same type.
- * Rd - Dominant component of task's required resources. Dominant component
- * is computed according to current queue resource consumption and total
- * available resources (find max used[RES]/total[RES]).
- *
- * Planned resource usage is corrected in case task execution is finished before
- * its estimated FinishTime.
- *
- * Real resource usage is the second parameter used to schedule resource
- * allocation. It is computed before each queue resource consumption modification
+ size_t Current;
+ TDuration Total;
+};
+
+/**
+ * Queue of scheduled tasks. Primary tasks order is specified by their priority
+ * (lower priority value means earlier execution). Secondary tasks order is
+ * specified by timestamp (FIFO).
+ *
+ * Tasks are stored in a heap. Heap is modified only when tasks are inserted
+ * and removed from the heap. Therefore task modification should be done only
+ * after removal from its queue (possibly with following insertion back).
+ *
+ * Each queue has attached resource limit usage, reference to total resource
+ * usage limit, queue counters and total counters. Queue reflects its tasks
+ * state and resource usage in all limits and counters attached to queue and
+ * tasks.
+ *
+ * References to in-fly tasks are not stored in tasks queue but such tasks
+ * still should be attached to queue using InsertTask method to get correct
+ * counters, limits and usage work. Therefore resource allocation for task
+ * is done in several steps:
+ * queue->PopTask();
+ * set task->InFly;
+ * set task->StartTime;
+ * set task->FinishTime; (estimated)
+ * queue->InsertTask(task)
+ * When InFly task is attached to queue planned resource usage is updated
+ * according to resources and execution time required by the task.
+ *
+ * Planned resource usage is the first parameter used to schedule resource
+ * allocation. Planned resource usage is modified on task insertion as
+ * Up += Rd * Te / W
+ * where
+ * W - Queue weight.
+ * Te - Estimated task execution time. Execution time is estimated basing
+ * execution statistics for tasks of the same type.
+ * Rd - Dominant component of task's required resources. Dominant component
+ * is computed according to current queue resource consumption and total
+ * available resources (find max used[RES]/total[RES]).
+ *
+ * Planned resource usage is corrected in case task execution is finished before
+ * its estimated FinishTime.
+ *
+ * Real resource usage is the second parameter used to schedule resource
+ * allocation. It is computed before each queue resource consumption modification
* and also may be additionally re-computed before choosing the next task by
- * scheduler.
- *
- * Real resource usage may exceed planned one. Therefore max of these two components
- * is used when queue with the most/least usage is chosen. Also planned resource
- * usage must be corrected before modifications:
- * Up_new = Max(Up_old, Ur_old) + Rd * Te / W
- */
-class TTaskQueue : public TThrRefBase {
-private:
- struct TTaskEarlier {
- bool operator()(const TTaskPtr &l, const TTaskPtr &r) const;
- };
-
-public:
- TTaskQueue(const NKikimrResourceBroker::TQueueConfig &config,
- const NMonitoring::TDynamicCounterPtr &counters,
- TResourceLimitPtr totalLimit, TQueueCountersPtr totalCounters);
-
- /**
- * Return true if there are no queued tasks.
- * There still might be tasks in-fly.
- */
- bool Empty() const;
-
- void InsertTask(TTaskPtr task, TInstant now);
- void EraseTask(TTaskPtr task, bool finished, TInstant now);
-
- TTaskPtr FrontTask();
- void PopTask();
-
- void UpdateRealResourceUsage(TInstant now);
-
- // Debug print of current state into specified stream.
- void OutputState(IOutputStream &os, const TString &prefix) const;
-
-private:
- void HoldResources(TTaskPtr task);
- void ReleaseResources(TTaskPtr task);
-
- void UpdatePlannedResourceUsage(TTaskPtr task, TInstant now, bool decrease);
-
- double GetDominantResourceComponentNormalized(const TResourceValues &values);
-
-public:
- TString Name;
- ui32 Weight;
+ * scheduler.
+ *
+ * Real resource usage may exceed planned one. Therefore max of these two components
+ * is used when queue with the most/least usage is chosen. Also planned resource
+ * usage must be corrected before modifications:
+ * Up_new = Max(Up_old, Ur_old) + Rd * Te / W
+ */
+class TTaskQueue : public TThrRefBase {
+private:
+ struct TTaskEarlier {
+ bool operator()(const TTaskPtr &l, const TTaskPtr &r) const;
+ };
+
+public:
+ TTaskQueue(const NKikimrResourceBroker::TQueueConfig &config,
+ const NMonitoring::TDynamicCounterPtr &counters,
+ TResourceLimitPtr totalLimit, TQueueCountersPtr totalCounters);
+
+ /**
+ * Return true if there are no queued tasks.
+ * There still might be tasks in-fly.
+ */
+ bool Empty() const;
+
+ void InsertTask(TTaskPtr task, TInstant now);
+ void EraseTask(TTaskPtr task, bool finished, TInstant now);
+
+ TTaskPtr FrontTask();
+ void PopTask();
+
+ void UpdateRealResourceUsage(TInstant now);
+
+ // Debug print of current state into specified stream.
+ void OutputState(IOutputStream &os, const TString &prefix) const;
+
+private:
+ void HoldResources(TTaskPtr task);
+ void ReleaseResources(TTaskPtr task);
+
+ void UpdatePlannedResourceUsage(TTaskPtr task, TInstant now, bool decrease);
+
+ double GetDominantResourceComponentNormalized(const TResourceValues &values);
+
+public:
+ TString Name;
+ ui32 Weight;
TSet<TTaskPtr, TTaskEarlier> Tasks;
- TResourceLimit QueueLimit;
- TResourceLimitPtr TotalLimit;
- double RealResourceUsage;
- double PlannedResourceUsage;
- // When real resource usage was updated last time.
- TInstant UsageTimestamp;
- TQueueCounters QueueCounters;
- TQueueCountersPtr TotalCounters;
-};
-
-/**
- * Scheduler class manages tasks and queues. It directly communicates clients
+ TResourceLimit QueueLimit;
+ TResourceLimitPtr TotalLimit;
+ double RealResourceUsage;
+ double PlannedResourceUsage;
+ // When real resource usage was updated last time.
+ TInstant UsageTimestamp;
+ TQueueCounters QueueCounters;
+ TQueueCountersPtr TotalCounters;
+};
+
+/**
+ * Scheduler class manages tasks and queues. It directly communicates clients
* in case of an error or successful resource allocation.
- *
- * Task submission/update/removal doesn't cause resource allocation. ScheduleTasks
+ *
+ * Task submission/update/removal doesn't cause resource allocation. ScheduleTasks
* method should be called to trigger resource allocation.
- *
- * Before next task allocation scheduler simply orders non-empty queues according
- * to their resource usage and pick the top task of the first queue. If chosen
+ *
+ * Before next task allocation scheduler simply orders non-empty queues according
+ * to their resource usage and pick the top task of the first queue. If chosen
* task cannot be run because of total resource limit then resource allocation
- * stops. If we have resources but queue's limit doesn't allow to chosen task
- * then this queue is skipped.
- *
- * Queue's limit may be ignored in case it has no tasks running. Total limit
- * may be ignored in case there are no running tasks at all.
- *
- * When task is submitted into an empty queue we need to fix-up its resource
- * usage. It's required to avoid big differences between resource usages of
- * different queues caused by idle time of one of them. It's done by simply
- * increasing idle queue real resource usage up to minimal real resource usage
- * of non-idle queues.
- */
-class TScheduler {
-private:
- struct TTaskQueueLess {
- bool operator()(const TTaskQueuePtr &l, const TTaskQueuePtr &r) const;
- };
-
- class TTaskConfig {
- public:
- TTaskConfig(const TString &name, TDuration defaultDuration,
- TTaskCountersPtr counters);
- TTaskConfig(const TTaskConfig &other) = default;
- TTaskConfig(TTaskConfig &&other) = default;
-
- TTaskConfig &operator=(const TTaskConfig &other) = default;
- TTaskConfig &operator=(TTaskConfig &&other) = default;
-
- public:
- TString Name;
- TTaskQueuePtr Queue;
- TDurationStat ExecTime;
- TTaskCountersPtr Counters;
- };
-
-public:
- TScheduler(const NMonitoring::TDynamicCounterPtr &counters);
- ~TScheduler();
-
- /**
+ * stops. If we have resources but queue's limit doesn't allow to chosen task
+ * then this queue is skipped.
+ *
+ * Queue's limit may be ignored in case it has no tasks running. Total limit
+ * may be ignored in case there are no running tasks at all.
+ *
+ * When task is submitted into an empty queue we need to fix-up its resource
+ * usage. It's required to avoid big differences between resource usages of
+ * different queues caused by idle time of one of them. It's done by simply
+ * increasing idle queue real resource usage up to minimal real resource usage
+ * of non-idle queues.
+ */
+class TScheduler {
+private:
+ struct TTaskQueueLess {
+ bool operator()(const TTaskQueuePtr &l, const TTaskQueuePtr &r) const;
+ };
+
+ class TTaskConfig {
+ public:
+ TTaskConfig(const TString &name, TDuration defaultDuration,
+ TTaskCountersPtr counters);
+ TTaskConfig(const TTaskConfig &other) = default;
+ TTaskConfig(TTaskConfig &&other) = default;
+
+ TTaskConfig &operator=(const TTaskConfig &other) = default;
+ TTaskConfig &operator=(TTaskConfig &&other) = default;
+
+ public:
+ TString Name;
+ TTaskQueuePtr Queue;
+ TDurationStat ExecTime;
+ TTaskCountersPtr Counters;
+ };
+
+public:
+ TScheduler(const NMonitoring::TDynamicCounterPtr &counters);
+ ~TScheduler();
+
+ /**
* Returns TTask raw pointer if it exists.
- */
+ */
const TTask* FindTask(ui64 taskId, const TActorId &client) const;
- /**
+ /**
* Create new task and queue it. Return true on success, and false if task with the same id already exists.
- */
+ */
bool SubmitTask(const TEvResourceBroker::TTask &task, const TActorId &client, const TActorSystem &as);
/**
* Update queued task. Return true on success and false if task not found.
*/
bool UpdateTask(ui64 taskId, const TActorId &client, const TResourceValues &requiredResources,
ui64 priority, const TString &type, bool resubmit, const TActorSystem &as);
- /**
+ /**
* Update cookie for submitted task. Return true on success and false if task not found.
- */
+ */
bool UpdateTaskCookie(ui64 taskId, const TActorId &client, TIntrusivePtr<TThrRefBase> cookie,
const TActorSystem &as);
@@ -331,78 +331,78 @@ public:
: Success(success), Task(task) {}
};
- /**
+ /**
* Remove queued task. Return <true, task> on success, and <false, task> otherwise.
- */
+ */
TTerminateTaskResult RemoveQueuedTask(ui64 taskId, const TActorId &client, const TActorSystem &as);
- /**
+ /**
* Finish/cancel task and release its resources. Return <true, task> on success, and <false, task> otherwise.
- */
+ */
TTerminateTaskResult FinishTask(ui64 taskId, const TActorId &client, bool cancel, const TActorSystem &as);
- /**
- * Remove queued tasks and finish in-fly tasks submitted by specified client.
- * Return true if any task was affected.
- */
+ /**
+ * Remove queued tasks and finish in-fly tasks submitted by specified client.
+ * Return true if any task was affected.
+ */
bool RemoveTasks(const TActorId &client, const TActorSystem &as);
- /**
- * Try to allocate resources for next tasks until we are out of resources or tasks.
- */
+ /**
+ * Try to allocate resources for next tasks until we are out of resources or tasks.
+ */
void ScheduleTasks(const TActorSystem &as, std::function<void(const TTask &task)> &&onTaskSchedule);
-
- /**
- * Build or reconfigure queues and limits according to new config. Config should
- * have at least one queue and one task type configuration (default queue and
- * unknown task). On re-configuration tasks may migrate between queues according
- * to new mapping.
- */
+
+ /**
+ * Build or reconfigure queues and limits according to new config. Config should
+ * have at least one queue and one task type configuration (default queue and
+ * unknown task). On re-configuration tasks may migrate between queues according
+ * to new mapping.
+ */
void Configure(const NKikimrResourceBroker::TResourceBrokerConfig &config, const TActorSystem &as);
-
- /**
- * Update current scheduler time which is used for all resource consumption
- * computations.
- */
- void UpdateTime(TInstant now);
-
- // Debug print of current state into specified stream.
- void OutputState(IOutputStream &os) const;
-
-private:
- // Erase task from all structure.
+
+ /**
+ * Update current scheduler time which is used for all resource consumption
+ * computations.
+ */
+ void UpdateTime(TInstant now);
+
+ // Debug print of current state into specified stream.
+ void OutputState(IOutputStream &os) const;
+
+private:
+ // Erase task from all structure.
void EraseTask(TTaskPtr task, bool finished, const TActorSystem &as);
- // Update resource usage for all queues.
+ // Update resource usage for all queues.
void UpdateResourceUsage(const TActorSystem &as);
-
- /**
- * Insert task to queue according to its type. Also used to attach in-fly
- * tasks to queues.
- */
+
+ /**
+ * Insert task to queue according to its type. Also used to attach in-fly
+ * tasks to queues.
+ */
void AssignTask(TTaskPtr &task, const TActorSystem &as);
- /**
- * Get estimated execution time for task basing on default config and
- * collected statistics.
- */
- TDuration EstimateTaskExecutionTime(TTaskPtr task);
-
- const TTaskConfig &TaskConfig(const TString &type) const;
- TTaskConfig &TaskConfig(const TString &type);
-
- TInstant Now;
+ /**
+ * Get estimated execution time for task basing on default config and
+ * collected statistics.
+ */
+ TDuration EstimateTaskExecutionTime(TTaskPtr task);
+
+ const TTaskConfig &TaskConfig(const TString &type) const;
+ TTaskConfig &TaskConfig(const TString &type);
+
+ TInstant Now;
THashMap<TString, TTaskQueuePtr> Queues;
THashMap<TString, TTaskConfig> TaskConfigs;
- TResourceLimitPtr ResourceLimit;
+ TResourceLimitPtr ResourceLimit;
THashMap<std::pair<TActorId, ui64>, TTaskPtr> Tasks;
- const NMonitoring::TDynamicCounterPtr Counters;
- TQueueCountersPtr TotalCounters;
- NMonitoring::TDynamicCounters::TCounterPtr MissingTaskTypeCounter;
- ui64 NextTaskId;
-};
-
-/**
+ const NMonitoring::TDynamicCounterPtr Counters;
+ TQueueCountersPtr TotalCounters;
+ NMonitoring::TDynamicCounters::TCounterPtr MissingTaskTypeCounter;
+ ui64 NextTaskId;
+};
+
+/**
* TResourceBroker is a simple thread-safe wrapper for scheduler.
- */
+ */
class TResourceBroker : public IResourceBroker {
-public:
+public:
TResourceBroker(const NKikimrResourceBroker::TResourceBrokerConfig &config,
const NMonitoring::TDynamicCounterPtr &counters,
TActorSystem *actorSystem);
@@ -438,48 +438,48 @@ class TResourceBrokerActor : public TActorBootstrapped<TResourceBrokerActor> {
public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::TABLET_COMPACTION_BROKER;
- }
-
+ }
+
TResourceBrokerActor(const NKikimrResourceBroker::TResourceBrokerConfig &config,
const NMonitoring::TDynamicCounterPtr &counters);
-
- void Bootstrap(const TActorContext &ctx);
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvResourceBroker::TEvSubmitTask, Handle);
- HFunc(TEvResourceBroker::TEvUpdateTask, Handle);
- HFunc(TEvResourceBroker::TEvUpdateTaskCookie, Handle);
- HFunc(TEvResourceBroker::TEvRemoveTask, Handle);
- HFunc(TEvResourceBroker::TEvFinishTask, Handle);
- HFunc(TEvResourceBroker::TEvNotifyActorDied, Handle);
- HFunc(TEvResourceBroker::TEvConfigure, Handle);
+
+ void Bootstrap(const TActorContext &ctx);
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvResourceBroker::TEvSubmitTask, Handle);
+ HFunc(TEvResourceBroker::TEvUpdateTask, Handle);
+ HFunc(TEvResourceBroker::TEvUpdateTaskCookie, Handle);
+ HFunc(TEvResourceBroker::TEvRemoveTask, Handle);
+ HFunc(TEvResourceBroker::TEvFinishTask, Handle);
+ HFunc(TEvResourceBroker::TEvNotifyActorDied, Handle);
+ HFunc(TEvResourceBroker::TEvConfigure, Handle);
HFunc(TEvResourceBroker::TEvConfigRequest, Handle);
HFunc(TEvResourceBroker::TEvResourceBrokerRequest, Handle);
- HFunc(NMon::TEvHttpInfo, Handle);
- default:
- Y_FAIL("TResourceBroker::StateWork unexpected event type: %" PRIx32 " event: %s",
- ev->GetTypeRewrite(),
+ HFunc(NMon::TEvHttpInfo, Handle);
+ default:
+ Y_FAIL("TResourceBroker::StateWork unexpected event type: %" PRIx32 " event: %s",
+ ev->GetTypeRewrite(),
ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
-private:
- void Handle(TEvResourceBroker::TEvSubmitTask::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvResourceBroker::TEvUpdateTask::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvResourceBroker::TEvUpdateTaskCookie::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvResourceBroker::TEvRemoveTask::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvResourceBroker::TEvFinishTask::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvResourceBroker::TEvNotifyActorDied::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvResourceBroker::TEvConfigure::TPtr &ev, const TActorContext &ctx);
+ }
+ }
+
+private:
+ void Handle(TEvResourceBroker::TEvSubmitTask::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvResourceBroker::TEvUpdateTask::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvResourceBroker::TEvUpdateTaskCookie::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvResourceBroker::TEvRemoveTask::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvResourceBroker::TEvFinishTask::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvResourceBroker::TEvNotifyActorDied::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvResourceBroker::TEvConfigure::TPtr &ev, const TActorContext &ctx);
void Handle(TEvResourceBroker::TEvConfigRequest::TPtr &ev, const TActorContext &ctx);
void Handle(TEvResourceBroker::TEvResourceBrokerRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx);
-
- NKikimrResourceBroker::TResourceBrokerConfig Config;
+ void Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorContext &ctx);
+
+ NKikimrResourceBroker::TResourceBrokerConfig Config;
NMonitoring::TDynamicCounterPtr Counters;
TIntrusivePtr<TResourceBroker> ResourceBroker;
-};
-
-} // NResourceBroker
-} // NKikimr
+};
+
+} // NResourceBroker
+} // NKikimr
diff --git a/ydb/core/tablet/resource_broker_ut.cpp b/ydb/core/tablet/resource_broker_ut.cpp
index a4a58ac89aa..5948509025b 100644
--- a/ydb/core/tablet/resource_broker_ut.cpp
+++ b/ydb/core/tablet/resource_broker_ut.cpp
@@ -1,190 +1,190 @@
-#include "resource_broker_impl.h"
-
+#include "resource_broker_impl.h"
+
#include <ydb/core/testlib/tablet_helpers.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-#ifndef NDEBUG
-const bool ENABLE_DETAILED_RESOURCE_BROKER_LOG = true;
-#else
-const bool ENABLE_DETAILED_RESOURCE_BROKER_LOG = false;
-#endif
-
-namespace NKikimr {
-
-using namespace NKikimrResourceBroker;
-using namespace NResourceBroker;
-
-static void SetupLogging(TTestActorRuntime& runtime) {
- NActors::NLog::EPriority priority = ENABLE_DETAILED_RESOURCE_BROKER_LOG ? NLog::PRI_DEBUG : NLog::PRI_ERROR;
- runtime.SetLogPriority(NKikimrServices::RESOURCE_BROKER, priority);
-}
-
-static NKikimrResourceBroker::TResourceBrokerConfig
-MakeTestConfig()
-{
- NKikimrResourceBroker::TResourceBrokerConfig config;
-
- auto queue = config.AddQueues();
- queue->SetName("queue_default");
- queue->SetWeight(5);
- queue->MutableLimit()->AddResource(400);
-
- queue = config.AddQueues();
- queue->SetName("queue_compaction0");
- queue->SetWeight(10);
- queue->MutableLimit()->AddResource(400);
-
- queue = config.AddQueues();
- queue->SetName("queue_compaction1");
- queue->SetWeight(20);
- queue->MutableLimit()->AddResource(400);
-
+
+#ifndef NDEBUG
+const bool ENABLE_DETAILED_RESOURCE_BROKER_LOG = true;
+#else
+const bool ENABLE_DETAILED_RESOURCE_BROKER_LOG = false;
+#endif
+
+namespace NKikimr {
+
+using namespace NKikimrResourceBroker;
+using namespace NResourceBroker;
+
+static void SetupLogging(TTestActorRuntime& runtime) {
+ NActors::NLog::EPriority priority = ENABLE_DETAILED_RESOURCE_BROKER_LOG ? NLog::PRI_DEBUG : NLog::PRI_ERROR;
+ runtime.SetLogPriority(NKikimrServices::RESOURCE_BROKER, priority);
+}
+
+static NKikimrResourceBroker::TResourceBrokerConfig
+MakeTestConfig()
+{
+ NKikimrResourceBroker::TResourceBrokerConfig config;
+
+ auto queue = config.AddQueues();
+ queue->SetName("queue_default");
+ queue->SetWeight(5);
+ queue->MutableLimit()->AddResource(400);
+
+ queue = config.AddQueues();
+ queue->SetName("queue_compaction0");
+ queue->SetWeight(10);
+ queue->MutableLimit()->AddResource(400);
+
+ queue = config.AddQueues();
+ queue->SetName("queue_compaction1");
+ queue->SetWeight(20);
+ queue->MutableLimit()->AddResource(400);
+
queue = config.AddQueues();
queue->SetName("queue_scan");
queue->SetWeight(20);
queue->MutableLimit()->AddResource(400);
- auto task = config.AddTasks();
- task->SetName("unknown");
- task->SetQueueName("queue_default");
- task->SetDefaultDuration(TDuration::Seconds(5).GetValue());
-
- task = config.AddTasks();
- task->SetName("compaction0");
- task->SetQueueName("queue_compaction0");
- task->SetDefaultDuration(TDuration::Seconds(10).GetValue());
-
- task = config.AddTasks();
- task->SetName("compaction1");
- task->SetQueueName("queue_compaction1");
- task->SetDefaultDuration(TDuration::Seconds(20).GetValue());
-
+ auto task = config.AddTasks();
+ task->SetName("unknown");
+ task->SetQueueName("queue_default");
+ task->SetDefaultDuration(TDuration::Seconds(5).GetValue());
+
+ task = config.AddTasks();
+ task->SetName("compaction0");
+ task->SetQueueName("queue_compaction0");
+ task->SetDefaultDuration(TDuration::Seconds(10).GetValue());
+
+ task = config.AddTasks();
+ task->SetName("compaction1");
+ task->SetQueueName("queue_compaction1");
+ task->SetDefaultDuration(TDuration::Seconds(20).GetValue());
+
task = config.AddTasks();
task->SetName("scan");
task->SetQueueName("queue_scan");
task->SetDefaultDuration(TDuration::Seconds(20).GetValue());
- config.MutableResourceLimit()->AddResource(500);
- config.MutableResourceLimit()->AddResource(500);
-
- return config;
-}
-
-static void
-WaitForBootstrap(TTestActorRuntime &runtime)
-{
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvents::TSystem::Bootstrap, 1);
- UNIT_ASSERT(runtime.DispatchEvents(options));
-}
-
-static void
+ config.MutableResourceLimit()->AddResource(500);
+ config.MutableResourceLimit()->AddResource(500);
+
+ return config;
+}
+
+static void
+WaitForBootstrap(TTestActorRuntime &runtime)
+{
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvents::TSystem::Bootstrap, 1);
+ UNIT_ASSERT(runtime.DispatchEvents(options));
+}
+
+static void
SubmitTask(TTestActorRuntime &runtime, TActorId broker, TActorId sender,
- ui64 id, ui64 cpu, ui64 memory, const TString &type,
- ui32 priority, TIntrusivePtr<TThrRefBase> cookie = nullptr)
-{
- TAutoPtr<TEvResourceBroker::TEvSubmitTask> event
- = new TEvResourceBroker::TEvSubmitTask(id,
- "task-" + ToString(id),
- {{cpu, memory}},
- type,
- priority,
- cookie);
- runtime.Send(new IEventHandle(broker, sender, event.Release()));
-}
-
-static void
+ ui64 id, ui64 cpu, ui64 memory, const TString &type,
+ ui32 priority, TIntrusivePtr<TThrRefBase> cookie = nullptr)
+{
+ TAutoPtr<TEvResourceBroker::TEvSubmitTask> event
+ = new TEvResourceBroker::TEvSubmitTask(id,
+ "task-" + ToString(id),
+ {{cpu, memory}},
+ type,
+ priority,
+ cookie);
+ runtime.Send(new IEventHandle(broker, sender, event.Release()));
+}
+
+static void
UpdateTask(TTestActorRuntime &runtime, TActorId broker, TActorId sender,
- ui64 id, ui64 cpu, ui64 memory, ui32 priority, const TString &type,
- bool resubmit = false)
-{
- TAutoPtr<TEvResourceBroker::TEvUpdateTask> event
- = new TEvResourceBroker::TEvUpdateTask(id,
- {{cpu, memory}},
- type, priority, resubmit);
-
- runtime.Send(new IEventHandle(broker, sender, event.Release()));
-}
-
-static void
+ ui64 id, ui64 cpu, ui64 memory, ui32 priority, const TString &type,
+ bool resubmit = false)
+{
+ TAutoPtr<TEvResourceBroker::TEvUpdateTask> event
+ = new TEvResourceBroker::TEvUpdateTask(id,
+ {{cpu, memory}},
+ type, priority, resubmit);
+
+ runtime.Send(new IEventHandle(broker, sender, event.Release()));
+}
+
+static void
UpdateTaskCookie(TTestActorRuntime &runtime, TActorId broker, TActorId sender,
- ui64 id, TIntrusivePtr<TThrRefBase> cookie)
-{
- TAutoPtr<TEvResourceBroker::TEvUpdateTaskCookie> event
- = new TEvResourceBroker::TEvUpdateTaskCookie(id, cookie);
-
- runtime.Send(new IEventHandle(broker, sender, event.Release()));
-}
-
-static void
+ ui64 id, TIntrusivePtr<TThrRefBase> cookie)
+{
+ TAutoPtr<TEvResourceBroker::TEvUpdateTaskCookie> event
+ = new TEvResourceBroker::TEvUpdateTaskCookie(id, cookie);
+
+ runtime.Send(new IEventHandle(broker, sender, event.Release()));
+}
+
+static void
RemoveTask(TTestActorRuntime &runtime, TActorId broker, TActorId sender, ui64 id)
-{
- TAutoPtr<TEvResourceBroker::TEvRemoveTask> event
- = new TEvResourceBroker::TEvRemoveTask(id);
-
- runtime.Send(new IEventHandle(broker, sender, event.Release()));
-}
-
-static void
+{
+ TAutoPtr<TEvResourceBroker::TEvRemoveTask> event
+ = new TEvResourceBroker::TEvRemoveTask(id);
+
+ runtime.Send(new IEventHandle(broker, sender, event.Release()));
+}
+
+static void
FinishTask(TTestActorRuntime &runtime, TActorId broker, TActorId sender, ui64 id)
-{
- TAutoPtr<TEvResourceBroker::TEvFinishTask> event
- = new TEvResourceBroker::TEvFinishTask(id);
-
- runtime.Send(new IEventHandle(broker, sender, event.Release()));
-}
-
-static ui64
-WaitForResourceAllocation(TTestActorRuntime &runtime, ui64 id,
- TIntrusivePtr<TThrRefBase> cookie = nullptr)
-{
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvResourceBroker::TEvResourceAllocated>(handle);
- if (id)
- UNIT_ASSERT_VALUES_EQUAL(reply->TaskId, id);
- UNIT_ASSERT_VALUES_EQUAL(reply->Cookie, cookie);
- return reply->TaskId;
-}
-
-static void
-WaitForError(TTestActorRuntime &runtime, ui64 id, TEvResourceBroker::TStatus::ECode code,
- TIntrusivePtr<TThrRefBase> cookie = nullptr)
-{
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvResourceBroker::TEvTaskOperationError>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->TaskId, id);
- UNIT_ASSERT_VALUES_EQUAL(reply->Status.Code, code);
- UNIT_ASSERT_VALUES_EQUAL(reply->Cookie, cookie);
-}
-
-static void
-CheckCounters(NMonitoring::TDynamicCounterPtr counters, const TString &group, const TString &name,
- ui64 cpu, ui64 memory, ui64 finished, ui64 enqueued, ui64 infly)
-{
- auto g = counters->GetSubgroup(group, name);
- UNIT_ASSERT_VALUES_EQUAL(g->GetCounter("CPUConsumption")->Val(), cpu);
- UNIT_ASSERT_VALUES_EQUAL(g->GetCounter("MemoryConsumption")->Val(), memory);
- UNIT_ASSERT_VALUES_EQUAL(g->GetCounter("FinishedTasks")->Val(), finished);
- UNIT_ASSERT_VALUES_EQUAL(g->GetCounter("EnqueuedTasks")->Val(), enqueued);
- UNIT_ASSERT_VALUES_EQUAL(g->GetCounter("InFlyTasks")->Val(), infly);
-}
-
+{
+ TAutoPtr<TEvResourceBroker::TEvFinishTask> event
+ = new TEvResourceBroker::TEvFinishTask(id);
+
+ runtime.Send(new IEventHandle(broker, sender, event.Release()));
+}
+
+static ui64
+WaitForResourceAllocation(TTestActorRuntime &runtime, ui64 id,
+ TIntrusivePtr<TThrRefBase> cookie = nullptr)
+{
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvResourceBroker::TEvResourceAllocated>(handle);
+ if (id)
+ UNIT_ASSERT_VALUES_EQUAL(reply->TaskId, id);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Cookie, cookie);
+ return reply->TaskId;
+}
+
+static void
+WaitForError(TTestActorRuntime &runtime, ui64 id, TEvResourceBroker::TStatus::ECode code,
+ TIntrusivePtr<TThrRefBase> cookie = nullptr)
+{
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvResourceBroker::TEvTaskOperationError>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->TaskId, id);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Status.Code, code);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Cookie, cookie);
+}
+
+static void
+CheckCounters(NMonitoring::TDynamicCounterPtr counters, const TString &group, const TString &name,
+ ui64 cpu, ui64 memory, ui64 finished, ui64 enqueued, ui64 infly)
+{
+ auto g = counters->GetSubgroup(group, name);
+ UNIT_ASSERT_VALUES_EQUAL(g->GetCounter("CPUConsumption")->Val(), cpu);
+ UNIT_ASSERT_VALUES_EQUAL(g->GetCounter("MemoryConsumption")->Val(), memory);
+ UNIT_ASSERT_VALUES_EQUAL(g->GetCounter("FinishedTasks")->Val(), finished);
+ UNIT_ASSERT_VALUES_EQUAL(g->GetCounter("EnqueuedTasks")->Val(), enqueued);
+ UNIT_ASSERT_VALUES_EQUAL(g->GetCounter("InFlyTasks")->Val(), infly);
+}
+
static void CheckConfigure(TTestActorRuntime &runtime, TActorId broker, TActorId sender,
- const NKikimrResourceBroker::TResourceBrokerConfig &config,
- bool success)
-{
- TAutoPtr<TEvResourceBroker::TEvConfigure> event = new TEvResourceBroker::TEvConfigure;
- event->Record.CopyFrom(config);
- runtime.Send(new IEventHandle(broker, sender, event.Release()));
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvResourceBroker::TEvConfigureResult>(handle);
- auto &rec = reply->Record;
-
- UNIT_ASSERT_VALUES_EQUAL((int)rec.GetSuccess(), (int)success);
-}
-
+ const NKikimrResourceBroker::TResourceBrokerConfig &config,
+ bool success)
+{
+ TAutoPtr<TEvResourceBroker::TEvConfigure> event = new TEvResourceBroker::TEvConfigure;
+ event->Record.CopyFrom(config);
+ runtime.Send(new IEventHandle(broker, sender, event.Release()));
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvResourceBroker::TEvConfigureResult>(handle);
+ auto &rec = reply->Record;
+
+ UNIT_ASSERT_VALUES_EQUAL((int)rec.GetSuccess(), (int)success);
+}
+
static
TIntrusivePtr<IResourceBroker> GetInstantResourceBroker(TTestActorRuntime &runtime, TActorId broker, TActorId sender) {
runtime.Send(new IEventHandle(broker, sender, new TEvResourceBroker::TEvResourceBrokerRequest));
@@ -196,651 +196,651 @@ Y_UNIT_TEST_SUITE(TResourceBroker) {
Y_UNIT_TEST(TestErrors) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender1 = runtime.AllocateEdgeActor();
TActorId sender2 = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
- auto cookie1 = MakeIntrusive<TThrRefBase>();
- auto cookie2 = MakeIntrusive<TThrRefBase>();
-
- // Submit task-1.
- SubmitTask(runtime, brokerId, sender1, 1, 400, 400, "unknown", 5, cookie1);
- // Resources are allocated for task-1.
- WaitForResourceAllocation(runtime, 1, cookie1);
- // Submit task-2.
- SubmitTask(runtime, brokerId, sender1, 2, 500, 500, "compaction0", 5, cookie2);
- // Submit task-3.
- SubmitTask(runtime, brokerId, sender1, 3, 500, 500, "compaction0", 5, cookie2);
- // Submit task-4.
- SubmitTask(runtime, brokerId, sender1, 4, 500, 500, "compaction0", 5, nullptr);
-
- // Submit task-2 one more time and get ALREADY_EXISTS.
- SubmitTask(runtime, brokerId, sender1, 2, 500, 500, "compaction0", 5, cookie1);
- WaitForError(runtime, 2, TEvResourceBroker::TStatus::ALREADY_EXISTS, cookie1);
-
- // Try to remove task-1 and get TASK_IN_FLY.
- RemoveTask(runtime, brokerId, sender1, 1);
- WaitForError(runtime, 1, TEvResourceBroker::TStatus::TASK_IN_FLY, cookie1);
- // Try to remove task-5 and get UNKNOWN_TASK.
- RemoveTask(runtime, brokerId, sender1, 5);
- WaitForError(runtime, 5, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
- // Try to remove task-2 by another client and get UNKNOWN_TASK.
- RemoveTask(runtime, brokerId, sender2, 2);
- WaitForError(runtime, 2, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
- // Remove task-2.
- RemoveTask(runtime, brokerId, sender1, 2);
-
- // Try to update task-2 and get UNKNOWN_TASK.
- UpdateTask(runtime, brokerId, sender1, 2, 500, 500, 4, "unknown");
- WaitForError(runtime, 2, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
- // Try to update task-4 by another client and get UNKNOWN_TASK.
- UpdateTask(runtime, brokerId, sender2, 4, 500, 500, 4, "unknown");
- WaitForError(runtime, 4, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
- // Update resources and priority of task-4.
- UpdateTask(runtime, brokerId, sender1, 4, 250, 250, 4, "compaction0");
- // Update resources and priority of task-3.
- UpdateTask(runtime, brokerId, sender1, 3, 250, 250, 6, "compaction0");
-
- // Try to finish task-5 and get UNKNOWN_TASK.
- FinishTask(runtime, brokerId, sender1, 5);
- WaitForError(runtime, 5, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
- // Try to finish task-2 by another client and get UNKNOWN_TASK.
- FinishTask(runtime, brokerId, sender2, 2);
- WaitForError(runtime, 2, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
- // Try to finish task-3 and get TASK_IN_QUEUE.
- FinishTask(runtime, brokerId, sender1, 3);
- WaitForError(runtime, 3, TEvResourceBroker::TStatus::TASK_IN_QUEUE, cookie2);
- // Finish task-1.
- now += TDuration::Seconds(10);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender1, 1);
-
- // Resources are allocated for task-4.
- WaitForResourceAllocation(runtime, 4, nullptr);
- // Finish task-4.
- now += TDuration::Seconds(10);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender1, 4);
- // Resources are allocated for task-3.
- WaitForResourceAllocation(runtime, 3, cookie2);
- };
-
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
+ auto cookie1 = MakeIntrusive<TThrRefBase>();
+ auto cookie2 = MakeIntrusive<TThrRefBase>();
+
+ // Submit task-1.
+ SubmitTask(runtime, brokerId, sender1, 1, 400, 400, "unknown", 5, cookie1);
+ // Resources are allocated for task-1.
+ WaitForResourceAllocation(runtime, 1, cookie1);
+ // Submit task-2.
+ SubmitTask(runtime, brokerId, sender1, 2, 500, 500, "compaction0", 5, cookie2);
+ // Submit task-3.
+ SubmitTask(runtime, brokerId, sender1, 3, 500, 500, "compaction0", 5, cookie2);
+ // Submit task-4.
+ SubmitTask(runtime, brokerId, sender1, 4, 500, 500, "compaction0", 5, nullptr);
+
+ // Submit task-2 one more time and get ALREADY_EXISTS.
+ SubmitTask(runtime, brokerId, sender1, 2, 500, 500, "compaction0", 5, cookie1);
+ WaitForError(runtime, 2, TEvResourceBroker::TStatus::ALREADY_EXISTS, cookie1);
+
+ // Try to remove task-1 and get TASK_IN_FLY.
+ RemoveTask(runtime, brokerId, sender1, 1);
+ WaitForError(runtime, 1, TEvResourceBroker::TStatus::TASK_IN_FLY, cookie1);
+ // Try to remove task-5 and get UNKNOWN_TASK.
+ RemoveTask(runtime, brokerId, sender1, 5);
+ WaitForError(runtime, 5, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
+ // Try to remove task-2 by another client and get UNKNOWN_TASK.
+ RemoveTask(runtime, brokerId, sender2, 2);
+ WaitForError(runtime, 2, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
+ // Remove task-2.
+ RemoveTask(runtime, brokerId, sender1, 2);
+
+ // Try to update task-2 and get UNKNOWN_TASK.
+ UpdateTask(runtime, brokerId, sender1, 2, 500, 500, 4, "unknown");
+ WaitForError(runtime, 2, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
+ // Try to update task-4 by another client and get UNKNOWN_TASK.
+ UpdateTask(runtime, brokerId, sender2, 4, 500, 500, 4, "unknown");
+ WaitForError(runtime, 4, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
+ // Update resources and priority of task-4.
+ UpdateTask(runtime, brokerId, sender1, 4, 250, 250, 4, "compaction0");
+ // Update resources and priority of task-3.
+ UpdateTask(runtime, brokerId, sender1, 3, 250, 250, 6, "compaction0");
+
+ // Try to finish task-5 and get UNKNOWN_TASK.
+ FinishTask(runtime, brokerId, sender1, 5);
+ WaitForError(runtime, 5, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
+ // Try to finish task-2 by another client and get UNKNOWN_TASK.
+ FinishTask(runtime, brokerId, sender2, 2);
+ WaitForError(runtime, 2, TEvResourceBroker::TStatus::UNKNOWN_TASK, nullptr);
+ // Try to finish task-3 and get TASK_IN_QUEUE.
+ FinishTask(runtime, brokerId, sender1, 3);
+ WaitForError(runtime, 3, TEvResourceBroker::TStatus::TASK_IN_QUEUE, cookie2);
+ // Finish task-1.
+ now += TDuration::Seconds(10);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender1, 1);
+
+ // Resources are allocated for task-4.
+ WaitForResourceAllocation(runtime, 4, nullptr);
+ // Finish task-4.
+ now += TDuration::Seconds(10);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender1, 4);
+ // Resources are allocated for task-3.
+ WaitForResourceAllocation(runtime, 3, cookie2);
+ };
+
Y_UNIT_TEST(TestOverusage) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
- // Submit task-1.
- SubmitTask(runtime, brokerId, sender, 1, 50, 50, "compaction0", 5);
- // Submit task-2.
- SubmitTask(runtime, brokerId, sender, 2, 410, 410, "compaction0", 5);
- // Submit task-3.
- SubmitTask(runtime, brokerId, sender, 3, 550, 550, "compaction1", 5);
-
- // Resources are allocated for task-1.
- WaitForResourceAllocation(runtime, 1);
- // Finish task-1.
- now += TDuration::Seconds(10);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, 1);
- // Resources are allocated for task-3.
- WaitForResourceAllocation(runtime, 3);
- // Finish task-3.
- now += TDuration::Seconds(10);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, 3);
- // Resources are allocated for task-2.
- WaitForResourceAllocation(runtime, 2);
- }
-
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
+ // Submit task-1.
+ SubmitTask(runtime, brokerId, sender, 1, 50, 50, "compaction0", 5);
+ // Submit task-2.
+ SubmitTask(runtime, brokerId, sender, 2, 410, 410, "compaction0", 5);
+ // Submit task-3.
+ SubmitTask(runtime, brokerId, sender, 3, 550, 550, "compaction1", 5);
+
+ // Resources are allocated for task-1.
+ WaitForResourceAllocation(runtime, 1);
+ // Finish task-1.
+ now += TDuration::Seconds(10);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, 1);
+ // Resources are allocated for task-3.
+ WaitForResourceAllocation(runtime, 3);
+ // Finish task-3.
+ now += TDuration::Seconds(10);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, 3);
+ // Resources are allocated for task-2.
+ WaitForResourceAllocation(runtime, 2);
+ }
+
Y_UNIT_TEST(TestExecutionStat) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
- // Submit task-1 to block queues.
- SubmitTask(runtime, brokerId, sender, 1, 500, 500, "unknown", 5);
- // Submit task-2.
- SubmitTask(runtime, brokerId, sender, 2, 50, 50, "compaction1", 5);
- // Submit task-3.
- SubmitTask(runtime, brokerId, sender, 3, 50, 50, "compaction0", 5);
- // Submit task-4.
- SubmitTask(runtime, brokerId, sender, 4, 50, 50, "compaction1", 5);
- // Submit task-5.
- SubmitTask(runtime, brokerId, sender, 5, 50, 50, "compaction0", 5);
- // Submit task-6.
- SubmitTask(runtime, brokerId, sender, 6, 50, 50, "compaction1", 5);
- // Submit task-7.
- SubmitTask(runtime, brokerId, sender, 7, 50, 50, "compaction0", 5);
-
- // Finish task-1.
- WaitForResourceAllocation(runtime, 1);
- FinishTask(runtime, brokerId, sender, 1);
- // Now expect resource allocation in submission order (GEN1 task has
- // 2x more estimated execution time but its queue has 2x weight).
- WaitForResourceAllocation(runtime, 2);
- WaitForResourceAllocation(runtime, 3);
- WaitForResourceAllocation(runtime, 4);
- WaitForResourceAllocation(runtime, 5);
- WaitForResourceAllocation(runtime, 6);
- WaitForResourceAllocation(runtime, 7);
- // Finish all tasks keeping old execution stat.
- now += TDuration::Seconds(10);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, 3);
- FinishTask(runtime, brokerId, sender, 5);
- FinishTask(runtime, brokerId, sender, 7);
- now += TDuration::Seconds(10);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, 2);
- FinishTask(runtime, brokerId, sender, 4);
- FinishTask(runtime, brokerId, sender, 6);
-
- // Now submit and finish tasks to change statistics for GEN1.
- for (int i = 0; i < 20; ++i) {
- SubmitTask(runtime, brokerId, sender, 1, 50, 50, "compaction1", 5);
- WaitForResourceAllocation(runtime, 1);
- now += TDuration::Seconds(10);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, 1);
- }
-
- // Submit task-1 to block queues.
- SubmitTask(runtime, brokerId, sender, 1, 500, 500, "unknown", 5);
- // Submit task-2.
- SubmitTask(runtime, brokerId, sender, 2, 50, 50, "compaction1", 5);
- // Submit task-3.
- SubmitTask(runtime, brokerId, sender, 3, 50, 50, "compaction0", 5);
- // Submit task-4.
- SubmitTask(runtime, brokerId, sender, 4, 50, 50, "compaction1", 5);
- // Submit task-5.
- SubmitTask(runtime, brokerId, sender, 5, 50, 50, "compaction0", 5);
- // Submit task-6.
- SubmitTask(runtime, brokerId, sender, 6, 50, 50, "compaction1", 5);
- // Submit task-7.
- SubmitTask(runtime, brokerId, sender, 7, 50, 50, "compaction0", 5);
-
- // Finish task-1.
- WaitForResourceAllocation(runtime, 1);
- FinishTask(runtime, brokerId, sender, 1);
- // Now expect resource allocation in modified order because GEN1
- // task became 2x cheaper.
- WaitForResourceAllocation(runtime, 2);
- WaitForResourceAllocation(runtime, 3);
- WaitForResourceAllocation(runtime, 4);
- WaitForResourceAllocation(runtime, 6);
- WaitForResourceAllocation(runtime, 5);
- WaitForResourceAllocation(runtime, 7);
- }
-
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
+ // Submit task-1 to block queues.
+ SubmitTask(runtime, brokerId, sender, 1, 500, 500, "unknown", 5);
+ // Submit task-2.
+ SubmitTask(runtime, brokerId, sender, 2, 50, 50, "compaction1", 5);
+ // Submit task-3.
+ SubmitTask(runtime, brokerId, sender, 3, 50, 50, "compaction0", 5);
+ // Submit task-4.
+ SubmitTask(runtime, brokerId, sender, 4, 50, 50, "compaction1", 5);
+ // Submit task-5.
+ SubmitTask(runtime, brokerId, sender, 5, 50, 50, "compaction0", 5);
+ // Submit task-6.
+ SubmitTask(runtime, brokerId, sender, 6, 50, 50, "compaction1", 5);
+ // Submit task-7.
+ SubmitTask(runtime, brokerId, sender, 7, 50, 50, "compaction0", 5);
+
+ // Finish task-1.
+ WaitForResourceAllocation(runtime, 1);
+ FinishTask(runtime, brokerId, sender, 1);
+ // Now expect resource allocation in submission order (GEN1 task has
+ // 2x more estimated execution time but its queue has 2x weight).
+ WaitForResourceAllocation(runtime, 2);
+ WaitForResourceAllocation(runtime, 3);
+ WaitForResourceAllocation(runtime, 4);
+ WaitForResourceAllocation(runtime, 5);
+ WaitForResourceAllocation(runtime, 6);
+ WaitForResourceAllocation(runtime, 7);
+ // Finish all tasks keeping old execution stat.
+ now += TDuration::Seconds(10);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, 3);
+ FinishTask(runtime, brokerId, sender, 5);
+ FinishTask(runtime, brokerId, sender, 7);
+ now += TDuration::Seconds(10);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, 2);
+ FinishTask(runtime, brokerId, sender, 4);
+ FinishTask(runtime, brokerId, sender, 6);
+
+ // Now submit and finish tasks to change statistics for GEN1.
+ for (int i = 0; i < 20; ++i) {
+ SubmitTask(runtime, brokerId, sender, 1, 50, 50, "compaction1", 5);
+ WaitForResourceAllocation(runtime, 1);
+ now += TDuration::Seconds(10);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, 1);
+ }
+
+ // Submit task-1 to block queues.
+ SubmitTask(runtime, brokerId, sender, 1, 500, 500, "unknown", 5);
+ // Submit task-2.
+ SubmitTask(runtime, brokerId, sender, 2, 50, 50, "compaction1", 5);
+ // Submit task-3.
+ SubmitTask(runtime, brokerId, sender, 3, 50, 50, "compaction0", 5);
+ // Submit task-4.
+ SubmitTask(runtime, brokerId, sender, 4, 50, 50, "compaction1", 5);
+ // Submit task-5.
+ SubmitTask(runtime, brokerId, sender, 5, 50, 50, "compaction0", 5);
+ // Submit task-6.
+ SubmitTask(runtime, brokerId, sender, 6, 50, 50, "compaction1", 5);
+ // Submit task-7.
+ SubmitTask(runtime, brokerId, sender, 7, 50, 50, "compaction0", 5);
+
+ // Finish task-1.
+ WaitForResourceAllocation(runtime, 1);
+ FinishTask(runtime, brokerId, sender, 1);
+ // Now expect resource allocation in modified order because GEN1
+ // task became 2x cheaper.
+ WaitForResourceAllocation(runtime, 2);
+ WaitForResourceAllocation(runtime, 3);
+ WaitForResourceAllocation(runtime, 4);
+ WaitForResourceAllocation(runtime, 6);
+ WaitForResourceAllocation(runtime, 5);
+ WaitForResourceAllocation(runtime, 7);
+ }
+
Y_UNIT_TEST(TestRealUsage) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
- // Submit task-1.
- SubmitTask(runtime, brokerId, sender, 1, 400, 400, "compaction0", 5);
- // Submit task-2.
- SubmitTask(runtime, brokerId, sender, 2, 400, 400, "compaction1", 5);
- // Submit task-3.
- SubmitTask(runtime, brokerId, sender, 3, 400, 400, "compaction0", 5);
- // Submit task-4.
- SubmitTask(runtime, brokerId, sender, 4, 400, 400, "compaction1", 5);
- // Submit task-5.
- SubmitTask(runtime, brokerId, sender, 5, 400, 400, "compaction0", 5);
- // Submit task-6.
- SubmitTask(runtime, brokerId, sender, 6, 400, 400, "compaction1", 5);
-
- // Finish task-1 after 10 seconds.
- WaitForResourceAllocation(runtime, 1);
- now += TDuration::Seconds(10);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, 1);
-
- // Now finish GEN1 tasks in 7 seconds and all GEN0 should wait due to real
- // resources usage.
- WaitForResourceAllocation(runtime, 2);
- now += TDuration::Seconds(7);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, 2);
-
- WaitForResourceAllocation(runtime, 4);
- now += TDuration::Seconds(7);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, 4);
-
- WaitForResourceAllocation(runtime, 6);
- }
-
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
+ // Submit task-1.
+ SubmitTask(runtime, brokerId, sender, 1, 400, 400, "compaction0", 5);
+ // Submit task-2.
+ SubmitTask(runtime, brokerId, sender, 2, 400, 400, "compaction1", 5);
+ // Submit task-3.
+ SubmitTask(runtime, brokerId, sender, 3, 400, 400, "compaction0", 5);
+ // Submit task-4.
+ SubmitTask(runtime, brokerId, sender, 4, 400, 400, "compaction1", 5);
+ // Submit task-5.
+ SubmitTask(runtime, brokerId, sender, 5, 400, 400, "compaction0", 5);
+ // Submit task-6.
+ SubmitTask(runtime, brokerId, sender, 6, 400, 400, "compaction1", 5);
+
+ // Finish task-1 after 10 seconds.
+ WaitForResourceAllocation(runtime, 1);
+ now += TDuration::Seconds(10);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, 1);
+
+ // Now finish GEN1 tasks in 7 seconds and all GEN0 should wait due to real
+ // resources usage.
+ WaitForResourceAllocation(runtime, 2);
+ now += TDuration::Seconds(7);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, 2);
+
+ WaitForResourceAllocation(runtime, 4);
+ now += TDuration::Seconds(7);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, 4);
+
+ WaitForResourceAllocation(runtime, 6);
+ }
+
Y_UNIT_TEST(TestCounters) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
- // Submit task-1.
- SubmitTask(runtime, brokerId, sender, 1, 200, 200, "compaction0", 5);
- // Submit task-2.
- SubmitTask(runtime, brokerId, sender, 2, 100, 100, "compaction1", 5);
- // Submit task-3.
- SubmitTask(runtime, brokerId, sender, 3, 100, 100, "compaction1", 5);
- // Submit task-4.
- SubmitTask(runtime, brokerId, sender, 4, 100, 100, "compaction1", 5);
- // Submit task-5.
- SubmitTask(runtime, brokerId, sender, 5, 250, 250, "compaction0", 5);
- // Submit task-6.
- SubmitTask(runtime, brokerId, sender, 6, 250, 250, "compaction1", 5);
- // Submit task-7.
- SubmitTask(runtime, brokerId, sender, 7, 150, 150, "compaction1", 5);
-
- WaitForResourceAllocation(runtime, 1);
- WaitForResourceAllocation(runtime, 2);
- WaitForResourceAllocation(runtime, 3);
- WaitForResourceAllocation(runtime, 4);
-
- CheckCounters(counters, "queue", "total", 500, 500, 0, 3, 4);
- CheckCounters(counters, "queue", "queue_compaction0", 200, 200, 0, 1, 1);
- CheckCounters(counters, "queue", "queue_compaction1", 300, 300, 0, 2, 3);
- CheckCounters(counters, "task", "compaction0", 200, 200, 0, 1, 1);
- CheckCounters(counters, "task", "compaction1", 300, 300, 0, 2, 3);
-
- FinishTask(runtime, brokerId, sender, 1);
- FinishTask(runtime, brokerId, sender, 2);
-
- WaitForResourceAllocation(runtime, 5);
-
- CheckCounters(counters, "queue", "total", 450, 450, 2, 2, 3);
- CheckCounters(counters, "queue", "queue_compaction0", 250, 250, 1, 0, 1);
- CheckCounters(counters, "queue", "queue_compaction1", 200, 200, 1, 2, 2);
- CheckCounters(counters, "task", "compaction0", 250, 250, 1, 0, 1);
- CheckCounters(counters, "task", "compaction1", 200, 200, 1, 2, 2);
-
- FinishTask(runtime, brokerId, sender, 3);
- FinishTask(runtime, brokerId, sender, 4);
-
- WaitForResourceAllocation(runtime, 6);
-
- CheckCounters(counters, "queue", "total", 500, 500, 4, 1, 2);
- CheckCounters(counters, "queue", "queue_compaction0", 250, 250, 1, 0, 1);
- CheckCounters(counters, "queue", "queue_compaction1", 250, 250, 3, 1, 1);
- CheckCounters(counters, "task", "compaction0", 250, 250, 1, 0, 1);
- CheckCounters(counters, "task", "compaction1", 250, 250, 3, 1, 1);
-
- FinishTask(runtime, brokerId, sender, 5);
- FinishTask(runtime, brokerId, sender, 6);
-
- WaitForResourceAllocation(runtime, 7);
-
- CheckCounters(counters, "queue", "total", 150, 150, 6, 0, 1);
- CheckCounters(counters, "queue", "queue_compaction0", 0, 0, 2, 0, 0);
- CheckCounters(counters, "queue", "queue_compaction1", 150, 150, 4, 0, 1);
- CheckCounters(counters, "task", "compaction0", 0, 0, 2, 0, 0);
- CheckCounters(counters, "task", "compaction1", 150, 150, 4, 0, 1);
-
- FinishTask(runtime, brokerId, sender, 7);
- SubmitTask(runtime, brokerId, sender, 1000, 500, 500, "compaction0", 5);
- WaitForResourceAllocation(runtime, 1000);
-
- for (ui64 i = 1; i <= 10; ++i)
- SubmitTask(runtime, brokerId, sender, i, 1, 1, "unknown", 5);
-
- now += TDuration::Seconds(15);
- runtime.UpdateCurrentTime(now);
-
- FinishTask(runtime, brokerId, sender, 1000);
- for (ui64 i = 1; i <= 10; ++i)
- WaitForResourceAllocation(runtime, i);
-
- now += TDuration::Seconds(5);
- runtime.UpdateCurrentTime(now);
-
- for (ui64 i = 1; i <= 10; ++i)
- FinishTask(runtime, brokerId, sender, i);
- }
-
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
+ // Submit task-1.
+ SubmitTask(runtime, brokerId, sender, 1, 200, 200, "compaction0", 5);
+ // Submit task-2.
+ SubmitTask(runtime, brokerId, sender, 2, 100, 100, "compaction1", 5);
+ // Submit task-3.
+ SubmitTask(runtime, brokerId, sender, 3, 100, 100, "compaction1", 5);
+ // Submit task-4.
+ SubmitTask(runtime, brokerId, sender, 4, 100, 100, "compaction1", 5);
+ // Submit task-5.
+ SubmitTask(runtime, brokerId, sender, 5, 250, 250, "compaction0", 5);
+ // Submit task-6.
+ SubmitTask(runtime, brokerId, sender, 6, 250, 250, "compaction1", 5);
+ // Submit task-7.
+ SubmitTask(runtime, brokerId, sender, 7, 150, 150, "compaction1", 5);
+
+ WaitForResourceAllocation(runtime, 1);
+ WaitForResourceAllocation(runtime, 2);
+ WaitForResourceAllocation(runtime, 3);
+ WaitForResourceAllocation(runtime, 4);
+
+ CheckCounters(counters, "queue", "total", 500, 500, 0, 3, 4);
+ CheckCounters(counters, "queue", "queue_compaction0", 200, 200, 0, 1, 1);
+ CheckCounters(counters, "queue", "queue_compaction1", 300, 300, 0, 2, 3);
+ CheckCounters(counters, "task", "compaction0", 200, 200, 0, 1, 1);
+ CheckCounters(counters, "task", "compaction1", 300, 300, 0, 2, 3);
+
+ FinishTask(runtime, brokerId, sender, 1);
+ FinishTask(runtime, brokerId, sender, 2);
+
+ WaitForResourceAllocation(runtime, 5);
+
+ CheckCounters(counters, "queue", "total", 450, 450, 2, 2, 3);
+ CheckCounters(counters, "queue", "queue_compaction0", 250, 250, 1, 0, 1);
+ CheckCounters(counters, "queue", "queue_compaction1", 200, 200, 1, 2, 2);
+ CheckCounters(counters, "task", "compaction0", 250, 250, 1, 0, 1);
+ CheckCounters(counters, "task", "compaction1", 200, 200, 1, 2, 2);
+
+ FinishTask(runtime, brokerId, sender, 3);
+ FinishTask(runtime, brokerId, sender, 4);
+
+ WaitForResourceAllocation(runtime, 6);
+
+ CheckCounters(counters, "queue", "total", 500, 500, 4, 1, 2);
+ CheckCounters(counters, "queue", "queue_compaction0", 250, 250, 1, 0, 1);
+ CheckCounters(counters, "queue", "queue_compaction1", 250, 250, 3, 1, 1);
+ CheckCounters(counters, "task", "compaction0", 250, 250, 1, 0, 1);
+ CheckCounters(counters, "task", "compaction1", 250, 250, 3, 1, 1);
+
+ FinishTask(runtime, brokerId, sender, 5);
+ FinishTask(runtime, brokerId, sender, 6);
+
+ WaitForResourceAllocation(runtime, 7);
+
+ CheckCounters(counters, "queue", "total", 150, 150, 6, 0, 1);
+ CheckCounters(counters, "queue", "queue_compaction0", 0, 0, 2, 0, 0);
+ CheckCounters(counters, "queue", "queue_compaction1", 150, 150, 4, 0, 1);
+ CheckCounters(counters, "task", "compaction0", 0, 0, 2, 0, 0);
+ CheckCounters(counters, "task", "compaction1", 150, 150, 4, 0, 1);
+
+ FinishTask(runtime, brokerId, sender, 7);
+ SubmitTask(runtime, brokerId, sender, 1000, 500, 500, "compaction0", 5);
+ WaitForResourceAllocation(runtime, 1000);
+
+ for (ui64 i = 1; i <= 10; ++i)
+ SubmitTask(runtime, brokerId, sender, i, 1, 1, "unknown", 5);
+
+ now += TDuration::Seconds(15);
+ runtime.UpdateCurrentTime(now);
+
+ FinishTask(runtime, brokerId, sender, 1000);
+ for (ui64 i = 1; i <= 10; ++i)
+ WaitForResourceAllocation(runtime, i);
+
+ now += TDuration::Seconds(5);
+ runtime.UpdateCurrentTime(now);
+
+ for (ui64 i = 1; i <= 10; ++i)
+ FinishTask(runtime, brokerId, sender, i);
+ }
+
Y_UNIT_TEST(TestQueueWithConfigure) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
- config.MutableTasks(2)->SetQueueName("default");
-
- SubmitTask(runtime, brokerId, sender, 1, 500, 500, "unknown", 5);
- SubmitTask(runtime, brokerId, sender, 2, 200, 200, "compaction0", 5);
- SubmitTask(runtime, brokerId, sender, 3, 200, 200, "compaction1", 5);
-
- WaitForResourceAllocation(runtime, 1);
-
- config = MakeTestConfig();
- config.MutableResourceLimit()->Clear();
- config.MutableResourceLimit()->AddResource(1000);
- config.MutableResourceLimit()->AddResource(1000);
- config.MutableQueues(1)->SetWeight(50);
- TAutoPtr<TEvResourceBroker::TEvConfigure> event1 = new TEvResourceBroker::TEvConfigure;
- event1->Record.CopyFrom(config);
- runtime.Send(new IEventHandle(brokerId, sender, event1.Release()));
-
- WaitForResourceAllocation(runtime, 2);
- WaitForResourceAllocation(runtime, 3);
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvResourceBroker::TEvConfigureResult>(handle);
- UNIT_ASSERT(reply->Record.GetSuccess());
-
- // Try unknown queue.
- config.MutableTasks(2)->SetQueueName("queue_default1");
- CheckConfigure(runtime, brokerId, sender, config, false);
-
- // Try no unknown task.
- config.MutableTasks(2)->SetQueueName("queue_default");
- config.MutableTasks(0)->SetName("unknown1");
- CheckConfigure(runtime, brokerId, sender, config, false);
-
- // Try no default queue.
- config.MutableQueues(0)->SetName("queue_default1");
- config.MutableTasks(0)->SetName("unknown");
- CheckConfigure(runtime, brokerId, sender, config, false);
-
- // Correct config.
- config.MutableQueues(0)->SetName("queue_default");
- CheckConfigure(runtime, brokerId, sender, config, true);
- }
-
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
+ config.MutableTasks(2)->SetQueueName("default");
+
+ SubmitTask(runtime, brokerId, sender, 1, 500, 500, "unknown", 5);
+ SubmitTask(runtime, brokerId, sender, 2, 200, 200, "compaction0", 5);
+ SubmitTask(runtime, brokerId, sender, 3, 200, 200, "compaction1", 5);
+
+ WaitForResourceAllocation(runtime, 1);
+
+ config = MakeTestConfig();
+ config.MutableResourceLimit()->Clear();
+ config.MutableResourceLimit()->AddResource(1000);
+ config.MutableResourceLimit()->AddResource(1000);
+ config.MutableQueues(1)->SetWeight(50);
+ TAutoPtr<TEvResourceBroker::TEvConfigure> event1 = new TEvResourceBroker::TEvConfigure;
+ event1->Record.CopyFrom(config);
+ runtime.Send(new IEventHandle(brokerId, sender, event1.Release()));
+
+ WaitForResourceAllocation(runtime, 2);
+ WaitForResourceAllocation(runtime, 3);
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvResourceBroker::TEvConfigureResult>(handle);
+ UNIT_ASSERT(reply->Record.GetSuccess());
+
+ // Try unknown queue.
+ config.MutableTasks(2)->SetQueueName("queue_default1");
+ CheckConfigure(runtime, brokerId, sender, config, false);
+
+ // Try no unknown task.
+ config.MutableTasks(2)->SetQueueName("queue_default");
+ config.MutableTasks(0)->SetName("unknown1");
+ CheckConfigure(runtime, brokerId, sender, config, false);
+
+ // Try no default queue.
+ config.MutableQueues(0)->SetName("queue_default1");
+ config.MutableTasks(0)->SetName("unknown");
+ CheckConfigure(runtime, brokerId, sender, config, false);
+
+ // Correct config.
+ config.MutableQueues(0)->SetName("queue_default");
+ CheckConfigure(runtime, brokerId, sender, config, true);
+ }
+
Y_UNIT_TEST(TestRandomQueue) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
TSet<ui64> ids;
- const char *names[] = { "unknown", "compaction0", "compaction1", "wrong" };
- for (ui64 i = 1; i <= 1000; ++i) {
- SubmitTask(runtime, brokerId, sender, i, RandomNumber<ui32>(500), RandomNumber<ui32>(500),
- names[RandomNumber<ui32>(4)], RandomNumber<ui32>(5));
- ids.insert(i);
- }
-
- while (!ids.empty()) {
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvResourceBroker::TEvResourceAllocated>(handle);
+ const char *names[] = { "unknown", "compaction0", "compaction1", "wrong" };
+ for (ui64 i = 1; i <= 1000; ++i) {
+ SubmitTask(runtime, brokerId, sender, i, RandomNumber<ui32>(500), RandomNumber<ui32>(500),
+ names[RandomNumber<ui32>(4)], RandomNumber<ui32>(5));
+ ids.insert(i);
+ }
+
+ while (!ids.empty()) {
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvResourceBroker::TEvResourceAllocated>(handle);
UNIT_ASSERT(ids.contains(reply->TaskId));
- ids.erase(reply->TaskId);
- now += TDuration::MilliSeconds(RandomNumber<ui32>(20000));
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, reply->TaskId);
- }
-
- CheckCounters(counters, "queue", "total", 0, 0, 1000, 0, 0);
- }
-
+ ids.erase(reply->TaskId);
+ now += TDuration::MilliSeconds(RandomNumber<ui32>(20000));
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, reply->TaskId);
+ }
+
+ CheckCounters(counters, "queue", "total", 0, 0, 1000, 0, 0);
+ }
+
Y_UNIT_TEST(TestNotifyActorDied) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender1 = runtime.AllocateEdgeActor();
TActorId sender2 = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
- // Submit task-1.
- SubmitTask(runtime, brokerId, sender1, 1, 500, 500, "compaction0", 5);
- // Submit task-2.
- SubmitTask(runtime, brokerId, sender1, 2, 200, 200, "compaction1", 5);
- // Submit task-3.
- SubmitTask(runtime, brokerId, sender2, 3, 200, 200, "compaction0", 5);
- // Submit task-4.
- SubmitTask(runtime, brokerId, sender2, 4, 200, 200, "compaction1", 5);
-
- // Get resources for task-1.
- WaitForResourceAllocation(runtime, 1);
-
- // Remove task-1 and task-2.
- now += TDuration::Seconds(1);
- runtime.UpdateCurrentTime(now);
- runtime.Send(new IEventHandle(brokerId, sender1, new TEvResourceBroker::TEvNotifyActorDied));
-
- // Get resources for task-4.
- WaitForResourceAllocation(runtime, 4);
- // Get resources for task-3.
- WaitForResourceAllocation(runtime, 3);
- }
-
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
+ // Submit task-1.
+ SubmitTask(runtime, brokerId, sender1, 1, 500, 500, "compaction0", 5);
+ // Submit task-2.
+ SubmitTask(runtime, brokerId, sender1, 2, 200, 200, "compaction1", 5);
+ // Submit task-3.
+ SubmitTask(runtime, brokerId, sender2, 3, 200, 200, "compaction0", 5);
+ // Submit task-4.
+ SubmitTask(runtime, brokerId, sender2, 4, 200, 200, "compaction1", 5);
+
+ // Get resources for task-1.
+ WaitForResourceAllocation(runtime, 1);
+
+ // Remove task-1 and task-2.
+ now += TDuration::Seconds(1);
+ runtime.UpdateCurrentTime(now);
+ runtime.Send(new IEventHandle(brokerId, sender1, new TEvResourceBroker::TEvNotifyActorDied));
+
+ // Get resources for task-4.
+ WaitForResourceAllocation(runtime, 4);
+ // Get resources for task-3.
+ WaitForResourceAllocation(runtime, 3);
+ }
+
Y_UNIT_TEST(TestAutoTaskId) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
- // Submit tasks task-1 .. task-100
- for (ui64 i = 1; i <= 100; ++i)
- SubmitTask(runtime, brokerId, sender, i, 400, 400, "compaction0", 5);
-
- // Get resources for task-1.
- WaitForResourceAllocation(runtime, 1);
-
- // Submit task with auto id and get resources for it
- SubmitTask(runtime, brokerId, sender, 0, 100, 100, "compaction1", 5);
- auto id = WaitForResourceAllocation(runtime, 0);
- UNIT_ASSERT(id);
-
- // Submit task to check auto task is finished correctly.
- SubmitTask(runtime, brokerId, sender, id + 1, 100, 100, "compaction1", 5);
-
- // Remove auto task and wait the next one in queue.
- now += TDuration::Seconds(1);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, id);
- WaitForResourceAllocation(runtime, id + 1);
- }
-
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
+ // Submit tasks task-1 .. task-100
+ for (ui64 i = 1; i <= 100; ++i)
+ SubmitTask(runtime, brokerId, sender, i, 400, 400, "compaction0", 5);
+
+ // Get resources for task-1.
+ WaitForResourceAllocation(runtime, 1);
+
+ // Submit task with auto id and get resources for it
+ SubmitTask(runtime, brokerId, sender, 0, 100, 100, "compaction1", 5);
+ auto id = WaitForResourceAllocation(runtime, 0);
+ UNIT_ASSERT(id);
+
+ // Submit task to check auto task is finished correctly.
+ SubmitTask(runtime, brokerId, sender, id + 1, 100, 100, "compaction1", 5);
+
+ // Remove auto task and wait the next one in queue.
+ now += TDuration::Seconds(1);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, id);
+ WaitForResourceAllocation(runtime, id + 1);
+ }
+
Y_UNIT_TEST(TestChangeTaskType) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
- // Submit tasks task-1.
- SubmitTask(runtime, brokerId, sender, 1, 400, 400, "compaction0", 5);
- // Submit tasks task-2.
- SubmitTask(runtime, brokerId, sender, 2, 400, 400, "compaction0", 5);
- // Submit tasks task-3.
- SubmitTask(runtime, brokerId, sender, 3, 400, 400, "compaction0", 5);
-
- // Get resources for task-1.
- WaitForResourceAllocation(runtime, 1);
-
- // Move task-3 to another queue.
- UpdateTask(runtime, brokerId, sender, 3, 400, 400, 5, "compaction1");
-
- // Finish task-1.
- now += TDuration::Seconds(1);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, 1);
-
- // Get resources for task-3.
- WaitForResourceAllocation(runtime, 3);
- }
-
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
+ // Submit tasks task-1.
+ SubmitTask(runtime, brokerId, sender, 1, 400, 400, "compaction0", 5);
+ // Submit tasks task-2.
+ SubmitTask(runtime, brokerId, sender, 2, 400, 400, "compaction0", 5);
+ // Submit tasks task-3.
+ SubmitTask(runtime, brokerId, sender, 3, 400, 400, "compaction0", 5);
+
+ // Get resources for task-1.
+ WaitForResourceAllocation(runtime, 1);
+
+ // Move task-3 to another queue.
+ UpdateTask(runtime, brokerId, sender, 3, 400, 400, 5, "compaction1");
+
+ // Finish task-1.
+ now += TDuration::Seconds(1);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, 1);
+
+ // Get resources for task-3.
+ WaitForResourceAllocation(runtime, 3);
+ }
+
Y_UNIT_TEST(TestResubmitTask) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
- // Submit tasks task-1.
- SubmitTask(runtime, brokerId, sender, 1, 200, 200, "compaction0", 5);
- // Submit tasks task-2.
- SubmitTask(runtime, brokerId, sender, 2, 200, 200, "compaction0", 5);
- // Submit tasks task-3.
- SubmitTask(runtime, brokerId, sender, 3, 200, 200, "compaction0", 5);
-
- // Get resources for task-1.
- WaitForResourceAllocation(runtime, 1);
- WaitForResourceAllocation(runtime, 2);
-
- // Increase resource requirement for task-2 and return it to queue.
- UpdateTask(runtime, brokerId, sender, 2, 400, 400, 5, "compaction0", true);
-
- // Finish task-1.
- now += TDuration::Seconds(1);
- runtime.UpdateCurrentTime(now);
- FinishTask(runtime, brokerId, sender, 1);
-
- // Get resources for task-2.
- WaitForResourceAllocation(runtime, 2);
-
- // Decrease resource requirement for task-2 and return it to queue.
- UpdateTask(runtime, brokerId, sender, 2, 200, 200, 5, "compaction0", true);
-
- // Get resources for task-2.
- WaitForResourceAllocation(runtime, 2);
- // Get resources for task-3.
- WaitForResourceAllocation(runtime, 3);
- }
-
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
+ // Submit tasks task-1.
+ SubmitTask(runtime, brokerId, sender, 1, 200, 200, "compaction0", 5);
+ // Submit tasks task-2.
+ SubmitTask(runtime, brokerId, sender, 2, 200, 200, "compaction0", 5);
+ // Submit tasks task-3.
+ SubmitTask(runtime, brokerId, sender, 3, 200, 200, "compaction0", 5);
+
+ // Get resources for task-1.
+ WaitForResourceAllocation(runtime, 1);
+ WaitForResourceAllocation(runtime, 2);
+
+ // Increase resource requirement for task-2 and return it to queue.
+ UpdateTask(runtime, brokerId, sender, 2, 400, 400, 5, "compaction0", true);
+
+ // Finish task-1.
+ now += TDuration::Seconds(1);
+ runtime.UpdateCurrentTime(now);
+ FinishTask(runtime, brokerId, sender, 1);
+
+ // Get resources for task-2.
+ WaitForResourceAllocation(runtime, 2);
+
+ // Decrease resource requirement for task-2 and return it to queue.
+ UpdateTask(runtime, brokerId, sender, 2, 200, 200, 5, "compaction0", true);
+
+ // Get resources for task-2.
+ WaitForResourceAllocation(runtime, 2);
+ // Get resources for task-3.
+ WaitForResourceAllocation(runtime, 3);
+ }
+
Y_UNIT_TEST(TestUpdateCookie) {
TTestBasicRuntime runtime;
SetupTabletServices(runtime);
- SetupLogging(runtime);
-
- auto now = Now();
- runtime.UpdateCurrentTime(now);
+ SetupLogging(runtime);
+
+ auto now = Now();
+ runtime.UpdateCurrentTime(now);
TActorId sender = runtime.AllocateEdgeActor();
-
- NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
- auto config = MakeTestConfig();
+
+ NMonitoring::TDynamicCounterPtr counters = MakeIntrusive<NMonitoring::TDynamicCounters>();
+ auto config = MakeTestConfig();
auto broker = CreateResourceBrokerActor(config, counters);
- auto brokerId = runtime.Register(broker);
- WaitForBootstrap(runtime);
-
- TIntrusivePtr<TThrRefBase> cookie1 = new TThrRefBase;
- TIntrusivePtr<TThrRefBase> cookie2 = new TThrRefBase;
-
- // Submit task task-1.
- SubmitTask(runtime, brokerId, sender, 1, 400, 400, "compaction0", 5);
- WaitForResourceAllocation(runtime, 1);
- // Submit task task-2.
- SubmitTask(runtime, brokerId, sender, 2, 200, 200, "compaction0", 5, cookie1);
- // Update cookie for task-2.
- UpdateTaskCookie(runtime, brokerId, sender, 2, cookie2);
- // Finish task-1.
- FinishTask(runtime, brokerId, sender, 1);
- // Get resources for task-2.
- WaitForResourceAllocation(runtime, 2, cookie2);
- // Submit task task-3.
- SubmitTask(runtime, brokerId, sender, 3, 200, 200, "compaction0", 5);
- // Get resources for task-3.
- WaitForResourceAllocation(runtime, 3);
- // Update cookie for task-2.
- UpdateTaskCookie(runtime, brokerId, sender, 2, cookie1);
- // Finish task-3.
- FinishTask(runtime, brokerId, sender, 3);
- // Increase resource requirement for task-2 and return it to queue.
- UpdateTask(runtime, brokerId, sender, 2, 400, 400, 5, "compaction0", true);
- // Get resources for task-2.
- WaitForResourceAllocation(runtime, 2, cookie1);
- }
+ auto brokerId = runtime.Register(broker);
+ WaitForBootstrap(runtime);
+
+ TIntrusivePtr<TThrRefBase> cookie1 = new TThrRefBase;
+ TIntrusivePtr<TThrRefBase> cookie2 = new TThrRefBase;
+
+ // Submit task task-1.
+ SubmitTask(runtime, brokerId, sender, 1, 400, 400, "compaction0", 5);
+ WaitForResourceAllocation(runtime, 1);
+ // Submit task task-2.
+ SubmitTask(runtime, brokerId, sender, 2, 200, 200, "compaction0", 5, cookie1);
+ // Update cookie for task-2.
+ UpdateTaskCookie(runtime, brokerId, sender, 2, cookie2);
+ // Finish task-1.
+ FinishTask(runtime, brokerId, sender, 1);
+ // Get resources for task-2.
+ WaitForResourceAllocation(runtime, 2, cookie2);
+ // Submit task task-3.
+ SubmitTask(runtime, brokerId, sender, 3, 200, 200, "compaction0", 5);
+ // Get resources for task-3.
+ WaitForResourceAllocation(runtime, 3);
+ // Update cookie for task-2.
+ UpdateTaskCookie(runtime, brokerId, sender, 2, cookie1);
+ // Finish task-3.
+ FinishTask(runtime, brokerId, sender, 3);
+ // Increase resource requirement for task-2 and return it to queue.
+ UpdateTask(runtime, brokerId, sender, 2, 400, 400, 5, "compaction0", true);
+ // Get resources for task-2.
+ WaitForResourceAllocation(runtime, 2, cookie1);
+ }
Y_UNIT_TEST(TestOverusageDifferentResources) {
TTestBasicRuntime runtime;
@@ -891,8 +891,8 @@ Y_UNIT_TEST_SUITE(TResourceBroker) {
SubmitTask(runtime, brokerId, sender, 5, 250, 0, "compaction0", 5);
WaitForResourceAllocation(runtime, 5);
}
-};
-
+};
+
Y_UNIT_TEST_SUITE(TResourceBrokerInstant) {
Y_UNIT_TEST(Test) {
TTestBasicRuntime runtime;
@@ -1132,4 +1132,4 @@ Y_UNIT_TEST_SUITE(TResourceBrokerConfig) {
} // TResourceBrokerConfig
-} // NKikimr
+} // NKikimr
diff --git a/ydb/core/tablet/tablet_monitoring_proxy.cpp b/ydb/core/tablet/tablet_monitoring_proxy.cpp
index 3cc692291e2..a61a43b7e5c 100644
--- a/ydb/core/tablet/tablet_monitoring_proxy.cpp
+++ b/ydb/core/tablet/tablet_monitoring_proxy.cpp
@@ -291,50 +291,50 @@ TTabletMonitoringProxyActor::Handle(NMon::TEvHttpInfo::TPtr &ev, const TActorCon
<< "</a>";}
TABLED() {str << "<a href='tablets?KillTabletID=" << tabletId << "'><span class='glyphicon glyphicon-remove' title='Kill Tablet'/></a>";}
}
- tabletId = NKikimr::MakeCmsID(si);
- TABLER() {
- TABLED() {str << "<a href=\"tablets?TabletID=" << tabletId << "\">CMS</a>";}
- TABLED() {str << tabletId;}
- TABLED() {str << " <a href=\"tablets?SsId="
- << tabletId << "\">"
- << "<span class=\"glyphicon glyphicon-tasks\""
- << " title=\"State Storage\" />"
- << "</a>";}
- TABLED() {str << "<a href='tablets?KillTabletID=" << tabletId << "'><span class='glyphicon glyphicon-remove' title='Kill Tablet'/></a>";}
- }
- tabletId = NKikimr::MakeNodeBrokerID(si);
- TABLER() {
- TABLED() {str << "<a href=\"tablets?TabletID=" << tabletId << "\">NODE_BROKER</a>";}
- TABLED() {str << tabletId;}
- TABLED() {str << " <a href=\"tablets?SsId="
- << tabletId << "\">"
- << "<span class=\"glyphicon glyphicon-tasks\""
- << " title=\"State Storage\" />"
- << "</a>";}
- TABLED() {str << "<a href='tablets?KillTabletID=" << tabletId << "'><span class='glyphicon glyphicon-remove' title='Kill Tablet'/></a>";}
- }
- tabletId = NKikimr::MakeTenantSlotBrokerID(si);
- TABLER() {
- TABLED() {str << "<a href=\"tablets?TabletID=" << tabletId << "\">TENANT_SLOT_BROKER</a>";}
- TABLED() {str << tabletId;}
- TABLED() {str << " <a href=\"tablets?SsId="
- << tabletId << "\">"
- << "<span class=\"glyphicon glyphicon-tasks\""
- << " title=\"State Storage\" />"
- << "</a>";}
- TABLED() {str << "<a href='tablets?KillTabletID=" << tabletId << "'><span class='glyphicon glyphicon-remove' title='Kill Tablet'/></a>";}
- }
- tabletId = NKikimr::MakeConsoleID(si);
- TABLER() {
- TABLED() {str << "<a href=\"tablets?TabletID=" << tabletId << "\">CONSOLE</a>";}
- TABLED() {str << tabletId;}
- TABLED() {str << " <a href=\"tablets?SsId="
- << tabletId << "\">"
- << "<span class=\"glyphicon glyphicon-tasks\""
- << " title=\"State Storage\" />"
- << "</a>";}
- TABLED() {str << "<a href='tablets?KillTabletID=" << tabletId << "'><span class='glyphicon glyphicon-remove' title='Kill Tablet'/></a>";}
- }
+ tabletId = NKikimr::MakeCmsID(si);
+ TABLER() {
+ TABLED() {str << "<a href=\"tablets?TabletID=" << tabletId << "\">CMS</a>";}
+ TABLED() {str << tabletId;}
+ TABLED() {str << " <a href=\"tablets?SsId="
+ << tabletId << "\">"
+ << "<span class=\"glyphicon glyphicon-tasks\""
+ << " title=\"State Storage\" />"
+ << "</a>";}
+ TABLED() {str << "<a href='tablets?KillTabletID=" << tabletId << "'><span class='glyphicon glyphicon-remove' title='Kill Tablet'/></a>";}
+ }
+ tabletId = NKikimr::MakeNodeBrokerID(si);
+ TABLER() {
+ TABLED() {str << "<a href=\"tablets?TabletID=" << tabletId << "\">NODE_BROKER</a>";}
+ TABLED() {str << tabletId;}
+ TABLED() {str << " <a href=\"tablets?SsId="
+ << tabletId << "\">"
+ << "<span class=\"glyphicon glyphicon-tasks\""
+ << " title=\"State Storage\" />"
+ << "</a>";}
+ TABLED() {str << "<a href='tablets?KillTabletID=" << tabletId << "'><span class='glyphicon glyphicon-remove' title='Kill Tablet'/></a>";}
+ }
+ tabletId = NKikimr::MakeTenantSlotBrokerID(si);
+ TABLER() {
+ TABLED() {str << "<a href=\"tablets?TabletID=" << tabletId << "\">TENANT_SLOT_BROKER</a>";}
+ TABLED() {str << tabletId;}
+ TABLED() {str << " <a href=\"tablets?SsId="
+ << tabletId << "\">"
+ << "<span class=\"glyphicon glyphicon-tasks\""
+ << " title=\"State Storage\" />"
+ << "</a>";}
+ TABLED() {str << "<a href='tablets?KillTabletID=" << tabletId << "'><span class='glyphicon glyphicon-remove' title='Kill Tablet'/></a>";}
+ }
+ tabletId = NKikimr::MakeConsoleID(si);
+ TABLER() {
+ TABLED() {str << "<a href=\"tablets?TabletID=" << tabletId << "\">CONSOLE</a>";}
+ TABLED() {str << tabletId;}
+ TABLED() {str << " <a href=\"tablets?SsId="
+ << tabletId << "\">"
+ << "<span class=\"glyphicon glyphicon-tasks\""
+ << " title=\"State Storage\" />"
+ << "</a>";}
+ TABLED() {str << "<a href='tablets?KillTabletID=" << tabletId << "'><span class='glyphicon glyphicon-remove' title='Kill Tablet'/></a>";}
+ }
}
for (auto tabletId : di.second->Coordinators) {
TABLER() {
diff --git a/ydb/core/tablet/tablet_setup.h b/ydb/core/tablet/tablet_setup.h
index 74feb4703bb..57ea7d6edba 100644
--- a/ydb/core/tablet/tablet_setup.h
+++ b/ydb/core/tablet/tablet_setup.h
@@ -12,7 +12,7 @@ class TTabletStorageInfo;
class TTabletSetupInfo : public TThrRefBase {
public:
typedef std::function<IActor* (const TActorId &, TTabletStorageInfo*)> TTabletCreationFunc;
- using TPtr = TIntrusivePtr<TTabletSetupInfo>;
+ using TPtr = TIntrusivePtr<TTabletSetupInfo>;
private:
const TTabletCreationFunc Op;
diff --git a/ydb/core/tablet/tablet_sys.cpp b/ydb/core/tablet/tablet_sys.cpp
index eb6a61aea91..44bfac7b2d6 100644
--- a/ydb/core/tablet/tablet_sys.cpp
+++ b/ydb/core/tablet/tablet_sys.cpp
@@ -494,8 +494,8 @@ void TTablet::HandleByFollower(TEvTablet::TEvFollowerUpdate::TPtr &ev) {
Send(UserTablet,
new TEvTablet::TEvFBoot(TabletID(), FollowerId, record.GetGeneration(),
- Launcher, *ev->Get(), Info,
- ResourceProfiles, TxCacheQuota));
+ Launcher, *ev->Get(), Info,
+ ResourceProfiles, TxCacheQuota));
BLOG_TRACE("SBoot attempt: " << FollowerInfo.FollowerAttempt
<< ", " << record.GetGeneration() << ":" << record.GetStep());
@@ -961,8 +961,8 @@ void TTablet::HandleRebuildGraphResult(TEvTabletBase::TEvRebuildGraphResult::TPt
case NKikimrProto::NODATA:
WriteZeroEntry(graph.Get());
Send(UserTablet,
- new TEvTablet::TEvBoot(TabletID(), StateStorageInfo.KnownGeneration,
- graph.Get(), Launcher, Info, ResourceProfiles,
+ new TEvTablet::TEvBoot(TabletID(), StateStorageInfo.KnownGeneration,
+ graph.Get(), Launcher, Info, ResourceProfiles,
TxCacheQuota,
std::move(msg->GroupReadBytes),
std::move(msg->GroupReadOps)));
@@ -1787,11 +1787,11 @@ void TTablet::CancelTablet(TEvTablet::TEvTabletDead::EReason reason, const TStri
}
void TTablet::Handle(TEvTablet::TEvUpdateConfig::TPtr &ev) {
- ResourceProfiles = ev->Get()->ResourceProfiles;
- if (UserTablet)
+ ResourceProfiles = ev->Get()->ResourceProfiles;
+ if (UserTablet)
TActivationContext::Send(ev->Forward(UserTablet));
-}
-
+}
+
void TTablet::LockedInitializationPath() {
const ui32 latestChangeGeneration = SuggestedGeneration ? SuggestedGeneration - 1 : Info->ChannelInfo(0)->LatestEntry()->FromGeneration;
@@ -1833,8 +1833,8 @@ TTablet::TTablet(const TActorId &launcher, TTabletStorageInfo *info, TTabletSetu
, GcInFly(0)
, GcInFlyStep(0)
, GcNextStep(0)
- , ResourceProfiles(profiles)
- , TxCacheQuota(txCacheQuota)
+ , ResourceProfiles(profiles)
+ , TxCacheQuota(txCacheQuota)
{
Y_VERIFY(!info->Channels.empty() && !info->Channels[0].History.empty());
Y_VERIFY(TTabletTypes::TYPE_INVALID != info->TabletType);
@@ -1924,19 +1924,19 @@ TActorId TTabletSetupInfo::Apply(TTabletStorageInfo *info, const TActorContext &
TActorId TTabletSetupInfo::Tablet(TTabletStorageInfo *info, const TActorId &launcher, const TActorContext &ctx,
ui32 suggestedGeneration, TResourceProfilesPtr profiles, TSharedQuotaPtr txCacheQuota) {
- return ctx.ExecutorThread.RegisterActor(CreateTablet(launcher, info, this, suggestedGeneration, profiles, txCacheQuota),
- TabletMailboxType, TabletPoolId);
+ return ctx.ExecutorThread.RegisterActor(CreateTablet(launcher, info, this, suggestedGeneration, profiles, txCacheQuota),
+ TabletMailboxType, TabletPoolId);
}
TActorId TTabletSetupInfo::Follower(TTabletStorageInfo *info, const TActorId &launcher, const TActorContext &ctx,
ui32 followerId, TResourceProfilesPtr profiles, TSharedQuotaPtr txCacheQuota) {
return ctx.ExecutorThread.RegisterActor(CreateTabletFollower(launcher, info, this, followerId, profiles, txCacheQuota),
- TabletMailboxType, TabletPoolId);
+ TabletMailboxType, TabletPoolId);
}
IActor* CreateTablet(const TActorId &launcher, TTabletStorageInfo *info, TTabletSetupInfo *setupInfo,
ui32 suggestedGeneration, TResourceProfilesPtr profiles, TSharedQuotaPtr txCacheQuota) {
- return new TTablet(launcher, info, setupInfo, true, suggestedGeneration, 0, profiles, txCacheQuota);
+ return new TTablet(launcher, info, setupInfo, true, suggestedGeneration, 0, profiles, txCacheQuota);
}
IActor* CreateTabletFollower(const TActorId &launcher, TTabletStorageInfo *info, TTabletSetupInfo *setupInfo,
diff --git a/ydb/core/tablet/tablet_sys.h b/ydb/core/tablet/tablet_sys.h
index 25eb72ef663..661d75a4e0a 100644
--- a/ydb/core/tablet/tablet_sys.h
+++ b/ydb/core/tablet/tablet_sys.h
@@ -352,7 +352,7 @@ class TTablet : public TActor<TTablet> {
void CancelTablet(TEvTablet::TEvTabletDead::EReason reason, const TString &details = TString());
void Handle(TEvTablet::TEvUpdateConfig::TPtr &ev);
-
+
void LockedInitializationPath();
void Bootstrap();
void BootstrapFollower();
diff --git a/ydb/core/tablet/ut/ya.make b/ydb/core/tablet/ut/ya.make
index 9ca1bf8bf3b..52440600e13 100644
--- a/ydb/core/tablet/ut/ya.make
+++ b/ydb/core/tablet/ut/ya.make
@@ -24,7 +24,7 @@ YQL_LAST_ABI_VERSION()
SRCS(
pipe_tracker_ut.cpp
- resource_broker_ut.cpp
+ resource_broker_ut.cpp
tablet_counters_aggregator_ut.cpp
tablet_metrics_ut.cpp
tablet_pipe_ut.cpp
diff --git a/ydb/core/tablet/ya.make b/ydb/core/tablet/ya.make
index d166fa1f4f5..25e611b4085 100644
--- a/ydb/core/tablet/ya.make
+++ b/ydb/core/tablet/ya.make
@@ -13,9 +13,9 @@ SRCS(
node_whiteboard.cpp
pipe_tracker.cpp
pipe_tracker.h
- resource_broker.cpp
- resource_broker.h
- resource_broker_impl.h
+ resource_broker.cpp
+ resource_broker.h
+ resource_broker_impl.h
tablet_counters.cpp
tablet_counters.h
tablet_counters_aggregator.cpp
diff --git a/ydb/core/tablet_flat/datetime_ut.cpp b/ydb/core/tablet_flat/datetime_ut.cpp
index 60389a19912..67c77235a8b 100644
--- a/ydb/core/tablet_flat/datetime_ut.cpp
+++ b/ydb/core/tablet_flat/datetime_ut.cpp
@@ -1,356 +1,356 @@
-#include "tablet_flat_executed.h"
-#include "flat_executor.h"
-
+#include "tablet_flat_executed.h"
+#include "flat_executor.h"
+
#include <ydb/core/scheme/scheme_types_defs.h>
#include <ydb/core/tablet_flat/flat_executor_compaction_logic.h>
#include <ydb/core/tablet_flat/flat_cxx_database.h>
#include <ydb/core/tablet_flat/test/libs/exec/runner.h>
#include <ydb/core/tablet_flat/ut/flat_database_ut_common.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace NKikimr {
-namespace NTabletFlatExecutor {
-
-Y_UNIT_TEST_SUITE(TFlatTableDatetime) {
- class TDateTestFlatTablet : public TActor<TDateTestFlatTablet>, public TTabletExecutedFlat {
- struct Schema : NIceDb::Schema {
- struct DateValue : Table<1> {
- struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
- struct Date : Column<2, NScheme::NTypeIds::Date> {};
- struct Datetime : Column<3, NScheme::NTypeIds::Datetime> {};
- struct Timestamp : Column<4, NScheme::NTypeIds::Timestamp> {};
- struct Interval : Column<5, NScheme::NTypeIds::Interval> {};
-
- using TKey = TableKey<Key>;
- using TColumns = TableColumns<Key, Date, Datetime, Timestamp, Interval>;
- };
-
- struct DateKey : Table<2> {
- struct Key : Column<1, NScheme::NTypeIds::Date> {};
- struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
-
- using TKey = TableKey<Key>;
- using TColumns = TableColumns<Key, Value>;
- };
-
- struct DatetimeKey : Table<3> {
- struct Key : Column<1, NScheme::NTypeIds::Datetime> {};
- struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
-
- using TKey = TableKey<Key>;
- using TColumns = TableColumns<Key, Value>;
- };
-
- struct TimestampKey : Table<4> {
- struct Key : Column<1, NScheme::NTypeIds::Timestamp> {};
- struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
-
- using TKey = TableKey<Key>;
- using TColumns = TableColumns<Key, Value>;
- };
-
- struct IntervalKey : Table<5> {
- struct Key : Column<1, NScheme::NTypeIds::Interval> {};
- struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
-
- using TKey = TableKey<Key>;
- using TColumns = TableColumns<Key, Value>;
- };
-
-
- using TTables = SchemaTables<DateValue, DateKey, DatetimeKey, TimestampKey, IntervalKey>;
- using TSettings = SchemaSettings<ExecutorLogBatching<true>,
- ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
- };
-
- template <typename T>
- static bool IsReady(T &t)
- {
- return t.IsReady();
- }
-
- template <typename T, typename ...Ts>
- static bool IsReady(T &t, Ts &...args)
- {
- return t.IsReady() && IsReady(args...);
- }
-
- struct TTxSchema : public ITransaction {
- TDateTestFlatTablet &Self;
-
- TTxSchema(TDateTestFlatTablet &self) : Self(self) {}
-
- bool Execute(TTransactionContext &txc, const TActorContext &) override {
- NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override {
- Self.Execute(new TTxStore(Self), ctx);
- }
- };
-
- struct TTxStore : public ITransaction {
- TDateTestFlatTablet &Self;
-
- TTxStore(TDateTestFlatTablet &self) : Self(self) {}
-
- bool Execute(TTransactionContext &txc, const TActorContext &) override {
- NIceDb::TNiceDb db(txc.DB);
-
- // DateValue
- db.Table<Schema::DateValue>().Key(1)
- .Update<Schema::DateValue::Date>(Min<ui16>())
- .Update<Schema::DateValue::Datetime>(Min<ui32>())
- .Update<Schema::DateValue::Timestamp>(Min<ui64>())
- .Update<Schema::DateValue::Interval>(Min<i64>());
- db.Table<Schema::DateValue>().Key(2)
- .Update<Schema::DateValue::Date>((ui16)100)
- .Update<Schema::DateValue::Datetime>((ui32)100)
- .Update<Schema::DateValue::Timestamp>((ui64)100)
- .Update<Schema::DateValue::Interval>((i64)100);
- db.Table<Schema::DateValue>().Key(3)
- .Update<Schema::DateValue::Date>(Max<ui16>())
- .Update<Schema::DateValue::Datetime>(Max<ui32>())
- .Update<Schema::DateValue::Timestamp>(Max<ui64>())
- .Update<Schema::DateValue::Interval>(Max<i64>());
-
- // DateKey
- for (ui16 i = 1; i <= 10; ++i) {
- db.Table<Schema::DateKey>().Key(i)
- .Update<Schema::DateKey::Value>(i);
- db.Table<Schema::DatetimeKey>().Key((ui32)i)
- .Update<Schema::DateKey::Value>(i);
- db.Table<Schema::TimestampKey>().Key((ui64)i)
- .Update<Schema::DateKey::Value>(i);
- db.Table<Schema::IntervalKey>().Key((i64)i - 5)
- .Update<Schema::DateKey::Value>(i);
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override {
- Self.Execute(new TTxSelectSingle(Self), ctx);
- }
- };
-
- struct TTxSelectSingle : public ITransaction {
- TDateTestFlatTablet &Self;
-
- TTxSelectSingle(TDateTestFlatTablet &self) : Self(self) {}
-
- bool Execute(TTransactionContext &txc, const TActorContext &) override {
- NIceDb::TNiceDb db(txc.DB);
-
- // DateValue
- {
- auto row1 = db.Table<Schema::DateValue>().Key(1).Select();
- auto row2 = db.Table<Schema::DateValue>().Key(2).Select();
- auto row3 = db.Table<Schema::DateValue>().Key(3).Select();
-
- if (!IsReady(row1, row2, row3))
- return false;
-
- UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Date>(), Min<ui16>());
- UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Datetime>(), Min<ui32>());
- UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Timestamp>(), Min<ui64>());
- UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Interval>(), Min<i64>());
- UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Date>(), (ui16)100);
- UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Datetime>(), (ui32)100);
- UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Timestamp>(), (ui64)100);
- UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Interval>(), (i64)100);
- UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Date>(), Max<ui16>());
- UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Datetime>(), Max<ui32>());
- UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Timestamp>(), Max<ui64>());
- UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Interval>(), Max<i64>());
- }
-
- // DateKey
- for (ui16 i = 1; i <= 10; ++i) {
- auto row = db.Table<Schema::DateKey>().Key(i).Select();
- if (!IsReady(row))
- return false;
- UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::DateKey::Value>(), (ui16)i);
- }
-
- // DatetimeKey
- for (ui32 i = 1; i <= 10; ++i) {
- auto row = db.Table<Schema::DatetimeKey>().Key(i).Select();
- if (!IsReady(row))
- return false;
- UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::DatetimeKey::Value>(), i);
- }
-
- // TimestampKey
- for (ui64 i = 1; i <= 10; ++i) {
- auto row = db.Table<Schema::TimestampKey>().Key(i).Select();
- if (!IsReady(row))
- return false;
- UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::TimestampKey::Value>(), i);
- }
-
- // IntervalKey
- for (i16 i = 1; i <= 10; ++i) {
- auto row = db.Table<Schema::IntervalKey>().Key(i - 5).Select();
- if (!IsReady(row))
- return false;
- UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::IntervalKey::Value>(), i);
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override {
- Self.Execute(new TTxSelectRange(Self), ctx);
- }
- };
-
- struct TTxSelectRange : public ITransaction {
- TDateTestFlatTablet &Self;
-
- TTxSelectRange(TDateTestFlatTablet &self) : Self(self) {}
-
- bool Execute(TTransactionContext &txc, const TActorContext &) override {
- NIceDb::TNiceDb db(txc.DB);
-
- // DateKey
- {
- auto rowset = db.Table<Schema::DateKey>().GreaterOrEqual(5).Select();
- if (!rowset.IsReady())
- return false;
- for (ui16 i = 5; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i);
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DateKey::Value>(), i);
- if (!rowset.Next())
- return false;
- }
- UNIT_ASSERT(rowset.EndOfSet());
- }
-
- // DatetimeKey
- {
- auto rowset = db.Table<Schema::DatetimeKey>().GreaterOrEqual(5).Select();
- if (!rowset.IsReady())
- return false;
- for (ui32 i = 5; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i);
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DatetimeKey::Value>(), i);
- if (!rowset.Next())
- return false;
- }
- UNIT_ASSERT(rowset.EndOfSet());
- }
-
- // TimestampKey
- {
- auto rowset = db.Table<Schema::TimestampKey>().GreaterOrEqual(5).Select();
- if (!rowset.IsReady())
- return false;
- for (ui64 i = 5; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i);
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::TimestampKey::Value>(), i);
- if (!rowset.Next())
- return false;
- }
- UNIT_ASSERT(rowset.EndOfSet());
- }
-
- // IntervalKey
- {
- auto rowset = db.Table<Schema::IntervalKey>().GreaterOrEqual(-2).Select();
- if (!rowset.IsReady())
- return false;
- for (i64 i = 3; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i - 5);
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::IntervalKey::Value>(), i);
- if (!rowset.Next())
- return false;
- }
- UNIT_ASSERT(rowset.EndOfSet());
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override {
- ctx.Send(ctx.SelfID, new TEvents::TEvWakeup);
- }
- };
-
- void OnActivateExecutor(const TActorContext &ctx) override {
- Become(&TThis::StateWork);
- Execute(new TTxSchema(*this), ctx);
- }
-
- void OnDetach(const TActorContext &ctx) override {
- Die(ctx);
- }
-
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override {
- Die(ctx);
- }
-
- void Handle(TEvents::TEvWakeup::TPtr &, const TActorContext &ctx) {
- ctx.Send(Sender, new TEvents::TEvWakeup);
- }
-
- STFUNC(StateInit) {
- StateInitImpl(ev, ctx);
- }
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvents::TEvWakeup, Handle);
- default:
- HandleDefaultEvents(ev, ctx);
- break;
- }
- }
-
- public:
+
+namespace NKikimr {
+namespace NTabletFlatExecutor {
+
+Y_UNIT_TEST_SUITE(TFlatTableDatetime) {
+ class TDateTestFlatTablet : public TActor<TDateTestFlatTablet>, public TTabletExecutedFlat {
+ struct Schema : NIceDb::Schema {
+ struct DateValue : Table<1> {
+ struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct Date : Column<2, NScheme::NTypeIds::Date> {};
+ struct Datetime : Column<3, NScheme::NTypeIds::Datetime> {};
+ struct Timestamp : Column<4, NScheme::NTypeIds::Timestamp> {};
+ struct Interval : Column<5, NScheme::NTypeIds::Interval> {};
+
+ using TKey = TableKey<Key>;
+ using TColumns = TableColumns<Key, Date, Datetime, Timestamp, Interval>;
+ };
+
+ struct DateKey : Table<2> {
+ struct Key : Column<1, NScheme::NTypeIds::Date> {};
+ struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
+
+ using TKey = TableKey<Key>;
+ using TColumns = TableColumns<Key, Value>;
+ };
+
+ struct DatetimeKey : Table<3> {
+ struct Key : Column<1, NScheme::NTypeIds::Datetime> {};
+ struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
+
+ using TKey = TableKey<Key>;
+ using TColumns = TableColumns<Key, Value>;
+ };
+
+ struct TimestampKey : Table<4> {
+ struct Key : Column<1, NScheme::NTypeIds::Timestamp> {};
+ struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
+
+ using TKey = TableKey<Key>;
+ using TColumns = TableColumns<Key, Value>;
+ };
+
+ struct IntervalKey : Table<5> {
+ struct Key : Column<1, NScheme::NTypeIds::Interval> {};
+ struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
+
+ using TKey = TableKey<Key>;
+ using TColumns = TableColumns<Key, Value>;
+ };
+
+
+ using TTables = SchemaTables<DateValue, DateKey, DatetimeKey, TimestampKey, IntervalKey>;
+ using TSettings = SchemaSettings<ExecutorLogBatching<true>,
+ ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
+ };
+
+ template <typename T>
+ static bool IsReady(T &t)
+ {
+ return t.IsReady();
+ }
+
+ template <typename T, typename ...Ts>
+ static bool IsReady(T &t, Ts &...args)
+ {
+ return t.IsReady() && IsReady(args...);
+ }
+
+ struct TTxSchema : public ITransaction {
+ TDateTestFlatTablet &Self;
+
+ TTxSchema(TDateTestFlatTablet &self) : Self(self) {}
+
+ bool Execute(TTransactionContext &txc, const TActorContext &) override {
+ NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override {
+ Self.Execute(new TTxStore(Self), ctx);
+ }
+ };
+
+ struct TTxStore : public ITransaction {
+ TDateTestFlatTablet &Self;
+
+ TTxStore(TDateTestFlatTablet &self) : Self(self) {}
+
+ bool Execute(TTransactionContext &txc, const TActorContext &) override {
+ NIceDb::TNiceDb db(txc.DB);
+
+ // DateValue
+ db.Table<Schema::DateValue>().Key(1)
+ .Update<Schema::DateValue::Date>(Min<ui16>())
+ .Update<Schema::DateValue::Datetime>(Min<ui32>())
+ .Update<Schema::DateValue::Timestamp>(Min<ui64>())
+ .Update<Schema::DateValue::Interval>(Min<i64>());
+ db.Table<Schema::DateValue>().Key(2)
+ .Update<Schema::DateValue::Date>((ui16)100)
+ .Update<Schema::DateValue::Datetime>((ui32)100)
+ .Update<Schema::DateValue::Timestamp>((ui64)100)
+ .Update<Schema::DateValue::Interval>((i64)100);
+ db.Table<Schema::DateValue>().Key(3)
+ .Update<Schema::DateValue::Date>(Max<ui16>())
+ .Update<Schema::DateValue::Datetime>(Max<ui32>())
+ .Update<Schema::DateValue::Timestamp>(Max<ui64>())
+ .Update<Schema::DateValue::Interval>(Max<i64>());
+
+ // DateKey
+ for (ui16 i = 1; i <= 10; ++i) {
+ db.Table<Schema::DateKey>().Key(i)
+ .Update<Schema::DateKey::Value>(i);
+ db.Table<Schema::DatetimeKey>().Key((ui32)i)
+ .Update<Schema::DateKey::Value>(i);
+ db.Table<Schema::TimestampKey>().Key((ui64)i)
+ .Update<Schema::DateKey::Value>(i);
+ db.Table<Schema::IntervalKey>().Key((i64)i - 5)
+ .Update<Schema::DateKey::Value>(i);
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override {
+ Self.Execute(new TTxSelectSingle(Self), ctx);
+ }
+ };
+
+ struct TTxSelectSingle : public ITransaction {
+ TDateTestFlatTablet &Self;
+
+ TTxSelectSingle(TDateTestFlatTablet &self) : Self(self) {}
+
+ bool Execute(TTransactionContext &txc, const TActorContext &) override {
+ NIceDb::TNiceDb db(txc.DB);
+
+ // DateValue
+ {
+ auto row1 = db.Table<Schema::DateValue>().Key(1).Select();
+ auto row2 = db.Table<Schema::DateValue>().Key(2).Select();
+ auto row3 = db.Table<Schema::DateValue>().Key(3).Select();
+
+ if (!IsReady(row1, row2, row3))
+ return false;
+
+ UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Date>(), Min<ui16>());
+ UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Datetime>(), Min<ui32>());
+ UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Timestamp>(), Min<ui64>());
+ UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Interval>(), Min<i64>());
+ UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Date>(), (ui16)100);
+ UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Datetime>(), (ui32)100);
+ UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Timestamp>(), (ui64)100);
+ UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Interval>(), (i64)100);
+ UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Date>(), Max<ui16>());
+ UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Datetime>(), Max<ui32>());
+ UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Timestamp>(), Max<ui64>());
+ UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Interval>(), Max<i64>());
+ }
+
+ // DateKey
+ for (ui16 i = 1; i <= 10; ++i) {
+ auto row = db.Table<Schema::DateKey>().Key(i).Select();
+ if (!IsReady(row))
+ return false;
+ UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::DateKey::Value>(), (ui16)i);
+ }
+
+ // DatetimeKey
+ for (ui32 i = 1; i <= 10; ++i) {
+ auto row = db.Table<Schema::DatetimeKey>().Key(i).Select();
+ if (!IsReady(row))
+ return false;
+ UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::DatetimeKey::Value>(), i);
+ }
+
+ // TimestampKey
+ for (ui64 i = 1; i <= 10; ++i) {
+ auto row = db.Table<Schema::TimestampKey>().Key(i).Select();
+ if (!IsReady(row))
+ return false;
+ UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::TimestampKey::Value>(), i);
+ }
+
+ // IntervalKey
+ for (i16 i = 1; i <= 10; ++i) {
+ auto row = db.Table<Schema::IntervalKey>().Key(i - 5).Select();
+ if (!IsReady(row))
+ return false;
+ UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::IntervalKey::Value>(), i);
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override {
+ Self.Execute(new TTxSelectRange(Self), ctx);
+ }
+ };
+
+ struct TTxSelectRange : public ITransaction {
+ TDateTestFlatTablet &Self;
+
+ TTxSelectRange(TDateTestFlatTablet &self) : Self(self) {}
+
+ bool Execute(TTransactionContext &txc, const TActorContext &) override {
+ NIceDb::TNiceDb db(txc.DB);
+
+ // DateKey
+ {
+ auto rowset = db.Table<Schema::DateKey>().GreaterOrEqual(5).Select();
+ if (!rowset.IsReady())
+ return false;
+ for (ui16 i = 5; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i);
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DateKey::Value>(), i);
+ if (!rowset.Next())
+ return false;
+ }
+ UNIT_ASSERT(rowset.EndOfSet());
+ }
+
+ // DatetimeKey
+ {
+ auto rowset = db.Table<Schema::DatetimeKey>().GreaterOrEqual(5).Select();
+ if (!rowset.IsReady())
+ return false;
+ for (ui32 i = 5; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i);
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DatetimeKey::Value>(), i);
+ if (!rowset.Next())
+ return false;
+ }
+ UNIT_ASSERT(rowset.EndOfSet());
+ }
+
+ // TimestampKey
+ {
+ auto rowset = db.Table<Schema::TimestampKey>().GreaterOrEqual(5).Select();
+ if (!rowset.IsReady())
+ return false;
+ for (ui64 i = 5; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i);
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::TimestampKey::Value>(), i);
+ if (!rowset.Next())
+ return false;
+ }
+ UNIT_ASSERT(rowset.EndOfSet());
+ }
+
+ // IntervalKey
+ {
+ auto rowset = db.Table<Schema::IntervalKey>().GreaterOrEqual(-2).Select();
+ if (!rowset.IsReady())
+ return false;
+ for (i64 i = 3; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i - 5);
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::IntervalKey::Value>(), i);
+ if (!rowset.Next())
+ return false;
+ }
+ UNIT_ASSERT(rowset.EndOfSet());
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override {
+ ctx.Send(ctx.SelfID, new TEvents::TEvWakeup);
+ }
+ };
+
+ void OnActivateExecutor(const TActorContext &ctx) override {
+ Become(&TThis::StateWork);
+ Execute(new TTxSchema(*this), ctx);
+ }
+
+ void OnDetach(const TActorContext &ctx) override {
+ Die(ctx);
+ }
+
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override {
+ Die(ctx);
+ }
+
+ void Handle(TEvents::TEvWakeup::TPtr &, const TActorContext &ctx) {
+ ctx.Send(Sender, new TEvents::TEvWakeup);
+ }
+
+ STFUNC(StateInit) {
+ StateInitImpl(ev, ctx);
+ }
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvents::TEvWakeup, Handle);
+ default:
+ HandleDefaultEvents(ev, ctx);
+ break;
+ }
+ }
+
+ public:
TDateTestFlatTablet(const TActorId &sender, const TActorId &tablet, TTabletStorageInfo *info)
- : TActor(&TThis::StateInit)
- , TTabletExecutedFlat(info, tablet, nullptr)
- , Sender(sender)
- {
- }
-
- private:
+ : TActor(&TThis::StateInit)
+ , TTabletExecutedFlat(info, tablet, nullptr)
+ , Sender(sender)
+ {
+ }
+
+ private:
TActorId Sender;
- };
-
- struct TDateEnvProfiles : public NFake::TRunner {
- TDateEnvProfiles()
- : Edge(Env.AllocateEdgeActor())
- {
- }
-
- void Run()
- {
+ };
+
+ struct TDateEnvProfiles : public NFake::TRunner {
+ TDateEnvProfiles()
+ : Edge(Env.AllocateEdgeActor())
+ {
+ }
+
+ void Run()
+ {
FireTablet(Edge, Tablet, [this](const TActorId &tablet, TTabletStorageInfo *info) {
- return new TDateTestFlatTablet(Edge, tablet, info);
- });
-
- TAutoPtr<IEventHandle> handle;
- Env.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
- }
-
- const ui32 Tablet = MakeTabletID(0, 0, 1);
+ return new TDateTestFlatTablet(Edge, tablet, info);
+ });
+
+ TAutoPtr<IEventHandle> handle;
+ Env.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+ }
+
+ const ui32 Tablet = MakeTabletID(0, 0, 1);
const TActorId Edge;
- };
-
- Y_UNIT_TEST(TestDate) {
- TDateEnvProfiles env;
- env.Run();
- };
-}
-
-} // namespace NTabletFlatExecutor
-} // namespace NKikimr
+ };
+
+ Y_UNIT_TEST(TestDate) {
+ TDateEnvProfiles env;
+ env.Run();
+ };
+}
+
+} // namespace NTabletFlatExecutor
+} // namespace NKikimr
diff --git a/ydb/core/tablet_flat/decimal_ut.cpp b/ydb/core/tablet_flat/decimal_ut.cpp
index 6f6bc12ee3d..685215aa5a9 100644
--- a/ydb/core/tablet_flat/decimal_ut.cpp
+++ b/ydb/core/tablet_flat/decimal_ut.cpp
@@ -1,428 +1,428 @@
-#include "tablet_flat_executed.h"
-#include "flat_executor.h"
-
+#include "tablet_flat_executed.h"
+#include "flat_executor.h"
+
#include <ydb/core/scheme/scheme_types_defs.h>
#include <ydb/core/tablet_flat/flat_executor_compaction_logic.h>
#include <ydb/core/tablet_flat/flat_cxx_database.h>
#include <ydb/core/tablet_flat/test/libs/exec/runner.h>
#include <ydb/core/tablet_flat/ut/flat_database_ut_common.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace NKikimr {
-namespace NTabletFlatExecutor {
-
-Y_UNIT_TEST_SUITE(TFlatTableDecimals) {
- class TDecimalTestFlatTablet : public TActor<TDecimalTestFlatTablet>, public TTabletExecutedFlat {
- struct Schema : NIceDb::Schema {
- struct DecimalValue : Table<1> {
- struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
- struct Value : Column<2, NScheme::NTypeIds::Decimal> {};
-
- using TKey = TableKey<Key>;
- using TColumns = TableColumns<Key, Value>;
- };
-
- struct DecimalKey : Table<2> {
- struct Key : Column<1, NScheme::NTypeIds::Decimal> {};
- struct Value : Column<2, NScheme::NTypeIds::Decimal> {};
-
- using TKey = TableKey<Key>;
- using TColumns = TableColumns<Key, Value>;
- };
-
- struct DecimalCompoundKey : Table<3> {
- struct Key1 : Column<1, NScheme::NTypeIds::Decimal> {};
- struct Key2 : Column<2, NScheme::NTypeIds::Int32> {};
- struct Key3 : Column<3, NScheme::NTypeIds::Decimal> {};
- struct Value : Column<4, NScheme::NTypeIds::Decimal> {};
-
- using TKey = TableKey<Key1, Key2, Key3>;
- using TColumns = TableColumns<Key1, Key2, Key3, Value>;
- };
-
- using TTables = SchemaTables<DecimalValue, DecimalKey, DecimalCompoundKey>;
- using TSettings = SchemaSettings<ExecutorLogBatching<true>,
- ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
- };
-
- template <typename T>
- static bool IsReady(T &t)
- {
- return t.IsReady();
- }
-
- template <typename T, typename ...Ts>
- static bool IsReady(T &t, Ts &...args)
- {
- return t.IsReady() && IsReady(args...);
- }
-
- struct TTxSchema : public ITransaction {
- TDecimalTestFlatTablet &Self;
-
- TTxSchema(TDecimalTestFlatTablet &self) : Self(self) {}
-
- bool Execute(TTransactionContext &txc, const TActorContext &) override {
- NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override {
- Self.Execute(new TTxStore(Self), ctx);
- }
- };
-
- struct TTxStore : public ITransaction {
- TDecimalTestFlatTablet &Self;
-
- TTxStore(TDecimalTestFlatTablet &self) : Self(self) {}
-
- bool Execute(TTransactionContext &txc, const TActorContext &) override {
- NIceDb::TNiceDb db(txc.DB);
-
- // DecimalValue
- db.Table<Schema::DecimalValue>().Key(1)
- .Update<Schema::DecimalValue::Value>(std::pair<ui64, i64>(1, 0));
- db.Table<Schema::DecimalValue>().Key(2)
- .Update<Schema::DecimalValue::Value>(std::pair<ui64, i64>(0, 2));
- db.Table<Schema::DecimalValue>().Key(3)
- .Update<Schema::DecimalValue::Value>(std::pair<ui64, i64>(0xffffffffffffffff, 3));
- db.Table<Schema::DecimalValue>().Key(4)
- .Update<Schema::DecimalValue::Value>(std::pair<ui64, i64>(4, 0xffffffffffffffff));
- db.Table<Schema::DecimalValue>().Key(5)
- .Update<Schema::DecimalValue::Value>(std::pair<ui64, i64>(0xffffffffffffffff, 0xffffffffffffffff));
-
- // DecimalKey
- for (int i = 1; i <= 10; ++i) {
- db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0))
- .Update<Schema::DecimalKey::Value>(std::pair<ui64, i64>(i, 0));
- db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(0, i))
- .Update<Schema::DecimalKey::Value>(std::pair<ui64, i64>(i, i));
- db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffffff))
- .Update<Schema::DecimalKey::Value>(std::pair<ui64, i64>(i, 0x1234567890123456));
- db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffff00))
- .Update<Schema::DecimalKey::Value>(std::pair<ui64, i64>(i + i, 0x6543210987654321));
- }
-
- // DecimalCompoundKey
- for (int i = 1; i <= 10; ++i) {
- db.Table<Schema::DecimalCompoundKey>().Key(std::pair<ui64, i64>(i, 0), i, std::pair<ui64, i64>(0, i))
- .Update<Schema::DecimalCompoundKey::Value>(std::pair<ui64, i64>(i, 0));
- db.Table<Schema::DecimalCompoundKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffffff), i, std::pair<ui64, i64>(0, i))
- .Update<Schema::DecimalCompoundKey::Value>(std::pair<ui64, i64>(i, 0xffffffffffffffff));
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override {
- Self.Execute(new TTxSelectSingle(Self), ctx);
- }
- };
-
- struct TTxSelectSingle : public ITransaction {
- TDecimalTestFlatTablet &Self;
-
- TTxSelectSingle(TDecimalTestFlatTablet &self) : Self(self) {}
-
- bool Execute(TTransactionContext &txc, const TActorContext &) override {
- NIceDb::TNiceDb db(txc.DB);
-
- // DecimalValue
- {
- auto row1 = db.Table<Schema::DecimalValue>().Key(1).Select<Schema::DecimalValue::Value>();
- auto row2 = db.Table<Schema::DecimalValue>().Key(2).Select<Schema::DecimalValue::Value>();
- auto row3 = db.Table<Schema::DecimalValue>().Key(3).Select<Schema::DecimalValue::Value>();
- auto row4 = db.Table<Schema::DecimalValue>().Key(4).Select<Schema::DecimalValue::Value>();
- auto row5 = db.Table<Schema::DecimalValue>().Key(5).Select<Schema::DecimalValue::Value>();
-
- if (!IsReady(row1, row2, row3, row4, row5))
- return false;
-
- UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DecimalValue::Value>(), (std::pair<ui64, i64>(1, 0)));
- UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DecimalValue::Value>(), (std::pair<ui64, i64>(0, 2)));
- UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DecimalValue::Value>(), (std::pair<ui64, i64>(0xffffffffffffffff, 3)));
- UNIT_ASSERT_VALUES_EQUAL(row4.GetValue<Schema::DecimalValue::Value>(), (std::pair<ui64, i64>(4, 0xffffffffffffffff)));
- UNIT_ASSERT_VALUES_EQUAL(row5.GetValue<Schema::DecimalValue::Value>(), (std::pair<ui64, i64>(0xffffffffffffffff, 0xffffffffffffffff)));
- }
-
- // DecimalKey
- for (int i = 1; i <= 10; ++i) {
- auto row1 = db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0)).Select<Schema::DecimalKey::Value>();
- auto row2 = db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(0, i)).Select<Schema::DecimalKey::Value>();
- auto row3 = db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffffff)).Select<Schema::DecimalKey::Value>();
- auto row4 = db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffff00)).Select<Schema::DecimalKey::Value>();
-
- if (!IsReady(row1, row2, row3, row4))
- return false;
-
- UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0)));
- UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, i)));
- UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0x1234567890123456)));
- UNIT_ASSERT_VALUES_EQUAL(row4.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i + i, 0x6543210987654321)));
- }
-
- // DecimalCompoundKey
- for (int i = 1; i <= 10; ++i) {
- auto row1 = db.Table<Schema::DecimalCompoundKey>().Key(std::pair<ui64, i64>(i, 0), i, std::pair<ui64, i64>(0, i)).Select<Schema::DecimalCompoundKey::Value>();
- auto row2 = db.Table<Schema::DecimalCompoundKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffffff), i, std::pair<ui64, i64>(0, i)).Select<Schema::DecimalCompoundKey::Value>();
-
- if (!IsReady(row1, row2))
- return false;
-
- UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DecimalCompoundKey::Value>(), (std::pair<ui64, i64>(i, 0)));
- UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DecimalCompoundKey::Value>(), (std::pair<ui64, i64>(i, 0xffffffffffffffff)));
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override {
- Self.Execute(new TTxSelectRange(Self), ctx);
- }
- };
-
- struct TTxSelectRange : public ITransaction {
- TDecimalTestFlatTablet &Self;
-
- TTxSelectRange(TDecimalTestFlatTablet &self) : Self(self) {}
-
- bool Execute(TTransactionContext &txc, const TActorContext &) override {
- NIceDb::TNiceDb db(txc.DB);
-
- // DecimalKey
- {
- auto rowset = db.Table<Schema::DecimalKey>().GreaterOrEqual(std::pair<ui64, i64>(1, 0)).Select();
- if (!rowset.IsReady())
- return false;
- for (int i = 1; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0)));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0)));
- if (!rowset.Next())
- return false;
- }
- for (int i = 1; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(0, i)));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, i)));
- if (!rowset.Next())
- return false;
- }
- UNIT_ASSERT(rowset.EndOfSet());
- }
-
- // DecimalKey
- {
- auto rowset = db.Table<Schema::DecimalKey>().GreaterOrEqual(std::pair<ui64, i64>(11, 0)).Select();
- if (!rowset.IsReady())
- return false;
- for (int i = 1; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(0, i)));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, i)));
- if (!rowset.Next())
- return false;
- }
- UNIT_ASSERT(rowset.EndOfSet());
- }
-
- // DecimalKey
- {
- auto rowset = db.Table<Schema::DecimalKey>().GreaterOrEqual(std::pair<ui64, i64>(6, 0xffffffffffffff00)).Select();
- if (!rowset.IsReady())
- return false;
- for (int i = 6; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0xffffffffffffff00)));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i + i, 0x6543210987654321)));
- if (!rowset.Next())
- return false;
- }
- for (int i = 1; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0xffffffffffffffff)));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0x1234567890123456)));
- if (!rowset.Next())
- return false;
- }
- for (int i = 1; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0)));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0)));
- if (!rowset.Next())
- return false;
- }
- for (int i = 1; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(0, i)));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, i)));
- if (!rowset.Next())
- return false;
- }
- UNIT_ASSERT(rowset.EndOfSet());
- }
-
- // DecimalKey
- {
- auto rowset = db.Table<Schema::DecimalKey>().LessOrEqual(std::pair<ui64, i64>(6, 0xffffffffffffff00)).Select();
- if (!rowset.IsReady())
- return false;
- for (int i = 1; i <= 6; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0xffffffffffffff00)));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i + i, 0x6543210987654321)));
- if (!rowset.Next())
- return false;
- }
- UNIT_ASSERT(rowset.EndOfSet());
- }
-
- // DecimalKey
- {
- auto rowset = db.Table<Schema::DecimalKey>().LessOrEqual(std::pair<ui64, i64>(3, 0)).Select();
- if (!rowset.IsReady())
- return false;
- for (int i = 1; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0xffffffffffffff00)));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i + i, 0x6543210987654321)));
- if (!rowset.Next())
- return false;
- }
- for (int i = 1; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0xffffffffffffffff)));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0x1234567890123456)));
- if (!rowset.Next())
- return false;
- }
- for (int i = 1; i <= 3; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0)));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0)));
- if (!rowset.Next())
- return false;
- }
- UNIT_ASSERT(rowset.EndOfSet());
- }
-
- // DecimalCompoundKey
- {
- auto rowset = db.Table<Schema::DecimalCompoundKey>().GreaterOrEqual(std::pair<ui64, i64>(3, 0), 3, std::pair<ui64, i64>(0, 3)).Select();
- if (!rowset.IsReady())
- return false;
-
- for (int i = 3; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_EQUAL(rowset.GetKey(), (std::make_tuple(std::pair<ui64, i64>(i, 0), i, std::pair<ui64, i64>(0, i))));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalCompoundKey::Value>(), (std::pair<ui64, i64>(i, 0)));
- if (!rowset.Next())
- return false;
- }
- UNIT_ASSERT(rowset.EndOfSet());
- }
-
- // DecimalCompoundKey
- {
- auto rowset = db.Table<Schema::DecimalCompoundKey>().LessOrEqual(std::pair<ui64, i64>(3, 0), 3, std::pair<ui64, i64>(0, 3)).Select();
- if (!rowset.IsReady())
- return false;
-
- for (int i = 1; i <= 10; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_EQUAL(rowset.GetKey(), (std::make_tuple(std::pair<ui64, i64>(i, 0xffffffffffffffff), i, std::pair<ui64, i64>(0, i))));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalCompoundKey::Value>(), (std::pair<ui64, i64>(i, 0xffffffffffffffff)));
- if (!rowset.Next())
- return false;
- }
- for (int i = 1; i <= 3; ++i) {
- UNIT_ASSERT(!rowset.EndOfSet());
- UNIT_ASSERT_EQUAL(rowset.GetKey(), (std::make_tuple(std::pair<ui64, i64>(i, 0), i, std::pair<ui64, i64>(0, i))));
- UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalCompoundKey::Value>(), (std::pair<ui64, i64>(i, 0)));
- if (!rowset.Next())
- return false;
- }
- UNIT_ASSERT(rowset.EndOfSet());
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override {
- ctx.Send(ctx.SelfID, new TEvents::TEvWakeup);
- }
- };
-
- void OnActivateExecutor(const TActorContext &ctx) override {
- Become(&TThis::StateWork);
- Execute(new TTxSchema(*this), ctx);
- }
-
- void OnDetach(const TActorContext &ctx) override {
- Die(ctx);
- }
-
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override {
- Die(ctx);
- }
-
- void Handle(TEvents::TEvWakeup::TPtr &, const TActorContext &ctx) {
- ctx.Send(Sender, new TEvents::TEvWakeup);
- }
-
- STFUNC(StateInit) {
- StateInitImpl(ev, ctx);
- }
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvents::TEvWakeup, Handle);
- default:
- HandleDefaultEvents(ev, ctx);
- break;
- }
- }
-
- public:
+
+namespace NKikimr {
+namespace NTabletFlatExecutor {
+
+Y_UNIT_TEST_SUITE(TFlatTableDecimals) {
+ class TDecimalTestFlatTablet : public TActor<TDecimalTestFlatTablet>, public TTabletExecutedFlat {
+ struct Schema : NIceDb::Schema {
+ struct DecimalValue : Table<1> {
+ struct Key : Column<1, NScheme::NTypeIds::Uint32> {};
+ struct Value : Column<2, NScheme::NTypeIds::Decimal> {};
+
+ using TKey = TableKey<Key>;
+ using TColumns = TableColumns<Key, Value>;
+ };
+
+ struct DecimalKey : Table<2> {
+ struct Key : Column<1, NScheme::NTypeIds::Decimal> {};
+ struct Value : Column<2, NScheme::NTypeIds::Decimal> {};
+
+ using TKey = TableKey<Key>;
+ using TColumns = TableColumns<Key, Value>;
+ };
+
+ struct DecimalCompoundKey : Table<3> {
+ struct Key1 : Column<1, NScheme::NTypeIds::Decimal> {};
+ struct Key2 : Column<2, NScheme::NTypeIds::Int32> {};
+ struct Key3 : Column<3, NScheme::NTypeIds::Decimal> {};
+ struct Value : Column<4, NScheme::NTypeIds::Decimal> {};
+
+ using TKey = TableKey<Key1, Key2, Key3>;
+ using TColumns = TableColumns<Key1, Key2, Key3, Value>;
+ };
+
+ using TTables = SchemaTables<DecimalValue, DecimalKey, DecimalCompoundKey>;
+ using TSettings = SchemaSettings<ExecutorLogBatching<true>,
+ ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
+ };
+
+ template <typename T>
+ static bool IsReady(T &t)
+ {
+ return t.IsReady();
+ }
+
+ template <typename T, typename ...Ts>
+ static bool IsReady(T &t, Ts &...args)
+ {
+ return t.IsReady() && IsReady(args...);
+ }
+
+ struct TTxSchema : public ITransaction {
+ TDecimalTestFlatTablet &Self;
+
+ TTxSchema(TDecimalTestFlatTablet &self) : Self(self) {}
+
+ bool Execute(TTransactionContext &txc, const TActorContext &) override {
+ NIceDb::TNiceDb(txc.DB).Materialize<Schema>();
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override {
+ Self.Execute(new TTxStore(Self), ctx);
+ }
+ };
+
+ struct TTxStore : public ITransaction {
+ TDecimalTestFlatTablet &Self;
+
+ TTxStore(TDecimalTestFlatTablet &self) : Self(self) {}
+
+ bool Execute(TTransactionContext &txc, const TActorContext &) override {
+ NIceDb::TNiceDb db(txc.DB);
+
+ // DecimalValue
+ db.Table<Schema::DecimalValue>().Key(1)
+ .Update<Schema::DecimalValue::Value>(std::pair<ui64, i64>(1, 0));
+ db.Table<Schema::DecimalValue>().Key(2)
+ .Update<Schema::DecimalValue::Value>(std::pair<ui64, i64>(0, 2));
+ db.Table<Schema::DecimalValue>().Key(3)
+ .Update<Schema::DecimalValue::Value>(std::pair<ui64, i64>(0xffffffffffffffff, 3));
+ db.Table<Schema::DecimalValue>().Key(4)
+ .Update<Schema::DecimalValue::Value>(std::pair<ui64, i64>(4, 0xffffffffffffffff));
+ db.Table<Schema::DecimalValue>().Key(5)
+ .Update<Schema::DecimalValue::Value>(std::pair<ui64, i64>(0xffffffffffffffff, 0xffffffffffffffff));
+
+ // DecimalKey
+ for (int i = 1; i <= 10; ++i) {
+ db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0))
+ .Update<Schema::DecimalKey::Value>(std::pair<ui64, i64>(i, 0));
+ db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(0, i))
+ .Update<Schema::DecimalKey::Value>(std::pair<ui64, i64>(i, i));
+ db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffffff))
+ .Update<Schema::DecimalKey::Value>(std::pair<ui64, i64>(i, 0x1234567890123456));
+ db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffff00))
+ .Update<Schema::DecimalKey::Value>(std::pair<ui64, i64>(i + i, 0x6543210987654321));
+ }
+
+ // DecimalCompoundKey
+ for (int i = 1; i <= 10; ++i) {
+ db.Table<Schema::DecimalCompoundKey>().Key(std::pair<ui64, i64>(i, 0), i, std::pair<ui64, i64>(0, i))
+ .Update<Schema::DecimalCompoundKey::Value>(std::pair<ui64, i64>(i, 0));
+ db.Table<Schema::DecimalCompoundKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffffff), i, std::pair<ui64, i64>(0, i))
+ .Update<Schema::DecimalCompoundKey::Value>(std::pair<ui64, i64>(i, 0xffffffffffffffff));
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override {
+ Self.Execute(new TTxSelectSingle(Self), ctx);
+ }
+ };
+
+ struct TTxSelectSingle : public ITransaction {
+ TDecimalTestFlatTablet &Self;
+
+ TTxSelectSingle(TDecimalTestFlatTablet &self) : Self(self) {}
+
+ bool Execute(TTransactionContext &txc, const TActorContext &) override {
+ NIceDb::TNiceDb db(txc.DB);
+
+ // DecimalValue
+ {
+ auto row1 = db.Table<Schema::DecimalValue>().Key(1).Select<Schema::DecimalValue::Value>();
+ auto row2 = db.Table<Schema::DecimalValue>().Key(2).Select<Schema::DecimalValue::Value>();
+ auto row3 = db.Table<Schema::DecimalValue>().Key(3).Select<Schema::DecimalValue::Value>();
+ auto row4 = db.Table<Schema::DecimalValue>().Key(4).Select<Schema::DecimalValue::Value>();
+ auto row5 = db.Table<Schema::DecimalValue>().Key(5).Select<Schema::DecimalValue::Value>();
+
+ if (!IsReady(row1, row2, row3, row4, row5))
+ return false;
+
+ UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DecimalValue::Value>(), (std::pair<ui64, i64>(1, 0)));
+ UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DecimalValue::Value>(), (std::pair<ui64, i64>(0, 2)));
+ UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DecimalValue::Value>(), (std::pair<ui64, i64>(0xffffffffffffffff, 3)));
+ UNIT_ASSERT_VALUES_EQUAL(row4.GetValue<Schema::DecimalValue::Value>(), (std::pair<ui64, i64>(4, 0xffffffffffffffff)));
+ UNIT_ASSERT_VALUES_EQUAL(row5.GetValue<Schema::DecimalValue::Value>(), (std::pair<ui64, i64>(0xffffffffffffffff, 0xffffffffffffffff)));
+ }
+
+ // DecimalKey
+ for (int i = 1; i <= 10; ++i) {
+ auto row1 = db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0)).Select<Schema::DecimalKey::Value>();
+ auto row2 = db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(0, i)).Select<Schema::DecimalKey::Value>();
+ auto row3 = db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffffff)).Select<Schema::DecimalKey::Value>();
+ auto row4 = db.Table<Schema::DecimalKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffff00)).Select<Schema::DecimalKey::Value>();
+
+ if (!IsReady(row1, row2, row3, row4))
+ return false;
+
+ UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0)));
+ UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, i)));
+ UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0x1234567890123456)));
+ UNIT_ASSERT_VALUES_EQUAL(row4.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i + i, 0x6543210987654321)));
+ }
+
+ // DecimalCompoundKey
+ for (int i = 1; i <= 10; ++i) {
+ auto row1 = db.Table<Schema::DecimalCompoundKey>().Key(std::pair<ui64, i64>(i, 0), i, std::pair<ui64, i64>(0, i)).Select<Schema::DecimalCompoundKey::Value>();
+ auto row2 = db.Table<Schema::DecimalCompoundKey>().Key(std::pair<ui64, i64>(i, 0xffffffffffffffff), i, std::pair<ui64, i64>(0, i)).Select<Schema::DecimalCompoundKey::Value>();
+
+ if (!IsReady(row1, row2))
+ return false;
+
+ UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DecimalCompoundKey::Value>(), (std::pair<ui64, i64>(i, 0)));
+ UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DecimalCompoundKey::Value>(), (std::pair<ui64, i64>(i, 0xffffffffffffffff)));
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override {
+ Self.Execute(new TTxSelectRange(Self), ctx);
+ }
+ };
+
+ struct TTxSelectRange : public ITransaction {
+ TDecimalTestFlatTablet &Self;
+
+ TTxSelectRange(TDecimalTestFlatTablet &self) : Self(self) {}
+
+ bool Execute(TTransactionContext &txc, const TActorContext &) override {
+ NIceDb::TNiceDb db(txc.DB);
+
+ // DecimalKey
+ {
+ auto rowset = db.Table<Schema::DecimalKey>().GreaterOrEqual(std::pair<ui64, i64>(1, 0)).Select();
+ if (!rowset.IsReady())
+ return false;
+ for (int i = 1; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0)));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0)));
+ if (!rowset.Next())
+ return false;
+ }
+ for (int i = 1; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(0, i)));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, i)));
+ if (!rowset.Next())
+ return false;
+ }
+ UNIT_ASSERT(rowset.EndOfSet());
+ }
+
+ // DecimalKey
+ {
+ auto rowset = db.Table<Schema::DecimalKey>().GreaterOrEqual(std::pair<ui64, i64>(11, 0)).Select();
+ if (!rowset.IsReady())
+ return false;
+ for (int i = 1; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(0, i)));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, i)));
+ if (!rowset.Next())
+ return false;
+ }
+ UNIT_ASSERT(rowset.EndOfSet());
+ }
+
+ // DecimalKey
+ {
+ auto rowset = db.Table<Schema::DecimalKey>().GreaterOrEqual(std::pair<ui64, i64>(6, 0xffffffffffffff00)).Select();
+ if (!rowset.IsReady())
+ return false;
+ for (int i = 6; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0xffffffffffffff00)));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i + i, 0x6543210987654321)));
+ if (!rowset.Next())
+ return false;
+ }
+ for (int i = 1; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0xffffffffffffffff)));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0x1234567890123456)));
+ if (!rowset.Next())
+ return false;
+ }
+ for (int i = 1; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0)));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0)));
+ if (!rowset.Next())
+ return false;
+ }
+ for (int i = 1; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(0, i)));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, i)));
+ if (!rowset.Next())
+ return false;
+ }
+ UNIT_ASSERT(rowset.EndOfSet());
+ }
+
+ // DecimalKey
+ {
+ auto rowset = db.Table<Schema::DecimalKey>().LessOrEqual(std::pair<ui64, i64>(6, 0xffffffffffffff00)).Select();
+ if (!rowset.IsReady())
+ return false;
+ for (int i = 1; i <= 6; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0xffffffffffffff00)));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i + i, 0x6543210987654321)));
+ if (!rowset.Next())
+ return false;
+ }
+ UNIT_ASSERT(rowset.EndOfSet());
+ }
+
+ // DecimalKey
+ {
+ auto rowset = db.Table<Schema::DecimalKey>().LessOrEqual(std::pair<ui64, i64>(3, 0)).Select();
+ if (!rowset.IsReady())
+ return false;
+ for (int i = 1; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0xffffffffffffff00)));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i + i, 0x6543210987654321)));
+ if (!rowset.Next())
+ return false;
+ }
+ for (int i = 1; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0xffffffffffffffff)));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0x1234567890123456)));
+ if (!rowset.Next())
+ return false;
+ }
+ for (int i = 1; i <= 3; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), (std::pair<ui64, i64>(i, 0)));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalKey::Value>(), (std::pair<ui64, i64>(i, 0)));
+ if (!rowset.Next())
+ return false;
+ }
+ UNIT_ASSERT(rowset.EndOfSet());
+ }
+
+ // DecimalCompoundKey
+ {
+ auto rowset = db.Table<Schema::DecimalCompoundKey>().GreaterOrEqual(std::pair<ui64, i64>(3, 0), 3, std::pair<ui64, i64>(0, 3)).Select();
+ if (!rowset.IsReady())
+ return false;
+
+ for (int i = 3; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_EQUAL(rowset.GetKey(), (std::make_tuple(std::pair<ui64, i64>(i, 0), i, std::pair<ui64, i64>(0, i))));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalCompoundKey::Value>(), (std::pair<ui64, i64>(i, 0)));
+ if (!rowset.Next())
+ return false;
+ }
+ UNIT_ASSERT(rowset.EndOfSet());
+ }
+
+ // DecimalCompoundKey
+ {
+ auto rowset = db.Table<Schema::DecimalCompoundKey>().LessOrEqual(std::pair<ui64, i64>(3, 0), 3, std::pair<ui64, i64>(0, 3)).Select();
+ if (!rowset.IsReady())
+ return false;
+
+ for (int i = 1; i <= 10; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_EQUAL(rowset.GetKey(), (std::make_tuple(std::pair<ui64, i64>(i, 0xffffffffffffffff), i, std::pair<ui64, i64>(0, i))));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalCompoundKey::Value>(), (std::pair<ui64, i64>(i, 0xffffffffffffffff)));
+ if (!rowset.Next())
+ return false;
+ }
+ for (int i = 1; i <= 3; ++i) {
+ UNIT_ASSERT(!rowset.EndOfSet());
+ UNIT_ASSERT_EQUAL(rowset.GetKey(), (std::make_tuple(std::pair<ui64, i64>(i, 0), i, std::pair<ui64, i64>(0, i))));
+ UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::DecimalCompoundKey::Value>(), (std::pair<ui64, i64>(i, 0)));
+ if (!rowset.Next())
+ return false;
+ }
+ UNIT_ASSERT(rowset.EndOfSet());
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override {
+ ctx.Send(ctx.SelfID, new TEvents::TEvWakeup);
+ }
+ };
+
+ void OnActivateExecutor(const TActorContext &ctx) override {
+ Become(&TThis::StateWork);
+ Execute(new TTxSchema(*this), ctx);
+ }
+
+ void OnDetach(const TActorContext &ctx) override {
+ Die(ctx);
+ }
+
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override {
+ Die(ctx);
+ }
+
+ void Handle(TEvents::TEvWakeup::TPtr &, const TActorContext &ctx) {
+ ctx.Send(Sender, new TEvents::TEvWakeup);
+ }
+
+ STFUNC(StateInit) {
+ StateInitImpl(ev, ctx);
+ }
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvents::TEvWakeup, Handle);
+ default:
+ HandleDefaultEvents(ev, ctx);
+ break;
+ }
+ }
+
+ public:
TDecimalTestFlatTablet(const TActorId &sender, const TActorId &tablet, TTabletStorageInfo *info)
- : TActor(&TThis::StateInit)
- , TTabletExecutedFlat(info, tablet, nullptr)
- , Sender(sender)
- {
- }
-
- private:
+ : TActor(&TThis::StateInit)
+ , TTabletExecutedFlat(info, tablet, nullptr)
+ , Sender(sender)
+ {
+ }
+
+ private:
TActorId Sender;
- };
-
- struct TDecimalEnvProfiles : public NFake::TRunner {
- TDecimalEnvProfiles()
- : Edge(Env.AllocateEdgeActor())
- {
- }
-
- void Run()
- {
+ };
+
+ struct TDecimalEnvProfiles : public NFake::TRunner {
+ TDecimalEnvProfiles()
+ : Edge(Env.AllocateEdgeActor())
+ {
+ }
+
+ void Run()
+ {
FireTablet(Edge, Tablet, [this](const TActorId &tablet, TTabletStorageInfo *info) {
- return new TDecimalTestFlatTablet(Edge, tablet, info);
- });
-
- TAutoPtr<IEventHandle> handle;
- Env.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
- }
-
- const ui32 Tablet = MakeTabletID(0, 0, 1);
+ return new TDecimalTestFlatTablet(Edge, tablet, info);
+ });
+
+ TAutoPtr<IEventHandle> handle;
+ Env.GrabEdgeEventRethrow<TEvents::TEvWakeup>(handle);
+ }
+
+ const ui32 Tablet = MakeTabletID(0, 0, 1);
const TActorId Edge;
- };
-
- Y_UNIT_TEST(TestDecimal) {
- TDecimalEnvProfiles env;
- env.Run();
- };
-}
-
-} // namespace NTabletFlatExecutor
-} // namespace NKikimr
+ };
+
+ Y_UNIT_TEST(TestDecimal) {
+ TDecimalEnvProfiles env;
+ env.Run();
+ };
+}
+
+} // namespace NTabletFlatExecutor
+} // namespace NKikimr
diff --git a/ydb/core/tablet_flat/flat_cxx_database.h b/ydb/core/tablet_flat/flat_cxx_database.h
index 8defeab1c4d..27a260bcb27 100644
--- a/ydb/core/tablet_flat/flat_cxx_database.h
+++ b/ydb/core/tablet_flat/flat_cxx_database.h
@@ -9,8 +9,8 @@
#include <library/cpp/containers/stack_vector/stack_vec.h>
#include <utility>
-#include <cxxabi.h>
-
+#include <cxxabi.h>
+
// https://wiki.yandex-team.ru/kikimr/techdoc/db/cxxapi/nicedb/
namespace NKikimr {
@@ -41,10 +41,10 @@ public:
: TRawTypeValue(&value, sizeof(value), type)
{}
- TTypeValue(const ui16& value, NScheme::TTypeId type = NScheme::NTypeIds::Date)
- : TRawTypeValue(&value, sizeof(value), type)
- {}
-
+ TTypeValue(const ui16& value, NScheme::TTypeId type = NScheme::NTypeIds::Date)
+ : TRawTypeValue(&value, sizeof(value), type)
+ {}
+
TTypeValue(const ui8& value, NScheme::TTypeId type = NScheme::NTypeIds::Byte)
: TRawTypeValue(&value, sizeof(value), type)
{}
@@ -70,10 +70,10 @@ public:
: TRawTypeValue(&value, sizeof(value), type)
{}
- TTypeValue(const std::pair<ui64, i64>& value, NScheme::TTypeId type = NScheme::NTypeIds::Decimal)
- : TRawTypeValue(&value, sizeof(value), type)
- {}
-
+ TTypeValue(const std::pair<ui64, i64>& value, NScheme::TTypeId type = NScheme::NTypeIds::Decimal)
+ : TRawTypeValue(&value, sizeof(value), type)
+ {}
+
TTypeValue(const TString& value, NScheme::TTypeId type = NScheme::NTypeIds::Utf8)
: TRawTypeValue(value.data(), value.size(), type)
{}
@@ -103,23 +103,23 @@ public:
}
operator ui64() const {
- Y_VERIFY((Type() == NScheme::NTypeIds::Uint64
- || Type() == NScheme::NTypeIds::Timestamp)
- && Size() == sizeof(ui64), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
+ Y_VERIFY((Type() == NScheme::NTypeIds::Uint64
+ || Type() == NScheme::NTypeIds::Timestamp)
+ && Size() == sizeof(ui64), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
return ReadUnaligned<ui64>(reinterpret_cast<const ui64*>(Data()));
}
operator i64() const {
- Y_VERIFY((Type() == NScheme::NTypeIds::Int64
- || Type() == NScheme::NTypeIds::Interval)
- && Size() == sizeof(i64), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
+ Y_VERIFY((Type() == NScheme::NTypeIds::Int64
+ || Type() == NScheme::NTypeIds::Interval)
+ && Size() == sizeof(i64), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
return ReadUnaligned<i64>(reinterpret_cast<const i64*>(Data()));
}
operator ui32() const {
- Y_VERIFY((Type() == NScheme::NTypeIds::Uint32
- || Type() == NScheme::NTypeIds::Datetime)
- && Size() == sizeof(ui32), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
+ Y_VERIFY((Type() == NScheme::NTypeIds::Uint32
+ || Type() == NScheme::NTypeIds::Datetime)
+ && Size() == sizeof(ui32), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
ui32 value = ReadUnaligned<ui32>(reinterpret_cast<const ui32*>(Data()));
return value;
}
@@ -130,12 +130,12 @@ public:
return value;
}
- operator ui16() const {
- Y_VERIFY(Type() == NScheme::NTypeIds::Date && Size() == sizeof(ui16), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
- ui16 value = ReadUnaligned<ui16>(reinterpret_cast<const ui16*>(Data()));
- return value;
- }
-
+ operator ui16() const {
+ Y_VERIFY(Type() == NScheme::NTypeIds::Date && Size() == sizeof(ui16), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
+ ui16 value = ReadUnaligned<ui16>(reinterpret_cast<const ui16*>(Data()));
+ return value;
+ }
+
operator ui8() const {
Y_VERIFY(Type() == NScheme::NTypeIds::Byte && Size() == sizeof(ui8), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
ui8 value = *reinterpret_cast<const ui8*>(Data());
@@ -182,11 +182,11 @@ public:
return *reinterpret_cast<const std::pair<ui64, ui64>*>(Data());
}
- operator std::pair<ui64, i64>() const {
- Y_VERIFY(Type() == NScheme::NTypeIds::Decimal && Size() == sizeof(std::pair<ui64, ui64>), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
- return *reinterpret_cast<const std::pair<ui64, i64>*>(Data());
- }
-
+ operator std::pair<ui64, i64>() const {
+ Y_VERIFY(Type() == NScheme::NTypeIds::Decimal && Size() == sizeof(std::pair<ui64, ui64>), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
+ return *reinterpret_cast<const std::pair<ui64, i64>*>(Data());
+ }
+
template <typename ElementType>
operator TVector<ElementType>() const {
static_assert(std::is_pod<ElementType>::value, "ElementType should be a POD type");
@@ -226,11 +226,11 @@ template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Utf8> { typedef TString
template <> struct NSchemeTypeMapper<NScheme::NTypeIds::ActorId> { typedef TActorId Type; };
template <> struct NSchemeTypeMapper<NScheme::NTypeIds::PairUi64Ui64> { typedef std::pair<ui64, ui64> Type; };
template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Double> { typedef double Type; };
-template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Decimal> { typedef std::pair<ui64, i64> Type; };
-template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Date> { typedef ui16 Type; };
-template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Datetime> { typedef ui32 Type; };
-template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Timestamp> { typedef ui64 Type; };
-template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Interval> { typedef i64 Type; };
+template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Decimal> { typedef std::pair<ui64, i64> Type; };
+template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Date> { typedef ui16 Type; };
+template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Datetime> { typedef ui32 Type; };
+template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Timestamp> { typedef ui64 Type; };
+template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Interval> { typedef i64 Type; };
/// only for compatibility with old code
template <NScheme::TTypeId ValType>
diff --git a/ydb/core/tablet_flat/flat_dbase_apply.cpp b/ydb/core/tablet_flat/flat_dbase_apply.cpp
index 7a8b8d39d62..f87b315d332 100644
--- a/ydb/core/tablet_flat/flat_dbase_apply.cpp
+++ b/ydb/core/tablet_flat/flat_dbase_apply.cpp
@@ -116,8 +116,8 @@ bool TSchemeModifier::Apply(const TAlterRecord &delta)
changes |= SetExecutorLogFlushPeriod(TDuration::MicroSeconds(delta.GetExecutorLogFlushPeriod()));
if (delta.HasExecutorLimitInFlyTx())
changes |= SetExecutorLimitInFlyTx(delta.GetExecutorLimitInFlyTx());
- if (delta.HasExecutorResourceProfile())
- changes |= SetExecutorResourceProfile(delta.GetExecutorResourceProfile());
+ if (delta.HasExecutorResourceProfile())
+ changes |= SetExecutorResourceProfile(delta.GetExecutorResourceProfile());
if (delta.HasExecutorLogFastCommitTactic())
changes |= SetExecutorLogFastCommitTactic(delta.GetExecutorLogFastCommitTactic());
} else if (action == TAlterRecord::SetCompactionPolicy) {
@@ -260,11 +260,11 @@ bool TSchemeModifier::SetExecutorLimitInFlyTx(ui32 limit)
return std::exchange(Scheme.Executor.LimitInFlyTx, limit) != limit;
}
-bool TSchemeModifier::SetExecutorResourceProfile(const TString &name)
-{
- return std::exchange(Scheme.Executor.ResourceProfile, name) != name;
-}
-
+bool TSchemeModifier::SetExecutorResourceProfile(const TString &name)
+{
+ return std::exchange(Scheme.Executor.ResourceProfile, name) != name;
+}
+
bool TSchemeModifier::SetCompactionPolicy(ui32 tid, const NKikimrSchemeOp::TCompactionPolicy &proto)
{
auto *table = Table(tid);
diff --git a/ydb/core/tablet_flat/flat_dbase_apply.h b/ydb/core/tablet_flat/flat_dbase_apply.h
index 7d3fc123f66..3502030b71b 100644
--- a/ydb/core/tablet_flat/flat_dbase_apply.h
+++ b/ydb/core/tablet_flat/flat_dbase_apply.h
@@ -42,7 +42,7 @@ namespace NTable {
bool SetExecutorLogFastCommitTactic(bool allow);
bool SetExecutorLogFlushPeriod(TDuration flushPeriod);
bool SetExecutorLimitInFlyTx(ui32 limitTxInFly);
- bool SetExecutorResourceProfile(const TString &name);
+ bool SetExecutorResourceProfile(const TString &name);
bool SetCompactionPolicy(ui32 tableId, const NKikimrSchemeOp::TCompactionPolicy& newPolicy);
TTable* Table(ui32 tid) const noexcept
diff --git a/ydb/core/tablet_flat/flat_dbase_scheme.cpp b/ydb/core/tablet_flat/flat_dbase_scheme.cpp
index d307b590a8a..fa12005009b 100644
--- a/ydb/core/tablet_flat/flat_dbase_scheme.cpp
+++ b/ydb/core/tablet_flat/flat_dbase_scheme.cpp
@@ -52,7 +52,7 @@ TAutoPtr<TSchemeChanges> TScheme::GetSnapshot() const {
delta.SetExecutorCacheSize(Executor.CacheSize);
delta.SetExecutorAllowLogBatching(Executor.AllowLogBatching);
delta.SetExecutorLogFlushPeriod(Executor.LogFlushPeriod);
- delta.SetExecutorResourceProfile(Executor.ResourceProfile);
+ delta.SetExecutorResourceProfile(Executor.ResourceProfile);
delta.SetExecutorFastLogPolicy(Executor.LogFastTactic);
return delta.Flush();
@@ -241,11 +241,11 @@ TAlter& TAlter::SetExecutorResourceProfile(const TString &name)
{
TAlterRecord &delta = *Log.AddDelta();
delta.SetDeltaType(TAlterRecord::UpdateExecutorInfo);
- delta.SetExecutorResourceProfile(name);
+ delta.SetExecutorResourceProfile(name);
return *this;
-}
-
+}
+
TAlter& TAlter::SetCompactionPolicy(ui32 tableId, const TCompactionPolicy& newPolicy)
{
TAlterRecord &delta = *Log.AddDelta();
diff --git a/ydb/core/tablet_flat/flat_dbase_scheme.h b/ydb/core/tablet_flat/flat_dbase_scheme.h
index 7f761aeb925..1fd5ed2b480 100644
--- a/ydb/core/tablet_flat/flat_dbase_scheme.h
+++ b/ydb/core/tablet_flat/flat_dbase_scheme.h
@@ -128,7 +128,7 @@ public:
bool LogFastTactic = true;
TDuration LogFlushPeriod = TDuration::MicroSeconds(500);
ui32 LimitInFlyTx = 0;
- TString ResourceProfile = "default";
+ TString ResourceProfile = "default";
ECompactionStrategy DefaultCompactionStrategy = NKikimrSchemeOp::CompactionStrategyGenerational;
};
diff --git a/ydb/core/tablet_flat/flat_executor.cpp b/ydb/core/tablet_flat/flat_executor.cpp
index a025ce63348..59afc462158 100644
--- a/ydb/core/tablet_flat/flat_executor.cpp
+++ b/ydb/core/tablet_flat/flat_executor.cpp
@@ -60,8 +60,8 @@ struct TCompactionChangesCtx {
TTableSnapshotContext::TTableSnapshotContext() = default;
TTableSnapshotContext::~TTableSnapshotContext() = default;
-using namespace NResourceBroker;
-
+using namespace NResourceBroker;
+
TExecutor::TExecutor(
NFlatExecutorSetup::ITablet* owner,
const TActorId& ownerActorId)
@@ -269,8 +269,8 @@ void TExecutor::UpdateYellow() {
void TExecutor::UpdateCompactions() {
CompactionLogic->UpdateCompactions();
Schedule(TDuration::Minutes(1), new TEvPrivate::TEvUpdateCompactions);
-}
-
+}
+
void TExecutor::Handle(TEvTablet::TEvCheckBlobstorageStatusResult::TPtr &ev) {
Y_VERIFY(HasYellowCheckInFly);
HasYellowCheckInFly = false;
@@ -392,7 +392,7 @@ void TExecutor::Active(const TActorContext &ctx) {
PendingBlobQueue.Config.Follower = false;
PendingBlobQueue.Config.NoDataCounter = GetServiceCounters(AppData()->Counters, "tablets")->GetCounter("alerts_pending_nodata", true);
- ReadResourceProfile();
+ ReadResourceProfile();
RecreatePageCollectionsCache();
ReflectSchemeSettings();
@@ -1418,22 +1418,22 @@ void TExecutor::Execute(TAutoPtr<ITransaction> self, const TActorContext &ctx) {
}
ui64 staticRemain = Memory->RemainedStatic(*seat);
-
- // Submit resource broker task if there is no enough memory to start
- // new transaction.
+
+ // Submit resource broker task if there is no enough memory to start
+ // new transaction.
seat->CurrentTxDataLimit = Memory->Profile->GetInitialTxMemory();
if (staticRemain < seat->CurrentTxDataLimit) {
LWTRACK(TransactionNeedMemory, seat->Self->Orbit, seat->UniqID);
Memory->RequestLimit(*seat, seat->CurrentTxDataLimit);
auto *transptr = seat.Release();
- auto pairIt = PostponedTransactions.emplace(transptr, transptr);
- Y_VERIFY(pairIt.second);
-
- return;
- }
-
+ auto pairIt = PostponedTransactions.emplace(transptr, transptr);
+ Y_VERIFY(pairIt.second);
+
+ return;
+ }
+
Memory->AllocStatic(*seat, Memory->Profile->GetInitialTxMemory());
-
+
if (!CanExecuteTransaction()
|| Scheme().Executor.LimitInFlyTx && Stats->TxInFly > Scheme().Executor.LimitInFlyTx)
{
@@ -1441,7 +1441,7 @@ void TExecutor::Execute(TAutoPtr<ITransaction> self, const TActorContext &ctx) {
CanExecuteTransaction() ? "tx limit reached" : "transactions paused");
PendingQueue->Push(seat.Release());
++Stats->TxPending;
- return;
+ return;
}
if (ActiveTransaction || ActivateTransactionWaiting) {
@@ -1504,16 +1504,16 @@ void TExecutor::ExecuteTransaction(TAutoPtr<TSeat> seat, const TActorContext &ct
seat->RequestedMemory = txc.GetRequestedMemory();
seat->CapturedMemory = txc.GetMemoryGCToken();
seat->NotEnoughMemoryCount = txc.GetNotEnoughMemoryCount();
-
- if (seat->AttachedMemory)
+
+ if (seat->AttachedMemory)
Counters->Cumulative()[TExecutorCounters::TX_MEM_ATTACHES].Increment(1);
- if (seat->RequestedMemory)
+ if (seat->RequestedMemory)
Counters->Cumulative()[TExecutorCounters::TX_MEM_REQUESTS].Increment(1);
- if (seat->CapturedMemory) {
+ if (seat->CapturedMemory) {
Counters->Cumulative()[TExecutorCounters::TX_MEM_CAPTURES].Increment(1);
Memory->ScheduleGC();
- }
-
+ }
+
const auto& txStats = prod.Change->Stats;
Counters->Cumulative()[TExecutorCounters::TX_CHARGE_WEEDED].Increment(txStats.ChargeWeeded);
Counters->Cumulative()[TExecutorCounters::TX_CHARGE_SIEVED].Increment(txStats.ChargeSieved);
@@ -1532,7 +1532,7 @@ void TExecutor::ExecuteTransaction(TAutoPtr<TSeat> seat, const TActorContext &ct
seat->OnCommitted = std::move(txc.OnCommitted_);
CommitTransactionLog(seat, env, prod.Change, cpuTimer, ctx);
} else {
- Y_VERIFY(!seat->CapturedMemory);
+ Y_VERIFY(!seat->CapturedMemory);
PostponeTransaction(seat, env, prod.Change, cpuTimer, ctx);
}
@@ -1564,20 +1564,20 @@ void TExecutor::ReleaseTxData(TSeat &seat, ui64 requested, const TActorContext &
logl << NFmt::Do(*this) << " " << NFmt::Do(seat) << " release tx data";
TTxMemoryProvider provider(seat.CurrentTxDataLimit - requested, seat.TaskId);
- static_cast<TTxMemoryProviderBase&>(provider).RequestMemory(requested);
+ static_cast<TTxMemoryProviderBase&>(provider).RequestMemory(requested);
seat.Self->ReleaseTxData(provider, ctx.MakeFor(OwnerActorId));
-
+
Counters->Cumulative()[TExecutorCounters::TX_DATA_RELEASES].Increment(1);
-
+
if (seat.CapturedMemory = provider.GetMemoryGCToken())
Counters->Cumulative()[TExecutorCounters::TX_MEM_CAPTURES].Increment(1);
-
+
Memory->ReleaseTxData(seat);
-}
-
+}
+
void TExecutor::PostponeTransaction(TAutoPtr<TSeat> seat, TPageCollectionTxEnv &env,
TAutoPtr<NTable::TChange> change,
- THPTimer &bookkeepingTimer, const TActorContext &ctx) {
+ THPTimer &bookkeepingTimer, const TActorContext &ctx) {
if (!env.ToLoad && !seat->RequestedMemory) {
Y_Fail(NFmt::Do(*this) << " " << NFmt::Do(*seat) << " type "
<< NFmt::Do(*seat->Self) << " postoned w/o demands");
@@ -1609,7 +1609,7 @@ void TExecutor::PostponeTransaction(TAutoPtr<TSeat> seat, TPageCollectionTxEnv &
touchedBytes = seat->MemoryTouched - prevTouched;
prevTouched = seat->MemoryTouched;
-
+
for (auto &xpair : env.ToLoad) {
TPrivatePageCache::TInfo *pageCollectionInfo = xpair.first;
auto &pinned = seat->Pinned[pageCollectionInfo->Id];
@@ -1637,12 +1637,12 @@ void TExecutor::PostponeTransaction(TAutoPtr<TSeat> seat, TPageCollectionTxEnv &
<< ", " << requestedMemory << "b requested for data"
<< " (" << seat->CurrentTxDataLimit << "b in total)";
}
-
- // Check if additional resources should be requested.
+
+ // Check if additional resources should be requested.
ui64 totalMemory = seat->MemoryTouched + seat->CurrentTxDataLimit;
auto limit = Memory->Profile->GetTxMemoryLimit();
- if (limit && totalMemory > limit) {
-
+ if (limit && totalMemory > limit) {
+
if (auto logl = Logger->Log(ELnLev::Error)) {
logl
<< NFmt::Do(*this) << " " << NFmt::Do(*seat)
@@ -1654,50 +1654,50 @@ void TExecutor::PostponeTransaction(TAutoPtr<TSeat> seat, TPageCollectionTxEnv &
CommitTransactionLog(seat, env, change, bookkeepingTimer, ctx);
return;
} else if (totalMemory > seat->CurrentMemoryLimit) {
-
- // We usually try to at least double allocated memory. But it's OK to use less
- // to avoid resource broker request.
+
+ // We usually try to at least double allocated memory. But it's OK to use less
+ // to avoid resource broker request.
ui64 desired = Max(totalMemory, seat->CurrentMemoryLimit * 2);
- bool allocated = false;
-
- // Try to allocate static memory.
+ bool allocated = false;
+
+ // Try to allocate static memory.
if (!seat->TaskId) {
ui64 staticRemain = Memory->RemainedStatic(*seat);
if (staticRemain >= totalMemory - seat->CurrentMemoryLimit) {
ui64 limit = Min(staticRemain + seat->CurrentMemoryLimit, desired);
Memory->AllocStatic(*seat, limit);
- allocated = true;
- }
- }
-
- // Submit or resubmit task with new resource requirements.
- if (!allocated) {
+ allocated = true;
+ }
+ }
+
+ // Submit or resubmit task with new resource requirements.
+ if (!allocated) {
LWTRACK(TransactionNeedMemory, seat->Self->Orbit, seat->UniqID);
Memory->FreeStatic(*seat, 0);
UnpinTransactionPages(*seat);
ReleaseTxData(*seat, requestedMemory, ctx);
-
+
Memory->RequestLimit(*seat, desired);
auto *transptr = seat.Release();
- auto pairIt = PostponedTransactions.emplace(transptr, transptr);
- Y_VERIFY(pairIt.second);
-
- // todo: counters
- return;
- }
+ auto pairIt = PostponedTransactions.emplace(transptr, transptr);
+ Y_VERIFY(pairIt.second);
+
+ // todo: counters
+ return;
+ }
}
- // If memory was allocated and there is nothing to load
- // then tx may be re-activated.
+ // If memory was allocated and there is nothing to load
+ // then tx may be re-activated.
if (!env.ToLoad) {
LWTRACK(TransactionEnqueued, seat->Self->Orbit, seat->UniqID);
ActivationQueue->Push(seat.Release());
ActivateTransactionWaiting++;
PlanTransactionActivation();
- return;
- }
-
+ return;
+ }
+
LWTRACK(TransactionPageFault, seat->Self->Orbit, seat->UniqID);
auto padHolder = MakeHolder<TTransactionWaitPad>(std::move(seat));
auto *const pad = padHolder.Get();
@@ -1781,16 +1781,16 @@ void TExecutor::CommitTransactionLog(TAutoPtr<TSeat> seat, TPageCollectionTxEnv
const double currentBookkeepingTime = seat->CPUBookkeepingTime;
const double currentExecTime = seat->CPUExecTime;
- if (isTerminated) {
+ if (isTerminated) {
if (Stats->IsFollower) {
- --Stats->TxInFly;
+ --Stats->TxInFly;
Counters->Simple()[TExecutorCounters::DB_TX_IN_FLY] = Stats->TxInFly;
seat->Self->Terminate(seat->TerminationReason, OwnerCtx());
} else if (LogicRedo->TerminateTransaction(seat, ctx, OwnerActorId)) {
- --Stats->TxInFly;
- Counters->Simple()[TExecutorCounters::DB_TX_IN_FLY] = Stats->TxInFly;
- }
- } else if (isReadOnly) {
+ --Stats->TxInFly;
+ Counters->Simple()[TExecutorCounters::DB_TX_IN_FLY] = Stats->TxInFly;
+ }
+ } else if (isReadOnly) {
if (Stats->IsFollower) {
// todo: extract completion counters from txloglogic
--Stats->TxInFly;
@@ -1844,7 +1844,7 @@ void TExecutor::CommitTransactionLog(TAutoPtr<TSeat> seat, TPageCollectionTxEnv
PrivatePageCache->UpdateCacheSize(Scheme().Executor.CacheSize);
auto reflectResult = CompactionLogic->ReflectSchemeChanges();
- ReadResourceProfile();
+ ReadResourceProfile();
ReflectSchemeSettings();
// For every table that changed strategy we need to generate a
@@ -2728,7 +2728,7 @@ void TExecutor::StartSeat(ui64 task, TResource *cookie_) noexcept
}
THolder<TScanSnapshot> TExecutor::PrepareScanSnapshot(ui32 table, const NTable::TCompactionParams *params, TRowVersion snapshot)
-{
+{
LogicRedo->FlushBatchedLog();
auto commit = CommitManager->Begin(true, ECommit::Misc);
@@ -2770,14 +2770,14 @@ THolder<TScanSnapshot> TExecutor::PrepareScanSnapshot(ui32 table, const NTable::
CompactionLogic->UpdateLogUsage(LogicRedo->GrabLogUsage());
return THolder<TScanSnapshot>(new TScanSnapshot{table, std::move(barrier), subset, snapshot});
-}
-
+}
+
void TExecutor::StartScan(ui64 serial, ui32 table) noexcept
{
Y_UNUSED(table);
Scans->Start(serial);
-}
-
+}
+
void TExecutor::StartScan(ui64 task, TResource *cookie) noexcept
{
if (auto acquired = Scans->Acquired(task, cookie)) {
@@ -2888,14 +2888,14 @@ void TExecutor::UtilizeSubset(const NTable::TSubset &subset,
}
void TExecutor::ReleaseScanLocks(TIntrusivePtr<TBarrier> barrier, const NTable::TSubset &subset)
-{
+{
CheckCollectionBarrier(barrier);
-
+
for (auto &partView : subset.Flatten)
if (PrivatePageCache->UnlockPageCollection(partView->Label))
Send(MakeSharedPageCacheId(), new NSharedCache::TEvInvalidate(partView->Label));
-}
-
+}
+
void TExecutor::Handle(NOps::TEvScanStat::TPtr &ev, const TActorContext &ctx) {
auto *msg = ev->Get();
@@ -2913,7 +2913,7 @@ void TExecutor::Handle(NOps::TEvResult::TPtr &ev) {
/* System scans are used for compactions and specially handled */
Handle(msg, CheckedCast<TProdCompact*>(msg->Result.Get()), outcome.Cancelled);
}
-
+
ReleaseScanLocks(std::move(msg->Barrier), *msg->Subset);
}
@@ -3203,15 +3203,15 @@ void TExecutor::Handle(NOps::TEvResult *ops, TProdCompact *msg, bool cancelled)
}
}
-void TExecutor::UpdateUsedTabletMemory() {
+void TExecutor::UpdateUsedTabletMemory() {
UsedTabletMemory = 0;
- // Estimate memory usage for internal executor structures.
+ // Estimate memory usage for internal executor structures.
UsedTabletMemory += 50 << 10; // 50kb
// Count the number of bytes exclusive to private cache.
if (PrivatePageCache) {
UsedTabletMemory += PrivatePageCache->GetStats().TotalExclusive;
}
- // Estimate memory used by database structures.
+ // Estimate memory used by database structures.
auto &counters = Database->Counters();
UsedTabletMemory += counters.MemTableWaste;
UsedTabletMemory += counters.MemTableBytes;
@@ -3220,17 +3220,17 @@ void TExecutor::UpdateUsedTabletMemory() {
UsedTabletMemory += counters.Parts.ByKeyBytes;
UsedTabletMemory += Stats->PacksMetaBytes;
- // Add tablet memory usage.
- UsedTabletMemory += Owner->GetMemoryUsage();
-}
-
+ // Add tablet memory usage.
+ UsedTabletMemory += Owner->GetMemoryUsage();
+}
+
void TExecutor::UpdateCounters(const TActorContext &ctx) {
TAutoPtr<TTabletCountersBase> executorCounters;
TAutoPtr<TTabletCountersBase> externalTabletCounters;
if (CounterEventsInFlight.RefCount() == 1) {
- UpdateUsedTabletMemory();
-
+ UpdateUsedTabletMemory();
+
if (Counters) {
const auto& dbCounters = Database->Counters();
@@ -3290,7 +3290,7 @@ void TExecutor::UpdateCounters(const TActorContext &ctx) {
}
Counters->Simple()[TExecutorCounters::DB_UNIQUE_KEEP_BYTES].Set(BorrowLogic->GetKeepBytes());
}
-
+
if (GcLogic) {
auto gcInfo = GcLogic->IntrospectStateSize();
Counters->Simple()[TExecutorCounters::GC_BLOBS_UNCOMMITTED].Set(gcInfo.UncommitedBlobIds);
@@ -3325,7 +3325,7 @@ void TExecutor::UpdateCounters(const TActorContext &ctx) {
+ Counters->Simple()[TExecutorCounters::DB_UNIQUE_KEEP_BYTES].Get();
ResourceMetrics->StorageSystem.Set(storageSize);
-
+
auto limit = Memory->Profile->GetStaticTabletTxMemoryLimit();
auto memorySize = limit ? (UsedTabletMemory + limit) : (UsedTabletMemory + memory.Static);
ResourceMetrics->Memory.Set(memorySize);
@@ -3432,25 +3432,25 @@ TString TExecutor::BorrowSnapshot(ui32 table, const TTableSnapshotContext &snap,
}
ui64 TExecutor::MakeScanSnapshot(ui32 table)
-{
+{
if (auto snapshot = PrepareScanSnapshot(table, nullptr)) {
ScanSnapshots.emplace(++ScanSnapshotId, std::move(snapshot));
return ScanSnapshotId;
} else {
- return 0;
+ return 0;
}
-}
-
+}
+
void TExecutor::DropScanSnapshot(ui64 snap)
-{
+{
auto it = ScanSnapshots.find(snap);
- if (it != ScanSnapshots.end()) {
+ if (it != ScanSnapshots.end()) {
ReleaseScanLocks(std::move(it->second->Barrier), *it->second->Subset);
- ScanSnapshots.erase(it);
- }
-}
-
+ ScanSnapshots.erase(it);
+ }
+}
+
ui64 TExecutor::QueueScan(ui32 tableId, TAutoPtr<NTable::IScan> scan, ui64 cookie, const TScanOptions& options)
{
THolder<TScanSnapshot> snapshot;
@@ -3761,11 +3761,11 @@ void TExecutor::RenderHtmlPage(NMon::TEvRemoteHttpInfo::TPtr &ev) const {
H3() {str << "Storage:";}
DIV_CLASS("row") {str << "Bytes pinned in cache: " << PrivatePageCache->GetStats().PinnedSetSize << Endl; }
DIV_CLASS("row") {str << "Bytes pinned to load: " << PrivatePageCache->GetStats().PinnedLoadSize << Endl; }
-
- H3() {str << "Resource usage:";}
- DIV_CLASS("row") {str << "used tablet memory: " << UsedTabletMemory; }
+
+ H3() {str << "Resource usage:";}
+ DIV_CLASS("row") {str << "used tablet memory: " << UsedTabletMemory; }
Memory->DumpStateToHTML(str);
-
+
if (CompactionLogic)
CompactionLogic->OutputHtml(str, *scheme, cgi);
@@ -3832,8 +3832,8 @@ void TExecutor::GetTabletCounters(TEvTablet::TEvGetCounters::TPtr &ev) {
void TExecutor::UpdateConfig(TEvTablet::TEvUpdateConfig::TPtr &ev) {
Memory->SetProfiles(ev->Get()->ResourceProfiles);
ReadResourceProfile();
-}
-
+}
+
void TExecutor::SendUserAuxUpdateToFollowers(TString upd, const TActorContext &ctx) {
Y_VERIFY(Stats->IsActive && !Stats->IsFollower);
@@ -3849,13 +3849,13 @@ NMetrics::TResourceMetrics* TExecutor::GetResourceMetrics() const {
return ResourceMetrics.Get();
}
-void TExecutor::ReadResourceProfile() {
+void TExecutor::ReadResourceProfile() {
if (Database) {
auto type = static_cast<TMemory::ETablet>(Owner->TabletType());
Memory->UseProfile(type, Scheme().Executor.ResourceProfile);
}
-}
-
+}
+
TString TExecutor::CheckBorrowConsistency() {
THashSet<TLogoBlobID> knownBundles;
for (auto& kv : Scheme().Tables) {
diff --git a/ydb/core/tablet_flat/flat_executor.h b/ydb/core/tablet_flat/flat_executor.h
index 250a5173c64..df08b3a338a 100644
--- a/ydb/core/tablet_flat/flat_executor.h
+++ b/ydb/core/tablet_flat/flat_executor.h
@@ -22,16 +22,16 @@
#include "flat_sausage_grind.h"
#include "shared_cache_events.h"
#include "util_fmt_logger.h"
-
+
#include <ydb/core/control/immediate_control_board_wrapper.h>
#include <ydb/core/tablet/tablet_counters.h>
#include <ydb/core/tablet/tablet_counters_aggregator.h>
#include <ydb/core/tablet/tablet_counters_protobuf.h>
#include <ydb/core/tablet/tablet_metrics.h>
#include <ydb/core/util/queue_oneone_inplace.h>
-
+
#include <library/cpp/monlib/dynamic_counters/counters.h>
-
+
#include <util/system/hp_timer.h>
#include <util/thread/singleton.h>
@@ -330,7 +330,7 @@ class TExecutor
EvActivateExecution = EventSpaceBegin(TKikimrEvents::ES_PRIVATE),
EvUpdateCounters,
EvCheckYellow,
- EvUpdateCompactions,
+ EvUpdateCompactions,
EvActivateCompactionRead,
EvActivateCompactionChanges,
EvBrokenTransaction,
@@ -343,7 +343,7 @@ class TExecutor
struct TEvActivateExecution : public TEventLocal<TEvActivateExecution, EvActivateExecution> {};
struct TEvUpdateCounters : public TEventLocal<TEvUpdateCounters, EvUpdateCounters> {};
struct TEvCheckYellow : public TEventLocal<TEvCheckYellow, EvCheckYellow> {};
- struct TEvUpdateCompactions : public TEventLocal<TEvUpdateCompactions, EvUpdateCompactions> {};
+ struct TEvUpdateCompactions : public TEventLocal<TEvUpdateCompactions, EvUpdateCompactions> {};
struct TEvActivateCompactionRead : public TEventLocal<TEvActivateCompactionRead, EvActivateCompactionRead> {};
struct TEvActivateCompactionChanges : public TEventLocal<TEvActivateCompactionChanges, EvActivateCompactionChanges> {};
struct TEvBrokenTransaction : public TEventLocal<TEvBrokenTransaction, EvBrokenTransaction> {};
@@ -435,7 +435,7 @@ class TExecutor
size_t ReadyPartSwitches = 0;
ui64 UsedTabletMemory = 0;
-
+
TActorContext OwnerCtx() const;
TControlWrapper LogFlushDelayOverrideUsec;
@@ -469,9 +469,9 @@ class TExecutor
void TranscriptFollowerBootOpResult(ui32 res, const TActorContext &ctx);
void ExecuteTransaction(TAutoPtr<TSeat> seat, const TActorContext &ctx);
void CommitTransactionLog(TAutoPtr<TSeat>, TPageCollectionTxEnv&, TAutoPtr<NTable::TChange>,
- THPTimer &bookkeepingTimer, const TActorContext &ctx);
+ THPTimer &bookkeepingTimer, const TActorContext &ctx);
void UnpinTransactionPages(TSeat &seat);
- void ReleaseTxData(TSeat &seat, ui64 requested, const TActorContext &ctx);
+ void ReleaseTxData(TSeat &seat, ui64 requested, const TActorContext &ctx);
void PostponeTransaction(TAutoPtr<TSeat>, TPageCollectionTxEnv&, TAutoPtr<NTable::TChange>, THPTimer &bookkeepingTimer, const TActorContext &ctx);
void PlanTransactionActivation();
void MakeLogSnapshot();
@@ -492,7 +492,7 @@ class TExecutor
void StartScan(ui64 serial, ui32 table) noexcept;
void StartScan(ui64 task, TResource*) noexcept;
void StartSeat(ui64 task, TResource*) noexcept;
- void PostponedScanCleared(NResourceBroker::TEvResourceBroker::TEvResourceAllocated *msg, const TActorContext &ctx);
+ void PostponedScanCleared(NResourceBroker::TEvResourceBroker::TEvResourceAllocated *msg, const TActorContext &ctx);
void ApplyFollowerUpdate(THolder<TEvTablet::TFUpdateBody> update);
void ApplyFollowerAuxUpdate(const TString &auxBody);
@@ -517,15 +517,15 @@ class TExecutor
void Handle(NOps::TEvResult *ops, TProdCompact *msg, bool cancelled);
void Handle(TEvBlobStorage::TEvGetResult::TPtr&, const TActorContext&);
- void UpdateUsedTabletMemory();
+ void UpdateUsedTabletMemory();
void UpdateCounters(const TActorContext &ctx);
void UpdateYellow();
void UpdateCompactions();
void Handle(TEvTablet::TEvCheckBlobstorageStatusResult::TPtr &ev);
-
- void ReadResourceProfile();
+
+ void ReadResourceProfile();
TString CheckBorrowConsistency();
-
+
// ICompactionBackend API
ui64 OwnerTabletId() const override;
@@ -601,7 +601,7 @@ public:
void GetTabletCounters(TEvTablet::TEvGetCounters::TPtr &ev) override;
void UpdateConfig(TEvTablet::TEvUpdateConfig::TPtr &ev) override;
-
+
void SendUserAuxUpdateToFollowers(TString upd, const TActorContext &ctx) override;
THashMap<TLogoBlobID, TVector<ui64>> GetBorrowedParts() const override;
diff --git a/ydb/core/tablet_flat/flat_executor_compaction_logic.cpp b/ydb/core/tablet_flat/flat_executor_compaction_logic.cpp
index 9e7981cf23f..3d699e8f87b 100644
--- a/ydb/core/tablet_flat/flat_executor_compaction_logic.cpp
+++ b/ydb/core/tablet_flat/flat_executor_compaction_logic.cpp
@@ -27,7 +27,7 @@ TCompactionLogic::TCompactionLogic(NUtil::ILogger *logger,
, Backend(backend)
, Time(TAppData::TimeProvider.Get())
, State(state)
- , TaskNameSuffix(taskNameSuffix)
+ , TaskNameSuffix(taskNameSuffix)
{}
TCompactionLogic::~TCompactionLogic()
@@ -56,28 +56,28 @@ TCompactionLogicState::TSnapshotState TCompactionLogic::SnapToLog(ui32 tableId)
}
void TCompactionLogic::UpdateCompactions()
-{
- for (auto &tpr : State->Tables) {
- auto &tableInfo = tpr.second;
- auto &policy = *tableInfo.Policy;
- auto &inMem = tableInfo.InMem;
-
- if (inMem.State == ECompactionState::PendingBackground) {
+{
+ for (auto &tpr : State->Tables) {
+ auto &tableInfo = tpr.second;
+ auto &policy = *tableInfo.Policy;
+ auto &inMem = tableInfo.InMem;
+
+ if (inMem.State == ECompactionState::PendingBackground) {
auto priority = tableInfo.ComputeBackgroundPriority(inMem, policy, Time->Now());
- auto oldPriority = inMem.CompactionTask.Priority;
-
- // Avoid task updates in case of small priority changes.
- if (priority < oldPriority
- && (oldPriority - priority) >= oldPriority / PRIORITY_UPDATE_FACTOR) {
- UpdateCompactionTask(policy.BackgroundSnapshotPolicy.ResourceBrokerTask,
+ auto oldPriority = inMem.CompactionTask.Priority;
+
+ // Avoid task updates in case of small priority changes.
+ if (priority < oldPriority
+ && (oldPriority - priority) >= oldPriority / PRIORITY_UPDATE_FACTOR) {
+ UpdateCompactionTask(policy.BackgroundSnapshotPolicy.ResourceBrokerTask,
priority, inMem.CompactionTask);
- }
- }
-
+ }
+ }
+
tableInfo.Strategy->UpdateCompactions();
- }
-}
-
+ }
+}
+
void TCompactionLogic::RequestChanges(ui32 table)
{
auto *tableInfo = State->Tables.FindPtr(table);
@@ -115,22 +115,22 @@ void TCompactionLogic::PrepareTableSnapshot(ui32 table, NTable::TSnapEdge edge,
switch (inMem.State) {
case ECompactionState::Free:
- SubmitCompactionTask(table, 0,
- tableInfo->Policy->SnapshotResourceBrokerTask,
- tableInfo->Policy->DefaultTaskPriority,
+ SubmitCompactionTask(table, 0,
+ tableInfo->Policy->SnapshotResourceBrokerTask,
+ tableInfo->Policy->DefaultTaskPriority,
inMem.CompactionTask);
inMem.State = ECompactionState::SnapshotPending;
break;
case ECompactionState::Pending:
inMem.State = ECompactionState::SnapshotPending;
break;
- case ECompactionState::PendingBackground:
- // Replace background compaction with regular snapshot task.
- UpdateCompactionTask(tableInfo->Policy->SnapshotResourceBrokerTask,
- tableInfo->Policy->DefaultTaskPriority,
+ case ECompactionState::PendingBackground:
+ // Replace background compaction with regular snapshot task.
+ UpdateCompactionTask(tableInfo->Policy->SnapshotResourceBrokerTask,
+ tableInfo->Policy->DefaultTaskPriority,
inMem.CompactionTask);
inMem.State = ECompactionState::SnapshotPending;
- break;
+ break;
default:
break;
}
@@ -383,34 +383,34 @@ void TCompactionLogic::CheckInMemStats(ui32 table) {
const float memHiWatermark = policy.InMemForceSizeToSnapshot * 4.0f; // default 16MB -> 64MB
mem.OverloadFactor = (float(mem.EstimatedSize) - memLoWatermark) / (memHiWatermark - memLoWatermark);
- if (mem.State != ECompactionState::Free
- && mem.State != ECompactionState::PendingBackground) {
+ if (mem.State != ECompactionState::Free
+ && mem.State != ECompactionState::PendingBackground) {
return;
- }
+ }
if (policy.InMemForceSizeToSnapshot <= mem.EstimatedSize
|| policy.InMemForceStepsToSnapshot <= mem.Steps
- || (policy.InMemSizeToSnapshot <= mem.EstimatedSize && policy.InMemStepsToSnapshot <= mem.Steps))
- {
- // Replace background task or submit a new one.
- if (mem.State == ECompactionState::PendingBackground) {
- UpdateCompactionTask(policy.InMemResourceBrokerTask,
- policy.DefaultTaskPriority,
+ || (policy.InMemSizeToSnapshot <= mem.EstimatedSize && policy.InMemStepsToSnapshot <= mem.Steps))
+ {
+ // Replace background task or submit a new one.
+ if (mem.State == ECompactionState::PendingBackground) {
+ UpdateCompactionTask(policy.InMemResourceBrokerTask,
+ policy.DefaultTaskPriority,
mem.CompactionTask);
- } else {
- SubmitCompactionTask(table, 0,
- policy.InMemResourceBrokerTask,
- policy.DefaultTaskPriority,
+ } else {
+ SubmitCompactionTask(table, 0,
+ policy.InMemResourceBrokerTask,
+ policy.DefaultTaskPriority,
mem.CompactionTask);
- }
+ }
mem.State = ECompactionState::Pending;
} else if (mem.State == ECompactionState::Free && (mem.EstimatedSize > 0 || mem.Steps > 0)) {
auto priority = info->ComputeBackgroundPriority(mem, policy, Time->Now());
- if (priority != BAD_PRIORITY) {
- SubmitCompactionTask(table, 0, policy.BackgroundSnapshotPolicy.ResourceBrokerTask,
+ if (priority != BAD_PRIORITY) {
+ SubmitCompactionTask(table, 0, policy.BackgroundSnapshotPolicy.ResourceBrokerTask,
priority, mem.CompactionTask);
- mem.State = ECompactionState::PendingBackground;
- }
+ mem.State = ECompactionState::PendingBackground;
+ }
}
}
@@ -467,12 +467,12 @@ bool TCompactionLogic::BeginMemTableCompaction(ui64 taskId, ui32 tableId)
TCompactionLogicState::TInMem &inMem = tableInfo->InMem;
Y_VERIFY(taskId == inMem.CompactionTask.TaskId);
-
+
NTable::TSnapEdge edge;
-
+
switch (inMem.State) {
case ECompactionState::Pending:
- case ECompactionState::PendingBackground:
+ case ECompactionState::PendingBackground:
inMem.CompactingSteps = inMem.Steps;
inMem.State = ECompactionState::Compaction;
edge.Head = NTable::TEpoch::Max();
@@ -533,7 +533,7 @@ TCompactionLogic::HandleCompaction(
case ECompactionState::Compaction:
inMem.Steps -= std::exchange(inMem.CompactingSteps, 0);
inMem.State = ECompactionState::Free;
- inMem.CompactionTask.TaskId = 0;
+ inMem.CompactionTask.TaskId = 0;
inMem.CompactionTask.CompactionId = 0;
break;
case ECompactionState::SnapshotCompaction:
@@ -545,7 +545,7 @@ TCompactionLogic::HandleCompaction(
}
inMem.Steps -= std::exchange(inMem.CompactingSteps, 0);
inMem.State = ECompactionState::Free;
- inMem.CompactionTask.TaskId = 0;
+ inMem.CompactionTask.TaskId = 0;
inMem.CompactionTask.CompactionId = 0;
break;
default:
@@ -556,10 +556,10 @@ TCompactionLogic::HandleCompaction(
tableInfo->ForcedCompactionState = EForcedCompactionState::None;
}
- if (tableInfo->SnapRequests) {
- SubmitCompactionTask(tableId, 0,
- tableInfo->Policy->SnapshotResourceBrokerTask,
- tableInfo->Policy->DefaultTaskPriority,
+ if (tableInfo->SnapRequests) {
+ SubmitCompactionTask(tableId, 0,
+ tableInfo->Policy->SnapshotResourceBrokerTask,
+ tableInfo->Policy->DefaultTaskPriority,
inMem.CompactionTask);
inMem.State = ECompactionState::SnapshotPending;
} else if (tableInfo->ForcedCompactionState == EForcedCompactionState::PendingMem) {
@@ -641,18 +641,18 @@ TTableCompactionChanges TCompactionLogic::RemovedParts(ui32 tableId, TArrayRef<c
return ret;
}
-void TCompactionLogic::SubmitCompactionTask(ui32 table,
- ui32 generation,
- const TString &type,
- ui32 priority,
+void TCompactionLogic::SubmitCompactionTask(ui32 table,
+ ui32 generation,
+ const TString &type,
+ ui32 priority,
TCompactionLogicState::TCompactionTask &task)
-{
+{
Y_VERIFY(generation == 0, "Unexpected gen %" PRIu32 " in compaction logic", generation);
- task.Priority = priority;
+ task.Priority = priority;
task.SubmissionTimestamp = Time->Now();
-
- TString name = Sprintf("gen%" PRIu32 "-table-%" PRIu32 "-%s",
+
+ TString name = Sprintf("gen%" PRIu32 "-table-%" PRIu32 "-%s",
generation, table, TaskNameSuffix.data());
task.TaskId = Broker->SubmitTask(
std::move(name),
@@ -664,53 +664,53 @@ void TCompactionLogic::SubmitCompactionTask(ui32 table,
Broker->FinishTask(taskId, EResourceStatus::Cancelled);
}
});
-}
-
-void TCompactionLogic::UpdateCompactionTask(const TString &type,
- ui32 priority,
+}
+
+void TCompactionLogic::UpdateCompactionTask(const TString &type,
+ ui32 priority,
TCompactionLogicState::TCompactionTask &task)
-{
- task.Priority = priority;
-
+{
+ task.Priority = priority;
+
Broker->UpdateTask(
task.TaskId,
TResourceParams(type)
.WithCPU(1)
.WithPriority(priority));
-}
-
+}
+
ui32 TCompactionLogicState::TTableInfo::ComputeBackgroundPriority(
const TCompactionLogicState::TCompactionTask &task,
const TCompactionPolicy::TBackgroundPolicy &policy,
ui32 percentage,
TInstant now) const
-{
- double priority = policy.PriorityBase;
- priority = priority * 100 / percentage;
- if (task.TaskId) {
- double factor = policy.TimeFactor;
- factor *= log((now - task.SubmissionTimestamp).Seconds());
- priority /= Max(factor, 1.0);
- }
-
- return priority;
-}
-
+{
+ double priority = policy.PriorityBase;
+ priority = priority * 100 / percentage;
+ if (task.TaskId) {
+ double factor = policy.TimeFactor;
+ factor *= log((now - task.SubmissionTimestamp).Seconds());
+ priority /= Max(factor, 1.0);
+ }
+
+ return priority;
+}
+
ui32 TCompactionLogicState::TTableInfo::ComputeBackgroundPriority(
const TCompactionLogicState::TInMem &inMem,
const TCompactionPolicy &policy,
TInstant now) const
-{
- auto &bckgPolicy = policy.BackgroundSnapshotPolicy;
- auto perc = Max((ui32)(inMem.EstimatedSize * 100 / policy.InMemForceSizeToSnapshot),
- inMem.Steps * 100 / policy.InMemForceStepsToSnapshot);
-
- if (!perc || perc < bckgPolicy.Threshold)
+{
+ auto &bckgPolicy = policy.BackgroundSnapshotPolicy;
+ auto perc = Max((ui32)(inMem.EstimatedSize * 100 / policy.InMemForceSizeToSnapshot),
+ inMem.Steps * 100 / policy.InMemForceStepsToSnapshot);
+
+ if (!perc || perc < bckgPolicy.Threshold)
return TCompactionLogic::BAD_PRIORITY;
-
- return ComputeBackgroundPriority(inMem.CompactionTask, bckgPolicy, perc, now);
-}
-
+
+ return ComputeBackgroundPriority(inMem.CompactionTask, bckgPolicy, perc, now);
+}
+
float TCompactionLogic::GetOverloadFactor() const {
float overloadFactor = 0;
for (const auto& ti : State->Tables) {
@@ -755,11 +755,11 @@ void TCompactionLogic::OutputHtml(IOutputStream &out, const NTable::TScheme &sch
cgiCopy.InsertUnescaped("force_compaction", ToString(xtable.first));
out << ", <a href=\"executorInternals?" << cgiCopy.Print() << "\">Force compaction</a>";
}
- if (xtable.second.InMem.CompactionTask.TaskId) {
- out << ", Task #" << xtable.second.InMem.CompactionTask.TaskId
- << " (priority " << xtable.second.InMem.CompactionTask.Priority
- << ") submitted " << xtable.second.InMem.CompactionTask.SubmissionTimestamp.ToStringLocal();
- }
+ if (xtable.second.InMem.CompactionTask.TaskId) {
+ out << ", Task #" << xtable.second.InMem.CompactionTask.TaskId
+ << " (priority " << xtable.second.InMem.CompactionTask.Priority
+ << ") submitted " << xtable.second.InMem.CompactionTask.SubmissionTimestamp.ToStringLocal();
+ }
}
xtable.second.Strategy->OutputHtml(out);
diff --git a/ydb/core/tablet_flat/flat_executor_compaction_logic.h b/ydb/core/tablet_flat/flat_executor_compaction_logic.h
index 927ee776916..b85a13a19ec 100644
--- a/ydb/core/tablet_flat/flat_executor_compaction_logic.h
+++ b/ydb/core/tablet_flat/flat_executor_compaction_logic.h
@@ -31,7 +31,7 @@ enum class ECompactionState {
Unknown,
Free,
Pending,
- PendingBackground,
+ PendingBackground,
Compaction,
SnapshotPending,
SnapshotCompaction,
@@ -44,19 +44,19 @@ enum class EForcedCompactionState {
};
struct TCompactionLogicState {
- struct TCompactionTask {
+ struct TCompactionTask {
ui64 TaskId = 0;
ui32 Priority = 0;
- TInstant SubmissionTimestamp;
+ TInstant SubmissionTimestamp;
ui64 CompactionId = 0;
- };
-
+ };
+
struct TInMem {
ui64 EstimatedSize = 0;
ui32 Steps = 0;
ui32 CompactingSteps = 0;
ECompactionState State = ECompactionState::Free;
- TCompactionTask CompactionTask;
+ TCompactionTask CompactionTask;
ui64 LogOverheadCount = 0;
ui64 LogOverheadSize = 0;
float OverloadFactor = 0.0;
@@ -129,7 +129,7 @@ struct TCompactionLogicState {
THashMap<ui32, TSnapshotState> Snapshots;
};
-class TFlatTableScan;
+class TFlatTableScan;
struct TTableCompactionResult {
NTable::TCompactionChanges Changes;
@@ -159,25 +159,25 @@ class TCompactionLogic {
NTable::ICompactionBackend * const Backend;
ITimeProvider * const Time = nullptr;
TAutoPtr<TCompactionLogicState> State;
- TString TaskNameSuffix;
-
- // Update background compaction task when priority changes
- // at least by 5% (1/20 of current value).
- static constexpr ui32 PRIORITY_UPDATE_FACTOR = 20;
-
- void SubmitCompactionTask(ui32 table, ui32 generation,
- const TString &type, ui32 priority,
+ TString TaskNameSuffix;
+
+ // Update background compaction task when priority changes
+ // at least by 5% (1/20 of current value).
+ static constexpr ui32 PRIORITY_UPDATE_FACTOR = 20;
+
+ void SubmitCompactionTask(ui32 table, ui32 generation,
+ const TString &type, ui32 priority,
TCompactionLogicState::TCompactionTask &task);
- void UpdateCompactionTask(const TString &type, ui32 priority,
+ void UpdateCompactionTask(const TString &type, ui32 priority,
TCompactionLogicState::TCompactionTask &task);
-
+
bool BeginMemTableCompaction(ui64 taskId, ui32 tableId);
-
+
THolder<NTable::ICompactionStrategy> CreateStrategy(ui32 tableId, NKikimrSchemeOp::ECompactionStrategy);
void StopTable(TCompactionLogicState::TTableInfo &table);
void StrategyChanging(TCompactionLogicState::TTableInfo &table);
-
+
TCompactionLogicState::TTableInfo* HandleCompaction(
ui64 compactionId,
const NTable::TCompactionParams* params,
@@ -199,9 +199,9 @@ public:
TCompactionLogicState::TSnapshotState SnapToLog(ui32 tableId);
- // Update priorities for background compaction tasks.
+ // Update priorities for background compaction tasks.
void UpdateCompactions();
-
+
// Strategy of this table wants to apply some changes
void RequestChanges(ui32 tableId);
TVector<TTableCompactionChanges> ApplyChanges();
diff --git a/ydb/core/tablet_flat/flat_executor_counters.h b/ydb/core/tablet_flat/flat_executor_counters.h
index db8eed5f42d..f100bc48a00 100644
--- a/ydb/core/tablet_flat/flat_executor_counters.h
+++ b/ydb/core/tablet_flat/flat_executor_counters.h
@@ -48,16 +48,16 @@ namespace NTabletFlatExecutor {
XX(CACHE_STAGING_SIZE, "CacheStagingSize") \
XX(CACHE_WARM_SIZE, "CacheMemTableSize") \
XX(CACHE_PINNED_SET, "CachePinned") \
- XX(CACHE_PINNED_LOAD, "CachePinnedLoad") \
+ XX(CACHE_PINNED_LOAD, "CachePinnedLoad") \
XX(CACHE_TOTAL_COLLECTIONS, "CacheTotalCollections") \
XX(CACHE_TOTAL_SHARED_BODY, "CacheTotalSharedBody") \
XX(CACHE_TOTAL_PINNED_BODY, "CacheTotalPinnedBody") \
XX(CACHE_TOTAL_EXCLUSIVE, "CacheTotalExclusive") \
XX(CACHE_TOTAL_SHARED_PENDING, "CacheTotalSharedPending") \
XX(CACHE_TOTAL_STICKY, "CacheTotalSticky") \
- XX(USED_TABLET_MEMORY, "UsedTabletMemory") \
- XX(USED_TABLET_TX_MEMORY, "UsedTabletTxMemory") \
- XX(USED_DYNAMIC_TX_MEMORY, "UsedDynamicTxMemory") \
+ XX(USED_TABLET_MEMORY, "UsedTabletMemory") \
+ XX(USED_TABLET_TX_MEMORY, "UsedTabletTxMemory") \
+ XX(USED_DYNAMIC_TX_MEMORY, "UsedDynamicTxMemory") \
XX(CONSUMED_STORAGE, "ConsumedStorage") \
XX(CONSUMED_MEMORY, "ConsumedMemory") \
XX(COMPACTION_READ_IN_FLY, "CompactionReadInFly") \
@@ -91,7 +91,7 @@ namespace NTabletFlatExecutor {
XX(TX_DATA_RELEASES, "TxDataReleases") \
XX(TX_RO_COMPLETED, "Tx(ro complete)") \
XX(TX_RW_COMPLETED, "Tx(rw complete)") \
- XX(TX_TERMINATED, "Tx(terminated)") \
+ XX(TX_TERMINATED, "Tx(terminated)") \
XX(TX_CHARGE_WEEDED, "TxKeyChargeWeeded") \
XX(TX_CHARGE_SIEVED, "TxKeyChargeSieved") \
XX(TX_SELECT_WEEDED, "TxKeySelectWeeded") \
diff --git a/ydb/core/tablet_flat/flat_executor_txloglogic.cpp b/ydb/core/tablet_flat/flat_executor_txloglogic.cpp
index c5723074a58..df59ddc2455 100644
--- a/ydb/core/tablet_flat/flat_executor_txloglogic.cpp
+++ b/ydb/core/tablet_flat/flat_executor_txloglogic.cpp
@@ -56,20 +56,20 @@ TArrayRef<const NRedo::TUsage> TLogicRedo::GrabLogUsage() const noexcept
}
bool TLogicRedo::TerminateTransaction(TAutoPtr<TSeat> seat, const TActorContext &ctx, const TActorId &ownerID) {
- if (CompletionQueue.empty()) {
+ if (CompletionQueue.empty()) {
const TTxType txType = seat->Self->GetTxType();
-
+
seat->Self->Terminate(seat->TerminationReason, ctx.MakeFor(ownerID));
- Counters->Cumulative()[TExecutorCounters::TX_TERMINATED].Increment(1);
- if (AppTxCounters && txType != UnknownTxType)
- AppTxCounters->TxCumulative(txType, COUNTER_TT_TERMINATED).Increment(1);
- return true;
- } else {
+ Counters->Cumulative()[TExecutorCounters::TX_TERMINATED].Increment(1);
+ if (AppTxCounters && txType != UnknownTxType)
+ AppTxCounters->TxCumulative(txType, COUNTER_TT_TERMINATED).Increment(1);
+ return true;
+ } else {
CompletionQueue.back().WaitingTerminatedTransactions.push_back(seat);
- return false;
- }
-}
-
+ return false;
+ }
+}
+
void CompleteRoTransaction(TAutoPtr<TSeat> seat, const TActorContext &ownerCtx, TExecutorCounters *counters, TTabletCountersWithTxTypes *appTxCounters ) {
const TTxType txType = seat->Self->GetTxType();
@@ -261,17 +261,17 @@ ui64 TLogicRedo::Confirm(ui32 step, const TActorContext &ctx, const TActorId &ow
CompleteRoTransaction(x, ownerCtx, Counters, AppTxCounters);
}
- for (auto &x : entry.WaitingTerminatedTransactions) {
+ for (auto &x : entry.WaitingTerminatedTransactions) {
const TTxType roTxType = x->Self->GetTxType();
x->Self->Terminate(x->TerminationReason, ownerCtx);
-
- Counters->Cumulative()[TExecutorCounters::TX_TERMINATED].Increment(1);
- if (AppTxCounters && roTxType != UnknownTxType)
- AppTxCounters->TxCumulative(roTxType, COUNTER_TT_TERMINATED).Increment(1);
-
- ++confirmedTransactions;
- }
-
+
+ Counters->Cumulative()[TExecutorCounters::TX_TERMINATED].Increment(1);
+ if (AppTxCounters && roTxType != UnknownTxType)
+ AppTxCounters->TxCumulative(roTxType, COUNTER_TT_TERMINATED).Increment(1);
+
+ ++confirmedTransactions;
+ }
+
CompletionQueue.pop_front();
} while (!CompletionQueue.empty() && CompletionQueue[0].Step == step);
diff --git a/ydb/core/tablet_flat/flat_executor_ut.cpp b/ydb/core/tablet_flat/flat_executor_ut.cpp
index 94666394862..c9cf5289711 100644
--- a/ydb/core/tablet_flat/flat_executor_ut.cpp
+++ b/ydb/core/tablet_flat/flat_executor_ut.cpp
@@ -240,90 +240,90 @@ namespace NTabletFlatExecutor {
struct TDummyResult: public IDestructable {
TDummyResult(ui64 count, ui64 expect)
: Count(count), Expect(expect)
- {}
+ {}
ui64 Count = 0;
ui64 Expect = 0;
-};
-
+};
+
class TDummyScan : public TActor<TDummyScan>, public NTable::IScan {
-public:
+public:
TDummyScan(TActorId tablet, bool postponed, EAbort abort, ui32 rows)
- : TActor(&TThis::StateWork)
- , Tablet(tablet)
+ : TActor(&TThis::StateWork)
+ , Tablet(tablet)
, ExpectedRows(rows)
, Postponed(postponed)
- , Abort(abort)
- {}
- ~TDummyScan() {}
-
- void Describe(IOutputStream &out) const noexcept override
- {
- out << "DummyScan";
- }
-
- void Handle(TEvents::TEvWakeup::TPtr &, const TActorContext &)
- {
- Driver->Touch(EScan::Feed);
- }
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvents::TEvWakeup, Handle);
- default:
- break;
- }
- }
-
-private:
+ , Abort(abort)
+ {}
+ ~TDummyScan() {}
+
+ void Describe(IOutputStream &out) const noexcept override
+ {
+ out << "DummyScan";
+ }
+
+ void Handle(TEvents::TEvWakeup::TPtr &, const TActorContext &)
+ {
+ Driver->Touch(EScan::Feed);
+ }
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvents::TEvWakeup, Handle);
+ default:
+ break;
+ }
+ }
+
+private:
THello Prepare(IDriver *driver, TIntrusiveConstPtr<TScheme> scheme) noexcept override
- {
- Driver = driver;
- Scheme = std::move(scheme);
-
- auto ctx = TActivationContext::AsActorContext();
+ {
+ Driver = driver;
+ Scheme = std::move(scheme);
+
+ auto ctx = TActivationContext::AsActorContext();
ctx.RegisterWithSameMailbox(this);
-
+
if (Postponed) {
ctx.Send(Tablet, new NFake::TEvReturn);
return { EScan::Sleep, { } };
- } else {
+ } else {
return { EScan::Feed, { } };
- }
- }
-
- EScan Seek(TLead &lead, ui64 seq) noexcept override
- {
- if (seq && Abort == EAbort::None)
- return EScan::Final;
-
+ }
+ }
+
+ EScan Seek(TLead &lead, ui64 seq) noexcept override
+ {
+ if (seq && Abort == EAbort::None)
+ return EScan::Final;
+
lead.To(Scheme->Tags(), { }, NTable::ESeek::Lower);
- return EScan::Feed;
- }
-
- EScan Feed(TArrayRef<const TCell> key, const TRow &) noexcept override
- {
+ return EScan::Feed;
+ }
+
+ EScan Feed(TArrayRef<const TCell> key, const TRow &) noexcept override
+ {
UNIT_ASSERT_VALUES_EQUAL(key[0].AsValue<ui64>(), ExpectedRowId);
- ++ExpectedRowId;
- ++StoredRows;
- return EScan::Feed;
- }
-
+ ++ExpectedRowId;
+ ++StoredRows;
+ return EScan::Feed;
+ }
+
TAutoPtr<IDestructable> Finish(EAbort abort) noexcept override
- {
- UNIT_ASSERT_VALUES_EQUAL((int)Abort, (int)abort);
-
- auto ctx = TActivationContext::ActorContextFor(SelfId());
+ {
+ UNIT_ASSERT_VALUES_EQUAL((int)Abort, (int)abort);
+
+ auto ctx = TActivationContext::ActorContextFor(SelfId());
if (abort == EAbort::None) {
UNIT_ASSERT_VALUES_EQUAL(ExpectedRows, StoredRows);
}
- Die(ctx);
-
+ Die(ctx);
+
return new TDummyResult(StoredRows, ExpectedRows);
- }
-
-private:
+ }
+
+private:
TActorId Tablet;
IDriver *Driver = nullptr;
TIntrusiveConstPtr<TScheme> Scheme;
@@ -331,31 +331,31 @@ private:
ui64 ExpectedRowId = 1;
ui64 ExpectedRows = 0;
bool Postponed = false;
- EAbort Abort;
-};
-
-struct TEvTestFlatTablet {
- enum EEv {
- EvScanFinished = 2015 + EventSpaceBegin(TKikimrEvents::ES_TABLET),
- EvQueueScan,
- EvStartQueuedScan,
- EvMakeScanSnapshot,
- EvCancelScan,
+ EAbort Abort;
+};
+
+struct TEvTestFlatTablet {
+ enum EEv {
+ EvScanFinished = 2015 + EventSpaceBegin(TKikimrEvents::ES_TABLET),
+ EvQueueScan,
+ EvStartQueuedScan,
+ EvMakeScanSnapshot,
+ EvCancelScan,
EvSnapshotComplete,
-
- EvEnd
- };
-
- struct TEvScanFinished : public TEventLocal<TEvScanFinished, EvScanFinished> {};
- struct TEvQueueScan : public TEventLocal<TEvQueueScan, EvQueueScan> {
+
+ EvEnd
+ };
+
+ struct TEvScanFinished : public TEventLocal<TEvScanFinished, EvScanFinished> {};
+ struct TEvQueueScan : public TEventLocal<TEvQueueScan, EvQueueScan> {
TEvQueueScan(ui32 rows, bool postponed = false, bool snap = false, NTable::EAbort abort = NTable::EAbort::None)
: Postponed(postponed)
, UseSnapshot(snap)
- , Abort(abort)
+ , Abort(abort)
, ReadVersion(TRowVersion::Max())
, ExpectRows(rows)
- {}
-
+ {}
+
TEvQueueScan(ui32 rows, TRowVersion snapshot, bool postponed = false, NTable::EAbort abort = NTable::EAbort::None)
: Postponed(postponed)
, UseSnapshot(false)
@@ -365,14 +365,14 @@ struct TEvTestFlatTablet {
{}
bool Postponed;
- bool UseSnapshot;
- NTable::EAbort Abort;
+ bool UseSnapshot;
+ NTable::EAbort Abort;
const TRowVersion ReadVersion;
const ui32 ExpectRows = 0;
- };
- struct TEvStartQueuedScan : public TEventLocal<TEvStartQueuedScan, EvStartQueuedScan> {};
- struct TEvMakeScanSnapshot : public TEventLocal<TEvMakeScanSnapshot, EvMakeScanSnapshot> {};
- struct TEvCancelScan : public TEventLocal<TEvCancelScan, EvCancelScan> {};
+ };
+ struct TEvStartQueuedScan : public TEventLocal<TEvStartQueuedScan, EvStartQueuedScan> {};
+ struct TEvMakeScanSnapshot : public TEventLocal<TEvMakeScanSnapshot, EvMakeScanSnapshot> {};
+ struct TEvCancelScan : public TEventLocal<TEvCancelScan, EvCancelScan> {};
struct TEvSnapshotComplete : public TEventLocal<TEvSnapshotComplete, EvSnapshotComplete> {
TIntrusivePtr<TTableSnapshotContext> SnapContext;
@@ -382,13 +382,13 @@ struct TEvTestFlatTablet {
{ }
};
};
-
+
class TTestTableSnapshotContext : public TTableSnapshotContext {
public:
TTestTableSnapshotContext(TVector<ui32> tables)
: Tables(std::move(tables))
{ }
-
+
TConstArrayRef<ui32> TablesToSnapshot() const override {
return Tables;
}
@@ -404,42 +404,42 @@ protected:
NFlatExecutorSetup::IExecutor* Executor = nullptr;
};
-class TTestFlatTablet : public TActor<TTestFlatTablet>, public TTabletExecutedFlat {
- TDummyScan *Scan;
- ui64 ScanTaskId;
- ui64 ScanCookie;
- ui64 SnapshotId;
+class TTestFlatTablet : public TActor<TTestFlatTablet>, public TTabletExecutedFlat {
+ TDummyScan *Scan;
+ ui64 ScanTaskId;
+ ui64 ScanCookie;
+ ui64 SnapshotId;
TActorId Sender;
-
+
void SnapshotComplete(TIntrusivePtr<TTableSnapshotContext> snapContext, const TActorContext&) override {
Send(Sender, new TEvTestFlatTablet::TEvSnapshotComplete(std::move(snapContext)));
- }
-
+ }
+
void CompactionComplete(ui32 table, const TActorContext&) override {
Send(Sender, new NFake::TEvCompacted(table));
}
void ScanComplete(NTable::EAbort, TAutoPtr<IDestructable>, ui64 cookie, const TActorContext&) override
- {
- UNIT_ASSERT_VALUES_EQUAL(cookie, ScanCookie);
+ {
+ UNIT_ASSERT_VALUES_EQUAL(cookie, ScanCookie);
Send(Sender, new TEvTestFlatTablet::TEvScanFinished);
- }
-
+ }
+
void Handle(TEvTestFlatTablet::TEvMakeScanSnapshot::TPtr&) {
SnapshotId = Executor()->MakeScanSnapshot(TRowsModel::TableId);
- UNIT_ASSERT(SnapshotId);
+ UNIT_ASSERT(SnapshotId);
Send(Sender, new TEvents::TEvWakeup);
- }
-
- void Handle(TEvTestFlatTablet::TEvCancelScan::TPtr &/*ev*/, const TActorContext &ctx) {
+ }
+
+ void Handle(TEvTestFlatTablet::TEvCancelScan::TPtr &/*ev*/, const TActorContext &ctx) {
Executor()->CancelScan(TRowsModel::TableId, ScanTaskId);
ctx.Send(Sender, new TEvents::TEvWakeup);
- }
-
+ }
+
void Handle(TEvTestFlatTablet::TEvQueueScan::TPtr &ev) {
bool postpone = ev->Get()->Postponed;
- ui64 snap = ev->Get()->UseSnapshot ? SnapshotId : 0;
- auto abort = ev->Get()->Abort;
+ ui64 snap = ev->Get()->UseSnapshot ? SnapshotId : 0;
+ auto abort = ev->Get()->Abort;
auto rows = abort != NTable::EAbort::None ? 0 : ev->Get()->ExpectRows;
Scan = new TDummyScan(SelfId(), postpone, abort, rows);
TScanOptions options;
@@ -450,12 +450,12 @@ class TTestFlatTablet : public TActor<TTestFlatTablet>, public TTabletExecutedFl
options.SetSnapshotRowVersion(ev->Get()->ReadVersion);
}
ScanTaskId = Executor()->QueueScan(TRowsModel::TableId, Scan, ScanCookie, options);
- }
-
- void Handle(TEvTestFlatTablet::TEvStartQueuedScan::TPtr &/*ev*/, const TActorContext &ctx) {
- ctx.Send(Scan->SelfId(), new TEvents::TEvWakeup);
- }
-
+ }
+
+ void Handle(TEvTestFlatTablet::TEvStartQueuedScan::TPtr &/*ev*/, const TActorContext &ctx) {
+ ctx.Send(Scan->SelfId(), new TEvents::TEvWakeup);
+ }
+
void Handle(NFake::TEvExecute::TPtr &ev, const TActorContext &ctx) {
for (auto& f : ev->Get()->Funcs) {
if (auto* tx = dynamic_cast<ITransactionWithExecutor*>(f.Get())) {
@@ -463,8 +463,8 @@ class TTestFlatTablet : public TActor<TTestFlatTablet>, public TTabletExecutedFl
}
Execute(f.Release(), ctx);
}
- }
-
+ }
+
void Handle(NFake::TEvCompact::TPtr &ev, const TActorContext&) {
if (ev->Get()->MemOnly) {
Executor()->CompactMemTable(ev->Get()->Table);
@@ -476,81 +476,81 @@ class TTestFlatTablet : public TActor<TTestFlatTablet>, public TTabletExecutedFl
void Handle(NFake::TEvReturn::TPtr&, const TActorContext&) {
Send(Sender, new TEvents::TEvWakeup);
- }
-
+ }
+
void Handle(TEvents::TEvPoison::TPtr &, const TActorContext &ctx) {
- Become(&TThis::StateBroken);
+ Become(&TThis::StateBroken);
Executor()->DetachTablet(ctx), Detach(ctx); /* see TDummy tablet */
ctx.Send(Sender, new TEvents::TEvGone);
- }
-
+ }
+
void OnActivateExecutor(const TActorContext&) override {
- Become(&TThis::StateWork);
+ Become(&TThis::StateWork);
Send(Sender, new TEvents::TEvWakeup);
- }
-
- void OnDetach(const TActorContext &ctx) override {
- Die(ctx);
- }
-
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override {
- Die(ctx);
- }
-
-public:
+ }
+
+ void OnDetach(const TActorContext &ctx) override {
+ Die(ctx);
+ }
+
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override {
+ Die(ctx);
+ }
+
+public:
TTestFlatTablet(const TActorId &sender, const TActorId &tablet, TTabletStorageInfo *info)
- : TActor(&TThis::StateInit)
+ : TActor(&TThis::StateInit)
, TTabletExecutedFlat(info, tablet, nullptr)
- , Scan(nullptr)
- , ScanTaskId(0)
- , ScanCookie(123)
- , SnapshotId(0)
- , Sender(sender)
- {}
-
- STFUNC(StateInit) {
- StateInitImpl(ev, ctx);
- }
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
+ , Scan(nullptr)
+ , ScanTaskId(0)
+ , ScanCookie(123)
+ , SnapshotId(0)
+ , Sender(sender)
+ {}
+
+ STFUNC(StateInit) {
+ StateInitImpl(ev, ctx);
+ }
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
hFunc(TEvTestFlatTablet::TEvQueueScan, Handle);
- HFunc(TEvTestFlatTablet::TEvStartQueuedScan, Handle);
+ HFunc(TEvTestFlatTablet::TEvStartQueuedScan, Handle);
hFunc(TEvTestFlatTablet::TEvMakeScanSnapshot, Handle);
- HFunc(TEvTestFlatTablet::TEvCancelScan, Handle);
+ HFunc(TEvTestFlatTablet::TEvCancelScan, Handle);
HFunc(NFake::TEvExecute, Handle);
HFunc(NFake::TEvCompact, Handle);
- HFunc(TEvTablet::TEvTabletDead, HandleTabletDead);
+ HFunc(TEvTablet::TEvTabletDead, HandleTabletDead);
HFunc(NFake::TEvReturn, Handle);
HFunc(TEvents::TEvPoison, Handle);
- default:
- HandleDefaultEvents(ev, ctx);
- break;
- }
- }
-
- STFUNC(StateBroken) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvTablet::TEvTabletDead, HandleTabletDead);
- }
- }
-};
-
-
-/**
- * Test scan going in parallel with compactions.
- *
- * 1. Fill table with rows so that one more row will cause three cascading compaction.
- * 2. Create scan. When scan is activated it sends wake-up to tablet and then sleeps.
- * 3. Add one more row and wait for compactions to finish.
- * 4. Resume scan.
- * 5. Check number of scanned rows.
- */
+ default:
+ HandleDefaultEvents(ev, ctx);
+ break;
+ }
+ }
+
+ STFUNC(StateBroken) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvTablet::TEvTabletDead, HandleTabletDead);
+ }
+ }
+};
+
+
+/**
+ * Test scan going in parallel with compactions.
+ *
+ * 1. Fill table with rows so that one more row will cause three cascading compaction.
+ * 2. Create scan. When scan is activated it sends wake-up to tablet and then sleeps.
+ * 3. Add one more row and wait for compactions to finish.
+ * 4. Resume scan.
+ * 5. Check number of scanned rows.
+ */
Y_UNIT_TEST_SUITE(TFlatTableCompactionScan) {
Y_UNIT_TEST(TestCompactionScan) {
TMyEnvBase env;
TRowsModel data;
-
+
env->SetLogPriority(NKikimrServices::RESOURCE_BROKER, NActors::NLog::PRI_DEBUG);
env.FireTablet(env.Edge, env.Tablet, [&env](const TActorId &tablet, TTabletStorageInfo *info) {
@@ -560,15 +560,15 @@ Y_UNIT_TEST_SUITE(TFlatTableCompactionScan) {
env.WaitForWakeUp();
TIntrusivePtr<TCompactionPolicy> policy = new TCompactionPolicy();
- policy->InMemSizeToSnapshot = 40 * 1024 *1024;
- policy->InMemStepsToSnapshot = 10;
- policy->InMemForceStepsToSnapshot = 10;
- policy->InMemForceSizeToSnapshot = 64 * 1024 * 1024;
- policy->InMemResourceBrokerTask = NLocalDb::LegacyQueueIdToTaskName(0);
- policy->ReadAheadHiThreshold = 100000;
- policy->ReadAheadLoThreshold = 50000;
- policy->Generations.push_back({100 * 1024 * 1024, 5, 5, 200 * 1024 * 1024, NLocalDb::LegacyQueueIdToTaskName(1), true});
- policy->Generations.push_back({400 * 1024 * 1024, 5, 5, 800 * 1024 * 1024, NLocalDb::LegacyQueueIdToTaskName(2), false});
+ policy->InMemSizeToSnapshot = 40 * 1024 *1024;
+ policy->InMemStepsToSnapshot = 10;
+ policy->InMemForceStepsToSnapshot = 10;
+ policy->InMemForceSizeToSnapshot = 64 * 1024 * 1024;
+ policy->InMemResourceBrokerTask = NLocalDb::LegacyQueueIdToTaskName(0);
+ policy->ReadAheadHiThreshold = 100000;
+ policy->ReadAheadLoThreshold = 50000;
+ policy->Generations.push_back({100 * 1024 * 1024, 5, 5, 200 * 1024 * 1024, NLocalDb::LegacyQueueIdToTaskName(1), true});
+ policy->Generations.push_back({400 * 1024 * 1024, 5, 5, 800 * 1024 * 1024, NLocalDb::LegacyQueueIdToTaskName(2), false});
for (auto& gen : policy->Generations) {
gen.ExtraCompactionPercent = 0;
gen.ExtraCompactionMinSize = 0;
@@ -576,12 +576,12 @@ Y_UNIT_TEST_SUITE(TFlatTableCompactionScan) {
gen.ExtraCompactionExpMaxSize = 0;
gen.UpliftPartSize = 0;
}
-
+
env.SendSync(data.MakeScheme(std::move(policy)));
env.SendAsync(data.MakeRows(249));
env.WaitFor<NFake::TEvCompacted>(28);
env.WaitForWakeUp();
-
+
env.SendSync(new TEvTestFlatTablet::TEvQueueScan(data.Rows(), true));
env.SendAsync(data.MakeRows(1));
env.WaitFor<NFake::TEvCompacted>(3);
@@ -590,128 +590,128 @@ Y_UNIT_TEST_SUITE(TFlatTableCompactionScan) {
TAutoPtr<IEventHandle> handle;
env->GrabEdgeEventRethrow<TEvTestFlatTablet::TEvScanFinished>(handle);
env.SendSync(new TEvents::TEvPoison, false, true);
- }
+ }
}
-
-
+
+
Y_UNIT_TEST_SUITE(TFlatTableExecutorTxLimit) {
-
+
struct TTxSchema : public ITransaction {
TTxSchema(TActorId owner) : Owner(owner) { }
-
+
bool Execute(TTransactionContext &txc, const TActorContext&) override
{
txc.DB.Alter().SetExecutorLimitInFlyTx(2);
-
+
return true;
}
-
+
void Complete(const TActorContext &ctx) override
{
ctx.Send(Owner, new NFake::TEvResult);
}
-
+
const TActorId Owner;
};
-
+
struct TTxNoop : public ITransaction {
TTxNoop(TActorId owner) : Owner(owner) { }
-
+
bool Execute(TTransactionContext&, const TActorContext&) override
{
return true;
}
-
+
void Complete(const TActorContext &ctx) override
{
ctx.Send(Owner, new NFake::TEvResult);
}
-
+
const TActorId Owner;
};
-
+
Y_UNIT_TEST(TestExecutorTxLimit) {
TMyEnvBase env;
-
+
env.FireDummyTablet();
env.SendAsync(new NFake::TEvExecute{ new TTxSchema(env.Edge) });
env.WaitFor<NFake::TEvResult>();
-
+
for (size_t seq = 0; seq++ < 5;)
env.SendAsync(new NFake::TEvExecute{ new TTxNoop(env.Edge) });
-
+
env.WaitFor<NFake::TEvResult>(5);
env.SendSync(new TEvents::TEvPoison, false, true);
}
}
-
-
+
+
Y_UNIT_TEST_SUITE(TFlatTableBackgroundCompactions) {
-
+
using namespace NKikimrResourceBroker;
using namespace NResourceBroker;
-
+
struct TIsTaskSubmission {
TIsTaskSubmission(const TString &type, ui32 maxPriority = Max<ui32>())
: Type(type)
, MaxPriority(maxPriority)
{}
-
+
bool operator()(IEventHandle &ev) {
if (ev.GetTypeRewrite() == NResourceBroker::TEvResourceBroker::EvSubmitTask) {
auto *e = ev.Get<NResourceBroker::TEvResourceBroker::TEvSubmitTask>();
if (e->Task.Type == Type && e->Task.Priority <= MaxPriority) {
return true;
}
- }
-
+ }
+
return false;
- }
-
+ }
+
TString Type;
ui32 MaxPriority;
};
-
+
struct TIsTaskUpdate {
TIsTaskUpdate(const TString &type, ui32 maxPriority = Max<ui32>())
: Type(type)
, MaxPriority(maxPriority)
{}
-
+
bool operator()(IEventHandle &ev) {
if (ev.GetTypeRewrite() == NResourceBroker::TEvResourceBroker::EvUpdateTask) {
auto *e = ev.Get<NResourceBroker::TEvResourceBroker::TEvUpdateTask>();
if (e->Type == Type && e->Priority <= MaxPriority)
return true;
}
-
+
return false;
- }
-
+ }
+
TString Type;
ui32 MaxPriority;
};
struct TIsResourceAllocation {
TIsResourceAllocation()
- {}
-
+ {}
+
bool operator()(IEventHandle &ev) {
if (ev.GetTypeRewrite() == NResourceBroker::TEvResourceBroker::EvResourceAllocated)
return true;
-
+
return false;
- }
- };
-
+ }
+ };
+
struct TMyEnvCompaction : public TMyEnvBase {
TMyEnvCompaction()
{
Env.SetLogPriority(NKikimrServices::RESOURCE_BROKER, NActors::NLog::PRI_DEBUG);
FireDummyTablet();
SendSync(Rows.MakeScheme(MakeCompactionPolicy()));
- }
-
+ }
+
~TMyEnvCompaction()
{
SendSync(new TEvents::TEvPoison, false, true);
@@ -728,14 +728,14 @@ Y_UNIT_TEST_SUITE(TFlatTableBackgroundCompactions) {
level,
nullptr);
SendEv(MakeResourceBrokerID(), event.Release());
-
+
if (instant) {
TAutoPtr<IEventHandle> handle;
auto reply = Env.GrabEdgeEventRethrow<TEvResourceBroker::TEvResourceAllocated>(handle);
UNIT_ASSERT_VALUES_EQUAL(reply->TaskId, id);
}
}
-
+
void UnblockBackgroundQueue(ui64 block = 0)
{
ui64 id = 987987987987 + block;
@@ -743,7 +743,7 @@ Y_UNIT_TEST_SUITE(TFlatTableBackgroundCompactions) {
= new TEvResourceBroker::TEvFinishTask(id);
SendEv(MakeResourceBrokerID(), event.Release());
}
-
+
static TCompactionPolicy* MakeCompactionPolicy() noexcept
{
auto *policy = new TCompactionPolicy();
@@ -772,124 +772,124 @@ Y_UNIT_TEST_SUITE(TFlatTableBackgroundCompactions) {
TRowsModel Rows;
};
-
+
Y_UNIT_TEST(TestRunBackgroundSnapshot) {
TMyEnvCompaction env;
-
+
env.SendAsync(env.Rows.MakeRows(5));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen0"));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen0"));
env->DispatchEvents(options);
- }
-
+ }
+
Y_UNIT_TEST(TestChangeBackgroundSnapshotToRegular) {
TMyEnvCompaction env;
-
+
env.BlockBackgroundQueue();
-
+
env.SendAsync(env.Rows.MakeRows(5));
- TDispatchOptions options1;
- options1.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen0"));
+ TDispatchOptions options1;
+ options1.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen0"));
env->DispatchEvents(options1);
-
+
env.SendAsync(env.Rows.MakeRows(5));
- TDispatchOptions options2;
- options2.FinalEvents.emplace_back(TIsTaskUpdate("compaction_gen0", 5));
+ TDispatchOptions options2;
+ options2.FinalEvents.emplace_back(TIsTaskUpdate("compaction_gen0", 5));
env->DispatchEvents(options2);
- }
-
+ }
+
Y_UNIT_TEST(TestRunBackgroundCompactionGen1) {
TMyEnvCompaction env;
-
+
env.BlockBackgroundQueue();
env.SendAsync(env.Rows.MakeRows(50));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen1"));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen1"));
env->DispatchEvents(options);
- }
-
+ }
+
Y_UNIT_TEST(TestChangeBackgroundCompactionToRegular) {
TMyEnvCompaction env;
-
+
env.BlockBackgroundQueue();
env.SendAsync(env.Rows.MakeRows(50));
-
- TDispatchOptions options1;
- options1.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen1"));
+
+ TDispatchOptions options1;
+ options1.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen1"));
env->DispatchEvents(options1);
-
+
env.SendAsync(env.Rows.MakeRows(50));
- TDispatchOptions options2;
- options2.FinalEvents.emplace_back(TIsTaskUpdate("compaction_gen1", 5));
+ TDispatchOptions options2;
+ options2.FinalEvents.emplace_back(TIsTaskUpdate("compaction_gen1", 5));
env->DispatchEvents(options2);
- }
-
+ }
+
Y_UNIT_TEST(TestRunBackgroundCompactionGen2) {
TMyEnvCompaction env;
-
+
env.BlockBackgroundQueue();
env.SendAsync(env.Rows.MakeRows(500));
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen2"));
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen2"));
env->DispatchEvents(options);
- }
-
+ }
+
Y_UNIT_TEST(TestChangeBackgroundSnapshotPriorityByTime) {
TMyEnvCompaction env;
-
+
env.BlockBackgroundQueue();
env.SendAsync(env.Rows.MakeRows(5));
-
- TDispatchOptions options1;
- options1.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen0"));
+
+ TDispatchOptions options1;
+ options1.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen0"));
env->DispatchEvents(options1);
-
- TDispatchOptions options2;
- options2.FinalEvents.emplace_back(TIsTaskUpdate("background_compaction_gen0", 50));
+
+ TDispatchOptions options2;
+ options2.FinalEvents.emplace_back(TIsTaskUpdate("background_compaction_gen0", 50));
env->SetDispatchTimeout(TDuration::Minutes(1));
env->DispatchEvents(options2);
- }
-
+ }
+
Y_UNIT_TEST(TestChangeBackgroundCompactionPriorityByTime) {
TMyEnvCompaction env;
-
+
env.BlockBackgroundQueue();
env.SendAsync(env.Rows.MakeRows(550));
-
- TDispatchOptions options1;
- options1.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen1"), 6);
- options1.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen2"));
+
+ TDispatchOptions options1;
+ options1.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen1"), 6);
+ options1.FinalEvents.emplace_back(TIsTaskSubmission("background_compaction_gen2"));
env->DispatchEvents(options1);
-
- TDispatchOptions options2;
- options2.FinalEvents.emplace_back(TIsTaskUpdate("background_compaction_gen2", 100));
-
+
+ TDispatchOptions options2;
+ options2.FinalEvents.emplace_back(TIsTaskUpdate("background_compaction_gen2", 100));
+
env->SetDispatchTimeout(TDuration::Minutes(1));
env->DispatchEvents(options2);
- // GEN2 compaction should become more prioritized due to time factor.
- TDispatchOptions options3;
+ // GEN2 compaction should become more prioritized due to time factor.
+ TDispatchOptions options3;
env.BlockBackgroundQueue(1, 150, false);
env.UnblockBackgroundQueue();
- options3.FinalEvents.emplace_back(TIsResourceAllocation());
+ options3.FinalEvents.emplace_back(TIsResourceAllocation());
env->DispatchEvents(options3);
-
+
env.SendAsync(env.Rows.MakeRows(10));
- TDispatchOptions options4;
- options4.FinalEvents.emplace_back(TIsTaskUpdate("background_compaction_gen1", 170));
+ TDispatchOptions options4;
+ options4.FinalEvents.emplace_back(TIsTaskUpdate("background_compaction_gen1", 170));
env->DispatchEvents(options4);
- }
-}
-
-
+ }
+}
+
+
Y_UNIT_TEST_SUITE(TFlatTablePostponedScan) {
-
- using namespace NKikimrResourceBroker;
- using namespace NResourceBroker;
-
+
+ using namespace NKikimrResourceBroker;
+ using namespace NResourceBroker;
+
struct TMyEnvScans : public TMyEnvBase {
TMyEnvScans()
@@ -897,16 +897,16 @@ Y_UNIT_TEST_SUITE(TFlatTablePostponedScan) {
Env.SetLogPriority(NKikimrServices::RESOURCE_BROKER, NActors::NLog::PRI_INFO);
Env.SetLogPriority(NKikimrServices::TABLET_EXECUTOR, NActors::NLog::PRI_INFO);
Env.SetLogPriority(NKikimrServices::TABLET_OPS_HOST, NActors::NLog::PRI_INFO);
-
+
FireTablet(Edge, Tablet, [this](const TActorId &tablet, TTabletStorageInfo *info) {
return new TTestFlatTablet(Edge, tablet, info);
- });
-
+ });
+
WaitForWakeUp();
SendSync(Rows.MakeScheme(MakeCompactionPolicy()));
}
-
+
~TMyEnvScans()
{
SendSync(new TEvents::TEvPoison, false, true);
@@ -928,18 +928,18 @@ Y_UNIT_TEST_SUITE(TFlatTablePostponedScan) {
TRowsModel Rows;
};
-
+
Y_UNIT_TEST(TestPostponedScan) {
TMyEnvScans env;
TAutoPtr<IEventHandle> handle;
-
+
env.SendSync(env.Rows.MakeRows(111));
env.SendSync(new TEvTestFlatTablet::TEvMakeScanSnapshot);
env.SendSync(env.Rows.MakeRows(111));
env.SendAsync(new TEvTestFlatTablet::TEvQueueScan(111, false, true));
env->GrabEdgeEventRethrow<TEvTestFlatTablet::TEvScanFinished>(handle);
- }
-
+ }
+
Y_UNIT_TEST(TestCancelFinishedScan) {
TMyEnvScans env;
TAutoPtr<IEventHandle> handle;
@@ -955,13 +955,13 @@ Y_UNIT_TEST_SUITE(TFlatTablePostponedScan) {
Y_UNIT_TEST(TestCancelRunningPostponedScan) {
TMyEnvScans env;
TAutoPtr<IEventHandle> handle;
-
+
env.SendSync(env.Rows.MakeRows(111));
env.SendSync(new TEvTestFlatTablet::TEvMakeScanSnapshot);
env.SendSync(new TEvTestFlatTablet::TEvQueueScan(111, true, true, NTable::EAbort::Term));
env.SendSync(new TEvTestFlatTablet::TEvCancelScan);
// env->GrabEdgeEventRethrow<TEvTestFlatTablet::TEvScanFinished>(handle);
- }
+ }
Y_UNIT_TEST(TestPostponedScanSnapshotMVCC) {
TMyEnvScans env;
@@ -973,10 +973,10 @@ Y_UNIT_TEST_SUITE(TFlatTablePostponedScan) {
env.GrabEdgeEvent<TEvTestFlatTablet::TEvScanFinished>();
}
-}
-
+}
+
Y_UNIT_TEST_SUITE(TFlatTableExecutorResourceProfile) {
-
+
struct TTaskSequence {
struct TEvent {
ui32 EventType;
@@ -1025,120 +1025,120 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutorResourceProfile) {
size_t Current = 0;
};
- struct TMemoryCheckEntry {
- struct TEntryEvents {
- TString MergeTask;
- TString UpdateTask;
- TString SubmitTask;
- ui32 FinishTasks;
-
- TEntryEvents(const TString &submitTask = "",
- const TString &updateTask = "",
- const TString &mergeTask = "",
- ui32 finishTasks = 0)
- : MergeTask(mergeTask)
- , UpdateTask(updateTask)
- , SubmitTask(submitTask)
- , FinishTasks(finishTasks)
- {}
- };
-
- TVector<ui64> Keys;
- ui64 NewSize;
- bool Static;
- bool Hold;
- ui64 HoldSize;
- bool Use;
- bool Finish;
- bool OutOfMemory;
- TEntryEvents Events;
-
- TMemoryCheckEntry(std::initializer_list<ui64> keys, ui64 newSize, TEntryEvents events,
- bool isStatic = false, bool outOfMemory = false)
- : Keys(keys)
- , NewSize(newSize)
- , Static(isStatic)
- , Hold(false)
- , HoldSize(0)
- , Use(false)
- , Finish(false)
- , OutOfMemory(outOfMemory)
- , Events(std::move(events))
- {}
-
- TMemoryCheckEntry(ui64 newSize, TEntryEvents events,
- bool isStatic = false, bool outOfMemory = false)
- : NewSize(newSize)
- , Static(isStatic)
- , Hold(false)
- , HoldSize(0)
- , Use(false)
- , Finish(false)
- , OutOfMemory(outOfMemory)
- , Events(std::move(events))
- {}
-
- TMemoryCheckEntry(bool hold, ui64 newSize, TEntryEvents events,
- bool isStatic = false, bool outOfMemory = false)
- : NewSize(newSize)
- , Static(isStatic)
- , Hold(hold)
- , HoldSize(0)
- , Use(false)
- , Finish(hold)
- , OutOfMemory(outOfMemory)
- , Events(std::move(events))
- {}
-
- TMemoryCheckEntry(bool hold, bool use, ui64 newSize, TEntryEvents events,
- bool isStatic = false, bool outOfMemory = false)
- : NewSize(newSize)
- , Static(isStatic)
- , Hold(hold)
- , HoldSize(0)
- , Use(use)
- , Finish(hold)
- , OutOfMemory(outOfMemory)
- , Events(std::move(events))
- {}
-
- TMemoryCheckEntry(bool hold, bool use, bool finish, ui64 newSize, TEntryEvents events,
- bool isStatic = false, bool outOfMemory = false)
- : NewSize(newSize)
- , Static(isStatic)
- , Hold(hold)
- , HoldSize(0)
- , Use(use)
- , Finish(finish)
- , OutOfMemory(outOfMemory)
- , Events(std::move(events))
- {}
-
- TMemoryCheckEntry(ui64 hold, ui64 newSize, TEntryEvents events,
- bool isStatic = false, bool outOfMemory = false)
- : NewSize(newSize)
- , Static(isStatic)
- , Hold(true)
- , HoldSize(hold)
- , Use(false)
- , Finish(true)
- , OutOfMemory(outOfMemory)
- , Events(std::move(events))
- {}
-
- TMemoryCheckEntry(ui64 hold, bool use, ui64 newSize, TEntryEvents events,
- bool isStatic = false, bool outOfMemory = false)
- : NewSize(newSize)
- , Static(isStatic)
- , Hold(true)
- , HoldSize(hold)
- , Use(use)
- , Finish(true)
- , OutOfMemory(outOfMemory)
- , Events(std::move(events))
- {}
- };
-
+ struct TMemoryCheckEntry {
+ struct TEntryEvents {
+ TString MergeTask;
+ TString UpdateTask;
+ TString SubmitTask;
+ ui32 FinishTasks;
+
+ TEntryEvents(const TString &submitTask = "",
+ const TString &updateTask = "",
+ const TString &mergeTask = "",
+ ui32 finishTasks = 0)
+ : MergeTask(mergeTask)
+ , UpdateTask(updateTask)
+ , SubmitTask(submitTask)
+ , FinishTasks(finishTasks)
+ {}
+ };
+
+ TVector<ui64> Keys;
+ ui64 NewSize;
+ bool Static;
+ bool Hold;
+ ui64 HoldSize;
+ bool Use;
+ bool Finish;
+ bool OutOfMemory;
+ TEntryEvents Events;
+
+ TMemoryCheckEntry(std::initializer_list<ui64> keys, ui64 newSize, TEntryEvents events,
+ bool isStatic = false, bool outOfMemory = false)
+ : Keys(keys)
+ , NewSize(newSize)
+ , Static(isStatic)
+ , Hold(false)
+ , HoldSize(0)
+ , Use(false)
+ , Finish(false)
+ , OutOfMemory(outOfMemory)
+ , Events(std::move(events))
+ {}
+
+ TMemoryCheckEntry(ui64 newSize, TEntryEvents events,
+ bool isStatic = false, bool outOfMemory = false)
+ : NewSize(newSize)
+ , Static(isStatic)
+ , Hold(false)
+ , HoldSize(0)
+ , Use(false)
+ , Finish(false)
+ , OutOfMemory(outOfMemory)
+ , Events(std::move(events))
+ {}
+
+ TMemoryCheckEntry(bool hold, ui64 newSize, TEntryEvents events,
+ bool isStatic = false, bool outOfMemory = false)
+ : NewSize(newSize)
+ , Static(isStatic)
+ , Hold(hold)
+ , HoldSize(0)
+ , Use(false)
+ , Finish(hold)
+ , OutOfMemory(outOfMemory)
+ , Events(std::move(events))
+ {}
+
+ TMemoryCheckEntry(bool hold, bool use, ui64 newSize, TEntryEvents events,
+ bool isStatic = false, bool outOfMemory = false)
+ : NewSize(newSize)
+ , Static(isStatic)
+ , Hold(hold)
+ , HoldSize(0)
+ , Use(use)
+ , Finish(hold)
+ , OutOfMemory(outOfMemory)
+ , Events(std::move(events))
+ {}
+
+ TMemoryCheckEntry(bool hold, bool use, bool finish, ui64 newSize, TEntryEvents events,
+ bool isStatic = false, bool outOfMemory = false)
+ : NewSize(newSize)
+ , Static(isStatic)
+ , Hold(hold)
+ , HoldSize(0)
+ , Use(use)
+ , Finish(finish)
+ , OutOfMemory(outOfMemory)
+ , Events(std::move(events))
+ {}
+
+ TMemoryCheckEntry(ui64 hold, ui64 newSize, TEntryEvents events,
+ bool isStatic = false, bool outOfMemory = false)
+ : NewSize(newSize)
+ , Static(isStatic)
+ , Hold(true)
+ , HoldSize(hold)
+ , Use(false)
+ , Finish(true)
+ , OutOfMemory(outOfMemory)
+ , Events(std::move(events))
+ {}
+
+ TMemoryCheckEntry(ui64 hold, bool use, ui64 newSize, TEntryEvents events,
+ bool isStatic = false, bool outOfMemory = false)
+ : NewSize(newSize)
+ , Static(isStatic)
+ , Hold(true)
+ , HoldSize(hold)
+ , Use(use)
+ , Finish(true)
+ , OutOfMemory(outOfMemory)
+ , Events(std::move(events))
+ {}
+ };
+
struct TTxSetResourceProfile : public ITransaction {
TString ProfileName;
@@ -1287,7 +1287,7 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutorResourceProfile) {
};
struct TMyEnvProfiles : public TMyEnvBase {
-
+
TMyEnvProfiles()
{
Env.SetLogPriority(NKikimrServices::RESOURCE_BROKER, NActors::NLog::PRI_DEBUG);
@@ -1298,8 +1298,8 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutorResourceProfile) {
SendSync(new NFake::TEvExecute(new TTxSetResourceProfile("profile1")));
Profile = Env.GetAppData().ResourceProfiles->GetProfile(NKikimrTabletBase::TTabletTypes::Unknown, "profile1");
- }
-
+ }
+
~TMyEnvProfiles()
{
SendSync(new TEvents::TEvPoison, false, true);
@@ -1318,12 +1318,12 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutorResourceProfile) {
policy->Generations.push_back({100 * 1024 * 1024, 100, 100, 200 * 1024 * 1024, NLocalDb::LegacyQueueIdToTaskName(1), true});
return policy;
}
-
+
void SetupProfile(const TString profileName)
{
auto &appData = Env.GetAppData();
appData.ResourceProfiles = new TResourceProfiles;
-
+
TResourceProfiles::TResourceProfile profile;
profile.SetTabletType(NKikimrTabletBase::TTabletTypes::Unknown);
profile.SetName(profileName);
@@ -1337,8 +1337,8 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutorResourceProfile) {
profile.SetMediumTxTaskType("medium_transaction");
profile.SetLargeTxTaskType("large_transaction");
appData.ResourceProfiles->AddProfile(profile);
- }
-
+ }
+
void CheckMemoryRequest(std::initializer_list<TMemoryCheckEntry> list,
TTxRequestMemory::TCfg cfg = { },
bool follower = false)
@@ -1346,7 +1346,7 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutorResourceProfile) {
TAutoPtr<TTxRequestMemory> event = new TTxRequestMemory({ }, 0, nullptr, cfg);
TTaskSequence sequence;
-
+
for (auto &entry : list) {
event->Requests.push_back({entry.Keys, entry.NewSize, entry.Static, entry.OutOfMemory,
entry.Hold, entry.Use, entry.HoldSize, entry.Finish});
@@ -1366,19 +1366,19 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutorResourceProfile) {
sequence.Add(NResourceBroker::TEvResourceBroker::EvFinishTask);
}
}
-
+
if (follower) {
SendFollowerAsync(new NFake::TEvExecute{ event.Release() });
} else {
SendAsync(new NFake::TEvExecute{ event.Release() });
}
-
+
if (!sequence.Events.empty()) {
TDispatchOptions options;
options.FinalEvents.emplace_back(sequence);
Env.DispatchEvents(options);
}
-
+
WaitForWakeUp();
}
@@ -1400,131 +1400,131 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutorResourceProfile) {
env.SendSync(new TEvents::TEvPoison(), false, true);
env.FireDummyTablet();
env.SendSync(new NFake::TEvExecute{ new TTxCheckResourceProfile("profile1") }, true);
- }
-
+ }
+
Y_UNIT_TEST(TestExecutorRequestTxData) {
TMyEnvProfiles env;
-
- // Request static memory.
+
+ // Request static memory.
env.CheckMemoryRequest(
- {{10 << 10, {}, true}});
- // Request dynamic memory (small task).
+ {{10 << 10, {}, true}});
+ // Request dynamic memory (small task).
env.CheckMemoryRequest(
- {{20 << 10, {"small_transaction"}}});
- // Request dynamic memory (medium task).
+ {{20 << 10, {"small_transaction"}}});
+ // Request dynamic memory (medium task).
env.CheckMemoryRequest(
- {{50 << 10, {"medium_transaction"}}});
- // Request dynamic memory (large task).
+ {{50 << 10, {"medium_transaction"}}});
+ // Request dynamic memory (large task).
env.CheckMemoryRequest(
- {{110 << 10, {"large_transaction"}}});
- // Request static memory, into small task, into medium task, into large task.
+ {{110 << 10, {"large_transaction"}}});
+ // Request static memory, into small task, into medium task, into large task.
env.CheckMemoryRequest(
- {{10 << 10, {}, true},
- {20 << 10, {"small_transaction"}},
- {50 << 10, {"", "medium_transaction"}},
- {110 << 10, {"", "large_transaction"}}});
- }
-
+ {{10 << 10, {}, true},
+ {20 << 10, {"small_transaction"}},
+ {50 << 10, {"", "medium_transaction"}},
+ {110 << 10, {"", "large_transaction"}}});
+ }
+
Y_UNIT_TEST(TestExecutorStaticMemoryLimits) {
TMyEnvProfiles env;
-
+
const ui64 limit = env.Profile->GetStaticTabletTxMemoryLimit();
-
- // Check static tablet limit has priority over tx limits.
+
+ // Check static tablet limit has priority over tx limits.
env.Profile->SetStaticTxMemoryLimit(limit * 2);
env.CheckMemoryRequest({{limit + 1, {"large_transaction"}}});
- // Check unlimited tablet memory.
+ // Check unlimited tablet memory.
env.Profile->SetStaticTabletTxMemoryLimit(0);
env.CheckMemoryRequest({{limit + 1, {}, true}});
env.CheckMemoryRequest({{limit * 2 + 1, {"large_transaction"}}});
- // Check unlimited tx memory.
+ // Check unlimited tx memory.
env.Profile->SetStaticTxMemoryLimit(0);
env.CheckMemoryRequest({{limit * 2 + 1, {}, true}});
- }
-
+ }
+
Y_UNIT_TEST(TestExecutorReuseStaticMemory) {
TMyEnvProfiles env;
-
+
env.Profile->SetStaticTxMemoryLimit(100 << 20);
- // Check static tablet memory is freed and reused by transactions.
- for (int i = 0; i < 100; ++i) {
- if (i % 2) {
+ // Check static tablet memory is freed and reused by transactions.
+ for (int i = 0; i < 100; ++i) {
+ if (i % 2) {
env.CheckMemoryRequest(
- {{50 << 20, {}, true},
- {150 << 20, {"large_transaction"}}});
- } else {
+ {{50 << 20, {}, true},
+ {150 << 20, {"large_transaction"}}});
+ } else {
env.CheckMemoryRequest(
- {{50 << 20, {}, true}});
- }
- }
- }
-
+ {{50 << 20, {}, true}});
+ }
+ }
+ }
+
Y_UNIT_TEST(TestExecutorTxDataLimitExceeded) {
TMyEnvProfiles().CheckMemoryRequest({{500 << 20, {}, false, true}});
- }
-
+ }
+
Y_UNIT_TEST(TestExecutorRequestPages) {
TMyEnvProfiles env;
-
+
env.SendSync(env.Rows.MakeRows(100, 2 << 10));
-
- // Static memory for pages.
+
+ // Static memory for pages.
env.CheckMemoryRequest(
- {{{1}, 0, {}, true}});
- // Dynamic memory for pages.
+ {{{1}, 0, {}, true}});
+ // Dynamic memory for pages.
env.CheckMemoryRequest(
- {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, 0, {"small_transaction"}}});
- // Dynamic memory for pages.
+ {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, 0, {"small_transaction"}}});
+ // Dynamic memory for pages.
env.CheckMemoryRequest(
- {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30},
- 0, {"medium_transaction"}}});
- // Dynamic memory for pages.
+ {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30},
+ 0, {"medium_transaction"}}});
+ // Dynamic memory for pages.
env.CheckMemoryRequest(
- {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
- 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
- 81, 82, 83, 84, 85, 86, 87, 88, 89, 90},
- 0, {"large_transaction"}}});
- }
-
+ {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90},
+ 0, {"large_transaction"}}});
+ }
+
Y_UNIT_TEST(TestExecutorPageLimitExceeded) {
TMyEnvProfiles env;
-
+
env.Profile->SetTxMemoryLimit(50 << 10);
env.SendSync(env.Rows.MakeRows(20, 10 << 10));
-
- // Pages are out of tx limit.
+
+ // Pages are out of tx limit.
env.CheckMemoryRequest(
- {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, 0, {}, false, true}});
- }
-
+ {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, 0, {}, false, true}});
+ }
+
Y_UNIT_TEST(TestExecutorRequestMemory) {
TMyEnvProfiles env;
-
+
env.SendSync(env.Rows.MakeRows(100, 2 << 10));
-
- // Static memory.
+
+ // Static memory.
env.CheckMemoryRequest(
- {{{1}, 4 << 10, {}, true}});
- // Dynamic memory.
+ {{{1}, 4 << 10, {}, true}});
+ // Dynamic memory.
env.CheckMemoryRequest(
- {{{1, 2, 3, 4, 5}, 14 << 10, {"small_transaction"}}});
- // Dynamic memory.
+ {{{1, 2, 3, 4, 5}, 14 << 10, {"small_transaction"}}});
+ // Dynamic memory.
env.CheckMemoryRequest(
- {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 35 << 10, {"medium_transaction"}}});
- // Dynamic memory.
+ {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 35 << 10, {"medium_transaction"}}});
+ // Dynamic memory.
env.CheckMemoryRequest(
- {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 95 << 10, {"large_transaction"}}});
- }
-
+ {{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 95 << 10, {"large_transaction"}}});
+ }
+
Y_UNIT_TEST(TestExecutorRequestMemoryFollower) {
TMyEnvProfiles env;
@@ -1548,166 +1548,166 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutorResourceProfile) {
Y_UNIT_TEST(TestExecutorMemoryLimitExceeded) {
TMyEnvProfiles env;
-
+
env.Profile->SetTxMemoryLimit(50 << 10);
env.SendSync(env.Rows.MakeRows(20, 2 << 10));
-
- // Memory is out of tx limit.
+
+ // Memory is out of tx limit.
env.CheckMemoryRequest({{{1, 2, 3, 4, 5}, 45 << 10, {}, false, true}});
- }
-
+ }
+
Y_UNIT_TEST(TestExecutorPreserveTxData) {
TMyEnvProfiles env;
-
- // Preserved static replaces static.
+
+ // Preserved static replaces static.
env.CheckMemoryRequest(
- {{10 << 10, {}, true},
- {true, 0, {}, true},
- {12 << 10, {}, true},
- {false, true, 0, {}, true}});
- // Preserved static replaces dynamic.
+ {{10 << 10, {}, true},
+ {true, 0, {}, true},
+ {12 << 10, {}, true},
+ {false, true, 0, {}, true}});
+ // Preserved static replaces dynamic.
env.CheckMemoryRequest(
- {{10 << 10, {}, true},
- {true, 0, {}, true},
- {20 << 10, {"small_transaction"}},
- {false, true, 0, {}}});
- // Preserved dynamic replaces static.
+ {{10 << 10, {}, true},
+ {true, 0, {}, true},
+ {20 << 10, {"small_transaction"}},
+ {false, true, 0, {}}});
+ // Preserved dynamic replaces static.
env.CheckMemoryRequest(
- {{20 << 10, {"small_transaction"}},
- {true, 0, {}},
- {10 << 10, {}, true},
- {false, true, 0, {}}});
- // Preserved dynamic replaces dynamic.
+ {{20 << 10, {"small_transaction"}},
+ {true, 0, {}},
+ {10 << 10, {}, true},
+ {false, true, 0, {}}});
+ // Preserved dynamic replaces dynamic.
env.CheckMemoryRequest(
- {{20 << 10, {"small_transaction"}},
- {true, 0, {}},
- {20 << 10, {"small_transaction"}},
- {false, true, 0, {}}});
-
- // Preserved static replaces static.
+ {{20 << 10, {"small_transaction"}},
+ {true, 0, {}},
+ {20 << 10, {"small_transaction"}},
+ {false, true, 0, {}}});
+
+ // Preserved static replaces static.
env.CheckMemoryRequest(
- {{10 << 10, {}, true},
- {true, 0, {}, true},
- {12 << 10, {}, true},
- {false, true, 11 << 10, {}, true}});
- // Preserved static replaces dynamic.
+ {{10 << 10, {}, true},
+ {true, 0, {}, true},
+ {12 << 10, {}, true},
+ {false, true, 11 << 10, {}, true}});
+ // Preserved static replaces dynamic.
env.CheckMemoryRequest(
- {{10 << 10, {}, true},
- {true, 0, {}, true},
- {20 << 10, {"small_transaction"}},
- {false, true, 30 << 10, {}}});
- // Preserved dynamic replaces static.
+ {{10 << 10, {}, true},
+ {true, 0, {}, true},
+ {20 << 10, {"small_transaction"}},
+ {false, true, 30 << 10, {}}});
+ // Preserved dynamic replaces static.
env.CheckMemoryRequest(
- {{20 << 10, {"small_transaction"}},
- {true, 0, {}},
- {10 << 10, {}, true},
- {false, true, 50 << 10, {"", "medium_transaction"}}});
- // Preserved dynamic replaces dynamic.
+ {{20 << 10, {"small_transaction"}},
+ {true, 0, {}},
+ {10 << 10, {}, true},
+ {false, true, 50 << 10, {"", "medium_transaction"}}});
+ // Preserved dynamic replaces dynamic.
env.CheckMemoryRequest(
- {{20 << 10, {"small_transaction"}},
- {true, 0, {}, true},
- {20 << 10, {"small_transaction"}},
- {false, true, 50 << 10, {"", "medium_transaction", "small_transaction"}}});
-
- // Preserved static replaces static.
+ {{20 << 10, {"small_transaction"}},
+ {true, 0, {}, true},
+ {20 << 10, {"small_transaction"}},
+ {false, true, 50 << 10, {"", "medium_transaction", "small_transaction"}}});
+
+ // Preserved static replaces static.
env.CheckMemoryRequest(
- {{10 << 10, {}, true},
- {true, 0, {}, true},
- {12 << 10, {}, true},
- {false, true, 500 << 20, {}, true, true}});
- // Preserved static replaces dynamic.
+ {{10 << 10, {}, true},
+ {true, 0, {}, true},
+ {12 << 10, {}, true},
+ {false, true, 500 << 20, {}, true, true}});
+ // Preserved static replaces dynamic.
env.CheckMemoryRequest(
- {{10 << 10, {}, true},
- {true, 0, {}, true},
- {20 << 10, {"small_transaction"}},
- {false, true, 500 << 20, {}, false, true}});
- // Preserved dynamic replaces static.
+ {{10 << 10, {}, true},
+ {true, 0, {}, true},
+ {20 << 10, {"small_transaction"}},
+ {false, true, 500 << 20, {}, false, true}});
+ // Preserved dynamic replaces static.
env.CheckMemoryRequest(
- {{20 << 10, {"small_transaction"}},
- {true, 0, {}},
- {10 << 10, {}, true},
- {false, true, 500 << 20, {}, false, true}});
- // Preserved dynamic replaces dynamic.
+ {{20 << 10, {"small_transaction"}},
+ {true, 0, {}},
+ {10 << 10, {}, true},
+ {false, true, 500 << 20, {}, false, true}});
+ // Preserved dynamic replaces dynamic.
env.CheckMemoryRequest(
- {{20 << 10, {"small_transaction"}},
- {true, 0, {}, true},
- {20 << 10, {"small_transaction"}},
- {false, true, 500 << 20, {}, false, true}});
- }
-
+ {{20 << 10, {"small_transaction"}},
+ {true, 0, {}, true},
+ {20 << 10, {"small_transaction"}},
+ {false, true, 500 << 20, {}, false, true}});
+ }
+
Y_UNIT_TEST(TestExecutorTxDataGC) {
TMyEnvProfiles env;
-
- // Preserve dynamic and drop it.
+
+ // Preserve dynamic and drop it.
env.CheckMemoryRequest(
- {{50 << 20, {"large_transaction"}},
- {true, 0, {}}});
- }
-
+ {{50 << 20, {"large_transaction"}},
+ {true, 0, {}}});
+ }
+
Y_UNIT_TEST(TestExecutorTxPartialDataHold) {
TMyEnvProfiles env;
-
- // Hold part of static data.
+
+ // Hold part of static data.
env.CheckMemoryRequest(
- {{10 << 10, {}, true},
- {(ui64)(5 << 10), 0, {}, true},
- {false, true, 0, {}, true}});
- // Hold part of dynamic data.
+ {{10 << 10, {}, true},
+ {(ui64)(5 << 10), 0, {}, true},
+ {false, true, 0, {}, true}});
+ // Hold part of dynamic data.
env.CheckMemoryRequest(
- {{20 << 10, {"small_transaction"}},
- {(ui64)(10 << 10), 0, {}},
- {false, true, 0, {}}});
- }
-
+ {{20 << 10, {"small_transaction"}},
+ {(ui64)(10 << 10), 0, {}},
+ {false, true, 0, {}}});
+ }
+
Y_UNIT_TEST(TestExecutorTxHoldAndUse) {
TMyEnvProfiles env;
-
- // Hold part of static data.
+
+ // Hold part of static data.
env.CheckMemoryRequest(
- {{10 << 10, {}, true},
- {(ui64)(5 << 10), 0, {}, true},
- {true, true, 0, {}, true}});
- // Hold part of dynamic data. Merge two small tasks into one medium.
+ {{10 << 10, {}, true},
+ {(ui64)(5 << 10), 0, {}, true},
+ {true, true, 0, {}, true}});
+ // Hold part of dynamic data. Merge two small tasks into one medium.
env.CheckMemoryRequest(
- {{20 << 10, {"small_transaction"}},
- {(ui64)(15 << 10), 0, {}},
- {30 << 10, {"small_transaction"}},
- {true, true, 0, {"", "", ""}},
- {30 << 10, {"small_transaction"}},
- {false, true, 0, {"", "", "medium_transaction"}}});
- }
-
+ {{20 << 10, {"small_transaction"}},
+ {(ui64)(15 << 10), 0, {}},
+ {30 << 10, {"small_transaction"}},
+ {true, true, 0, {"", "", ""}},
+ {30 << 10, {"small_transaction"}},
+ {false, true, 0, {"", "", "medium_transaction"}}});
+ }
+
Y_UNIT_TEST(TestExecutorTxHoldOnRelease) {
TMyEnvProfiles env;
-
- // Hold dynamic data on task extend. Merge two small tasks into one medium.
+
+ // Hold dynamic data on task extend. Merge two small tasks into one medium.
env.CheckMemoryRequest(
- {{20 << 10, {"small_transaction"}},
- // 20KB is captured on ReleaseTxData -> small task is requested.
- {30 << 10, {"small_transaction"}},
+ {{20 << 10, {"small_transaction"}},
+ // 20KB is captured on ReleaseTxData -> small task is requested.
+ {30 << 10, {"small_transaction"}},
{false, true, 0, {"", "", "medium_transaction", 1}}},
{ false /* static */, true /* dynamic */ });
- }
-
+ }
+
Y_UNIT_TEST(TestUpdateConfig) {
TMyEnvProfiles env;
-
- // Request dynamic memory (large task).
+
+ // Request dynamic memory (large task).
env.CheckMemoryRequest({{110 << 10, {"large_transaction"}}});
-
- // Gen new profile with no required profile. EvUpdateConfig should cause
- // default profile to be chosen then.
+
+ // Gen new profile with no required profile. EvUpdateConfig should cause
+ // default profile to be chosen then.
env.SetupProfile("profile2");
env.SendAsync(new TEvTablet::TEvUpdateConfig(env->GetAppData().ResourceProfiles));
-
- // Profile name in schema is unmodified.
+
+ // Profile name in schema is unmodified.
env.SendSync(new NFake::TEvExecute{ new TTxCheckResourceProfile("profile1") });
-
- // But default profile is actually used now.
+
+ // But default profile is actually used now.
env.CheckMemoryRequest({{200 << 20, {}, true}});
- }
-}
-
+ }
+}
+
Y_UNIT_TEST_SUITE(TFlatTableExecutorSliceOverlapScan) {
Y_UNIT_TEST(TestSliceOverlapScan) {
@@ -1742,7 +1742,7 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutorSliceOverlapScan) {
env.SendSync(new TEvents::TEvPoison, false, true);
}
-}
+}
Y_UNIT_TEST_SUITE(TFlatTableExecutorShardedCompaction) {
@@ -1852,7 +1852,7 @@ Y_UNIT_TEST_SUITE(TFlatTableExecutorShardedCompaction) {
}
}
-}
+}
Y_UNIT_TEST_SUITE(TFlatTableExecutorColumnGroups) {
diff --git a/ydb/core/tablet_flat/flat_sausagecache.cpp b/ydb/core/tablet_flat/flat_sausagecache.cpp
index 747f446ce9b..4d396e8f758 100644
--- a/ydb/core/tablet_flat/flat_sausagecache.cpp
+++ b/ydb/core/tablet_flat/flat_sausagecache.cpp
@@ -18,7 +18,7 @@ TPrivatePageCache::TPage::TPage(ui32 size, ui32 pageId, TInfo* info)
TPrivatePageCache::TInfo::TInfo(TIntrusiveConstPtr<NPageCollection::IPageCollection> pageCollection)
: Id(pageCollection->Label())
, PageCollection(std::move(pageCollection))
- , Users(0)
+ , Users(0)
{
PageMap.resize(PageCollection->Total());
}
@@ -26,7 +26,7 @@ TPrivatePageCache::TInfo::TInfo(TIntrusiveConstPtr<NPageCollection::IPageCollect
TPrivatePageCache::TInfo::TInfo(const TInfo &info)
: Id(info.Id)
, PageCollection(info.PageCollection)
- , Users(info.Users)
+ , Users(info.Users)
{
PageMap.resize(info.PageMap.size());
for (const auto& kv : info.PageMap) {
@@ -70,10 +70,10 @@ void TPrivatePageCache::RegisterPageCollection(TIntrusivePtr<TInfo> info) {
if (page->Sticky)
Stats.TotalSticky += page->Size;
}
-
+
Evict(evicted);
- ++info->Users;
+ ++info->Users;
}
TPrivatePageCache::TPage::TWaitQueuePtr TPrivatePageCache::ForgetPageCollection(TLogoBlobID id) {
@@ -115,18 +115,18 @@ TPrivatePageCache::TPage::TWaitQueuePtr TPrivatePageCache::ForgetPageCollection(
void TPrivatePageCache::LockPageCollection(TLogoBlobID id) {
auto it = PageCollections.find(id);
Y_VERIFY(it != PageCollections.end(), "trying to lock unknown page collection. logic flaw?");
- ++it->second->Users;
-}
-
+ ++it->second->Users;
+}
+
bool TPrivatePageCache::UnlockPageCollection(TLogoBlobID id) {
auto it = PageCollections.find(id);
Y_VERIFY(it != PageCollections.end(), "trying to unlock unknown page collection. logic flaw?");
- TIntrusivePtr<TInfo> info = it->second;
-
- --info->Users;
-
+ TIntrusivePtr<TInfo> info = it->second;
+
+ --info->Users;
+
// Completely forget page collection if no users remain.
- if (!info->Users) {
+ if (!info->Users) {
for (const auto& kv : info->PageMap) {
auto* page = kv.second.Get();
Y_VERIFY_DEBUG(page);
@@ -146,17 +146,17 @@ bool TPrivatePageCache::UnlockPageCollection(TLogoBlobID id) {
Stats.TotalSharedPending -= page->Size;
if (page->Sticky)
Stats.TotalSticky -= page->Size;
- }
-
+ }
+
info->PageMap.clear();
PageCollections.erase(it);
- ToTouchShared.erase(id);
+ ToTouchShared.erase(id);
--Stats.TotalCollections;
- }
-
- return !info->Users;
-}
-
+ }
+
+ return !info->Users;
+}
+
THashMap<TLogoBlobID, THashMap<ui32, TSharedData>> TPrivatePageCache::GetPrepareSharedTouched() {
return std::move(ToTouchShared);
}
diff --git a/ydb/core/tablet_flat/flat_sausagecache.h b/ydb/core/tablet_flat/flat_sausagecache.h
index fe1a71dac43..ac040eb0171 100644
--- a/ydb/core/tablet_flat/flat_sausagecache.h
+++ b/ydb/core/tablet_flat/flat_sausagecache.h
@@ -228,7 +228,7 @@ public:
const TLogoBlobID Id;
const TIntrusiveConstPtr<NPageCollection::IPageCollection> PageCollection;
TPageMap<THolder<TPage>> PageMap;
- ui64 Users;
+ ui64 Users;
explicit TInfo(TIntrusiveConstPtr<NPageCollection::IPageCollection> pack);
TInfo(const TInfo &info);
@@ -243,7 +243,7 @@ public:
void LockPageCollection(TLogoBlobID id);
// Return true for page collections removed after unlock.
bool UnlockPageCollection(TLogoBlobID id);
-
+
TInfo* Info(TLogoBlobID id);
void Touch(ui32 page, TInfo *collectionInfo);
diff --git a/ydb/core/tablet_flat/tablet_flat_executed.cpp b/ydb/core/tablet_flat/tablet_flat_executed.cpp
index 11cd56c83dd..4b3c15490c5 100644
--- a/ydb/core/tablet_flat/tablet_flat_executed.cpp
+++ b/ydb/core/tablet_flat/tablet_flat_executed.cpp
@@ -50,7 +50,7 @@ void TTabletExecutedFlat::Handle(TEvTablet::TEvBoot::TPtr &ev, const TActorConte
const auto& msg = *ev->Get();
UpdateTabletInfo(msg.TabletStorageInfo, msg.Launcher);
CreateExecutor(ctx)->Boot(ev, ExecutorCtx(ctx));
- TxCacheQuota = ev->Get()->TxCacheQuota;
+ TxCacheQuota = ev->Get()->TxCacheQuota;
}
void TTabletExecutedFlat::Handle(TEvTablet::TEvRestored::TPtr &ev, const TActorContext &ctx) {
@@ -60,7 +60,7 @@ void TTabletExecutedFlat::Handle(TEvTablet::TEvRestored::TPtr &ev, const TActorC
void TTabletExecutedFlat::Handle(TEvTablet::TEvFBoot::TPtr &ev, const TActorContext &ctx) {
UpdateTabletInfo(ev->Get()->TabletStorageInfo);
CreateExecutor(ctx)->FollowerBoot(ev, ExecutorCtx(ctx));
- TxCacheQuota = ev->Get()->TxCacheQuota;
+ TxCacheQuota = ev->Get()->TxCacheQuota;
}
void TTabletExecutedFlat::Handle(TEvTablet::TEvFUpdate::TPtr &ev) {
@@ -89,10 +89,10 @@ void TTabletExecutedFlat::Handle(TEvTablet::TEvFollowerGcApplied::TPtr &ev) {
}
void TTabletExecutedFlat::Handle(TEvTablet::TEvUpdateConfig::TPtr &ev) {
- if (Executor())
+ if (Executor())
Executor()->UpdateConfig(ev);
-}
-
+}
+
void TTabletExecutedFlat::OnTabletStop(TEvTablet::TEvTabletStop::TPtr &ev, const TActorContext &ctx) {
Y_UNUSED(ev);
// Default implementation just confirms it's ok to be stopped
diff --git a/ydb/core/tablet_flat/tablet_flat_executed.h b/ydb/core/tablet_flat/tablet_flat_executed.h
index 5d6c7a13d55..117d7532bb3 100644
--- a/ydb/core/tablet_flat/tablet_flat_executed.h
+++ b/ydb/core/tablet_flat/tablet_flat_executed.h
@@ -68,15 +68,15 @@ protected:
bool HandleDefaultEvents(STFUNC_SIG);
virtual void RenderHtmlPage(NMon::TEvRemoteHttpInfo::TPtr&, const TActorContext &ctx);
- bool TryCaptureTxCache(ui64 size) {
- if (!TxCacheQuota)
- return false;
- return TxCacheQuota->TryCaptureQuota(size);
- }
- void ReleaseTxCache(ui64 size) {
- if (size)
- TxCacheQuota->ReleaseQuota(size);
- }
+ bool TryCaptureTxCache(ui64 size) {
+ if (!TxCacheQuota)
+ return false;
+ return TxCacheQuota->TryCaptureQuota(size);
+ }
+ void ReleaseTxCache(ui64 size) {
+ if (size)
+ TxCacheQuota->ReleaseQuota(size);
+ }
private:
IExecutor* CreateExecutor(const TActorContext &ctx);
diff --git a/ydb/core/tablet_flat/tablet_flat_executor.cpp b/ydb/core/tablet_flat/tablet_flat_executor.cpp
index 620b53cc7cc..f69991ece9c 100644
--- a/ydb/core/tablet_flat/tablet_flat_executor.cpp
+++ b/ydb/core/tablet_flat/tablet_flat_executor.cpp
@@ -28,7 +28,7 @@ namespace NFlatExecutorSetup {
{
Y_UNUSED(status);
Y_UNUSED(prod);
- Y_UNUSED(cookie);
+ Y_UNUSED(cookie);
Y_UNUSED(ctx);
}
diff --git a/ydb/core/tablet_flat/tablet_flat_executor.h b/ydb/core/tablet_flat/tablet_flat_executor.h
index c6efc1b9650..075ebce354b 100644
--- a/ydb/core/tablet_flat/tablet_flat_executor.h
+++ b/ydb/core/tablet_flat/tablet_flat_executor.h
@@ -2,7 +2,7 @@
#include "defs.h"
#include "flat_scan_iface.h"
-
+
#include <ydb/core/base/tablet.h>
#include <ydb/core/base/blobstorage.h>
#include <library/cpp/lwtrace/shuttle.h>
@@ -40,21 +40,21 @@ public:
NTable::TSnapEdge Edge(ui32 table) const;
};
-class TMemoryGCToken : public TThrRefBase {
-public:
- TMemoryGCToken(ui64 size, ui64 taskId)
- : Size(size)
- , TaskId(taskId)
- {}
- virtual ~TMemoryGCToken() {}
-
- bool IsDropped() const {
- return AtomicLoad(&Dropped);
- }
- void Drop() {
- AtomicStore(&Dropped, true);
- }
-
+class TMemoryGCToken : public TThrRefBase {
+public:
+ TMemoryGCToken(ui64 size, ui64 taskId)
+ : Size(size)
+ , TaskId(taskId)
+ {}
+ virtual ~TMemoryGCToken() {}
+
+ bool IsDropped() const {
+ return AtomicLoad(&Dropped);
+ }
+ void Drop() {
+ AtomicStore(&Dropped, true);
+ }
+
void Describe(IOutputStream &out) const noexcept
{
out << "Res{";
@@ -68,26 +68,26 @@ public:
out << " " << Size << "b}";
}
- const ui64 Size;
- const ui64 TaskId;
-
-private:
- volatile bool Dropped = false;
-};
-
-class TMemoryToken {
-public:
+ const ui64 Size;
+ const ui64 TaskId;
+
+private:
+ volatile bool Dropped = false;
+};
+
+class TMemoryToken {
+public:
TMemoryToken(TIntrusivePtr<TMemoryGCToken> gcToken)
- : GCToken(gcToken)
- {}
-
- ~TMemoryToken() {
- GCToken->Drop();
- }
-
+ : GCToken(gcToken)
+ {}
+
+ ~TMemoryToken() {
+ GCToken->Drop();
+ }
+
const TIntrusivePtr<TMemoryGCToken> GCToken;
-};
-
+};
+
struct IExecuting {
/* Functionality available only in tx execution contextt */
@@ -102,39 +102,39 @@ struct IExecuting {
virtual void ConfirmLoan(const TLogoBlobID &bundleId, const TLogoBlobID &borrowId) = 0; // confirm loan update delivery (called on part destination)
};
-class TTxMemoryProviderBase : TNonCopyable {
+class TTxMemoryProviderBase : TNonCopyable {
public:
- TTxMemoryProviderBase(ui64 memoryLimit, ui64 taskId)
- : MemoryLimit(memoryLimit)
- , TaskId(taskId)
- , RequestedMemory(0)
+ TTxMemoryProviderBase(ui64 memoryLimit, ui64 taskId)
+ : MemoryLimit(memoryLimit)
+ , TaskId(taskId)
+ , RequestedMemory(0)
, NotEnoughMemoryCount(0)
{}
- ~TTxMemoryProviderBase() {}
-
- ui64 GetMemoryLimit() const
- {
- if (MemoryToken)
- return MemoryToken->GCToken->Size;
- return MemoryLimit;
- }
-
- ui64 GetTaskId() const
- {
- if (MemoryToken)
- return MemoryToken->GCToken->TaskId;
- return TaskId;
- }
-
- void RequestMemory(ui64 bytes)
- {
- Y_VERIFY(!MemoryGCToken);
- RequestedMemory += bytes;
- }
-
- ui64 GetRequestedMemory() const { return RequestedMemory; }
-
+ ~TTxMemoryProviderBase() {}
+
+ ui64 GetMemoryLimit() const
+ {
+ if (MemoryToken)
+ return MemoryToken->GCToken->Size;
+ return MemoryLimit;
+ }
+
+ ui64 GetTaskId() const
+ {
+ if (MemoryToken)
+ return MemoryToken->GCToken->TaskId;
+ return TaskId;
+ }
+
+ void RequestMemory(ui64 bytes)
+ {
+ Y_VERIFY(!MemoryGCToken);
+ RequestedMemory += bytes;
+ }
+
+ ui64 GetRequestedMemory() const { return RequestedMemory; }
+
void NotEnoughMemory(ui32 add = 1)
{
NotEnoughMemoryCount += add;
@@ -142,74 +142,74 @@ public:
ui32 GetNotEnoughMemoryCount() const { return NotEnoughMemoryCount; }
- /**
- * Memory token should be captured only when tx is finished
- * or within ReleaseTxData method.
- */
- TAutoPtr<TMemoryToken> HoldMemory()
- {
- return HoldMemory(MemoryLimit);
- }
-
- TAutoPtr<TMemoryToken> HoldMemory(ui64 size)
- {
- Y_VERIFY(!MemoryGCToken);
- Y_VERIFY(size <= MemoryLimit);
- Y_VERIFY(size > 0);
- MemoryGCToken = new TMemoryGCToken(size, TaskId);
- return new TMemoryToken(MemoryGCToken);
- }
-
- void UseMemoryToken(TAutoPtr<TMemoryToken> token)
- {
- Y_VERIFY(!MemoryToken);
- MemoryToken = std::move(token);
- }
-
- TAutoPtr<TMemoryToken> ExtractMemoryToken()
- {
- return std::move(MemoryToken);
- }
-
+ /**
+ * Memory token should be captured only when tx is finished
+ * or within ReleaseTxData method.
+ */
+ TAutoPtr<TMemoryToken> HoldMemory()
+ {
+ return HoldMemory(MemoryLimit);
+ }
+
+ TAutoPtr<TMemoryToken> HoldMemory(ui64 size)
+ {
+ Y_VERIFY(!MemoryGCToken);
+ Y_VERIFY(size <= MemoryLimit);
+ Y_VERIFY(size > 0);
+ MemoryGCToken = new TMemoryGCToken(size, TaskId);
+ return new TMemoryToken(MemoryGCToken);
+ }
+
+ void UseMemoryToken(TAutoPtr<TMemoryToken> token)
+ {
+ Y_VERIFY(!MemoryToken);
+ MemoryToken = std::move(token);
+ }
+
+ TAutoPtr<TMemoryToken> ExtractMemoryToken()
+ {
+ return std::move(MemoryToken);
+ }
+
TIntrusivePtr<TMemoryGCToken> GetMemoryGCToken() const { return MemoryGCToken; }
-
-private:
- const ui64 MemoryLimit;
- const ui64 TaskId;
- ui64 RequestedMemory;
+
+private:
+ const ui64 MemoryLimit;
+ const ui64 TaskId;
+ ui64 RequestedMemory;
ui32 NotEnoughMemoryCount;
TIntrusivePtr<TMemoryGCToken> MemoryGCToken;
- TAutoPtr<TMemoryToken> MemoryToken;
+ TAutoPtr<TMemoryToken> MemoryToken;
};
-class TTxMemoryProvider : public TTxMemoryProviderBase {
-public:
- TTxMemoryProvider(ui64 memoryLimit, ui64 taskId)
- : TTxMemoryProviderBase(memoryLimit, taskId)
- {}
- ~TTxMemoryProvider() {}
-
-private:
- using TTxMemoryProviderBase::RequestMemory;
- using TTxMemoryProviderBase::UseMemoryToken;
- using TTxMemoryProviderBase::ExtractMemoryToken;
-};
-
-class TTransactionContext : public TTxMemoryProviderBase {
+class TTxMemoryProvider : public TTxMemoryProviderBase {
+public:
+ TTxMemoryProvider(ui64 memoryLimit, ui64 taskId)
+ : TTxMemoryProviderBase(memoryLimit, taskId)
+ {}
+ ~TTxMemoryProvider() {}
+
+private:
+ using TTxMemoryProviderBase::RequestMemory;
+ using TTxMemoryProviderBase::UseMemoryToken;
+ using TTxMemoryProviderBase::ExtractMemoryToken;
+};
+
+class TTransactionContext : public TTxMemoryProviderBase {
friend class TExecutor;
-public:
- TTransactionContext(ui64 tablet, ui32 gen, ui32 step, NTable::TDatabase &db, IExecuting &env,
- ui64 memoryLimit, ui64 taskId)
- : TTxMemoryProviderBase(memoryLimit, taskId)
- , Tablet(tablet)
- , Generation(gen)
- , Step(step)
- , Env(env)
- , DB(db)
- {}
-
- ~TTransactionContext() {}
+public:
+ TTransactionContext(ui64 tablet, ui32 gen, ui32 step, NTable::TDatabase &db, IExecuting &env,
+ ui64 memoryLimit, ui64 taskId)
+ : TTxMemoryProviderBase(memoryLimit, taskId)
+ , Tablet(tablet)
+ , Generation(gen)
+ , Step(step)
+ , Env(env)
+ , DB(db)
+ {}
+
+ ~TTransactionContext() {}
void OnCommitted(std::function<void()> callback) {
OnCommitted_.emplace_back(std::move(callback));
@@ -224,8 +224,8 @@ public:
private:
TVector<std::function<void()>> OnCommitted_;
-};
-
+};
+
struct TCompactedPartLoans {
TLogoBlobID MetaInfoId;
ui64 Lender;
@@ -249,11 +249,11 @@ struct TFinishedCompactionInfo {
{}
};
-enum class ETerminationReason {
- None = 0,
- MemoryLimitExceeded = 1,
-};
-
+enum class ETerminationReason {
+ None = 0,
+ MemoryLimitExceeded = 1,
+};
+
class ITransaction : TNonCopyable {
public:
@@ -269,10 +269,10 @@ public:
/// @return true if execution complete and transaction is ready for commit
virtual bool Execute(TTransactionContext &txc, const TActorContext &ctx) = 0;
virtual void Complete(const TActorContext &ctx) = 0;
- virtual void Terminate(ETerminationReason reason, const TActorContext &/*ctx*/) {
- Y_FAIL("Unexpected transaction termination (reason %" PRIu32 ")", (ui32)reason);
- }
- virtual void ReleaseTxData(TTxMemoryProvider &/*provider*/, const TActorContext &/*ctx*/) {}
+ virtual void Terminate(ETerminationReason reason, const TActorContext &/*ctx*/) {
+ Y_FAIL("Unexpected transaction termination (reason %" PRIu32 ")", (ui32)reason);
+ }
+ virtual void ReleaseTxData(TTxMemoryProvider &/*provider*/, const TActorContext &/*ctx*/) {}
virtual TTxType GetTxType() const { return UnknownTxType; }
virtual void Describe(IOutputStream &out) const noexcept
@@ -447,9 +447,9 @@ namespace NFlatExecutorSetup {
virtual bool ReassignChannelsEnabled() const;
- // memory usage excluding transactions and executor cache.
- virtual ui64 GetMemoryUsage() const { return 50 << 10; }
-
+ // memory usage excluding transactions and executor cache.
+ virtual ui64 GetMemoryUsage() const { return 50 << 10; }
+
virtual void OnLeaderUserAuxUpdate(TString) { /* default */ }
// create transaction?
@@ -504,7 +504,7 @@ namespace NFlatExecutorSetup {
4. May return empty blob on lack of some vital pages in cache.
*/
virtual TString BorrowSnapshot(ui32 tableId, const TTableSnapshotContext&, TRawVals from, TRawVals to, ui64 loaner) const = 0;
- // Prepare snapshot which can later be used for scan task.
+ // Prepare snapshot which can later be used for scan task.
virtual ui64 MakeScanSnapshot(ui32 table) = 0;
virtual void DropScanSnapshot(ui64 snapId) = 0;
virtual ui64 QueueScan(ui32 tableId, TAutoPtr<NTable::IScan> scan, ui64 cookie, const TScanOptions& options = TScanOptions()) = 0;
@@ -527,7 +527,7 @@ namespace NFlatExecutorSetup {
virtual void GetTabletCounters(TEvTablet::TEvGetCounters::TPtr&) = 0;
virtual void UpdateConfig(TEvTablet::TEvUpdateConfig::TPtr&) = 0;
-
+
virtual void SendUserAuxUpdateToFollowers(TString upd, const TActorContext &ctx) = 0;
// Returns parts owned by this tablet and borrowed by other tablets
diff --git a/ydb/core/tablet_flat/ut/ya.make b/ydb/core/tablet_flat/ut/ya.make
index df10b32902a..fd66d042026 100644
--- a/ydb/core/tablet_flat/ut/ya.make
+++ b/ydb/core/tablet_flat/ut/ya.make
@@ -14,8 +14,8 @@ ENDIF()
OWNER(g:kikimr)
SRCS(
- datetime_ut.cpp
- decimal_ut.cpp
+ datetime_ut.cpp
+ decimal_ut.cpp
flat_cxx_database_ut.cpp
ut_db_iface.cpp
ut_db_scheme.cpp
diff --git a/ydb/core/testlib/tenant_helpers.h b/ydb/core/testlib/tenant_helpers.h
index c9c62b0e004..209b73baa0e 100644
--- a/ydb/core/testlib/tenant_helpers.h
+++ b/ydb/core/testlib/tenant_helpers.h
@@ -1,70 +1,70 @@
-#pragma once
-#include "defs.h"
-#include "tenant_runtime.h"
-
+#pragma once
+#include "defs.h"
+#include "tenant_runtime.h"
+
#include <ydb/core/cms/console/console.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace NKikimr {
-
-struct TSlotRequest {
- TString Type;
- TString Zone;
- ui64 Count;
-};
-
-struct TSlotState {
- ui64 Required = 0;
- ui64 Allocated = 0;
-};
-
-struct TPoolAllocation {
- TPoolAllocation(const TString &type = "", ui32 size = 0, ui32 allocated = 0)
- : PoolType(type)
- , PoolSize(size)
- , Allocated(allocated)
- {
- }
-
- TString PoolType;
- ui32 PoolSize;
- ui32 Allocated;
-};
-
-inline void CollectSlots(TVector<TSlotRequest> &)
-{
-}
-
-template <typename ...Ts>
-void CollectSlots(TVector<TSlotRequest> &requests,
- const TString &type,
- const TString &zone,
- ui64 count,
- Ts... args)
-{
- requests.push_back({type, zone, count});
- CollectSlots(requests, args...);
-}
-
-inline void CollectSlots(THashMap<std::pair<TString, TString>, TSlotState> &)
-{
-}
-
-template <typename ...Ts>
-void CollectSlots(THashMap<std::pair<TString, TString>, TSlotState> &slots,
- const TString &type,
- const TString &zone,
- ui64 required,
- ui64 allocated,
- Ts... args)
-{
- auto &slot = slots[std::make_pair(type, zone)];
- slot.Required += required;
- slot.Allocated += allocated;
- CollectSlots(slots, args...);
-}
-
+
+namespace NKikimr {
+
+struct TSlotRequest {
+ TString Type;
+ TString Zone;
+ ui64 Count;
+};
+
+struct TSlotState {
+ ui64 Required = 0;
+ ui64 Allocated = 0;
+};
+
+struct TPoolAllocation {
+ TPoolAllocation(const TString &type = "", ui32 size = 0, ui32 allocated = 0)
+ : PoolType(type)
+ , PoolSize(size)
+ , Allocated(allocated)
+ {
+ }
+
+ TString PoolType;
+ ui32 PoolSize;
+ ui32 Allocated;
+};
+
+inline void CollectSlots(TVector<TSlotRequest> &)
+{
+}
+
+template <typename ...Ts>
+void CollectSlots(TVector<TSlotRequest> &requests,
+ const TString &type,
+ const TString &zone,
+ ui64 count,
+ Ts... args)
+{
+ requests.push_back({type, zone, count});
+ CollectSlots(requests, args...);
+}
+
+inline void CollectSlots(THashMap<std::pair<TString, TString>, TSlotState> &)
+{
+}
+
+template <typename ...Ts>
+void CollectSlots(THashMap<std::pair<TString, TString>, TSlotState> &slots,
+ const TString &type,
+ const TString &zone,
+ ui64 required,
+ ui64 allocated,
+ Ts... args)
+{
+ auto &slot = slots[std::make_pair(type, zone)];
+ slot.Required += required;
+ slot.Allocated += allocated;
+ CollectSlots(slots, args...);
+}
+
struct TCreateTenantRequest {
using TSelf = TCreateTenantRequest;
using TAttrsCont = TVector<std::pair<TString, TString>>;
@@ -149,13 +149,13 @@ struct TCreateTenantRequest {
};
inline void CheckCreateTenant(TTenantTestRuntime &runtime,
- const TString &token,
- Ydb::StatusIds::StatusCode code,
+ const TString &token,
+ Ydb::StatusIds::StatusCode code,
const TCreateTenantRequest &request)
-{
+{
using EType = TCreateTenantRequest::EType;
-
- auto *event = new NConsole::TEvConsole::TEvCreateTenantRequest;
+
+ auto *event = new NConsole::TEvConsole::TEvCreateTenantRequest;
event->Record.MutableRequest()->set_path(request.Path);
auto *resources = request.Type == EType::Shared
@@ -164,24 +164,24 @@ inline void CheckCreateTenant(TTenantTestRuntime &runtime,
for (auto &req : request.Slots) {
auto &unit = *resources->add_computational_units();
- unit.set_unit_kind(req.Type);
- unit.set_availability_zone(req.Zone);
- unit.set_count(req.Count);
- }
+ unit.set_unit_kind(req.Type);
+ unit.set_availability_zone(req.Zone);
+ unit.set_count(req.Count);
+ }
for (auto &pool : request.Pools) {
auto &unit = *resources->add_storage_units();
- unit.set_unit_kind(pool.PoolType);
- unit.set_count(pool.PoolSize);
- }
+ unit.set_unit_kind(pool.PoolType);
+ unit.set_count(pool.PoolSize);
+ }
- if (token)
- event->Record.SetUserToken(token);
+ if (token)
+ event->Record.SetUserToken(token);
for (const auto& [key, value] : request.Attrs) {
(*event->Record.MutableRequest()->mutable_attributes())[key] = value;
- }
-
+ }
+
if (request.Type == EType::Serverless) {
event->Record.MutableRequest()->mutable_serverless_resources()->set_shared_database_path(request.SharedDbPath);
}
@@ -190,33 +190,33 @@ inline void CheckCreateTenant(TTenantTestRuntime &runtime,
event->Record.MutableRequest()->mutable_options()->set_plan_resolution(request.PlanResolution);
}
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<NConsole::TEvConsole::TEvCreateTenantResponse>(handle);
- auto &operation = reply->Record.GetResponse().operation();
-
- if (operation.ready()) {
- UNIT_ASSERT_VALUES_EQUAL(operation.status(), code);
- } else {
- TString id = operation.id();
- auto *request = new NConsole::TEvConsole::TEvNotifyOperationCompletionRequest;
- request->Record.MutableRequest()->set_id(id);
-
- runtime.SendToConsole(request);
- TAutoPtr<IEventHandle> handle;
- auto replies = runtime.GrabEdgeEventsRethrow<NConsole::TEvConsole::TEvNotifyOperationCompletionResponse,
- NConsole::TEvConsole::TEvOperationCompletionNotification>(handle);
- auto *resp = std::get<1>(replies);
- if (!resp) {
- UNIT_ASSERT(!std::get<0>(replies)->Record.GetResponse().operation().ready());
- resp = runtime.GrabEdgeEventRethrow<NConsole::TEvConsole::TEvOperationCompletionNotification>(handle);
- }
-
- UNIT_ASSERT(resp->Record.GetResponse().operation().ready());
- UNIT_ASSERT_VALUES_EQUAL(resp->Record.GetResponse().operation().status(), code);
- }
-}
-
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<NConsole::TEvConsole::TEvCreateTenantResponse>(handle);
+ auto &operation = reply->Record.GetResponse().operation();
+
+ if (operation.ready()) {
+ UNIT_ASSERT_VALUES_EQUAL(operation.status(), code);
+ } else {
+ TString id = operation.id();
+ auto *request = new NConsole::TEvConsole::TEvNotifyOperationCompletionRequest;
+ request->Record.MutableRequest()->set_id(id);
+
+ runtime.SendToConsole(request);
+ TAutoPtr<IEventHandle> handle;
+ auto replies = runtime.GrabEdgeEventsRethrow<NConsole::TEvConsole::TEvNotifyOperationCompletionResponse,
+ NConsole::TEvConsole::TEvOperationCompletionNotification>(handle);
+ auto *resp = std::get<1>(replies);
+ if (!resp) {
+ UNIT_ASSERT(!std::get<0>(replies)->Record.GetResponse().operation().ready());
+ resp = runtime.GrabEdgeEventRethrow<NConsole::TEvConsole::TEvOperationCompletionNotification>(handle);
+ }
+
+ UNIT_ASSERT(resp->Record.GetResponse().operation().ready());
+ UNIT_ASSERT_VALUES_EQUAL(resp->Record.GetResponse().operation().status(), code);
+ }
+}
+
inline void CheckCreateTenant(TTenantTestRuntime &runtime,
Ydb::StatusIds::StatusCode code,
const TCreateTenantRequest &request)
@@ -224,15 +224,15 @@ inline void CheckCreateTenant(TTenantTestRuntime &runtime,
CheckCreateTenant(runtime, "", code, request);
}
-template <typename ...Ts>
-void CheckCreateTenant(TTenantTestRuntime &runtime,
- const TString &path,
+template <typename ...Ts>
+void CheckCreateTenant(TTenantTestRuntime &runtime,
+ const TString &path,
const TString &token,
- Ydb::StatusIds::StatusCode code,
- TVector<TPoolAllocation> pools,
- const TVector<std::pair<TString, TString>> &attrs,
- Ts... args)
-{
+ Ydb::StatusIds::StatusCode code,
+ TVector<TPoolAllocation> pools,
+ const TVector<std::pair<TString, TString>> &attrs,
+ Ts... args)
+{
TVector<TSlotRequest> slots;
CollectSlots(slots, args...);
@@ -251,73 +251,73 @@ void CheckCreateTenant(TTenantTestRuntime &runtime,
const TVector<std::pair<TString, TString>> &attrs,
Ts... args)
{
- CheckCreateTenant(runtime, path, "", code, pools, attrs, args...);
-}
-
-template <typename ...Ts>
-void CheckCreateTenant(TTenantTestRuntime &runtime,
- const TString &path,
- const TString &token,
- Ydb::StatusIds::StatusCode code,
- TVector<TPoolAllocation> pools,
- Ts... args)
-{
- CheckCreateTenant(runtime, path, token, code, pools, {}, args...);
-}
-
-template <typename ...Ts>
-void CheckCreateTenant(TTenantTestRuntime &runtime,
- const TString &path,
- Ydb::StatusIds::StatusCode code,
- TVector<TPoolAllocation> pools,
- Ts... args)
-{
- CheckCreateTenant(runtime, path, "", code, pools, {}, args...);
-}
-
-inline void CheckRemoveTenant(TTenantTestRuntime &runtime,
- const TString &path,
- const TString &token,
- Ydb::StatusIds::StatusCode code)
-{
- auto *event = new NConsole::TEvConsole::TEvRemoveTenantRequest;
- event->Record.MutableRequest()->set_path(path);
- if (token)
- event->Record.SetUserToken(token);
-
- TAutoPtr<IEventHandle> handle;
- runtime.SendToConsole(event);
- auto reply = runtime.GrabEdgeEventRethrow<NConsole::TEvConsole::TEvRemoveTenantResponse>(handle);
- auto &operation = reply->Record.GetResponse().operation();
-
- if (operation.ready()) {
- UNIT_ASSERT_VALUES_EQUAL(operation.status(), code);
- } else {
- TString id = operation.id();
+ CheckCreateTenant(runtime, path, "", code, pools, attrs, args...);
+}
+
+template <typename ...Ts>
+void CheckCreateTenant(TTenantTestRuntime &runtime,
+ const TString &path,
+ const TString &token,
+ Ydb::StatusIds::StatusCode code,
+ TVector<TPoolAllocation> pools,
+ Ts... args)
+{
+ CheckCreateTenant(runtime, path, token, code, pools, {}, args...);
+}
+
+template <typename ...Ts>
+void CheckCreateTenant(TTenantTestRuntime &runtime,
+ const TString &path,
+ Ydb::StatusIds::StatusCode code,
+ TVector<TPoolAllocation> pools,
+ Ts... args)
+{
+ CheckCreateTenant(runtime, path, "", code, pools, {}, args...);
+}
+
+inline void CheckRemoveTenant(TTenantTestRuntime &runtime,
+ const TString &path,
+ const TString &token,
+ Ydb::StatusIds::StatusCode code)
+{
+ auto *event = new NConsole::TEvConsole::TEvRemoveTenantRequest;
+ event->Record.MutableRequest()->set_path(path);
+ if (token)
+ event->Record.SetUserToken(token);
+
+ TAutoPtr<IEventHandle> handle;
+ runtime.SendToConsole(event);
+ auto reply = runtime.GrabEdgeEventRethrow<NConsole::TEvConsole::TEvRemoveTenantResponse>(handle);
+ auto &operation = reply->Record.GetResponse().operation();
+
+ if (operation.ready()) {
+ UNIT_ASSERT_VALUES_EQUAL(operation.status(), code);
+ } else {
+ TString id = operation.id();
for (;;) {
- auto check = new NConsole::TEvConsole::TEvGetOperationRequest;
- check->Record.MutableRequest()->set_id(id);
- runtime.SendToConsole(check);
- auto checkReply = runtime.GrabEdgeEventRethrow<NConsole::TEvConsole::TEvGetOperationResponse>(handle);
- auto &checkOperation = checkReply->Record.GetResponse().operation();
- if (checkOperation.ready()) {
- UNIT_ASSERT_VALUES_EQUAL(checkOperation.status(), code);
+ auto check = new NConsole::TEvConsole::TEvGetOperationRequest;
+ check->Record.MutableRequest()->set_id(id);
+ runtime.SendToConsole(check);
+ auto checkReply = runtime.GrabEdgeEventRethrow<NConsole::TEvConsole::TEvGetOperationResponse>(handle);
+ auto &checkOperation = checkReply->Record.GetResponse().operation();
+ if (checkOperation.ready()) {
+ UNIT_ASSERT_VALUES_EQUAL(checkOperation.status(), code);
break;
- }
+ }
TDispatchOptions options;
runtime.DispatchEvents(options, TDuration::MilliSeconds(100));
- }
- }
-}
-
-inline void CheckRemoveTenant(TTenantTestRuntime &runtime,
- const TString &path,
- Ydb::StatusIds::StatusCode code)
-{
- CheckRemoveTenant(runtime, path, "", code);
-}
-
+ }
+ }
+}
+
+inline void CheckRemoveTenant(TTenantTestRuntime &runtime,
+ const TString &path,
+ Ydb::StatusIds::StatusCode code)
+{
+ CheckRemoveTenant(runtime, path, "", code);
+}
+
inline void WaitTenantStatus(TTenantTestRuntime &runtime,
const TString &path,
TVector<Ydb::Cms::GetDatabaseStatusResult::State> expected)
@@ -348,4 +348,4 @@ inline void WaitTenantRunning(TTenantTestRuntime &runtime, const TString &path)
WaitTenantStatus(runtime, path, { Ydb::Cms::GetDatabaseStatusResult::RUNNING });
}
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/testlib/tenant_runtime.cpp b/ydb/core/testlib/tenant_runtime.cpp
index 259f1c4791f..974cc166d0d 100644
--- a/ydb/core/testlib/tenant_runtime.cpp
+++ b/ydb/core/testlib/tenant_runtime.cpp
@@ -1,5 +1,5 @@
-#include "tenant_runtime.h"
-
+#include "tenant_runtime.h"
+
#include <ydb/core/node_whiteboard/node_whiteboard.h>
#include <ydb/core/blobstorage/base/blobstorage_events.h>
#include <ydb/core/cms/console/console.h>
@@ -23,410 +23,410 @@
#include <ydb/core/tx/tx_allocator/txallocator.h>
#include <ydb/core/tx/tx_proxy/proxy.h>
#include <ydb/core/sys_view/processor/processor.h>
-
+
#include <library/cpp/actors/core/interconnect.h>
#include <library/cpp/actors/interconnect/interconnect.h>
#include <library/cpp/testing/unittest/registar.h>
-
-#include <util/folder/dirut.h>
-
-namespace NKikimr {
-
-using namespace NTabletFlatExecutor;
+
+#include <util/folder/dirut.h>
+
+namespace NKikimr {
+
+using namespace NTabletFlatExecutor;
using namespace NSchemeShard;
-using namespace NConsole;
-using namespace NTenantSlotBroker;
-
-const ui64 SCHEME_SHARD1_ID = 0x0000000000840100;
-const ui64 SCHEME_SHARD2_ID = 0x0000000000840101;
-const ui64 HIVE_ID = 0x0000000000840102;
-
-const TString DOMAIN1_NAME = "dc-1";
-const TString TENANT1_1_NAME = "/dc-1/users/tenant-1";
-const TString TENANT1_2_NAME = "/dc-1/users/tenant-2";
-const TString TENANT1_3_NAME = "/dc-1/users/tenant-3";
-const TString TENANT1_4_NAME = "/dc-1/users/tenant-4";
-const TString TENANT1_5_NAME = "/dc-1/users/tenant-5";
-const TString TENANT2_1_NAME = "/dc-2/users/tenant-1";
-const TString TENANT2_2_NAME = "/dc-2/users/tenant-2";
-const TString TENANT2_3_NAME = "/dc-2/users/tenant-3";
-const TString TENANT2_4_NAME = "/dc-2/users/tenant-4";
-const TString TENANT2_5_NAME = "/dc-2/users/tenant-5";
-const TString TENANT1_U_NAME = "/dc-1/users/tenant-unknown";
-const TString TENANTU_1_NAME = "/dc-3/users/tenant-1";
-const TString DOMAIN1_SLOT1 = "dc-1/slot-1";
-const TString DOMAIN1_SLOT2 = "dc-1/slot-2";
-const TString DOMAIN1_SLOT3 = "dc-1/slot-3";
-const TString STATIC_SLOT = "static-slot";
-const TString SLOT1_TYPE = "small";
-const TString SLOT2_TYPE = "medium";
-const TString SLOT3_TYPE = "large";
-
-const TSubDomainKey DOMAIN1_KEY = {SCHEME_SHARD1_ID, 1};
-
-const TSubDomainKey TENANT1_1_KEY = {SCHEME_SHARD1_ID, 101};
-const TSubDomainKey TENANT1_2_KEY = {SCHEME_SHARD1_ID, 102};
-const TSubDomainKey TENANT1_3_KEY = {SCHEME_SHARD1_ID, 103};
-const TSubDomainKey TENANT1_4_KEY = {SCHEME_SHARD1_ID, 104};
-const TSubDomainKey TENANT1_5_KEY = {SCHEME_SHARD1_ID, 105};
-const TSubDomainKey TENANT2_1_KEY = {SCHEME_SHARD2_ID, 201};
-const TSubDomainKey TENANT2_2_KEY = {SCHEME_SHARD2_ID, 202};
-const TSubDomainKey TENANT2_3_KEY = {SCHEME_SHARD2_ID, 203};
-const TSubDomainKey TENANT2_4_KEY = {SCHEME_SHARD2_ID, 204};
-const TSubDomainKey TENANT2_5_KEY = {SCHEME_SHARD2_ID, 205};
-
-const TString ZONE1 = "zone1";
-const TString ZONE2 = "zone2";
-const TString ZONE3 = "zone3";
-const TString ZONE_ANY = "any";
-
-const TTenantTestConfig DefaultTenantTestConfig = {
- // Domains {name, schemeshard {{ subdomain_names }}}
+using namespace NConsole;
+using namespace NTenantSlotBroker;
+
+const ui64 SCHEME_SHARD1_ID = 0x0000000000840100;
+const ui64 SCHEME_SHARD2_ID = 0x0000000000840101;
+const ui64 HIVE_ID = 0x0000000000840102;
+
+const TString DOMAIN1_NAME = "dc-1";
+const TString TENANT1_1_NAME = "/dc-1/users/tenant-1";
+const TString TENANT1_2_NAME = "/dc-1/users/tenant-2";
+const TString TENANT1_3_NAME = "/dc-1/users/tenant-3";
+const TString TENANT1_4_NAME = "/dc-1/users/tenant-4";
+const TString TENANT1_5_NAME = "/dc-1/users/tenant-5";
+const TString TENANT2_1_NAME = "/dc-2/users/tenant-1";
+const TString TENANT2_2_NAME = "/dc-2/users/tenant-2";
+const TString TENANT2_3_NAME = "/dc-2/users/tenant-3";
+const TString TENANT2_4_NAME = "/dc-2/users/tenant-4";
+const TString TENANT2_5_NAME = "/dc-2/users/tenant-5";
+const TString TENANT1_U_NAME = "/dc-1/users/tenant-unknown";
+const TString TENANTU_1_NAME = "/dc-3/users/tenant-1";
+const TString DOMAIN1_SLOT1 = "dc-1/slot-1";
+const TString DOMAIN1_SLOT2 = "dc-1/slot-2";
+const TString DOMAIN1_SLOT3 = "dc-1/slot-3";
+const TString STATIC_SLOT = "static-slot";
+const TString SLOT1_TYPE = "small";
+const TString SLOT2_TYPE = "medium";
+const TString SLOT3_TYPE = "large";
+
+const TSubDomainKey DOMAIN1_KEY = {SCHEME_SHARD1_ID, 1};
+
+const TSubDomainKey TENANT1_1_KEY = {SCHEME_SHARD1_ID, 101};
+const TSubDomainKey TENANT1_2_KEY = {SCHEME_SHARD1_ID, 102};
+const TSubDomainKey TENANT1_3_KEY = {SCHEME_SHARD1_ID, 103};
+const TSubDomainKey TENANT1_4_KEY = {SCHEME_SHARD1_ID, 104};
+const TSubDomainKey TENANT1_5_KEY = {SCHEME_SHARD1_ID, 105};
+const TSubDomainKey TENANT2_1_KEY = {SCHEME_SHARD2_ID, 201};
+const TSubDomainKey TENANT2_2_KEY = {SCHEME_SHARD2_ID, 202};
+const TSubDomainKey TENANT2_3_KEY = {SCHEME_SHARD2_ID, 203};
+const TSubDomainKey TENANT2_4_KEY = {SCHEME_SHARD2_ID, 204};
+const TSubDomainKey TENANT2_5_KEY = {SCHEME_SHARD2_ID, 205};
+
+const TString ZONE1 = "zone1";
+const TString ZONE2 = "zone2";
+const TString ZONE3 = "zone3";
+const TString ZONE_ANY = "any";
+
+const TTenantTestConfig DefaultTenantTestConfig = {
+ // Domains {name, schemeshard {{ subdomain_names }}}
{{ {DOMAIN1_NAME, SCHEME_SHARD1_ID, {{ TENANT1_1_NAME, TENANT1_2_NAME }}} }},
- // HiveId
- HIVE_ID,
- // FakeTenantSlotBroker
- true,
- // FakeSchemeShard
- true,
- // CreateConsole
- false,
- // Nodes
- {{
- // Node0
- {
- // TenantPoolConfig
- {
- // Static slots {tenant, {cpu, memory, network}}
+ // HiveId
+ HIVE_ID,
+ // FakeTenantSlotBroker
+ true,
+ // FakeSchemeShard
+ true,
+ // CreateConsole
+ false,
+ // Nodes
+ {{
+ // Node0
+ {
+ // TenantPoolConfig
+ {
+ // Static slots {tenant, {cpu, memory, network}}
{{ {DOMAIN1_NAME, {1, 1, 1}} }},
- // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
- {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}},
- {DOMAIN1_SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
+ // Dynamic slots {id, type, domain, tenant, {cpu, memory, network}}
+ {{ {DOMAIN1_SLOT1, SLOT1_TYPE, DOMAIN1_NAME, "", {1, 1, 1}},
+ {DOMAIN1_SLOT2, SLOT2_TYPE, DOMAIN1_NAME, "", {2, 2, 2}},
{DOMAIN1_SLOT3, SLOT3_TYPE, DOMAIN1_NAME, "", {3, 3, 3}} }},
- "node-type"
- }
- }
- }},
- // DataCenterCount
- 1
-};
-
-namespace {
-
-class TFakeNodeWhiteboardService : public TActorBootstrapped<TFakeNodeWhiteboardService> {
-public:
- void Bootstrap(const TActorContext &ctx)
- {
- Y_UNUSED(ctx);
- Become(&TFakeNodeWhiteboardService::StateWork);
- }
-
- STFUNC(StateWork)
- {
- Y_UNUSED(ev);
- Y_UNUSED(ctx);
- }
-};
-
-class TFakeSchemeShard : public TActor<TFakeSchemeShard>, public TTabletExecutedFlat {
+ "node-type"
+ }
+ }
+ }},
+ // DataCenterCount
+ 1
+};
+
+namespace {
+
+class TFakeNodeWhiteboardService : public TActorBootstrapped<TFakeNodeWhiteboardService> {
+public:
+ void Bootstrap(const TActorContext &ctx)
+ {
+ Y_UNUSED(ctx);
+ Become(&TFakeNodeWhiteboardService::StateWork);
+ }
+
+ STFUNC(StateWork)
+ {
+ Y_UNUSED(ev);
+ Y_UNUSED(ctx);
+ }
+};
+
+class TFakeSchemeShard : public TActor<TFakeSchemeShard>, public TTabletExecutedFlat {
void Handle(TEvSchemeShard::TEvDescribeScheme::TPtr &ev, const TActorContext &ctx)
- {
- if (HoldResolve) {
- Queue.push_back(ev.Release());
- ctx.Send(Sender, new TEvents::TEvWakeup());
- return;
- }
-
- auto &rec = ev->Get()->Record;
- TString path = rec.GetPath();
- if (!path)
- path = Paths[rec.GetPathId()];
-
+ {
+ if (HoldResolve) {
+ Queue.push_back(ev.Release());
+ ctx.Send(Sender, new TEvents::TEvWakeup());
+ return;
+ }
+
+ auto &rec = ev->Get()->Record;
+ TString path = rec.GetPath();
+ if (!path)
+ path = Paths[rec.GetPathId()];
+
auto *resp = new TEvSchemeShard::TEvDescribeSchemeResultBuilder;
- resp->Record.SetPath(path);
-
- auto it = SubDomains.find(path);
- if (it != SubDomains.end()) {
+ resp->Record.SetPath(path);
+
+ auto it = SubDomains.find(path);
+ if (it != SubDomains.end()) {
resp->Record.SetStatus(NKikimrScheme::StatusSuccess);
- auto &self = *resp->Record.MutablePathDescription()->MutableSelf();
- self.SetName(ev->Get()->Record.GetPath());
- self.SetPathId(it->second);
- self.SetSchemeshardId(TabletID());
+ auto &self = *resp->Record.MutablePathDescription()->MutableSelf();
+ self.SetName(ev->Get()->Record.GetPath());
+ self.SetPathId(it->second);
+ self.SetSchemeshardId(TabletID());
self.SetPathType(NKikimrSchemeOp::EPathTypeSubDomain);
- auto &domain = *resp->Record.MutablePathDescription()->MutableDomainDescription();
- domain.SetSchemeShardId_Depricated(TabletID());
- domain.SetPathId_Depricated(it->second);
- domain.MutableDomainKey()->SetSchemeShard(TabletID());
- domain.MutableDomainKey()->SetPathId(it->second);
- } else {
+ auto &domain = *resp->Record.MutablePathDescription()->MutableDomainDescription();
+ domain.SetSchemeShardId_Depricated(TabletID());
+ domain.SetPathId_Depricated(it->second);
+ domain.MutableDomainKey()->SetSchemeShard(TabletID());
+ domain.MutableDomainKey()->SetPathId(it->second);
+ } else {
resp->Record.SetStatus(NKikimrScheme::StatusPathDoesNotExist);
- }
- ctx.Send(ev->Sender, resp);
- }
-
- void Handle(TEvTest::TEvHoldResolve::TPtr &ev, const TActorContext &ctx)
- {
- if (ev->Get()->Hold) {
- HoldResolve = true;
- ctx.Send(Sender, new TEvents::TEvWakeup());
- } else {
- HoldResolve = false;
- for (auto &e : Queue)
- StateWork(e, ctx);
- Queue.clear();
- }
- }
-
- void OnActivateExecutor(const TActorContext &) override
- {
- Become(&TThis::StateWork);
- }
-
- void OnDetach(const TActorContext &ctx) override
- {
- Die(ctx);
- }
-
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override
- {
- Die(ctx);
- }
-
-public:
+ }
+ ctx.Send(ev->Sender, resp);
+ }
+
+ void Handle(TEvTest::TEvHoldResolve::TPtr &ev, const TActorContext &ctx)
+ {
+ if (ev->Get()->Hold) {
+ HoldResolve = true;
+ ctx.Send(Sender, new TEvents::TEvWakeup());
+ } else {
+ HoldResolve = false;
+ for (auto &e : Queue)
+ StateWork(e, ctx);
+ Queue.clear();
+ }
+ }
+
+ void OnActivateExecutor(const TActorContext &) override
+ {
+ Become(&TThis::StateWork);
+ }
+
+ void OnDetach(const TActorContext &ctx) override
+ {
+ Die(ctx);
+ }
+
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override
+ {
+ Die(ctx);
+ }
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::FLAT_SCHEMESHARD_ACTOR;
}
TFakeSchemeShard(const TActorId &tablet, TTabletStorageInfo *info,
TActorId sender, const TVector<std::pair<TString, ui64>> &subDomains)
- : TActor(&TThis::StateInit)
- , TTabletExecutedFlat(info, tablet, nullptr)
- , Sender(sender)
- , HoldResolve(false)
- {
- for (auto &subDomain : subDomains) {
- SubDomains.emplace(subDomain.first, subDomain.second);
- Paths.emplace(subDomain.second, subDomain.first);
- }
- }
-
- STFUNC(StateInit)
- {
- StateInitImpl(ev, ctx);
- }
-
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
+ : TActor(&TThis::StateInit)
+ , TTabletExecutedFlat(info, tablet, nullptr)
+ , Sender(sender)
+ , HoldResolve(false)
+ {
+ for (auto &subDomain : subDomains) {
+ SubDomains.emplace(subDomain.first, subDomain.second);
+ Paths.emplace(subDomain.second, subDomain.first);
+ }
+ }
+
+ STFUNC(StateInit)
+ {
+ StateInitImpl(ev, ctx);
+ }
+
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
HFunc(TEvSchemeShard::TEvDescribeScheme, Handle);
- HFunc(TEvTest::TEvHoldResolve, Handle);
- default:
- break;
- }
- }
-
- THashMap<TString, ui64> SubDomains;
- THashMap<ui64, TString> Paths;
+ HFunc(TEvTest::TEvHoldResolve, Handle);
+ default:
+ break;
+ }
+ }
+
+ THashMap<TString, ui64> SubDomains;
+ THashMap<ui64, TString> Paths;
TActorId Sender;
- TVector<TAutoPtr<IEventHandle>> Queue;
- bool HoldResolve;
-};
-
-class TFakeBSController : public TActor<TFakeBSController>, public TTabletExecutedFlat {
- void OnActivateExecutor(const TActorContext &) override
- {
- Become(&TThis::StateWork);
- }
-
- void OnDetach(const TActorContext &ctx) override
- {
- Die(ctx);
- }
-
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override
- {
- Die(ctx);
- }
-
-public:
+ TVector<TAutoPtr<IEventHandle>> Queue;
+ bool HoldResolve;
+};
+
+class TFakeBSController : public TActor<TFakeBSController>, public TTabletExecutedFlat {
+ void OnActivateExecutor(const TActorContext &) override
+ {
+ Become(&TThis::StateWork);
+ }
+
+ void OnDetach(const TActorContext &ctx) override
+ {
+ Die(ctx);
+ }
+
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override
+ {
+ Die(ctx);
+ }
+
+public:
TFakeBSController(const TActorId &tablet, TTabletStorageInfo *info)
- : TActor(&TThis::StateInit)
- , TTabletExecutedFlat(info, tablet, nullptr)
- {
- }
-
- STFUNC(StateInit)
- {
- StateInitImpl(ev, ctx);
- }
-
- STFUNC(StateWork)
- {
- Y_UNUSED(ev);
- Y_UNUSED(ctx);
- }
-};
-
-class TFakeTenantSlotBroker : public TActor<TFakeTenantSlotBroker>, public TTabletExecutedFlat {
- void OnActivateExecutor(const TActorContext &) override
- {
- Become(&TThis::StateWork);
- }
-
- void OnDetach(const TActorContext &ctx) override
- {
- Die(ctx);
- }
-
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override
- {
- Die(ctx);
- }
-
+ : TActor(&TThis::StateInit)
+ , TTabletExecutedFlat(info, tablet, nullptr)
+ {
+ }
+
+ STFUNC(StateInit)
+ {
+ StateInitImpl(ev, ctx);
+ }
+
+ STFUNC(StateWork)
+ {
+ Y_UNUSED(ev);
+ Y_UNUSED(ctx);
+ }
+};
+
+class TFakeTenantSlotBroker : public TActor<TFakeTenantSlotBroker>, public TTabletExecutedFlat {
+ void OnActivateExecutor(const TActorContext &) override
+ {
+ Become(&TThis::StateWork);
+ }
+
+ void OnDetach(const TActorContext &ctx) override
+ {
+ Die(ctx);
+ }
+
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override
+ {
+ Die(ctx);
+ }
+
void SendState(const TString &name, TActorId sender, const TActorContext &ctx)
- {
- auto *resp = new TEvTenantSlotBroker::TEvTenantState;
- resp->Record.SetTenantName(name);
+ {
+ auto *resp = new TEvTenantSlotBroker::TEvTenantState;
+ resp->Record.SetTenantName(name);
if (State.contains(name))
- resp->Record.MutableRequiredSlots()->CopyFrom(State.at(name).GetRequiredSlots());
- ctx.Send(sender, resp);
- }
-
- void Handle(TEvTenantSlotBroker::TEvAlterTenant::TPtr &ev, const TActorContext &ctx)
- {
- State[ev->Get()->Record.GetTenantName()] = ev->Get()->Record;
- SendState(ev->Get()->Record.GetTenantName(), ev->Sender, ctx);
- }
-
- void Handle(TEvTenantSlotBroker::TEvGetTenantState::TPtr &ev, const TActorContext &ctx)
- {
- SendState(ev->Get()->Record.GetTenantName(), ev->Sender, ctx);
- }
-
-public:
+ resp->Record.MutableRequiredSlots()->CopyFrom(State.at(name).GetRequiredSlots());
+ ctx.Send(sender, resp);
+ }
+
+ void Handle(TEvTenantSlotBroker::TEvAlterTenant::TPtr &ev, const TActorContext &ctx)
+ {
+ State[ev->Get()->Record.GetTenantName()] = ev->Get()->Record;
+ SendState(ev->Get()->Record.GetTenantName(), ev->Sender, ctx);
+ }
+
+ void Handle(TEvTenantSlotBroker::TEvGetTenantState::TPtr &ev, const TActorContext &ctx)
+ {
+ SendState(ev->Get()->Record.GetTenantName(), ev->Sender, ctx);
+ }
+
+public:
TFakeTenantSlotBroker(const TActorId &tablet, TTabletStorageInfo *info)
- : TActor(&TThis::StateInit)
- , TTabletExecutedFlat(info, tablet, nullptr)
- {
- }
-
- STFUNC(StateInit)
- {
- StateInitImpl(ev, ctx);
- }
-
- STFUNC(StateWork)
- {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvTenantSlotBroker::TEvAlterTenant, Handle);
- HFunc(TEvTenantSlotBroker::TEvGetTenantState, Handle);
- default:
- HandleDefaultEvents(ev, ctx);
- }
- }
-private:
- THashMap<TString, NKikimrTenantSlotBroker::TAlterTenant> State;
-};
-
-class TFakeHive : public TActor<TFakeHive>, public TTabletExecutedFlat {
- struct TClientInfo {
- TString Name;
- TSubDomainKey Key;
- TEvLocal::TEvStatus::EStatus Status = TEvLocal::TEvStatus::StatusDead;
- NKikimrTabletBase::TMetrics ResourceLimit;
-
- bool operator==(const TClientInfo &other) {
- return Name == other.Name
- && Status == other.Status
- && ResourceLimit.GetCPU() == other.ResourceLimit.GetCPU()
- && ResourceLimit.GetMemory() == other.ResourceLimit.GetMemory()
- && ResourceLimit.GetNetwork() == other.ResourceLimit.GetNetwork();
- }
-
- bool operator!=(const TClientInfo &other) {
- return !(*this == other);
- }
- };
-
- void ResolveKey(TSubDomainKey key, const TActorContext &ctx)
- {
+ : TActor(&TThis::StateInit)
+ , TTabletExecutedFlat(info, tablet, nullptr)
+ {
+ }
+
+ STFUNC(StateInit)
+ {
+ StateInitImpl(ev, ctx);
+ }
+
+ STFUNC(StateWork)
+ {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvTenantSlotBroker::TEvAlterTenant, Handle);
+ HFunc(TEvTenantSlotBroker::TEvGetTenantState, Handle);
+ default:
+ HandleDefaultEvents(ev, ctx);
+ }
+ }
+private:
+ THashMap<TString, NKikimrTenantSlotBroker::TAlterTenant> State;
+};
+
+class TFakeHive : public TActor<TFakeHive>, public TTabletExecutedFlat {
+ struct TClientInfo {
+ TString Name;
+ TSubDomainKey Key;
+ TEvLocal::TEvStatus::EStatus Status = TEvLocal::TEvStatus::StatusDead;
+ NKikimrTabletBase::TMetrics ResourceLimit;
+
+ bool operator==(const TClientInfo &other) {
+ return Name == other.Name
+ && Status == other.Status
+ && ResourceLimit.GetCPU() == other.ResourceLimit.GetCPU()
+ && ResourceLimit.GetMemory() == other.ResourceLimit.GetMemory()
+ && ResourceLimit.GetNetwork() == other.ResourceLimit.GetNetwork();
+ }
+
+ bool operator!=(const TClientInfo &other) {
+ return !(*this == other);
+ }
+ };
+
+ void ResolveKey(TSubDomainKey key, const TActorContext &ctx)
+ {
TActorId clientId = ctx.Register(NKikimr::NTabletPipe::CreateClient(ctx.SelfID, key.GetSchemeShard()));
auto *request = new TEvSchemeShard::TEvDescribeScheme(key.GetSchemeShard(), key.GetPathId());
- NTabletPipe::SendData(ctx, clientId, request);
- ctx.Send(clientId, new NKikimr::TEvTabletPipe::TEvShutdown);
- }
-
- void Handle(TEvents::TEvUndelivered::TPtr &ev, const TActorContext &ctx)
- {
- Clients.erase(ev->Sender);
- CheckState(ctx);
- }
-
+ NTabletPipe::SendData(ctx, clientId, request);
+ ctx.Send(clientId, new NKikimr::TEvTabletPipe::TEvShutdown);
+ }
+
+ void Handle(TEvents::TEvUndelivered::TPtr &ev, const TActorContext &ctx)
+ {
+ Clients.erase(ev->Sender);
+ CheckState(ctx);
+ }
+
void Handle(TEvSchemeShard::TEvDescribeSchemeResult::TPtr &ev, const TActorContext &ctx)
- {
+ {
const auto &rec = ev->Get()->GetRecord();
UNIT_ASSERT_VALUES_EQUAL(rec.GetStatus(), NKikimrScheme::StatusSuccess);
- auto &path = rec.GetPath();
- auto shardId = rec.GetPathDescription().GetSelf().GetSchemeshardId();
- auto pathId = rec.GetPathDescription().GetSelf().GetPathId();
- SubDomainKeys[TSubDomainKey(shardId, pathId)] = path;
- CheckState(ctx);
- }
-
+ auto &path = rec.GetPath();
+ auto shardId = rec.GetPathDescription().GetSelf().GetSchemeshardId();
+ auto pathId = rec.GetPathDescription().GetSelf().GetPathId();
+ SubDomainKeys[TSubDomainKey(shardId, pathId)] = path;
+ CheckState(ctx);
+ }
+
TActorId Boot(const TActorContext& ctx, TTabletTypes::EType tabletType, std::function<IActor* (const TActorId &, TTabletStorageInfo *)> op,
- TBlobStorageGroupType::EErasureSpecies erasure)
- {
- TIntrusivePtr<TBootstrapperInfo> bi(new TBootstrapperInfo(new TTabletSetupInfo(op, TMailboxType::Simple, 0,
- TMailboxType::Simple, 0)));
+ TBlobStorageGroupType::EErasureSpecies erasure)
+ {
+ TIntrusivePtr<TBootstrapperInfo> bi(new TBootstrapperInfo(new TTabletSetupInfo(op, TMailboxType::Simple, 0,
+ TMailboxType::Simple, 0)));
return ctx.ExecutorThread.RegisterActor(CreateBootstrapper(CreateTestTabletInfo(State.NextTabletId, tabletType, erasure), bi.Get()));
- }
-
+ }
+
void SendDeletionNotification(ui64 tabletId, TActorId waiter, const TActorContext& ctx)
- {
- TAutoPtr<TEvHive::TEvResponseHiveInfo> response = new TEvHive::TEvResponseHiveInfo();
- FillTabletInfo(response->Record, tabletId, nullptr);
- ctx.Send(waiter, response.Release());
- }
-
- void FillTabletInfo(NKikimrHive::TEvResponseHiveInfo& response, ui64 tabletId, const TFakeHiveTabletInfo *info)
- {
- auto& tabletInfo = *response.AddTablets();
- tabletInfo.SetTabletID(tabletId);
- if (info) {
- tabletInfo.SetTabletType(info->Type);
- tabletInfo.SetState(200);
- }
- }
-
- bool MaybeCreateTablet(TEvHive::TEvCreateTablet::TPtr &ev, const TActorContext &ctx)
- {
- NKikimrProto::EReplyStatus status = NKikimrProto::OK;
- const std::pair<ui64, ui64> key(ev->Get()->Record.GetOwner(), ev->Get()->Record.GetOwnerIdx());
- const auto type = ev->Get()->Record.GetTabletType();
- const auto bootMode = ev->Get()->Record.GetTabletBootMode();
- auto it = State.Tablets.find(key);
- const auto& defaultTabletTypes = AppData(ctx)->DefaultTabletTypes;
+ {
+ TAutoPtr<TEvHive::TEvResponseHiveInfo> response = new TEvHive::TEvResponseHiveInfo();
+ FillTabletInfo(response->Record, tabletId, nullptr);
+ ctx.Send(waiter, response.Release());
+ }
+
+ void FillTabletInfo(NKikimrHive::TEvResponseHiveInfo& response, ui64 tabletId, const TFakeHiveTabletInfo *info)
+ {
+ auto& tabletInfo = *response.AddTablets();
+ tabletInfo.SetTabletID(tabletId);
+ if (info) {
+ tabletInfo.SetTabletType(info->Type);
+ tabletInfo.SetState(200);
+ }
+ }
+
+ bool MaybeCreateTablet(TEvHive::TEvCreateTablet::TPtr &ev, const TActorContext &ctx)
+ {
+ NKikimrProto::EReplyStatus status = NKikimrProto::OK;
+ const std::pair<ui64, ui64> key(ev->Get()->Record.GetOwner(), ev->Get()->Record.GetOwnerIdx());
+ const auto type = ev->Get()->Record.GetTabletType();
+ const auto bootMode = ev->Get()->Record.GetTabletBootMode();
+ auto it = State.Tablets.find(key);
+ const auto& defaultTabletTypes = AppData(ctx)->DefaultTabletTypes;
TActorId bootstrapperActorId;
- if (it == State.Tablets.end()) {
- if (ev->Get()->Record.AllowedDomainsSize()) {
- bool found = false;
- for (auto &key : ev->Get()->Record.GetAllowedDomains()) {
- for (auto &pr : Clients) {
- if (pr.second.Key == TSubDomainKey(key)) {
- found = true;
- break;
- }
- }
- }
- if (!found)
- return false;
- }
-
- if (bootMode == NKikimrHive::TABLET_BOOT_MODE_EXTERNAL) {
- } else if (type == defaultTabletTypes.Coordinator) {
- bootstrapperActorId = Boot(ctx, type, &CreateFlatTxCoordinator, DataGroupErasure);
- } else if (type == defaultTabletTypes.Mediator) {
- bootstrapperActorId = Boot(ctx, type, &CreateTxMediator, DataGroupErasure);
+ if (it == State.Tablets.end()) {
+ if (ev->Get()->Record.AllowedDomainsSize()) {
+ bool found = false;
+ for (auto &key : ev->Get()->Record.GetAllowedDomains()) {
+ for (auto &pr : Clients) {
+ if (pr.second.Key == TSubDomainKey(key)) {
+ found = true;
+ break;
+ }
+ }
+ }
+ if (!found)
+ return false;
+ }
+
+ if (bootMode == NKikimrHive::TABLET_BOOT_MODE_EXTERNAL) {
+ } else if (type == defaultTabletTypes.Coordinator) {
+ bootstrapperActorId = Boot(ctx, type, &CreateFlatTxCoordinator, DataGroupErasure);
+ } else if (type == defaultTabletTypes.Mediator) {
+ bootstrapperActorId = Boot(ctx, type, &CreateTxMediator, DataGroupErasure);
} else if (type == defaultTabletTypes.SchemeShard) {
bootstrapperActorId = Boot(ctx, type, &CreateFlatTxSchemeShard, DataGroupErasure);
} else if (type == defaultTabletTypes.Hive) {
@@ -437,58 +437,58 @@ class TFakeHive : public TActor<TFakeHive>, public TTabletExecutedFlat {
bootstrapperActorId = Boot(ctx, type, &NSequenceShard::CreateSequenceShard, DataGroupErasure);
} else if (type == defaultTabletTypes.ReplicationController) {
bootstrapperActorId = Boot(ctx, type, &NReplication::CreateController, DataGroupErasure);
- } else {
- status = NKikimrProto::ERROR;
- }
-
- if (status == NKikimrProto::OK) {
- ui64 tabletId = State.NextTabletId;
- it = State.Tablets.insert(std::make_pair(key, TFakeHiveTabletInfo(type, tabletId, bootstrapperActorId))).first;
- State.TabletIdToOwner[tabletId] = key;
- ++State.NextTabletId;
- }
- } else {
- if (it->second.Type != type) {
- status = NKikimrProto::ERROR;
- }
- }
-
- auto response = new TEvHive::TEvCreateTabletReply(status, key.first,
- key.second, it->second.TabletId,
- TabletID());
- ctx.Send(ev->Sender, response, 0, ev->Cookie);
- return true;
- }
-
- void Handle(TEvHive::TEvCreateTablet::TPtr &ev, const TActorContext &ctx)
- {
- if (!MaybeCreateTablet(ev, ctx)) {
- PostponedTablets.push_back(std::move(ev));
- }
- }
-
- void Handle(TEvHive::TEvDeleteTablet::TPtr &ev, const TActorContext &ctx) {
- NKikimrHive::TEvDeleteTablet& rec = ev->Get()->Record;
+ } else {
+ status = NKikimrProto::ERROR;
+ }
+
+ if (status == NKikimrProto::OK) {
+ ui64 tabletId = State.NextTabletId;
+ it = State.Tablets.insert(std::make_pair(key, TFakeHiveTabletInfo(type, tabletId, bootstrapperActorId))).first;
+ State.TabletIdToOwner[tabletId] = key;
+ ++State.NextTabletId;
+ }
+ } else {
+ if (it->second.Type != type) {
+ status = NKikimrProto::ERROR;
+ }
+ }
+
+ auto response = new TEvHive::TEvCreateTabletReply(status, key.first,
+ key.second, it->second.TabletId,
+ TabletID());
+ ctx.Send(ev->Sender, response, 0, ev->Cookie);
+ return true;
+ }
+
+ void Handle(TEvHive::TEvCreateTablet::TPtr &ev, const TActorContext &ctx)
+ {
+ if (!MaybeCreateTablet(ev, ctx)) {
+ PostponedTablets.push_back(std::move(ev));
+ }
+ }
+
+ void Handle(TEvHive::TEvDeleteTablet::TPtr &ev, const TActorContext &ctx) {
+ NKikimrHive::TEvDeleteTablet& rec = ev->Get()->Record;
TVector<ui64> localIds;
for (size_t i = 0; i < rec.ShardLocalIdxSize(); ++i) {
localIds.push_back(rec.GetShardLocalIdx(i));
auto it = State.Tablets.find(std::make_pair<ui64, ui64>(rec.GetShardOwnerId(), rec.GetShardLocalIdx(i)));
- if (it != State.Tablets.end()) {
- ctx.Send(ctx.SelfID, new TEvFakeHive::TEvNotifyTabletDeleted(it->second.TabletId));
-
+ if (it != State.Tablets.end()) {
+ ctx.Send(ctx.SelfID, new TEvFakeHive::TEvNotifyTabletDeleted(it->second.TabletId));
+
TActorId bootstrapperActorId = it->second.BootstrapperActorId;
- ctx.Send(bootstrapperActorId, new TEvBootstrapper::TEvStandBy());
-
+ ctx.Send(bootstrapperActorId, new TEvBootstrapper::TEvStandBy());
+
for (TActorId waiter : it->second.DeletionWaiters) {
- SendDeletionNotification(it->second.TabletId, waiter, ctx);
- }
- State.TabletIdToOwner.erase(it->second.TabletId);
- State.Tablets.erase(it);
- }
- }
+ SendDeletionNotification(it->second.TabletId, waiter, ctx);
+ }
+ State.TabletIdToOwner.erase(it->second.TabletId);
+ State.Tablets.erase(it);
+ }
+ }
ctx.Send(ev->Sender, new TEvHive::TEvDeleteTabletReply(NKikimrProto::OK, TabletID(), rec.GetTxId_Deprecated(), rec.GetShardOwnerId(), localIds));
- }
-
+ }
+
void Handle(TEvHive::TEvDeleteOwnerTablets::TPtr &ev, const TActorContext &ctx) {
NKikimrHive::TEvDeleteOwnerTablets& rec = ev->Get()->Record;
TVector<ui64> toDelete;
@@ -518,272 +518,272 @@ class TFakeHive : public TActor<TFakeHive>, public TTabletExecutedFlat {
ctx.Send(ev->Sender, new TEvHive::TEvDeleteOwnerTabletsReply(NKikimrProto::OK, TabletID(), rec.GetOwner(), rec.GetTxId()));
}
- void Handle(TEvLocal::TEvRegisterNode::TPtr &ev, const TActorContext &ctx)
- {
- auto &record = ev->Get()->Record;
- UNIT_ASSERT_VALUES_EQUAL(record.ServicedDomainsSize(), 1);
-
- TClientInfo info;
- info.Key = TSubDomainKey(record.GetServicedDomains(0));
- Clients.emplace(ev->Sender, info);
-
- auto *ping = new TEvLocal::TEvPing;
- ping->Record.SetHiveId(HiveId);
- ping->Record.SetHiveGeneration(1);
- ctx.Send(ev->Sender, ping, IEventHandle::FlagTrackDelivery);
-
+ void Handle(TEvLocal::TEvRegisterNode::TPtr &ev, const TActorContext &ctx)
+ {
+ auto &record = ev->Get()->Record;
+ UNIT_ASSERT_VALUES_EQUAL(record.ServicedDomainsSize(), 1);
+
+ TClientInfo info;
+ info.Key = TSubDomainKey(record.GetServicedDomains(0));
+ Clients.emplace(ev->Sender, info);
+
+ auto *ping = new TEvLocal::TEvPing;
+ ping->Record.SetHiveId(HiveId);
+ ping->Record.SetHiveGeneration(1);
+ ctx.Send(ev->Sender, ping, IEventHandle::FlagTrackDelivery);
+
if (!SubDomainKeys.contains(info.Key))
- ResolveKey(info.Key, ctx);
- }
-
- void Handle(TEvLocal::TEvStatus::TPtr &ev, const TActorContext &ctx)
- {
- auto &record = ev->Get()->Record;
-
+ ResolveKey(info.Key, ctx);
+ }
+
+ void Handle(TEvLocal::TEvStatus::TPtr &ev, const TActorContext &ctx)
+ {
+ auto &record = ev->Get()->Record;
+
UNIT_ASSERT(Clients.contains(ev->Sender));
- if (record.GetStatus() == TEvLocal::TEvStatus::StatusDead) {
- Clients.erase(ev->Sender);
- } else {
- auto &client = Clients[ev->Sender];
- client.Status = static_cast<TEvLocal::TEvStatus::EStatus>(record.GetStatus());
- client.ResourceLimit = record.GetResourceMaximum();
-
- for (auto it = PostponedTablets.begin(); it != PostponedTablets.end(); ) {
- if (MaybeCreateTablet(*it, ctx)) {
- it = PostponedTablets.erase(it);
- } else {
- ++it;
- }
- }
- }
- CheckState(ctx);
- }
-
- void Handle(TEvTest::TEvWaitHiveState::TPtr &ev, const TActorContext &ctx)
- {
- UNIT_ASSERT(!WaitForState);
- for (auto &state : ev->Get()->States) {
- if (state.ResourceLimit.GetCPU()
- || state.ResourceLimit.GetMemory()
- || state.ResourceLimit.GetNetwork()) {
- TClientInfo info;
- info.Name = state.TenantName;
- info.Status = TEvLocal::TEvStatus::StatusOk;
- info.ResourceLimit = state.ResourceLimit;
- ExpectedState.emplace(std::make_pair(info.Name, info));
- }
- }
- WaitForState = true;
- CheckState(ctx);
- }
-
- void CheckState(const TActorContext &ctx)
- {
- if (!WaitForState)
- return;
-
- ui64 missing = 0;
- THashMap<TString, TClientInfo> tenants;
- for (auto &pr : Clients) {
+ if (record.GetStatus() == TEvLocal::TEvStatus::StatusDead) {
+ Clients.erase(ev->Sender);
+ } else {
+ auto &client = Clients[ev->Sender];
+ client.Status = static_cast<TEvLocal::TEvStatus::EStatus>(record.GetStatus());
+ client.ResourceLimit = record.GetResourceMaximum();
+
+ for (auto it = PostponedTablets.begin(); it != PostponedTablets.end(); ) {
+ if (MaybeCreateTablet(*it, ctx)) {
+ it = PostponedTablets.erase(it);
+ } else {
+ ++it;
+ }
+ }
+ }
+ CheckState(ctx);
+ }
+
+ void Handle(TEvTest::TEvWaitHiveState::TPtr &ev, const TActorContext &ctx)
+ {
+ UNIT_ASSERT(!WaitForState);
+ for (auto &state : ev->Get()->States) {
+ if (state.ResourceLimit.GetCPU()
+ || state.ResourceLimit.GetMemory()
+ || state.ResourceLimit.GetNetwork()) {
+ TClientInfo info;
+ info.Name = state.TenantName;
+ info.Status = TEvLocal::TEvStatus::StatusOk;
+ info.ResourceLimit = state.ResourceLimit;
+ ExpectedState.emplace(std::make_pair(info.Name, info));
+ }
+ }
+ WaitForState = true;
+ CheckState(ctx);
+ }
+
+ void CheckState(const TActorContext &ctx)
+ {
+ if (!WaitForState)
+ return;
+
+ ui64 missing = 0;
+ THashMap<TString, TClientInfo> tenants;
+ for (auto &pr : Clients) {
if (!SubDomainKeys.contains(pr.second.Key)) {
- return;
- }
- auto name = SubDomainKeys.at(pr.second.Key);
+ return;
+ }
+ auto name = SubDomainKeys.at(pr.second.Key);
if (tenants.contains(name)) {
- auto &tenant = tenants[name];
- if (pr.second.Status != TEvLocal::TEvStatus::StatusOk)
- tenant.Status = pr.second.Status;
- tenant.ResourceLimit.SetCPU(tenant.ResourceLimit.GetCPU() + pr.second.ResourceLimit.GetCPU());
- tenant.ResourceLimit.SetMemory(tenant.ResourceLimit.GetMemory() + pr.second.ResourceLimit.GetMemory());
- tenant.ResourceLimit.SetNetwork(tenant.ResourceLimit.GetNetwork() + pr.second.ResourceLimit.GetNetwork());
- } else {
- tenants[name] = pr.second;
- tenants[name].Name = name;
- }
- }
- for (auto &pr : tenants) {
- if (pr.second.Status != TEvLocal::TEvStatus::StatusOk) {
- ++missing;
+ auto &tenant = tenants[name];
+ if (pr.second.Status != TEvLocal::TEvStatus::StatusOk)
+ tenant.Status = pr.second.Status;
+ tenant.ResourceLimit.SetCPU(tenant.ResourceLimit.GetCPU() + pr.second.ResourceLimit.GetCPU());
+ tenant.ResourceLimit.SetMemory(tenant.ResourceLimit.GetMemory() + pr.second.ResourceLimit.GetMemory());
+ tenant.ResourceLimit.SetNetwork(tenant.ResourceLimit.GetNetwork() + pr.second.ResourceLimit.GetNetwork());
+ } else {
+ tenants[name] = pr.second;
+ tenants[name].Name = name;
+ }
+ }
+ for (auto &pr : tenants) {
+ if (pr.second.Status != TEvLocal::TEvStatus::StatusOk) {
+ ++missing;
} else if (!ExpectedState.contains(pr.first)) {
- return;
- } else if (ExpectedState[pr.first] != pr.second) {
- return;
- }
- }
-
- if (ExpectedState.size() + missing != tenants.size()) {
- return;
- }
-
- WaitForState = false;
- ExpectedState.clear();
- ctx.Send(Sender, new TEvTest::TEvHiveStateHit);
- }
-
- void OnActivateExecutor(const TActorContext &) override
- {
- Become(&TThis::StateWork);
- }
-
- void OnDetach(const TActorContext &ctx) override
- {
- Die(ctx);
- }
-
- void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override
- {
- Die(ctx);
- }
-
-public:
+ return;
+ } else if (ExpectedState[pr.first] != pr.second) {
+ return;
+ }
+ }
+
+ if (ExpectedState.size() + missing != tenants.size()) {
+ return;
+ }
+
+ WaitForState = false;
+ ExpectedState.clear();
+ ctx.Send(Sender, new TEvTest::TEvHiveStateHit);
+ }
+
+ void OnActivateExecutor(const TActorContext &) override
+ {
+ Become(&TThis::StateWork);
+ }
+
+ void OnDetach(const TActorContext &ctx) override
+ {
+ Die(ctx);
+ }
+
+ void OnTabletDead(TEvTablet::TEvTabletDead::TPtr &, const TActorContext &ctx) override
+ {
+ Die(ctx);
+ }
+
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::HIVE_ACTOR;
}
TFakeHive(const TActorId &tablet, TTabletStorageInfo *info, TActorId sender,
- ui64 hiveId, const THashMap<TSubDomainKey, TString> &subDomainKeys)
- : TActor(&TThis::StateInit)
- , TTabletExecutedFlat(info, tablet, nullptr)
- , Sender(sender)
- , WaitForState(false)
- , HiveId(hiveId)
- , SubDomainKeys(subDomainKeys)
- {
- }
-
- STFUNC(StateInit)
- {
- StateInitImpl(ev, ctx);
- }
-
- STFUNC(StateWork)
- {
- TRACE_EVENT(NKikimrServices::HIVE);
- switch (ev->GetTypeRewrite()) {
- HFuncTraced(TEvents::TEvUndelivered, Handle);
+ ui64 hiveId, const THashMap<TSubDomainKey, TString> &subDomainKeys)
+ : TActor(&TThis::StateInit)
+ , TTabletExecutedFlat(info, tablet, nullptr)
+ , Sender(sender)
+ , WaitForState(false)
+ , HiveId(hiveId)
+ , SubDomainKeys(subDomainKeys)
+ {
+ }
+
+ STFUNC(StateInit)
+ {
+ StateInitImpl(ev, ctx);
+ }
+
+ STFUNC(StateWork)
+ {
+ TRACE_EVENT(NKikimrServices::HIVE);
+ switch (ev->GetTypeRewrite()) {
+ HFuncTraced(TEvents::TEvUndelivered, Handle);
HFuncTraced(TEvSchemeShard::TEvDescribeSchemeResult, Handle);
- HFuncTraced(TEvHive::TEvCreateTablet, Handle);
- HFuncTraced(TEvHive::TEvDeleteTablet, Handle);
+ HFuncTraced(TEvHive::TEvCreateTablet, Handle);
+ HFuncTraced(TEvHive::TEvDeleteTablet, Handle);
HFuncTraced(TEvHive::TEvDeleteOwnerTablets, Handle);
- HFuncTraced(TEvLocal::TEvRegisterNode, Handle);
- HFuncTraced(TEvLocal::TEvStatus, Handle);
- HFuncTraced(TEvTest::TEvWaitHiveState, Handle);
- IgnoreFunc(TEvTabletPipe::TEvServerConnected);
- IgnoreFunc(TEvTabletPipe::TEvServerDisconnected);
- IgnoreFunc(TEvLocal::TEvSyncTablets);
-
- default:
- if (!HandleDefaultEvents(ev, ctx)) {
- //Y_FAIL("TFakeHive::StateWork unexpected event type: %" PRIx32 " event: %s",
- // ev->GetTypeRewrite(), ev->HasEvent() ? ~ev->GetBase()->ToString() : "serialized?");
- }
- }
- }
-
+ HFuncTraced(TEvLocal::TEvRegisterNode, Handle);
+ HFuncTraced(TEvLocal::TEvStatus, Handle);
+ HFuncTraced(TEvTest::TEvWaitHiveState, Handle);
+ IgnoreFunc(TEvTabletPipe::TEvServerConnected);
+ IgnoreFunc(TEvTabletPipe::TEvServerDisconnected);
+ IgnoreFunc(TEvLocal::TEvSyncTablets);
+
+ default:
+ if (!HandleDefaultEvents(ev, ctx)) {
+ //Y_FAIL("TFakeHive::StateWork unexpected event type: %" PRIx32 " event: %s",
+ // ev->GetTypeRewrite(), ev->HasEvent() ? ~ev->GetBase()->ToString() : "serialized?");
+ }
+ }
+ }
+
THashMap<TActorId, TClientInfo> Clients;
TActorId Sender;
- THashMap<TString, TClientInfo> ExpectedState;
- bool WaitForState;
- ui64 HiveId;
- THashMap<TSubDomainKey, TString> SubDomainKeys;
- TFakeHiveState State;
- TList<TEvHive::TEvCreateTablet::TPtr> PostponedTablets;
-};
-
-} // anonymous namespace
-
-bool IsTabletActiveEvent(IEventHandle& ev)
-{
- if (ev.GetTypeRewrite() == NNodeWhiteboard::TEvWhiteboard::EvTabletStateUpdate) {
- if (ev.Get<NNodeWhiteboard::TEvWhiteboard::TEvTabletStateUpdate>()->Record.GetState()
- == NKikimrWhiteboard::TTabletStateInfo::Active) {
- return true;
- }
- }
- return false;
-}
-
-struct TWaitTenantSlotBrokerInitialization {
- TWaitTenantSlotBrokerInitialization(ui32 poolCount)
- : PoolCount(poolCount)
- , NodeInfoCount(0)
- {
- Y_VERIFY(PoolCount);
- }
-
- bool operator()(IEventHandle &ev) {
- if (ev.GetTypeRewrite() == TEvTenantPool::EvTenantPoolStatus) {
- if (PoolCount) {
- --PoolCount;
- ++NodeInfoCount;
- }
- } else if (ev.GetTypeRewrite() == TEvInterconnect::EvNodeInfo) {
- if (NodeInfoCount) {
- --NodeInfoCount;
- if (!PoolCount && !NodeInfoCount)
- return true;
- }
- }
-
- return false;
- }
-
- ui32 PoolCount;
- ui32 NodeInfoCount;
-};
-
-void TTenantTestRuntime::CreateTenantPool(ui32 nodeIndex, const TTenantTestConfig::TTenantPoolConfig &config)
-{
- NKikimrTabletBase::TMetrics limit;
- TLocalConfig::TPtr localConfig = new TLocalConfig;
- localConfig->TabletClassInfo[TTabletTypes::Dummy].SetupInfo
+ THashMap<TString, TClientInfo> ExpectedState;
+ bool WaitForState;
+ ui64 HiveId;
+ THashMap<TSubDomainKey, TString> SubDomainKeys;
+ TFakeHiveState State;
+ TList<TEvHive::TEvCreateTablet::TPtr> PostponedTablets;
+};
+
+} // anonymous namespace
+
+bool IsTabletActiveEvent(IEventHandle& ev)
+{
+ if (ev.GetTypeRewrite() == NNodeWhiteboard::TEvWhiteboard::EvTabletStateUpdate) {
+ if (ev.Get<NNodeWhiteboard::TEvWhiteboard::TEvTabletStateUpdate>()->Record.GetState()
+ == NKikimrWhiteboard::TTabletStateInfo::Active) {
+ return true;
+ }
+ }
+ return false;
+}
+
+struct TWaitTenantSlotBrokerInitialization {
+ TWaitTenantSlotBrokerInitialization(ui32 poolCount)
+ : PoolCount(poolCount)
+ , NodeInfoCount(0)
+ {
+ Y_VERIFY(PoolCount);
+ }
+
+ bool operator()(IEventHandle &ev) {
+ if (ev.GetTypeRewrite() == TEvTenantPool::EvTenantPoolStatus) {
+ if (PoolCount) {
+ --PoolCount;
+ ++NodeInfoCount;
+ }
+ } else if (ev.GetTypeRewrite() == TEvInterconnect::EvNodeInfo) {
+ if (NodeInfoCount) {
+ --NodeInfoCount;
+ if (!PoolCount && !NodeInfoCount)
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ ui32 PoolCount;
+ ui32 NodeInfoCount;
+};
+
+void TTenantTestRuntime::CreateTenantPool(ui32 nodeIndex, const TTenantTestConfig::TTenantPoolConfig &config)
+{
+ NKikimrTabletBase::TMetrics limit;
+ TLocalConfig::TPtr localConfig = new TLocalConfig;
+ localConfig->TabletClassInfo[TTabletTypes::Dummy].SetupInfo
= new TTabletSetupInfo(&CreateFlatDummyTablet,
- TMailboxType::Simple, 0,
- TMailboxType::Simple, 0);
-
- TTenantPoolConfig::TPtr tenantPoolConfig = new TTenantPoolConfig(localConfig);
- for (auto &slot : config.StaticSlots) {
- NKikimrTenantPool::TSlotConfig slotConfig;
- slotConfig.SetId(STATIC_SLOT);
- slotConfig.SetTenantName(slot.Tenant);
- slotConfig.MutableResourceLimit()->SetCPU(slot.Limit.CPU);
- slotConfig.MutableResourceLimit()->SetMemory(slot.Limit.Memory);
- slotConfig.MutableResourceLimit()->SetNetwork(slot.Limit.Network);
- tenantPoolConfig->AddStaticSlot(slotConfig);
- }
- for (auto &slot : config.DynamicSlots) {
- limit.SetCPU(slot.Limit.CPU);
- limit.SetMemory(slot.Limit.Memory);
- limit.SetNetwork(slot.Limit.Network);
- tenantPoolConfig->AddDynamicSlot(slot.Id, slot.Type, slot.Domain, slot.Tenant, limit);
- }
- tenantPoolConfig->NodeType = config.NodeType;
- tenantPoolConfig->StaticSlotLabel = Extension.GetMonitoringConfig().GetDatabaseLabels()
- .GetStaticSlotLabelValue();
- tenantPoolConfig->DynamicSlotLabel = Extension.GetMonitoringConfig().GetDatabaseLabels()
- .GetDynamicSlotLabelValue();
-
+ TMailboxType::Simple, 0,
+ TMailboxType::Simple, 0);
+
+ TTenantPoolConfig::TPtr tenantPoolConfig = new TTenantPoolConfig(localConfig);
+ for (auto &slot : config.StaticSlots) {
+ NKikimrTenantPool::TSlotConfig slotConfig;
+ slotConfig.SetId(STATIC_SLOT);
+ slotConfig.SetTenantName(slot.Tenant);
+ slotConfig.MutableResourceLimit()->SetCPU(slot.Limit.CPU);
+ slotConfig.MutableResourceLimit()->SetMemory(slot.Limit.Memory);
+ slotConfig.MutableResourceLimit()->SetNetwork(slot.Limit.Network);
+ tenantPoolConfig->AddStaticSlot(slotConfig);
+ }
+ for (auto &slot : config.DynamicSlots) {
+ limit.SetCPU(slot.Limit.CPU);
+ limit.SetMemory(slot.Limit.Memory);
+ limit.SetNetwork(slot.Limit.Network);
+ tenantPoolConfig->AddDynamicSlot(slot.Id, slot.Type, slot.Domain, slot.Tenant, limit);
+ }
+ tenantPoolConfig->NodeType = config.NodeType;
+ tenantPoolConfig->StaticSlotLabel = Extension.GetMonitoringConfig().GetDatabaseLabels()
+ .GetStaticSlotLabelValue();
+ tenantPoolConfig->DynamicSlotLabel = Extension.GetMonitoringConfig().GetDatabaseLabels()
+ .GetDynamicSlotLabelValue();
+
TActorId actorId = Register(NKikimr::CreateTenantPool(tenantPoolConfig), nodeIndex, 0, TMailboxType::Revolving, 0);
- EnableScheduleForActor(actorId, true);
- RegisterService(MakeTenantPoolRootID(), actorId, nodeIndex);
-}
-
-void TTenantTestRuntime::CreateTenantPool(ui32 nodeIndex)
-{
- CreateTenantPool(nodeIndex, Config.Nodes[nodeIndex].TenantPoolConfig);
-}
-
+ EnableScheduleForActor(actorId, true);
+ RegisterService(MakeTenantPoolRootID(), actorId, nodeIndex);
+}
+
+void TTenantTestRuntime::CreateTenantPool(ui32 nodeIndex)
+{
+ CreateTenantPool(nodeIndex, Config.Nodes[nodeIndex].TenantPoolConfig);
+}
+
void TTenantTestRuntime::Setup(bool createTenantPools)
-{
- if (ENABLE_DETAILED_LOG) {
- SetLogPriority(NKikimrServices::LOCAL, NLog::PRI_DEBUG);
- SetLogPriority(NKikimrServices::TENANT_POOL, NLog::PRI_DEBUG);
- SetLogPriority(NKikimrServices::LABELS_MAINTAINER, NLog::PRI_DEBUG);
- SetLogPriority(NKikimrServices::TENANT_SLOT_BROKER, NLog::PRI_DEBUG);
- SetLogPriority(NKikimrServices::CMS, NLog::PRI_DEBUG);
- SetLogPriority(NKikimrServices::CMS_CONFIGS, NLog::PRI_TRACE);
- SetLogPriority(NKikimrServices::CMS_TENANTS, NLog::PRI_TRACE);
- SetLogPriority(NKikimrServices::CONFIGS_DISPATCHER, NLog::PRI_TRACE);
+{
+ if (ENABLE_DETAILED_LOG) {
+ SetLogPriority(NKikimrServices::LOCAL, NLog::PRI_DEBUG);
+ SetLogPriority(NKikimrServices::TENANT_POOL, NLog::PRI_DEBUG);
+ SetLogPriority(NKikimrServices::LABELS_MAINTAINER, NLog::PRI_DEBUG);
+ SetLogPriority(NKikimrServices::TENANT_SLOT_BROKER, NLog::PRI_DEBUG);
+ SetLogPriority(NKikimrServices::CMS, NLog::PRI_DEBUG);
+ SetLogPriority(NKikimrServices::CMS_CONFIGS, NLog::PRI_TRACE);
+ SetLogPriority(NKikimrServices::CMS_TENANTS, NLog::PRI_TRACE);
+ SetLogPriority(NKikimrServices::CONFIGS_DISPATCHER, NLog::PRI_TRACE);
SetLogPriority(NKikimrServices::CONFIGS_CACHE, NLog::PRI_TRACE);
SetLogPriority(NKikimrServices::HIVE, NLog::PRI_DEBUG);
SetLogPriority(NKikimrServices::BS_CONTROLLER, NLog::PRI_DEBUG);
@@ -791,65 +791,65 @@ void TTenantTestRuntime::Setup(bool createTenantPools)
SetLogPriority(NKikimrServices::TX_PROXY, NLog::PRI_DEBUG);
SetLogPriority(NKikimrServices::TX_PROXY_SCHEME_CACHE, NLog::PRI_DEBUG);
- //SetLogPriority(NKikimrServices::TX_MEDIATOR, NLog::PRI_DEBUG);
- //SetLogPriority(NKikimrServices::TX_COORDINATOR, NLog::PRI_DEBUG);
- //SetLogPriority(NKikimrServices::BS_CONTROLLER, NLog::PRI_DEBUG);
- //SetLogPriority(NKikimrServices::BS_NODE, NLog::PRI_DEBUG);
- //SetLogPriority(NKikimrServices::TABLET_EXECUTOR, NLog::PRI_DEBUG);
- //SetLogPriority(NKikimrServices::PIPE_CLIENT, NLog::PRI_DEBUG);
- //SetLogPriority(NKikimrServices::PIPE_SERVER, NLog::PRI_DEBUG);
-
+ //SetLogPriority(NKikimrServices::TX_MEDIATOR, NLog::PRI_DEBUG);
+ //SetLogPriority(NKikimrServices::TX_COORDINATOR, NLog::PRI_DEBUG);
+ //SetLogPriority(NKikimrServices::BS_CONTROLLER, NLog::PRI_DEBUG);
+ //SetLogPriority(NKikimrServices::BS_NODE, NLog::PRI_DEBUG);
+ //SetLogPriority(NKikimrServices::TABLET_EXECUTOR, NLog::PRI_DEBUG);
+ //SetLogPriority(NKikimrServices::PIPE_CLIENT, NLog::PRI_DEBUG);
+ //SetLogPriority(NKikimrServices::PIPE_SERVER, NLog::PRI_DEBUG);
+
SetupMonitoring();
- }
-
+ }
+
TAppPrepare app;
app.FeatureFlags = Extension.GetFeatureFlags();
app.ClearDomainsAndHive();
ui32 planResolution = 500;
- // Add domains info.
+ // Add domains info.
for (ui32 i = 0; i < Config.Domains.size(); ++i) {
- auto &domain = Config.Domains[i];
- NKikimrBlobStorage::TDefineStoragePool hddPool;
- hddPool.SetBoxId(1);
- hddPool.SetErasureSpecies("none");
- hddPool.SetVDiskKind("Default");
- hddPool.AddPDiskFilter()->AddProperty()->SetType(NKikimrBlobStorage::ROT);
+ auto &domain = Config.Domains[i];
+ NKikimrBlobStorage::TDefineStoragePool hddPool;
+ hddPool.SetBoxId(1);
+ hddPool.SetErasureSpecies("none");
+ hddPool.SetVDiskKind("Default");
+ hddPool.AddPDiskFilter()->AddProperty()->SetType(NKikimrBlobStorage::ROT);
TDomainsInfo::TDomain::TStoragePoolKinds poolTypes;
- poolTypes["hdd"] = hddPool;
- poolTypes["hdd-1"] = hddPool;
- poolTypes["hdd-2"] = hddPool;
- poolTypes["hdd-3"] = hddPool;
+ poolTypes["hdd"] = hddPool;
+ poolTypes["hdd-1"] = hddPool;
+ poolTypes["hdd-2"] = hddPool;
+ poolTypes["hdd-3"] = hddPool;
auto domainPtr = TDomainsInfo::TDomain::ConstructDomainWithExplicitTabletIds(domain.Name, i, domain.SchemeShardId,
i, i, TVector<ui32>{i},
i, TVector<ui32>{i},
- planResolution,
+ planResolution,
TVector<ui64>{TDomainsInfo::MakeTxCoordinatorIDFixed(i, 1)},
TVector<ui64>{TDomainsInfo::MakeTxMediatorIDFixed(i, 1)},
TVector<ui64>{TDomainsInfo::MakeTxAllocatorIDFixed(i, 1)},
poolTypes);
-
- TVector<ui64> ids = GetTxAllocatorTabletIds();
- ids.insert(ids.end(), domainPtr->TxAllocators.begin(), domainPtr->TxAllocators.end());
- SetTxAllocatorTabletIds(ids);
-
+
+ TVector<ui64> ids = GetTxAllocatorTabletIds();
+ ids.insert(ids.end(), domainPtr->TxAllocators.begin(), domainPtr->TxAllocators.end());
+ SetTxAllocatorTabletIds(ids);
+
app.AddDomain(domainPtr.Release());
app.AddHive(i, Config.HiveId);
- }
-
- for (size_t i = 0; i< Config.Nodes.size(); ++i) {
- AddLocalService(NNodeWhiteboard::MakeNodeWhiteboardServiceId(GetNodeId(i)),
- TActorSetupCmd(new TFakeNodeWhiteboardService, TMailboxType::Simple, 0), i);
- }
-
+ }
+
+ for (size_t i = 0; i< Config.Nodes.size(); ++i) {
+ AddLocalService(NNodeWhiteboard::MakeNodeWhiteboardServiceId(GetNodeId(i)),
+ TActorSetupCmd(new TFakeNodeWhiteboardService, TMailboxType::Simple, 0), i);
+ }
+
SetupChannelProfiles(app);
SetupBasicServices(*this, app);
-
- if (ENABLE_DETAILED_LOG) {
- Register(NTabletMonitoringProxy::CreateTabletMonitoringProxy());
- }
-
+
+ if (ENABLE_DETAILED_LOG) {
+ Register(NTabletMonitoringProxy::CreateTabletMonitoringProxy());
+ }
+
for (auto &pr : GetAppData().DomainsInfo->Domains) {
auto &domain = pr.second;
for (auto id : domain->TxAllocators) {
@@ -866,33 +866,33 @@ void TTenantTestRuntime::Setup(bool createTenantPools)
}
}
- // Create Scheme Shards
- Sender = AllocateEdgeActor();
- for (size_t i = 0; i < Config.Domains.size(); ++i) {
- auto &domain = Config.Domains[i];
- SubDomainKeys[TSubDomainKey(domain.SchemeShardId, 1)] = domain.Name;
- if (Config.FakeSchemeShard) {
- ui32 pathId = 100;
- TVector<std::pair<TString, ui64>> subdomains;
- for (auto &subDomain : domain.Subdomains) {
- TSubDomainKey key(domain.SchemeShardId, pathId++);
- SubDomainKeys[key] = subDomain;
- subdomains.push_back(std::make_pair(subDomain, key.GetPathId()));
- }
-
+ // Create Scheme Shards
+ Sender = AllocateEdgeActor();
+ for (size_t i = 0; i < Config.Domains.size(); ++i) {
+ auto &domain = Config.Domains[i];
+ SubDomainKeys[TSubDomainKey(domain.SchemeShardId, 1)] = domain.Name;
+ if (Config.FakeSchemeShard) {
+ ui32 pathId = 100;
+ TVector<std::pair<TString, ui64>> subdomains;
+ for (auto &subDomain : domain.Subdomains) {
+ TSubDomainKey key(domain.SchemeShardId, pathId++);
+ SubDomainKeys[key] = subDomain;
+ subdomains.push_back(std::make_pair(subDomain, key.GetPathId()));
+ }
+
auto info = CreateTestTabletInfo(domain.SchemeShardId, TTabletTypes::TX_DUMMY, TErasureType::ErasureNone);
TActorId actorId = CreateTestBootstrapper(*this, info, [sender=Sender, subdomains](const TActorId &tablet, TTabletStorageInfo *info) -> IActor* {
- return new TFakeSchemeShard(tablet, info, sender, subdomains);
- });
- EnableScheduleForActor(actorId, true);
- } else {
+ return new TFakeSchemeShard(tablet, info, sender, subdomains);
+ });
+ EnableScheduleForActor(actorId, true);
+ } else {
auto info = CreateTestTabletInfo(domain.SchemeShardId, TTabletTypes::FLAT_SCHEMESHARD, TErasureType::ErasureNone);
TActorId actorId = CreateTestBootstrapper(*this, info, [](const TActorId &tablet, TTabletStorageInfo *info) -> IActor* {
- return CreateFlatTxSchemeShard(tablet, info);
- });
- EnableScheduleForActor(actorId, true);
-
- // Init scheme root.
+ return CreateFlatTxSchemeShard(tablet, info);
+ });
+ EnableScheduleForActor(actorId, true);
+
+ // Init scheme root.
{
auto evTx = MakeHolder<TEvSchemeShard::TEvModifySchemeTransaction>(1, domain.SchemeShardId);
auto transaction = evTx->Record.AddTransaction();
@@ -914,7 +914,7 @@ void TTenantTestRuntime::Setup(bool createTenantPools)
auto event = GrabEdgeEvent<TEvSchemeShard::TEvModifySchemeTransactionResult>(handle);
UNIT_ASSERT_VALUES_EQUAL(event->Record.GetSchemeshardId(), domain.SchemeShardId);
UNIT_ASSERT_VALUES_EQUAL(event->Record.GetStatus(), NKikimrScheme::EStatus::StatusAccepted);
- }
+ }
auto evSubscribe = MakeHolder<TEvSchemeShard::TEvNotifyTxCompletion>(1);
SendToPipe(domain.SchemeShardId, Sender, evSubscribe.Release(), 0, GetPipeConfigWithRetries());
@@ -925,17 +925,17 @@ void TTenantTestRuntime::Setup(bool createTenantPools)
UNIT_ASSERT_VALUES_EQUAL(event->Record.GetTxId(), 1);
}
}
- Y_VERIFY(domain.Subdomains.empty(), "Pre-initialized subdomains are not supported for real SchemeShard");
- }
- }
-
- // Create TxProxy services
- for (size_t i = 0; i< Config.Nodes.size(); ++i) {
- IActor* txProxy = CreateTxProxy(GetTxAllocatorTabletIds());
+ Y_VERIFY(domain.Subdomains.empty(), "Pre-initialized subdomains are not supported for real SchemeShard");
+ }
+ }
+
+ // Create TxProxy services
+ for (size_t i = 0; i< Config.Nodes.size(); ++i) {
+ IActor* txProxy = CreateTxProxy(GetTxAllocatorTabletIds());
TActorId txProxyId = Register(txProxy, i);
- RegisterService(MakeTxProxyID(), txProxyId, i);
- }
-
+ RegisterService(MakeTxProxyID(), txProxyId, i);
+ }
+
// Create LongTx services
for (size_t i = 0; i< Config.Nodes.size(); ++i) {
IActor* longTxService = NLongTxService::CreateLongTxService();
@@ -951,56 +951,56 @@ void TTenantTestRuntime::Setup(bool createTenantPools)
RegisterService(NSequenceProxy::MakeSequenceProxyServiceID(), sequenceProxyId, i);
}
- // Create Hive.
- {
+ // Create Hive.
+ {
auto info = CreateTestTabletInfo(Config.HiveId, TTabletTypes::TX_DUMMY, TErasureType::ErasureNone);
TActorId actorId = CreateTestBootstrapper(*this, info, [this](const TActorId &tablet, TTabletStorageInfo *info) -> IActor* {
- return new TFakeHive(tablet, info, Sender, Config.HiveId, SubDomainKeys);
- });
- EnableScheduleForActor(actorId, true);
- }
-
- // Create BS Controller.
- {
+ return new TFakeHive(tablet, info, Sender, Config.HiveId, SubDomainKeys);
+ });
+ EnableScheduleForActor(actorId, true);
+ }
+
+ // Create BS Controller.
+ {
auto info = CreateTestTabletInfo(MakeBSControllerID(0), TTabletTypes::FLAT_BS_CONTROLLER);
TActorId actorId = CreateTestBootstrapper(*this, info, [](const TActorId &tablet, TTabletStorageInfo *info) -> IActor* {
- //return new TFakeBSController(tablet, info);
- return CreateFlatBsController(tablet, info);
- });
- EnableScheduleForActor(actorId, true);
-
- // Get list of nodes to reveal IC ports.
-
+ //return new TFakeBSController(tablet, info);
+ return CreateFlatBsController(tablet, info);
+ });
+ EnableScheduleForActor(actorId, true);
+
+ // Get list of nodes to reveal IC ports.
+
Send(new IEventHandle(GetNameserviceActorId(), Sender, new TEvInterconnect::TEvListNodes));
- TAutoPtr<IEventHandle> handle;
- auto reply1 = GrabEdgeEventRethrow<TEvInterconnect::TEvNodesInfo>(handle);
-
- NKikimrBlobStorage::TDefineHostConfig hostConfig;
- hostConfig.SetHostConfigId(1);
+ TAutoPtr<IEventHandle> handle;
+ auto reply1 = GrabEdgeEventRethrow<TEvInterconnect::TEvNodesInfo>(handle);
+
+ NKikimrBlobStorage::TDefineHostConfig hostConfig;
+ hostConfig.SetHostConfigId(1);
hostConfig.AddDrive()->SetPath(TStringBuilder() << GetTempDir() << "pdisk_1.dat");
- NKikimrBlobStorage::TDefineBox boxConfig;
- boxConfig.SetBoxId(1);
- for (const TEvInterconnect::TNodeInfo &node : reply1->Nodes) {
- auto &host = *boxConfig.AddHost();
- host.SetHostConfigId(1);
- host.MutableKey()->SetFqdn(node.Host);
- host.MutableKey()->SetIcPort(node.Port);
- }
+ NKikimrBlobStorage::TDefineBox boxConfig;
+ boxConfig.SetBoxId(1);
+ for (const TEvInterconnect::TNodeInfo &node : reply1->Nodes) {
+ auto &host = *boxConfig.AddHost();
+ host.SetHostConfigId(1);
+ host.MutableKey()->SetFqdn(node.Host);
+ host.MutableKey()->SetIcPort(node.Port);
+ }
auto request = MakeHolder<TEvBlobStorage::TEvControllerConfigRequest>();
- request->Record.MutableRequest()->AddCommand()->MutableDefineHostConfig()->CopyFrom(hostConfig);
- request->Record.MutableRequest()->AddCommand()->MutableDefineBox()->CopyFrom(boxConfig);
-
- NTabletPipe::TClientConfig pipeConfig;
+ request->Record.MutableRequest()->AddCommand()->MutableDefineHostConfig()->CopyFrom(hostConfig);
+ request->Record.MutableRequest()->AddCommand()->MutableDefineBox()->CopyFrom(boxConfig);
+
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = NTabletPipe::TClientRetryPolicy::WithRetries();
- SendToPipe(MakeBSControllerID(0), Sender, request.Release(), 0, pipeConfig);
-
- auto reply2 = GrabEdgeEventRethrow<TEvBlobStorage::TEvControllerConfigResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply2->Record.GetResponse().GetSuccess(), true);
- }
-
- // Create Tenant Slot Pools
- Y_VERIFY(GetNodeCount() >= Config.Nodes.size());
- TMultiSet<std::pair<TString, TEvLocal::TEvTenantStatus::EStatus>> statuses;
+ SendToPipe(MakeBSControllerID(0), Sender, request.Release(), 0, pipeConfig);
+
+ auto reply2 = GrabEdgeEventRethrow<TEvBlobStorage::TEvControllerConfigResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply2->Record.GetResponse().GetSuccess(), true);
+ }
+
+ // Create Tenant Slot Pools
+ Y_VERIFY(GetNodeCount() >= Config.Nodes.size());
+ TMultiSet<std::pair<TString, TEvLocal::TEvTenantStatus::EStatus>> statuses;
if (createTenantPools) {
for (size_t i = 0; i< Config.Nodes.size(); ++i) {
@@ -1009,179 +1009,179 @@ void TTenantTestRuntime::Setup(bool createTenantPools)
statuses.insert(std::make_pair(CanonizePath(slot.Tenant), TEvLocal::TEvTenantStatus::STARTED));
CreateTenantPool(i);
}
- }
-
- // Create other local services
- for (size_t i = 0; i < Config.Nodes.size(); ++i) {
- if (Config.CreateConfigsDispatcher) {
- auto aid = Register(CreateConfigsDispatcher(Extension));
- EnableScheduleForActor(aid, true);
- RegisterService(MakeConfigsDispatcherID(GetNodeId(0)), aid, 0);
- }
-
- Register(NKikimr::CreateLabelsMaintainer(Extension.GetMonitoringConfig()),
- i, 0, TMailboxType::Revolving, 0);
- }
-
- // Wait until pools are up and domains are started.
- if (!statuses.empty()) {
- TDispatchOptions options1;
- options1.FinalEvents.emplace_back(TIsTenantStatus(statuses));
- DispatchEvents(options1);
- }
-
- // Create Console
- {
+ }
+
+ // Create other local services
+ for (size_t i = 0; i < Config.Nodes.size(); ++i) {
+ if (Config.CreateConfigsDispatcher) {
+ auto aid = Register(CreateConfigsDispatcher(Extension));
+ EnableScheduleForActor(aid, true);
+ RegisterService(MakeConfigsDispatcherID(GetNodeId(0)), aid, 0);
+ }
+
+ Register(NKikimr::CreateLabelsMaintainer(Extension.GetMonitoringConfig()),
+ i, 0, TMailboxType::Revolving, 0);
+ }
+
+ // Wait until pools are up and domains are started.
+ if (!statuses.empty()) {
+ TDispatchOptions options1;
+ options1.FinalEvents.emplace_back(TIsTenantStatus(statuses));
+ DispatchEvents(options1);
+ }
+
+ // Create Console
+ {
auto info = CreateTestTabletInfo(MakeConsoleID(0), TTabletTypes::CONSOLE, TErasureType::ErasureNone);
TActorId actorId = CreateTestBootstrapper(*this, info, [](const TActorId &tablet, TTabletStorageInfo *info) -> IActor* {
- return CreateConsole(tablet, info);
- });
- EnableScheduleForActor(actorId, true);
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
- DispatchEvents(options);
-
- // Configure Console
- auto req = new NConsole::TEvConsole::TEvSetConfigRequest;
- auto &config = *req->Record.MutableConfig()->MutableTenantsConfig();
- auto zone1 = config.AddAvailabilityZoneKinds();
- zone1->SetKind(ZONE1);
+ return CreateConsole(tablet, info);
+ });
+ EnableScheduleForActor(actorId, true);
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(&IsTabletActiveEvent, 1);
+ DispatchEvents(options);
+
+ // Configure Console
+ auto req = new NConsole::TEvConsole::TEvSetConfigRequest;
+ auto &config = *req->Record.MutableConfig()->MutableTenantsConfig();
+ auto zone1 = config.AddAvailabilityZoneKinds();
+ zone1->SetKind(ZONE1);
zone1->SetDataCenterName(ToString(1));
- auto zone2 = config.AddAvailabilityZoneKinds();
- zone2->SetKind(ZONE2);
+ auto zone2 = config.AddAvailabilityZoneKinds();
+ zone2->SetKind(ZONE2);
zone2->SetDataCenterName(ToString(2));
- auto zone3 = config.AddAvailabilityZoneKinds();
- zone3->SetKind(ZONE3);
+ auto zone3 = config.AddAvailabilityZoneKinds();
+ zone3->SetKind(ZONE3);
zone3->SetDataCenterName(ToString(3));
- auto zone4 = config.AddAvailabilityZoneKinds();
- zone4->SetKind(ZONE_ANY);
+ auto zone4 = config.AddAvailabilityZoneKinds();
+ zone4->SetKind(ZONE_ANY);
zone4->SetDataCenterName(NTenantSlotBroker::ANY_DATA_CENTER);
- auto set1 = config.AddAvailabilityZoneSets();
- set1->SetName("all");
- set1->AddZoneKinds(ZONE1);
- set1->AddZoneKinds(ZONE2);
- set1->AddZoneKinds(ZONE3);
- set1->AddZoneKinds(ZONE_ANY);
- auto set2 = config.AddAvailabilityZoneSets();
- set2->SetName(ZONE1);
- set2->AddZoneKinds(ZONE1);
- auto set3 = config.AddAvailabilityZoneSets();
- set3->SetName(ZONE2);
- set3->AddZoneKinds(ZONE2);
- auto set4 = config.AddAvailabilityZoneSets();
- set4->SetName(ZONE3);
- set4->AddZoneKinds(ZONE3);
- auto unit1 = config.AddComputationalUnitKinds();
- unit1->SetKind(SLOT1_TYPE);
- unit1->SetTenantSlotType(SLOT1_TYPE);
- unit1->SetAvailabilityZoneSet(ZONE1);
- auto unit2 = config.AddComputationalUnitKinds();
- unit2->SetKind(SLOT2_TYPE);
- unit2->SetTenantSlotType(SLOT2_TYPE);
- unit2->SetAvailabilityZoneSet("all");
- auto unit3 = config.AddComputationalUnitKinds();
- unit3->SetKind(SLOT3_TYPE);
- unit3->SetTenantSlotType(SLOT3_TYPE);
- unit3->SetAvailabilityZoneSet("all");
- // Set configuration restrictions.
- auto &restrictions = *req->Record.MutableConfig()->MutableConfigsConfig()->MutableUsageScopeRestrictions();
- restrictions.AddAllowedNodeIdUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- restrictions.AddAllowedHostUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- restrictions.AddAllowedTenantUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- restrictions.AddAllowedTenantUsageScopeKinds(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
- restrictions.AddAllowedNodeTypeUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
- SendToConsole(req);
- TAutoPtr<IEventHandle> handle;
- auto reply = GrabEdgeEventRethrow<TEvConsole::TEvSetConfigResponse>(handle);
+ auto set1 = config.AddAvailabilityZoneSets();
+ set1->SetName("all");
+ set1->AddZoneKinds(ZONE1);
+ set1->AddZoneKinds(ZONE2);
+ set1->AddZoneKinds(ZONE3);
+ set1->AddZoneKinds(ZONE_ANY);
+ auto set2 = config.AddAvailabilityZoneSets();
+ set2->SetName(ZONE1);
+ set2->AddZoneKinds(ZONE1);
+ auto set3 = config.AddAvailabilityZoneSets();
+ set3->SetName(ZONE2);
+ set3->AddZoneKinds(ZONE2);
+ auto set4 = config.AddAvailabilityZoneSets();
+ set4->SetName(ZONE3);
+ set4->AddZoneKinds(ZONE3);
+ auto unit1 = config.AddComputationalUnitKinds();
+ unit1->SetKind(SLOT1_TYPE);
+ unit1->SetTenantSlotType(SLOT1_TYPE);
+ unit1->SetAvailabilityZoneSet(ZONE1);
+ auto unit2 = config.AddComputationalUnitKinds();
+ unit2->SetKind(SLOT2_TYPE);
+ unit2->SetTenantSlotType(SLOT2_TYPE);
+ unit2->SetAvailabilityZoneSet("all");
+ auto unit3 = config.AddComputationalUnitKinds();
+ unit3->SetKind(SLOT3_TYPE);
+ unit3->SetTenantSlotType(SLOT3_TYPE);
+ unit3->SetAvailabilityZoneSet("all");
+ // Set configuration restrictions.
+ auto &restrictions = *req->Record.MutableConfig()->MutableConfigsConfig()->MutableUsageScopeRestrictions();
+ restrictions.AddAllowedNodeIdUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ restrictions.AddAllowedHostUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ restrictions.AddAllowedTenantUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ restrictions.AddAllowedTenantUsageScopeKinds(NKikimrConsole::TConfigItem::TenantPoolConfigItem);
+ restrictions.AddAllowedNodeTypeUsageScopeKinds(NKikimrConsole::TConfigItem::LogConfigItem);
+ SendToConsole(req);
+ TAutoPtr<IEventHandle> handle;
+ auto reply = GrabEdgeEventRethrow<TEvConsole::TEvSetConfigResponse>(handle);
UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
- }
-
- // Create Tenant Slot Broker
- {
+ }
+
+ // Create Tenant Slot Broker
+ {
auto info = CreateTestTabletInfo(MakeTenantSlotBrokerID(0), TTabletTypes::TENANT_SLOT_BROKER, TErasureType::ErasureNone);
TActorId actorId = CreateTestBootstrapper(*this, info, [&config=this->Config](const TActorId &tablet, TTabletStorageInfo *info) -> IActor* {
- if (config.FakeTenantSlotBroker)
- return new TFakeTenantSlotBroker(tablet, info);
- else
- return NTenantSlotBroker::CreateTenantSlotBroker(tablet, info);
- });
- EnableScheduleForActor(actorId, true);
-
- // Wait until Tenant Slot Broker gets all statuses.
+ if (config.FakeTenantSlotBroker)
+ return new TFakeTenantSlotBroker(tablet, info);
+ else
+ return NTenantSlotBroker::CreateTenantSlotBroker(tablet, info);
+ });
+ EnableScheduleForActor(actorId, true);
+
+ // Wait until Tenant Slot Broker gets all statuses.
if (createTenantPools && !Config.FakeTenantSlotBroker) {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TWaitTenantSlotBrokerInitialization(Config.Nodes.size()));
- DispatchEvents(options);
- }
- }
-}
-
-TTenantTestRuntime::TTenantTestRuntime(const TTenantTestConfig &config,
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TWaitTenantSlotBrokerInitialization(Config.Nodes.size()));
+ DispatchEvents(options);
+ }
+ }
+}
+
+TTenantTestRuntime::TTenantTestRuntime(const TTenantTestConfig &config,
const NKikimrConfig::TAppConfig &extension,
bool createTenantPools)
: TTestBasicRuntime(config.Nodes.size(), config.DataCenterCount, false)
- , Config(config)
- , Extension(extension)
-{
+ , Config(config)
+ , Extension(extension)
+{
Extension.MutableFeatureFlags()->SetEnableExternalHive(false);
Setup(createTenantPools);
-}
-
-void TTenantTestRuntime::WaitForHiveState(const TVector<TEvTest::TEvWaitHiveState::TClientInfo> &state)
-{
- TAutoPtr<IEventHandle> handle;
- SendToPipe(Config.HiveId, Sender, new TEvTest::TEvWaitHiveState(state));
- GrabEdgeEventRethrow<TEvTest::TEvHiveStateHit>(handle);
-}
-
-void TTenantTestRuntime::SendToBroker(IEventBase* event)
-{
- SendToPipe(MakeTenantSlotBrokerID(0), Sender, event, 0, GetPipeConfigWithRetries());
-}
-
-void TTenantTestRuntime::SendToConsole(IEventBase* event)
-{
- SendToPipe(MakeConsoleID(0), Sender, event, 0, GetPipeConfigWithRetries());
-}
-
-NKikimrTenantPool::TSlotStatus MakeSlotStatus(const TString &id, const TString &type, const TString &tenant,
- ui64 cpu, ui64 memory, ui64 network, const TString &label)
-{
- NKikimrTenantPool::TSlotStatus res;
- res.SetId(id);
- res.SetType(type);
- res.SetAssignedTenant(tenant);
- res.SetLabel(label);
- res.MutableResourceLimit()->SetCPU(cpu);
- res.MutableResourceLimit()->SetMemory(memory);
- res.MutableResourceLimit()->SetNetwork(network);
- return res;
-}
-
-void CheckTenantPoolStatus(TTenantTestRuntime &runtime, ui32 domain,
- THashMap<TString, NKikimrTenantPool::TSlotStatus> status,
- ui32 nodeId)
-{
- runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(nodeId), domain),
- runtime.Sender,
- new TEvTenantPool::TEvGetStatus));
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvTenantPoolStatus>(handle);
- auto &rec = reply->Record;
- for (auto &slot : rec.GetSlots()) {
+}
+
+void TTenantTestRuntime::WaitForHiveState(const TVector<TEvTest::TEvWaitHiveState::TClientInfo> &state)
+{
+ TAutoPtr<IEventHandle> handle;
+ SendToPipe(Config.HiveId, Sender, new TEvTest::TEvWaitHiveState(state));
+ GrabEdgeEventRethrow<TEvTest::TEvHiveStateHit>(handle);
+}
+
+void TTenantTestRuntime::SendToBroker(IEventBase* event)
+{
+ SendToPipe(MakeTenantSlotBrokerID(0), Sender, event, 0, GetPipeConfigWithRetries());
+}
+
+void TTenantTestRuntime::SendToConsole(IEventBase* event)
+{
+ SendToPipe(MakeConsoleID(0), Sender, event, 0, GetPipeConfigWithRetries());
+}
+
+NKikimrTenantPool::TSlotStatus MakeSlotStatus(const TString &id, const TString &type, const TString &tenant,
+ ui64 cpu, ui64 memory, ui64 network, const TString &label)
+{
+ NKikimrTenantPool::TSlotStatus res;
+ res.SetId(id);
+ res.SetType(type);
+ res.SetAssignedTenant(tenant);
+ res.SetLabel(label);
+ res.MutableResourceLimit()->SetCPU(cpu);
+ res.MutableResourceLimit()->SetMemory(memory);
+ res.MutableResourceLimit()->SetNetwork(network);
+ return res;
+}
+
+void CheckTenantPoolStatus(TTenantTestRuntime &runtime, ui32 domain,
+ THashMap<TString, NKikimrTenantPool::TSlotStatus> status,
+ ui32 nodeId)
+{
+ runtime.Send(new IEventHandle(MakeTenantPoolID(runtime.GetNodeId(nodeId), domain),
+ runtime.Sender,
+ new TEvTenantPool::TEvGetStatus));
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTenantPool::TEvTenantPoolStatus>(handle);
+ auto &rec = reply->Record;
+ for (auto &slot : rec.GetSlots()) {
UNIT_ASSERT(status.contains(slot.GetId()));
- auto &entry = status[slot.GetId()];
- UNIT_ASSERT_VALUES_EQUAL(slot.GetId(), entry.GetId());
- UNIT_ASSERT_VALUES_EQUAL(slot.GetType(), entry.GetType());
- UNIT_ASSERT_VALUES_EQUAL(slot.GetAssignedTenant(), entry.GetAssignedTenant());
- UNIT_ASSERT_VALUES_EQUAL(slot.GetLabel(), entry.GetLabel());
- UNIT_ASSERT_VALUES_EQUAL(slot.GetResourceLimit().GetCPU(), entry.GetResourceLimit().GetCPU());
- UNIT_ASSERT_VALUES_EQUAL(slot.GetResourceLimit().GetMemory(), entry.GetResourceLimit().GetMemory());
- UNIT_ASSERT_VALUES_EQUAL(slot.GetResourceLimit().GetNetwork(), entry.GetResourceLimit().GetNetwork());
- status.erase(slot.GetId());
- }
- UNIT_ASSERT(status.empty());
-}
-
-} // namespace NKikimr
+ auto &entry = status[slot.GetId()];
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetId(), entry.GetId());
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetType(), entry.GetType());
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetAssignedTenant(), entry.GetAssignedTenant());
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetLabel(), entry.GetLabel());
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetResourceLimit().GetCPU(), entry.GetResourceLimit().GetCPU());
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetResourceLimit().GetMemory(), entry.GetResourceLimit().GetMemory());
+ UNIT_ASSERT_VALUES_EQUAL(slot.GetResourceLimit().GetNetwork(), entry.GetResourceLimit().GetNetwork());
+ status.erase(slot.GetId());
+ }
+ UNIT_ASSERT(status.empty());
+}
+
+} // namespace NKikimr
diff --git a/ydb/core/testlib/tenant_runtime.h b/ydb/core/testlib/tenant_runtime.h
index d0c9e7bf1b8..f98c1441af3 100644
--- a/ydb/core/testlib/tenant_runtime.h
+++ b/ydb/core/testlib/tenant_runtime.h
@@ -1,6 +1,6 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <ydb/core/base/events.h>
#include <ydb/core/base/subdomain.h>
#include <ydb/core/mind/labels_maintainer.h>
@@ -8,212 +8,212 @@
#include <ydb/core/mind/tenant_pool.h>
#include <ydb/core/testlib/actors/test_runtime.h>
#include <ydb/core/testlib/basics/runtime.h>
-
-#include <util/generic/string.h>
-
-#ifndef NDEBUG
-const bool ENABLE_DETAILED_LOG = true;
-#else
-const bool ENABLE_DETAILED_LOG = false;
-#endif
-
-namespace NKikimr {
-
-struct TEvTest {
- enum EEv {
- EvHoldResolve = EventSpaceBegin(NKikimr::TKikimrEvents::ES_PRIVATE),
- EvWaitHiveState,
- EvHiveStateHit,
- EvActionSuccess,
- EvEnd
- };
-
- struct TEvHoldResolve : public TEventLocal<TEvHoldResolve, EvHoldResolve> {
- TEvHoldResolve(bool hold)
- : Hold(hold)
- {}
-
- bool Hold;
- };
-
- struct TEvWaitHiveState : public TEventLocal<TEvWaitHiveState, EvWaitHiveState> {
- struct TClientInfo {
- TClientInfo(const TString &name, ui64 cpu = 1, ui64 memory = 1, ui64 network = 1)
- : TenantName(name)
- {
- ResourceLimit.SetCPU(cpu);
- ResourceLimit.SetMemory(memory);
- ResourceLimit.SetNetwork(network);
- }
-
- TString TenantName;
- NKikimrTabletBase::TMetrics ResourceLimit;
- };
-
- TEvWaitHiveState(const TVector<TClientInfo> &states)
- : States(states)
- {}
-
- TVector<TClientInfo> States;
- };
-
- struct TEvHiveStateHit : public TEventLocal<TEvHiveStateHit, EvHiveStateHit> {};
-
- struct TEvActionSuccess : public TEventLocal<TEvActionSuccess, EvActionSuccess> {};
-};
-
-struct TTenantTestConfig {
- struct TDomainConfig {
- TString Name;
- ui64 SchemeShardId;
- TVector<TString> Subdomains;
- };
-
- struct TResourceLimit {
- ui64 CPU;
- ui64 Memory;
- ui64 Network;
- };
-
- struct TStaticSlotConfig {
- TString Tenant;
- TResourceLimit Limit;
- };
-
- struct TDynamicSlotConfig {
- TString Id;
- TString Type;
- TString Domain;
- TString Tenant;
- TResourceLimit Limit;
- };
-
- struct TTenantPoolConfig {
- TVector<TStaticSlotConfig> StaticSlots;
- TVector<TDynamicSlotConfig> DynamicSlots;
- TString NodeType;
- };
-
- struct TNodeConfig {
- TTenantPoolConfig TenantPoolConfig;
- };
-
- TVector<TDomainConfig> Domains;
- ui64 HiveId;
- bool FakeTenantSlotBroker;
- bool FakeSchemeShard;
- bool CreateConsole;
- TVector<TNodeConfig> Nodes;
- ui32 DataCenterCount;
- bool CreateConfigsDispatcher = false;
-};
-
-extern const ui64 SCHEME_SHARD1_ID;
-extern const ui64 HIVE_ID;
-extern const ui64 SCHEME_SHARD2_ID;
-
-extern const TString DOMAIN1_NAME;
-extern const TString TENANT1_1_NAME;
-extern const TString TENANT1_2_NAME;
-extern const TString TENANT1_3_NAME;
-extern const TString TENANT1_4_NAME;
-extern const TString TENANT1_5_NAME;
-extern const TString TENANT2_1_NAME;
-extern const TString TENANT2_2_NAME;
-extern const TString TENANT2_3_NAME;
-extern const TString TENANT2_4_NAME;
-extern const TString TENANT2_5_NAME;
-extern const TString TENANT1_U_NAME;
-extern const TString TENANTU_1_NAME;
-extern const TString DOMAIN1_SLOT1;
-extern const TString DOMAIN1_SLOT2;
-extern const TString DOMAIN1_SLOT3;
-extern const TString STATIC_SLOT;
-extern const TString SLOT1_TYPE;
-extern const TString SLOT2_TYPE;
-extern const TString SLOT3_TYPE;
-
-extern const TSubDomainKey DOMAIN1_KEY;
-
-extern const TSubDomainKey TENANT1_1_KEY;
-extern const TSubDomainKey TENANT1_2_KEY;
-extern const TSubDomainKey TENANT1_3_KEY;
-extern const TSubDomainKey TENANT1_4_KEY;
-extern const TSubDomainKey TENANT1_5_KEY;
-extern const TSubDomainKey TENANT2_1_KEY;
-extern const TSubDomainKey TENANT2_2_KEY;
-extern const TSubDomainKey TENANT2_3_KEY;
-extern const TSubDomainKey TENANT2_4_KEY;
-extern const TSubDomainKey TENANT2_5_KEY;
-
-extern const TString ZONE1;
-extern const TString ZONE2;
-extern const TString ZONE3;
-extern const TString ZONE_ANY;
-
-struct TIsTenantStatus {
- TIsTenantStatus(const TString &tenant, TEvLocal::TEvTenantStatus::EStatus status)
- {
- Statuses.insert(std::make_pair(tenant, status));
- }
-
- template<typename ...Ts>
- TIsTenantStatus(const TString &tenant, TEvLocal::TEvTenantStatus::EStatus status, Ts... args)
- : TIsTenantStatus(args...)
- {
- Statuses.insert(std::make_pair(tenant, status));
- }
-
- TIsTenantStatus(TMultiSet<std::pair<TString, TEvLocal::TEvTenantStatus::EStatus>> statuses)
- {
- Statuses = std::move(statuses);
- }
-
- bool operator()(IEventHandle &ev) {
- if (ev.GetTypeRewrite() == TEvLocal::EvTenantStatus) {
- auto *e = ev.Get<TEvLocal::TEvTenantStatus>();
- auto it = Statuses.find(std::make_pair(e->TenantName, e->Status));
- if (it != Statuses.end()) {
- Statuses.erase(it);
- if (Statuses.empty())
- return true;
- }
- }
-
- return false;
- }
-
- TMultiSet<std::pair<TString, TEvLocal::TEvTenantStatus::EStatus>> Statuses;
-};
-
-extern const TTenantTestConfig DefaultTenantTestConfig;
-
-bool IsTabletActiveEvent(IEventHandle& ev);
-
+
+#include <util/generic/string.h>
+
+#ifndef NDEBUG
+const bool ENABLE_DETAILED_LOG = true;
+#else
+const bool ENABLE_DETAILED_LOG = false;
+#endif
+
+namespace NKikimr {
+
+struct TEvTest {
+ enum EEv {
+ EvHoldResolve = EventSpaceBegin(NKikimr::TKikimrEvents::ES_PRIVATE),
+ EvWaitHiveState,
+ EvHiveStateHit,
+ EvActionSuccess,
+ EvEnd
+ };
+
+ struct TEvHoldResolve : public TEventLocal<TEvHoldResolve, EvHoldResolve> {
+ TEvHoldResolve(bool hold)
+ : Hold(hold)
+ {}
+
+ bool Hold;
+ };
+
+ struct TEvWaitHiveState : public TEventLocal<TEvWaitHiveState, EvWaitHiveState> {
+ struct TClientInfo {
+ TClientInfo(const TString &name, ui64 cpu = 1, ui64 memory = 1, ui64 network = 1)
+ : TenantName(name)
+ {
+ ResourceLimit.SetCPU(cpu);
+ ResourceLimit.SetMemory(memory);
+ ResourceLimit.SetNetwork(network);
+ }
+
+ TString TenantName;
+ NKikimrTabletBase::TMetrics ResourceLimit;
+ };
+
+ TEvWaitHiveState(const TVector<TClientInfo> &states)
+ : States(states)
+ {}
+
+ TVector<TClientInfo> States;
+ };
+
+ struct TEvHiveStateHit : public TEventLocal<TEvHiveStateHit, EvHiveStateHit> {};
+
+ struct TEvActionSuccess : public TEventLocal<TEvActionSuccess, EvActionSuccess> {};
+};
+
+struct TTenantTestConfig {
+ struct TDomainConfig {
+ TString Name;
+ ui64 SchemeShardId;
+ TVector<TString> Subdomains;
+ };
+
+ struct TResourceLimit {
+ ui64 CPU;
+ ui64 Memory;
+ ui64 Network;
+ };
+
+ struct TStaticSlotConfig {
+ TString Tenant;
+ TResourceLimit Limit;
+ };
+
+ struct TDynamicSlotConfig {
+ TString Id;
+ TString Type;
+ TString Domain;
+ TString Tenant;
+ TResourceLimit Limit;
+ };
+
+ struct TTenantPoolConfig {
+ TVector<TStaticSlotConfig> StaticSlots;
+ TVector<TDynamicSlotConfig> DynamicSlots;
+ TString NodeType;
+ };
+
+ struct TNodeConfig {
+ TTenantPoolConfig TenantPoolConfig;
+ };
+
+ TVector<TDomainConfig> Domains;
+ ui64 HiveId;
+ bool FakeTenantSlotBroker;
+ bool FakeSchemeShard;
+ bool CreateConsole;
+ TVector<TNodeConfig> Nodes;
+ ui32 DataCenterCount;
+ bool CreateConfigsDispatcher = false;
+};
+
+extern const ui64 SCHEME_SHARD1_ID;
+extern const ui64 HIVE_ID;
+extern const ui64 SCHEME_SHARD2_ID;
+
+extern const TString DOMAIN1_NAME;
+extern const TString TENANT1_1_NAME;
+extern const TString TENANT1_2_NAME;
+extern const TString TENANT1_3_NAME;
+extern const TString TENANT1_4_NAME;
+extern const TString TENANT1_5_NAME;
+extern const TString TENANT2_1_NAME;
+extern const TString TENANT2_2_NAME;
+extern const TString TENANT2_3_NAME;
+extern const TString TENANT2_4_NAME;
+extern const TString TENANT2_5_NAME;
+extern const TString TENANT1_U_NAME;
+extern const TString TENANTU_1_NAME;
+extern const TString DOMAIN1_SLOT1;
+extern const TString DOMAIN1_SLOT2;
+extern const TString DOMAIN1_SLOT3;
+extern const TString STATIC_SLOT;
+extern const TString SLOT1_TYPE;
+extern const TString SLOT2_TYPE;
+extern const TString SLOT3_TYPE;
+
+extern const TSubDomainKey DOMAIN1_KEY;
+
+extern const TSubDomainKey TENANT1_1_KEY;
+extern const TSubDomainKey TENANT1_2_KEY;
+extern const TSubDomainKey TENANT1_3_KEY;
+extern const TSubDomainKey TENANT1_4_KEY;
+extern const TSubDomainKey TENANT1_5_KEY;
+extern const TSubDomainKey TENANT2_1_KEY;
+extern const TSubDomainKey TENANT2_2_KEY;
+extern const TSubDomainKey TENANT2_3_KEY;
+extern const TSubDomainKey TENANT2_4_KEY;
+extern const TSubDomainKey TENANT2_5_KEY;
+
+extern const TString ZONE1;
+extern const TString ZONE2;
+extern const TString ZONE3;
+extern const TString ZONE_ANY;
+
+struct TIsTenantStatus {
+ TIsTenantStatus(const TString &tenant, TEvLocal::TEvTenantStatus::EStatus status)
+ {
+ Statuses.insert(std::make_pair(tenant, status));
+ }
+
+ template<typename ...Ts>
+ TIsTenantStatus(const TString &tenant, TEvLocal::TEvTenantStatus::EStatus status, Ts... args)
+ : TIsTenantStatus(args...)
+ {
+ Statuses.insert(std::make_pair(tenant, status));
+ }
+
+ TIsTenantStatus(TMultiSet<std::pair<TString, TEvLocal::TEvTenantStatus::EStatus>> statuses)
+ {
+ Statuses = std::move(statuses);
+ }
+
+ bool operator()(IEventHandle &ev) {
+ if (ev.GetTypeRewrite() == TEvLocal::EvTenantStatus) {
+ auto *e = ev.Get<TEvLocal::TEvTenantStatus>();
+ auto it = Statuses.find(std::make_pair(e->TenantName, e->Status));
+ if (it != Statuses.end()) {
+ Statuses.erase(it);
+ if (Statuses.empty())
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ TMultiSet<std::pair<TString, TEvLocal::TEvTenantStatus::EStatus>> Statuses;
+};
+
+extern const TTenantTestConfig DefaultTenantTestConfig;
+
+bool IsTabletActiveEvent(IEventHandle& ev);
+
class TTenantTestRuntime : public TTestBasicRuntime {
-private:
+private:
void Setup(bool createTenantPools = true);
-
-public:
- TTenantTestRuntime(const TTenantTestConfig &config,
+
+public:
+ TTenantTestRuntime(const TTenantTestConfig &config,
const NKikimrConfig::TAppConfig &extension = {},
bool createTenantPools = true);
-
- void CreateTenantPool(ui32 nodeIndex);
- void CreateTenantPool(ui32 nodeIndex, const TTenantTestConfig::TTenantPoolConfig &config);
- void WaitForHiveState(const TVector<TEvTest::TEvWaitHiveState::TClientInfo> &state);
- void SendToBroker(IEventBase* event);
- void SendToConsole(IEventBase* event);
-
+
+ void CreateTenantPool(ui32 nodeIndex);
+ void CreateTenantPool(ui32 nodeIndex, const TTenantTestConfig::TTenantPoolConfig &config);
+ void WaitForHiveState(const TVector<TEvTest::TEvWaitHiveState::TClientInfo> &state);
+ void SendToBroker(IEventBase* event);
+ void SendToConsole(IEventBase* event);
+
TActorId Sender;
- TTenantTestConfig Config;
- NKikimrConfig::TAppConfig Extension;
- THashMap<TSubDomainKey, TString> SubDomainKeys;
-};
-
-NKikimrTenantPool::TSlotStatus MakeSlotStatus(const TString &id, const TString &type, const TString &tenant,
- ui64 cpu, ui64 memory, ui64 network, const TString &label = "");
-void CheckTenantPoolStatus(TTenantTestRuntime &runtime, ui32 domain,
- THashMap<TString, NKikimrTenantPool::TSlotStatus> status, ui32 nodeId = 0);
-
-} // namespace NKikimr
+ TTenantTestConfig Config;
+ NKikimrConfig::TAppConfig Extension;
+ THashMap<TSubDomainKey, TString> SubDomainKeys;
+};
+
+NKikimrTenantPool::TSlotStatus MakeSlotStatus(const TString &id, const TString &type, const TString &tenant,
+ ui64 cpu, ui64 memory, ui64 network, const TString &label = "");
+void CheckTenantPoolStatus(TTenantTestRuntime &runtime, ui32 domain,
+ THashMap<TString, NKikimrTenantPool::TSlotStatus> status, ui32 nodeId = 0);
+
+} // namespace NKikimr
diff --git a/ydb/core/testlib/test_client.cpp b/ydb/core/testlib/test_client.cpp
index e967d14dff8..d4907c26f1e 100644
--- a/ydb/core/testlib/test_client.cpp
+++ b/ydb/core/testlib/test_client.cpp
@@ -168,10 +168,10 @@ namespace Tests {
Runtime = MakeHolder<TTestBasicRuntime>(StaticNodes() + DynamicNodes(), Settings->UseRealThreads);
- if (!Settings->UseRealThreads)
+ if (!Settings->UseRealThreads)
Runtime->SetRegistrationObserverFunc([](TTestActorRuntimeBase& runtime, const TActorId&, const TActorId& actorId) {
- runtime.EnableScheduleForActor(actorId);
- });
+ runtime.EnableScheduleForActor(actorId);
+ });
for (auto& it: Settings->NodeKeys) {
ui32 nodeId = it.first;
@@ -309,7 +309,7 @@ namespace Tests {
GRpcServer->AddService(new NGRpcService::V1::TGRpcPersQueueService(system, counters, NMsgBusProxy::CreatePersQueueMetaCacheV2Id(), grpcRequestProxyId));
GRpcServer->AddService(new NGRpcService::TGRpcPQClusterDiscoveryService(system, counters, grpcRequestProxyId));
GRpcServer->AddService(new NKesus::TKesusGRpcService(system, counters, grpcRequestProxyId));
- GRpcServer->AddService(new NGRpcService::TGRpcCmsService(system, counters, grpcRequestProxyId));
+ GRpcServer->AddService(new NGRpcService::TGRpcCmsService(system, counters, grpcRequestProxyId));
GRpcServer->AddService(new NGRpcService::TGRpcDiscoveryService(system, counters, grpcRequestProxyId));
GRpcServer->AddService(new NGRpcService::TGRpcYdbExperimentalService(system, counters, grpcRequestProxyId));
GRpcServer->AddService(new NGRpcService::TGRpcYdbClickhouseInternalService(system, counters, appData.InFlightLimiterRegistry, grpcRequestProxyId));
@@ -370,7 +370,7 @@ namespace Tests {
CreateTestBootstrapper(*Runtime, CreateTestTabletInfo(ChangeStateStorage(Hive, domainId), TTabletTypes::FLAT_HIVE), &CreateDefaultHive);
CreateTestBootstrapper(*Runtime, CreateTestTabletInfo(MakeBSControllerID(domainId), TTabletTypes::FLAT_BS_CONTROLLER), &CreateFlatBsController);
CreateTestBootstrapper(*Runtime, CreateTestTabletInfo(MakeTenantSlotBrokerID(domainId), TTabletTypes::TENANT_SLOT_BROKER), &NTenantSlotBroker::CreateTenantSlotBroker);
- if (Settings->EnableConsole)
+ if (Settings->EnableConsole)
CreateTestBootstrapper(*Runtime, CreateTestTabletInfo(MakeConsoleID(domainId), TTabletTypes::CONSOLE), &NConsole::CreateConsole);
}
@@ -556,18 +556,18 @@ namespace Tests {
auto &appData = Runtime->GetAppData(nodeIdx);
SetupLocalConfig(*localConfig, appData);
- TTenantPoolConfig::TPtr tenantPoolConfig = new TTenantPoolConfig(localConfig);
- tenantPoolConfig->AddStaticSlot(domainName);
+ TTenantPoolConfig::TPtr tenantPoolConfig = new TTenantPoolConfig(localConfig);
+ tenantPoolConfig->AddStaticSlot(domainName);
- auto poolId = Runtime->Register(CreateTenantPool(tenantPoolConfig), nodeIdx, appData.SystemPoolId,
- TMailboxType::Revolving, 0);
- Runtime->RegisterService(MakeTenantPoolRootID(), poolId, nodeIdx);
- if (Settings->EnableConfigsDispatcher) {
+ auto poolId = Runtime->Register(CreateTenantPool(tenantPoolConfig), nodeIdx, appData.SystemPoolId,
+ TMailboxType::Revolving, 0);
+ Runtime->RegisterService(MakeTenantPoolRootID(), poolId, nodeIdx);
+ if (Settings->EnableConfigsDispatcher) {
auto *dispatcher = NConsole::CreateConfigsDispatcher(Settings->AppConfig);
- auto aid = Runtime->Register(dispatcher, nodeIdx, appData.SystemPoolId, TMailboxType::Revolving, 0);
- Runtime->RegisterService(NConsole::MakeConfigsDispatcherID(Runtime->GetNodeId(nodeIdx)), aid);
- }
- Runtime->Register(CreateLabelsMaintainer({}), nodeIdx, appData.SystemPoolId, TMailboxType::Revolving, 0);
+ auto aid = Runtime->Register(dispatcher, nodeIdx, appData.SystemPoolId, TMailboxType::Revolving, 0);
+ Runtime->RegisterService(NConsole::MakeConfigsDispatcherID(Runtime->GetNodeId(nodeIdx)), aid);
+ }
+ Runtime->Register(CreateLabelsMaintainer({}), nodeIdx, appData.SystemPoolId, TMailboxType::Revolving, 0);
auto sysViewService = NSysView::CreateSysViewServiceForTests();
TActorId sysViewServiceId = Runtime->Register(sysViewService.Release(), nodeIdx);
@@ -577,12 +577,12 @@ namespace Tests {
Runtime->Register(tenantPublisher, nodeIdx);
}
- void TServer::SetupConfigurators(ui32 nodeIdx) {
- auto &appData = Runtime->GetAppData(nodeIdx);
- Runtime->Register(NConsole::CreateImmediateControlsConfigurator(appData.Icb, Settings->Controls),
- nodeIdx, appData.SystemPoolId, TMailboxType::Revolving, 0);
- }
-
+ void TServer::SetupConfigurators(ui32 nodeIdx) {
+ auto &appData = Runtime->GetAppData(nodeIdx);
+ Runtime->Register(NConsole::CreateImmediateControlsConfigurator(appData.Icb, Settings->Controls),
+ nodeIdx, appData.SystemPoolId, TMailboxType::Revolving, 0);
+ }
+
void TServer::SetupProxies(ui32 nodeIdx) {
Runtime->SetTxAllocatorTabletIds({ChangeStateStorage(TxAllocator, Settings->Domain)});
{
diff --git a/ydb/core/testlib/test_client.h b/ydb/core/testlib/test_client.h
index 9347b8733ed..2064752ab45 100644
--- a/ydb/core/testlib/test_client.h
+++ b/ydb/core/testlib/test_client.h
@@ -83,7 +83,7 @@ namespace Tests {
using TPtr = TIntrusivePtr<TServerSettings>;
using TConstPtr = TIntrusiveConstPtr<TServerSettings>;
- using TControls = NKikimrConfig::TImmediateControlsConfig;
+ using TControls = NKikimrConfig::TImmediateControlsConfig;
using TLoggerInitializer = std::function<void (TTestActorRuntime&)>;
using TStoragePoolKinds = TDomainsInfo::TDomain::TStoragePoolKinds;
@@ -100,7 +100,7 @@ namespace Tests {
ui32 NodeCount = 1;
ui32 DynamicNodeCount = 0;
NFake::TStorage CustomDiskParams;
- TControls Controls;
+ TControls Controls;
TAppPrepare::TFnReg FrFactory = &DefaultFrFactory;
TIntrusivePtr<TFormatFactory> Formats;
bool EnableMockOnSingleNode = true;
@@ -108,9 +108,9 @@ namespace Tests {
TLoggerInitializer LoggerInitializer;
TStoragePoolKinds StoragePoolTypes;
TVector<NKikimrKqp::TKqpSetting> KqpSettings;
- bool EnableConsole = true;
- bool EnableConfigsDispatcher = true;
- bool UseRealThreads = true;
+ bool EnableConsole = true;
+ bool EnableConfigsDispatcher = true;
+ bool UseRealThreads = true;
bool EnableKqpSpilling = false;
bool EnableYq = false;
TDuration KeepSnapshotTimeout = TDuration::Zero();
@@ -136,7 +136,7 @@ namespace Tests {
TServerSettings& SetNodeCount(ui32 value) { NodeCount = value; return *this; }
TServerSettings& SetDynamicNodeCount(ui32 value) { DynamicNodeCount = value; return *this; }
TServerSettings& SetCustomDiskParams(const NFake::TStorage& value) { CustomDiskParams = value; return *this; }
- TServerSettings& SetControls(const TControls& value) { Controls = value; return *this; }
+ TServerSettings& SetControls(const TControls& value) { Controls = value; return *this; }
TServerSettings& SetFrFactory(const TAppPrepare::TFnReg& value) { FrFactory = value; return *this; }
TServerSettings& SetEnableMockOnSingleNode(bool value) { EnableMockOnSingleNode = value; return *this; }
TServerSettings& SetLogBackend(TAutoPtr<TLogBackend> value) { LogBackend = value; return *this; }
@@ -144,9 +144,9 @@ namespace Tests {
TServerSettings& AddStoragePoolType(const TString& poolKind, ui32 encryptionMode = 0);
TServerSettings& AddStoragePool(const TString& poolKind, const TString& poolName = {}, ui32 numGroups = 1, ui32 encryptionMode = 0);
TServerSettings& SetKqpSettings(const TVector<NKikimrKqp::TKqpSetting>& settings) { KqpSettings = settings; return *this; }
- TServerSettings& SetEnableConsole(bool value) { EnableConsole = value; return *this; }
- TServerSettings& SetEnableConfigsDispatcher(bool value) { EnableConfigsDispatcher = value; return *this; }
- TServerSettings& SetUseRealThreads(bool value) { UseRealThreads = value; return *this; }
+ TServerSettings& SetEnableConsole(bool value) { EnableConsole = value; return *this; }
+ TServerSettings& SetEnableConfigsDispatcher(bool value) { EnableConfigsDispatcher = value; return *this; }
+ TServerSettings& SetUseRealThreads(bool value) { UseRealThreads = value; return *this; }
TServerSettings& SetAppConfig(const NKikimrConfig::TAppConfig value) { AppConfig = value; return *this; }
TServerSettings& SetKeyFor(ui32 nodeId, TString keyValue) { NodeKeys[nodeId] = keyValue; return *this; }
TServerSettings& SetEnableKqpSpilling(bool value) { EnableKqpSpilling = value; return *this; }
@@ -200,7 +200,7 @@ namespace Tests {
void SetupLocalConfig(TLocalConfig &localConfig, const NKikimr::TAppData &appData);
void SetupDomainLocalService(ui32 nodeIdx);
void SetupLocalService(ui32 nodeIdx, const TString &domainName);
- void SetupConfigurators(ui32 nodeIdx);
+ void SetupConfigurators(ui32 nodeIdx);
void SetupProxies(ui32 nodeIdx);
void SetupLogging();
diff --git a/ydb/core/testlib/ya.make b/ydb/core/testlib/ya.make
index 09a7ab9c60b..137fa829f3a 100644
--- a/ydb/core/testlib/ya.make
+++ b/ydb/core/testlib/ya.make
@@ -18,8 +18,8 @@ SRCS(
tablet_flat_dummy.cpp
tablet_helpers.cpp
tablet_helpers.h
- tenant_runtime.cpp
- tenant_runtime.h
+ tenant_runtime.cpp
+ tenant_runtime.h
test_client.cpp
test_client.h
service_mocks/access_service_mock.h
diff --git a/ydb/core/tx/coordinator/coordinator_impl.cpp b/ydb/core/tx/coordinator/coordinator_impl.cpp
index c544ddc1dca..b4eeb184e29 100644
--- a/ydb/core/tx/coordinator/coordinator_impl.cpp
+++ b/ydb/core/tx/coordinator/coordinator_impl.cpp
@@ -316,7 +316,7 @@ void TTxCoordinator::TryInitMonCounters(const TActorContext &ctx) {
return;
auto &counters = AppData(ctx)->Counters;
- MonCounters.Coordinator = GetServiceCounters(counters, "coordinator");
+ MonCounters.Coordinator = GetServiceCounters(counters, "coordinator");
MonCounters.TxIn = MonCounters.Coordinator->GetCounter("TxIn", true);
MonCounters.TxPlanned = MonCounters.Coordinator->GetCounter("TxPlanned", true);
MonCounters.TxDeclined = MonCounters.Coordinator->GetCounter("TxDeclined", true);
diff --git a/ydb/core/tx/datashard/alter_table_unit.cpp b/ydb/core/tx/datashard/alter_table_unit.cpp
index 4e1c213a682..78786adae78 100644
--- a/ydb/core/tx/datashard/alter_table_unit.cpp
+++ b/ydb/core/tx/datashard/alter_table_unit.cpp
@@ -1,10 +1,10 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
+
////////////////////////////////////////////////////////////////////////////////
class TAlterMoveShadowUnit : public TExecutionUnit {
@@ -92,54 +92,54 @@ THolder<TExecutionUnit> CreateAlterMoveShadowUnit(TDataShard& dataShard, TPipeli
////////////////////////////////////////////////////////////////////////////////
-class TAlterTableUnit : public TExecutionUnit {
-public:
+class TAlterTableUnit : public TExecutionUnit {
+public:
TAlterTableUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TAlterTableUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TAlterTableUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TAlterTableUnit::TAlterTableUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::AlterTable, false, dataShard, pipeline)
-{
-}
-
-TAlterTableUnit::~TAlterTableUnit()
-{
-}
-
-bool TAlterTableUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TAlterTableUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- auto &schemeTx = tx->GetSchemeTx();
- if (!schemeTx.HasAlterTable())
- return EExecutionStatus::Executed;
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::AlterTable, false, dataShard, pipeline)
+{
+}
+
+TAlterTableUnit::~TAlterTableUnit()
+{
+}
+
+bool TAlterTableUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TAlterTableUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ auto &schemeTx = tx->GetSchemeTx();
+ if (!schemeTx.HasAlterTable())
+ return EExecutionStatus::Executed;
+
const auto& alterTableTx = schemeTx.GetAlterTable();
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
"Trying to ALTER TABLE at " << DataShard.TabletID()
<< " version " << alterTableTx.GetTableSchemaVersion());
-
+
TPathId tableId(DataShard.GetPathOwnerId(), alterTableTx.GetId_Deprecated());
if (alterTableTx.HasPathId()) {
auto& pathId = alterTableTx.GetPathId();
@@ -148,25 +148,25 @@ EExecutionStatus TAlterTableUnit::Execute(TOperation::TPtr op,
}
TUserTable::TPtr info = DataShard.AlterUserTable(ctx, txc, alterTableTx);
-
- DataShard.AddUserTable(tableId, info);
-
- BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE);
- op->Result()->SetStepOrderId(op->GetStepOrder().ToPair());
-
- return EExecutionStatus::ExecutedNoMoreRestarts;
-}
-
-void TAlterTableUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+
+ DataShard.AddUserTable(tableId, info);
+
+ BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE);
+ op->Result()->SetStepOrderId(op->GetStepOrder().ToPair());
+
+ return EExecutionStatus::ExecutedNoMoreRestarts;
+}
+
+void TAlterTableUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateAlterTableUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TAlterTableUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/backup_unit.cpp b/ydb/core/tx/datashard/backup_unit.cpp
index 33b590ea45d..002b3e74b2b 100644
--- a/ydb/core/tx/datashard/backup_unit.cpp
+++ b/ydb/core/tx/datashard/backup_unit.cpp
@@ -1,12 +1,12 @@
#include "export_iface.h"
#include "backup_restore_common.h"
-#include "execution_unit_ctors.h"
+#include "execution_unit_ctors.h"
#include "export_scan.h"
#include "export_s3.h"
-
-namespace NKikimr {
+
+namespace NKikimr {
namespace NDataShard {
-
+
class TBackupUnit : public TBackupRestoreUnitBase<TEvDataShard::TEvCancelBackup> {
using IBuffer = NExportScan::IBuffer;
@@ -14,34 +14,34 @@ protected:
bool IsRelevant(TActiveTransaction* tx) const override {
return tx->GetSchemeTx().HasBackup();
}
-
+
bool IsWaiting(TOperation::TPtr op) const override {
return op->IsWaitingForScan();
}
-
+
void SetWaiting(TOperation::TPtr op) override {
op->SetWaitingForScanFlag();
}
-
+
void ResetWaiting(TOperation::TPtr op) override {
op->ResetWaitingForScanFlag();
}
-
+
bool Run(TOperation::TPtr op, TTransactionContext& txc, const TActorContext& ctx) override {
TActiveTransaction* tx = dynamic_cast<TActiveTransaction*>(op.Get());
Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
+
Y_VERIFY(tx->GetSchemeTx().HasBackup());
const auto& backup = tx->GetSchemeTx().GetBackup();
-
+
const ui64 tableId = backup.GetTableId();
- Y_VERIFY(DataShard.GetUserTables().contains(tableId));
+ Y_VERIFY(DataShard.GetUserTables().contains(tableId));
const ui32 localTableId = DataShard.GetUserTables().at(tableId)->LocalTid;
Y_VERIFY(txc.DB.GetScheme().GetTableInfo(localTableId));
auto* appData = AppData(ctx);
-
+
std::shared_ptr<::NKikimr::NDataShard::IExport> exp;
if (backup.HasYTSettings()) {
auto* exportFactory = appData->DataShardExportFactory;
@@ -98,53 +98,53 @@ protected:
));
return true;
- }
-
+ }
+
bool HasResult(TOperation::TPtr op) const override {
return op->HasScanResult();
}
-
+
void ProcessResult(TOperation::TPtr op, const TActorContext&) override {
TActiveTransaction* tx = dynamic_cast<TActiveTransaction*>(op.Get());
Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
auto* result = CheckedCast<TExportScanProduct*>(op->ScanResult().Get());
auto* schemeOp = DataShard.FindSchemaTx(op->GetTxId());
-
+
schemeOp->Success = result->Success;
schemeOp->Error = std::move(result->Error);
schemeOp->BytesProcessed = result->BytesRead;
schemeOp->RowsProcessed = result->RowsRead;
-
+
op->SetScanResult(nullptr);
tx->SetScanTask(0);
- }
-
+ }
+
void Cancel(TActiveTransaction* tx, const TActorContext&) override {
if (!tx->GetScanTask()) {
return;
}
-
+
const ui64 tableId = tx->GetSchemeTx().GetBackup().GetTableId();
-
- Y_VERIFY(DataShard.GetUserTables().contains(tableId));
+
+ Y_VERIFY(DataShard.GetUserTables().contains(tableId));
const ui32 localTableId = DataShard.GetUserTables().at(tableId)->LocalTid;
-
- DataShard.CancelScan(localTableId, tx->GetScanTask());
- tx->SetScanTask(0);
- }
-
+
+ DataShard.CancelScan(localTableId, tx->GetScanTask());
+ tx->SetScanTask(0);
+ }
+
public:
TBackupUnit(TDataShard& self, TPipeline& pipeline)
: TBase(EExecutionUnitKind::Backup, self, pipeline)
{
}
-
+
}; // TBackupUnit
-
+
THolder<TExecutionUnit> CreateBackupUnit(TDataShard& self, TPipeline& pipeline) {
return THolder(new TBackupUnit(self, pipeline));
-}
-
+}
+
} // NDataShard
} // NKikimr
diff --git a/ydb/core/tx/datashard/build_and_wait_dependencies_unit.cpp b/ydb/core/tx/datashard/build_and_wait_dependencies_unit.cpp
index 1b02f367c83..7eb786866a9 100644
--- a/ydb/core/tx/datashard/build_and_wait_dependencies_unit.cpp
+++ b/ydb/core/tx/datashard/build_and_wait_dependencies_unit.cpp
@@ -1,40 +1,40 @@
-#include "datashard_impl.h"
+#include "datashard_impl.h"
#include "datashard_counters.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TBuildAndWaitDependenciesUnit : public TExecutionUnit {
-public:
+
+class TBuildAndWaitDependenciesUnit : public TExecutionUnit {
+public:
TBuildAndWaitDependenciesUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TBuildAndWaitDependenciesUnit() override;
-
+ TPipeline &pipeline);
+ ~TBuildAndWaitDependenciesUnit() override;
+
bool HasDirectBlockers(const TOperation::TPtr& op) const;
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
void BuildDependencies(const TOperation::TPtr &op);
-};
-
+};
+
TBuildAndWaitDependenciesUnit::TBuildAndWaitDependenciesUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::BuildAndWaitDependencies, false, dataShard, pipeline)
-{
-}
-
-TBuildAndWaitDependenciesUnit::~TBuildAndWaitDependenciesUnit()
-{
-}
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::BuildAndWaitDependencies, false, dataShard, pipeline)
+{
+}
+
+TBuildAndWaitDependenciesUnit::~TBuildAndWaitDependenciesUnit()
+{
+}
+
/**
* Returns true if operation has blockers that prevent it from starting
*/
@@ -45,35 +45,35 @@ bool TBuildAndWaitDependenciesUnit::HasDirectBlockers(const TOperation::TPtr& op
return !op->GetDependencies().empty() || !op->GetSpecialDependencies().empty();
}
-bool TBuildAndWaitDependenciesUnit::IsReadyToExecute(TOperation::TPtr op) const
-{
- // Dependencies were not built yet. Allow to execute to build dependencies.
- if (!op->IsWaitingDependencies())
+bool TBuildAndWaitDependenciesUnit::IsReadyToExecute(TOperation::TPtr op) const
+{
+ // Dependencies were not built yet. Allow to execute to build dependencies.
+ if (!op->IsWaitingDependencies())
return true;
-
+
// Perform fast checks for existing blockers
if (HasDirectBlockers(op))
return false;
// Looks like nothing else is preventing us from starting
- return true;
-}
-
-EExecutionStatus TBuildAndWaitDependenciesUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- // Build dependencies if not yet.
- if (!op->IsWaitingDependencies()) {
+ return true;
+}
+
+EExecutionStatus TBuildAndWaitDependenciesUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ // Build dependencies if not yet.
+ if (!op->IsWaitingDependencies()) {
BuildDependencies(op);
-
- // After dependencies are built we can add operation to active ops.
- // For planned operations it means we can load and process the next
- // one.
- Pipeline.AddActiveOp(op);
- Pipeline.AddExecuteBlocker(op);
- op->SetWaitingDependenciesFlag();
-
+
+ // After dependencies are built we can add operation to active ops.
+ // For planned operations it means we can load and process the next
+ // one.
+ Pipeline.AddActiveOp(op);
+ Pipeline.AddExecuteBlocker(op);
+ op->SetWaitingDependenciesFlag();
+
if (!op->IsImmediate()) {
if (Pipeline.RemoveProposeDelayer(op->GetTxId())) {
DataShard.CheckDelayedProposeQueue(ctx);
@@ -85,35 +85,35 @@ EExecutionStatus TBuildAndWaitDependenciesUnit::Execute(TOperation::TPtr op,
Pipeline.ActivateWaitingTxOps(ctx);
}
- if (!IsReadyToExecute(op)) {
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- if (tx) {
- // We should put conflicting tx into cache
- // or release its data.
- ui64 mem = tx->GetMemoryConsumption();
- if (DataShard.TryCaptureTxCache(mem)) {
- tx->SetTxCacheUsage(mem);
- } else {
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
- "TBuildAndWaitDependenciesUnit at " << DataShard.TabletID()
- << " released data for tx " << tx->GetTxId());
-
- DataShard.IncCounter(COUNTER_INACTIVE_TX_DATA_RELEASES);
- tx->ReleaseTxData(txc, ctx);
- }
- }
-
- DataShard.IncCounter(COUNTER_TX_WAIT_ORDER);
-
- return EExecutionStatus::Continue;
- }
- }
-
+ if (!IsReadyToExecute(op)) {
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ if (tx) {
+ // We should put conflicting tx into cache
+ // or release its data.
+ ui64 mem = tx->GetMemoryConsumption();
+ if (DataShard.TryCaptureTxCache(mem)) {
+ tx->SetTxCacheUsage(mem);
+ } else {
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TBuildAndWaitDependenciesUnit at " << DataShard.TabletID()
+ << " released data for tx " << tx->GetTxId());
+
+ DataShard.IncCounter(COUNTER_INACTIVE_TX_DATA_RELEASES);
+ tx->ReleaseTxData(txc, ctx);
+ }
+ }
+
+ DataShard.IncCounter(COUNTER_TX_WAIT_ORDER);
+
+ return EExecutionStatus::Continue;
+ }
+ }
+
DataShard.IncCounter(COUNTER_WAIT_DEPENDENCIES_LATENCY_MS, op->GetCurrentElapsedAndReset().MilliSeconds());
- op->ResetWaitingDependenciesFlag();
- op->MarkAsExecuting();
-
+ op->ResetWaitingDependenciesFlag();
+ op->MarkAsExecuting();
+
// Replicate legacy behavior when mvcc is not enabled
// When mvcc enabled we don't mark transactions until as late as possible
if (!DataShard.IsMvccEnabled()) {
@@ -131,9 +131,9 @@ EExecutionStatus TBuildAndWaitDependenciesUnit::Execute(TOperation::TPtr op,
}
}
- return EExecutionStatus::Executed;
-}
-
+ return EExecutionStatus::Executed;
+}
+
void TBuildAndWaitDependenciesUnit::BuildDependencies(const TOperation::TPtr &op) {
TMicrosecTimerCounter measureBuildDependencies(DataShard, COUNTER_BUILD_DEPENDENCIES_USEC);
@@ -168,16 +168,16 @@ void TBuildAndWaitDependenciesUnit::BuildDependencies(const TOperation::TPtr &op
op->ResetCurrentTimer();
}
-void TBuildAndWaitDependenciesUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+void TBuildAndWaitDependenciesUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateBuildAndWaitDependenciesUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TBuildAndWaitDependenciesUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/build_data_tx_out_rs_unit.cpp b/ydb/core/tx/datashard/build_data_tx_out_rs_unit.cpp
index 78de939b3a5..cd8d3dab69a 100644
--- a/ydb/core/tx/datashard/build_data_tx_out_rs_unit.cpp
+++ b/ydb/core/tx/datashard/build_data_tx_out_rs_unit.cpp
@@ -1,54 +1,54 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-#include "setup_sys_locks.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+#include "setup_sys_locks.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NMiniKQL;
-
-class TBuildDataTxOutRSUnit : public TExecutionUnit {
-public:
+
+using namespace NMiniKQL;
+
+class TBuildDataTxOutRSUnit : public TExecutionUnit {
+public:
TBuildDataTxOutRSUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TBuildDataTxOutRSUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TBuildDataTxOutRSUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TBuildDataTxOutRSUnit::TBuildDataTxOutRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::BuildDataTxOutRS, true, dataShard, pipeline)
-{
-}
-
-TBuildDataTxOutRSUnit::~TBuildDataTxOutRSUnit()
-{
-}
-
-bool TBuildDataTxOutRSUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TBuildDataTxOutRSUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- TSetupSysLocks guardLocks(op, DataShard);
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- DataShard.ReleaseCache(*tx);
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::BuildDataTxOutRS, true, dataShard, pipeline)
+{
+}
+
+TBuildDataTxOutRSUnit::~TBuildDataTxOutRSUnit()
+{
+}
+
+bool TBuildDataTxOutRSUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TBuildDataTxOutRSUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ TSetupSysLocks guardLocks(op, DataShard);
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ DataShard.ReleaseCache(*tx);
+
if (tx->IsTxDataReleased()) {
switch (Pipeline.RestoreDataTx(tx, txc, ctx)) {
case ERestoreDataStatus::Ok:
@@ -59,72 +59,72 @@ EExecutionStatus TBuildDataTxOutRSUnit::Execute(TOperation::TPtr op,
Y_FAIL("Failed to restore tx data: %s", tx->GetDataTx()->GetErrors().c_str());
}
}
-
+
tx->GetDataTx()->SetReadVersion(DataShard.GetReadWriteVersions(tx).ReadVersion);
- IEngineFlat *engine = tx->GetDataTx()->GetEngine();
- try {
- auto &outReadSets = op->OutReadSets();
-
- if (tx->GetDataTx()->CheckCancelled())
- engine->Cancel();
- else
- engine->SetMemoryLimit(txc.GetMemoryLimit() - tx->GetDataTx()->GetTxSize());
-
- op->OutReadSets().clear();
-
- auto result = engine->PrepareOutgoingReadsets();
- Y_VERIFY_S(result == IEngineFlat::EResult::Ok,
- "Engine errors at " << DataShard.TabletID() << " for " << *op
- << ": " << engine->GetErrors());
-
- outReadSets.clear();
- for (ui32 i = 0, e = engine->GetOutgoingReadsetsCount(); i < e; ++i) {
- auto rs = engine->GetOutgoingReadset(i);
- outReadSets[std::make_pair(rs.OriginShardId, rs.TargetShardId)] = rs.Body;
- }
-
- engine->AfterOutgoingReadsetsExtracted();
- } catch (const TMemoryLimitExceededException &) {
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Operation " << *op << " at " << DataShard.TabletID()
- << " exceeded memory limit " << txc.GetMemoryLimit()
- << " and requests " << txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR
- << " more for the next try");
-
+ IEngineFlat *engine = tx->GetDataTx()->GetEngine();
+ try {
+ auto &outReadSets = op->OutReadSets();
+
+ if (tx->GetDataTx()->CheckCancelled())
+ engine->Cancel();
+ else
+ engine->SetMemoryLimit(txc.GetMemoryLimit() - tx->GetDataTx()->GetTxSize());
+
+ op->OutReadSets().clear();
+
+ auto result = engine->PrepareOutgoingReadsets();
+ Y_VERIFY_S(result == IEngineFlat::EResult::Ok,
+ "Engine errors at " << DataShard.TabletID() << " for " << *op
+ << ": " << engine->GetErrors());
+
+ outReadSets.clear();
+ for (ui32 i = 0, e = engine->GetOutgoingReadsetsCount(); i < e; ++i) {
+ auto rs = engine->GetOutgoingReadset(i);
+ outReadSets[std::make_pair(rs.OriginShardId, rs.TargetShardId)] = rs.Body;
+ }
+
+ engine->AfterOutgoingReadsetsExtracted();
+ } catch (const TMemoryLimitExceededException &) {
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Operation " << *op << " at " << DataShard.TabletID()
+ << " exceeded memory limit " << txc.GetMemoryLimit()
+ << " and requests " << txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR
+ << " more for the next try");
+
txc.NotEnoughMemory();
DataShard.IncCounter(DataShard.NotEnoughMemoryCounter(txc.GetNotEnoughMemoryCount()));
- engine->ReleaseUnusedMemory();
- txc.RequestMemory(txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
-
- tx->ReleaseTxData(txc, ctx);
-
- return EExecutionStatus::Restart;
- } catch (const TNotReadyTabletException&) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Tablet " << DataShard.TabletID() << " is not ready for " << *op
- << " execution");
-
+ engine->ReleaseUnusedMemory();
+ txc.RequestMemory(txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
+
+ tx->ReleaseTxData(txc, ctx);
+
+ return EExecutionStatus::Restart;
+ } catch (const TNotReadyTabletException&) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Tablet " << DataShard.TabletID() << " is not ready for " << *op
+ << " execution");
+
DataShard.IncCounter(COUNTER_TX_TABLET_NOT_READY);
- tx->ReleaseTxData(txc, ctx);
-
- return EExecutionStatus::Restart;
- }
-
- return EExecutionStatus::Executed;
-}
-
-void TBuildDataTxOutRSUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ tx->ReleaseTxData(txc, ctx);
+
+ return EExecutionStatus::Restart;
+ }
+
+ return EExecutionStatus::Executed;
+}
+
+void TBuildDataTxOutRSUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateBuildDataTxOutRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TBuildDataTxOutRSUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/build_kqp_data_tx_out_rs_unit.cpp b/ydb/core/tx/datashard/build_kqp_data_tx_out_rs_unit.cpp
index 0ef178ef37c..50a3c1f4013 100644
--- a/ydb/core/tx/datashard/build_kqp_data_tx_out_rs_unit.cpp
+++ b/ydb/core/tx/datashard/build_kqp_data_tx_out_rs_unit.cpp
@@ -1,54 +1,54 @@
-#include "datashard_impl.h"
-#include "datashard_kqp.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-#include "setup_sys_locks.h"
-
+#include "datashard_impl.h"
+#include "datashard_kqp.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+#include "setup_sys_locks.h"
+
#include <ydb/core/kqp/rm/kqp_rm.h>
-namespace NKikimr {
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NMiniKQL;
-
+
+using namespace NMiniKQL;
+
#define LOG_T(stream) LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD, stream)
#define LOG_D(stream) LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD, stream)
#define LOG_E(stream) LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD, stream)
#define LOG_C(stream) LOG_CRIT_S(ctx, NKikimrServices::TX_DATASHARD, stream)
#define LOG_W(stream) LOG_WARN_S(ctx, NKikimrServices::TX_DATASHARD, stream)
-class TBuildKqpDataTxOutRSUnit : public TExecutionUnit {
-public:
+class TBuildKqpDataTxOutRSUnit : public TExecutionUnit {
+public:
TBuildKqpDataTxOutRSUnit(TDataShard& dataShard, TPipeline& pipeline);
- ~TBuildKqpDataTxOutRSUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
+ ~TBuildKqpDataTxOutRSUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
EExecutionStatus Execute(TOperation::TPtr op, TTransactionContext& txc, const TActorContext& ctx) override;
void Complete(TOperation::TPtr op, const TActorContext& ctx) override;
private:
EExecutionStatus OnTabletNotReady(TActiveTransaction& tx, TValidatedDataTx& dataTx, TTransactionContext& txc,
const TActorContext& ctx);
-};
-
+};
+
TBuildKqpDataTxOutRSUnit::TBuildKqpDataTxOutRSUnit(TDataShard& dataShard, TPipeline& pipeline)
: TExecutionUnit(EExecutionUnitKind::BuildKqpDataTxOutRS, true, dataShard, pipeline) {}
-
+
TBuildKqpDataTxOutRSUnit::~TBuildKqpDataTxOutRSUnit() {}
-
+
bool TBuildKqpDataTxOutRSUnit::IsReadyToExecute(TOperation::TPtr) const {
- return true;
-}
-
+ return true;
+}
+
EExecutionStatus TBuildKqpDataTxOutRSUnit::Execute(TOperation::TPtr op, TTransactionContext& txc,
const TActorContext& ctx)
{
- TSetupSysLocks guardLocks(op, DataShard);
+ TSetupSysLocks guardLocks(op, DataShard);
TActiveTransaction* tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- DataShard.ReleaseCache(*tx);
-
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ DataShard.ReleaseCache(*tx);
+
if (tx->IsTxDataReleased()) {
switch (Pipeline.RestoreDataTx(tx, txc, ctx)) {
case ERestoreDataStatus::Ok:
@@ -59,7 +59,7 @@ EExecutionStatus TBuildKqpDataTxOutRSUnit::Execute(TOperation::TPtr op, TTransac
Y_FAIL("Failed to restore tx data: %s", tx->GetDataTx()->GetErrors().c_str());
}
}
-
+
const auto& dataTx = tx->GetDataTx();
ui64 tabletId = DataShard.TabletID();
@@ -73,7 +73,7 @@ EExecutionStatus TBuildKqpDataTxOutRSUnit::Execute(TOperation::TPtr op, TTransac
return EExecutionStatus::Executed;
}
- try {
+ try {
const auto& kqpTx = dataTx->GetKqpTransaction();
auto& tasksRunner = dataTx->GetKqpTasksRunner();
@@ -101,7 +101,7 @@ EExecutionStatus TBuildKqpDataTxOutRSUnit::Execute(TOperation::TPtr op, TTransac
return OnTabletNotReady(*tx, *dataTx, txc, ctx);
}
}
-
+
KqpFillOutReadSets(op->OutReadSets(), kqpTx, tasksRunner, DataShard.SysLocksTable(), tabletId);
} catch (const TMemoryLimitExceededException&) {
LOG_T("Operation " << *op << " at " << tabletId
@@ -130,13 +130,13 @@ EExecutionStatus TBuildKqpDataTxOutRSUnit::Execute(TOperation::TPtr op, TTransac
} else {
Y_FAIL_S("Unexpected exception in KQP out-readsets prepare: " << e.what());
}
- }
-
- return EExecutionStatus::Executed;
-}
-
+ }
+
+ return EExecutionStatus::Executed;
+}
+
void TBuildKqpDataTxOutRSUnit::Complete(TOperation::TPtr, const TActorContext&) {}
-
+
EExecutionStatus TBuildKqpDataTxOutRSUnit::OnTabletNotReady(TActiveTransaction& tx, TValidatedDataTx& dataTx,
TTransactionContext& txc, const TActorContext& ctx)
{
@@ -153,7 +153,7 @@ EExecutionStatus TBuildKqpDataTxOutRSUnit::OnTabletNotReady(TActiveTransaction&
THolder<TExecutionUnit> CreateBuildKqpDataTxOutRSUnit(TDataShard& dataShard, TPipeline& pipeline) {
return THolder(new TBuildKqpDataTxOutRSUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/build_scheme_tx_out_rs_unit.cpp b/ydb/core/tx/datashard/build_scheme_tx_out_rs_unit.cpp
index aa7f28f3576..7f632531577 100644
--- a/ydb/core/tx/datashard/build_scheme_tx_out_rs_unit.cpp
+++ b/ydb/core/tx/datashard/build_scheme_tx_out_rs_unit.cpp
@@ -1,56 +1,56 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TBuildSchemeTxOutRSUnit : public TExecutionUnit {
-public:
+
+class TBuildSchemeTxOutRSUnit : public TExecutionUnit {
+public:
TBuildSchemeTxOutRSUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TBuildSchemeTxOutRSUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TBuildSchemeTxOutRSUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TBuildSchemeTxOutRSUnit::TBuildSchemeTxOutRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::BuildSchemeTxOutRS, false, dataShard, pipeline)
-{
-}
-
-TBuildSchemeTxOutRSUnit::~TBuildSchemeTxOutRSUnit()
-{
-}
-
-bool TBuildSchemeTxOutRSUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TBuildSchemeTxOutRSUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- auto &schemeTx = tx->GetSchemeTx();
- if (!schemeTx.HasSendSnapshot())
- return EExecutionStatus::Executed;
-
- Y_VERIFY(!op->InputSnapshots().empty(), "Snapshots expected");
-
- auto &outReadSets = op->OutReadSets();
- ui64 srcTablet = DataShard.TabletID();
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::BuildSchemeTxOutRS, false, dataShard, pipeline)
+{
+}
+
+TBuildSchemeTxOutRSUnit::~TBuildSchemeTxOutRSUnit()
+{
+}
+
+bool TBuildSchemeTxOutRSUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TBuildSchemeTxOutRSUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ auto &schemeTx = tx->GetSchemeTx();
+ if (!schemeTx.HasSendSnapshot())
+ return EExecutionStatus::Executed;
+
+ Y_VERIFY(!op->InputSnapshots().empty(), "Snapshots expected");
+
+ auto &outReadSets = op->OutReadSets();
+ ui64 srcTablet = DataShard.TabletID();
const auto& snapshot = schemeTx.GetSendSnapshot();
ui64 targetTablet = snapshot.GetSendTo(0).GetShard();
@@ -59,15 +59,15 @@ EExecutionStatus TBuildSchemeTxOutRSUnit::Execute(TOperation::TPtr op,
Y_VERIFY(DataShard.GetPathOwnerId() == snapshot.GetTableId().GetOwnerId());
tableId = snapshot.GetTableId().GetTableId();
}
- Y_VERIFY(DataShard.GetUserTables().contains(tableId));
- ui32 localTableId = DataShard.GetUserTables().at(tableId)->LocalTid;
-
- for (auto &snapshot : op->InputSnapshots()) {
- TString snapBody = DataShard.BorrowSnapshot(localTableId, *snapshot, { }, { }, targetTablet);
- txc.Env.DropSnapshot(snapshot);
-
- Y_VERIFY(snapBody, "Failed to make full borrow snap. w/o tx restarts");
-
+ Y_VERIFY(DataShard.GetUserTables().contains(tableId));
+ ui32 localTableId = DataShard.GetUserTables().at(tableId)->LocalTid;
+
+ for (auto &snapshot : op->InputSnapshots()) {
+ TString snapBody = DataShard.BorrowSnapshot(localTableId, *snapshot, { }, { }, targetTablet);
+ txc.Env.DropSnapshot(snapshot);
+
+ Y_VERIFY(snapBody, "Failed to make full borrow snap. w/o tx restarts");
+
TString rsBody;
bool extended = false;
@@ -124,23 +124,23 @@ EExecutionStatus TBuildSchemeTxOutRSUnit::Execute(TOperation::TPtr op,
}
outReadSets[std::make_pair(srcTablet, targetTablet)] = rsBody;
- }
-
- op->InputSnapshots().clear();
-
- return EExecutionStatus::Executed;
-}
-
-void TBuildSchemeTxOutRSUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ }
+
+ op->InputSnapshots().clear();
+
+ return EExecutionStatus::Executed;
+}
+
+void TBuildSchemeTxOutRSUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateBuildSchemeTxOutRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return MakeHolder<TBuildSchemeTxOutRSUnit>(dataShard, pipeline);
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/check_data_tx_unit.cpp b/ydb/core/tx/datashard/check_data_tx_unit.cpp
index f43d7acd36f..deb9f1f903a 100644
--- a/ydb/core/tx/datashard/check_data_tx_unit.cpp
+++ b/ydb/core/tx/datashard/check_data_tx_unit.cpp
@@ -1,89 +1,89 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
#include <ydb/core/tablet/tablet_exception.h>
-
-namespace NKikimr {
+
+namespace NKikimr {
namespace NDataShard {
-
-class TCheckDataTxUnit : public TExecutionUnit {
-public:
+
+class TCheckDataTxUnit : public TExecutionUnit {
+public:
TCheckDataTxUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TCheckDataTxUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TCheckDataTxUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TCheckDataTxUnit::TCheckDataTxUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::CheckDataTx, false, dataShard, pipeline)
-{
-}
-
-TCheckDataTxUnit::~TCheckDataTxUnit()
-{
-}
-
-bool TCheckDataTxUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TCheckDataTxUnit::Execute(TOperation::TPtr op,
- TTransactionContext &,
- const TActorContext &ctx)
-{
- Y_VERIFY(op->IsDataTx() || op->IsReadTable());
- Y_VERIFY(!op->IsAborted());
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::CheckDataTx, false, dataShard, pipeline)
+{
+}
+
+TCheckDataTxUnit::~TCheckDataTxUnit()
+{
+}
+
+bool TCheckDataTxUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TCheckDataTxUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &,
+ const TActorContext &ctx)
+{
+ Y_VERIFY(op->IsDataTx() || op->IsReadTable());
+ Y_VERIFY(!op->IsAborted());
+
if (CheckRejectDataTx(op, ctx)) {
op->Abort(EExecutionUnitKind::FinishPropose);
return EExecutionStatus::Executed;
}
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
- auto dataTx = tx->GetDataTx();
- Y_VERIFY(dataTx);
- Y_VERIFY(dataTx->Ready() || dataTx->RequirePrepare());
-
- if (dataTx->Ready()) {
- DataShard.IncCounter(COUNTER_MINIKQL_PROGRAM_SIZE, dataTx->ProgramSize());
- } else {
- Y_VERIFY(dataTx->RequirePrepare());
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Require prepare Tx " << op->GetTxId() << " at " << DataShard.TabletID()
- << ": " << dataTx->GetErrors());
- }
-
- // Check if we are out of space and tx wants to update user
- // or system table.
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+ auto dataTx = tx->GetDataTx();
+ Y_VERIFY(dataTx);
+ Y_VERIFY(dataTx->Ready() || dataTx->RequirePrepare());
+
+ if (dataTx->Ready()) {
+ DataShard.IncCounter(COUNTER_MINIKQL_PROGRAM_SIZE, dataTx->ProgramSize());
+ } else {
+ Y_VERIFY(dataTx->RequirePrepare());
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Require prepare Tx " << op->GetTxId() << " at " << DataShard.TabletID()
+ << ": " << dataTx->GetErrors());
+ }
+
+ // Check if we are out of space and tx wants to update user
+ // or system table.
if (DataShard.IsAnyChannelYellowStop()
- && (dataTx->HasWrites() || !op->IsImmediate())) {
- TString err = TStringBuilder()
- << "Cannot perform transaction: out of disk space at tablet "
- << DataShard.TabletID() << " txId " << op->GetTxId();
-
- DataShard.IncCounter(COUNTER_PREPARE_OUT_OF_SPACE);
-
- BuildResult(op)->AddError(NKikimrTxDataShard::TError::OUT_OF_SPACE, err);
- op->Abort(EExecutionUnitKind::FinishPropose);
-
- LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD, err);
-
- return EExecutionStatus::Executed;
- }
-
+ && (dataTx->HasWrites() || !op->IsImmediate())) {
+ TString err = TStringBuilder()
+ << "Cannot perform transaction: out of disk space at tablet "
+ << DataShard.TabletID() << " txId " << op->GetTxId();
+
+ DataShard.IncCounter(COUNTER_PREPARE_OUT_OF_SPACE);
+
+ BuildResult(op)->AddError(NKikimrTxDataShard::TError::OUT_OF_SPACE, err);
+ op->Abort(EExecutionUnitKind::FinishPropose);
+
+ LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD, err);
+
+ return EExecutionStatus::Executed;
+ }
+
if (tx->IsMvccSnapshotRead()) {
auto snapshot = tx->GetMvccSnapshot();
if (!DataShard.IsMvccEnabled()) {
@@ -113,42 +113,42 @@ EExecutionStatus TCheckDataTxUnit::Execute(TOperation::TPtr op,
}
}
- TEngineBay::TSizes txReads;
-
- if (op->IsDataTx()) {
- bool hasTotalKeysSizeLimit = !!dataTx->PerShardKeysSizeLimitBytes();
- txReads = dataTx->CalcReadSizes(hasTotalKeysSizeLimit);
-
- if (txReads.ReadSize > DataShard.GetTxReadSizeLimit()) {
- TString err = TStringBuilder()
- << "Transaction read size " << txReads.ReadSize << " exceeds limit "
- << DataShard.GetTxReadSizeLimit() << " at tablet " << DataShard.TabletID()
- << " txId " << op->GetTxId();
-
- BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::BAD_REQUEST)
- ->AddError(NKikimrTxDataShard::TError::READ_SIZE_EXECEEDED, err);
- op->Abort(EExecutionUnitKind::FinishPropose);
-
- LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD, err);
-
- return EExecutionStatus::Executed;
- }
-
- if (hasTotalKeysSizeLimit
- && txReads.TotalKeysSize > *dataTx->PerShardKeysSizeLimitBytes()) {
- TString err = TStringBuilder()
- << "Transaction total keys size " << txReads.TotalKeysSize
- << " exceeds limit " << *dataTx->PerShardKeysSizeLimitBytes()
- << " at tablet " << DataShard.TabletID() << " txId " << op->GetTxId();
-
- BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::BAD_REQUEST)
- ->AddError(NKikimrTxDataShard::TError::READ_SIZE_EXECEEDED, err);
- op->Abort(EExecutionUnitKind::FinishPropose);
-
- LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD, err);
-
- return EExecutionStatus::Executed;
- }
+ TEngineBay::TSizes txReads;
+
+ if (op->IsDataTx()) {
+ bool hasTotalKeysSizeLimit = !!dataTx->PerShardKeysSizeLimitBytes();
+ txReads = dataTx->CalcReadSizes(hasTotalKeysSizeLimit);
+
+ if (txReads.ReadSize > DataShard.GetTxReadSizeLimit()) {
+ TString err = TStringBuilder()
+ << "Transaction read size " << txReads.ReadSize << " exceeds limit "
+ << DataShard.GetTxReadSizeLimit() << " at tablet " << DataShard.TabletID()
+ << " txId " << op->GetTxId();
+
+ BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::BAD_REQUEST)
+ ->AddError(NKikimrTxDataShard::TError::READ_SIZE_EXECEEDED, err);
+ op->Abort(EExecutionUnitKind::FinishPropose);
+
+ LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD, err);
+
+ return EExecutionStatus::Executed;
+ }
+
+ if (hasTotalKeysSizeLimit
+ && txReads.TotalKeysSize > *dataTx->PerShardKeysSizeLimitBytes()) {
+ TString err = TStringBuilder()
+ << "Transaction total keys size " << txReads.TotalKeysSize
+ << " exceeds limit " << *dataTx->PerShardKeysSizeLimitBytes()
+ << " at tablet " << DataShard.TabletID() << " txId " << op->GetTxId();
+
+ BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::BAD_REQUEST)
+ ->AddError(NKikimrTxDataShard::TError::READ_SIZE_EXECEEDED, err);
+ op->Abort(EExecutionUnitKind::FinishPropose);
+
+ LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD, err);
+
+ return EExecutionStatus::Executed;
+ }
for (const auto& key : dataTx->TxInfo().Keys) {
if (key.IsWrite && DataShard.IsUserTable(key.Key->TableId)) {
@@ -158,12 +158,12 @@ EExecutionStatus TCheckDataTxUnit::Execute(TOperation::TPtr op,
}
if (keySize > NLimits::MaxWriteKeySize) {
TString err = TStringBuilder()
- << "Operation " << *op << " writes key of " << keySize
+ << "Operation " << *op << " writes key of " << keySize
<< " bytes which exceeds limit " << NLimits::MaxWriteKeySize
- << " bytes at " << DataShard.TabletID();
+ << " bytes at " << DataShard.TabletID();
- BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::BAD_REQUEST)
- ->AddError(NKikimrTxDataShard::TError::BAD_ARGUMENT, err);
+ BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::BAD_REQUEST)
+ ->AddError(NKikimrTxDataShard::TError::BAD_ARGUMENT, err);
op->Abort(EExecutionUnitKind::FinishPropose);
LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD, err);
@@ -213,8 +213,8 @@ EExecutionStatus TCheckDataTxUnit::Execute(TOperation::TPtr op,
}
}
}
- }
-
+ }
+
if (op->IsReadTable()) {
const auto& record = dataTx->GetReadTableTransaction();
const auto& userTables = DataShard.GetUserTables();
@@ -275,51 +275,51 @@ EExecutionStatus TCheckDataTxUnit::Execute(TOperation::TPtr op,
}
}
- if (!op->IsImmediate()) {
- if (!Pipeline.AssignPlanInterval(op)) {
- TString err = TStringBuilder()
- << "Can't propose tx " << op->GetTxId() << " at blocked shard "
- << DataShard.TabletID();
- BuildResult(op)->AddError(NKikimrTxDataShard::TError::SHARD_IS_BLOCKED, err);
- op->Abort(EExecutionUnitKind::FinishPropose);
-
- LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD, err);
-
- return EExecutionStatus::Executed;
- }
-
- auto &res = BuildResult(op);
- res->SetPrepared(op->GetMinStep(), op->GetMaxStep(), op->GetReceivedAt());
-
- if (op->IsDataTx()) {
- res->Record.SetReadSize(txReads.ReadSize);
- res->Record.SetReplySize(txReads.ReplySize);
-
- for (const auto& rs : txReads.OutReadSetSize) {
- auto entry = res->Record.AddOutgoingReadSetInfo();
- entry->SetShardId(rs.first);
- entry->SetSize(rs.second);
- }
- }
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Prepared " << op->GetKind() << " transaction txId " << op->GetTxId()
- << " at tablet " << DataShard.TabletID());
- }
-
- return EExecutionStatus::Executed;
-}
-
-void TCheckDataTxUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ if (!op->IsImmediate()) {
+ if (!Pipeline.AssignPlanInterval(op)) {
+ TString err = TStringBuilder()
+ << "Can't propose tx " << op->GetTxId() << " at blocked shard "
+ << DataShard.TabletID();
+ BuildResult(op)->AddError(NKikimrTxDataShard::TError::SHARD_IS_BLOCKED, err);
+ op->Abort(EExecutionUnitKind::FinishPropose);
+
+ LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD, err);
+
+ return EExecutionStatus::Executed;
+ }
+
+ auto &res = BuildResult(op);
+ res->SetPrepared(op->GetMinStep(), op->GetMaxStep(), op->GetReceivedAt());
+
+ if (op->IsDataTx()) {
+ res->Record.SetReadSize(txReads.ReadSize);
+ res->Record.SetReplySize(txReads.ReplySize);
+
+ for (const auto& rs : txReads.OutReadSetSize) {
+ auto entry = res->Record.AddOutgoingReadSetInfo();
+ entry->SetShardId(rs.first);
+ entry->SetSize(rs.second);
+ }
+ }
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Prepared " << op->GetKind() << " transaction txId " << op->GetTxId()
+ << " at tablet " << DataShard.TabletID());
+ }
+
+ return EExecutionStatus::Executed;
+}
+
+void TCheckDataTxUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateCheckDataTxUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TCheckDataTxUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/check_scheme_tx_unit.cpp b/ydb/core/tx/datashard/check_scheme_tx_unit.cpp
index 4928763386c..bbba1c6d95d 100644
--- a/ydb/core/tx/datashard/check_scheme_tx_unit.cpp
+++ b/ydb/core/tx/datashard/check_scheme_tx_unit.cpp
@@ -1,33 +1,33 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
#include <ydb/core/tablet/tablet_exception.h>
-
-namespace NKikimr {
+
+namespace NKikimr {
namespace NDataShard {
-
-class TCheckSchemeTxUnit : public TExecutionUnit {
-public:
+
+class TCheckSchemeTxUnit : public TExecutionUnit {
+public:
TCheckSchemeTxUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TCheckSchemeTxUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
- bool CheckSchemeTx(TActiveTransaction *activeTx);
- bool CheckCreate(TActiveTransaction *activeTx);
- bool CheckDrop(TActiveTransaction *activeTx);
- bool CheckAlter(TActiveTransaction *activeTx);
- bool CheckBackup(TActiveTransaction *activeTx);
+ TPipeline &pipeline);
+ ~TCheckSchemeTxUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+ bool CheckSchemeTx(TActiveTransaction *activeTx);
+ bool CheckCreate(TActiveTransaction *activeTx);
+ bool CheckDrop(TActiveTransaction *activeTx);
+ bool CheckAlter(TActiveTransaction *activeTx);
+ bool CheckBackup(TActiveTransaction *activeTx);
bool CheckRestore(TActiveTransaction *activeTx);
- bool CheckCopy(TActiveTransaction *activeTx);
+ bool CheckCopy(TActiveTransaction *activeTx);
bool CheckCreatePersistentSnapshot(TActiveTransaction *activeTx);
bool CheckDropPersistentSnapshot(TActiveTransaction *activeTx);
bool CheckInitiateBuildIndex(TActiveTransaction *activeTx);
@@ -48,34 +48,34 @@ private:
template <typename T> TPathId GetPathId(const T &op) const;
template <typename T> bool CheckSchemaVersion(TActiveTransaction *activeTx, ui64 tableId, const T &op);
template <typename T> bool CheckSchemaVersion(TActiveTransaction *activeTx, const T &op);
-};
-
+};
+
TCheckSchemeTxUnit::TCheckSchemeTxUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::CheckSchemeTx, false, dataShard, pipeline)
-{
-}
-
-TCheckSchemeTxUnit::~TCheckSchemeTxUnit()
-{
-}
-
-bool TCheckSchemeTxUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TCheckSchemeTxUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- Y_VERIFY(op->IsSchemeTx());
- Y_VERIFY(!op->IsAborted());
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::CheckSchemeTx, false, dataShard, pipeline)
+{
+}
+
+TCheckSchemeTxUnit::~TCheckSchemeTxUnit()
+{
+}
+
+bool TCheckSchemeTxUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TCheckSchemeTxUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ Y_VERIFY(op->IsSchemeTx());
+ Y_VERIFY(!op->IsAborted());
+
Pipeline.RemoveWaitingSchemeOp(op);
- TActiveTransaction *activeTx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(activeTx, "cannot cast operation of kind " << op->GetKind());
+ TActiveTransaction *activeTx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(activeTx, "cannot cast operation of kind " << op->GetKind());
const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
bool unfreezeTx = false;
if (tx.HasAlterTable() && tx.GetAlterTable().HasPartitionConfig() &&
@@ -84,28 +84,28 @@ EExecutionStatus TCheckSchemeTxUnit::Execute(TOperation::TPtr op,
auto cmd = tx.GetAlterTable().GetPartitionConfig().GetFreezeState();
unfreezeTx = cmd == NKikimrSchemeOp::EFreezeState::Unfreeze;
}
-
- // Check state is proper for scheme transactions.
+
+ // Check state is proper for scheme transactions.
if (!DataShard.IsStateActive() || (DataShard.IsStateFrozen() && !unfreezeTx)) {
- TString error = TStringBuilder()
- << "Wrong shard state for scheme transaction at tablet "
- << DataShard.TabletID() << " state: " << DataShard.GetState() << " txId: "
- << op->GetTxId() << " ssId: " << activeTx->GetSchemeShardId();
-
- BuildResult(op)->SetProcessError(NKikimrTxDataShard::TError::WRONG_SHARD_STATE,
- error);
- op->Abort(EExecutionUnitKind::FinishPropose);
-
- LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD, error);
-
- return EExecutionStatus::Executed;
- }
-
- TSchemeOpSeqNo seqNo(tx.GetSeqNo());
- TSchemeOpSeqNo lastSeqNo = DataShard.GetLastSchemeOpSeqNo();
-
- // Check if scheme tx is outdated.
- if (lastSeqNo > seqNo) {
+ TString error = TStringBuilder()
+ << "Wrong shard state for scheme transaction at tablet "
+ << DataShard.TabletID() << " state: " << DataShard.GetState() << " txId: "
+ << op->GetTxId() << " ssId: " << activeTx->GetSchemeShardId();
+
+ BuildResult(op)->SetProcessError(NKikimrTxDataShard::TError::WRONG_SHARD_STATE,
+ error);
+ op->Abort(EExecutionUnitKind::FinishPropose);
+
+ LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD, error);
+
+ return EExecutionStatus::Executed;
+ }
+
+ TSchemeOpSeqNo seqNo(tx.GetSeqNo());
+ TSchemeOpSeqNo lastSeqNo = DataShard.GetLastSchemeOpSeqNo();
+
+ // Check if scheme tx is outdated.
+ if (lastSeqNo > seqNo) {
TString error = TStringBuilder()
<< "Ignoring outdated schema Tx proposal at tablet "
<< DataShard.TabletID() << " txId " << op->GetTxId()
@@ -113,23 +113,23 @@ EExecutionStatus TCheckSchemeTxUnit::Execute(TOperation::TPtr op,
<< " seqNo " << seqNo.Generation << ":" << seqNo.Round
<< " lastSeqNo " << lastSeqNo.Generation << ":"
<< lastSeqNo.Round;
-
+
LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, error);
BuildResult(op)->SetProcessError(NKikimrTxDataShard::TError::SCHEME_CHANGED, error);
- op->Abort(EExecutionUnitKind::FinishPropose);
-
- return EExecutionStatus::Executed;
- }
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Propose scheme transaction at tablet " << DataShard.TabletID()
- << " txId " << op->GetTxId() << " ssId " << activeTx->GetSchemeShardId()
- << " seqNo " << seqNo.Generation << ":" << seqNo.Round);
-
- // Preserve new seqno to correctly filter out tx duplicates.
- DataShard.UpdateLastSchemeOpSeqNo(seqNo, txc);
-
+ op->Abort(EExecutionUnitKind::FinishPropose);
+
+ return EExecutionStatus::Executed;
+ }
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Propose scheme transaction at tablet " << DataShard.TabletID()
+ << " txId " << op->GetTxId() << " ssId " << activeTx->GetSchemeShardId()
+ << " seqNo " << seqNo.Generation << ":" << seqNo.Round);
+
+ // Preserve new seqno to correctly filter out tx duplicates.
+ DataShard.UpdateLastSchemeOpSeqNo(seqNo, txc);
+
if (seqNo > lastSeqNo) {
// Activate older scheme ops, they are expected to fail seqno check
Pipeline.ActivateWaitingSchemeOps(ctx);
@@ -181,14 +181,14 @@ EExecutionStatus TCheckSchemeTxUnit::Execute(TOperation::TPtr op,
return EExecutionStatus::ExecutedNoMoreRestarts;
}
- // Check scheme tx content.
- if (!CheckSchemeTx(activeTx)) {
- Y_VERIFY(op->Result());
- op->Abort(EExecutionUnitKind::FinishPropose);
-
+ // Check scheme tx content.
+ if (!CheckSchemeTx(activeTx)) {
+ Y_VERIFY(op->Result());
+ op->Abort(EExecutionUnitKind::FinishPropose);
+
return EExecutionStatus::ExecutedNoMoreRestarts;
- }
-
+ }
+
if (!op->IsReadOnly() && DataShard.TxPlanWaiting() > 0) {
// We must wait until there are no transactions waiting for plan
Pipeline.AddWaitingSchemeOp(op);
@@ -196,17 +196,17 @@ EExecutionStatus TCheckSchemeTxUnit::Execute(TOperation::TPtr op,
}
op->SetMinStep(Pipeline.AllowedSchemaStep());
- op->SetMaxStep(Max<ui64>());
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Prepared scheme transaction txId " << op->GetTxId() << " at tablet "
- << DataShard.TabletID());
-
- BuildResult(op)->SetPrepared(op->GetMinStep(), op->GetMaxStep(), op->GetReceivedAt());
-
+ op->SetMaxStep(Max<ui64>());
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Prepared scheme transaction txId " << op->GetTxId() << " at tablet "
+ << DataShard.TabletID());
+
+ BuildResult(op)->SetPrepared(op->GetMinStep(), op->GetMaxStep(), op->GetReceivedAt());
+
return EExecutionStatus::ExecutedNoMoreRestarts;
-}
-
+}
+
bool TCheckSchemeTxUnit::CheckSchemaVersion(TActiveTransaction *activeTx,
ui64 proposedSchemaVersion, ui64 currentSchemaVersion, ui64 expectedSchemaVersion)
{
@@ -312,12 +312,12 @@ bool TCheckSchemeTxUnit::CheckSchemaVersion(TActiveTransaction *activeTx, const
return CheckSchemaVersion(activeTx, GetPathId(op).LocalPathId, op);
}
-bool TCheckSchemeTxUnit::CheckSchemeTx(TActiveTransaction *activeTx)
-{
- const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
-
+bool TCheckSchemeTxUnit::CheckSchemeTx(TActiveTransaction *activeTx)
+{
+ const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
+
bool res = false;
- switch (activeTx->GetSchemeTxType()) {
+ switch (activeTx->GetSchemeTxType()) {
case TSchemaOperation::ETypeCreate:
res = CheckCreate(activeTx);
break;
@@ -363,73 +363,73 @@ bool TCheckSchemeTxUnit::CheckSchemeTx(TActiveTransaction *activeTx)
case TSchemaOperation::ETypeDropCdcStream:
res = CheckDropCdcStream(activeTx);
break;
- default:
- LOG_ERROR_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Unknown scheme tx type detected at tablet "
- << DataShard.TabletID() << " txId " << activeTx->GetTxId()
- << " txBody " << tx.ShortDebugString());
- BuildResult(activeTx, NKikimrTxDataShard::TEvProposeTransactionResult::ERROR);
- }
-
+ default:
+ LOG_ERROR_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Unknown scheme tx type detected at tablet "
+ << DataShard.TabletID() << " txId " << activeTx->GetTxId()
+ << " txBody " << tx.ShortDebugString());
+ BuildResult(activeTx, NKikimrTxDataShard::TEvProposeTransactionResult::ERROR);
+ }
+
return res;
-}
-
-bool TCheckSchemeTxUnit::CheckCreate(TActiveTransaction *activeTx) {
- const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
-
+}
+
+bool TCheckSchemeTxUnit::CheckCreate(TActiveTransaction *activeTx) {
+ const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
+
if (HasDuplicate(activeTx, "Create", &TPipeline::HasCreate)) {
- return false;
- }
-
+ return false;
+ }
+
const auto &create = tx.GetCreateTable();
ui64 tableId = create.GetId_Deprecated();
if (create.HasPathId()) {
Y_VERIFY(DataShard.GetPathOwnerId() == create.GetPathId().GetOwnerId() || DataShard.GetPathOwnerId() == INVALID_TABLET_ID);
tableId = create.GetPathId().GetLocalId();
}
-
+
Y_VERIFY(!DataShard.GetUserTables().contains(tableId));
- return true;
-}
-
-bool TCheckSchemeTxUnit::CheckDrop(TActiveTransaction *activeTx) {
- const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
-
+ return true;
+}
+
+bool TCheckSchemeTxUnit::CheckDrop(TActiveTransaction *activeTx) {
+ const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
+
if (HasDuplicate(activeTx, "Drop", &TPipeline::HasDrop)) {
- return false;
- }
-
- const auto &drop = tx.GetDropTable();
+ return false;
+ }
+
+ const auto &drop = tx.GetDropTable();
ui64 tableId = drop.GetId_Deprecated();
if (drop.HasPathId()) {
Y_VERIFY(DataShard.GetPathOwnerId() == drop.GetPathId().GetOwnerId());
tableId = drop.GetPathId().GetLocalId();
}
Y_VERIFY(DataShard.GetUserTables().FindPtr(tableId));
-
- return true;
-}
-
-bool TCheckSchemeTxUnit::CheckAlter(TActiveTransaction *activeTx)
-{
- const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
- Y_VERIFY(!Pipeline.HasDrop());
-
+
+ return true;
+}
+
+bool TCheckSchemeTxUnit::CheckAlter(TActiveTransaction *activeTx)
+{
+ const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
+ Y_VERIFY(!Pipeline.HasDrop());
+
const TStringBuf kind = "Alter";
if (HasDuplicate(activeTx, kind, &TPipeline::HasAlter)) {
- return false;
- }
-
+ return false;
+ }
+
const THashMap<TString, TPipelineHasSmthFunc> conflicting = {
{"Backup", &TPipeline::HasBackup},
{"Restore", &TPipeline::HasRestore},
};
if (HasConflicts(activeTx, kind, conflicting)) {
- return false;
- }
-
- const auto &alter = tx.GetAlterTable();
+ return false;
+ }
+
+ const auto &alter = tx.GetAlterTable();
const ui64 proposedSchemaVersion = alter.HasTableSchemaVersion() ? alter.GetTableSchemaVersion() : 0;
if (alter.HasPartitionConfig() && alter.GetPartitionConfig().HasFreezeState()) {
@@ -482,63 +482,63 @@ bool TCheckSchemeTxUnit::CheckAlter(TActiveTransaction *activeTx)
Y_VERIFY(DataShard.GetPathOwnerId() == alter.GetPathId().GetOwnerId());
tableId = alter.GetPathId().GetLocalId();
}
-
+
const auto tablePtr = DataShard.GetUserTables().FindPtr(tableId);
Y_VERIFY_S(tablePtr, "tableId: " << tableId);
const TUserTable &table = **tablePtr;
auto curSchemaVersion = table.GetTableSchemaVersion();
- for (const auto &col : alter.GetColumns()) {
- Y_VERIFY(col.HasId());
- Y_VERIFY(col.HasTypeId());
- Y_VERIFY(col.HasName());
-
- ui32 colId = col.GetId();
- if (table.Columns.contains(colId)) {
- const TUserTable::TUserColumn &column = table.Columns.at(colId);
- Y_VERIFY(column.Name == col.GetName());
- Y_VERIFY(column.Type == col.GetTypeId());
- Y_VERIFY(col.HasFamily());
- }
- }
-
- for (const auto &col : alter.GetDropColumns()) {
- ui32 colId = col.GetId();
- const TUserTable::TUserColumn *userColumn = table.Columns.FindPtr(colId);
- Y_VERIFY(userColumn);
- Y_VERIFY(userColumn->Name == col.GetName());
- }
-
+ for (const auto &col : alter.GetColumns()) {
+ Y_VERIFY(col.HasId());
+ Y_VERIFY(col.HasTypeId());
+ Y_VERIFY(col.HasName());
+
+ ui32 colId = col.GetId();
+ if (table.Columns.contains(colId)) {
+ const TUserTable::TUserColumn &column = table.Columns.at(colId);
+ Y_VERIFY(column.Name == col.GetName());
+ Y_VERIFY(column.Type == col.GetTypeId());
+ Y_VERIFY(col.HasFamily());
+ }
+ }
+
+ for (const auto &col : alter.GetDropColumns()) {
+ ui32 colId = col.GetId();
+ const TUserTable::TUserColumn *userColumn = table.Columns.FindPtr(colId);
+ Y_VERIFY(userColumn);
+ Y_VERIFY(userColumn->Name == col.GetName());
+ }
+
auto res = CheckSchemaVersion(activeTx, proposedSchemaVersion, curSchemaVersion, curSchemaVersion + 1);
Y_VERIFY_DEBUG(res, "Unexpected schema version mutation");
- return true;
-}
-
-bool TCheckSchemeTxUnit::CheckBackup(TActiveTransaction *activeTx)
-{
- const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
- Y_VERIFY(!Pipeline.HasDrop());
-
+ return true;
+}
+
+bool TCheckSchemeTxUnit::CheckBackup(TActiveTransaction *activeTx)
+{
+ const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
+ Y_VERIFY(!Pipeline.HasDrop());
+
const TStringBuf kind = "Backup";
if (HasDuplicate(activeTx, kind, &TPipeline::HasBackup)) {
- return false;
- }
-
+ return false;
+ }
+
const THashMap<TString, TPipelineHasSmthFunc> conflicting = {
{"Alter", &TPipeline::HasAlter},
{"Restore", &TPipeline::HasRestore},
};
if (HasConflicts(activeTx, kind, conflicting)) {
- return false;
- }
-
- const auto &backup = tx.GetBackup();
- Y_VERIFY(DataShard.GetUserTables().contains(backup.GetTableId()));
-
- return true;
-}
-
+ return false;
+ }
+
+ const auto &backup = tx.GetBackup();
+ Y_VERIFY(DataShard.GetUserTables().contains(backup.GetTableId()));
+
+ return true;
+}
+
bool TCheckSchemeTxUnit::CheckRestore(TActiveTransaction *activeTx)
{
const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
@@ -563,24 +563,24 @@ bool TCheckSchemeTxUnit::CheckRestore(TActiveTransaction *activeTx)
return true;
}
-bool TCheckSchemeTxUnit::CheckCopy(TActiveTransaction *activeTx) {
- const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
-
+bool TCheckSchemeTxUnit::CheckCopy(TActiveTransaction *activeTx) {
+ const NKikimrTxDataShard::TFlatSchemeTransaction &tx = activeTx->GetSchemeTx();
+
if (HasDuplicate(activeTx, "Copy", &TPipeline::HasCopy)) {
- return false;
- }
-
- const auto &snap = tx.GetSendSnapshot();
+ return false;
+ }
+
+ const auto &snap = tx.GetSendSnapshot();
ui64 tableId = snap.GetTableId_Deprecated();
if (snap.HasTableId()) {
Y_VERIFY(DataShard.GetPathOwnerId() == snap.GetTableId().GetOwnerId());
tableId = snap.GetTableId().GetTableId();
}
Y_VERIFY(DataShard.GetUserTables().contains(tableId));
-
- return true;
-}
-
+
+ return true;
+}
+
bool TCheckSchemeTxUnit::CheckCreatePersistentSnapshot(TActiveTransaction *activeTx) {
const auto& tx = activeTx->GetSchemeTx();
@@ -711,16 +711,16 @@ bool TCheckSchemeTxUnit::CheckDropCdcStream(TActiveTransaction *activeTx) {
return CheckSchemaVersion(activeTx, notice);
}
-void TCheckSchemeTxUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+void TCheckSchemeTxUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateCheckSchemeTxUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TCheckSchemeTxUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/complete_data_tx_unit.cpp b/ydb/core/tx/datashard/complete_data_tx_unit.cpp
index cf525fc270a..c086fa70119 100644
--- a/ydb/core/tx/datashard/complete_data_tx_unit.cpp
+++ b/ydb/core/tx/datashard/complete_data_tx_unit.cpp
@@ -1,129 +1,129 @@
-#include "datashard_failpoints.h"
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
+#include "datashard_failpoints.h"
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
#include <ydb/core/engine/minikql/minikql_engine_host.h>
-
-namespace NKikimr {
+
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NMiniKQL;
-
-class TCompleteOperationUnit : public TExecutionUnit {
-public:
+
+using namespace NMiniKQL;
+
+class TCompleteOperationUnit : public TExecutionUnit {
+public:
TCompleteOperationUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TCompleteOperationUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
- void CompleteOperation(TOperation::TPtr op,
- const TActorContext &ctx);
-};
-
+ TPipeline &pipeline);
+ ~TCompleteOperationUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+ void CompleteOperation(TOperation::TPtr op,
+ const TActorContext &ctx);
+};
+
TCompleteOperationUnit::TCompleteOperationUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::CompleteOperation, false, dataShard, pipeline)
-{
-}
-
-TCompleteOperationUnit::~TCompleteOperationUnit()
-{
-}
-
-bool TCompleteOperationUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TCompleteOperationUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- Pipeline.DeactivateOp(op, txc, ctx);
-
- TOutputOpData::TResultPtr &result = op->Result();
- if (result) {
- auto execLatency = op->GetCompletedAt() - op->GetStartExecutionAt();
- result->Record.SetExecLatency(execLatency.MilliSeconds());
- }
-
- if (op->IsDirty()) {
- DataShard.IncCounter(COUNTER_TX_PROGRESS_DIRTY);
- CompleteOperation(op, ctx);
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::CompleteOperation, false, dataShard, pipeline)
+{
+}
+
+TCompleteOperationUnit::~TCompleteOperationUnit()
+{
+}
+
+bool TCompleteOperationUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TCompleteOperationUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ Pipeline.DeactivateOp(op, txc, ctx);
+
+ TOutputOpData::TResultPtr &result = op->Result();
+ if (result) {
+ auto execLatency = op->GetCompletedAt() - op->GetStartExecutionAt();
+ result->Record.SetExecLatency(execLatency.MilliSeconds());
+ }
+
+ if (op->IsDirty()) {
+ DataShard.IncCounter(COUNTER_TX_PROGRESS_DIRTY);
+ CompleteOperation(op, ctx);
} else if (result) {
Pipeline.AddCompletingOp(op);
- }
-
+ }
+
// TODO: release snapshot used by a planned tx (not currently used)
// TODO: prepared txs may be cancelled until planned, in which case we may
// end up with a dangling snapshot reference. Such references would have
// to be handled in a restart-safe manner too.
Y_VERIFY_DEBUG(!op->HasAcquiredSnapshotKey());
- return EExecutionStatus::DelayComplete;
-}
-
-void TCompleteOperationUnit::CompleteOperation(TOperation::TPtr op,
- const TActorContext &ctx)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- auto duration = TAppData::TimeProvider->Now() - op->GetStartExecutionAt();
-
- if (DataShard.GetDataTxProfileLogThresholdMs()
- && duration.MilliSeconds() >= DataShard.GetDataTxProfileLogThresholdMs()) {
- LOG_WARN_S(ctx, NKikimrServices::TX_DATASHARD,
- op->ExecutionProfileLogString(DataShard.TabletID()));
- }
-
- if (DataShard.GetDataTxProfileBufferThresholdMs()
- && duration.MilliSeconds() >= DataShard.GetDataTxProfileBufferThresholdMs()) {
- Pipeline.HoldExecutionProfile(op);
- }
-
+ return EExecutionStatus::DelayComplete;
+}
+
+void TCompleteOperationUnit::CompleteOperation(TOperation::TPtr op,
+ const TActorContext &ctx)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ auto duration = TAppData::TimeProvider->Now() - op->GetStartExecutionAt();
+
+ if (DataShard.GetDataTxProfileLogThresholdMs()
+ && duration.MilliSeconds() >= DataShard.GetDataTxProfileLogThresholdMs()) {
+ LOG_WARN_S(ctx, NKikimrServices::TX_DATASHARD,
+ op->ExecutionProfileLogString(DataShard.TabletID()));
+ }
+
+ if (DataShard.GetDataTxProfileBufferThresholdMs()
+ && duration.MilliSeconds() >= DataShard.GetDataTxProfileBufferThresholdMs()) {
+ Pipeline.HoldExecutionProfile(op);
+ }
+
TOutputOpData::TResultPtr result = std::move(op->Result());
- if (result) {
- result->Record.SetProposeLatency(duration.MilliSeconds());
-
+ if (result) {
+ result->Record.SetProposeLatency(duration.MilliSeconds());
+
DataShard.FillExecutionStats(op->GetExecutionProfile(), *result);
- if (!gSkipRepliesFailPoint.Check(DataShard.TabletID(), op->GetTxId()))
- DataShard.SendResult(ctx, result, op->GetTarget(), op->GetStep(), op->GetTxId());
- }
+ if (!gSkipRepliesFailPoint.Check(DataShard.TabletID(), op->GetTxId()))
+ DataShard.SendResult(ctx, result, op->GetTarget(), op->GetStep(), op->GetTxId());
+ }
Pipeline.RemoveCompletingOp(op);
-}
-
-void TCompleteOperationUnit::Complete(TOperation::TPtr op,
- const TActorContext &ctx)
-{
+}
+
+void TCompleteOperationUnit::Complete(TOperation::TPtr op,
+ const TActorContext &ctx)
+{
Pipeline.RemoveCommittingOp(op);
- Pipeline.RemoveTx(op->GetStepOrder());
- DataShard.IncCounter(COUNTER_PLANNED_TX_COMPLETE);
- if (!op->IsDirty())
- CompleteOperation(op, ctx);
-
- DataShard.SendDelayedAcks(ctx, op->DelayedAcks());
- if (op->IsSchemeTx())
- DataShard.NotifySchemeshard(ctx, op->GetTxId());
+ Pipeline.RemoveTx(op->GetStepOrder());
+ DataShard.IncCounter(COUNTER_PLANNED_TX_COMPLETE);
+ if (!op->IsDirty())
+ CompleteOperation(op, ctx);
+
+ DataShard.SendDelayedAcks(ctx, op->DelayedAcks());
+ if (op->IsSchemeTx())
+ DataShard.NotifySchemeshard(ctx, op->GetTxId());
DataShard.EnqueueChangeRecords(std::move(op->ChangeRecords()));
-}
-
+}
+
THolder<TExecutionUnit> CreateCompleteOperationUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TCompleteOperationUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/completed_operations_unit.cpp b/ydb/core/tx/datashard/completed_operations_unit.cpp
index 51552ac1710..eddc70a13ee 100644
--- a/ydb/core/tx/datashard/completed_operations_unit.cpp
+++ b/ydb/core/tx/datashard/completed_operations_unit.cpp
@@ -1,60 +1,60 @@
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TCompletedOperationsUnit : public TExecutionUnit {
-public:
+
+class TCompletedOperationsUnit : public TExecutionUnit {
+public:
TCompletedOperationsUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TCompletedOperationsUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TCompletedOperationsUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TCompletedOperationsUnit::TCompletedOperationsUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::CompletedOperations, false, dataShard, pipeline)
-{
-}
-
-TCompletedOperationsUnit::~TCompletedOperationsUnit()
-{
-}
-
-bool TCompletedOperationsUnit::IsReadyToExecute(TOperation::TPtr op) const
-{
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::CompletedOperations, false, dataShard, pipeline)
+{
+}
+
+TCompletedOperationsUnit::~TCompletedOperationsUnit()
+{
+}
+
+bool TCompletedOperationsUnit::IsReadyToExecute(TOperation::TPtr op) const
+{
Y_UNUSED(op);
- return true;
-}
-
-EExecutionStatus TCompletedOperationsUnit::Execute(TOperation::TPtr op,
- TTransactionContext &,
- const TActorContext &)
-{
- Pipeline.RemoveActiveOp(op);
-
- return EExecutionStatus::Executed;
-}
-
-void TCompletedOperationsUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ return true;
+}
+
+EExecutionStatus TCompletedOperationsUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &,
+ const TActorContext &)
+{
+ Pipeline.RemoveActiveOp(op);
+
+ return EExecutionStatus::Executed;
+}
+
+void TCompletedOperationsUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateCompletedOperationsUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TCompletedOperationsUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/const.h b/ydb/core/tx/datashard/const.h
index a1e4db75380..d49d3d6fa55 100644
--- a/ydb/core/tx/datashard/const.h
+++ b/ydb/core/tx/datashard/const.h
@@ -1,20 +1,20 @@
-#pragma once
-
-#include "defs.h"
-
-namespace NKikimr {
+#pragma once
+
+#include "defs.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-constexpr ui64 INVALID_TABLET_ID = Max<ui64>();
-constexpr ui64 MEMORY_REQUEST_FACTOR = 8;
-
-// TODO: make configurable
-constexpr ui64 MAX_REORDER_TX_KEYS = 100;
-
+
+constexpr ui64 INVALID_TABLET_ID = Max<ui64>();
+constexpr ui64 MEMORY_REQUEST_FACTOR = 8;
+
+// TODO: make configurable
+constexpr ui64 MAX_REORDER_TX_KEYS = 100;
+
namespace NLimits {
static constexpr ui64 MaxWriteKeySize = 1024 * 1024 + 1024; // 1MB + small delta (for old ugc tests)
static constexpr ui64 MaxWriteValueSize = 16 * 1024 * 1024; // 16MB
}
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/create_table_unit.cpp b/ydb/core/tx/datashard/create_table_unit.cpp
index dcab0ec229b..85f38d456a3 100644
--- a/ydb/core/tx/datashard/create_table_unit.cpp
+++ b/ydb/core/tx/datashard/create_table_unit.cpp
@@ -1,53 +1,53 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TCreateTableUnit : public TExecutionUnit {
-public:
+
+class TCreateTableUnit : public TExecutionUnit {
+public:
TCreateTableUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TCreateTableUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
+ TPipeline &pipeline);
+ ~TCreateTableUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
TVector<THolder<TEvChangeExchange::TEvAddSender>> AddSenders;
-};
-
+};
+
TCreateTableUnit::TCreateTableUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::CreateTable, false, dataShard, pipeline)
-{
-}
-
-TCreateTableUnit::~TCreateTableUnit()
-{
-}
-
-bool TCreateTableUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TCreateTableUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::CreateTable, false, dataShard, pipeline)
+{
+}
+
+TCreateTableUnit::~TCreateTableUnit()
+{
+}
+
+bool TCreateTableUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TCreateTableUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
const auto &schemeTx = tx->GetSchemeTx();
- if (!schemeTx.HasCreateTable())
- return EExecutionStatus::Executed;
-
+ if (!schemeTx.HasCreateTable())
+ return EExecutionStatus::Executed;
+
const auto &createTableTx = schemeTx.GetCreateTable();
TPathId tableId(DataShard.GetPathOwnerId(), createTableTx.GetId_Deprecated());
@@ -58,14 +58,14 @@ EExecutionStatus TCreateTableUnit::Execute(TOperation::TPtr op,
const ui64 schemaVersion = createTableTx.HasTableSchemaVersion() ? createTableTx.GetTableSchemaVersion() : 0u;
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
"Trying to CREATE TABLE at " << DataShard.TabletID()
<< " tableId# " << tableId
<< " schema version# " << schemaVersion);
-
+
TUserTable::TPtr info = DataShard.CreateUserTable(txc, schemeTx.GetCreateTable());
- DataShard.AddUserTable(tableId, info);
-
+ DataShard.AddUserTable(tableId, info);
+
for (const auto& [indexPathId, indexInfo] : info->Indexes) {
if (indexInfo.Type == NKikimrSchemeOp::EIndexType::EIndexTypeGlobalAsync) {
AddSenders.emplace_back(new TEvChangeExchange::TEvAddSender(
@@ -74,32 +74,32 @@ EExecutionStatus TCreateTableUnit::Execute(TOperation::TPtr op,
}
}
- BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE);
- op->Result()->SetStepOrderId(op->GetStepOrder().ToPair());
-
- if (DataShard.GetState() == TShardState::WaitScheme) {
- txc.DB.NoMoreReadsForTx();
- DataShard.SetPersistState(TShardState::Ready, txc);
+ BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE);
+ op->Result()->SetStepOrderId(op->GetStepOrder().ToPair());
+
+ if (DataShard.GetState() == TShardState::WaitScheme) {
+ txc.DB.NoMoreReadsForTx();
+ DataShard.SetPersistState(TShardState::Ready, txc);
DataShard.CheckMvccStateChangeCanStart(ctx); // Recheck
- }
-
+ }
+
return EExecutionStatus::DelayCompleteNoMoreRestarts;
-}
-
+}
+
void TCreateTableUnit::Complete(TOperation::TPtr, const TActorContext &ctx)
-{
+{
for (auto& ev : AddSenders) {
ctx.Send(DataShard.GetChangeSender(), ev.Release());
}
DataShard.MaybeActivateChangeSender(ctx);
-}
-
+}
+
THolder<TExecutionUnit> CreateCreateTableUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TCreateTableUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/datashard.cpp b/ydb/core/tx/datashard/datashard.cpp
index 717a19ffa94..d86568b4a15 100644
--- a/ydb/core/tx/datashard/datashard.cpp
+++ b/ydb/core/tx/datashard/datashard.cpp
@@ -5,7 +5,7 @@
#include <ydb/core/engine/minikql/flat_local_tx_factory.h>
#include <ydb/core/scheme/scheme_tablecell.h>
#include <ydb/core/tablet/tablet_counters_protobuf.h>
-
+
#include <library/cpp/monlib/service/pages/templates.h>
#include <contrib/libs/apache/arrow/cpp/src/arrow/api.h>
@@ -19,16 +19,16 @@ IActor* CreateDataShard(const TActorId &tablet, TTabletStorageInfo *info) {
namespace NDataShard {
using namespace NSchemeShard;
-using namespace NTabletFlatExecutor;
-
-// NOTE: We really want to batch log records by default in datashards!
-// But in unittests we want to test both scenarios
-bool gAllowLogBatchingDefaultValue = true;
-
-TDuration gDbStatsReportInterval = TDuration::Seconds(10);
-ui64 gDbStatsDataSizeResolution = 10*1024*1024;
-ui64 gDbStatsRowCountResolution = 100000;
-
+using namespace NTabletFlatExecutor;
+
+// NOTE: We really want to batch log records by default in datashards!
+// But in unittests we want to test both scenarios
+bool gAllowLogBatchingDefaultValue = true;
+
+TDuration gDbStatsReportInterval = TDuration::Seconds(10);
+ui64 gDbStatsDataSizeResolution = 10*1024*1024;
+ui64 gDbStatsRowCountResolution = 100000;
+
// The first byte is 0x01 so it would fail to parse as an internal tablet protobuf
TStringBuf SnapshotTransferReadSetMagic("\x01SRS", 4);
@@ -92,50 +92,50 @@ public:
TDataShard::TDataShard(const TActorId &tablet, TTabletStorageInfo *info)
- : TActor(&TThis::StateInit)
+ : TActor(&TThis::StateInit)
, TTabletExecutedFlat(info, tablet, new TDataShardMiniKQLFactory(this))
- , PipeClientCacheConfig(new NTabletPipe::TBoundedClientCacheConfig())
- , PipeClientCache(NTabletPipe::CreateBoundedClientCache(PipeClientCacheConfig, GetPipeClientConfig()))
- , ResendReadSetPipeTracker(*PipeClientCache)
+ , PipeClientCacheConfig(new NTabletPipe::TBoundedClientCacheConfig())
+ , PipeClientCache(NTabletPipe::CreateBoundedClientCache(PipeClientCacheConfig, GetPipeClientConfig()))
+ , ResendReadSetPipeTracker(*PipeClientCache)
, SchemeShardPipeRetryPolicy({})
, PathOwnerId(INVALID_TABLET_ID)
, CurrentSchemeShardId(INVALID_TABLET_ID)
- , LastKnownMediator(INVALID_TABLET_ID)
- , RegistrationSended(false)
- , LoanReturnTracker(info->TabletID)
+ , LastKnownMediator(INVALID_TABLET_ID)
+ , RegistrationSended(false)
+ , LoanReturnTracker(info->TabletID)
, MvccSwitchState(TSwitchState::READY)
- , SplitSnapshotStarted(false)
+ , SplitSnapshotStarted(false)
, SplitSrcSnapshotSender(this)
- , DstSplitOpId(0)
- , SrcSplitOpId(0)
- , State(TShardState::Uninitialized)
- , LastLocalTid(Schema::MinLocalTid)
- , LastSeqno(1)
+ , DstSplitOpId(0)
+ , SrcSplitOpId(0)
+ , State(TShardState::Uninitialized)
+ , LastLocalTid(Schema::MinLocalTid)
+ , LastSeqno(1)
, NextChangeRecordOrder(1)
, LastChangeRecordGroup(1)
- , TxReadSizeLimit(0)
- , StatisticsDisabled(0)
+ , TxReadSizeLimit(0)
+ , StatisticsDisabled(0)
, DisabledKeySampler(new NMiniKQL::TNoopKeySampler())
, EnabledKeySampler(new TDatashardKeySampler(*this))
, CurrentKeySampler(DisabledKeySampler)
- , TransQueue(this)
- , OutReadSets(this)
- , Pipeline(this)
- , SysLocks(this)
+ , TransQueue(this)
+ , OutReadSets(this)
+ , Pipeline(this)
+ , SysLocks(this)
, SnapshotManager(this)
, SchemaSnapshotManager(this)
- , DisableByKeyFilter(0, 0, 1)
- , MaxTxInFly(15000, 0, 100000)
- , MaxTxLagMilliseconds(5*60*1000, 0, 30*24*3600*1000ll)
- , CanCancelROWithReadSets(0, 0, 1)
- , PerShardReadSizeLimit(5368709120, 0, 107374182400)
+ , DisableByKeyFilter(0, 0, 1)
+ , MaxTxInFly(15000, 0, 100000)
+ , MaxTxLagMilliseconds(5*60*1000, 0, 30*24*3600*1000ll)
+ , CanCancelROWithReadSets(0, 0, 1)
+ , PerShardReadSizeLimit(5368709120, 0, 107374182400)
, CpuUsageReportThreshlodPercent(60, -1, 146)
, CpuUsageReportIntervalSeconds(60, 0, 365*86400)
, HighDataSizeReportThreshlodBytes(10ull<<30, -1, Max<i64>())
, HighDataSizeReportIntervalSeconds(60, 0, 365*86400)
- , DataTxProfileLogThresholdMs(0, 0, 86400000)
- , DataTxProfileBufferThresholdMs(0, 0, 86400000)
- , DataTxProfileBufferSize(0, 1000, 100)
+ , DataTxProfileLogThresholdMs(0, 0, 86400000)
+ , DataTxProfileBufferThresholdMs(0, 0, 86400000)
+ , DataTxProfileBufferSize(0, 1000, 100)
, ReadColumnsScanEnabled(1, 0, 1)
, ReadColumnsScanInUserPool(0, 0, 1)
, BackupReadAheadLo(0, 0, 64*1024*1024)
@@ -143,34 +143,34 @@ TDataShard::TDataShard(const TActorId &tablet, TTabletStorageInfo *info)
, DataShardSysTables(InitDataShardSysTables(this))
, ChangeSenderActivator(info->TabletID)
, ChangeExchangeSplitter(this)
-{
- TabletCountersPtr.Reset(new TProtobufTabletCounters<
- ESimpleCounters_descriptor,
- ECumulativeCounters_descriptor,
- EPercentileCounters_descriptor,
- ETxTypes_descriptor
- >());
- TabletCounters = TabletCountersPtr.Get();
-}
-
+{
+ TabletCountersPtr.Reset(new TProtobufTabletCounters<
+ ESimpleCounters_descriptor,
+ ECumulativeCounters_descriptor,
+ EPercentileCounters_descriptor,
+ ETxTypes_descriptor
+ >());
+ TabletCounters = TabletCountersPtr.Get();
+}
+
NTabletPipe::TClientConfig TDataShard::GetPipeClientConfig() {
- NTabletPipe::TClientConfig config;
- config.CheckAliveness = true;
+ NTabletPipe::TClientConfig config;
+ config.CheckAliveness = true;
config.RetryPolicy = {
.RetryLimitCount = 30,
.MinRetryTime = TDuration::MilliSeconds(10),
.MaxRetryTime = TDuration::MilliSeconds(500),
.BackoffMultiplier = 2,
};
- return config;
-}
-
+ return config;
+}
+
void TDataShard::OnDetach(const TActorContext &ctx) {
Cleanup(ctx);
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, "OnDetach: " << TabletID());
- return Die(ctx);
-}
-
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, "OnDetach: " << TabletID());
+ return Die(ctx);
+}
+
void TDataShard::OnTabletStop(TEvTablet::TEvTabletStop::TPtr &ev, const TActorContext &ctx) {
const auto* msg = ev->Get();
@@ -256,17 +256,17 @@ void TDataShard::OnStopGuardComplete(const TActorContext &ctx) {
}
void TDataShard::OnTabletDead(TEvTablet::TEvTabletDead::TPtr &ev, const TActorContext &ctx) {
- Y_UNUSED(ev);
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, "OnTabletDead: " << TabletID());
+ Y_UNUSED(ev);
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, "OnTabletDead: " << TabletID());
Cleanup(ctx);
- return Die(ctx);
-}
-
+ return Die(ctx);
+}
+
void TDataShard::Cleanup(const TActorContext& ctx) {
- //PipeClientCache->Detach(ctx);
+ //PipeClientCache->Detach(ctx);
if (RegistrationSended) {
ctx.Send(MakeMediatorTimecastProxyID(), new TEvMediatorTimecast::TEvUnregisterTablet(TabletID()));
- }
+ }
if (Pipeline.HasRestore()) {
auto op = Pipeline.FindOp(Pipeline.CurrentSchemaTxId());
@@ -276,25 +276,25 @@ void TDataShard::Cleanup(const TActorContext& ctx) {
tx->KillAsyncJobActor(ctx);
}
}
-}
-
+}
+
void TDataShard::OnActivateExecutor(const TActorContext& ctx) {
LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, "TDataShard::OnActivateExecutor: tablet " << TabletID() << " actor " << ctx.SelfID);
-
- AppData(ctx)->Icb->RegisterSharedControl(DisableByKeyFilter, "DataShardControls.DisableByKeyFilter");
- AppData(ctx)->Icb->RegisterSharedControl(MaxTxInFly, "DataShardControls.MaxTxInFly");
- AppData(ctx)->Icb->RegisterSharedControl(MaxTxLagMilliseconds, "DataShardControls.MaxTxLagMilliseconds");
- AppData(ctx)->Icb->RegisterSharedControl(DataTxProfileLogThresholdMs, "DataShardControls.DataTxProfile.LogThresholdMs");
- AppData(ctx)->Icb->RegisterSharedControl(DataTxProfileBufferThresholdMs, "DataShardControls.DataTxProfile.BufferThresholdMs");
- AppData(ctx)->Icb->RegisterSharedControl(DataTxProfileBufferSize, "DataShardControls.DataTxProfile.BufferSize");
-
- AppData(ctx)->Icb->RegisterSharedControl(CanCancelROWithReadSets, "DataShardControls.CanCancelROWithReadSets");
- AppData(ctx)->Icb->RegisterSharedControl(PerShardReadSizeLimit, "TxLimitControls.PerShardReadSizeLimit");
+
+ AppData(ctx)->Icb->RegisterSharedControl(DisableByKeyFilter, "DataShardControls.DisableByKeyFilter");
+ AppData(ctx)->Icb->RegisterSharedControl(MaxTxInFly, "DataShardControls.MaxTxInFly");
+ AppData(ctx)->Icb->RegisterSharedControl(MaxTxLagMilliseconds, "DataShardControls.MaxTxLagMilliseconds");
+ AppData(ctx)->Icb->RegisterSharedControl(DataTxProfileLogThresholdMs, "DataShardControls.DataTxProfile.LogThresholdMs");
+ AppData(ctx)->Icb->RegisterSharedControl(DataTxProfileBufferThresholdMs, "DataShardControls.DataTxProfile.BufferThresholdMs");
+ AppData(ctx)->Icb->RegisterSharedControl(DataTxProfileBufferSize, "DataShardControls.DataTxProfile.BufferSize");
+
+ AppData(ctx)->Icb->RegisterSharedControl(CanCancelROWithReadSets, "DataShardControls.CanCancelROWithReadSets");
+ AppData(ctx)->Icb->RegisterSharedControl(PerShardReadSizeLimit, "TxLimitControls.PerShardReadSizeLimit");
AppData(ctx)->Icb->RegisterSharedControl(CpuUsageReportThreshlodPercent, "DataShardControls.CpuUsageReportThreshlodPercent");
AppData(ctx)->Icb->RegisterSharedControl(CpuUsageReportIntervalSeconds, "DataShardControls.CpuUsageReportIntervalSeconds");
AppData(ctx)->Icb->RegisterSharedControl(HighDataSizeReportThreshlodBytes, "DataShardControls.HighDataSizeReportThreshlodBytes");
AppData(ctx)->Icb->RegisterSharedControl(HighDataSizeReportIntervalSeconds, "DataShardControls.HighDataSizeReportIntervalSeconds");
-
+
AppData(ctx)->Icb->RegisterSharedControl(ReadColumnsScanEnabled, "DataShardControls.ReadColumnsScanEnabled");
AppData(ctx)->Icb->RegisterSharedControl(ReadColumnsScanInUserPool, "DataShardControls.ReadColumnsScanInUserPool");
@@ -302,131 +302,131 @@ void TDataShard::OnActivateExecutor(const TActorContext& ctx) {
AppData(ctx)->Icb->RegisterSharedControl(BackupReadAheadHi, "DataShardControls.BackupReadAheadHi");
// OnActivateExecutor might be called multiple times for a follower
- // but the counters should be initialized only once
- if (TabletCountersPtr) {
- Executor()->RegisterExternalTabletCounters(TabletCountersPtr);
- }
- Y_VERIFY(TabletCounters);
-
- AllocCounters = TAlignedPagePoolCounters(AppData(ctx)->Counters, "datashard");
-
+ // but the counters should be initialized only once
+ if (TabletCountersPtr) {
+ Executor()->RegisterExternalTabletCounters(TabletCountersPtr);
+ }
+ Y_VERIFY(TabletCounters);
+
+ AllocCounters = TAlignedPagePoolCounters(AppData(ctx)->Counters, "datashard");
+
if (!Executor()->GetStats().IsFollower) {
- Execute(CreateTxInitSchema(), ctx);
- Become(&TThis::StateInactive);
- } else {
- SyncConfig();
- State = TShardState::Readonly;
+ Execute(CreateTxInitSchema(), ctx);
+ Become(&TThis::StateInactive);
+ } else {
+ SyncConfig();
+ State = TShardState::Readonly;
FollowerState = { };
Become(&TThis::StateWorkAsFollower);
- SignalTabletActive(ctx);
+ SignalTabletActive(ctx);
LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, "Follower switched to work state: " << TabletID());
- }
-}
-
+ }
+}
+
void TDataShard::SwitchToWork(const TActorContext &ctx) {
- SyncConfig();
- PlanQueue.Progress(ctx);
- OutReadSets.ResendAll(ctx);
-
- Become(&TThis::StateWork);
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, "Switched to work state "
- << DatashardStateName(State) << " tabletId " << TabletID());
+ SyncConfig();
+ PlanQueue.Progress(ctx);
+ OutReadSets.ResendAll(ctx);
+
+ Become(&TThis::StateWork);
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, "Switched to work state "
+ << DatashardStateName(State) << " tabletId " << TabletID());
// Cleanup any removed snapshots from the previous generation
Execute(new TTxCleanupRemovedSnapshots(this), ctx);
- SignalTabletActive(ctx);
- DoPeriodicTasks(ctx);
-
- NotifySchemeshard(ctx);
+ SignalTabletActive(ctx);
+ DoPeriodicTasks(ctx);
+
+ NotifySchemeshard(ctx);
CheckInitiateBorrowedPartsReturn(ctx);
- CheckStateChange(ctx);
-}
-
+ CheckStateChange(ctx);
+}
+
void TDataShard::SyncConfig() {
- PipeClientCacheConfig->ClientPoolLimit = PipeClientCachePoolLimit();
- PipeClientCache->PopWhileOverflow();
- // TODO[serxa]: dynamic prepared in fly
- //3=SetDynamicPreparedInFly(Config.GetFlowControl().GetPreparedInFlyMax());
-}
-
+ PipeClientCacheConfig->ClientPoolLimit = PipeClientCachePoolLimit();
+ PipeClientCache->PopWhileOverflow();
+ // TODO[serxa]: dynamic prepared in fly
+ //3=SetDynamicPreparedInFly(Config.GetFlowControl().GetPreparedInFlyMax());
+}
+
void TDataShard::SendRegistrationRequestTimeCast(const TActorContext &ctx) {
- if (RegistrationSended)
- return;
-
- if (!ProcessingParams)
- return;
-
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, "Send registration request to time cast "
- << DatashardStateName(State) << " tabletId " << TabletID()
- << " mediators count is " << ProcessingParams->MediatorsSize()
- << " buckets per mediator " << ProcessingParams->GetTimeCastBucketsPerMediator());
-
- RegistrationSended = true;
- ctx.Send(MakeMediatorTimecastProxyID(), new TEvMediatorTimecast::TEvRegisterTablet(TabletID(), *ProcessingParams));
-}
-
+ if (RegistrationSended)
+ return;
+
+ if (!ProcessingParams)
+ return;
+
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD, "Send registration request to time cast "
+ << DatashardStateName(State) << " tabletId " << TabletID()
+ << " mediators count is " << ProcessingParams->MediatorsSize()
+ << " buckets per mediator " << ProcessingParams->GetTimeCastBucketsPerMediator());
+
+ RegistrationSended = true;
+ ctx.Send(MakeMediatorTimecastProxyID(), new TEvMediatorTimecast::TEvRegisterTablet(TabletID(), *ProcessingParams));
+}
+
void TDataShard::PrepareAndSaveOutReadSets(ui64 step,
- ui64 txId,
- const TMap<std::pair<ui64, ui64>, TString>& txOutReadSets,
- TVector<THolder<TEvTxProcessing::TEvReadSet>> &preparedRS,
- TTransactionContext &txc,
- const TActorContext& ctx)
-{
- NIceDb::TNiceDb db(txc.DB);
- OutReadSets.Cleanup(db, ctx);
- if (txOutReadSets.empty())
- return;
-
- ui64 prevSeqno = LastSeqno;
- for (auto& kv : txOutReadSets) {
- ui64 source = kv.first.first;
- ui64 target = kv.first.second;
- TReadSetKey rsKey(txId, TabletID(), source, target);
- if (! OutReadSets.Has(rsKey)) {
- ui64 seqno = LastSeqno++;
- OutReadSets.SaveReadSet(db, seqno, step, rsKey, kv.second);
- preparedRS.push_back(PrepareReadSet(step, txId, source, target, kv.second, seqno));
- }
- }
-
- if (LastSeqno != prevSeqno) {
- PersistSys(db, Schema::Sys_LastSeqno, LastSeqno);
- }
-}
-
+ ui64 txId,
+ const TMap<std::pair<ui64, ui64>, TString>& txOutReadSets,
+ TVector<THolder<TEvTxProcessing::TEvReadSet>> &preparedRS,
+ TTransactionContext &txc,
+ const TActorContext& ctx)
+{
+ NIceDb::TNiceDb db(txc.DB);
+ OutReadSets.Cleanup(db, ctx);
+ if (txOutReadSets.empty())
+ return;
+
+ ui64 prevSeqno = LastSeqno;
+ for (auto& kv : txOutReadSets) {
+ ui64 source = kv.first.first;
+ ui64 target = kv.first.second;
+ TReadSetKey rsKey(txId, TabletID(), source, target);
+ if (! OutReadSets.Has(rsKey)) {
+ ui64 seqno = LastSeqno++;
+ OutReadSets.SaveReadSet(db, seqno, step, rsKey, kv.second);
+ preparedRS.push_back(PrepareReadSet(step, txId, source, target, kv.second, seqno));
+ }
+ }
+
+ if (LastSeqno != prevSeqno) {
+ PersistSys(db, Schema::Sys_LastSeqno, LastSeqno);
+ }
+}
+
void TDataShard::SendDelayedAcks(const TActorContext& ctx, TVector<THolder<IEventHandle>>& delayedAcks) const {
- for (auto& x : delayedAcks) {
- TEvTxProcessing::TEvReadSetAck* ev = dynamic_cast<TEvTxProcessing::TEvReadSetAck*>(x->GetBase());
- LOG_DEBUG(ctx, NKikimrServices::TX_DATASHARD,
- "Send delayed Ack RS Ack at %" PRIu64 " %s",
- TabletID(), ev->ToString().data());
- ctx.ExecutorThread.Send(x.Release());
- IncCounter(COUNTER_ACK_SENT_DELAYED);
- }
-
- delayedAcks.clear();
-}
-
+ for (auto& x : delayedAcks) {
+ TEvTxProcessing::TEvReadSetAck* ev = dynamic_cast<TEvTxProcessing::TEvReadSetAck*>(x->GetBase());
+ LOG_DEBUG(ctx, NKikimrServices::TX_DATASHARD,
+ "Send delayed Ack RS Ack at %" PRIu64 " %s",
+ TabletID(), ev->ToString().data());
+ ctx.ExecutorThread.Send(x.Release());
+ IncCounter(COUNTER_ACK_SENT_DELAYED);
+ }
+
+ delayedAcks.clear();
+}
+
void TDataShard::SendResult(const TActorContext &ctx,
- TOutputOpData::TResultPtr &res,
+ TOutputOpData::TResultPtr &res,
const TActorId &target,
- ui64 step,
- ui64 txId)
-{
- Y_VERIFY(txId == res->GetTxId(), "%" PRIu64 " vs %" PRIu64, txId, res->GetTxId());
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Complete [" << step << " : " << txId << "] from " << TabletID()
- << " at tablet " << TabletID() << " send result to client "
- << target << ", exec latency: " << res->Record.GetExecLatency()
- << " ms, propose latency: " << res->Record.GetProposeLatency() << " ms");
-
- ui64 resultSize = res->GetTxResult().size();
- ui32 flags = IEventHandle::MakeFlags(TInterconnectChannels::GetTabletChannel(resultSize), 0);
- ctx.Send(target, res.Release(), flags);
-}
-
+ ui64 step,
+ ui64 txId)
+{
+ Y_VERIFY(txId == res->GetTxId(), "%" PRIu64 " vs %" PRIu64, txId, res->GetTxId());
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Complete [" << step << " : " << txId << "] from " << TabletID()
+ << " at tablet " << TabletID() << " send result to client "
+ << target << ", exec latency: " << res->Record.GetExecLatency()
+ << " ms, propose latency: " << res->Record.GetProposeLatency() << " ms");
+
+ ui64 resultSize = res->GetTxResult().size();
+ ui32 flags = IEventHandle::MakeFlags(TInterconnectChannels::GetTabletChannel(resultSize), 0);
+ ctx.Send(target, res.Release(), flags);
+}
+
void TDataShard::FillExecutionStats(const TExecutionProfile& execProfile, TEvDataShard::TEvProposeTransactionResult& result) const {
TDuration totalCpuTime;
for (const auto& unit : execProfile.UnitProfiles) {
@@ -452,7 +452,7 @@ ui64 TDataShard::AllocateChangeRecordGroup(NIceDb::TNiceDb& db) {
LastChangeRecordGroup = result;
PersistSys(db, Schema::Sys_LastChangeRecordGroup, LastChangeRecordGroup);
-
+
return result;
}
@@ -620,32 +620,32 @@ void TDataShard::PersistSchemeTxResult(NIceDb::TNiceDb &db, const TSchemaOperati
}
void TDataShard::NotifySchemeshard(const TActorContext& ctx, ui64 txId) {
- if (!txId) {
- for (const auto& op : TransQueue.GetSchemaOperations())
- NotifySchemeshard(ctx, op.first);
- return;
- }
-
+ if (!txId) {
+ for (const auto& op : TransQueue.GetSchemaOperations())
+ NotifySchemeshard(ctx, op.first);
+ return;
+ }
+
TSchemaOperation * op = TransQueue.FindSchemaTx(txId);
- if (!op || !op->Done)
- return;
-
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
- TabletID() << " Sending notify to schemeshard " << op->TabletId
- << " txId " << txId << " state " << DatashardStateName(State) << " TxInFly " << TxInFly());
-
- if (op->IsDrop()) {
- Y_VERIFY_S(State == TShardState::PreOffline,
- TabletID() << " is in wrong state (" << State << ") for drop");
- Y_VERIFY_S(!TxInFly(),
- TabletID() << " has " << TxInFly() << " txs in-fly "
- << TransQueue.TxInFlyToString());
- }
-
- THolder<TEvDataShard::TEvSchemaChanged> event =
+ if (!op || !op->Done)
+ return;
+
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
+ TabletID() << " Sending notify to schemeshard " << op->TabletId
+ << " txId " << txId << " state " << DatashardStateName(State) << " TxInFly " << TxInFly());
+
+ if (op->IsDrop()) {
+ Y_VERIFY_S(State == TShardState::PreOffline,
+ TabletID() << " is in wrong state (" << State << ") for drop");
+ Y_VERIFY_S(!TxInFly(),
+ TabletID() << " has " << TxInFly() << " txs in-fly "
+ << TransQueue.TxInFlyToString());
+ }
+
+ THolder<TEvDataShard::TEvSchemaChanged> event =
THolder(new TEvDataShard::TEvSchemaChanged(ctx.SelfID, TabletID(), State, op->TxId, op->PlanStep, Generation()));
-
- switch (op->Type) {
+
+ switch (op->Type) {
case TSchemaOperation::ETypeBackup:
case TSchemaOperation::ETypeRestore: {
auto* result = event->Record.MutableOpResult();
@@ -657,31 +657,31 @@ void TDataShard::NotifySchemeshard(const TActorContext& ctx, ui64 txId) {
}
default:
break;
- }
-
+ }
+
SendViaSchemeshardPipe(ctx, op->TabletId, THolder(event.Release()));
-}
-
+}
+
bool TDataShard::CheckMediatorAuthorisation(ui64 mediatorId) {
- if (!ProcessingParams || 0 == ProcessingParams->MediatorsSize()) {
- return true;
- }
-
- auto it = std::find(ProcessingParams->GetMediators().begin(),
- ProcessingParams->GetMediators().end(),
- mediatorId);
-
- return it != ProcessingParams->GetMediators().end();
-}
-
+ if (!ProcessingParams || 0 == ProcessingParams->MediatorsSize()) {
+ return true;
+ }
+
+ auto it = std::find(ProcessingParams->GetMediators().begin(),
+ ProcessingParams->GetMediators().end(),
+ mediatorId);
+
+ return it != ProcessingParams->GetMediators().end();
+}
+
void TDataShard::PersistSys(NIceDb::TNiceDb &db, ui64 key, const TString &value) const {
- db.Table<Schema::Sys>().Key(key).Update(NIceDb::TUpdate<Schema::Sys::Bytes>(value));
-}
-
+ db.Table<Schema::Sys>().Key(key).Update(NIceDb::TUpdate<Schema::Sys::Bytes>(value));
+}
+
void TDataShard::PersistSys(NIceDb::TNiceDb& db, ui64 key, ui64 value) const {
- db.Table<Schema::Sys>().Key(key).Update(NIceDb::TUpdate<Schema::Sys::Uint64>(value));
-}
-
+ db.Table<Schema::Sys>().Key(key).Update(NIceDb::TUpdate<Schema::Sys::Uint64>(value));
+}
+
void TDataShard::PersistSys(NIceDb::TNiceDb& db, ui64 key, ui32 value) const {
db.Table<Schema::Sys>().Key(key).Update(NIceDb::TUpdate<Schema::Sys::Uint64>(value));
}
@@ -691,12 +691,12 @@ void TDataShard::PersistSys(NIceDb::TNiceDb& db, ui64 key, bool value) const {
}
void TDataShard::PersistUserTable(NIceDb::TNiceDb& db, ui64 tableId, const TUserTable& tableInfo) {
- db.Table<Schema::UserTables>().Key(tableId).Update(
- NIceDb::TUpdate<Schema::UserTables::LocalTid>(tableInfo.LocalTid),
+ db.Table<Schema::UserTables>().Key(tableId).Update(
+ NIceDb::TUpdate<Schema::UserTables::LocalTid>(tableInfo.LocalTid),
NIceDb::TUpdate<Schema::UserTables::ShadowTid>(tableInfo.ShadowTid),
- NIceDb::TUpdate<Schema::UserTables::Schema>(tableInfo.GetSchema()));
-}
-
+ NIceDb::TUpdate<Schema::UserTables::Schema>(tableInfo.GetSchema()));
+}
+
void TDataShard::PersistUserTableFullCompactionTs(NIceDb::TNiceDb& db, ui64 tableId, ui64 ts) {
db.Table<Schema::UserTablesStats>().Key(tableId).Update<Schema::UserTablesStats::FullCompactionTs>(ts);
}
@@ -811,7 +811,7 @@ TUserTable::TPtr TDataShard::AlterTableDropCdcStream(
TUserTable::TPtr TDataShard::CreateUserTable(TTransactionContext& txc,
const NKikimrSchemeOp::TTableDescription& tableScheme)
-{
+{
const TString mainTableName = TDataShard::Schema::UserTablePrefix + tableScheme.GetName();
ui64 tableId = tableScheme.GetId_Deprecated();
if (tableScheme.HasPathId()) {
@@ -821,37 +821,37 @@ TUserTable::TPtr TDataShard::CreateUserTable(TTransactionContext& txc,
ui32 localTid = ++LastLocalTid;
ui32 shadowTid = tableScheme.GetPartitionConfig().GetShadowData() ? ++LastLocalTid : 0;
TUserTable::TPtr tableInfo = new TUserTable(localTid, tableScheme, shadowTid);
-
+
tableInfo->ApplyCreate(txc, mainTableName, tableScheme.GetPartitionConfig());
-
+
if (shadowTid) {
const TString shadowTableName = TDataShard::Schema::ShadowTablePrefix + tableScheme.GetName();
tableInfo->ApplyCreateShadow(txc, shadowTableName, tableScheme.GetPartitionConfig());
}
- NIceDb::TNiceDb db(txc.DB);
-
- auto& partConfig = tableScheme.GetPartitionConfig();
- if (partConfig.HasTxReadSizeLimit()) {
- TxReadSizeLimit = partConfig.GetTxReadSizeLimit();
- PersistSys(db, Schema::Sys_TxReadSizeLimit, TxReadSizeLimit);
- }
- if (partConfig.HasDisableStatisticsCalculation()) {
- StatisticsDisabled = partConfig.GetDisableStatisticsCalculation() ? 1 : 0;
- PersistSys(db, Schema::Sys_StatisticsDisabled, StatisticsDisabled);
- }
-
- Pipeline.UpdateConfig(db, partConfig.GetPipelineConfig());
-
+ NIceDb::TNiceDb db(txc.DB);
+
+ auto& partConfig = tableScheme.GetPartitionConfig();
+ if (partConfig.HasTxReadSizeLimit()) {
+ TxReadSizeLimit = partConfig.GetTxReadSizeLimit();
+ PersistSys(db, Schema::Sys_TxReadSizeLimit, TxReadSizeLimit);
+ }
+ if (partConfig.HasDisableStatisticsCalculation()) {
+ StatisticsDisabled = partConfig.GetDisableStatisticsCalculation() ? 1 : 0;
+ PersistSys(db, Schema::Sys_StatisticsDisabled, StatisticsDisabled);
+ }
+
+ Pipeline.UpdateConfig(db, partConfig.GetPipelineConfig());
+
if (partConfig.HasKeepSnapshotTimeout())
SnapshotManager.SetKeepSnapshotTimeout(db, partConfig.GetKeepSnapshotTimeout());
PersistSys(db, Schema::Sys_LastLocalTid, LastLocalTid);
- PersistUserTable(db, tableId, *tableInfo);
-
- return tableInfo;
-}
-
+ PersistUserTable(db, tableId, *tableInfo);
+
+ return tableInfo;
+}
+
THashMap<TPathId, TPathId> TDataShard::GetRemapIndexes(const NKikimrTxDataShard::TMoveTable& move) {
THashMap<TPathId, TPathId> remap;
for (const auto& item: move.GetReMapIndexes()) {
@@ -906,31 +906,31 @@ TUserTable::TPtr TDataShard::MoveUserTable(const TActorContext& ctx, TTransactio
TUserTable::TPtr TDataShard::AlterUserTable(const TActorContext& ctx, TTransactionContext& txc,
const NKikimrSchemeOp::TTableDescription& alter)
-{
+{
ui64 tableId = alter.GetId_Deprecated();
if (alter.HasPathId()) {
Y_VERIFY(GetPathOwnerId() == alter.GetPathId().GetOwnerId());
tableId = alter.GetPathId().GetLocalId();
}
TUserTable::TCPtr oldTable = TableInfos[tableId];
- Y_VERIFY(oldTable);
-
- TUserTable::TPtr tableInfo = new TUserTable(*oldTable, alter);
- TString strError;
- tableInfo->ApplyAlter(txc, *oldTable, alter, strError);
- if (strError) {
- LOG_ERROR(ctx, NKikimrServices::TX_DATASHARD,
- "Cannot alter datashard %" PRIu64 " for table %" PRIu64 ": %s",
- TabletID(), tableId, strError.data());
- }
-
+ Y_VERIFY(oldTable);
+
+ TUserTable::TPtr tableInfo = new TUserTable(*oldTable, alter);
+ TString strError;
+ tableInfo->ApplyAlter(txc, *oldTable, alter, strError);
+ if (strError) {
+ LOG_ERROR(ctx, NKikimrServices::TX_DATASHARD,
+ "Cannot alter datashard %" PRIu64 " for table %" PRIu64 ": %s",
+ TabletID(), tableId, strError.data());
+ }
+
NIceDb::TNiceDb db(txc.DB);
- if (alter.HasPartitionConfig()) {
- // We are going to update table schema and save it
+ if (alter.HasPartitionConfig()) {
+ // We are going to update table schema and save it
NKikimrSchemeOp::TTableDescription tableDescr;
- tableInfo->GetSchema(tableDescr);
-
+ tableInfo->GetSchema(tableDescr);
+
const auto& configDelta = alter.GetPartitionConfig();
auto& config = *tableDescr.MutablePartitionConfig();
@@ -940,57 +940,57 @@ TUserTable::TPtr TDataShard::AlterUserTable(const TActorContext& ctx, TTransacti
PersistSys(db, Schema::Sys_State, State);
}
- if (configDelta.HasTxReadSizeLimit()) {
- config.SetTxReadSizeLimit(configDelta.GetTxReadSizeLimit());
+ if (configDelta.HasTxReadSizeLimit()) {
+ config.SetTxReadSizeLimit(configDelta.GetTxReadSizeLimit());
TxReadSizeLimit = configDelta.GetTxReadSizeLimit();
- PersistSys(db, Schema::Sys_TxReadSizeLimit, TxReadSizeLimit);
- }
-
- if (configDelta.HasDisableStatisticsCalculation()) {
- StatisticsDisabled = configDelta.GetDisableStatisticsCalculation() ? 1 : 0;
- PersistSys(db, Schema::Sys_StatisticsDisabled, StatisticsDisabled);
- }
-
- if (configDelta.HasPipelineConfig()) {
- config.ClearPipelineConfig();
- config.MutablePipelineConfig()->CopyFrom(configDelta.GetPipelineConfig());
- Pipeline.UpdateConfig(db, configDelta.GetPipelineConfig());
- }
-
- tableInfo->SetSchema(tableDescr);
+ PersistSys(db, Schema::Sys_TxReadSizeLimit, TxReadSizeLimit);
+ }
+
+ if (configDelta.HasDisableStatisticsCalculation()) {
+ StatisticsDisabled = configDelta.GetDisableStatisticsCalculation() ? 1 : 0;
+ PersistSys(db, Schema::Sys_StatisticsDisabled, StatisticsDisabled);
+ }
+
+ if (configDelta.HasPipelineConfig()) {
+ config.ClearPipelineConfig();
+ config.MutablePipelineConfig()->CopyFrom(configDelta.GetPipelineConfig());
+ Pipeline.UpdateConfig(db, configDelta.GetPipelineConfig());
+ }
+
+ tableInfo->SetSchema(tableDescr);
if (configDelta.HasKeepSnapshotTimeout())
SnapshotManager.SetKeepSnapshotTimeout(db, configDelta.GetKeepSnapshotTimeout());
- }
-
+ }
+
PersistUserTable(db, tableId, *tableInfo);
- return tableInfo;
-}
-
+ return tableInfo;
+}
+
void TDataShard::DropUserTable(TTransactionContext& txc, ui64 tableId) {
- auto ti = TableInfos.find(tableId);
- Y_VERIFY(ti != TableInfos.end(), "Table with id %" PRIu64 " doesn't exist on this datashard", tableId);
-
- NIceDb::TNiceDb db(txc.DB);
- txc.DB.NoMoreReadsForTx();
- txc.DB.Alter().DropTable(ti->second->LocalTid);
+ auto ti = TableInfos.find(tableId);
+ Y_VERIFY(ti != TableInfos.end(), "Table with id %" PRIu64 " doesn't exist on this datashard", tableId);
+
+ NIceDb::TNiceDb db(txc.DB);
+ txc.DB.NoMoreReadsForTx();
+ txc.DB.Alter().DropTable(ti->second->LocalTid);
if (ti->second->ShadowTid) {
txc.DB.Alter().DropTable(ti->second->ShadowTid);
}
- db.Table<Schema::UserTables>().Key(ti->first).Delete();
+ db.Table<Schema::UserTables>().Key(ti->first).Delete();
db.Table<Schema::UserTablesStats>().Key(ti->first).Delete();
-
- TableInfos.erase(ti);
-}
-
+
+ TableInfos.erase(ti);
+}
+
void TDataShard::DropAllUserTables(TTransactionContext& txc) {
- NIceDb::TNiceDb db(txc.DB);
- txc.DB.NoMoreReadsForTx();
+ NIceDb::TNiceDb db(txc.DB);
+ txc.DB.NoMoreReadsForTx();
// All scheme changes must happen first
- for (const auto& ti : TableInfos) {
- txc.DB.Alter().DropTable(ti.second->LocalTid);
+ for (const auto& ti : TableInfos) {
+ txc.DB.Alter().DropTable(ti.second->LocalTid);
if (ti.second->ShadowTid) {
txc.DB.Alter().DropTable(ti.second->ShadowTid);
}
@@ -999,56 +999,56 @@ void TDataShard::DropAllUserTables(TTransactionContext& txc) {
// Now remove all snapshots and their info
SnapshotManager.PersistRemoveAllSnapshots(db);
for (const auto& ti : TableInfos) {
- db.Table<Schema::UserTables>().Key(ti.first).Delete();
+ db.Table<Schema::UserTables>().Key(ti.first).Delete();
db.Table<Schema::UserTablesStats>().Key(ti.first).Delete();
- }
-
- TableInfos.clear();
-}
-
-// Deletes user table and all system tables that are transfered during split/merge
-// This allows their borrowed parts to be returned to the owner tablet
+ }
+
+ TableInfos.clear();
+}
+
+// Deletes user table and all system tables that are transfered during split/merge
+// This allows their borrowed parts to be returned to the owner tablet
void TDataShard::PurgeTxTables(TTransactionContext& txc) {
- TVector<ui32> tablesToDrop = {
- Schema::TxMain::TableId,
- Schema::TxDetails::TableId,
- Schema::InReadSets::TableId,
- Schema::PlanQueue::TableId,
- Schema::DeadlineQueue::TableId
- };
- for (ui32 ti : tablesToDrop) {
- txc.DB.Alter().DropTable(ti);
- }
-
- DropAllUserTables(txc);
-}
-
+ TVector<ui32> tablesToDrop = {
+ Schema::TxMain::TableId,
+ Schema::TxDetails::TableId,
+ Schema::InReadSets::TableId,
+ Schema::PlanQueue::TableId,
+ Schema::DeadlineQueue::TableId
+ };
+ for (ui32 ti : tablesToDrop) {
+ txc.DB.Alter().DropTable(ti);
+ }
+
+ DropAllUserTables(txc);
+}
+
void TDataShard::SnapshotComplete(TIntrusivePtr<NTabletFlatExecutor::TTableSnapshotContext> snapContext, const TActorContext &ctx) {
if (auto txSnapContext = dynamic_cast<TTxTableSnapshotContext*>(snapContext.Get())) {
auto stepOrder = txSnapContext->GetStepOrder();
- auto op = Pipeline.GetActiveOp(stepOrder.TxId);
-
- Y_VERIFY_DEBUG(op, "The Tx that requested snapshot must be active!");
- if (!op) {
- LOG_CRIT_S(ctx, NKikimrServices::TX_DATASHARD,
- "Got snapshot for missing operation " << stepOrder
- << " at " << TabletID());
- return;
- }
-
+ auto op = Pipeline.GetActiveOp(stepOrder.TxId);
+
+ Y_VERIFY_DEBUG(op, "The Tx that requested snapshot must be active!");
+ if (!op) {
+ LOG_CRIT_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Got snapshot for missing operation " << stepOrder
+ << " at " << TabletID());
+ return;
+ }
+
Y_VERIFY(txSnapContext->TablesToSnapshot().size() == 1,
- "Currently only 1 table can be snapshotted");
+ "Currently only 1 table can be snapshotted");
ui32 tableId = txSnapContext->TablesToSnapshot()[0];
-
- LOG_DEBUG(ctx, NKikimrServices::TX_DATASHARD,
- "Got snapshot in active state at %" PRIu64 " for table %" PRIu32 " txId %" PRIu64,
- TabletID(), tableId, stepOrder.TxId);
-
- op->AddInputSnapshot(snapContext);
- Pipeline.AddCandidateOp(op);
- PlanQueue.Progress(ctx);
+
+ LOG_DEBUG(ctx, NKikimrServices::TX_DATASHARD,
+ "Got snapshot in active state at %" PRIu64 " for table %" PRIu32 " txId %" PRIu64,
+ TabletID(), tableId, stepOrder.TxId);
+
+ op->AddInputSnapshot(snapContext);
+ Pipeline.AddCandidateOp(op);
+ PlanQueue.Progress(ctx);
return;
- }
+ }
if (auto splitSnapContext = dynamic_cast<TSplitSnapshotContext*>(snapContext.Get())) {
Execute(CreateTxSplitSnapshotComplete(splitSnapContext), ctx);
@@ -1056,26 +1056,26 @@ void TDataShard::SnapshotComplete(TIntrusivePtr<NTabletFlatExecutor::TTableSnaps
}
Y_FAIL("Unexpected table snapshot context");
-}
-
+}
+
TUserTable::TSpecialUpdate TDataShard::SpecialUpdates(const NTable::TDatabase& db, const TTableId& tableId) const {
Y_VERIFY(tableId.PathId.OwnerId == PathOwnerId, "%" PRIu64 " vs %" PRIu64,
tableId.PathId.OwnerId, PathOwnerId);
-
+
auto it = TableInfos.find(tableId.PathId.LocalPathId);
- Y_VERIFY(it != TableInfos.end());
- const TUserTable& tableInfo = *it->second;
- Y_VERIFY(tableInfo.LocalTid != Max<ui32>());
-
+ Y_VERIFY(it != TableInfos.end());
+ const TUserTable& tableInfo = *it->second;
+ Y_VERIFY(tableInfo.LocalTid != Max<ui32>());
+
TUserTable::TSpecialUpdate ret;
-
+
if (tableInfo.SpecialColTablet != Max<ui32>()) {
ret.ColIdTablet = tableInfo.SpecialColTablet;
ret.Tablet = TabletID();
ret.HasUpdates = true;
- }
-
+ }
+
if (tableInfo.SpecialColEpoch != Max<ui32>() || tableInfo.SpecialColUpdateNo != Max<ui32>()) {
auto dbChange = db.Head(tableInfo.LocalTid);
ret.ColIdEpoch = tableInfo.SpecialColEpoch;
@@ -1088,23 +1088,23 @@ TUserTable::TSpecialUpdate TDataShard::SpecialUpdates(const NTable::TDatabase& d
}
return ret;
-}
-
+}
+
void TDataShard::SetTableAccessTime(const TTableId& tableId, TInstant ts) {
- Y_VERIFY(!TSysTables::IsSystemTable(tableId));
+ Y_VERIFY(!TSysTables::IsSystemTable(tableId));
auto iter = TableInfos.find(tableId.PathId.LocalPathId);
- Y_VERIFY(iter != TableInfos.end());
- iter->second->Stats.AccessTime = ts;
-}
-
+ Y_VERIFY(iter != TableInfos.end());
+ iter->second->Stats.AccessTime = ts;
+}
+
void TDataShard::SetTableUpdateTime(const TTableId& tableId, TInstant ts) {
- Y_VERIFY(!TSysTables::IsSystemTable(tableId));
+ Y_VERIFY(!TSysTables::IsSystemTable(tableId));
auto iter = TableInfos.find(tableId.PathId.LocalPathId);
- Y_VERIFY(iter != TableInfos.end());
- iter->second->Stats.AccessTime = ts;
- iter->second->Stats.UpdateTime = ts;
-}
-
+ Y_VERIFY(iter != TableInfos.end());
+ iter->second->Stats.AccessTime = ts;
+ iter->second->Stats.UpdateTime = ts;
+}
+
void TDataShard::SampleKeyAccess(const TTableId& tableId, const TArrayRef<const TCell>& row) {
Y_VERIFY(!TSysTables::IsSystemTable(tableId));
@@ -1135,13 +1135,13 @@ void TDataShard::EnableKeyAccessSampling(const TActorContext &ctx, TInstant unti
}
bool TDataShard::OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev, const TActorContext &ctx) {
- if (!Executor() || !Executor()->GetStats().IsActive)
- return false;
-
- if (!ev)
- return true;
-
- LOG_DEBUG(ctx, NKikimrServices::TX_DATASHARD, "Handle TEvRemoteHttpInfo: %s", ev->Get()->Query.data());
+ if (!Executor() || !Executor()->GetStats().IsActive)
+ return false;
+
+ if (!ev)
+ return true;
+
+ LOG_DEBUG(ctx, NKikimrServices::TX_DATASHARD, "Handle TEvRemoteHttpInfo: %s", ev->Get()->Query.data());
auto cgi = ev->Get()->Cgi();
@@ -1168,25 +1168,25 @@ bool TDataShard::OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev, const TAc
return true;
}
- Execute(CreateTxMonitoring(this, ev), ctx);
-
- return true;
-}
-
+ Execute(CreateTxMonitoring(this, ev), ctx);
+
+ return true;
+}
+
ui64 TDataShard::GetMemoryUsage() const {
ui64 res = sizeof(TDataShard) + (20 << 10); //basic value
- res += Pipeline.GetInactiveTxSize();
- return res;
-}
-
+ res += Pipeline.GetInactiveTxSize();
+ return res;
+}
+
bool TDataShard::ByKeyFilterDisabled() const {
- return DisableByKeyFilter;
-}
-
+ return DisableByKeyFilter;
+}
+
bool TDataShard::AllowCancelROwithReadsets() const {
- return CanCancelROWithReadSets;
-}
-
+ return CanCancelROWithReadSets;
+}
+
bool TDataShard::IsMvccEnabled() const {
return SnapshotManager.IsMvccEnabled();
}
@@ -1265,35 +1265,35 @@ TReadWriteVersions TDataShard::GetReadWriteVersions(TOperation* op) const {
return mvccVersion;
}
-NKikimrTxDataShard::TError::EKind ConvertErrCode(NMiniKQL::IEngineFlat::EResult code) {
- using EResult = NMiniKQL::IEngineFlat::EResult;
-
- switch (code) {
- case EResult::Ok:
- return NKikimrTxDataShard::TError::OK;
- case EResult::SnapshotNotReady:
- return NKikimrTxDataShard::TError::SNAPSHOT_NOT_READY_YET;
- case EResult::SchemeChanged:
- return NKikimrTxDataShard::TError::SCHEME_CHANGED;
- case EResult::IsReadonly:
- return NKikimrTxDataShard::TError::READONLY;
- case EResult::KeyError:
- return NKikimrTxDataShard::TError::SCHEME_ERROR;
- case EResult::ProgramError:
- return NKikimrTxDataShard::TError::PROGRAM_ERROR;
- case EResult::TooManyData:
- return NKikimrTxDataShard::TError::READ_SIZE_EXECEEDED;
- case EResult::SnapshotNotExist:
- return NKikimrTxDataShard::TError::SNAPSHOT_NOT_EXIST;
- case EResult::ResultTooBig:
- return NKikimrTxDataShard::TError::REPLY_SIZE_EXECEEDED;
- case EResult::Cancelled:
- return NKikimrTxDataShard::TError::EXECUTION_CANCELLED;
- default:
- return NKikimrTxDataShard::TError::UNKNOWN;
- }
-}
-
+NKikimrTxDataShard::TError::EKind ConvertErrCode(NMiniKQL::IEngineFlat::EResult code) {
+ using EResult = NMiniKQL::IEngineFlat::EResult;
+
+ switch (code) {
+ case EResult::Ok:
+ return NKikimrTxDataShard::TError::OK;
+ case EResult::SnapshotNotReady:
+ return NKikimrTxDataShard::TError::SNAPSHOT_NOT_READY_YET;
+ case EResult::SchemeChanged:
+ return NKikimrTxDataShard::TError::SCHEME_CHANGED;
+ case EResult::IsReadonly:
+ return NKikimrTxDataShard::TError::READONLY;
+ case EResult::KeyError:
+ return NKikimrTxDataShard::TError::SCHEME_ERROR;
+ case EResult::ProgramError:
+ return NKikimrTxDataShard::TError::PROGRAM_ERROR;
+ case EResult::TooManyData:
+ return NKikimrTxDataShard::TError::READ_SIZE_EXECEEDED;
+ case EResult::SnapshotNotExist:
+ return NKikimrTxDataShard::TError::SNAPSHOT_NOT_EXIST;
+ case EResult::ResultTooBig:
+ return NKikimrTxDataShard::TError::REPLY_SIZE_EXECEEDED;
+ case EResult::Cancelled:
+ return NKikimrTxDataShard::TError::EXECUTION_CANCELLED;
+ default:
+ return NKikimrTxDataShard::TError::UNKNOWN;
+ }
+}
+
Ydb::StatusIds::StatusCode ConvertToYdbStatusCode(NKikimrTxDataShard::TError::EKind code) {
switch (code) {
case NKikimrTxDataShard::TError::OK:
@@ -1332,7 +1332,7 @@ void TDataShard::Handle(TEvents::TEvGone::TPtr &ev) {
void TDataShard::Handle(TEvents::TEvPoisonPill::TPtr &ev, const TActorContext &ctx) {
LOG_DEBUG(ctx, NKikimrServices::TX_DATASHARD, "Handle TEvents::TEvPoisonPill");
Y_UNUSED(ev);
- BecomeBroken(ctx);
+ BecomeBroken(ctx);
}
void TDataShard::Handle(TEvDataShard::TEvGetShardState::TPtr &ev, const TActorContext &ctx) {
@@ -1358,26 +1358,26 @@ void TDataShard::Handle(TEvDataShard::TEvStateChangedResult::TPtr& ev, const TAc
}
bool TDataShard::CheckDataTxReject(const TString& opDescr,
- const TActorContext &ctx,
+ const TActorContext &ctx,
NKikimrTxDataShard::TEvProposeTransactionResult::EStatus &rejectStatus,
TString &reason)
-{
- bool reject = false;
- rejectStatus = NKikimrTxDataShard::TEvProposeTransactionResult::OVERLOADED;
+{
+ bool reject = false;
+ rejectStatus = NKikimrTxDataShard::TEvProposeTransactionResult::OVERLOADED;
TVector<TString> rejectReasons;
- // In v0.5 reject all transactions on split Src after receiving EvSplit
- if (State == TShardState::SplitSrcWaitForNoTxInFlight ||
- State == TShardState::SplitSrcMakeSnapshot ||
- State == TShardState::SplitSrcSendingSnapshot ||
- State == TShardState::SplitSrcWaitForPartitioningChanged) {
- reject = true;
+ // In v0.5 reject all transactions on split Src after receiving EvSplit
+ if (State == TShardState::SplitSrcWaitForNoTxInFlight ||
+ State == TShardState::SplitSrcMakeSnapshot ||
+ State == TShardState::SplitSrcSendingSnapshot ||
+ State == TShardState::SplitSrcWaitForPartitioningChanged) {
+ reject = true;
rejectReasons.push_back(TStringBuilder()
<< "is in process of split opId " << SrcSplitOpId
<< " state " << DatashardStateName(State)
<< " (wrong shard state)");
- } else if (State == TShardState::SplitDstReceivingSnapshot) {
- reject = true;
+ } else if (State == TShardState::SplitDstReceivingSnapshot) {
+ reject = true;
rejectReasons.push_back(TStringBuilder()
<< "is in process of split opId " << DstSplitOpId
<< " state " << DatashardStateName(State));
@@ -1390,30 +1390,30 @@ bool TDataShard::CheckDataTxReject(const TString& opDescr,
rejectReasons.push_back(TStringBuilder()
<< "is in process of mvcc state change"
<< " state " << DatashardStateName(State));
- }
+ }
- if (Pipeline.HasDrop()) {
- reject = true;
+ if (Pipeline.HasDrop()) {
+ reject = true;
rejectReasons.push_back("is in process of drop");
- rejectStatus = NKikimrTxDataShard::TEvProposeTransactionResult::ERROR;
- }
+ rejectStatus = NKikimrTxDataShard::TEvProposeTransactionResult::ERROR;
+ }
- ui64 txInfly = TxInFly();
- TDuration lag = GetDataTxCompleteLag();
- if (txInfly > 1 && lag > TDuration::MilliSeconds(MaxTxLagMilliseconds)) {
- reject = true;
+ ui64 txInfly = TxInFly();
+ TDuration lag = GetDataTxCompleteLag();
+ if (txInfly > 1 && lag > TDuration::MilliSeconds(MaxTxLagMilliseconds)) {
+ reject = true;
rejectReasons.push_back(TStringBuilder()
<< "lags behind, lag: " << lag
<< " in-flight tx count: " << txInfly);
- }
+ }
- const float rejectProbabilty = Executor()->GetRejectProbability();
- if (!reject && rejectProbabilty > 0) {
- float rnd = AppData(ctx)->RandomProvider->GenRandReal2();
- reject |= (rnd < rejectProbabilty);
+ const float rejectProbabilty = Executor()->GetRejectProbability();
+ if (!reject && rejectProbabilty > 0) {
+ float rnd = AppData(ctx)->RandomProvider->GenRandReal2();
+ reject |= (rnd < rejectProbabilty);
if (reject)
rejectReasons.push_back("decided to reject due to given RejectProbability");
- }
+ }
size_t totalInFly = (TxInFly() + ImmediateInFly() + ProposeQueue.Size() + TxWaiting());
if (totalInFly > GetMaxTxInFly()) {
@@ -1444,7 +1444,7 @@ bool TDataShard::CheckDataTxReject(const TString& opDescr,
<< JoinSeq("; ", rejectReasons);
}
- return reject;
+ return reject;
}
bool TDataShard::CheckDataTxRejectAndReply(TEvDataShard::TEvProposeTransaction* msg, const TActorContext& ctx)
@@ -1515,7 +1515,7 @@ void TDataShard::Handle(TEvDataShard::TEvProposeTransaction::TPtr &ev, const TAc
switch (ev->Get()->GetTxKind()) {
case NKikimrTxDataShard::TX_KIND_DATA:
- case NKikimrTxDataShard::TX_KIND_SCAN:
+ case NKikimrTxDataShard::TX_KIND_SCAN:
case NKikimrTxDataShard::TX_KIND_SNAPSHOT:
case NKikimrTxDataShard::TX_KIND_DISTRIBUTED_ERASE:
case NKikimrTxDataShard::TX_KIND_COMMIT_WRITES:
@@ -1528,10 +1528,10 @@ void TDataShard::Handle(TEvDataShard::TEvProposeTransaction::TPtr &ev, const TAc
break;
}
- THolder<TEvDataShard::TEvProposeTransactionResult> result
+ THolder<TEvDataShard::TEvProposeTransactionResult> result
= THolder(new TEvDataShard::TEvProposeTransactionResult(ev->Get()->GetTxKind(),
- TabletID(),
- ev->Get()->GetTxId(),
+ TabletID(),
+ ev->Get()->GetTxId(),
NKikimrTxDataShard::TEvProposeTransactionResult::ERROR));
result->AddError(NKikimrTxDataShard::TError::BAD_TX_KIND, "Unknown kind of transaction");
ctx.Send(ev->Get()->GetSource(), result.Release());
@@ -1563,7 +1563,7 @@ void TDataShard::Handle(TEvDataShard::TEvProposeTransactionAttach::TPtr &ev, con
void TDataShard::HandleAsFollower(TEvDataShard::TEvProposeTransaction::TPtr &ev, const TActorContext &ctx) {
IncCounter(COUNTER_PREPARE_REQUEST);
- if (TxInFly() > GetMaxTxInFly()) {
+ if (TxInFly() > GetMaxTxInFly()) {
THolder<TEvDataShard::TEvProposeTransactionResult> result =
THolder(new TEvDataShard::TEvProposeTransactionResult(ev->Get()->GetTxKind(), TabletID(),
ev->Get()->GetTxId(), NKikimrTxDataShard::TEvProposeTransactionResult::OVERLOADED));
@@ -1578,10 +1578,10 @@ void TDataShard::HandleAsFollower(TEvDataShard::TEvProposeTransaction::TPtr &ev,
return;
}
- THolder<TEvDataShard::TEvProposeTransactionResult> result
+ THolder<TEvDataShard::TEvProposeTransactionResult> result
= THolder(new TEvDataShard::TEvProposeTransactionResult(ev->Get()->GetTxKind(),
- TabletID(),
- ev->Get()->GetTxId(),
+ TabletID(),
+ ev->Get()->GetTxId(),
NKikimrTxDataShard::TEvProposeTransactionResult::ERROR));
result->AddError(NKikimrTxDataShard::TError::BAD_TX_KIND, "Unsupported transaction kind");
ctx.Send(ev->Get()->GetSource(), result.Release());
@@ -1627,8 +1627,8 @@ void TDataShard::Handle(TEvTxProcessing::TEvPlanStep::TPtr &ev, const TActorCont
LOG_CRIT_S(ctx, NKikimrServices::TX_DATASHARD, "tablet " << TabletID() <<
" receive PlanStep " << ev->Get()->Record.GetStep() <<
" from unauthorized mediator " << srcMediatorId);
- BecomeBroken(ctx);
- return;
+ BecomeBroken(ctx);
+ return;
}
Execute(new TTxPlanStep(this, ev), ctx);
@@ -1650,11 +1650,11 @@ void TDataShard::Handle(TEvTxProcessing::TEvReadSetAck::TPtr &ev, const TActorCo
OutReadSets.SaveAck(ctx, ev->Release());
// progress one more Tx to force delayed schema operations
- if (Pipeline.HasSchemaOperation() && OutReadSets.Empty()) {
- // TODO: wait for empty OutRS in a separate unit?
- Pipeline.AddCandidateUnit(EExecutionUnitKind::PlanQueue);
+ if (Pipeline.HasSchemaOperation() && OutReadSets.Empty()) {
+ // TODO: wait for empty OutRS in a separate unit?
+ Pipeline.AddCandidateUnit(EExecutionUnitKind::PlanQueue);
PlanQueue.Progress(ctx);
- }
+ }
CheckStateChange(ctx);
}
@@ -1702,28 +1702,28 @@ void TDataShard::Handle(TEvPrivate::TEvProgressResendReadSet::TPtr &ev, const TA
}
void TDataShard::Handle(TEvPrivate::TEvRegisterScanActor::TPtr &ev, const TActorContext &ctx) {
- ui64 txId = ev->Get()->TxId;
- auto op = Pipeline.FindOp(txId);
-
- if (!op) {
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
- "Cannot find op " << txId << " to register scan actor");
- return;
- }
-
- if (!op->IsReadTable()) {
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
- "Cannot register scan actor for op " << txId
- << " of kind " << op->GetKind());
- return;
- }
-
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- tx->SetScanActor(ev->Sender);
-}
-
+ ui64 txId = ev->Get()->TxId;
+ auto op = Pipeline.FindOp(txId);
+
+ if (!op) {
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Cannot find op " << txId << " to register scan actor");
+ return;
+ }
+
+ if (!op->IsReadTable()) {
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Cannot register scan actor for op " << txId
+ << " of kind " << op->GetKind());
+ return;
+ }
+
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ tx->SetScanActor(ev->Sender);
+}
+
void TDataShard::Handle(TEvPrivate::TEvScanStats::TPtr& ev, const TActorContext &ctx) {
Y_UNUSED(ctx);
@@ -1764,12 +1764,12 @@ void TDataShard::Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActo
DbStatsReportPipe = TActorId();
return;
}
-
- if (ev->Get()->ClientId == TableResolvePipe) {
+
+ if (ev->Get()->ClientId == TableResolvePipe) {
TableResolvePipe = TActorId();
- ResolveTablePath(ctx);
- return;
- }
+ ResolveTablePath(ctx);
+ return;
+ }
}
if (LoanReturnTracker.Has(ev->Get()->TabletId, ev->Get()->ClientId)) {
@@ -1873,13 +1873,13 @@ void TDataShard::AckRSToDeletedTablet(ui64 tabletId, const TActorContext& ctx) {
" at tablet %" PRIu64, tabletId, seqno, TabletID());
OutReadSets.AckForDeletedDestination(tabletId, seqno, ctx);
-
- // progress one more Tx to force delayed schema operations
- if (Pipeline.HasSchemaOperation() && OutReadSets.Empty()) {
- // TODO: wait for empty OutRS in a separate unit?
- Pipeline.AddCandidateUnit(EExecutionUnitKind::PlanQueue);
- PlanQueue.Progress(ctx);
- }
+
+ // progress one more Tx to force delayed schema operations
+ if (Pipeline.HasSchemaOperation() && OutReadSets.Empty()) {
+ // TODO: wait for empty OutRS in a separate unit?
+ Pipeline.AddCandidateUnit(EExecutionUnitKind::PlanQueue);
+ PlanQueue.Progress(ctx);
+ }
}
CheckStateChange(ctx);
}
@@ -1992,20 +1992,20 @@ void TDataShard::DoPeriodicTasks(const TActorContext &ctx) {
}
void TDataShard::UpdateLagCounters(const TActorContext &ctx) {
- TDuration dataTxCompleteLag = GetDataTxCompleteLag();
- TabletCounters->Simple()[COUNTER_TX_COMPLETE_LAG].Set(dataTxCompleteLag.MilliSeconds());
- if (dataTxCompleteLag > TDuration::Minutes(5)) {
- LOG_WARN_S(ctx, NKikimrServices::TX_DATASHARD,
- "Tx completion lag (" << dataTxCompleteLag << ") is > 5 min on tablet "
- << TabletID());
+ TDuration dataTxCompleteLag = GetDataTxCompleteLag();
+ TabletCounters->Simple()[COUNTER_TX_COMPLETE_LAG].Set(dataTxCompleteLag.MilliSeconds());
+ if (dataTxCompleteLag > TDuration::Minutes(5)) {
+ LOG_WARN_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Tx completion lag (" << dataTxCompleteLag << ") is > 5 min on tablet "
+ << TabletID());
}
- TDuration scanTxCompleteLag = GetScanTxCompleteLag();
- TabletCounters->Simple()[COUNTER_SCAN_TX_COMPLETE_LAG].Set(scanTxCompleteLag.MilliSeconds());
- if (scanTxCompleteLag > TDuration::Hours(1)) {
- LOG_WARN_S(ctx, NKikimrServices::TX_DATASHARD,
- "Scan completion lag (" << scanTxCompleteLag << ") is > 1 hour on tablet "
- << TabletID());
+ TDuration scanTxCompleteLag = GetScanTxCompleteLag();
+ TabletCounters->Simple()[COUNTER_SCAN_TX_COMPLETE_LAG].Set(scanTxCompleteLag.MilliSeconds());
+ if (scanTxCompleteLag > TDuration::Hours(1)) {
+ LOG_WARN_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Scan completion lag (" << scanTxCompleteLag << ") is > 1 hour on tablet "
+ << TabletID());
}
}
@@ -2014,57 +2014,57 @@ void TDataShard::FillSplitTrajectory(ui64 origin, NKikimrTx::TBalanceTrackList&
Y_UNUSED(tracks);
}
-THolder<TEvTxProcessing::TEvReadSet>
+THolder<TEvTxProcessing::TEvReadSet>
TDataShard::PrepareReadSet(ui64 step, ui64 txId, ui64 source, ui64 target,
- const TString& body, ui64 seqno)
-{
- auto ev = MakeHolder<TEvTxProcessing::TEvReadSet>(step, txId, source, target, TabletID(), body, seqno);
- if (source != TabletID())
- FillSplitTrajectory(source, *ev->Record.MutableBalanceTrackList());
- return ev;
-}
-
+ const TString& body, ui64 seqno)
+{
+ auto ev = MakeHolder<TEvTxProcessing::TEvReadSet>(step, txId, source, target, TabletID(), body, seqno);
+ if (source != TabletID())
+ FillSplitTrajectory(source, *ev->Record.MutableBalanceTrackList());
+ return ev;
+}
+
void TDataShard::SendReadSet(const TActorContext& ctx, ui64 step,
- ui64 txId, ui64 source, ui64 target,
+ ui64 txId, ui64 source, ui64 target,
const TString& body, ui64 seqno)
{
LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
"Send RS at " << TabletID() << " from " << source << " to " << target << " txId " << txId);
- auto ev = PrepareReadSet(step, txId, source, target, body, seqno);
+ auto ev = PrepareReadSet(step, txId, source, target, body, seqno);
IncCounter(COUNTER_READSET_SENT_COUNT);
IncCounter(COUNTER_READSET_SENT_SIZE, body.size());
- PipeClientCache->Send(ctx, target, ev.Release());
+ PipeClientCache->Send(ctx, target, ev.Release());
}
void TDataShard::SendReadSets(const TActorContext& ctx,
- TVector<THolder<TEvTxProcessing::TEvReadSet>> &&readsets)
-{
- TPendingPipeTrackerCommands pendingPipeTrackerCommands;
-
- for (auto &rs : readsets) {
- ui64 txId = rs->Record.GetTxId();
- ui64 source = rs->Record.GetTabletSource();
- ui64 target = rs->Record.GetTabletDest();
- ui64 seqno = rs->Record.GetSeqno();
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Send RS at " << TabletID() << " from " << source
- << " to " << target << " txId " << txId);
-
- IncCounter(COUNTER_READSET_SENT_COUNT);
+ TVector<THolder<TEvTxProcessing::TEvReadSet>> &&readsets)
+{
+ TPendingPipeTrackerCommands pendingPipeTrackerCommands;
+
+ for (auto &rs : readsets) {
+ ui64 txId = rs->Record.GetTxId();
+ ui64 source = rs->Record.GetTabletSource();
+ ui64 target = rs->Record.GetTabletDest();
+ ui64 seqno = rs->Record.GetSeqno();
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Send RS at " << TabletID() << " from " << source
+ << " to " << target << " txId " << txId);
+
+ IncCounter(COUNTER_READSET_SENT_COUNT);
IncCounter(COUNTER_READSET_SENT_SIZE, rs->Record.GetReadSet().size());
-
- pendingPipeTrackerCommands.AttachTablet(seqno, target);
- PipeClientCache->Send(ctx, target, rs.Release());
- }
-
- pendingPipeTrackerCommands.Apply(ResendReadSetPipeTracker, ctx);
- readsets.clear();
-}
-
+
+ pendingPipeTrackerCommands.AttachTablet(seqno, target);
+ PipeClientCache->Send(ctx, target, rs.Release());
+ }
+
+ pendingPipeTrackerCommands.Apply(ResendReadSetPipeTracker, ctx);
+ readsets.clear();
+}
+
void TDataShard::ResendReadSet(const TActorContext& ctx, ui64 step, ui64 txId, ui64 source, ui64 target,
const TString& body, ui64 seqNo)
{
@@ -2076,16 +2076,16 @@ void TDataShard::ResendReadSet(const TActorContext& ctx, ui64 step, ui64 txId, u
}
void TDataShard::UpdateLastSchemeOpSeqNo(const TSchemeOpSeqNo &newSeqNo,
- TTransactionContext &txc)
-{
- NIceDb::TNiceDb db(txc.DB);
- if (LastSchemeOpSeqNo < newSeqNo) {
- LastSchemeOpSeqNo = newSeqNo;
- PersistSys(db, Schema::Sys_LastSchemeShardGeneration, LastSchemeOpSeqNo.Generation);
- PersistSys(db, Schema::Sys_LastSchemeShardRound, LastSchemeOpSeqNo.Round);
- }
-}
-
+ TTransactionContext &txc)
+{
+ NIceDb::TNiceDb db(txc.DB);
+ if (LastSchemeOpSeqNo < newSeqNo) {
+ LastSchemeOpSeqNo = newSeqNo;
+ PersistSys(db, Schema::Sys_LastSchemeShardGeneration, LastSchemeOpSeqNo.Generation);
+ PersistSys(db, Schema::Sys_LastSchemeShardRound, LastSchemeOpSeqNo.Round);
+ }
+}
+
void TDataShard::ResetLastSchemeOpSeqNo(TTransactionContext &txc)
{
NIceDb::TNiceDb db(txc.DB);
@@ -2095,23 +2095,23 @@ void TDataShard::ResetLastSchemeOpSeqNo(TTransactionContext &txc)
}
void TDataShard::PersistProcessingParams(const NKikimrSubDomains::TProcessingParams &params,
- NTabletFlatExecutor::TTransactionContext &txc)
-{
- NIceDb::TNiceDb db(txc.DB);
- ProcessingParams.reset(new NKikimrSubDomains::TProcessingParams());
- ProcessingParams->CopyFrom(params);
+ NTabletFlatExecutor::TTransactionContext &txc)
+{
+ NIceDb::TNiceDb db(txc.DB);
+ ProcessingParams.reset(new NKikimrSubDomains::TProcessingParams());
+ ProcessingParams->CopyFrom(params);
PersistSys(db, TDataShard::Schema::Sys_SubDomainInfo,
- ProcessingParams->SerializeAsString());
-}
-
+ ProcessingParams->SerializeAsString());
+}
+
void TDataShard::PersistCurrentSchemeShardId(ui64 id,
- NTabletFlatExecutor::TTransactionContext &txc)
-{
- NIceDb::TNiceDb db(txc.DB);
+ NTabletFlatExecutor::TTransactionContext &txc)
+{
+ NIceDb::TNiceDb db(txc.DB);
CurrentSchemeShardId = id;
PersistSys(db, TDataShard::Schema::Sys_CurrentSchemeShardId, id);
-}
-
+}
+
void TDataShard::PersistSubDomainPathId(ui64 ownerId, ui64 localPathId,
NTabletFlatExecutor::TTransactionContext &txc)
{
@@ -2130,48 +2130,48 @@ void TDataShard::PersistOwnerPathId(ui64 id,
}
void TDataShard::ResolveTablePath(const TActorContext &ctx)
-{
- if (State != TShardState::Ready)
- return;
-
- for (auto &pr : TableInfos) {
- ui64 pathId = pr.first;
+{
+ if (State != TShardState::Ready)
+ return;
+
+ for (auto &pr : TableInfos) {
+ ui64 pathId = pr.first;
const TUserTable &info = *pr.second;
-
- if (!info.Path) {
- if (!TableResolvePipe) {
- NTabletPipe::TClientConfig clientConfig;
- clientConfig.RetryPolicy = SchemeShardPipeRetryPolicy;
+
+ if (!info.Path) {
+ if (!TableResolvePipe) {
+ NTabletPipe::TClientConfig clientConfig;
+ clientConfig.RetryPolicy = SchemeShardPipeRetryPolicy;
TableResolvePipe = ctx.Register(NTabletPipe::CreateClient(ctx.SelfID, CurrentSchemeShardId, clientConfig));
- }
-
+ }
+
auto *event = new TEvSchemeShard::TEvDescribeScheme(PathOwnerId,
- pathId);
- event->Record.MutableOptions()->SetReturnPartitioningInfo(false);
- event->Record.MutableOptions()->SetReturnPartitionConfig(false);
- event->Record.MutableOptions()->SetReturnChildren(false);
- NTabletPipe::SendData(ctx, TableResolvePipe, event);
- }
- }
-}
-
+ pathId);
+ event->Record.MutableOptions()->SetReturnPartitioningInfo(false);
+ event->Record.MutableOptions()->SetReturnPartitionConfig(false);
+ event->Record.MutableOptions()->SetReturnChildren(false);
+ NTabletPipe::SendData(ctx, TableResolvePipe, event);
+ }
+ }
+}
+
void TDataShard::SerializeHistogram(const TUserTable &tinfo,
- const NTable::THistogram &histogram,
- const NScheme::TTypeRegistry &typeRegistry,
- NKikimrTxDataShard::TEvGetDataHistogramResponse::THistogram &hist)
-{
- for (auto &item : histogram) {
- auto &rec = *hist.AddItems();
- rec.SetValue(item.Value);
-
- TSerializedCellVec key(item.EndKey);
- for (ui32 ki = 0; ki < tinfo.KeyColumnIds.size(); ++ki) {
- NScheme::ITypeSP t = typeRegistry.GetType(tinfo.KeyColumnTypes[ki]);
- DbgPrintValue(*rec.AddKeyValues(), key.GetCells()[ki], t.GetTypeId());
- }
- }
-}
-
+ const NTable::THistogram &histogram,
+ const NScheme::TTypeRegistry &typeRegistry,
+ NKikimrTxDataShard::TEvGetDataHistogramResponse::THistogram &hist)
+{
+ for (auto &item : histogram) {
+ auto &rec = *hist.AddItems();
+ rec.SetValue(item.Value);
+
+ TSerializedCellVec key(item.EndKey);
+ for (ui32 ki = 0; ki < tinfo.KeyColumnIds.size(); ++ki) {
+ NScheme::ITypeSP t = typeRegistry.GetType(tinfo.KeyColumnTypes[ki]);
+ DbgPrintValue(*rec.AddKeyValues(), key.GetCells()[ki], t.GetTypeId());
+ }
+ }
+}
+
void TDataShard::SerializeKeySample(const TUserTable &tinfo,
const NTable::TKeyAccessSample &keySample,
const NScheme::TTypeRegistry &typeRegistry,
@@ -2200,56 +2200,56 @@ void TDataShard::SerializeKeySample(const TUserTable &tinfo,
void TDataShard::Handle(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult::TPtr ev,
- const TActorContext &ctx)
-{
- const auto &rec = ev->Get()->GetRecord();
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Got scheme resolve result at " << TabletID() << ": "
- << rec.ShortDebugString());
-
- ui64 pathId = rec.GetPathId();
- if (!TableInfos.contains(pathId)) {
- LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
- "Shard " << TabletID() << " got describe result for unknown table "
- << pathId);
- return;
- }
-
- if (!rec.GetPath()) {
- LOG_CRIT_S(ctx, NKikimrServices::TX_DATASHARD,
- "Shard " << TabletID() << " couldn't get path for table "
- << pathId << " with status " << rec.GetStatus());
- return;
- }
- Execute(new TTxStoreTablePath(this, pathId, rec.GetPath()), ctx);
-}
-
+ const TActorContext &ctx)
+{
+ const auto &rec = ev->Get()->GetRecord();
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Got scheme resolve result at " << TabletID() << ": "
+ << rec.ShortDebugString());
+
+ ui64 pathId = rec.GetPathId();
+ if (!TableInfos.contains(pathId)) {
+ LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Shard " << TabletID() << " got describe result for unknown table "
+ << pathId);
+ return;
+ }
+
+ if (!rec.GetPath()) {
+ LOG_CRIT_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Shard " << TabletID() << " couldn't get path for table "
+ << pathId << " with status " << rec.GetStatus());
+ return;
+ }
+ Execute(new TTxStoreTablePath(this, pathId, rec.GetPath()), ctx);
+}
+
void TDataShard::Handle(TEvDataShard::TEvGetInfoRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- Execute(CreateTxGetInfo(this, ev), ctx);
-}
-
+ const TActorContext &ctx)
+{
+ Execute(CreateTxGetInfo(this, ev), ctx);
+}
+
void TDataShard::Handle(TEvDataShard::TEvListOperationsRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- Execute(CreateTxListOperations(this, ev), ctx);
-}
-
+ const TActorContext &ctx)
+{
+ Execute(CreateTxListOperations(this, ev), ctx);
+}
+
void TDataShard::Handle(TEvDataShard::TEvGetOperationRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- Execute(CreateTxGetOperation(this, ev), ctx);
-}
-
+ const TActorContext &ctx)
+{
+ Execute(CreateTxGetOperation(this, ev), ctx);
+}
+
void TDataShard::Handle(TEvDataShard::TEvGetDataHistogramRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- auto *response = new TEvDataShard::TEvGetDataHistogramResponse;
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+ const TActorContext &ctx)
+{
+ auto *response = new TEvDataShard::TEvGetDataHistogramResponse;
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
const auto& rec = ev->Get()->Record;
-
+
if (rec.GetCollectKeySampleMs() > 0) {
EnableKeyAccessSampling(ctx,
AppData(ctx)->TimeProvider->Now() + TDuration::MilliSeconds(rec.GetCollectKeySampleMs()));
@@ -2263,169 +2263,169 @@ void TDataShard::Handle(TEvDataShard::TEvGetDataHistogramRequest::TPtr &ev,
}
}
- auto &reg = *AppData(ctx)->TypeRegistry;
- for (const auto &pr : TableInfos) {
- const auto &tinfo = *pr.second;
- const NTable::TStats &stats = tinfo.Stats.DataStats;
-
- auto &hist = *response->Record.AddTableHistograms();
- hist.SetTableName(pr.second->Name);
- for (ui32 ki : tinfo.KeyColumnIds)
- hist.AddKeyNames(tinfo.Columns.FindPtr(ki)->Name);
- SerializeHistogram(tinfo, stats.DataSizeHistogram, reg, *hist.MutableSizeHistogram());
- SerializeHistogram(tinfo, stats.RowCountHistogram, reg, *hist.MutableCountHistogram());
+ auto &reg = *AppData(ctx)->TypeRegistry;
+ for (const auto &pr : TableInfos) {
+ const auto &tinfo = *pr.second;
+ const NTable::TStats &stats = tinfo.Stats.DataStats;
+
+ auto &hist = *response->Record.AddTableHistograms();
+ hist.SetTableName(pr.second->Name);
+ for (ui32 ki : tinfo.KeyColumnIds)
+ hist.AddKeyNames(tinfo.Columns.FindPtr(ki)->Name);
+ SerializeHistogram(tinfo, stats.DataSizeHistogram, reg, *hist.MutableSizeHistogram());
+ SerializeHistogram(tinfo, stats.RowCountHistogram, reg, *hist.MutableCountHistogram());
SerializeKeySample(tinfo, tinfo.Stats.AccessStats, reg, *hist.MutableKeyAccessSample());
- }
-
- ctx.Send(ev->Sender, response);
-}
-
+ }
+
+ ctx.Send(ev->Sender, response);
+}
+
void TDataShard::Handle(TEvDataShard::TEvGetReadTableSinkStateRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- ui64 txId = ev->Get()->Record.GetTxId();
- auto op = Pipeline.FindOp(txId);
- if (!op) {
- auto *response = new TEvDataShard::TEvGetReadTableSinkStateResponse;
- SetStatusError(response->Record, Ydb::StatusIds::NOT_FOUND,
- TStringBuilder() << "Cannot find operation "
- << txId << " on shard " << TabletID());
- ctx.Send(ev->Sender, response);
- return;
- }
-
- if (op->GetKind() != EOperationKind::ReadTable) {
- auto *response = new TEvDataShard::TEvGetReadTableSinkStateResponse;
- SetStatusError(response->Record, Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "Cannot get sink state for tx of kind "
- << op->GetKind());
- ctx.Send(ev->Sender, response);
- return;
- }
-
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
- ctx.Send(ev->Forward(tx->GetStreamSink()));
-}
-
+ const TActorContext &ctx)
+{
+ ui64 txId = ev->Get()->Record.GetTxId();
+ auto op = Pipeline.FindOp(txId);
+ if (!op) {
+ auto *response = new TEvDataShard::TEvGetReadTableSinkStateResponse;
+ SetStatusError(response->Record, Ydb::StatusIds::NOT_FOUND,
+ TStringBuilder() << "Cannot find operation "
+ << txId << " on shard " << TabletID());
+ ctx.Send(ev->Sender, response);
+ return;
+ }
+
+ if (op->GetKind() != EOperationKind::ReadTable) {
+ auto *response = new TEvDataShard::TEvGetReadTableSinkStateResponse;
+ SetStatusError(response->Record, Ydb::StatusIds::BAD_REQUEST,
+ TStringBuilder() << "Cannot get sink state for tx of kind "
+ << op->GetKind());
+ ctx.Send(ev->Sender, response);
+ return;
+ }
+
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+ ctx.Send(ev->Forward(tx->GetStreamSink()));
+}
+
void TDataShard::Handle(TEvDataShard::TEvGetReadTableScanStateRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- ui64 txId = ev->Get()->Record.GetTxId();
- auto op = Pipeline.FindOp(txId);
- if (!op) {
- auto *response = new TEvDataShard::TEvGetReadTableScanStateResponse;
- SetStatusError(response->Record, Ydb::StatusIds::NOT_FOUND,
- TStringBuilder() << "Cannot find operation "
- << txId << " on shard " << TabletID());
- ctx.Send(ev->Sender, response);
- return;
- }
-
- if (op->GetKind() != EOperationKind::ReadTable) {
- auto *response = new TEvDataShard::TEvGetReadTableScanStateResponse;
- SetStatusError(response->Record, Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "Cannot get scan state for tx of kind "
- << op->GetKind());
- ctx.Send(ev->Sender, response);
- return;
- }
-
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
- ctx.Send(ev->Forward(tx->GetStreamSink()));
-
- if (!tx->GetScanActor()) {
- auto *response = new TEvDataShard::TEvGetReadTableScanStateResponse;
- SetStatusError(response->Record, Ydb::StatusIds::GENERIC_ERROR,
- TStringBuilder() << "Operation has no registered scan actor");
- ctx.Send(ev->Sender, response);
- return;
- }
-
- ctx.Send(ev->Forward(tx->GetScanActor()));
-}
-
+ const TActorContext &ctx)
+{
+ ui64 txId = ev->Get()->Record.GetTxId();
+ auto op = Pipeline.FindOp(txId);
+ if (!op) {
+ auto *response = new TEvDataShard::TEvGetReadTableScanStateResponse;
+ SetStatusError(response->Record, Ydb::StatusIds::NOT_FOUND,
+ TStringBuilder() << "Cannot find operation "
+ << txId << " on shard " << TabletID());
+ ctx.Send(ev->Sender, response);
+ return;
+ }
+
+ if (op->GetKind() != EOperationKind::ReadTable) {
+ auto *response = new TEvDataShard::TEvGetReadTableScanStateResponse;
+ SetStatusError(response->Record, Ydb::StatusIds::BAD_REQUEST,
+ TStringBuilder() << "Cannot get scan state for tx of kind "
+ << op->GetKind());
+ ctx.Send(ev->Sender, response);
+ return;
+ }
+
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+ ctx.Send(ev->Forward(tx->GetStreamSink()));
+
+ if (!tx->GetScanActor()) {
+ auto *response = new TEvDataShard::TEvGetReadTableScanStateResponse;
+ SetStatusError(response->Record, Ydb::StatusIds::GENERIC_ERROR,
+ TStringBuilder() << "Operation has no registered scan actor");
+ ctx.Send(ev->Sender, response);
+ return;
+ }
+
+ ctx.Send(ev->Forward(tx->GetScanActor()));
+}
+
void TDataShard::Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- ui64 txId = ev->Get()->Record.GetTxId();
- auto op = Pipeline.FindOp(txId);
- if (!op) {
- auto *response = new TEvDataShard::TEvGetReadTableStreamStateResponse;
- SetStatusError(response->Record, Ydb::StatusIds::NOT_FOUND,
- TStringBuilder() << "Cannot find operation "
- << txId << " on shard " << TabletID());
- ctx.Send(ev->Sender, response);
- return;
- }
-
- if (op->GetKind() != EOperationKind::ReadTable) {
- auto *response = new TEvDataShard::TEvGetReadTableStreamStateResponse;
- SetStatusError(response->Record, Ydb::StatusIds::BAD_REQUEST,
- TStringBuilder() << "Cannot get stream state for tx of kind "
- << op->GetKind());
- ctx.Send(ev->Sender, response);
- return;
- }
-
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
- ctx.Send(ev->Forward(tx->GetStreamSink()));
-}
-
+ const TActorContext &ctx)
+{
+ ui64 txId = ev->Get()->Record.GetTxId();
+ auto op = Pipeline.FindOp(txId);
+ if (!op) {
+ auto *response = new TEvDataShard::TEvGetReadTableStreamStateResponse;
+ SetStatusError(response->Record, Ydb::StatusIds::NOT_FOUND,
+ TStringBuilder() << "Cannot find operation "
+ << txId << " on shard " << TabletID());
+ ctx.Send(ev->Sender, response);
+ return;
+ }
+
+ if (op->GetKind() != EOperationKind::ReadTable) {
+ auto *response = new TEvDataShard::TEvGetReadTableStreamStateResponse;
+ SetStatusError(response->Record, Ydb::StatusIds::BAD_REQUEST,
+ TStringBuilder() << "Cannot get stream state for tx of kind "
+ << op->GetKind());
+ ctx.Send(ev->Sender, response);
+ return;
+ }
+
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+ ctx.Send(ev->Forward(tx->GetStreamSink()));
+}
+
void TDataShard::Handle(TEvDataShard::TEvGetRSInfoRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- auto *response = new TEvDataShard::TEvGetRSInfoResponse;
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- for (auto &pr : OutReadSets.CurrentReadSets) {
- auto &rs = *response->Record.AddOutReadSets();
- rs.SetTxId(pr.second.TxId);
- rs.SetOrigin(pr.second.Origin);
- rs.SetSource(pr.second.From);
- rs.SetDestination(pr.second.To);
- rs.SetSeqNo(pr.first);
- }
-
- for (auto &p : OutReadSets.ReadSetAcks) {
- auto &rec = p->Record;
- auto &ack = *response->Record.AddOutRSAcks();
- ack.SetTxId(rec.GetTxId());
- ack.SetStep(rec.GetStep());
- ack.SetOrigin(rec.GetTabletConsumer());
- ack.SetSource(rec.GetTabletSource());
- ack.SetDestination(rec.GetTabletDest());
- ack.SetSeqNo(rec.GetSeqno());
- }
-
- for (auto &pr : Pipeline.GetDelayedAcks()) {
- auto *ev = dynamic_cast<TEvTxProcessing::TEvReadSetAck*>(pr.second->GetBase());
- if (ev) {
- auto &rec = ev->Record;
- auto &ack = *response->Record.AddDelayedRSAcks();
- ack.SetTxId(rec.GetTxId());
- ack.SetStep(rec.GetStep());
- ack.SetOrigin(rec.GetTabletConsumer());
- ack.SetSource(rec.GetTabletSource());
- ack.SetDestination(rec.GetTabletDest());
- ack.SetSeqNo(rec.GetSeqno());
- }
- }
-
- ctx.Send(ev->Sender, response);
-}
-
+ const TActorContext &ctx)
+{
+ auto *response = new TEvDataShard::TEvGetRSInfoResponse;
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+
+ for (auto &pr : OutReadSets.CurrentReadSets) {
+ auto &rs = *response->Record.AddOutReadSets();
+ rs.SetTxId(pr.second.TxId);
+ rs.SetOrigin(pr.second.Origin);
+ rs.SetSource(pr.second.From);
+ rs.SetDestination(pr.second.To);
+ rs.SetSeqNo(pr.first);
+ }
+
+ for (auto &p : OutReadSets.ReadSetAcks) {
+ auto &rec = p->Record;
+ auto &ack = *response->Record.AddOutRSAcks();
+ ack.SetTxId(rec.GetTxId());
+ ack.SetStep(rec.GetStep());
+ ack.SetOrigin(rec.GetTabletConsumer());
+ ack.SetSource(rec.GetTabletSource());
+ ack.SetDestination(rec.GetTabletDest());
+ ack.SetSeqNo(rec.GetSeqno());
+ }
+
+ for (auto &pr : Pipeline.GetDelayedAcks()) {
+ auto *ev = dynamic_cast<TEvTxProcessing::TEvReadSetAck*>(pr.second->GetBase());
+ if (ev) {
+ auto &rec = ev->Record;
+ auto &ack = *response->Record.AddDelayedRSAcks();
+ ack.SetTxId(rec.GetTxId());
+ ack.SetStep(rec.GetStep());
+ ack.SetOrigin(rec.GetTabletConsumer());
+ ack.SetSource(rec.GetTabletSource());
+ ack.SetDestination(rec.GetTabletDest());
+ ack.SetSeqNo(rec.GetSeqno());
+ }
+ }
+
+ ctx.Send(ev->Sender, response);
+}
+
void TDataShard::Handle(TEvDataShard::TEvGetSlowOpProfilesRequest::TPtr &ev,
- const TActorContext &ctx)
-{
- auto *response = new TEvDataShard::TEvGetSlowOpProfilesResponse;
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
- Pipeline.FillStoredExecutionProfiles(response->Record);
- ctx.Send(ev->Sender, response);
-}
-
+ const TActorContext &ctx)
+{
+ auto *response = new TEvDataShard::TEvGetSlowOpProfilesResponse;
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+ Pipeline.FillStoredExecutionProfiles(response->Record);
+ ctx.Send(ev->Sender, response);
+}
+
void TDataShard::Handle(TEvDataShard::TEvRefreshVolatileSnapshotRequest::TPtr& ev, const TActorContext& ctx) {
Execute(new TTxRefreshVolatileSnapshot(this, std::move(ev)), ctx);
}
@@ -2435,28 +2435,28 @@ void TDataShard::Handle(TEvDataShard::TEvDiscardVolatileSnapshotRequest::TPtr& e
}
void TDataShard::Handle(TEvents::TEvUndelivered::TPtr &ev,
- const TActorContext &ctx)
-{
- auto op = Pipeline.FindOp(ev->Cookie);
- if (op) {
- op->AddInputEvent(ev.Release());
- Pipeline.AddCandidateOp(op);
- PlanQueue.Progress(ctx);
- }
-}
-
+ const TActorContext &ctx)
+{
+ auto op = Pipeline.FindOp(ev->Cookie);
+ if (op) {
+ op->AddInputEvent(ev.Release());
+ Pipeline.AddCandidateOp(op);
+ PlanQueue.Progress(ctx);
+ }
+}
+
void TDataShard::Handle(TEvInterconnect::TEvNodeDisconnected::TPtr &ev,
- const TActorContext &ctx)
-{
+ const TActorContext &ctx)
+{
const ui32 nodeId = ev->Get()->NodeId;
-
- LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Shard " << TabletID() << " disconnected from node " << nodeId);
-
- Pipeline.ProcessDisconnected(nodeId);
- PlanQueue.Progress(ctx);
-}
-
+
+ LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Shard " << TabletID() << " disconnected from node " << nodeId);
+
+ Pipeline.ProcessDisconnected(nodeId);
+ PlanQueue.Progress(ctx);
+}
+
void TDataShard::Handle(TEvDataShard::TEvMigrateSchemeShardRequest::TPtr& ev,
const TActorContext& ctx)
{
@@ -2511,13 +2511,13 @@ void TDataShard::Handle(TEvDataShard::TEvUnsafeUploadRowsRequest::TPtr& ev, cons
void TDataShard::ScanComplete(NTable::EAbort,
TAutoPtr<IDestructable> prod,
- ui64 cookie,
- const TActorContext &ctx)
-{
+ ui64 cookie,
+ const TActorContext &ctx)
+{
if (auto* noTxScan = dynamic_cast<INoTxScan*>(prod.Get())) {
LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD, "Non-transactinal scan complete at "
<< TabletID());
-
+
noTxScan->OnFinished(this);
prod.Destroy();
} else {
@@ -2546,12 +2546,12 @@ void TDataShard::ScanComplete(NTable::EAbort,
"Scan complete at " << TabletID() << " for unknown tx " << cookie);
}
}
- }
-
- // Continue current Tx
- PlanQueue.Progress(ctx);
-}
-
+ }
+
+ // Continue current Tx
+ PlanQueue.Progress(ctx);
+}
+
void TDataShard::Handle(TEvPrivate::TEvAsyncJobComplete::TPtr &ev, const TActorContext &ctx) {
LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD, "AsyncJob complete"
<< " at " << TabletID());
@@ -2579,7 +2579,7 @@ void TDataShard::Handle(TEvPrivate::TEvAsyncJobComplete::TPtr &ev, const TActorC
bool TDataShard::ReassignChannelsEnabled() const {
return true;
}
-
+
void TDataShard::ExecuteProgressTx(const TActorContext& ctx) {
Execute(new TTxProgressTransaction(this), ctx);
}
diff --git a/ydb/core/tx/datashard/datashard.h b/ydb/core/tx/datashard/datashard.h
index c98b31ec978..5a93c035026 100644
--- a/ydb/core/tx/datashard/datashard.h
+++ b/ydb/core/tx/datashard/datashard.h
@@ -27,81 +27,81 @@ namespace NDataShard {
struct TTxFlags {
enum Flags : ui64 {
- ////////////////////////////
- // Public operation flags //
- ////////////////////////////
+ ////////////////////////////
+ // Public operation flags //
+ ////////////////////////////
Default = 0,
Dirty = 0x01,
DenyOnlineIfSnapshotNotReady = 0x02,
ForceOnline = 0x04,
- Immediate = 0x08,
-
- PublicFlagsMask = 0x000000000000FFFF,
-
- //////////////////////////////
- // Internal operation flags //
- //////////////////////////////
- ForceDirty = 1ULL << 16,
- // Operation is currently executed within some
- // tablet transaction
- InProgress = 1ULL << 17,
- // Operation execution was completed. No more
- // local database accesses will be made for it
- Completed = 1ULL << 18,
- // Operation execution was interrupted by
- // external event
- Interrupted = 1ULL << 19,
- // Operation execution was aborted due to
- // internal error
- Aborted = 1ULL << 20,
- // Operation doesn't modify user data (operation
- // execution may still require system data
- // modification like storing operation in local
- // database)
- ReadOnly = 1ULL << 21,
- // Operation can block proposal of some
- // other operations
- ProposeBlocker = 1ULL << 22,
- // Operation requests additional diagnostics
- // in its response
- NeedDiagnostics = 1ULL << 24,
- // Operation is considered as reading
- // all shard data
- GlobalReader = 1ULL << 25,
- // Operation is considered as affecting
- // all shard data
- GlobalWriter = 1ULL << 26,
- // Operation waits for dependencies to
- // start execution
- WaitingDependencies = 1ULL << 27,
- // Operation is executing. It's considered that
- // all operations having this flag set at the
- // same time can be executed in any order. All
- // operations with this flag set should be added
- // to ExecutingOps set in pipeline. Only executing
- // operations can receive input data
- Executing = 1ULL << 28,
- // Operation is working on a snapshot and therefore
- // doesn't conflict with other operations by data
- UsingSnapshot = 1ULL << 29,
- // Operation is using new execution engine
- KqpDataTransaction = 1ULL << 30,
- // Operation attached RS to KQP task runner
- // TODO: rework execution to remove this flag
- KqpAttachedRS = 1ULL << 31,
- // All input RS for operation were loaded from
- // local database
- LoadedInRS = 1ULL << 32,
+ Immediate = 0x08,
+
+ PublicFlagsMask = 0x000000000000FFFF,
+
+ //////////////////////////////
+ // Internal operation flags //
+ //////////////////////////////
+ ForceDirty = 1ULL << 16,
+ // Operation is currently executed within some
+ // tablet transaction
+ InProgress = 1ULL << 17,
+ // Operation execution was completed. No more
+ // local database accesses will be made for it
+ Completed = 1ULL << 18,
+ // Operation execution was interrupted by
+ // external event
+ Interrupted = 1ULL << 19,
+ // Operation execution was aborted due to
+ // internal error
+ Aborted = 1ULL << 20,
+ // Operation doesn't modify user data (operation
+ // execution may still require system data
+ // modification like storing operation in local
+ // database)
+ ReadOnly = 1ULL << 21,
+ // Operation can block proposal of some
+ // other operations
+ ProposeBlocker = 1ULL << 22,
+ // Operation requests additional diagnostics
+ // in its response
+ NeedDiagnostics = 1ULL << 24,
+ // Operation is considered as reading
+ // all shard data
+ GlobalReader = 1ULL << 25,
+ // Operation is considered as affecting
+ // all shard data
+ GlobalWriter = 1ULL << 26,
+ // Operation waits for dependencies to
+ // start execution
+ WaitingDependencies = 1ULL << 27,
+ // Operation is executing. It's considered that
+ // all operations having this flag set at the
+ // same time can be executed in any order. All
+ // operations with this flag set should be added
+ // to ExecutingOps set in pipeline. Only executing
+ // operations can receive input data
+ Executing = 1ULL << 28,
+ // Operation is working on a snapshot and therefore
+ // doesn't conflict with other operations by data
+ UsingSnapshot = 1ULL << 29,
+ // Operation is using new execution engine
+ KqpDataTransaction = 1ULL << 30,
+ // Operation attached RS to KQP task runner
+ // TODO: rework execution to remove this flag
+ KqpAttachedRS = 1ULL << 31,
+ // All input RS for operation were loaded from
+ // local database
+ LoadedInRS = 1ULL << 32,
// Operation is using new execution engine in scan mode
KqpScanTransaction = 1ULL << 33,
- // Operation is waiting for stream clearance
- WaitingForStreamClearance = 1ULL << 34,
- // Operation is interested in interconnect disconnects
- ProcessDisconnects = 1ULL << 35,
- // Operation is waiting for async scan to finish
- WaitingForScan = 1ULL << 36,
- // Operation is waiting for snapshot
- WaitingForSnapshot = 1ULL << 37,
+ // Operation is waiting for stream clearance
+ WaitingForStreamClearance = 1ULL << 34,
+ // Operation is interested in interconnect disconnects
+ ProcessDisconnects = 1ULL << 35,
+ // Operation is waiting for async scan to finish
+ WaitingForScan = 1ULL << 36,
+ // Operation is waiting for snapshot
+ WaitingForSnapshot = 1ULL << 37,
// Operation is blocking conflicting immediate ops until it completes
BlockingImmediateOps = 1ULL << 38,
// Operation is blocking conflicting immediate writes until it completes
@@ -116,11 +116,11 @@ namespace NDataShard {
WaitingForAsyncJob = 1ULL << 43,
// Operation must complete before results sending
WaitCompletion = 1ULL << 44,
-
+
LastFlag = WaitCompletion,
-
- PrivateFlagsMask = 0xFFFFFFFFFFFF0000ULL,
- PreservedPrivateFlagsMask = ReadOnly | ProposeBlocker | NeedDiagnostics | GlobalReader
+
+ PrivateFlagsMask = 0xFFFFFFFFFFFF0000ULL,
+ PreservedPrivateFlagsMask = ReadOnly | ProposeBlocker | NeedDiagnostics | GlobalReader
| GlobalWriter | KqpDataTransaction | KqpScanTransaction
| BlockingImmediateOps | BlockingImmediateWrites,
};
@@ -128,8 +128,8 @@ namespace NDataShard {
// Old datashard uses Uint32 column type for flags in local database.
static_assert(TTxFlags::PreservedPrivateFlagsMask <= Max<ui64>());
- static_assert(TTxFlags::PublicFlagsMask <= Max<ui32>());
-
+ static_assert(TTxFlags::PublicFlagsMask <= Max<ui32>());
+
// NOTE: this switch should be modified only in tests !!!
extern bool gAllowLogBatchingDefaultValue;
extern TDuration gDbStatsReportInterval;
@@ -234,30 +234,30 @@ struct TEvDataShard {
EvReadColumnsRequest,
EvReadColumnsResponse,
- EvGetInfoRequest,
- EvGetInfoResponse,
- EvListOperationsRequest,
- EvListOperationsResponse,
- EvGetOperationRequest,
- EvGetOperationResponse,
- EvGetReadTableSinkStateRequest,
- EvGetReadTableSinkStateResponse,
- EvGetReadTableScanStateRequest,
- EvGetReadTableScanStateResponse,
- EvGetReadTableStreamStateRequest,
- EvGetReadTableStreamStateResponse,
- EvGetSlowOpProfilesRequest,
- EvGetSlowOpProfilesResponse,
- EvGetRSInfoRequest,
- EvGetRSInfoResponse,
- EvGetDataHistogramRequest,
- EvGetDataHistogramResponse,
+ EvGetInfoRequest,
+ EvGetInfoResponse,
+ EvListOperationsRequest,
+ EvListOperationsResponse,
+ EvGetOperationRequest,
+ EvGetOperationResponse,
+ EvGetReadTableSinkStateRequest,
+ EvGetReadTableSinkStateResponse,
+ EvGetReadTableScanStateRequest,
+ EvGetReadTableScanStateResponse,
+ EvGetReadTableStreamStateRequest,
+ EvGetReadTableStreamStateResponse,
+ EvGetSlowOpProfilesRequest,
+ EvGetSlowOpProfilesResponse,
+ EvGetRSInfoRequest,
+ EvGetRSInfoResponse,
+ EvGetDataHistogramRequest,
+ EvGetDataHistogramResponse,
EvCancelFillIndex_DEPRECATED,
EvRefreshVolatileSnapshotRequest,
EvRefreshVolatileSnapshotResponse,
EvDiscardVolatileSnapshotRequest,
EvDiscardVolatileSnapshotResponse,
-
+
EvGetS3Upload,
EvStoreS3UploadId,
EvS3Upload,
@@ -499,7 +499,7 @@ struct TEvDataShard {
bool IsTryLater() const { return GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::TRY_LATER; }
bool IsExecError() const { return GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::EXEC_ERROR; }
bool IsError() const { return GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::ERROR; }
- bool IsBadRequest() const { return GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::BAD_REQUEST; }
+ bool IsBadRequest() const { return GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::BAD_REQUEST; }
bool IsForceOnline() const { return ForceOnline; }
bool IsForceDirty() const { return ForceDirty; }
@@ -1011,95 +1011,95 @@ struct TEvDataShard {
}
};
- struct TEvGetInfoRequest : public TEventPB<TEvGetInfoRequest,
- NKikimrTxDataShard::TEvGetInfoRequest,
- TEvDataShard::EvGetInfoRequest> {
- };
-
- struct TEvGetInfoResponse : public TEventPB<TEvGetInfoResponse,
- NKikimrTxDataShard::TEvGetInfoResponse,
- TEvDataShard::EvGetInfoResponse> {
- };
-
- struct TEvListOperationsRequest : public TEventPB<TEvListOperationsRequest,
- NKikimrTxDataShard::TEvListOperationsRequest,
- TEvDataShard::EvListOperationsRequest> {
- };
-
- struct TEvListOperationsResponse : public TEventPB<TEvListOperationsResponse,
- NKikimrTxDataShard::TEvListOperationsResponse,
- TEvDataShard::EvListOperationsResponse> {
- };
-
- struct TEvGetOperationRequest : public TEventPB<TEvGetOperationRequest,
- NKikimrTxDataShard::TEvGetOperationRequest,
- TEvDataShard::EvGetOperationRequest> {
- };
-
- struct TEvGetOperationResponse : public TEventPB<TEvGetOperationResponse,
- NKikimrTxDataShard::TEvGetOperationResponse,
- TEvDataShard::EvGetOperationResponse> {
- };
-
- struct TEvGetReadTableSinkStateRequest : public TEventPB<TEvGetReadTableSinkStateRequest,
- NKikimrTxDataShard::TEvGetReadTableSinkStateRequest,
- TEvDataShard::EvGetReadTableSinkStateRequest> {
- };
-
- struct TEvGetReadTableSinkStateResponse : public TEventPB<TEvGetReadTableSinkStateResponse,
- NKikimrTxDataShard::TEvGetReadTableSinkStateResponse,
- TEvDataShard::EvGetReadTableSinkStateResponse> {
- };
-
- struct TEvGetReadTableScanStateRequest : public TEventPB<TEvGetReadTableScanStateRequest,
- NKikimrTxDataShard::TEvGetReadTableScanStateRequest,
- TEvDataShard::EvGetReadTableScanStateRequest> {
- };
-
- struct TEvGetReadTableScanStateResponse : public TEventPB<TEvGetReadTableScanStateResponse,
- NKikimrTxDataShard::TEvGetReadTableScanStateResponse,
- TEvDataShard::EvGetReadTableScanStateResponse> {
- };
-
- struct TEvGetReadTableStreamStateRequest : public TEventPB<TEvGetReadTableStreamStateRequest,
- NKikimrTxDataShard::TEvGetReadTableStreamStateRequest,
- TEvDataShard::EvGetReadTableStreamStateRequest> {
- };
-
- struct TEvGetReadTableStreamStateResponse : public TEventPB<TEvGetReadTableStreamStateResponse,
- NKikimrTxDataShard::TEvGetReadTableStreamStateResponse,
- TEvDataShard::EvGetReadTableStreamStateResponse> {
- };
-
- struct TEvGetSlowOpProfilesRequest : public TEventPB<TEvGetSlowOpProfilesRequest,
- NKikimrTxDataShard::TEvGetSlowOpProfilesRequest,
- TEvDataShard::EvGetSlowOpProfilesRequest> {
- };
-
- struct TEvGetSlowOpProfilesResponse : public TEventPB<TEvGetSlowOpProfilesResponse,
- NKikimrTxDataShard::TEvGetSlowOpProfilesResponse,
- TEvDataShard::EvGetSlowOpProfilesResponse> {
- };
-
- struct TEvGetRSInfoRequest : public TEventPB<TEvGetRSInfoRequest,
- NKikimrTxDataShard::TEvGetRSInfoRequest,
- TEvDataShard::EvGetRSInfoRequest> {
- };
-
- struct TEvGetRSInfoResponse : public TEventPB<TEvGetRSInfoResponse,
- NKikimrTxDataShard::TEvGetRSInfoResponse,
- TEvDataShard::EvGetRSInfoResponse> {
- };
-
- struct TEvGetDataHistogramRequest : public TEventPB<TEvGetDataHistogramRequest,
- NKikimrTxDataShard::TEvGetDataHistogramRequest,
- TEvDataShard::EvGetDataHistogramRequest> {
- };
-
- struct TEvGetDataHistogramResponse : public TEventPB<TEvGetDataHistogramResponse,
- NKikimrTxDataShard::TEvGetDataHistogramResponse,
- TEvDataShard::EvGetDataHistogramResponse> {
- };
+ struct TEvGetInfoRequest : public TEventPB<TEvGetInfoRequest,
+ NKikimrTxDataShard::TEvGetInfoRequest,
+ TEvDataShard::EvGetInfoRequest> {
+ };
+
+ struct TEvGetInfoResponse : public TEventPB<TEvGetInfoResponse,
+ NKikimrTxDataShard::TEvGetInfoResponse,
+ TEvDataShard::EvGetInfoResponse> {
+ };
+
+ struct TEvListOperationsRequest : public TEventPB<TEvListOperationsRequest,
+ NKikimrTxDataShard::TEvListOperationsRequest,
+ TEvDataShard::EvListOperationsRequest> {
+ };
+
+ struct TEvListOperationsResponse : public TEventPB<TEvListOperationsResponse,
+ NKikimrTxDataShard::TEvListOperationsResponse,
+ TEvDataShard::EvListOperationsResponse> {
+ };
+
+ struct TEvGetOperationRequest : public TEventPB<TEvGetOperationRequest,
+ NKikimrTxDataShard::TEvGetOperationRequest,
+ TEvDataShard::EvGetOperationRequest> {
+ };
+
+ struct TEvGetOperationResponse : public TEventPB<TEvGetOperationResponse,
+ NKikimrTxDataShard::TEvGetOperationResponse,
+ TEvDataShard::EvGetOperationResponse> {
+ };
+
+ struct TEvGetReadTableSinkStateRequest : public TEventPB<TEvGetReadTableSinkStateRequest,
+ NKikimrTxDataShard::TEvGetReadTableSinkStateRequest,
+ TEvDataShard::EvGetReadTableSinkStateRequest> {
+ };
+
+ struct TEvGetReadTableSinkStateResponse : public TEventPB<TEvGetReadTableSinkStateResponse,
+ NKikimrTxDataShard::TEvGetReadTableSinkStateResponse,
+ TEvDataShard::EvGetReadTableSinkStateResponse> {
+ };
+
+ struct TEvGetReadTableScanStateRequest : public TEventPB<TEvGetReadTableScanStateRequest,
+ NKikimrTxDataShard::TEvGetReadTableScanStateRequest,
+ TEvDataShard::EvGetReadTableScanStateRequest> {
+ };
+
+ struct TEvGetReadTableScanStateResponse : public TEventPB<TEvGetReadTableScanStateResponse,
+ NKikimrTxDataShard::TEvGetReadTableScanStateResponse,
+ TEvDataShard::EvGetReadTableScanStateResponse> {
+ };
+
+ struct TEvGetReadTableStreamStateRequest : public TEventPB<TEvGetReadTableStreamStateRequest,
+ NKikimrTxDataShard::TEvGetReadTableStreamStateRequest,
+ TEvDataShard::EvGetReadTableStreamStateRequest> {
+ };
+
+ struct TEvGetReadTableStreamStateResponse : public TEventPB<TEvGetReadTableStreamStateResponse,
+ NKikimrTxDataShard::TEvGetReadTableStreamStateResponse,
+ TEvDataShard::EvGetReadTableStreamStateResponse> {
+ };
+
+ struct TEvGetSlowOpProfilesRequest : public TEventPB<TEvGetSlowOpProfilesRequest,
+ NKikimrTxDataShard::TEvGetSlowOpProfilesRequest,
+ TEvDataShard::EvGetSlowOpProfilesRequest> {
+ };
+
+ struct TEvGetSlowOpProfilesResponse : public TEventPB<TEvGetSlowOpProfilesResponse,
+ NKikimrTxDataShard::TEvGetSlowOpProfilesResponse,
+ TEvDataShard::EvGetSlowOpProfilesResponse> {
+ };
+
+ struct TEvGetRSInfoRequest : public TEventPB<TEvGetRSInfoRequest,
+ NKikimrTxDataShard::TEvGetRSInfoRequest,
+ TEvDataShard::EvGetRSInfoRequest> {
+ };
+
+ struct TEvGetRSInfoResponse : public TEventPB<TEvGetRSInfoResponse,
+ NKikimrTxDataShard::TEvGetRSInfoResponse,
+ TEvDataShard::EvGetRSInfoResponse> {
+ };
+
+ struct TEvGetDataHistogramRequest : public TEventPB<TEvGetDataHistogramRequest,
+ NKikimrTxDataShard::TEvGetDataHistogramRequest,
+ TEvDataShard::EvGetDataHistogramRequest> {
+ };
+
+ struct TEvGetDataHistogramResponse : public TEventPB<TEvGetDataHistogramResponse,
+ NKikimrTxDataShard::TEvGetDataHistogramResponse,
+ TEvDataShard::EvGetDataHistogramResponse> {
+ };
struct TEvRefreshVolatileSnapshotRequest
: public TEventPB<TEvRefreshVolatileSnapshotRequest,
diff --git a/ydb/core/tx/datashard/datashard__cancel_tx_proposal.cpp b/ydb/core/tx/datashard/datashard__cancel_tx_proposal.cpp
index 8d640e7602f..ff950f6a597 100644
--- a/ydb/core/tx/datashard/datashard__cancel_tx_proposal.cpp
+++ b/ydb/core/tx/datashard/datashard__cancel_tx_proposal.cpp
@@ -1,45 +1,45 @@
-#include "datashard_txs.h"
-
-namespace NKikimr {
+#include "datashard_txs.h"
+
+namespace NKikimr {
namespace NDataShard {
-
+
TDataShard::TTxCancelTransactionProposal::TTxCancelTransactionProposal(TDataShard *self,
- ui64 txId)
- : TBase(self)
- , TxId(txId)
-{
-}
-
+ ui64 txId)
+ : TBase(self)
+ , TxId(txId)
+{
+}
+
bool TDataShard::TTxCancelTransactionProposal::Execute(TTransactionContext &txc,
- const TActorContext &ctx)
-{
+ const TActorContext &ctx)
+{
if (Self->IsFollower()) {
- LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
+ LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
"Unexpected TTxCancelTransactionProposal at tablet follower "
- << Self->TabletID() << " txId " << TxId);
- return true;
- }
-
- if (Self->State == TShardState::Offline || Self->State == TShardState::PreOffline) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Ignoring TTxCancelTransactionProposal at tablet " << Self->TabletID()
- << " txId " << TxId << " because the tablet is going offline");
- return true;
- }
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Start TTxCancelTransactionProposal at tablet " << Self->TabletID()
- << " txId " << TxId);
-
- NIceDb::TNiceDb db(txc.DB);
+ << Self->TabletID() << " txId " << TxId);
+ return true;
+ }
+
+ if (Self->State == TShardState::Offline || Self->State == TShardState::PreOffline) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Ignoring TTxCancelTransactionProposal at tablet " << Self->TabletID()
+ << " txId " << TxId << " because the tablet is going offline");
+ return true;
+ }
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Start TTxCancelTransactionProposal at tablet " << Self->TabletID()
+ << " txId " << TxId);
+
+ NIceDb::TNiceDb db(txc.DB);
return Self->Pipeline.CancelPropose(db, ctx, TxId);
-}
-
+}
+
void TDataShard::TTxCancelTransactionProposal::Complete(const TActorContext &ctx)
-{
+{
Self->CheckSplitCanStart(ctx);
Self->CheckMvccStateChangeCanStart(ctx);
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/datashard__cleanup_in_rs.cpp b/ydb/core/tx/datashard/datashard__cleanup_in_rs.cpp
index 5153a98fcc3..cdb7d0faed6 100644
--- a/ydb/core/tx/datashard/datashard__cleanup_in_rs.cpp
+++ b/ydb/core/tx/datashard/datashard__cleanup_in_rs.cpp
@@ -1,171 +1,171 @@
-#include "datashard_impl.h"
-
+#include "datashard_impl.h"
+
#include <ydb/core/base/tx_processing.h>
#include <ydb/core/tablet/tablet_exception.h>
-
-namespace NKikimr {
+
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NTabletFlatExecutor;
-
-static const TDuration REMOVAL_INTERVAL = TDuration::Seconds(1);
-constexpr ui64 MAX_RS_TO_REMOVE_IN_SINGLE_TX = 100000;
-
+
+using namespace NTabletFlatExecutor;
+
+static const TDuration REMOVAL_INTERVAL = TDuration::Seconds(1);
+constexpr ui64 MAX_RS_TO_REMOVE_IN_SINGLE_TX = 100000;
+
class TDataShard::TTxRemoveOldInReadSets : public NTabletFlatExecutor::TTransactionBase<TDataShard> {
-public:
+public:
TTxRemoveOldInReadSets(TDataShard *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
if (Self->State == TShardState::Offline) {
LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
"TTxRemoveOldInReadSets::Execute (skip) at " << Self->TabletID());
return true;
}
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxRemoveOldInReadSets::Execute at " << Self->TabletID());
-
- NIceDb::TNiceDb db(txc.DB);
- ui64 removed = 0;
- for (auto it = Self->InRSToRemove.begin(); it != Self->InRSToRemove.end(); ) {
- auto cur = it++;
- db.Table<Schema::InReadSets>()
- .Key(cur->TxId, cur->Origin, cur->From, cur->To).Delete();
- Self->InRSToRemove.erase(cur);
- ++removed;
-
- if (removed == MAX_RS_TO_REMOVE_IN_SINGLE_TX)
- break;
- }
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Removing " << removed << " outdated read sets from " << Self->TabletID());
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxRemoveOldInReadSets::Execute at " << Self->TabletID());
+
+ NIceDb::TNiceDb db(txc.DB);
+ ui64 removed = 0;
+ for (auto it = Self->InRSToRemove.begin(); it != Self->InRSToRemove.end(); ) {
+ auto cur = it++;
+ db.Table<Schema::InReadSets>()
+ .Key(cur->TxId, cur->Origin, cur->From, cur->To).Delete();
+ Self->InRSToRemove.erase(cur);
+ ++removed;
+
+ if (removed == MAX_RS_TO_REMOVE_IN_SINGLE_TX)
+ break;
+ }
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Removing " << removed << " outdated read sets from " << Self->TabletID());
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
if (Self->State == TShardState::Offline) {
LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
"TTxRemoveOldInReadSets::Complete (skip) at " << Self->TabletID());
return;
}
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxRemoveOldInReadSets::Complete " << Self->InRSToRemove.size()
- << " outdated read sets remain at " << Self->TabletID());
-
- if (!Self->InRSToRemove.empty()) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Schedule TEvPrivate::TEvRemoveOldInReadSets in " << REMOVAL_INTERVAL);
-
- auto shardCtx = ctx.MakeFor(Self->SelfId());
- shardCtx.Schedule(REMOVAL_INTERVAL, new TEvPrivate::TEvRemoveOldInReadSets);
- }
- }
-
- TTxType GetTxType() const override
- {
- return TXTYPE_REMOVE_OLD_IN_READ_SETS;
- }
-
-private:
-};
-
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxRemoveOldInReadSets::Complete " << Self->InRSToRemove.size()
+ << " outdated read sets remain at " << Self->TabletID());
+
+ if (!Self->InRSToRemove.empty()) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Schedule TEvPrivate::TEvRemoveOldInReadSets in " << REMOVAL_INTERVAL);
+
+ auto shardCtx = ctx.MakeFor(Self->SelfId());
+ shardCtx.Schedule(REMOVAL_INTERVAL, new TEvPrivate::TEvRemoveOldInReadSets);
+ }
+ }
+
+ TTxType GetTxType() const override
+ {
+ return TXTYPE_REMOVE_OLD_IN_READ_SETS;
+ }
+
+private:
+};
+
class TDataShard::TTxCheckInReadSets : public NTabletFlatExecutor::TTransactionBase<TDataShard> {
-public:
+public:
TTxCheckInReadSets(TDataShard *self)
- : TBase(self)
- {
- }
-
- bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
- {
+ : TBase(self)
+ {
+ }
+
+ bool Execute(TTransactionContext &txc, const TActorContext &ctx) override
+ {
if (Self->State == TShardState::Offline) {
LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
"TTxCheckInReadSets::Execute (skip) at " << Self->TabletID());
return true;
}
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxCheckInReadSets::Execute at " << Self->TabletID());
-
- NIceDb::TNiceDb db(txc.DB);
- auto rowset = db.Table<Schema::InReadSets>().Range().Select();
-
- if (!rowset.IsReady())
- return false;
-
- while (!rowset.EndOfSet()) {
- ui64 txId = rowset.GetValue<Schema::InReadSets::TxId>();
-
- if (!Self->TransQueue.Has(txId)) {
- ui64 origin = rowset.GetValue<Schema::InReadSets::Origin>();
- ui64 from = rowset.GetValue<Schema::InReadSets::From>();
- ui64 to = rowset.GetValue<Schema::InReadSets::To>();
-
- Self->InRSToRemove.insert(TReadSetKey(txId, origin, from, to));
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Found outdated InReadSet in " << Self->TabletID()
- << " txid=" << txId
- << " origin=" << origin
- << " from=" << from
- << " to=" << to);
- }
-
- if (!rowset.Next())
- return false;
- }
-
- return true;
- }
-
- void Complete(const TActorContext &ctx) override
- {
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxCheckInReadSets::Execute at " << Self->TabletID());
+
+ NIceDb::TNiceDb db(txc.DB);
+ auto rowset = db.Table<Schema::InReadSets>().Range().Select();
+
+ if (!rowset.IsReady())
+ return false;
+
+ while (!rowset.EndOfSet()) {
+ ui64 txId = rowset.GetValue<Schema::InReadSets::TxId>();
+
+ if (!Self->TransQueue.Has(txId)) {
+ ui64 origin = rowset.GetValue<Schema::InReadSets::Origin>();
+ ui64 from = rowset.GetValue<Schema::InReadSets::From>();
+ ui64 to = rowset.GetValue<Schema::InReadSets::To>();
+
+ Self->InRSToRemove.insert(TReadSetKey(txId, origin, from, to));
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Found outdated InReadSet in " << Self->TabletID()
+ << " txid=" << txId
+ << " origin=" << origin
+ << " from=" << from
+ << " to=" << to);
+ }
+
+ if (!rowset.Next())
+ return false;
+ }
+
+ return true;
+ }
+
+ void Complete(const TActorContext &ctx) override
+ {
if (Self->State == TShardState::Offline) {
LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
"TTxCheckInReadSets::Complete (skip) at " << Self->TabletID());
return;
}
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxCheckInReadSets::Complete found " << Self->InRSToRemove.size()
- << " read sets to remove in " << Self->TabletID());
-
- if (!Self->InRSToRemove.empty()) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Schedule TEvPrivate::TEvRemoveOldInReadSets in " << REMOVAL_INTERVAL);
-
- auto shardCtx = ctx.MakeFor(Self->SelfId());
- shardCtx.Schedule(REMOVAL_INTERVAL, new TEvPrivate::TEvRemoveOldInReadSets);
- }
- }
-
- TTxType GetTxType() const override
- {
- return TXTYPE_CHECK_IN_READ_SETS;
- }
-
-private:
-};
-
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxCheckInReadSets::Complete found " << Self->InRSToRemove.size()
+ << " read sets to remove in " << Self->TabletID());
+
+ if (!Self->InRSToRemove.empty()) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Schedule TEvPrivate::TEvRemoveOldInReadSets in " << REMOVAL_INTERVAL);
+
+ auto shardCtx = ctx.MakeFor(Self->SelfId());
+ shardCtx.Schedule(REMOVAL_INTERVAL, new TEvPrivate::TEvRemoveOldInReadSets);
+ }
+ }
+
+ TTxType GetTxType() const override
+ {
+ return TXTYPE_CHECK_IN_READ_SETS;
+ }
+
+private:
+};
+
ITransaction *TDataShard::CreateTxCheckInReadSets()
-{
- return new TTxCheckInReadSets(this);
-}
-
+{
+ return new TTxCheckInReadSets(this);
+}
+
void TDataShard::Handle(TEvPrivate::TEvRemoveOldInReadSets::TPtr &ev,
- const TActorContext &ctx)
-{
- Y_UNUSED(ev);
- Execute(new TTxRemoveOldInReadSets(this), ctx);
-}
-
+ const TActorContext &ctx)
+{
+ Y_UNUSED(ev);
+ Execute(new TTxRemoveOldInReadSets(this), ctx);
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/datashard__engine_host.cpp b/ydb/core/tx/datashard/datashard__engine_host.cpp
index 6691da310de..876c3370933 100644
--- a/ydb/core/tx/datashard/datashard__engine_host.cpp
+++ b/ydb/core/tx/datashard/datashard__engine_host.cpp
@@ -25,14 +25,14 @@ using namespace NTabletFlatExecutor;
namespace {
-NUdf::TUnboxedValue CreateRow(const TVector<TCell>& inRow,
- const TVector<NScheme::TTypeId>& inType,
- const THolderFactory& holderFactory) {
+NUdf::TUnboxedValue CreateRow(const TVector<TCell>& inRow,
+ const TVector<NScheme::TTypeId>& inType,
+ const THolderFactory& holderFactory) {
NUdf::TUnboxedValue* rowItems = nullptr;
auto row = holderFactory.CreateDirectArrayHolder(inRow.size(), rowItems);
for (ui32 i = 0; i < inRow.size(); ++i) {
- rowItems[i] = GetCellValue(inRow[i], inType[i]);
+ rowItems[i] = GetCellValue(inRow[i], inType[i]);
}
return std::move(row);
@@ -87,15 +87,15 @@ struct TRowResultInfo {
Y_VERIFY(inRow.size() >= ItemInfos.size());
// reorder columns
- TVector<TCell> outRow(Reserve(ItemInfos.size()));
- TVector<NScheme::TTypeId> outTypes(Reserve(ItemInfos.size()));
+ TVector<TCell> outRow(Reserve(ItemInfos.size()));
+ TVector<NScheme::TTypeId> outTypes(Reserve(ItemInfos.size()));
for (ui32 i = 0; i < ItemInfos.size(); ++i) {
ui32 colId = ItemInfos[i].ColumnId;
outRow.emplace_back(std::move(inRow[colId]));
- outTypes.emplace_back(ItemInfos[i].SchemeType);
+ outTypes.emplace_back(ItemInfos[i].SchemeType);
}
- return CreateRow(outRow, outTypes, holderFactory);
+ return CreateRow(outRow, outTypes, holderFactory);
}
};
@@ -166,7 +166,7 @@ struct TRangeResultInfo {
}
Bytes += 8; // per row overhead
- Rows = Rows.Append(CreateRow(TmpRow, TmpTypes, holderFactory));
+ Rows = Rows.Append(CreateRow(TmpRow, TmpTypes, holderFactory));
if (!FirstKey) {
FirstKey = Serialize(TmpRow, TmpTypes);
@@ -573,7 +573,7 @@ TEngineBay::~TEngineBay() {
void TEngineBay::AddReadRange(const TTableId& tableId, const TVector<ui32>& columns, const TTableRange& range,
const TVector<NScheme::TTypeId>& keyTypes, ui64 itemsLimit, bool reverse)
-{
+{
TVector<TKeyDesc::TColumnOp> columnOps;
columnOps.reserve(columns.size());
for (ui32 column : columns) {
@@ -590,10 +590,10 @@ void TEngineBay::AddReadRange(const TTableId& tableId, const TVector<ui32>& colu
0 /* bytesLimit */, reverse);
Info.Keys.emplace_back(TValidatedKey(std::move(desc), /* isWrite */ false));
// Info.Keys.back().IsResultPart = not a lock key? // TODO: KIKIMR-11134
- ++Info.ReadsCount;
+ ++Info.ReadsCount;
Info.Loaded = true;
-}
-
+}
+
void TEngineBay::AddWriteRange(const TTableId& tableId, const TTableRange& range,
const TVector<NScheme::TTypeId>& keyTypes)
{
diff --git a/ydb/core/tx/datashard/datashard__engine_host.h b/ydb/core/tx/datashard/datashard__engine_host.h
index 1f59569dfba..8e3064c83d8 100644
--- a/ydb/core/tx/datashard/datashard__engine_host.h
+++ b/ydb/core/tx/datashard/datashard__engine_host.h
@@ -50,7 +50,7 @@ public:
EResult Validate() {
if (Info.Loaded)
return EResult::Ok;
- Y_VERIFY(Engine);
+ Y_VERIFY(Engine);
return Engine->Validate(Info);
}
@@ -62,7 +62,7 @@ public:
void AddReadRange(const TTableId& tableId, const TVector<ui32>& columns, const TTableRange& range,
const TVector<NScheme::TTypeId>& keyTypes, ui64 itemsLimit = 0, bool reverse = false);
-
+
void AddWriteRange(const TTableId& tableId, const TTableRange& range, const TVector<NScheme::TTypeId>& keyTypes);
void MarkTxLoaded() {
diff --git a/ydb/core/tx/datashard/datashard__init.cpp b/ydb/core/tx/datashard/datashard__init.cpp
index 301978763ff..dc12c49959b 100644
--- a/ydb/core/tx/datashard/datashard__init.cpp
+++ b/ydb/core/tx/datashard/datashard__init.cpp
@@ -71,15 +71,15 @@ void TDataShard::TTxInit::Complete(const TActorContext &ctx) {
Self->SwitchToWork(ctx);
Self->SendRegistrationRequestTimeCast(ctx);
-
- // InReadSets table might have a lot of garbage due to old bug.
+
+ // InReadSets table might have a lot of garbage due to old bug.
// Run transaction to collect if shard is not going offline.
if (Self->State != TShardState::Offline && Self->State != TShardState::PreOffline)
- Self->Execute(Self->CreateTxCheckInReadSets(), ctx);
-
- // Tables created with older SchemeShard versions don't have
- // path filled for user tables. Resolve path for them.
- Self->ResolveTablePath(ctx);
+ Self->Execute(Self->CreateTxCheckInReadSets(), ctx);
+
+ // Tables created with older SchemeShard versions don't have
+ // path filled for user tables. Resolve path for them.
+ Self->ResolveTablePath(ctx);
// Plan cleanup if needed
if (Self->State == TShardState::Ready ||
@@ -371,16 +371,16 @@ bool TDataShard::TTxInit::ReadEverything(TTransactionContext &txc) {
if (Self->State != TShardState::Offline && txc.DB.GetScheme().GetTableInfo(Schema::TxMain::TableId)) {
if (!Self->TransQueue.Load(db))
return false;
-
- for (auto &pr : Self->TransQueue.GetTxsInFly()) {
- pr.second->BuildExecutionPlan(true);
- if (!pr.second->IsExecutionPlanFinished())
- Self->Pipeline.GetExecutionUnit(pr.second->GetCurrentUnit()).AddOperation(pr.second);
- }
-
- if (Self->TransQueue.GetPlan().size())
- Self->Pipeline.AddCandidateUnit(EExecutionUnitKind::PlanQueue);
- // TODO: add propose blockers to blockers list
+
+ for (auto &pr : Self->TransQueue.GetTxsInFly()) {
+ pr.second->BuildExecutionPlan(true);
+ if (!pr.second->IsExecutionPlanFinished())
+ Self->Pipeline.GetExecutionUnit(pr.second->GetCurrentUnit()).AddOperation(pr.second);
+ }
+
+ if (Self->TransQueue.GetPlan().size())
+ Self->Pipeline.AddCandidateUnit(EExecutionUnitKind::PlanQueue);
+ // TODO: add propose blockers to blockers list
}
if (Self->State != TShardState::Offline && txc.DB.GetScheme().GetTableInfo(Schema::Snapshots::TableId)) {
@@ -505,13 +505,13 @@ public:
LOAD_SYS_UI64(db, Schema::Sys_State, Self->State);
}
- // Skip full schema migration (and dropped system table recreation)
- // if the datashard is in the process of drop.
- if (Self->State == TShardState::PreOffline || Self->State == TShardState::Offline) {
+ // Skip full schema migration (and dropped system table recreation)
+ // if the datashard is in the process of drop.
+ if (Self->State == TShardState::PreOffline || Self->State == TShardState::Offline) {
db.MaterializeExisting<Schema>();
Schema::SchemaTables<Schema::SchemaOperations>::Materialize(txc.DB, NIceDb::EMaterializationMode::NonExisting);
Schema::SchemaTables<Schema::ScanProgress>::Materialize(txc.DB, NIceDb::EMaterializationMode::NonExisting);
- } else {
+ } else {
db.Materialize<Schema>();
}
diff --git a/ydb/core/tx/datashard/datashard__monitoring.cpp b/ydb/core/tx/datashard/datashard__monitoring.cpp
index 6047e33d829..644f9a74199 100644
--- a/ydb/core/tx/datashard/datashard__monitoring.cpp
+++ b/ydb/core/tx/datashard/datashard__monitoring.cpp
@@ -1,330 +1,330 @@
#include "datashard_impl.h"
-#include "operation.h"
+#include "operation.h"
#include <ydb/core/tablet_flat/flat_stat_table.h>
#include <ydb/core/util/pb.h>
#include <library/cpp/mime/types/mime.h>
#include <library/cpp/resource/resource.h>
-
+
#include <library/cpp/html/pcdata/pcdata.h>
namespace NKikimr {
namespace NDataShard {
class TDataShard::TTxMonitoring : public NTabletFlatExecutor::TTransactionBase<TDataShard> {
- NMon::TEvRemoteHttpInfo::TPtr Ev;
+ NMon::TEvRemoteHttpInfo::TPtr Ev;
-public:
+public:
TTxMonitoring(TDataShard *self, NMon::TEvRemoteHttpInfo::TPtr ev)
- : TBase(self)
- , Ev(ev)
- {}
-
- bool Execute(NTabletFlatExecutor::TTransactionContext &, const TActorContext &ctx) override {
- LOG_DEBUG_S(ctx, NKikimrServices::CMS,
- "HTTP request at " << Self->TabletID() << " url="
- << Ev->Get()->PathInfo());
-
- ReplyWithIndex(ctx);
-
- return true;
- }
-
- void ReplyWithIndex(const TActorContext &ctx)
- {
- TString blob;
- NResource::FindExact("datashard/index.html", &blob);
-
- if (blob.empty()) {
- ctx.Send(Ev->Sender, new NMon::TEvRemoteBinaryInfoRes(NMonitoring::HTTPNOTFOUND));
- return;
- }
-
- TStringStream response;
- response << "HTTP/1.1 200 Ok\r\n";
- response << "Content-Type: text/html\r\n";
- response << "Content-Length: " << blob.size() << "\r\n";
- response << "\r\n";
- response.Write(blob.data(), blob.size());
- ctx.Send(Ev->Sender, new NMon::TEvRemoteBinaryInfoRes(response.Str()));
- }
-
- void Complete(const TActorContext &ctx) override {
- Y_UNUSED(ctx);
- }
-
- TTxType GetTxType() const override { return TXTYPE_MONITORING; }
-};
-
+ : TBase(self)
+ , Ev(ev)
+ {}
+
+ bool Execute(NTabletFlatExecutor::TTransactionContext &, const TActorContext &ctx) override {
+ LOG_DEBUG_S(ctx, NKikimrServices::CMS,
+ "HTTP request at " << Self->TabletID() << " url="
+ << Ev->Get()->PathInfo());
+
+ ReplyWithIndex(ctx);
+
+ return true;
+ }
+
+ void ReplyWithIndex(const TActorContext &ctx)
+ {
+ TString blob;
+ NResource::FindExact("datashard/index.html", &blob);
+
+ if (blob.empty()) {
+ ctx.Send(Ev->Sender, new NMon::TEvRemoteBinaryInfoRes(NMonitoring::HTTPNOTFOUND));
+ return;
+ }
+
+ TStringStream response;
+ response << "HTTP/1.1 200 Ok\r\n";
+ response << "Content-Type: text/html\r\n";
+ response << "Content-Length: " << blob.size() << "\r\n";
+ response << "\r\n";
+ response.Write(blob.data(), blob.size());
+ ctx.Send(Ev->Sender, new NMon::TEvRemoteBinaryInfoRes(response.Str()));
+ }
+
+ void Complete(const TActorContext &ctx) override {
+ Y_UNUSED(ctx);
+ }
+
+ TTxType GetTxType() const override { return TXTYPE_MONITORING; }
+};
+
class TDataShard::TTxGetInfo : public NTabletFlatExecutor::TTransactionBase<TDataShard> {
-public:
+public:
TTxGetInfo(TDataShard *self,
- TEvDataShard::TEvGetInfoRequest::TPtr ev)
- : TBase(self)
- , Ev(ev)
- {}
-
- bool Execute(NTabletFlatExecutor::TTransactionContext &,
- const TActorContext &ctx) override
- {
- auto *response = new TEvDataShard::TEvGetInfoResponse;
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- for (auto &pr : Self->GetUserTables()) {
- auto &rec = *response->Record.AddUserTables();
- rec.SetName(pr.second->Name);
- rec.SetPath(pr.second->Path);
- rec.SetLocalId(pr.second->LocalTid);
- rec.SetPathId(pr.first);
+ TEvDataShard::TEvGetInfoRequest::TPtr ev)
+ : TBase(self)
+ , Ev(ev)
+ {}
+
+ bool Execute(NTabletFlatExecutor::TTransactionContext &,
+ const TActorContext &ctx) override
+ {
+ auto *response = new TEvDataShard::TEvGetInfoResponse;
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+
+ for (auto &pr : Self->GetUserTables()) {
+ auto &rec = *response->Record.AddUserTables();
+ rec.SetName(pr.second->Name);
+ rec.SetPath(pr.second->Path);
+ rec.SetLocalId(pr.second->LocalTid);
+ rec.SetPathId(pr.first);
rec.SetSchemaVersion(pr.second->GetTableSchemaVersion());
- pr.second->GetSchema(*rec.MutableDescription());
-
- if (pr.second->Stats.StatsUpdateTime) {
- auto &stats = *rec.MutableStats();
- stats.SetRowCount(pr.second->Stats.DataStats.RowCount);
- stats.SetDataSize(pr.second->Stats.DataStats.DataSize);
- stats.SetLastAccessTime(pr.second->Stats.AccessTime.ToStringLocalUpToSeconds());
- stats.SetLastUpdateTime(pr.second->Stats.UpdateTime.ToStringLocalUpToSeconds());
- stats.SetLastStatsUpdateTime(Self->LastDbStatsUpdateTime.ToStringLocalUpToSeconds());
- stats.SetLastStatsReportTime(Self->LastDbStatsReportTime.ToStringLocalUpToSeconds());
- }
+ pr.second->GetSchema(*rec.MutableDescription());
+
+ if (pr.second->Stats.StatsUpdateTime) {
+ auto &stats = *rec.MutableStats();
+ stats.SetRowCount(pr.second->Stats.DataStats.RowCount);
+ stats.SetDataSize(pr.second->Stats.DataStats.DataSize);
+ stats.SetLastAccessTime(pr.second->Stats.AccessTime.ToStringLocalUpToSeconds());
+ stats.SetLastUpdateTime(pr.second->Stats.UpdateTime.ToStringLocalUpToSeconds());
+ stats.SetLastStatsUpdateTime(Self->LastDbStatsUpdateTime.ToStringLocalUpToSeconds());
+ stats.SetLastStatsReportTime(Self->LastDbStatsReportTime.ToStringLocalUpToSeconds());
+ }
auto *resourceMetrics = Self->Executor()->GetResourceMetrics();
if (resourceMetrics) {
auto &metrics = *rec.MutableMetrics();
resourceMetrics->Fill(metrics);
}
- }
-
- auto &info = *response->Record.MutableTabletInfo();
+ }
+
+ auto &info = *response->Record.MutableTabletInfo();
info.SetSchemeShard(Self->PathOwnerId);
- info.SetMediator(Self->LastKnownMediator);
- info.SetGeneration(Self->Generation());
+ info.SetMediator(Self->LastKnownMediator);
+ info.SetGeneration(Self->Generation());
info.SetIsFollower(Self->IsFollower());
- info.SetState(DatashardStateName(Self->State));
- info.SetIsActive(Self->IsStateActive());
- info.SetHasSharedBlobs(Self->HasSharedBlobs());
-
- AddControl(Self->MaxTxInFly, "DataShardControls.MaxTxInFly", response->Record);
- AddControl(Self->DisableByKeyFilter, "DataShardControls.DisableByKeyFilter", response->Record);
- AddControl(Self->MaxTxLagMilliseconds, "DataShardControls.MaxTxLagMilliseconds", response->Record);
- AddControl(Self->CanCancelROWithReadSets, "DataShardControls.CanCancelROWithReadSets", response->Record);
- AddControl(Self->DataTxProfileLogThresholdMs, "DataShardControls.DataTxProfile.LogThresholdMs", response->Record);
- AddControl(Self->DataTxProfileBufferThresholdMs, "DataShardControls.DataTxProfile.BufferThresholdMs", response->Record);
- AddControl(Self->DataTxProfileBufferSize, "DataShardControls.DataTxProfile.BufferSize", response->Record);
- AddControl(Self->PerShardReadSizeLimit, "TxLimitControls.PerShardReadSizeLimit", response->Record);
-
- auto completed = Self->Pipeline.GetExecutionUnit(EExecutionUnitKind::CompletedOperations).GetInFly();
- auto waiting = Self->Pipeline.GetExecutionUnit(EExecutionUnitKind::BuildAndWaitDependencies).GetInFly();
- auto executing = Self->Pipeline.GetActiveOps().size() - waiting - completed;
- auto &activities = *response->Record.MutableActivities();
- activities.SetInFlyPlanned(Self->TxInFly());
- activities.SetInFlyImmediate(Self->ImmediateInFly());
- activities.SetExecutingOps(executing);
- activities.SetWaitingOps(waiting);
- activities.SetExecuteBlockers(Self->Pipeline.GetExecuteBlockers().size());
- activities.SetDataTxCached(Self->Pipeline.GetDataTxCacheSize());
- activities.SetOutReadSets(Self->OutReadSets.CountReadSets());
- activities.SetOutReadSetsAcks(Self->OutReadSets.CountAcks());
- activities.SetDelayedAcks(Self->Pipeline.GetDelayedAcks().size());
- activities.SetLocks(Self->SysLocks.LocksCount());
- activities.SetBrokenLocks(Self->SysLocks.BrokenLocksCount());
- activities.SetLastPlannedTx(Self->Pipeline.GetLastPlannedTx().TxId);
- activities.SetLastPlannedStep(Self->Pipeline.GetLastPlannedTx().Step);
- activities.SetLastCompletedTx(Self->Pipeline.GetLastCompleteTx().TxId);
- activities.SetLastCompletedStep(Self->Pipeline.GetLastCompleteTx().Step);
- activities.SetUtmostCompletedTx(Self->Pipeline.GetUtmostCompleteTx().TxId);
- activities.SetUtmostCompletedStep(Self->Pipeline.GetUtmostCompleteTx().Step);
- activities.SetDataTxCompleteLag(Self->GetDataTxCompleteLag().MilliSeconds());
- activities.SetScanTxCompleteLag(Self->GetScanTxCompleteLag().MilliSeconds());
-
- auto &pcfg = *response->Record.MutablePipelineConfig();
- pcfg.SetOutOfOrderEnabled(Self->Pipeline.GetConfig().OutOfOrder());
- pcfg.SetActiveTxsLimit(Self->Pipeline.GetConfig().LimitActiveTx);
- pcfg.SetAllowImmediate(!Self->Pipeline.GetConfig().NoImmediate());
- pcfg.SetForceOnlineRW(Self->Pipeline.GetConfig().ForceOnlineRW());
- pcfg.SetDirtyOnline(Self->Pipeline.GetConfig().DirtyOnline());
- pcfg.SetDirtyImmediate(Self->Pipeline.GetConfig().DirtyImmediate());
- pcfg.SetDataTxCacheSize(Self->Pipeline.GetConfig().LimitDataTxCache);
-
- ctx.Send(Ev->Sender, response);
- return true;
- }
-
- void AddControl(ui64 value,
- const TString &name,
- NKikimrTxDataShard::TEvGetInfoResponse &rec)
- {
- auto &control = *rec.AddControls();
- control.SetName(name);
- control.SetValue(ToString(value));
- }
-
- void Complete(const TActorContext &) override {}
-
- TTxType GetTxType() const override { return TXTYPE_MONITORING; }
-
-private:
- TEvDataShard::TEvGetInfoRequest::TPtr Ev;
-};
-
+ info.SetState(DatashardStateName(Self->State));
+ info.SetIsActive(Self->IsStateActive());
+ info.SetHasSharedBlobs(Self->HasSharedBlobs());
+
+ AddControl(Self->MaxTxInFly, "DataShardControls.MaxTxInFly", response->Record);
+ AddControl(Self->DisableByKeyFilter, "DataShardControls.DisableByKeyFilter", response->Record);
+ AddControl(Self->MaxTxLagMilliseconds, "DataShardControls.MaxTxLagMilliseconds", response->Record);
+ AddControl(Self->CanCancelROWithReadSets, "DataShardControls.CanCancelROWithReadSets", response->Record);
+ AddControl(Self->DataTxProfileLogThresholdMs, "DataShardControls.DataTxProfile.LogThresholdMs", response->Record);
+ AddControl(Self->DataTxProfileBufferThresholdMs, "DataShardControls.DataTxProfile.BufferThresholdMs", response->Record);
+ AddControl(Self->DataTxProfileBufferSize, "DataShardControls.DataTxProfile.BufferSize", response->Record);
+ AddControl(Self->PerShardReadSizeLimit, "TxLimitControls.PerShardReadSizeLimit", response->Record);
+
+ auto completed = Self->Pipeline.GetExecutionUnit(EExecutionUnitKind::CompletedOperations).GetInFly();
+ auto waiting = Self->Pipeline.GetExecutionUnit(EExecutionUnitKind::BuildAndWaitDependencies).GetInFly();
+ auto executing = Self->Pipeline.GetActiveOps().size() - waiting - completed;
+ auto &activities = *response->Record.MutableActivities();
+ activities.SetInFlyPlanned(Self->TxInFly());
+ activities.SetInFlyImmediate(Self->ImmediateInFly());
+ activities.SetExecutingOps(executing);
+ activities.SetWaitingOps(waiting);
+ activities.SetExecuteBlockers(Self->Pipeline.GetExecuteBlockers().size());
+ activities.SetDataTxCached(Self->Pipeline.GetDataTxCacheSize());
+ activities.SetOutReadSets(Self->OutReadSets.CountReadSets());
+ activities.SetOutReadSetsAcks(Self->OutReadSets.CountAcks());
+ activities.SetDelayedAcks(Self->Pipeline.GetDelayedAcks().size());
+ activities.SetLocks(Self->SysLocks.LocksCount());
+ activities.SetBrokenLocks(Self->SysLocks.BrokenLocksCount());
+ activities.SetLastPlannedTx(Self->Pipeline.GetLastPlannedTx().TxId);
+ activities.SetLastPlannedStep(Self->Pipeline.GetLastPlannedTx().Step);
+ activities.SetLastCompletedTx(Self->Pipeline.GetLastCompleteTx().TxId);
+ activities.SetLastCompletedStep(Self->Pipeline.GetLastCompleteTx().Step);
+ activities.SetUtmostCompletedTx(Self->Pipeline.GetUtmostCompleteTx().TxId);
+ activities.SetUtmostCompletedStep(Self->Pipeline.GetUtmostCompleteTx().Step);
+ activities.SetDataTxCompleteLag(Self->GetDataTxCompleteLag().MilliSeconds());
+ activities.SetScanTxCompleteLag(Self->GetScanTxCompleteLag().MilliSeconds());
+
+ auto &pcfg = *response->Record.MutablePipelineConfig();
+ pcfg.SetOutOfOrderEnabled(Self->Pipeline.GetConfig().OutOfOrder());
+ pcfg.SetActiveTxsLimit(Self->Pipeline.GetConfig().LimitActiveTx);
+ pcfg.SetAllowImmediate(!Self->Pipeline.GetConfig().NoImmediate());
+ pcfg.SetForceOnlineRW(Self->Pipeline.GetConfig().ForceOnlineRW());
+ pcfg.SetDirtyOnline(Self->Pipeline.GetConfig().DirtyOnline());
+ pcfg.SetDirtyImmediate(Self->Pipeline.GetConfig().DirtyImmediate());
+ pcfg.SetDataTxCacheSize(Self->Pipeline.GetConfig().LimitDataTxCache);
+
+ ctx.Send(Ev->Sender, response);
+ return true;
+ }
+
+ void AddControl(ui64 value,
+ const TString &name,
+ NKikimrTxDataShard::TEvGetInfoResponse &rec)
+ {
+ auto &control = *rec.AddControls();
+ control.SetName(name);
+ control.SetValue(ToString(value));
+ }
+
+ void Complete(const TActorContext &) override {}
+
+ TTxType GetTxType() const override { return TXTYPE_MONITORING; }
+
+private:
+ TEvDataShard::TEvGetInfoRequest::TPtr Ev;
+};
+
class TDataShard::TTxListOperations : public NTabletFlatExecutor::TTransactionBase<TDataShard> {
-public:
+public:
TTxListOperations(TDataShard *self,
- TEvDataShard::TEvListOperationsRequest::TPtr ev)
- : TBase(self)
- , Ev(ev)
- {}
-
- bool Execute(NTabletFlatExecutor::TTransactionContext &,
- const TActorContext &ctx) override
- {
- auto *response = new TEvDataShard::TEvListOperationsResponse;
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- for (auto &pr : Self->Pipeline.GetImmediateOps())
- AddOperation(pr.second, response->Record);
- for (auto &pr : Self->TransQueue.GetTxsInFly())
- AddOperation(pr.second, response->Record);
-
- ctx.Send(Ev->Sender, response);
- return true;
- }
-
- void AddOperation(TOperation::TPtr op,
- NKikimrTxDataShard::TEvListOperationsResponse &resp)
- {
- auto &rec = *resp.AddOperations();
- rec.SetTxId(op->GetTxId());
- rec.SetStep(op->GetStep());
- rec.SetKind(ToString(op->GetKind()));
- rec.SetIsImmediate(op->IsImmediate());
- rec.SetIsReadOnly(op->IsReadOnly());
- rec.SetIsWaiting(op->IsWaitingDependencies());
- rec.SetIsExecuting(op->IsExecuting());
- rec.SetIsCompleted(op->IsCompleted());
- rec.SetExecutionUnit(ToString(op->GetCurrentUnit()));
- rec.SetReceivedAt(op->GetReceivedAt().GetValue());
- }
-
- void Complete(const TActorContext &) override {}
-
- TTxType GetTxType() const override { return TXTYPE_MONITORING; }
-
-private:
- TEvDataShard::TEvListOperationsRequest::TPtr Ev;
-};
-
+ TEvDataShard::TEvListOperationsRequest::TPtr ev)
+ : TBase(self)
+ , Ev(ev)
+ {}
+
+ bool Execute(NTabletFlatExecutor::TTransactionContext &,
+ const TActorContext &ctx) override
+ {
+ auto *response = new TEvDataShard::TEvListOperationsResponse;
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+
+ for (auto &pr : Self->Pipeline.GetImmediateOps())
+ AddOperation(pr.second, response->Record);
+ for (auto &pr : Self->TransQueue.GetTxsInFly())
+ AddOperation(pr.second, response->Record);
+
+ ctx.Send(Ev->Sender, response);
+ return true;
+ }
+
+ void AddOperation(TOperation::TPtr op,
+ NKikimrTxDataShard::TEvListOperationsResponse &resp)
+ {
+ auto &rec = *resp.AddOperations();
+ rec.SetTxId(op->GetTxId());
+ rec.SetStep(op->GetStep());
+ rec.SetKind(ToString(op->GetKind()));
+ rec.SetIsImmediate(op->IsImmediate());
+ rec.SetIsReadOnly(op->IsReadOnly());
+ rec.SetIsWaiting(op->IsWaitingDependencies());
+ rec.SetIsExecuting(op->IsExecuting());
+ rec.SetIsCompleted(op->IsCompleted());
+ rec.SetExecutionUnit(ToString(op->GetCurrentUnit()));
+ rec.SetReceivedAt(op->GetReceivedAt().GetValue());
+ }
+
+ void Complete(const TActorContext &) override {}
+
+ TTxType GetTxType() const override { return TXTYPE_MONITORING; }
+
+private:
+ TEvDataShard::TEvListOperationsRequest::TPtr Ev;
+};
+
class TDataShard::TTxGetOperation : public NTabletFlatExecutor::TTransactionBase<TDataShard> {
-public:
+public:
TTxGetOperation(TDataShard *self,
- TEvDataShard::TEvGetOperationRequest::TPtr ev)
- : TBase(self)
- , Ev(ev)
- {}
-
- bool Execute(NTabletFlatExecutor::TTransactionContext &,
- const TActorContext &ctx) override
- {
- auto *response = new TEvDataShard::TEvGetOperationResponse;
-
- auto op = Self->Pipeline.FindOp(Ev->Get()->Record.GetTxId());
- if (!op)
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::NOT_FOUND);
- else {
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
- FillOpInfo(op, response->Record);
- }
-
- ctx.Send(Ev->Sender, response);
- return true;
- }
-
- void FillOpInfo(TOperation::TPtr op,
- NKikimrTxDataShard::TEvGetOperationResponse &resp)
- {
- op->Serialize(*resp.MutableBasicInfo());
-
- auto &plan = *resp.MutableExecutionPlan();
- for (auto kind : op->GetExecutionPlan())
- plan.AddUnits(ToString(kind));
- plan.SetIsFinished(op->IsExecutionPlanFinished());
- plan.SetCurrentUnit(static_cast<ui32>(op->GetCurrentUnitIndex()));
-
- auto &deps = *resp.MutableDependencies();
- FillDependencies(op->GetDependencies(), *deps.MutableDependencies());
- FillDependencies(op->GetDependents(), *deps.MutableDependents());
-
- if (op->IsExecuting() && !op->InReadSets().empty()) {
- auto &inData = *resp.MutableInputData();
- for (auto &pr : op->InReadSets()) {
- auto &rs = *inData.AddInputRS();
- rs.SetFrom(pr.first.first);
- rs.SetReceived(pr.second.size());
- }
- inData.SetRemainedInputRS(op->GetRemainReadSets());
- }
-
- auto &profile = *resp.MutableExecutionProfile();
- for (auto &pr : op->GetExecutionProfile().UnitProfiles) {
- auto &unit = *profile.AddUnitProfiles();
- unit.SetUnitKind(ToString(pr.first));
- if (pr.first == op->GetCurrentUnit()) {
- auto waitTime = AppData()->TimeProvider->Now() - pr.second.ExecuteTime
- - pr.second.CommitTime - pr.second.CompleteTime
- - op->GetExecutionProfile().StartUnitAt;
- unit.SetWaitTime(waitTime.GetValue());
- } else {
- unit.SetWaitTime(pr.second.WaitTime.GetValue());
- }
- unit.SetExecuteTime(pr.second.ExecuteTime.GetValue());
- unit.SetCommitTime(pr.second.CommitTime.GetValue());
- unit.SetCompleteTime(pr.second.CompleteTime.GetValue());
- unit.SetExecuteCount(pr.second.ExecuteCount);
- }
-
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- if (tx)
- tx->FillState(resp);
- }
-
+ TEvDataShard::TEvGetOperationRequest::TPtr ev)
+ : TBase(self)
+ , Ev(ev)
+ {}
+
+ bool Execute(NTabletFlatExecutor::TTransactionContext &,
+ const TActorContext &ctx) override
+ {
+ auto *response = new TEvDataShard::TEvGetOperationResponse;
+
+ auto op = Self->Pipeline.FindOp(Ev->Get()->Record.GetTxId());
+ if (!op)
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::NOT_FOUND);
+ else {
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+ FillOpInfo(op, response->Record);
+ }
+
+ ctx.Send(Ev->Sender, response);
+ return true;
+ }
+
+ void FillOpInfo(TOperation::TPtr op,
+ NKikimrTxDataShard::TEvGetOperationResponse &resp)
+ {
+ op->Serialize(*resp.MutableBasicInfo());
+
+ auto &plan = *resp.MutableExecutionPlan();
+ for (auto kind : op->GetExecutionPlan())
+ plan.AddUnits(ToString(kind));
+ plan.SetIsFinished(op->IsExecutionPlanFinished());
+ plan.SetCurrentUnit(static_cast<ui32>(op->GetCurrentUnitIndex()));
+
+ auto &deps = *resp.MutableDependencies();
+ FillDependencies(op->GetDependencies(), *deps.MutableDependencies());
+ FillDependencies(op->GetDependents(), *deps.MutableDependents());
+
+ if (op->IsExecuting() && !op->InReadSets().empty()) {
+ auto &inData = *resp.MutableInputData();
+ for (auto &pr : op->InReadSets()) {
+ auto &rs = *inData.AddInputRS();
+ rs.SetFrom(pr.first.first);
+ rs.SetReceived(pr.second.size());
+ }
+ inData.SetRemainedInputRS(op->GetRemainReadSets());
+ }
+
+ auto &profile = *resp.MutableExecutionProfile();
+ for (auto &pr : op->GetExecutionProfile().UnitProfiles) {
+ auto &unit = *profile.AddUnitProfiles();
+ unit.SetUnitKind(ToString(pr.first));
+ if (pr.first == op->GetCurrentUnit()) {
+ auto waitTime = AppData()->TimeProvider->Now() - pr.second.ExecuteTime
+ - pr.second.CommitTime - pr.second.CompleteTime
+ - op->GetExecutionProfile().StartUnitAt;
+ unit.SetWaitTime(waitTime.GetValue());
+ } else {
+ unit.SetWaitTime(pr.second.WaitTime.GetValue());
+ }
+ unit.SetExecuteTime(pr.second.ExecuteTime.GetValue());
+ unit.SetCommitTime(pr.second.CommitTime.GetValue());
+ unit.SetCompleteTime(pr.second.CompleteTime.GetValue());
+ unit.SetExecuteCount(pr.second.ExecuteCount);
+ }
+
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ if (tx)
+ tx->FillState(resp);
+ }
+
void FillDependencies(const NFH::TFlatHashSet<TOperation::TPtr> &deps,
- ::google::protobuf::RepeatedPtrField<NKikimrTxDataShard::TEvGetOperationResponse_TDependency> &arr)
- {
+ ::google::protobuf::RepeatedPtrField<NKikimrTxDataShard::TEvGetOperationResponse_TDependency> &arr)
+ {
for (auto &op : deps) {
- auto &dep = *arr.Add();
+ auto &dep = *arr.Add();
dep.SetTarget(op->GetTxId());
dep.AddTypes("Data");
- }
- }
-
- void Complete(const TActorContext &) override {}
-
- TTxType GetTxType() const override { return TXTYPE_MONITORING; }
-
-private:
- TEvDataShard::TEvGetOperationRequest::TPtr Ev;
-};
-
+ }
+ }
+
+ void Complete(const TActorContext &) override {}
+
+ TTxType GetTxType() const override { return TXTYPE_MONITORING; }
+
+private:
+ TEvDataShard::TEvGetOperationRequest::TPtr Ev;
+};
+
ITransaction *TDataShard::CreateTxMonitoring(TDataShard *self, NMon::TEvRemoteHttpInfo::TPtr ev)
-{
- return new TTxMonitoring(self, ev);
-}
-
+{
+ return new TTxMonitoring(self, ev);
+}
+
ITransaction *TDataShard::CreateTxGetInfo(TDataShard *self, TEvDataShard::TEvGetInfoRequest::TPtr ev)
-{
- return new TTxGetInfo(self, ev);
-}
-
+{
+ return new TTxGetInfo(self, ev);
+}
+
ITransaction *TDataShard::CreateTxListOperations(TDataShard *self, TEvDataShard::TEvListOperationsRequest::TPtr ev)
-{
- return new TTxListOperations(self, ev);
-}
-
+{
+ return new TTxListOperations(self, ev);
+}
+
ITransaction *TDataShard::CreateTxGetOperation(TDataShard *self, TEvDataShard::TEvGetOperationRequest::TPtr ev)
-{
- return new TTxGetOperation(self, ev);
-}
-
+{
+ return new TTxGetOperation(self, ev);
+}
+
}}
diff --git a/ydb/core/tx/datashard/datashard__plan_step.cpp b/ydb/core/tx/datashard/datashard__plan_step.cpp
index 1270fcaa8a6..6399598865a 100644
--- a/ydb/core/tx/datashard/datashard__plan_step.cpp
+++ b/ydb/core/tx/datashard/datashard__plan_step.cpp
@@ -34,7 +34,7 @@ bool TDataShard::TTxPlanStep::Execute(TTransactionContext &txc, const TActorCont
Y_VERIFY(tx.HasTxId());
Y_VERIFY(tx.HasAckTo());
- txIds.push_back(tx.GetTxId());
+ txIds.push_back(tx.GetTxId());
TActorId txOwner = ActorIdFromProto(tx.GetAckTo());
TxByAck[txOwner].push_back(tx.GetTxId());
@@ -45,7 +45,7 @@ bool TDataShard::TTxPlanStep::Execute(TTransactionContext &txc, const TActorCont
// transactions that have already been executed.
// NOTE: There is a scenario when because of retries the Coordinator might send some old Tx with
// a new Step.
- IsAccepted = Self->Pipeline.PlanTxs(step, txIds, txc, ctx);
+ IsAccepted = Self->Pipeline.PlanTxs(step, txIds, txc, ctx);
}
if (! IsAccepted) {
@@ -87,7 +87,7 @@ void TDataShard::TTxPlanStep::Complete(const TActorContext &ctx) {
ctx.Send(Ev->Sender, accepted.Release()); // Reply to the mediator
if (IsAccepted) {
- TDuration duration = TAppData::TimeProvider->Now() - RequestStartTime;
+ TDuration duration = TAppData::TimeProvider->Now() - RequestStartTime;
Self->IncCounter(COUNTER_ACCEPTED_PLAN_STEP_COMPLETE_LATENCY, duration);
}
}
diff --git a/ydb/core/tx/datashard/datashard__progress_tx.cpp b/ydb/core/tx/datashard/datashard__progress_tx.cpp
index 546769e3ef9..3f1fab6b46e 100644
--- a/ydb/core/tx/datashard/datashard__progress_tx.cpp
+++ b/ydb/core/tx/datashard/datashard__progress_tx.cpp
@@ -10,9 +10,9 @@ TDataShard::TTxProgressTransaction::TTxProgressTransaction(TDataShard *self, TOp
{}
bool TDataShard::TTxProgressTransaction::Execute(TTransactionContext &txc, const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxProgressTransaction::Execute at " << Self->TabletID());
-
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxProgressTransaction::Execute at " << Self->TabletID());
+
try {
if (!Self->IsStateActive()) {
Self->IncCounter(COUNTER_TX_PROGRESS_SHARD_INACTIVE);
@@ -25,7 +25,7 @@ bool TDataShard::TTxProgressTransaction::Execute(TTransactionContext &txc, const
NIceDb::TNiceDb db(txc.DB);
- if (!ActiveOp) {
+ if (!ActiveOp) {
const bool expireSnapshotsAllowed = (
Self->State == TShardState::Ready ||
Self->State == TShardState::SplitSrcWaitForNoTxInFlight ||
@@ -36,34 +36,34 @@ bool TDataShard::TTxProgressTransaction::Execute(TTransactionContext &txc, const
(expireSnapshotsAllowed && Self->GetSnapshotManager().HasExpiringSnapshots()));
if (needFutureCleanup) {
- Self->PlanCleanup(ctx);
+ Self->PlanCleanup(ctx);
}
// Allow another concurrent progress tx
Self->PlanQueue.Reset(ctx);
Self->Pipeline.ActivateWaitingTxOps(ctx);
- ActiveOp = Self->Pipeline.GetNextActiveOp(false);
- if (!ActiveOp) {
+ ActiveOp = Self->Pipeline.GetNextActiveOp(false);
+ if (!ActiveOp) {
Self->IncCounter(COUNTER_TX_PROGRESS_IDLE);
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
- "No tx to execute at " << Self->TabletID() << " TxInFly " << Self->TxInFly());
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
+ "No tx to execute at " << Self->TabletID() << " TxInFly " << Self->TxInFly());
return true;
}
-
- Y_VERIFY_S(!ActiveOp->IsInProgress(),
- "GetNextActiveOp returned in-progress operation "
- << ActiveOp->GetKind() << " " << *ActiveOp << " (unit "
- << ActiveOp->GetCurrentUnit() << ") at " << Self->TabletID());
+
+ Y_VERIFY_S(!ActiveOp->IsInProgress(),
+ "GetNextActiveOp returned in-progress operation "
+ << ActiveOp->GetKind() << " " << *ActiveOp << " (unit "
+ << ActiveOp->GetCurrentUnit() << ") at " << Self->TabletID());
ActiveOp->IncrementInProgress();
}
Y_VERIFY(ActiveOp && ActiveOp->IsInProgress());
- auto status = Self->Pipeline.RunExecutionPlan(ActiveOp, CompleteList, txc, ctx);
-
- if (Self->Pipeline.CanRunAnotherOp())
- Self->PlanQueue.Progress(ctx);
-
+ auto status = Self->Pipeline.RunExecutionPlan(ActiveOp, CompleteList, txc, ctx);
+
+ if (Self->Pipeline.CanRunAnotherOp())
+ Self->PlanQueue.Progress(ctx);
+
switch (status) {
case EExecutionStatus::Restart:
// Restart even if current CompleteList is not empty
@@ -90,15 +90,15 @@ bool TDataShard::TTxProgressTransaction::Execute(TTransactionContext &txc, const
<< *ActiveOp << " " << ActiveOp->GetKind() << " at " << Self->TabletID());
}
- if (!CompleteList.empty()) {
+ if (!CompleteList.empty()) {
// Keep operation active until we run the complete list
- CommitStart = AppData()->TimeProvider->Now();
+ CommitStart = AppData()->TimeProvider->Now();
} else {
// Release operation as it's no longer needed
ActiveOp->DecrementInProgress();
- ActiveOp = nullptr;
- }
-
+ ActiveOp = nullptr;
+ }
+
// Commit all side effects
return true;
} catch (...) {
@@ -107,30 +107,30 @@ bool TDataShard::TTxProgressTransaction::Execute(TTransactionContext &txc, const
}
void TDataShard::TTxProgressTransaction::Complete(const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxProgressTransaction::Complete at " << Self->TabletID());
-
- if (ActiveOp) {
- Y_VERIFY(!ActiveOp->GetExecutionPlan().empty());
- if (!CompleteList.empty()) {
- auto commitTime = AppData()->TimeProvider->Now() - CommitStart;
- ActiveOp->SetCommitTime(CompleteList.front(), commitTime);
-
- if (!ActiveOp->IsExecutionPlanFinished()
- && (ActiveOp->GetCurrentUnit() != CompleteList.front()))
- ActiveOp->SetDelayedCommitTime(commitTime);
-
- Self->Pipeline.RunCompleteList(ActiveOp, CompleteList, ctx);
- }
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxProgressTransaction::Complete at " << Self->TabletID());
+
+ if (ActiveOp) {
+ Y_VERIFY(!ActiveOp->GetExecutionPlan().empty());
+ if (!CompleteList.empty()) {
+ auto commitTime = AppData()->TimeProvider->Now() - CommitStart;
+ ActiveOp->SetCommitTime(CompleteList.front(), commitTime);
+
+ if (!ActiveOp->IsExecutionPlanFinished()
+ && (ActiveOp->GetCurrentUnit() != CompleteList.front()))
+ ActiveOp->SetDelayedCommitTime(commitTime);
+
+ Self->Pipeline.RunCompleteList(ActiveOp, CompleteList, ctx);
+ }
ActiveOp->DecrementInProgress();
-
+
if (!ActiveOp->IsInProgress() && !ActiveOp->IsExecutionPlanFinished())
- Self->Pipeline.AddCandidateOp(ActiveOp);
-
- if (Self->Pipeline.CanRunAnotherOp())
- Self->PlanQueue.Progress(ctx);
- }
-
+ Self->Pipeline.AddCandidateOp(ActiveOp);
+
+ if (Self->Pipeline.CanRunAnotherOp())
+ Self->PlanQueue.Progress(ctx);
+ }
+
Self->CheckSplitCanStart(ctx);
Self->CheckMvccStateChangeCanStart(ctx);
}
diff --git a/ydb/core/tx/datashard/datashard__propose_tx_base.cpp b/ydb/core/tx/datashard/datashard__propose_tx_base.cpp
index 95b31608dcf..7dfb1a294e6 100644
--- a/ydb/core/tx/datashard/datashard__propose_tx_base.cpp
+++ b/ydb/core/tx/datashard/datashard__propose_tx_base.cpp
@@ -1,9 +1,9 @@
#include "datashard_txs.h"
#include "datashard_failpoints.h"
-#include "operation.h"
+#include "operation.h"
#include <ydb/core/util/pb.h>
-
+
namespace NKikimr {
namespace NDataShard {
@@ -11,22 +11,22 @@ TDataShard::TTxProposeTransactionBase::TTxProposeTransactionBase(TDataShard *sel
TEvDataShard::TEvProposeTransaction::TPtr &&ev,
TInstant receivedAt, ui64 tieBreakerIndex,
bool delayed)
- : TBase(self)
- , Ev(std::move(ev))
+ : TBase(self)
+ , Ev(std::move(ev))
, ReceivedAt(receivedAt)
, TieBreakerIndex(tieBreakerIndex)
- , Kind(static_cast<EOperationKind>(Ev->Get()->GetTxKind()))
- , TxId(Ev->Get()->GetTxId())
+ , Kind(static_cast<EOperationKind>(Ev->Get()->GetTxKind()))
+ , TxId(Ev->Get()->GetTxId())
, Acked(!delayed)
-{
-}
-
+{
+}
+
bool TDataShard::TTxProposeTransactionBase::Execute(NTabletFlatExecutor::TTransactionContext &txc,
- const TActorContext &ctx)
-{
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxProposeTransactionBase::Execute at " << Self->TabletID());
-
+ const TActorContext &ctx)
+{
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxProposeTransactionBase::Execute at " << Self->TabletID());
+
if (!Acked) {
// Ack event on the first execute (this will schedule the next event if any)
Self->ProposeQueue.Ack(ctx);
@@ -34,15 +34,15 @@ bool TDataShard::TTxProposeTransactionBase::Execute(NTabletFlatExecutor::TTransa
}
try {
- TOutputOpData::TResultPtr result = nullptr;
+ TOutputOpData::TResultPtr result = nullptr;
// If tablet is in follower mode then we should sync scheme
- // before we build and check operation.
+ // before we build and check operation.
if (Self->IsFollower()) {
NKikimrTxDataShard::TError::EKind status = NKikimrTxDataShard::TError::OK;
TString errMessage;
if (!Self->SyncSchemeOnFollower(txc, ctx, status, errMessage))
- return false;
+ return false;
if (status != NKikimrTxDataShard::TError::OK) {
auto kind = static_cast<NKikimrTxDataShard::ETransactionKind>(Kind);
@@ -50,29 +50,29 @@ bool TDataShard::TTxProposeTransactionBase::Execute(NTabletFlatExecutor::TTransa
NKikimrTxDataShard::TEvProposeTransactionResult::ERROR));
result->AddError(status, errMessage);
}
- }
-
- if (result) {
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Propose transaction complete txid " << TxId << " at tablet "
- << Self->TabletID() << " status: " << result->GetStatus());
- TString errors = result->GetError();
- if (errors.Size()) {
- LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
- "Errors while proposing transaction txid " << TxId
- << " at tablet " << Self->TabletID() << " status: "
- << result->GetStatus() << " errors: " << errors);
- }
-
+ }
+
+ if (result) {
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Propose transaction complete txid " << TxId << " at tablet "
+ << Self->TabletID() << " status: " << result->GetStatus());
+ TString errors = result->GetError();
+ if (errors.Size()) {
+ LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Errors while proposing transaction txid " << TxId
+ << " at tablet " << Self->TabletID() << " status: "
+ << result->GetStatus() << " errors: " << errors);
+ }
+
TActorId target = Op ? Op->GetTarget() : Ev->Get()->GetSource();
- ui64 cookie = Op ? Op->GetCookie() : Ev->Cookie;
- ctx.Send(target, result.Release(), 0, cookie);
-
- return true;
- }
-
- if (Ev) {
- Y_VERIFY(!Op);
+ ui64 cookie = Op ? Op->GetCookie() : Ev->Cookie;
+ ctx.Send(target, result.Release(), 0, cookie);
+
+ return true;
+ }
+
+ if (Ev) {
+ Y_VERIFY(!Op);
if (Self->CheckDataTxRejectAndReply(Ev->Get(), ctx)) {
Ev = nullptr;
@@ -80,26 +80,26 @@ bool TDataShard::TTxProposeTransactionBase::Execute(NTabletFlatExecutor::TTransa
}
TOperation::TPtr op = Self->Pipeline.BuildOperation(Ev, ReceivedAt, TieBreakerIndex, txc, ctx);
-
- // Unsuccessful operation parse.
- if (op->IsAborted()) {
- Y_VERIFY(op->Result());
- ctx.Send(op->GetTarget(), op->Result().Release());
- return true;
- }
-
- op->BuildExecutionPlan(false);
- if (!op->IsExecutionPlanFinished())
- Self->Pipeline.GetExecutionUnit(op->GetCurrentUnit()).AddOperation(op);
-
- Op = op;
- Ev = nullptr;
+
+ // Unsuccessful operation parse.
+ if (op->IsAborted()) {
+ Y_VERIFY(op->Result());
+ ctx.Send(op->GetTarget(), op->Result().Release());
+ return true;
+ }
+
+ op->BuildExecutionPlan(false);
+ if (!op->IsExecutionPlanFinished())
+ Self->Pipeline.GetExecutionUnit(op->GetCurrentUnit()).AddOperation(op);
+
+ Op = op;
+ Ev = nullptr;
Op->IncrementInProgress();
- }
-
+ }
+
Y_VERIFY(Op && Op->IsInProgress() && !Op->GetExecutionPlan().empty());
-
- auto status = Self->Pipeline.RunExecutionPlan(Op, CompleteList, txc, ctx);
+
+ auto status = Self->Pipeline.RunExecutionPlan(Op, CompleteList, txc, ctx);
switch (status) {
case EExecutionStatus::Restart:
@@ -127,15 +127,15 @@ bool TDataShard::TTxProposeTransactionBase::Execute(NTabletFlatExecutor::TTransa
<< *Op << " " << Op->GetKind() << " at " << Self->TabletID());
}
- if (!CompleteList.empty()) {
+ if (!CompleteList.empty()) {
// Keep operation active until we run the complete list
- CommitStart = AppData()->TimeProvider->Now();
+ CommitStart = AppData()->TimeProvider->Now();
} else {
// Release operation as it's no longer needed
Op->DecrementInProgress();
Op = nullptr;
}
-
+
// Commit all side effects
return true;
} catch (const TNotReadyTabletException &) {
@@ -155,9 +155,9 @@ bool TDataShard::TTxProposeTransactionBase::Execute(NTabletFlatExecutor::TTransa
}
void TDataShard::TTxProposeTransactionBase::Complete(const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxProposeTransactionBase::Complete at " << Self->TabletID());
-
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxProposeTransactionBase::Complete at " << Self->TabletID());
+
if (Op) {
Y_VERIFY(!Op->GetExecutionPlan().empty());
if (!CompleteList.empty()) {
@@ -167,18 +167,18 @@ void TDataShard::TTxProposeTransactionBase::Complete(const TActorContext &ctx) {
if (!Op->IsExecutionPlanFinished()
&& (Op->GetCurrentUnit() != CompleteList.front()))
Op->SetDelayedCommitTime(commitTime);
-
+
Self->Pipeline.RunCompleteList(Op, CompleteList, ctx);
}
Op->DecrementInProgress();
-
+
if (!Op->IsInProgress() && !Op->IsExecutionPlanFinished())
Self->Pipeline.AddCandidateOp(Op);
if (Self->Pipeline.CanRunAnotherOp())
Self->PlanQueue.Progress(ctx);
- }
-
+ }
+
Self->CheckSplitCanStart(ctx);
Self->CheckMvccStateChangeCanStart(ctx);
}
diff --git a/ydb/core/tx/datashard/datashard__readset.cpp b/ydb/core/tx/datashard/datashard__readset.cpp
index b389852006e..c935025b802 100644
--- a/ydb/core/tx/datashard/datashard__readset.cpp
+++ b/ydb/core/tx/datashard/datashard__readset.cpp
@@ -10,14 +10,14 @@ namespace NDataShard {
{}
bool TDataShard::TTxReadSet::Execute(TTransactionContext &txc, const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxReadSet::Execute at " << Self->TabletID() << " got read set: "
- << Ev->Get()->ToString().data());
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxReadSet::Execute at " << Self->TabletID() << " got read set: "
+ << Ev->Get()->ToString().data());
auto state = Self->State;
- Y_VERIFY(state != TShardState::Unknown
- && state != TShardState::Uninitialized
- && state != TShardState::Readonly,
+ Y_VERIFY(state != TShardState::Unknown
+ && state != TShardState::Uninitialized
+ && state != TShardState::Readonly,
"State %" PRIu32 " event %s", state, Ev->Get()->ToString().data());
Ack = MakeAck(ctx);
@@ -30,7 +30,7 @@ namespace NDataShard {
return true;
}
- bool saved = Self->Pipeline.SaveInReadSet(*Ev->Get(), Ack, txc, ctx);
+ bool saved = Self->Pipeline.SaveInReadSet(*Ev->Get(), Ack, txc, ctx);
if (!saved) { // delayed. Do not ack
Y_VERIFY(!Ack);
Ev.Reset();
@@ -45,9 +45,9 @@ namespace NDataShard {
}
void TDataShard::TTxReadSet::Complete(const TActorContext &ctx) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxReadSet::Complete at " << Self->TabletID());
-
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxReadSet::Complete at " << Self->TabletID());
+
// If it was read set for non-active tx we should send ACK back after successful save in DB
// Note that, active tx will send "delayed" ACK after tx complete
if (Ack) {
diff --git a/ydb/core/tx/datashard/datashard__s3.cpp b/ydb/core/tx/datashard/datashard__s3.cpp
index eb6b24d422b..2f7a74bbab6 100644
--- a/ydb/core/tx/datashard/datashard__s3.cpp
+++ b/ydb/core/tx/datashard/datashard__s3.cpp
@@ -52,7 +52,7 @@ public:
return true;
}
- const TUserTable& tableInfo = *Self->TableInfos[tableId];
+ const TUserTable& tableInfo = *Self->TableInfos[tableId];
if (tableInfo.IsBackup) {
SetError(NKikimrTxDataShard::TError::SCHEME_ERROR, "Cannot read from a backup table");
return true;
diff --git a/ydb/core/tx/datashard/datashard__stats.cpp b/ydb/core/tx/datashard/datashard__stats.cpp
index c1d73d96cbd..129a14dca5f 100644
--- a/ydb/core/tx/datashard/datashard__stats.cpp
+++ b/ydb/core/tx/datashard/datashard__stats.cpp
@@ -285,8 +285,8 @@ public:
rowCountResolution = ti.second->Stats.RowCountResolution;
}
- ti.second->StatsUpdateInProgress = true;
- ti.second->StatsNeedUpdate = false;
+ ti.second->StatsUpdateInProgress = true;
+ ti.second->StatsNeedUpdate = false;
ui64 indexSize = txc.DB.GetTableIndexSize(localTableId);
if (shadowTableId) {
diff --git a/ydb/core/tx/datashard/datashard__store_table_path.cpp b/ydb/core/tx/datashard/datashard__store_table_path.cpp
index 299c92baa84..cdd736b1565 100644
--- a/ydb/core/tx/datashard/datashard__store_table_path.cpp
+++ b/ydb/core/tx/datashard/datashard__store_table_path.cpp
@@ -1,42 +1,42 @@
-#include "datashard_txs.h"
-
-#include <util/string/vector.h>
-
-namespace NKikimr {
+#include "datashard_txs.h"
+
+#include <util/string/vector.h>
+
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NTabletFlatExecutor;
-
+
+using namespace NTabletFlatExecutor;
+
TDataShard::TTxStoreTablePath::TTxStoreTablePath(TDataShard *self, ui64 pathId, const TString &path)
- : TBase(self)
- , PathId(pathId)
- , Path(path)
-{
-}
-
+ : TBase(self)
+ , PathId(pathId)
+ , Path(path)
+{
+}
+
bool TDataShard::TTxStoreTablePath::Execute(TTransactionContext &txc, const TActorContext &ctx)
-{
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxStoreTablePath::Execute at " << Self->TabletID());
-
- Y_VERIFY(Self->TableInfos.contains(PathId));
-
- txc.DB.NoMoreReadsForTx();
-
+{
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxStoreTablePath::Execute at " << Self->TabletID());
+
+ Y_VERIFY(Self->TableInfos.contains(PathId));
+
+ txc.DB.NoMoreReadsForTx();
+
TUserTable::TPtr copy = new TUserTable(*Self->TableInfos.at(PathId));
copy->SetPath(Path);
-
- NIceDb::TNiceDb db(txc.DB);
+
+ NIceDb::TNiceDb db(txc.DB);
Self->PersistUserTable(db, PathId, *copy);
Self->AddUserTable(TPathId(Self->GetPathOwnerId(), PathId), copy);
-
- return true;
-}
-
+
+ return true;
+}
+
void TDataShard::TTxStoreTablePath::Complete(const TActorContext &ctx)
-{
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxStoreTablePath::Complete at " << Self->TabletID());
-}
-
-}}
+{
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxStoreTablePath::Complete at " << Self->TabletID());
+}
+
+}}
diff --git a/ydb/core/tx/datashard/datashard__undelivered.cpp b/ydb/core/tx/datashard/datashard__undelivered.cpp
index 8bcfe07a18b..0cee328d022 100644
--- a/ydb/core/tx/datashard/datashard__undelivered.cpp
+++ b/ydb/core/tx/datashard/datashard__undelivered.cpp
@@ -1,65 +1,65 @@
-#include "datashard_impl.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NTabletFlatExecutor;
-
+
+using namespace NTabletFlatExecutor;
+
class TDataShard::TTxDisconnected : public NTabletFlatExecutor::TTransactionBase<TDataShard> {
-public:
+public:
TTxDisconnected(TDataShard *self, TEvInterconnect::TEvNodeDisconnected::TPtr ev)
- : TBase(self)
- , Event(std::move(ev))
- {}
-
- TTxType GetTxType() const override
- {
- return TXTYPE_DISCONNECTED;
- }
-
- bool Execute(TTransactionContext &/*txc*/, const TActorContext &ctx)
- {
- ui32 nodeId = Event->Get()->NodeId;
- Self->Pipeline.ProcessDisconnected(nodeId);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "TTxDisconnected, shard: " << Self->TabletID() << ", node: " << nodeId);
-
- Self->PlanQueue.Progress(ctx);
- return true;
- }
-
- void Complete(const TActorContext &/*ctx*/) override {
- }
-
-private:
- TEvInterconnect::TEvNodeDisconnected::TPtr Event;
-};
-
+ : TBase(self)
+ , Event(std::move(ev))
+ {}
+
+ TTxType GetTxType() const override
+ {
+ return TXTYPE_DISCONNECTED;
+ }
+
+ bool Execute(TTransactionContext &/*txc*/, const TActorContext &ctx)
+ {
+ ui32 nodeId = Event->Get()->NodeId;
+ Self->Pipeline.ProcessDisconnected(nodeId);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TTxDisconnected, shard: " << Self->TabletID() << ", node: " << nodeId);
+
+ Self->PlanQueue.Progress(ctx);
+ return true;
+ }
+
+ void Complete(const TActorContext &/*ctx*/) override {
+ }
+
+private:
+ TEvInterconnect::TEvNodeDisconnected::TPtr Event;
+};
+
void TDataShard::Handle(TEvents::TEvUndelivered::TPtr &ev,
- const TActorContext &ctx)
-{
- ui64 txId = ev->Cookie;
- auto op = Pipeline.FindOp(ev->Cookie);
- if (op) {
- op->AddInputEvent(ev.Release());
- Pipeline.AddCandidateOp(op);
- PlanQueue.Progress(ctx);
- }
-}
-
+ const TActorContext &ctx)
+{
+ ui64 txId = ev->Cookie;
+ auto op = Pipeline.FindOp(ev->Cookie);
+ if (op) {
+ op->AddInputEvent(ev.Release());
+ Pipeline.AddCandidateOp(op);
+ PlanQueue.Progress(ctx);
+ }
+}
+
void TDataShard::Handle(TEvInterconnect::TEvNodeDisconnected::TPtr &ev,
- const TActorContext &ctx)
-{
- ui32 nodeId = ev->Get()->NodeId;
-
- LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Shard " << TabletID() << " disconnected from node " << nodeId);
-
- Pipeline.ProcessDisconnected(nodeId);
- PlanQueue.Progress(ctx);
-}
-
-
+ const TActorContext &ctx)
+{
+ ui32 nodeId = ev->Get()->NodeId;
+
+ LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Shard " << TabletID() << " disconnected from node " << nodeId);
+
+ Pipeline.ProcessDisconnected(nodeId);
+ PlanQueue.Progress(ctx);
+}
+
+
} // namesapce NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/datashard_active_transaction.cpp b/ydb/core/tx/datashard/datashard_active_transaction.cpp
index 295ba69fd2d..0226bd42e25 100644
--- a/ydb/core/tx/datashard/datashard_active_transaction.cpp
+++ b/ydb/core/tx/datashard/datashard_active_transaction.cpp
@@ -5,7 +5,7 @@
#include "datashard_locks.h"
#include "datashard_impl.h"
#include "datashard_failpoints.h"
-#include "key_conflicts.h"
+#include "key_conflicts.h"
#include <library/cpp/actors/core/memory_track.h>
@@ -13,19 +13,19 @@ namespace NKikimr {
namespace NDataShard {
TValidatedDataTx::TValidatedDataTx(TDataShard *self,
- TTransactionContext &txc,
- const TActorContext &ctx,
- const TStepOrder &stepTxId,
- TInstant receivedAt,
- const TString &txBody)
- : StepTxId_(stepTxId)
+ TTransactionContext &txc,
+ const TActorContext &ctx,
+ const TStepOrder &stepTxId,
+ TInstant receivedAt,
+ const TString &txBody)
+ : StepTxId_(stepTxId)
, TabletId_(self->TabletID())
, TxBody(txBody)
- , EngineBay(self, txc, ctx, stepTxId.ToPair())
- , ErrCode(NKikimrTxDataShard::TError::OK)
- , TxSize(0)
- , TxCacheUsage(0)
- , IsReleased(false)
+ , EngineBay(self, txc, ctx, stepTxId.ToPair())
+ , ErrCode(NKikimrTxDataShard::TError::OK)
+ , TxSize(0)
+ , TxCacheUsage(0)
+ , IsReleased(false)
, IsReadOnly(true)
, AllowCancelROwithReadsets(self->AllowCancelROwithReadsets())
, Cancelled(false)
@@ -42,16 +42,16 @@ TValidatedDataTx::TValidatedDataTx(TDataShard *self,
NActors::NMemory::TLabel<MemoryLabelValidatedDataTx>::Add(TxSize);
Y_VERIFY(Tx.HasMiniKQL() || Tx.HasReadTableTransaction() || Tx.HasKqpTransaction(),
- "One of the fields should be set: MiniKQL, ReadTableTransaction, KqpTransaction");
+ "One of the fields should be set: MiniKQL, ReadTableTransaction, KqpTransaction");
+
+ if (Tx.GetLockTxId())
+ EngineBay.SetLockTxId(Tx.GetLockTxId());
- if (Tx.GetLockTxId())
- EngineBay.SetLockTxId(Tx.GetLockTxId());
-
if (Tx.GetImmediate())
EngineBay.SetIsImmediateTx();
- if (Tx.HasReadTableTransaction()) {
- auto &tx = Tx.GetReadTableTransaction();
+ if (Tx.HasReadTableTransaction()) {
+ auto &tx = Tx.GetReadTableTransaction();
if (self->TableInfos.contains(tx.GetTableId().GetTableId())) {
auto* info = self->TableInfos[tx.GetTableId().GetTableId()].Get();
Y_VERIFY(info, "Unexpected missing table info");
@@ -172,11 +172,11 @@ TValidatedDataTx::TValidatedDataTx(TDataShard *self,
ErrStr = TStringBuilder() << "Transaction validation failed: " << e.what() << ".";
return;
}
- } else {
- Y_VERIFY(Tx.HasMiniKQL());
+ } else {
+ Y_VERIFY(Tx.HasMiniKQL());
if (Tx.GetLlvmRuntime()) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Using LLVM runtime to execute transaction: " << StepTxId_.TxId);
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Using LLVM runtime to execute transaction: " << StepTxId_.TxId);
EngineBay.SetUseLlvmRuntime(true);
}
if (Tx.HasPerShardKeysSizeLimitBytes()) {
@@ -185,13 +185,13 @@ TValidatedDataTx::TValidatedDataTx(TDataShard *self,
IsReadOnly = IsReadOnly && Tx.GetReadOnly();
- auto engine = EngineBay.GetEngine();
- auto result = engine->AddProgram(TabletId_, Tx.GetMiniKQL(), Tx.GetReadOnly());
-
- ErrStr = engine->GetErrors();
- ErrCode = ConvertErrCode(result);
+ auto engine = EngineBay.GetEngine();
+ auto result = engine->AddProgram(TabletId_, Tx.GetMiniKQL(), Tx.GetReadOnly());
+
+ ErrStr = engine->GetErrors();
+ ErrCode = ConvertErrCode(result);
}
-
+
ComputeDeadline();
}
@@ -204,20 +204,20 @@ const google::protobuf::RepeatedPtrField<NYql::NDqProto::TDqTask>& TValidatedDat
return Tx.GetKqpTransaction().GetTasks();
}
-ui32 TValidatedDataTx::ExtractKeys(bool allowErrors)
-{
+ui32 TValidatedDataTx::ExtractKeys(bool allowErrors)
+{
using EResult = NMiniKQL::IEngineFlat::EResult;
EResult result = EngineBay.Validate();
- if (allowErrors) {
- if (result != EResult::Ok) {
- ErrStr = EngineBay.GetEngine()->GetErrors();
- ErrCode = ConvertErrCode(result);
- return 0;
- }
- } else {
- Y_VERIFY(result == EResult::Ok, "Engine errors: %s", EngineBay.GetEngine()->GetErrors().data());
- }
+ if (allowErrors) {
+ if (result != EResult::Ok) {
+ ErrStr = EngineBay.GetEngine()->GetErrors();
+ ErrCode = ConvertErrCode(result);
+ return 0;
+ }
+ } else {
+ Y_VERIFY(result == EResult::Ok, "Engine errors: %s", EngineBay.GetEngine()->GetErrors().data());
+ }
return KeysCount();
}
@@ -302,25 +302,25 @@ bool TValidatedDataTx::CheckCancelled() {
return Cancelled;
}
-void TValidatedDataTx::ReleaseTxData() {
- TxBody = "";
- auto lock = Tx.GetLockTxId();
- Tx.Clear();
- Tx.SetLockTxId(lock);
- EngineBay.DestroyEngine();
- IsReleased = true;
+void TValidatedDataTx::ReleaseTxData() {
+ TxBody = "";
+ auto lock = Tx.GetLockTxId();
+ Tx.Clear();
+ Tx.SetLockTxId(lock);
+ EngineBay.DestroyEngine();
+ IsReleased = true;
NActors::NMemory::TLabel<MemoryLabelValidatedDataTx>::Sub(TxSize);
ComputeTxSize();
NActors::NMemory::TLabel<MemoryLabelValidatedDataTx>::Add(TxSize);
-}
-
-void TValidatedDataTx::ComputeTxSize() {
- TxSize = sizeof(TValidatedDataTx);
- TxSize += TxBody.size();
- TxSize += Tx.ByteSize();
-}
-
+}
+
+void TValidatedDataTx::ComputeTxSize() {
+ TxSize = sizeof(TValidatedDataTx);
+ TxSize += TxBody.size();
+ TxSize += Tx.ByteSize();
+}
+
void TValidatedDataTx::ComputeDeadline() {
Deadline_ = Tx.GetCancelDeadlineMs() ? TInstant::MilliSeconds(Tx.GetCancelDeadlineMs()) : TInstant::Max();
if (ReceivedAt_ && Tx.GetCancelAfterMs()) {
@@ -331,108 +331,108 @@ void TValidatedDataTx::ComputeDeadline() {
//
-TActiveTransaction::TActiveTransaction(const TBasicOpInfo &op,
- TValidatedDataTx::TPtr dataTx)
+TActiveTransaction::TActiveTransaction(const TBasicOpInfo &op,
+ TValidatedDataTx::TPtr dataTx)
: TActiveTransaction(op)
{
TrackMemory();
- FillTxData(dataTx);
-}
-
+ FillTxData(dataTx);
+}
+
TActiveTransaction::TActiveTransaction(TDataShard *self,
- TTransactionContext &txc,
- const TActorContext &ctx,
- const TBasicOpInfo &op,
+ TTransactionContext &txc,
+ const TActorContext &ctx,
+ const TBasicOpInfo &op,
const TActorId &target,
- const TString &txBody,
- const TVector<TSysTables::TLocksTable::TLock> &locks,
- ui64 artifactFlags)
- : TActiveTransaction(op)
-{
+ const TString &txBody,
+ const TVector<TSysTables::TLocksTable::TLock> &locks,
+ ui64 artifactFlags)
+ : TActiveTransaction(op)
+{
TrackMemory();
- FillTxData(self, txc, ctx, target, txBody, locks, artifactFlags);
-}
-
+ FillTxData(self, txc, ctx, target, txBody, locks, artifactFlags);
+}
+
TActiveTransaction::~TActiveTransaction()
{
UntrackMemory();
}
-void TActiveTransaction::FillTxData(TValidatedDataTx::TPtr dataTx)
-{
- Y_VERIFY(!DataTx);
- Y_VERIFY(TxBody.empty());
-
- Target = dataTx->Source();
+void TActiveTransaction::FillTxData(TValidatedDataTx::TPtr dataTx)
+{
+ Y_VERIFY(!DataTx);
+ Y_VERIFY(TxBody.empty());
+
+ Target = dataTx->Source();
DataTx = dataTx;
-
- if (DataTx->HasStreamResponse())
- SetStreamSink(DataTx->GetSink());
+
+ if (DataTx->HasStreamResponse())
+ SetStreamSink(DataTx->GetSink());
}
void TActiveTransaction::FillTxData(TDataShard *self,
- TTransactionContext &txc,
- const TActorContext &ctx,
+ TTransactionContext &txc,
+ const TActorContext &ctx,
const TActorId &target,
- const TString &txBody,
- const TVector<TSysTables::TLocksTable::TLock> &locks,
- ui64 artifactFlags)
+ const TString &txBody,
+ const TVector<TSysTables::TLocksTable::TLock> &locks,
+ ui64 artifactFlags)
{
UntrackMemory();
- Y_VERIFY(!DataTx);
- Y_VERIFY(TxBody.empty());
-
- Target = target;
- TxBody = txBody;
- if (locks.size()) {
- for (auto lock : locks)
- LocksCache().Locks[lock.LockId] = lock;
- }
- ArtifactFlags = artifactFlags;
- if (IsDataTx() || IsReadTable()) {
+ Y_VERIFY(!DataTx);
+ Y_VERIFY(TxBody.empty());
+
+ Target = target;
+ TxBody = txBody;
+ if (locks.size()) {
+ for (auto lock : locks)
+ LocksCache().Locks[lock.LockId] = lock;
+ }
+ ArtifactFlags = artifactFlags;
+ if (IsDataTx() || IsReadTable()) {
Y_VERIFY(!DataTx);
- BuildDataTx(self, txc, ctx);
- Y_VERIFY(DataTx->Ready());
-
- if (DataTx->HasStreamResponse())
- SetStreamSink(DataTx->GetSink());
- } else if (IsSchemeTx()) {
- BuildSchemeTx();
+ BuildDataTx(self, txc, ctx);
+ Y_VERIFY(DataTx->Ready());
+
+ if (DataTx->HasStreamResponse())
+ SetStreamSink(DataTx->GetSink());
+ } else if (IsSchemeTx()) {
+ BuildSchemeTx();
} else if (IsSnapshotTx()) {
BuildSnapshotTx();
} else if (IsDistributedEraseTx()) {
BuildDistributedEraseTx();
} else if (IsCommitWritesTx()) {
BuildCommitWritesTx();
- }
+ }
TrackMemory();
-}
-
+}
+
TValidatedDataTx::TPtr TActiveTransaction::BuildDataTx(TDataShard *self,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- Y_VERIFY(IsDataTx() || IsReadTable());
- if (!DataTx) {
- Y_VERIFY(TxBody);
- DataTx = std::make_shared<TValidatedDataTx>(self, txc, ctx, GetStepOrder(),
- GetReceivedAt(), TxBody);
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ Y_VERIFY(IsDataTx() || IsReadTable());
+ if (!DataTx) {
+ Y_VERIFY(TxBody);
+ DataTx = std::make_shared<TValidatedDataTx>(self, txc, ctx, GetStepOrder(),
+ GetReceivedAt(), TxBody);
if (DataTx->HasStreamResponse())
SetStreamSink(DataTx->GetSink());
}
- return DataTx;
+ return DataTx;
}
-bool TActiveTransaction::BuildSchemeTx()
-{
- Y_VERIFY(TxBody);
+bool TActiveTransaction::BuildSchemeTx()
+{
+ Y_VERIFY(TxBody);
SchemeTx.Reset(new NKikimrTxDataShard::TFlatSchemeTransaction);
bool res = SchemeTx->ParseFromArray(TxBody.data(), TxBody.size());
- if (!res)
- return false;
-
+ if (!res)
+ return false;
+
ui32 count = (ui32)SchemeTx->HasCreateTable()
+ (ui32)SchemeTx->HasDropTable()
+ (ui32)SchemeTx->HasAlterTable()
@@ -448,20 +448,20 @@ bool TActiveTransaction::BuildSchemeTx()
+ (ui32)SchemeTx->HasCreateCdcStreamNotice()
+ (ui32)SchemeTx->HasAlterCdcStreamNotice()
+ (ui32)SchemeTx->HasDropCdcStreamNotice();
- if (count != 1)
- return false;
-
- if (SchemeTx->HasCreateTable())
+ if (count != 1)
+ return false;
+
+ if (SchemeTx->HasCreateTable())
SchemeTxType = TSchemaOperation::ETypeCreate;
- else if (SchemeTx->HasDropTable())
+ else if (SchemeTx->HasDropTable())
SchemeTxType = TSchemaOperation::ETypeDrop;
- else if (SchemeTx->HasAlterTable())
+ else if (SchemeTx->HasAlterTable())
SchemeTxType = TSchemaOperation::ETypeAlter;
- else if (SchemeTx->HasBackup())
+ else if (SchemeTx->HasBackup())
SchemeTxType = TSchemaOperation::ETypeBackup;
else if (SchemeTx->HasRestore())
SchemeTxType = TSchemaOperation::ETypeRestore;
- else if (SchemeTx->HasSendSnapshot())
+ else if (SchemeTx->HasSendSnapshot())
SchemeTxType = TSchemaOperation::ETypeCopy;
else if (SchemeTx->HasCreatePersistentSnapshot())
SchemeTxType = TSchemaOperation::ETypeCreatePersistentSnapshot;
@@ -481,12 +481,12 @@ bool TActiveTransaction::BuildSchemeTx()
SchemeTxType = TSchemaOperation::ETypeAlterCdcStream;
else if (SchemeTx->HasDropCdcStreamNotice())
SchemeTxType = TSchemaOperation::ETypeDropCdcStream;
- else
+ else
SchemeTxType = TSchemaOperation::ETypeUnknown;
-
+
return SchemeTxType != TSchemaOperation::ETypeUnknown;
-}
-
+}
+
bool TActiveTransaction::BuildSnapshotTx()
{
Y_VERIFY(TxBody);
@@ -537,125 +537,125 @@ bool TActiveTransaction::BuildCommitWritesTx() {
//
-void TActiveTransaction::ReleaseTxData(NTabletFlatExecutor::TTxMemoryProviderBase &provider,
- const TActorContext &ctx) {
- ReleasedTxDataSize = provider.GetMemoryLimit() + provider.GetRequestedMemory();
-
- if (!DataTx || DataTx->IsTxDataReleased())
- return;
-
- DataTx->ReleaseTxData();
- // Immediate transactions have no body stored.
+void TActiveTransaction::ReleaseTxData(NTabletFlatExecutor::TTxMemoryProviderBase &provider,
+ const TActorContext &ctx) {
+ ReleasedTxDataSize = provider.GetMemoryLimit() + provider.GetRequestedMemory();
+
+ if (!DataTx || DataTx->IsTxDataReleased())
+ return;
+
+ DataTx->ReleaseTxData();
+ // Immediate transactions have no body stored.
if (!IsImmediate()) {
UntrackMemory();
- TxBody.clear();
+ TxBody.clear();
TrackMemory();
}
-
- //InReadSets.clear();
- OutReadSets().clear();
- LocksAccessLog().Locks.clear();
- LocksCache().Locks.clear();
- ArtifactFlags = 0;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD, "tx " << GetTxId() << " released its data");
-}
-
+
+ //InReadSets.clear();
+ OutReadSets().clear();
+ LocksAccessLog().Locks.clear();
+ LocksCache().Locks.clear();
+ ArtifactFlags = 0;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD, "tx " << GetTxId() << " released its data");
+}
+
void TActiveTransaction::DbStoreLocksAccessLog(TDataShard * self,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
using Schema = TDataShard::Schema;
-
- NIceDb::TNiceDb db(txc.DB);
- TVector<TSysTables::TLocksTable::TLock> vec;
- vec.reserve(LocksAccessLog().Locks.size());
- for (auto &pr : LocksAccessLog().Locks)
- vec.emplace_back(pr.second);
- db.Table<Schema::TxArtifacts>().Key(GetTxId())
- .Update(NIceDb::TUpdate<Schema::TxArtifacts::Locks>(vec));
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Storing " << vec.size() << " locks for txid=" << GetTxId()
- << " in " << self->TabletID());
-}
-
+
+ NIceDb::TNiceDb db(txc.DB);
+ TVector<TSysTables::TLocksTable::TLock> vec;
+ vec.reserve(LocksAccessLog().Locks.size());
+ for (auto &pr : LocksAccessLog().Locks)
+ vec.emplace_back(pr.second);
+ db.Table<Schema::TxArtifacts>().Key(GetTxId())
+ .Update(NIceDb::TUpdate<Schema::TxArtifacts::Locks>(vec));
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Storing " << vec.size() << " locks for txid=" << GetTxId()
+ << " in " << self->TabletID());
+}
+
void TActiveTransaction::DbStoreArtifactFlags(TDataShard * self,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
using Schema = TDataShard::Schema;
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::TxArtifacts>().Key(GetTxId())
- .Update<Schema::TxArtifacts::Flags>(ArtifactFlags);
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Storing artifactflags=" << ArtifactFlags << " for txid=" << GetTxId()
- << " in " << self->TabletID());
-}
-
-ui64 TActiveTransaction::GetMemoryConsumption() const {
- ui64 res = 0;
- if (DataTx) {
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::TxArtifacts>().Key(GetTxId())
+ .Update<Schema::TxArtifacts::Flags>(ArtifactFlags);
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Storing artifactflags=" << ArtifactFlags << " for txid=" << GetTxId()
+ << " in " << self->TabletID());
+}
+
+ui64 TActiveTransaction::GetMemoryConsumption() const {
+ ui64 res = 0;
+ if (DataTx) {
res += DataTx->GetTxSize() + DataTx->GetMemoryAllocated();
- }
- return res;
-}
+ }
+ return res;
+}
ERestoreDataStatus TActiveTransaction::RestoreTxData(
TDataShard *self,
TTransactionContext &txc,
const TActorContext &ctx)
-{
- if (!DataTx) {
- ReleasedTxDataSize = 0;
+{
+ if (!DataTx) {
+ ReleasedTxDataSize = 0;
return ERestoreDataStatus::Ok;
- }
-
+ }
+
UntrackMemory();
- // For immediate transactions we should restore just
- // from the TxBody. For planned transaction we should
- // restore from local database.
- TVector<TSysTables::TLocksTable::TLock> locks;
- if (!IsImmediate()) {
- NIceDb::TNiceDb db(txc.DB);
- bool ok = self->TransQueue.LoadTxDetails(db, GetTxId(), Target, TxBody,
- locks, ArtifactFlags);
- if (!ok) {
- TxBody.clear();
- ArtifactFlags = 0;
+ // For immediate transactions we should restore just
+ // from the TxBody. For planned transaction we should
+ // restore from local database.
+ TVector<TSysTables::TLocksTable::TLock> locks;
+ if (!IsImmediate()) {
+ NIceDb::TNiceDb db(txc.DB);
+ bool ok = self->TransQueue.LoadTxDetails(db, GetTxId(), Target, TxBody,
+ locks, ArtifactFlags);
+ if (!ok) {
+ TxBody.clear();
+ ArtifactFlags = 0;
return ERestoreDataStatus::Restart;
- }
- } else {
- Y_VERIFY(TxBody);
- }
-
+ }
+ } else {
+ Y_VERIFY(TxBody);
+ }
+
TrackMemory();
- for (auto &lock : locks)
- LocksCache().Locks[lock.LockId] = lock;
-
- bool extractKeys = DataTx->IsTxInfoLoaded();
- DataTx = std::make_shared<TValidatedDataTx>(self, txc, ctx, GetStepOrder(),
- GetReceivedAt(), TxBody);
+ for (auto &lock : locks)
+ LocksCache().Locks[lock.LockId] = lock;
+
+ bool extractKeys = DataTx->IsTxInfoLoaded();
+ DataTx = std::make_shared<TValidatedDataTx>(self, txc, ctx, GetStepOrder(),
+ GetReceivedAt(), TxBody);
if (DataTx->Ready() && extractKeys) {
DataTx->ExtractKeys(true);
}
-
+
if (!DataTx->Ready()) {
return ERestoreDataStatus::Error;
}
- ReleasedTxDataSize = 0;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD, "tx " << GetTxId() << " at "
- << self->TabletID() << " restored its data");
-
+ ReleasedTxDataSize = 0;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD, "tx " << GetTxId() << " at "
+ << self->TabletID() << " restored its data");
+
return ERestoreDataStatus::Ok;
-}
-
+}
+
void TActiveTransaction::FinalizeDataTxPlan()
{
Y_VERIFY(IsDataTx());
@@ -729,39 +729,39 @@ THolder<TExecutionUnit> CreateFinalizeDataTxPlanUnit(TDataShard &dataShard, TPip
return THolder(new TFinalizeDataTxPlanUnit(dataShard, pipeline));
}
-void TActiveTransaction::BuildExecutionPlan(bool loaded)
-{
- Y_VERIFY(GetExecutionPlan().empty());
+void TActiveTransaction::BuildExecutionPlan(bool loaded)
+{
+ Y_VERIFY(GetExecutionPlan().empty());
Y_VERIFY(!IsKqpScanTransaction());
-
- TVector<EExecutionUnitKind> plan;
- if (IsDataTx()) {
- if (IsImmediate()) {
- Y_VERIFY(!loaded);
- plan.push_back(EExecutionUnitKind::CheckDataTx);
- plan.push_back(EExecutionUnitKind::BuildAndWaitDependencies);
- if (IsKqpDataTransaction()) {
- plan.push_back(EExecutionUnitKind::ExecuteKqpDataTx);
- } else {
- plan.push_back(EExecutionUnitKind::ExecuteDataTx);
- }
- plan.push_back(EExecutionUnitKind::FinishPropose);
- plan.push_back(EExecutionUnitKind::CompletedOperations);
- } else {
- if (!loaded) {
- plan.push_back(EExecutionUnitKind::CheckDataTx);
- plan.push_back(EExecutionUnitKind::StoreDataTx);
- plan.push_back(EExecutionUnitKind::FinishPropose);
- }
- if (!GetStep())
- plan.push_back(EExecutionUnitKind::WaitForPlan);
- plan.push_back(EExecutionUnitKind::PlanQueue);
- plan.push_back(EExecutionUnitKind::LoadTxDetails);
+
+ TVector<EExecutionUnitKind> plan;
+ if (IsDataTx()) {
+ if (IsImmediate()) {
+ Y_VERIFY(!loaded);
+ plan.push_back(EExecutionUnitKind::CheckDataTx);
+ plan.push_back(EExecutionUnitKind::BuildAndWaitDependencies);
+ if (IsKqpDataTransaction()) {
+ plan.push_back(EExecutionUnitKind::ExecuteKqpDataTx);
+ } else {
+ plan.push_back(EExecutionUnitKind::ExecuteDataTx);
+ }
+ plan.push_back(EExecutionUnitKind::FinishPropose);
+ plan.push_back(EExecutionUnitKind::CompletedOperations);
+ } else {
+ if (!loaded) {
+ plan.push_back(EExecutionUnitKind::CheckDataTx);
+ plan.push_back(EExecutionUnitKind::StoreDataTx);
+ plan.push_back(EExecutionUnitKind::FinishPropose);
+ }
+ if (!GetStep())
+ plan.push_back(EExecutionUnitKind::WaitForPlan);
+ plan.push_back(EExecutionUnitKind::PlanQueue);
+ plan.push_back(EExecutionUnitKind::LoadTxDetails);
plan.push_back(EExecutionUnitKind::FinalizeDataTxPlan);
- }
- } else if (IsReadTable()) {
+ }
+ } else if (IsReadTable()) {
if (IsImmediate()) {
- plan.push_back(EExecutionUnitKind::CheckDataTx);
+ plan.push_back(EExecutionUnitKind::CheckDataTx);
} else {
if (!loaded) {
plan.push_back(EExecutionUnitKind::CheckDataTx);
@@ -772,17 +772,17 @@ void TActiveTransaction::BuildExecutionPlan(bool loaded)
plan.push_back(EExecutionUnitKind::WaitForPlan);
plan.push_back(EExecutionUnitKind::PlanQueue);
plan.push_back(EExecutionUnitKind::LoadTxDetails);
- }
- plan.push_back(EExecutionUnitKind::BuildAndWaitDependencies);
- plan.push_back(EExecutionUnitKind::MakeScanSnapshot);
- plan.push_back(EExecutionUnitKind::WaitForStreamClearance);
- plan.push_back(EExecutionUnitKind::ReadTableScan);
+ }
+ plan.push_back(EExecutionUnitKind::BuildAndWaitDependencies);
+ plan.push_back(EExecutionUnitKind::MakeScanSnapshot);
+ plan.push_back(EExecutionUnitKind::WaitForStreamClearance);
+ plan.push_back(EExecutionUnitKind::ReadTableScan);
if (IsImmediate()) {
plan.push_back(EExecutionUnitKind::FinishPropose);
} else {
plan.push_back(EExecutionUnitKind::CompleteOperation);
}
- plan.push_back(EExecutionUnitKind::CompletedOperations);
+ plan.push_back(EExecutionUnitKind::CompletedOperations);
} else if (IsSnapshotTx()) {
if (IsImmediate()) {
plan.push_back(EExecutionUnitKind::CheckSnapshotTx);
@@ -848,30 +848,30 @@ void TActiveTransaction::BuildExecutionPlan(bool loaded)
plan.push_back(EExecutionUnitKind::CompleteOperation);
}
plan.push_back(EExecutionUnitKind::CompletedOperations);
- } else if (IsSchemeTx()) {
- if (!loaded) {
- plan.push_back(EExecutionUnitKind::CheckSchemeTx);
- plan.push_back(EExecutionUnitKind::StoreSchemeTx);
- plan.push_back(EExecutionUnitKind::FinishPropose);
- }
- if (!GetStep())
- plan.push_back(EExecutionUnitKind::WaitForPlan);
- plan.push_back(EExecutionUnitKind::PlanQueue);
- plan.push_back(EExecutionUnitKind::LoadTxDetails);
+ } else if (IsSchemeTx()) {
+ if (!loaded) {
+ plan.push_back(EExecutionUnitKind::CheckSchemeTx);
+ plan.push_back(EExecutionUnitKind::StoreSchemeTx);
+ plan.push_back(EExecutionUnitKind::FinishPropose);
+ }
+ if (!GetStep())
+ plan.push_back(EExecutionUnitKind::WaitForPlan);
+ plan.push_back(EExecutionUnitKind::PlanQueue);
+ plan.push_back(EExecutionUnitKind::LoadTxDetails);
plan.push_back(EExecutionUnitKind::ProtectSchemeEchoes);
- plan.push_back(EExecutionUnitKind::BuildAndWaitDependencies);
- plan.push_back(EExecutionUnitKind::MakeSnapshot);
- plan.push_back(EExecutionUnitKind::BuildSchemeTxOutRS);
- plan.push_back(EExecutionUnitKind::StoreAndSendOutRS);
- plan.push_back(EExecutionUnitKind::PrepareSchemeTxInRS);
- plan.push_back(EExecutionUnitKind::LoadAndWaitInRS);
+ plan.push_back(EExecutionUnitKind::BuildAndWaitDependencies);
+ plan.push_back(EExecutionUnitKind::MakeSnapshot);
+ plan.push_back(EExecutionUnitKind::BuildSchemeTxOutRS);
+ plan.push_back(EExecutionUnitKind::StoreAndSendOutRS);
+ plan.push_back(EExecutionUnitKind::PrepareSchemeTxInRS);
+ plan.push_back(EExecutionUnitKind::LoadAndWaitInRS);
plan.push_back(EExecutionUnitKind::Backup);
plan.push_back(EExecutionUnitKind::Restore);
- plan.push_back(EExecutionUnitKind::CreateTable);
- plan.push_back(EExecutionUnitKind::ReceiveSnapshot);
+ plan.push_back(EExecutionUnitKind::CreateTable);
+ plan.push_back(EExecutionUnitKind::ReceiveSnapshot);
plan.push_back(EExecutionUnitKind::AlterMoveShadow);
- plan.push_back(EExecutionUnitKind::AlterTable);
- plan.push_back(EExecutionUnitKind::DropTable);
+ plan.push_back(EExecutionUnitKind::AlterTable);
+ plan.push_back(EExecutionUnitKind::DropTable);
plan.push_back(EExecutionUnitKind::CreatePersistentSnapshot);
plan.push_back(EExecutionUnitKind::DropPersistentSnapshot);
plan.push_back(EExecutionUnitKind::InitiateBuildIndex);
@@ -881,28 +881,28 @@ void TActiveTransaction::BuildExecutionPlan(bool loaded)
plan.push_back(EExecutionUnitKind::CreateCdcStream);
plan.push_back(EExecutionUnitKind::AlterCdcStream);
plan.push_back(EExecutionUnitKind::DropCdcStream);
- plan.push_back(EExecutionUnitKind::CompleteOperation);
- plan.push_back(EExecutionUnitKind::CompletedOperations);
- } else {
- Y_FAIL_S("unknown operation kind " << GetKind());
- }
-
- RewriteExecutionPlan(plan);
-}
-
-void TActiveTransaction::FillState(NKikimrTxDataShard::TEvGetOperationResponse &resp) const
-{
- if (IsReadTable()) {
- auto &state = *resp.MutableReadTableState();
- if (DataTx)
- state.SetTableId(DataTx->GetReadTableTransaction().GetTableId().GetTableId());
- state.SetSnapshotId(ScanSnapshotId);
- state.SetScanTaskId(ScanTask);
- state.SetSinkActor(ToString(StreamSink));
- state.SetScanActor(ToString(ScanActor));
- }
-}
-
+ plan.push_back(EExecutionUnitKind::CompleteOperation);
+ plan.push_back(EExecutionUnitKind::CompletedOperations);
+ } else {
+ Y_FAIL_S("unknown operation kind " << GetKind());
+ }
+
+ RewriteExecutionPlan(plan);
+}
+
+void TActiveTransaction::FillState(NKikimrTxDataShard::TEvGetOperationResponse &resp) const
+{
+ if (IsReadTable()) {
+ auto &state = *resp.MutableReadTableState();
+ if (DataTx)
+ state.SetTableId(DataTx->GetReadTableTransaction().GetTableId().GetTableId());
+ state.SetSnapshotId(ScanSnapshotId);
+ state.SetScanTaskId(ScanTask);
+ state.SetSinkActor(ToString(StreamSink));
+ state.SetScanActor(ToString(ScanActor));
+ }
+}
+
void TActiveTransaction::KillAsyncJobActor(const TActorContext& ctx) {
if (!GetAsyncJobActor()) {
return;
diff --git a/ydb/core/tx/datashard/datashard_active_transaction.h b/ydb/core/tx/datashard/datashard_active_transaction.h
index 9591df8f043..43abd525e15 100644
--- a/ydb/core/tx/datashard/datashard_active_transaction.h
+++ b/ydb/core/tx/datashard/datashard_active_transaction.h
@@ -1,9 +1,9 @@
#pragma once
#include "datashard.h"
-#include "datashard_locks.h"
+#include "datashard_locks.h"
#include "datashard__engine_host.h"
-#include "operation.h"
+#include "operation.h"
#include <ydb/core/tx/tx_processing.h>
#include <ydb/core/tablet_flat/flat_cxx_database.h>
@@ -20,7 +20,7 @@ static constexpr char MemoryLabelValidatedDataTx[] = "Datashard/TValidatedDataTx
static constexpr char MemoryLabelActiveTransactionBody[] = "Datashard/TActiveTransaction/TxBody";
using NTabletFlatExecutor::TTransactionContext;
-using NTabletFlatExecutor::TTableSnapshotContext;
+using NTabletFlatExecutor::TTableSnapshotContext;
class TDataShard;
class TSysLocks;
@@ -35,12 +35,12 @@ struct TScanState {
};
struct TSchemaOperation {
- enum EType : ui32 {
- ETypeDrop = 0,
- ETypeCreate = 1,
- ETypeAlter = 2,
- ETypeBackup = 3,
- ETypeCopy = 4,
+ enum EType : ui32 {
+ ETypeDrop = 0,
+ ETypeCreate = 1,
+ ETypeAlter = 2,
+ ETypeBackup = 3,
+ ETypeCopy = 4,
EType_DEPRECATED_05 = 5,
ETypeCreatePersistentSnapshot = 6,
ETypeDropPersistentSnapshot = 7,
@@ -52,51 +52,51 @@ struct TSchemaOperation {
ETypeCreateCdcStream = 13,
ETypeAlterCdcStream = 14,
ETypeDropCdcStream = 15,
-
- ETypeUnknown = Max<ui32>()
- };
-
- ui64 TxId;
- EType Type;
+
+ ETypeUnknown = Max<ui32>()
+ };
+
+ ui64 TxId;
+ EType Type;
TActorId Source;
- ui64 TabletId;
- ui64 MinStep;
- ui64 MaxStep;
- ui64 PlanStep;
- bool ReadOnly;
- bool Done;
-
+ ui64 TabletId;
+ ui64 MinStep;
+ ui64 MaxStep;
+ ui64 PlanStep;
+ bool ReadOnly;
+ bool Done;
+
bool Success;
TString Error;
ui64 BytesProcessed;
ui64 RowsProcessed;
-
+
TScanState ScanState;
TSchemaOperation(ui64 txId, EType type, TActorId source, ui64 tabletId,
ui64 minStep, ui64 maxStep, ui64 planStep, bool readOnly,
bool success, const TString& error, ui64 bytes, ui64 rows)
- : TxId(txId)
- , Type(type)
- , Source(source)
- , TabletId(tabletId)
- , MinStep(minStep)
- , MaxStep(maxStep)
- , PlanStep(planStep)
- , ReadOnly(readOnly)
- , Done(false)
+ : TxId(txId)
+ , Type(type)
+ , Source(source)
+ , TabletId(tabletId)
+ , MinStep(minStep)
+ , MaxStep(maxStep)
+ , PlanStep(planStep)
+ , ReadOnly(readOnly)
+ , Done(false)
, Success(success)
, Error(error)
, BytesProcessed(bytes)
, RowsProcessed(rows)
- {}
-
- bool IsDrop() const { return Type == ETypeDrop; }
- bool IsCreate() const { return Type == ETypeCreate; }
- bool IsAlter() const { return Type == ETypeAlter; }
- bool IsBackup() const { return Type == ETypeBackup; }
+ {}
+
+ bool IsDrop() const { return Type == ETypeDrop; }
+ bool IsCreate() const { return Type == ETypeCreate; }
+ bool IsAlter() const { return Type == ETypeAlter; }
+ bool IsBackup() const { return Type == ETypeBackup; }
bool IsRestore() const { return Type == ETypeRestore; }
- bool IsCopy() const { return Type == ETypeCopy; }
+ bool IsCopy() const { return Type == ETypeCopy; }
bool IsCreatePersistentSnapshot() const { return Type == ETypeCreatePersistentSnapshot; }
bool IsDropPersistentSnapshot() const { return Type == ETypeDropPersistentSnapshot; }
bool IsInitiateBuildIndex() const { return Type == ETypeInitiateBuildIndex; }
@@ -106,21 +106,21 @@ struct TSchemaOperation {
bool IsCreateCdcStream() const { return Type == ETypeCreateCdcStream; }
bool IsAlterCdcStream() const { return Type == ETypeAlterCdcStream; }
bool IsDropCdcStream() const { return Type == ETypeDropCdcStream; }
-
- bool IsReadOnly() const { return ReadOnly; }
-};
-
+
+ bool IsReadOnly() const { return ReadOnly; }
+};
+
/// @note This class incapsulates Engine stuff for minor needs. Do not return TEngine out of it.
class TValidatedDataTx : TNonCopyable {
public:
using TPtr = std::shared_ptr<TValidatedDataTx>;
TValidatedDataTx(TDataShard *self,
- TTransactionContext &txc,
- const TActorContext &ctx,
- const TStepOrder &stepTxId,
- TInstant receivedAt,
- const TString &txBody);
+ TTransactionContext &txc,
+ const TActorContext &ctx,
+ const TStepOrder &stepTxId,
+ TInstant receivedAt,
+ const TString &txBody);
~TValidatedDataTx();
@@ -165,7 +165,7 @@ public:
return 0;
}
- NMiniKQL::IEngineFlat *GetEngine() { return EngineBay.GetEngine(); }
+ NMiniKQL::IEngineFlat *GetEngine() { return EngineBay.GetEngine(); }
void DestroyEngine() { EngineBay.DestroyEngine(); }
const NMiniKQL::TEngineHostCounters& GetCounters() { return EngineBay.GetCounters(); }
void ResetCounters() { EngineBay.ResetCounters(); }
@@ -183,8 +183,8 @@ public:
void SetStep(ui64 step) { StepTxId_.Step = step; }
bool IsProposed() const { return Source_ != TActorId(); }
- bool IsTableRead() const { return Tx.HasReadTableTransaction(); }
-
+ bool IsTableRead() const { return Tx.HasReadTableTransaction(); }
+
bool IsKqpTx() const { return Tx.HasKqpTransaction(); }
bool IsKqpDataTx() const {
@@ -195,37 +195,37 @@ public:
return IsKqpTx() && Tx.GetKqpTransaction().GetType() == NKikimrTxDataShard::KQP_TX_TYPE_SCAN;
}
- const NKikimrTxDataShard::TKqpTransaction &GetKqpTransaction() const { return Tx.GetKqpTransaction(); }
+ const NKikimrTxDataShard::TKqpTransaction &GetKqpTransaction() const { return Tx.GetKqpTransaction(); }
const google::protobuf::RepeatedPtrField<NYql::NDqProto::TDqTask>& GetKqpTasks() const;
NKqp::TKqpTasksRunner& GetKqpTasksRunner() { Y_VERIFY(IsKqpDataTx()); return EngineBay.GetKqpTasksRunner(Tx.GetKqpTransaction()); }
NMiniKQL::TKqpDatashardComputeContext& GetKqpComputeCtx() { Y_VERIFY(IsKqpDataTx()); return EngineBay.GetKqpComputeCtx(); }
- bool HasStreamResponse() const { return Tx.GetStreamResponse(); }
+ bool HasStreamResponse() const { return Tx.GetStreamResponse(); }
TActorId GetSink() const { return ActorIdFromProto(Tx.GetSink()); }
- const NKikimrTxDataShard::TReadTableTransaction &GetReadTableTransaction() const { return Tx.GetReadTableTransaction(); }
-
+ const NKikimrTxDataShard::TReadTableTransaction &GetReadTableTransaction() const { return Tx.GetReadTableTransaction(); }
+
ui32 ExtractKeys(bool allowErrors);
bool ReValidateKeys();
ETxOrder CheckOrder(const TSysLocks& sysLocks, const TValidatedDataTx& dataTx) const;
- ui64 GetTxSize() const { return TxSize; }
+ ui64 GetTxSize() const { return TxSize; }
ui32 KeysCount() const { return TxInfo().ReadsCount + TxInfo().WritesCount; }
-
- void SetTxCacheUsage(ui64 val) { TxCacheUsage = val; }
- ui64 GetTxCacheUsage() const { return TxCacheUsage; }
-
- void ReleaseTxData();
- bool IsTxDataReleased() const { return IsReleased; }
-
+
+ void SetTxCacheUsage(ui64 val) { TxCacheUsage = val; }
+ ui64 GetTxCacheUsage() const { return TxCacheUsage; }
+
+ void ReleaseTxData();
+ bool IsTxDataReleased() const { return IsReleased; }
+
bool IsTxInfoLoaded() const { return TxInfo().Loaded; }
-
+
bool IsTxReadOnly() const { return IsReadOnly; }
bool HasOutReadsets() const { return TxInfo().HasOutReadsets; }
bool HasInReadsets() const { return TxInfo().HasInReadsets; }
- const NMiniKQL::IEngineFlat::TValidationInfo& TxInfo() const { return EngineBay.TxInfo(); }
-
+ const NMiniKQL::IEngineFlat::TValidationInfo& TxInfo() const { return EngineBay.TxInfo(); }
+
private:
TStepOrder StepTxId_;
ui64 TabletId_;
@@ -235,9 +235,9 @@ private:
NKikimrTxDataShard::TDataTransaction Tx;
NKikimrTxDataShard::TError::EKind ErrCode;
TString ErrStr;
- ui64 TxSize;
- ui64 TxCacheUsage;
- bool IsReleased;
+ ui64 TxSize;
+ ui64 TxCacheUsage;
+ bool IsReleased;
TMaybe<ui64> PerShardKeysSizeLimitBytes_;
bool IsReadOnly;
bool AllowCancelROwithReadsets;
@@ -245,7 +245,7 @@ private:
const TInstant ReceivedAt_; // For local timeout tracking
TInstant Deadline_;
- void ComputeTxSize();
+ void ComputeTxSize();
void ComputeDeadline();
};
@@ -302,52 +302,52 @@ private:
};
///
-class TActiveTransaction : public TOperation {
-public:
- enum EArtifactFlags {
- OUT_RS_STORED = (1 << 0),
- LOCKS_STORED = (1 << 1),
- };
-
- using TPtr = TIntrusivePtr<TActiveTransaction>;
-
- explicit TActiveTransaction(const TBasicOpInfo &op)
- : TOperation(op)
- , ArtifactFlags(0)
- , TxCacheUsage(0)
- , ReleasedTxDataSize(0)
- , SchemeShardId(0)
+class TActiveTransaction : public TOperation {
+public:
+ enum EArtifactFlags {
+ OUT_RS_STORED = (1 << 0),
+ LOCKS_STORED = (1 << 1),
+ };
+
+ using TPtr = TIntrusivePtr<TActiveTransaction>;
+
+ explicit TActiveTransaction(const TBasicOpInfo &op)
+ : TOperation(op)
+ , ArtifactFlags(0)
+ , TxCacheUsage(0)
+ , ReleasedTxDataSize(0)
+ , SchemeShardId(0)
, SubDomainPathId(0)
, SchemeTxType(TSchemaOperation::ETypeUnknown)
- , ScanSnapshotId(0)
- , ScanTask(0)
+ , ScanSnapshotId(0)
+ , ScanTask(0)
{
TrackMemory();
}
- TActiveTransaction(const TBasicOpInfo &op,
- TValidatedDataTx::TPtr savedTx);
+ TActiveTransaction(const TBasicOpInfo &op,
+ TValidatedDataTx::TPtr savedTx);
TActiveTransaction(TDataShard *self,
- TTransactionContext &txc,
- const TActorContext &ctx,
- const TBasicOpInfo &op,
+ TTransactionContext &txc,
+ const TActorContext &ctx,
+ const TBasicOpInfo &op,
const TActorId &target,
- const TString &txBody,
- const TVector<TSysTables::TLocksTable::TLock> &locks,
- ui64 artifactFlags);
+ const TString &txBody,
+ const TVector<TSysTables::TLocksTable::TLock> &locks,
+ ui64 artifactFlags);
~TActiveTransaction();
- void FillTxData(TValidatedDataTx::TPtr dataTx);
+ void FillTxData(TValidatedDataTx::TPtr dataTx);
void FillTxData(TDataShard *self,
- TTransactionContext &txc,
- const TActorContext &ctx,
+ TTransactionContext &txc,
+ const TActorContext &ctx,
const TActorId &target,
- const TString &txBody,
- const TVector<TSysTables::TLocksTable::TLock> &locks,
- ui64 artifactFlags);
-
- const TString &GetTxBody() const { return TxBody; }
+ const TString &txBody,
+ const TVector<TSysTables::TLocksTable::TLock> &locks,
+ ui64 artifactFlags);
+
+ const TString &GetTxBody() const { return TxBody; }
void SetTxBody(const TString &txBody) {
UntrackMemory();
TxBody = txBody;
@@ -358,43 +358,43 @@ public:
TxBody.clear();
TrackMemory();
}
-
- ui64 GetSchemeShardId() const { return SchemeShardId; }
- void SetSchemeShardId(ui64 id) { SchemeShardId = id; }
+
+ ui64 GetSchemeShardId() const { return SchemeShardId; }
+ void SetSchemeShardId(ui64 id) { SchemeShardId = id; }
ui64 GetSubDomainPathId() const { return SubDomainPathId; }
void SetSubDomainPathId(ui64 pathId) { SubDomainPathId = pathId; }
-
- const NKikimrSubDomains::TProcessingParams &GetProcessingParams() const
- {
- return ProcessingParams;
- }
- void SetProcessingParams(const NKikimrSubDomains::TProcessingParams &params)
- {
- ProcessingParams.CopyFrom(params);
- }
-
- void Deactivate() override {
- ClearSchemeTx();
- ClearTxBody();
-
- TOperation::Deactivate();
+
+ const NKikimrSubDomains::TProcessingParams &GetProcessingParams() const
+ {
+ return ProcessingParams;
+ }
+ void SetProcessingParams(const NKikimrSubDomains::TProcessingParams &params)
+ {
+ ProcessingParams.CopyFrom(params);
+ }
+
+ void Deactivate() override {
+ ClearSchemeTx();
+ ClearTxBody();
+
+ TOperation::Deactivate();
}
const TValidatedDataTx::TPtr& GetDataTx() const { return DataTx; }
TValidatedDataTx::TPtr BuildDataTx(TDataShard *self,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void ClearDataTx() { DataTx = nullptr; }
-
- const NKikimrTxDataShard::TFlatSchemeTransaction &GetSchemeTx() const
- {
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void ClearDataTx() { DataTx = nullptr; }
+
+ const NKikimrTxDataShard::TFlatSchemeTransaction &GetSchemeTx() const
+ {
Y_VERIFY_S(SchemeTx, "No ptr");
- return *SchemeTx;
- }
- bool BuildSchemeTx();
- void ClearSchemeTx() { SchemeTx = nullptr; }
+ return *SchemeTx;
+ }
+ bool BuildSchemeTx();
+ void ClearSchemeTx() { SchemeTx = nullptr; }
TSchemaOperation::EType GetSchemeTxType() const { return SchemeTxType; }
-
+
const NKikimrTxDataShard::TSnapshotTransaction& GetSnapshotTx() const {
Y_VERIFY_DEBUG(SnapshotTx);
return *SnapshotTx;
@@ -430,45 +430,45 @@ public:
return true;
}
- void MarkAsUsingSnapshot() {
- SetUsingSnapshotFlag();
- }
-
- void SetTxCacheUsage(ui64 val) { TxCacheUsage = val; }
- ui64 GetTxCacheUsage() const { return TxCacheUsage; }
-
- ui64 GetReleasedTxDataSize() const { return ReleasedTxDataSize; }
+ void MarkAsUsingSnapshot() {
+ SetUsingSnapshotFlag();
+ }
+
+ void SetTxCacheUsage(ui64 val) { TxCacheUsage = val; }
+ ui64 GetTxCacheUsage() const { return TxCacheUsage; }
+
+ ui64 GetReleasedTxDataSize() const { return ReleasedTxDataSize; }
bool IsTxDataReleased() const { return ReleasedTxDataSize > 0; }
-
- void MarkOutRSStored()
- {
- ArtifactFlags |= OUT_RS_STORED;
- }
-
- bool IsOutRSStored()
- {
- return ArtifactFlags & OUT_RS_STORED;
- }
-
- void MarkLocksStored()
- {
- ArtifactFlags |= LOCKS_STORED;
- }
-
- bool IsLocksStored()
- {
- return ArtifactFlags & LOCKS_STORED;
- }
-
+
+ void MarkOutRSStored()
+ {
+ ArtifactFlags |= OUT_RS_STORED;
+ }
+
+ bool IsOutRSStored()
+ {
+ return ArtifactFlags & OUT_RS_STORED;
+ }
+
+ void MarkLocksStored()
+ {
+ ArtifactFlags |= LOCKS_STORED;
+ }
+
+ bool IsLocksStored()
+ {
+ return ArtifactFlags & LOCKS_STORED;
+ }
+
void DbStoreLocksAccessLog(TDataShard * self,
- TTransactionContext &txc,
- const TActorContext &ctx);
+ TTransactionContext &txc,
+ const TActorContext &ctx);
void DbStoreArtifactFlags(TDataShard * self,
- TTransactionContext &txc,
- const TActorContext &ctx);
-
- ui64 GetMemoryConsumption() const;
-
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+
+ ui64 GetMemoryConsumption() const;
+
ui64 GetRequiredMemory() const {
Y_VERIFY(!GetTxCacheUsage() || !IsTxDataReleased());
ui64 requiredMem = GetTxCacheUsage() + GetReleasedTxDataSize();
@@ -477,58 +477,58 @@ public:
return requiredMem;
}
- void ReleaseTxData(NTabletFlatExecutor::TTxMemoryProviderBase &provider, const TActorContext &ctx);
+ void ReleaseTxData(NTabletFlatExecutor::TTxMemoryProviderBase &provider, const TActorContext &ctx);
ERestoreDataStatus RestoreTxData(TDataShard * self, TTransactionContext &txc, const TActorContext &ctx);
void FinalizeDataTxPlan();
-
- // TOperation iface.
- void BuildExecutionPlan(bool loaded) override;
-
- const NMiniKQL::IEngineFlat::TValidationInfo &GetKeysInfo() const override
- {
- if (DataTx) {
+
+ // TOperation iface.
+ void BuildExecutionPlan(bool loaded) override;
+
+ const NMiniKQL::IEngineFlat::TValidationInfo &GetKeysInfo() const override
+ {
+ if (DataTx) {
Y_VERIFY(DataTx->TxInfo().Loaded);
- return DataTx->TxInfo();
- }
+ return DataTx->TxInfo();
+ }
Y_VERIFY_DEBUG(IsSchemeTx() || IsSnapshotTx() || IsDistributedEraseTx() || IsCommitWritesTx(),
"Unexpected access to invalidated keys: non-scheme tx %" PRIu64, GetTxId());
- // For scheme tx global reader and writer flags should
- // result in all required dependencies.
- return TOperation::GetKeysInfo();
- }
-
- ui64 LockTxId() const override
- {
- if (DataTx)
- return DataTx->LockTxId();
- return 0;
- }
-
- bool HasLockedWrites() const override
- {
- if (DataTx)
- return DataTx->HasLockedWrites();
- return false;
- }
-
- void FillState(NKikimrTxDataShard::TEvGetOperationResponse &resp) const;
-
- void SetScanSnapshotId(ui64 id) { ScanSnapshotId = id; }
- ui64 GetScanSnapshotId() const { return ScanSnapshotId; }
-
- void SetScanTask(ui64 id) { ScanTask = id; }
- ui64 GetScanTask() const { return ScanTask; }
-
+ // For scheme tx global reader and writer flags should
+ // result in all required dependencies.
+ return TOperation::GetKeysInfo();
+ }
+
+ ui64 LockTxId() const override
+ {
+ if (DataTx)
+ return DataTx->LockTxId();
+ return 0;
+ }
+
+ bool HasLockedWrites() const override
+ {
+ if (DataTx)
+ return DataTx->HasLockedWrites();
+ return false;
+ }
+
+ void FillState(NKikimrTxDataShard::TEvGetOperationResponse &resp) const;
+
+ void SetScanSnapshotId(ui64 id) { ScanSnapshotId = id; }
+ ui64 GetScanSnapshotId() const { return ScanSnapshotId; }
+
+ void SetScanTask(ui64 id) { ScanTask = id; }
+ ui64 GetScanTask() const { return ScanTask; }
+
void SetAsyncJobActor(TActorId aid) { AsyncJobActor = aid; }
TActorId GetAsyncJobActor() const { return AsyncJobActor; }
void KillAsyncJobActor(const TActorContext& ctx);
void SetStreamSink(TActorId sink) { StreamSink = sink; }
TActorId GetStreamSink() const { return StreamSink; }
-
+
void SetScanActor(TActorId aid) { ScanActor = aid; }
TActorId GetScanActor() const { return ScanActor; }
-
+
ui64 IncrementPageFaultCount() {
return ++PageFaultCount;
}
@@ -539,22 +539,22 @@ private:
private:
TValidatedDataTx::TPtr DataTx;
- THolder<NKikimrTxDataShard::TFlatSchemeTransaction> SchemeTx;
+ THolder<NKikimrTxDataShard::TFlatSchemeTransaction> SchemeTx;
THolder<NKikimrTxDataShard::TSnapshotTransaction> SnapshotTx;
TDistributedEraseTx::TPtr DistributedEraseTx;
TCommitWritesTx::TPtr CommitWritesTx;
- TString TxBody;
+ TString TxBody;
- // TODO: move to persistent part of operation's flags
- ui64 ArtifactFlags;
- ui64 TxCacheUsage;
- ui64 ReleasedTxDataSize;
- ui64 SchemeShardId;
+ // TODO: move to persistent part of operation's flags
+ ui64 ArtifactFlags;
+ ui64 TxCacheUsage;
+ ui64 ReleasedTxDataSize;
+ ui64 SchemeShardId;
ui64 SubDomainPathId;
- NKikimrSubDomains::TProcessingParams ProcessingParams;
+ NKikimrSubDomains::TProcessingParams ProcessingParams;
TSchemaOperation::EType SchemeTxType;
- ui64 ScanSnapshotId;
- ui64 ScanTask;
+ ui64 ScanSnapshotId;
+ ui64 ScanTask;
TActorId AsyncJobActor;
TActorId StreamSink;
TActorId ScanActor;
@@ -562,7 +562,7 @@ private:
};
inline IOutputStream& operator << (IOutputStream& out, const TActiveTransaction& tx) {
- out << '[' << tx.GetStep() << ':' << tx.GetTxId() << ']';
+ out << '[' << tx.GetStep() << ':' << tx.GetTxId() << ']';
return out;
}
diff --git a/ydb/core/tx/datashard/datashard_impl.h b/ydb/core/tx/datashard/datashard_impl.h
index 43c29577875..11313474f80 100644
--- a/ydb/core/tx/datashard/datashard_impl.h
+++ b/ydb/core/tx/datashard/datashard_impl.h
@@ -44,7 +44,7 @@
#include <ydb/public/api/protos/ydb_status_codes.pb.h>
#include <library/cpp/actors/interconnect/interconnect.h>
-
+
#include <util/string/join.h>
namespace NKikimr {
@@ -52,9 +52,9 @@ namespace NDataShard {
extern TStringBuf SnapshotTransferReadSetMagic;
-using NTabletFlatExecutor::ITransaction;
+using NTabletFlatExecutor::ITransaction;
using NTabletFlatExecutor::TScanOptions;
-
+
// For CopyTable and MoveShadow
class TTxTableSnapshotContext : public NTabletFlatExecutor::TTableSnapshotContext {
public:
@@ -164,25 +164,25 @@ class TDataShard
class TTxSplitTransferSnapshot;
class TTxSplitTransferSnapshotAck;
class TTxSplitPartitioningChanged;
- class TTxStoreTablePath;
+ class TTxStoreTablePath;
class TTxGoOffline;
class TTxGetTableStats;
class TTxMonitoring;
class TTxMonitoringCleanupBorrowedParts;
class TTxMonitoringCleanupBorrowedPartsActor;
class TTxMonitoringResetSchemaVersion;
- class TTxUndelivered;
+ class TTxUndelivered;
class TTxS3Listing;
- class TTxInterruptTransaction;
+ class TTxInterruptTransaction;
class TTxInitiateStatsUpdate;
- class TTxCheckInReadSets;
- class TTxRemoveOldInReadSets;
+ class TTxCheckInReadSets;
+ class TTxRemoveOldInReadSets;
class TTxRead;
class TTxReadContinue;
class TTxReadColumns;
- class TTxGetInfo;
- class TTxListOperations;
- class TTxGetOperation;
+ class TTxGetInfo;
+ class TTxListOperations;
+ class TTxGetOperation;
class TTxStoreScanState;
class TTxRefreshVolatileSnapshot;
class TTxDiscardVolatileSnapshot;
@@ -205,14 +205,14 @@ class TDataShard
class TTxEraseRows;
ITransaction *CreateTxMonitoring(TDataShard *self,
- NMon::TEvRemoteHttpInfo::TPtr ev);
+ NMon::TEvRemoteHttpInfo::TPtr ev);
ITransaction *CreateTxGetInfo(TDataShard *self,
- TEvDataShard::TEvGetInfoRequest::TPtr ev);
+ TEvDataShard::TEvGetInfoRequest::TPtr ev);
ITransaction *CreateTxListOperations(TDataShard *self,
- TEvDataShard::TEvListOperationsRequest::TPtr ev);
+ TEvDataShard::TEvListOperationsRequest::TPtr ev);
ITransaction *CreateTxGetOperation(TDataShard *self,
- TEvDataShard::TEvGetOperationRequest::TPtr ev);
-
+ TEvDataShard::TEvGetOperationRequest::TPtr ev);
+
ITransaction *CreateTxMonitoringCleanupBorrowedParts(
TDataShard *self,
NMon::TEvRemoteHttpInfo::TPtr ev);
@@ -224,7 +224,7 @@ class TDataShard
friend class TDataShardMiniKQLFactory;
friend class TDataTransactionProcessor;
friend class TSchemeTransactionProcessor;
- friend class TScanTransactionProcessor;
+ friend class TScanTransactionProcessor;
friend class TDataShardEngineHost;
friend class TTxS3Listing;
friend class TExecuteKqpScanTxUnit;
@@ -236,7 +236,7 @@ class TDataShard
friend class TPipeline;
friend class TLocksDataShardAdapter<TDataShard>;
friend class TActiveTransaction;
- friend class TValidatedDataTx;
+ friend class TValidatedDataTx;
friend class TEngineBay;
friend class NMiniKQL::TKqpScanComputeContext;
friend class TSnapshotManager;
@@ -245,8 +245,8 @@ class TDataShard
friend class TReplicationSourceOffsetsServer;
friend class TAsyncTableStatsBuilder;
- friend class TReadTableScan;
- friend class TWaitForStreamClearanceUnit;
+ friend class TReadTableScan;
+ friend class TWaitForStreamClearanceUnit;
friend class TBuildIndexScan;
friend class TReadColumnsScan;
friend class TCondEraseScan;
@@ -286,8 +286,8 @@ class TDataShard
EvPeriodicWakeup,
EvAsyncTableStats,
EvRemoveOldInReadSets, // WARNING: tests use ES_PRIVATE + 9
- EvRegisterScanActor,
- EvNodeDisconnected,
+ EvRegisterScanActor,
+ EvNodeDisconnected,
EvScanStats,
EvPersistScanState,
EvPersistScanStateAck,
@@ -332,26 +332,26 @@ class TDataShard
ui64 MemDataSize = 0;
ui64 SearchHeight = 0;
};
-
- struct TEvRemoveOldInReadSets : public TEventLocal<TEvRemoveOldInReadSets, EvRemoveOldInReadSets> {};
-
- struct TEvRegisterScanActor : public TEventLocal<TEvRegisterScanActor, EvRegisterScanActor> {
- TEvRegisterScanActor(ui64 txId)
- : TxId(txId)
- {
- }
-
- ui64 TxId;
- };
-
- struct TEvNodeDisconnected : public TEventLocal<TEvNodeDisconnected, EvNodeDisconnected> {
- TEvNodeDisconnected(ui32 nodeId)
- : NodeId(nodeId)
- {
- }
-
- ui32 NodeId;
- };
+
+ struct TEvRemoveOldInReadSets : public TEventLocal<TEvRemoveOldInReadSets, EvRemoveOldInReadSets> {};
+
+ struct TEvRegisterScanActor : public TEventLocal<TEvRegisterScanActor, EvRegisterScanActor> {
+ TEvRegisterScanActor(ui64 txId)
+ : TxId(txId)
+ {
+ }
+
+ ui64 TxId;
+ };
+
+ struct TEvNodeDisconnected : public TEventLocal<TEvNodeDisconnected, EvNodeDisconnected> {
+ TEvNodeDisconnected(ui32 nodeId)
+ : NodeId(nodeId)
+ {
+ }
+
+ ui32 NodeId;
+ };
struct TEvScanStats : public TEventLocal<TEvScanStats, EvScanStats> {
TEvScanStats(ui64 rows, ui64 bytes) : Rows(rows), Bytes(bytes) {}
@@ -463,12 +463,12 @@ class TDataShard
struct TxMain : Table<3> {
struct TxId : Column<1, NScheme::NTypeIds::Uint64> {};
- struct Kind : Column<2, NScheme::NTypeIds::Uint32> { using Type = EOperationKind; };
+ struct Kind : Column<2, NScheme::NTypeIds::Uint32> { using Type = EOperationKind; };
struct Flags : Column<3, NScheme::NTypeIds::Uint32> {};
struct State : Column<4, NScheme::NTypeIds::Uint32> {};
struct InRSRemain : Column<5, NScheme::NTypeIds::Uint64> {};
struct MaxStep : Column<6, NScheme::NTypeIds::Uint64> {};
- struct ReceivedAt : Column<7, NScheme::NTypeIds::Uint64> {};
+ struct ReceivedAt : Column<7, NScheme::NTypeIds::Uint64> {};
struct Flags64 : Column<8, NScheme::NTypeIds::Uint64> {};
struct Source : Column<9, NScheme::NTypeIds::ActorId> {};
struct Cookie : Column<10, NScheme::NTypeIds::Uint64> {};
@@ -538,7 +538,7 @@ class TDataShard
struct MinStep : Column<5, NScheme::NTypeIds::Uint64> {};
struct MaxStep : Column<6, NScheme::NTypeIds::Uint64> {};
struct PlanStep : Column<7, NScheme::NTypeIds::Uint64> {};
- struct ReadOnly : Column<8, NScheme::NTypeIds::Bool> {};
+ struct ReadOnly : Column<8, NScheme::NTypeIds::Bool> {};
struct Success : Column<9, NScheme::NTypeIds::Bool> {};
struct Error : Column<10, NScheme::NTypeIds::String> { using Type = TString; };
@@ -546,7 +546,7 @@ class TDataShard
struct Rows : Column<12, NScheme::NTypeIds::Uint64> {};
using TKey = TableKey<TxId>;
- using TColumns = TableColumns<TxId, Operation, Source, SourceTablet,
+ using TColumns = TableColumns<TxId, Operation, Source, SourceTablet,
MinStep, MaxStep, PlanStep, ReadOnly, Success, Error, DataSize, Rows>;
};
@@ -568,17 +568,17 @@ class TDataShard
};
// Additional tx artifacts which can be reused on tx restart.
- struct TxArtifacts : Table<12> {
- struct TxId : Column<1, NScheme::NTypeIds::Uint64> {};
- // Specify which tx artifacts have been stored to local DB and can be
- // reused on tx replay. See TActiveTransaction::EArtifactFlags.
- struct Flags : Column<2, NScheme::NTypeIds::Uint64> {};
- struct Locks : Column<3, NScheme::NTypeIds::String> { using Type = TVector<TSysTables::TLocksTable::TLock>; };
-
- using TKey = TableKey<TxId>;
- using TColumns = TableColumns<TxId, Flags, Locks>;
- };
-
+ struct TxArtifacts : Table<12> {
+ struct TxId : Column<1, NScheme::NTypeIds::Uint64> {};
+ // Specify which tx artifacts have been stored to local DB and can be
+ // reused on tx replay. See TActiveTransaction::EArtifactFlags.
+ struct Flags : Column<2, NScheme::NTypeIds::Uint64> {};
+ struct Locks : Column<3, NScheme::NTypeIds::String> { using Type = TVector<TSysTables::TLocksTable::TLock>; };
+
+ using TKey = TableKey<TxId>;
+ using TColumns = TableColumns<TxId, Flags, Locks>;
+ };
+
struct ScanProgress : Table<13> {
struct TxId : Column<1, NScheme::NTypeIds::Uint64> {};
struct LastKey : Column<2, NScheme::NTypeIds::String> {};
@@ -863,22 +863,22 @@ class TDataShard
return true;
}
- template <typename TEvHandle>
- void ForwardEventToOperation(TAutoPtr<TEvHandle> ev, const TActorContext &ctx) {
- TOperation::TPtr op = Pipeline.FindOp(ev->Get()->Record.GetTxId());
- if (op)
- ForwardEventToOperation(ev, op, ctx);
- }
-
- template <typename TEvHandle>
- void ForwardEventToOperation(TAutoPtr<TEvHandle> ev,
- TOperation::TPtr op,
- const TActorContext &ctx) {
- op->AddInputEvent(ev.Release());
- Pipeline.AddCandidateOp(op);
- PlanQueue.Progress(ctx);
- }
-
+ template <typename TEvHandle>
+ void ForwardEventToOperation(TAutoPtr<TEvHandle> ev, const TActorContext &ctx) {
+ TOperation::TPtr op = Pipeline.FindOp(ev->Get()->Record.GetTxId());
+ if (op)
+ ForwardEventToOperation(ev, op, ctx);
+ }
+
+ template <typename TEvHandle>
+ void ForwardEventToOperation(TAutoPtr<TEvHandle> ev,
+ TOperation::TPtr op,
+ const TActorContext &ctx) {
+ op->AddInputEvent(ev.Release());
+ Pipeline.AddCandidateOp(op);
+ PlanQueue.Progress(ctx);
+ }
+
void Handle(TEvents::TEvGone::TPtr &ev);
void Handle(TEvents::TEvPoisonPill::TPtr &ev, const TActorContext &ctx);
void Handle(TEvDataShard::TEvGetShardState::TPtr &ev, const TActorContext &ctx);
@@ -895,8 +895,8 @@ class TDataShard
void Handle(TEvPrivate::TEvCleanupTransaction::TPtr &ev, const TActorContext &ctx);
void Handle(TEvPrivate::TEvDelayedProposeTransaction::TPtr &ev, const TActorContext &ctx);
void Handle(TEvPrivate::TEvProgressResendReadSet::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvRemoveOldInReadSets::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvPrivate::TEvRegisterScanActor::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvRemoveOldInReadSets::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvPrivate::TEvRegisterScanActor::TPtr &ev, const TActorContext &ctx);
void Handle(TEvPrivate::TEvScanStats::TPtr &ev, const TActorContext &ctx);
void Handle(TEvPrivate::TEvPersistScanState::TPtr &ev, const TActorContext &ctx);
void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx);
@@ -927,15 +927,15 @@ class TDataShard
void Handle(TEvDataShard::TEvReadAck::TPtr& ev, const TActorContext& ctx);
void Handle(TEvDataShard::TEvReadCancel::TPtr& ev, const TActorContext& ctx);
void Handle(TEvDataShard::TEvReadColumnsRequest::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvDataShard::TEvGetInfoRequest::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvDataShard::TEvListOperationsRequest::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvDataShard::TEvGetDataHistogramRequest::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvDataShard::TEvGetOperationRequest::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvDataShard::TEvGetReadTableSinkStateRequest::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvDataShard::TEvGetReadTableScanStateRequest::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvDataShard::TEvGetRSInfoRequest::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvDataShard::TEvGetSlowOpProfilesRequest::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvDataShard::TEvGetInfoRequest::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvDataShard::TEvListOperationsRequest::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvDataShard::TEvGetDataHistogramRequest::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvDataShard::TEvGetOperationRequest::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvDataShard::TEvGetReadTableSinkStateRequest::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvDataShard::TEvGetReadTableScanStateRequest::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvDataShard::TEvGetRSInfoRequest::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvDataShard::TEvGetSlowOpProfilesRequest::TPtr& ev, const TActorContext& ctx);
void Handle(TEvDataShard::TEvRefreshVolatileSnapshotRequest::TPtr& ev, const TActorContext& ctx);
void Handle(TEvDataShard::TEvDiscardVolatileSnapshotRequest::TPtr& ev, const TActorContext& ctx);
void Handle(TEvDataShard::TEvMigrateSchemeShardRequest::TPtr& ev, const TActorContext& ctx);
@@ -951,20 +951,20 @@ class TDataShard
void Handle(TEvDataShard::TEvCancelBackup::TPtr &ev, const TActorContext &ctx);
void Handle(TEvDataShard::TEvCancelRestore::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTxProcessing::TEvStreamClearanceResponse::TPtr &ev, const TActorContext &ctx) {
- ForwardEventToOperation(ev, ctx);
- }
- void Handle(TEvTxProcessing::TEvStreamClearancePending::TPtr &ev, const TActorContext &ctx) {
- ForwardEventToOperation(ev, ctx);
- }
- void Handle(TEvTxProcessing::TEvInterruptTransaction::TPtr &ev, const TActorContext &ctx) {
- ForwardEventToOperation(ev, ctx);
- }
+ void Handle(TEvTxProcessing::TEvStreamClearanceResponse::TPtr &ev, const TActorContext &ctx) {
+ ForwardEventToOperation(ev, ctx);
+ }
+ void Handle(TEvTxProcessing::TEvStreamClearancePending::TPtr &ev, const TActorContext &ctx) {
+ ForwardEventToOperation(ev, ctx);
+ }
+ void Handle(TEvTxProcessing::TEvInterruptTransaction::TPtr &ev, const TActorContext &ctx) {
+ ForwardEventToOperation(ev, ctx);
+ }
void Handle(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult::TPtr ev, const TActorContext &ctx);
-
- void Handle(TEvents::TEvUndelivered::TPtr& ev, const TActorContext& ctx);
- void Handle(TEvInterconnect::TEvNodeDisconnected::TPtr& ev, const TActorContext& ctx);
-
+
+ void Handle(TEvents::TEvUndelivered::TPtr& ev, const TActorContext& ctx);
+ void Handle(TEvInterconnect::TEvNodeDisconnected::TPtr& ev, const TActorContext& ctx);
+
void Handle(TEvPrivate::TEvSubDomainPathIdFound::TPtr& ev, const TActorContext& ctx);
void Handle(TEvTxProxySchemeCache::TEvWatchNotifyUpdated::TPtr& ev, const TActorContext& ctx);
@@ -995,18 +995,18 @@ class TDataShard
void HandleByReplicationSourceOffsetsServer(STATEFN_SIG);
void DoPeriodicTasks(const TActorContext &ctx);
-
- TDuration GetDataTxCompleteLag()
- {
- ui64 mediatorTime = MediatorTimeCastEntry ? MediatorTimeCastEntry->Get(TabletID()) : 0;
- return TDuration::MilliSeconds(Pipeline.GetDataTxCompleteLag(mediatorTime));
- }
- TDuration GetScanTxCompleteLag()
- {
- ui64 mediatorTime = MediatorTimeCastEntry ? MediatorTimeCastEntry->Get(TabletID()) : 0;
- return TDuration::MilliSeconds(Pipeline.GetScanTxCompleteLag(mediatorTime));
- }
-
+
+ TDuration GetDataTxCompleteLag()
+ {
+ ui64 mediatorTime = MediatorTimeCastEntry ? MediatorTimeCastEntry->Get(TabletID()) : 0;
+ return TDuration::MilliSeconds(Pipeline.GetDataTxCompleteLag(mediatorTime));
+ }
+ TDuration GetScanTxCompleteLag()
+ {
+ ui64 mediatorTime = MediatorTimeCastEntry ? MediatorTimeCastEntry->Get(TabletID()) : 0;
+ return TDuration::MilliSeconds(Pipeline.GetScanTxCompleteLag(mediatorTime));
+ }
+
void UpdateLagCounters(const TActorContext &ctx);
static NTabletPipe::TClientConfig GetPipeClientConfig();
@@ -1065,24 +1065,24 @@ public:
TDataShard(const TActorId &tablet, TTabletStorageInfo *info);
- void PrepareAndSaveOutReadSets(ui64 step,
- ui64 txId,
- const TMap<std::pair<ui64, ui64>, TString>& outReadSets,
- TVector<THolder<TEvTxProcessing::TEvReadSet>> &preparedRS,
- TTransactionContext& txc,
- const TActorContext& ctx);
- THolder<TEvTxProcessing::TEvReadSet> PrepareReadSet(ui64 step, ui64 txId, ui64 source, ui64 target,
- const TString& body, ui64 seqno);
+ void PrepareAndSaveOutReadSets(ui64 step,
+ ui64 txId,
+ const TMap<std::pair<ui64, ui64>, TString>& outReadSets,
+ TVector<THolder<TEvTxProcessing::TEvReadSet>> &preparedRS,
+ TTransactionContext& txc,
+ const TActorContext& ctx);
+ THolder<TEvTxProcessing::TEvReadSet> PrepareReadSet(ui64 step, ui64 txId, ui64 source, ui64 target,
+ const TString& body, ui64 seqno);
void SendReadSet(const TActorContext& ctx, ui64 step, ui64 txId, ui64 source, ui64 target, const TString& body, ui64 seqno);
- void SendReadSets(const TActorContext& ctx,
- TVector<THolder<TEvTxProcessing::TEvReadSet>> &&readsets);
+ void SendReadSets(const TActorContext& ctx,
+ TVector<THolder<TEvTxProcessing::TEvReadSet>> &&readsets);
void ResendReadSet(const TActorContext& ctx, ui64 step, ui64 txId, ui64 source, ui64 target, const TString& body, ui64 seqno);
void SendDelayedAcks(const TActorContext& ctx, TVector<THolder<IEventHandle>>& delayedAcks) const;
- void SendResult(const TActorContext &ctx,
- TOutputOpData::TResultPtr &result,
+ void SendResult(const TActorContext &ctx,
+ TOutputOpData::TResultPtr &result,
const TActorId &target,
- ui64 step,
- ui64 txId);
+ ui64 step,
+ ui64 txId);
void FillSplitTrajectory(ui64 origin, NKikimrTx::TBalanceTrackList& tracks);
void SetCounter(NDataShard::ESimpleCounters counter, ui64 num) const {
@@ -1123,13 +1123,13 @@ public:
return State == TShardState::Frozen;
}
-
+
ui32 Generation() const { return Executor()->Generation(); }
bool IsFollower() const { return Executor()->GetStats().IsFollower; }
bool SyncSchemeOnFollower(NTabletFlatExecutor::TTransactionContext &txc, const TActorContext &ctx,
NKikimrTxDataShard::TError::EKind & status, TString& errMessage);
- ui64 GetMaxTxInFly() { return MaxTxInFly; }
+ ui64 GetMaxTxInFly() { return MaxTxInFly; }
static constexpr ui64 DefaultTxStepDeadline() { return 30 * 1000; }
static constexpr ui64 PipeClientCachePoolLimit() { return 100; }
@@ -1155,7 +1155,7 @@ public:
void CheckDelayedProposeQueue(const TActorContext &ctx);
bool CheckDataTxReject(const TString& opDescr,
- const TActorContext &ctx,
+ const TActorContext &ctx,
NKikimrTxDataShard::TEvProposeTransactionResult::EStatus& rejectStatus,
TString &reason);
bool CheckDataTxRejectAndReply(TEvDataShard::TEvProposeTransaction* msg, const TActorContext& ctx);
@@ -1175,7 +1175,7 @@ public:
void AddUserTable(const TPathId& tableId, TUserTable::TPtr tableInfo) {
TableInfos[tableId.LocalPathId] = tableInfo;
- SysLocks.UpdateSchema(tableId, *tableInfo);
+ SysLocks.UpdateSchema(tableId, *tableInfo);
Pipeline.GetDepTracker().UpdateSchema(tableId, *tableInfo);
}
@@ -1185,11 +1185,11 @@ public:
}
const THashMap<ui64, TUserTable::TCPtr> &GetUserTables() const { return TableInfos; }
-
+
ui64 GetLocalTableId(const TTableId& tableId) const {
Y_VERIFY(!TSysTables::IsSystemTable(tableId));
auto it = TableInfos.find(tableId.PathId.LocalPathId);
- return it == TableInfos.end() ? 0 : it->second->LocalTid;
+ return it == TableInfos.end() ? 0 : it->second->LocalTid;
}
ui64 GetShadowTableId(const TTableId& tableId) const {
@@ -1199,21 +1199,21 @@ public:
}
ui64 GetTxReadSizeLimit() const {
- return TxReadSizeLimit ? TxReadSizeLimit : (ui64)PerShardReadSizeLimit;
+ return TxReadSizeLimit ? TxReadSizeLimit : (ui64)PerShardReadSizeLimit;
+ }
+
+ ui64 GetDataTxProfileLogThresholdMs() const {
+ return DataTxProfileLogThresholdMs;
+ }
+
+ ui64 GetDataTxProfileBufferThresholdMs() const {
+ return DataTxProfileBufferThresholdMs;
+ }
+
+ ui64 GetDataTxProfileBufferSize() const {
+ return DataTxProfileBufferSize;
}
- ui64 GetDataTxProfileLogThresholdMs() const {
- return DataTxProfileLogThresholdMs;
- }
-
- ui64 GetDataTxProfileBufferThresholdMs() const {
- return DataTxProfileBufferThresholdMs;
- }
-
- ui64 GetDataTxProfileBufferSize() const {
- return DataTxProfileBufferSize;
- }
-
ui64 GetOutdatedCleanupStep() const {
ui64 mediatorTime = MediatorTimeCastEntry ? MediatorTimeCastEntry->Get(TabletID()) : 0;
ui64 pipelineTime = Pipeline.OutdatedCleanupStep();
@@ -1234,22 +1234,22 @@ public:
tx.SetTxCacheUsage(0);
}
- ui64 MakeScanSnapshot(ui32 tableId) { return Executor()->MakeScanSnapshot(tableId); }
+ ui64 MakeScanSnapshot(ui32 tableId) { return Executor()->MakeScanSnapshot(tableId); }
ui64 QueueScan(ui32 tableId, TAutoPtr<NTable::IScan> scan, ui64 cookie, const TScanOptions& options = TScanOptions())
- {
+ {
return Executor()->QueueScan(tableId, scan, cookie, options);
- }
- void DropScanSnapshot(ui64 id) { Executor()->DropScanSnapshot(id); }
- void CancelScan(ui32 tableId, ui64 scanId) { Executor()->CancelScan(tableId, scanId); }
- TString BorrowSnapshot(ui32 tableId,
- const TTableSnapshotContext &ctx,
- NTable::TRawVals from,
- NTable::TRawVals to,
- ui64 loaner) const
- {
- return Executor()->BorrowSnapshot(tableId, ctx, from, to, loaner);
- }
-
+ }
+ void DropScanSnapshot(ui64 id) { Executor()->DropScanSnapshot(id); }
+ void CancelScan(ui32 tableId, ui64 scanId) { Executor()->CancelScan(tableId, scanId); }
+ TString BorrowSnapshot(ui32 tableId,
+ const TTableSnapshotContext &ctx,
+ NTable::TRawVals from,
+ NTable::TRawVals to,
+ ui64 loaner) const
+ {
+ return Executor()->BorrowSnapshot(tableId, ctx, from, to, loaner);
+ }
+
void SnapshotComplete(TIntrusivePtr<NTabletFlatExecutor::TTableSnapshotContext> snapContext, const TActorContext &ctx) override;
void CompactionComplete(ui32 tableId, const TActorContext &ctx) override;
void CompletedLoansChanged(const TActorContext &ctx) override;
@@ -1270,7 +1270,7 @@ public:
void ScanComplete(NTable::EAbort status, TAutoPtr<IDestructable> prod, ui64 cookie, const TActorContext &ctx) override;
bool ReassignChannelsEnabled() const override;
- ui64 GetMemoryUsage() const override;
+ ui64 GetMemoryUsage() const override;
bool HasSharedBlobs() const;
void CheckInitiateBorrowedPartsReturn(const TActorContext& ctx);
@@ -1278,54 +1278,54 @@ public:
void CheckSplitCanStart(const TActorContext& ctx);
void CheckMvccStateChangeCanStart(const TActorContext& ctx);
- ui32 GetState() const { return State; }
+ ui32 GetState() const { return State; }
TSwitchState GetMvccSwitchState() { return MvccSwitchState; }
- void SetPersistState(ui32 state, TTransactionContext &txc)
- {
- NIceDb::TNiceDb db(txc.DB);
- PersistSys(db, Schema::Sys_State, state);
-
- State = state;
- }
-
+ void SetPersistState(ui32 state, TTransactionContext &txc)
+ {
+ NIceDb::TNiceDb db(txc.DB);
+ PersistSys(db, Schema::Sys_State, state);
+
+ State = state;
+ }
+
bool IsStopping() const { return Stopping; }
ui64 GetPathOwnerId() const { return PathOwnerId; }
ui64 GetCurrentSchemeShardId() const { return CurrentSchemeShardId; }
-
- TSchemeOpSeqNo GetLastSchemeOpSeqNo() { return LastSchemeOpSeqNo; }
- void UpdateLastSchemeOpSeqNo(const TSchemeOpSeqNo &newSeqNo,
- TTransactionContext &txc);
+
+ TSchemeOpSeqNo GetLastSchemeOpSeqNo() { return LastSchemeOpSeqNo; }
+ void UpdateLastSchemeOpSeqNo(const TSchemeOpSeqNo &newSeqNo,
+ TTransactionContext &txc);
void ResetLastSchemeOpSeqNo(TTransactionContext &txc);
- void PersistProcessingParams(const NKikimrSubDomains::TProcessingParams &params,
- NTabletFlatExecutor::TTransactionContext &txc);
+ void PersistProcessingParams(const NKikimrSubDomains::TProcessingParams &params,
+ NTabletFlatExecutor::TTransactionContext &txc);
void PersistCurrentSchemeShardId(ui64 id,
- NTabletFlatExecutor::TTransactionContext &txc);
+ NTabletFlatExecutor::TTransactionContext &txc);
void PersistSubDomainPathId(ui64 ownerId, ui64 localPathId,
NTabletFlatExecutor::TTransactionContext &txc);
void PersistOwnerPathId(ui64 id,
NTabletFlatExecutor::TTransactionContext &txc);
-
+
TDuration CleanupTimeout() const;
- void PlanCleanup(const TActorContext &ctx) {
+ void PlanCleanup(const TActorContext &ctx) {
CleanupQueue.Schedule(ctx, CleanupTimeout());
- }
-
- void SendRegistrationRequestTimeCast(const TActorContext &ctx);
-
- const NKikimrSubDomains::TProcessingParams *GetProcessingParams() const
- {
- return ProcessingParams.get();
- }
-
- const TSysLocks &GetSysLocks() const { return SysLocks; }
-
- using TTabletExecutedFlat::TryCaptureTxCache;
-
+ }
+
+ void SendRegistrationRequestTimeCast(const TActorContext &ctx);
+
+ const NKikimrSubDomains::TProcessingParams *GetProcessingParams() const
+ {
+ return ProcessingParams.get();
+ }
+
+ const TSysLocks &GetSysLocks() const { return SysLocks; }
+
+ using TTabletExecutedFlat::TryCaptureTxCache;
+
bool IsAnyChannelYellowMove() const {
return Executor()->GetStats().IsAnyChannelYellowMove;
- }
-
+ }
+
bool IsAnyChannelYellowStop() const {
return Executor()->GetStats().IsAnyChannelYellowStop;
}
@@ -1335,13 +1335,13 @@ public:
return SubDomainOutOfSpace;
}
- ui64 GetExecutorStep() const
- {
- return Executor()->Step();
- }
-
+ ui64 GetExecutorStep() const
+ {
+ return Executor()->Step();
+ }
+
TSchemaOperation *FindSchemaTx(ui64 txId) { return TransQueue.FindSchemaTx(txId); }
-
+
TUserTable::TPtr AlterTableSchemaVersion(
const TActorContext& ctx, TTransactionContext& txc,
const TPathId& pathId, const ui64 tableSchemaVersion,
@@ -1377,10 +1377,10 @@ public:
const NKikimrSchemeOp::TTableDescription& tableScheme);
static THashMap<TPathId, TPathId> GetRemapIndexes(const NKikimrTxDataShard::TMoveTable& move);
TUserTable::TPtr MoveUserTable(const TActorContext& ctx, TTransactionContext& txc, const NKikimrTxDataShard::TMoveTable& move);
- void DropUserTable(TTransactionContext& txc, ui64 tableId);
-
- ui32 GetLastLocalTid() const { return LastLocalTid; }
-
+ void DropUserTable(TTransactionContext& txc, ui64 tableId);
+
+ ui32 GetLastLocalTid() const { return LastLocalTid; }
+
ui64 AllocateChangeRecordOrder(NIceDb::TNiceDb& db);
ui64 AllocateChangeRecordGroup(NIceDb::TNiceDb& db);
void PersistChangeRecord(NIceDb::TNiceDb& db, const TChangeRecord& record);
@@ -1395,10 +1395,10 @@ public:
static void PersistSchemeTxResult(NIceDb::TNiceDb &db, const TSchemaOperation& op);
- void NotifySchemeshard(const TActorContext& ctx, ui64 txId = 0);
+ void NotifySchemeshard(const TActorContext& ctx, ui64 txId = 0);
TThrRefBase* GetDataShardSysTables() { return DataShardSysTables.Get(); }
-
+
TSnapshotManager& GetSnapshotManager() { return SnapshotManager; }
const TSnapshotManager& GetSnapshotManager() const { return SnapshotManager; }
@@ -1973,29 +1973,29 @@ private:
TSet<ui64> MediatorTimeCastWaitingSteps;
TControlWrapper DisableByKeyFilter;
- TControlWrapper MaxTxInFly;
+ TControlWrapper MaxTxInFly;
TControlWrapper MaxTxLagMilliseconds;
- TControlWrapper CanCancelROWithReadSets;
- TControlWrapper PerShardReadSizeLimit;
+ TControlWrapper CanCancelROWithReadSets;
+ TControlWrapper PerShardReadSizeLimit;
TControlWrapper CpuUsageReportThreshlodPercent;
TControlWrapper CpuUsageReportIntervalSeconds;
TControlWrapper HighDataSizeReportThreshlodBytes;
TControlWrapper HighDataSizeReportIntervalSeconds;
- TControlWrapper DataTxProfileLogThresholdMs;
- TControlWrapper DataTxProfileBufferThresholdMs;
- TControlWrapper DataTxProfileBufferSize;
-
+ TControlWrapper DataTxProfileLogThresholdMs;
+ TControlWrapper DataTxProfileBufferThresholdMs;
+ TControlWrapper DataTxProfileBufferSize;
+
TControlWrapper ReadColumnsScanEnabled;
TControlWrapper ReadColumnsScanInUserPool;
TControlWrapper BackupReadAheadLo;
TControlWrapper BackupReadAheadHi;
- // Set of InRS keys to remove from local DB.
- THashSet<TReadSetKey> InRSToRemove;
+ // Set of InRS keys to remove from local DB.
+ THashSet<TReadSetKey> InRSToRemove;
TIntrusivePtr<TThrRefBase> DataShardSysTables;
-
+
// Simple volatile counter
ui64 NextTieBreakerIndex = 1;
@@ -2149,15 +2149,15 @@ protected:
HFuncTraced(TEvTxProcessing::TEvPlanStep, Handle);
HFuncTraced(TEvTxProcessing::TEvReadSet, Handle);
HFuncTraced(TEvTxProcessing::TEvReadSetAck, Handle);
- HFuncTraced(TEvTxProcessing::TEvStreamClearanceResponse, Handle);
- HFuncTraced(TEvTxProcessing::TEvStreamClearancePending, Handle);
- HFuncTraced(TEvTxProcessing::TEvInterruptTransaction, Handle);
+ HFuncTraced(TEvTxProcessing::TEvStreamClearanceResponse, Handle);
+ HFuncTraced(TEvTxProcessing::TEvStreamClearancePending, Handle);
+ HFuncTraced(TEvTxProcessing::TEvInterruptTransaction, Handle);
HFuncTraced(TEvPrivate::TEvProgressTransaction, Handle);
HFuncTraced(TEvPrivate::TEvCleanupTransaction, Handle);
HFuncTraced(TEvPrivate::TEvDelayedProposeTransaction, Handle);
HFuncTraced(TEvPrivate::TEvProgressResendReadSet, Handle);
- HFuncTraced(TEvPrivate::TEvRemoveOldInReadSets, Handle);
- HFuncTraced(TEvPrivate::TEvRegisterScanActor, Handle);
+ HFuncTraced(TEvPrivate::TEvRemoveOldInReadSets, Handle);
+ HFuncTraced(TEvPrivate::TEvRegisterScanActor, Handle);
HFuncTraced(TEvPrivate::TEvScanStats, Handle);
HFuncTraced(TEvPrivate::TEvPersistScanState, Handle);
HFuncTraced(TEvTabletPipe::TEvClientConnected, Handle);
@@ -2189,23 +2189,23 @@ protected:
HFunc(TEvDataShard::TEvReadAck, Handle);
HFunc(TEvDataShard::TEvReadCancel, Handle);
HFunc(TEvDataShard::TEvReadColumnsRequest, Handle);
- HFunc(TEvDataShard::TEvGetInfoRequest, Handle);
- HFunc(TEvDataShard::TEvListOperationsRequest, Handle);
- HFunc(TEvDataShard::TEvGetDataHistogramRequest, Handle);
- HFunc(TEvDataShard::TEvGetOperationRequest, Handle);
- HFunc(TEvDataShard::TEvGetReadTableSinkStateRequest, Handle);
- HFunc(TEvDataShard::TEvGetReadTableScanStateRequest, Handle);
- HFunc(TEvDataShard::TEvGetReadTableStreamStateRequest, Handle);
- HFunc(TEvDataShard::TEvGetRSInfoRequest, Handle);
- HFunc(TEvDataShard::TEvGetSlowOpProfilesRequest, Handle);
+ HFunc(TEvDataShard::TEvGetInfoRequest, Handle);
+ HFunc(TEvDataShard::TEvListOperationsRequest, Handle);
+ HFunc(TEvDataShard::TEvGetDataHistogramRequest, Handle);
+ HFunc(TEvDataShard::TEvGetOperationRequest, Handle);
+ HFunc(TEvDataShard::TEvGetReadTableSinkStateRequest, Handle);
+ HFunc(TEvDataShard::TEvGetReadTableScanStateRequest, Handle);
+ HFunc(TEvDataShard::TEvGetReadTableStreamStateRequest, Handle);
+ HFunc(TEvDataShard::TEvGetRSInfoRequest, Handle);
+ HFunc(TEvDataShard::TEvGetSlowOpProfilesRequest, Handle);
HFunc(TEvDataShard::TEvRefreshVolatileSnapshotRequest, Handle);
HFunc(TEvDataShard::TEvDiscardVolatileSnapshotRequest, Handle);
HFuncTraced(TEvDataShard::TEvBuildIndexCreateRequest, Handle);
HFunc(TEvPrivate::TEvAsyncJobComplete, Handle);
CFunc(TEvPrivate::EvPeriodicWakeup, DoPeriodicTasks);
- HFunc(TEvents::TEvUndelivered, Handle);
+ HFunc(TEvents::TEvUndelivered, Handle);
IgnoreFunc(TEvInterconnect::TEvNodeConnected);
- HFunc(TEvInterconnect::TEvNodeDisconnected, Handle);
+ HFunc(TEvInterconnect::TEvNodeDisconnected, Handle);
HFunc(TEvPrivate::TEvSubDomainPathIdFound, Handle);
HFunc(TEvTxProxySchemeCache::TEvWatchNotifyUpdated, Handle);
IgnoreFunc(TEvTxProxySchemeCache::TEvWatchNotifyDeleted);
@@ -2300,12 +2300,12 @@ protected:
return IActor::Die(ctx);
}
- void BecomeBroken(const TActorContext &ctx)
- {
- Become(&TThis::StateBroken);
- ctx.Send(Tablet(), new TEvents::TEvPoisonPill);
- }
-
+ void BecomeBroken(const TActorContext &ctx)
+ {
+ Become(&TThis::StateBroken);
+ ctx.Send(Tablet(), new TEvents::TEvPoisonPill);
+ }
+
void SendViaSchemeshardPipe(const TActorContext &ctx, ui64 tabletId, THolder<TEvDataShard::TEvSchemaChanged> event) {
Y_VERIFY(tabletId);
Y_VERIFY(CurrentSchemeShardId == tabletId);
@@ -2345,7 +2345,7 @@ protected:
for (const auto& t : TableInfos) {
ui64 tableId = t.first;
- const TUserTable &ti = *t.second;
+ const TUserTable &ti = *t.second;
// Don't report stats until they are build for the first time
if (!ti.Stats.StatsUpdateTime)
@@ -2408,35 +2408,35 @@ protected:
}
bool OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev, const TActorContext &ctx) override;
- void SerializeHistogram(const TUserTable &tinfo,
- const NTable::THistogram &histogram,
- const NScheme::TTypeRegistry &typeRegistry,
- NKikimrTxDataShard::TEvGetDataHistogramResponse::THistogram &hist);
+ void SerializeHistogram(const TUserTable &tinfo,
+ const NTable::THistogram &histogram,
+ const NScheme::TTypeRegistry &typeRegistry,
+ NKikimrTxDataShard::TEvGetDataHistogramResponse::THistogram &hist);
void SerializeKeySample(const TUserTable &tinfo,
const NTable::TKeyAccessSample &keySample,
const NScheme::TTypeRegistry &typeRegistry,
NKikimrTxDataShard::TEvGetDataHistogramResponse::THistogram &hist);
-
+
bool ByKeyFilterDisabled() const;
bool AllowCancelROwithReadsets() const;
-
- void ResolveTablePath(const TActorContext &ctx);
+
+ void ResolveTablePath(const TActorContext &ctx);
};
NKikimrTxDataShard::TError::EKind ConvertErrCode(NMiniKQL::IEngineFlat::EResult code);
Ydb::StatusIds::StatusCode ConvertToYdbStatusCode(NKikimrTxDataShard::TError::EKind);
-template <class T>
-void SetStatusError(T &rec,
- Ydb::StatusIds::StatusCode status,
- const TString &msg,
- ui32 severity = NYql::TSeverityIds::S_ERROR)
-{
- rec.MutableStatus()->SetCode(status);
- auto *issue = rec.MutableStatus()->AddIssues();
- issue->set_severity(severity);
- issue->set_message(msg);
-}
-
+template <class T>
+void SetStatusError(T &rec,
+ Ydb::StatusIds::StatusCode status,
+ const TString &msg,
+ ui32 severity = NYql::TSeverityIds::S_ERROR)
+{
+ rec.MutableStatus()->SetCode(status);
+ auto *issue = rec.MutableStatus()->AddIssues();
+ issue->set_severity(severity);
+ issue->set_message(msg);
+}
+
}}
diff --git a/ydb/core/tx/datashard/datashard_kqp.cpp b/ydb/core/tx/datashard/datashard_kqp.cpp
index 989de11ab40..a262c98de5a 100644
--- a/ydb/core/tx/datashard/datashard_kqp.cpp
+++ b/ydb/core/tx/datashard/datashard_kqp.cpp
@@ -612,7 +612,7 @@ void KqpEraseLocks(ui64 origin, TActiveTransaction* tx, TSysLocks& sysLocks) {
}
}
-void KqpPrepareInReadsets(TInputOpData::TInReadSets& inReadSets,
+void KqpPrepareInReadsets(TInputOpData::TInReadSets& inReadSets,
const NKikimrTxDataShard::TKqpTransaction& kqpTx, ui64 tabletId)
{
for (auto& task : kqpTx.GetTasks()) {
diff --git a/ydb/core/tx/datashard/datashard_kqp.h b/ydb/core/tx/datashard/datashard_kqp.h
index a249bf06b07..228f71fd37d 100644
--- a/ydb/core/tx/datashard/datashard_kqp.h
+++ b/ydb/core/tx/datashard/datashard_kqp.h
@@ -31,7 +31,7 @@ THolder<TEvDataShard::TEvProposeTransactionResult> KqpCompleteTransaction(const
void KqpFillOutReadSets(TOutputOpData::TOutReadSets& outReadSets, const NKikimrTxDataShard::TKqpTransaction& kqpTx,
NKqp::TKqpTasksRunner& tasksRunner, TSysLocks& sysLocks, ui64 tabletId);
-void KqpPrepareInReadsets(TInputOpData::TInReadSets& inReadSets,
+void KqpPrepareInReadsets(TInputOpData::TInReadSets& inReadSets,
const NKikimrTxDataShard::TKqpTransaction& kqpTx, ui64 tabletId);
bool KqpValidateLocks(ui64 origin, TActiveTransaction* tx, TSysLocks& sysLocks);
diff --git a/ydb/core/tx/datashard/datashard_kqp_upsert_rows.cpp b/ydb/core/tx/datashard/datashard_kqp_upsert_rows.cpp
index 703a10a87f1..a2dfa61bbfc 100644
--- a/ydb/core/tx/datashard/datashard_kqp_upsert_rows.cpp
+++ b/ydb/core/tx/datashard/datashard_kqp_upsert_rows.cpp
@@ -44,7 +44,7 @@ public:
auto& dsApplyCtx = *CheckedCast<TKqpDatashardApplyContext*>(&applyContext);
TVector<TCell> keyTuple(Owner.KeyIndices.size());
- FillKeyTupleValue(Row, Owner.KeyIndices, Owner.RowTypes, keyTuple, Owner.Env);
+ FillKeyTupleValue(Row, Owner.KeyIndices, Owner.RowTypes, keyTuple, Owner.Env);
if (dsApplyCtx.Host->IsPathErased(Owner.TableId)) {
return;
@@ -150,7 +150,7 @@ private:
TVector<NUdf::TDataTypeId> RowTypes;
TVector<ui32> KeyIndices;
TVector<TUpsertColumn> UpsertColumns;
- const TTypeEnvironment& Env;
+ const TTypeEnvironment& Env;
TKqpTableStats& ShardTableStats;
TKqpTableStats& TaskTableStats;
};
diff --git a/ydb/core/tx/datashard/datashard_loans.cpp b/ydb/core/tx/datashard/datashard_loans.cpp
index f93c45b36b7..adbfc4769db 100644
--- a/ydb/core/tx/datashard/datashard_loans.cpp
+++ b/ydb/core/tx/datashard/datashard_loans.cpp
@@ -142,10 +142,10 @@ void TDataShard::Handle(TEvDataShard::TEvReturnBorrowedPartAck::TPtr& ev, const
bool TDataShard::HasSharedBlobs() const {
const bool* hasSharedBlobsPtr = Executor()->GetStats().HasSharedBlobs;
- if (!hasSharedBlobsPtr) {
+ if (!hasSharedBlobsPtr) {
Y_VERIFY(Executor()->GetStats().IsFollower);
- return false;
- }
+ return false;
+ }
return *hasSharedBlobsPtr;
}
diff --git a/ydb/core/tx/datashard/datashard_locks.cpp b/ydb/core/tx/datashard/datashard_locks.cpp
index cca80fe1469..aa5fc3876b4 100644
--- a/ydb/core/tx/datashard/datashard_locks.cpp
+++ b/ydb/core/tx/datashard/datashard_locks.cpp
@@ -11,7 +11,7 @@ namespace NDataShard {
// TLockInfo
TLockInfo::TLockInfo(TLockLocker * locker, ui64 lockId)
- : Locker(locker)
+ : Locker(locker)
, LockId(lockId)
, Counter(locker->IncCounter())
, CreationTime(TAppData::TimeProvider->Now())
@@ -42,8 +42,8 @@ bool TLockInfo::AddRange(const TRangeKey& range) {
Ranges.emplace_back(range);
}
return !ShardLock;
-}
-
+}
+
void TLockInfo::SetBroken(const TRowVersion& at) {
#if 1 // optimisation: remove at next Remove
if (!IsBroken(at))
@@ -481,13 +481,13 @@ TSysLocks::TLock TSysLocks::GetLock(const TArrayRef<const TCell>& key) const {
ok = ok && TLocksTable::ExtractKey(key, TLocksTable::EColumns::DataShard, tabletId);
Y_VERIFY(ok && Self->TabletID() == tabletId);
- if (Cache) {
- auto it = Cache->Locks.find(lockTxId);
- if (it != Cache->Locks.end())
- return it->second;
- return TLock();
- }
-
+ if (Cache) {
+ auto it = Cache->Locks.find(lockTxId);
+ if (it != Cache->Locks.end())
+ return it->second;
+ return TLock();
+ }
+
Y_VERIFY(Update);
auto &checkVersion = Update->CheckVersion;
@@ -495,7 +495,7 @@ TSysLocks::TLock TSysLocks::GetLock(const TArrayRef<const TCell>& key) const {
if (txLock) {
const auto& tableIds = txLock->GetAffectedTables();
if (key.size() == 2) { // locks v1
- Y_VERIFY(tableIds.size() == 1);
+ Y_VERIFY(tableIds.size() == 1);
return MakeAndLogLock(lockTxId, txLock->GetCounter(checkVersion), *tableIds.begin());
} else { // locks v2
Y_VERIFY(key.size() == 4);
@@ -588,11 +588,11 @@ TSysLocks::TLock TSysLocks::MakeLock(ui64 lockTxId, ui64 counter, const TPathId&
}
TSysLocks::TLock TSysLocks::MakeAndLogLock(ui64 lockTxId, ui64 counter, const TPathId& pathId) const {
- TLock lock = MakeLock(lockTxId, counter, pathId);
- if (AccessLog)
- AccessLog->Locks[lockTxId] = lock;
- return lock;
-}
-
-
+ TLock lock = MakeLock(lockTxId, counter, pathId);
+ if (AccessLog)
+ AccessLog->Locks[lockTxId] = lock;
+ return lock;
+}
+
+
}}
diff --git a/ydb/core/tx/datashard/datashard_locks.h b/ydb/core/tx/datashard/datashard_locks.h
index 5ea722157a7..19c68c4d88d 100644
--- a/ydb/core/tx/datashard/datashard_locks.h
+++ b/ydb/core/tx/datashard/datashard_locks.h
@@ -6,7 +6,7 @@
#include <ydb/core/base/row_version.h>
#include <ydb/core/protos/counters_datashard.pb.h>
#include <ydb/core/tablet/tablet_counters.h>
-
+
#include <library/cpp/cache/cache.h>
#include <util/generic/queue.h>
#include <util/generic/set.h>
@@ -19,82 +19,82 @@ namespace NDataShard {
struct TUserTable;
-class TLocksDataShard {
-public:
+class TLocksDataShard {
+public:
TLocksDataShard(TTabletCountersBase* const &tabletCounters)
- : TabletCounters(tabletCounters)
- {
- }
+ : TabletCounters(tabletCounters)
+ {
+ }
- virtual ~TLocksDataShard() = default;
+ virtual ~TLocksDataShard() = default;
virtual void IncCounter(ECumulativeCounters counter,
- ui64 num = 1) const = 0;
+ ui64 num = 1) const = 0;
virtual void IncCounter(EPercentileCounters counter,
- ui64 num) const = 0;
+ ui64 num) const = 0;
virtual void IncCounter(EPercentileCounters counter,
- const TDuration& latency) const = 0;
+ const TDuration& latency) const = 0;
- virtual ui64 TabletID() const = 0;
- virtual bool IsUserTable(const TTableId& tableId) const = 0;
- virtual ui32 Generation() const = 0;
+ virtual ui64 TabletID() const = 0;
+ virtual bool IsUserTable(const TTableId& tableId) const = 0;
+ virtual ui32 Generation() const = 0;
virtual TRowVersion LastCompleteTxVersion() const = 0;
-
- TTabletCountersBase* const &TabletCounters;
-};
-
-template <typename T>
-class TLocksDataShardAdapter : public TLocksDataShard
-{
-public:
- TLocksDataShardAdapter(const T *self)
+
+ TTabletCountersBase* const &TabletCounters;
+};
+
+template <typename T>
+class TLocksDataShardAdapter : public TLocksDataShard
+{
+public:
+ TLocksDataShardAdapter(const T *self)
: TLocksDataShard(self->TabletCounters)
- , Self(self)
- {
- }
-
+ , Self(self)
+ {
+ }
+
void IncCounter(ECumulativeCounters counter,
- ui64 num = 1) const override
- {
- return Self->IncCounter(counter, num);
- }
-
+ ui64 num = 1) const override
+ {
+ return Self->IncCounter(counter, num);
+ }
+
void IncCounter(EPercentileCounters counter,
- ui64 num) const override
- {
- return Self->IncCounter(counter, num);
- }
-
+ ui64 num) const override
+ {
+ return Self->IncCounter(counter, num);
+ }
+
void IncCounter(EPercentileCounters counter,
- const TDuration& latency) const override
- {
- return Self->IncCounter(counter, latency);
- }
-
- ui64 TabletID() const override
- {
- return Self->TabletID();
- }
-
- bool IsUserTable(const TTableId& tableId) const override
- {
- return Self->IsUserTable(tableId);
- }
-
- ui32 Generation() const override
- {
- return Self->Generation();
- }
-
+ const TDuration& latency) const override
+ {
+ return Self->IncCounter(counter, latency);
+ }
+
+ ui64 TabletID() const override
+ {
+ return Self->TabletID();
+ }
+
+ bool IsUserTable(const TTableId& tableId) const override
+ {
+ return Self->IsUserTable(tableId);
+ }
+
+ ui32 Generation() const override
+ {
+ return Self->Generation();
+ }
+
TRowVersion LastCompleteTxVersion() const override
{
return Self->LastCompleteTxVersion();
}
-private:
- const T *Self;
-};
-
+private:
+ const T *Self;
+};
+
class TLockInfo;
class TTableLocks;
class TLockLocker;
@@ -151,7 +151,7 @@ public:
size_t NumPoints() const { return Points.size(); }
size_t NumRanges() const { return Ranges.size(); }
- bool IsShardLock() const { return ShardLock; }
+ bool IsShardLock() const { return ShardLock; }
//ui64 MemorySize() const { return 1; } // TODO
bool MayHavePointsAndRanges() const { return !ShardLock && (!BreakVersion || *BreakVersion); }
@@ -267,9 +267,9 @@ public:
TLRUCache<ui64, TInstant> LocksQueue;
};
- template <typename T>
- TLockLocker(const T * self)
- : Self(new TLocksDataShardAdapter<T>(self))
+ template <typename T>
+ TLockLocker(const T * self)
+ : Self(new TLocksDataShardAdapter<T>(self))
, Limiter(this)
, Counter(0)
{}
@@ -329,7 +329,7 @@ public:
ui64 IncCounter() { return Counter++; };
private:
- THolder<TLocksDataShard> Self;
+ THolder<TLocksDataShard> Self;
THashMap<ui64, TLockInfo::TPtr> Locks; // key is LockId
THashMap<TPathId, TTableLocks::TPtr> Tables;
THashSet<ui64> ShardLocks;
@@ -420,37 +420,37 @@ struct TLocksUpdate {
}
};
-struct TLocksCache {
- THashMap<ui64, TSysTables::TLocksTable::TLock> Locks;
-};
-
+struct TLocksCache {
+ THashMap<ui64, TSysTables::TLocksTable::TLock> Locks;
+};
+
/// /sys/locks table logic
class TSysLocks {
public:
using TLocksTable = TSysTables::TLocksTable;
using TLock = TLocksTable::TLock;
- template <typename T>
- TSysLocks(const T * self)
- : Self(new TLocksDataShardAdapter<T>(self))
+ template <typename T>
+ TSysLocks(const T * self)
+ : Self(new TLocksDataShardAdapter<T>(self))
, Locker(self)
, Update(nullptr)
- , AccessLog(nullptr)
- , Cache(nullptr)
+ , AccessLog(nullptr)
+ , Cache(nullptr)
{}
void SetTxUpdater(TLocksUpdate * up) {
Update = up;
}
- void SetAccessLog(TLocksCache *log) {
- AccessLog = log;
- }
-
- void SetCache(TLocksCache *cache) {
- Cache = cache;
- }
-
+ void SetAccessLog(TLocksCache *log) {
+ AccessLog = log;
+ }
+
+ void SetCache(TLocksCache *cache) {
+ Cache = cache;
+ }
+
ui64 CurrentLockTxId() const {
Y_VERIFY(Update);
return Update->LockTxId;
@@ -490,11 +490,11 @@ public:
}
private:
- THolder<TLocksDataShard> Self;
+ THolder<TLocksDataShard> Self;
TLockLocker Locker;
TLocksUpdate * Update;
- TLocksCache *AccessLog;
- TLocksCache *Cache;
+ TLocksCache *AccessLog;
+ TLocksCache *Cache;
TLock MakeLock(ui64 lockTxId, ui64 counter, const TPathId& pathId) const;
TLock MakeAndLogLock(ui64 lockTxId, ui64 counter, const TPathId& pathId) const;
diff --git a/ydb/core/tx/datashard/datashard_pipeline.cpp b/ydb/core/tx/datashard/datashard_pipeline.cpp
index eaf82fa167a..3498162c17e 100644
--- a/ydb/core/tx/datashard/datashard_pipeline.cpp
+++ b/ydb/core/tx/datashard/datashard_pipeline.cpp
@@ -7,7 +7,7 @@
#include <ydb/core/base/compile_time_flags.h>
#include <ydb/core/base/cputime.h>
#include <ydb/core/tx/balance_coverage/balance_coverage_builder.h>
-
+
namespace NKikimr {
namespace NDataShard {
@@ -29,18 +29,18 @@ TPipeline::TPipeline(TDataShard * self)
ExecutionUnits[i] = CreateExecutionUnit(static_cast<EExecutionUnitKind>(i), *Self, *this);
}
-TPipeline::~TPipeline()
-{
- for (auto &pr : ActiveOps) {
+TPipeline::~TPipeline()
+{
+ for (auto &pr : ActiveOps) {
pr.second->ClearDependents();
- pr.second->ClearDependencies();
+ pr.second->ClearDependencies();
pr.second->ClearSpecialDependents();
pr.second->ClearSpecialDependencies();
pr.second->ClearPlannedConflicts();
pr.second->ClearImmediateConflicts();
- }
-}
-
+ }
+}
+
bool TPipeline::Load(NIceDb::TNiceDb& db) {
using Schema = TDataShard::Schema;
@@ -56,7 +56,7 @@ bool TPipeline::Load(NIceDb::TNiceDb& db) {
Config.Validate();
UtmostCompleteTx = LastCompleteTx;
-
+
return true;
}
@@ -73,41 +73,41 @@ void TPipeline::UpdateConfig(NIceDb::TNiceDb& db, const NKikimrSchemeOp::TPipeli
PersistConfig(db);
}
-bool TPipeline::AddImmediateOp(TOperation::TPtr op)
-{
- auto p = ImmediateOps.emplace(op->GetTxId(), op);
- Self->SetCounter(COUNTER_IMMEDIATE_TX_IN_FLY, ImmediateOps.size());
+bool TPipeline::AddImmediateOp(TOperation::TPtr op)
+{
+ auto p = ImmediateOps.emplace(op->GetTxId(), op);
+ Self->SetCounter(COUNTER_IMMEDIATE_TX_IN_FLY, ImmediateOps.size());
return p.second;
}
-void TPipeline::RemoveImmediateOp(TOperation::TPtr op)
-{
- ImmediateOps.erase(op->GetTxId());
- Self->SetCounter(COUNTER_IMMEDIATE_TX_IN_FLY, ImmediateOps.size());
+void TPipeline::RemoveImmediateOp(TOperation::TPtr op)
+{
+ ImmediateOps.erase(op->GetTxId());
+ Self->SetCounter(COUNTER_IMMEDIATE_TX_IN_FLY, ImmediateOps.size());
}
-bool TPipeline::OutOfOrderLimits() const
-{
- auto completed = GetExecutionUnit(EExecutionUnitKind::CompletedOperations).GetInFly();
- auto activePlanned = ActivePlannedOps.size() - completed;
-
- if (!Config.OutOfOrder())
- return activePlanned;
- if (activePlanned >= Config.LimitActiveTx)
- return true;
- if (completed >= Config.LimitDoneDataTx)
- return true;
- return false;
+bool TPipeline::OutOfOrderLimits() const
+{
+ auto completed = GetExecutionUnit(EExecutionUnitKind::CompletedOperations).GetInFly();
+ auto activePlanned = ActivePlannedOps.size() - completed;
+
+ if (!Config.OutOfOrder())
+ return activePlanned;
+ if (activePlanned >= Config.LimitActiveTx)
+ return true;
+ if (completed >= Config.LimitDoneDataTx)
+ return true;
+ return false;
}
-bool TPipeline::CanRunAnotherOp()
-{
- if (GetNextActiveOp(true))
+bool TPipeline::CanRunAnotherOp()
+{
+ if (GetNextActiveOp(true))
return true;
return false;
}
-
-bool TPipeline::CanRunOp(const TOperation &op) const {
+
+bool TPipeline::CanRunOp(const TOperation &op) const {
if (!op.Exists())
return false;
@@ -132,18 +132,18 @@ TDuration TPipeline::CleanupTimeout() const {
ECleanupStatus TPipeline::Cleanup(NIceDb::TNiceDb& db, const TActorContext& ctx) {
bool foundExpired = false;
- TOperation::TPtr op;
+ TOperation::TPtr op;
ui64 step = 0;
ui64 txId = 0;
- while (!op) {
- Self->TransQueue.GetPlannedTxId(step, txId);
+ while (!op) {
+ Self->TransQueue.GetPlannedTxId(step, txId);
if (txId == 0)
break;
- op = Self->TransQueue.FindTxInFly(txId);
+ op = Self->TransQueue.FindTxInFly(txId);
- if (!op) {
+ if (!op) {
LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
"TX [" << step << ":" << txId << "] is already executed or expired at tablet "
<< Self->TabletID());
@@ -199,195 +199,195 @@ ECleanupStatus TPipeline::Cleanup(NIceDb::TNiceDb& db, const TActorContext& ctx)
return status;
}
-bool TPipeline::IsReadyOp(TOperation::TPtr op)
+bool TPipeline::IsReadyOp(TOperation::TPtr op)
{
- Y_VERIFY_DEBUG_S(!op->IsInProgress(),
- "Found in-progress candidate operation " << op->GetKind()
- << " " << *op << " executing in " << op->GetCurrentUnit()
- << " at " << Self->TabletID());
- if (op->IsInProgress()) {
- LOG_CRIT_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Found in-progress candidate operation " << op->GetKind()
- << " " << *op << " executing in " << op->GetCurrentUnit()
- << " at " << Self->TabletID());
- return false;
- }
-
- Y_VERIFY_DEBUG_S(!op->IsExecutionPlanFinished(),
- "Found finished candidate operation " << op->GetKind()
- << " " << *op << " at " << Self->TabletID());
- if (op->IsExecutionPlanFinished()) {
- LOG_CRIT_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Found finished candidate operation " << op->GetKind()
- << " " << *op << " at " << Self->TabletID());
- return false;
- }
-
- auto &unit = GetExecutionUnit(op->GetCurrentUnit());
- return unit.IsReadyToExecute(op);
-}
-
-TOperation::TPtr TPipeline::GetNextActiveOp(bool dryRun)
-{
- LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "GetNextActiveOp at " << Self->TabletID()
- << (dryRun ? " (dry run)" : "")
- << " active " << ActiveOps.size()
- << " active planned " << ActivePlannedOps.size()
- << " immediate " << ImmediateOps.size()
- << " planned " << Self->TransQueue.TxInFly());
-
- THashSet<TOperation::TPtr> checkedOps;
- THashSet<EExecutionUnitKind> checkedUnits;
-
- // Check if we have cached result from previous dry run.
- if (NextActiveOp) {
- if (IsReadyOp(NextActiveOp)) {
- LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Return cached ready operation " << *NextActiveOp << " at "
- << Self->TabletID());
-
- TOperation::TPtr res = NextActiveOp;
- if (!dryRun)
- NextActiveOp = nullptr;
- return res;
- } else {
- LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Cached ready operation " << NextActiveOp->GetKind()
- << " " << *NextActiveOp << " is not ready anymore for "
- << NextActiveOp->GetCurrentUnit() << " at " << Self->TabletID());
-
- NextActiveOp = nullptr;
- }
- }
-
- // First look through candidate operations in
- // StepOrder order.
- while (!CandidateOps.empty()) {
- auto op = CandidateOps.begin()->second;
- CandidateOps.erase(CandidateOps.begin());
-
- if (IsReadyOp(op)) {
- LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Found ready candidate operation " << *op << " at "
- << Self->TabletID() << " for " << op->GetCurrentUnit());
- if (dryRun)
- NextActiveOp = op;
- return op;
- }
-
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Candidate operation " << *op << " at " << Self->TabletID()
- << " is not ready for " << op->GetCurrentUnit());
-
- checkedOps.insert(op);
- }
-
- // Now look at candidate units. Start from units
- // with higher kind values which are supposed to
- // hold operations on later execution stages.
- while (!CandidateUnits.empty()) {
- auto &unit = GetExecutionUnit(*CandidateUnits.rbegin());
-
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Check candidate unit " << unit.GetKind() << " at " << Self->TabletID());
-
- auto op = unit.FindReadyOperation();
- if (op) {
- LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Found ready operation " << *op << " in " << unit.GetKind()
- << " unit at " << Self->TabletID());
- if (dryRun)
- NextActiveOp = op;
- return op;
- }
-
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Unit " << unit.GetKind() << " has no ready operations at "
- << Self->TabletID());
-
- checkedUnits.insert(unit.GetKind());
- CandidateUnits.erase(*CandidateUnits.rbegin());
- }
-
- // If candidates have no ready operation then check all other
- // running and waiting operations. Also check plan queue.
- // Such checks are done to find issues with proper candidates
- // identification. In release mode error is logged, in debug
- // mode just fail.
- for (auto &pr : ActiveOps) {
- const TOperation::TPtr &op = pr.second;
- Y_VERIFY(!op->IsExecutionPlanFinished());
-
- if (checkedOps.contains(op) || op->IsInProgress())
- continue;
-
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Check active operation " << *op << " at " << Self->TabletID()
- << " on unit " << op->GetCurrentUnit());
-
- bool ready = IsReadyOp(op);
-
- Y_VERIFY_DEBUG_S(!ready, "Found unexpected ready active operation " << *op
- << " in " << op->GetCurrentUnit());
-
- if (ready) {
- LOG_ERROR_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "TryGetExistingTx at " << Self->TabletID() << " return waiting " << *op);
- if (dryRun)
- NextActiveOp = op;
- return op;
+ Y_VERIFY_DEBUG_S(!op->IsInProgress(),
+ "Found in-progress candidate operation " << op->GetKind()
+ << " " << *op << " executing in " << op->GetCurrentUnit()
+ << " at " << Self->TabletID());
+ if (op->IsInProgress()) {
+ LOG_CRIT_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Found in-progress candidate operation " << op->GetKind()
+ << " " << *op << " executing in " << op->GetCurrentUnit()
+ << " at " << Self->TabletID());
+ return false;
+ }
+
+ Y_VERIFY_DEBUG_S(!op->IsExecutionPlanFinished(),
+ "Found finished candidate operation " << op->GetKind()
+ << " " << *op << " at " << Self->TabletID());
+ if (op->IsExecutionPlanFinished()) {
+ LOG_CRIT_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Found finished candidate operation " << op->GetKind()
+ << " " << *op << " at " << Self->TabletID());
+ return false;
+ }
+
+ auto &unit = GetExecutionUnit(op->GetCurrentUnit());
+ return unit.IsReadyToExecute(op);
+}
+
+TOperation::TPtr TPipeline::GetNextActiveOp(bool dryRun)
+{
+ LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "GetNextActiveOp at " << Self->TabletID()
+ << (dryRun ? " (dry run)" : "")
+ << " active " << ActiveOps.size()
+ << " active planned " << ActivePlannedOps.size()
+ << " immediate " << ImmediateOps.size()
+ << " planned " << Self->TransQueue.TxInFly());
+
+ THashSet<TOperation::TPtr> checkedOps;
+ THashSet<EExecutionUnitKind> checkedUnits;
+
+ // Check if we have cached result from previous dry run.
+ if (NextActiveOp) {
+ if (IsReadyOp(NextActiveOp)) {
+ LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Return cached ready operation " << *NextActiveOp << " at "
+ << Self->TabletID());
+
+ TOperation::TPtr res = NextActiveOp;
+ if (!dryRun)
+ NextActiveOp = nullptr;
+ return res;
+ } else {
+ LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Cached ready operation " << NextActiveOp->GetKind()
+ << " " << *NextActiveOp << " is not ready anymore for "
+ << NextActiveOp->GetCurrentUnit() << " at " << Self->TabletID());
+
+ NextActiveOp = nullptr;
}
-
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Active operation " << *op << " at " << Self->TabletID()
- << " is not ready for " << op->GetCurrentUnit());
- }
-
- if (!checkedUnits.contains(EExecutionUnitKind::PlanQueue)) {
- auto &unit = GetExecutionUnit(EExecutionUnitKind::PlanQueue);
-
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Check unit " << unit.GetKind() << " at " << Self->TabletID());
-
- auto op = unit.FindReadyOperation();
-
- Y_VERIFY_DEBUG_S(!op, "Found unexpected ready operation in plan queue " << *op
- << " at " << Self->TabletID());
-
- if (op) {
- LOG_ERROR_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Found ready operation " << *op << " in " << unit.GetKind()
- << " unit at " << Self->TabletID());
- if (dryRun)
- NextActiveOp = op;
- return op;
- }
-
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Unit " << unit.GetKind() << " has no ready operations at "
- << Self->TabletID());
- }
-
+ }
+
+ // First look through candidate operations in
+ // StepOrder order.
+ while (!CandidateOps.empty()) {
+ auto op = CandidateOps.begin()->second;
+ CandidateOps.erase(CandidateOps.begin());
+
+ if (IsReadyOp(op)) {
+ LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Found ready candidate operation " << *op << " at "
+ << Self->TabletID() << " for " << op->GetCurrentUnit());
+ if (dryRun)
+ NextActiveOp = op;
+ return op;
+ }
+
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Candidate operation " << *op << " at " << Self->TabletID()
+ << " is not ready for " << op->GetCurrentUnit());
+
+ checkedOps.insert(op);
+ }
+
+ // Now look at candidate units. Start from units
+ // with higher kind values which are supposed to
+ // hold operations on later execution stages.
+ while (!CandidateUnits.empty()) {
+ auto &unit = GetExecutionUnit(*CandidateUnits.rbegin());
+
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Check candidate unit " << unit.GetKind() << " at " << Self->TabletID());
+
+ auto op = unit.FindReadyOperation();
+ if (op) {
+ LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Found ready operation " << *op << " in " << unit.GetKind()
+ << " unit at " << Self->TabletID());
+ if (dryRun)
+ NextActiveOp = op;
+ return op;
+ }
+
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Unit " << unit.GetKind() << " has no ready operations at "
+ << Self->TabletID());
+
+ checkedUnits.insert(unit.GetKind());
+ CandidateUnits.erase(*CandidateUnits.rbegin());
+ }
+
+ // If candidates have no ready operation then check all other
+ // running and waiting operations. Also check plan queue.
+ // Such checks are done to find issues with proper candidates
+ // identification. In release mode error is logged, in debug
+ // mode just fail.
+ for (auto &pr : ActiveOps) {
+ const TOperation::TPtr &op = pr.second;
+ Y_VERIFY(!op->IsExecutionPlanFinished());
+
+ if (checkedOps.contains(op) || op->IsInProgress())
+ continue;
+
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Check active operation " << *op << " at " << Self->TabletID()
+ << " on unit " << op->GetCurrentUnit());
+
+ bool ready = IsReadyOp(op);
+
+ Y_VERIFY_DEBUG_S(!ready, "Found unexpected ready active operation " << *op
+ << " in " << op->GetCurrentUnit());
+
+ if (ready) {
+ LOG_ERROR_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "TryGetExistingTx at " << Self->TabletID() << " return waiting " << *op);
+ if (dryRun)
+ NextActiveOp = op;
+ return op;
+ }
+
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Active operation " << *op << " at " << Self->TabletID()
+ << " is not ready for " << op->GetCurrentUnit());
+ }
+
+ if (!checkedUnits.contains(EExecutionUnitKind::PlanQueue)) {
+ auto &unit = GetExecutionUnit(EExecutionUnitKind::PlanQueue);
+
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Check unit " << unit.GetKind() << " at " << Self->TabletID());
+
+ auto op = unit.FindReadyOperation();
+
+ Y_VERIFY_DEBUG_S(!op, "Found unexpected ready operation in plan queue " << *op
+ << " at " << Self->TabletID());
+
+ if (op) {
+ LOG_ERROR_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Found ready operation " << *op << " in " << unit.GetKind()
+ << " unit at " << Self->TabletID());
+ if (dryRun)
+ NextActiveOp = op;
+ return op;
+ }
+
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Unit " << unit.GetKind() << " has no ready operations at "
+ << Self->TabletID());
+ }
+
return nullptr;
}
TOperation::TPtr TPipeline::GetNextPlannedOp(ui64 step, ui64 txId) const {
- TOperation::TPtr op;
- while (!op) {
+ TOperation::TPtr op;
+ while (!op) {
if (!Self->TransQueue.GetNextPlannedTxId(step, txId))
- return nullptr;
+ return nullptr;
- op = Self->TransQueue.FindTxInFly(txId);
+ op = Self->TransQueue.FindTxInFly(txId);
}
- return op;
-}
-
-void TPipeline::AddActiveOp(TOperation::TPtr op)
-{
+ return op;
+}
+
+void TPipeline::AddActiveOp(TOperation::TPtr op)
+{
if (op->IsImmediate()) {
- AddImmediateOp(op);
+ AddImmediateOp(op);
} else {
auto pr = ActivePlannedOps.emplace(op->GetStepOrder(), op);
Y_VERIFY(pr.second, "AddActiveOp must never add duplicate transactions");
@@ -402,35 +402,35 @@ void TPipeline::AddActiveOp(TOperation::TPtr op)
}
}
- if (op->IsSchemeTx()) {
- if (!SchemaTx)
- SchemaTx = Self->TransQueue.FindSchemaTx(op->GetTxId());
- Y_VERIFY_S(SchemaTx && SchemaTx->TxId == op->GetTxId(),
- "Multiple schema operations at " << Self->TabletID() <<
- ": got " << op->GetKind() << " operation " << *op
- << " with " << SchemaTx->Type << " operation ["
- << SchemaTx->PlanStep << ":" << SchemaTx->TxId
- << "] already on shard");
- }
-
- auto inserted = ActiveOps.emplace(op->GetStepOrder(), op);
- Y_VERIFY_S(inserted.second,
- " cannot activate " << op->GetKind() << " operation " << *op << " at "
- << Self->TabletID() << " because it is already active");
-
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Activated operation " << *op << " at " << Self->TabletID());
-
- AddCandidateUnit(EExecutionUnitKind::PlanQueue);
-}
-
-void TPipeline::RemoveActiveOp(TOperation::TPtr op)
-{
+ if (op->IsSchemeTx()) {
+ if (!SchemaTx)
+ SchemaTx = Self->TransQueue.FindSchemaTx(op->GetTxId());
+ Y_VERIFY_S(SchemaTx && SchemaTx->TxId == op->GetTxId(),
+ "Multiple schema operations at " << Self->TabletID() <<
+ ": got " << op->GetKind() << " operation " << *op
+ << " with " << SchemaTx->Type << " operation ["
+ << SchemaTx->PlanStep << ":" << SchemaTx->TxId
+ << "] already on shard");
+ }
+
+ auto inserted = ActiveOps.emplace(op->GetStepOrder(), op);
+ Y_VERIFY_S(inserted.second,
+ " cannot activate " << op->GetKind() << " operation " << *op << " at "
+ << Self->TabletID() << " because it is already active");
+
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Activated operation " << *op << " at " << Self->TabletID());
+
+ AddCandidateUnit(EExecutionUnitKind::PlanQueue);
+}
+
+void TPipeline::RemoveActiveOp(TOperation::TPtr op)
+{
UnblockNormalDependencies(op);
UnblockSpecialDependencies(op);
-
+
if (op->IsImmediate()) {
- RemoveImmediateOp(op);
+ RemoveImmediateOp(op);
} else {
auto it = ActivePlannedOps.find(op->GetStepOrder());
Y_VERIFY(it != ActivePlannedOps.end());
@@ -443,10 +443,10 @@ void TPipeline::RemoveActiveOp(TOperation::TPtr op)
}
ActivePlannedOps.erase(it);
}
- ActiveOps.erase(op->GetStepOrder());
- RemoveExecuteBlocker(op);
-
- AddCandidateUnit(EExecutionUnitKind::PlanQueue);
+ ActiveOps.erase(op->GetStepOrder());
+ RemoveExecuteBlocker(op);
+
+ AddCandidateUnit(EExecutionUnitKind::PlanQueue);
}
void TPipeline::UnblockNormalDependencies(const TOperation::TPtr &op)
@@ -485,274 +485,274 @@ void TPipeline::UnblockSpecialDependencies(const TOperation::TPtr &op)
op->ClearSpecialDependencies();
}
-TOperation::TPtr TPipeline::FindOp(ui64 txId)
-{
- if (Self->TransQueue.Has(txId))
- return Self->TransQueue.FindTxInFly(txId);
-
- if (ImmediateOps.contains(txId))
- return ImmediateOps.at(txId);
-
- return nullptr;
-}
-
-TOperation::TPtr TPipeline::GetActiveOp(ui64 txId)
-{
- TOperation::TPtr op = FindOp(txId);
- if (op && (op->IsCompleted() || op->IsExecuting() || op->IsWaitingDependencies()))
- return op;
- return nullptr;
-}
-
-bool TPipeline::LoadTxDetails(TTransactionContext &txc,
- const TActorContext &ctx,
- TActiveTransaction::TPtr tx)
-{
- auto it = DataTxCache.find(tx->GetTxId());
- if (it != DataTxCache.end()) {
- it->second->SetStep(tx->GetStep());
- tx->FillTxData(it->second);
- // Remove tx from cache.
- ForgetTx(tx->GetTxId());
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "LoadTxDetails at " << Self->TabletID() << " got data tx from cache "
- << tx->GetStep() << ":" << tx->GetTxId());
- } else {
- NIceDb::TNiceDb db(txc.DB);
+TOperation::TPtr TPipeline::FindOp(ui64 txId)
+{
+ if (Self->TransQueue.Has(txId))
+ return Self->TransQueue.FindTxInFly(txId);
+
+ if (ImmediateOps.contains(txId))
+ return ImmediateOps.at(txId);
+
+ return nullptr;
+}
+
+TOperation::TPtr TPipeline::GetActiveOp(ui64 txId)
+{
+ TOperation::TPtr op = FindOp(txId);
+ if (op && (op->IsCompleted() || op->IsExecuting() || op->IsWaitingDependencies()))
+ return op;
+ return nullptr;
+}
+
+bool TPipeline::LoadTxDetails(TTransactionContext &txc,
+ const TActorContext &ctx,
+ TActiveTransaction::TPtr tx)
+{
+ auto it = DataTxCache.find(tx->GetTxId());
+ if (it != DataTxCache.end()) {
+ it->second->SetStep(tx->GetStep());
+ tx->FillTxData(it->second);
+ // Remove tx from cache.
+ ForgetTx(tx->GetTxId());
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "LoadTxDetails at " << Self->TabletID() << " got data tx from cache "
+ << tx->GetStep() << ":" << tx->GetTxId());
+ } else {
+ NIceDb::TNiceDb db(txc.DB);
TActorId target;
- TString txBody;
- TVector<TSysTables::TLocksTable::TLock> locks;
- ui64 artifactFlags = 0;
- bool ok = Self->TransQueue.LoadTxDetails(db, tx->GetTxId(), target,
- txBody, locks, artifactFlags);
- if (!ok)
- return false;
-
- // Check we have enough memory to parse tx.
+ TString txBody;
+ TVector<TSysTables::TLocksTable::TLock> locks;
+ ui64 artifactFlags = 0;
+ bool ok = Self->TransQueue.LoadTxDetails(db, tx->GetTxId(), target,
+ txBody, locks, artifactFlags);
+ if (!ok)
+ return false;
+
+ // Check we have enough memory to parse tx.
ui64 requiredMem = txBody.size() * 10;
- if (MaybeRequestMoreTxMemory(requiredMem, txc))
- return false;
-
- tx->FillTxData(Self, txc, ctx, target, txBody,
- std::move(locks), artifactFlags);
-
- ui32 keysCount = 0;
- //if (Config.LimitActiveTx > 1)
- keysCount = tx->ExtractKeys();
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "LoadTxDetails at " << Self->TabletID() << " loaded tx from db "
- << tx->GetStep() << ":" << tx->GetTxId() << " keys extracted: "
- << keysCount);
- }
-
- return true;
-}
-
-void TPipeline::DeactivateOp(TOperation::TPtr op,
- TTransactionContext& txc,
- const TActorContext &ctx)
-{
- op->SetCompletedFlag();
- op->ResetExecutingFlag();
- op->SetCompletedAt(TAppData::TimeProvider->Now());
+ if (MaybeRequestMoreTxMemory(requiredMem, txc))
+ return false;
+
+ tx->FillTxData(Self, txc, ctx, target, txBody,
+ std::move(locks), artifactFlags);
+
+ ui32 keysCount = 0;
+ //if (Config.LimitActiveTx > 1)
+ keysCount = tx->ExtractKeys();
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "LoadTxDetails at " << Self->TabletID() << " loaded tx from db "
+ << tx->GetStep() << ":" << tx->GetTxId() << " keys extracted: "
+ << keysCount);
+ }
+
+ return true;
+}
+
+void TPipeline::DeactivateOp(TOperation::TPtr op,
+ TTransactionContext& txc,
+ const TActorContext &ctx)
+{
+ op->SetCompletedFlag();
+ op->ResetExecutingFlag();
+ op->SetCompletedAt(TAppData::TimeProvider->Now());
UnblockNormalDependencies(op);
UnblockSpecialDependencies(op);
-
- AddCandidateUnit(EExecutionUnitKind::PlanQueue);
- CompleteTx(op, txc, ctx);
+ AddCandidateUnit(EExecutionUnitKind::PlanQueue);
+
+ CompleteTx(op, txc, ctx);
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- if (tx) {
- TValidatedDataTx::TPtr dataTx = tx->GetDataTx();
- // TODO: move flag computation into operation build phase?
- if (Config.DirtyOnline() && dataTx) {
- bool preventDirty = dataTx->LockTxId() && !dataTx->ReadOnly();
- if (!preventDirty)
- op->SetForceDirtyFlag();
- }
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ if (tx) {
+ TValidatedDataTx::TPtr dataTx = tx->GetDataTx();
+ // TODO: move flag computation into operation build phase?
+ if (Config.DirtyOnline() && dataTx) {
+ bool preventDirty = dataTx->LockTxId() && !dataTx->ReadOnly();
+ if (!preventDirty)
+ op->SetForceDirtyFlag();
+ }
}
- op->Deactivate();
+ op->Deactivate();
}
-bool TPipeline::SaveInReadSet(const TEvTxProcessing::TEvReadSet &rs,
- THolder<IEventHandle> &ack,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
+bool TPipeline::SaveInReadSet(const TEvTxProcessing::TEvReadSet &rs,
+ THolder<IEventHandle> &ack,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
ui64 step = rs.Record.GetStep();
ui64 txId = rs.Record.GetTxId();
if (step <= OutdatedReadSetStep()) {
- LOG_NOTICE(ctx, NKikimrServices::TX_DATASHARD,
- "Outdated readset for %" PRIu64 ":%" PRIu64 " at %" PRIu64,
- step, txId, Self->TabletID());
+ LOG_NOTICE(ctx, NKikimrServices::TX_DATASHARD,
+ "Outdated readset for %" PRIu64 ":%" PRIu64 " at %" PRIu64,
+ step, txId, Self->TabletID());
return true;
}
- // If there is no required tx then we cannot assume it is finished.
+ // If there is no required tx then we cannot assume it is finished.
// There are cases when tablet is not leader any more but is not dead
- // yet and can receive RS for tx executed in another generation of this
- // tablet. In this case this tablet should be dead soon and source will
- // connect to the correct tablet and resend RS.
- // But it's also possible tx was executed on this tablet but its step
- // is not finished yet (e.g. due to out-of-order). In this case we should
- // store ack and send it after its step become outdated.
+ // yet and can receive RS for tx executed in another generation of this
+ // tablet. In this case this tablet should be dead soon and source will
+ // connect to the correct tablet and resend RS.
+ // But it's also possible tx was executed on this tablet but its step
+ // is not finished yet (e.g. due to out-of-order). In this case we should
+ // store ack and send it after its step become outdated.
if (!Self->TransQueue.Has(txId)) {
LOG_NOTICE(ctx, NKikimrServices::TX_DATASHARD,
- "Unexpected readset in state %" PRIu32 " for %" PRIu64 ":%" PRIu64 " at %" PRIu64,
- Self->State, step, txId, Self->TabletID());
- DelayedAcks[TStepOrder(step, txId)] = std::move(ack);
- return false;
- }
-
- TOperation::TPtr op = GetActiveOp(txId);
- if (op) {
- // If input read sets are not loaded yet then
- // it will be added at load.
- if (op->HasLoadedInRSFlag())
- op->AddInReadSet(rs.Record);
+ "Unexpected readset in state %" PRIu32 " for %" PRIu64 ":%" PRIu64 " at %" PRIu64,
+ Self->State, step, txId, Self->TabletID());
+ DelayedAcks[TStepOrder(step, txId)] = std::move(ack);
+ return false;
+ }
+
+ TOperation::TPtr op = GetActiveOp(txId);
+ if (op) {
+ // If input read sets are not loaded yet then
+ // it will be added at load.
+ if (op->HasLoadedInRSFlag())
+ op->AddInReadSet(rs.Record);
op->AddDelayedAck(THolder(ack.Release()));
- op->AddDelayedInReadSet(rs.Record);
+ op->AddDelayedInReadSet(rs.Record);
- AddCandidateOp(op);
- Self->PlanQueue.Progress(ctx);
+ AddCandidateOp(op);
+ Self->PlanQueue.Progress(ctx);
return false;
}
- SaveInReadSet(rs, txc);
-
+ SaveInReadSet(rs, txc);
+
return true;
}
-void TPipeline::SaveInReadSet(const TEvTxProcessing::TEvReadSet &rs,
- TTransactionContext &txc)
-{
+void TPipeline::SaveInReadSet(const TEvTxProcessing::TEvReadSet &rs,
+ TTransactionContext &txc)
+{
using Schema = TDataShard::Schema;
- auto& pb = rs.Record;
- ui64 txId = pb.GetTxId();
- ui64 origin = pb.GetTabletProducer();
- ui64 from = pb.GetTabletSource();
- ui64 to = pb.GetTabletDest();
-
- TString coverageList;
- if (pb.HasBalanceTrackList()) {
- coverageList = pb.GetBalanceTrackList().SerializeAsString();
- }
-
- LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Save read set at " << Self->TabletID() << " for " << txId
- << " origin=" << origin << " from=" << from << " to=" << to);
-
- NIceDb::TNiceDb db(txc.DB);
- db.Table<Schema::InReadSets>().Key(txId, origin, from, to).Update(
- NIceDb::TUpdate<Schema::InReadSets::Body>(pb.GetReadSet()),
- NIceDb::TUpdate<Schema::InReadSets::BalanceTrackList>(coverageList));
-}
-
-bool TPipeline::LoadInReadSets(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
+ auto& pb = rs.Record;
+ ui64 txId = pb.GetTxId();
+ ui64 origin = pb.GetTabletProducer();
+ ui64 from = pb.GetTabletSource();
+ ui64 to = pb.GetTabletDest();
+
+ TString coverageList;
+ if (pb.HasBalanceTrackList()) {
+ coverageList = pb.GetBalanceTrackList().SerializeAsString();
+ }
+
+ LOG_DEBUG_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Save read set at " << Self->TabletID() << " for " << txId
+ << " origin=" << origin << " from=" << from << " to=" << to);
+
+ NIceDb::TNiceDb db(txc.DB);
+ db.Table<Schema::InReadSets>().Key(txId, origin, from, to).Update(
+ NIceDb::TUpdate<Schema::InReadSets::Body>(pb.GetReadSet()),
+ NIceDb::TUpdate<Schema::InReadSets::BalanceTrackList>(coverageList));
+}
+
+bool TPipeline::LoadInReadSets(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
using Schema = TDataShard::Schema;
-
- // No incoming read sets are expected
- if (op->InReadSets().empty()) {
- op->SetLoadedInRSFlag();
- return true;
- }
-
- // Note that InReadSets holds an empty body for every
- // origin from which an incoming read set is expected
- op->InitRemainReadSets();
-
- // Create coverage builders to handle split/merge
- // of read set origins (datashards)
- for (const auto &kv : op->InReadSets()) {
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Prepare for loading readset for " << *op << " at " << Self->TabletID()
- << " source=" << kv.first.first << " target=" << kv.first.second);
- op->CoverageBuilders()[kv.first].reset(new TBalanceCoverageBuilder());
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Expected " << op->GetRemainReadSets() << " readsets for " << *op
- << " at " << Self->TabletID());
-
- NIceDb::TNiceDb db(txc.DB);
-
- THashSet<TReadSetKey> loadedReadSets;
-
- // Iterate over (txId, ...) keys
- // TODO[serxa]: this should be Range(txId) but it is not working right now
- auto rowset = db.Table<Schema::InReadSets>().GreaterOrEqual(op->GetTxId(), 0, 0, 0).Select();
- if (!rowset.IsReady())
- return false;
- while (!rowset.EndOfSet()) {
- // Check for the end of range
- if (rowset.GetValue<Schema::InReadSets::TxId>() != op->GetTxId())
- break;
-
- // Get row data
- ui64 origin = rowset.GetValue<Schema::InReadSets::Origin>();
- ui64 from = rowset.GetValue<Schema::InReadSets::From>();
- ui64 to = rowset.GetValue<Schema::InReadSets::To>();
- TString body = rowset.GetValue<Schema::InReadSets::Body>();
- TString track = rowset.GetValue<Schema::InReadSets::BalanceTrackList>();
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Read readset for " << *op << " at " << Self->TabletID()
- << " from DB origin=" << origin << " from=" << from
- << " to=" << to);
-
- // Parse track
- NKikimrTx::TBalanceTrackList balanceTrackList;
- bool success = balanceTrackList.ParseFromArray(track.data(), track.size());
- Y_VERIFY(success);
-
- TReadSetKey rsKey(op->GetTxId(), origin, from, to);
- loadedReadSets.insert(rsKey);
- op->AddInReadSet(rsKey, balanceTrackList, body);
-
- if (!rowset.Next())
- return false;
- }
-
- // Add read sets not stored to DB.
- for (auto &rs : op->DelayedInReadSets()) {
- if (! loadedReadSets.contains(TReadSetKey(rs)))
- op->AddInReadSet(rs);
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Remain " << op->GetRemainReadSets() << " read sets for " << *op
- << " at " << Self->TabletID());
-
- op->SetLoadedInRSFlag();
-
- return true;
-}
-
-void TPipeline::RemoveInReadSets(TOperation::TPtr op,
- NIceDb::TNiceDb &db)
-{
+
+ // No incoming read sets are expected
+ if (op->InReadSets().empty()) {
+ op->SetLoadedInRSFlag();
+ return true;
+ }
+
+ // Note that InReadSets holds an empty body for every
+ // origin from which an incoming read set is expected
+ op->InitRemainReadSets();
+
+ // Create coverage builders to handle split/merge
+ // of read set origins (datashards)
+ for (const auto &kv : op->InReadSets()) {
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Prepare for loading readset for " << *op << " at " << Self->TabletID()
+ << " source=" << kv.first.first << " target=" << kv.first.second);
+ op->CoverageBuilders()[kv.first].reset(new TBalanceCoverageBuilder());
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Expected " << op->GetRemainReadSets() << " readsets for " << *op
+ << " at " << Self->TabletID());
+
+ NIceDb::TNiceDb db(txc.DB);
+
+ THashSet<TReadSetKey> loadedReadSets;
+
+ // Iterate over (txId, ...) keys
+ // TODO[serxa]: this should be Range(txId) but it is not working right now
+ auto rowset = db.Table<Schema::InReadSets>().GreaterOrEqual(op->GetTxId(), 0, 0, 0).Select();
+ if (!rowset.IsReady())
+ return false;
+ while (!rowset.EndOfSet()) {
+ // Check for the end of range
+ if (rowset.GetValue<Schema::InReadSets::TxId>() != op->GetTxId())
+ break;
+
+ // Get row data
+ ui64 origin = rowset.GetValue<Schema::InReadSets::Origin>();
+ ui64 from = rowset.GetValue<Schema::InReadSets::From>();
+ ui64 to = rowset.GetValue<Schema::InReadSets::To>();
+ TString body = rowset.GetValue<Schema::InReadSets::Body>();
+ TString track = rowset.GetValue<Schema::InReadSets::BalanceTrackList>();
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Read readset for " << *op << " at " << Self->TabletID()
+ << " from DB origin=" << origin << " from=" << from
+ << " to=" << to);
+
+ // Parse track
+ NKikimrTx::TBalanceTrackList balanceTrackList;
+ bool success = balanceTrackList.ParseFromArray(track.data(), track.size());
+ Y_VERIFY(success);
+
+ TReadSetKey rsKey(op->GetTxId(), origin, from, to);
+ loadedReadSets.insert(rsKey);
+ op->AddInReadSet(rsKey, balanceTrackList, body);
+
+ if (!rowset.Next())
+ return false;
+ }
+
+ // Add read sets not stored to DB.
+ for (auto &rs : op->DelayedInReadSets()) {
+ if (! loadedReadSets.contains(TReadSetKey(rs)))
+ op->AddInReadSet(rs);
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Remain " << op->GetRemainReadSets() << " read sets for " << *op
+ << " at " << Self->TabletID());
+
+ op->SetLoadedInRSFlag();
+
+ return true;
+}
+
+void TPipeline::RemoveInReadSets(TOperation::TPtr op,
+ NIceDb::TNiceDb &db)
+{
using Schema = TDataShard::Schema;
-
- for (auto& rs : op->InReadSets()) {
- ui64 from = rs.first.first;
- ui64 to = rs.first.second;
- for (auto& rsdata: rs.second) {
- ui64 origin = rsdata.Origin;
- db.Table<Schema::InReadSets>().Key(op->GetTxId(), origin, from, to).Delete();
- }
- }
-}
-
+
+ for (auto& rs : op->InReadSets()) {
+ ui64 from = rs.first.first;
+ ui64 to = rs.first.second;
+ for (auto& rsdata: rs.second) {
+ ui64 origin = rsdata.Origin;
+ db.Table<Schema::InReadSets>().Key(op->GetTxId(), origin, from, to).Delete();
+ }
+ }
+}
+
void TPipeline::RemoveTx(TStepOrder stepTxId) {
// Optimization: faster Alter. Do not wait if no TxInFly.
// Can't persist KeepSchemaStep here. TxInFly must be restored on init.
@@ -785,10 +785,10 @@ void TPipeline::CompleteSchemaTx(NIceDb::TNiceDb& db, ui64 txId) {
Self->TransQueue.RemoveSchemaOperation(db, txId);
}
-bool TPipeline::PlanTxs(ui64 step,
- TVector<ui64> &txIds,
- TTransactionContext &txc,
- const TActorContext &ctx) {
+bool TPipeline::PlanTxs(ui64 step,
+ TVector<ui64> &txIds,
+ TTransactionContext &txc,
+ const TActorContext &ctx) {
Sort(txIds.begin(), txIds.end());
// check uniqueness
for (ui32 i = 1; i < txIds.size(); ++i) {
@@ -800,7 +800,7 @@ bool TPipeline::PlanTxs(ui64 step,
ui64 lastTxId = txIds.empty()? 0: txIds.back();
- NIceDb::TNiceDb db(txc.DB);
+ NIceDb::TNiceDb db(txc.DB);
SaveLastPlannedTx(db, TStepOrder(step, lastTxId));
for (ui64 txId : txIds) {
if (SchemaTx && SchemaTx->TxId == txId && SchemaTx->MinStep > step) {
@@ -812,15 +812,15 @@ bool TPipeline::PlanTxs(ui64 step,
Y_VERIFY_DEBUG_S(SchemaTx->MinStep <= step, explain);
LOG_ALERT_S(ctx, NKikimrServices::TX_DATASHARD, explain);
}
-
- auto op = Self->TransQueue.FindTxInFly(txId);
- if (!op) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Ignoring PlanStep " << step << " for unknown txId "
- << txId << " at tablet " << Self->TabletID());
- continue;
- }
-
+
+ auto op = Self->TransQueue.FindTxInFly(txId);
+ if (!op) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Ignoring PlanStep " << step << " for unknown txId "
+ << txId << " at tablet " << Self->TabletID());
+ continue;
+ }
+
if (op->GetStep() && op->GetStep() != step) {
LOG_WARN_S(ctx, NKikimrServices::TX_DATASHARD,
"Ignoring PlanStep " << step << " for txId " << txId
@@ -829,30 +829,30 @@ bool TPipeline::PlanTxs(ui64 step,
continue;
}
- Self->TransQueue.PlanTx(op, step, db);
- // Execute WaitForPlan unit here to correctly compute operation
- // profile. Otherwise profile might count time spent in plan
- // queue as 'wait for plan' time.
- if (op->GetCurrentUnit() == EExecutionUnitKind::WaitForPlan) {
- auto status = RunExecutionUnit(op, txc, ctx);
- Y_VERIFY(status == EExecutionStatus::Executed);
- }
- }
-
- AddCandidateUnit(EExecutionUnitKind::PlanQueue);
+ Self->TransQueue.PlanTx(op, step, db);
+ // Execute WaitForPlan unit here to correctly compute operation
+ // profile. Otherwise profile might count time spent in plan
+ // queue as 'wait for plan' time.
+ if (op->GetCurrentUnit() == EExecutionUnitKind::WaitForPlan) {
+ auto status = RunExecutionUnit(op, txc, ctx);
+ Y_VERIFY(status == EExecutionStatus::Executed);
+ }
+ }
+
+ AddCandidateUnit(EExecutionUnitKind::PlanQueue);
MaybeActivateWaitingSchemeOps(ctx);
ActivateWaitingTxOps(ctx);
-
+
return true;
}
-void TPipeline::MarkOpAsUsingSnapshot(TOperation::TPtr op)
-{
+void TPipeline::MarkOpAsUsingSnapshot(TOperation::TPtr op)
+{
UnblockNormalDependencies(op);
-
- op->SetUsingSnapshotFlag();
-}
-
+
+ op->SetUsingSnapshotFlag();
+}
+
void TPipeline::SaveLastPlannedTx(NIceDb::TNiceDb& db, TStepOrder stepTxId) {
using Schema = TDataShard::Schema;
@@ -862,21 +862,21 @@ void TPipeline::SaveLastPlannedTx(NIceDb::TNiceDb& db, TStepOrder stepTxId) {
}
void TPipeline::CompleteTx(const TOperation::TPtr op, TTransactionContext& txc, const TActorContext &ctx) {
- NIceDb::TNiceDb db(txc.DB);
+ NIceDb::TNiceDb db(txc.DB);
using Schema = TDataShard::Schema;
- if (UtmostCompleteTx < op->GetStepOrder())
- UtmostCompleteTx = op->GetStepOrder();
+ if (UtmostCompleteTx < op->GetStepOrder())
+ UtmostCompleteTx = op->GetStepOrder();
if (Self->IsMvccEnabled()) {
MarkPlannedLogicallyCompleteUpTo(TRowVersion(op->GetStep(), op->GetTxId()), txc);
Self->PromoteCompleteEdge(op.Get(), txc);
}
- Y_VERIFY(ActivePlannedOps);
- if (ActivePlannedOps.begin()->first == op->GetStepOrder()) {
- LastCompleteTx = op->GetStepOrder();
- if (LastCompleteTx < UtmostCompleteTx && ActivePlannedOps.size() == 1) {
+ Y_VERIFY(ActivePlannedOps);
+ if (ActivePlannedOps.begin()->first == op->GetStepOrder()) {
+ LastCompleteTx = op->GetStepOrder();
+ if (LastCompleteTx < UtmostCompleteTx && ActivePlannedOps.size() == 1) {
LastCompleteTx = UtmostCompleteTx;
}
Self->PersistSys(db, Schema::Sys_LastCompleteStep, LastCompleteTx.Step);
@@ -885,21 +885,21 @@ void TPipeline::CompleteTx(const TOperation::TPtr op, TTransactionContext& txc,
Self->IncCounter(COUNTER_TX_REORDERED);
}
- Self->TransQueue.RemoveTx(db, *op);
- RemoveInReadSets(op, db);
-
- while (!DelayedAcks.empty()
+ Self->TransQueue.RemoveTx(db, *op);
+ RemoveInReadSets(op, db);
+
+ while (!DelayedAcks.empty()
&& DelayedAcks.begin()->first.Step <= OutdatedReadSetStep())
{
- auto &pr = *DelayedAcks.begin();
-
- LOG_NOTICE(ctx, NKikimrServices::TX_DATASHARD,
- "Send outdated delayed readset ack for %" PRIu64 ":%" PRIu64 " at %" PRIu64,
- pr.first.Step, pr.first.TxId, Self->TabletID());
-
- ctx.Send(pr.second.Release());
- DelayedAcks.erase(DelayedAcks.begin());
- }
+ auto &pr = *DelayedAcks.begin();
+
+ LOG_NOTICE(ctx, NKikimrServices::TX_DATASHARD,
+ "Send outdated delayed readset ack for %" PRIu64 ":%" PRIu64 " at %" PRIu64,
+ pr.first.Step, pr.first.TxId, Self->TabletID());
+
+ ctx.Send(pr.second.Release());
+ DelayedAcks.erase(DelayedAcks.begin());
+ }
// FIXME: probably not needed, (txinfly - planned) does not change on completion
MaybeActivateWaitingSchemeOps(ctx);
@@ -914,55 +914,55 @@ void TPipeline::PreserveSchema(NIceDb::TNiceDb& db, ui64 step) {
}
}
-bool TPipeline::AssignPlanInterval(TOperation::TPtr op)
-{
+bool TPipeline::AssignPlanInterval(TOperation::TPtr op)
+{
// TODO: it's possible to plan them until Alter minStep
// TODO: it's possible to plan them if both old and new schemas allow tx
- // TODO: use propose blockers and DF_BLOCK_PROPOSE to block shard with scheme tx
- if (HasSchemaOperation() && !SchemaTx->IsReadOnly())
+ // TODO: use propose blockers and DF_BLOCK_PROPOSE to block shard with scheme tx
+ if (HasSchemaOperation() && !SchemaTx->IsReadOnly())
return false;
if (HasWaitingSchemeOps())
return false;
op->SetMinStep(AllowedDataStep());
- op->SetMaxStep(op->GetMinStep() + Self->DefaultTxStepDeadline());
-
+ op->SetMaxStep(op->GetMinStep() + Self->DefaultTxStepDeadline());
+
return true;
}
ui64 TPipeline::OutdatedReadSetStep() const
-{
- // If plan is not empty then step previous to the
- // first one in plan is outdated.
- if (Self->TransQueue.TxPlanned())
- return Self->TransQueue.GetPlan().begin()->Step - 1;
-
- // If there is no tx in transaction queue then the last
- // completed tx has outdated step.
- return LastCompleteTx.Step;
-}
-
+{
+ // If plan is not empty then step previous to the
+ // first one in plan is outdated.
+ if (Self->TransQueue.TxPlanned())
+ return Self->TransQueue.GetPlan().begin()->Step - 1;
+
+ // If there is no tx in transaction queue then the last
+ // completed tx has outdated step.
+ return LastCompleteTx.Step;
+}
+
ui64 TPipeline::OutdatedCleanupStep() const
{
return LastPlannedTx.Step;
}
ui64 TPipeline::GetTxCompleteLag(EOperationKind kind, ui64 timecastStep) const
-{
- auto &plan = Self->TransQueue.GetPlan(kind);
- if (plan.empty())
- return 0;
-
- ui64 currentStep = plan.begin()->Step;
- if (timecastStep > currentStep)
- return timecastStep - currentStep;
-
- return 0;
-}
-
+{
+ auto &plan = Self->TransQueue.GetPlan(kind);
+ if (plan.empty())
+ return 0;
+
+ ui64 currentStep = plan.begin()->Step;
+ if (timecastStep > currentStep)
+ return timecastStep - currentStep;
+
+ return 0;
+}
+
ui64 TPipeline::GetDataTxCompleteLag(ui64 timecastStep) const
-{
+{
return GetTxCompleteLag(EOperationKind::DataTx, timecastStep);
}
@@ -973,10 +973,10 @@ ui64 TPipeline::GetScanTxCompleteLag(ui64 timecastStep) const
void TPipeline::ProposeTx(TOperation::TPtr op, const TStringBuf &txBody, TTransactionContext &txc, const TActorContext &ctx)
{
- NIceDb::TNiceDb db(txc.DB);
- SetProposed(op->GetTxId(), op->GetTarget());
- PreserveSchema(db, op->GetMaxStep());
- Self->TransQueue.ProposeTx(db, op, op->GetTarget(), txBody);
+ NIceDb::TNiceDb db(txc.DB);
+ SetProposed(op->GetTxId(), op->GetTarget());
+ PreserveSchema(db, op->GetMaxStep());
+ Self->TransQueue.ProposeTx(db, op, op->GetTarget(), txBody);
if (Self->IsStopping() && op->GetTarget()) {
// Send notification if we prepared a tx while shard was stopping
auto notify = MakeHolder<TEvDataShard::TEvProposeTransactionRestart>(
@@ -1006,9 +1006,9 @@ void TPipeline::UpdateSchemeTxBody(ui64 txId, const TStringBuf &txBody, TTransac
}
void TPipeline::ProposeSchemeTx(const TSchemaOperation &op,
- TTransactionContext &txc)
-{
- NIceDb::TNiceDb db(txc.DB);
+ TTransactionContext &txc)
+{
+ NIceDb::TNiceDb db(txc.DB);
Self->TransQueue.ProposeSchemaTx(db, op);
}
@@ -1050,16 +1050,16 @@ ECleanupStatus TPipeline::CleanupOutdated(NIceDb::TNiceDb& db, const TActorConte
return status;
}
-ui64 TPipeline::PlannedTxInFly() const
-{
- return Self->TransQueue.TxInFly();
-}
-
-const TSet<TStepOrder> &TPipeline::GetPlan() const
-{
- return Self->TransQueue.GetPlan();
-}
-
+ui64 TPipeline::PlannedTxInFly() const
+{
+ return Self->TransQueue.TxInFly();
+}
+
+const TSet<TStepOrder> &TPipeline::GetPlan() const
+{
+ return Self->TransQueue.GetPlan();
+}
+
bool TPipeline::HasProposeDelayers() const
{
return Self->TransQueue.HasProposeDelayers();
@@ -1070,33 +1070,33 @@ bool TPipeline::RemoveProposeDelayer(ui64 txId)
return Self->TransQueue.RemoveProposeDelayer(txId);
}
-void TPipeline::ProcessDisconnected(ui32 nodeId)
-{
- for (auto &pr : ActiveOps) {
- if (pr.second->HasProcessDisconnectsFlag()) {
+void TPipeline::ProcessDisconnected(ui32 nodeId)
+{
+ for (auto &pr : ActiveOps) {
+ if (pr.second->HasProcessDisconnectsFlag()) {
auto *ev = new TDataShard::TEvPrivate::TEvNodeDisconnected(nodeId);
- pr.second->AddInputEvent(new IEventHandle(Self->SelfId(), Self->SelfId(), ev));
- AddCandidateOp(pr.second);
- }
- }
-}
-
-ui64 TPipeline::GetInactiveTxSize() const {
- ui64 res = 0;
- return res;
-}
-
-void TPipeline::SaveForPropose(TValidatedDataTx::TPtr tx) {
- Y_VERIFY(tx && tx->TxId());
- if (DataTxCache.size() <= Config.LimitDataTxCache) {
+ pr.second->AddInputEvent(new IEventHandle(Self->SelfId(), Self->SelfId(), ev));
+ AddCandidateOp(pr.second);
+ }
+ }
+}
+
+ui64 TPipeline::GetInactiveTxSize() const {
+ ui64 res = 0;
+ return res;
+}
+
+void TPipeline::SaveForPropose(TValidatedDataTx::TPtr tx) {
+ Y_VERIFY(tx && tx->TxId());
+ if (DataTxCache.size() <= Config.LimitDataTxCache) {
ui64 quota = tx->GetTxSize() + tx->GetMemoryAllocated();
- if (Self->TryCaptureTxCache(quota)) {
- tx->SetTxCacheUsage(quota);
- DataTxCache[tx->TxId()] = tx;
- }
- }
-}
-
+ if (Self->TryCaptureTxCache(quota)) {
+ tx->SetTxCacheUsage(quota);
+ DataTxCache[tx->TxId()] = tx;
+ }
+ }
+}
+
void TPipeline::SetProposed(ui64 txId, const TActorId& actorId) {
auto it = DataTxCache.find(txId);
if (it != DataTxCache.end()) {
@@ -1105,42 +1105,42 @@ void TPipeline::SetProposed(ui64 txId, const TActorId& actorId) {
}
-void TPipeline::ForgetUnproposedTx(ui64 txId) {
- auto it = DataTxCache.find(txId);
- if (it != DataTxCache.end() && !it->second->IsProposed()) {
+void TPipeline::ForgetUnproposedTx(ui64 txId) {
+ auto it = DataTxCache.find(txId);
+ if (it != DataTxCache.end() && !it->second->IsProposed()) {
Self->ReleaseCache(*it->second);
- DataTxCache.erase(it);
- }
-}
-
-void TPipeline::ForgetTx(ui64 txId) {
- auto it = DataTxCache.find(txId);
- if (it != DataTxCache.end()) {
+ DataTxCache.erase(it);
+ }
+}
+
+void TPipeline::ForgetTx(ui64 txId) {
+ auto it = DataTxCache.find(txId);
+ if (it != DataTxCache.end()) {
Self->ReleaseCache(*it->second);
- DataTxCache.erase(it);
- }
-}
-
-TOperation::TPtr TPipeline::BuildOperation(TEvDataShard::TEvProposeTransaction::TPtr &ev,
+ DataTxCache.erase(it);
+ }
+}
+
+TOperation::TPtr TPipeline::BuildOperation(TEvDataShard::TEvProposeTransaction::TPtr &ev,
TInstant receivedAt, ui64 tieBreakerIndex,
- NTabletFlatExecutor::TTransactionContext &txc,
- const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
- Y_VERIFY(!(rec.GetFlags() & TTxFlags::PrivateFlagsMask));
- TBasicOpInfo info(rec.GetTxId(),
- static_cast<EOperationKind>(rec.GetTxKind()),
- rec.GetFlags(), 0,
+ NTabletFlatExecutor::TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+ Y_VERIFY(!(rec.GetFlags() & TTxFlags::PrivateFlagsMask));
+ TBasicOpInfo info(rec.GetTxId(),
+ static_cast<EOperationKind>(rec.GetTxKind()),
+ rec.GetFlags(), 0,
receivedAt,
tieBreakerIndex);
if (rec.HasMvccSnapshot()) {
info.SetMvccSnapshot(TRowVersion(rec.GetMvccSnapshot().GetStep(), rec.GetMvccSnapshot().GetTxId()));
}
- TActiveTransaction::TPtr tx = MakeIntrusive<TActiveTransaction>(info);
- tx->SetTarget(ev->Get()->GetSource());
- tx->SetTxBody(rec.GetTxBody());
- tx->SetCookie(ev->Cookie);
-
+ TActiveTransaction::TPtr tx = MakeIntrusive<TActiveTransaction>(info);
+ tx->SetTarget(ev->Get()->GetSource());
+ tx->SetTxBody(rec.GetTxBody());
+ tx->SetCookie(ev->Cookie);
+
auto malformed = [&](const TStringBuf txType, const TString& txBody) {
const TString error = TStringBuilder() << "Malformed " << txType << " tx"
<< " at tablet " << Self->TabletID()
@@ -1156,28 +1156,28 @@ TOperation::TPtr TPipeline::BuildOperation(TEvDataShard::TEvProposeTransaction::
LOG_ERROR_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD, error);
};
- if (tx->IsSchemeTx()) {
- Y_VERIFY(rec.HasSchemeShardId());
- Y_VERIFY(rec.HasProcessingParams());
-
- tx->SetSchemeShardId(rec.GetSchemeShardId());
+ if (tx->IsSchemeTx()) {
+ Y_VERIFY(rec.HasSchemeShardId());
+ Y_VERIFY(rec.HasProcessingParams());
+
+ tx->SetSchemeShardId(rec.GetSchemeShardId());
tx->SetSubDomainPathId(rec.GetSubDomainPathId());
- tx->SetProcessingParams(rec.GetProcessingParams());
-
- if (!tx->BuildSchemeTx()) {
+ tx->SetProcessingParams(rec.GetProcessingParams());
+
+ if (!tx->BuildSchemeTx()) {
malformed(TStringBuf("scheme"), tx->GetSchemeTx().ShortDebugString());
- return tx;
- }
-
- auto &schemeTx = tx->GetSchemeTx();
- if (schemeTx.GetReadOnly()) {
- tx->SetReadOnlyFlag();
- tx->SetGlobalReaderFlag();
+ return tx;
+ }
+
+ auto &schemeTx = tx->GetSchemeTx();
+ if (schemeTx.GetReadOnly()) {
+ tx->SetReadOnlyFlag();
+ tx->SetGlobalReaderFlag();
} else {
- tx->SetProposeBlockerFlag();
- tx->SetGlobalReaderFlag();
- tx->SetGlobalWriterFlag();
- }
+ tx->SetProposeBlockerFlag();
+ tx->SetGlobalReaderFlag();
+ tx->SetGlobalWriterFlag();
+ }
} else if (tx->IsSnapshotTx()) {
if (!tx->BuildSnapshotTx()) {
malformed(TStringBuf("snapshot"), tx->GetSnapshotTx().ShortDebugString());
@@ -1210,49 +1210,49 @@ TOperation::TPtr TPipeline::BuildOperation(TEvDataShard::TEvProposeTransaction::
}
tx->SetGlobalWriterFlag();
- } else {
- Y_VERIFY(tx->IsReadTable() || tx->IsDataTx());
- auto dataTx = tx->BuildDataTx(Self, txc, ctx);
+ } else {
+ Y_VERIFY(tx->IsReadTable() || tx->IsDataTx());
+ auto dataTx = tx->BuildDataTx(Self, txc, ctx);
if (dataTx->Ready() && (dataTx->ProgramSize() || dataTx->IsKqpDataTx()))
- dataTx->ExtractKeys(true);
-
- if (!dataTx->Ready() && !dataTx->RequirePrepare()) {
- tx->SetAbortedFlag();
+ dataTx->ExtractKeys(true);
+
+ if (!dataTx->Ready() && !dataTx->RequirePrepare()) {
+ tx->SetAbortedFlag();
tx->Result().Reset(new TEvDataShard::TEvProposeTransactionResult(rec.GetTxKind(),
- Self->TabletID(),
- tx->GetTxId(),
+ Self->TabletID(),
+ tx->GetTxId(),
NKikimrTxDataShard::TEvProposeTransactionResult::ERROR));
- tx->Result()->SetProcessError(dataTx->Code(), dataTx->GetErrors());
-
- LOG_ERROR_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Shard " << Self->TabletID() << " cannot parse tx "
- << tx->GetTxId() << ": " << dataTx->GetErrors());
-
- return tx;
- }
-
- if (dataTx->Immediate())
- tx->SetImmediateFlag();
- if (dataTx->ReadOnly())
- tx->SetReadOnlyFlag();
- if (dataTx->NeedDiagnostics())
- tx->SetNeedDiagnosticsFlag();
+ tx->Result()->SetProcessError(dataTx->Code(), dataTx->GetErrors());
+
+ LOG_ERROR_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Shard " << Self->TabletID() << " cannot parse tx "
+ << tx->GetTxId() << ": " << dataTx->GetErrors());
+
+ return tx;
+ }
+
+ if (dataTx->Immediate())
+ tx->SetImmediateFlag();
+ if (dataTx->ReadOnly())
+ tx->SetReadOnlyFlag();
+ if (dataTx->NeedDiagnostics())
+ tx->SetNeedDiagnosticsFlag();
if (dataTx->IsKqpDataTx())
- tx->SetKqpDataTransactionFlag();
+ tx->SetKqpDataTransactionFlag();
if (dataTx->IsKqpScanTx()) {
tx->SetKqpScanTransactionFlag();
// TODO: support for extracting keys in kqp scan transaction
tx->SetGlobalReaderFlag();
}
-
- // Make config checks for immediate tx.
- if (tx->IsImmediate()) {
- if (Config.NoImmediate() || (Config.ForceOnlineRW() && !dataTx->ReadOnly())) {
- LOG_INFO_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Shard " << Self->TabletID() << " force immediate tx "
- << tx->GetTxId() << " to online according to config");
- tx->SetForceOnlineFlag();
- } else if (tx->IsReadTable()) {
+
+ // Make config checks for immediate tx.
+ if (tx->IsImmediate()) {
+ if (Config.NoImmediate() || (Config.ForceOnlineRW() && !dataTx->ReadOnly())) {
+ LOG_INFO_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Shard " << Self->TabletID() << " force immediate tx "
+ << tx->GetTxId() << " to online according to config");
+ tx->SetForceOnlineFlag();
+ } else if (tx->IsReadTable()) {
// Feature flag tells us txproxy supports immediate mode for ReadTable
const bool immediateSupported = (
KIKIMR_ALLOW_READTABLE_IMMEDIATE ||
@@ -1264,16 +1264,16 @@ TOperation::TPtr TPipeline::BuildOperation(TEvDataShard::TEvProposeTransaction::
<< tx->GetTxId() << " to online because immediate ReadTable is NYI");
tx->SetForceOnlineFlag();
}
- } else if (dataTx->RequirePrepare()) {
- LOG_INFO_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Shard " << Self->TabletID() << " force immediate tx "
- << tx->GetTxId() << " to online because of SNAPSHOT_NOT_READY_YET status");
- tx->SetForceOnlineFlag();
- } else {
- if (Config.DirtyImmediate())
- tx->SetForceDirtyFlag();
- }
- }
+ } else if (dataTx->RequirePrepare()) {
+ LOG_INFO_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Shard " << Self->TabletID() << " force immediate tx "
+ << tx->GetTxId() << " to online because of SNAPSHOT_NOT_READY_YET status");
+ tx->SetForceOnlineFlag();
+ } else {
+ if (Config.DirtyImmediate())
+ tx->SetForceDirtyFlag();
+ }
+ }
if (!tx->IsMvccSnapshotRead()) {
// No op
@@ -1321,114 +1321,114 @@ TOperation::TPtr TPipeline::BuildOperation(TEvDataShard::TEvProposeTransaction::
auto snapshot = dataTx->GetKqpTransaction().GetSnapshot();
tx->SetMvccSnapshot(TRowVersion(snapshot.GetStep(), snapshot.GetTxId()));
}
- }
-
- return tx;
-}
-
+ }
+
+ return tx;
+}
+
void TPipeline::BuildDataTx(TActiveTransaction *tx, TTransactionContext &txc, const TActorContext &ctx)
-{
- auto dataTx = tx->BuildDataTx(Self, txc, ctx);
- Y_VERIFY(dataTx->Ready());
- // TODO: we should have no requirement to have keys
- // for restarted immediate tx.
+{
+ auto dataTx = tx->BuildDataTx(Self, txc, ctx);
+ Y_VERIFY(dataTx->Ready());
+ // TODO: we should have no requirement to have keys
+ // for restarted immediate tx.
if (dataTx->ProgramSize() || dataTx->IsKqpDataTx())
- dataTx->ExtractKeys(false);
-}
-
+ dataTx->ExtractKeys(false);
+}
+
EExecutionStatus TPipeline::RunExecutionUnit(TOperation::TPtr op, TTransactionContext &txc, const TActorContext &ctx)
-{
- Y_VERIFY(!op->IsExecutionPlanFinished());
- auto &unit = GetExecutionUnit(op->GetCurrentUnit());
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Trying to execute " << *op << " at " << Self->TabletID()
- << " on unit " << unit.GetKind());
-
- if (!unit.IsReadyToExecute(op)) {
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Operation " << *op << " at " << Self->TabletID()
- << " is not ready to execute on unit " << unit.GetKind());
- return EExecutionStatus::Continue;
- }
-
+{
+ Y_VERIFY(!op->IsExecutionPlanFinished());
+ auto &unit = GetExecutionUnit(op->GetCurrentUnit());
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Trying to execute " << *op << " at " << Self->TabletID()
+ << " on unit " << unit.GetKind());
+
+ if (!unit.IsReadyToExecute(op)) {
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Operation " << *op << " at " << Self->TabletID()
+ << " is not ready to execute on unit " << unit.GetKind());
+ return EExecutionStatus::Continue;
+ }
+
NCpuTime::TCpuTimer timer;
- auto status = unit.Execute(op, txc, ctx);
+ auto status = unit.Execute(op, txc, ctx);
op->AddExecutionTime(timer.GetTime());
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Execution status for " << *op << " at " << Self->TabletID()
- << " is " << status);
-
- if (status == EExecutionStatus::Executed
- || status == EExecutionStatus::ExecutedNoMoreRestarts
- || status == EExecutionStatus::DelayComplete
- || status == EExecutionStatus::DelayCompleteNoMoreRestarts)
- MoveToNextUnit(op);
-
- return status;
-}
-
-EExecutionStatus TPipeline::RunExecutionPlan(TOperation::TPtr op,
- TVector<EExecutionUnitKind> &completeList,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- bool canRestart = true;
- while (!op->IsExecutionPlanFinished()) {
- auto &unit = GetExecutionUnit(op->GetCurrentUnit());
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Trying to execute " << *op << " at " << Self->TabletID()
- << " on unit " << unit.GetKind());
-
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Execution status for " << *op << " at " << Self->TabletID()
+ << " is " << status);
+
+ if (status == EExecutionStatus::Executed
+ || status == EExecutionStatus::ExecutedNoMoreRestarts
+ || status == EExecutionStatus::DelayComplete
+ || status == EExecutionStatus::DelayCompleteNoMoreRestarts)
+ MoveToNextUnit(op);
+
+ return status;
+}
+
+EExecutionStatus TPipeline::RunExecutionPlan(TOperation::TPtr op,
+ TVector<EExecutionUnitKind> &completeList,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ bool canRestart = true;
+ while (!op->IsExecutionPlanFinished()) {
+ auto &unit = GetExecutionUnit(op->GetCurrentUnit());
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Trying to execute " << *op << " at " << Self->TabletID()
+ << " on unit " << unit.GetKind());
+
if (!unit.IsReadyToExecute(op)) {
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Operation " << *op << " at " << Self->TabletID()
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Operation " << *op << " at " << Self->TabletID()
<< " is not ready to execute on unit " << unit.GetKind());
-
- return EExecutionStatus::Continue;
- }
-
+
+ return EExecutionStatus::Continue;
+ }
+
const bool mightRestart = unit.GetExecutionMightRestart();
if (mightRestart && !canRestart) {
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Operation " << *op << " at " << Self->TabletID()
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Operation " << *op << " at " << Self->TabletID()
<< " cannot execute on unit " << unit.GetKind()
<< " because no more restarts are allowed");
-
+
return EExecutionStatus::Reschedule;
- }
-
+ }
+
NCpuTime::TCpuTimer timer;
- auto status = unit.Execute(op, txc, ctx);
+ auto status = unit.Execute(op, txc, ctx);
op->AddExecutionTime(timer.GetTime());
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Execution status for " << *op << " at " << Self->TabletID()
- << " is " << status);
-
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Execution status for " << *op << " at " << Self->TabletID()
+ << " is " << status);
+
if (status == EExecutionStatus::Executed) {
- MoveToNextUnit(op);
+ MoveToNextUnit(op);
} else if (status == EExecutionStatus::ExecutedNoMoreRestarts) {
- canRestart = false;
- MoveToNextUnit(op);
- } else if (status == EExecutionStatus::WaitComplete) {
- completeList.push_back(unit.GetKind());
- return status;
- } else if (status == EExecutionStatus::DelayComplete) {
- completeList.push_back(unit.GetKind());
- MoveToNextUnit(op);
- } else if (status == EExecutionStatus::DelayCompleteNoMoreRestarts) {
- canRestart = false;
- completeList.push_back(unit.GetKind());
- MoveToNextUnit(op);
- } else {
- Y_VERIFY_S(status == EExecutionStatus::Restart
+ canRestart = false;
+ MoveToNextUnit(op);
+ } else if (status == EExecutionStatus::WaitComplete) {
+ completeList.push_back(unit.GetKind());
+ return status;
+ } else if (status == EExecutionStatus::DelayComplete) {
+ completeList.push_back(unit.GetKind());
+ MoveToNextUnit(op);
+ } else if (status == EExecutionStatus::DelayCompleteNoMoreRestarts) {
+ canRestart = false;
+ completeList.push_back(unit.GetKind());
+ MoveToNextUnit(op);
+ } else {
+ Y_VERIFY_S(status == EExecutionStatus::Restart
|| status == EExecutionStatus::Continue
|| status == EExecutionStatus::Reschedule,
- "Unexpected execution status " << status);
+ "Unexpected execution status " << status);
if (status == EExecutionStatus::Restart) {
Y_VERIFY_DEBUG_S(mightRestart,
@@ -1441,93 +1441,93 @@ EExecutionStatus TPipeline::RunExecutionPlan(TOperation::TPtr op,
<< " when restarts are not allowed");
}
- return status;
- }
- }
-
- return EExecutionStatus::Executed;
-}
-
-void TPipeline::MoveToNextUnit(TOperation::TPtr op)
-{
- Y_VERIFY(!op->IsExecutionPlanFinished());
- GetExecutionUnit(op->GetCurrentUnit()).RemoveOperation(op);
-
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Advance execution plan for " << *op << " at " << Self->TabletID()
- << " executing on unit " << op->GetCurrentUnit());
-
- op->AdvanceExecutionPlan();
- if (!op->IsExecutionPlanFinished()) {
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Add " << *op << " at " << Self->TabletID() << " to execution unit "
- << op->GetCurrentUnit());
-
- GetExecutionUnit(op->GetCurrentUnit()).AddOperation(op);
- } else {
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Execution plan for " << *op << " at " << Self->TabletID()
- << " has finished");
- }
-}
-
-void TPipeline::RunCompleteList(TOperation::TPtr op,
- TVector<EExecutionUnitKind> &completeList,
- const TActorContext &ctx)
-{
- for (auto kind : completeList) {
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Complete execution for " << *op << " at " << Self->TabletID()
- << " on unit " << kind);
-
- TInstant start = AppData()->TimeProvider->Now();
- GetExecutionUnit(kind).Complete(op, ctx);
- op->SetCompleteTime(kind, AppData()->TimeProvider->Now() - start);
-
- if (!op->IsExecutionPlanFinished() && op->GetCurrentUnit() == kind) {
- Y_VERIFY(completeList.back() == kind);
- MoveToNextUnit(op);
- }
- }
-}
-
-void TPipeline::HoldExecutionProfile(TOperation::TPtr op)
-{
- auto &units = op->GetExecutionProfile().UnitProfiles;
- TStoredExecutionProfile profile;
- profile.OpInfo = *op;
- profile.UnitProfiles.reserve(units.size());
- for (auto unit : op->GetExecutionPlan()) {
- if (units.contains(unit)) {
- profile.UnitProfiles.emplace_back(unit, units.at(unit));
- }
- }
-
- SlowOpProfiles.emplace_back(profile);
-
- while (SlowOpProfiles.size() > Self->GetDataTxProfileBufferSize()) {
- SlowOpProfiles.pop_front();
- }
-}
-
-void TPipeline::FillStoredExecutionProfiles(NKikimrTxDataShard::TEvGetSlowOpProfilesResponse &rec) const
-{
- for (auto &profile : SlowOpProfiles) {
- auto &entry = *rec.AddProfiles();
- profile.OpInfo.Serialize(*entry.MutableBasicInfo());
-
- for (auto &pr : profile.UnitProfiles) {
- auto &unit = *entry.MutableExecutionProfile()->AddUnitProfiles();
- unit.SetUnitKind(ToString(pr.first));
- unit.SetWaitTime(pr.second.WaitTime.GetValue());
- unit.SetExecuteTime(pr.second.ExecuteTime.GetValue());
- unit.SetCommitTime(pr.second.CommitTime.GetValue());
- unit.SetCompleteTime(pr.second.CompleteTime.GetValue());
- unit.SetExecuteCount(pr.second.ExecuteCount);
- }
- }
-}
-
+ return status;
+ }
+ }
+
+ return EExecutionStatus::Executed;
+}
+
+void TPipeline::MoveToNextUnit(TOperation::TPtr op)
+{
+ Y_VERIFY(!op->IsExecutionPlanFinished());
+ GetExecutionUnit(op->GetCurrentUnit()).RemoveOperation(op);
+
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Advance execution plan for " << *op << " at " << Self->TabletID()
+ << " executing on unit " << op->GetCurrentUnit());
+
+ op->AdvanceExecutionPlan();
+ if (!op->IsExecutionPlanFinished()) {
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Add " << *op << " at " << Self->TabletID() << " to execution unit "
+ << op->GetCurrentUnit());
+
+ GetExecutionUnit(op->GetCurrentUnit()).AddOperation(op);
+ } else {
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Execution plan for " << *op << " at " << Self->TabletID()
+ << " has finished");
+ }
+}
+
+void TPipeline::RunCompleteList(TOperation::TPtr op,
+ TVector<EExecutionUnitKind> &completeList,
+ const TActorContext &ctx)
+{
+ for (auto kind : completeList) {
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Complete execution for " << *op << " at " << Self->TabletID()
+ << " on unit " << kind);
+
+ TInstant start = AppData()->TimeProvider->Now();
+ GetExecutionUnit(kind).Complete(op, ctx);
+ op->SetCompleteTime(kind, AppData()->TimeProvider->Now() - start);
+
+ if (!op->IsExecutionPlanFinished() && op->GetCurrentUnit() == kind) {
+ Y_VERIFY(completeList.back() == kind);
+ MoveToNextUnit(op);
+ }
+ }
+}
+
+void TPipeline::HoldExecutionProfile(TOperation::TPtr op)
+{
+ auto &units = op->GetExecutionProfile().UnitProfiles;
+ TStoredExecutionProfile profile;
+ profile.OpInfo = *op;
+ profile.UnitProfiles.reserve(units.size());
+ for (auto unit : op->GetExecutionPlan()) {
+ if (units.contains(unit)) {
+ profile.UnitProfiles.emplace_back(unit, units.at(unit));
+ }
+ }
+
+ SlowOpProfiles.emplace_back(profile);
+
+ while (SlowOpProfiles.size() > Self->GetDataTxProfileBufferSize()) {
+ SlowOpProfiles.pop_front();
+ }
+}
+
+void TPipeline::FillStoredExecutionProfiles(NKikimrTxDataShard::TEvGetSlowOpProfilesResponse &rec) const
+{
+ for (auto &profile : SlowOpProfiles) {
+ auto &entry = *rec.AddProfiles();
+ profile.OpInfo.Serialize(*entry.MutableBasicInfo());
+
+ for (auto &pr : profile.UnitProfiles) {
+ auto &unit = *entry.MutableExecutionProfile()->AddUnitProfiles();
+ unit.SetUnitKind(ToString(pr.first));
+ unit.SetWaitTime(pr.second.WaitTime.GetValue());
+ unit.SetExecuteTime(pr.second.ExecuteTime.GetValue());
+ unit.SetCommitTime(pr.second.CommitTime.GetValue());
+ unit.SetCompleteTime(pr.second.CompleteTime.GetValue());
+ unit.SetExecuteCount(pr.second.ExecuteCount);
+ }
+ }
+}
+
bool TPipeline::AddWaitingSchemeOp(const TOperation::TPtr& op) {
auto itHash = WaitingSchemeOps.find(op);
if (itHash != WaitingSchemeOps.end()) {
diff --git a/ydb/core/tx/datashard/datashard_pipeline.h b/ydb/core/tx/datashard/datashard_pipeline.h
index 0ba37ddc013..67c35260b28 100644
--- a/ydb/core/tx/datashard/datashard_pipeline.h
+++ b/ydb/core/tx/datashard/datashard_pipeline.h
@@ -4,8 +4,8 @@
#include "datashard_trans_queue.h"
#include "datashard_active_transaction.h"
#include "datashard_dep_tracker.h"
-#include "datashard_user_table.h"
-#include "execution_unit.h"
+#include "datashard_user_table.h"
+#include "execution_unit.h"
#include <ydb/core/tablet_flat/flat_cxx_database.h>
@@ -15,116 +15,116 @@ namespace NDataShard {
using NTabletFlatExecutor::TTransactionContext;
class TDataShard;
-class TOperation;
+class TOperation;
///
class TPipeline : TNonCopyable {
public:
- struct TConfig {
- enum EFlags : ui64 {
- EFlagsOutOfOrder = 0x01,
- EFlagsForceOnline = 0x02,
- EFlagsForceOnlineRW = 0x04,
- EFlagsDirtyOnline = 0x08,
- EFlagsDirtyImmediate = 0x10,
- };
-
- ui64 Flags;
- ui64 LimitActiveTx;
- ui64 LimitDataTxCache;
- ui64 LimitDoneDataTx;
-
- TConfig()
- : Flags(0)
- , LimitActiveTx(DefaultLimitActiveTx())
- , LimitDataTxCache(DefaultLimitDataTxCache())
- , LimitDoneDataTx(DefaultLimitDoneDataTx())
- {}
-
- static constexpr ui64 DefaultLimitActiveTx() { return 1; }
- static constexpr ui64 DefaultLimitDataTxCache() { return 20; }
- static constexpr ui64 DefaultLimitDoneDataTx() { return 20; }
-
- bool OutOfOrder() const { return (Flags & EFlagsOutOfOrder) && (LimitActiveTx > 1); }
- bool NoImmediate() const { return Flags & EFlagsForceOnline; }
- bool ForceOnlineRW() const { return Flags & EFlagsForceOnlineRW; }
- bool DirtyOnline() const { return Flags & EFlagsDirtyOnline; }
- bool DirtyImmediate() const { return Flags & EFlagsDirtyImmediate; }
- bool SoftUpdates() const { return Flags & (EFlagsForceOnlineRW|EFlagsDirtyOnline|EFlagsDirtyImmediate); }
-
- void Validate() {
- if (!LimitActiveTx)
- LimitActiveTx = DefaultLimitActiveTx() ;
- if (!LimitDataTxCache)
- LimitDataTxCache = DefaultLimitDataTxCache();
- }
-
+ struct TConfig {
+ enum EFlags : ui64 {
+ EFlagsOutOfOrder = 0x01,
+ EFlagsForceOnline = 0x02,
+ EFlagsForceOnlineRW = 0x04,
+ EFlagsDirtyOnline = 0x08,
+ EFlagsDirtyImmediate = 0x10,
+ };
+
+ ui64 Flags;
+ ui64 LimitActiveTx;
+ ui64 LimitDataTxCache;
+ ui64 LimitDoneDataTx;
+
+ TConfig()
+ : Flags(0)
+ , LimitActiveTx(DefaultLimitActiveTx())
+ , LimitDataTxCache(DefaultLimitDataTxCache())
+ , LimitDoneDataTx(DefaultLimitDoneDataTx())
+ {}
+
+ static constexpr ui64 DefaultLimitActiveTx() { return 1; }
+ static constexpr ui64 DefaultLimitDataTxCache() { return 20; }
+ static constexpr ui64 DefaultLimitDoneDataTx() { return 20; }
+
+ bool OutOfOrder() const { return (Flags & EFlagsOutOfOrder) && (LimitActiveTx > 1); }
+ bool NoImmediate() const { return Flags & EFlagsForceOnline; }
+ bool ForceOnlineRW() const { return Flags & EFlagsForceOnlineRW; }
+ bool DirtyOnline() const { return Flags & EFlagsDirtyOnline; }
+ bool DirtyImmediate() const { return Flags & EFlagsDirtyImmediate; }
+ bool SoftUpdates() const { return Flags & (EFlagsForceOnlineRW|EFlagsDirtyOnline|EFlagsDirtyImmediate); }
+
+ void Validate() {
+ if (!LimitActiveTx)
+ LimitActiveTx = DefaultLimitActiveTx() ;
+ if (!LimitDataTxCache)
+ LimitDataTxCache = DefaultLimitDataTxCache();
+ }
+
void Update(const NKikimrSchemeOp::TPipelineConfig& cfg) {
- if (cfg.GetEnableOutOfOrder()) {
- Flags |= EFlagsOutOfOrder;
- } else {
- Flags &= ~EFlagsOutOfOrder;
- }
- if (cfg.GetDisableImmediate()) {
- Flags |= EFlagsForceOnline;
- } else {
- Flags &= ~EFlagsForceOnline;
- }
- if (cfg.GetEnableSoftUpdates()) {
- Flags |= EFlagsForceOnlineRW & EFlagsDirtyOnline & EFlagsDirtyImmediate;
- } else {
- Flags &= ~(EFlagsForceOnlineRW | EFlagsDirtyOnline | EFlagsDirtyImmediate);
- }
- if (cfg.GetNumActiveTx()) {
- LimitActiveTx = cfg.GetNumActiveTx();
- }
- if (cfg.GetDataTxCacheSize()) {
- LimitDataTxCache = cfg.GetDataTxCacheSize();
- }
-
- Validate();
- }
- };
-
+ if (cfg.GetEnableOutOfOrder()) {
+ Flags |= EFlagsOutOfOrder;
+ } else {
+ Flags &= ~EFlagsOutOfOrder;
+ }
+ if (cfg.GetDisableImmediate()) {
+ Flags |= EFlagsForceOnline;
+ } else {
+ Flags &= ~EFlagsForceOnline;
+ }
+ if (cfg.GetEnableSoftUpdates()) {
+ Flags |= EFlagsForceOnlineRW & EFlagsDirtyOnline & EFlagsDirtyImmediate;
+ } else {
+ Flags &= ~(EFlagsForceOnlineRW | EFlagsDirtyOnline | EFlagsDirtyImmediate);
+ }
+ if (cfg.GetNumActiveTx()) {
+ LimitActiveTx = cfg.GetNumActiveTx();
+ }
+ if (cfg.GetDataTxCacheSize()) {
+ LimitDataTxCache = cfg.GetDataTxCacheSize();
+ }
+
+ Validate();
+ }
+ };
+
TPipeline(TDataShard * self);
- ~TPipeline();
-
+ ~TPipeline();
+
bool Load(NIceDb::TNiceDb& db);
void UpdateConfig(NIceDb::TNiceDb& db, const NKikimrSchemeOp::TPipelineConfig& cfg);
- bool OutOfOrderLimits() const;
- bool CanRunAnotherOp();
+ bool OutOfOrderLimits() const;
+ bool CanRunAnotherOp();
+
+ bool CanRunOp(const TOperation &op) const;
- bool CanRunOp(const TOperation &op) const;
-
- ui64 ImmediateInFly() const { return ImmediateOps.size(); }
- const THashMap<ui64, TOperation::TPtr> &GetImmediateOps() const { return ImmediateOps; }
+ ui64 ImmediateInFly() const { return ImmediateOps.size(); }
+ const THashMap<ui64, TOperation::TPtr> &GetImmediateOps() const { return ImmediateOps; }
TDependencyTracker &GetDepTracker() { return DepTracker; }
- const TConfig &GetConfig() const { return Config; }
-
+ const TConfig &GetConfig() const { return Config; }
+
// tx propose
- void SaveForPropose(TValidatedDataTx::TPtr tx);
+ void SaveForPropose(TValidatedDataTx::TPtr tx);
void SetProposed(ui64 txId, const TActorId& actorId);
- void ForgetUnproposedTx(ui64 txId);
- void ForgetTx(ui64 txId);
+ void ForgetUnproposedTx(ui64 txId);
+ void ForgetTx(ui64 txId);
// tx activity
TOperation::TPtr GetNextPlannedOp(ui64 step, ui64 txId) const;
- TOperation::TPtr GetNextActiveOp(bool dryRun);
- bool IsReadyOp(TOperation::TPtr op);
+ TOperation::TPtr GetNextActiveOp(bool dryRun);
+ bool IsReadyOp(TOperation::TPtr op);
bool LoadTxDetails(TTransactionContext &txc, const TActorContext &ctx, TActiveTransaction::TPtr tx);
-
+
void DeactivateOp(TOperation::TPtr op, TTransactionContext& txc, const TActorContext &ctx);
void RemoveTx(TStepOrder stepTxId);
const TSchemaOperation* FindSchemaTx(ui64 txId) const;
void CompleteSchemaTx(NIceDb::TNiceDb& db, ui64 txId);
- void MarkOpAsUsingSnapshot(TOperation::TPtr op);
+ void MarkOpAsUsingSnapshot(TOperation::TPtr op);
bool PlanTxs(ui64 step, TVector<ui64> &txIds, TTransactionContext &txc, const TActorContext &ctx);
void PreserveSchema(NIceDb::TNiceDb& db, ui64 step);
@@ -133,21 +133,21 @@ public:
// times
- bool AssignPlanInterval(TOperation::TPtr op);
+ bool AssignPlanInterval(TOperation::TPtr op);
ui64 OutdatedReadSetStep() const;
ui64 OutdatedCleanupStep() const;
ui64 AllowedDataStep() const { return Max(LastPlannedTx.Step + 1, TAppData::TimeProvider->Now().MilliSeconds()); }
ui64 AllowedSchemaStep() const { return LastPlannedTx.Step + 1; }
ui64 VacantSchemaStep() const { return KeepSchemaStep + 1; }
- TStepOrder GetLastPlannedTx() const { return LastPlannedTx; }
- TStepOrder GetLastCompleteTx() const { return LastCompleteTx; }
- TStepOrder GetUtmostCompleteTx() const { return UtmostCompleteTx; }
-
+ TStepOrder GetLastPlannedTx() const { return LastPlannedTx; }
+ TStepOrder GetLastCompleteTx() const { return LastCompleteTx; }
+ TStepOrder GetUtmostCompleteTx() const { return UtmostCompleteTx; }
+
ui64 GetTxCompleteLag(EOperationKind kind, ui64 timecastStep) const;
ui64 GetDataTxCompleteLag(ui64 timecastStep) const;
ui64 GetScanTxCompleteLag(ui64 timecastStep) const;
-
+
// schema ops
bool HasSchemaOperation() const { return CurrentSchemaTxId(); }
@@ -191,120 +191,120 @@ public:
void ProposeSchemeTx(const TSchemaOperation &op, TTransactionContext &txc);
bool CancelPropose(NIceDb::TNiceDb& db, const TActorContext& ctx, ui64 txId);
ECleanupStatus CleanupOutdated(NIceDb::TNiceDb& db, const TActorContext& ctx, ui64 outdatedStep);
- ui64 PlannedTxInFly() const;
- const TSet<TStepOrder> &GetPlan() const;
+ ui64 PlannedTxInFly() const;
+ const TSet<TStepOrder> &GetPlan() const;
bool HasProposeDelayers() const;
bool RemoveProposeDelayer(ui64 txId);
- void ProcessDisconnected(ui32 nodeId);
-
- ui64 GetInactiveTxSize() const;
-
+ void ProcessDisconnected(ui32 nodeId);
+
+ ui64 GetInactiveTxSize() const;
+
const TMap<TStepOrder, TOperation::TPtr> &GetActivePlannedOps() const { return ActivePlannedOps; }
- ui64 GetLastCompletedTxStep() const { return LastCompleteTx.Step; }
- ui64 GetLastActivePlannedOpStep() const
- {
- return ActivePlannedOps
- ? ActivePlannedOps.rbegin()->second->GetStep()
- : LastCompleteTx.Step;
- }
- ui64 GetLastActivePlannedOpId() const
- {
- return ActivePlannedOps
- ? ActivePlannedOps.rbegin()->second->GetTxId()
- : LastCompleteTx.TxId;
- }
- // Read set iface.
- bool SaveInReadSet(const TEvTxProcessing::TEvReadSet &rs,
- THolder<IEventHandle> &ack,
- TTransactionContext &txc,
- const TActorContext &ctx);
- bool LoadInReadSets(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void RemoveInReadSets(TOperation::TPtr op,
- NIceDb::TNiceDb &db);
-
- TOperation::TPtr FindOp(ui64 txId);
-
- TOperation::TPtr GetActiveOp(ui64 txId);
- const TMap<TStepOrder, TOperation::TPtr> &GetActiveOps() const { return ActiveOps; }
-
- void AddActiveOp(TOperation::TPtr op);
- void RemoveActiveOp(TOperation::TPtr op);
-
+ ui64 GetLastCompletedTxStep() const { return LastCompleteTx.Step; }
+ ui64 GetLastActivePlannedOpStep() const
+ {
+ return ActivePlannedOps
+ ? ActivePlannedOps.rbegin()->second->GetStep()
+ : LastCompleteTx.Step;
+ }
+ ui64 GetLastActivePlannedOpId() const
+ {
+ return ActivePlannedOps
+ ? ActivePlannedOps.rbegin()->second->GetTxId()
+ : LastCompleteTx.TxId;
+ }
+ // Read set iface.
+ bool SaveInReadSet(const TEvTxProcessing::TEvReadSet &rs,
+ THolder<IEventHandle> &ack,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ bool LoadInReadSets(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void RemoveInReadSets(TOperation::TPtr op,
+ NIceDb::TNiceDb &db);
+
+ TOperation::TPtr FindOp(ui64 txId);
+
+ TOperation::TPtr GetActiveOp(ui64 txId);
+ const TMap<TStepOrder, TOperation::TPtr> &GetActiveOps() const { return ActiveOps; }
+
+ void AddActiveOp(TOperation::TPtr op);
+ void RemoveActiveOp(TOperation::TPtr op);
+
void UnblockNormalDependencies(const TOperation::TPtr &op);
void UnblockSpecialDependencies(const TOperation::TPtr &op);
-
- const THashSet<TOperation::TPtr> &GetExecuteBlockers() const { return ExecuteBlockers; }
- void AddExecuteBlocker(TOperation::TPtr op)
- {
- ExecuteBlockers.insert(op);
- }
- void RemoveExecuteBlocker(TOperation::TPtr op)
- {
- ExecuteBlockers.erase(op);
- }
-
- // Operation builders
- TOperation::TPtr BuildOperation(TEvDataShard::TEvProposeTransaction::TPtr &ev,
+
+ const THashSet<TOperation::TPtr> &GetExecuteBlockers() const { return ExecuteBlockers; }
+ void AddExecuteBlocker(TOperation::TPtr op)
+ {
+ ExecuteBlockers.insert(op);
+ }
+ void RemoveExecuteBlocker(TOperation::TPtr op)
+ {
+ ExecuteBlockers.erase(op);
+ }
+
+ // Operation builders
+ TOperation::TPtr BuildOperation(TEvDataShard::TEvProposeTransaction::TPtr &ev,
TInstant receivedAt, ui64 tieBreakerIndex,
- NTabletFlatExecutor::TTransactionContext &txc,
- const TActorContext &ctx);
- void BuildDataTx(TActiveTransaction *tx,
- TTransactionContext &txc,
- const TActorContext &ctx);
+ NTabletFlatExecutor::TTransactionContext &txc,
+ const TActorContext &ctx);
+ void BuildDataTx(TActiveTransaction *tx,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
ERestoreDataStatus RestoreDataTx(
TActiveTransaction *tx,
TTransactionContext &txc,
const TActorContext &ctx)
- {
- return tx->RestoreTxData(Self, txc, ctx);
- }
-
- // Execution units
- TExecutionUnit &GetExecutionUnit(EExecutionUnitKind kind)
- {
- return *ExecutionUnits[static_cast<ui32>(kind)].Get();
- }
- const TExecutionUnit &GetExecutionUnit(EExecutionUnitKind kind) const
- {
- return *ExecutionUnits[static_cast<ui32>(kind)].Get();
- }
- EExecutionStatus RunExecutionUnit(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx);
- EExecutionStatus RunExecutionPlan(TOperation::TPtr op,
- TVector<EExecutionUnitKind> &completeList,
- TTransactionContext &txc,
- const TActorContext &ctx);
- void RunCompleteList(TOperation::TPtr op,
- TVector<EExecutionUnitKind> &completeList,
- const TActorContext &ctx);
-
- void AddCandidateOp(TOperation::TPtr op)
- {
- if (!op->IsInProgress()
- && !op->IsExecutionPlanFinished()
- && NextActiveOp != op) {
- CandidateOps[op->GetStepOrder()] = op;
- }
- }
- void AddCandidateUnit(EExecutionUnitKind kind)
- {
- CandidateUnits.insert(kind);
- }
-
- ui64 GetDataTxCacheSize() const { return DataTxCache.size(); }
- const TMap<TStepOrder, THolder<IEventHandle>> &GetDelayedAcks() const
- {
- return DelayedAcks;
- }
-
- void HoldExecutionProfile(TOperation::TPtr op);
- void FillStoredExecutionProfiles(NKikimrTxDataShard::TEvGetSlowOpProfilesResponse &rec) const;
-
+ {
+ return tx->RestoreTxData(Self, txc, ctx);
+ }
+
+ // Execution units
+ TExecutionUnit &GetExecutionUnit(EExecutionUnitKind kind)
+ {
+ return *ExecutionUnits[static_cast<ui32>(kind)].Get();
+ }
+ const TExecutionUnit &GetExecutionUnit(EExecutionUnitKind kind) const
+ {
+ return *ExecutionUnits[static_cast<ui32>(kind)].Get();
+ }
+ EExecutionStatus RunExecutionUnit(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ EExecutionStatus RunExecutionPlan(TOperation::TPtr op,
+ TVector<EExecutionUnitKind> &completeList,
+ TTransactionContext &txc,
+ const TActorContext &ctx);
+ void RunCompleteList(TOperation::TPtr op,
+ TVector<EExecutionUnitKind> &completeList,
+ const TActorContext &ctx);
+
+ void AddCandidateOp(TOperation::TPtr op)
+ {
+ if (!op->IsInProgress()
+ && !op->IsExecutionPlanFinished()
+ && NextActiveOp != op) {
+ CandidateOps[op->GetStepOrder()] = op;
+ }
+ }
+ void AddCandidateUnit(EExecutionUnitKind kind)
+ {
+ CandidateUnits.insert(kind);
+ }
+
+ ui64 GetDataTxCacheSize() const { return DataTxCache.size(); }
+ const TMap<TStepOrder, THolder<IEventHandle>> &GetDelayedAcks() const
+ {
+ return DelayedAcks;
+ }
+
+ void HoldExecutionProfile(TOperation::TPtr op);
+ void FillStoredExecutionProfiles(NKikimrTxDataShard::TEvGetSlowOpProfilesResponse &rec) const;
+
void StartStreamingTx(ui64 txId, ui32 count) {
ActiveStreamingTxs[txId] += count;
}
@@ -354,11 +354,11 @@ public:
bool MarkPlannedLogicallyIncompleteUpTo(const TRowVersion& version, TTransactionContext& txc);
private:
- struct TStoredExecutionProfile {
- TBasicOpInfo OpInfo;
- TVector<std::pair<EExecutionUnitKind, TExecutionProfile::TUnitProfile>> UnitProfiles;
- };
-
+ struct TStoredExecutionProfile {
+ TBasicOpInfo OpInfo;
+ TVector<std::pair<EExecutionUnitKind, TExecutionProfile::TUnitProfile>> UnitProfiles;
+ };
+
class TCommittingDataTxOps {
private:
struct TItem {
@@ -425,30 +425,30 @@ private:
TDataShard * const Self;
TDependencyTracker DepTracker;
TConfig Config;
- THashMap<ui64, TOperation::TPtr> ImmediateOps;
+ THashMap<ui64, TOperation::TPtr> ImmediateOps;
TSortedOps ActiveOps;
TSortedOps ActivePlannedOps;
TSortedOps::iterator ActivePlannedOpsLogicallyCompleteEnd;
TSortedOps::iterator ActivePlannedOpsLogicallyIncompleteEnd;
THashMap<ui64, TValidatedDataTx::TPtr> DataTxCache;
- TMap<TStepOrder, THolder<IEventHandle>> DelayedAcks;
+ TMap<TStepOrder, THolder<IEventHandle>> DelayedAcks;
TStepOrder LastPlannedTx;
TStepOrder LastCompleteTx;
TStepOrder UtmostCompleteTx;
ui64 KeepSchemaStep;
ui64 LastCleanupTime;
TSchemaOperation * SchemaTx;
- std::array<THolder<TExecutionUnit>, (ui32)EExecutionUnitKind::Count> ExecutionUnits;
- THashSet<TOperation::TPtr> ExecuteBlockers;
- // Candidates for execution.
- TMap<TStepOrder, TOperation::TPtr> CandidateOps;
- // Candidates for ready operation source (checked
- // via FindReadyOperation).
- TSet<EExecutionUnitKind> CandidateUnits;
- // Next active op found during GetNextActiveOp dry run.
- TOperation::TPtr NextActiveOp;
- // Slow operation profiles.
- TList<TStoredExecutionProfile> SlowOpProfiles;
+ std::array<THolder<TExecutionUnit>, (ui32)EExecutionUnitKind::Count> ExecutionUnits;
+ THashSet<TOperation::TPtr> ExecuteBlockers;
+ // Candidates for execution.
+ TMap<TStepOrder, TOperation::TPtr> CandidateOps;
+ // Candidates for ready operation source (checked
+ // via FindReadyOperation).
+ TSet<EExecutionUnitKind> CandidateUnits;
+ // Next active op found during GetNextActiveOp dry run.
+ TOperation::TPtr NextActiveOp;
+ // Slow operation profiles.
+ TList<TStoredExecutionProfile> SlowOpProfiles;
TMap<ui64, ui32> ActiveStreamingTxs;
typedef TList<TOperation::TPtr> TWaitingSchemeOpsOrder;
@@ -466,13 +466,13 @@ private:
void CompleteTx(TOperation::TPtr op, TTransactionContext &txc, const TActorContext &ctx);
void PersistConfig(NIceDb::TNiceDb& db);
- void MoveToNextUnit(TOperation::TPtr op);
+ void MoveToNextUnit(TOperation::TPtr op);
+
+ bool AddImmediateOp(TOperation::TPtr op);
+ void RemoveImmediateOp(TOperation::TPtr op);
- bool AddImmediateOp(TOperation::TPtr op);
- void RemoveImmediateOp(TOperation::TPtr op);
-
- void SaveInReadSet(const TEvTxProcessing::TEvReadSet &rs,
- TTransactionContext &txc);
+ void SaveInReadSet(const TEvTxProcessing::TEvReadSet &rs,
+ TTransactionContext &txc);
};
}}
diff --git a/ydb/core/tx/datashard/datashard_split_src.cpp b/ydb/core/tx/datashard/datashard_split_src.cpp
index b8249de19e8..a7349fc9cf3 100644
--- a/ydb/core/tx/datashard/datashard_split_src.cpp
+++ b/ydb/core/tx/datashard/datashard_split_src.cpp
@@ -167,7 +167,7 @@ public:
Self->SysTablesToTransferAtSplit + Y_ARRAY_SIZE(Self->SysTablesToTransferAtSplit));
for (const auto& ti : Self->TableInfos) {
- tablesToSnapshot.push_back(ti.second->LocalTid);
+ tablesToSnapshot.push_back(ti.second->LocalTid);
if (ti.second->ShadowTid) {
tablesToSnapshot.push_back(ti.second->ShadowTid);
}
@@ -250,7 +250,7 @@ public:
// Fill user table scheme
Y_VERIFY(Self->TableInfos.size() == 1, "Support for more than 1 user table in a datashard is not implemented here");
- const TUserTable& tableInfo = *Self->TableInfos.begin()->second;
+ const TUserTable& tableInfo = *Self->TableInfos.begin()->second;
tableInfo.GetSchema(*snapshot->MutableUserTableScheme());
for (ui32 localTableId : SnapContext->TablesToSnapshot()) {
diff --git a/ydb/core/tx/datashard/datashard_trans_queue.cpp b/ydb/core/tx/datashard/datashard_trans_queue.cpp
index 1805469c0a1..d7096c25b32 100644
--- a/ydb/core/tx/datashard/datashard_trans_queue.cpp
+++ b/ydb/core/tx/datashard/datashard_trans_queue.cpp
@@ -5,9 +5,9 @@
namespace NKikimr {
namespace NDataShard {
-const TSet<TStepOrder> TTransQueue::EMPTY_PLAN;
-
-void TTransQueue::AddTxInFly(TOperation::TPtr op) {
+const TSet<TStepOrder> TTransQueue::EMPTY_PLAN;
+
+void TTransQueue::AddTxInFly(TOperation::TPtr op) {
const ui64 txId = op->GetTxId();
const ui64 maxStep = op->GetMaxStep();
Y_VERIFY_S(!TxsInFly.contains(txId), "Adding duplicate txId " << txId);
@@ -60,9 +60,9 @@ bool TTransQueue::Load(NIceDb::TNiceDb& db) {
flags = rowset.GetValue<Schema::TxMain::Flags>();
}
ui64 maxStep = rowset.GetValue<Schema::TxMain::MaxStep>();
- EOperationKind kind = rowset.GetValue<Schema::TxMain::Kind>();
- ui64 received = rowset.GetValueOrDefault<Schema::TxMain::ReceivedAt>(now.GetValue());
- if (kind == EOperationKind::SchemeTx)
+ EOperationKind kind = rowset.GetValue<Schema::TxMain::Kind>();
+ ui64 received = rowset.GetValueOrDefault<Schema::TxMain::ReceivedAt>(now.GetValue());
+ if (kind == EOperationKind::SchemeTx)
schemaTxs.insert(txId);
if (flags & TTxFlags::Immediate) {
@@ -97,8 +97,8 @@ bool TTransQueue::Load(NIceDb::TNiceDb& db) {
ui64 txId = rowset.GetValue<Schema::PlanQueue::TxId>();
PlannedTxs.emplace(TStepOrder(step, txId));
- auto op = FindTxInFly(txId);
- if (op) {
+ auto op = FindTxInFly(txId);
+ if (op) {
if (Y_LIKELY(!op->GetStep())) {
op->SetStep(step);
--PlanWaitingTxCount;
@@ -108,10 +108,10 @@ bool TTransQueue::Load(NIceDb::TNiceDb& db) {
ProposeDelayers.insert(txId);
}
}
- PlannedTxsByKind[op->GetKind()].emplace(TStepOrder(step, txId));
+ PlannedTxsByKind[op->GetKind()].emplace(TStepOrder(step, txId));
DeadlineQueue.erase(std::make_pair(op->GetMaxStep(), op->GetTxId()));
- }
-
+ }
+
if (!rowset.Next())
return false;
}
@@ -130,7 +130,7 @@ bool TTransQueue::Load(NIceDb::TNiceDb& db) {
ui64 minStep = rowset.GetValue<Schema::SchemaOperations::MinStep>();
ui64 maxStep = rowset.GetValue<Schema::SchemaOperations::MaxStep>();
ui64 planStep = rowset.GetValueOrDefault<Schema::SchemaOperations::PlanStep>(0);
- ui64 readOnly = rowset.GetValueOrDefault<Schema::SchemaOperations::ReadOnly>(false);
+ ui64 readOnly = rowset.GetValueOrDefault<Schema::SchemaOperations::ReadOnly>(false);
bool success = rowset.GetValueOrDefault<Schema::SchemaOperations::Success>(false);
TString error = rowset.GetValueOrDefault<Schema::SchemaOperations::Error>(TString());
ui64 dataSize = rowset.GetValueOrDefault<Schema::SchemaOperations::DataSize>(0);
@@ -205,7 +205,7 @@ void TTransQueue::ProposeSchemaTx(NIceDb::TNiceDb& db, const TSchemaOperation& o
NIceDb::TUpdate<Schema::SchemaOperations::SourceTablet>(op.TabletId),
NIceDb::TUpdate<Schema::SchemaOperations::MinStep>(op.MinStep),
NIceDb::TUpdate<Schema::SchemaOperations::MaxStep>(op.MaxStep),
- NIceDb::TUpdate<Schema::SchemaOperations::PlanStep>(op.PlanStep),
+ NIceDb::TUpdate<Schema::SchemaOperations::PlanStep>(op.PlanStep),
NIceDb::TUpdate<Schema::SchemaOperations::ReadOnly>(op.ReadOnly),
NIceDb::TUpdate<Schema::SchemaOperations::Success>(op.Success),
NIceDb::TUpdate<Schema::SchemaOperations::Error>(op.Error),
@@ -261,20 +261,20 @@ void TTransQueue::UpdateTxBody(NIceDb::TNiceDb& db, ui64 txId, const TStringBuf&
.Update<Schema::TxDetails::Body>(TString(txBody));
}
-void TTransQueue::RemoveTx(NIceDb::TNiceDb &db,
- const TOperation &op) {
+void TTransQueue::RemoveTx(NIceDb::TNiceDb &db,
+ const TOperation &op) {
using Schema = TDataShard::Schema;
- db.Table<Schema::TxMain>().Key(op.GetTxId()).Delete();
- db.Table<Schema::TxDetails>().Key(op.GetTxId(), Self->TabletID()).Delete();
- db.Table<Schema::TxArtifacts>().Key(op.GetTxId()).Delete();
+ db.Table<Schema::TxMain>().Key(op.GetTxId()).Delete();
+ db.Table<Schema::TxDetails>().Key(op.GetTxId(), Self->TabletID()).Delete();
+ db.Table<Schema::TxArtifacts>().Key(op.GetTxId()).Delete();
- db.Table<Schema::PlanQueue>().Key(op.GetStep(), op.GetTxId()).Delete();
- db.Table<Schema::DeadlineQueue>().Key(op.GetMaxStep(), op.GetTxId()).Delete();
- DeadlineQueue.erase(std::make_pair(op.GetMaxStep(), op.GetTxId()));
- RemoveTxInFly(op.GetTxId());
- PlannedTxs.erase(op.GetStepOrder());
- PlannedTxsByKind[op.GetKind()].erase(op.GetStepOrder());
+ db.Table<Schema::PlanQueue>().Key(op.GetStep(), op.GetTxId()).Delete();
+ db.Table<Schema::DeadlineQueue>().Key(op.GetMaxStep(), op.GetTxId()).Delete();
+ DeadlineQueue.erase(std::make_pair(op.GetMaxStep(), op.GetTxId()));
+ RemoveTxInFly(op.GetTxId());
+ PlannedTxs.erase(op.GetStepOrder());
+ PlannedTxsByKind[op.GetKind()].erase(op.GetStepOrder());
db.NoMoreReadsForTx();
}
@@ -291,12 +291,12 @@ void TTransQueue::RemoveScanProgress(NIceDb::TNiceDb& db, ui64 txId) {
/// @arg inOutStep, inOutTxId - last (complete) tx
/// @return inOutStep, inOutTxId - next planned Tx
-void TTransQueue::GetPlannedTxId(ui64& step, ui64& txId) const {
+void TTransQueue::GetPlannedTxId(ui64& step, ui64& txId) const {
auto it = PlannedTxs.lower_bound(TStepOrder(step, txId));
if (it != PlannedTxs.end()) {
step = it->Step;
txId = it->TxId;
- return;
+ return;
}
step = txId = 0;
@@ -313,31 +313,31 @@ bool TTransQueue::GetNextPlannedTxId(ui64& step, ui64& txId) const {
return false;
}
-bool TTransQueue::LoadTxDetails(NIceDb::TNiceDb &db,
- ui64 txId,
+bool TTransQueue::LoadTxDetails(NIceDb::TNiceDb &db,
+ ui64 txId,
TActorId &target,
- TString &txBody,
- TVector<TSysTables::TLocksTable::TLock> &locks,
- ui64 &artifactFlags) {
+ TString &txBody,
+ TVector<TSysTables::TLocksTable::TLock> &locks,
+ ui64 &artifactFlags) {
using Schema = TDataShard::Schema;
- auto detailsRow = db.Table<Schema::TxDetails>().Key(txId, Self->TabletID()).Select();
- auto artifactsRow = db.Table<Schema::TxArtifacts>().Key(txId).Select();
-
- if (!detailsRow.IsReady() || !artifactsRow.IsReady())
+ auto detailsRow = db.Table<Schema::TxDetails>().Key(txId, Self->TabletID()).Select();
+ auto artifactsRow = db.Table<Schema::TxArtifacts>().Key(txId).Select();
+
+ if (!detailsRow.IsReady() || !artifactsRow.IsReady())
return false;
- Y_VERIFY_S(!detailsRow.EndOfSet(), "cannot find details for tx=" << txId);
-
- txBody = detailsRow.GetValue<Schema::TxDetails::Body>();
- target = detailsRow.GetValue<Schema::TxDetails::Source>();
-
- artifactFlags = 0;
- if (!artifactsRow.EndOfSet()) {
- artifactFlags = artifactsRow.GetValue<Schema::TxArtifacts::Flags>();
- locks = artifactsRow.GetValueOrDefault<Schema::TxArtifacts::Locks>({});
- }
-
+ Y_VERIFY_S(!detailsRow.EndOfSet(), "cannot find details for tx=" << txId);
+
+ txBody = detailsRow.GetValue<Schema::TxDetails::Body>();
+ target = detailsRow.GetValue<Schema::TxDetails::Source>();
+
+ artifactFlags = 0;
+ if (!artifactsRow.EndOfSet()) {
+ artifactFlags = artifactsRow.GetValue<Schema::TxArtifacts::Flags>();
+ locks = artifactsRow.GetValueOrDefault<Schema::TxArtifacts::Locks>({});
+ }
+
return true;
}
@@ -356,8 +356,8 @@ bool TTransQueue::ClearTxDetails(NIceDb::TNiceDb& db, ui64 txId) {
return false;
}
- db.Table<Schema::TxArtifacts>().Key(txId).Delete();
-
+ db.Table<Schema::TxArtifacts>().Key(txId).Delete();
+
return true;
}
@@ -368,7 +368,7 @@ bool TTransQueue::CancelPropose(NIceDb::TNiceDb& db, ui64 txId) {
if (it == TxsInFly.end())
return true; // already cleaned up
- ui64 maxStep = it->second->GetMaxStep();
+ ui64 maxStep = it->second->GetMaxStep();
if (!ClearTxDetails(db, txId))
return false;
@@ -429,10 +429,10 @@ ECleanupStatus TTransQueue::CleanupOutdated(NIceDb::TNiceDb& db, ui64 outdatedSt
return ECleanupStatus::Success;
}
-void TTransQueue::PlanTx(TOperation::TPtr op,
- ui64 step,
- NIceDb::TNiceDb &db)
-{
+void TTransQueue::PlanTx(TOperation::TPtr op,
+ ui64 step,
+ NIceDb::TNiceDb &db)
+{
Y_VERIFY_DEBUG(TxsInFly.contains(op->GetTxId()) && TxsInFly.at(op->GetTxId()) == op);
if (Y_LIKELY(!op->GetStep())) {
@@ -444,14 +444,14 @@ void TTransQueue::PlanTx(TOperation::TPtr op,
}
using Schema = TDataShard::Schema;
- db.Table<Schema::PlanQueue>().Key(step, op->GetTxId()).Update();
- PlannedTxs.emplace(op->GetStepOrder());
- PlannedTxsByKind[op->GetKind()].emplace(op->GetStepOrder());
+ db.Table<Schema::PlanQueue>().Key(step, op->GetTxId()).Update();
+ PlannedTxs.emplace(op->GetStepOrder());
+ PlannedTxsByKind[op->GetKind()].emplace(op->GetStepOrder());
DeadlineQueue.erase(std::make_pair(op->GetMaxStep(), op->GetTxId()));
}
void TTransQueue::ForgetPlannedTx(NIceDb::TNiceDb &db, ui64 step, ui64 txId)
-{
+{
using Schema = TDataShard::Schema;
db.Table<Schema::PlanQueue>().Key(step, txId).Delete();
PlannedTxs.erase(TStepOrder(step, txId));
@@ -462,12 +462,12 @@ void TTransQueue::ForgetPlannedTx(NIceDb::TNiceDb &db, ui64 step, ui64 txId)
Self->IncCounter(COUNTER_TX_PROGRESS_DUPLICATE);
}
-TString TTransQueue::TxInFlyToString() const
-{
- TStringStream ss;
- for (auto &pr : TxsInFly)
- ss << "{" << pr.first << ": " << pr.second->GetKind() << "} ";
- return ss.Str();
-}
-
+TString TTransQueue::TxInFlyToString() const
+{
+ TStringStream ss;
+ for (auto &pr : TxsInFly)
+ ss << "{" << pr.first << ": " << pr.second->GetKind() << "} ";
+ return ss.Str();
+}
+
}}
diff --git a/ydb/core/tx/datashard/datashard_trans_queue.h b/ydb/core/tx/datashard/datashard_trans_queue.h
index e742ce95c45..1d392676da3 100644
--- a/ydb/core/tx/datashard/datashard_trans_queue.h
+++ b/ydb/core/tx/datashard/datashard_trans_queue.h
@@ -1,7 +1,7 @@
#pragma once
#include "datashard_active_transaction.h"
-#include "operation.h"
+#include "operation.h"
#include <ydb/core/tablet_flat/flat_cxx_database.h>
#include <ydb/core/protos/counters_datashard.pb.h>
@@ -25,7 +25,7 @@ enum class ECleanupStatus {
class TTransQueue {
public:
friend class TPipeline;
- friend class TActiveTransaction;
+ friend class TActiveTransaction;
TTransQueue(TDataShard * self)
: Self(self)
@@ -42,29 +42,29 @@ public:
bool Load(NIceDb::TNiceDb& db);
- const THashMap<ui64, TOperation::TPtr> &GetTxsInFly() const { return TxsInFly; }
+ const THashMap<ui64, TOperation::TPtr> &GetTxsInFly() const { return TxsInFly; }
ui64 TxInFly() const { return TxsInFly.size(); }
- void AddTxInFly(TOperation::TPtr op);
+ void AddTxInFly(TOperation::TPtr op);
void RemoveTxInFly(ui64 txId);
TOperation::TPtr FindTxInFly(ui64 txId) const
- {
- auto it = TxsInFly.find(txId);
- if (it != TxsInFly.end())
- return it->second;
- return nullptr;
- }
+ {
+ auto it = TxsInFly.find(txId);
+ if (it != TxsInFly.end())
+ return it->second;
+ return nullptr;
+ }
bool Has(ui64 txId) const {return TxsInFly.contains(txId); }
- ui64 TxPlanned() const { return PlannedTxs.size(); }
- const TSet<TStepOrder> &GetPlan() const { return PlannedTxs; }
- const TSet<TStepOrder> &GetPlan(EOperationKind kind) const
- {
- auto it = PlannedTxsByKind.find(kind);
- if (it != PlannedTxsByKind.end())
- return it->second;
- return EMPTY_PLAN;
- }
-
+ ui64 TxPlanned() const { return PlannedTxs.size(); }
+ const TSet<TStepOrder> &GetPlan() const { return PlannedTxs; }
+ const TSet<TStepOrder> &GetPlan(EOperationKind kind) const
+ {
+ auto it = PlannedTxsByKind.find(kind);
+ if (it != PlannedTxsByKind.end())
+ return it->second;
+ return EMPTY_PLAN;
+ }
+
TSchemaOperation * FindSchemaTx(ui64 txId) { return SchemaOps.FindPtr(txId); }
const TMap<ui64, TSchemaOperation>& GetSchemaOperations() const { return SchemaOps; }
bool HasNotAckedSchemaTx() const { return ! SchemaOps.empty(); }
@@ -74,9 +74,9 @@ public:
bool HasProposeDelayers() const { return !ProposeDelayers.empty(); }
bool RemoveProposeDelayer(ui64 txId) { return ProposeDelayers.erase(txId) > 0; }
- // Debug
- TString TxInFlyToString() const;
-
+ // Debug
+ TString TxInFlyToString() const;
+
private: // for pipeline only
// Propose
@@ -90,27 +90,27 @@ private: // for pipeline only
// Plan
- void PlanTx(TOperation::TPtr op,
- ui64 step,
- NIceDb::TNiceDb &db);
+ void PlanTx(TOperation::TPtr op,
+ ui64 step,
+ NIceDb::TNiceDb &db);
void ForgetPlannedTx(NIceDb::TNiceDb &db, ui64 step, ui64 txId);
// Execute
// get first planned tx starting from {step, txId}
- void GetPlannedTxId(ui64& step, ui64& txId) const;
+ void GetPlannedTxId(ui64& step, ui64& txId) const;
bool GetNextPlannedTxId(ui64& step, ui64& txId) const;
- bool LoadTxDetails(NIceDb::TNiceDb &db,
- ui64 txId,
+ bool LoadTxDetails(NIceDb::TNiceDb &db,
+ ui64 txId,
TActorId &targets,
- TString &txBody,
- TVector<TSysTables::TLocksTable::TLock> &locks,
- ui64 &artifactFlags);
+ TString &txBody,
+ TVector<TSysTables::TLocksTable::TLock> &locks,
+ ui64 &artifactFlags);
// Done
- void RemoveTx(NIceDb::TNiceDb &db,
- const TOperation &op);
+ void RemoveTx(NIceDb::TNiceDb &db,
+ const TOperation &op);
void RemoveSchemaOperation(NIceDb::TNiceDb& db, ui64 txId);
void RemoveScanProgress(NIceDb::TNiceDb& db, ui64 txId);
@@ -122,16 +122,16 @@ private: // for pipeline only
private:
TDataShard * Self;
- THashMap<ui64, TOperation::TPtr> TxsInFly;
+ THashMap<ui64, TOperation::TPtr> TxsInFly;
TSet<TStepOrder> PlannedTxs;
- THashMap<EOperationKind, TSet<TStepOrder>> PlannedTxsByKind;
+ THashMap<EOperationKind, TSet<TStepOrder>> PlannedTxsByKind;
TSet<std::pair<ui64, ui64>> DeadlineQueue; // {maxStep, txId}
TMap<ui64, TSchemaOperation> SchemaOps; // key - txId
TSet<ui64> ProposeDelayers;
ui64 PlanWaitingTxCount = 0;
- static const TSet<TStepOrder> EMPTY_PLAN;
-
+ static const TSet<TStepOrder> EMPTY_PLAN;
+
bool ClearTxDetails(NIceDb::TNiceDb& db, ui64 txId);
};
diff --git a/ydb/core/tx/datashard/datashard_txs.h b/ydb/core/tx/datashard/datashard_txs.h
index 3e5a6c86a2a..4a9ab008789 100644
--- a/ydb/core/tx/datashard/datashard_txs.h
+++ b/ydb/core/tx/datashard/datashard_txs.h
@@ -2,7 +2,7 @@
#include "datashard_common_upload.h"
#include "datashard_impl.h"
-#include "execution_unit_kind.h"
+#include "execution_unit_kind.h"
namespace NKikimr {
namespace NDataShard {
@@ -72,38 +72,38 @@ public:
TTxType GetTxType() const override { return TXTYPE_PROGRESS_START; }
private:
- TOperation::TPtr ActiveOp;
- TVector<EExecutionUnitKind> CompleteList;
- TInstant CommitStart;
+ TOperation::TPtr ActiveOp;
+ TVector<EExecutionUnitKind> CompleteList;
+ TInstant CommitStart;
bool Rescheduled = false;
};
class TDataShard::TTxProposeTransactionBase : public NTabletFlatExecutor::TTransactionBase<TDataShard> {
-public:
+public:
TTxProposeTransactionBase(TDataShard *self,
TEvDataShard::TEvProposeTransaction::TPtr &&ev,
TInstant receivedAt, ui64 tieBreakerIndex,
bool delayed);
- bool Execute(NTabletFlatExecutor::TTransactionContext &txc,
- const TActorContext &ctx) override;
+ bool Execute(NTabletFlatExecutor::TTransactionContext &txc,
+ const TActorContext &ctx) override;
void Complete(const TActorContext &ctx) override;
TTxType GetTxType() const override { return TXTYPE_PROPOSE; }
private:
bool SyncSchemeOnFollower(TOutputOpData::TResultPtr &result,
- TTransactionContext &txc,
- const TActorContext &ctx);
+ TTransactionContext &txc,
+ const TActorContext &ctx);
protected:
- TOperation::TPtr Op;
- TEvDataShard::TEvProposeTransaction::TPtr Ev;
+ TOperation::TPtr Op;
+ TEvDataShard::TEvProposeTransaction::TPtr Ev;
const TInstant ReceivedAt;
const ui64 TieBreakerIndex;
- EOperationKind Kind;
+ EOperationKind Kind;
ui64 TxId;
- TVector<EExecutionUnitKind> CompleteList;
- TInstant CommitStart;
+ TVector<EExecutionUnitKind> CompleteList;
+ TInstant CommitStart;
bool Acked;
bool Rescheduled = false;
};
@@ -142,30 +142,30 @@ private:
const ui64 TxId;
};
-inline bool MaybeRequestMoreTxMemory(ui64 usage, NTabletFlatExecutor::TTransactionContext &txc) {
- if (usage > txc.GetMemoryLimit()) {
- ui64 request = Max(usage - txc.GetMemoryLimit(), txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
- txc.RequestMemory(request);
- return true;
- }
- return false;
-}
-
+inline bool MaybeRequestMoreTxMemory(ui64 usage, NTabletFlatExecutor::TTransactionContext &txc) {
+ if (usage > txc.GetMemoryLimit()) {
+ ui64 request = Max(usage - txc.GetMemoryLimit(), txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
+ txc.RequestMemory(request);
+ return true;
+ }
+ return false;
+}
+
class TDataShard::TTxStoreTablePath : public NTabletFlatExecutor::TTransactionBase<TDataShard> {
-public:
+public:
TTxStoreTablePath(TDataShard *self,
- ui64 pathId,
- const TString &path);
- bool Execute(TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(const TActorContext &ctx) override;
- TTxType GetTxType() const override { return TXTYPE_STORE_TABLE_PATH; }
-
-private:
- ui64 PathId;
- TString Path;
-};
-
+ ui64 pathId,
+ const TString &path);
+ bool Execute(TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(const TActorContext &ctx) override;
+ TTxType GetTxType() const override { return TXTYPE_STORE_TABLE_PATH; }
+
+private:
+ ui64 PathId;
+ TString Path;
+};
+
class TDataShard::TTxStoreScanState : public NTabletFlatExecutor::TTransactionBase<TDataShard> {
public:
TTxStoreScanState(TDataShard* ds, TEvPrivate::TEvPersistScanState::TPtr ev);
diff --git a/ydb/core/tx/datashard/datashard_user_table.cpp b/ydb/core/tx/datashard/datashard_user_table.cpp
index 73dc6fa0d55..70bc9400733 100644
--- a/ydb/core/tx/datashard/datashard_user_table.cpp
+++ b/ydb/core/tx/datashard/datashard_user_table.cpp
@@ -17,7 +17,7 @@ TUserTable::TUserTable(ui32 localTid, const NKikimrSchemeOp::TTableDescription&
{
Y_PROTOBUF_SUPPRESS_NODISCARD descr.SerializeToString(&Schema);
Name = descr.GetName();
- Path = descr.GetPath();
+ Path = descr.GetPath();
ParseProto(descr);
}
@@ -29,17 +29,17 @@ TUserTable::TUserTable(const TUserTable& table, const NKikimrSchemeOp::TTableDes
AlterSchema();
}
-void TUserTable::SetPath(const TString &path)
-{
+void TUserTable::SetPath(const TString &path)
+{
auto name = ExtractBase(path);
if (!name) {
return;
}
Name = name;
- Path = path;
- AlterSchema();
-}
+ Path = path;
+ AlterSchema();
+}
void TUserTable::SetTableSchemaVersion(ui64 schemaVersion)
{
@@ -187,7 +187,7 @@ bool TUserTable::HasCdcStreams() const {
}
void TUserTable::ParseProto(const NKikimrSchemeOp::TTableDescription& descr)
-{
+{
// We expect schemeshard to send us full list of storage rooms
if (descr.GetPartitionConfig().StorageRoomsSize()) {
Rooms.clear();
@@ -252,14 +252,14 @@ void TUserTable::ParseProto(const NKikimrSchemeOp::TTableDescription& descr)
Y_VERIFY(KeyColumnIds.size() == KeyColumnTypes.size());
}
-
- if (descr.HasPartitionRangeBegin()) {
- Y_VERIFY(descr.HasPartitionRangeEnd());
- Range = TSerializedTableRange(descr.GetPartitionRangeBegin(),
- descr.GetPartitionRangeEnd(),
- descr.GetPartitionRangeBeginIsInclusive(),
- descr.GetPartitionRangeEndIsInclusive());
- }
+
+ if (descr.HasPartitionRangeBegin()) {
+ Y_VERIFY(descr.HasPartitionRangeEnd());
+ Range = TSerializedTableRange(descr.GetPartitionRangeBegin(),
+ descr.GetPartitionRangeEnd(),
+ descr.GetPartitionRangeBeginIsInclusive(),
+ descr.GetPartitionRangeEndIsInclusive());
+ }
TableSchemaVersion = descr.GetTableSchemaVersion();
IsBackup = descr.GetIsBackup();
@@ -334,14 +334,14 @@ void TUserTable::AlterSchema() {
descr->SetNotNull(column.NotNull);
}
- schema.SetPartitionRangeBegin(Range.From.GetBuffer());
- schema.SetPartitionRangeBeginIsInclusive(Range.FromInclusive);
- schema.SetPartitionRangeEnd(Range.To.GetBuffer());
- schema.SetPartitionRangeEndIsInclusive(Range.ToInclusive);
-
+ schema.SetPartitionRangeBegin(Range.From.GetBuffer());
+ schema.SetPartitionRangeBeginIsInclusive(Range.FromInclusive);
+ schema.SetPartitionRangeEnd(Range.To.GetBuffer());
+ schema.SetPartitionRangeEndIsInclusive(Range.ToInclusive);
+
schema.SetPath(Name);
- schema.SetPath(Path);
-
+ schema.SetPath(Path);
+
SetSchema(schema);
}
diff --git a/ydb/core/tx/datashard/datashard_user_table.h b/ydb/core/tx/datashard/datashard_user_table.h
index 8b6cc5255e0..0dab30cb84f 100644
--- a/ydb/core/tx/datashard/datashard_user_table.h
+++ b/ydb/core/tx/datashard/datashard_user_table.h
@@ -6,9 +6,9 @@
#include <ydb/core/scheme/scheme_tabledefs.h>
#include <ydb/core/tablet_flat/flat_stat_table.h>
-#include <util/generic/ptr.h>
+#include <util/generic/ptr.h>
#include <util/generic/hash.h>
-
+
namespace NKikimr {
namespace NTabletFlatExecutor {
@@ -18,10 +18,10 @@ class TTransactionContext;
namespace NDataShard {
//
-struct TUserTable : public TThrRefBase {
- using TPtr = TIntrusivePtr<TUserTable>;
+struct TUserTable : public TThrRefBase {
+ using TPtr = TIntrusivePtr<TUserTable>;
using TCPtr = TIntrusiveConstPtr<TUserTable>;
-
+
struct TUserFamily {
using ECodec = NTable::NPage::ECodec;
using ECache = NTable::NPage::ECache;
@@ -345,13 +345,13 @@ struct TUserTable : public TThrRefBase {
ui32 LocalTid = Max<ui32>();
ui32 ShadowTid = 0;
TString Name;
- TString Path;
+ TString Path;
TMap<ui32, TStorageRoom::TPtr> Rooms;
TMap<ui32, TUserFamily> Families;
TMap<ui32, TUserColumn> Columns;
TVector<NScheme::TTypeId> KeyColumnTypes;
TVector<ui32> KeyColumnIds;
- TSerializedTableRange Range;
+ TSerializedTableRange Range;
bool IsBackup = false;
TMap<TPathId, TTableIndex> Indexes;
@@ -393,8 +393,8 @@ struct TUserTable : public TThrRefBase {
Y_PROTOBUF_SUPPRESS_NODISCARD description.SerializeToString(&Schema);
}
- void SetPath(const TString &path);
-
+ void SetPath(const TString &path);
+
ui64 GetTableSchemaVersion() const { return TableSchemaVersion; }
void SetTableSchemaVersion(ui64 schemaVersion);
bool ResetTableSchemaVersion();
diff --git a/ydb/core/tx/datashard/datashard_ut_common.cpp b/ydb/core/tx/datashard/datashard_ut_common.cpp
index 16e4996610e..d754f7ad0e2 100644
--- a/ydb/core/tx/datashard/datashard_ut_common.cpp
+++ b/ydb/core/tx/datashard/datashard_ut_common.cpp
@@ -11,7 +11,7 @@
#include <ydb/core/tx/tx_proxy/proxy.h>
#include <ydb/core/tx/schemeshard/schemeshard_build_index.h>
#include <ydb/public/sdk/cpp/client/ydb_result/result.h>
-
+
#include <ydb/library/yql/minikql/mkql_node_serialization.h>
#include <library/cpp/testing/unittest/registar.h>
@@ -23,14 +23,14 @@ namespace NKikimr {
using namespace NMiniKQL;
using namespace NSchemeShard;
-using namespace Tests;
+using namespace Tests;
-const bool ENABLE_DATASHARD_LOG = true;
+const bool ENABLE_DATASHARD_LOG = true;
const bool DUMP_RESULT = false;
void TTester::Setup(TTestActorRuntime& runtime, const TOptions& opts) {
if (ENABLE_DATASHARD_LOG) {
- runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NActors::NLog::PRI_TRACE);
+ runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NActors::NLog::PRI_TRACE);
}
runtime.SetLogPriority(NKikimrServices::MINIKQL_ENGINE, NActors::NLog::PRI_DEBUG);
@@ -45,7 +45,7 @@ void TTester::Setup(TTestActorRuntime& runtime, const TOptions& opts) {
"dc-1", domainId, FAKE_SCHEMESHARD_TABLET_ID,
domainId, domainId, TVector<ui32>{domainId},
domainId, TVector<ui32>{domainId},
- planResolution,
+ planResolution,
TVector<ui64>{TDomainsInfo::MakeTxCoordinatorIDFixed(domainId, 1)},
TVector<ui64>{},
TVector<ui64>{TDomainsInfo::MakeTxAllocatorIDFixed(domainId, 1)});
@@ -202,7 +202,7 @@ void TTester::CreateSchema(ESchema schema, const TOptions& opts) {
TString keyValueSchemeText =
"Name: \"table1\"\n"
"Id_Deprecated: 13\n"
- "Path: \"/Root/table1\"\n"
+ "Path: \"/Root/table1\"\n"
"Columns { Id: 34 Name: \"key\" TypeId: " + ToString<int>(NScheme::NTypeIds::Uint32) + " }\n"
"Columns { Id: 56 Name: \"value\" TypeId: " + ToString<int>(NScheme::NTypeIds::Utf8) + " }\n"
"Columns { Id: 57 Name: \"uint\" TypeId: " + ToString<int>(NScheme::NTypeIds::Uint32) + " }\n"
@@ -213,7 +213,7 @@ void TTester::CreateSchema(ESchema schema, const TOptions& opts) {
"Name: \"table2\"\n"
"PathId { OwnerId: " + ToString(FAKE_SCHEMESHARD_TABLET_ID) + " LocalId: 14 }\n"
- "Path: \"/Root/table2\"\n"
+ "Path: \"/Root/table2\"\n"
"Columns { Id: 34 Name: \"key1\" TypeId: " + ToString<int>(NScheme::NTypeIds::Uint32) + " }\n"
"Columns { Id: 35 Name: \"key2\" TypeId: " + ToString<int>(NScheme::NTypeIds::Utf8) + " }\n"
"Columns { Id: 56 Name: \"value\" TypeId: " + ToString<int>(NScheme::NTypeIds::Utf8) + " }\n"
@@ -236,7 +236,7 @@ void TTester::CreateSchema(ESchema schema, const TOptions& opts) {
"Name: \"table1\"\n"
"Id_Deprecated: 13\n"
"PathId { OwnerId: " + ToString(FAKE_SCHEMESHARD_TABLET_ID) + " LocalId: 13 }\n"
- "Path: \"/Root/table1\"\n"
+ "Path: \"/Root/table1\"\n"
"Columns { Id: 34 Name: \"key\" TypeId: " + ToString<int>(NScheme::NTypeIds::Uint32) + " }\n"
"Columns { Id: 56 Name: \"value\" TypeId: " + ToString<int>(NScheme::NTypeIds::Utf8) + " }\n"
"Columns { Id: 57 Name: \"__tablet\" TypeId: " + ToString<int>(NScheme::NTypeIds::Uint64) + " }\n"
@@ -301,10 +301,10 @@ TBalanceCoverageBuilder * TFakeProxyTx::GetCoverageBuilder(ui64 shard) {
//
-ui32 TFakeProxyTx::SetProgram(TTester& tester) {
- return SetProgram(tester, TxBody());
-}
-
+ui32 TFakeProxyTx::SetProgram(TTester& tester) {
+ return SetProgram(tester, TxBody());
+}
+
ui32 TFakeProxyTx::SetProgram(TTester& tester, const TString& programText) {
TEngineFlatSettings settings(IEngineFlat::EProtocol::V1,
tester.Runtime.GetAppData().FunctionRegistry,
@@ -375,7 +375,7 @@ void TFakeProxyTx::AddProposeShardResult(ui32 shardId, const TEvDataShard::TEvPr
MinStep = Max(MinStep, event->Record.GetMinStep());
MaxStep = Min(MaxStep, event->Record.GetMaxStep());
} else {
- UNIT_ASSERT(event->IsExecError() || event->IsError() || event->IsBadRequest());
+ UNIT_ASSERT(event->IsExecError() || event->IsError() || event->IsBadRequest());
}
}
@@ -419,76 +419,76 @@ NKikimrMiniKQL::TResult TFakeProxyTx::GetResult() const {
//
-ui32 TFakeScanTx::SetProgram(TTester& tester) {
- NKikimrTxDataShard::TDataTransaction dataTransaction;
+ui32 TFakeScanTx::SetProgram(TTester& tester) {
+ NKikimrTxDataShard::TDataTransaction dataTransaction;
Y_PROTOBUF_SUPPRESS_NODISCARD dataTransaction.ParseFromArray(TxBody_.data(), TxBody_.size());
ActorIdToProto(tester.Sender, dataTransaction.MutableSink());
- TxBody_ = dataTransaction.SerializeAsString();
-
- const char * rangePattern = R"(
- (let $%u '('IncFrom 'IncTo '('key (Uint32 '%u) (Uint32 '%u))))
- (let points_ (Extend points_ (Member (SelectRange 'table1 $%u '('key 'uint) '()) 'List))))";
-
- TString body;
- body += Sprintf(rangePattern, 10, 0, Max<ui32>(), 10);
-
- auto pgm = Sprintf(R"((
- (let points_ (List (ListType (TypeOf (Unwrap (SelectRow 'table1 '('('key (Uint32 '0))) '('key 'uint)))))))
- %s
- (return (AsList (SetResult 'Result points_)))
+ TxBody_ = dataTransaction.SerializeAsString();
+
+ const char * rangePattern = R"(
+ (let $%u '('IncFrom 'IncTo '('key (Uint32 '%u) (Uint32 '%u))))
+ (let points_ (Extend points_ (Member (SelectRange 'table1 $%u '('key 'uint) '()) 'List))))";
+
+ TString body;
+ body += Sprintf(rangePattern, 10, 0, Max<ui32>(), 10);
+
+ auto pgm = Sprintf(R"((
+ (let points_ (List (ListType (TypeOf (Unwrap (SelectRow 'table1 '('('key (Uint32 '0))) '('key 'uint)))))))
+ %s
+ (return (AsList (SetResult 'Result points_)))
))", body.data());
- return TFakeProxyTx::SetProgram(tester, pgm);
-}
-
-ui32 TFakeScanTx::GetShardProgram(ui32 idx, TString& outTxBody) {
- IEngineFlat::TShardData shardData;
- auto result = Engine->GetAffectedShard(idx, shardData);
- UNIT_ASSERT_EQUAL_C(result, IEngineFlat::EResult::Ok, Engine->GetErrors());
-
- outTxBody = TxBody();
- return shardData.ShardId;
-}
-
-void TFakeScanTx::AddPlanStepShardResult(ui32 /*shardId*/,
- const TEvDataShard::TEvProposeTransactionResult * event,
- bool /*complete*/) {
- if (event->Record.GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::RESPONSE_DATA) {
- auto &res = event->Record.GetTxResult();
+ return TFakeProxyTx::SetProgram(tester, pgm);
+}
+
+ui32 TFakeScanTx::GetShardProgram(ui32 idx, TString& outTxBody) {
+ IEngineFlat::TShardData shardData;
+ auto result = Engine->GetAffectedShard(idx, shardData);
+ UNIT_ASSERT_EQUAL_C(result, IEngineFlat::EResult::Ok, Engine->GetErrors());
+
+ outTxBody = TxBody();
+ return shardData.ShardId;
+}
+
+void TFakeScanTx::AddPlanStepShardResult(ui32 /*shardId*/,
+ const TEvDataShard::TEvProposeTransactionResult * event,
+ bool /*complete*/) {
+ if (event->Record.GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::RESPONSE_DATA) {
+ auto &res = event->Record.GetTxResult();
YdbOld::ResultSet part;
UNIT_ASSERT(part.ParseFromArray(res.data(), res.size()));
-
+
if (Result.column_metaSize())
part.Clearcolumn_meta();
- Result.MergeFrom(part);
+ Result.MergeFrom(part);
UNIT_ASSERT(Result.column_metaSize());
- } else if (event->Record.GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::ERROR) {
- Status = IEngineFlat::EStatus::Error;
- } else {
- UNIT_ASSERT(event->Record.GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE);
- Status = IEngineFlat::EStatus::Complete;
- }
-}
-
+ } else if (event->Record.GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::ERROR) {
+ Status = IEngineFlat::EStatus::Error;
+ } else {
+ UNIT_ASSERT(event->Record.GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE);
+ Status = IEngineFlat::EStatus::Complete;
+ }
+}
+
YdbOld::ResultSet TFakeScanTx::GetScanResult() const {
- return Result;
-}
-
-IEngineFlat::EStatus TFakeScanTx::GetStatus(bool /*atPropose*/) {
- return Status;
-}
-
-//
-
+ return Result;
+}
+
+IEngineFlat::EStatus TFakeScanTx::GetStatus(bool /*atPropose*/) {
+ return Status;
+}
+
+//
+
void TFakeMiniKQLProxy::Enqueue(const TString& programText, std::function<bool(TFakeProxyTx&)> check, ui32 flags) {
TxQueue.push_back(std::make_shared<TFakeProxyTx>(++LastTxId_, programText, flags));
TxQueue.back()->SetCheck(check);
}
-void TFakeMiniKQLProxy::EnqueueScan(const TString& programText, std::function<bool(TFakeProxyTx&)> check, ui32 flags) {
- TxQueue.push_back(std::make_shared<TFakeScanTx>(++LastTxId_, programText, flags));
- TxQueue.back()->SetCheck(check);
-}
-
+void TFakeMiniKQLProxy::EnqueueScan(const TString& programText, std::function<bool(TFakeProxyTx&)> check, ui32 flags) {
+ TxQueue.push_back(std::make_shared<TFakeScanTx>(++LastTxId_, programText, flags));
+ TxQueue.back()->SetCheck(check);
+}
+
void TFakeMiniKQLProxy::ExecQueue() {
TMap<ui64, TFakeProxyTx::TPtr> needPlan;
for (auto& tx : TxQueue) {
@@ -511,9 +511,9 @@ void TFakeMiniKQLProxy::ExecQueue() {
TxQueue.clear();
}
-IEngineFlat::EStatus TFakeMiniKQLProxy::Execute(const TString& programText,
- NKikimrMiniKQL::TResult& out,
- bool waitForResult) {
+IEngineFlat::EStatus TFakeMiniKQLProxy::Execute(const TString& programText,
+ NKikimrMiniKQL::TResult& out,
+ bool waitForResult) {
ui32 txId = ++LastTxId_;
TMap<ui64, TFakeProxyTx::TPtr> txs;
txs[txId] = std::make_shared<TFakeProxyTx>(txId, programText);
@@ -523,11 +523,11 @@ IEngineFlat::EStatus TFakeMiniKQLProxy::Execute(const TString& programText,
auto status = tx.GetStatus(true);
if (status == IEngineFlat::EStatus::Unknown) {
ui64 stepId = ++LastStep_;
- Plan(stepId, txs, waitForResult);
+ Plan(stepId, txs, waitForResult);
status = tx.GetStatus(false);
}
- if (waitForResult)
- out = tx.GetResult();
+ if (waitForResult)
+ out = tx.GetResult();
return status;
}
@@ -589,7 +589,7 @@ void TFakeMiniKQLProxy::ProposeScheme(TFakeProxyTx& tx, const TVector<ui64>& sha
ui32 txFlags = NDataShard::TTxFlags::Default;
for (;;) {
- auto proposal = new TEvDataShard::TEvProposeTransaction(kind, FAKE_SCHEMESHARD_TABLET_ID,
+ auto proposal = new TEvDataShard::TEvProposeTransaction(kind, FAKE_SCHEMESHARD_TABLET_ID,
Tester.Sender, txId, txBody, NKikimrSubDomains::TProcessingParams(), txFlags);
Tester.Runtime.SendToPipe(shardId, Tester.Sender, proposal);
TAutoPtr<IEventHandle> handle;
@@ -631,7 +631,7 @@ void TFakeMiniKQLProxy::ProposeScheme(TFakeProxyTx& tx, const TVector<ui64>& sha
void TFakeMiniKQLProxy::Propose(TFakeProxyTx& tx, bool holdImmediate) {
ui64 txId = tx.TxId();
- ui32 shardsCount = tx.SetProgram(Tester);
+ ui32 shardsCount = tx.SetProgram(Tester);
if (holdImmediate && tx.Immediate())
return;
@@ -642,7 +642,7 @@ void TFakeMiniKQLProxy::Propose(TFakeProxyTx& tx, bool holdImmediate) {
shards.insert(shard);
auto proposal = new TEvDataShard::TEvProposeTransaction(
- tx.TxKind(), Tester.Sender, txId, txBody, tx.TxFlags());
+ tx.TxKind(), Tester.Sender, txId, txBody, tx.TxFlags());
Tester.Runtime.SendToPipe(shard, Tester.Sender, proposal);
}
@@ -652,11 +652,11 @@ void TFakeMiniKQLProxy::Propose(TFakeProxyTx& tx, bool holdImmediate) {
TAutoPtr<IEventHandle> handle;
auto event = Tester.Runtime.GrabEdgeEvent<TEvDataShard::TEvProposeTransactionResult>(handle);
UNIT_ASSERT(event);
- if (event->GetTxId() != txId)
- continue;
-
+ if (event->GetTxId() != txId)
+ continue;
+
UNIT_ASSERT(!event->IsTryLater()); // need resend otherwise
- UNIT_ASSERT_EQUAL(event->GetTxKind(), tx.TxKind());
+ UNIT_ASSERT_EQUAL(event->GetTxKind(), tx.TxKind());
ui64 shard = event->GetOrigin();
@@ -679,19 +679,19 @@ void TFakeMiniKQLProxy::ResolveShards(const TSet<ui64>& shards) {
}
}
-ui64 TFakeMiniKQLProxy::Plan(ui64 stepId, const TMap<ui64, TFakeProxyTx::TPtr>& txs,
- bool waitForResult) {
+ui64 TFakeMiniKQLProxy::Plan(ui64 stepId, const TMap<ui64, TFakeProxyTx::TPtr>& txs,
+ bool waitForResult) {
using TEvPlanStepAck = TEvTxProcessing::TEvPlanStepAck;
using TEvPlanStepAccepted = TEvTxProcessing::TEvPlanStepAccepted;
using TEvReadSet = TEvTxProcessing::TEvReadSet;
//using TEvReadSetAck = TEvTxProcessing::TEvReadSetAck;
using TEvProposeTransactionResult = TEvDataShard::TEvProposeTransactionResult;
- using TEvStreamClearanceRequest = TEvTxProcessing::TEvStreamClearanceRequest;
- using TEvStreamClearancePending = TEvTxProcessing::TEvStreamClearancePending;
- using TEvStreamClearanceResponse = TEvTxProcessing::TEvStreamClearanceResponse;
- using TEvStreamQuotaRequest = TEvTxProcessing::TEvStreamQuotaRequest;
- using TEvStreamQuotaResponse = TEvTxProcessing::TEvStreamQuotaResponse;
- using TEvStreamDataAck = TEvTxProcessing::TEvStreamDataAck;
+ using TEvStreamClearanceRequest = TEvTxProcessing::TEvStreamClearanceRequest;
+ using TEvStreamClearancePending = TEvTxProcessing::TEvStreamClearancePending;
+ using TEvStreamClearanceResponse = TEvTxProcessing::TEvStreamClearanceResponse;
+ using TEvStreamQuotaRequest = TEvTxProcessing::TEvStreamQuotaRequest;
+ using TEvStreamQuotaResponse = TEvTxProcessing::TEvStreamQuotaResponse;
+ using TEvStreamDataAck = TEvTxProcessing::TEvStreamDataAck;
TSet<ui64> immediateTxs;
THashMap<ui64, TVector<ui64>> plans;
@@ -709,12 +709,12 @@ ui64 TFakeMiniKQLProxy::Plan(ui64 stepId, const TMap<ui64, TFakeProxyTx::TPtr>&
for (ui64 shard : tx->Shards) {
plans[shard].push_back(txId);
acks.insert(std::make_pair(shard, txId));
- if (tx->IsReadTable()) {
- streams.insert(std::make_pair(shard, txId));
- scans.insert(std::make_pair(shard, txId));
- } else {
- results.insert(std::make_pair(shard, txId));
- }
+ if (tx->IsReadTable()) {
+ streams.insert(std::make_pair(shard, txId));
+ scans.insert(std::make_pair(shard, txId));
+ } else {
+ results.insert(std::make_pair(shard, txId));
+ }
}
}
}
@@ -810,13 +810,13 @@ ui64 TFakeMiniKQLProxy::Plan(ui64 stepId, const TMap<ui64, TFakeProxyTx::TPtr>&
Tester.Runtime.SetObserverFunc(observer);
}
- while (acks || plans || (results && waitForResult) || streams) {
+ while (acks || plans || (results && waitForResult) || streams) {
#if 0
Cerr << "acks: " << acks.size() << " plans: " << plans.size() << " results: " << results.size() << Endl;
#endif
TAutoPtr<IEventHandle> handle;
- auto eventTuple = Tester.Runtime.GrabEdgeEvents<TEvPlanStepAck, TEvPlanStepAccepted, TEvProposeTransactionResult,
- TEvStreamClearanceRequest>(handle);
+ auto eventTuple = Tester.Runtime.GrabEdgeEvents<TEvPlanStepAck, TEvPlanStepAccepted, TEvProposeTransactionResult,
+ TEvStreamClearanceRequest>(handle);
switch (handle->Type) {
case TEvPlanStepAck::EventType: {
@@ -854,10 +854,10 @@ ui64 TFakeMiniKQLProxy::Plan(ui64 stepId, const TMap<ui64, TFakeProxyTx::TPtr>&
}
auto it = txs.find(txId);
- if (it == txs.end())
- continue;
+ if (it == txs.end())
+ continue;
TFakeProxyTx::TPtr tx = it->second;
- UNIT_ASSERT_EQUAL(event->GetTxKind(), tx->TxKind());
+ UNIT_ASSERT_EQUAL(event->GetTxKind(), tx->TxKind());
if (tx->Immediate()) {
UNIT_ASSERT_VALUES_EQUAL(event->GetStepOrderId().first, 0);
@@ -899,13 +899,13 @@ ui64 TFakeMiniKQLProxy::Plan(ui64 stepId, const TMap<ui64, TFakeProxyTx::TPtr>&
}
break;
}
- case TEvStreamClearanceRequest::EventType: {
- auto event = std::get<TEvStreamClearanceRequest*>(eventTuple);
- ui64 txId = event->Record.GetTxId();
- ui64 shard = event->Record.GetShardId();
- streams.erase(std::make_pair(shard, txId));
- Tester.Runtime.SendToPipe(shard, Tester.Sender, new TEvStreamClearancePending(txId));
- }
+ case TEvStreamClearanceRequest::EventType: {
+ auto event = std::get<TEvStreamClearanceRequest*>(eventTuple);
+ ui64 txId = event->Record.GetTxId();
+ ui64 shard = event->Record.GetShardId();
+ streams.erase(std::make_pair(shard, txId));
+ Tester.Runtime.SendToPipe(shard, Tester.Sender, new TEvStreamClearancePending(txId));
+ }
}
}
@@ -929,22 +929,22 @@ ui64 TFakeMiniKQLProxy::Plan(ui64 stepId, const TMap<ui64, TFakeProxyTx::TPtr>&
Tester.Runtime.SendToPipe(shard, Tester.Sender, planStep);
}
- // finish scans
-
- results.clear();
- for (const auto& pair : scans) {
- ui64 shard = pair.first;
- ui64 txId = pair.second;
- results.insert(std::make_pair(shard, txId));
- TAutoPtr<TEvStreamClearanceResponse> ev = new TEvStreamClearanceResponse;
- ev->Record.SetTxId(txId);
- ev->Record.SetCleared(true);
- Tester.Runtime.SendToPipe(shard, Tester.Sender, ev.Release());
- }
-
+ // finish scans
+
+ results.clear();
+ for (const auto& pair : scans) {
+ ui64 shard = pair.first;
+ ui64 txId = pair.second;
+ results.insert(std::make_pair(shard, txId));
+ TAutoPtr<TEvStreamClearanceResponse> ev = new TEvStreamClearanceResponse;
+ ev->Record.SetTxId(txId);
+ ev->Record.SetCleared(true);
+ Tester.Runtime.SendToPipe(shard, Tester.Sender, ev.Release());
+ }
+
while (results) {
TAutoPtr<IEventHandle> handle;
- auto eventTuple = Tester.Runtime.GrabEdgeEvents<TEvProposeTransactionResult, TEvStreamQuotaRequest, TEvStreamDataAck>(handle);
+ auto eventTuple = Tester.Runtime.GrabEdgeEvents<TEvProposeTransactionResult, TEvStreamQuotaRequest, TEvStreamDataAck>(handle);
switch (handle->Type) {
case TEvProposeTransactionResult::EventType: {
@@ -955,30 +955,30 @@ ui64 TFakeMiniKQLProxy::Plan(ui64 stepId, const TMap<ui64, TFakeProxyTx::TPtr>&
auto it = txs.find(txId);
UNIT_ASSERT(it != txs.end());
TFakeProxyTx::TPtr tx = it->second;
- UNIT_ASSERT_EQUAL(event->GetTxKind(), tx->TxKind());
+ UNIT_ASSERT_EQUAL(event->GetTxKind(), tx->TxKind());
//tx->AddProposeShardResult(shard, event);
- if (event->Record.GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::RESPONSE_DATA) {
- Tester.Runtime.Send(new IEventHandle(handle->Sender, Tester.Sender, new TEvStreamDataAck));
- tx->AddPlanStepShardResult(shard, event, false);
- } else {
- UNIT_ASSERT(event->IsComplete());
- tx->AddPlanStepShardResult(shard, event, true);
- results.erase(std::make_pair(shard, txId));
- }
+ if (event->Record.GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::RESPONSE_DATA) {
+ Tester.Runtime.Send(new IEventHandle(handle->Sender, Tester.Sender, new TEvStreamDataAck));
+ tx->AddPlanStepShardResult(shard, event, false);
+ } else {
+ UNIT_ASSERT(event->IsComplete());
+ tx->AddPlanStepShardResult(shard, event, true);
+ results.erase(std::make_pair(shard, txId));
+ }
+ break;
+ }
+ case TEvStreamQuotaRequest::EventType: {
+ auto event = std::get<TEvStreamQuotaRequest*>(eventTuple);
+ ui64 txId = event->Record.GetTxId();
+ TAutoPtr<TEvStreamQuotaResponse> ev = new TEvStreamQuotaResponse;
+ ev->Record.SetTxId(txId);
+ ev->Record.SetMessageSizeLimit(1 << 30);
+ ev->Record.SetReservedMessages(10);
+ ev->Record.SetRowLimit(1 << 20);
+ Tester.Runtime.Send(new IEventHandle(handle->Sender, Tester.Sender, ev.Release()));
break;
}
- case TEvStreamQuotaRequest::EventType: {
- auto event = std::get<TEvStreamQuotaRequest*>(eventTuple);
- ui64 txId = event->Record.GetTxId();
- TAutoPtr<TEvStreamQuotaResponse> ev = new TEvStreamQuotaResponse;
- ev->Record.SetTxId(txId);
- ev->Record.SetMessageSizeLimit(1 << 30);
- ev->Record.SetReservedMessages(10);
- ev->Record.SetRowLimit(1 << 20);
- Tester.Runtime.Send(new IEventHandle(handle->Sender, Tester.Sender, ev.Release()));
- break;
- }
}
}
@@ -1028,31 +1028,31 @@ bool TDatashardInitialEventsFilter::operator()(TTestActorRuntimeBase& runtime, T
return !RemainTablets.empty();
}
-THolder<NKqp::TEvKqp::TEvQueryRequest> MakeSQLRequest(const TString &sql,
- bool dml)
-{
- auto request = MakeHolder<NKqp::TEvKqp::TEvQueryRequest>();
- request->Record.MutableRequest()->MutableTxControl()->mutable_begin_tx()->mutable_serializable_read_write();
- request->Record.MutableRequest()->MutableTxControl()->set_commit_tx(true);
- request->Record.MutableRequest()->SetAction(NKikimrKqp::QUERY_ACTION_EXECUTE);
- request->Record.MutableRequest()->SetType(dml
- ? NKikimrKqp::QUERY_TYPE_SQL_DML
- : NKikimrKqp::QUERY_TYPE_SQL_DDL);
- request->Record.MutableRequest()->SetQuery(sql);
- return request;
-}
-
-void InitRoot(Tests::TServer::TPtr server,
+THolder<NKqp::TEvKqp::TEvQueryRequest> MakeSQLRequest(const TString &sql,
+ bool dml)
+{
+ auto request = MakeHolder<NKqp::TEvKqp::TEvQueryRequest>();
+ request->Record.MutableRequest()->MutableTxControl()->mutable_begin_tx()->mutable_serializable_read_write();
+ request->Record.MutableRequest()->MutableTxControl()->set_commit_tx(true);
+ request->Record.MutableRequest()->SetAction(NKikimrKqp::QUERY_ACTION_EXECUTE);
+ request->Record.MutableRequest()->SetType(dml
+ ? NKikimrKqp::QUERY_TYPE_SQL_DML
+ : NKikimrKqp::QUERY_TYPE_SQL_DDL);
+ request->Record.MutableRequest()->SetQuery(sql);
+ return request;
+}
+
+void InitRoot(Tests::TServer::TPtr server,
TActorId sender)
-{
+{
if (server->GetSettings().StoragePoolTypes.empty()) {
return;
}
- auto &runtime = *server->GetRuntime();
- auto &settings = server->GetSettings();
+ auto &runtime = *server->GetRuntime();
+ auto &settings = server->GetSettings();
- auto tid = ChangeStateStorage(SchemeRoot, settings.Domain);
+ auto tid = ChangeStateStorage(SchemeRoot, settings.Domain);
const TDomainsInfo::TDomain& domain = runtime.GetAppData().DomainsInfo->GetDomain(settings.Domain);
auto evTx = MakeHolder<TEvSchemeShard::TEvModifySchemeTransaction>(1, tid);
@@ -1085,25 +1085,25 @@ void InitRoot(Tests::TServer::TPtr server,
auto event = runtime.GrabEdgeEvent<TEvSchemeShard::TEvNotifyTxCompletionResult>(handle);
UNIT_ASSERT_VALUES_EQUAL(event->Record.GetTxId(), 1);
}
-}
-
-void CreateShardedTable(Tests::TServer::TPtr server,
+}
+
+void CreateShardedTable(Tests::TServer::TPtr server,
TActorId sender,
- const TString &root,
- const TString &name,
+ const TString &root,
+ const TString &name,
const TShardedTableOptions &opts)
-{
- auto &runtime = *server->GetRuntime();
- auto &settings = server->GetSettings();
-
- // Create table with four shards.
- ui64 txId;
- TAutoPtr<IEventHandle> handle;
- {
- auto request = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
- request->Record.SetExecTimeoutPeriod(Max<ui64>());
- auto &tx = *request->Record.MutableTransaction()->MutableModifyScheme();
- tx.SetWorkingDir(root);
+{
+ auto &runtime = *server->GetRuntime();
+ auto &settings = server->GetSettings();
+
+ // Create table with four shards.
+ ui64 txId;
+ TAutoPtr<IEventHandle> handle;
+ {
+ auto request = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
+ request->Record.SetExecTimeoutPeriod(Max<ui64>());
+ auto &tx = *request->Record.MutableTransaction()->MutableModifyScheme();
+ tx.SetWorkingDir(root);
NKikimrSchemeOp::TTableDescription* desc = nullptr;
if (opts.Indexes_) {
@@ -1124,8 +1124,8 @@ void CreateShardedTable(Tests::TServer::TPtr server,
if (column.IsKey) {
desc->AddKeyColumnNames(column.Name);
}
- }
-
+ }
+
for (const auto& index : opts.Indexes_) {
auto* indexDesc = tx.MutableCreateIndexedTable()->MutableIndexDescription()->Add();
@@ -1144,7 +1144,7 @@ void CreateShardedTable(Tests::TServer::TPtr server,
if (!opts.EnableOutOfOrder_)
desc->MutablePartitionConfig()->MutablePipelineConfig()->SetEnableOutOfOrder(false);
-
+
if (opts.Policy_) {
opts.Policy_->Serialize(*desc->MutablePartitionConfig()->MutableCompactionPolicy());
}
@@ -1168,20 +1168,20 @@ void CreateShardedTable(Tests::TServer::TPtr server,
family.SetStorage(NKikimrSchemeOp::ColumnStorageTest_1_2_1k);
}
- runtime.Send(new IEventHandle(MakeTxProxyID(), sender, request.Release()));
- auto reply = runtime.GrabEdgeEventRethrow<TEvTxUserProxy::TEvProposeTransactionStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecInProgress);
- txId = reply->Record.GetTxId();
- }
- {
+ runtime.Send(new IEventHandle(MakeTxProxyID(), sender, request.Release()));
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTxUserProxy::TEvProposeTransactionStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecInProgress);
+ txId = reply->Record.GetTxId();
+ }
+ {
auto request = MakeHolder<NSchemeShard::TEvSchemeShard::TEvNotifyTxCompletion>();
- request->Record.SetTxId(txId);
- auto tid = ChangeStateStorage(SchemeRoot, settings.Domain);
- runtime.SendToPipe(tid, sender, request.Release(), 0, GetPipeConfigWithRetries());
+ request->Record.SetTxId(txId);
+ auto tid = ChangeStateStorage(SchemeRoot, settings.Domain);
+ runtime.SendToPipe(tid, sender, request.Release(), 0, GetPipeConfigWithRetries());
runtime.GrabEdgeEventRethrow<TEvSchemeShard::TEvNotifyTxCompletionResult>(handle);
- }
-}
-
+ }
+}
+
void CreateShardedTable(Tests::TServer::TPtr server,
TActorId sender,
const TString &root,
@@ -1202,15 +1202,15 @@ void CreateShardedTable(Tests::TServer::TPtr server,
NKikimrScheme::TEvDescribeSchemeResult DescribeTable(Tests::TServer::TPtr server,
TActorId sender,
const TString &path)
-{
- auto &runtime = *server->GetRuntime();
- TAutoPtr<IEventHandle> handle;
- TVector<ui64> shards;
-
- auto request = MakeHolder<TEvTxUserProxy::TEvNavigate>();
- request->Record.MutableDescribePath()->SetPath(path);
+{
+ auto &runtime = *server->GetRuntime();
+ TAutoPtr<IEventHandle> handle;
+ TVector<ui64> shards;
+
+ auto request = MakeHolder<TEvTxUserProxy::TEvNavigate>();
+ request->Record.MutableDescribePath()->SetPath(path);
request->Record.MutableDescribePath()->MutableOptions()->SetShowPrivateTable(true);
- runtime.Send(new IEventHandle(MakeTxProxyID(), sender, request.Release()));
+ runtime.Send(new IEventHandle(MakeTxProxyID(), sender, request.Release()));
auto reply = runtime.GrabEdgeEventRethrow<TEvSchemeShard::TEvDescribeSchemeResult>(handle);
return *reply->MutableRecord();
@@ -1223,11 +1223,11 @@ TVector<ui64> GetTableShards(Tests::TServer::TPtr server,
TVector<ui64> shards;
auto lsResult = DescribeTable(server, sender, path);
for (auto &part : lsResult.GetPathDescription().GetTablePartitions())
- shards.push_back(part.GetDatashardId());
-
- return shards;
-}
-
+ shards.push_back(part.GetDatashardId());
+
+ return shards;
+}
+
std::pair<TTableInfoMap, ui64> GetTables(
Tests::TServer::TPtr server,
ui64 tabletId)
@@ -1712,31 +1712,31 @@ void SimulateSleep(Tests::TServer::TPtr server, TDuration duration) {
runtime.GrabEdgeEventRethrow<TEvents::TEvWakeup>(sender);
}
-void SendSQL(Tests::TServer::TPtr server,
+void SendSQL(Tests::TServer::TPtr server,
TActorId sender,
- const TString &sql,
- bool dml)
-{
- auto &runtime = *server->GetRuntime();
- auto request = MakeSQLRequest(sql, dml);
+ const TString &sql,
+ bool dml)
+{
+ auto &runtime = *server->GetRuntime();
+ auto request = MakeSQLRequest(sql, dml);
runtime.Send(new IEventHandle(NKqp::MakeKqpProxyID(runtime.GetNodeId()), sender, request.Release()));
-}
-
-void ExecSQL(Tests::TServer::TPtr server,
+}
+
+void ExecSQL(Tests::TServer::TPtr server,
TActorId sender,
- const TString &sql,
- bool dml,
- Ydb::StatusIds::StatusCode code)
-{
- auto &runtime = *server->GetRuntime();
- TAutoPtr<IEventHandle> handle;
-
- auto request = MakeSQLRequest(sql, dml);
+ const TString &sql,
+ bool dml,
+ Ydb::StatusIds::StatusCode code)
+{
+ auto &runtime = *server->GetRuntime();
+ TAutoPtr<IEventHandle> handle;
+
+ auto request = MakeSQLRequest(sql, dml);
runtime.Send(new IEventHandle(NKqp::MakeKqpProxyID(runtime.GetNodeId()), sender, request.Release()));
auto ev = runtime.GrabEdgeEventRethrow<NKqp::TEvKqp::TEvQueryResponse>(sender);
UNIT_ASSERT_VALUES_EQUAL(ev->Get()->Record.GetRef().GetYdbStatus(), code);
-}
-
+}
+
void WaitTabletBecomesOffline(TServer::TPtr server, ui64 tabletId)
{
struct IsShardStateChange
@@ -1763,7 +1763,7 @@ void WaitTabletBecomesOffline(TServer::TPtr server, ui64 tabletId)
TDispatchOptions options;
options.FinalEvents.emplace_back(IsShardStateChange(tabletId));
server->GetRuntime()->DispatchEvents(options);
-}
+}
namespace {
diff --git a/ydb/core/tx/datashard/datashard_ut_common.h b/ydb/core/tx/datashard/datashard_ut_common.h
index 2e60ebb8540..4b5d7fe4ea0 100644
--- a/ydb/core/tx/datashard/datashard_ut_common.h
+++ b/ydb/core/tx/datashard/datashard_ut_common.h
@@ -20,16 +20,16 @@ class TEngineHolder;
class TFakeMiniKQLProxy;
class TFakeProxyTx;
-constexpr ui64 FAKE_SCHEMESHARD_TABLET_ID = 4200;
+constexpr ui64 FAKE_SCHEMESHARD_TABLET_ID = 4200;
constexpr ui64 FAKE_TX_ALLOCATOR_TABLET_ID = 4201;
-
+
///
class TTester : public TNonCopyable {
public:
friend class TEngineHolder;
friend class TFakeMiniKQLProxy;
friend class TFakeProxyTx;
- friend class TFakeScanTx;
+ friend class TFakeScanTx;
using TKeyResolver = std::function<void(TKeyDesc&)>;
@@ -184,27 +184,27 @@ public:
/// @return shards count
ui32 SetProgram(TTester& tester, const TString& programText);
- virtual ui32 SetProgram(TTester& tester);
+ virtual ui32 SetProgram(TTester& tester);
/// @return shardId
- virtual ui32 GetShardProgram(ui32 idx, TString& outTxBody);
+ virtual ui32 GetShardProgram(ui32 idx, TString& outTxBody);
void AddProposeShardResult(ui32 shardId, const TEvDataShard::TEvProposeTransactionResult * event);
- virtual void AddPlanStepShardResult(ui32 shardId, const TEvDataShard::TEvProposeTransactionResult * event, bool complete);
+ virtual void AddPlanStepShardResult(ui32 shardId, const TEvDataShard::TEvProposeTransactionResult * event, bool complete);
- virtual IEngineFlat::EStatus GetStatus(bool atPropose);
- virtual NKikimrMiniKQL::TResult GetResult() const;
+ virtual IEngineFlat::EStatus GetStatus(bool atPropose);
+ virtual NKikimrMiniKQL::TResult GetResult() const;
ui64 TxId() const { return TxId_; }
ui32 TxFlags() const { return TxFlags_; }
TString TxBody() const { return TxBody_; }
- NKikimrTxDataShard::ETransactionKind TxKind() { return TxKind_; }
+ NKikimrTxDataShard::ETransactionKind TxKind() { return TxKind_; }
bool IsDataTx() const { return TxKind_ == NKikimrTxDataShard::TX_KIND_DATA; }
- bool IsReadTable() const { return TxKind_ == NKikimrTxDataShard::TX_KIND_SCAN; }
+ bool IsReadTable() const { return TxKind_ == NKikimrTxDataShard::TX_KIND_SCAN; }
bool HasErrors() const { return !Errors.empty(); }
bool Immediate() const { return IsDataTx() && (ShardsCount_ < 2) && !(TxFlags_ & NDataShard::TTxFlags::ForceOnline); }
ui32 ShardsCount() const { return ShardsCount_; }
void SetKindSchema() { TxKind_ = NKikimrTxDataShard::TX_KIND_SCHEME; }
- void SetKindScan() { TxKind_ = NKikimrTxDataShard::TX_KIND_SCAN; }
+ void SetKindScan() { TxKind_ = NKikimrTxDataShard::TX_KIND_SCAN; }
TBalanceCoverageBuilder * GetCoverageBuilder(ui64 shard);
@@ -218,9 +218,9 @@ public:
return true;
}
-protected:
+protected:
ui64 TxId_;
- NKikimrTxDataShard::ETransactionKind TxKind_;
+ NKikimrTxDataShard::ETransactionKind TxKind_;
TString TxBody_;
ui32 TxFlags_;
ui32 ShardsCount_;
@@ -229,27 +229,27 @@ protected:
};
///
-class TFakeScanTx : public TFakeProxyTx {
-public:
+class TFakeScanTx : public TFakeProxyTx {
+public:
TFakeScanTx(ui64 txId, const TString& txBody, ui32 flags = NDataShard::TTxFlags::Default)
- : TFakeProxyTx(txId, txBody, flags)
- , Status(IEngineFlat::EStatus::Unknown)
- {
- SetKindScan();
- }
-
- ui32 SetProgram(TTester& tester) override;
- ui32 GetShardProgram(ui32 idx, TString& outTxBody) override;
- void AddPlanStepShardResult(ui32 shardId, const TEvDataShard::TEvProposeTransactionResult * event, bool complete) override;
+ : TFakeProxyTx(txId, txBody, flags)
+ , Status(IEngineFlat::EStatus::Unknown)
+ {
+ SetKindScan();
+ }
+
+ ui32 SetProgram(TTester& tester) override;
+ ui32 GetShardProgram(ui32 idx, TString& outTxBody) override;
+ void AddPlanStepShardResult(ui32 shardId, const TEvDataShard::TEvProposeTransactionResult * event, bool complete) override;
YdbOld::ResultSet GetScanResult() const;
- IEngineFlat::EStatus GetStatus(bool atPropose) override;
-
-private:
+ IEngineFlat::EStatus GetStatus(bool atPropose) override;
+
+private:
YdbOld::ResultSet Result;
- IEngineFlat::EStatus Status;
-};
-
-///
+ IEngineFlat::EStatus Status;
+};
+
+///
class TFakeMiniKQLProxy {
public:
using IEngineFlat = NMiniKQL::IEngineFlat;
@@ -264,11 +264,11 @@ public:
// Propose + Plan (if needed) in own step
IEngineFlat::EStatus ExecSchemeCreateTable(const TString& schemaText, const TVector<ui64>& shards);
- IEngineFlat::EStatus Execute(const TString& programText, NKikimrMiniKQL::TResult& out,
- bool waitForResult = true);
- IEngineFlat::EStatus Execute(const TString& programText, bool waitForResult = true) {
+ IEngineFlat::EStatus Execute(const TString& programText, NKikimrMiniKQL::TResult& out,
+ bool waitForResult = true);
+ IEngineFlat::EStatus Execute(const TString& programText, bool waitForResult = true) {
NKikimrMiniKQL::TResult result;
- return Execute(programText, result, waitForResult);
+ return Execute(programText, result, waitForResult);
}
void CheckedExecute(const TString& programText) {
@@ -283,7 +283,7 @@ public:
void Enqueue(const TString& programText, std::function<bool(TFakeProxyTx&)> check = DoNothing,
ui32 flags = NDataShard::TTxFlags::ForceOnline);
- void EnqueueScan(const TString& programText, std::function<bool(TFakeProxyTx&)> check = DoNothing,
+ void EnqueueScan(const TString& programText, std::function<bool(TFakeProxyTx&)> check = DoNothing,
ui32 flags = NDataShard::TTxFlags::ForceOnline);
void ExecQueue();
@@ -317,7 +317,7 @@ private:
void ProposeSchemeCreateTable(TFakeProxyTx& tx, const TVector<ui64>& shards);
void ProposeScheme(TFakeProxyTx& tx, const TVector<ui64>& shards,
const std::function<NKikimrTxDataShard::TFlatSchemeTransaction(ui64)>& txBodyForShard);
- ui64 Plan(ui64 stepId, const TMap<ui64, TFakeProxyTx::TPtr>& txs, bool waitForResult = true);
+ ui64 Plan(ui64 stepId, const TMap<ui64, TFakeProxyTx::TPtr>& txs, bool waitForResult = true);
void ResolveShards(const TSet<ui64>& shards);
};
@@ -356,12 +356,12 @@ public:
const TVector<TPKey>& GetKeys() const { return Engine->GetDbKeys(); }
};
-THolder<NKqp::TEvKqp::TEvQueryRequest> MakeSQLRequest(const TString &sql,
- bool dml = true);
-
-void InitRoot(Tests::TServer::TPtr server,
+THolder<NKqp::TEvKqp::TEvQueryRequest> MakeSQLRequest(const TString &sql,
+ bool dml = true);
+
+void InitRoot(Tests::TServer::TPtr server,
TActorId sender);
-
+
enum class EShadowDataMode {
Default,
Enabled,
@@ -451,25 +451,25 @@ struct TShardedTableOptions {
template<bool OPT1, bool OPT2> \
void N(NUnitTest::TTestContext&)
-void CreateShardedTable(Tests::TServer::TPtr server,
+void CreateShardedTable(Tests::TServer::TPtr server,
TActorId sender,
- const TString &root,
- const TString &name,
+ const TString &root,
+ const TString &name,
const TShardedTableOptions &opts = TShardedTableOptions());
void CreateShardedTable(Tests::TServer::TPtr server,
TActorId sender,
const TString &root,
const TString &name,
- ui64 shards,
+ ui64 shards,
bool enableOutOfOrder = true,
const NLocalDb::TCompactionPolicy* policy = nullptr,
EShadowDataMode shadowData = EShadowDataMode::Default);
-
-TVector<ui64> GetTableShards(Tests::TServer::TPtr server,
+
+TVector<ui64> GetTableShards(Tests::TServer::TPtr server,
TActorId sender,
- const TString &path);
-
+ const TString &path);
+
using TTableInfoMap = THashMap<TString, NKikimrTxDataShard::TEvGetInfoResponse::TUserTable>;
std::pair<TTableInfoMap, ui64> GetTables(Tests::TServer::TPtr server,
@@ -601,28 +601,28 @@ void WaitTxNotification(Tests::TServer::TPtr server, ui64 txId);
void SimulateSleep(Tests::TServer::TPtr server, TDuration duration);
-void SendSQL(Tests::TServer::TPtr server,
+void SendSQL(Tests::TServer::TPtr server,
TActorId sender,
- const TString &sql,
- bool dml = true);
-void ExecSQL(Tests::TServer::TPtr server,
+ const TString &sql,
+ bool dml = true);
+void ExecSQL(Tests::TServer::TPtr server,
TActorId sender,
- const TString &sql,
- bool dml = true,
- Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS);
-
-struct IsTxResultComplete {
- bool operator()(IEventHandle& ev)
- {
- if (ev.GetTypeRewrite() == TEvDataShard::EvProposeTransactionResult) {
- auto status = ev.Get<TEvDataShard::TEvProposeTransactionResult>()->GetStatus();
- if (status == NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE)
- return true;
- }
- return false;
- }
-};
-
+ const TString &sql,
+ bool dml = true,
+ Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS);
+
+struct IsTxResultComplete {
+ bool operator()(IEventHandle& ev)
+ {
+ if (ev.GetTypeRewrite() == TEvDataShard::EvProposeTransactionResult) {
+ auto status = ev.Get<TEvDataShard::TEvProposeTransactionResult>()->GetStatus();
+ if (status == NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE)
+ return true;
+ }
+ return false;
+ }
+};
+
void WaitTabletBecomesOffline(Tests::TServer::TPtr server, ui64 tabletId);
}
diff --git a/ydb/core/tx/datashard/datashard_ut_init.cpp b/ydb/core/tx/datashard/datashard_ut_init.cpp
index 9419081da93..818e30ab0cb 100644
--- a/ydb/core/tx/datashard/datashard_ut_init.cpp
+++ b/ydb/core/tx/datashard/datashard_ut_init.cpp
@@ -7,49 +7,49 @@
#include <ydb/core/util/pb.h>
#include <ydb/public/lib/deprecated/kicli/kicli.h>
-#include <util/string/printf.h>
+#include <util/string/printf.h>
namespace NKikimr {
using namespace NSchemeShard;
-using namespace Tests;
-using NClient::TValue;
-
-namespace {
-
-TString GetTablePath(TTestActorRuntime &runtime,
+using namespace Tests;
+using NClient::TValue;
+
+namespace {
+
+TString GetTablePath(TTestActorRuntime &runtime,
TActorId sender,
- ui64 tableId,
- ui64 shard)
-{
- auto request = MakeHolder<TEvTablet::TEvLocalMKQL>();
- const char *miniKQL = R"___((
- (let row '('('Tid (Uint64 '%lu))))
- (let select '('Schema))
- (let pgmReturn (AsList
- (SetResult 'myRes (SelectRow 'UserTables row select))
- ))
- (return pgmReturn)
- ))___";
-
- request->Record.MutableProgram()->MutableProgram()->SetText(Sprintf(miniKQL, tableId));
- runtime.SendToPipe(shard, sender, request.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvTablet::TEvLocalMKQLResponse>(handle);
- auto &res = reply->Record.GetExecutionEngineEvaluatedResponse();
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), 0);
- TValue value = TValue::Create(res.GetValue(), res.GetType());
- TString schema = value["myRes"]["Schema"];
-
+ ui64 tableId,
+ ui64 shard)
+{
+ auto request = MakeHolder<TEvTablet::TEvLocalMKQL>();
+ const char *miniKQL = R"___((
+ (let row '('('Tid (Uint64 '%lu))))
+ (let select '('Schema))
+ (let pgmReturn (AsList
+ (SetResult 'myRes (SelectRow 'UserTables row select))
+ ))
+ (return pgmReturn)
+ ))___";
+
+ request->Record.MutableProgram()->MutableProgram()->SetText(Sprintf(miniKQL, tableId));
+ runtime.SendToPipe(shard, sender, request.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTablet::TEvLocalMKQLResponse>(handle);
+ auto &res = reply->Record.GetExecutionEngineEvaluatedResponse();
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), 0);
+ TValue value = TValue::Create(res.GetValue(), res.GetType());
+ TString schema = value["myRes"]["Schema"];
+
NKikimrSchemeOp::TTableDescription desc;
Y_PROTOBUF_SUPPRESS_NODISCARD desc.ParseFromArray(schema.data(), schema.size());
-
- return desc.GetPath();
-}
-
-}
-
+
+ return desc.GetPath();
+}
+
+}
+
Y_UNIT_TEST_SUITE(TTxDataShardTestInit) {
Y_UNIT_TEST(TestMvccStateSwitch) {
TPortManager pm;
@@ -113,91 +113,91 @@ Y_UNIT_TEST_SUITE(TTxDataShardTestInit) {
UNIT_ASSERT_EQUAL(event->GetOrigin(), TTestTxConfig::TxTablet0);
UNIT_ASSERT_EQUAL(event->GetState(), NDataShard::TShardState::WaitScheme);
}
-
- void TestTablePath(bool oldCreate, bool restart)
- {
- TPortManager pm;
- TServerSettings serverSettings(pm.GetPort(2134));
- serverSettings.SetDomainName("Root")
- .SetUseRealThreads(false);
-
- Tests::TServer::TPtr server = new TServer(serverSettings);
- auto &runtime = *server->GetRuntime();
- auto sender = runtime.AllocateEdgeActor();
- TAutoPtr<IEventHandle> handle;
-
- runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_DEBUG);
-
- InitRoot(server, sender);
-
- ui64 tableId = 0;
- bool sawResolve = false;
- bool dropResolve = restart;
- // Remove table path from propose.
+
+ void TestTablePath(bool oldCreate, bool restart)
+ {
+ TPortManager pm;
+ TServerSettings serverSettings(pm.GetPort(2134));
+ serverSettings.SetDomainName("Root")
+ .SetUseRealThreads(false);
+
+ Tests::TServer::TPtr server = new TServer(serverSettings);
+ auto &runtime = *server->GetRuntime();
+ auto sender = runtime.AllocateEdgeActor();
+ TAutoPtr<IEventHandle> handle;
+
+ runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_DEBUG);
+
+ InitRoot(server, sender);
+
+ ui64 tableId = 0;
+ bool sawResolve = false;
+ bool dropResolve = restart;
+ // Remove table path from propose.
auto captureTableId = [&](TTestActorRuntimeBase&,
- TAutoPtr<IEventHandle> &event) -> auto {
- if (event->GetTypeRewrite() == TEvDataShard::EvProposeTransaction) {
- auto &rec = event->Get<TEvDataShard::TEvProposeTransaction>()->Record;
- if (rec.GetTxKind() == NKikimrTxDataShard::TX_KIND_SCHEME) {
- TString body = rec.GetTxBody();
- NKikimrTxDataShard::TFlatSchemeTransaction tx;
+ TAutoPtr<IEventHandle> &event) -> auto {
+ if (event->GetTypeRewrite() == TEvDataShard::EvProposeTransaction) {
+ auto &rec = event->Get<TEvDataShard::TEvProposeTransaction>()->Record;
+ if (rec.GetTxKind() == NKikimrTxDataShard::TX_KIND_SCHEME) {
+ TString body = rec.GetTxBody();
+ NKikimrTxDataShard::TFlatSchemeTransaction tx;
Y_PROTOBUF_SUPPRESS_NODISCARD tx.ParseFromArray(body.Data(), body.Size());
- if (tx.HasCreateTable()) {
+ if (tx.HasCreateTable()) {
tableId = tx.GetCreateTable().GetId_Deprecated();
if (tx.GetCreateTable().HasPathId()) {
UNIT_ASSERT_EQUAL(ChangeStateStorage(Tests::SchemeRoot, serverSettings.Domain), tx.GetCreateTable().GetPathId().GetOwnerId());
tableId = tx.GetCreateTable().GetPathId().GetLocalId();
}
- if (oldCreate) {
- tx.MutableCreateTable()->ClearPath();
+ if (oldCreate) {
+ tx.MutableCreateTable()->ClearPath();
Y_PROTOBUF_SUPPRESS_NODISCARD tx.SerializeToString(&body);
- rec.SetTxBody(body);
- }
- }
- }
+ rec.SetTxBody(body);
+ }
+ }
+ }
} else if (event->GetTypeRewrite() == TEvSchemeShard::EvDescribeSchemeResult) {
auto &rec = event->Get<TEvSchemeShard::TEvDescribeSchemeResult>()->GetRecord();
const bool hasPartitioning = rec.GetPathDescription().TablePartitionsSize();
// there are few in-flight TEvDescribeSchemeResult msgs, we need one with no partitioning
if (!hasPartitioning && rec.GetPathDescription().GetSelf().GetPathId() == tableId) {
- sawResolve = true;
- if (dropResolve)
- return TTestActorRuntime::EEventAction::DROP;
- }
- }
- return TTestActorRuntime::EEventAction::PROCESS;
- };
- runtime.SetObserverFunc(captureTableId);
-
- CreateShardedTable(server, sender, "/Root", "table-1", 1);
- UNIT_ASSERT(tableId);
-
- dropResolve = false;
- ui64 tabletId = GetTableShards(server, sender, "/Root/table-1")[0];
- if (restart) {
- sawResolve = false;
- runtime.Register(CreateTabletKiller(tabletId));
-
- if (oldCreate) {
- while (!sawResolve) {
- TDispatchOptions options;
+ sawResolve = true;
+ if (dropResolve)
+ return TTestActorRuntime::EEventAction::DROP;
+ }
+ }
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+ runtime.SetObserverFunc(captureTableId);
+
+ CreateShardedTable(server, sender, "/Root", "table-1", 1);
+ UNIT_ASSERT(tableId);
+
+ dropResolve = false;
+ ui64 tabletId = GetTableShards(server, sender, "/Root/table-1")[0];
+ if (restart) {
+ sawResolve = false;
+ runtime.Register(CreateTabletKiller(tabletId));
+
+ if (oldCreate) {
+ while (!sawResolve) {
+ TDispatchOptions options;
options.FinalEvents.emplace_back(TEvSchemeShard::EvDescribeSchemeResult);
- runtime.DispatchEvents(options);
- }
- }
- }
-
- TString path = GetTablePath(runtime, sender, tableId, tabletId);
- UNIT_ASSERT_VALUES_EQUAL(path, "/Root/table-1");
- }
-
- Y_UNIT_TEST(TestTableHasPath) {
- TestTablePath(false, false);
- }
-
- Y_UNIT_TEST(TestResolvePathAfterRestart) {
- TestTablePath(true, true);
- }
+ runtime.DispatchEvents(options);
+ }
+ }
+ }
+
+ TString path = GetTablePath(runtime, sender, tableId, tabletId);
+ UNIT_ASSERT_VALUES_EQUAL(path, "/Root/table-1");
+ }
+
+ Y_UNIT_TEST(TestTableHasPath) {
+ TestTablePath(false, false);
+ }
+
+ Y_UNIT_TEST(TestResolvePathAfterRestart) {
+ TestTablePath(true, true);
+ }
}
}
diff --git a/ydb/core/tx/datashard/datashard_ut_locks.cpp b/ydb/core/tx/datashard/datashard_ut_locks.cpp
index 9b876f4d1ba..1d25c39f99d 100644
--- a/ydb/core/tx/datashard/datashard_ut_locks.cpp
+++ b/ydb/core/tx/datashard/datashard_ut_locks.cpp
@@ -1,6 +1,6 @@
#include "defs.h"
-#include "datashard_locks.h"
-#include "datashard_ut_common.h"
+#include "datashard_locks.h"
+#include "datashard_ut_common.h"
#include <ydb/core/tablet_flat/flat_dbase_apply.h>
#include <ydb/core/tablet_flat/flat_exec_commit.h>
@@ -14,8 +14,8 @@
namespace NKikimr {
using namespace NSchemeShard;
-using namespace Tests;
-
+using namespace Tests;
+
struct TTableId;
namespace NTest {
@@ -580,157 +580,157 @@ Y_UNIT_TEST(Points_ManyTx_BreakHalf_RemoveHalf) {
}
}
-void CheckLocksCacheUsage(bool waitForLocksStore) {
- TPortManager pm;
- TServerSettings serverSettings(pm.GetPort(2134));
- serverSettings.SetDomainName("Root")
- .SetUseRealThreads(false);
-
- Tests::TServer::TPtr server = new TServer(serverSettings);
- auto &runtime = *server->GetRuntime();
-
+void CheckLocksCacheUsage(bool waitForLocksStore) {
+ TPortManager pm;
+ TServerSettings serverSettings(pm.GetPort(2134));
+ serverSettings.SetDomainName("Root")
+ .SetUseRealThreads(false);
+
+ Tests::TServer::TPtr server = new TServer(serverSettings);
+ auto &runtime = *server->GetRuntime();
+
auto sender = runtime.AllocateEdgeActor();
- runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_TRACE);
- //runtime.SetLogPriority(NKikimrServices::TX_PROXY, NLog::PRI_TRACE);
- //runtime.SetLogPriority(NKikimrServices::KQP_YQL, NLog::PRI_TRACE);
-
+ runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_TRACE);
+ //runtime.SetLogPriority(NKikimrServices::TX_PROXY, NLog::PRI_TRACE);
+ //runtime.SetLogPriority(NKikimrServices::KQP_YQL, NLog::PRI_TRACE);
+
InitRoot(server, sender);
- TAutoPtr<IEventHandle> handle;
- NTabletPipe::TClientConfig pipeConfig;
+ TAutoPtr<IEventHandle> handle;
+ NTabletPipe::TClientConfig pipeConfig;
pipeConfig.RetryPolicy = NTabletPipe::TClientRetryPolicy::WithRetries();
- auto pipe = runtime.ConnectToPipe(ChangeStateStorage(SchemeRoot, serverSettings.Domain), sender, 0, pipeConfig);
-
- // Create table with two shards.
- ui64 txId;
- {
- auto request = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
- request->Record.SetExecTimeoutPeriod(Max<ui64>());
- auto &tx = *request->Record.MutableTransaction()->MutableModifyScheme();
+ auto pipe = runtime.ConnectToPipe(ChangeStateStorage(SchemeRoot, serverSettings.Domain), sender, 0, pipeConfig);
+
+ // Create table with two shards.
+ ui64 txId;
+ {
+ auto request = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
+ request->Record.SetExecTimeoutPeriod(Max<ui64>());
+ auto &tx = *request->Record.MutableTransaction()->MutableModifyScheme();
tx.SetOperationType(NKikimrSchemeOp::ESchemeOpCreateTable);
- tx.SetWorkingDir("/Root");
- auto &desc = *tx.MutableCreateTable();
- desc.SetName("table-1");
- {
- auto col = desc.AddColumns();
- col->SetName("key");
- col->SetType("Uint32");
- }
- {
- auto col = desc.AddColumns();
- col->SetName("value");
- col->SetType("Uint32");
- }
- desc.AddKeyColumnNames("key");
- desc.SetUniformPartitionsCount(2);
-
- runtime.Send(new IEventHandle(MakeTxProxyID(), sender, request.Release()));
- auto reply = runtime.GrabEdgeEventRethrow<TEvTxUserProxy::TEvProposeTransactionStatus>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecInProgress);
- txId = reply->Record.GetTxId();
- }
- {
+ tx.SetWorkingDir("/Root");
+ auto &desc = *tx.MutableCreateTable();
+ desc.SetName("table-1");
+ {
+ auto col = desc.AddColumns();
+ col->SetName("key");
+ col->SetType("Uint32");
+ }
+ {
+ auto col = desc.AddColumns();
+ col->SetName("value");
+ col->SetType("Uint32");
+ }
+ desc.AddKeyColumnNames("key");
+ desc.SetUniformPartitionsCount(2);
+
+ runtime.Send(new IEventHandle(MakeTxProxyID(), sender, request.Release()));
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTxUserProxy::TEvProposeTransactionStatus>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecInProgress);
+ txId = reply->Record.GetTxId();
+ }
+ {
auto request = MakeHolder<NSchemeShard::TEvSchemeShard::TEvNotifyTxCompletion>();
- request->Record.SetTxId(txId);
- runtime.SendToPipe(pipe, sender, request.Release());
+ request->Record.SetTxId(txId);
+ runtime.SendToPipe(pipe, sender, request.Release());
runtime.GrabEdgeEventRethrow<TEvSchemeShard::TEvNotifyTxCompletionResult>(handle);
- }
-
- {
- auto request = MakeSQLRequest("UPSERT INTO [/Root/table-1] (key, value) VALUES (1,0x80000002),(0x80000001,2)");
+ }
+
+ {
+ auto request = MakeSQLRequest("UPSERT INTO [/Root/table-1] (key, value) VALUES (1,0x80000002),(0x80000001,2)");
runtime.Send(new IEventHandle(NKqp::MakeKqpProxyID(runtime.GetNodeId()), sender, request.Release()));
- runtime.GrabEdgeEventRethrow<NKqp::TEvKqp::TEvQueryResponse>(handle);
- }
-
- {
- auto request = MakeSQLRequest("UPSERT INTO [/Root/table-1] (key, value) SELECT value as key, value FROM [/Root/table-1]");
+ runtime.GrabEdgeEventRethrow<NKqp::TEvKqp::TEvQueryResponse>(handle);
+ }
+
+ {
+ auto request = MakeSQLRequest("UPSERT INTO [/Root/table-1] (key, value) SELECT value as key, value FROM [/Root/table-1]");
runtime.Send(new IEventHandle(NKqp::MakeKqpProxyID(runtime.GetNodeId()), sender, request.Release()));
-
- // Get shard IDs.
- ui64 shards[2];
- {
- auto request = MakeHolder<TEvTxUserProxy::TEvNavigate>();
- request->Record.MutableDescribePath()->SetPath("/Root/table-1");
- runtime.Send(new IEventHandle(MakeTxProxyID(), sender, request.Release()));
+
+ // Get shard IDs.
+ ui64 shards[2];
+ {
+ auto request = MakeHolder<TEvTxUserProxy::TEvNavigate>();
+ request->Record.MutableDescribePath()->SetPath("/Root/table-1");
+ runtime.Send(new IEventHandle(MakeTxProxyID(), sender, request.Release()));
auto reply = runtime.GrabEdgeEventRethrow<TEvSchemeShard::TEvDescribeSchemeResult>(handle);
- for (auto i = 0; i < 2; ++i)
- shards[i] = reply->GetRecord().GetPathDescription()
- .GetTablePartitions(i).GetDatashardId();
- }
-
- // Query should be split to two phases and second one
- // should use RS. Hold one RS to 'pause' one transaction
- // and then restart its shard. This will cause locks
- // cache to be used.
+ for (auto i = 0; i < 2; ++i)
+ shards[i] = reply->GetRecord().GetPathDescription()
+ .GetTablePartitions(i).GetDatashardId();
+ }
+
+ // Query should be split to two phases and second one
+ // should use RS. Hold one RS to 'pause' one transaction
+ // and then restart its shard. This will cause locks
+ // cache to be used.
auto captureRS = [shards](TTestActorRuntimeBase&,
- TAutoPtr<IEventHandle> &event) -> auto {
- if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSet) {
- auto &rec = event->Get<TEvTxProcessing::TEvReadSet>()->Record;
- if (rec.GetTabletDest() == shards[0])
- return TTestActorRuntime::EEventAction::DROP;
- }
- return TTestActorRuntime::EEventAction::PROCESS;
- };
- runtime.SetObserverFunc(captureRS);
- {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvTxProcessing::EvReadSet, 1);
- runtime.DispatchEvents(options);
- }
-
- runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
- // If we want to wait until locks are stored then wait for log commits.
- if (waitForLocksStore) {
- struct IsCommitResult {
- bool operator()(IEventHandle& ev)
- {
- if (ev.GetTypeRewrite() == TEvTablet::EvCommitResult) {
+ TAutoPtr<IEventHandle> &event) -> auto {
+ if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSet) {
+ auto &rec = event->Get<TEvTxProcessing::TEvReadSet>()->Record;
+ if (rec.GetTabletDest() == shards[0])
+ return TTestActorRuntime::EEventAction::DROP;
+ }
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+ runtime.SetObserverFunc(captureRS);
+ {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvTxProcessing::EvReadSet, 1);
+ runtime.DispatchEvents(options);
+ }
+
+ runtime.SetObserverFunc(TTestActorRuntime::DefaultObserverFunc);
+ // If we want to wait until locks are stored then wait for log commits.
+ if (waitForLocksStore) {
+ struct IsCommitResult {
+ bool operator()(IEventHandle& ev)
+ {
+ if (ev.GetTypeRewrite() == TEvTablet::EvCommitResult) {
if (ev.Cookie == (ui64)NKikimr::NTabletFlatExecutor::ECommit::Redo) {
- if (!Recipient)
- Recipient = ev.Recipient;
- else if (Recipient != ev.Recipient)
- return true;
- }
- }
-
- return false;
- }
-
+ if (!Recipient)
+ Recipient = ev.Recipient;
+ else if (Recipient != ev.Recipient)
+ return true;
+ }
+ }
+
+ return false;
+ }
+
TActorId Recipient;
- };
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back(IsCommitResult(), 1);
- runtime.DispatchEvents(options);
- }
-
- runtime.Register(CreateTabletKiller(shards[0]));
- runtime.GrabEdgeEventRethrow<NKqp::TEvKqp::TEvQueryResponse>(handle);
- }
-
- {
- auto request = MakeSQLRequest("SELECT * FROM [/Root/table-1]");
+ };
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(IsCommitResult(), 1);
+ runtime.DispatchEvents(options);
+ }
+
+ runtime.Register(CreateTabletKiller(shards[0]));
+ runtime.GrabEdgeEventRethrow<NKqp::TEvKqp::TEvQueryResponse>(handle);
+ }
+
+ {
+ auto request = MakeSQLRequest("SELECT * FROM [/Root/table-1]");
runtime.Send(new IEventHandle(NKqp::MakeKqpProxyID(runtime.GetNodeId()), sender, request.Release()));
- auto reply = runtime.GrabEdgeEventRethrow<NKqp::TEvKqp::TEvQueryResponse>(handle);
- auto &resp = reply->Record.GetRef().GetResponse();
- UNIT_ASSERT_VALUES_EQUAL(resp.ResultsSize(), 1);
- if (waitForLocksStore)
- UNIT_ASSERT_VALUES_EQUAL(resp.GetResults(0).GetValue().GetStruct(0).ListSize(), 4);
- else {
- // We don't actually know whether we killed tablet before locks were stored or after.
- // So either 2 or 4 records are allowed.
- UNIT_ASSERT(resp.GetResults(0).GetValue().GetStruct(0).ListSize() == 4
- || resp.GetResults(0).GetValue().GetStruct(0).ListSize() == 2);
- }
- }
-}
-
-Y_UNIT_TEST(UseLocksCache) {
- CheckLocksCacheUsage(true);
- CheckLocksCacheUsage(false);
-}
+ auto reply = runtime.GrabEdgeEventRethrow<NKqp::TEvKqp::TEvQueryResponse>(handle);
+ auto &resp = reply->Record.GetRef().GetResponse();
+ UNIT_ASSERT_VALUES_EQUAL(resp.ResultsSize(), 1);
+ if (waitForLocksStore)
+ UNIT_ASSERT_VALUES_EQUAL(resp.GetResults(0).GetValue().GetStruct(0).ListSize(), 4);
+ else {
+ // We don't actually know whether we killed tablet before locks were stored or after.
+ // So either 2 or 4 records are allowed.
+ UNIT_ASSERT(resp.GetResults(0).GetValue().GetStruct(0).ListSize() == 4
+ || resp.GetResults(0).GetValue().GetStruct(0).ListSize() == 2);
+ }
+ }
+}
+
+Y_UNIT_TEST(UseLocksCache) {
+ CheckLocksCacheUsage(true);
+ CheckLocksCacheUsage(false);
+}
// TODO
}
diff --git a/ydb/core/tx/datashard/datashard_ut_minikql.cpp b/ydb/core/tx/datashard/datashard_ut_minikql.cpp
index be892e9b89b..7974e474861 100644
--- a/ydb/core/tx/datashard/datashard_ut_minikql.cpp
+++ b/ydb/core/tx/datashard/datashard_ut_minikql.cpp
@@ -899,7 +899,7 @@ void CrossShard_1_Cycle_Impl(const TString& dispatchName, std::function<void (TT
(return pgmReturn)
))___";
- proxy.Execute(programText, false);
+ proxy.Execute(programText, false);
}
{
@@ -973,7 +973,7 @@ void CrossShard_2_SwapAndCopy_Impl(const TString& dispatchName, std::function<vo
(return pgmReturn)
))___";
- proxy.Execute(programText, false);
+ proxy.Execute(programText, false);
}
{
@@ -1052,19 +1052,19 @@ void CrossShard_3_AllToOne_Impl(const TString& dispatchName, std::function<void
(return pgmReturn)
))___";
- proxy.Execute(programText, false);
+ proxy.Execute(programText, false);
}
{
auto programText = R"___((
- (let row1 '('('key (Uint32 '100))))
+ (let row1 '('('key (Uint32 '100))))
(let row31 '('('key (Uint32 '2201))))
(let row32 '('('key (Uint32 '2202))))
(let row33 '('('key (Uint32 '2203))))
(let select '('value))
(let pgmReturn (AsList
(SetResult 'myRes (AsList
- (SelectRow 'table1 row1 select)
+ (SelectRow 'table1 row1 select)
(SelectRow 'table1 row31 select)
(SelectRow 'table1 row32 select)
(SelectRow 'table1 row33 select)
@@ -1078,9 +1078,9 @@ void CrossShard_3_AllToOne_Impl(const TString& dispatchName, std::function<void
TValue value = TValue::Create(res.GetValue(), res.GetType());
TValue rl = value["myRes"];
- TValue row31 = rl[1];
- TValue row32 = rl[2];
- TValue row33 = rl[3];
+ TValue row31 = rl[1];
+ TValue row32 = rl[2];
+ TValue row33 = rl[3];
UNIT_ASSERT_EQUAL(TString(row31["value"]), "ImInShard1");
UNIT_ASSERT_EQUAL(TString(row32["value"]), "ImInShard2");
UNIT_ASSERT_EQUAL(TString(row33["value"]), "ImInShard3");
@@ -1130,7 +1130,7 @@ void CrossShard_4_OneToAll_Impl(const TString& dispatchName, std::function<void
(return pgmReturn)
))___";
- proxy.Execute(programText, false);
+ proxy.Execute(programText, false);
}
{
@@ -1218,7 +1218,7 @@ void CrossShard_5_AllToAll_Impl(const TString& dispatchName, std::function<void
(return pgmReturn)
))___";
- proxy.Execute(programText, false);
+ proxy.Execute(programText, false);
}
{
@@ -1318,7 +1318,7 @@ void CrossShard_6_Local_Impl(const TString& dispatchName, std::function<void (TT
(return pgmReturn)
))___";
- proxy.Execute(programText, false);
+ proxy.Execute(programText, false);
}
{
@@ -1472,48 +1472,48 @@ Y_UNIT_TEST(WriteLargeExternalBlob) {
UNIT_ASSERT_EQUAL(proxy.Execute(Sprintf(progUpsert, 234u, "bar", value.c_str()), res2), IEngineFlat::EStatus::Complete);
}
-void SetupProfiles(TTestActorRuntime &runtime)
-{
- TResourceProfiles::TResourceProfile profile;
- profile.SetTabletType(NKikimrTabletBase::TTabletTypes::Unknown);
- profile.SetName("default");
- profile.SetStaticTabletTxMemoryLimit(100 << 20);
- profile.SetStaticTxMemoryLimit(128);
- profile.SetTxMemoryLimit(300 << 20);
- profile.SetInitialTxMemory(128);
- profile.SetSmallTxMemoryLimit(1 << 20);
- profile.SetMediumTxMemoryLimit(50 << 20);
- profile.SetSmallTxTaskType("transaction");
- profile.SetMediumTxTaskType("transaction");
- profile.SetLargeTxTaskType("transaction");
-
- for (ui32 i = 0; i < runtime.GetNodeCount(); ++i) {
- auto &appData = runtime.GetAppData();
- appData.ResourceProfiles = new TResourceProfiles;
- appData.ResourceProfiles->AddProfile(profile);
- }
-}
-
-std::tuple<ui64, ui64, ui64> ReadTxMemoryCounters(TTester &t, ui64 tabletId)
-{
- auto sender = t.Runtime.AllocateEdgeActor();
- t.Runtime.SendToPipe(tabletId, sender, new TEvTablet::TEvGetCounters);
- TAutoPtr<IEventHandle> handle;
- auto event = t.Runtime.GrabEdgeEvent<TEvTablet::TEvGetCountersResponse>(handle);
-
- std::tuple<ui64, ui64, ui64> res;
- const auto &resp = event->Record;
- for (auto &counter : resp.GetTabletCounters().GetExecutorCounters().GetCumulativeCounters()) {
- if (counter.GetName() == "TxMemoryRequests")
- std::get<0>(res) = counter.GetValue();
- else if (counter.GetName() == "TxMemoryCaptures")
- std::get<1>(res) = counter.GetValue();
- else if (counter.GetName() == "TxMemoryAttaches")
- std::get<2>(res) = counter.GetValue();
- }
- return res;
-}
-
+void SetupProfiles(TTestActorRuntime &runtime)
+{
+ TResourceProfiles::TResourceProfile profile;
+ profile.SetTabletType(NKikimrTabletBase::TTabletTypes::Unknown);
+ profile.SetName("default");
+ profile.SetStaticTabletTxMemoryLimit(100 << 20);
+ profile.SetStaticTxMemoryLimit(128);
+ profile.SetTxMemoryLimit(300 << 20);
+ profile.SetInitialTxMemory(128);
+ profile.SetSmallTxMemoryLimit(1 << 20);
+ profile.SetMediumTxMemoryLimit(50 << 20);
+ profile.SetSmallTxTaskType("transaction");
+ profile.SetMediumTxTaskType("transaction");
+ profile.SetLargeTxTaskType("transaction");
+
+ for (ui32 i = 0; i < runtime.GetNodeCount(); ++i) {
+ auto &appData = runtime.GetAppData();
+ appData.ResourceProfiles = new TResourceProfiles;
+ appData.ResourceProfiles->AddProfile(profile);
+ }
+}
+
+std::tuple<ui64, ui64, ui64> ReadTxMemoryCounters(TTester &t, ui64 tabletId)
+{
+ auto sender = t.Runtime.AllocateEdgeActor();
+ t.Runtime.SendToPipe(tabletId, sender, new TEvTablet::TEvGetCounters);
+ TAutoPtr<IEventHandle> handle;
+ auto event = t.Runtime.GrabEdgeEvent<TEvTablet::TEvGetCountersResponse>(handle);
+
+ std::tuple<ui64, ui64, ui64> res;
+ const auto &resp = event->Record;
+ for (auto &counter : resp.GetTabletCounters().GetExecutorCounters().GetCumulativeCounters()) {
+ if (counter.GetName() == "TxMemoryRequests")
+ std::get<0>(res) = counter.GetValue();
+ else if (counter.GetName() == "TxMemoryCaptures")
+ std::get<1>(res) = counter.GetValue();
+ else if (counter.GetName() == "TxMemoryAttaches")
+ std::get<2>(res) = counter.GetValue();
+ }
+ return res;
+}
+
struct TCounterRange {
const ui64 MinValue;
const ui64 MaxValue;
@@ -1528,187 +1528,187 @@ struct TCounterRange {
};
template<class TCounter1, class TCounter2, class TCounter3>
-void CheckCounters(const std::tuple<ui64, ui64, ui64> &newCnt, const std::tuple<ui64, ui64, ui64> &oldCnt,
+void CheckCounters(const std::tuple<ui64, ui64, ui64> &newCnt, const std::tuple<ui64, ui64, ui64> &oldCnt,
const TCounter1& d1, const TCounter2& d2, const TCounter3& d3)
-{
- UNIT_ASSERT_VALUES_EQUAL(std::get<0>(newCnt) - std::get<0>(oldCnt), d1);
- UNIT_ASSERT_VALUES_EQUAL(std::get<1>(newCnt) - std::get<1>(oldCnt), d2);
- UNIT_ASSERT_VALUES_EQUAL(std::get<2>(newCnt) - std::get<2>(oldCnt), d3);
-}
-
+{
+ UNIT_ASSERT_VALUES_EQUAL(std::get<0>(newCnt) - std::get<0>(oldCnt), d1);
+ UNIT_ASSERT_VALUES_EQUAL(std::get<1>(newCnt) - std::get<1>(oldCnt), d2);
+ UNIT_ASSERT_VALUES_EQUAL(std::get<2>(newCnt) - std::get<2>(oldCnt), d3);
+}
+
Y_UNIT_TEST(MemoryUsageImmediateSmallTx) {
- bool activeZone = false;
- TTester t(TTester::ESchema_KV, "dispatch_name", [&](TTestActorRuntime &runtime) {
- SetupProfiles(runtime);
- }, activeZone);
- TFakeMiniKQLProxy proxy(t);
-
+ bool activeZone = false;
+ TTester t(TTester::ESchema_KV, "dispatch_name", [&](TTestActorRuntime &runtime) {
+ SetupProfiles(runtime);
+ }, activeZone);
+ TFakeMiniKQLProxy proxy(t);
+
auto counters1 = ReadTxMemoryCounters(t, TTestTxConfig::TxTablet0);
-
- auto programText = R"___((
- (let row '('('key (Uint32 '42))))
- (let myUpd '(
- '('value (Utf8 '%s))))
- (let pgmReturn (AsList
- (UpdateRow 'table1 row myUpd)
- ))
- (return pgmReturn)
- ))___";
-
+
+ auto programText = R"___((
+ (let row '('('key (Uint32 '42))))
+ (let myUpd '(
+ '('value (Utf8 '%s))))
+ (let pgmReturn (AsList
+ (UpdateRow 'table1 row myUpd)
+ ))
+ (return pgmReturn)
+ ))___";
+
auto text = Sprintf(programText, TString(1024, 'v').data());
- UNIT_ASSERT_EQUAL(proxy.Execute(text), IEngineFlat::EStatus::Complete);
-
+ UNIT_ASSERT_EQUAL(proxy.Execute(text), IEngineFlat::EStatus::Complete);
+
auto counters2 = ReadTxMemoryCounters(t, TTestTxConfig::TxTablet0);
- // Expect one allocation on prepare.
- CheckCounters(counters2, counters1, 1, 0, 0);
-
- {
- auto programText = R"___((
- (let row1 '('('key (Uint32 '42))))
- (let select '('value))
- (let pgmReturn (AsList
- (SetResult 'myRes (AsList
- (SelectRow 'table1 row1 select)
- ))
- ))
- (return pgmReturn)
- ))___";
-
- NKikimrMiniKQL::TResult res;
- UNIT_ASSERT_EQUAL(proxy.Execute(programText, res), IEngineFlat::EStatus::Complete);
- }
-
+ // Expect one allocation on prepare.
+ CheckCounters(counters2, counters1, 1, 0, 0);
+
+ {
+ auto programText = R"___((
+ (let row1 '('('key (Uint32 '42))))
+ (let select '('value))
+ (let pgmReturn (AsList
+ (SetResult 'myRes (AsList
+ (SelectRow 'table1 row1 select)
+ ))
+ ))
+ (return pgmReturn)
+ ))___";
+
+ NKikimrMiniKQL::TResult res;
+ UNIT_ASSERT_EQUAL(proxy.Execute(programText, res), IEngineFlat::EStatus::Complete);
+ }
+
auto counters3 = ReadTxMemoryCounters(t, TTestTxConfig::TxTablet0);
- // Expect one allocation on prepare.
- CheckCounters(counters3, counters2, 1, 0, 0);
-}
-
+ // Expect one allocation on prepare.
+ CheckCounters(counters3, counters2, 1, 0, 0);
+}
+
Y_UNIT_TEST(MemoryUsageImmediateMediumTx) {
- bool activeZone = false;
- TTester t(TTester::ESchema_KV, "dispatch_name", [&](TTestActorRuntime &runtime) {
- SetupProfiles(runtime);
- }, activeZone);
- TFakeMiniKQLProxy proxy(t);
-
+ bool activeZone = false;
+ TTester t(TTester::ESchema_KV, "dispatch_name", [&](TTestActorRuntime &runtime) {
+ SetupProfiles(runtime);
+ }, activeZone);
+ TFakeMiniKQLProxy proxy(t);
+
auto counters1 = ReadTxMemoryCounters(t, TTestTxConfig::TxTablet0);
-
- {
- auto programText = R"___((
- (let row1 '('('key (Uint32 '42))))
- (let sum (lambda '(x y) (+ x y)))
- (let x1 (Collect (ListFromRange (Uint32 '0) (Uint32 '100000))))
- (let x2 (Fold x1 (Uint32 '0) sum))
- (let myUpd '('('uint x2)))
- (let pgmReturn (AsList
- (UpdateRow 'table1 row1 myUpd)
- ))
- (return pgmReturn)
- ))___";
-
- NKikimrMiniKQL::TResult res;
- UNIT_ASSERT_EQUAL(proxy.Execute(programText, res), IEngineFlat::EStatus::Complete);
- }
-
+
+ {
+ auto programText = R"___((
+ (let row1 '('('key (Uint32 '42))))
+ (let sum (lambda '(x y) (+ x y)))
+ (let x1 (Collect (ListFromRange (Uint32 '0) (Uint32 '100000))))
+ (let x2 (Fold x1 (Uint32 '0) sum))
+ (let myUpd '('('uint x2)))
+ (let pgmReturn (AsList
+ (UpdateRow 'table1 row1 myUpd)
+ ))
+ (return pgmReturn)
+ ))___";
+
+ NKikimrMiniKQL::TResult res;
+ UNIT_ASSERT_EQUAL(proxy.Execute(programText, res), IEngineFlat::EStatus::Complete);
+ }
+
auto counters2 = ReadTxMemoryCounters(t, TTestTxConfig::TxTablet0);
// Expect one allocation on prepare and one or two
- // allocations during execution.
+ // allocations during execution.
CheckCounters(counters2, counters1, TCounterRange{2, 3}, 0, 0);
-}
-
+}
+
Y_UNIT_TEST(MemoryUsageImmediateHugeTx) {
- bool activeZone = false;
- TTester t(TTester::ESchema_KV, "dispatch_name", [&](TTestActorRuntime &runtime) {
- SetupProfiles(runtime);
- }, activeZone);
- TFakeMiniKQLProxy proxy(t);
-
+ bool activeZone = false;
+ TTester t(TTester::ESchema_KV, "dispatch_name", [&](TTestActorRuntime &runtime) {
+ SetupProfiles(runtime);
+ }, activeZone);
+ TFakeMiniKQLProxy proxy(t);
+
auto counters1 = ReadTxMemoryCounters(t, TTestTxConfig::TxTablet0);
-
- {
- auto programText = R"___((
- (let row1 '('('key (Uint32 '42))))
- (let sum (lambda '(x y) (+ x y)))
- (let x1 (Collect (ListFromRange (Uint32 '0) (Uint32 '1000000))))
- (let x2 (Fold x1 (Uint32 '0) sum))
- (let myUpd '('('uint x2)))
- (let pgmReturn (AsList
- (UpdateRow 'table1 row1 myUpd)
- ))
- (return pgmReturn)
- ))___";
-
- NKikimrMiniKQL::TResult res;
- UNIT_ASSERT_EQUAL(proxy.Execute(programText, res), IEngineFlat::EStatus::Complete);
- }
-
+
+ {
+ auto programText = R"___((
+ (let row1 '('('key (Uint32 '42))))
+ (let sum (lambda '(x y) (+ x y)))
+ (let x1 (Collect (ListFromRange (Uint32 '0) (Uint32 '1000000))))
+ (let x2 (Fold x1 (Uint32 '0) sum))
+ (let myUpd '('('uint x2)))
+ (let pgmReturn (AsList
+ (UpdateRow 'table1 row1 myUpd)
+ ))
+ (return pgmReturn)
+ ))___";
+
+ NKikimrMiniKQL::TResult res;
+ UNIT_ASSERT_EQUAL(proxy.Execute(programText, res), IEngineFlat::EStatus::Complete);
+ }
+
auto counters2 = ReadTxMemoryCounters(t, TTestTxConfig::TxTablet0);
- // Expect one allocation on prepare and three
- // allocations during execution.
- CheckCounters(counters2, counters1, 4, 0, 0);
-}
-
+ // Expect one allocation on prepare and three
+ // allocations during execution.
+ CheckCounters(counters2, counters1, 4, 0, 0);
+}
+
Y_UNIT_TEST(MemoryUsageMultiShard) {
- bool activeZone = false;
- TTester t(TTester::ESchema_MultiShardKV, "dispatch_name", [&](TTestActorRuntime &runtime) {
- SetupProfiles(runtime);
- }, activeZone);
- TFakeMiniKQLProxy proxy(t);
-
- t.Runtime.SetLogPriority(NKikimrServices::RESOURCE_BROKER, NActors::NLog::PRI_DEBUG);
- t.Runtime.SetLogPriority(NKikimrServices::TABLET_EXECUTOR, NActors::NLog::PRI_DEBUG);
- t.Runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NActors::NLog::PRI_TRACE);
-
- //InitCrossShard(proxy);
- auto programText = R"___((
- (let row1 '('('key (Uint32 '100))))
- (let row2 '('('key (Uint32 '1100))))
- (let row3 '('('key (Uint32 '2100))))
- (let myUpd1 '(
- '('value (Utf8 'ImInShard1))))
- (let myUpd2 '(
- '('value (Utf8 'ImInShard2))))
- (let myUpd3 '(
- '('value (Utf8 'ImInShard3))))
- (let pgmReturn (AsList
- (UpdateRow 'table1 row1 myUpd1)
- (UpdateRow 'table1 row2 myUpd2)
- (UpdateRow 'table1 row3 myUpd3)
- ))
- (return pgmReturn)
- ))___";
-
- UNIT_ASSERT_EQUAL(proxy.Execute(programText), IEngineFlat::EStatus::Complete);
-
- {
- TTester::TActiveZone az(t);
- auto programText = R"___((
- (let row1 '('('key (Uint32 '100))))
- (let row2 '('('key (Uint32 '1100))))
- (let row3 '('('key (Uint32 '2100))))
- (let row13 '('('key (Uint32 '203))))
- (let row23 '('('key (Uint32 '1203))))
- (let row33 '('('key (Uint32 '2203))))
- (let select '('value))
- (let val3 (FlatMap (SelectRow 'table1 row3 select) (lambda '(x) (Member x 'value))))
- (let sum (lambda '(x y) (+ x y)))
- (let x1 (Collect (ListFromRange (Uint32 '0) (Uint32 '1000000))))
- (let x2 (Fold x1 (Uint32 '0) sum))
- (let upd3 '('('value val3)))
- (let upd4 '('('uint x2)))
- (let pgmReturn (AsList
- (UpdateRow 'table1 row13 upd3)
- (UpdateRow 'table1 row13 upd4)
- (UpdateRow 'table1 row23 upd3)
- (UpdateRow 'table1 row23 upd4)
- (UpdateRow 'table1 row33 upd3)
- (UpdateRow 'table1 row33 upd4)
- ))
- (return pgmReturn)
- ))___";
- proxy.CheckedExecute(programText);
- }
-}
-
+ bool activeZone = false;
+ TTester t(TTester::ESchema_MultiShardKV, "dispatch_name", [&](TTestActorRuntime &runtime) {
+ SetupProfiles(runtime);
+ }, activeZone);
+ TFakeMiniKQLProxy proxy(t);
+
+ t.Runtime.SetLogPriority(NKikimrServices::RESOURCE_BROKER, NActors::NLog::PRI_DEBUG);
+ t.Runtime.SetLogPriority(NKikimrServices::TABLET_EXECUTOR, NActors::NLog::PRI_DEBUG);
+ t.Runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NActors::NLog::PRI_TRACE);
+
+ //InitCrossShard(proxy);
+ auto programText = R"___((
+ (let row1 '('('key (Uint32 '100))))
+ (let row2 '('('key (Uint32 '1100))))
+ (let row3 '('('key (Uint32 '2100))))
+ (let myUpd1 '(
+ '('value (Utf8 'ImInShard1))))
+ (let myUpd2 '(
+ '('value (Utf8 'ImInShard2))))
+ (let myUpd3 '(
+ '('value (Utf8 'ImInShard3))))
+ (let pgmReturn (AsList
+ (UpdateRow 'table1 row1 myUpd1)
+ (UpdateRow 'table1 row2 myUpd2)
+ (UpdateRow 'table1 row3 myUpd3)
+ ))
+ (return pgmReturn)
+ ))___";
+
+ UNIT_ASSERT_EQUAL(proxy.Execute(programText), IEngineFlat::EStatus::Complete);
+
+ {
+ TTester::TActiveZone az(t);
+ auto programText = R"___((
+ (let row1 '('('key (Uint32 '100))))
+ (let row2 '('('key (Uint32 '1100))))
+ (let row3 '('('key (Uint32 '2100))))
+ (let row13 '('('key (Uint32 '203))))
+ (let row23 '('('key (Uint32 '1203))))
+ (let row33 '('('key (Uint32 '2203))))
+ (let select '('value))
+ (let val3 (FlatMap (SelectRow 'table1 row3 select) (lambda '(x) (Member x 'value))))
+ (let sum (lambda '(x y) (+ x y)))
+ (let x1 (Collect (ListFromRange (Uint32 '0) (Uint32 '1000000))))
+ (let x2 (Fold x1 (Uint32 '0) sum))
+ (let upd3 '('('value val3)))
+ (let upd4 '('('uint x2)))
+ (let pgmReturn (AsList
+ (UpdateRow 'table1 row13 upd3)
+ (UpdateRow 'table1 row13 upd4)
+ (UpdateRow 'table1 row23 upd3)
+ (UpdateRow 'table1 row23 upd4)
+ (UpdateRow 'table1 row33 upd3)
+ (UpdateRow 'table1 row33 upd4)
+ ))
+ (return pgmReturn)
+ ))___";
+ proxy.CheckedExecute(programText);
+ }
+}
+
} // Y_UNIT_TEST_SUITE(TTxDataShardMiniKQL)
} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/datashard_ut_order.cpp b/ydb/core/tx/datashard/datashard_ut_order.cpp
index b4090887e62..32472dce59e 100644
--- a/ydb/core/tx/datashard/datashard_ut_order.cpp
+++ b/ydb/core/tx/datashard/datashard_ut_order.cpp
@@ -13,7 +13,7 @@
#include <ydb/public/lib/deprecated/kicli/kicli.h>
#include <ydb/core/testlib/tenant_runtime.h>
#include <util/system/valgrind.h>
-
+
#include <ydb/library/yql/minikql/invoke_builtins/mkql_builtins.h>
namespace NKikimr {
@@ -23,7 +23,7 @@ using IEngineFlat = NMiniKQL::IEngineFlat;
using namespace NKikimr::NDataShard;
using namespace NKikimr::NDataShard::NKqpHelpers;
using namespace NSchemeShard;
-using namespace Tests;
+using namespace Tests;
using TActiveTxPtr = std::shared_ptr<TActiveTransaction>;
@@ -48,7 +48,7 @@ public:
static TActiveTxPtr MakeEmptyTx(ui64 step, ui64 txId) {
TBasicOpInfo op(txId, EOperationKind::DataTx, 0, Max<ui64>(), TInstant(), 0);
- op.SetStep(step);
+ op.SetStep(step);
return std::make_shared<TActiveTransaction>(op);
}
#if 0
@@ -62,7 +62,7 @@ public:
std::shared_ptr<TValidatedDataTx> dataTx(new TValidatedDataTx(std::move(ebay), txId, 0, txBody));
TBasicOpInfo op(txId, NKikimrTxDataShard::ETransactionKind::TX_KIND_DATA, 0, Max<ui64>(), 0);
- op.SetStep(step);
+ op.SetStep(step);
TActiveTransaction tx(op);
tx.Activate(0, dataTx);
return tx;
@@ -89,17 +89,17 @@ Y_UNIT_TEST(OperationOrder) {
TActiveTxPtr tx1_103 = TTester::MakeEmptyTx(1, 103);
TActiveTxPtr tx2_42 = TTester::MakeEmptyTx(2, 42);
- UNIT_ASSERT_EQUAL(tx0_100->GetStepOrder().CheckOrder(tx0_101->GetStepOrder()), ETxOrder::Any);
- UNIT_ASSERT_EQUAL(tx0_101->GetStepOrder().CheckOrder(tx0_100->GetStepOrder()), ETxOrder::Any);
+ UNIT_ASSERT_EQUAL(tx0_100->GetStepOrder().CheckOrder(tx0_101->GetStepOrder()), ETxOrder::Any);
+ UNIT_ASSERT_EQUAL(tx0_101->GetStepOrder().CheckOrder(tx0_100->GetStepOrder()), ETxOrder::Any);
- UNIT_ASSERT_EQUAL(tx0_100->GetStepOrder().CheckOrder(tx1_102->GetStepOrder()), ETxOrder::Unknown);
- UNIT_ASSERT_EQUAL(tx1_102->GetStepOrder().CheckOrder(tx0_100->GetStepOrder()), ETxOrder::Unknown);
+ UNIT_ASSERT_EQUAL(tx0_100->GetStepOrder().CheckOrder(tx1_102->GetStepOrder()), ETxOrder::Unknown);
+ UNIT_ASSERT_EQUAL(tx1_102->GetStepOrder().CheckOrder(tx0_100->GetStepOrder()), ETxOrder::Unknown);
- UNIT_ASSERT_EQUAL(tx1_102->GetStepOrder().CheckOrder(tx1_103->GetStepOrder()), ETxOrder::Before);
- UNIT_ASSERT_EQUAL(tx1_103->GetStepOrder().CheckOrder(tx1_102->GetStepOrder()), ETxOrder::After);
+ UNIT_ASSERT_EQUAL(tx1_102->GetStepOrder().CheckOrder(tx1_103->GetStepOrder()), ETxOrder::Before);
+ UNIT_ASSERT_EQUAL(tx1_103->GetStepOrder().CheckOrder(tx1_102->GetStepOrder()), ETxOrder::After);
- UNIT_ASSERT_EQUAL(tx1_102->GetStepOrder().CheckOrder(tx1_40->GetStepOrder()), ETxOrder::After);
- UNIT_ASSERT_EQUAL(tx1_102->GetStepOrder().CheckOrder(tx2_42->GetStepOrder()), ETxOrder::Before);
+ UNIT_ASSERT_EQUAL(tx1_102->GetStepOrder().CheckOrder(tx1_40->GetStepOrder()), ETxOrder::After);
+ UNIT_ASSERT_EQUAL(tx1_102->GetStepOrder().CheckOrder(tx2_42->GetStepOrder()), ETxOrder::Before);
}
}
@@ -654,8 +654,8 @@ static void CompareShots(const TVector<ui32>& finalShot, const TVector<ui32>& in
}
static void RandomTxDeps(const TTester::TOptions& opts, ui32 numTxs, ui32 maxKeys, bool lessWrites,
- bool useRanges = false, TVector<ui32> counts = {}, TVector<ui32> pts = {},
- TVector<ui32> wrs = {}) {
+ bool useRanges = false, TVector<ui32> counts = {}, TVector<ui32> pts = {},
+ TVector<ui32> wrs = {}) {
const ui32 minKeys = 2;
UNIT_ASSERT(maxKeys <= 32);
UNIT_ASSERT(maxKeys > minKeys);
@@ -690,15 +690,15 @@ static void RandomTxDeps(const TTester::TOptions& opts, ui32 numTxs, ui32 maxKey
TVector<ui32> expected(32, Max<ui32>());
for (ui32 i = 0; i < numTxs; ++i) {
ui32 count = minKeys + RandomNumber<ui32>(maxKeys-minKeys);
- if (counts.size() > i)
- count = counts[i];
+ if (counts.size() > i)
+ count = counts[i];
ui32 points = 0;
ui32 writes = 0;
CalcPoints(count, points, writes, lessWrites);
- if (pts.size() > i)
- points = pts[i];
- if (wrs.size() > i)
- writes = wrs[i];
+ if (pts.size() > i)
+ points = pts[i];
+ if (wrs.size() > i)
+ writes = wrs[i];
TString prog = MkRandomTx(i, points, writes, count, expected, useRanges);
//Cout << prog << Endl;
if (indepTxId && i == indepPos)
@@ -786,30 +786,30 @@ static void RandomTxDeps(const TTester::TOptions& opts, ui32 numTxs, ui32 maxKey
static constexpr ui32 NumRun() { return 2; }
Y_UNIT_TEST_WITH_MVCC(RandomPoints_ReproducerDelayData1) {
- TTester::TOptions opts;
- opts.DelayData = true;
- opts.ExecutorCacheSize = 0;
- opts.EnableOutOfOrder(8);
+ TTester::TOptions opts;
+ opts.DelayData = true;
+ opts.ExecutorCacheSize = 0;
+ opts.EnableOutOfOrder(8);
opts.EnableMvcc(WithMvcc);
-
- RandomTxDeps(opts, 8, 8, false, false,
- {5, 5, 6, 7, 3, 6, 5, 6},
- {28, 26, 13, 27, 3, 3, 27, 36},
- {11, 30, 10, 12, 5, 23, 30, 32});
-}
-
+
+ RandomTxDeps(opts, 8, 8, false, false,
+ {5, 5, 6, 7, 3, 6, 5, 6},
+ {28, 26, 13, 27, 3, 3, 27, 36},
+ {11, 30, 10, 12, 5, 23, 30, 32});
+}
+
Y_UNIT_TEST_WITH_MVCC(RandomPoints_ReproducerDelayRS1) {
- TTester::TOptions opts;
- opts.DelayReadSet = true;
- opts.EnableOutOfOrder(8);
+ TTester::TOptions opts;
+ opts.DelayReadSet = true;
+ opts.EnableOutOfOrder(8);
opts.EnableMvcc(WithMvcc);
-
- RandomTxDeps(opts, 8, 8, true, false,
- {2, 7, 7, 7, 6, 3, 2, 4},
- {2, 66, 30, 104, 25, 4, 0, 1},
- {0, 40, 2, 33, 8, 4, 1, 3});
-}
-
+
+ RandomTxDeps(opts, 8, 8, true, false,
+ {2, 7, 7, 7, 6, 3, 2, 4},
+ {2, 66, 30, 104, 25, 4, 0, 1},
+ {0, 40, 2, 33, 8, 4, 1, 3});
+}
+
Y_UNIT_TEST_WITH_MVCC(RandomPoints_DelayRS) {
TTester::TOptions opts;
opts.DelayReadSet = true;
@@ -1157,144 +1157,144 @@ Y_UNIT_TEST_WITH_MVCC(RandomPointsAndRanges) {
Y_UNIT_TEST_SUITE(DataShardScan) {
Y_UNIT_TEST_WITH_MVCC(ScanFollowedByUpdate) {
- TTester::TOptions opts;
- opts.ExecutorCacheSize = 0;
- opts.EnableOutOfOrder(8);
+ TTester::TOptions opts;
+ opts.ExecutorCacheSize = 0;
+ opts.EnableOutOfOrder(8);
opts.EnableMvcc(WithMvcc);
-
- TTester t(TTester::ESchema_MultiShardKV, opts);
- TFakeMiniKQLProxy proxy(t);
-
+
+ TTester t(TTester::ESchema_MultiShardKV, opts);
+ TFakeMiniKQLProxy proxy(t);
+
auto checkScanResult = [](const TFakeProxyTx &tx, TSet<TString> ref) -> bool {
- const TFakeScanTx &scanTx = dynamic_cast<const TFakeScanTx &>(tx);
+ const TFakeScanTx &scanTx = dynamic_cast<const TFakeScanTx &>(tx);
YdbOld::ResultSet res = scanTx.GetScanResult();
- //Cerr << res.DebugString() << Endl;
+ //Cerr << res.DebugString() << Endl;
for (auto &row : res.rows()) {
auto &val = row.items(0).text_value();
UNIT_ASSERT(ref.contains(val));
- ref.erase(val);
- }
-
- UNIT_ASSERT(ref.empty());
-
- return true;
- };
-
- InitCrossShard_ABC(proxy, {{1, 2, 3}});
-
- NKikimrTxDataShard::TDataTransaction dataTransaction;
- dataTransaction.SetStreamResponse(true);
- dataTransaction.SetImmediate(false);
- dataTransaction.SetReadOnly(true);
- auto &tx = *dataTransaction.MutableReadTableTransaction();
- tx.MutableTableId()->SetOwnerId(FAKE_SCHEMESHARD_TABLET_ID);
- tx.MutableTableId()->SetTableId(13);
- auto &c = *tx.AddColumns();
- c.SetId(56);
- c.SetName("value");
- c.SetTypeId(NScheme::NTypeIds::Utf8);
-
+ ref.erase(val);
+ }
+
+ UNIT_ASSERT(ref.empty());
+
+ return true;
+ };
+
+ InitCrossShard_ABC(proxy, {{1, 2, 3}});
+
+ NKikimrTxDataShard::TDataTransaction dataTransaction;
+ dataTransaction.SetStreamResponse(true);
+ dataTransaction.SetImmediate(false);
+ dataTransaction.SetReadOnly(true);
+ auto &tx = *dataTransaction.MutableReadTableTransaction();
+ tx.MutableTableId()->SetOwnerId(FAKE_SCHEMESHARD_TABLET_ID);
+ tx.MutableTableId()->SetTableId(13);
+ auto &c = *tx.AddColumns();
+ c.SetId(56);
+ c.SetName("value");
+ c.SetTypeId(NScheme::NTypeIds::Utf8);
+
TSet<TString> ref1{"A", "B", "C"};
- proxy.EnqueueScan(dataTransaction.SerializeAsString(), [ref1, checkScanResult](TFakeProxyTx& tx) {
- return checkScanResult(tx, ref1);
+ proxy.EnqueueScan(dataTransaction.SerializeAsString(), [ref1, checkScanResult](TFakeProxyTx& tx) {
+ return checkScanResult(tx, ref1);
}, NDataShard::TTxFlags::Default);
-
- ui32 N = 30;
-
- auto programText = R"((
- (let row1_ '('('key (Uint32 '0))))
- (let row2_ '('('key (Uint32 '1000))))
- (let row3_ '('('key (Uint32 '2000))))
- (let upd1_ '('('value (Utf8 'A%u)) '('uint (Uint32 '1%u))))
- (let upd2_ '('('value (Utf8 'B%u)) '('uint (Uint32 '2%u))))
- (let upd3_ '('('value (Utf8 'C%u)) '('uint (Uint32 '3%u))))
- (let ret_ (AsList
- (UpdateRow 'table1 row1_ upd1_)
- (UpdateRow 'table1 row2_ upd2_)
- (UpdateRow 'table1 row3_ upd3_)
- ))
- (return ret_)
- ))";
-
- for (ui32 i = 1; i <= N; ++i) {
- proxy.Enqueue(Sprintf(programText, i, i, i, i, i, i));
- }
-
- proxy.ExecQueue();
-
+
+ ui32 N = 30;
+
+ auto programText = R"((
+ (let row1_ '('('key (Uint32 '0))))
+ (let row2_ '('('key (Uint32 '1000))))
+ (let row3_ '('('key (Uint32 '2000))))
+ (let upd1_ '('('value (Utf8 'A%u)) '('uint (Uint32 '1%u))))
+ (let upd2_ '('('value (Utf8 'B%u)) '('uint (Uint32 '2%u))))
+ (let upd3_ '('('value (Utf8 'C%u)) '('uint (Uint32 '3%u))))
+ (let ret_ (AsList
+ (UpdateRow 'table1 row1_ upd1_)
+ (UpdateRow 'table1 row2_ upd2_)
+ (UpdateRow 'table1 row3_ upd3_)
+ ))
+ (return ret_)
+ ))";
+
+ for (ui32 i = 1; i <= N; ++i) {
+ proxy.Enqueue(Sprintf(programText, i, i, i, i, i, i));
+ }
+
+ proxy.ExecQueue();
+
TSet<TString> ref2{"A" + ToString(N), "B" + ToString(N), "C" + ToString(N)};
- proxy.EnqueueScan(dataTransaction.SerializeAsString(), [ref2, checkScanResult](TFakeProxyTx& tx) {
- return checkScanResult(tx, ref2);
+ proxy.EnqueueScan(dataTransaction.SerializeAsString(), [ref2, checkScanResult](TFakeProxyTx& tx) {
+ return checkScanResult(tx, ref2);
}, NDataShard::TTxFlags::Default);
- proxy.ExecQueue();
-}
-
+ proxy.ExecQueue();
+}
+
Y_UNIT_TEST_QUAD(TestDelayedTxWaitsForWriteActiveTxOnly, UseMvcc, UseNewEngine) {
- TPortManager pm;
- TServerSettings serverSettings(pm.GetPort(2134));
- serverSettings.SetDomainName("Root")
+ TPortManager pm;
+ TServerSettings serverSettings(pm.GetPort(2134));
+ serverSettings.SetDomainName("Root")
.SetEnableMvcc(WithMvcc)
- .SetUseRealThreads(false);
-
- Tests::TServer::TPtr server = new TServer(serverSettings);
- auto &runtime = *server->GetRuntime();
- auto sender = runtime.AllocateEdgeActor();
- TAutoPtr<IEventHandle> handle;
-
- runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_DEBUG);
+ .SetUseRealThreads(false);
+
+ Tests::TServer::TPtr server = new TServer(serverSettings);
+ auto &runtime = *server->GetRuntime();
+ auto sender = runtime.AllocateEdgeActor();
+ TAutoPtr<IEventHandle> handle;
+
+ runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_DEBUG);
if (UseNewEngine) {
runtime.SetLogPriority(NKikimrServices::KQP_EXECUTER, NLog::PRI_DEBUG);
} else {
runtime.SetLogPriority(NKikimrServices::KQP_PROXY, NLog::PRI_DEBUG);
}
- runtime.SetLogPriority(NKikimrServices::MINIKQL_ENGINE, NActors::NLog::PRI_DEBUG);
-
- InitRoot(server, sender);
-
+ runtime.SetLogPriority(NKikimrServices::MINIKQL_ENGINE, NActors::NLog::PRI_DEBUG);
+
+ InitRoot(server, sender);
+
CreateShardedTable(server, sender, "/Root", "table-1", 1);
CreateShardedTable(server, sender, "/Root", "table-2", 1);
-
+
ExecSQL(server, sender, Q_("UPSERT INTO `/Root/table-1` (key, value) VALUES (1, 1), (3, 3);"));
ExecSQL(server, sender, Q_("UPSERT INTO `/Root/table-2` (key, value) VALUES (2, 2);"));
-
- ui64 shard2 = GetTableShards(server, sender, "/Root/table-2")[0];
-
- TVector<TAutoPtr<IEventHandle>> rss;
-
- // We want to intercept all RS to table-2.
+
+ ui64 shard2 = GetTableShards(server, sender, "/Root/table-2")[0];
+
+ TVector<TAutoPtr<IEventHandle>> rss;
+
+ // We want to intercept all RS to table-2.
auto captureRS = [shard2,&rss](TTestActorRuntimeBase &,
- TAutoPtr<IEventHandle> &event) -> auto {
- if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSet) {
- auto &rec = event->Get<TEvTxProcessing::TEvReadSet>()->Record;
- if (rec.GetTabletDest() == shard2) {
- rss.push_back(std::move(event));
- return TTestActorRuntime::EEventAction::DROP;
- }
- }
- return TTestActorRuntime::EEventAction::PROCESS;
- };
- runtime.SetObserverFunc(captureRS);
-
- // Send ReadTable request and wait until it hangs waiting for quota.
- {
- auto *req = new TEvTxUserProxy::TEvProposeTransaction;
- req->Record.SetStreamResponse(true);
- auto &tx = *req->Record.MutableTransaction()->MutableReadTableTransaction();
- tx.SetPath("/Root/table-2");
-
- runtime.Send(new IEventHandle(MakeTxProxyID(), sender, req));
- runtime.GrabEdgeEventRethrow<TEvTxProcessing::TEvStreamQuotaRequest>(handle);
- }
-
- // Copy data from table-1 to table-3. Txs should hang due to dropped RS.
+ TAutoPtr<IEventHandle> &event) -> auto {
+ if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSet) {
+ auto &rec = event->Get<TEvTxProcessing::TEvReadSet>()->Record;
+ if (rec.GetTabletDest() == shard2) {
+ rss.push_back(std::move(event));
+ return TTestActorRuntime::EEventAction::DROP;
+ }
+ }
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+ runtime.SetObserverFunc(captureRS);
+
+ // Send ReadTable request and wait until it hangs waiting for quota.
+ {
+ auto *req = new TEvTxUserProxy::TEvProposeTransaction;
+ req->Record.SetStreamResponse(true);
+ auto &tx = *req->Record.MutableTransaction()->MutableReadTableTransaction();
+ tx.SetPath("/Root/table-2");
+
+ runtime.Send(new IEventHandle(MakeTxProxyID(), sender, req));
+ runtime.GrabEdgeEventRethrow<TEvTxProcessing::TEvStreamQuotaRequest>(handle);
+ }
+
+ // Copy data from table-1 to table-3. Txs should hang due to dropped RS.
SendSQL(server, sender, Q_("UPSERT INTO `/Root/table-2` (key, value) SELECT key, value FROM `/Root/table-1` WHERE key = 1"));
SendSQL(server, sender, Q_("UPSERT INTO `/Root/table-2` (key, value) SELECT key, value FROM `/Root/table-1` WHERE key = 3"));
- {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(IsTxResultComplete(), 4);
- runtime.DispatchEvents(options);
- }
-
+ {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(IsTxResultComplete(), 4);
+ runtime.DispatchEvents(options);
+ }
+
// With mvcc (or a better dependency tracking) the read below may start out-of-order,
// because transactions above are stuck before performing any writes. Make sure it's
// forced to wait for above transactions by commiting a write that is guaranteed
@@ -1304,101 +1304,101 @@ Y_UNIT_TEST_QUAD(TestDelayedTxWaitsForWriteActiveTxOnly, UseMvcc, UseNewEngine)
UPSERT INTO `/Root/table-2` (key, value) VALUES (5, 5);
)"));
- // This immediate tx should be delayed due to conflict with upserts.
+ // This immediate tx should be delayed due to conflict with upserts.
SendSQL(server, sender, Q_("SELECT * FROM `/Root/table-2`"));
- {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvDataShard::EvProposeTransaction, 1);
- runtime.DispatchEvents(options);
- }
-
- // Don't catch RS any more and send caught ones to proceed with upsert.
- runtime.SetObserverFunc(&TTestActorRuntime::DefaultObserverFunc);
- for (auto &rs : rss)
- runtime.Send(rs.Release());
-
- // Wait for upserts and immediate tx to finish.
- {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(IsTxResultComplete(), 3);
- runtime.DispatchEvents(options);
- }
-}
-
+ {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvDataShard::EvProposeTransaction, 1);
+ runtime.DispatchEvents(options);
+ }
+
+ // Don't catch RS any more and send caught ones to proceed with upsert.
+ runtime.SetObserverFunc(&TTestActorRuntime::DefaultObserverFunc);
+ for (auto &rs : rss)
+ runtime.Send(rs.Release());
+
+ // Wait for upserts and immediate tx to finish.
+ {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(IsTxResultComplete(), 3);
+ runtime.DispatchEvents(options);
+ }
+}
+
Y_UNIT_TEST_QUAD(TestOnlyDataTxLagCausesRejects, UseMvcc, UseNewEngine) {
- TPortManager pm;
- TServerSettings serverSettings(pm.GetPort(2134));
- serverSettings.SetDomainName("Root")
+ TPortManager pm;
+ TServerSettings serverSettings(pm.GetPort(2134));
+ serverSettings.SetDomainName("Root")
.SetEnableMvcc(WithMvcc)
- .SetUseRealThreads(false);
-
- Tests::TServer::TPtr server = new TServer(serverSettings);
- auto &runtime = *server->GetRuntime();
- auto sender = runtime.AllocateEdgeActor();
- TAutoPtr<IEventHandle> handle;
-
- runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_TRACE);
+ .SetUseRealThreads(false);
+
+ Tests::TServer::TPtr server = new TServer(serverSettings);
+ auto &runtime = *server->GetRuntime();
+ auto sender = runtime.AllocateEdgeActor();
+ TAutoPtr<IEventHandle> handle;
+
+ runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_TRACE);
runtime.SetLogPriority(UseNewEngine ? NKikimrServices::KQP_EXECUTER : NKikimrServices::KQP_PROXY, NLog::PRI_DEBUG);
- runtime.SetLogPriority(NKikimrServices::MINIKQL_ENGINE, NActors::NLog::PRI_DEBUG);
-
- InitRoot(server, sender);
-
+ runtime.SetLogPriority(NKikimrServices::MINIKQL_ENGINE, NActors::NLog::PRI_DEBUG);
+
+ InitRoot(server, sender);
+
CreateShardedTable(server, sender, "/Root", "table-1", 2);
- //auto shards = GetTableShards(server, sender, "/Root/table-1");
-
+ //auto shards = GetTableShards(server, sender, "/Root/table-1");
+
ExecSQL(server, sender, Q_("UPSERT INTO `/Root/table-1` (key, value) VALUES (1, 3000000001), (3000000003, 3)"));
-
- // Send ReadTable requests and wait until they hang waiting for quota.
- for (int i = 0; i < 2; ++i) {
- auto *req = new TEvTxUserProxy::TEvProposeTransaction;
- req->Record.SetStreamResponse(true);
- auto &tx = *req->Record.MutableTransaction()->MutableReadTableTransaction();
- tx.SetPath("/Root/table-1");
- runtime.Send(new IEventHandle(MakeTxProxyID(), sender, req));
- runtime.GrabEdgeEventRethrow<TEvTxProcessing::TEvStreamQuotaRequest>(handle);
- }
-
- // Now move time forward and check we can still execute data txs.
- runtime.UpdateCurrentTime(runtime.GetCurrentTime() + TDuration::Minutes(10));
- // Wait for mediator timecast.
- {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvMediatorTimecast::EvUpdate, 1);
- runtime.DispatchEvents(options);
- }
-
+
+ // Send ReadTable requests and wait until they hang waiting for quota.
+ for (int i = 0; i < 2; ++i) {
+ auto *req = new TEvTxUserProxy::TEvProposeTransaction;
+ req->Record.SetStreamResponse(true);
+ auto &tx = *req->Record.MutableTransaction()->MutableReadTableTransaction();
+ tx.SetPath("/Root/table-1");
+ runtime.Send(new IEventHandle(MakeTxProxyID(), sender, req));
+ runtime.GrabEdgeEventRethrow<TEvTxProcessing::TEvStreamQuotaRequest>(handle);
+ }
+
+ // Now move time forward and check we can still execute data txs.
+ runtime.UpdateCurrentTime(runtime.GetCurrentTime() + TDuration::Minutes(10));
+ // Wait for mediator timecast.
+ {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvMediatorTimecast::EvUpdate, 1);
+ runtime.DispatchEvents(options);
+ }
+
ExecSQL(server, sender, Q_("SELECT COUNT(*) FROM `/Root/table-1`"));
-
- // Send SQL request which should hang due to lost RS.
+
+ // Send SQL request which should hang due to lost RS.
auto captureRS = [](TTestActorRuntimeBase&,
- TAutoPtr<IEventHandle> &event) -> auto {
- if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSet)
- return TTestActorRuntime::EEventAction::DROP;
- return TTestActorRuntime::EEventAction::PROCESS;
- };
- runtime.SetObserverFunc(captureRS);
-
+ TAutoPtr<IEventHandle> &event) -> auto {
+ if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSet)
+ return TTestActorRuntime::EEventAction::DROP;
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+ runtime.SetObserverFunc(captureRS);
+
SendSQL(server, sender, Q_("UPSERT INTO `/Root/table-1` (key, value) SELECT value, key FROM `/Root/table-1`"));
- {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(IsTxResultComplete(), 2);
- runtime.DispatchEvents(options);
- }
-
- // Now move time forward and check we can still execute data txs.
- runtime.UpdateCurrentTime(runtime.GetCurrentTime() + TDuration::Minutes(10));
- // Wait for mediator timecast.
- {
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvMediatorTimecast::EvUpdate, 1);
- runtime.DispatchEvents(options);
- }
-
+ {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(IsTxResultComplete(), 2);
+ runtime.DispatchEvents(options);
+ }
+
+ // Now move time forward and check we can still execute data txs.
+ runtime.UpdateCurrentTime(runtime.GetCurrentTime() + TDuration::Minutes(10));
+ // Wait for mediator timecast.
+ {
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvMediatorTimecast::EvUpdate, 1);
+ runtime.DispatchEvents(options);
+ }
+
ExecSQL(server, sender, Q_("SELECT COUNT(*) FROM `/Root/table-1`"), true, Ydb::StatusIds::UNAVAILABLE);
-}
-
-}
-
+}
+
+}
+
Y_UNIT_TEST_SUITE(DataShardOutOfOrder) {
Y_UNIT_TEST_QUAD(TestOutOfOrderLockLost, UseMvcc, UseNewEngine) {
diff --git a/ydb/core/tx/datashard/datashard_ut_rs.cpp b/ydb/core/tx/datashard/datashard_ut_rs.cpp
index 58a9ea1d107..edbe2968da2 100644
--- a/ydb/core/tx/datashard/datashard_ut_rs.cpp
+++ b/ydb/core/tx/datashard/datashard_ut_rs.cpp
@@ -1,329 +1,329 @@
-#include "defs.h"
-#include "datashard_ut_common.h"
-
+#include "defs.h"
+#include "datashard_ut_common.h"
+
#include <ydb/core/testlib/test_client.h>
#include <ydb/core/tx/schemeshard/schemeshard.h>
#include <ydb/core/tx/tx_proxy/proxy.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-
-namespace NKikimr {
-
+
+
+namespace NKikimr {
+
using namespace NSchemeShard;
-using namespace Tests;
-
+using namespace Tests;
+
ui64 GetRSCount(TTestActorRuntime &runtime, TActorId sender, ui64 shard)
-{
- auto request = MakeHolder<TEvTablet::TEvLocalMKQL>();
- TString miniKQL = R"___((
- (let range '('IncFrom '('TxId (Uint64 '0) (Void))))
- (let select '('TxId))
- (let options '())
- (let pgmReturn (AsList
- (SetResult 'myRes (Length (Member (SelectRange 'InReadSets range select options) 'List)))))
- (return pgmReturn)
- ))___";
-
- request->Record.MutableProgram()->MutableProgram()->SetText(miniKQL);
- runtime.SendToPipe(shard, sender, request.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvTablet::TEvLocalMKQLResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), 0);
- return reply->Record.GetExecutionEngineEvaluatedResponse()
- .GetValue().GetStruct(0).GetOptional().GetUint64();
-}
-
-struct IsReadSet {
- IsReadSet(ui64 src, ui64 dest)
- : Source(src)
- , Dest(dest)
- {
- }
-
- bool operator()(IEventHandle& ev)
- {
- if (ev.GetTypeRewrite() == TEvTxProcessing::EvReadSet) {
- auto &rec = ev.Get<TEvTxProcessing::TEvReadSet>()->Record;
- if (rec.GetTabletSource() == Source && rec.GetTabletDest() == Dest) {
- return true;
- }
- }
- return false;
- }
-
- ui64 Source;
- ui64 Dest;
-};
-
-Y_UNIT_TEST_SUITE(TDataShardRSTest) {
- Y_UNIT_TEST(TestCleanupInRS) {
- TPortManager pm;
- TServerSettings serverSettings(pm.GetPort(2134));
- serverSettings.SetDomainName("Root")
- .SetUseRealThreads(false);
-
- Tests::TServer::TPtr server = new TServer(serverSettings);
- auto &runtime = *server->GetRuntime();
- auto sender = runtime.AllocateEdgeActor();
- TAutoPtr<IEventHandle> handle;
-
- runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_DEBUG);
- //runtime.SetLogPriority(NKikimrServices::FLAT_TX_SCHEMESHARD, NLog::PRI_TRACE);
- //runtime.SetLogPriority(NKikimrServices::TX_PROXY, NLog::PRI_TRACE);
- //runtime.SetLogPriority(NKikimrServices::KQP_YQL, NLog::PRI_TRACE);
-
- InitRoot(server, sender);
-
- CreateShardedTable(server, sender, "/Root", "table-1", 4, false);
-
- // Fill some data. Later we will copy data from shards 2 and 3 to shard 1.
- {
- auto request = MakeSQLRequest("UPSERT INTO [/Root/table-1] (key, value) VALUES (0x50000000,1),(0x80000001,1),(0x80000002,1),(0x80000003,1),(0x80000004,1),(0x80000005,1),(0x80000006,1),(0x80000007,1),(0x80000008,1),(0x80000009,1)");
+{
+ auto request = MakeHolder<TEvTablet::TEvLocalMKQL>();
+ TString miniKQL = R"___((
+ (let range '('IncFrom '('TxId (Uint64 '0) (Void))))
+ (let select '('TxId))
+ (let options '())
+ (let pgmReturn (AsList
+ (SetResult 'myRes (Length (Member (SelectRange 'InReadSets range select options) 'List)))))
+ (return pgmReturn)
+ ))___";
+
+ request->Record.MutableProgram()->MutableProgram()->SetText(miniKQL);
+ runtime.SendToPipe(shard, sender, request.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTablet::TEvLocalMKQLResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), 0);
+ return reply->Record.GetExecutionEngineEvaluatedResponse()
+ .GetValue().GetStruct(0).GetOptional().GetUint64();
+}
+
+struct IsReadSet {
+ IsReadSet(ui64 src, ui64 dest)
+ : Source(src)
+ , Dest(dest)
+ {
+ }
+
+ bool operator()(IEventHandle& ev)
+ {
+ if (ev.GetTypeRewrite() == TEvTxProcessing::EvReadSet) {
+ auto &rec = ev.Get<TEvTxProcessing::TEvReadSet>()->Record;
+ if (rec.GetTabletSource() == Source && rec.GetTabletDest() == Dest) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ ui64 Source;
+ ui64 Dest;
+};
+
+Y_UNIT_TEST_SUITE(TDataShardRSTest) {
+ Y_UNIT_TEST(TestCleanupInRS) {
+ TPortManager pm;
+ TServerSettings serverSettings(pm.GetPort(2134));
+ serverSettings.SetDomainName("Root")
+ .SetUseRealThreads(false);
+
+ Tests::TServer::TPtr server = new TServer(serverSettings);
+ auto &runtime = *server->GetRuntime();
+ auto sender = runtime.AllocateEdgeActor();
+ TAutoPtr<IEventHandle> handle;
+
+ runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_DEBUG);
+ //runtime.SetLogPriority(NKikimrServices::FLAT_TX_SCHEMESHARD, NLog::PRI_TRACE);
+ //runtime.SetLogPriority(NKikimrServices::TX_PROXY, NLog::PRI_TRACE);
+ //runtime.SetLogPriority(NKikimrServices::KQP_YQL, NLog::PRI_TRACE);
+
+ InitRoot(server, sender);
+
+ CreateShardedTable(server, sender, "/Root", "table-1", 4, false);
+
+ // Fill some data. Later we will copy data from shards 2 and 3 to shard 1.
+ {
+ auto request = MakeSQLRequest("UPSERT INTO [/Root/table-1] (key, value) VALUES (0x50000000,1),(0x80000001,1),(0x80000002,1),(0x80000003,1),(0x80000004,1),(0x80000005,1),(0x80000006,1),(0x80000007,1),(0x80000008,1),(0x80000009,1)");
runtime.Send(new IEventHandle(NKqp::MakeKqpProxyID(runtime.GetNodeId()), sender, request.Release()));
- runtime.GrabEdgeEventRethrow<NKqp::TEvKqp::TEvQueryResponse>(handle);
- }
-
- auto shards = GetTableShards(server, sender, "/Root/table-1");
-
- // Add some fake RS to the first shard.
- {
- auto request = MakeHolder<TEvTablet::TEvLocalMKQL>();
- TString miniKQL = R"___((
- (let range (ListFromRange (Uint64 '1) (Uint64 '450001)))
- (let upd (lambda '(x) (UpdateRow 'InReadSets
- '( '('TxId x) '('Origin x) '('From x) '('To x) )
- '('('Body (ByteString '"\x09\x00\x00\x00\x02\x16\x0C\x0B\x00\x00\x00\x00\x00"))))))
- (return (Map range upd))
- ))___";
-
- request->Record.MutableProgram()->MutableProgram()->SetText(miniKQL);
- runtime.SendToPipe(shards[0], sender, request.Release(), 0, GetPipeConfigWithRetries());
-
- auto reply = runtime.GrabEdgeEventRethrow<TEvTablet::TEvLocalMKQLResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), 0);
- }
-
- // Run multishard tx but drop RS to pause it on the first shard.
- {
+ runtime.GrabEdgeEventRethrow<NKqp::TEvKqp::TEvQueryResponse>(handle);
+ }
+
+ auto shards = GetTableShards(server, sender, "/Root/table-1");
+
+ // Add some fake RS to the first shard.
+ {
+ auto request = MakeHolder<TEvTablet::TEvLocalMKQL>();
+ TString miniKQL = R"___((
+ (let range (ListFromRange (Uint64 '1) (Uint64 '450001)))
+ (let upd (lambda '(x) (UpdateRow 'InReadSets
+ '( '('TxId x) '('Origin x) '('From x) '('To x) )
+ '('('Body (ByteString '"\x09\x00\x00\x00\x02\x16\x0C\x0B\x00\x00\x00\x00\x00"))))))
+ (return (Map range upd))
+ ))___";
+
+ request->Record.MutableProgram()->MutableProgram()->SetText(miniKQL);
+ runtime.SendToPipe(shards[0], sender, request.Release(), 0, GetPipeConfigWithRetries());
+
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTablet::TEvLocalMKQLResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), 0);
+ }
+
+ // Run multishard tx but drop RS to pause it on the first shard.
+ {
auto captureRS = [shard=shards[1]](TTestActorRuntimeBase&,
- TAutoPtr<IEventHandle> &event) -> auto {
- if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSet) {
- auto &rec = event->Get<TEvTxProcessing::TEvReadSet>()->Record;
- if (rec.GetTabletSource() == shard)
- return TTestActorRuntime::EEventAction::DROP;
- }
- return TTestActorRuntime::EEventAction::PROCESS;
- };
- runtime.SetObserverFunc(captureRS);
-
- auto request = MakeSQLRequest("UPSERT INTO [/Root/table-1] (key, value) SELECT value, key FROM [/Root/table-1] WHERE key = 0x50000000");
+ TAutoPtr<IEventHandle> &event) -> auto {
+ if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSet) {
+ auto &rec = event->Get<TEvTxProcessing::TEvReadSet>()->Record;
+ if (rec.GetTabletSource() == shard)
+ return TTestActorRuntime::EEventAction::DROP;
+ }
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+ runtime.SetObserverFunc(captureRS);
+
+ auto request = MakeSQLRequest("UPSERT INTO [/Root/table-1] (key, value) SELECT value, key FROM [/Root/table-1] WHERE key = 0x50000000");
runtime.Send(new IEventHandle(NKqp::MakeKqpProxyID(runtime.GetNodeId()), sender, request.Release()));
- // Wait until both parts of tx are finished on the second shard.
- TDispatchOptions options;
- options.FinalEvents.emplace_back(IsTxResultComplete(), 2);
- runtime.DispatchEvents(options);
- }
-
- // Run more txs and wait until RSs are in local db.
- {
- for (auto i = 1; i < 10; ++i) {
- auto request = MakeSQLRequest(Sprintf("UPSERT INTO [/Root/table-1] (key, value) SELECT value, key FROM [/Root/table-1] WHERE key = %" PRIu32, i + 0x80000000));
+ // Wait until both parts of tx are finished on the second shard.
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(IsTxResultComplete(), 2);
+ runtime.DispatchEvents(options);
+ }
+
+ // Run more txs and wait until RSs are in local db.
+ {
+ for (auto i = 1; i < 10; ++i) {
+ auto request = MakeSQLRequest(Sprintf("UPSERT INTO [/Root/table-1] (key, value) SELECT value, key FROM [/Root/table-1] WHERE key = %" PRIu32, i + 0x80000000));
runtime.Send(new IEventHandle(NKqp::MakeKqpProxyID(runtime.GetNodeId()), sender, request.Release()));
- }
- TDispatchOptions options;
- options.FinalEvents.emplace_back(TEvTxProcessing::EvReadSetAck, 9);
- runtime.DispatchEvents(options);
- }
-
- // Now restart the first shard and wait for RS cleanup events.
- {
- UNIT_ASSERT_VALUES_EQUAL(GetRSCount(runtime, sender, shards[0]), 450009);
-
- runtime.Register(CreateTabletKiller(shards[0]));
-
- TDispatchOptions options;
+ }
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(TEvTxProcessing::EvReadSetAck, 9);
+ runtime.DispatchEvents(options);
+ }
+
+ // Now restart the first shard and wait for RS cleanup events.
+ {
+ UNIT_ASSERT_VALUES_EQUAL(GetRSCount(runtime, sender, shards[0]), 450009);
+
+ runtime.Register(CreateTabletKiller(shards[0]));
+
+ TDispatchOptions options;
//TDataShard::TEvPrivate::EvRemoveOldInReadSets
options.FinalEvents.emplace_back(EventSpaceBegin(TKikimrEvents::ES_PRIVATE) + 9, 5);
- runtime.DispatchEvents(options);
-
- // We can't be sure RS are cleaned up because shared event number
- // is used to track cleanup txs. So make a check loop.
- while (GetRSCount(runtime, sender, shards[0]) != 9)
- runtime.DispatchEvents(options, TDuration::Seconds(1));
- }
-
- // Check all remained RS are for existing txs
- {
- auto request = MakeHolder<TEvTablet::TEvLocalMKQL>();
- TString miniKQL = R"___((
- (let range '('IncFrom '('TxId (Uint64 '0) (Void))))
- (let select '('TxId))
- (let options '())
- (let pgmReturn (AsList
- (SetResult 'myRes (SelectRange 'InReadSets range select options))))
- (return pgmReturn)
- ))___";
-
- request->Record.MutableProgram()->MutableProgram()->SetText(miniKQL);
- runtime.SendToPipe(shards[0], sender, request.Release(), 0, GetPipeConfigWithRetries());
-
- TAutoPtr<IEventHandle> handle;
- auto reply = runtime.GrabEdgeEventRethrow<TEvTablet::TEvLocalMKQLResponse>(handle);
- UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), 0);
- for (auto &row : reply->Record.GetExecutionEngineEvaluatedResponse()
- .GetValue().GetStruct(0).GetOptional().GetStruct(0).GetList()) {
- UNIT_ASSERT(row.GetStruct(0).GetOptional().GetUint64() > 450000);
- }
- }
-
- // Now let all other txs finish and check we have no more RS stored.
- {
- runtime.SetObserverFunc(&TTestActorRuntime::DefaultObserverFunc);
- runtime.Register(CreateTabletKiller(shards[0]));
-
- TDispatchOptions options;
- options.FinalEvents.emplace_back(IsTxResultComplete(), 10);
- runtime.DispatchEvents(options);
-
- while (GetRSCount(runtime, sender, shards[0]) != 0)
- runtime.DispatchEvents(options, TDuration::Seconds(1));
- }
- }
-
- Y_UNIT_TEST(TestDelayedRSAckForUnknownTx) {
- TPortManager pm;
- TServerSettings serverSettings(pm.GetPort(2134));
- serverSettings.SetDomainName("Root")
- .SetUseRealThreads(false);
-
- Tests::TServer::TPtr server = new TServer(serverSettings);
- auto &runtime = *server->GetRuntime();
- auto sender = runtime.AllocateEdgeActor();
- TAutoPtr<IEventHandle> handle;
-
- runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_TRACE);
-
- InitRoot(server, sender);
-
- CreateShardedTable(server, sender, "/Root", "table-1", 1);
- CreateShardedTable(server, sender, "/Root", "table-2", 4);
-
- // Fill some data.
- ExecSQL(server, sender, "UPSERT INTO [/Root/table-1] (key, value) VALUES (0x20000000,0x20000001),(0x60000000,0x60000001),(0xA0000000,0xA0000001),(0xE0000000,0xE0000001);");
-
- auto shards1 = GetTableShards(server, sender, "/Root/table-1");
- auto shards2 = GetTableShards(server, sender, "/Root/table-2");
-
- // Run multishard tx but drop all RS acks to the table-1.
- // Tx should still finish successfully.
- {
+ runtime.DispatchEvents(options);
+
+ // We can't be sure RS are cleaned up because shared event number
+ // is used to track cleanup txs. So make a check loop.
+ while (GetRSCount(runtime, sender, shards[0]) != 9)
+ runtime.DispatchEvents(options, TDuration::Seconds(1));
+ }
+
+ // Check all remained RS are for existing txs
+ {
+ auto request = MakeHolder<TEvTablet::TEvLocalMKQL>();
+ TString miniKQL = R"___((
+ (let range '('IncFrom '('TxId (Uint64 '0) (Void))))
+ (let select '('TxId))
+ (let options '())
+ (let pgmReturn (AsList
+ (SetResult 'myRes (SelectRange 'InReadSets range select options))))
+ (return pgmReturn)
+ ))___";
+
+ request->Record.MutableProgram()->MutableProgram()->SetText(miniKQL);
+ runtime.SendToPipe(shards[0], sender, request.Release(), 0, GetPipeConfigWithRetries());
+
+ TAutoPtr<IEventHandle> handle;
+ auto reply = runtime.GrabEdgeEventRethrow<TEvTablet::TEvLocalMKQLResponse>(handle);
+ UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), 0);
+ for (auto &row : reply->Record.GetExecutionEngineEvaluatedResponse()
+ .GetValue().GetStruct(0).GetOptional().GetStruct(0).GetList()) {
+ UNIT_ASSERT(row.GetStruct(0).GetOptional().GetUint64() > 450000);
+ }
+ }
+
+ // Now let all other txs finish and check we have no more RS stored.
+ {
+ runtime.SetObserverFunc(&TTestActorRuntime::DefaultObserverFunc);
+ runtime.Register(CreateTabletKiller(shards[0]));
+
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(IsTxResultComplete(), 10);
+ runtime.DispatchEvents(options);
+
+ while (GetRSCount(runtime, sender, shards[0]) != 0)
+ runtime.DispatchEvents(options, TDuration::Seconds(1));
+ }
+ }
+
+ Y_UNIT_TEST(TestDelayedRSAckForUnknownTx) {
+ TPortManager pm;
+ TServerSettings serverSettings(pm.GetPort(2134));
+ serverSettings.SetDomainName("Root")
+ .SetUseRealThreads(false);
+
+ Tests::TServer::TPtr server = new TServer(serverSettings);
+ auto &runtime = *server->GetRuntime();
+ auto sender = runtime.AllocateEdgeActor();
+ TAutoPtr<IEventHandle> handle;
+
+ runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_TRACE);
+
+ InitRoot(server, sender);
+
+ CreateShardedTable(server, sender, "/Root", "table-1", 1);
+ CreateShardedTable(server, sender, "/Root", "table-2", 4);
+
+ // Fill some data.
+ ExecSQL(server, sender, "UPSERT INTO [/Root/table-1] (key, value) VALUES (0x20000000,0x20000001),(0x60000000,0x60000001),(0xA0000000,0xA0000001),(0xE0000000,0xE0000001);");
+
+ auto shards1 = GetTableShards(server, sender, "/Root/table-1");
+ auto shards2 = GetTableShards(server, sender, "/Root/table-2");
+
+ // Run multishard tx but drop all RS acks to the table-1.
+ // Tx should still finish successfully.
+ {
auto captureRS = [shard=shards1[0]](TTestActorRuntimeBase&,
- TAutoPtr<IEventHandle> &event) -> auto {
- if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSetAck) {
- auto &rec = event->Get<TEvTxProcessing::TEvReadSetAck>()->Record;
- if (rec.GetTabletSource() == shard) {
- return TTestActorRuntime::EEventAction::DROP;
- }
- }
- return TTestActorRuntime::EEventAction::PROCESS;
- };
- runtime.SetObserverFunc(captureRS);
-
- ExecSQL(server, sender, "UPSERT INTO [/Root/table-2] (key, value) SELECT key, value FROM [/Root/table-1]");
- }
-
- // Now we have multishard tx completed but RS not acked. Restart
- // second table shards to trigger RS resend.
- runtime.SetObserverFunc(&TTestActorRuntime::DefaultObserverFunc);
- for (auto shard : shards2)
- runtime.Register(CreateTabletKiller(shard));
-
- // Try to drop table which waits for all OutRS to be acked. If acks
- // for completed tx work correctly then it should succeed.
- SendSQL(server, sender, "DROP TABLE [/Root/table-1]", false);
- WaitTabletBecomesOffline(server, shards1[0]);
- }
-
- Y_UNIT_TEST(TestDelayedRSAckForOutOfOrderCompletedTx) {
- TPortManager pm;
- TServerSettings serverSettings(pm.GetPort(2134));
- serverSettings.SetDomainName("Root")
- .SetUseRealThreads(false);
-
- Tests::TServer::TPtr server = new TServer(serverSettings);
- auto &runtime = *server->GetRuntime();
- auto sender = runtime.AllocateEdgeActor();
- TAutoPtr<IEventHandle> handle;
-
- runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_TRACE);
-
- InitRoot(server, sender);
-
- CreateShardedTable(server, sender, "/Root", "table-1", 1);
- CreateShardedTable(server, sender, "/Root", "table-2", 1);
- CreateShardedTable(server, sender, "/Root", "table-3", 1);
-
- // Fill some data.
- ExecSQL(server, sender, "UPSERT INTO [/Root/table-1] (key, value) VALUES (1, 1);");
- ExecSQL(server, sender, "UPSERT INTO [/Root/table-2] (key, value) VALUES (2, 2);");
-
- ui64 shard1 = GetTableShards(server, sender, "/Root/table-1")[0];
- ui64 shard2 = GetTableShards(server, sender, "/Root/table-2")[0];
- ui64 shard3 = GetTableShards(server, sender, "/Root/table-3")[0];
-
- // We want to intercept all RS from table-1 and all RS acks
- // from table-3.
+ TAutoPtr<IEventHandle> &event) -> auto {
+ if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSetAck) {
+ auto &rec = event->Get<TEvTxProcessing::TEvReadSetAck>()->Record;
+ if (rec.GetTabletSource() == shard) {
+ return TTestActorRuntime::EEventAction::DROP;
+ }
+ }
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+ runtime.SetObserverFunc(captureRS);
+
+ ExecSQL(server, sender, "UPSERT INTO [/Root/table-2] (key, value) SELECT key, value FROM [/Root/table-1]");
+ }
+
+ // Now we have multishard tx completed but RS not acked. Restart
+ // second table shards to trigger RS resend.
+ runtime.SetObserverFunc(&TTestActorRuntime::DefaultObserverFunc);
+ for (auto shard : shards2)
+ runtime.Register(CreateTabletKiller(shard));
+
+ // Try to drop table which waits for all OutRS to be acked. If acks
+ // for completed tx work correctly then it should succeed.
+ SendSQL(server, sender, "DROP TABLE [/Root/table-1]", false);
+ WaitTabletBecomesOffline(server, shards1[0]);
+ }
+
+ Y_UNIT_TEST(TestDelayedRSAckForOutOfOrderCompletedTx) {
+ TPortManager pm;
+ TServerSettings serverSettings(pm.GetPort(2134));
+ serverSettings.SetDomainName("Root")
+ .SetUseRealThreads(false);
+
+ Tests::TServer::TPtr server = new TServer(serverSettings);
+ auto &runtime = *server->GetRuntime();
+ auto sender = runtime.AllocateEdgeActor();
+ TAutoPtr<IEventHandle> handle;
+
+ runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_TRACE);
+
+ InitRoot(server, sender);
+
+ CreateShardedTable(server, sender, "/Root", "table-1", 1);
+ CreateShardedTable(server, sender, "/Root", "table-2", 1);
+ CreateShardedTable(server, sender, "/Root", "table-3", 1);
+
+ // Fill some data.
+ ExecSQL(server, sender, "UPSERT INTO [/Root/table-1] (key, value) VALUES (1, 1);");
+ ExecSQL(server, sender, "UPSERT INTO [/Root/table-2] (key, value) VALUES (2, 2);");
+
+ ui64 shard1 = GetTableShards(server, sender, "/Root/table-1")[0];
+ ui64 shard2 = GetTableShards(server, sender, "/Root/table-2")[0];
+ ui64 shard3 = GetTableShards(server, sender, "/Root/table-3")[0];
+
+ // We want to intercept all RS from table-1 and all RS acks
+ // from table-3.
auto captureRS = [shard1,shard3](TTestActorRuntimeBase&,
- TAutoPtr<IEventHandle> &event) -> auto {
- if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSet) {
- auto &rec = event->Get<TEvTxProcessing::TEvReadSet>()->Record;
- if (rec.GetTabletSource() == shard1) {
- return TTestActorRuntime::EEventAction::DROP;
- }
- } else if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSetAck) {
- auto &rec = event->Get<TEvTxProcessing::TEvReadSetAck>()->Record;
- if (rec.GetTabletDest() == shard3) {
- return TTestActorRuntime::EEventAction::DROP;
- }
- }
- return TTestActorRuntime::EEventAction::PROCESS;
- };
- runtime.SetObserverFunc(captureRS);
-
- // Copy data from table-1 to table-3. Tx should hung due to dropped RS.
- SendSQL(server, sender, "UPSERT INTO [/Root/table-3] (key, value) SELECT key, value FROM [/Root/table-1]");
- // Copy data from table-2 to table-3. Tx should succeed due to out-of-order.
- // RS acks are dropped so table-2 should have unacked RS in local DB.
- ExecSQL(server, sender, "UPSERT INTO [/Root/table-3] (key, value) SELECT key, value FROM [/Root/table-2]");
-
- // Restart table-3 and wait for new RS from table-2.
- {
- runtime.Register(CreateTabletKiller(shard3));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(IsReadSet(shard2, shard3));
- runtime.DispatchEvents(options);
- }
- // Now restart table-2 and wait for repeated RS.
- // This should test duplicated delayed RS acks.
- {
- runtime.Register(CreateTabletKiller(shard2));
- TDispatchOptions options;
- options.FinalEvents.emplace_back(IsReadSet(shard2, shard3));
- runtime.DispatchEvents(options);
- }
-
- // Now we should have delayed RS in table-3 for table-2 which is waiting
- // tx execution. Set default observer, send table-2 drop request and
- // restart table-1. Restart will cause RS resend and tx will be finished
- // in table-3. Finished tx will make delayed RS outdated and ack will
- // be send to table-2 leading to successful drop.
- runtime.SetObserverFunc(&TTestActorRuntime::DefaultObserverFunc);
- SendSQL(server, sender, "DROP TABLE [/Root/table-2]", false);
- runtime.Register(CreateTabletKiller(shard1));
- WaitTabletBecomesOffline(server, shard2);
- }
-}
-
-} // namespace NKikimr
+ TAutoPtr<IEventHandle> &event) -> auto {
+ if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSet) {
+ auto &rec = event->Get<TEvTxProcessing::TEvReadSet>()->Record;
+ if (rec.GetTabletSource() == shard1) {
+ return TTestActorRuntime::EEventAction::DROP;
+ }
+ } else if (event->GetTypeRewrite() == TEvTxProcessing::EvReadSetAck) {
+ auto &rec = event->Get<TEvTxProcessing::TEvReadSetAck>()->Record;
+ if (rec.GetTabletDest() == shard3) {
+ return TTestActorRuntime::EEventAction::DROP;
+ }
+ }
+ return TTestActorRuntime::EEventAction::PROCESS;
+ };
+ runtime.SetObserverFunc(captureRS);
+
+ // Copy data from table-1 to table-3. Tx should hung due to dropped RS.
+ SendSQL(server, sender, "UPSERT INTO [/Root/table-3] (key, value) SELECT key, value FROM [/Root/table-1]");
+ // Copy data from table-2 to table-3. Tx should succeed due to out-of-order.
+ // RS acks are dropped so table-2 should have unacked RS in local DB.
+ ExecSQL(server, sender, "UPSERT INTO [/Root/table-3] (key, value) SELECT key, value FROM [/Root/table-2]");
+
+ // Restart table-3 and wait for new RS from table-2.
+ {
+ runtime.Register(CreateTabletKiller(shard3));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(IsReadSet(shard2, shard3));
+ runtime.DispatchEvents(options);
+ }
+ // Now restart table-2 and wait for repeated RS.
+ // This should test duplicated delayed RS acks.
+ {
+ runtime.Register(CreateTabletKiller(shard2));
+ TDispatchOptions options;
+ options.FinalEvents.emplace_back(IsReadSet(shard2, shard3));
+ runtime.DispatchEvents(options);
+ }
+
+ // Now we should have delayed RS in table-3 for table-2 which is waiting
+ // tx execution. Set default observer, send table-2 drop request and
+ // restart table-1. Restart will cause RS resend and tx will be finished
+ // in table-3. Finished tx will make delayed RS outdated and ack will
+ // be send to table-2 leading to successful drop.
+ runtime.SetObserverFunc(&TTestActorRuntime::DefaultObserverFunc);
+ SendSQL(server, sender, "DROP TABLE [/Root/table-2]", false);
+ runtime.Register(CreateTabletKiller(shard1));
+ WaitTabletBecomesOffline(server, shard2);
+ }
+}
+
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/drop_table_unit.cpp b/ydb/core/tx/datashard/drop_table_unit.cpp
index 93fb3fa5592..8d8cfb960dd 100644
--- a/ydb/core/tx/datashard/drop_table_unit.cpp
+++ b/ydb/core/tx/datashard/drop_table_unit.cpp
@@ -1,38 +1,38 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TDropTableUnit : public TExecutionUnit {
-public:
+
+class TDropTableUnit : public TExecutionUnit {
+public:
TDropTableUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TDropTableUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TDropTableUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TDropTableUnit::TDropTableUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::DropTable, false, dataShard, pipeline)
-{
-}
-
-TDropTableUnit::~TDropTableUnit()
-{
-}
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::DropTable, false, dataShard, pipeline)
+{
+}
+
+TDropTableUnit::~TDropTableUnit()
+{
+}
+
bool TDropTableUnit::IsReadyToExecute(TOperation::TPtr op) const
-{
+{
TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
@@ -54,29 +54,29 @@ bool TDropTableUnit::IsReadyToExecute(TOperation::TPtr op) const
Y_VERIFY(op->GetDependencies().empty());
return op->GetSpecialDependencies().empty();
-}
-
-EExecutionStatus TDropTableUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- auto &schemeTx = tx->GetSchemeTx();
- if (!schemeTx.HasDropTable())
- return EExecutionStatus::Executed;
-
- LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
- "Trying to DROP TABLE at " << DataShard.TabletID());
-
+}
+
+EExecutionStatus TDropTableUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ auto &schemeTx = tx->GetSchemeTx();
+ if (!schemeTx.HasDropTable())
+ return EExecutionStatus::Executed;
+
+ LOG_INFO_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Trying to DROP TABLE at " << DataShard.TabletID());
+
ui64 tableId = schemeTx.GetDropTable().GetId_Deprecated();
if (schemeTx.GetDropTable().HasPathId()) {
Y_VERIFY(DataShard.GetPathOwnerId() == schemeTx.GetDropTable().GetPathId().GetOwnerId());
tableId = schemeTx.GetDropTable().GetPathId().GetLocalId();
}
- DataShard.DropUserTable(txc, tableId);
-
+ DataShard.DropUserTable(txc, tableId);
+
// FIXME: transactions need to specify ownerId
TVector<TSnapshotKey> snapshotsToRemove;
TSnapshotTableKey snapshotsScope(DataShard.GetPathOwnerId(), tableId);
@@ -89,25 +89,25 @@ EExecutionStatus TDropTableUnit::Execute(TOperation::TPtr op,
DataShard.GetSnapshotManager().PersistRemoveSnapshot(db, key);
}
- txc.DB.NoMoreReadsForTx();
- DataShard.SetPersistState(TShardState::PreOffline, txc);
-
- BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE);
- op->Result()->SetStepOrderId(op->GetStepOrder().ToPair());
-
- return EExecutionStatus::ExecutedNoMoreRestarts;
-}
-
-void TDropTableUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ txc.DB.NoMoreReadsForTx();
+ DataShard.SetPersistState(TShardState::PreOffline, txc);
+
+ BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE);
+ op->Result()->SetStepOrderId(op->GetStepOrder().ToPair());
+
+ return EExecutionStatus::ExecutedNoMoreRestarts;
+}
+
+void TDropTableUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateDropTableUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TDropTableUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/execute_data_tx_unit.cpp b/ydb/core/tx/datashard/execute_data_tx_unit.cpp
index d7517479357..b32f635cc0f 100644
--- a/ydb/core/tx/datashard/execute_data_tx_unit.cpp
+++ b/ydb/core/tx/datashard/execute_data_tx_unit.cpp
@@ -1,41 +1,41 @@
#include "datashard_kqp.h"
-#include "execution_unit_ctors.h"
-#include "setup_sys_locks.h"
-
-
-namespace NKikimr {
+#include "execution_unit_ctors.h"
+#include "setup_sys_locks.h"
+
+
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NMiniKQL;
-
-class TExecuteDataTxUnit : public TExecutionUnit {
-public:
+
+using namespace NMiniKQL;
+
+class TExecuteDataTxUnit : public TExecutionUnit {
+public:
TExecuteDataTxUnit(TDataShard& dataShard,
TPipeline& pipeline);
- ~TExecuteDataTxUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
+ ~TExecuteDataTxUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
TTransactionContext& txc,
const TActorContext& ctx) override;
- void Complete(TOperation::TPtr op,
+ void Complete(TOperation::TPtr op,
const TActorContext& ctx) override;
-
-private:
- void ExecuteDataTx(TOperation::TPtr op,
+
+private:
+ void ExecuteDataTx(TOperation::TPtr op,
TTransactionContext& txc,
const TActorContext& ctx);
- void AddLocksToResult(TOperation::TPtr op);
-};
-
+ void AddLocksToResult(TOperation::TPtr op);
+};
+
TExecuteDataTxUnit::TExecuteDataTxUnit(TDataShard& dataShard,
TPipeline& pipeline)
: TExecutionUnit(EExecutionUnitKind::ExecuteDataTx, true, dataShard, pipeline) {
-}
-
+}
+
TExecuteDataTxUnit::~TExecuteDataTxUnit() {
-}
-
+}
+
bool TExecuteDataTxUnit::IsReadyToExecute(TOperation::TPtr op) const {
if (op->Result() || op->HasResultSentFlag() || op->IsImmediate() && WillRejectDataTx(op)) {
return true;
@@ -47,9 +47,9 @@ bool TExecuteDataTxUnit::IsReadyToExecute(TOperation::TPtr op) const {
}
return !op->HasRuntimeConflicts();
-}
-
-EExecutionStatus TExecuteDataTxUnit::Execute(TOperation::TPtr op,
+}
+
+EExecutionStatus TExecuteDataTxUnit::Execute(TOperation::TPtr op,
TTransactionContext& txc,
const TActorContext& ctx)
{
@@ -66,15 +66,15 @@ EExecutionStatus TExecuteDataTxUnit::Execute(TOperation::TPtr op,
op->MvccReadWriteVersion.reset();
}
- TSetupSysLocks guardLocks(op, DataShard);
+ TSetupSysLocks guardLocks(op, DataShard);
TActiveTransaction* tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
if (tx->IsTxDataReleased()) {
switch (Pipeline.RestoreDataTx(tx, txc, ctx)) {
case ERestoreDataStatus::Ok:
break;
-
+
case ERestoreDataStatus::Restart:
return EExecutionStatus::Restart;
@@ -95,8 +95,8 @@ EExecutionStatus TExecuteDataTxUnit::Execute(TOperation::TPtr op,
}
IEngineFlat* engine = tx->GetDataTx()->GetEngine();
- Y_VERIFY_S(engine, "missing engine for " << *op << " at " << DataShard.TabletID());
-
+ Y_VERIFY_S(engine, "missing engine for " << *op << " at " << DataShard.TabletID());
+
if (op->IsImmediate() && !tx->ReValidateKeys()) {
// Immediate transactions may be reordered with schema changes and become invalid
const auto& dataTx = tx->GetDataTx();
@@ -107,22 +107,22 @@ EExecutionStatus TExecuteDataTxUnit::Execute(TOperation::TPtr op,
return EExecutionStatus::Executed;
}
- // TODO: cancel tx in special execution unit.
- if (tx->GetDataTx()->CheckCancelled())
- engine->Cancel();
- else {
- ui64 consumed = tx->GetDataTx()->GetTxSize() + engine->GetMemoryAllocated();
- if (MaybeRequestMoreTxMemory(consumed, txc)) {
+ // TODO: cancel tx in special execution unit.
+ if (tx->GetDataTx()->CheckCancelled())
+ engine->Cancel();
+ else {
+ ui64 consumed = tx->GetDataTx()->GetTxSize() + engine->GetMemoryAllocated();
+ if (MaybeRequestMoreTxMemory(consumed, txc)) {
LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD, "Operation " << *op << " at " << DataShard.TabletID()
<< " requested " << txc.GetRequestedMemory() << " more memory");
-
- DataShard.IncCounter(COUNTER_TX_WAIT_RESOURCE);
- return EExecutionStatus::Restart;
- }
- engine->SetMemoryLimit(txc.GetMemoryLimit() - tx->GetDataTx()->GetTxSize());
- }
-
- try {
+
+ DataShard.IncCounter(COUNTER_TX_WAIT_RESOURCE);
+ return EExecutionStatus::Restart;
+ }
+ engine->SetMemoryLimit(txc.GetMemoryLimit() - tx->GetDataTx()->GetTxSize());
+ }
+
+ try {
try {
ExecuteDataTx(op, txc, ctx);
} catch (const TNotReadyTabletException&) {
@@ -137,72 +137,72 @@ EExecutionStatus TExecuteDataTxUnit::Execute(TOperation::TPtr op,
<< " exceeded memory limit " << txc.GetMemoryLimit()
<< " and requests " << txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR
<< " more for the next try");
-
+
txc.NotEnoughMemory();
DataShard.IncCounter(DataShard.NotEnoughMemoryCounter(txc.GetNotEnoughMemoryCount()));
- engine->ReleaseUnusedMemory();
- txc.RequestMemory(txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
-
- tx->ReleaseTxData(txc, ctx);
-
- return EExecutionStatus::Restart;
- } catch (const TNotReadyTabletException&) {
+ engine->ReleaseUnusedMemory();
+ txc.RequestMemory(txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
+
+ tx->ReleaseTxData(txc, ctx);
+
+ return EExecutionStatus::Restart;
+ } catch (const TNotReadyTabletException&) {
LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD, "Tablet " << DataShard.TabletID()
<< " is not ready for " << *op << " execution");
-
+
DataShard.IncCounter(COUNTER_TX_TABLET_NOT_READY);
- tx->ReleaseTxData(txc, ctx);
-
- return EExecutionStatus::Restart;
- }
-
+ tx->ReleaseTxData(txc, ctx);
+
+ return EExecutionStatus::Restart;
+ }
+
DataShard.IncCounter(COUNTER_WAIT_EXECUTE_LATENCY_MS, waitExecuteLatency.MilliSeconds());
DataShard.IncCounter(COUNTER_WAIT_TOTAL_LATENCY_MS, waitTotalLatency.MilliSeconds());
op->ResetCurrentTimer();
- if (op->IsReadOnly())
- return EExecutionStatus::Executed;
-
- return EExecutionStatus::ExecutedNoMoreRestarts;
-}
-
-void TExecuteDataTxUnit::ExecuteDataTx(TOperation::TPtr op,
+ if (op->IsReadOnly())
+ return EExecutionStatus::Executed;
+
+ return EExecutionStatus::ExecutedNoMoreRestarts;
+}
+
+void TExecuteDataTxUnit::ExecuteDataTx(TOperation::TPtr op,
TTransactionContext& txc,
const TActorContext& ctx) {
TActiveTransaction* tx = dynamic_cast<TActiveTransaction*>(op.Get());
IEngineFlat* engine = tx->GetDataTx()->GetEngine();
-
- DataShard.ReleaseCache(*tx);
- tx->GetDataTx()->ResetCounters();
-
+
+ DataShard.ReleaseCache(*tx);
+ tx->GetDataTx()->ResetCounters();
+
auto [readVersion, writeVersion] = DataShard.GetReadWriteVersions(tx);
tx->GetDataTx()->SetReadVersion(readVersion);
tx->GetDataTx()->SetWriteVersion(writeVersion);
- // TODO: is it required to always prepare outgoing read sets?
- if (!engine->IsAfterOutgoingReadsetsExtracted()) {
- engine->PrepareOutgoingReadsets();
- engine->AfterOutgoingReadsetsExtracted();
- }
-
+ // TODO: is it required to always prepare outgoing read sets?
+ if (!engine->IsAfterOutgoingReadsetsExtracted()) {
+ engine->PrepareOutgoingReadsets();
+ engine->AfterOutgoingReadsetsExtracted();
+ }
+
for (auto& rs : op->InReadSets()) {
for (auto& rsdata : rs.second) {
- engine->AddIncomingReadset(rsdata.Body);
- }
- }
-
+ engine->AddIncomingReadset(rsdata.Body);
+ }
+ }
+
if (tx->GetDataTx()->CanCancel()) {
engine->SetDeadline(tx->GetDataTx()->Deadline());
}
- IEngineFlat::EResult engineResult = engine->Execute();
- if (engineResult != IEngineFlat::EResult::Ok) {
+ IEngineFlat::EResult engineResult = engine->Execute();
+ if (engineResult != IEngineFlat::EResult::Ok) {
TString errorMessage = TStringBuilder() << "Datashard execution error for " << *op << " at "
<< DataShard.TabletID() << ": " << engine->GetErrors();
-
- switch (engineResult) {
+
+ switch (engineResult) {
case IEngineFlat::EResult::ResultTooBig:
LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD, errorMessage);
break;
@@ -219,23 +219,23 @@ void TExecuteDataTxUnit::ExecuteDataTx(TOperation::TPtr op,
<< errorMessage);
}
break;
- }
- }
-
- if (engineResult == IEngineFlat::EResult::Cancelled)
- DataShard.IncCounter(op->IsImmediate()
+ }
+ }
+
+ if (engineResult == IEngineFlat::EResult::Cancelled)
+ DataShard.IncCounter(op->IsImmediate()
? COUNTER_IMMEDIATE_TX_CANCELLED
: COUNTER_PLANNED_TX_CANCELLED);
-
+
auto& result = BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE);
- result->Record.SetOrderId(op->GetTxId());
- if (!op->IsImmediate())
- result->Record.SetStep(op->GetStep());
-
- if (engine->GetStatus() == IEngineFlat::EStatus::Error) {
- result->SetExecutionError(ConvertErrCode(engineResult), engine->GetErrors());
- } else {
- result->SetTxResult(engine->GetShardReply(DataShard.TabletID()));
+ result->Record.SetOrderId(op->GetTxId());
+ if (!op->IsImmediate())
+ result->Record.SetStep(op->GetStep());
+
+ if (engine->GetStatus() == IEngineFlat::EStatus::Error) {
+ result->SetExecutionError(ConvertErrCode(engineResult), engine->GetErrors());
+ } else {
+ result->SetTxResult(engine->GetShardReply(DataShard.TabletID()));
if (op->IsImmediate() && !op->IsReadOnly())
DataShard.PromoteCompleteEdge(writeVersion.Step, txc);
@@ -246,51 +246,51 @@ void TExecuteDataTxUnit::ExecuteDataTx(TOperation::TPtr op,
op->ChangeRecords().emplace_back(change.Order(), change.PathId(), change.BodySize());
}
}
- }
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Executed operation " << *op << " at tablet " << DataShard.TabletID()
+ }
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Executed operation " << *op << " at tablet " << DataShard.TabletID()
<< " with status " << result->GetStatus());
-
+
auto& counters = tx->GetDataTx()->GetCounters();
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Datashard execution counters for " << *op << " at "
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Datashard execution counters for " << *op << " at "
<< DataShard.TabletID() << ": " << counters.ToString());
-
+
KqpUpdateDataShardStatCounters(DataShard, counters);
if (tx->GetDataTx()->CollectStats()) {
KqpFillTxStats(DataShard, counters, *result);
}
-
+
if (counters.InvisibleRowSkips) {
DataShard.SysLocksTable().BreakSetLocks(op->LockTxId());
}
- AddLocksToResult(op);
+ AddLocksToResult(op);
Pipeline.AddCommittingOp(op);
-}
-
+}
+
void TExecuteDataTxUnit::AddLocksToResult(TOperation::TPtr op) {
- auto locks = DataShard.SysLocksTable().ApplyLocks();
- for (const auto& lock : locks) {
- if (lock.IsError()) {
- LOG_NOTICE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Lock is not set for " << *op << " at " << DataShard.TabletID()
+ auto locks = DataShard.SysLocksTable().ApplyLocks();
+ for (const auto& lock : locks) {
+ if (lock.IsError()) {
+ LOG_NOTICE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Lock is not set for " << *op << " at " << DataShard.TabletID()
<< " lock " << lock);
- }
- op->Result()->AddTxLock(lock.LockId, lock.DataShard, lock.Generation, lock.Counter,
- lock.SchemeShard, lock.PathId);
- }
-}
-
+ }
+ op->Result()->AddTxLock(lock.LockId, lock.DataShard, lock.Generation, lock.Counter,
+ lock.SchemeShard, lock.PathId);
+ }
+}
+
void TExecuteDataTxUnit::Complete(TOperation::TPtr, const TActorContext&) {
-}
-
+}
+
THolder<TExecutionUnit> CreateExecuteDataTxUnit(TDataShard& dataShard, TPipeline& pipeline) {
return THolder(new TExecuteDataTxUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/execute_kqp_data_tx_unit.cpp b/ydb/core/tx/datashard/execute_kqp_data_tx_unit.cpp
index be4a5f078fd..70e7be3662b 100644
--- a/ydb/core/tx/datashard/execute_kqp_data_tx_unit.cpp
+++ b/ydb/core/tx/datashard/execute_kqp_data_tx_unit.cpp
@@ -1,43 +1,43 @@
-#include "datashard_impl.h"
-#include "datashard_kqp.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-#include "setup_sys_locks.h"
-
+#include "datashard_impl.h"
+#include "datashard_kqp.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+#include "setup_sys_locks.h"
+
#include <ydb/core/engine/minikql/minikql_engine_host.h>
#include <ydb/core/kqp/rm/kqp_rm.h>
-
-namespace NKikimr {
+
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NMiniKQL;
-
+
+using namespace NMiniKQL;
+
#define LOG_T(stream) LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD, stream)
#define LOG_D(stream) LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD, stream)
#define LOG_E(stream) LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD, stream)
#define LOG_C(stream) LOG_CRIT_S(ctx, NKikimrServices::TX_DATASHARD, stream)
#define LOG_W(stream) LOG_WARN_S(ctx, NKikimrServices::TX_DATASHARD, stream)
-class TExecuteKqpDataTxUnit : public TExecutionUnit {
-public:
+class TExecuteKqpDataTxUnit : public TExecutionUnit {
+public:
TExecuteKqpDataTxUnit(TDataShard& dataShard, TPipeline& pipeline);
- ~TExecuteKqpDataTxUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
+ ~TExecuteKqpDataTxUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
EExecutionStatus Execute(TOperation::TPtr op, TTransactionContext& txc, const TActorContext& ctx) override;
void Complete(TOperation::TPtr op, const TActorContext& ctx) override;
-
-private:
+
+private:
void AddLocksToResult(TOperation::TPtr op, const TActorContext& ctx);
EExecutionStatus OnTabletNotReady(TActiveTransaction& tx, TValidatedDataTx& dataTx, TTransactionContext& txc,
const TActorContext& ctx);
-};
-
+};
+
TExecuteKqpDataTxUnit::TExecuteKqpDataTxUnit(TDataShard& dataShard, TPipeline& pipeline)
: TExecutionUnit(EExecutionUnitKind::ExecuteKqpDataTx, true, dataShard, pipeline) {}
-
+
TExecuteKqpDataTxUnit::~TExecuteKqpDataTxUnit() {}
-
+
bool TExecuteKqpDataTxUnit::IsReadyToExecute(TOperation::TPtr op) const {
if (op->Result() || op->HasResultSentFlag() || op->IsImmediate() && WillRejectDataTx(op)) {
return true;
@@ -49,8 +49,8 @@ bool TExecuteKqpDataTxUnit::IsReadyToExecute(TOperation::TPtr op) const {
}
return !op->HasRuntimeConflicts();
-}
-
+}
+
EExecutionStatus TExecuteKqpDataTxUnit::Execute(TOperation::TPtr op, TTransactionContext& txc,
const TActorContext& ctx)
{
@@ -67,12 +67,12 @@ EExecutionStatus TExecuteKqpDataTxUnit::Execute(TOperation::TPtr op, TTransactio
op->MvccReadWriteVersion.reset();
}
- TSetupSysLocks guardLocks(op, DataShard);
+ TSetupSysLocks guardLocks(op, DataShard);
TActiveTransaction* tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- DataShard.ReleaseCache(*tx);
-
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ DataShard.ReleaseCache(*tx);
+
if (tx->IsTxDataReleased()) {
switch (Pipeline.RestoreDataTx(tx, txc, ctx)) {
case ERestoreDataStatus::Ok:
@@ -83,7 +83,7 @@ EExecutionStatus TExecuteKqpDataTxUnit::Execute(TOperation::TPtr op, TTransactio
Y_FAIL("Failed to restore tx data: %s", tx->GetDataTx()->GetErrors().c_str());
}
}
-
+
ui64 tabletId = DataShard.TabletID();
const TValidatedDataTx::TPtr& dataTx = tx->GetDataTx();
@@ -97,15 +97,15 @@ EExecutionStatus TExecuteKqpDataTxUnit::Execute(TOperation::TPtr op, TTransactio
return EExecutionStatus::Executed;
}
- try {
+ try {
auto& kqpTx = dataTx->GetKqpTransaction();
if (!KqpValidateLocks(tabletId, tx, DataShard.SysLocksTable())) {
KqpEraseLocks(tabletId, tx, DataShard.SysLocksTable());
DataShard.SysLocksTable().ApplyLocks();
return EExecutionStatus::Executed;
- }
-
+ }
+
auto& tasksRunner = dataTx->GetKqpTasksRunner();
auto allocGuard = tasksRunner.BindAllocator(txc.GetMemoryLimit() - dataTx->GetTxSize());
@@ -141,8 +141,8 @@ EExecutionStatus TExecuteKqpDataTxUnit::Execute(TOperation::TPtr op, TTransactio
Y_VERIFY(result);
op->Result().Swap(result);
- op->SetKqpAttachedRSFlag();
-
+ op->SetKqpAttachedRSFlag();
+
KqpEraseLocks(tabletId, tx, DataShard.SysLocksTable());
if (dataTx->GetCounters().InvisibleRowSkips) {
@@ -175,16 +175,16 @@ EExecutionStatus TExecuteKqpDataTxUnit::Execute(TOperation::TPtr op, TTransactio
<< " exceeded memory limit " << txc.GetMemoryLimit()
<< " and requests " << txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR
<< " more for the next try (" << txc.GetNotEnoughMemoryCount() << ")");
-
+
DataShard.IncCounter(DataShard.NotEnoughMemoryCounter(txc.GetNotEnoughMemoryCount()));
- txc.RequestMemory(txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
- tx->ReleaseTxData(txc, ctx);
-
- return EExecutionStatus::Restart;
+ txc.RequestMemory(txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
+ tx->ReleaseTxData(txc, ctx);
+
+ return EExecutionStatus::Restart;
} catch (const TNotReadyTabletException&) {
return OnTabletNotReady(*tx, *dataTx, txc, ctx);
- } catch (const yexception& e) {
+ } catch (const yexception& e) {
LOG_C("Exception while executing KQP transaction " << *op << " at " << tabletId << ": " << e.what());
if (op->IsReadOnly() || op->IsImmediate()) {
tx->ReleaseTxData(txc, ctx);
@@ -194,8 +194,8 @@ EExecutionStatus TExecuteKqpDataTxUnit::Execute(TOperation::TPtr op, TTransactio
} else {
Y_FAIL_S("Unexpected exception in KQP transaction execution: " << e.what());
}
- }
-
+ }
+
Pipeline.AddCommittingOp(op);
DataShard.IncCounter(COUNTER_WAIT_EXECUTE_LATENCY_MS, waitExecuteLatency.MilliSeconds());
@@ -203,24 +203,24 @@ EExecutionStatus TExecuteKqpDataTxUnit::Execute(TOperation::TPtr op, TTransactio
op->ResetCurrentTimer();
return op->IsReadOnly() ? EExecutionStatus::Executed : EExecutionStatus::ExecutedNoMoreRestarts;
-}
-
+}
+
void TExecuteKqpDataTxUnit::AddLocksToResult(TOperation::TPtr op, const TActorContext& ctx) {
- auto locks = DataShard.SysLocksTable().ApplyLocks();
+ auto locks = DataShard.SysLocksTable().ApplyLocks();
LOG_T("add locks to result: " << locks.size());
- for (const auto& lock : locks) {
- if (lock.IsError()) {
+ for (const auto& lock : locks) {
+ if (lock.IsError()) {
LOG_NOTICE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD, "Lock is not set for "
<< *op << " at " << DataShard.TabletID() << " lock " << lock);
- }
+ }
op->Result()->AddTxLock(lock.LockId, lock.DataShard, lock.Generation, lock.Counter, lock.SchemeShard,
lock.PathId);
LOG_T("add lock to result: " << op->Result()->Record.GetTxLocks().rbegin()->ShortDebugString());
- }
-}
-
+ }
+}
+
EExecutionStatus TExecuteKqpDataTxUnit::OnTabletNotReady(TActiveTransaction& tx, TValidatedDataTx& dataTx,
TTransactionContext& txc, const TActorContext& ctx)
{
@@ -236,10 +236,10 @@ EExecutionStatus TExecuteKqpDataTxUnit::OnTabletNotReady(TActiveTransaction& tx,
}
void TExecuteKqpDataTxUnit::Complete(TOperation::TPtr, const TActorContext&) {}
-
+
THolder<TExecutionUnit> CreateExecuteKqpDataTxUnit(TDataShard& dataShard, TPipeline& pipeline) {
return THolder(new TExecuteKqpDataTxUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/execution_unit.cpp b/ydb/core/tx/datashard/execution_unit.cpp
index 3d6701ae761..9f6e13fa5c7 100644
--- a/ydb/core/tx/datashard/execution_unit.cpp
+++ b/ydb/core/tx/datashard/execution_unit.cpp
@@ -1,105 +1,105 @@
-#include "execution_unit.h"
-#include "execution_unit_ctors.h"
-#include "datashard_impl.h"
-
-namespace NKikimr {
+#include "execution_unit.h"
+#include "execution_unit_ctors.h"
+#include "datashard_impl.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-THolder<TExecutionUnit> CreateExecutionUnit(EExecutionUnitKind kind,
+
+THolder<TExecutionUnit> CreateExecutionUnit(EExecutionUnitKind kind,
TDataShard &dataShard,
- TPipeline &pipeline)
-{
- switch (kind) {
- case EExecutionUnitKind::CheckDataTx:
- return CreateCheckDataTxUnit(dataShard, pipeline);
- case EExecutionUnitKind::CheckSchemeTx:
- return CreateCheckSchemeTxUnit(dataShard, pipeline);
+ TPipeline &pipeline)
+{
+ switch (kind) {
+ case EExecutionUnitKind::CheckDataTx:
+ return CreateCheckDataTxUnit(dataShard, pipeline);
+ case EExecutionUnitKind::CheckSchemeTx:
+ return CreateCheckSchemeTxUnit(dataShard, pipeline);
case EExecutionUnitKind::CheckSnapshotTx:
return CreateCheckSnapshotTxUnit(dataShard, pipeline);
case EExecutionUnitKind::CheckDistributedEraseTx:
return CreateCheckDistributedEraseTxUnit(dataShard, pipeline);
case EExecutionUnitKind::CheckCommitWritesTx:
return CreateCheckCommitWritesTxUnit(dataShard, pipeline);
- case EExecutionUnitKind::StoreDataTx:
- return CreateStoreDataTxUnit(dataShard, pipeline);
- case EExecutionUnitKind::StoreSchemeTx:
- return CreateStoreSchemeTxUnit(dataShard, pipeline);
+ case EExecutionUnitKind::StoreDataTx:
+ return CreateStoreDataTxUnit(dataShard, pipeline);
+ case EExecutionUnitKind::StoreSchemeTx:
+ return CreateStoreSchemeTxUnit(dataShard, pipeline);
case EExecutionUnitKind::StoreSnapshotTx:
return CreateStoreSnapshotTxUnit(dataShard, pipeline);
case EExecutionUnitKind::StoreDistributedEraseTx:
return CreateStoreDistributedEraseTxUnit(dataShard, pipeline);
case EExecutionUnitKind::StoreCommitWritesTx:
return CreateStoreCommitWritesTxUnit(dataShard, pipeline);
- case EExecutionUnitKind::BuildAndWaitDependencies:
- return CreateBuildAndWaitDependenciesUnit(dataShard, pipeline);
- case EExecutionUnitKind::FinishPropose:
- return CreateFinishProposeUnit(dataShard, pipeline);
- case EExecutionUnitKind::CompletedOperations:
- return CreateCompletedOperationsUnit(dataShard, pipeline);
- case EExecutionUnitKind::WaitForPlan:
- return CreateWaitForPlanUnit(dataShard, pipeline);
- case EExecutionUnitKind::PlanQueue:
- return CreatePlanQueueUnit(dataShard, pipeline);
- case EExecutionUnitKind::LoadTxDetails:
- return CreateLoadTxDetailsUnit(dataShard, pipeline);
+ case EExecutionUnitKind::BuildAndWaitDependencies:
+ return CreateBuildAndWaitDependenciesUnit(dataShard, pipeline);
+ case EExecutionUnitKind::FinishPropose:
+ return CreateFinishProposeUnit(dataShard, pipeline);
+ case EExecutionUnitKind::CompletedOperations:
+ return CreateCompletedOperationsUnit(dataShard, pipeline);
+ case EExecutionUnitKind::WaitForPlan:
+ return CreateWaitForPlanUnit(dataShard, pipeline);
+ case EExecutionUnitKind::PlanQueue:
+ return CreatePlanQueueUnit(dataShard, pipeline);
+ case EExecutionUnitKind::LoadTxDetails:
+ return CreateLoadTxDetailsUnit(dataShard, pipeline);
case EExecutionUnitKind::FinalizeDataTxPlan:
return CreateFinalizeDataTxPlanUnit(dataShard, pipeline);
case EExecutionUnitKind::ProtectSchemeEchoes:
return CreateProtectSchemeEchoesUnit(dataShard, pipeline);
- case EExecutionUnitKind::BuildDataTxOutRS:
- return CreateBuildDataTxOutRSUnit(dataShard, pipeline);
+ case EExecutionUnitKind::BuildDataTxOutRS:
+ return CreateBuildDataTxOutRSUnit(dataShard, pipeline);
case EExecutionUnitKind::BuildDistributedEraseTxOutRS:
return CreateBuildDistributedEraseTxOutRSUnit(dataShard, pipeline);
- case EExecutionUnitKind::BuildKqpDataTxOutRS:
- return CreateBuildKqpDataTxOutRSUnit(dataShard, pipeline);
- case EExecutionUnitKind::StoreAndSendOutRS:
- return CreateStoreAndSendOutRSUnit(dataShard, pipeline);
- case EExecutionUnitKind::PrepareDataTxInRS:
- return CreatePrepareDataTxInRSUnit(dataShard, pipeline);
- case EExecutionUnitKind::PrepareKqpDataTxInRS:
- return CreatePrepareKqpDataTxInRSUnit(dataShard, pipeline);
+ case EExecutionUnitKind::BuildKqpDataTxOutRS:
+ return CreateBuildKqpDataTxOutRSUnit(dataShard, pipeline);
+ case EExecutionUnitKind::StoreAndSendOutRS:
+ return CreateStoreAndSendOutRSUnit(dataShard, pipeline);
+ case EExecutionUnitKind::PrepareDataTxInRS:
+ return CreatePrepareDataTxInRSUnit(dataShard, pipeline);
+ case EExecutionUnitKind::PrepareKqpDataTxInRS:
+ return CreatePrepareKqpDataTxInRSUnit(dataShard, pipeline);
case EExecutionUnitKind::PrepareDistributedEraseTxInRS:
return CreatePrepareDistributedEraseTxInRSUnit(dataShard, pipeline);
- case EExecutionUnitKind::LoadAndWaitInRS:
- return CreateLoadAndWaitInRSUnit(dataShard, pipeline);
- case EExecutionUnitKind::ExecuteDataTx:
- return CreateExecuteDataTxUnit(dataShard, pipeline);
- case EExecutionUnitKind::ExecuteKqpDataTx:
- return CreateExecuteKqpDataTxUnit(dataShard, pipeline);
+ case EExecutionUnitKind::LoadAndWaitInRS:
+ return CreateLoadAndWaitInRSUnit(dataShard, pipeline);
+ case EExecutionUnitKind::ExecuteDataTx:
+ return CreateExecuteDataTxUnit(dataShard, pipeline);
+ case EExecutionUnitKind::ExecuteKqpDataTx:
+ return CreateExecuteKqpDataTxUnit(dataShard, pipeline);
case EExecutionUnitKind::ExecuteDistributedEraseTx:
return CreateExecuteDistributedEraseTxUnit(dataShard, pipeline);
case EExecutionUnitKind::ExecuteCommitWritesTx:
return CreateExecuteCommitWritesTxUnit(dataShard, pipeline);
- case EExecutionUnitKind::CompleteOperation:
- return CreateCompleteOperationUnit(dataShard, pipeline);
+ case EExecutionUnitKind::CompleteOperation:
+ return CreateCompleteOperationUnit(dataShard, pipeline);
case EExecutionUnitKind::ExecuteKqpScanTx:
return CreateExecuteKqpScanTxUnit(dataShard, pipeline);
- case EExecutionUnitKind::MakeScanSnapshot:
- return CreateMakeScanSnapshotUnit(dataShard, pipeline);
- case EExecutionUnitKind::WaitForStreamClearance:
- return CreateWaitForStreamClearanceUnit(dataShard, pipeline);
- case EExecutionUnitKind::ReadTableScan:
- return CreateReadTableScanUnit(dataShard, pipeline);
- case EExecutionUnitKind::MakeSnapshot:
- return CreateMakeSnapshotUnit(dataShard, pipeline);
- case EExecutionUnitKind::BuildSchemeTxOutRS:
- return CreateBuildSchemeTxOutRSUnit(dataShard, pipeline);
- case EExecutionUnitKind::PrepareSchemeTxInRS:
- return CreatePrepareSchemeTxInRSUnit(dataShard, pipeline);
+ case EExecutionUnitKind::MakeScanSnapshot:
+ return CreateMakeScanSnapshotUnit(dataShard, pipeline);
+ case EExecutionUnitKind::WaitForStreamClearance:
+ return CreateWaitForStreamClearanceUnit(dataShard, pipeline);
+ case EExecutionUnitKind::ReadTableScan:
+ return CreateReadTableScanUnit(dataShard, pipeline);
+ case EExecutionUnitKind::MakeSnapshot:
+ return CreateMakeSnapshotUnit(dataShard, pipeline);
+ case EExecutionUnitKind::BuildSchemeTxOutRS:
+ return CreateBuildSchemeTxOutRSUnit(dataShard, pipeline);
+ case EExecutionUnitKind::PrepareSchemeTxInRS:
+ return CreatePrepareSchemeTxInRSUnit(dataShard, pipeline);
case EExecutionUnitKind::Backup:
return CreateBackupUnit(dataShard, pipeline);
case EExecutionUnitKind::Restore:
return CreateRestoreUnit(dataShard, pipeline);
- case EExecutionUnitKind::CreateTable:
- return CreateCreateTableUnit(dataShard, pipeline);
- case EExecutionUnitKind::ReceiveSnapshot:
- return CreateReceiveSnapshotUnit(dataShard, pipeline);
+ case EExecutionUnitKind::CreateTable:
+ return CreateCreateTableUnit(dataShard, pipeline);
+ case EExecutionUnitKind::ReceiveSnapshot:
+ return CreateReceiveSnapshotUnit(dataShard, pipeline);
case EExecutionUnitKind::AlterMoveShadow:
return CreateAlterMoveShadowUnit(dataShard, pipeline);
- case EExecutionUnitKind::AlterTable:
- return CreateAlterTableUnit(dataShard, pipeline);
- case EExecutionUnitKind::DropTable:
- return CreateDropTableUnit(dataShard, pipeline);
+ case EExecutionUnitKind::AlterTable:
+ return CreateAlterTableUnit(dataShard, pipeline);
+ case EExecutionUnitKind::DropTable:
+ return CreateDropTableUnit(dataShard, pipeline);
case EExecutionUnitKind::DirectOp:
return CreateDirectOpUnit(dataShard, pipeline);
case EExecutionUnitKind::CreatePersistentSnapshot:
@@ -124,13 +124,13 @@ THolder<TExecutionUnit> CreateExecutionUnit(EExecutionUnitKind kind,
return CreateAlterCdcStreamUnit(dataShard, pipeline);
case EExecutionUnitKind::DropCdcStream:
return CreateDropCdcStreamUnit(dataShard, pipeline);
- default:
- Y_FAIL_S("Unexpected execution kind " << kind << " (" << (ui32)kind << ")");
- }
-
- return nullptr;
-}
-
+ default:
+ Y_FAIL_S("Unexpected execution kind " << kind << " (" << (ui32)kind << ")");
+ }
+
+ return nullptr;
+}
+
bool TExecutionUnit::CheckRejectDataTx(TOperation::TPtr op, const TActorContext& ctx) {
// Reject operations after receiving EvSplit
// This is to avoid races when split is in progress
@@ -243,19 +243,19 @@ bool TExecutionUnit::WillRejectDataTx(TOperation::TPtr op) const {
return false;
}
-TOutputOpData::TResultPtr &TExecutionUnit::BuildResult(TOperation::TPtr op,
- NKikimrTxDataShard::TEvProposeTransactionResult::EStatus status)
-{
- auto kind = static_cast<NKikimrTxDataShard::ETransactionKind>(op->GetKind());
+TOutputOpData::TResultPtr &TExecutionUnit::BuildResult(TOperation::TPtr op,
+ NKikimrTxDataShard::TEvProposeTransactionResult::EStatus status)
+{
+ auto kind = static_cast<NKikimrTxDataShard::ETransactionKind>(op->GetKind());
op->Result().Reset(new TEvDataShard::TEvProposeTransactionResult(kind,
- DataShard.TabletID(),
- op->GetTxId(),
+ DataShard.TabletID(),
+ op->GetTxId(),
status));
- if (DataShard.GetProcessingParams())
- op->Result()->SetDomainCoordinators(*DataShard.GetProcessingParams());
-
- return op->Result();
-}
-
+ if (DataShard.GetProcessingParams())
+ op->Result()->SetDomainCoordinators(*DataShard.GetProcessingParams());
+
+ return op->Result();
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/execution_unit.h b/ydb/core/tx/datashard/execution_unit.h
index 917b861b47d..afc1398e22d 100644
--- a/ydb/core/tx/datashard/execution_unit.h
+++ b/ydb/core/tx/datashard/execution_unit.h
@@ -1,106 +1,106 @@
-#pragma once
-
-#include "defs.h"
-#include "const.h"
-#include "execution_unit_kind.h"
-#include "operation.h"
-
+#pragma once
+
+#include "defs.h"
+#include "const.h"
+#include "execution_unit_kind.h"
+#include "operation.h"
+
#include <ydb/core/tablet_flat/tablet_flat_executor.h>
-
-#include <util/generic/hash.h>
-#include <util/generic/ptr.h>
-#include <util/generic/queue.h>
-
-namespace NKikimr {
+
+#include <util/generic/hash.h>
+#include <util/generic/ptr.h>
+#include <util/generic/queue.h>
+
+namespace NKikimr {
namespace NDataShard {
-
-using NTabletFlatExecutor::TTransactionContext;
-
+
+using NTabletFlatExecutor::TTransactionContext;
+
class TDataShard;
-class TPipeline;
-
-enum class EExecutionStatus {
- // Transaction should be restarted to get
- // missing data or more memory.
- Restart,
- // Execution completed. Should move to the
- // next execution unit or finish operation
- // processing.
- Executed,
- // Same as Executed but following units are
- // not allowed to restart current tablet tx.
- ExecutedNoMoreRestarts,
- // Stay on the same execution unit and
- // continue execution when operation is
- // ready again.
- Continue,
+class TPipeline;
+
+enum class EExecutionStatus {
+ // Transaction should be restarted to get
+ // missing data or more memory.
+ Restart,
+ // Execution completed. Should move to the
+ // next execution unit or finish operation
+ // processing.
+ Executed,
+ // Same as Executed but following units are
+ // not allowed to restart current tablet tx.
+ ExecutedNoMoreRestarts,
+ // Stay on the same execution unit and
+ // continue execution when operation is
+ // ready again.
+ Continue,
// Stay on the same execution unit and
// continue execution in another transaction
// as soon as possible.
Reschedule,
- // Execution completed. Should wait for tx
- // commit then call Complete and move to
- // to the next execution unit.
- WaitComplete,
- // Execution completed. Move to the next
- // execution unit but call Complete after
- // eventual tx commit.
- DelayComplete,
- // Same as DelayComplete but following units
- // are not allowed to restart current tablet
- // tx.
- DelayCompleteNoMoreRestarts,
-};
-
-class TExecutionUnit
-{
-public:
-
- TExecutionUnit(EExecutionUnitKind kind,
- bool executionMightRestart,
+ // Execution completed. Should wait for tx
+ // commit then call Complete and move to
+ // to the next execution unit.
+ WaitComplete,
+ // Execution completed. Move to the next
+ // execution unit but call Complete after
+ // eventual tx commit.
+ DelayComplete,
+ // Same as DelayComplete but following units
+ // are not allowed to restart current tablet
+ // tx.
+ DelayCompleteNoMoreRestarts,
+};
+
+class TExecutionUnit
+{
+public:
+
+ TExecutionUnit(EExecutionUnitKind kind,
+ bool executionMightRestart,
TDataShard &dataShard,
- TPipeline &pipeline)
- : Kind(kind)
- , ExecutionMightRestart(executionMightRestart)
- , DataShard(dataShard)
- , Pipeline(pipeline)
- {
- }
-
- virtual ~TExecutionUnit()
- {
- }
-
- void AddOperation(TOperation::TPtr op)
- {
- OpsInFly.insert(op);
- }
-
- void RemoveOperation(TOperation::TPtr op)
- {
- OpsInFly.erase(op);
- }
-
- ui64 GetInFly() const { return OpsInFly.size(); }
-
- EExecutionUnitKind GetKind() const { return Kind; }
-
- // Return true if Execute method might return
- // EExecutionStatus::Restart.
- bool GetExecutionMightRestart() const { return ExecutionMightRestart; }
-
- virtual bool IsReadyToExecute(TOperation::TPtr op) const = 0;
- virtual TOperation::TPtr FindReadyOperation() const
- {
- Y_FAIL_S("FindReadyOperation is not implemented for execution unit " << Kind);
- }
-
- virtual EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) = 0;
- virtual void Complete(TOperation::TPtr op,
- const TActorContext &ctx) = 0;
-protected:
+ TPipeline &pipeline)
+ : Kind(kind)
+ , ExecutionMightRestart(executionMightRestart)
+ , DataShard(dataShard)
+ , Pipeline(pipeline)
+ {
+ }
+
+ virtual ~TExecutionUnit()
+ {
+ }
+
+ void AddOperation(TOperation::TPtr op)
+ {
+ OpsInFly.insert(op);
+ }
+
+ void RemoveOperation(TOperation::TPtr op)
+ {
+ OpsInFly.erase(op);
+ }
+
+ ui64 GetInFly() const { return OpsInFly.size(); }
+
+ EExecutionUnitKind GetKind() const { return Kind; }
+
+ // Return true if Execute method might return
+ // EExecutionStatus::Restart.
+ bool GetExecutionMightRestart() const { return ExecutionMightRestart; }
+
+ virtual bool IsReadyToExecute(TOperation::TPtr op) const = 0;
+ virtual TOperation::TPtr FindReadyOperation() const
+ {
+ Y_FAIL_S("FindReadyOperation is not implemented for execution unit " << Kind);
+ }
+
+ virtual EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) = 0;
+ virtual void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) = 0;
+protected:
// Call during unit execution when it's ok to reject operation before completion
// Returns true if operation has been rejected as a result of this call
bool CheckRejectDataTx(TOperation::TPtr op, const TActorContext& ctx);
@@ -108,30 +108,30 @@ protected:
// Returns true if CheckRejectDataTx will reject operation when called
bool WillRejectDataTx(TOperation::TPtr op) const;
- TOutputOpData::TResultPtr &BuildResult(TOperation::TPtr op,
- NKikimrTxDataShard::TEvProposeTransactionResult::EStatus status = NKikimrTxDataShard::TEvProposeTransactionResult::ERROR);
-
- bool MaybeRequestMoreTxMemory(ui64 usage,
- NTabletFlatExecutor::TTransactionContext &txc)
- {
- if (usage > txc.GetMemoryLimit()) {
- ui64 request = Max(usage - txc.GetMemoryLimit(), txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
- txc.RequestMemory(request);
- return true;
- }
- return false;
- }
-
- const EExecutionUnitKind Kind;
- bool ExecutionMightRestart;
+ TOutputOpData::TResultPtr &BuildResult(TOperation::TPtr op,
+ NKikimrTxDataShard::TEvProposeTransactionResult::EStatus status = NKikimrTxDataShard::TEvProposeTransactionResult::ERROR);
+
+ bool MaybeRequestMoreTxMemory(ui64 usage,
+ NTabletFlatExecutor::TTransactionContext &txc)
+ {
+ if (usage > txc.GetMemoryLimit()) {
+ ui64 request = Max(usage - txc.GetMemoryLimit(), txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
+ txc.RequestMemory(request);
+ return true;
+ }
+ return false;
+ }
+
+ const EExecutionUnitKind Kind;
+ bool ExecutionMightRestart;
TDataShard &DataShard;
- TPipeline &Pipeline;
- THashSet<TOperation::TPtr> OpsInFly;
-};
-
-THolder<TExecutionUnit> CreateExecutionUnit(EExecutionUnitKind kind,
+ TPipeline &Pipeline;
+ THashSet<TOperation::TPtr> OpsInFly;
+};
+
+THolder<TExecutionUnit> CreateExecutionUnit(EExecutionUnitKind kind,
TDataShard &dataShard,
- TPipeline &pipeline);
-
+ TPipeline &pipeline);
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/execution_unit_ctors.h b/ydb/core/tx/datashard/execution_unit_ctors.h
index 7a9b234e59c..f043a02fad1 100644
--- a/ydb/core/tx/datashard/execution_unit_ctors.h
+++ b/ydb/core/tx/datashard/execution_unit_ctors.h
@@ -1,10 +1,10 @@
-#pragma once
-
-#include "execution_unit.h"
-
-namespace NKikimr {
+#pragma once
+
+#include "execution_unit.h"
+
+namespace NKikimr {
namespace NDataShard {
-
+
THolder<TExecutionUnit> CreateCheckDataTxUnit(TDataShard &dataShard, TPipeline &pipeline);
THolder<TExecutionUnit> CreateCheckSchemeTxUnit(TDataShard &dataShard, TPipeline &pipeline);
THolder<TExecutionUnit> CreateCheckSnapshotTxUnit(TDataShard &dataShard, TPipeline &pipeline);
@@ -64,4 +64,4 @@ THolder<TExecutionUnit> CreateAlterCdcStreamUnit(TDataShard &dataShard, TPipelin
THolder<TExecutionUnit> CreateDropCdcStreamUnit(TDataShard &dataShard, TPipeline &pipeline);
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/execution_unit_kind.h b/ydb/core/tx/datashard/execution_unit_kind.h
index 68718c2c02f..88e763887f6 100644
--- a/ydb/core/tx/datashard/execution_unit_kind.h
+++ b/ydb/core/tx/datashard/execution_unit_kind.h
@@ -1,55 +1,55 @@
-#pragma once
-#include "defs.h"
-
-namespace NKikimr {
+#pragma once
+#include "defs.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-enum class EExecutionUnitKind : ui32 {
- CheckDataTx,
- CheckSchemeTx,
+
+enum class EExecutionUnitKind : ui32 {
+ CheckDataTx,
+ CheckSchemeTx,
CheckSnapshotTx,
CheckDistributedEraseTx,
CheckCommitWritesTx,
- StoreDataTx,
- StoreSchemeTx,
+ StoreDataTx,
+ StoreSchemeTx,
StoreSnapshotTx,
StoreDistributedEraseTx,
StoreCommitWritesTx,
- BuildAndWaitDependencies,
- FinishPropose,
- CompletedOperations,
- WaitForPlan,
- PlanQueue,
- LoadTxDetails,
+ BuildAndWaitDependencies,
+ FinishPropose,
+ CompletedOperations,
+ WaitForPlan,
+ PlanQueue,
+ LoadTxDetails,
FinalizeDataTxPlan,
ProtectSchemeEchoes,
- BuildDataTxOutRS,
- BuildKqpDataTxOutRS,
+ BuildDataTxOutRS,
+ BuildKqpDataTxOutRS,
BuildDistributedEraseTxOutRS,
- StoreAndSendOutRS,
- PrepareDataTxInRS,
- PrepareKqpDataTxInRS,
+ StoreAndSendOutRS,
+ PrepareDataTxInRS,
+ PrepareKqpDataTxInRS,
PrepareDistributedEraseTxInRS,
- LoadAndWaitInRS,
- ExecuteDataTx,
- ExecuteKqpDataTx,
+ LoadAndWaitInRS,
+ ExecuteDataTx,
+ ExecuteKqpDataTx,
ExecuteDistributedEraseTx,
ExecuteCommitWritesTx,
- CompleteOperation,
+ CompleteOperation,
ExecuteKqpScanTx,
- MakeScanSnapshot,
- WaitForStreamClearance,
- ReadTableScan,
- MakeSnapshot,
- BuildSchemeTxOutRS,
- PrepareSchemeTxInRS,
+ MakeScanSnapshot,
+ WaitForStreamClearance,
+ ReadTableScan,
+ MakeSnapshot,
+ BuildSchemeTxOutRS,
+ PrepareSchemeTxInRS,
Backup,
Restore,
- CreateTable,
- ReceiveSnapshot,
+ CreateTable,
+ ReceiveSnapshot,
AlterMoveShadow,
- AlterTable,
- DropTable,
+ AlterTable,
+ DropTable,
DirectOp,
CreatePersistentSnapshot,
DropPersistentSnapshot,
@@ -62,9 +62,9 @@ enum class EExecutionUnitKind : ui32 {
CreateCdcStream,
AlterCdcStream,
DropCdcStream,
- Count,
- Unspecified
-};
-
+ Count,
+ Unspecified
+};
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/finish_propose_unit.cpp b/ydb/core/tx/datashard/finish_propose_unit.cpp
index 1409d6e04ef..de0e9e4ad2e 100644
--- a/ydb/core/tx/datashard/finish_propose_unit.cpp
+++ b/ydb/core/tx/datashard/finish_propose_unit.cpp
@@ -1,57 +1,57 @@
-#include "datashard_failpoints.h"
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_failpoints.h"
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TFinishProposeUnit : public TExecutionUnit {
-public:
+
+class TFinishProposeUnit : public TExecutionUnit {
+public:
TFinishProposeUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TFinishProposeUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
- void CompleteRequest(TOperation::TPtr op,
- const TActorContext &ctx);
- void AddDiagnosticsResult(TOutputOpData::TResultPtr &res);
- void UpdateCounters(TOperation::TPtr op,
- const TActorContext &ctx);
- TString PrintErrors(const NKikimrTxDataShard::TEvProposeTransactionResult &rec);
-};
-
+ TPipeline &pipeline);
+ ~TFinishProposeUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+ void CompleteRequest(TOperation::TPtr op,
+ const TActorContext &ctx);
+ void AddDiagnosticsResult(TOutputOpData::TResultPtr &res);
+ void UpdateCounters(TOperation::TPtr op,
+ const TActorContext &ctx);
+ TString PrintErrors(const NKikimrTxDataShard::TEvProposeTransactionResult &rec);
+};
+
TFinishProposeUnit::TFinishProposeUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::FinishPropose, false, dataShard, pipeline)
-{
-}
-
-TFinishProposeUnit::~TFinishProposeUnit()
-{
-}
-
-bool TFinishProposeUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TFinishProposeUnit::Execute(TOperation::TPtr op,
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::FinishPropose, false, dataShard, pipeline)
+{
+}
+
+TFinishProposeUnit::~TFinishProposeUnit()
+{
+}
+
+bool TFinishProposeUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TFinishProposeUnit::Execute(TOperation::TPtr op,
TTransactionContext &txc,
- const TActorContext &ctx)
-{
- if (op->Result())
- UpdateCounters(op, ctx);
-
+ const TActorContext &ctx)
+{
+ if (op->Result())
+ UpdateCounters(op, ctx);
+
bool hadWrites = false;
-
+
// When mvcc is enabled we perform marking after transaction is executed
if (DataShard.IsMvccEnabled() && op->IsImmediate()) {
if (op->IsMvccSnapshotRead()) {
@@ -76,11 +76,11 @@ EExecutionStatus TFinishProposeUnit::Execute(TOperation::TPtr op,
}
if (!op->HasResultSentFlag() && (op->IsDirty() || !Pipeline.WaitCompletion(op)))
- CompleteRequest(op, ctx);
-
+ CompleteRequest(op, ctx);
+
if (!DataShard.IsFollower())
DataShard.PlanCleanup(ctx);
-
+
// Release acquired snapshot for immediate and aborted operations
// N.B. currently only immediate operations may acquire snapshots, but in
// the future it may be possible for read/write operations to read and write
@@ -99,127 +99,127 @@ EExecutionStatus TFinishProposeUnit::Execute(TOperation::TPtr op,
}
return status;
-}
-
-void TFinishProposeUnit::Complete(TOperation::TPtr op,
- const TActorContext &ctx)
-{
+}
+
+void TFinishProposeUnit::Complete(TOperation::TPtr op,
+ const TActorContext &ctx)
+{
if (!op->HasResultSentFlag()) {
DataShard.IncCounter(COUNTER_PREPARE_COMPLETE);
-
+
if (op->Result())
CompleteRequest(op, ctx);
}
-
- Pipeline.ForgetUnproposedTx(op->GetTxId());
+
+ Pipeline.ForgetUnproposedTx(op->GetTxId());
if (op->IsImmediate()) {
Pipeline.RemoveCommittingOp(op);
- Pipeline.RemoveActiveOp(op);
+ Pipeline.RemoveActiveOp(op);
DataShard.EnqueueChangeRecords(std::move(op->ChangeRecords()));
}
-
- DataShard.SendRegistrationRequestTimeCast(ctx);
-}
-
-void TFinishProposeUnit::CompleteRequest(TOperation::TPtr op,
- const TActorContext &ctx)
-{
+
+ DataShard.SendRegistrationRequestTimeCast(ctx);
+}
+
+void TFinishProposeUnit::CompleteRequest(TOperation::TPtr op,
+ const TActorContext &ctx)
+{
auto res = std::move(op->Result());
- Y_VERIFY(res);
-
- TDuration duration = TAppData::TimeProvider->Now() - op->GetReceivedAt();
- res->Record.SetProposeLatency(duration.MilliSeconds());
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Propose transaction complete txid " << op->GetTxId() << " at tablet "
- << DataShard.TabletID() << " send to client, exec latency: "
- << res->Record.GetExecLatency() << " ms, propose latency: "
- << duration.MilliSeconds() << " ms, status: " << res->GetStatus());
-
- TString errors = res->GetError();
+ Y_VERIFY(res);
+
+ TDuration duration = TAppData::TimeProvider->Now() - op->GetReceivedAt();
+ res->Record.SetProposeLatency(duration.MilliSeconds());
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Propose transaction complete txid " << op->GetTxId() << " at tablet "
+ << DataShard.TabletID() << " send to client, exec latency: "
+ << res->Record.GetExecLatency() << " ms, propose latency: "
+ << duration.MilliSeconds() << " ms, status: " << res->GetStatus());
+
+ TString errors = res->GetError();
if (errors.size()) {
- LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
- "Errors while proposing transaction txid " << op->GetTxId()
- << " at tablet " << DataShard.TabletID() << " status: "
- << res->GetStatus() << " errors: " << errors);
- }
-
- if (res->IsPrepared()) {
- DataShard.IncCounter(COUNTER_PREPARE_SUCCESS_COMPLETE_LATENCY, duration);
- } else {
- DataShard.CheckSplitCanStart(ctx);
+ LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Errors while proposing transaction txid " << op->GetTxId()
+ << " at tablet " << DataShard.TabletID() << " status: "
+ << res->GetStatus() << " errors: " << errors);
+ }
+
+ if (res->IsPrepared()) {
+ DataShard.IncCounter(COUNTER_PREPARE_SUCCESS_COMPLETE_LATENCY, duration);
+ } else {
+ DataShard.CheckSplitCanStart(ctx);
DataShard.CheckMvccStateChangeCanStart(ctx);
- }
-
- if (op->HasNeedDiagnosticsFlag())
- AddDiagnosticsResult(res);
-
+ }
+
+ if (op->HasNeedDiagnosticsFlag())
+ AddDiagnosticsResult(res);
+
DataShard.FillExecutionStats(op->GetExecutionProfile(), *res);
- DataShard.IncCounter(COUNTER_TX_RESULT_SIZE, res->Record.GetTxResult().size());
-
- if (!gSkipRepliesFailPoint.Check(DataShard.TabletID(), op->GetTxId()))
- ctx.Send(op->GetTarget(), res.Release(), 0, op->GetCookie());
-}
-
-void TFinishProposeUnit::AddDiagnosticsResult(TOutputOpData::TResultPtr &res)
-{
- auto &tabletInfo = *res->Record.MutableTabletInfo();
+ DataShard.IncCounter(COUNTER_TX_RESULT_SIZE, res->Record.GetTxResult().size());
+
+ if (!gSkipRepliesFailPoint.Check(DataShard.TabletID(), op->GetTxId()))
+ ctx.Send(op->GetTarget(), res.Release(), 0, op->GetCookie());
+}
+
+void TFinishProposeUnit::AddDiagnosticsResult(TOutputOpData::TResultPtr &res)
+{
+ auto &tabletInfo = *res->Record.MutableTabletInfo();
ActorIdToProto(DataShard.SelfId(), tabletInfo.MutableActorId());
-
- tabletInfo.SetTabletId(DataShard.TabletID());
- tabletInfo.SetGeneration(DataShard.Generation());
- tabletInfo.SetStep(DataShard.GetExecutorStep());
+
+ tabletInfo.SetTabletId(DataShard.TabletID());
+ tabletInfo.SetGeneration(DataShard.Generation());
+ tabletInfo.SetStep(DataShard.GetExecutorStep());
tabletInfo.SetIsFollower(DataShard.IsFollower());
-}
-
-void TFinishProposeUnit::UpdateCounters(TOperation::TPtr op,
- const TActorContext &ctx)
-{
- auto &res = op->Result();
- Y_VERIFY(res);
- auto execLatency = TAppData::TimeProvider->Now() - op->GetReceivedAt();
-
- res->Record.SetExecLatency(execLatency.MilliSeconds());
-
- DataShard.IncCounter(COUNTER_PREPARE_EXEC_LATENCY, execLatency);
- if (res->IsPrepared()) {
- DataShard.IncCounter(COUNTER_PREPARE_SUCCESS);
- } else {
- if (op->IsDirty())
- DataShard.IncCounter(COUNTER_PREPARE_DIRTY);
-
- if (res->IsError()) {
- DataShard.IncCounter(COUNTER_PREPARE_ERROR);
- LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
- "Prepare transaction failed. txid " << op->GetTxId()
- << " at tablet " << DataShard.TabletID() << " errors: "
- << PrintErrors(res->Record));
- } else {
- DataShard.IncCounter(COUNTER_PREPARE_IMMEDIATE);
- }
- }
-}
-
-TString TFinishProposeUnit::PrintErrors(const NKikimrTxDataShard::TEvProposeTransactionResult &rec)
-{
- TString s;
- TStringOutput str(s);
- str << "[ ";
- for (size_t i = 0; i < rec.ErrorSize(); ++i) {
- str << NKikimrTxDataShard::TError_EKind_Name(rec.GetError(i).GetKind())
- << "(" << rec.GetError(i).GetReason() << ") ";
- }
- str << "]";
- return s;
-}
-
+}
+
+void TFinishProposeUnit::UpdateCounters(TOperation::TPtr op,
+ const TActorContext &ctx)
+{
+ auto &res = op->Result();
+ Y_VERIFY(res);
+ auto execLatency = TAppData::TimeProvider->Now() - op->GetReceivedAt();
+
+ res->Record.SetExecLatency(execLatency.MilliSeconds());
+
+ DataShard.IncCounter(COUNTER_PREPARE_EXEC_LATENCY, execLatency);
+ if (res->IsPrepared()) {
+ DataShard.IncCounter(COUNTER_PREPARE_SUCCESS);
+ } else {
+ if (op->IsDirty())
+ DataShard.IncCounter(COUNTER_PREPARE_DIRTY);
+
+ if (res->IsError()) {
+ DataShard.IncCounter(COUNTER_PREPARE_ERROR);
+ LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Prepare transaction failed. txid " << op->GetTxId()
+ << " at tablet " << DataShard.TabletID() << " errors: "
+ << PrintErrors(res->Record));
+ } else {
+ DataShard.IncCounter(COUNTER_PREPARE_IMMEDIATE);
+ }
+ }
+}
+
+TString TFinishProposeUnit::PrintErrors(const NKikimrTxDataShard::TEvProposeTransactionResult &rec)
+{
+ TString s;
+ TStringOutput str(s);
+ str << "[ ";
+ for (size_t i = 0; i < rec.ErrorSize(); ++i) {
+ str << NKikimrTxDataShard::TError_EKind_Name(rec.GetError(i).GetKind())
+ << "(" << rec.GetError(i).GetReason() << ") ";
+ }
+ str << "]";
+ return s;
+}
+
THolder<TExecutionUnit> CreateFinishProposeUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TFinishProposeUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/index.html b/ydb/core/tx/datashard/index.html
index 2fb4430c7cf..4407fc74413 100644
--- a/ydb/core/tx/datashard/index.html
+++ b/ydb/core/tx/datashard/index.html
@@ -1,309 +1,309 @@
-<html>
- <head>
- <link rel='stylesheet' href='../cms/ext/bootstrap.min.css'>
- <script language='javascript' type='text/javascript' src='https://yastatic.net/jquery/3.3.1/jquery.min.js'></script>
- <script language='javascript' type='text/javascript' src='../cms/ext/bootstrap.bundle.min.js'></script>
- <link rel='stylesheet' href='../jquery.tablesorter.css'>
- <script language='javascript' type='text/javascript' src='../jquery.tablesorter.js'></script>
- <link rel="stylesheet" href="../cms/ext/theme.blue.css"></link>
-
- <link rel="stylesheet" href="../cms/common.css"></link>
- <link rel="stylesheet" href="../cms/datashard.css"></link>
- <script language="javascript" type="text/javascript" src="../cms/common.js"></script>
- <script language="javascript" type="text/javascript" src="../cms/enums.js"></script>
- <script language="javascript" type="text/javascript" src="../cms/proto_types.js"></script>
- <script language="javascript" type="text/javascript" src="../cms/datashard_info.js"></script>
- <script language="javascript" type="text/javascript" src="../cms/datashard_ops_list.js"></script>
- <script language="javascript" type="text/javascript" src="../cms/datashard_op.js"></script>
- <script language="javascript" type="text/javascript" src="../cms/datashard_slow_ops.js"></script>
- <script language="javascript" type="text/javascript" src="../cms/datashard_rs.js"></script>
- <script language="javascript" type="text/javascript" src="../cms/datashard_hist.js"></script>
- <script language="javascript" type="text/javascript" src="../cms/datashard.js"></script>
-
- <style type="text/css">
- .table-nonfluid { width: auto; }
- .narrow-line50 {line-height: 50%}
- .narrow-line60 {line-height: 60%}
- .narrow-line70 {line-height: 70%}
- .narrow-line80 {line-height: 80%}
- .narrow-line90 {line-height: 90%}
- </style>
- </head>
- <body>
- <ol class='breadcrumb'>
- <li class='breadcrumb-item'><a id='host-ref' href='.'>Kikimr Monitoring</a></li>
- <li class='breadcrumb-item active' id='shard-ref'>DataShard</li>
- </ol>
- <div class="container"><h3 id="main-title">DataShard</h3>
- <div id="enums-error" class="error"></div>
- <div id="proto-types-error" class="error"></div>
- <ul class="nav nav-tabs" id="ds-tabs">
- <li class="nav-item">
- <a class="nav-link active" href="#ds-info" data-toggle="tab" id="ds-info-link">Generic Info</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="#ds-ops-list" data-toggle="tab" id="ds-ops-list-link">Operations</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="#ds-op" data-toggle="tab" id="ds-op-link">Operation Info</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="#ds-slow-ops" data-toggle="tab" id="ds-slow-ops-link">Slow Operations</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="#ds-rs" data-toggle="tab" id="ds-rs-link">Read Sets</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="#ds-hist" data-toggle="tab" id="ds-hist-link">Data Histograms</a>
- </li>
- </ul>
- <div class="tab-content" style="padding-top: 10px">
- <div id="ds-info" class="tab-pane fade in active show">
- <div id="ds-info-error" class="error"></div>
- <div class="row">
- <div class="col">
- <table class="ds-info">
- <caption class="ds-info">Tablet info</caption>
- <tbody class="ds-info">
- <tr class="ds-info">
- <td class="ds-info">SchemeShard</td>
- <td class="ds-info" id="tablet-info-schemeshard">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Mediator</td>
- <td class="ds-info" id="tablet-info-mediator">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Generation</td>
- <td class="ds-info" id="tablet-info-generation">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Role</td>
- <td class="ds-info" id="tablet-info-role">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">State</td>
- <td class="ds-info" id="tablet-info-state">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">HasSharedBlobs</td>
- <td class="ds-info" id="tablet-info-shared-blobs">Loading...</td>
- </tr>
- </tbody>
- </table>
- <table class="ds-info">
- <caption class="ds-info">Activities</caption>
- <tbody class="ds-info">
- <tr class="ds-info">
- <td class="ds-info">Last planned tx</td>
- <td class="ds-info" id="activities-last-planned-tx">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Last completed tx</td>
- <td class="ds-info" id="activities-last-completed-tx">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Utmost completed tx</td>
- <td class="ds-info" id="activities-utmost-completed-tx">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Data tx complete lag (ms)</td>
- <td class="ds-info" id="activities-data-tx-complete-lag">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Scan tx complete lag (ms)</td>
- <td class="ds-info" id="activities-scan-tx-complete-lag">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Planned txs in-fly</td>
- <td class="ds-info" id="activities-in-fly-planned">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Immediate txs in-fly</td>
- <td class="ds-info" id="activities-in-fly-immediate">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Executing operations</td>
- <td class="ds-info" id="activities-executing-ops">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Waiting operations</td>
- <td class="ds-info" id="activities-waiting-ops">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Execute blockers</td>
- <td class="ds-info" id="activities-execute-blockers">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Cached data txs</td>
- <td class="ds-info" id="activities-data-tx-cached">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Out read sets</td>
- <td class="ds-info" id="activities-out-rs">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Out read sets acks</td>
- <td class="ds-info" id="activities-our-rs-acks">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Delayed acks</td>
- <td class="ds-info" id="activities-delayed-acks">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Locks</td>
- <td class="ds-info" id="activities-locks">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Broken locks</td>
- <td class="ds-info" id="activities-broken-locks">Loading...</td>
- </tr>
- </tbody>
- </table>
- </div>
- <div class="col">
- <div id="user-tables">
- </div>
- <table class="ds-info">
- <caption class="ds-info">Immediate controls (<a href="../cms#page=configs&show=config-items-39">configure</a>)</caption>
- <tbody class="ds-info" id="tablet-info-controls">
- </tbody>
- </table>
- <table class="ds-info">
- <caption class="ds-info">Pipeline config</caption>
- <tbody class="ds-info">
- <tr class="ds-info">
- <td class="ds-info">Out-of-order enabled</td>
- <td class="ds-info" id="pipeline-out-of-order-enabled">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Active txs limit</td>
- <td class="ds-info" id="pipeline-active-txs-limit">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Allow immediate</td>
- <td class="ds-info" id="pipeline-allow-immediate">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Force online RW</td>
- <td class="ds-info" id="pipeline-force-online-rw">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Dirty online</td>
- <td class="ds-info" id="pipeline-dirty-online">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Dirty immediate</td>
- <td class="ds-info" id="pipeline-dirty-immediate">Loading...</td>
- </tr>
- <tr class="ds-info">
- <td class="ds-info">Data tx cache limit</td>
- <td class="ds-info" id="pipeline-data-tx-cache-limit">Loading...</td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
- </div>
- <div id="ds-ops-list" class="tab-pane fade">
- <div id="ds-ops-list-error" class="error"></div>
- <table id="ds-ops-list-table" class="tablesorter">
- <thead>
- <tr>
- <th>TxId</th>
- <th>Step</th>
- <th>Kind</th>
- <th>Immediate</th>
- <th>ReadOnly</th>
- <th>Waiting</th>
- <th>Executing</th>
- <th>Complete</th>
- <th>CurrentUnit</th>
- <th>ReceivedAt</th>
- </tr>
- </thead>
- <tbody id="ds-ops-list-body">
- </tbody>
- </table>
- </div>
- <div id="ds-op" class="tab-pane fade">
- <div id="ds-op-error" class="error"></div>
- <div class="form-group row">
- <div class="col-sm-auto">
- <input type="number" id="ds-op-id-input" class="form-control" placeholder="Enter operation ID"/>
- </div>
- <button type="button" id="ds-op-show" class="btn btn-primary" data-action="show">Show</button>
- </div>
- <div id="ds-op-info"></div>
- </div>
- <div id="ds-slow-ops" class="tab-pane fade">
- <div id="ds-slow-ops-error" class="error"></div>
- <table id="ds-slow-ops-table" class="tablesorter">
- <thead>
- <tr>
- <th>TxId</th>
- <th>Step</th>
- <th>Kind</th>
- <th>ReceivedAt</th>
- <th>Immediate</th>
- <th>ReadOnly</th>
- <th>ExecutionTime</th>
- </tr>
- </thead>
- <tbody id="ds-slow-ops-body">
- </tbody>
- </table>
- </div>
- <div id="ds-rs" class="tab-pane fade">
- <div id="ds-rs-error" class="error"></div>
- <table id="ds-out-rs-table" class="tablesorter">
- <caption class="ds-info">Out Read Sets</caption>
- <thead>
- <tr>
- <th>TxId</th>
- <th>Origin</th>
- <th>Source</th>
- <th>Destination</th>
- <th>SeqNo</th>
- </tr>
- </thead>
- <tbody id="ds-out-rs-body">
- </tbody>
- </table>
- <table id="ds-out-rs-ack-table" class="tablesorter">
- <caption class="ds-info">Out Read Set Acks</caption>
- <thead>
- <tr>
- <th>TxId</th>
- <th>Origin</th>
- <th>Source</th>
- <th>Destination</th>
- <th>SeqNo</th>
- </tr>
- </thead>
- <tbody id="ds-out-rs-ack-body">
- </tbody>
- </table>
- <table id="ds-delayed-ack-table" class="tablesorter">
- <caption class="ds-info">Delayed Acks</caption>
- <thead>
- <tr>
- <th>TxId</th>
- <th>Origin</th>
- <th>Source</th>
- <th>Destination</th>
- <th>SeqNo</th>
- </tr>
- </thead>
- <tbody id="ds-delayed-ack-body">
- </tbody>
- </table>
- </div>
- <div id="ds-hist" class="tab-pane fade">
- <div id="ds-hist-error" class="error"></div>
- <div id="ds-hist-tables"></div>
- </div>
- </div>
- </div>
- </body>
-</html>
+<html>
+ <head>
+ <link rel='stylesheet' href='../cms/ext/bootstrap.min.css'>
+ <script language='javascript' type='text/javascript' src='https://yastatic.net/jquery/3.3.1/jquery.min.js'></script>
+ <script language='javascript' type='text/javascript' src='../cms/ext/bootstrap.bundle.min.js'></script>
+ <link rel='stylesheet' href='../jquery.tablesorter.css'>
+ <script language='javascript' type='text/javascript' src='../jquery.tablesorter.js'></script>
+ <link rel="stylesheet" href="../cms/ext/theme.blue.css"></link>
+
+ <link rel="stylesheet" href="../cms/common.css"></link>
+ <link rel="stylesheet" href="../cms/datashard.css"></link>
+ <script language="javascript" type="text/javascript" src="../cms/common.js"></script>
+ <script language="javascript" type="text/javascript" src="../cms/enums.js"></script>
+ <script language="javascript" type="text/javascript" src="../cms/proto_types.js"></script>
+ <script language="javascript" type="text/javascript" src="../cms/datashard_info.js"></script>
+ <script language="javascript" type="text/javascript" src="../cms/datashard_ops_list.js"></script>
+ <script language="javascript" type="text/javascript" src="../cms/datashard_op.js"></script>
+ <script language="javascript" type="text/javascript" src="../cms/datashard_slow_ops.js"></script>
+ <script language="javascript" type="text/javascript" src="../cms/datashard_rs.js"></script>
+ <script language="javascript" type="text/javascript" src="../cms/datashard_hist.js"></script>
+ <script language="javascript" type="text/javascript" src="../cms/datashard.js"></script>
+
+ <style type="text/css">
+ .table-nonfluid { width: auto; }
+ .narrow-line50 {line-height: 50%}
+ .narrow-line60 {line-height: 60%}
+ .narrow-line70 {line-height: 70%}
+ .narrow-line80 {line-height: 80%}
+ .narrow-line90 {line-height: 90%}
+ </style>
+ </head>
+ <body>
+ <ol class='breadcrumb'>
+ <li class='breadcrumb-item'><a id='host-ref' href='.'>Kikimr Monitoring</a></li>
+ <li class='breadcrumb-item active' id='shard-ref'>DataShard</li>
+ </ol>
+ <div class="container"><h3 id="main-title">DataShard</h3>
+ <div id="enums-error" class="error"></div>
+ <div id="proto-types-error" class="error"></div>
+ <ul class="nav nav-tabs" id="ds-tabs">
+ <li class="nav-item">
+ <a class="nav-link active" href="#ds-info" data-toggle="tab" id="ds-info-link">Generic Info</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="#ds-ops-list" data-toggle="tab" id="ds-ops-list-link">Operations</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="#ds-op" data-toggle="tab" id="ds-op-link">Operation Info</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="#ds-slow-ops" data-toggle="tab" id="ds-slow-ops-link">Slow Operations</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="#ds-rs" data-toggle="tab" id="ds-rs-link">Read Sets</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="#ds-hist" data-toggle="tab" id="ds-hist-link">Data Histograms</a>
+ </li>
+ </ul>
+ <div class="tab-content" style="padding-top: 10px">
+ <div id="ds-info" class="tab-pane fade in active show">
+ <div id="ds-info-error" class="error"></div>
+ <div class="row">
+ <div class="col">
+ <table class="ds-info">
+ <caption class="ds-info">Tablet info</caption>
+ <tbody class="ds-info">
+ <tr class="ds-info">
+ <td class="ds-info">SchemeShard</td>
+ <td class="ds-info" id="tablet-info-schemeshard">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Mediator</td>
+ <td class="ds-info" id="tablet-info-mediator">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Generation</td>
+ <td class="ds-info" id="tablet-info-generation">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Role</td>
+ <td class="ds-info" id="tablet-info-role">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">State</td>
+ <td class="ds-info" id="tablet-info-state">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">HasSharedBlobs</td>
+ <td class="ds-info" id="tablet-info-shared-blobs">Loading...</td>
+ </tr>
+ </tbody>
+ </table>
+ <table class="ds-info">
+ <caption class="ds-info">Activities</caption>
+ <tbody class="ds-info">
+ <tr class="ds-info">
+ <td class="ds-info">Last planned tx</td>
+ <td class="ds-info" id="activities-last-planned-tx">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Last completed tx</td>
+ <td class="ds-info" id="activities-last-completed-tx">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Utmost completed tx</td>
+ <td class="ds-info" id="activities-utmost-completed-tx">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Data tx complete lag (ms)</td>
+ <td class="ds-info" id="activities-data-tx-complete-lag">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Scan tx complete lag (ms)</td>
+ <td class="ds-info" id="activities-scan-tx-complete-lag">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Planned txs in-fly</td>
+ <td class="ds-info" id="activities-in-fly-planned">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Immediate txs in-fly</td>
+ <td class="ds-info" id="activities-in-fly-immediate">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Executing operations</td>
+ <td class="ds-info" id="activities-executing-ops">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Waiting operations</td>
+ <td class="ds-info" id="activities-waiting-ops">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Execute blockers</td>
+ <td class="ds-info" id="activities-execute-blockers">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Cached data txs</td>
+ <td class="ds-info" id="activities-data-tx-cached">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Out read sets</td>
+ <td class="ds-info" id="activities-out-rs">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Out read sets acks</td>
+ <td class="ds-info" id="activities-our-rs-acks">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Delayed acks</td>
+ <td class="ds-info" id="activities-delayed-acks">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Locks</td>
+ <td class="ds-info" id="activities-locks">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Broken locks</td>
+ <td class="ds-info" id="activities-broken-locks">Loading...</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div class="col">
+ <div id="user-tables">
+ </div>
+ <table class="ds-info">
+ <caption class="ds-info">Immediate controls (<a href="../cms#page=configs&show=config-items-39">configure</a>)</caption>
+ <tbody class="ds-info" id="tablet-info-controls">
+ </tbody>
+ </table>
+ <table class="ds-info">
+ <caption class="ds-info">Pipeline config</caption>
+ <tbody class="ds-info">
+ <tr class="ds-info">
+ <td class="ds-info">Out-of-order enabled</td>
+ <td class="ds-info" id="pipeline-out-of-order-enabled">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Active txs limit</td>
+ <td class="ds-info" id="pipeline-active-txs-limit">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Allow immediate</td>
+ <td class="ds-info" id="pipeline-allow-immediate">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Force online RW</td>
+ <td class="ds-info" id="pipeline-force-online-rw">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Dirty online</td>
+ <td class="ds-info" id="pipeline-dirty-online">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Dirty immediate</td>
+ <td class="ds-info" id="pipeline-dirty-immediate">Loading...</td>
+ </tr>
+ <tr class="ds-info">
+ <td class="ds-info">Data tx cache limit</td>
+ <td class="ds-info" id="pipeline-data-tx-cache-limit">Loading...</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ <div id="ds-ops-list" class="tab-pane fade">
+ <div id="ds-ops-list-error" class="error"></div>
+ <table id="ds-ops-list-table" class="tablesorter">
+ <thead>
+ <tr>
+ <th>TxId</th>
+ <th>Step</th>
+ <th>Kind</th>
+ <th>Immediate</th>
+ <th>ReadOnly</th>
+ <th>Waiting</th>
+ <th>Executing</th>
+ <th>Complete</th>
+ <th>CurrentUnit</th>
+ <th>ReceivedAt</th>
+ </tr>
+ </thead>
+ <tbody id="ds-ops-list-body">
+ </tbody>
+ </table>
+ </div>
+ <div id="ds-op" class="tab-pane fade">
+ <div id="ds-op-error" class="error"></div>
+ <div class="form-group row">
+ <div class="col-sm-auto">
+ <input type="number" id="ds-op-id-input" class="form-control" placeholder="Enter operation ID"/>
+ </div>
+ <button type="button" id="ds-op-show" class="btn btn-primary" data-action="show">Show</button>
+ </div>
+ <div id="ds-op-info"></div>
+ </div>
+ <div id="ds-slow-ops" class="tab-pane fade">
+ <div id="ds-slow-ops-error" class="error"></div>
+ <table id="ds-slow-ops-table" class="tablesorter">
+ <thead>
+ <tr>
+ <th>TxId</th>
+ <th>Step</th>
+ <th>Kind</th>
+ <th>ReceivedAt</th>
+ <th>Immediate</th>
+ <th>ReadOnly</th>
+ <th>ExecutionTime</th>
+ </tr>
+ </thead>
+ <tbody id="ds-slow-ops-body">
+ </tbody>
+ </table>
+ </div>
+ <div id="ds-rs" class="tab-pane fade">
+ <div id="ds-rs-error" class="error"></div>
+ <table id="ds-out-rs-table" class="tablesorter">
+ <caption class="ds-info">Out Read Sets</caption>
+ <thead>
+ <tr>
+ <th>TxId</th>
+ <th>Origin</th>
+ <th>Source</th>
+ <th>Destination</th>
+ <th>SeqNo</th>
+ </tr>
+ </thead>
+ <tbody id="ds-out-rs-body">
+ </tbody>
+ </table>
+ <table id="ds-out-rs-ack-table" class="tablesorter">
+ <caption class="ds-info">Out Read Set Acks</caption>
+ <thead>
+ <tr>
+ <th>TxId</th>
+ <th>Origin</th>
+ <th>Source</th>
+ <th>Destination</th>
+ <th>SeqNo</th>
+ </tr>
+ </thead>
+ <tbody id="ds-out-rs-ack-body">
+ </tbody>
+ </table>
+ <table id="ds-delayed-ack-table" class="tablesorter">
+ <caption class="ds-info">Delayed Acks</caption>
+ <thead>
+ <tr>
+ <th>TxId</th>
+ <th>Origin</th>
+ <th>Source</th>
+ <th>Destination</th>
+ <th>SeqNo</th>
+ </tr>
+ </thead>
+ <tbody id="ds-delayed-ack-body">
+ </tbody>
+ </table>
+ </div>
+ <div id="ds-hist" class="tab-pane fade">
+ <div id="ds-hist-error" class="error"></div>
+ <div id="ds-hist-tables"></div>
+ </div>
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/ydb/core/tx/datashard/key_conflicts.cpp b/ydb/core/tx/datashard/key_conflicts.cpp
index 000de644bc1..4fb5b3bd432 100644
--- a/ydb/core/tx/datashard/key_conflicts.cpp
+++ b/ydb/core/tx/datashard/key_conflicts.cpp
@@ -1,29 +1,29 @@
-#include "key_conflicts.h"
-#include "sys_tables.h"
-
-namespace NKikimr {
+#include "key_conflicts.h"
+#include "sys_tables.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-using TValidationInfo = NMiniKQL::IEngineFlat::TValidationInfo;
-using TValidatedKey = NMiniKQL::IEngineFlat::TValidatedKey;
-
-namespace {
-
-bool HasKeyConflict(const TKeyDesc& aKey,
- const TKeyDesc& bKey)
-{
+
+using TValidationInfo = NMiniKQL::IEngineFlat::TValidationInfo;
+using TValidatedKey = NMiniKQL::IEngineFlat::TValidatedKey;
+
+namespace {
+
+bool HasKeyConflict(const TKeyDesc& aKey,
+ const TKeyDesc& bKey)
+{
return CheckRangesOverlap(aKey.Range, bKey.Range, aKey.KeyColumnTypes, bKey.KeyColumnTypes);
-}
-
-bool HasKeyConflict(const TValidatedKey& a,
- const TValidatedKey& b)
-{
- Y_VERIFY(a.Key && b.Key);
- Y_VERIFY(a.IsWrite || b.IsWrite);
-
- const TKeyDesc& aKey = *a.Key;
- const TKeyDesc& bKey = *b.Key;
-
+}
+
+bool HasKeyConflict(const TValidatedKey& a,
+ const TValidatedKey& b)
+{
+ Y_VERIFY(a.Key && b.Key);
+ Y_VERIFY(a.IsWrite || b.IsWrite);
+
+ const TKeyDesc& aKey = *a.Key;
+ const TKeyDesc& bKey = *b.Key;
+
bool aLocks = TSysTables::IsLocksTable(aKey.TableId);
bool bLocks = TSysTables::IsLocksTable(bKey.TableId);
@@ -39,42 +39,42 @@ bool HasKeyConflict(const TValidatedKey& a,
// Only conflict on the same LockId
return aLockId == bLockId;
- }
-
+ }
+
// There is no conflict between lock and non-lock tables
if (aLocks || bLocks) {
return false;
}
-
+
// Future support for colocated tables: different tables never conflict
if (Y_LIKELY(aKey.TableId.HasSamePath(bKey.TableId))) {
return HasKeyConflict(aKey, bKey);
}
return false;
-}
-
-}
-
-/// @note O(N^2) in worst case
-bool HasKeyConflict(const TValidationInfo& infoA,
- const TValidationInfo& infoB)
-{
- if (!infoA.HasWrites() && !infoB.HasWrites())
- return false;
-
- for (const TValidatedKey& a : infoA.Keys) {
- if (!a.IsWrite && !infoB.HasWrites())
- continue;
- for (const TValidatedKey& b : infoB.Keys) {
- if (!a.IsWrite && !b.IsWrite)
- continue;
- if (HasKeyConflict(a, b))
- return true;
- }
- }
- return false;
-}
-
+}
+
+}
+
+/// @note O(N^2) in worst case
+bool HasKeyConflict(const TValidationInfo& infoA,
+ const TValidationInfo& infoB)
+{
+ if (!infoA.HasWrites() && !infoB.HasWrites())
+ return false;
+
+ for (const TValidatedKey& a : infoA.Keys) {
+ if (!a.IsWrite && !infoB.HasWrites())
+ continue;
+ for (const TValidatedKey& b : infoB.Keys) {
+ if (!a.IsWrite && !b.IsWrite)
+ continue;
+ if (HasKeyConflict(a, b))
+ return true;
+ }
+ }
+ return false;
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/key_conflicts.h b/ydb/core/tx/datashard/key_conflicts.h
index 436ea65d036..ebcd1efb1be 100644
--- a/ydb/core/tx/datashard/key_conflicts.h
+++ b/ydb/core/tx/datashard/key_conflicts.h
@@ -1,13 +1,13 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <ydb/core/engine/mkql_engine_flat.h>
-
-namespace NKikimr {
+
+namespace NKikimr {
namespace NDataShard {
-
-bool HasKeyConflict(const NMiniKQL::IEngineFlat::TValidationInfo& infoA,
- const NMiniKQL::IEngineFlat::TValidationInfo& infoB);
-
+
+bool HasKeyConflict(const NMiniKQL::IEngineFlat::TValidationInfo& infoA,
+ const NMiniKQL::IEngineFlat::TValidationInfo& infoB);
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/load_and_wait_in_rs_unit.cpp b/ydb/core/tx/datashard/load_and_wait_in_rs_unit.cpp
index 803c1f90b89..40be05e79e9 100644
--- a/ydb/core/tx/datashard/load_and_wait_in_rs_unit.cpp
+++ b/ydb/core/tx/datashard/load_and_wait_in_rs_unit.cpp
@@ -1,89 +1,89 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NMiniKQL;
-
-class TLoadAndWaitInRSUnit : public TExecutionUnit {
-public:
+
+using namespace NMiniKQL;
+
+class TLoadAndWaitInRSUnit : public TExecutionUnit {
+public:
TLoadAndWaitInRSUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TLoadAndWaitInRSUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TLoadAndWaitInRSUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TLoadAndWaitInRSUnit::TLoadAndWaitInRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::LoadAndWaitInRS, true, dataShard, pipeline)
-{
-}
-
-TLoadAndWaitInRSUnit::~TLoadAndWaitInRSUnit()
-{
-}
-
-bool TLoadAndWaitInRSUnit::IsReadyToExecute(TOperation::TPtr op) const
-{
- // Check if operation expects input read sets.
- if (op->InReadSets().empty())
- return true;
-
- // Allow to proceed if operation has to load
- // input read sets from local database.
- if (!op->HasLoadedInRSFlag())
- return true;
-
- // Check if all read sets are received.
- if (!op->GetRemainReadSets())
- return true;
-
- return false;
-}
-
-EExecutionStatus TLoadAndWaitInRSUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- if (op->InReadSets().empty())
- return EExecutionStatus::Executed;
-
- // Load read sets from local database.
- if (!op->HasLoadedInRSFlag()) {
- if (!Pipeline.LoadInReadSets(op, txc, ctx))
- return EExecutionStatus::Restart;
-
- Y_VERIFY(op->HasLoadedInRSFlag());
-
- if (!IsReadyToExecute(op))
- return EExecutionStatus::Continue;
- }
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::LoadAndWaitInRS, true, dataShard, pipeline)
+{
+}
+
+TLoadAndWaitInRSUnit::~TLoadAndWaitInRSUnit()
+{
+}
+
+bool TLoadAndWaitInRSUnit::IsReadyToExecute(TOperation::TPtr op) const
+{
+ // Check if operation expects input read sets.
+ if (op->InReadSets().empty())
+ return true;
+
+ // Allow to proceed if operation has to load
+ // input read sets from local database.
+ if (!op->HasLoadedInRSFlag())
+ return true;
+
+ // Check if all read sets are received.
+ if (!op->GetRemainReadSets())
+ return true;
+
+ return false;
+}
+
+EExecutionStatus TLoadAndWaitInRSUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ if (op->InReadSets().empty())
+ return EExecutionStatus::Executed;
+
+ // Load read sets from local database.
+ if (!op->HasLoadedInRSFlag()) {
+ if (!Pipeline.LoadInReadSets(op, txc, ctx))
+ return EExecutionStatus::Restart;
+
+ Y_VERIFY(op->HasLoadedInRSFlag());
+
+ if (!IsReadyToExecute(op))
+ return EExecutionStatus::Continue;
+ }
+
// We only count transactions that had to wait for incoming readsets
DataShard.IncCounter(COUNTER_WAIT_READSETS_LATENCY_MS, op->GetCurrentElapsedAndReset().MilliSeconds());
- return EExecutionStatus::Executed;
-}
-
-void TLoadAndWaitInRSUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ return EExecutionStatus::Executed;
+}
+
+void TLoadAndWaitInRSUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateLoadAndWaitInRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TLoadAndWaitInRSUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/load_tx_details_unit.cpp b/ydb/core/tx/datashard/load_tx_details_unit.cpp
index 9cd0246a8fb..6916d8b0d54 100644
--- a/ydb/core/tx/datashard/load_tx_details_unit.cpp
+++ b/ydb/core/tx/datashard/load_tx_details_unit.cpp
@@ -1,63 +1,63 @@
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TLoadTxDetailsUnit : public TExecutionUnit {
-public:
+
+class TLoadTxDetailsUnit : public TExecutionUnit {
+public:
TLoadTxDetailsUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TLoadTxDetailsUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TLoadTxDetailsUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TLoadTxDetailsUnit::TLoadTxDetailsUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::LoadTxDetails, true, dataShard, pipeline)
-{
-}
-
-TLoadTxDetailsUnit::~TLoadTxDetailsUnit()
-{
-}
-
-bool TLoadTxDetailsUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TLoadTxDetailsUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- TActiveTransaction::TPtr tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- if (!Pipeline.LoadTxDetails(txc, ctx, tx))
- return EExecutionStatus::Restart;
-
- return EExecutionStatus::Executed;
-}
-
-void TLoadTxDetailsUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::LoadTxDetails, true, dataShard, pipeline)
+{
+}
+
+TLoadTxDetailsUnit::~TLoadTxDetailsUnit()
+{
+}
+
+bool TLoadTxDetailsUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TLoadTxDetailsUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ TActiveTransaction::TPtr tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ if (!Pipeline.LoadTxDetails(txc, ctx, tx))
+ return EExecutionStatus::Restart;
+
+ return EExecutionStatus::Executed;
+}
+
+void TLoadTxDetailsUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateLoadTxDetailsUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return MakeHolder<TLoadTxDetailsUnit>(dataShard, pipeline);
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/make_scan_snapshot_unit.cpp b/ydb/core/tx/datashard/make_scan_snapshot_unit.cpp
index e55273c1589..1ec465fea78 100644
--- a/ydb/core/tx/datashard/make_scan_snapshot_unit.cpp
+++ b/ydb/core/tx/datashard/make_scan_snapshot_unit.cpp
@@ -1,50 +1,50 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TMakeScanSnapshotUnit : public TExecutionUnit {
-public:
+
+class TMakeScanSnapshotUnit : public TExecutionUnit {
+public:
TMakeScanSnapshotUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TMakeScanSnapshotUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TMakeScanSnapshotUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TMakeScanSnapshotUnit::TMakeScanSnapshotUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::MakeScanSnapshot, false, dataShard, pipeline)
-{
-}
-
-TMakeScanSnapshotUnit::~TMakeScanSnapshotUnit()
-{
-}
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::MakeScanSnapshot, false, dataShard, pipeline)
+{
+}
+
+TMakeScanSnapshotUnit::~TMakeScanSnapshotUnit()
+{
+}
+
bool TMakeScanSnapshotUnit::IsReadyToExecute(TOperation::TPtr op) const
-{
+{
// Pass aborted operations
if (op->Result() || op->HasResultSentFlag() || op->IsImmediate() && WillRejectDataTx(op)) {
return true;
}
return op->HasUsingSnapshotFlag() || !op->HasRuntimeConflicts();
-}
-
-EExecutionStatus TMakeScanSnapshotUnit::Execute(TOperation::TPtr op,
- TTransactionContext &,
+}
+
+EExecutionStatus TMakeScanSnapshotUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &,
const TActorContext &ctx)
-{
+{
// Pass aborted operations
if (op->Result() || op->HasResultSentFlag() || op->IsImmediate() && CheckRejectDataTx(op, ctx)) {
return EExecutionStatus::Executed;
@@ -55,34 +55,34 @@ EExecutionStatus TMakeScanSnapshotUnit::Execute(TOperation::TPtr op,
return EExecutionStatus::Executed;
}
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
const auto& record = tx->GetDataTx()->GetReadTableTransaction();
auto tid = record.GetTableId().GetTableId();
- auto &info = *DataShard.GetUserTables().at(tid);
-
+ auto &info = *DataShard.GetUserTables().at(tid);
+
if (record.HasSnapshotStep() && record.HasSnapshotTxId()) {
Y_FAIL("Unexpected MakeScanSnapshot on ReadTable from a persistent snapshot");
}
- tx->SetScanSnapshotId(DataShard.MakeScanSnapshot(info.LocalTid));
- Pipeline.MarkOpAsUsingSnapshot(op);
-
- return EExecutionStatus::Executed;
-}
-
-void TMakeScanSnapshotUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ tx->SetScanSnapshotId(DataShard.MakeScanSnapshot(info.LocalTid));
+ Pipeline.MarkOpAsUsingSnapshot(op);
+
+ return EExecutionStatus::Executed;
+}
+
+void TMakeScanSnapshotUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateMakeScanSnapshotUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TMakeScanSnapshotUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/make_snapshot_unit.cpp b/ydb/core/tx/datashard/make_snapshot_unit.cpp
index 4f54a890816..8532f04d29e 100644
--- a/ydb/core/tx/datashard/make_snapshot_unit.cpp
+++ b/ydb/core/tx/datashard/make_snapshot_unit.cpp
@@ -1,88 +1,88 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TMakeSnapshotUnit : public TExecutionUnit {
-public:
+
+class TMakeSnapshotUnit : public TExecutionUnit {
+public:
TMakeSnapshotUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TMakeSnapshotUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TMakeSnapshotUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TMakeSnapshotUnit::TMakeSnapshotUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::MakeSnapshot, false, dataShard, pipeline)
-{
-}
-
-TMakeSnapshotUnit::~TMakeSnapshotUnit()
-{
-}
-
-bool TMakeSnapshotUnit::IsReadyToExecute(TOperation::TPtr op) const
-{
- if (!op->IsWaitingForSnapshot())
- return true;
-
- return !op->InputSnapshots().empty();
-}
-
-EExecutionStatus TMakeSnapshotUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- auto &schemeTx = tx->GetSchemeTx();
- if (!schemeTx.HasSendSnapshot())
- return EExecutionStatus::Executed;
-
- if (!op->IsWaitingForSnapshot()) {
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::MakeSnapshot, false, dataShard, pipeline)
+{
+}
+
+TMakeSnapshotUnit::~TMakeSnapshotUnit()
+{
+}
+
+bool TMakeSnapshotUnit::IsReadyToExecute(TOperation::TPtr op) const
+{
+ if (!op->IsWaitingForSnapshot())
+ return true;
+
+ return !op->InputSnapshots().empty();
+}
+
+EExecutionStatus TMakeSnapshotUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ auto &schemeTx = tx->GetSchemeTx();
+ if (!schemeTx.HasSendSnapshot())
+ return EExecutionStatus::Executed;
+
+ if (!op->IsWaitingForSnapshot()) {
ui64 tableId = schemeTx.GetSendSnapshot().GetTableId_Deprecated();
if (schemeTx.GetSendSnapshot().HasTableId()) {
Y_VERIFY(DataShard.GetPathOwnerId() == schemeTx.GetSendSnapshot().GetTableId().GetOwnerId());
tableId = schemeTx.GetSendSnapshot().GetTableId().GetTableId();
}
- Y_VERIFY(DataShard.GetUserTables().contains(tableId));
- ui32 localTableId = DataShard.GetUserTables().at(tableId)->LocalTid;
- TIntrusivePtr<TTableSnapshotContext> snapContext
+ Y_VERIFY(DataShard.GetUserTables().contains(tableId));
+ ui32 localTableId = DataShard.GetUserTables().at(tableId)->LocalTid;
+ TIntrusivePtr<TTableSnapshotContext> snapContext
= new TTxTableSnapshotContext(op->GetStep(), op->GetTxId(), {localTableId});
- txc.Env.MakeSnapshot(snapContext);
-
- op->SetWaitingForSnapshotFlag();
- return EExecutionStatus::Continue;
- }
-
- Y_VERIFY(!op->InputSnapshots().empty());
- op->ResetWaitingForSnapshotFlag();
-
- return EExecutionStatus::Executed;
-}
-
-void TMakeSnapshotUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ txc.Env.MakeSnapshot(snapContext);
+
+ op->SetWaitingForSnapshotFlag();
+ return EExecutionStatus::Continue;
+ }
+
+ Y_VERIFY(!op->InputSnapshots().empty());
+ op->ResetWaitingForSnapshotFlag();
+
+ return EExecutionStatus::Executed;
+}
+
+void TMakeSnapshotUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateMakeSnapshotUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TMakeSnapshotUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/operation.cpp b/ydb/core/tx/datashard/operation.cpp
index 0b0d19c3cec..37c14b9b982 100644
--- a/ydb/core/tx/datashard/operation.cpp
+++ b/ydb/core/tx/datashard/operation.cpp
@@ -1,81 +1,81 @@
-#include "operation.h"
-#include "key_conflicts.h"
-#include "datashard_impl.h"
-
-namespace NKikimr {
+#include "operation.h"
+#include "key_conflicts.h"
+#include "datashard_impl.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-namespace {
-void PrintDepTx(const TOperation *op,
- IOutputStream &os)
-{
- os << " " << op->GetTxId();
- if (op->IsWaitingDependencies())
- os << "(W)";
- if (op->IsExecuting())
- os << "(E)";
- if (op->IsCompleted())
- os << "(C)";
-}
-
-void PrintDeps(const TOperation *op,
- IOutputStream &os)
-{
- os << "OPERATION " << *op << " DEPS IN";
+
+namespace {
+void PrintDepTx(const TOperation *op,
+ IOutputStream &os)
+{
+ os << " " << op->GetTxId();
+ if (op->IsWaitingDependencies())
+ os << "(W)";
+ if (op->IsExecuting())
+ os << "(E)";
+ if (op->IsCompleted())
+ os << "(C)";
+}
+
+void PrintDeps(const TOperation *op,
+ IOutputStream &os)
+{
+ os << "OPERATION " << *op << " DEPS IN";
for (auto &dep: op->GetDependencies())
PrintDepTx(dep.Get(), os);
- os << " OUT";
+ os << " OUT";
for (auto &dep: op->GetDependents())
PrintDepTx(dep.Get(), os);
- os << Endl;
-}
-}
-
-void TBasicOpInfo::Serialize(NKikimrTxDataShard::TBasicOpInfo &info) const
-{
- info.SetTxId(TxId);
- info.SetStep(Step);
- info.SetKind(ToString(Kind));
- info.SetReceivedAt(ReceivedAt.GetValue());
- info.SetMinStep(MinStep);
- info.SetMaxStep(MaxStep);
- for (ui64 i = 1; i && i <= TTxFlags::LastFlag; i <<= 1) {
- if (HasFlag(static_cast<TTxFlags::Flags>(i)))
- info.AddFlags(ToString(static_cast<TTxFlags::Flags>(i)));
- }
-}
-
-NMiniKQL::IEngineFlat::TValidationInfo TOperation::EmptyKeysInfo;
-
-void TOperation::AddInReadSet(const NKikimrTx::TEvReadSet& rs)
-{
- AddInReadSet(TReadSetKey(rs), rs.GetBalanceTrackList(), rs.GetReadSet());
-}
-
-// Adjust incomplete readsets counter (track incapsulates logic required to handle merge/split of datashards)
-void TOperation::AddInReadSet(const TReadSetKey &rsKey,
- const NKikimrTx::TBalanceTrackList &btList,
- TString readSet)
-{
- auto it = CoverageBuilders().find(std::make_pair(rsKey.From, rsKey.To));
- if (it != CoverageBuilders().end()) {
- if (it->second->AddResult(btList)) {
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Filled readset for " << *this << " from=" << rsKey.From
- << " to=" << rsKey.To << "origin=" << rsKey.Origin);
- InReadSets()[it->first].emplace_back(TRSData(readSet, rsKey.Origin));
- if (it->second->IsComplete()) {
- Y_VERIFY(InputDataRef().RemainReadSets > 0, "RemainReadSets counter underflow");
- --InputDataRef().RemainReadSets;
- }
- }
- } else {
- LOG_NOTICE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "Discarded readset for " << *this << " from=" << rsKey.From
- << " to=" << rsKey.To << "origin=" << rsKey.Origin);
- }
-}
-
+ os << Endl;
+}
+}
+
+void TBasicOpInfo::Serialize(NKikimrTxDataShard::TBasicOpInfo &info) const
+{
+ info.SetTxId(TxId);
+ info.SetStep(Step);
+ info.SetKind(ToString(Kind));
+ info.SetReceivedAt(ReceivedAt.GetValue());
+ info.SetMinStep(MinStep);
+ info.SetMaxStep(MaxStep);
+ for (ui64 i = 1; i && i <= TTxFlags::LastFlag; i <<= 1) {
+ if (HasFlag(static_cast<TTxFlags::Flags>(i)))
+ info.AddFlags(ToString(static_cast<TTxFlags::Flags>(i)));
+ }
+}
+
+NMiniKQL::IEngineFlat::TValidationInfo TOperation::EmptyKeysInfo;
+
+void TOperation::AddInReadSet(const NKikimrTx::TEvReadSet& rs)
+{
+ AddInReadSet(TReadSetKey(rs), rs.GetBalanceTrackList(), rs.GetReadSet());
+}
+
+// Adjust incomplete readsets counter (track incapsulates logic required to handle merge/split of datashards)
+void TOperation::AddInReadSet(const TReadSetKey &rsKey,
+ const NKikimrTx::TBalanceTrackList &btList,
+ TString readSet)
+{
+ auto it = CoverageBuilders().find(std::make_pair(rsKey.From, rsKey.To));
+ if (it != CoverageBuilders().end()) {
+ if (it->second->AddResult(btList)) {
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Filled readset for " << *this << " from=" << rsKey.From
+ << " to=" << rsKey.To << "origin=" << rsKey.Origin);
+ InReadSets()[it->first].emplace_back(TRSData(readSet, rsKey.Origin));
+ if (it->second->IsComplete()) {
+ Y_VERIFY(InputDataRef().RemainReadSets > 0, "RemainReadSets counter underflow");
+ --InputDataRef().RemainReadSets;
+ }
+ }
+ } else {
+ LOG_NOTICE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "Discarded readset for " << *this << " from=" << rsKey.From
+ << " to=" << rsKey.To << "origin=" << rsKey.Origin);
+ }
+}
+
void TOperation::AddDependency(const TOperation::TPtr &op) {
Y_VERIFY(this != op.Get());
@@ -105,9 +105,9 @@ void TOperation::AddImmediateConflict(const TOperation::TPtr &op) {
if (ImmediateConflicts.insert(op).second) {
op->PlannedConflicts.insert(this);
- }
-}
-
+ }
+}
+
void TOperation::PromoteImmediateConflicts() {
for (auto& op : ImmediateConflicts) {
Y_VERIFY_DEBUG(op->PlannedConflicts.contains(this));
@@ -115,8 +115,8 @@ void TOperation::PromoteImmediateConflicts() {
op->AddDependency(this);
}
ImmediateConflicts.clear();
-}
-
+}
+
void TOperation::PromoteImmediateWriteConflicts() {
for (auto it = ImmediateConflicts.begin(); it != ImmediateConflicts.end();) {
auto& op = *it;
@@ -145,125 +145,125 @@ void TOperation::ClearDependencies() {
for (auto &op : Dependencies) {
Y_VERIFY_DEBUG(op->Dependents.contains(this));
op->Dependents.erase(this);
- }
- Dependencies.clear();
-}
-
+ }
+ Dependencies.clear();
+}
+
void TOperation::ClearSpecialDependents() {
for (auto &op : SpecialDependents) {
Y_VERIFY_DEBUG(op->SpecialDependencies.contains(this));
op->SpecialDependencies.erase(this);
- }
+ }
SpecialDependents.clear();
-}
-
+}
+
void TOperation::ClearSpecialDependencies() {
for (auto &op : SpecialDependencies) {
Y_VERIFY_DEBUG(op->SpecialDependents.contains(this));
op->SpecialDependents.erase(this);
}
SpecialDependencies.clear();
-}
-
+}
+
void TOperation::ClearPlannedConflicts() {
for (auto &op : PlannedConflicts) {
Y_VERIFY_DEBUG(op->ImmediateConflicts.contains(this));
op->ImmediateConflicts.erase(this);
- }
+ }
PlannedConflicts.clear();
-}
-
+}
+
void TOperation::ClearImmediateConflicts() {
for (auto &op : ImmediateConflicts) {
Y_VERIFY_DEBUG(op->PlannedConflicts.contains(this));
op->PlannedConflicts.erase(this);
}
ImmediateConflicts.clear();
-}
-
-TString TOperation::DumpDependencies() const
-{
- TStringStream ss;
- PrintDeps(this, ss);
- return ss.Str();
-}
-
-EExecutionUnitKind TOperation::GetCurrentUnit() const
-{
- if (IsExecutionPlanFinished())
- return EExecutionUnitKind::Unspecified;
- return ExecutionPlan[CurrentUnit];
-}
-
-const TVector<EExecutionUnitKind> &TOperation::GetExecutionPlan() const
-{
- return ExecutionPlan;
-}
-
-void TOperation::RewriteExecutionPlan(const TVector<EExecutionUnitKind> &plan)
-{
- if (IsExecutionPlanFinished())
- ExecutionProfile.StartUnitAt = AppData()->TimeProvider->Now();
- else
- ExecutionPlan.resize(CurrentUnit + 1);
- ExecutionPlan.insert(ExecutionPlan.end(), plan.begin(), plan.end());
-}
-
-void TOperation::RewriteExecutionPlan(EExecutionUnitKind unit)
-{
- if (IsExecutionPlanFinished())
- ExecutionProfile.StartUnitAt = AppData()->TimeProvider->Now();
- else
- ExecutionPlan.resize(CurrentUnit + 1);
- ExecutionPlan.push_back(unit);
-}
-
-bool TOperation::IsExecutionPlanFinished() const
-{
- return CurrentUnit >= ExecutionPlan.size();
-}
-
-void TOperation::AdvanceExecutionPlan()
-{
- TInstant now = AppData()->TimeProvider->Now();
- auto &profile = ExecutionProfile.UnitProfiles[ExecutionPlan[CurrentUnit]];
-
- profile.WaitTime = now - ExecutionProfile.StartUnitAt - profile.ExecuteTime
- - profile.CommitTime - profile.CompleteTime - profile.DelayedCommitTime;
-
- Y_VERIFY(!IsExecutionPlanFinished());
- ++CurrentUnit;
-
- ExecutionProfile.StartUnitAt = now;
-}
-
+}
+
+TString TOperation::DumpDependencies() const
+{
+ TStringStream ss;
+ PrintDeps(this, ss);
+ return ss.Str();
+}
+
+EExecutionUnitKind TOperation::GetCurrentUnit() const
+{
+ if (IsExecutionPlanFinished())
+ return EExecutionUnitKind::Unspecified;
+ return ExecutionPlan[CurrentUnit];
+}
+
+const TVector<EExecutionUnitKind> &TOperation::GetExecutionPlan() const
+{
+ return ExecutionPlan;
+}
+
+void TOperation::RewriteExecutionPlan(const TVector<EExecutionUnitKind> &plan)
+{
+ if (IsExecutionPlanFinished())
+ ExecutionProfile.StartUnitAt = AppData()->TimeProvider->Now();
+ else
+ ExecutionPlan.resize(CurrentUnit + 1);
+ ExecutionPlan.insert(ExecutionPlan.end(), plan.begin(), plan.end());
+}
+
+void TOperation::RewriteExecutionPlan(EExecutionUnitKind unit)
+{
+ if (IsExecutionPlanFinished())
+ ExecutionProfile.StartUnitAt = AppData()->TimeProvider->Now();
+ else
+ ExecutionPlan.resize(CurrentUnit + 1);
+ ExecutionPlan.push_back(unit);
+}
+
+bool TOperation::IsExecutionPlanFinished() const
+{
+ return CurrentUnit >= ExecutionPlan.size();
+}
+
+void TOperation::AdvanceExecutionPlan()
+{
+ TInstant now = AppData()->TimeProvider->Now();
+ auto &profile = ExecutionProfile.UnitProfiles[ExecutionPlan[CurrentUnit]];
+
+ profile.WaitTime = now - ExecutionProfile.StartUnitAt - profile.ExecuteTime
+ - profile.CommitTime - profile.CompleteTime - profile.DelayedCommitTime;
+
+ Y_VERIFY(!IsExecutionPlanFinished());
+ ++CurrentUnit;
+
+ ExecutionProfile.StartUnitAt = now;
+}
+
void TOperation::Abort()
{
SetAbortedFlag();
}
-void TOperation::Abort(EExecutionUnitKind unit)
-{
- SetAbortedFlag();
- RewriteExecutionPlan(unit);
-}
-
-TString TOperation::ExecutionProfileLogString(ui64 tabletId) const
-{
- TStringStream ss;
- ss << "Execution profile for slow op " << *this << " at " << tabletId
- << " (W - Wait, E - Execution, C - commit, CP - Complete):";
- for (auto &unit : ExecutionPlan) {
- if (ExecutionProfile.UnitProfiles.contains(unit)) {
- auto &profile = ExecutionProfile.UnitProfiles.at(unit);
- ss << " " << unit << " W:" << profile.WaitTime
- << " E:" << profile.ExecuteTime << " C:" << profile.CommitTime
- << " CP:" << profile.CompleteTime;
- }
- }
- return ss.Str();
-}
-
+void TOperation::Abort(EExecutionUnitKind unit)
+{
+ SetAbortedFlag();
+ RewriteExecutionPlan(unit);
+}
+
+TString TOperation::ExecutionProfileLogString(ui64 tabletId) const
+{
+ TStringStream ss;
+ ss << "Execution profile for slow op " << *this << " at " << tabletId
+ << " (W - Wait, E - Execution, C - commit, CP - Complete):";
+ for (auto &unit : ExecutionPlan) {
+ if (ExecutionProfile.UnitProfiles.contains(unit)) {
+ auto &profile = ExecutionProfile.UnitProfiles.at(unit);
+ ss << " " << unit << " W:" << profile.WaitTime
+ << " E:" << profile.ExecuteTime << " C:" << profile.CommitTime
+ << " CP:" << profile.CompleteTime;
+ }
+ }
+ return ss.Str();
+}
+
bool TOperation::HasRuntimeConflicts() const noexcept
{
// We may acquire some new dependencies at runtime
@@ -271,4 +271,4 @@ bool TOperation::HasRuntimeConflicts() const noexcept
}
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/operation.h b/ydb/core/tx/datashard/operation.h
index f5cd5c8313b..0f4b713e91c 100644
--- a/ydb/core/tx/datashard/operation.h
+++ b/ydb/core/tx/datashard/operation.h
@@ -1,87 +1,87 @@
-#pragma once
-
-#include "defs.h"
-#include "datashard.h"
-#include "datashard_locks.h"
-#include "datashard_outreadset.h"
+#pragma once
+
+#include "defs.h"
+#include "datashard.h"
+#include "datashard_locks.h"
+#include "datashard_outreadset.h"
#include "datashard_snapshots.h"
#include "change_exchange.h"
-#include "execution_unit_kind.h"
-
+#include "execution_unit_kind.h"
+
#include <ydb/core/engine/mkql_engine_flat.h>
#include <ydb/core/protos/tx_datashard.pb.h>
#include <ydb/core/tablet_flat/tablet_flat_executor.h>
#include <ydb/core/tx/balance_coverage/balance_coverage_builder.h>
#include <ydb/core/tx/tx_processing.h>
-
+
#include <library/cpp/containers/flat_hash/flat_hash.h>
-#include <util/generic/hash.h>
-#include <util/generic/ptr.h>
-#include <util/generic/queue.h>
-
-namespace NKikimr {
+#include <util/generic/hash.h>
+#include <util/generic/ptr.h>
+#include <util/generic/queue.h>
+
+namespace NKikimr {
namespace NDataShard {
-
-using NTabletFlatExecutor::TTableSnapshotContext;
-
+
+using NTabletFlatExecutor::TTableSnapshotContext;
+
class TDataShard;
-
-enum class ETxOrder {
- Unknown,
- Before,
- After,
- Any,
-};
-
+
+enum class ETxOrder {
+ Unknown,
+ Before,
+ After,
+ Any,
+};
+
enum class EMvccTxMode {
ReadOnly,
ReadWrite,
};
-struct TStepOrder {
- ui64 Step;
- ui64 TxId;
-
- TStepOrder(ui64 step, ui64 txId)
- : Step(step)
- , TxId(txId)
- {}
-
- bool operator == (const TStepOrder& s) const {
- return Step == s.Step && TxId == s.TxId;
- }
-
- bool operator != (const TStepOrder& s) const {
- return Step != s.Step || TxId != s.TxId;
- }
-
- bool operator < (const TStepOrder& s) const {
- if (Step == s.Step)
- return TxId < s.TxId;
- return Step < s.Step;
- }
-
- bool operator <= (const TStepOrder& s) const {
- return (*this) < s || (*this) == s;
- }
-
- ETxOrder CheckOrder(const TStepOrder& stepTxId) const {
- Y_VERIFY(*this != stepTxId); // avoid self checks
- if (!Step && !stepTxId.Step) // immediate vs immediate
- return ETxOrder::Any;
- if (!Step || !stepTxId.Step) // planned vs immediate
- return ETxOrder::Unknown;
- return (*this < stepTxId) ? ETxOrder::Before : ETxOrder::After;
- }
-
- std::pair<ui64, ui64> ToPair() const { return std::pair<ui64, ui64>(Step, TxId); }
+struct TStepOrder {
+ ui64 Step;
+ ui64 TxId;
+
+ TStepOrder(ui64 step, ui64 txId)
+ : Step(step)
+ , TxId(txId)
+ {}
+
+ bool operator == (const TStepOrder& s) const {
+ return Step == s.Step && TxId == s.TxId;
+ }
+
+ bool operator != (const TStepOrder& s) const {
+ return Step != s.Step || TxId != s.TxId;
+ }
+
+ bool operator < (const TStepOrder& s) const {
+ if (Step == s.Step)
+ return TxId < s.TxId;
+ return Step < s.Step;
+ }
+
+ bool operator <= (const TStepOrder& s) const {
+ return (*this) < s || (*this) == s;
+ }
+
+ ETxOrder CheckOrder(const TStepOrder& stepTxId) const {
+ Y_VERIFY(*this != stepTxId); // avoid self checks
+ if (!Step && !stepTxId.Step) // immediate vs immediate
+ return ETxOrder::Any;
+ if (!Step || !stepTxId.Step) // planned vs immediate
+ return ETxOrder::Unknown;
+ return (*this < stepTxId) ? ETxOrder::Before : ETxOrder::After;
+ }
+
+ std::pair<ui64, ui64> ToPair() const { return std::pair<ui64, ui64>(Step, TxId); }
TString ToString() const {
return TStringBuilder() << Step << ':' << TxId;
}
-};
-
+};
+
struct TOperationKey {
ui64 TableId;
TOwnedTableRange Key;
@@ -92,115 +92,115 @@ struct TOperationKey {
{ }
};
-enum class EOperationKind : ui32 {
- Unknown = 0,
-
- // Values [1, 100) are used to map NKikimrTxDataShard::ETransactionKind.
- DataTx = NKikimrTxDataShard::ETransactionKind::TX_KIND_DATA,
- SchemeTx = NKikimrTxDataShard::ETransactionKind::TX_KIND_SCHEME,
- ReadTable = NKikimrTxDataShard::ETransactionKind::TX_KIND_SCAN,
+enum class EOperationKind : ui32 {
+ Unknown = 0,
+
+ // Values [1, 100) are used to map NKikimrTxDataShard::ETransactionKind.
+ DataTx = NKikimrTxDataShard::ETransactionKind::TX_KIND_DATA,
+ SchemeTx = NKikimrTxDataShard::ETransactionKind::TX_KIND_SCHEME,
+ ReadTable = NKikimrTxDataShard::ETransactionKind::TX_KIND_SCAN,
Snapshot = NKikimrTxDataShard::ETransactionKind::TX_KIND_SNAPSHOT,
DistributedErase = NKikimrTxDataShard::ETransactionKind::TX_KIND_DISTRIBUTED_ERASE,
CommitWrites = NKikimrTxDataShard::ETransactionKind::TX_KIND_COMMIT_WRITES,
-
- // Values [100, inf) are used for internal kinds.
+
+ // Values [100, inf) are used for internal kinds.
DirectTx = 101,
-};
-
-class TBasicOpInfo {
-public:
- TBasicOpInfo()
- : Kind(EOperationKind::Unknown)
- , Flags(0)
- , TxId(0)
- , Step(0)
- , MinStep(0)
- , MaxStep(0)
+};
+
+class TBasicOpInfo {
+public:
+ TBasicOpInfo()
+ : Kind(EOperationKind::Unknown)
+ , Flags(0)
+ , TxId(0)
+ , Step(0)
+ , MinStep(0)
+ , MaxStep(0)
, TieBreakerIndex(0)
- {
- }
-
- TBasicOpInfo(ui64 txId,
- EOperationKind kind,
+ {
+ }
+
+ TBasicOpInfo(ui64 txId,
+ EOperationKind kind,
ui64 flags,
- ui64 maxStep,
+ ui64 maxStep,
TInstant receivedAt,
ui64 tieBreakerIndex)
- : Kind(kind)
- , Flags(flags)
- , TxId(txId)
- , Step(0)
- , ReceivedAt(receivedAt)
- , MinStep(0)
- , MaxStep(maxStep)
+ : Kind(kind)
+ , Flags(flags)
+ , TxId(txId)
+ , Step(0)
+ , ReceivedAt(receivedAt)
+ , MinStep(0)
+ , MaxStep(maxStep)
, TieBreakerIndex(tieBreakerIndex)
- {
- }
-
- TBasicOpInfo(const TBasicOpInfo &other) = default;
- TBasicOpInfo(TBasicOpInfo &&other) = default;
-
- TBasicOpInfo &operator=(const TBasicOpInfo &other) = default;
- TBasicOpInfo &operator=(TBasicOpInfo &&other) = default;
-
- ////////////////////////////
- // OPERATION KIND //
- ////////////////////////////
- EOperationKind GetKind() const { return Kind; }
-
- bool IsDataTx() const { return Kind == EOperationKind::DataTx; }
+ {
+ }
+
+ TBasicOpInfo(const TBasicOpInfo &other) = default;
+ TBasicOpInfo(TBasicOpInfo &&other) = default;
+
+ TBasicOpInfo &operator=(const TBasicOpInfo &other) = default;
+ TBasicOpInfo &operator=(TBasicOpInfo &&other) = default;
+
+ ////////////////////////////
+ // OPERATION KIND //
+ ////////////////////////////
+ EOperationKind GetKind() const { return Kind; }
+
+ bool IsDataTx() const { return Kind == EOperationKind::DataTx; }
bool IsDirectTx() const { return Kind == EOperationKind::DirectTx; }
- bool IsSchemeTx() const { return Kind == EOperationKind::SchemeTx; }
- bool IsReadTable() const { return Kind == EOperationKind::ReadTable; }
+ bool IsSchemeTx() const { return Kind == EOperationKind::SchemeTx; }
+ bool IsReadTable() const { return Kind == EOperationKind::ReadTable; }
bool IsSnapshotTx() const { return Kind == EOperationKind::Snapshot; }
bool IsDistributedEraseTx() const { return Kind == EOperationKind::DistributedErase; }
bool IsCommitWritesTx() const { return Kind == EOperationKind::CommitWrites; }
- bool Exists() const { return Kind != EOperationKind::Unknown; }
-
- /////////////////////////////
- // OPERATION FLAGS //
- /////////////////////////////
- ui64 GetFlags() const { return Flags; }
-
- bool HasFlag(ui64 flag) const { return Flags & flag; }
- void SetFlag(ui64 flag, bool val = true)
- {
- if (val)
- Flags |= flag;
- else
- Flags &= ~flag;
- }
- void ResetFlag(ui64 flag) { SetFlag(flag, false); }
-
- bool HasDirtyFlag() const { return HasFlag(TTxFlags::Dirty); }
- void SetDirtyFlag(bool val = true) { SetFlag(TTxFlags::Dirty, val); }
- void ResetDirtyFlag() { ResetFlag(TTxFlags::Dirty); }
-
- bool HasForceDirtyFlag() const { return HasFlag(TTxFlags::ForceDirty); }
- void SetForceDirtyFlag(bool val = true) { SetFlag(TTxFlags::ForceDirty, val); }
- void ResetForceDirtyFlag() { ResetFlag(TTxFlags::ForceDirty); }
-
- bool IsDirty() const { return HasDirtyFlag() || HasForceDirtyFlag(); }
-
- bool HasDenyOnlineIfSnapshotNotReadyFlag() const { return HasFlag(TTxFlags::DenyOnlineIfSnapshotNotReady); }
- void SetDenyOnlineIfSnapshotNotReadyFlag(bool val = true) { SetFlag(TTxFlags::DenyOnlineIfSnapshotNotReady, val); }
- void ResetDenyOnlineIfSnapshotNotReadyFlag() { ResetFlag(TTxFlags::DenyOnlineIfSnapshotNotReady); }
-
- bool HasForceOnlineFlag() const { return HasFlag(TTxFlags::ForceOnline); }
- void SetForceOnlineFlag(bool val = true) { SetFlag(TTxFlags::ForceOnline, val); }
- void ResetForceOnlineFlag() { ResetFlag(TTxFlags::ForceOnline); }
-
- bool HasImmediateFlag() const { return HasFlag(TTxFlags::Immediate); }
- void SetImmediateFlag(bool val = true) { SetFlag(TTxFlags::Immediate, val); }
- void ResetImmediateFlag() { ResetFlag(TTxFlags::Immediate); }
-
- bool IsImmediate() const { return HasImmediateFlag() && !HasForceOnlineFlag(); }
-
- bool HasInProgressFlag() const { return HasFlag(TTxFlags::InProgress); }
- void SetInProgressFlag(bool val = true) { SetFlag(TTxFlags::InProgress, val); }
- void ResetInProgressFlag() { ResetFlag(TTxFlags::InProgress); }
-
- bool IsInProgress() const { return HasInProgressFlag(); }
+ bool Exists() const { return Kind != EOperationKind::Unknown; }
+
+ /////////////////////////////
+ // OPERATION FLAGS //
+ /////////////////////////////
+ ui64 GetFlags() const { return Flags; }
+
+ bool HasFlag(ui64 flag) const { return Flags & flag; }
+ void SetFlag(ui64 flag, bool val = true)
+ {
+ if (val)
+ Flags |= flag;
+ else
+ Flags &= ~flag;
+ }
+ void ResetFlag(ui64 flag) { SetFlag(flag, false); }
+
+ bool HasDirtyFlag() const { return HasFlag(TTxFlags::Dirty); }
+ void SetDirtyFlag(bool val = true) { SetFlag(TTxFlags::Dirty, val); }
+ void ResetDirtyFlag() { ResetFlag(TTxFlags::Dirty); }
+
+ bool HasForceDirtyFlag() const { return HasFlag(TTxFlags::ForceDirty); }
+ void SetForceDirtyFlag(bool val = true) { SetFlag(TTxFlags::ForceDirty, val); }
+ void ResetForceDirtyFlag() { ResetFlag(TTxFlags::ForceDirty); }
+
+ bool IsDirty() const { return HasDirtyFlag() || HasForceDirtyFlag(); }
+
+ bool HasDenyOnlineIfSnapshotNotReadyFlag() const { return HasFlag(TTxFlags::DenyOnlineIfSnapshotNotReady); }
+ void SetDenyOnlineIfSnapshotNotReadyFlag(bool val = true) { SetFlag(TTxFlags::DenyOnlineIfSnapshotNotReady, val); }
+ void ResetDenyOnlineIfSnapshotNotReadyFlag() { ResetFlag(TTxFlags::DenyOnlineIfSnapshotNotReady); }
+
+ bool HasForceOnlineFlag() const { return HasFlag(TTxFlags::ForceOnline); }
+ void SetForceOnlineFlag(bool val = true) { SetFlag(TTxFlags::ForceOnline, val); }
+ void ResetForceOnlineFlag() { ResetFlag(TTxFlags::ForceOnline); }
+
+ bool HasImmediateFlag() const { return HasFlag(TTxFlags::Immediate); }
+ void SetImmediateFlag(bool val = true) { SetFlag(TTxFlags::Immediate, val); }
+ void ResetImmediateFlag() { ResetFlag(TTxFlags::Immediate); }
+
+ bool IsImmediate() const { return HasImmediateFlag() && !HasForceOnlineFlag(); }
+
+ bool HasInProgressFlag() const { return HasFlag(TTxFlags::InProgress); }
+ void SetInProgressFlag(bool val = true) { SetFlag(TTxFlags::InProgress, val); }
+ void ResetInProgressFlag() { ResetFlag(TTxFlags::InProgress); }
+
+ bool IsInProgress() const { return HasInProgressFlag(); }
void IncrementInProgress() {
if (0 == InProgressCount++) {
SetInProgressFlag();
@@ -211,120 +211,120 @@ public:
ResetInProgressFlag();
}
}
-
- bool HasCompletedFlag() const { return HasFlag(TTxFlags::Completed); }
- void SetCompletedFlag(bool val = true) { SetFlag(TTxFlags::Completed, val); }
- void ResetCompletedFlag() { ResetFlag(TTxFlags::Completed); }
-
- bool IsCompleted() const { return HasCompletedFlag(); }
-
- bool HasInterruptedFlag() const { return HasFlag(TTxFlags::Interrupted); }
- void SetInterruptedFlag(bool val = true) { SetFlag(TTxFlags::Interrupted, val); }
- void ResetInterruptedFlag() { ResetFlag(TTxFlags::Interrupted); }
-
- bool IsInterrupted() const { return HasInterruptedFlag(); }
-
- bool HasAbortedFlag() const { return HasFlag(TTxFlags::Aborted); }
- void SetAbortedFlag(bool val = true) { SetFlag(TTxFlags::Aborted, val); }
- void ResetAbortedFlag() { ResetFlag(TTxFlags::Aborted); }
-
- bool IsAborted() const { return HasAbortedFlag(); }
-
- bool HasReadOnlyFlag() const { return HasFlag(TTxFlags::ReadOnly); }
- void SetReadOnlyFlag(bool val = true)
- {
- Y_VERIFY(!val || !IsGlobalWriter());
- SetFlag(TTxFlags::ReadOnly, val);
- }
- void ResetReadOnlyFlag() { ResetFlag(TTxFlags::ReadOnly); }
-
- bool IsReadOnly() const { return HasReadOnlyFlag(); }
-
- bool HasProposeBlockerFlag() const { return HasFlag(TTxFlags::ProposeBlocker); }
- void SetProposeBlockerFlag(bool val = true) { SetFlag(TTxFlags::ProposeBlocker, val); }
- void ResetProposeBlockerFlag() { ResetFlag(TTxFlags::ProposeBlocker); }
-
- bool IsProposeBlocker() const { return HasProposeBlockerFlag(); }
-
- bool HasNeedDiagnosticsFlag() const { return HasFlag(TTxFlags::NeedDiagnostics); }
- void SetNeedDiagnosticsFlag(bool val = true) { SetFlag(TTxFlags::NeedDiagnostics, val); }
- void ResetNeedDiagnosticsFlag() { ResetFlag(TTxFlags::NeedDiagnostics); }
-
- bool HasGlobalReaderFlag() const { return HasFlag(TTxFlags::GlobalReader); }
- void SetGlobalReaderFlag(bool val = true) { SetFlag(TTxFlags::GlobalReader, val); }
- void ResetGlobalReaderFlag() { ResetFlag(TTxFlags::GlobalReader); }
-
- bool IsGlobalReader() const { return HasGlobalReaderFlag(); }
-
- bool HasGlobalWriterFlag() const { return HasFlag(TTxFlags::GlobalWriter); }
- void SetGlobalWriterFlag(bool val = true) {
- Y_VERIFY(!val || !IsReadOnly());
- SetFlag(TTxFlags::GlobalWriter, val);
- }
- void ResetGlobalWriterFlag() { ResetFlag(TTxFlags::GlobalWriter); }
-
- bool IsGlobalWriter() const { return HasGlobalWriterFlag(); }
-
- bool HasWaitingDependenciesFlag() const { return HasFlag(TTxFlags::WaitingDependencies); }
- void SetWaitingDependenciesFlag(bool val = true) { SetFlag(TTxFlags::WaitingDependencies, val); }
- void ResetWaitingDependenciesFlag() { ResetFlag(TTxFlags::WaitingDependencies); }
-
- bool IsWaitingDependencies() const { return HasWaitingDependenciesFlag(); }
-
- bool HasExecutingFlag() const { return HasFlag(TTxFlags::Executing); }
- void SetExecutingFlag(bool val = true) { SetFlag(TTxFlags::Executing, val); }
- void ResetExecutingFlag() { ResetFlag(TTxFlags::Executing); }
-
- bool IsExecuting() const { return HasExecutingFlag(); }
-
- bool HasUsingSnapshotFlag() const { return HasFlag(TTxFlags::UsingSnapshot); }
- void SetUsingSnapshotFlag(bool val = true) { SetFlag(TTxFlags::UsingSnapshot, val); }
- void ResetUsingSnapshotFlag() { ResetFlag(TTxFlags::UsingSnapshot); }
-
- bool IsUsingSnapshot() const { return HasUsingSnapshotFlag(); }
-
- bool HasKqpDataTransactionFlag() const { return HasFlag(TTxFlags::KqpDataTransaction); }
- void SetKqpDataTransactionFlag(bool val = true) { SetFlag(TTxFlags::KqpDataTransaction, val); }
- void ResetKqpDataTransactionFlag() { ResetFlag(TTxFlags::KqpDataTransaction); }
- bool IsKqpDataTransaction() const { return HasKqpDataTransactionFlag(); }
-
- bool HasKqpAttachedRSFlag() const { return HasFlag(TTxFlags::KqpAttachedRS); }
- void SetKqpAttachedRSFlag(bool val = true) { SetFlag(TTxFlags::KqpAttachedRS, val); }
- void ResetKqpAttachedRSFlag() { ResetFlag(TTxFlags::KqpAttachedRS); }
-
- bool HasLoadedInRSFlag() const { return HasFlag(TTxFlags::LoadedInRS); }
- void SetLoadedInRSFlag(bool val = true) { SetFlag(TTxFlags::LoadedInRS, val); }
- void ResetLoadedInRSFlag() { ResetFlag(TTxFlags::LoadedInRS); }
-
+
+ bool HasCompletedFlag() const { return HasFlag(TTxFlags::Completed); }
+ void SetCompletedFlag(bool val = true) { SetFlag(TTxFlags::Completed, val); }
+ void ResetCompletedFlag() { ResetFlag(TTxFlags::Completed); }
+
+ bool IsCompleted() const { return HasCompletedFlag(); }
+
+ bool HasInterruptedFlag() const { return HasFlag(TTxFlags::Interrupted); }
+ void SetInterruptedFlag(bool val = true) { SetFlag(TTxFlags::Interrupted, val); }
+ void ResetInterruptedFlag() { ResetFlag(TTxFlags::Interrupted); }
+
+ bool IsInterrupted() const { return HasInterruptedFlag(); }
+
+ bool HasAbortedFlag() const { return HasFlag(TTxFlags::Aborted); }
+ void SetAbortedFlag(bool val = true) { SetFlag(TTxFlags::Aborted, val); }
+ void ResetAbortedFlag() { ResetFlag(TTxFlags::Aborted); }
+
+ bool IsAborted() const { return HasAbortedFlag(); }
+
+ bool HasReadOnlyFlag() const { return HasFlag(TTxFlags::ReadOnly); }
+ void SetReadOnlyFlag(bool val = true)
+ {
+ Y_VERIFY(!val || !IsGlobalWriter());
+ SetFlag(TTxFlags::ReadOnly, val);
+ }
+ void ResetReadOnlyFlag() { ResetFlag(TTxFlags::ReadOnly); }
+
+ bool IsReadOnly() const { return HasReadOnlyFlag(); }
+
+ bool HasProposeBlockerFlag() const { return HasFlag(TTxFlags::ProposeBlocker); }
+ void SetProposeBlockerFlag(bool val = true) { SetFlag(TTxFlags::ProposeBlocker, val); }
+ void ResetProposeBlockerFlag() { ResetFlag(TTxFlags::ProposeBlocker); }
+
+ bool IsProposeBlocker() const { return HasProposeBlockerFlag(); }
+
+ bool HasNeedDiagnosticsFlag() const { return HasFlag(TTxFlags::NeedDiagnostics); }
+ void SetNeedDiagnosticsFlag(bool val = true) { SetFlag(TTxFlags::NeedDiagnostics, val); }
+ void ResetNeedDiagnosticsFlag() { ResetFlag(TTxFlags::NeedDiagnostics); }
+
+ bool HasGlobalReaderFlag() const { return HasFlag(TTxFlags::GlobalReader); }
+ void SetGlobalReaderFlag(bool val = true) { SetFlag(TTxFlags::GlobalReader, val); }
+ void ResetGlobalReaderFlag() { ResetFlag(TTxFlags::GlobalReader); }
+
+ bool IsGlobalReader() const { return HasGlobalReaderFlag(); }
+
+ bool HasGlobalWriterFlag() const { return HasFlag(TTxFlags::GlobalWriter); }
+ void SetGlobalWriterFlag(bool val = true) {
+ Y_VERIFY(!val || !IsReadOnly());
+ SetFlag(TTxFlags::GlobalWriter, val);
+ }
+ void ResetGlobalWriterFlag() { ResetFlag(TTxFlags::GlobalWriter); }
+
+ bool IsGlobalWriter() const { return HasGlobalWriterFlag(); }
+
+ bool HasWaitingDependenciesFlag() const { return HasFlag(TTxFlags::WaitingDependencies); }
+ void SetWaitingDependenciesFlag(bool val = true) { SetFlag(TTxFlags::WaitingDependencies, val); }
+ void ResetWaitingDependenciesFlag() { ResetFlag(TTxFlags::WaitingDependencies); }
+
+ bool IsWaitingDependencies() const { return HasWaitingDependenciesFlag(); }
+
+ bool HasExecutingFlag() const { return HasFlag(TTxFlags::Executing); }
+ void SetExecutingFlag(bool val = true) { SetFlag(TTxFlags::Executing, val); }
+ void ResetExecutingFlag() { ResetFlag(TTxFlags::Executing); }
+
+ bool IsExecuting() const { return HasExecutingFlag(); }
+
+ bool HasUsingSnapshotFlag() const { return HasFlag(TTxFlags::UsingSnapshot); }
+ void SetUsingSnapshotFlag(bool val = true) { SetFlag(TTxFlags::UsingSnapshot, val); }
+ void ResetUsingSnapshotFlag() { ResetFlag(TTxFlags::UsingSnapshot); }
+
+ bool IsUsingSnapshot() const { return HasUsingSnapshotFlag(); }
+
+ bool HasKqpDataTransactionFlag() const { return HasFlag(TTxFlags::KqpDataTransaction); }
+ void SetKqpDataTransactionFlag(bool val = true) { SetFlag(TTxFlags::KqpDataTransaction, val); }
+ void ResetKqpDataTransactionFlag() { ResetFlag(TTxFlags::KqpDataTransaction); }
+ bool IsKqpDataTransaction() const { return HasKqpDataTransactionFlag(); }
+
+ bool HasKqpAttachedRSFlag() const { return HasFlag(TTxFlags::KqpAttachedRS); }
+ void SetKqpAttachedRSFlag(bool val = true) { SetFlag(TTxFlags::KqpAttachedRS, val); }
+ void ResetKqpAttachedRSFlag() { ResetFlag(TTxFlags::KqpAttachedRS); }
+
+ bool HasLoadedInRSFlag() const { return HasFlag(TTxFlags::LoadedInRS); }
+ void SetLoadedInRSFlag(bool val = true) { SetFlag(TTxFlags::LoadedInRS, val); }
+ void ResetLoadedInRSFlag() { ResetFlag(TTxFlags::LoadedInRS); }
+
bool HasKqpScanTransactionFlag() const { return HasFlag(TTxFlags::KqpScanTransaction); }
void SetKqpScanTransactionFlag(bool val = true) { SetFlag(TTxFlags::KqpScanTransaction, val); }
void ResetKqpScanTransactionFlag() { ResetFlag(TTxFlags::KqpScanTransaction); }
bool IsKqpScanTransaction() const { return HasKqpScanTransactionFlag(); }
-
- bool HasWaitingForStreamClearanceFlag() const { return HasFlag(TTxFlags::WaitingForStreamClearance); }
- void SetWaitingForStreamClearanceFlag(bool val = true) { SetFlag(TTxFlags::WaitingForStreamClearance, val); }
- void ResetWaitingForStreamClearanceFlag() { ResetFlag(TTxFlags::WaitingForStreamClearance); }
- bool IsWaitingForStreamClearance() const { return HasWaitingForStreamClearanceFlag(); }
-
- bool HasProcessDisconnectsFlag() const { return HasFlag(TTxFlags::ProcessDisconnects); }
- void SetProcessDisconnectsFlag(bool val = true) { SetFlag(TTxFlags::ProcessDisconnects, val); }
- void ResetProcessDisconnectsFlag() { ResetFlag(TTxFlags::ProcessDisconnects); }
-
- bool HasWaitingForScanFlag() const { return HasFlag(TTxFlags::WaitingForScan); }
- void SetWaitingForScanFlag(bool val = true) { SetFlag(TTxFlags::WaitingForScan, val); }
- void ResetWaitingForScanFlag() { ResetFlag(TTxFlags::WaitingForScan); }
- bool IsWaitingForScan() const { return HasWaitingForScanFlag(); }
-
+
+ bool HasWaitingForStreamClearanceFlag() const { return HasFlag(TTxFlags::WaitingForStreamClearance); }
+ void SetWaitingForStreamClearanceFlag(bool val = true) { SetFlag(TTxFlags::WaitingForStreamClearance, val); }
+ void ResetWaitingForStreamClearanceFlag() { ResetFlag(TTxFlags::WaitingForStreamClearance); }
+ bool IsWaitingForStreamClearance() const { return HasWaitingForStreamClearanceFlag(); }
+
+ bool HasProcessDisconnectsFlag() const { return HasFlag(TTxFlags::ProcessDisconnects); }
+ void SetProcessDisconnectsFlag(bool val = true) { SetFlag(TTxFlags::ProcessDisconnects, val); }
+ void ResetProcessDisconnectsFlag() { ResetFlag(TTxFlags::ProcessDisconnects); }
+
+ bool HasWaitingForScanFlag() const { return HasFlag(TTxFlags::WaitingForScan); }
+ void SetWaitingForScanFlag(bool val = true) { SetFlag(TTxFlags::WaitingForScan, val); }
+ void ResetWaitingForScanFlag() { ResetFlag(TTxFlags::WaitingForScan); }
+ bool IsWaitingForScan() const { return HasWaitingForScanFlag(); }
+
bool HasWaitingForAsyncJobFlag() const { return HasFlag(TTxFlags::WaitingForAsyncJob); }
void SetWaitingForAsyncJobFlag(bool val = true) { SetFlag(TTxFlags::WaitingForAsyncJob, val); }
void ResetWaitingForAsyncJobFlag() { ResetFlag(TTxFlags::WaitingForAsyncJob); }
bool IsWaitingForAsyncJob() const { return HasWaitingForAsyncJobFlag(); }
- bool HasWaitingForSnapshotFlag() const { return HasFlag(TTxFlags::WaitingForSnapshot); }
- void SetWaitingForSnapshotFlag(bool val = true) { SetFlag(TTxFlags::WaitingForSnapshot, val); }
- void ResetWaitingForSnapshotFlag() { ResetFlag(TTxFlags::WaitingForSnapshot); }
- bool IsWaitingForSnapshot() const { return HasWaitingForSnapshotFlag(); }
-
+ bool HasWaitingForSnapshotFlag() const { return HasFlag(TTxFlags::WaitingForSnapshot); }
+ void SetWaitingForSnapshotFlag(bool val = true) { SetFlag(TTxFlags::WaitingForSnapshot, val); }
+ void ResetWaitingForSnapshotFlag() { ResetFlag(TTxFlags::WaitingForSnapshot); }
+ bool IsWaitingForSnapshot() const { return HasWaitingForSnapshotFlag(); }
+
bool HasResultSentFlag() const { return HasFlag(TTxFlags::ResultSent); }
void SetResultSentFlag(bool val = true) { SetFlag(TTxFlags::ResultSent, val); }
@@ -334,26 +334,26 @@ public:
bool HasWaitCompletionFlag() const { return HasFlag(TTxFlags::WaitCompletion); }
void SetWaitCompletionFlag(bool val = true) { SetFlag(TTxFlags::WaitCompletion, val); }
- ///////////////////////////////////
- // OPERATION ID AND PLAN //
- ///////////////////////////////////
- ui64 GetTxId() const { return TxId; }
-
- ui64 GetStep() const { return Step; }
- void SetStep(ui64 step) { Step = step; }
-
- TStepOrder GetStepOrder() const { return TStepOrder(GetStep(), GetTxId()); }
-
- ui64 GetMinStep() const { return MinStep; }
- void SetMinStep(ui64 step) { MinStep = step; }
-
- ui64 GetMaxStep() const { return MaxStep; }
- void SetMaxStep(ui64 step) { MaxStep = step; }
-
+ ///////////////////////////////////
+ // OPERATION ID AND PLAN //
+ ///////////////////////////////////
+ ui64 GetTxId() const { return TxId; }
+
+ ui64 GetStep() const { return Step; }
+ void SetStep(ui64 step) { Step = step; }
+
+ TStepOrder GetStepOrder() const { return TStepOrder(GetStep(), GetTxId()); }
+
+ ui64 GetMinStep() const { return MinStep; }
+ void SetMinStep(ui64 step) { MinStep = step; }
+
+ ui64 GetMaxStep() const { return MaxStep; }
+ void SetMaxStep(ui64 step) { MaxStep = step; }
+
ui64 GetTieBreakerIndex() const { return TieBreakerIndex; }
- TInstant GetReceivedAt() const { return ReceivedAt; }
-
+ TInstant GetReceivedAt() const { return ReceivedAt; }
+
bool HasAcquiredSnapshotKey() const { return HasFlag(TTxFlags::AcquiredSnapshotReference); }
const TSnapshotKey& GetAcquiredSnapshotKey() const { return AcquiredSnapshotKey; }
@@ -374,99 +374,99 @@ public:
MvccSnapshotRepeatable = isRepeatable;
}
- ///////////////////////////////////
- // DEBUG AND MONITORING //
- ///////////////////////////////////
- void Serialize(NKikimrTxDataShard::TBasicOpInfo &info) const;
-
-protected:
- EOperationKind Kind;
- // See TTxFlags.
- ui64 Flags;
- ui64 TxId;
- ui64 Step;
- TInstant ReceivedAt;
-
- ui64 MinStep;
- ui64 MaxStep;
+ ///////////////////////////////////
+ // DEBUG AND MONITORING //
+ ///////////////////////////////////
+ void Serialize(NKikimrTxDataShard::TBasicOpInfo &info) const;
+
+protected:
+ EOperationKind Kind;
+ // See TTxFlags.
+ ui64 Flags;
+ ui64 TxId;
+ ui64 Step;
+ TInstant ReceivedAt;
+
+ ui64 MinStep;
+ ui64 MaxStep;
ui64 TieBreakerIndex;
ui64 InProgressCount = 0;
TSnapshotKey AcquiredSnapshotKey;
TRowVersion MvccSnapshot = TRowVersion::Max();
bool MvccSnapshotRepeatable = false;
-};
-
-struct TRSData {
- TString Body;
- ui64 Origin = 0;
-
- explicit TRSData(const TString &body = TString(),
- ui64 origin = 0)
- : Body(body)
- , Origin(origin)
- {}
-};
-
-struct TInputOpData {
- using TEventsQueue = TQueue<TAutoPtr<IEventHandle>>;
- using TSnapshots = TVector<TIntrusivePtr<TTableSnapshotContext>>;
- using TInReadSets = TMap<std::pair<ui64, ui64>, TVector<TRSData>>;
- using TCoverageBuilders = TMap<std::pair<ui64, ui64>, std::shared_ptr<TBalanceCoverageBuilder>>;
-
- TInputOpData()
- : RemainReadSets(0)
- {
- }
-
- TEventsQueue Events;
- TSnapshots Snapshots;
- TLocksCache LocksCache;
- // Input read sets processing.
- TInReadSets InReadSets;
- TVector<NKikimrTx::TEvReadSet> DelayedInReadSets;
- TCoverageBuilders CoverageBuilders;
- ui32 RemainReadSets;
+};
+
+struct TRSData {
+ TString Body;
+ ui64 Origin = 0;
+
+ explicit TRSData(const TString &body = TString(),
+ ui64 origin = 0)
+ : Body(body)
+ , Origin(origin)
+ {}
+};
+
+struct TInputOpData {
+ using TEventsQueue = TQueue<TAutoPtr<IEventHandle>>;
+ using TSnapshots = TVector<TIntrusivePtr<TTableSnapshotContext>>;
+ using TInReadSets = TMap<std::pair<ui64, ui64>, TVector<TRSData>>;
+ using TCoverageBuilders = TMap<std::pair<ui64, ui64>, std::shared_ptr<TBalanceCoverageBuilder>>;
+
+ TInputOpData()
+ : RemainReadSets(0)
+ {
+ }
+
+ TEventsQueue Events;
+ TSnapshots Snapshots;
+ TLocksCache LocksCache;
+ // Input read sets processing.
+ TInReadSets InReadSets;
+ TVector<NKikimrTx::TEvReadSet> DelayedInReadSets;
+ TCoverageBuilders CoverageBuilders;
+ ui32 RemainReadSets;
TAutoPtr<IDestructable> ScanResult;
TAutoPtr<IDestructable> AsyncJobResult;
-};
-
-struct TOutputOpData {
- using TResultPtr = THolder<TEvDataShard::TEvProposeTransactionResult>;
- using TDelayedAcks = TVector<THolder<IEventHandle>>;
- using TOutReadSets = TMap<std::pair<ui64, ui64>, TString>; // source:target -> body
+};
+
+struct TOutputOpData {
+ using TResultPtr = THolder<TEvDataShard::TEvProposeTransactionResult>;
+ using TDelayedAcks = TVector<THolder<IEventHandle>>;
+ using TOutReadSets = TMap<std::pair<ui64, ui64>, TString>; // source:target -> body
using TChangeRecord = TEvChangeExchange::TEvEnqueueRecords::TRecordInfo;
-
- TResultPtr Result;
- // ACKs to send on successful operation completion.
- TDelayedAcks DelayedAcks;
- TOutReadSets OutReadSets;
- TVector<THolder<TEvTxProcessing::TEvReadSet>> PreparedOutReadSets;
- // Updates and checked locks.
- TLocksUpdate LocksUpdate;
- TLocksCache LocksAccessLog;
+
+ TResultPtr Result;
+ // ACKs to send on successful operation completion.
+ TDelayedAcks DelayedAcks;
+ TOutReadSets OutReadSets;
+ TVector<THolder<TEvTxProcessing::TEvReadSet>> PreparedOutReadSets;
+ // Updates and checked locks.
+ TLocksUpdate LocksUpdate;
+ TLocksCache LocksAccessLog;
// Collected change records
TVector<TChangeRecord> ChangeRecords;
-};
-
-struct TExecutionProfile {
- struct TUnitProfile {
- TDuration WaitTime;
- TDuration ExecuteTime;
- TDuration CommitTime;
- TDuration CompleteTime;
- // Time spent in unit waiting for previous unit commit
- // (which returned DelayComplete).
- TDuration DelayedCommitTime;
- ui32 ExecuteCount;
- };
-
- TInstant StartExecutionAt;
- TInstant CompletedAt;
- TInstant StartUnitAt;
- THashMap<EExecutionUnitKind, TUnitProfile> UnitProfiles;
-};
-
+};
+
+struct TExecutionProfile {
+ struct TUnitProfile {
+ TDuration WaitTime;
+ TDuration ExecuteTime;
+ TDuration CommitTime;
+ TDuration CompleteTime;
+ // Time spent in unit waiting for previous unit commit
+ // (which returned DelayComplete).
+ TDuration DelayedCommitTime;
+ ui32 ExecuteCount;
+ };
+
+ TInstant StartExecutionAt;
+ TInstant CompletedAt;
+ TInstant StartUnitAt;
+ THashMap<EExecutionUnitKind, TUnitProfile> UnitProfiles;
+};
+
class TOperationAllListItem : public TIntrusiveListItem<TOperationAllListItem> {};
class TOperationGlobalListItem : public TIntrusiveListItem<TOperationGlobalListItem> {};
class TOperationDelayedReadListItem : public TIntrusiveListItem<TOperationDelayedReadListItem> {};
@@ -480,40 +480,40 @@ class TOperation
, public TOperationDelayedReadListItem
, public TOperationDelayedWriteListItem
{
-public:
- enum EDepFlag {
- // Two operations might use the same key(s) and
- // at least on of them use it for write. This is
- // symmetrical relation. We don't split it into
- // RAW, WAW and WAR dependencies. It leads to
- // less accurate dependencies info and therefore
- // to lost out-of-order opportunities but it also
- // reduces the analysis cost (can stop analysis
- // after the first conflict).
- DF_DATA = 1 << 0,
- // Dependent operation has higher plan step.
- DF_PLAN_STEP = 1 << 1,
- // Src modifies scheme used by Dst.
- DF_SCHEME = 1 << 2,
- // Dependent operation cannot be proposed.
- DF_BLOCK_PROPOSE = 1 << 3,
- // Dependent operation cannot be executed.
- DF_BLOCK_EXECUTE = 1 << 4,
- };
-
- using TPtr = TIntrusivePtr<TOperation>;
- using EResultStatus = NKikimrTxDataShard::TEvProposeTransactionResult::EStatus;
-
- ~TOperation()
- {
- }
-
+public:
+ enum EDepFlag {
+ // Two operations might use the same key(s) and
+ // at least on of them use it for write. This is
+ // symmetrical relation. We don't split it into
+ // RAW, WAW and WAR dependencies. It leads to
+ // less accurate dependencies info and therefore
+ // to lost out-of-order opportunities but it also
+ // reduces the analysis cost (can stop analysis
+ // after the first conflict).
+ DF_DATA = 1 << 0,
+ // Dependent operation has higher plan step.
+ DF_PLAN_STEP = 1 << 1,
+ // Src modifies scheme used by Dst.
+ DF_SCHEME = 1 << 2,
+ // Dependent operation cannot be proposed.
+ DF_BLOCK_PROPOSE = 1 << 3,
+ // Dependent operation cannot be executed.
+ DF_BLOCK_EXECUTE = 1 << 4,
+ };
+
+ using TPtr = TIntrusivePtr<TOperation>;
+ using EResultStatus = NKikimrTxDataShard::TEvProposeTransactionResult::EStatus;
+
+ ~TOperation()
+ {
+ }
+
TActorId GetTarget() const { return Target; }
void SetTarget(TActorId target) { Target = target; }
-
- ui64 GetCookie() const { return Cookie; }
- void SetCookie(ui64 cookie) { Cookie = cookie; }
-
+
+ ui64 GetCookie() const { return Cookie; }
+ void SetCookie(ui64 cookie) { Cookie = cookie; }
+
public:
static TOperation* From(TOperationAllListItem* item) { return static_cast<TOperation*>(item); }
static TOperation* From(TOperationGlobalListItem* item) { return static_cast<TOperation*>(item); }
@@ -543,83 +543,83 @@ public:
}
public:
- ////////////////////////////////////////
- // INPUT DATA //
- ////////////////////////////////////////
- TInputOpData::TEventsQueue &InputEvents() { return InputDataRef().Events; }
- void AddInputEvent(TAutoPtr<IEventHandle> ev) { InputEvents().push(ev); }
- bool HasPendingInputEvents() const
- {
- return InputData ? !InputData->Events.empty() : false;
- }
-
- TInputOpData::TSnapshots &InputSnapshots() { return InputDataRef().Snapshots; }
- void AddInputSnapshot(TIntrusivePtr<TTableSnapshotContext> snapContext)
- {
- InputSnapshots().push_back(snapContext);
- }
-
- TLocksCache &LocksCache() { return InputDataRef().LocksCache; }
-
- TInputOpData::TInReadSets &InReadSets() { return InputDataRef().InReadSets; }
- TVector<NKikimrTx::TEvReadSet> &DelayedInReadSets() { return InputDataRef().DelayedInReadSets; }
- TInputOpData::TCoverageBuilders &CoverageBuilders() { return InputDataRef().CoverageBuilders; }
- void InitRemainReadSets() { InputDataRef().RemainReadSets = InReadSets().size(); }
- ui32 GetRemainReadSets() const { return InputData ? InputData->RemainReadSets : 0; }
-
- void AddInReadSet(const NKikimrTx::TEvReadSet &rs);
- void AddInReadSet(const TReadSetKey &rsKey,
- const NKikimrTx::TBalanceTrackList &btList,
- TString readSet);
-
- void AddDelayedInReadSet(const NKikimrTx::TEvReadSet &rs)
- {
- DelayedInReadSets().emplace_back(rs);
- }
-
+ ////////////////////////////////////////
+ // INPUT DATA //
+ ////////////////////////////////////////
+ TInputOpData::TEventsQueue &InputEvents() { return InputDataRef().Events; }
+ void AddInputEvent(TAutoPtr<IEventHandle> ev) { InputEvents().push(ev); }
+ bool HasPendingInputEvents() const
+ {
+ return InputData ? !InputData->Events.empty() : false;
+ }
+
+ TInputOpData::TSnapshots &InputSnapshots() { return InputDataRef().Snapshots; }
+ void AddInputSnapshot(TIntrusivePtr<TTableSnapshotContext> snapContext)
+ {
+ InputSnapshots().push_back(snapContext);
+ }
+
+ TLocksCache &LocksCache() { return InputDataRef().LocksCache; }
+
+ TInputOpData::TInReadSets &InReadSets() { return InputDataRef().InReadSets; }
+ TVector<NKikimrTx::TEvReadSet> &DelayedInReadSets() { return InputDataRef().DelayedInReadSets; }
+ TInputOpData::TCoverageBuilders &CoverageBuilders() { return InputDataRef().CoverageBuilders; }
+ void InitRemainReadSets() { InputDataRef().RemainReadSets = InReadSets().size(); }
+ ui32 GetRemainReadSets() const { return InputData ? InputData->RemainReadSets : 0; }
+
+ void AddInReadSet(const NKikimrTx::TEvReadSet &rs);
+ void AddInReadSet(const TReadSetKey &rsKey,
+ const NKikimrTx::TBalanceTrackList &btList,
+ TString readSet);
+
+ void AddDelayedInReadSet(const NKikimrTx::TEvReadSet &rs)
+ {
+ DelayedInReadSets().emplace_back(rs);
+ }
+
TAutoPtr<IDestructable> &ScanResult() { return InputDataRef().ScanResult; }
void SetScanResult(TAutoPtr<IDestructable> prod) { InputDataRef().ScanResult = prod; }
- bool HasScanResult() const { return InputData ? (bool)InputData->ScanResult : false; }
-
+ bool HasScanResult() const { return InputData ? (bool)InputData->ScanResult : false; }
+
TAutoPtr<IDestructable> &AsyncJobResult() { return InputDataRef().AsyncJobResult; }
void SetAsyncJobResult(TAutoPtr<IDestructable> prod) { InputDataRef().AsyncJobResult = prod; }
bool HasAsyncJobResult() const { return InputData ? (bool)InputData->AsyncJobResult : false; }
- ////////////////////////////////////////
- // OUTPUT DATA //
- ////////////////////////////////////////
- TOutputOpData::TResultPtr &Result() { return OutputDataRef().Result; }
-
- TOutputOpData::TDelayedAcks &DelayedAcks() { return OutputDataRef().DelayedAcks; }
- void AddDelayedAck(THolder<IEventHandle> ack)
- {
- DelayedAcks().emplace_back(ack.Release());
- }
-
- TOutputOpData::TOutReadSets &OutReadSets() { return OutputDataRef().OutReadSets; }
- TVector<THolder<TEvTxProcessing::TEvReadSet>> &PreparedOutReadSets()
- {
- return OutputDataRef().PreparedOutReadSets;
- }
-
- TLocksUpdate &LocksUpdate() { return OutputDataRef().LocksUpdate; }
- TLocksCache &LocksAccessLog() { return OutputDataRef().LocksAccessLog; }
-
+ ////////////////////////////////////////
+ // OUTPUT DATA //
+ ////////////////////////////////////////
+ TOutputOpData::TResultPtr &Result() { return OutputDataRef().Result; }
+
+ TOutputOpData::TDelayedAcks &DelayedAcks() { return OutputDataRef().DelayedAcks; }
+ void AddDelayedAck(THolder<IEventHandle> ack)
+ {
+ DelayedAcks().emplace_back(ack.Release());
+ }
+
+ TOutputOpData::TOutReadSets &OutReadSets() { return OutputDataRef().OutReadSets; }
+ TVector<THolder<TEvTxProcessing::TEvReadSet>> &PreparedOutReadSets()
+ {
+ return OutputDataRef().PreparedOutReadSets;
+ }
+
+ TLocksUpdate &LocksUpdate() { return OutputDataRef().LocksUpdate; }
+ TLocksCache &LocksAccessLog() { return OutputDataRef().LocksAccessLog; }
+
TVector<TOutputOpData::TChangeRecord> &ChangeRecords() { return OutputDataRef().ChangeRecords; }
const NFH::TFlatHashSet<ui64> &GetAffectedLocks() const { return AffectedLocks; }
void AddAffectedLock(ui64 lockTxId) { AffectedLocks.insert(lockTxId); }
- ////////////////////////////////////////
+ ////////////////////////////////////////
// DELAYED IMMEDIATE KEYS //
- ////////////////////////////////////////
+ ////////////////////////////////////////
void SetDelayedKnownReads(const TVector<TOperationKey>& reads) {
DelayedKnownReads.insert(DelayedKnownReads.end(), reads.begin(), reads.end());
- }
+ }
void SetDelayedKnownWrites(const TVector<TOperationKey>& writes) {
DelayedKnownWrites.insert(DelayedKnownWrites.end(), writes.begin(), writes.end());
- }
+ }
TVector<TOperationKey> RemoveDelayedKnownReads() {
return std::move(DelayedKnownReads);
@@ -646,12 +646,12 @@ public:
void PromoteImmediateWriteConflicts();
void ClearDependents();
- void ClearDependencies();
+ void ClearDependencies();
void ClearPlannedConflicts();
void ClearImmediateConflicts();
void ClearSpecialDependents();
void ClearSpecialDependencies();
-
+
TString DumpDependencies() const;
/**
@@ -663,144 +663,144 @@ public:
*/
bool HasRuntimeConflicts() const noexcept;
- virtual const NMiniKQL::IEngineFlat::TValidationInfo &GetKeysInfo() const
- {
- return EmptyKeysInfo;
- }
- ui64 KeysCount() const
- {
- return GetKeysInfo().ReadsCount + GetKeysInfo().WritesCount;
- }
- virtual ui64 LockTxId() const { return 0; }
- virtual bool HasLockedWrites() const { return false; }
-
- ////////////////////////////////////////
- // EXECUTION PLAN //
- ////////////////////////////////////////
-
- // This method is to be called after operation is
- // created by parser (or loaded from local database)
- // to build its execution plan.
- // All data and flags required to build execution plan
- // should be filled prior this call.
- virtual void BuildExecutionPlan(bool loaded) = 0;
-
- EExecutionUnitKind GetCurrentUnit() const;
- size_t GetCurrentUnitIndex() const { return CurrentUnit; }
- const TVector<EExecutionUnitKind> &GetExecutionPlan() const;
- // Rewrite the rest of execution plan (all units going after
- // the current one) with specified units.
- void RewriteExecutionPlan(const TVector<EExecutionUnitKind> &plan);
- void RewriteExecutionPlan(EExecutionUnitKind unit);
- bool IsExecutionPlanFinished() const;
- void AdvanceExecutionPlan();
-
- void MarkAsExecuting()
- {
- SetExecutingFlag();
- SetStartExecutionAt(TAppData::TimeProvider->Now());
- }
-
- // This method is called when operation execution is completed
- // but operation still remains in pipeline. Method should cleanup
- // data not required any more keeping data required for monitoring.
- virtual void Deactivate() { ClearInputData(); }
-
+ virtual const NMiniKQL::IEngineFlat::TValidationInfo &GetKeysInfo() const
+ {
+ return EmptyKeysInfo;
+ }
+ ui64 KeysCount() const
+ {
+ return GetKeysInfo().ReadsCount + GetKeysInfo().WritesCount;
+ }
+ virtual ui64 LockTxId() const { return 0; }
+ virtual bool HasLockedWrites() const { return false; }
+
+ ////////////////////////////////////////
+ // EXECUTION PLAN //
+ ////////////////////////////////////////
+
+ // This method is to be called after operation is
+ // created by parser (or loaded from local database)
+ // to build its execution plan.
+ // All data and flags required to build execution plan
+ // should be filled prior this call.
+ virtual void BuildExecutionPlan(bool loaded) = 0;
+
+ EExecutionUnitKind GetCurrentUnit() const;
+ size_t GetCurrentUnitIndex() const { return CurrentUnit; }
+ const TVector<EExecutionUnitKind> &GetExecutionPlan() const;
+ // Rewrite the rest of execution plan (all units going after
+ // the current one) with specified units.
+ void RewriteExecutionPlan(const TVector<EExecutionUnitKind> &plan);
+ void RewriteExecutionPlan(EExecutionUnitKind unit);
+ bool IsExecutionPlanFinished() const;
+ void AdvanceExecutionPlan();
+
+ void MarkAsExecuting()
+ {
+ SetExecutingFlag();
+ SetStartExecutionAt(TAppData::TimeProvider->Now());
+ }
+
+ // This method is called when operation execution is completed
+ // but operation still remains in pipeline. Method should cleanup
+ // data not required any more keeping data required for monitoring.
+ virtual void Deactivate() { ClearInputData(); }
+
// Mark operation as aborted
void Abort();
- // Mark operation as aborted and replace the rest of
- // operation's execution plan with specified unit.
- void Abort(EExecutionUnitKind unit);
-
- ////////////////////////////////////////
- // EXECUTION PROFILE //
- ////////////////////////////////////////
- const TExecutionProfile &GetExecutionProfile() const { return ExecutionProfile; }
-
- TInstant GetStartExecutionAt() const { return ExecutionProfile.StartExecutionAt; }
- void SetStartExecutionAt(TInstant val) { ExecutionProfile.StartExecutionAt = val; }
-
- TInstant GetCompletedAt() const { return ExecutionProfile.CompletedAt; }
- void SetCompletedAt(TInstant val) { ExecutionProfile.CompletedAt = val; }
-
- void AddExecutionTime(TDuration val)
- {
- Y_VERIFY_DEBUG(!IsExecutionPlanFinished());
- auto &profile = ExecutionProfile.UnitProfiles[ExecutionPlan[CurrentUnit]];
- profile.ExecuteTime += val;
- ++profile.ExecuteCount;
- }
-
- void SetCommitTime(EExecutionUnitKind unit,
- TDuration val)
- {
- ExecutionProfile.UnitProfiles[unit].CommitTime = val;
- }
-
- void SetCompleteTime(EExecutionUnitKind unit,
- TDuration val)
- {
- ExecutionProfile.UnitProfiles[unit].CompleteTime = val;
- }
-
- void SetDelayedCommitTime(TDuration val)
- {
- ExecutionProfile.UnitProfiles[ExecutionPlan[CurrentUnit]].DelayedCommitTime = val;
- }
-
- TString ExecutionProfileLogString(ui64 tabletId) const;
-
-protected:
- TOperation()
- : TOperation(TBasicOpInfo())
- {
- }
-
- TOperation(ui64 txId,
- EOperationKind kind,
- ui32 flags,
- ui64 maxStep,
+ // Mark operation as aborted and replace the rest of
+ // operation's execution plan with specified unit.
+ void Abort(EExecutionUnitKind unit);
+
+ ////////////////////////////////////////
+ // EXECUTION PROFILE //
+ ////////////////////////////////////////
+ const TExecutionProfile &GetExecutionProfile() const { return ExecutionProfile; }
+
+ TInstant GetStartExecutionAt() const { return ExecutionProfile.StartExecutionAt; }
+ void SetStartExecutionAt(TInstant val) { ExecutionProfile.StartExecutionAt = val; }
+
+ TInstant GetCompletedAt() const { return ExecutionProfile.CompletedAt; }
+ void SetCompletedAt(TInstant val) { ExecutionProfile.CompletedAt = val; }
+
+ void AddExecutionTime(TDuration val)
+ {
+ Y_VERIFY_DEBUG(!IsExecutionPlanFinished());
+ auto &profile = ExecutionProfile.UnitProfiles[ExecutionPlan[CurrentUnit]];
+ profile.ExecuteTime += val;
+ ++profile.ExecuteCount;
+ }
+
+ void SetCommitTime(EExecutionUnitKind unit,
+ TDuration val)
+ {
+ ExecutionProfile.UnitProfiles[unit].CommitTime = val;
+ }
+
+ void SetCompleteTime(EExecutionUnitKind unit,
+ TDuration val)
+ {
+ ExecutionProfile.UnitProfiles[unit].CompleteTime = val;
+ }
+
+ void SetDelayedCommitTime(TDuration val)
+ {
+ ExecutionProfile.UnitProfiles[ExecutionPlan[CurrentUnit]].DelayedCommitTime = val;
+ }
+
+ TString ExecutionProfileLogString(ui64 tabletId) const;
+
+protected:
+ TOperation()
+ : TOperation(TBasicOpInfo())
+ {
+ }
+
+ TOperation(ui64 txId,
+ EOperationKind kind,
+ ui32 flags,
+ ui64 maxStep,
TInstant receivedAt,
ui64 tieBreakerIndex)
: TOperation(TBasicOpInfo(txId, kind, flags, maxStep, receivedAt, tieBreakerIndex))
- {
- }
-
- TOperation(const TBasicOpInfo &op)
- : TBasicOpInfo(op)
- , Cookie(0)
- , CurrentUnit(0)
- {
- }
-
- TOperation(const TOperation &other) = delete;
- TOperation(TOperation &&other) = default;
-
- TOutputOpData &OutputDataRef()
- {
- if (!OutputData)
+ {
+ }
+
+ TOperation(const TBasicOpInfo &op)
+ : TBasicOpInfo(op)
+ , Cookie(0)
+ , CurrentUnit(0)
+ {
+ }
+
+ TOperation(const TOperation &other) = delete;
+ TOperation(TOperation &&other) = default;
+
+ TOutputOpData &OutputDataRef()
+ {
+ if (!OutputData)
OutputData = MakeHolder<TOutputOpData>();
- return *OutputData;
- }
- void ClearOutputData() { OutputData = nullptr; }
-
- TInputOpData &InputDataRef()
- {
- if (!InputData)
+ return *OutputData;
+ }
+ void ClearOutputData() { OutputData = nullptr; }
+
+ TInputOpData &InputDataRef()
+ {
+ if (!InputData)
InputData = MakeHolder<TInputOpData>();
- return *InputData;
- }
- void ClearInputData() { InputData = nullptr; }
-
+ return *InputData;
+ }
+ void ClearInputData() { InputData = nullptr; }
+
TActorId Target;
-
-private:
+
+private:
THPTimer TotalTimer;
THPTimer CurrentTimer;
- THolder<TInputOpData> InputData;
- THolder<TOutputOpData> OutputData;
- ui64 Cookie;
+ THolder<TInputOpData> InputData;
+ THolder<TOutputOpData> OutputData;
+ ui64 Cookie;
// A set of locks affected by this operation
NFH::TFlatHashSet<ui64> AffectedLocks;
// Delayed read/write keys for immediate transactions
@@ -813,36 +813,36 @@ private:
NFH::TFlatHashSet<TOperation::TPtr> SpecialDependencies;
NFH::TFlatHashSet<TOperation::TPtr> PlannedConflicts;
NFH::TFlatHashSet<TOperation::TPtr> ImmediateConflicts;
- TVector<EExecutionUnitKind> ExecutionPlan;
- // Index of current execution unit.
- size_t CurrentUnit;
- TExecutionProfile ExecutionProfile;
-
- static NMiniKQL::IEngineFlat::TValidationInfo EmptyKeysInfo;
+ TVector<EExecutionUnitKind> ExecutionPlan;
+ // Index of current execution unit.
+ size_t CurrentUnit;
+ TExecutionProfile ExecutionProfile;
+
+ static NMiniKQL::IEngineFlat::TValidationInfo EmptyKeysInfo;
public:
std::optional<TRowVersion> MvccReadWriteVersion;
-};
-
-inline IOutputStream &operator <<(IOutputStream &out,
- const TStepOrder &id)
-{
- out << '[' << id.Step << ':' << id.TxId << ']';
- return out;
-}
-
-inline IOutputStream &operator <<(IOutputStream &out,
- const TOperation &op)
-{
- return (out << op.GetStepOrder());
-}
-
-#define OHFunc(TEvType, HandleFunc) \
- case TEvType::EventType: { \
- typename TEvType::TPtr* x = reinterpret_cast<typename TEvType::TPtr*>(&ev); \
- HandleFunc(*x, op, ctx); \
- break; \
- }
-
+};
+
+inline IOutputStream &operator <<(IOutputStream &out,
+ const TStepOrder &id)
+{
+ out << '[' << id.Step << ':' << id.TxId << ']';
+ return out;
+}
+
+inline IOutputStream &operator <<(IOutputStream &out,
+ const TOperation &op)
+{
+ return (out << op.GetStepOrder());
+}
+
+#define OHFunc(TEvType, HandleFunc) \
+ case TEvType::EventType: { \
+ typename TEvType::TPtr* x = reinterpret_cast<typename TEvType::TPtr*>(&ev); \
+ HandleFunc(*x, op, ctx); \
+ break; \
+ }
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/plan_queue_unit.cpp b/ydb/core/tx/datashard/plan_queue_unit.cpp
index 84b921b179e..052444c76a1 100644
--- a/ydb/core/tx/datashard/plan_queue_unit.cpp
+++ b/ydb/core/tx/datashard/plan_queue_unit.cpp
@@ -1,120 +1,120 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TPlanQueueUnit : public TExecutionUnit {
-public:
+
+class TPlanQueueUnit : public TExecutionUnit {
+public:
TPlanQueueUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TPlanQueueUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- TOperation::TPtr FindReadyOperation() const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TPlanQueueUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ TOperation::TPtr FindReadyOperation() const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TPlanQueueUnit::TPlanQueueUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::PlanQueue, false, dataShard, pipeline)
-{
-}
-
-TPlanQueueUnit::~TPlanQueueUnit()
-{
-}
-
-bool TPlanQueueUnit::IsReadyToExecute(TOperation::TPtr op) const
-{
- if (Pipeline.OutOfOrderLimits())
- return false;
- if (!Pipeline.CanRunOp(*op))
- return false;
-
- auto step = Pipeline.GetLastActivePlannedOpStep();
- auto txId = Pipeline.GetLastActivePlannedOpId();
- return op == Pipeline.GetNextPlannedOp(step, txId);
-}
-
-TOperation::TPtr TPlanQueueUnit::FindReadyOperation() const
-{
- if (Pipeline.OutOfOrderLimits()) {
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "TPlanQueueUnit at " << DataShard.TabletID()
- << " out-of-order limits exceeded");
- return nullptr;
- }
-
- if (!OpsInFly.size()) {
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "TPlanQueueUnit at " << DataShard.TabletID()
- << " has no attached operations");
- return nullptr;
- }
-
- auto step = Pipeline.GetLastActivePlannedOpStep();
- auto txId = Pipeline.GetLastActivePlannedOpId();
- auto op = Pipeline.GetNextPlannedOp(step, txId);
-
- if (!op) {
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "TPlanQueueUnit at " << DataShard.TabletID()
- << " couldn't find next planned operation after ["
- << step << ":" << txId << "]");
- return nullptr;
- }
-
- if (op->IsInProgress()) {
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "TPlanQueueUnit at " << DataShard.TabletID()
- << " found next planned operation " << *op << " which is already in progress");
- return nullptr;
- }
-
- if (!Pipeline.CanRunOp(*op)) {
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "TPlanQueueUnit at " << DataShard.TabletID()
- << " cannot run found next planned operation " << *op);
- return nullptr;
- }
-
- if (op->GetCurrentUnit() != Kind) {
- LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
- "TPlanQueueUnit at " << DataShard.TabletID()
- << " found next planned operation " << *op
- << " is executing on unit " << op->GetCurrentUnit());
- return nullptr;
- }
-
- return op;
-}
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::PlanQueue, false, dataShard, pipeline)
+{
+}
+
+TPlanQueueUnit::~TPlanQueueUnit()
+{
+}
+
+bool TPlanQueueUnit::IsReadyToExecute(TOperation::TPtr op) const
+{
+ if (Pipeline.OutOfOrderLimits())
+ return false;
+ if (!Pipeline.CanRunOp(*op))
+ return false;
+
+ auto step = Pipeline.GetLastActivePlannedOpStep();
+ auto txId = Pipeline.GetLastActivePlannedOpId();
+ return op == Pipeline.GetNextPlannedOp(step, txId);
+}
+
+TOperation::TPtr TPlanQueueUnit::FindReadyOperation() const
+{
+ if (Pipeline.OutOfOrderLimits()) {
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "TPlanQueueUnit at " << DataShard.TabletID()
+ << " out-of-order limits exceeded");
+ return nullptr;
+ }
+
+ if (!OpsInFly.size()) {
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "TPlanQueueUnit at " << DataShard.TabletID()
+ << " has no attached operations");
+ return nullptr;
+ }
+
+ auto step = Pipeline.GetLastActivePlannedOpStep();
+ auto txId = Pipeline.GetLastActivePlannedOpId();
+ auto op = Pipeline.GetNextPlannedOp(step, txId);
+
+ if (!op) {
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "TPlanQueueUnit at " << DataShard.TabletID()
+ << " couldn't find next planned operation after ["
+ << step << ":" << txId << "]");
+ return nullptr;
+ }
+
+ if (op->IsInProgress()) {
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "TPlanQueueUnit at " << DataShard.TabletID()
+ << " found next planned operation " << *op << " which is already in progress");
+ return nullptr;
+ }
+
+ if (!Pipeline.CanRunOp(*op)) {
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "TPlanQueueUnit at " << DataShard.TabletID()
+ << " cannot run found next planned operation " << *op);
+ return nullptr;
+ }
+
+ if (op->GetCurrentUnit() != Kind) {
+ LOG_TRACE_S(TActivationContext::AsActorContext(), NKikimrServices::TX_DATASHARD,
+ "TPlanQueueUnit at " << DataShard.TabletID()
+ << " found next planned operation " << *op
+ << " is executing on unit " << op->GetCurrentUnit());
+ return nullptr;
+ }
+
+ return op;
+}
+
EExecutionStatus TPlanQueueUnit::Execute(TOperation::TPtr op,
- TTransactionContext &,
- const TActorContext &)
-{
+ TTransactionContext &,
+ const TActorContext &)
+{
DataShard.IncCounter(COUNTER_PLAN_QUEUE_LATENCY_MS, op->GetCurrentElapsedAndReset().MilliSeconds());
- return EExecutionStatus::Executed;
-}
-
-void TPlanQueueUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ return EExecutionStatus::Executed;
+}
+
+void TPlanQueueUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreatePlanQueueUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TPlanQueueUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/prepare_data_tx_in_rs_unit.cpp b/ydb/core/tx/datashard/prepare_data_tx_in_rs_unit.cpp
index 2d1aac89bc7..840863e00a8 100644
--- a/ydb/core/tx/datashard/prepare_data_tx_in_rs_unit.cpp
+++ b/ydb/core/tx/datashard/prepare_data_tx_in_rs_unit.cpp
@@ -1,50 +1,50 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NMiniKQL;
-
-class TPrepareDataTxInRSUnit : public TExecutionUnit {
-public:
+
+using namespace NMiniKQL;
+
+class TPrepareDataTxInRSUnit : public TExecutionUnit {
+public:
TPrepareDataTxInRSUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TPrepareDataTxInRSUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TPrepareDataTxInRSUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TPrepareDataTxInRSUnit::TPrepareDataTxInRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::PrepareDataTxInRS, true, dataShard, pipeline)
-{
-}
-
-TPrepareDataTxInRSUnit::~TPrepareDataTxInRSUnit()
-{
-}
-
-bool TPrepareDataTxInRSUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TPrepareDataTxInRSUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::PrepareDataTxInRS, true, dataShard, pipeline)
+{
+}
+
+TPrepareDataTxInRSUnit::~TPrepareDataTxInRSUnit()
+{
+}
+
+bool TPrepareDataTxInRSUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TPrepareDataTxInRSUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
if (tx->IsTxDataReleased()) {
switch (Pipeline.RestoreDataTx(tx, txc, ctx)) {
case ERestoreDataStatus::Ok:
@@ -55,61 +55,61 @@ EExecutionStatus TPrepareDataTxInRSUnit::Execute(TOperation::TPtr op,
Y_FAIL("Failed to restore tx data: %s", tx->GetDataTx()->GetErrors().c_str());
}
}
-
- IEngineFlat *engine = tx->GetDataTx()->GetEngine();
- Y_VERIFY_S(engine, "missing engine for " << *op << " at " << DataShard.TabletID());
-
- // TODO: cancel tx in special execution unit.
- if (tx->GetDataTx()->CheckCancelled())
- engine->Cancel();
-
- try {
- auto &inReadSets = op->InReadSets();
- auto result = engine->PrepareIncomingReadsets();
- Y_VERIFY_S(result == IEngineFlat::EResult::Ok,
- "Cannot prepare input RS for " << *op << " at "
- << DataShard.TabletID() << ": " << engine->GetErrors());
-
- ui32 rsCount = engine->GetExpectedIncomingReadsetsCount();
- for (ui32 i = 0; i < rsCount; ++i) {
- ui64 shard = engine->GetExpectedIncomingReadsetOriginShard(i);
- inReadSets.insert(std::make_pair(std::make_pair(shard, DataShard.TabletID()),
- TVector<TRSData>()));
- }
- } catch (const TMemoryLimitExceededException &) {
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Operation " << *op << " at " << DataShard.TabletID()
- << " exceeded memory limit " << txc.GetMemoryLimit()
- << " and requests " << txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR
- << " more for the next try");
-
- engine->ReleaseUnusedMemory();
- txc.RequestMemory(txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
-
- tx->ReleaseTxData(txc, ctx);
-
- return EExecutionStatus::Restart;
- } catch (const TNotReadyTabletException&) {
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Tablet " << DataShard.TabletID() << " is not ready for " << *op
- << " execution");
-
- return EExecutionStatus::Restart;
- }
-
- return EExecutionStatus::Executed;
-}
-
-void TPrepareDataTxInRSUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+
+ IEngineFlat *engine = tx->GetDataTx()->GetEngine();
+ Y_VERIFY_S(engine, "missing engine for " << *op << " at " << DataShard.TabletID());
+
+ // TODO: cancel tx in special execution unit.
+ if (tx->GetDataTx()->CheckCancelled())
+ engine->Cancel();
+
+ try {
+ auto &inReadSets = op->InReadSets();
+ auto result = engine->PrepareIncomingReadsets();
+ Y_VERIFY_S(result == IEngineFlat::EResult::Ok,
+ "Cannot prepare input RS for " << *op << " at "
+ << DataShard.TabletID() << ": " << engine->GetErrors());
+
+ ui32 rsCount = engine->GetExpectedIncomingReadsetsCount();
+ for (ui32 i = 0; i < rsCount; ++i) {
+ ui64 shard = engine->GetExpectedIncomingReadsetOriginShard(i);
+ inReadSets.insert(std::make_pair(std::make_pair(shard, DataShard.TabletID()),
+ TVector<TRSData>()));
+ }
+ } catch (const TMemoryLimitExceededException &) {
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Operation " << *op << " at " << DataShard.TabletID()
+ << " exceeded memory limit " << txc.GetMemoryLimit()
+ << " and requests " << txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR
+ << " more for the next try");
+
+ engine->ReleaseUnusedMemory();
+ txc.RequestMemory(txc.GetMemoryLimit() * MEMORY_REQUEST_FACTOR);
+
+ tx->ReleaseTxData(txc, ctx);
+
+ return EExecutionStatus::Restart;
+ } catch (const TNotReadyTabletException&) {
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Tablet " << DataShard.TabletID() << " is not ready for " << *op
+ << " execution");
+
+ return EExecutionStatus::Restart;
+ }
+
+ return EExecutionStatus::Executed;
+}
+
+void TPrepareDataTxInRSUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreatePrepareDataTxInRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TPrepareDataTxInRSUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/prepare_kqp_data_tx_in_rs_unit.cpp b/ydb/core/tx/datashard/prepare_kqp_data_tx_in_rs_unit.cpp
index ebac6f6693c..05ab71fc367 100644
--- a/ydb/core/tx/datashard/prepare_kqp_data_tx_in_rs_unit.cpp
+++ b/ydb/core/tx/datashard/prepare_kqp_data_tx_in_rs_unit.cpp
@@ -1,39 +1,39 @@
-#include "datashard_impl.h"
-#include "datashard_kqp.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_kqp.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NMiniKQL;
-
-class TPrepareKqpDataTxInRSUnit : public TExecutionUnit {
-public:
+
+using namespace NMiniKQL;
+
+class TPrepareKqpDataTxInRSUnit : public TExecutionUnit {
+public:
TPrepareKqpDataTxInRSUnit(TDataShard &dataShard, TPipeline &pipeline);
- ~TPrepareKqpDataTxInRSUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
+ ~TPrepareKqpDataTxInRSUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
EExecutionStatus Execute(TOperation::TPtr op, TTransactionContext &txc, const TActorContext &ctx) override;
void Complete(TOperation::TPtr op, const TActorContext &ctx) override;
-};
-
+};
+
TPrepareKqpDataTxInRSUnit::TPrepareKqpDataTxInRSUnit(TDataShard &dataShard,
TPipeline &pipeline)
: TExecutionUnit(EExecutionUnitKind::PrepareKqpDataTxInRS, true, dataShard, pipeline) {}
-
+
TPrepareKqpDataTxInRSUnit::~TPrepareKqpDataTxInRSUnit() {}
-
+
bool TPrepareKqpDataTxInRSUnit::IsReadyToExecute(TOperation::TPtr) const {
- return true;
-}
-
+ return true;
+}
+
EExecutionStatus TPrepareKqpDataTxInRSUnit::Execute(TOperation::TPtr op, TTransactionContext &txc,
const TActorContext &ctx)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
if (tx->IsTxDataReleased()) {
switch (Pipeline.RestoreDataTx(tx, txc, ctx)) {
case ERestoreDataStatus::Ok:
@@ -44,7 +44,7 @@ EExecutionStatus TPrepareKqpDataTxInRSUnit::Execute(TOperation::TPtr op, TTransa
Y_FAIL("Failed to restore tx data: %s", tx->GetDataTx()->GetErrors().c_str());
}
}
-
+
if (tx->GetDataTx()->CheckCancelled()) {
tx->ReleaseTxData(txc, ctx);
BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::CANCELLED)
@@ -55,22 +55,22 @@ EExecutionStatus TPrepareKqpDataTxInRSUnit::Execute(TOperation::TPtr op, TTransa
return EExecutionStatus::Executed;
}
- try {
+ try {
KqpPrepareInReadsets(op->InReadSets(), tx->GetDataTx()->GetKqpTransaction(), DataShard.TabletID());
} catch (const yexception& e) {
LOG_CRIT_S(ctx, NKikimrServices::TX_DATASHARD, "Exception while preparing in-readsets for KQP transaction "
<< *op << " at " << DataShard.TabletID() << ": " << CurrentExceptionMessage());
Y_FAIL_S("Unexpected exception in KQP in-readsets prepare: " << CurrentExceptionMessage());
- }
-
- return EExecutionStatus::Executed;
-}
-
+ }
+
+ return EExecutionStatus::Executed;
+}
+
void TPrepareKqpDataTxInRSUnit::Complete(TOperation::TPtr, const TActorContext &) {}
-
+
THolder<TExecutionUnit> CreatePrepareKqpDataTxInRSUnit(TDataShard &dataShard, TPipeline &pipeline) {
return THolder(new TPrepareKqpDataTxInRSUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/prepare_scheme_tx_in_rs_unit.cpp b/ydb/core/tx/datashard/prepare_scheme_tx_in_rs_unit.cpp
index f66006b1999..cc2cfeb5f1c 100644
--- a/ydb/core/tx/datashard/prepare_scheme_tx_in_rs_unit.cpp
+++ b/ydb/core/tx/datashard/prepare_scheme_tx_in_rs_unit.cpp
@@ -1,67 +1,67 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TPrepareSchemeTxInRSUnit : public TExecutionUnit {
-public:
+
+class TPrepareSchemeTxInRSUnit : public TExecutionUnit {
+public:
TPrepareSchemeTxInRSUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TPrepareSchemeTxInRSUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TPrepareSchemeTxInRSUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TPrepareSchemeTxInRSUnit::TPrepareSchemeTxInRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::PrepareSchemeTxInRS, false, dataShard, pipeline)
-{
-}
-
-TPrepareSchemeTxInRSUnit::~TPrepareSchemeTxInRSUnit()
-{
-}
-
-bool TPrepareSchemeTxInRSUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TPrepareSchemeTxInRSUnit::Execute(TOperation::TPtr op,
- TTransactionContext &,
- const TActorContext &)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- auto &schemeTx = tx->GetSchemeTx();
- if (schemeTx.HasReceiveSnapshot()) {
- ui64 srcTablet = schemeTx.GetReceiveSnapshot().GetReceiveFrom(0).GetShard();
- op->InReadSets().insert(std::make_pair(std::make_pair(srcTablet, DataShard.TabletID()), TVector<TRSData>()));
- }
-
- return EExecutionStatus::Executed;
-}
-
-void TPrepareSchemeTxInRSUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::PrepareSchemeTxInRS, false, dataShard, pipeline)
+{
+}
+
+TPrepareSchemeTxInRSUnit::~TPrepareSchemeTxInRSUnit()
+{
+}
+
+bool TPrepareSchemeTxInRSUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TPrepareSchemeTxInRSUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &,
+ const TActorContext &)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ auto &schemeTx = tx->GetSchemeTx();
+ if (schemeTx.HasReceiveSnapshot()) {
+ ui64 srcTablet = schemeTx.GetReceiveSnapshot().GetReceiveFrom(0).GetShard();
+ op->InReadSets().insert(std::make_pair(std::make_pair(srcTablet, DataShard.TabletID()), TVector<TRSData>()));
+ }
+
+ return EExecutionStatus::Executed;
+}
+
+void TPrepareSchemeTxInRSUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreatePrepareSchemeTxInRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TPrepareSchemeTxInRSUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/read_table_scan.cpp b/ydb/core/tx/datashard/read_table_scan.cpp
index 1afbae9e638..63e94fde967 100644
--- a/ydb/core/tx/datashard/read_table_scan.cpp
+++ b/ydb/core/tx/datashard/read_table_scan.cpp
@@ -1,97 +1,97 @@
-#include "datashard_impl.h"
-#include "datashard__engine_host.h"
-#include "read_table_scan.h"
-
+#include "datashard_impl.h"
+#include "datashard__engine_host.h"
+#include "read_table_scan.h"
+
#include <ydb/core/engine/mkql_proto.h>
#include <ydb/core/protos/counters_datashard.pb.h>
#include <ydb/core/protos/ydb_result_set_old.pb.h>
-
+
#include <ydb/library/binary_json/read.h>
#include <ydb/library/dynumber/dynumber.h>
//#include <library/cpp/actors/interconnect/interconnect.h>
-
-//#include <util/generic/cast.h>
-
-namespace NKikimr {
+
+//#include <util/generic/cast.h>
+
+namespace NKikimr {
namespace NDataShard {
-
-using NTable::EScan;
-
-//YdbOld and Ydb.v1 have same value representation
-template<typename TOutValue>
-Y_FORCE_INLINE void AddCell(TOutValue& row, NScheme::TTypeId type, const TCell &cell)
-{
- auto &val = *row.add_items();
-
- if (cell.IsNull()) {
- val.set_null_flag_value(::google::protobuf::NULL_VALUE);
- return;
- }
-
- switch (type) {
- case NUdf::TDataType<bool>::Id:
- val.set_bool_value(cell.AsValue<bool>());
- break;
- case NUdf::TDataType<ui8>::Id:
- val.set_uint32_value(cell.AsValue<ui8>());
- break;
- case NUdf::TDataType<i8>::Id:
- val.set_int32_value(cell.AsValue<i8>());
- break;
- case NUdf::TDataType<ui16>::Id:
- val.set_uint32_value(cell.AsValue<ui16>());
- break;
- case NUdf::TDataType<i16>::Id:
- val.set_int32_value(cell.AsValue<i16>());
- break;
- case NUdf::TDataType<ui32>::Id:
- val.set_uint32_value(cell.AsValue<ui32>());
- break;
- case NUdf::TDataType<i32>::Id:
- val.set_int32_value(cell.AsValue<i32>());
- break;
- case NUdf::TDataType<ui64>::Id:
- val.set_uint64_value(cell.AsValue<ui64>());
- break;
- case NUdf::TDataType<i64>::Id:
- val.set_int64_value(cell.AsValue<i64>());
- break;
- case NUdf::TDataType<float>::Id:
- val.set_float_value(cell.AsValue<float>());
- break;
- case NUdf::TDataType<double>::Id:
- val.set_double_value(cell.AsValue<double>());
- break;
- case NUdf::TDataType<NUdf::TJson>::Id:
- case NUdf::TDataType<NUdf::TYson>::Id:
- case NUdf::TDataType<NUdf::TUtf8>::Id:
- val.set_text_value(cell.Data(), cell.Size());
- break;
- case NUdf::TDataType<NUdf::TDecimal>::Id:
- {
- Y_VERIFY_DEBUG(cell.Size() == 16);
- struct TCellData {
- ui64 Low;
- ui64 High;
- };
- const auto data = cell.AsValue<TCellData>();
- val.set_low_128(data.Low);
- val.set_high_128(data.High);
- }
- break;
- case NUdf::TDataType<NUdf::TDate>::Id:
- val.set_uint32_value(cell.AsValue<ui16>());
- break;
- case NUdf::TDataType<NUdf::TDatetime>::Id:
- val.set_uint32_value(cell.AsValue<ui32>());
- break;
- case NUdf::TDataType<NUdf::TTimestamp>::Id:
- val.set_uint64_value(cell.AsValue<ui64>());
- break;
- case NUdf::TDataType<NUdf::TInterval>::Id:
- val.set_int64_value(cell.AsValue<i64>());
- break;
+
+using NTable::EScan;
+
+//YdbOld and Ydb.v1 have same value representation
+template<typename TOutValue>
+Y_FORCE_INLINE void AddCell(TOutValue& row, NScheme::TTypeId type, const TCell &cell)
+{
+ auto &val = *row.add_items();
+
+ if (cell.IsNull()) {
+ val.set_null_flag_value(::google::protobuf::NULL_VALUE);
+ return;
+ }
+
+ switch (type) {
+ case NUdf::TDataType<bool>::Id:
+ val.set_bool_value(cell.AsValue<bool>());
+ break;
+ case NUdf::TDataType<ui8>::Id:
+ val.set_uint32_value(cell.AsValue<ui8>());
+ break;
+ case NUdf::TDataType<i8>::Id:
+ val.set_int32_value(cell.AsValue<i8>());
+ break;
+ case NUdf::TDataType<ui16>::Id:
+ val.set_uint32_value(cell.AsValue<ui16>());
+ break;
+ case NUdf::TDataType<i16>::Id:
+ val.set_int32_value(cell.AsValue<i16>());
+ break;
+ case NUdf::TDataType<ui32>::Id:
+ val.set_uint32_value(cell.AsValue<ui32>());
+ break;
+ case NUdf::TDataType<i32>::Id:
+ val.set_int32_value(cell.AsValue<i32>());
+ break;
+ case NUdf::TDataType<ui64>::Id:
+ val.set_uint64_value(cell.AsValue<ui64>());
+ break;
+ case NUdf::TDataType<i64>::Id:
+ val.set_int64_value(cell.AsValue<i64>());
+ break;
+ case NUdf::TDataType<float>::Id:
+ val.set_float_value(cell.AsValue<float>());
+ break;
+ case NUdf::TDataType<double>::Id:
+ val.set_double_value(cell.AsValue<double>());
+ break;
+ case NUdf::TDataType<NUdf::TJson>::Id:
+ case NUdf::TDataType<NUdf::TYson>::Id:
+ case NUdf::TDataType<NUdf::TUtf8>::Id:
+ val.set_text_value(cell.Data(), cell.Size());
+ break;
+ case NUdf::TDataType<NUdf::TDecimal>::Id:
+ {
+ Y_VERIFY_DEBUG(cell.Size() == 16);
+ struct TCellData {
+ ui64 Low;
+ ui64 High;
+ };
+ const auto data = cell.AsValue<TCellData>();
+ val.set_low_128(data.Low);
+ val.set_high_128(data.High);
+ }
+ break;
+ case NUdf::TDataType<NUdf::TDate>::Id:
+ val.set_uint32_value(cell.AsValue<ui16>());
+ break;
+ case NUdf::TDataType<NUdf::TDatetime>::Id:
+ val.set_uint32_value(cell.AsValue<ui32>());
+ break;
+ case NUdf::TDataType<NUdf::TTimestamp>::Id:
+ val.set_uint64_value(cell.AsValue<ui64>());
+ break;
+ case NUdf::TDataType<NUdf::TInterval>::Id:
+ val.set_int64_value(cell.AsValue<i64>());
+ break;
case NUdf::TDataType<NUdf::TJsonDocument>::Id: {
const auto json = NBinaryJson::SerializeToJson(TStringBuf(cell.Data(), cell.Size()));
val.set_text_value(json);
@@ -103,337 +103,337 @@ Y_FORCE_INLINE void AddCell(TOutValue& row, NScheme::TTypeId type, const TCell &
val.set_text_value(*number);
break;
}
- default:
- val.set_bytes_value(cell.Data(), cell.Size());
- }
-}
-
-class TRowsToResult {
-public:
- TRowsToResult(const NKikimrTxDataShard::TReadTableTransaction &request)
- : CurrentMessageRows(0)
- , ReservedSize(0)
- , ResultStream(ResultString)
- {
- for (auto &col : request.GetColumns())
- ColTypes.push_back(col.GetTypeId());
- }
-
- virtual ~TRowsToResult() = default;
-
- ui64 GetMessageSize() const { return ResultString.size(); }
- ui64 GetMessageRows() const { return CurrentMessageRows; }
-
- void PutRow(const NTable::TRowState& row) {
- RowOffsets.push_back(static_cast<ui32>(ResultString.size()));
- DoPutRow(row);
- ++CurrentMessageRows;
- }
-
- void Reserve(ui64 size)
- {
- ReservedSize = size;
- ResultStream.Reserve(size);
- }
-
- void Flush(NKikimrTxDataShard::TEvProposeTransactionResult &res)
- {
- *res.MutableTxResult() = ResultString;
- auto version = GetResultVersion();
- if (version)
- res.SetApiVersion(version);
- for (auto &offset : RowOffsets)
- res.AddRowOffsets(offset);
- StartNewMessage();
- }
-
-protected:
- void StartNewMessage()
- {
- RowOffsets.clear();
- ResultString.clear();
-
- ResultStream << ResultCommon;
- Reserve(ReservedSize);
-
- CurrentMessageRows = 0;
- }
-private:
- virtual void DoPutRow(const NTable::TRowState &row) = 0;
- virtual ui32 GetResultVersion() const = 0;
-
- ui64 CurrentMessageRows;
- ui64 ReservedSize;
- TString ResultString;
-
-protected:
- TStringOutput ResultStream;
- TVector<NScheme::TTypeId> ColTypes;
- TVector<ui32> RowOffsets;
- TString ResultCommon;
-};
-
-class TRowsToOldResult : public TRowsToResult {
-public:
- TRowsToOldResult(const NKikimrTxDataShard::TReadTableTransaction& request)
- : TRowsToResult(request)
- {
- BuildResultCommonPart(request);
- StartNewMessage();
- }
-
-private:
- void DoPutRow(const NTable::TRowState &row) override
- {
- auto &protoRow = *OldResultSet.add_rows();
- auto cells = *row;
-
- for (size_t col = 0; col < cells.size(); ++col) {
- AddCell(protoRow, ColTypes[col], cells[col]);
- }
-
+ default:
+ val.set_bytes_value(cell.Data(), cell.Size());
+ }
+}
+
+class TRowsToResult {
+public:
+ TRowsToResult(const NKikimrTxDataShard::TReadTableTransaction &request)
+ : CurrentMessageRows(0)
+ , ReservedSize(0)
+ , ResultStream(ResultString)
+ {
+ for (auto &col : request.GetColumns())
+ ColTypes.push_back(col.GetTypeId());
+ }
+
+ virtual ~TRowsToResult() = default;
+
+ ui64 GetMessageSize() const { return ResultString.size(); }
+ ui64 GetMessageRows() const { return CurrentMessageRows; }
+
+ void PutRow(const NTable::TRowState& row) {
+ RowOffsets.push_back(static_cast<ui32>(ResultString.size()));
+ DoPutRow(row);
+ ++CurrentMessageRows;
+ }
+
+ void Reserve(ui64 size)
+ {
+ ReservedSize = size;
+ ResultStream.Reserve(size);
+ }
+
+ void Flush(NKikimrTxDataShard::TEvProposeTransactionResult &res)
+ {
+ *res.MutableTxResult() = ResultString;
+ auto version = GetResultVersion();
+ if (version)
+ res.SetApiVersion(version);
+ for (auto &offset : RowOffsets)
+ res.AddRowOffsets(offset);
+ StartNewMessage();
+ }
+
+protected:
+ void StartNewMessage()
+ {
+ RowOffsets.clear();
+ ResultString.clear();
+
+ ResultStream << ResultCommon;
+ Reserve(ReservedSize);
+
+ CurrentMessageRows = 0;
+ }
+private:
+ virtual void DoPutRow(const NTable::TRowState &row) = 0;
+ virtual ui32 GetResultVersion() const = 0;
+
+ ui64 CurrentMessageRows;
+ ui64 ReservedSize;
+ TString ResultString;
+
+protected:
+ TStringOutput ResultStream;
+ TVector<NScheme::TTypeId> ColTypes;
+ TVector<ui32> RowOffsets;
+ TString ResultCommon;
+};
+
+class TRowsToOldResult : public TRowsToResult {
+public:
+ TRowsToOldResult(const NKikimrTxDataShard::TReadTableTransaction& request)
+ : TRowsToResult(request)
+ {
+ BuildResultCommonPart(request);
+ StartNewMessage();
+ }
+
+private:
+ void DoPutRow(const NTable::TRowState &row) override
+ {
+ auto &protoRow = *OldResultSet.add_rows();
+ auto cells = *row;
+
+ for (size_t col = 0; col < cells.size(); ++col) {
+ AddCell(protoRow, ColTypes[col], cells[col]);
+ }
+
OldResultSet.SerializeToArcadiaStream(&ResultStream);
- OldResultSet.Clear();
- }
-
- ui32 GetResultVersion() const override { return 0; }
-
- void BuildResultCommonPart(const NKikimrTxDataShard::TReadTableTransaction &request)
- {
- YdbOld::ResultSet res;
-
- for (auto &col : request.GetColumns()) {
- auto *meta = res.add_column_meta();
- meta->set_name(col.GetName());
- auto id = static_cast<NYql::NProto::TypeIds>(col.GetTypeId());
- meta->mutable_type()->mutable_optional_type()->mutable_item()->mutable_data_type()->set_id(id);
- }
- res.set_truncated(true);
+ OldResultSet.Clear();
+ }
+
+ ui32 GetResultVersion() const override { return 0; }
+
+ void BuildResultCommonPart(const NKikimrTxDataShard::TReadTableTransaction &request)
+ {
+ YdbOld::ResultSet res;
+
+ for (auto &col : request.GetColumns()) {
+ auto *meta = res.add_column_meta();
+ meta->set_name(col.GetName());
+ auto id = static_cast<NYql::NProto::TypeIds>(col.GetTypeId());
+ meta->mutable_type()->mutable_optional_type()->mutable_item()->mutable_data_type()->set_id(id);
+ }
+ res.set_truncated(true);
Y_PROTOBUF_SUPPRESS_NODISCARD res.SerializeToString(&ResultCommon);
- }
-
- YdbOld::ResultSet OldResultSet;
-};
-
-class TRowsToYdbResult : public TRowsToResult {
-public:
- TRowsToYdbResult(const NKikimrTxDataShard::TReadTableTransaction& request)
- : TRowsToResult(request)
- {
- BuildResultCommonPart(request);
- StartNewMessage();
- }
-
-private:
- void DoPutRow(const NTable::TRowState& row) override
- {
- auto &protoRow = *YdbResultSet.add_rows();
- auto cells = *row;
-
- for (size_t col = 0; col < cells.size(); ++col) {
- AddCell(protoRow, ColTypes[col], cells[col]);
- }
-
+ }
+
+ YdbOld::ResultSet OldResultSet;
+};
+
+class TRowsToYdbResult : public TRowsToResult {
+public:
+ TRowsToYdbResult(const NKikimrTxDataShard::TReadTableTransaction& request)
+ : TRowsToResult(request)
+ {
+ BuildResultCommonPart(request);
+ StartNewMessage();
+ }
+
+private:
+ void DoPutRow(const NTable::TRowState& row) override
+ {
+ auto &protoRow = *YdbResultSet.add_rows();
+ auto cells = *row;
+
+ for (size_t col = 0; col < cells.size(); ++col) {
+ AddCell(protoRow, ColTypes[col], cells[col]);
+ }
+
YdbResultSet.SerializeToArcadiaStream(&ResultStream);
- YdbResultSet.Clear();
- }
-
- ui32 GetResultVersion() const override { return NKikimrTxUserProxy::TReadTableTransaction::YDB_V1; }
-
- void BuildResultCommonPart(const NKikimrTxDataShard::TReadTableTransaction &request)
- {
- Ydb::ResultSet res;
- for (auto &col : request.GetColumns()) {
- auto *meta = res.add_columns();
- meta->set_name(col.GetName());
- auto id = static_cast<NYql::NProto::TypeIds>(col.GetTypeId());
- if (id == NYql::NProto::Decimal) {
- auto decimalType = meta->mutable_type()->mutable_optional_type()->mutable_item()->mutable_decimal_type();
- //TODO: Pass decimal params here
- decimalType->set_precision(22);
- decimalType->set_scale(9);
- } else {
- meta->mutable_type()->mutable_optional_type()->mutable_item()
- ->set_type_id(static_cast<Ydb::Type::PrimitiveTypeId>(id));
- }
- }
- res.set_truncated(true);
+ YdbResultSet.Clear();
+ }
+
+ ui32 GetResultVersion() const override { return NKikimrTxUserProxy::TReadTableTransaction::YDB_V1; }
+
+ void BuildResultCommonPart(const NKikimrTxDataShard::TReadTableTransaction &request)
+ {
+ Ydb::ResultSet res;
+ for (auto &col : request.GetColumns()) {
+ auto *meta = res.add_columns();
+ meta->set_name(col.GetName());
+ auto id = static_cast<NYql::NProto::TypeIds>(col.GetTypeId());
+ if (id == NYql::NProto::Decimal) {
+ auto decimalType = meta->mutable_type()->mutable_optional_type()->mutable_item()->mutable_decimal_type();
+ //TODO: Pass decimal params here
+ decimalType->set_precision(22);
+ decimalType->set_scale(9);
+ } else {
+ meta->mutable_type()->mutable_optional_type()->mutable_item()
+ ->set_type_id(static_cast<Ydb::Type::PrimitiveTypeId>(id));
+ }
+ }
+ res.set_truncated(true);
Y_PROTOBUF_SUPPRESS_NODISCARD res.SerializeToString(&ResultCommon);
- }
-
- Ydb::ResultSet YdbResultSet;
-};
-
-class TReadTableScan : public TActor<TReadTableScan>, public NTable::IScan {
-public:
+ }
+
+ Ydb::ResultSet YdbResultSet;
+};
+
+class TReadTableScan : public TActor<TReadTableScan>, public NTable::IScan {
+public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::TX_READ_TABLE_SCAN;
- }
-
+ }
+
TReadTableScan(ui64 txId, ui64 shardId, TUserTable::TCPtr tableInfo,
const NKikimrTxDataShard::TReadTableTransaction &tx, TActorId sink,
TActorId dataShard)
- : TActor(&TThis::StateWork)
- , Sink(sink)
- , DataShard(dataShard)
- , TxId(txId)
- , ShardId(shardId)
- , Driver(nullptr)
- , MessageQuota(0)
- , MessageSizeLimit(10 << 20)
- , TableInfo(tableInfo)
+ : TActor(&TThis::StateWork)
+ , Sink(sink)
+ , DataShard(dataShard)
+ , TxId(txId)
+ , ShardId(shardId)
+ , Driver(nullptr)
+ , MessageQuota(0)
+ , MessageSizeLimit(10 << 20)
+ , TableInfo(tableInfo)
, Tx(tx)
- , ScanRange(tx.GetRange())
- , CheckUpper(false)
- , PendingAcks(0)
- , Finished(false)
- {
- if (tx.HasApiVersion() && tx.GetApiVersion() == NKikimrTxUserProxy::TReadTableTransaction::YDB_V1) {
+ , ScanRange(tx.GetRange())
+ , CheckUpper(false)
+ , PendingAcks(0)
+ , Finished(false)
+ {
+ if (tx.HasApiVersion() && tx.GetApiVersion() == NKikimrTxUserProxy::TReadTableTransaction::YDB_V1) {
Writer = MakeHolder<TRowsToYdbResult>(tx);
- } else {
+ } else {
Writer = MakeHolder<TRowsToOldResult>(tx);
- }
-
- for (auto &col : tx.GetColumns())
- Tags.push_back(col.GetId());
- }
-
- ~TReadTableScan() {}
-
- void Describe(IOutputStream &out) const noexcept override
- {
- out << "TReadTableScan";
- }
-
- STFUNC(StateWork) {
- switch (ev->GetTypeRewrite()) {
- HFunc(TEvTxProcessing::TEvStreamDataAck, Handle);
- HFunc(TEvTxProcessing::TEvStreamIsDead, Handle);
- HFunc(TEvTxProcessing::TEvStreamQuotaResponse, Handle);
- HFunc(TEvents::TEvUndelivered, Undelivered);
- HFunc(TEvInterconnect::TEvNodeDisconnected, Disconnected);
- HFunc(TEvDataShard::TEvGetReadTableScanStateRequest, Handle);
- IgnoreFunc(TEvInterconnect::TEvNodeConnected);
- default:
- LOG_ERROR(ctx, NKikimrServices::TX_DATASHARD,
- "TReadTableScan: StateWork unexpected event type: %" PRIx32 " event: %s",
- ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
- }
- }
-
-private:
+ }
+
+ for (auto &col : tx.GetColumns())
+ Tags.push_back(col.GetId());
+ }
+
+ ~TReadTableScan() {}
+
+ void Describe(IOutputStream &out) const noexcept override
+ {
+ out << "TReadTableScan";
+ }
+
+ STFUNC(StateWork) {
+ switch (ev->GetTypeRewrite()) {
+ HFunc(TEvTxProcessing::TEvStreamDataAck, Handle);
+ HFunc(TEvTxProcessing::TEvStreamIsDead, Handle);
+ HFunc(TEvTxProcessing::TEvStreamQuotaResponse, Handle);
+ HFunc(TEvents::TEvUndelivered, Undelivered);
+ HFunc(TEvInterconnect::TEvNodeDisconnected, Disconnected);
+ HFunc(TEvDataShard::TEvGetReadTableScanStateRequest, Handle);
+ IgnoreFunc(TEvInterconnect::TEvNodeConnected);
+ default:
+ LOG_ERROR(ctx, NKikimrServices::TX_DATASHARD,
+ "TReadTableScan: StateWork unexpected event type: %" PRIx32 " event: %s",
+ ev->GetTypeRewrite(), ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?");
+ }
+ }
+
+private:
void Die(const TActorContext &ctx) override
- {
+ {
ctx.Send(TActivationContext::InterconnectProxy(Sink.NodeId()),
- new TEvents::TEvUnsubscribe());
-
- TActor<TReadTableScan>::Die(ctx);
- }
-
- void Undelivered(TEvents::TEvUndelivered::TPtr &, const TActorContext &ctx)
- {
- LOG_ERROR(ctx, NKikimrServices::TX_DATASHARD,
- "TReadTableScan: undelivered event TxId: %" PRIu64, TxId);
-
- Error = "cannot reach sink actor";
- Driver->Touch(EScan::Final);
- }
-
- void Disconnected(TEvInterconnect::TEvNodeDisconnected::TPtr &, const TActorContext &ctx)
- {
- LOG_ERROR(ctx, NKikimrServices::TX_DATASHARD,
- "TReadTableScan: disconnect TxId: %" PRIu64, TxId);
-
- Error = "cannot reach sink actor";
- Driver->Touch(EScan::Final);
- }
-
- void Handle(TEvTxProcessing::TEvStreamDataAck::TPtr &, const TActorContext &ctx)
- {
- Y_VERIFY(PendingAcks);
- --PendingAcks;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Got stream data ack ShardId: " << ShardId
- << ", TxId: " << TxId
- << ", PendingAcks: " << PendingAcks);
-
- if (Finished && !PendingAcks)
- Driver->Touch(EScan::Feed);
- }
-
- void Handle(TEvTxProcessing::TEvStreamIsDead::TPtr &ev, const TActorContext &ctx)
- {
- LOG_INFO(ctx, NKikimrServices::TX_DATASHARD,
- "TReadTableScan: stream disconnect TxId: %" PRIu64, TxId);
-
- Error = "got dead stream notification";
- Driver->Touch(EScan::Final);
- ctx.Send(ev->Forward(Sink));
- }
-
- void Handle(TEvTxProcessing::TEvStreamQuotaResponse::TPtr &ev, const TActorContext &ctx)
- {
- bool touch = !MessageQuota;
- auto &rec = ev->Get()->Record;
-
- MessageSizeLimit = rec.GetMessageSizeLimit();
- MessageQuota += rec.GetReservedMessages();
- RowLimit = rec.GetRowLimit();
-
- Writer->Reserve(MessageSizeLimit);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Got quota for read table scan ShardId: " << ShardId
- << ", TxId: " << TxId
- << ", MessageQuota: " << MessageQuota);
-
- CheckQuota(ctx);
-
- if (MessageQuota && touch)
- Driver->Touch(EScan::Feed);
- }
-
- void Handle(TEvDataShard::TEvGetReadTableScanStateRequest::TPtr &ev,
- const TActorContext &ctx)
- {
- auto *response = new TEvDataShard::TEvGetReadTableScanStateResponse;
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- response->Record.SetTxId(TxId);
- response->Record.SetMessageQuota(MessageQuota);
- response->Record.SetMessageSizeLimit(MessageSizeLimit);
- response->Record.SetRowsLimit(RowLimit);
- response->Record.SetPendingAcks(PendingAcks);
- response->Record.SetResultSize(Writer->GetMessageSize());
- response->Record.SetResultRows(Writer->GetMessageRows());
- response->Record.SetHasUpperBorder(CheckUpper);
- response->Record.SetFinished(Finished);
- response->Record.SetError(Error);
-
- ctx.Send(ev->Sender, response);
- }
-
- void CheckQuota(const TActorContext &ctx)
- {
- if (MessageQuota)
- return;
-
- TAutoPtr<TEvTxProcessing::TEvStreamQuotaRequest> request
- = new TEvTxProcessing::TEvStreamQuotaRequest;
- request->Record.SetTxId(TxId);
- request->Record.SetShardId(ShardId);
- ctx.Send(Sink, request.Release(),
- IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession);
- }
-
+ new TEvents::TEvUnsubscribe());
+
+ TActor<TReadTableScan>::Die(ctx);
+ }
+
+ void Undelivered(TEvents::TEvUndelivered::TPtr &, const TActorContext &ctx)
+ {
+ LOG_ERROR(ctx, NKikimrServices::TX_DATASHARD,
+ "TReadTableScan: undelivered event TxId: %" PRIu64, TxId);
+
+ Error = "cannot reach sink actor";
+ Driver->Touch(EScan::Final);
+ }
+
+ void Disconnected(TEvInterconnect::TEvNodeDisconnected::TPtr &, const TActorContext &ctx)
+ {
+ LOG_ERROR(ctx, NKikimrServices::TX_DATASHARD,
+ "TReadTableScan: disconnect TxId: %" PRIu64, TxId);
+
+ Error = "cannot reach sink actor";
+ Driver->Touch(EScan::Final);
+ }
+
+ void Handle(TEvTxProcessing::TEvStreamDataAck::TPtr &, const TActorContext &ctx)
+ {
+ Y_VERIFY(PendingAcks);
+ --PendingAcks;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Got stream data ack ShardId: " << ShardId
+ << ", TxId: " << TxId
+ << ", PendingAcks: " << PendingAcks);
+
+ if (Finished && !PendingAcks)
+ Driver->Touch(EScan::Feed);
+ }
+
+ void Handle(TEvTxProcessing::TEvStreamIsDead::TPtr &ev, const TActorContext &ctx)
+ {
+ LOG_INFO(ctx, NKikimrServices::TX_DATASHARD,
+ "TReadTableScan: stream disconnect TxId: %" PRIu64, TxId);
+
+ Error = "got dead stream notification";
+ Driver->Touch(EScan::Final);
+ ctx.Send(ev->Forward(Sink));
+ }
+
+ void Handle(TEvTxProcessing::TEvStreamQuotaResponse::TPtr &ev, const TActorContext &ctx)
+ {
+ bool touch = !MessageQuota;
+ auto &rec = ev->Get()->Record;
+
+ MessageSizeLimit = rec.GetMessageSizeLimit();
+ MessageQuota += rec.GetReservedMessages();
+ RowLimit = rec.GetRowLimit();
+
+ Writer->Reserve(MessageSizeLimit);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Got quota for read table scan ShardId: " << ShardId
+ << ", TxId: " << TxId
+ << ", MessageQuota: " << MessageQuota);
+
+ CheckQuota(ctx);
+
+ if (MessageQuota && touch)
+ Driver->Touch(EScan::Feed);
+ }
+
+ void Handle(TEvDataShard::TEvGetReadTableScanStateRequest::TPtr &ev,
+ const TActorContext &ctx)
+ {
+ auto *response = new TEvDataShard::TEvGetReadTableScanStateResponse;
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+
+ response->Record.SetTxId(TxId);
+ response->Record.SetMessageQuota(MessageQuota);
+ response->Record.SetMessageSizeLimit(MessageSizeLimit);
+ response->Record.SetRowsLimit(RowLimit);
+ response->Record.SetPendingAcks(PendingAcks);
+ response->Record.SetResultSize(Writer->GetMessageSize());
+ response->Record.SetResultRows(Writer->GetMessageRows());
+ response->Record.SetHasUpperBorder(CheckUpper);
+ response->Record.SetFinished(Finished);
+ response->Record.SetError(Error);
+
+ ctx.Send(ev->Sender, response);
+ }
+
+ void CheckQuota(const TActorContext &ctx)
+ {
+ if (MessageQuota)
+ return;
+
+ TAutoPtr<TEvTxProcessing::TEvStreamQuotaRequest> request
+ = new TEvTxProcessing::TEvStreamQuotaRequest;
+ request->Record.SetTxId(TxId);
+ request->Record.SetShardId(ShardId);
+ ctx.Send(Sink, request.Release(),
+ IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession);
+ }
+
THello Prepare(IDriver *driver, TIntrusiveConstPtr<TScheme> scheme) noexcept override
- {
- Driver = driver;
-
- auto ctx = TActivationContext::AsActorContext();
+ {
+ Driver = driver;
+
+ auto ctx = TActivationContext::AsActorContext();
auto aid = ctx.RegisterWithSameMailbox(this);
-
+
for (const auto& columnRecord : Tx.GetColumns()) {
if (!scheme->ColInfo(columnRecord.GetId())) {
Error = TStringBuilder() << "ReadTable cannot find column "
@@ -444,75 +444,75 @@ private:
}
auto *ev = new TDataShard::TEvPrivate::TEvRegisterScanActor(TxId);
- ctx.MakeFor(aid).Send(DataShard, ev);
-
- CheckQuota(ctx.MakeFor(aid));
-
- return { EScan::Sleep, { } };
- }
-
- EScan Seek(TLead &lead, ui64 seq) noexcept override
- {
- if (seq) {
- MaybeSendResponseMessage(true);
- Finished = true;
-
- if (PendingAcks)
- return EScan::Sleep;
-
- return EScan::Final;
- }
-
- int cmpFrom;
- int cmpTo;
- cmpFrom = CompareBorders<false, false>(ScanRange.From.GetCells(),
- TableInfo->Range.From.GetCells(),
- ScanRange.FromInclusive,
- TableInfo->Range.FromInclusive,
- TableInfo->KeyColumnTypes);
- cmpTo = CompareBorders<true, true>(ScanRange.To.GetCells(),
- TableInfo->Range.To.GetCells(),
- ScanRange.ToInclusive,
- TableInfo->Range.ToInclusive,
- TableInfo->KeyColumnTypes);
-
- if (cmpFrom > 0) {
- auto seek = ScanRange.FromInclusive ? NTable::ESeek::Lower : NTable::ESeek::Upper;
- lead.To(Tags, ScanRange.From.GetCells(), seek);
- } else {
- lead.To(Tags, { }, NTable::ESeek::Lower);
- }
-
- CheckUpper = (cmpTo < 0);
-
+ ctx.MakeFor(aid).Send(DataShard, ev);
+
+ CheckQuota(ctx.MakeFor(aid));
+
+ return { EScan::Sleep, { } };
+ }
+
+ EScan Seek(TLead &lead, ui64 seq) noexcept override
+ {
+ if (seq) {
+ MaybeSendResponseMessage(true);
+ Finished = true;
+
+ if (PendingAcks)
+ return EScan::Sleep;
+
+ return EScan::Final;
+ }
+
+ int cmpFrom;
+ int cmpTo;
+ cmpFrom = CompareBorders<false, false>(ScanRange.From.GetCells(),
+ TableInfo->Range.From.GetCells(),
+ ScanRange.FromInclusive,
+ TableInfo->Range.FromInclusive,
+ TableInfo->KeyColumnTypes);
+ cmpTo = CompareBorders<true, true>(ScanRange.To.GetCells(),
+ TableInfo->Range.To.GetCells(),
+ ScanRange.ToInclusive,
+ TableInfo->Range.ToInclusive,
+ TableInfo->KeyColumnTypes);
+
+ if (cmpFrom > 0) {
+ auto seek = ScanRange.FromInclusive ? NTable::ESeek::Lower : NTable::ESeek::Upper;
+ lead.To(Tags, ScanRange.From.GetCells(), seek);
+ } else {
+ lead.To(Tags, { }, NTable::ESeek::Lower);
+ }
+
+ CheckUpper = (cmpTo < 0);
+
if (CheckUpper) {
lead.Until(ScanRange.To.GetCells(), ScanRange.ToInclusive);
}
- return EScan::Feed;
- }
-
+ return EScan::Feed;
+ }
+
EScan MaybeSendResponseMessage(bool last, const TArrayRef<const TCell>& lastKey = { })
- {
- ui64 rows = Writer->GetMessageRows();
-
- // Nothing to send.
- if (!rows)
- return EScan::Feed;
-
- // May collect more rows.
- if (Writer->GetMessageSize() < MessageSizeLimit
- && (!RowLimit || RowLimit > rows)
- && !last)
- return EScan::Feed;
-
- auto ctx = TActivationContext::AsActorContext().MakeFor(SelfId());
- auto result = new TEvDataShard::TEvProposeTransactionResult(
- NKikimrTxDataShard::TX_KIND_SCAN,
- ShardId,
- TxId,
- NKikimrTxDataShard::TEvProposeTransactionResult::RESPONSE_DATA);
- Writer->Flush(result->Record);
+ {
+ ui64 rows = Writer->GetMessageRows();
+
+ // Nothing to send.
+ if (!rows)
+ return EScan::Feed;
+
+ // May collect more rows.
+ if (Writer->GetMessageSize() < MessageSizeLimit
+ && (!RowLimit || RowLimit > rows)
+ && !last)
+ return EScan::Feed;
+
+ auto ctx = TActivationContext::AsActorContext().MakeFor(SelfId());
+ auto result = new TEvDataShard::TEvProposeTransactionResult(
+ NKikimrTxDataShard::TX_KIND_SCAN,
+ ShardId,
+ TxId,
+ NKikimrTxDataShard::TEvProposeTransactionResult::RESPONSE_DATA);
+ Writer->Flush(result->Record);
// Allows sink to detect missing chunks and resume on failures
result->Record.SetDataSeqNo(NextDataSeqNo++);
@@ -520,41 +520,41 @@ private:
result->Record.SetDataLastKey(TSerializedCellVec::Serialize(lastKey));
}
- ctx.Send(Sink, result,
- IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession);
-
- ++PendingAcks;
- --MessageQuota;
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Send response data ShardId: " << ShardId
- << ", TxId: " << TxId
- << ", Size: " << Writer->GetMessageSize()
- << ", Rows: " << Writer->GetMessageRows()
- << ", PendingAcks: " << PendingAcks
- << ", MessageQuota: " << MessageQuota);
-
- if (RowLimit) {
- RowLimit -= rows;
- if (!RowLimit)
- return EScan::Reset;
- }
-
- if (!last)
- CheckQuota(ctx);
-
- return MessageQuota ? EScan::Feed : EScan::Sleep;
- }
-
- EScan Feed(TArrayRef<const TCell> key, const TRow &row) noexcept override
- {
+ ctx.Send(Sink, result,
+ IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession);
+
+ ++PendingAcks;
+ --MessageQuota;
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Send response data ShardId: " << ShardId
+ << ", TxId: " << TxId
+ << ", Size: " << Writer->GetMessageSize()
+ << ", Rows: " << Writer->GetMessageRows()
+ << ", PendingAcks: " << PendingAcks
+ << ", MessageQuota: " << MessageQuota);
+
+ if (RowLimit) {
+ RowLimit -= rows;
+ if (!RowLimit)
+ return EScan::Reset;
+ }
+
+ if (!last)
+ CheckQuota(ctx);
+
+ return MessageQuota ? EScan::Feed : EScan::Sleep;
+ }
+
+ EScan Feed(TArrayRef<const TCell> key, const TRow &row) noexcept override
+ {
Y_VERIFY_DEBUG(DebugCheckKeyInRange(key));
-
- Writer->PutRow(row);
-
+
+ Writer->PutRow(row);
+
return MaybeSendResponseMessage(false, key);
- }
-
+ }
+
bool DebugCheckKeyInRange(TArrayRef<const TCell> key) {
auto cmp = CompareBorders<true, true>(
key, ScanRange.To.GetCells(),
@@ -565,64 +565,64 @@ private:
}
TAutoPtr<IDestructable> Finish(EAbort abort) noexcept override
- {
+ {
auto ctx = TActivationContext::ActorContextFor(SelfId());
-
+
if (!SchemaChanged) {
if (abort != EAbort::None)
Error = "Aborted by scan host env";
-
+
TAutoPtr<TEvTxProcessing::TEvStreamQuotaRelease> request
= new TEvTxProcessing::TEvStreamQuotaRelease;
request->Record.SetTxId(TxId);
request->Record.SetShardId(ShardId);
-
+
ctx.Send(Sink, request.Release());
}
- LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
- "Finish scan ShardId: " << ShardId
- << ", TxId: " << TxId
- << ", MessageQuota: " << MessageQuota);
-
- Driver = nullptr;
-
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Finish scan ShardId: " << ShardId
+ << ", TxId: " << TxId
+ << ", MessageQuota: " << MessageQuota);
+
+ Driver = nullptr;
+
Die(ctx);
-
+
return new TReadTableProd(Error, SchemaChanged);
- }
-
-private:
- TVector<ui32> Tags;
+ }
+
+private:
+ TVector<ui32> Tags;
TActorId Sink;
TActorId DataShard;
- ui64 TxId;
- ui64 ShardId;
- IDriver *Driver;
- ui64 MessageQuota;
- ui64 MessageSizeLimit;
- TString Error;
- THolder<TRowsToResult> Writer;
+ ui64 TxId;
+ ui64 ShardId;
+ IDriver *Driver;
+ ui64 MessageQuota;
+ ui64 MessageSizeLimit;
+ TString Error;
+ THolder<TRowsToResult> Writer;
TUserTable::TCPtr TableInfo;
NKikimrTxDataShard::TReadTableTransaction Tx;
- TSerializedTableRange ScanRange;
- bool CheckUpper;
- ui64 RowLimit;
- ui64 PendingAcks;
+ TSerializedTableRange ScanRange;
+ bool CheckUpper;
+ ui64 RowLimit;
+ ui64 PendingAcks;
ui64 NextDataSeqNo = 1;
- bool Finished;
+ bool Finished;
bool SchemaChanged = false;
-};
-
+};
+
TAutoPtr<NTable::IScan> CreateReadTableScan(ui64 txId,
- ui64 shardId,
+ ui64 shardId,
TUserTable::TCPtr tableInfo,
- const NKikimrTxDataShard::TReadTableTransaction &tx,
+ const NKikimrTxDataShard::TReadTableTransaction &tx,
TActorId sink,
TActorId dataShard)
-{
- return new TReadTableScan(txId, shardId, tableInfo, tx, sink, dataShard);
-}
-
+{
+ return new TReadTableScan(txId, shardId, tableInfo, tx, sink, dataShard);
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/read_table_scan.h b/ydb/core/tx/datashard/read_table_scan.h
index 227e6cb233f..0650c6ef67a 100644
--- a/ydb/core/tx/datashard/read_table_scan.h
+++ b/ydb/core/tx/datashard/read_table_scan.h
@@ -1,28 +1,28 @@
-#pragma once
-#include "defs.h"
-
+#pragma once
+#include "defs.h"
+
#include <ydb/core/tablet_flat/flat_scan_iface.h>
-
-namespace NKikimr {
+
+namespace NKikimr {
namespace NDataShard {
-
+
class TReadTableProd : public IDestructable {
-public:
+public:
TReadTableProd(const TString &error, bool schemaChanged = false)
- : Error(error)
+ : Error(error)
, SchemaChanged(schemaChanged)
- {}
-
- TString Error;
+ {}
+
+ TString Error;
bool SchemaChanged;
-};
-
+};
+
TAutoPtr<NTable::IScan> CreateReadTableScan(ui64 txId,
- ui64 shardId,
+ ui64 shardId,
TUserTable::TCPtr tableInfo,
- const NKikimrTxDataShard::TReadTableTransaction &tx,
+ const NKikimrTxDataShard::TReadTableTransaction &tx,
TActorId sink,
TActorId dataShard);
-
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/read_table_scan_unit.cpp b/ydb/core/tx/datashard/read_table_scan_unit.cpp
index 23fea774c2c..c020c6c6abd 100644
--- a/ydb/core/tx/datashard/read_table_scan_unit.cpp
+++ b/ydb/core/tx/datashard/read_table_scan_unit.cpp
@@ -1,75 +1,75 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-#include "read_table_scan.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+#include "read_table_scan.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TReadTableScanUnit : public TExecutionUnit {
-public:
+
+class TReadTableScanUnit : public TExecutionUnit {
+public:
TReadTableScanUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TReadTableScanUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
- void ProcessEvent(TAutoPtr<NActors::IEventHandle> &ev,
- TOperation::TPtr op,
- const NActors::TActorContext &ctx);
- void Handle(TEvTxProcessing::TEvInterruptTransaction::TPtr &ev,
- TOperation::TPtr op,
- const TActorContext &ctx);
- void Abort(const TString &err,
- TOperation::TPtr op,
- const TActorContext &ctx);
-};
-
+ TPipeline &pipeline);
+ ~TReadTableScanUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+ void ProcessEvent(TAutoPtr<NActors::IEventHandle> &ev,
+ TOperation::TPtr op,
+ const NActors::TActorContext &ctx);
+ void Handle(TEvTxProcessing::TEvInterruptTransaction::TPtr &ev,
+ TOperation::TPtr op,
+ const TActorContext &ctx);
+ void Abort(const TString &err,
+ TOperation::TPtr op,
+ const TActorContext &ctx);
+};
+
TReadTableScanUnit::TReadTableScanUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::ReadTableScan, false, dataShard, pipeline)
-{
-}
-
-TReadTableScanUnit::~TReadTableScanUnit()
-{
-}
-
-bool TReadTableScanUnit::IsReadyToExecute(TOperation::TPtr op) const
-{
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::ReadTableScan, false, dataShard, pipeline)
+{
+}
+
+TReadTableScanUnit::~TReadTableScanUnit()
+{
+}
+
+bool TReadTableScanUnit::IsReadyToExecute(TOperation::TPtr op) const
+{
// Pass aborted operations
if (op->Result() || op->HasResultSentFlag() || op->IsImmediate() && WillRejectDataTx(op))
return true;
- if (!op->IsWaitingForScan())
- return true;
-
- if (op->HasScanResult())
- return true;
-
- if (op->HasPendingInputEvents())
- return true;
-
- return false;
-}
-
-EExecutionStatus TReadTableScanUnit::Execute(TOperation::TPtr op,
+ if (!op->IsWaitingForScan())
+ return true;
+
+ if (op->HasScanResult())
+ return true;
+
+ if (op->HasPendingInputEvents())
+ return true;
+
+ return false;
+}
+
+EExecutionStatus TReadTableScanUnit::Execute(TOperation::TPtr op,
TTransactionContext &txc,
- const TActorContext &ctx)
-{
+ const TActorContext &ctx)
+{
TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
// Pass aborted operations (e.g. while waiting for stream clearance, or because of a split/merge)
if (op->Result() || op->HasResultSentFlag() || op->IsImmediate() && CheckRejectDataTx(op, ctx)) {
op->ResetWaitingForScanFlag();
-
+
// Ignore scan result (if any)
if (op->HasScanResult()) {
tx->SetScanTask(0);
@@ -102,11 +102,11 @@ EExecutionStatus TReadTableScanUnit::Execute(TOperation::TPtr op,
}
auto tid = record.GetTableId().GetTableId();
- auto info = DataShard.GetUserTables().at(tid);
-
+ auto info = DataShard.GetUserTables().at(tid);
+
auto scan = CreateReadTableScan(op->GetTxId(), DataShard.TabletID(), info, record,
- tx->GetStreamSink(), DataShard.SelfId());
-
+ tx->GetStreamSink(), DataShard.SelfId());
+
TScanOptions options;
if (record.HasSnapshotStep() && record.HasSnapshotTxId()) {
@@ -132,110 +132,110 @@ EExecutionStatus TReadTableScanUnit::Execute(TOperation::TPtr op,
tx->SetScanTask(DataShard.QueueScan(info->LocalTid, scan, op->GetTxId(), options));
- op->SetWaitingForScanFlag();
+ op->SetWaitingForScanFlag();
Y_VERIFY_DEBUG(!op->HasScanResult());
- }
-
- if (op->HasScanResult()) {
- auto *result = CheckedCast<TReadTableProd*>(op->ScanResult().Get());
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "ReadTable scan complete for " << *op << " at "
- << DataShard.TabletID() << " error: " << result->Error);
-
- tx->SetScanTask(0);
-
+ }
+
+ if (op->HasScanResult()) {
+ auto *result = CheckedCast<TReadTableProd*>(op->ScanResult().Get());
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "ReadTable scan complete for " << *op << " at "
+ << DataShard.TabletID() << " error: " << result->Error);
+
+ tx->SetScanTask(0);
+
if (result->SchemaChanged) {
BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::ERROR)
->AddError(NKikimrTxDataShard::TError::SCHEME_CHANGED, result->Error);
} else if (result->Error) {
- BuildResult(op)->AddError(NKikimrTxDataShard::TError::WRONG_SHARD_STATE,
- result->Error);
+ BuildResult(op)->AddError(NKikimrTxDataShard::TError::WRONG_SHARD_STATE,
+ result->Error);
} else {
- BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE);
+ BuildResult(op, NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE);
}
- op->Result()->SetStepOrderId(op->GetStepOrder().ToPair());
-
- op->SetScanResult(nullptr);
- op->ResetWaitingForScanFlag();
- }
-
- while (op->HasPendingInputEvents()) {
- ProcessEvent(op->InputEvents().front(), op, ctx);
- op->InputEvents().pop();
- }
-
- if (op->IsWaitingForScan())
- return EExecutionStatus::Continue;
-
+ op->Result()->SetStepOrderId(op->GetStepOrder().ToPair());
+
+ op->SetScanResult(nullptr);
+ op->ResetWaitingForScanFlag();
+ }
+
+ while (op->HasPendingInputEvents()) {
+ ProcessEvent(op->InputEvents().front(), op, ctx);
+ op->InputEvents().pop();
+ }
+
+ if (op->IsWaitingForScan())
+ return EExecutionStatus::Continue;
+
if (hadWrites)
return EExecutionStatus::ExecutedNoMoreRestarts;
return EExecutionStatus::Executed;
-}
-
-void TReadTableScanUnit::ProcessEvent(TAutoPtr<NActors::IEventHandle> &ev,
- TOperation::TPtr op,
- const NActors::TActorContext &ctx)
-{
- switch (ev->GetTypeRewrite()) {
- OHFunc(TEvTxProcessing::TEvInterruptTransaction, Handle);
- IgnoreFunc(TEvTxProcessing::TEvStreamClearancePending);
- IgnoreFunc(TEvTxProcessing::TEvStreamClearanceResponse);
- default:
- LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
- "TReadTableScanUnit::ProcessEvent unhandled event type: " << ev->GetTypeRewrite()
- << " event: " << (ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?"));
- Y_VERIFY_DEBUG(false, "unexpected event %" PRIu64, (ui64)ev->GetTypeRewrite());
- }
-}
-
-void TReadTableScanUnit::Handle(TEvTxProcessing::TEvInterruptTransaction::TPtr &,
- TOperation::TPtr op,
- const TActorContext &ctx)
-{
- if (op->IsWaitingForScan()) {
- Abort(TStringBuilder() << "Interrupted operation " << *op << " at "
- << DataShard.TabletID() << " while waiting for scan finish",
- op, ctx);
- }
-}
-
-void TReadTableScanUnit::Abort(const TString &err,
- TOperation::TPtr op,
- const TActorContext &ctx)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- BuildResult(op)->AddError(NKikimrTxDataShard::TError::WRONG_SHARD_STATE, err);
- if (tx->GetScanSnapshotId()) {
- DataShard.DropScanSnapshot(tx->GetScanSnapshotId());
- tx->SetScanSnapshotId(0);
- } else if (tx->GetScanTask()) {
- auto tid = tx->GetDataTx()->GetReadTableTransaction().GetTableId().GetTableId();
- auto info = DataShard.GetUserTables().at(tid);
-
- DataShard.CancelScan(info->LocalTid, tx->GetScanTask());
- tx->SetScanTask(0);
- }
-
- LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD, err);
-
- op->ResetWaitingForScanFlag();
-}
-
-void TReadTableScanUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+}
+
+void TReadTableScanUnit::ProcessEvent(TAutoPtr<NActors::IEventHandle> &ev,
+ TOperation::TPtr op,
+ const NActors::TActorContext &ctx)
+{
+ switch (ev->GetTypeRewrite()) {
+ OHFunc(TEvTxProcessing::TEvInterruptTransaction, Handle);
+ IgnoreFunc(TEvTxProcessing::TEvStreamClearancePending);
+ IgnoreFunc(TEvTxProcessing::TEvStreamClearanceResponse);
+ default:
+ LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TReadTableScanUnit::ProcessEvent unhandled event type: " << ev->GetTypeRewrite()
+ << " event: " << (ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?"));
+ Y_VERIFY_DEBUG(false, "unexpected event %" PRIu64, (ui64)ev->GetTypeRewrite());
+ }
+}
+
+void TReadTableScanUnit::Handle(TEvTxProcessing::TEvInterruptTransaction::TPtr &,
+ TOperation::TPtr op,
+ const TActorContext &ctx)
+{
+ if (op->IsWaitingForScan()) {
+ Abort(TStringBuilder() << "Interrupted operation " << *op << " at "
+ << DataShard.TabletID() << " while waiting for scan finish",
+ op, ctx);
+ }
+}
+
+void TReadTableScanUnit::Abort(const TString &err,
+ TOperation::TPtr op,
+ const TActorContext &ctx)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ BuildResult(op)->AddError(NKikimrTxDataShard::TError::WRONG_SHARD_STATE, err);
+ if (tx->GetScanSnapshotId()) {
+ DataShard.DropScanSnapshot(tx->GetScanSnapshotId());
+ tx->SetScanSnapshotId(0);
+ } else if (tx->GetScanTask()) {
+ auto tid = tx->GetDataTx()->GetReadTableTransaction().GetTableId().GetTableId();
+ auto info = DataShard.GetUserTables().at(tid);
+
+ DataShard.CancelScan(info->LocalTid, tx->GetScanTask());
+ tx->SetScanTask(0);
+ }
+
+ LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD, err);
+
+ op->ResetWaitingForScanFlag();
+}
+
+void TReadTableScanUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateReadTableScanUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TReadTableScanUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/receive_snapshot_unit.cpp b/ydb/core/tx/datashard/receive_snapshot_unit.cpp
index a5160193b01..26f92f65f4d 100644
--- a/ydb/core/tx/datashard/receive_snapshot_unit.cpp
+++ b/ydb/core/tx/datashard/receive_snapshot_unit.cpp
@@ -1,60 +1,60 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TReceiveSnapshotUnit : public TExecutionUnit {
-public:
+
+class TReceiveSnapshotUnit : public TExecutionUnit {
+public:
TReceiveSnapshotUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TReceiveSnapshotUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TReceiveSnapshotUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TReceiveSnapshotUnit::TReceiveSnapshotUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::ReceiveSnapshot, false, dataShard, pipeline)
-{
-}
-
-TReceiveSnapshotUnit::~TReceiveSnapshotUnit()
-{
-}
-
-bool TReceiveSnapshotUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TReceiveSnapshotUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- auto &schemeTx = tx->GetSchemeTx();
- if (!schemeTx.HasReceiveSnapshot())
- return EExecutionStatus::Executed;
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::ReceiveSnapshot, false, dataShard, pipeline)
+{
+}
+
+TReceiveSnapshotUnit::~TReceiveSnapshotUnit()
+{
+}
+
+bool TReceiveSnapshotUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TReceiveSnapshotUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ auto &schemeTx = tx->GetSchemeTx();
+ if (!schemeTx.HasReceiveSnapshot())
+ return EExecutionStatus::Executed;
+
NIceDb::TNiceDb db(txc.DB);
- Y_VERIFY(schemeTx.HasCreateTable());
+ Y_VERIFY(schemeTx.HasCreateTable());
const bool mvcc = DataShard.IsMvccEnabled();
- for (auto &pr : op->InReadSets()) {
- for (auto& rsdata : pr.second) {
+ for (auto &pr : op->InReadSets()) {
+ for (auto& rsdata : pr.second) {
NKikimrTxDataShard::TSnapshotTransferReadSet rs;
// We currently support a single readset for a single user table
@@ -90,9 +90,9 @@ EExecutionStatus TReceiveSnapshotUnit::Execute(TOperation::TPtr op,
}
txc.Env.LoanTable(localTableId, snapBody);
- }
- }
-
+ }
+ }
+
Y_VERIFY(DataShard.GetSnapshotManager().GetSnapshots().empty(),
"Found unexpected persistent snapshots at CopyTable destination");
@@ -107,19 +107,19 @@ EExecutionStatus TReceiveSnapshotUnit::Execute(TOperation::TPtr op,
}
}
- return EExecutionStatus::ExecutedNoMoreRestarts;
-}
-
-void TReceiveSnapshotUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ return EExecutionStatus::ExecutedNoMoreRestarts;
+}
+
+void TReceiveSnapshotUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateReceiveSnapshotUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return MakeHolder<TReceiveSnapshotUnit>(dataShard, pipeline);
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/setup_sys_locks.h b/ydb/core/tx/datashard/setup_sys_locks.h
index 7ba655fcf73..1774533dba6 100644
--- a/ydb/core/tx/datashard/setup_sys_locks.h
+++ b/ydb/core/tx/datashard/setup_sys_locks.h
@@ -1,20 +1,20 @@
-#pragma once
-#include "defs.h"
-#include "operation.h"
-#include "datashard_impl.h"
-
-namespace NKikimr {
+#pragma once
+#include "defs.h"
+#include "operation.h"
+#include "datashard_impl.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-struct TSetupSysLocks {
- TSysLocks &SysLocksTable;
-
- TSetupSysLocks(TOperation::TPtr op,
+
+struct TSetupSysLocks {
+ TSysLocks &SysLocksTable;
+
+ TSetupSysLocks(TOperation::TPtr op,
TDataShard &self)
- : SysLocksTable(self.SysLocksTable())
- {
+ : SysLocksTable(self.SysLocksTable())
+ {
TLocksUpdate &update = op->LocksUpdate();
-
+
update.Clear();
update.LockTxId = op->LockTxId();
@@ -33,18 +33,18 @@ struct TSetupSysLocks {
}
SysLocksTable.SetTxUpdater(&update);
- if (!op->LocksCache().Locks.empty())
- SysLocksTable.SetCache(&op->LocksCache());
- else
- SysLocksTable.SetAccessLog(&op->LocksAccessLog());
- }
-
- ~TSetupSysLocks() {
- SysLocksTable.SetTxUpdater(nullptr);
- SysLocksTable.SetCache(nullptr);
- SysLocksTable.SetAccessLog(nullptr);
- }
-};
-
+ if (!op->LocksCache().Locks.empty())
+ SysLocksTable.SetCache(&op->LocksCache());
+ else
+ SysLocksTable.SetAccessLog(&op->LocksAccessLog());
+ }
+
+ ~TSetupSysLocks() {
+ SysLocksTable.SetTxUpdater(nullptr);
+ SysLocksTable.SetCache(nullptr);
+ SysLocksTable.SetAccessLog(nullptr);
+ }
+};
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/store_and_send_out_rs_unit.cpp b/ydb/core/tx/datashard/store_and_send_out_rs_unit.cpp
index d422f27d81f..a648b765fd2 100644
--- a/ydb/core/tx/datashard/store_and_send_out_rs_unit.cpp
+++ b/ydb/core/tx/datashard/store_and_send_out_rs_unit.cpp
@@ -1,95 +1,95 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-using namespace NMiniKQL;
-
-class TStoreAndSendOutRSUnit : public TExecutionUnit {
-public:
+
+using namespace NMiniKQL;
+
+class TStoreAndSendOutRSUnit : public TExecutionUnit {
+public:
TStoreAndSendOutRSUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TStoreAndSendOutRSUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TStoreAndSendOutRSUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TStoreAndSendOutRSUnit::TStoreAndSendOutRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::StoreAndSendOutRS, false, dataShard, pipeline)
-{
-}
-
-TStoreAndSendOutRSUnit::~TStoreAndSendOutRSUnit()
-{
-}
-
-bool TStoreAndSendOutRSUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TStoreAndSendOutRSUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- bool newArtifact = false;
- // TODO: move artifact flags into operation flags.
- if (!tx->IsOutRSStored() && !op->OutReadSets().empty()) {
- DataShard.PrepareAndSaveOutReadSets(op->GetStep(), op->GetTxId(), op->OutReadSets(),
- op->PreparedOutReadSets(), txc, ctx);
- tx->MarkOutRSStored();
- newArtifact = true;
- }
- if (!tx->IsLocksStored() && !tx->LocksAccessLog().Locks.empty()) {
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::StoreAndSendOutRS, false, dataShard, pipeline)
+{
+}
+
+TStoreAndSendOutRSUnit::~TStoreAndSendOutRSUnit()
+{
+}
+
+bool TStoreAndSendOutRSUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TStoreAndSendOutRSUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ bool newArtifact = false;
+ // TODO: move artifact flags into operation flags.
+ if (!tx->IsOutRSStored() && !op->OutReadSets().empty()) {
+ DataShard.PrepareAndSaveOutReadSets(op->GetStep(), op->GetTxId(), op->OutReadSets(),
+ op->PreparedOutReadSets(), txc, ctx);
+ tx->MarkOutRSStored();
+ newArtifact = true;
+ }
+ if (!tx->IsLocksStored() && !tx->LocksAccessLog().Locks.empty()) {
// N.B. we copy access log to locks cache, so that future lock access is repeatable
tx->LocksCache().Locks = tx->LocksAccessLog().Locks;
- tx->DbStoreLocksAccessLog(&DataShard, txc, ctx);
- tx->MarkLocksStored();
- newArtifact = true;
- }
- if (newArtifact)
- tx->DbStoreArtifactFlags(&DataShard, txc, ctx);
-
+ tx->DbStoreLocksAccessLog(&DataShard, txc, ctx);
+ tx->MarkLocksStored();
+ newArtifact = true;
+ }
+ if (newArtifact)
+ tx->DbStoreArtifactFlags(&DataShard, txc, ctx);
+
bool hadWrites = false;
if (tx->IsOutRSStored() || tx->IsLocksStored()) {
// Don't allow immediate writes to corrupt data we have read
hadWrites |= Pipeline.MarkPlannedLogicallyIncompleteUpTo(TRowVersion(op->GetStep(), op->GetTxId()), txc);
}
- if (!op->PreparedOutReadSets().empty())
- return EExecutionStatus::DelayCompleteNoMoreRestarts;
-
+ if (!op->PreparedOutReadSets().empty())
+ return EExecutionStatus::DelayCompleteNoMoreRestarts;
+
if (newArtifact || hadWrites)
return EExecutionStatus::ExecutedNoMoreRestarts;
- return EExecutionStatus::Executed;
-}
-
-void TStoreAndSendOutRSUnit::Complete(TOperation::TPtr op,
- const TActorContext &ctx)
-{
- if (!op->PreparedOutReadSets().empty())
- DataShard.SendReadSets(ctx, std::move(op->PreparedOutReadSets()));
-}
-
+ return EExecutionStatus::Executed;
+}
+
+void TStoreAndSendOutRSUnit::Complete(TOperation::TPtr op,
+ const TActorContext &ctx)
+{
+ if (!op->PreparedOutReadSets().empty())
+ DataShard.SendReadSets(ctx, std::move(op->PreparedOutReadSets()));
+}
+
THolder<TExecutionUnit> CreateStoreAndSendOutRSUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TStoreAndSendOutRSUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/store_data_tx_unit.cpp b/ydb/core/tx/datashard/store_data_tx_unit.cpp
index 5cada27698d..8498e5c8b69 100644
--- a/ydb/core/tx/datashard/store_data_tx_unit.cpp
+++ b/ydb/core/tx/datashard/store_data_tx_unit.cpp
@@ -1,72 +1,72 @@
-#include "const.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "const.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TStoreDataTxUnit : public TExecutionUnit {
-public:
+
+class TStoreDataTxUnit : public TExecutionUnit {
+public:
TStoreDataTxUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TStoreDataTxUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TStoreDataTxUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TStoreDataTxUnit::TStoreDataTxUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::StoreDataTx, false, dataShard, pipeline)
-{
-}
-
-TStoreDataTxUnit::~TStoreDataTxUnit()
-{
-}
-
-bool TStoreDataTxUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TStoreDataTxUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::StoreDataTx, false, dataShard, pipeline)
+{
+}
+
+TStoreDataTxUnit::~TStoreDataTxUnit()
+{
+}
+
+bool TStoreDataTxUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TStoreDataTxUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
const TActorContext &ctx)
-{
- Y_VERIFY(op->IsDataTx() || op->IsReadTable());
- Y_VERIFY(!op->IsAborted() && !op->IsInterrupted());
-
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
- Y_VERIFY(tx->GetDataTx());
-
- Pipeline.SaveForPropose(tx->GetDataTx());
+{
+ Y_VERIFY(op->IsDataTx() || op->IsReadTable());
+ Y_VERIFY(!op->IsAborted() && !op->IsInterrupted());
+
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+ Y_VERIFY(tx->GetDataTx());
+
+ Pipeline.SaveForPropose(tx->GetDataTx());
Pipeline.ProposeTx(op, tx->GetTxBody(), txc, ctx);
-
- tx->ClearTxBody();
- tx->ClearDataTx();
-
+
+ tx->ClearTxBody();
+ tx->ClearDataTx();
+
return EExecutionStatus::DelayCompleteNoMoreRestarts;
-}
-
+}
+
void TStoreDataTxUnit::Complete(TOperation::TPtr op,
const TActorContext &ctx)
-{
+{
Pipeline.ProposeComplete(op, ctx);
-}
-
+}
+
THolder<TExecutionUnit> CreateStoreDataTxUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return MakeHolder<TStoreDataTxUnit>(dataShard, pipeline);
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/store_scheme_tx_unit.cpp b/ydb/core/tx/datashard/store_scheme_tx_unit.cpp
index dbc364107e7..6b1d8af9ed9 100644
--- a/ydb/core/tx/datashard/store_scheme_tx_unit.cpp
+++ b/ydb/core/tx/datashard/store_scheme_tx_unit.cpp
@@ -1,60 +1,60 @@
-#include "const.h"
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "const.h"
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TStoreSchemeTxUnit : public TExecutionUnit {
-public:
+
+class TStoreSchemeTxUnit : public TExecutionUnit {
+public:
TStoreSchemeTxUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TStoreSchemeTxUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TStoreSchemeTxUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TStoreSchemeTxUnit::TStoreSchemeTxUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::StoreSchemeTx, false, dataShard, pipeline)
-{
-}
-
-TStoreSchemeTxUnit::~TStoreSchemeTxUnit()
-{
-}
-
-bool TStoreSchemeTxUnit::IsReadyToExecute(TOperation::TPtr) const
-{
- return true;
-}
-
-EExecutionStatus TStoreSchemeTxUnit::Execute(TOperation::TPtr op,
- TTransactionContext &txc,
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::StoreSchemeTx, false, dataShard, pipeline)
+{
+}
+
+TStoreSchemeTxUnit::~TStoreSchemeTxUnit()
+{
+}
+
+bool TStoreSchemeTxUnit::IsReadyToExecute(TOperation::TPtr) const
+{
+ return true;
+}
+
+EExecutionStatus TStoreSchemeTxUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
const TActorContext &ctx)
-{
- Y_VERIFY(op->IsSchemeTx());
- Y_VERIFY(!op->IsAborted() && !op->IsInterrupted());
-
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
- ui64 ssTabletId = tx->GetSchemeShardId();
-
+{
+ Y_VERIFY(op->IsSchemeTx());
+ Y_VERIFY(!op->IsAborted() && !op->IsInterrupted());
+
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+ ui64 ssTabletId = tx->GetSchemeShardId();
+
if (DataShard.GetCurrentSchemeShardId() == INVALID_TABLET_ID) {
DataShard.PersistCurrentSchemeShardId(ssTabletId, txc);
- } else {
+ } else {
Y_VERIFY(DataShard.GetCurrentSchemeShardId() == ssTabletId,
- "Got scheme transaction from unknown SchemeShard %" PRIu64, ssTabletId);
- }
-
+ "Got scheme transaction from unknown SchemeShard %" PRIu64, ssTabletId);
+ }
+
if (ui64 subDomainPathId = tx->GetSubDomainPathId()) {
DataShard.PersistSubDomainPathId(ssTabletId, subDomainPathId, txc);
DataShard.StopFindSubDomainPathId();
@@ -73,33 +73,33 @@ EExecutionStatus TStoreSchemeTxUnit::Execute(TOperation::TPtr op,
}
if (!DataShard.GetProcessingParams()) {
- DataShard.PersistProcessingParams(tx->GetProcessingParams(), txc);
+ DataShard.PersistProcessingParams(tx->GetProcessingParams(), txc);
}
-
+
TSchemaOperation schemeOp(op->GetTxId(), tx->GetSchemeTxType(), op->GetTarget(),
- tx->GetSchemeShardId(), op->GetMinStep(), op->GetMaxStep(),
+ tx->GetSchemeShardId(), op->GetMinStep(), op->GetMaxStep(),
0, op->IsReadOnly(), false, TString(), 0, 0);
- Pipeline.ProposeSchemeTx(schemeOp, txc);
-
+ Pipeline.ProposeSchemeTx(schemeOp, txc);
+
Pipeline.ProposeTx(op, tx->GetTxBody(), txc, ctx);
- tx->ClearTxBody();
- // TODO: make cache for scheme tx similar to data tx.
- tx->ClearSchemeTx();
-
+ tx->ClearTxBody();
+ // TODO: make cache for scheme tx similar to data tx.
+ tx->ClearSchemeTx();
+
return EExecutionStatus::DelayCompleteNoMoreRestarts;
-}
-
+}
+
void TStoreSchemeTxUnit::Complete(TOperation::TPtr op,
const TActorContext &ctx)
-{
+{
Pipeline.ProposeComplete(op, ctx);
-}
-
+}
+
THolder<TExecutionUnit> CreateStoreSchemeTxUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TStoreSchemeTxUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/sys_tables.h b/ydb/core/tx/datashard/sys_tables.h
index a4e24874d13..e9887bd8dbb 100644
--- a/ydb/core/tx/datashard/sys_tables.h
+++ b/ydb/core/tx/datashard/sys_tables.h
@@ -58,8 +58,8 @@ struct TSysTables {
ui64 LockId = 0;
ui64 DataShard = 0;
ui32 Generation = 0;
- // Padding is used to avoid use-of-uninitialized on writes to DB.
- ui32 Padding_ = 0;
+ // Padding is used to avoid use-of-uninitialized on writes to DB.
+ ui32 Padding_ = 0;
ui64 Counter = 0;
ui64 SchemeShard = 0;
ui64 PathId = 0;
diff --git a/ydb/core/tx/datashard/wait_for_plan_unit.cpp b/ydb/core/tx/datashard/wait_for_plan_unit.cpp
index 4c52a59ac38..c1e81106a10 100644
--- a/ydb/core/tx/datashard/wait_for_plan_unit.cpp
+++ b/ydb/core/tx/datashard/wait_for_plan_unit.cpp
@@ -1,58 +1,58 @@
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TWaitForPlanUnit : public TExecutionUnit {
-public:
+
+class TWaitForPlanUnit : public TExecutionUnit {
+public:
TWaitForPlanUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TWaitForPlanUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
-};
-
+ TPipeline &pipeline);
+ ~TWaitForPlanUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+};
+
TWaitForPlanUnit::TWaitForPlanUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::WaitForPlan, false, dataShard, pipeline)
-{
-}
-
-TWaitForPlanUnit::~TWaitForPlanUnit()
-{
-}
-
-bool TWaitForPlanUnit::IsReadyToExecute(TOperation::TPtr op) const
-{
- return op->GetStep();
-}
-
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::WaitForPlan, false, dataShard, pipeline)
+{
+}
+
+TWaitForPlanUnit::~TWaitForPlanUnit()
+{
+}
+
+bool TWaitForPlanUnit::IsReadyToExecute(TOperation::TPtr op) const
+{
+ return op->GetStep();
+}
+
EExecutionStatus TWaitForPlanUnit::Execute(TOperation::TPtr op,
- TTransactionContext &,
- const TActorContext &)
-{
+ TTransactionContext &,
+ const TActorContext &)
+{
op->ResetCurrentTimer();
- return EExecutionStatus::Executed;
-}
-
-void TWaitForPlanUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ return EExecutionStatus::Executed;
+}
+
+void TWaitForPlanUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateWaitForPlanUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return MakeHolder<TWaitForPlanUnit>(dataShard, pipeline);
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/wait_for_stream_clearance_unit.cpp b/ydb/core/tx/datashard/wait_for_stream_clearance_unit.cpp
index c7c8c50353e..db91ceb7fc6 100644
--- a/ydb/core/tx/datashard/wait_for_stream_clearance_unit.cpp
+++ b/ydb/core/tx/datashard/wait_for_stream_clearance_unit.cpp
@@ -1,73 +1,73 @@
-#include "datashard_impl.h"
-#include "datashard_pipeline.h"
-#include "execution_unit_ctors.h"
-
-namespace NKikimr {
+#include "datashard_impl.h"
+#include "datashard_pipeline.h"
+#include "execution_unit_ctors.h"
+
+namespace NKikimr {
namespace NDataShard {
-
-class TWaitForStreamClearanceUnit : public TExecutionUnit {
-public:
+
+class TWaitForStreamClearanceUnit : public TExecutionUnit {
+public:
TWaitForStreamClearanceUnit(TDataShard &dataShard,
- TPipeline &pipeline);
- ~TWaitForStreamClearanceUnit() override;
-
- bool IsReadyToExecute(TOperation::TPtr op) const override;
- EExecutionStatus Execute(TOperation::TPtr op,
- TTransactionContext &txc,
- const TActorContext &ctx) override;
- void Complete(TOperation::TPtr op,
- const TActorContext &ctx) override;
-
-private:
- void ProcessEvent(TAutoPtr<NActors::IEventHandle> &ev,
- TOperation::TPtr op,
- const NActors::TActorContext &ctx);
+ TPipeline &pipeline);
+ ~TWaitForStreamClearanceUnit() override;
+
+ bool IsReadyToExecute(TOperation::TPtr op) const override;
+ EExecutionStatus Execute(TOperation::TPtr op,
+ TTransactionContext &txc,
+ const TActorContext &ctx) override;
+ void Complete(TOperation::TPtr op,
+ const TActorContext &ctx) override;
+
+private:
+ void ProcessEvent(TAutoPtr<NActors::IEventHandle> &ev,
+ TOperation::TPtr op,
+ const NActors::TActorContext &ctx);
void Handle(TDataShard::TEvPrivate::TEvNodeDisconnected::TPtr &ev,
- TOperation::TPtr op,
- const TActorContext &ctx);
- void Handle(TEvTxProcessing::TEvStreamClearanceResponse::TPtr &ev,
- TOperation::TPtr op,
- const TActorContext &ctx);
- void Handle(TEvTxProcessing::TEvInterruptTransaction::TPtr &ev,
- TOperation::TPtr op,
- const TActorContext &ctx);
- void Handle(TEvents::TEvUndelivered::TPtr &ev,
- TOperation::TPtr op,
- const TActorContext &ctx);
- void Abort(const TString &err,
- TOperation::TPtr op,
- const TActorContext &ctx);
-};
-
+ TOperation::TPtr op,
+ const TActorContext &ctx);
+ void Handle(TEvTxProcessing::TEvStreamClearanceResponse::TPtr &ev,
+ TOperation::TPtr op,
+ const TActorContext &ctx);
+ void Handle(TEvTxProcessing::TEvInterruptTransaction::TPtr &ev,
+ TOperation::TPtr op,
+ const TActorContext &ctx);
+ void Handle(TEvents::TEvUndelivered::TPtr &ev,
+ TOperation::TPtr op,
+ const TActorContext &ctx);
+ void Abort(const TString &err,
+ TOperation::TPtr op,
+ const TActorContext &ctx);
+};
+
TWaitForStreamClearanceUnit::TWaitForStreamClearanceUnit(TDataShard &dataShard,
- TPipeline &pipeline)
- : TExecutionUnit(EExecutionUnitKind::WaitForStreamClearance, false, dataShard, pipeline)
-{
-}
-
-TWaitForStreamClearanceUnit::~TWaitForStreamClearanceUnit()
-{
-}
-
-bool TWaitForStreamClearanceUnit::IsReadyToExecute(TOperation::TPtr op) const
-{
+ TPipeline &pipeline)
+ : TExecutionUnit(EExecutionUnitKind::WaitForStreamClearance, false, dataShard, pipeline)
+{
+}
+
+TWaitForStreamClearanceUnit::~TWaitForStreamClearanceUnit()
+{
+}
+
+bool TWaitForStreamClearanceUnit::IsReadyToExecute(TOperation::TPtr op) const
+{
// Pass aborted operations
if (op->Result() || op->HasResultSentFlag() || op->IsImmediate() && WillRejectDataTx(op))
return true;
- if (!op->IsWaitingForStreamClearance())
- return true;
-
- if (op->HasPendingInputEvents())
- return true;
-
- return false;
-}
-
-EExecutionStatus TWaitForStreamClearanceUnit::Execute(TOperation::TPtr op,
- TTransactionContext &,
- const TActorContext &ctx)
-{
+ if (!op->IsWaitingForStreamClearance())
+ return true;
+
+ if (op->HasPendingInputEvents())
+ return true;
+
+ return false;
+}
+
+EExecutionStatus TWaitForStreamClearanceUnit::Execute(TOperation::TPtr op,
+ TTransactionContext &,
+ const TActorContext &ctx)
+{
// Pass aborted operations
if (op->Result() || op->HasResultSentFlag() || op->IsImmediate() && CheckRejectDataTx(op, ctx)) {
op->ResetWaitingForStreamClearanceFlag();
@@ -75,144 +75,144 @@ EExecutionStatus TWaitForStreamClearanceUnit::Execute(TOperation::TPtr op,
return EExecutionStatus::Executed;
}
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- if (!op->IsWaitingForStreamClearance()) {
- auto tid = tx->GetDataTx()->GetReadTableTransaction().GetTableId().GetTableId();
- auto &info = *DataShard.GetUserTables().at(tid);
-
- TAutoPtr<TEvTxProcessing::TEvStreamClearanceRequest> request
- = new TEvTxProcessing::TEvStreamClearanceRequest;
- request->Record.SetTxId(op->GetTxId());
- request->Record.SetShardId(DataShard.TabletID());
- info.Range.Serialize(*request->Record.MutableKeyRange());
- ctx.Send(tx->GetStreamSink(), request.Release(),
- IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession,
- op->GetTxId());
-
- op->SetWaitingForStreamClearanceFlag();
- op->SetProcessDisconnectsFlag();
-
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Requested stream clearance from " << tx->GetStreamSink()
- << " for " << *op << " at " << DataShard.TabletID());
- }
-
- while (op->HasPendingInputEvents()) {
- ProcessEvent(op->InputEvents().front(), op, ctx);
- op->InputEvents().pop();
- }
-
- if (op->IsWaitingForStreamClearance())
- return EExecutionStatus::Continue;
-
- op->ResetProcessDisconnectsFlag();
-
- return EExecutionStatus::Executed;
-}
-
-void TWaitForStreamClearanceUnit::ProcessEvent(TAutoPtr<NActors::IEventHandle> &ev,
- TOperation::TPtr op,
- const NActors::TActorContext &ctx)
-{
- switch (ev->GetTypeRewrite()) {
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ if (!op->IsWaitingForStreamClearance()) {
+ auto tid = tx->GetDataTx()->GetReadTableTransaction().GetTableId().GetTableId();
+ auto &info = *DataShard.GetUserTables().at(tid);
+
+ TAutoPtr<TEvTxProcessing::TEvStreamClearanceRequest> request
+ = new TEvTxProcessing::TEvStreamClearanceRequest;
+ request->Record.SetTxId(op->GetTxId());
+ request->Record.SetShardId(DataShard.TabletID());
+ info.Range.Serialize(*request->Record.MutableKeyRange());
+ ctx.Send(tx->GetStreamSink(), request.Release(),
+ IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession,
+ op->GetTxId());
+
+ op->SetWaitingForStreamClearanceFlag();
+ op->SetProcessDisconnectsFlag();
+
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Requested stream clearance from " << tx->GetStreamSink()
+ << " for " << *op << " at " << DataShard.TabletID());
+ }
+
+ while (op->HasPendingInputEvents()) {
+ ProcessEvent(op->InputEvents().front(), op, ctx);
+ op->InputEvents().pop();
+ }
+
+ if (op->IsWaitingForStreamClearance())
+ return EExecutionStatus::Continue;
+
+ op->ResetProcessDisconnectsFlag();
+
+ return EExecutionStatus::Executed;
+}
+
+void TWaitForStreamClearanceUnit::ProcessEvent(TAutoPtr<NActors::IEventHandle> &ev,
+ TOperation::TPtr op,
+ const NActors::TActorContext &ctx)
+{
+ switch (ev->GetTypeRewrite()) {
OHFunc(TDataShard::TEvPrivate::TEvNodeDisconnected, Handle);
- OHFunc(TEvTxProcessing::TEvStreamClearanceResponse, Handle);
- OHFunc(TEvTxProcessing::TEvInterruptTransaction, Handle);
- OHFunc(TEvents::TEvUndelivered, Handle);
- IgnoreFunc(TEvTxProcessing::TEvStreamClearancePending);
- default:
- LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
- "TWaitForStreamClearanceUnit::ProcessEvent unhandled event type: " << ev->GetTypeRewrite()
- << " event: " << (ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?"));
- Y_VERIFY_DEBUG(false, "unexpected event %" PRIu64, (ui64)ev->GetTypeRewrite());
- }
-}
-
+ OHFunc(TEvTxProcessing::TEvStreamClearanceResponse, Handle);
+ OHFunc(TEvTxProcessing::TEvInterruptTransaction, Handle);
+ OHFunc(TEvents::TEvUndelivered, Handle);
+ IgnoreFunc(TEvTxProcessing::TEvStreamClearancePending);
+ default:
+ LOG_ERROR_S(ctx, NKikimrServices::TX_DATASHARD,
+ "TWaitForStreamClearanceUnit::ProcessEvent unhandled event type: " << ev->GetTypeRewrite()
+ << " event: " << (ev->HasEvent() ? ev->GetBase()->ToString().data() : "serialized?"));
+ Y_VERIFY_DEBUG(false, "unexpected event %" PRIu64, (ui64)ev->GetTypeRewrite());
+ }
+}
+
void TWaitForStreamClearanceUnit::Handle(TDataShard::TEvPrivate::TEvNodeDisconnected::TPtr &ev,
- TOperation::TPtr op,
- const TActorContext &ctx)
-{
- if (op->IsWaitingForStreamClearance()) {
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- if (ev->Get()->NodeId == tx->GetStreamSink().NodeId()) {
- Abort(TStringBuilder() << "Disconnected from stream sink (node " << ev->Get()->NodeId
- << ") while waiting for stream clearance for " << *op << " at "
- << DataShard.TabletID(), op, ctx);
- }
- }
-}
-
-void TWaitForStreamClearanceUnit::Handle(TEvTxProcessing::TEvStreamClearanceResponse::TPtr &ev,
- TOperation::TPtr op,
- const TActorContext &ctx)
-{
- if (op->IsWaitingForStreamClearance()) {
- if (ev->Get()->Record.GetCleared()) {
- LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
- "Got stream clearance for " << *op << " at " << DataShard.TabletID());
- op->ResetWaitingForStreamClearanceFlag();
- } else {
- Abort(TStringBuilder() << "Got stream clearance reject for " << *op
- << " at " << DataShard.TabletID(),
- op, ctx);
- }
- }
-}
-
-void TWaitForStreamClearanceUnit::Handle(TEvTxProcessing::TEvInterruptTransaction::TPtr &,
- TOperation::TPtr op,
- const TActorContext &ctx)
-{
- if (op->IsWaitingForStreamClearance()) {
- Abort(TStringBuilder() << "Interrupted operation " << *op << " at "
- << DataShard.TabletID() << " while waiting for stream clearance",
- op, ctx);
- }
-}
-
-void TWaitForStreamClearanceUnit::Handle(TEvents::TEvUndelivered::TPtr &,
- TOperation::TPtr op,
- const TActorContext &ctx)
-{
- if (op->IsWaitingForStreamClearance()) {
- Abort(TStringBuilder() << "Couldn't deliver stream clearance request for "
- << *op << " at " << DataShard.TabletID(),
- op, ctx);
- }
-}
-
-void TWaitForStreamClearanceUnit::Abort(const TString &err,
- TOperation::TPtr op,
- const TActorContext &ctx)
-{
- TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
- Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
-
- BuildResult(op)->AddError(NKikimrTxDataShard::TError::WRONG_SHARD_STATE, err);
- if (tx->GetScanSnapshotId()) {
- DataShard.DropScanSnapshot(tx->GetScanSnapshotId());
- tx->SetScanSnapshotId(0);
- }
-
- LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD, err);
-
- op->ResetWaitingForStreamClearanceFlag();
-}
-
-void TWaitForStreamClearanceUnit::Complete(TOperation::TPtr,
- const TActorContext &)
-{
-}
-
+ TOperation::TPtr op,
+ const TActorContext &ctx)
+{
+ if (op->IsWaitingForStreamClearance()) {
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ if (ev->Get()->NodeId == tx->GetStreamSink().NodeId()) {
+ Abort(TStringBuilder() << "Disconnected from stream sink (node " << ev->Get()->NodeId
+ << ") while waiting for stream clearance for " << *op << " at "
+ << DataShard.TabletID(), op, ctx);
+ }
+ }
+}
+
+void TWaitForStreamClearanceUnit::Handle(TEvTxProcessing::TEvStreamClearanceResponse::TPtr &ev,
+ TOperation::TPtr op,
+ const TActorContext &ctx)
+{
+ if (op->IsWaitingForStreamClearance()) {
+ if (ev->Get()->Record.GetCleared()) {
+ LOG_TRACE_S(ctx, NKikimrServices::TX_DATASHARD,
+ "Got stream clearance for " << *op << " at " << DataShard.TabletID());
+ op->ResetWaitingForStreamClearanceFlag();
+ } else {
+ Abort(TStringBuilder() << "Got stream clearance reject for " << *op
+ << " at " << DataShard.TabletID(),
+ op, ctx);
+ }
+ }
+}
+
+void TWaitForStreamClearanceUnit::Handle(TEvTxProcessing::TEvInterruptTransaction::TPtr &,
+ TOperation::TPtr op,
+ const TActorContext &ctx)
+{
+ if (op->IsWaitingForStreamClearance()) {
+ Abort(TStringBuilder() << "Interrupted operation " << *op << " at "
+ << DataShard.TabletID() << " while waiting for stream clearance",
+ op, ctx);
+ }
+}
+
+void TWaitForStreamClearanceUnit::Handle(TEvents::TEvUndelivered::TPtr &,
+ TOperation::TPtr op,
+ const TActorContext &ctx)
+{
+ if (op->IsWaitingForStreamClearance()) {
+ Abort(TStringBuilder() << "Couldn't deliver stream clearance request for "
+ << *op << " at " << DataShard.TabletID(),
+ op, ctx);
+ }
+}
+
+void TWaitForStreamClearanceUnit::Abort(const TString &err,
+ TOperation::TPtr op,
+ const TActorContext &ctx)
+{
+ TActiveTransaction *tx = dynamic_cast<TActiveTransaction*>(op.Get());
+ Y_VERIFY_S(tx, "cannot cast operation of kind " << op->GetKind());
+
+ BuildResult(op)->AddError(NKikimrTxDataShard::TError::WRONG_SHARD_STATE, err);
+ if (tx->GetScanSnapshotId()) {
+ DataShard.DropScanSnapshot(tx->GetScanSnapshotId());
+ tx->SetScanSnapshotId(0);
+ }
+
+ LOG_NOTICE_S(ctx, NKikimrServices::TX_DATASHARD, err);
+
+ op->ResetWaitingForStreamClearanceFlag();
+}
+
+void TWaitForStreamClearanceUnit::Complete(TOperation::TPtr,
+ const TActorContext &)
+{
+}
+
THolder<TExecutionUnit> CreateWaitForStreamClearanceUnit(TDataShard &dataShard,
- TPipeline &pipeline)
-{
+ TPipeline &pipeline)
+{
return THolder(new TWaitForStreamClearanceUnit(dataShard, pipeline));
-}
-
+}
+
} // namespace NDataShard
-} // namespace NKikimr
+} // namespace NKikimr
diff --git a/ydb/core/tx/datashard/ya.make b/ydb/core/tx/datashard/ya.make
index 2768977ca8a..9c98e8e79b0 100644
--- a/ydb/core/tx/datashard/ya.make
+++ b/ydb/core/tx/datashard/ya.make
@@ -7,13 +7,13 @@ OWNER(
SRCS(
alter_cdc_stream_unit.cpp
- alter_table_unit.cpp
- backup_unit.cpp
- build_and_wait_dependencies_unit.cpp
- build_data_tx_out_rs_unit.cpp
+ alter_table_unit.cpp
+ backup_unit.cpp
+ build_and_wait_dependencies_unit.cpp
+ build_data_tx_out_rs_unit.cpp
build_distributed_erase_tx_out_rs_unit.cpp
- build_kqp_data_tx_out_rs_unit.cpp
- build_scheme_tx_out_rs_unit.cpp
+ build_kqp_data_tx_out_rs_unit.cpp
+ build_scheme_tx_out_rs_unit.cpp
change_collector_async_index.cpp
change_collector_base.cpp
change_collector_cdc_stream.cpp
@@ -27,22 +27,22 @@ SRCS(
change_sender_cdc_stream.cpp
change_sender_common_ops.cpp
check_commit_writes_tx_unit.cpp
- check_data_tx_unit.cpp
+ check_data_tx_unit.cpp
check_distributed_erase_tx_unit.cpp
- check_scheme_tx_unit.cpp
+ check_scheme_tx_unit.cpp
check_snapshot_tx_unit.cpp
- complete_data_tx_unit.cpp
- completed_operations_unit.cpp
+ complete_data_tx_unit.cpp
+ completed_operations_unit.cpp
create_cdc_stream_unit.cpp
create_persistent_snapshot_unit.cpp
- create_table_unit.cpp
+ create_table_unit.cpp
create_volatile_snapshot_unit.cpp
datashard__build_index.cpp
- datashard__cancel_tx_proposal.cpp
+ datashard__cancel_tx_proposal.cpp
datashard__compact_borrowed.cpp
datashard__compaction.cpp
datashard__cleanup_borrowed.cpp
- datashard__cleanup_in_rs.cpp
+ datashard__cleanup_in_rs.cpp
datashard__cleanup_tx.cpp
datashard__conditional_erase_rows.cpp
datashard__engine_host.cpp
@@ -67,7 +67,7 @@ SRCS(
datashard__kqp_scan.cpp
datashard__snapshot_txs.cpp
datashard__stats.cpp
- datashard__store_table_path.cpp
+ datashard__store_table_path.cpp
datashard__store_scan_state.cpp
datashard_change_receiving.cpp
datashard_change_sender_activation.cpp
@@ -122,64 +122,64 @@ SRCS(
datashard_txs.h
datashard.cpp
datashard.h
- defs.h
+ defs.h
direct_tx_unit.cpp
drop_cdc_stream_unit.cpp
drop_index_notice_unit.cpp
drop_persistent_snapshot_unit.cpp
- drop_table_unit.cpp
+ drop_table_unit.cpp
drop_volatile_snapshot_unit.cpp
erase_rows_condition.cpp
execute_commit_writes_tx_unit.cpp
- execute_data_tx_unit.cpp
+ execute_data_tx_unit.cpp
execute_distributed_erase_tx_unit.cpp
- execute_kqp_data_tx_unit.cpp
+ execute_kqp_data_tx_unit.cpp
execute_kqp_scan_tx_unit.cpp
- execution_unit.cpp
- execution_unit.h
- execution_unit_ctors.h
- execution_unit_kind.h
+ execution_unit.cpp
+ execution_unit.h
+ execution_unit_ctors.h
+ execution_unit_kind.h
export_common.cpp
export_iface.cpp
export_iface.h
export_scan.cpp
finalize_build_index_unit.cpp
- finish_propose_unit.cpp
+ finish_propose_unit.cpp
initiate_build_index_unit.cpp
- key_conflicts.cpp
- key_conflicts.h
- load_and_wait_in_rs_unit.cpp
- load_tx_details_unit.cpp
- make_scan_snapshot_unit.cpp
- make_snapshot_unit.cpp
+ key_conflicts.cpp
+ key_conflicts.h
+ load_and_wait_in_rs_unit.cpp
+ load_tx_details_unit.cpp
+ make_scan_snapshot_unit.cpp
+ make_snapshot_unit.cpp
move_table_unit.cpp
- operation.cpp
- operation.h
- plan_queue_unit.cpp
- prepare_data_tx_in_rs_unit.cpp
+ operation.cpp
+ operation.h
+ plan_queue_unit.cpp
+ prepare_data_tx_in_rs_unit.cpp
prepare_distributed_erase_tx_in_rs_unit.cpp
- prepare_kqp_data_tx_in_rs_unit.cpp
- prepare_scheme_tx_in_rs_unit.cpp
- progress_queue.h
+ prepare_kqp_data_tx_in_rs_unit.cpp
+ prepare_scheme_tx_in_rs_unit.cpp
+ progress_queue.h
protect_scheme_echoes_unit.cpp
- read_table_scan.h
- read_table_scan.cpp
- read_table_scan_unit.cpp
- receive_snapshot_unit.cpp
+ read_table_scan.h
+ read_table_scan.cpp
+ read_table_scan_unit.cpp
+ receive_snapshot_unit.cpp
range_avl_tree.cpp
range_ops.cpp
range_treap.cpp
read_iterator.h
restore_unit.cpp
- setup_sys_locks.h
- store_and_send_out_rs_unit.cpp
+ setup_sys_locks.h
+ store_and_send_out_rs_unit.cpp
store_commit_writes_tx_unit.cpp
- store_data_tx_unit.cpp
+ store_data_tx_unit.cpp
store_distributed_erase_tx_unit.cpp
- store_scheme_tx_unit.cpp
+ store_scheme_tx_unit.cpp
store_snapshot_tx_unit.cpp
- wait_for_plan_unit.cpp
- wait_for_stream_clearance_unit.cpp
+ wait_for_plan_unit.cpp
+ wait_for_stream_clearance_unit.cpp
upload_stats.cpp
)
@@ -187,22 +187,22 @@ GENERATE_ENUM_SERIALIZATION(change_exchange.h)
GENERATE_ENUM_SERIALIZATION(change_record.h)
-GENERATE_ENUM_SERIALIZATION(datashard.h)
+GENERATE_ENUM_SERIALIZATION(datashard.h)
-GENERATE_ENUM_SERIALIZATION(datashard_active_transaction.h)
+GENERATE_ENUM_SERIALIZATION(datashard_active_transaction.h)
GENERATE_ENUM_SERIALIZATION(datashard_s3_upload.h)
-GENERATE_ENUM_SERIALIZATION(execution_unit.h)
+GENERATE_ENUM_SERIALIZATION(execution_unit.h)
-GENERATE_ENUM_SERIALIZATION(execution_unit_kind.h)
+GENERATE_ENUM_SERIALIZATION(execution_unit_kind.h)
+
+GENERATE_ENUM_SERIALIZATION(operation.h)
+
+RESOURCE(
+ index.html datashard/index.html
+)
-GENERATE_ENUM_SERIALIZATION(operation.h)
-
-RESOURCE(
- index.html datashard/index.html
-)
-
PEERDIR(
library/cpp/actors/core
library/cpp/containers/flat_hash
diff --git a/ydb/core/tx/mediator/tablet_queue.cpp b/ydb/core/tx/mediator/tablet_queue.cpp
index 5576ab46506..b28179517ca 100644
--- a/ydb/core/tx/mediator/tablet_queue.cpp
+++ b/ydb/core/tx/mediator/tablet_queue.cpp
@@ -111,7 +111,7 @@ class TTxMediatorTabletQueue : public TActor<TTxMediatorTabletQueue> {
if (updateTimecast) {
if (!TimecastLagCounter)
- TimecastLagCounter = GetServiceCounters(AppData(ctx)->Counters, "processing")->GetSubgroup("mediator", ToString(Mediator))->GetSubgroup("sensor", "TimecastLag")->GetNamedCounter("Bucket", ToString(HashBucket));
+ TimecastLagCounter = GetServiceCounters(AppData(ctx)->Counters, "processing")->GetSubgroup("mediator", ToString(Mediator))->GetSubgroup("sensor", "TimecastLag")->GetNamedCounter("Bucket", ToString(HashBucket));
*TimecastLagCounter = (AcceptedStep - CommitedStep);
TEvMediatorTimecast::TEvUpdate evx;
diff --git a/ydb/core/tx/tx_allocator/txallocator_impl.cpp b/ydb/core/tx/tx_allocator/txallocator_impl.cpp
index 6137d5f04e7..a4940b8f354 100644
--- a/ydb/core/tx/tx_allocator/txallocator_impl.cpp
+++ b/ydb/core/tx/tx_allocator/txallocator_impl.cpp
@@ -44,7 +44,7 @@ ui64 TTxAllocator::ApplyPrivateMarker(const ui64 elem) {
void TTxAllocator::InitCounters(const TActorContext &ctx) {
auto &counters = AppData(ctx)->Counters;
- MonCounters.AllocatorCounters = GetServiceCounters(counters, "tablets")->GetSubgroup("type", "TxAllocator");
+ MonCounters.AllocatorCounters = GetServiceCounters(counters, "tablets")->GetSubgroup("type", "TxAllocator");
MonCounters.Allocated = MonCounters.AllocatorCounters->GetCounter("Allocated", true);
MonCounters.AllocationsPresence = MonCounters.AllocatorCounters->GetCounter("AllocationPresence", true);
diff --git a/ydb/core/tx/tx_processing.h b/ydb/core/tx/tx_processing.h
index 5a9c43fe578..72276c1af3d 100644
--- a/ydb/core/tx/tx_processing.h
+++ b/ydb/core/tx/tx_processing.h
@@ -9,20 +9,20 @@ struct TEvTxProcessing {
EvPlanStep = EventSpaceBegin(TKikimrEvents::ES_TX_PROCESSING),
EvReadSet,
EvPrePlanTx, // unused
- EvStreamClearanceRequest,
- EvStreamQuotaRequest,
- EvStreamQuotaRelease,
- EvStreamIsDead,
- EvInterruptTransaction,
+ EvStreamClearanceRequest,
+ EvStreamQuotaRequest,
+ EvStreamQuotaRelease,
+ EvStreamIsDead,
+ EvInterruptTransaction,
EvPlanStepAck = EvPlanStep + 512,
EvPrePlanTxAck, // unused
EvReadSetAck,
EvPlanStepAccepted,
- EvStreamClearanceResponse,
- EvStreamQuotaResponse,
- EvStreamClearancePending,
- EvStreamDataAck,
+ EvStreamClearanceResponse,
+ EvStreamQuotaResponse,
+ EvStreamClearancePending,
+ EvStreamDataAck,
EvEnd
};
@@ -173,77 +173,77 @@ struct TEvTxProcessing {
str << "}";
return str.Str();
}
- };
+ };
+
+ struct TEvStreamClearanceRequest: public TEventPB<TEvStreamClearanceRequest,
+ NKikimrTx::TEvStreamClearanceRequest,
+ EvStreamClearanceRequest>
+ {
+ };
+
+ struct TEvStreamClearanceResponse: public TEventPB<TEvStreamClearanceResponse,
+ NKikimrTx::TEvStreamClearanceResponse,
+ EvStreamClearanceResponse>
+ {
+ };
+
+ struct TEvStreamClearancePending: public TEventPB<TEvStreamClearancePending,
+ NKikimrTx::TEvStreamClearancePending,
+ EvStreamClearancePending>
+ {
+ TEvStreamClearancePending() = default;
+
+ TEvStreamClearancePending(ui64 txId)
+ {
+ Record.SetTxId(txId);
+ }
+ };
+
+ struct TEvStreamQuotaRequest: public TEventPB<TEvStreamQuotaRequest,
+ NKikimrTx::TEvStreamQuotaRequest,
+ EvStreamQuotaRequest>
+ {
+ };
+
+ struct TEvStreamQuotaResponse: public TEventPB<TEvStreamQuotaResponse,
+ NKikimrTx::TEvStreamQuotaResponse,
+ EvStreamQuotaResponse>
+ {
+ };
+
+ struct TEvStreamQuotaRelease: public TEventPB<TEvStreamQuotaRelease,
+ NKikimrTx::TEvStreamQuotaRelease,
+ EvStreamQuotaRelease>
+ {
+ };
+
+ struct TEvStreamIsDead: public TEventPB<TEvStreamIsDead,
+ NKikimrTx::TEvStreamIsDead,
+ EvStreamIsDead>
+ {
+ TEvStreamIsDead(ui64 txId = 0)
+ {
+ Record.SetTxId(txId);
+ }
+ };
+
+ struct TEvInterruptTransaction: public TEventPB<TEvInterruptTransaction,
+ NKikimrTx::TEvInterruptTransaction,
+ EvInterruptTransaction>
+ {
+ TEvInterruptTransaction() = default;
+
+ TEvInterruptTransaction(ui64 txId)
+ {
+ Record.SetTxId(txId);
+ }
+ };
- struct TEvStreamClearanceRequest: public TEventPB<TEvStreamClearanceRequest,
- NKikimrTx::TEvStreamClearanceRequest,
- EvStreamClearanceRequest>
- {
+ struct TEvStreamDataAck: public TEventPB<TEvStreamDataAck,
+ NKikimrTx::TEvStreamDataAck,
+ EvStreamDataAck>
+ {
};
-
- struct TEvStreamClearanceResponse: public TEventPB<TEvStreamClearanceResponse,
- NKikimrTx::TEvStreamClearanceResponse,
- EvStreamClearanceResponse>
- {
- };
-
- struct TEvStreamClearancePending: public TEventPB<TEvStreamClearancePending,
- NKikimrTx::TEvStreamClearancePending,
- EvStreamClearancePending>
- {
- TEvStreamClearancePending() = default;
-
- TEvStreamClearancePending(ui64 txId)
- {
- Record.SetTxId(txId);
- }
- };
-
- struct TEvStreamQuotaRequest: public TEventPB<TEvStreamQuotaRequest,
- NKikimrTx::TEvStreamQuotaRequest,
- EvStreamQuotaRequest>
- {
- };
-
- struct TEvStreamQuotaResponse: public TEventPB<TEvStreamQuotaResponse,
- NKikimrTx::TEvStreamQuotaResponse,
- EvStreamQuotaResponse>
- {
- };
-
- struct TEvStreamQuotaRelease: public TEventPB<TEvStreamQuotaRelease,
- NKikimrTx::TEvStreamQuotaRelease,
- EvStreamQuotaRelease>
- {
- };
-
- struct TEvStreamIsDead: public TEventPB<TEvStreamIsDead,
- NKikimrTx::TEvStreamIsDead,
- EvStreamIsDead>
- {
- TEvStreamIsDead(ui64 txId = 0)
- {
- Record.SetTxId(txId);
- }
- };
-
- struct TEvInterruptTransaction: public TEventPB<TEvInterruptTransaction,
- NKikimrTx::TEvInterruptTransaction,
- EvInterruptTransaction>
- {
- TEvInterruptTransaction() = default;
-
- TEvInterruptTransaction(ui64 txId)
- {
- Record.SetTxId(txId);
- }
- };
-
- struct TEvStreamDataAck: public TEventPB<TEvStreamDataAck,
- NKikimrTx::TEvStreamDataAck,
- EvStreamDataAck>
- {
- };
};
}
diff --git a/ydb/core/tx/tx_proxy/datareq.cpp b/ydb/core/tx/tx_proxy/datareq.cpp
index f099a55a61c..af48b42d60f 100644
--- a/ydb/core/tx/tx_proxy/datareq.cpp
+++ b/ydb/core/tx/tx_proxy/datareq.cpp
@@ -23,12 +23,12 @@
#include <ydb/library/yql/minikql/mkql_type_ops.h>
#include <ydb/library/yql/public/issue/yql_issue_message.h>
#include <ydb/library/yql/public/issue/yql_issue_manager.h>
-
+
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/hfunc.h>
#include <util/generic/hash_set.h>
-#include <util/generic/queue.h>
+#include <util/generic/queue.h>
#ifndef KIKIMR_DATAREQ_WATCHDOG_PERIOD
#define KIKIMR_DATAREQ_WATCHDOG_PERIOD 10000
@@ -85,103 +85,103 @@ struct TFlatMKQLRequest : public TThrRefBase {
}
};
-// Class used to merge key ranges and arrange shards for ordered scans.
-class TKeySpace {
-public:
- TKeySpace();
-
- void Initialize(bool ordered, TConstArrayRef<NScheme::TTypeId> keyTypes, const TTableRange &range);
-
+// Class used to merge key ranges and arrange shards for ordered scans.
+class TKeySpace {
+public:
+ TKeySpace();
+
+ void Initialize(bool ordered, TConstArrayRef<NScheme::TTypeId> keyTypes, const TTableRange &range);
+
const TVector<NScheme::TTypeId> &GetKeyTypes() { return KeyTypes; }
-
- void AddRange(const NKikimrTx::TKeyRange &range, ui64 shard);
- bool IsFull() const;
-
- const TQueue<ui64> &GetShardsQueue() const { return ShardsQueue; }
- bool IsShardsQueueEmpty() const { return ShardsQueue.empty(); }
- ui64 ShardsQueueFront() const { return ShardsQueue.front(); }
- void ShardsQueuePop() { ShardsQueue.pop(); }
- void FlushShardsToQueue();
-
- const TSerializedTableRange &GetSpace() const { return SpaceRange; }
-
-private:
- class TRange : public TSerializedTableRange {
- public:
- TRange() = default;
- TRange(const TRange &other) = default;
-
- TRange(const NKikimrTx::TKeyRange &range)
- : TSerializedTableRange(range)
- {}
-
- TRange &operator=(const TRange &other) = default;
-
+
+ void AddRange(const NKikimrTx::TKeyRange &range, ui64 shard);
+ bool IsFull() const;
+
+ const TQueue<ui64> &GetShardsQueue() const { return ShardsQueue; }
+ bool IsShardsQueueEmpty() const { return ShardsQueue.empty(); }
+ ui64 ShardsQueueFront() const { return ShardsQueue.front(); }
+ void ShardsQueuePop() { ShardsQueue.pop(); }
+ void FlushShardsToQueue();
+
+ const TSerializedTableRange &GetSpace() const { return SpaceRange; }
+
+private:
+ class TRange : public TSerializedTableRange {
+ public:
+ TRange() = default;
+ TRange(const TRange &other) = default;
+
+ TRange(const NKikimrTx::TKeyRange &range)
+ : TSerializedTableRange(range)
+ {}
+
+ TRange &operator=(const TRange &other) = default;
+
TVector<ui64> Shards;
- };
+ };
using TRanges = TList<TRange>;
-
- bool IsGreater(const TConstArrayRef<TCell> &lhs, const TConstArrayRef<TCell> &rhs) const;
- void TryToMergeRange(TRanges::iterator it);
- bool TryToMergeWithPrev(TRanges::iterator it);
-
+
+ bool IsGreater(const TConstArrayRef<TCell> &lhs, const TConstArrayRef<TCell> &rhs) const;
+ void TryToMergeRange(TRanges::iterator it);
+ bool TryToMergeWithPrev(TRanges::iterator it);
+
TVector<NScheme::TTypeId> KeyTypes;
- TSerializedTableRange SpaceRange;
- TRanges Ranges;
- bool OrderedQueue;
+ TSerializedTableRange SpaceRange;
+ TRanges Ranges;
+ bool OrderedQueue;
TQueue<ui64> ShardsQueue;
- TSerializedCellVec QueuePoint;
-};
-
-struct TReadTableRequest : public TThrRefBase {
- struct TQuotaRequest {
+ TSerializedCellVec QueuePoint;
+};
+
+struct TReadTableRequest : public TThrRefBase {
+ struct TQuotaRequest {
TActorId Sender;
- ui64 ShardId;
- };
-
- TString TablePath;
- TTableId TableId;
- bool Ordered;
- bool AllowDuplicates;
+ ui64 ShardId;
+ };
+
+ TString TablePath;
+ TTableId TableId;
+ bool Ordered;
+ bool AllowDuplicates;
TVector<TTableColumnInfo> Columns;
- NKikimrTxUserProxy::TKeyRange Range;
- TString ResponseData;
- ui64 ResponseDataFrom;
- TKeySpace KeySpace;
+ NKikimrTxUserProxy::TKeyRange Range;
+ TString ResponseData;
+ ui64 ResponseDataFrom;
+ TKeySpace KeySpace;
THashMap<ui64, TActorId> ClearanceSenders;
THashMap<ui64, TActorId> StreamingShards;
TSerializedCellVec FromValues;
TSerializedCellVec ToValues;
THolder<TKeyDesc> KeyDesc;
- bool RowsLimited;
- ui64 RowsRemain;
- THashMap<ui64, TQuotaRequest> QuotaRequests;
- ui64 QuotaRequestId;
+ bool RowsLimited;
+ ui64 RowsRemain;
+ THashMap<ui64, TQuotaRequest> QuotaRequests;
+ ui64 QuotaRequestId;
ui32 RequestVersion;
ui32 ResponseVersion = NKikimrTxUserProxy::TReadTableTransaction::UNSPECIFIED;
TRowVersion Snapshot = TRowVersion::Max();
-
- TReadTableRequest(const NKikimrTxUserProxy::TReadTableTransaction &tx)
- : TablePath(tx.GetPath())
- , Ordered(tx.GetOrdered())
- , AllowDuplicates(tx.GetAllowDuplicates())
- , Range(tx.GetKeyRange())
- , RowsLimited(tx.GetRowLimit() > 0)
- , RowsRemain(tx.GetRowLimit())
- , QuotaRequestId(1)
+
+ TReadTableRequest(const NKikimrTxUserProxy::TReadTableTransaction &tx)
+ : TablePath(tx.GetPath())
+ , Ordered(tx.GetOrdered())
+ , AllowDuplicates(tx.GetAllowDuplicates())
+ , Range(tx.GetKeyRange())
+ , RowsLimited(tx.GetRowLimit() > 0)
+ , RowsRemain(tx.GetRowLimit())
+ , QuotaRequestId(1)
, RequestVersion(tx.HasApiVersion() ? tx.GetApiVersion() : (ui32)NKikimrTxUserProxy::TReadTableTransaction::UNSPECIFIED)
- {
- for (auto &col : tx.GetColumns()) {
- Columns.emplace_back(col, 0, 0);
- }
+ {
+ for (auto &col : tx.GetColumns()) {
+ Columns.emplace_back(col, 0, 0);
+ }
if (tx.HasSnapshotStep() && tx.HasSnapshotTxId()) {
Snapshot.Step = tx.GetSnapshotStep();
Snapshot.TxId = tx.GetSnapshotTxId();
}
- }
-};
-
+ }
+};
+
class TDataReq : public TActor<TDataReq> {
public:
enum class EParseRangeKeyExp {
@@ -265,7 +265,7 @@ public:
ui64 ProgramSize = 0;
ui64 IncomingReadSetsSize = 0;
ui64 OutgoingReadSetsSize = 0;
- bool StreamCleared = false;
+ bool StreamCleared = false;
bool Restarting = false;
size_t RestartCount = 0;
TTableId TableId;
@@ -306,10 +306,10 @@ private:
TActorId RequestSource;
ui32 TxFlags;
bool CanUseFollower;
- bool StreamResponse;
+ bool StreamResponse;
TIntrusivePtr<TFlatMKQLRequest> FlatMKQLRequest;
- TIntrusivePtr<TReadTableRequest> ReadTableRequest;
+ TIntrusivePtr<TReadTableRequest> ReadTableRequest;
TString DatashardErrors;
TVector<ui64> ComplainingDatashards;
TVector<TString> UnresolvedKeys;
@@ -331,7 +331,7 @@ private:
ui64 ResultsReceivedSize;
TRequestControls RequestControls;
-
+
TInstant WallClockAccepted;
TInstant WallClockResolveStarted;
TInstant WallClockResolved;
@@ -358,7 +358,7 @@ private:
TAutoPtr<TEvTxProxySchemeCache::TEvResolveKeySet> PrepareFlatMKQLRequest(TStringBuf miniKQLProgram, TStringBuf miniKQLParams, const TActorContext &ctx);
void ProcessFlatMKQLResolve(NSchemeCache::TSchemeCacheRequest *cacheRequest, const TActorContext &ctx);
- void ProcessReadTableResolve(NSchemeCache::TSchemeCacheRequest *cacheRequest, const TActorContext &ctx);
+ void ProcessReadTableResolve(NSchemeCache::TSchemeCacheRequest *cacheRequest, const TActorContext &ctx);
TIntrusivePtr<TTxProxyMon> TxProxyMon;
@@ -368,13 +368,13 @@ private:
Send(Services.FollowerPipeCache, new TEvPipeCache::TEvUnlink(0));
Send(Services.LeaderPipeCache, new TEvPipeCache::TEvUnlink(0));
- ProcessStreamClearance(false, ctx);
- if (ReadTableRequest) {
- for (auto &tr : ReadTableRequest->StreamingShards) {
- ctx.Send(tr.second, new TEvTxProcessing::TEvInterruptTransaction(TxId));
- }
- }
-
+ ProcessStreamClearance(false, ctx);
+ if (ReadTableRequest) {
+ for (auto &tr : ReadTableRequest->StreamingShards) {
+ ctx.Send(tr.second, new TEvTxProcessing::TEvInterruptTransaction(TxId));
+ }
+ }
+
TActor::Die(ctx);
}
@@ -389,12 +389,12 @@ private:
void RegisterPlan(const TActorContext &ctx);
void MergeResult(TEvDataShard::TEvProposeTransactionResult::TPtr &ev, const TActorContext &ctx);
void MakeFlatMKQLResponse(const TActorContext &ctx, const NCpuTime::TCpuTimer& timer);
-
- void ProcessStreamResponseData(TEvDataShard::TEvProposeTransactionResult::TPtr &ev,
- const TActorContext &ctx);
- void FinishShardStream(TEvDataShard::TEvProposeTransactionResult::TPtr &ev, const TActorContext &ctx);
- void FinishStreamResponse(const TActorContext &ctx);
-
+
+ void ProcessStreamResponseData(TEvDataShard::TEvProposeTransactionResult::TPtr &ev,
+ const TActorContext &ctx);
+ void FinishShardStream(TEvDataShard::TEvProposeTransactionResult::TPtr &ev, const TActorContext &ctx);
+ void FinishStreamResponse(const TActorContext &ctx);
+
ui64 SelectCoordinator(NSchemeCache::TSchemeCacheRequest &cacheRequest, const TActorContext &ctx);
const TDomainsInfo::TDomain& SelectDomain(NSchemeCache::TSchemeCacheRequest &cacheRequest, const TActorContext &ctx);
@@ -404,7 +404,7 @@ private:
void Handle(TEvents::TEvUndelivered::TPtr &ev, const TActorContext &ctx);
void Handle(TEvTxProxyReq::TEvMakeRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr &ev, const TActorContext &ctx);
void Handle(TEvTxProxySchemeCache::TEvResolveKeySetResult::TPtr &ev, const TActorContext &ctx);
void Handle(TEvDataShard::TEvProposeTransactionRestart::TPtr &ev, const TActorContext &ctx);
void HandlePrepare(TEvDataShard::TEvProposeTransactionAttachResult::TPtr &ev, const TActorContext &ctx);
@@ -413,15 +413,15 @@ private:
void HandlePrepareErrorTimeout(const TActorContext &ctx);
void HandlePlan(TEvDataShard::TEvProposeTransactionAttachResult::TPtr &ev, const TActorContext &ctx);
void HandlePlan(TEvDataShard::TEvProposeTransactionResult::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvDataShard::TEvGetReadTableSinkStateRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvDataShard::TEvGetReadTableSinkStateRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr &ev, const TActorContext &ctx);
void Handle(TEvTxProxy::TEvProposeTransactionStatus::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTxProcessing::TEvStreamClearanceRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTxProcessing::TEvStreamIsDead::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTxProcessing::TEvStreamClearanceRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTxProcessing::TEvStreamIsDead::TPtr &ev, const TActorContext &ctx);
void HandleResolve(TEvTxProcessing::TEvStreamIsDead::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTxProcessing::TEvStreamQuotaRequest::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTxProcessing::TEvStreamQuotaResponse::TPtr &ev, const TActorContext &ctx);
- void Handle(TEvTxProcessing::TEvStreamQuotaRelease::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTxProcessing::TEvStreamQuotaRequest::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTxProcessing::TEvStreamQuotaResponse::TPtr &ev, const TActorContext &ctx);
+ void Handle(TEvTxProcessing::TEvStreamQuotaRelease::TPtr &ev, const TActorContext &ctx);
void Handle(TEvPrivate::TEvReattachToShard::TPtr &ev, const TActorContext &ctx);
void HandlePrepare(TEvPipeCache::TEvDeliveryProblem::TPtr &ev, const TActorContext &ctx);
@@ -433,16 +433,16 @@ private:
void ExtractDatashardErrors(const NKikimrTxDataShard::TEvProposeTransactionResult & record);
void CancelProposal(ui64 exceptTablet);
void FailProposedRequest(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus status, TString errMsg, const TActorContext &ctx);
-
- void SendStreamClearanceResponse(ui64 shard, bool cleared, const TActorContext &ctx);
- void ProcessNextStreamClearance(bool cleared, const TActorContext &ctx);
- void ProcessStreamClearance(bool cleared, const TActorContext &ctx);
-
- bool ParseRangeKey(const NKikimrMiniKQL::TParams &proto,
+
+ void SendStreamClearanceResponse(ui64 shard, bool cleared, const TActorContext &ctx);
+ void ProcessNextStreamClearance(bool cleared, const TActorContext &ctx);
+ void ProcessStreamClearance(bool cleared, const TActorContext &ctx);
+
+ bool ParseRangeKey(const NKikimrMiniKQL::TParams &proto,
TConstArrayRef<NScheme::TTypeId> keyType,
TSerializedCellVec &buf,
EParseRangeKeyExp exp);
-
+
bool CheckDomainLocality(NSchemeCache::TSchemeCacheRequest &cacheRequest);
void BuildTxStats(NKikimrQueryStats::TTxStats& stats);
bool IsReadOnlyRequest() const;
@@ -490,7 +490,7 @@ public:
TRACE_EVENT(NKikimrServices::TX_PROXY);
switch (ev->GetTypeRewrite()) {
HFuncTraced(TEvTxProcessing::TEvStreamIsDead, HandleResolve);
- HFuncTraced(TEvTxProxySchemeCache::TEvNavigateKeySetResult, Handle);
+ HFuncTraced(TEvTxProxySchemeCache::TEvNavigateKeySetResult, Handle);
HFuncTraced(TEvTxProxySchemeCache::TEvResolveKeySetResult, Handle);
HFuncTraced(TEvents::TEvUndelivered, HandleUndeliveredResolve); // we must wait for resolve completion
CFunc(TEvents::TSystem::Wakeup, HandleExecTimeoutResolve); // we must wait for resolve completion to keep key description
@@ -516,7 +516,7 @@ public:
HFuncTraced(TEvDataShard::TEvProposeTransactionRestart, Handle);
HFuncTraced(TEvDataShard::TEvProposeTransactionAttachResult, HandlePrepare);
HFuncTraced(TEvTxProcessing::TEvStreamClearanceRequest, Handle);
- HFuncTraced(TEvTxProcessing::TEvStreamIsDead, Handle);
+ HFuncTraced(TEvTxProcessing::TEvStreamIsDead, Handle);
HFuncTraced(TEvTxProcessing::TEvStreamQuotaRequest, Handle);
HFuncTraced(TEvTxProcessing::TEvStreamQuotaResponse, Handle);
HFuncTraced(TEvTxProcessing::TEvStreamQuotaRelease, Handle);
@@ -532,7 +532,7 @@ public:
TRACE_EVENT(NKikimrServices::TX_PROXY);
switch (ev->GetTypeRewrite()) {
HFuncTraced(TEvDataShard::TEvProposeTransactionResult, HandlePrepareErrors);
- HFuncTraced(TEvTxProcessing::TEvStreamIsDead, Handle);
+ HFuncTraced(TEvTxProcessing::TEvStreamIsDead, Handle);
HFuncTraced(TEvPipeCache::TEvDeliveryProblem, HandlePrepareErrors);
HFuncTraced(TEvents::TEvUndelivered, Handle);
CFunc(TEvents::TSystem::Wakeup, HandlePrepareErrorTimeout);
@@ -542,17 +542,17 @@ public:
STFUNC(StateWaitPlan) {
TRACE_EVENT(NKikimrServices::TX_PROXY);
switch (ev->GetTypeRewrite()) {
- HFuncTraced(TEvDataShard::TEvGetReadTableSinkStateRequest, Handle);
- HFuncTraced(TEvDataShard::TEvGetReadTableStreamStateRequest, Handle);
+ HFuncTraced(TEvDataShard::TEvGetReadTableSinkStateRequest, Handle);
+ HFuncTraced(TEvDataShard::TEvGetReadTableStreamStateRequest, Handle);
HFuncTraced(TEvTxProxy::TEvProposeTransactionStatus, Handle);
HFuncTraced(TEvDataShard::TEvProposeTransactionResult, HandlePlan);
HFuncTraced(TEvDataShard::TEvProposeTransactionRestart, Handle);
HFuncTraced(TEvDataShard::TEvProposeTransactionAttachResult, HandlePlan);
- HFuncTraced(TEvTxProcessing::TEvStreamClearanceRequest, Handle);
- HFuncTraced(TEvTxProcessing::TEvStreamIsDead, Handle);
- HFuncTraced(TEvTxProcessing::TEvStreamQuotaRequest, Handle);
- HFuncTraced(TEvTxProcessing::TEvStreamQuotaResponse, Handle);
- HFuncTraced(TEvTxProcessing::TEvStreamQuotaRelease, Handle);
+ HFuncTraced(TEvTxProcessing::TEvStreamClearanceRequest, Handle);
+ HFuncTraced(TEvTxProcessing::TEvStreamIsDead, Handle);
+ HFuncTraced(TEvTxProcessing::TEvStreamQuotaRequest, Handle);
+ HFuncTraced(TEvTxProcessing::TEvStreamQuotaResponse, Handle);
+ HFuncTraced(TEvTxProcessing::TEvStreamQuotaRelease, Handle);
HFuncTraced(TEvPipeCache::TEvDeliveryProblem, HandlePlan);
HFuncTraced(TEvPrivate::TEvReattachToShard, Handle);
HFuncTraced(TEvents::TEvUndelivered, Handle);
@@ -562,151 +562,151 @@ public:
}
};
-TKeySpace::TKeySpace()
- : OrderedQueue(false)
-{
-}
-
-void TKeySpace::Initialize(bool ordered,
- TConstArrayRef<NScheme::TTypeId> keyTypes,
- const TTableRange &range)
-{
- SpaceRange.From.Parse(TSerializedCellVec::Serialize(range.From));
- SpaceRange.FromInclusive = range.InclusiveFrom;
- SpaceRange.To.Parse(TSerializedCellVec::Serialize(range.To));
- SpaceRange.ToInclusive = range.InclusiveTo;
-
+TKeySpace::TKeySpace()
+ : OrderedQueue(false)
+{
+}
+
+void TKeySpace::Initialize(bool ordered,
+ TConstArrayRef<NScheme::TTypeId> keyTypes,
+ const TTableRange &range)
+{
+ SpaceRange.From.Parse(TSerializedCellVec::Serialize(range.From));
+ SpaceRange.FromInclusive = range.InclusiveFrom;
+ SpaceRange.To.Parse(TSerializedCellVec::Serialize(range.To));
+ SpaceRange.ToInclusive = range.InclusiveTo;
+
// +INF should not be included
if (SpaceRange.To.GetCells().empty())
SpaceRange.ToInclusive = false;
- OrderedQueue = ordered;
- KeyTypes.assign(keyTypes.begin(), keyTypes.end());
- QueuePoint = SpaceRange.From;
-}
-
-bool TKeySpace::IsGreater(const TConstArrayRef<TCell> &lhs, const TConstArrayRef<TCell> &rhs) const
-{
- return CompareBorders<true, true>(lhs, rhs, true, true, KeyTypes) > 0;
-}
-
-void TKeySpace::AddRange(const NKikimrTx::TKeyRange &range, ui64 shard)
-{
- TRange newRange(range);
- newRange.Shards.push_back(shard);
-
- const auto &fromCells = newRange.From.GetCells();
-
- TRanges::iterator it = Ranges.begin();
- for ( ; ; ++it) {
- if (it == Ranges.end()
- || IsGreater(it->From.GetCells(), fromCells)) {
- it = Ranges.insert(it, std::move(newRange));
- break;
- }
- }
-
- // Advance shards queue.
- if (OrderedQueue) {
- auto point = it;
- while (point != Ranges.end()
- && !IsGreater(point->From.GetCells(), QueuePoint.GetCells())
- && IsGreater(point->To.GetCells(), QueuePoint.GetCells())) {
- for (auto s : point->Shards)
- ShardsQueue.push(s);
- QueuePoint = point->To;
- ++point;
- }
- } else {
- ShardsQueue.push(shard);
- }
-
- TryToMergeRange(it);
-}
-
-bool TKeySpace::IsFull() const
-{
- if (Ranges.size() != 1)
- return false;
-
- auto &range = Ranges.front();
-
- Y_VERIFY_DEBUG(range.FromInclusive);
- Y_VERIFY_DEBUG(!range.ToInclusive);
-
- if (IsGreater(range.From.GetCells(), SpaceRange.From.GetCells()))
- return false;
-
- if (IsGreater(SpaceRange.To.GetCells(), range.To.GetCells()))
- return false;
- else if (SpaceRange.To.GetBuffer() == range.To.GetBuffer()
- && SpaceRange.ToInclusive)
- return false;
-
- Y_VERIFY_DEBUG(!OrderedQueue || !IsGreater(SpaceRange.To.GetCells(), QueuePoint.GetCells()));
-
- return true;
-}
-
-void TKeySpace::FlushShardsToQueue()
-{
- if (!OrderedQueue)
- return;
-
- TRanges::iterator it;
-
- for (it = Ranges.begin(); it != Ranges.end(); ++it) {
- if (IsGreater(it->From.GetCells(), QueuePoint.GetCells()))
- break;
- }
-
- while (it != Ranges.end()) {
- for (auto s : it->Shards)
- ShardsQueue.push(s);
- ++it;
- }
-}
-
-void TKeySpace::TryToMergeRange(TRanges::iterator it)
-{
- while (TryToMergeWithPrev(it)) {
- }
- TryToMergeWithPrev(++it);
-}
-
-bool TKeySpace::TryToMergeWithPrev(TRanges::iterator it)
-{
- if (it == Ranges.begin() || it == Ranges.end())
- return false;
-
- auto prev = it;
- --prev;
-
- const auto &toCells = prev->To.GetCells();
- const auto &fromCells = it->From.GetCells();
-
- // Check range is covered by the prev.
- if (!IsGreater(it->To.GetCells(), toCells)) {
- *it = std::move(*prev);
- Ranges.erase(prev);
- return true;
- }
-
- if (toCells.size() != fromCells.size())
- return false;
-
- if (CompareTypedCellVectors(toCells.data(), fromCells.data(), KeyTypes.data(), toCells.size()) == 0
- && (it->FromInclusive || it->ToInclusive)) {
- it->FromInclusive = prev->FromInclusive;
- it->From = prev->From;
- it->Shards.insert(it->Shards.begin(), prev->Shards.begin(), prev->Shards.end());
- Ranges.erase(prev);
- return true;
- }
-
- return false;
-}
-
+ OrderedQueue = ordered;
+ KeyTypes.assign(keyTypes.begin(), keyTypes.end());
+ QueuePoint = SpaceRange.From;
+}
+
+bool TKeySpace::IsGreater(const TConstArrayRef<TCell> &lhs, const TConstArrayRef<TCell> &rhs) const
+{
+ return CompareBorders<true, true>(lhs, rhs, true, true, KeyTypes) > 0;
+}
+
+void TKeySpace::AddRange(const NKikimrTx::TKeyRange &range, ui64 shard)
+{
+ TRange newRange(range);
+ newRange.Shards.push_back(shard);
+
+ const auto &fromCells = newRange.From.GetCells();
+
+ TRanges::iterator it = Ranges.begin();
+ for ( ; ; ++it) {
+ if (it == Ranges.end()
+ || IsGreater(it->From.GetCells(), fromCells)) {
+ it = Ranges.insert(it, std::move(newRange));
+ break;
+ }
+ }
+
+ // Advance shards queue.
+ if (OrderedQueue) {
+ auto point = it;
+ while (point != Ranges.end()
+ && !IsGreater(point->From.GetCells(), QueuePoint.GetCells())
+ && IsGreater(point->To.GetCells(), QueuePoint.GetCells())) {
+ for (auto s : point->Shards)
+ ShardsQueue.push(s);
+ QueuePoint = point->To;
+ ++point;
+ }
+ } else {
+ ShardsQueue.push(shard);
+ }
+
+ TryToMergeRange(it);
+}
+
+bool TKeySpace::IsFull() const
+{
+ if (Ranges.size() != 1)
+ return false;
+
+ auto &range = Ranges.front();
+
+ Y_VERIFY_DEBUG(range.FromInclusive);
+ Y_VERIFY_DEBUG(!range.ToInclusive);
+
+ if (IsGreater(range.From.GetCells(), SpaceRange.From.GetCells()))
+ return false;
+
+ if (IsGreater(SpaceRange.To.GetCells(), range.To.GetCells()))
+ return false;
+ else if (SpaceRange.To.GetBuffer() == range.To.GetBuffer()
+ && SpaceRange.ToInclusive)
+ return false;
+
+ Y_VERIFY_DEBUG(!OrderedQueue || !IsGreater(SpaceRange.To.GetCells(), QueuePoint.GetCells()));
+
+ return true;
+}
+
+void TKeySpace::FlushShardsToQueue()
+{
+ if (!OrderedQueue)
+ return;
+
+ TRanges::iterator it;
+
+ for (it = Ranges.begin(); it != Ranges.end(); ++it) {
+ if (IsGreater(it->From.GetCells(), QueuePoint.GetCells()))
+ break;
+ }
+
+ while (it != Ranges.end()) {
+ for (auto s : it->Shards)
+ ShardsQueue.push(s);
+ ++it;
+ }
+}
+
+void TKeySpace::TryToMergeRange(TRanges::iterator it)
+{
+ while (TryToMergeWithPrev(it)) {
+ }
+ TryToMergeWithPrev(++it);
+}
+
+bool TKeySpace::TryToMergeWithPrev(TRanges::iterator it)
+{
+ if (it == Ranges.begin() || it == Ranges.end())
+ return false;
+
+ auto prev = it;
+ --prev;
+
+ const auto &toCells = prev->To.GetCells();
+ const auto &fromCells = it->From.GetCells();
+
+ // Check range is covered by the prev.
+ if (!IsGreater(it->To.GetCells(), toCells)) {
+ *it = std::move(*prev);
+ Ranges.erase(prev);
+ return true;
+ }
+
+ if (toCells.size() != fromCells.size())
+ return false;
+
+ if (CompareTypedCellVectors(toCells.data(), fromCells.data(), KeyTypes.data(), toCells.size()) == 0
+ && (it->FromInclusive || it->ToInclusive)) {
+ it->FromInclusive = prev->FromInclusive;
+ it->From = prev->From;
+ it->Shards.insert(it->Shards.begin(), prev->Shards.begin(), prev->Shards.end());
+ Ranges.erase(prev);
+ return true;
+ }
+
+ return false;
+}
+
void TDataReq::ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus status, NKikimrIssues::TStatusIds::EStatusCode code, bool reportIssues, const TActorContext &ctx) {
auto *x = new TEvTxUserProxy::TEvProposeTransactionStatus(status);
x->Record.SetTxId(TxId);
@@ -740,12 +740,12 @@ void TDataReq::ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus
}
}
- if (ReadTableRequest) {
- x->Record.SetSerializedReadTableResponse(ReadTableRequest->ResponseData);
- x->Record.SetDataShardTabletId(ReadTableRequest->ResponseDataFrom);
+ if (ReadTableRequest) {
+ x->Record.SetSerializedReadTableResponse(ReadTableRequest->ResponseData);
+ x->Record.SetDataShardTabletId(ReadTableRequest->ResponseDataFrom);
x->Record.SetReadTableResponseVersion(ReadTableRequest->ResponseVersion);
- }
-
+ }
+
if (!DatashardErrors.empty())
x->Record.SetDataShardErrors(DatashardErrors);
@@ -849,13 +849,13 @@ void TDataReq::ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus
<< " marker# P13b");
TxProxyMon->ReportStatusNotOK->Inc();
break;
- case TEvTxUserProxy::TResultStatus::ExecResponseData:
- LOG_LOG_S_SAMPLED_BY(ctx, NActors::NLog::PRI_DEBUG, NKikimrServices::TX_PROXY, TxId,
- "Actor# " << ctx.SelfID.ToString() << " txid# " << TxId
- << " RESPONSE Status# " << TEvTxUserProxy::TResultStatus::Str(status)
- << " marker# P13d");
- TxProxyMon->ReportStatusStreamData->Inc();
- break;
+ case TEvTxUserProxy::TResultStatus::ExecResponseData:
+ LOG_LOG_S_SAMPLED_BY(ctx, NActors::NLog::PRI_DEBUG, NKikimrServices::TX_PROXY, TxId,
+ "Actor# " << ctx.SelfID.ToString() << " txid# " << TxId
+ << " RESPONSE Status# " << TEvTxUserProxy::TResultStatus::Str(status)
+ << " marker# P13d");
+ TxProxyMon->ReportStatusStreamData->Inc();
+ break;
default:
LOG_LOG_S_SAMPLED_BY(ctx, NActors::NLog::PRI_ERROR, NKikimrServices::TX_PROXY, TxId,
"Actor# " << ctx.SelfID.ToString() << " txid# " << TxId
@@ -1067,14 +1067,14 @@ void TDataReq::ProcessFlatMKQLResolve(NSchemeCache::TSchemeCacheRequest *cacheRe
Become(&TThis::StateWaitPrepare);
}
-void TDataReq::ProcessReadTableResolve(NSchemeCache::TSchemeCacheRequest *cacheRequest, const TActorContext &ctx)
-{
- auto &entry = cacheRequest->ResultSet[0];
+void TDataReq::ProcessReadTableResolve(NSchemeCache::TSchemeCacheRequest *cacheRequest, const TActorContext &ctx)
+{
+ auto &entry = cacheRequest->ResultSet[0];
ReadTableRequest->KeyDesc = std::move(entry.KeyDescription);
-
+
bool singleShard = ReadTableRequest->KeyDesc->Partitions.size() == 1;
CanUseFollower = false;
-
+
bool immediate = singleShard;
if (!ReadTableRequest->Snapshot.IsMax()) {
@@ -1083,58 +1083,58 @@ void TDataReq::ProcessReadTableResolve(NSchemeCache::TSchemeCacheRequest *cacheR
}
for (auto& partition : ReadTableRequest->KeyDesc->Partitions) {
- NKikimrTxDataShard::TDataTransaction dataTransaction;
- dataTransaction.SetStreamResponse(StreamResponse);
+ NKikimrTxDataShard::TDataTransaction dataTransaction;
+ dataTransaction.SetStreamResponse(StreamResponse);
dataTransaction.SetImmediate(immediate);
- dataTransaction.SetReadOnly(true);
+ dataTransaction.SetReadOnly(true);
ActorIdToProto(SelfId(), dataTransaction.MutableSink());
- auto &tx = *dataTransaction.MutableReadTableTransaction();
+ auto &tx = *dataTransaction.MutableReadTableTransaction();
tx.MutableTableId()->SetOwnerId(ReadTableRequest->KeyDesc->TableId.PathId.OwnerId);
tx.MutableTableId()->SetTableId(ReadTableRequest->KeyDesc->TableId.PathId.LocalPathId);
tx.SetApiVersion(ReadTableRequest->RequestVersion);
- for (auto &col : ReadTableRequest->Columns) {
- auto &c = *tx.AddColumns();
- c.SetId(col.Id);
- c.SetName(col.Name);
- c.SetTypeId(col.PType);
- }
- auto &range = *tx.MutableRange();
- ReadTableRequest->KeySpace.GetSpace().Serialize(range);
-
+ for (auto &col : ReadTableRequest->Columns) {
+ auto &c = *tx.AddColumns();
+ c.SetId(col.Id);
+ c.SetName(col.Name);
+ c.SetTypeId(col.PType);
+ }
+ auto &range = *tx.MutableRange();
+ ReadTableRequest->KeySpace.GetSpace().Serialize(range);
+
if (!ReadTableRequest->Snapshot.IsMax()) {
tx.SetSnapshotStep(ReadTableRequest->Snapshot.Step);
tx.SetSnapshotTxId(ReadTableRequest->Snapshot.TxId);
}
- const TString transactionBuffer = dataTransaction.SerializeAsString();
-
+ const TString transactionBuffer = dataTransaction.SerializeAsString();
+
TPerTablet &perTablet = PerTablet[partition.ShardId];
perTablet.TableId = ReadTableRequest->KeyDesc->TableId;
- perTablet.TabletStatus = TPerTablet::ETabletStatus::StatusWait;
- perTablet.AffectedFlags = TPerTablet::AffectedRead;
- ++TabletsLeft;
-
- TxProxyMon->ReadTableResolveSentToShard->Inc();
-
- LOG_DEBUG_S_SAMPLED_BY(ctx, NKikimrServices::TX_PROXY, TxId,
- "Actor# " << ctx.SelfID.ToString() << " txid# " << TxId
+ perTablet.TabletStatus = TPerTablet::ETabletStatus::StatusWait;
+ perTablet.AffectedFlags = TPerTablet::AffectedRead;
+ ++TabletsLeft;
+
+ TxProxyMon->ReadTableResolveSentToShard->Inc();
+
+ LOG_DEBUG_S_SAMPLED_BY(ctx, NKikimrServices::TX_PROXY, TxId,
+ "Actor# " << ctx.SelfID.ToString() << " txid# " << TxId
<< " SEND TEvProposeTransaction to datashard " << partition.ShardId
- << " with read table request"
+ << " with read table request"
<< " affected shards " << ReadTableRequest->KeyDesc->Partitions.size()
<< " followers " << (CanUseFollower ? "allowed" : "disallowed") << " marker# P4b");
-
+
const TActorId pipeCache = CanUseFollower ? Services.FollowerPipeCache : Services.LeaderPipeCache;
-
- Send(pipeCache, new TEvPipeCache::TEvForward(
- new TEvDataShard::TEvProposeTransaction(NKikimrTxDataShard::TX_KIND_SCAN,
- ctx.SelfID, TxId, transactionBuffer,
+
+ Send(pipeCache, new TEvPipeCache::TEvForward(
+ new TEvDataShard::TEvProposeTransaction(NKikimrTxDataShard::TX_KIND_SCAN,
+ ctx.SelfID, TxId, transactionBuffer,
TxFlags | (immediate ? NTxDataShard::TTxFlags::Immediate : 0)),
partition.ShardId, true));
- }
-
- Become(&TThis::StateWaitPrepare);
-}
-
+ }
+
+ Become(&TThis::StateWaitPrepare);
+}
+
TAutoPtr<TEvTxProxySchemeCache::TEvResolveKeySet> TDataReq::PrepareFlatMKQLRequest(TStringBuf miniKQLProgram, TStringBuf miniKQLParams, const TActorContext &ctx) {
Y_UNUSED(ctx);
@@ -1199,14 +1199,14 @@ void TDataReq::MarkShardError(ui64 shardId, TDataReq::TPerTablet &perTablet, boo
void TDataReq::Handle(TEvTxProxyReq::TEvMakeRequest::TPtr &ev, const TActorContext &ctx) {
RequestControls.Reqister(ctx);
-
+
TEvTxProxyReq::TEvMakeRequest *msg = ev->Get();
const NKikimrTxUserProxy::TEvProposeTransaction &record = msg->Ev->Get()->Record;
Y_VERIFY(record.HasTransaction());
ProxyFlags = record.HasProxyFlags() ? record.GetProxyFlags() : 0;
- ExecTimeoutPeriod = record.HasExecTimeoutPeriod()
- ? TDuration::MilliSeconds(record.GetExecTimeoutPeriod())
+ ExecTimeoutPeriod = record.HasExecTimeoutPeriod()
+ ? TDuration::MilliSeconds(record.GetExecTimeoutPeriod())
: TDuration::MilliSeconds(RequestControls.DefaultTimeoutMs);
if (ExecTimeoutPeriod.Minutes() > 60) {
LOG_WARN_S_SAMPLED_BY(ctx, NKikimrServices::TX_PROXY, TxId,
@@ -1239,12 +1239,12 @@ void TDataReq::Handle(TEvTxProxyReq::TEvMakeRequest::TPtr &ev, const TActorConte
const NKikimrTxUserProxy::TTransaction &txbody = record.GetTransaction();
RequestSource = msg->Ev->Sender;
TxFlags = txbody.GetFlags() & ~NTxDataShard::TTxFlags::Immediate; // Ignore external immediate flag
- StreamResponse = record.GetStreamResponse();
+ StreamResponse = record.GetStreamResponse();
- // Subscribe for TEvStreamIsDead event.
- if (StreamResponse)
+ // Subscribe for TEvStreamIsDead event.
+ if (StreamResponse)
ctx.Send(RequestSource, new TEvents::TEvSubscribe, IEventHandle::FlagTrackDelivery);
-
+
LOG_DEBUG_S_SAMPLED_BY(ctx, NKikimrServices::TX_PROXY, TxId,
"Actor# " << ctx.SelfID.ToString() << " Cookie# " << (ui64)ev->Cookie
<< " txid# " << TxId << " HANDLE TDataReq marker# P1");
@@ -1253,25 +1253,25 @@ void TDataReq::Handle(TEvTxProxyReq::TEvMakeRequest::TPtr &ev, const TActorConte
UserToken = new NACLib::TUserToken(record.GetUserToken());
}
- // For read table transaction we need to resolve table path.
- if (txbody.HasReadTableTransaction()) {
- ReadTableRequest = new TReadTableRequest(txbody.GetReadTableTransaction());
- TAutoPtr<NSchemeCache::TSchemeCacheNavigate> request(new NSchemeCache::TSchemeCacheNavigate());
+ // For read table transaction we need to resolve table path.
+ if (txbody.HasReadTableTransaction()) {
+ ReadTableRequest = new TReadTableRequest(txbody.GetReadTableTransaction());
+ TAutoPtr<NSchemeCache::TSchemeCacheNavigate> request(new NSchemeCache::TSchemeCacheNavigate());
request->DatabaseName = record.GetDatabaseName();
-
- NSchemeCache::TSchemeCacheNavigate::TEntry entry;
+
+ NSchemeCache::TSchemeCacheNavigate::TEntry entry;
entry.Path = SplitPath(ReadTableRequest->TablePath);
- entry.Operation = NSchemeCache::TSchemeCacheNavigate::OpTable;
+ entry.Operation = NSchemeCache::TSchemeCacheNavigate::OpTable;
entry.ShowPrivatePath = true;
- request->ResultSet.push_back(entry);
-
- ctx.Send(Services.SchemeCache, new TEvTxProxySchemeCache::TEvNavigateKeySet(request));
- Become(&TThis::StateWaitResolve);
- return;
- }
-
- TAutoPtr<TEvTxProxySchemeCache::TEvResolveKeySet> resolveReq;
-
+ request->ResultSet.push_back(entry);
+
+ ctx.Send(Services.SchemeCache, new TEvTxProxySchemeCache::TEvNavigateKeySet(request));
+ Become(&TThis::StateWaitResolve);
+ return;
+ }
+
+ TAutoPtr<TEvTxProxySchemeCache::TEvResolveKeySet> resolveReq;
+
NCpuTime::TCpuTimer timer(CpuTime);
if (txbody.HasMiniKQLTransaction()) {
const auto& mkqlTxBody = txbody.GetMiniKQLTransaction();
@@ -1376,48 +1376,48 @@ void TDataReq::Handle(TEvTxProxyReq::TEvMakeRequest::TPtr &ev, const TActorConte
Become(&TThis::StateWaitResolve);
}
-void TDataReq::Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr &ev, const TActorContext &ctx) {
- TEvTxProxySchemeCache::TEvNavigateKeySetResult *msg = ev->Get();
- NSchemeCache::TSchemeCacheNavigate *resp = msg->Request.Get();
-
- LOG_LOG_S_SAMPLED_BY(ctx, (resp->ErrorCount == 0 ? NActors::NLog::PRI_DEBUG : NActors::NLog::PRI_ERROR),
- NKikimrServices::TX_PROXY, TxId,
- "Actor# " << ctx.SelfID.ToString() << " txid# " << TxId
- << " HANDLE EvNavigateKeySetResult TDataReq marker# P3b ErrorCount# "
- << resp->ErrorCount);
-
- if (resp->ErrorCount > 0) {
+void TDataReq::Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr &ev, const TActorContext &ctx) {
+ TEvTxProxySchemeCache::TEvNavigateKeySetResult *msg = ev->Get();
+ NSchemeCache::TSchemeCacheNavigate *resp = msg->Request.Get();
+
+ LOG_LOG_S_SAMPLED_BY(ctx, (resp->ErrorCount == 0 ? NActors::NLog::PRI_DEBUG : NActors::NLog::PRI_ERROR),
+ NKikimrServices::TX_PROXY, TxId,
+ "Actor# " << ctx.SelfID.ToString() << " txid# " << TxId
+ << " HANDLE EvNavigateKeySetResult TDataReq marker# P3b ErrorCount# "
+ << resp->ErrorCount);
+
+ if (resp->ErrorCount > 0) {
const TString errorExplanation = "unresolved table: " + ReadTableRequest->TablePath;
IssueManager.RaiseIssue(MakeIssue(NKikimrIssues::TIssuesIds::GENERIC_RESOLVE_ERROR, errorExplanation));
-
+
UnresolvedKeys.push_back(errorExplanation);
ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ResolveError, NKikimrIssues::TStatusIds::SCHEME_ERROR, true, ctx);
- TxProxyMon->ResolveKeySetWrongRequest->Inc();
- return Die(ctx);
- }
-
- Y_VERIFY(ReadTableRequest);
- bool projection = !ReadTableRequest->Columns.empty();
+ TxProxyMon->ResolveKeySetWrongRequest->Inc();
+ return Die(ctx);
+ }
+
+ Y_VERIFY(ReadTableRequest);
+ bool projection = !ReadTableRequest->Columns.empty();
TMap<TString, size_t> colNames;
- for (size_t i = 0; i < ReadTableRequest->Columns.size(); ++i) {
- auto &col = ReadTableRequest->Columns[i];
+ for (size_t i = 0; i < ReadTableRequest->Columns.size(); ++i) {
+ auto &col = ReadTableRequest->Columns[i];
if (colNames.contains(col.Name)) {
const TString errorExplanation = "duplicated columns are not supported: " + col.Name;
IssueManager.RaiseIssue(MakeIssue(NKikimrIssues::TIssuesIds::GENERIC_RESOLVE_ERROR, errorExplanation));
UnresolvedKeys.push_back(errorExplanation);
ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ResolveError, NKikimrIssues::TStatusIds::SCHEME_ERROR, true, ctx);
-
- TxProxyMon->ResolveKeySetWrongRequest->Inc();
-
- return Die(ctx);
- }
- colNames[col.Name] = i;
- }
-
- auto &res = resp->ResultSet[0];
- ReadTableRequest->TableId = res.TableId;
-
+
+ TxProxyMon->ResolveKeySetWrongRequest->Inc();
+
+ return Die(ctx);
+ }
+ colNames[col.Name] = i;
+ }
+
+ auto &res = resp->ResultSet[0];
+ ReadTableRequest->TableId = res.TableId;
+
if (res.TableId.IsSystemView()) {
IssueManager.RaiseIssue(MakeIssue(NKikimrIssues::TIssuesIds::GENERIC_RESOLVE_ERROR,
Sprintf("Table '%s' is a system view. Read table is not supported", ReadTableRequest->TablePath.data())));
@@ -1428,46 +1428,46 @@ void TDataReq::Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr &ev,
TVector<NScheme::TTypeId> keyColumnTypes(res.Columns.size());
TVector<TKeyDesc::TColumnOp> columns(res.Columns.size());
- size_t keySize = 0;
- size_t no = 0;
-
- for (auto &entry : res.Columns) {
- auto &col = entry.second;
-
- if (col.KeyOrder != -1) {
- keyColumnTypes[col.KeyOrder] = col.PType;
- ++keySize;
- }
-
- columns[no].Column = col.Id;
- columns[no].Operation = TKeyDesc::EColumnOperation::Read;
- columns[no].ExpectedType = col.PType;
- ++no;
-
- if (projection) {
+ size_t keySize = 0;
+ size_t no = 0;
+
+ for (auto &entry : res.Columns) {
+ auto &col = entry.second;
+
+ if (col.KeyOrder != -1) {
+ keyColumnTypes[col.KeyOrder] = col.PType;
+ ++keySize;
+ }
+
+ columns[no].Column = col.Id;
+ columns[no].Operation = TKeyDesc::EColumnOperation::Read;
+ columns[no].ExpectedType = col.PType;
+ ++no;
+
+ if (projection) {
if (colNames.contains(col.Name)) {
- ReadTableRequest->Columns[colNames[col.Name]] = col;
- colNames.erase(col.Name);
- }
- } else {
- ReadTableRequest->Columns.push_back(col);
- }
- }
-
- // Report unresolved columns.
- if (!colNames.empty()) {
+ ReadTableRequest->Columns[colNames[col.Name]] = col;
+ colNames.erase(col.Name);
+ }
+ } else {
+ ReadTableRequest->Columns.push_back(col);
+ }
+ }
+
+ // Report unresolved columns.
+ if (!colNames.empty()) {
for (auto entry: colNames) {
const TString &errorExplanation = "unresolved column: " + entry.first;
IssueManager.RaiseIssue(MakeIssue(NKikimrIssues::TIssuesIds::GENERIC_RESOLVE_ERROR, errorExplanation));
UnresolvedKeys.push_back(errorExplanation);
}
ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ResolveError, NKikimrIssues::TStatusIds::SCHEME_ERROR, true, ctx);
- TxProxyMon->ResolveKeySetWrongRequest->Inc();
- return Die(ctx);
- }
-
- // Parse range.
- TConstArrayRef<NScheme::TTypeId> keyTypes(keyColumnTypes.data(), keySize);
+ TxProxyMon->ResolveKeySetWrongRequest->Inc();
+ return Die(ctx);
+ }
+
+ // Parse range.
+ TConstArrayRef<NScheme::TTypeId> keyTypes(keyColumnTypes.data(), keySize);
// Fix KeyRanges
bool fromInclusive = ReadTableRequest->Range.GetFromInclusive();
EParseRangeKeyExp fromExpand = EParseRangeKeyExp::TO_NULL;
@@ -1486,42 +1486,42 @@ void TDataReq::Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr &ev,
toExpand = toInclusive ? EParseRangeKeyExp::NONE : EParseRangeKeyExp::TO_NULL;
}
}
- if (!ParseRangeKey(ReadTableRequest->Range.GetFrom(), keyTypes,
+ if (!ParseRangeKey(ReadTableRequest->Range.GetFrom(), keyTypes,
ReadTableRequest->FromValues, fromExpand)
- || !ParseRangeKey(ReadTableRequest->Range.GetTo(), keyTypes,
+ || !ParseRangeKey(ReadTableRequest->Range.GetTo(), keyTypes,
ReadTableRequest->ToValues, toExpand)) {
IssueManager.RaiseIssue(MakeIssue(NKikimrIssues::TIssuesIds::KEY_PARSE_ERROR, "could not parse key string"));
ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ResolveError, NKikimrIssues::TStatusIds::QUERY_ERROR, true, ctx);
- TxProxyMon->ResolveKeySetWrongRequest->Inc();
- return Die(ctx);
- }
-
+ TxProxyMon->ResolveKeySetWrongRequest->Inc();
+ return Die(ctx);
+ }
+
TTableRange range(ReadTableRequest->FromValues.GetCells(),
fromInclusive,
ReadTableRequest->ToValues.GetCells(),
toInclusive);
-
- if (range.IsEmptyRange({keyTypes.begin(), keyTypes.end()})) {
+
+ if (range.IsEmptyRange({keyTypes.begin(), keyTypes.end()})) {
const TString errorExplanation = "empty range requested";
IssueManager.RaiseIssue(MakeIssue(NKikimrIssues::TIssuesIds::EMPTY_OP_RANGE, errorExplanation));
UnresolvedKeys.push_back(errorExplanation);
ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ResolveError, NKikimrIssues::TStatusIds::QUERY_ERROR, true, ctx);
- TxProxyMon->ResolveKeySetWrongRequest->Inc();
- return Die(ctx);
- }
-
+ TxProxyMon->ResolveKeySetWrongRequest->Inc();
+ return Die(ctx);
+ }
+
ReadTableRequest->KeyDesc.Reset(new TKeyDesc(res.TableId, range, TKeyDesc::ERowOperation::Read,
keyTypes, columns));
- ReadTableRequest->KeySpace.Initialize(ReadTableRequest->Ordered, keyTypes, range);
-
- WallClockResolveStarted = Now();
-
- TAutoPtr<NSchemeCache::TSchemeCacheRequest> request(new NSchemeCache::TSchemeCacheRequest);
+ ReadTableRequest->KeySpace.Initialize(ReadTableRequest->Ordered, keyTypes, range);
+
+ WallClockResolveStarted = Now();
+
+ TAutoPtr<NSchemeCache::TSchemeCacheRequest> request(new NSchemeCache::TSchemeCacheRequest);
request->DomainOwnerId = res.DomainInfo->ExtractSchemeShard();
request->ResultSet.emplace_back(std::move(ReadTableRequest->KeyDesc));
- ctx.Send(Services.SchemeCache, new TEvTxProxySchemeCache::TEvResolveKeySet(request));
-}
-
+ ctx.Send(Services.SchemeCache, new TEvTxProxySchemeCache::TEvResolveKeySet(request));
+}
+
void TDataReq::Handle(TEvTxProxySchemeCache::TEvResolveKeySetResult::TPtr &ev, const TActorContext &ctx) {
TEvTxProxySchemeCache::TEvResolveKeySetResult *msg = ev->Get();
NSchemeCache::TSchemeCacheRequest *request = msg->Request.Get();
@@ -1576,26 +1576,26 @@ void TDataReq::Handle(TEvTxProxySchemeCache::TEvResolveKeySetResult::TPtr &ev, c
TxProxyMon->TxPrepareResolveHgram->Collect((WallClockResolved - WallClockResolveStarted).MicroSeconds());
NCpuTime::TCpuTimer timer(CpuTime);
- for (const NSchemeCache::TSchemeCacheRequest::TEntry& entry : request->ResultSet) {
- ui32 access = 0;
- switch (entry.KeyDescription->RowOperation) {
- case TKeyDesc::ERowOperation::Update:
- access |= NACLib::EAccessRights::UpdateRow;
- break;
- case TKeyDesc::ERowOperation::Read:
- access |= NACLib::EAccessRights::SelectRow;
- break;
- case TKeyDesc::ERowOperation::Erase:
- access |= NACLib::EAccessRights::EraseRow;
- break;
- default:
- break;
- }
- if (access != 0
- && UserToken != nullptr
- && entry.KeyDescription->Status == TKeyDesc::EStatus::Ok
+ for (const NSchemeCache::TSchemeCacheRequest::TEntry& entry : request->ResultSet) {
+ ui32 access = 0;
+ switch (entry.KeyDescription->RowOperation) {
+ case TKeyDesc::ERowOperation::Update:
+ access |= NACLib::EAccessRights::UpdateRow;
+ break;
+ case TKeyDesc::ERowOperation::Read:
+ access |= NACLib::EAccessRights::SelectRow;
+ break;
+ case TKeyDesc::ERowOperation::Erase:
+ access |= NACLib::EAccessRights::EraseRow;
+ break;
+ default:
+ break;
+ }
+ if (access != 0
+ && UserToken != nullptr
+ && entry.KeyDescription->Status == TKeyDesc::EStatus::Ok
&& entry.KeyDescription->SecurityObject != nullptr
- && !entry.KeyDescription->SecurityObject->CheckAccess(access, *UserToken)) {
+ && !entry.KeyDescription->SecurityObject->CheckAccess(access, *UserToken)) {
TStringStream explanation;
explanation << "Access denied for " << UserToken->GetUserSID()
<< " with access " << NACLib::AccessRightsToString(access)
@@ -1604,8 +1604,8 @@ void TDataReq::Handle(TEvTxProxySchemeCache::TEvResolveKeySetResult::TPtr &ev, c
LOG_ERROR_S(ctx, NKikimrServices::TX_PROXY, explanation.Str());
IssueManager.RaiseIssue(MakeIssue(NKikimrIssues::TIssuesIds::ACCESS_DENIED, explanation.Str()));
ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::AccessDenied, NKikimrIssues::TStatusIds::ACCESS_DENIED, true, ctx);
- return Die(ctx);
- }
+ return Die(ctx);
+ }
if (FlatMKQLRequest && entry.Kind == NSchemeCache::TSchemeCacheRequest::KindAsyncIndexTable) {
TMaybe<TString> error;
@@ -1625,26 +1625,26 @@ void TDataReq::Handle(TEvTxProxySchemeCache::TEvResolveKeySetResult::TPtr &ev, c
return Die(ctx);
}
}
- }
-
+ }
+
if (!CheckDomainLocality(*request)) {
IssueManager.RaiseIssue(MakeIssue(NKikimrIssues::TIssuesIds::DOMAIN_LOCALITY_ERROR));
ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::DomainLocalityError, NKikimrIssues::TStatusIds::BAD_REQUEST, true, ctx);
TxProxyMon->ResolveKeySetDomainLocalityFail->Inc();
- return Die(ctx);
- }
-
- SelectedCoordinator = SelectCoordinator(*request, ctx);
-
- if (ReadTableRequest) {
- TxProxyMon->ResolveKeySetReadTableSuccess->Inc();
- ProcessReadTableResolve(request, ctx);
- } else if (FlatMKQLRequest) {
- TxProxyMon->ResolveKeySetMiniKQLSuccess->Inc();
- ProcessFlatMKQLResolve(request, ctx);
- } else {
- Y_FAIL("No request");
- }
+ return Die(ctx);
+ }
+
+ SelectedCoordinator = SelectCoordinator(*request, ctx);
+
+ if (ReadTableRequest) {
+ TxProxyMon->ResolveKeySetReadTableSuccess->Inc();
+ ProcessReadTableResolve(request, ctx);
+ } else if (FlatMKQLRequest) {
+ TxProxyMon->ResolveKeySetMiniKQLSuccess->Inc();
+ ProcessFlatMKQLResolve(request, ctx);
+ } else {
+ Y_FAIL("No request");
+ }
}
void TDataReq::Handle(TEvPrivate::TEvReattachToShard::TPtr &ev, const TActorContext &ctx) {
@@ -1928,11 +1928,11 @@ void TDataReq::HandlePrepare(TEvDataShard::TEvProposeTransactionResult::TPtr &ev
ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ExecCancelled, NKikimrIssues::TStatusIds::ERROR, true, ctx);
TxProxyMon->TxResultCancelled->Inc();
return Die(ctx);
- case NKikimrTxDataShard::TEvProposeTransactionResult::BAD_REQUEST:
- ExtractDatashardErrors(record);
- ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::WrongRequest, NKikimrIssues::TStatusIds::BAD_REQUEST, true, ctx);
- TxProxyMon->TxResultCancelled->Inc();
- return Die(ctx);
+ case NKikimrTxDataShard::TEvProposeTransactionResult::BAD_REQUEST:
+ ExtractDatashardErrors(record);
+ ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::WrongRequest, NKikimrIssues::TStatusIds::BAD_REQUEST, true, ctx);
+ TxProxyMon->TxResultCancelled->Inc();
+ return Die(ctx);
default:
// everything other is hard error
ExtractDatashardErrors(record);
@@ -2188,8 +2188,8 @@ void TDataReq::HandlePlan(TEvDataShard::TEvProposeTransactionResult::TPtr &ev, c
TPerTablet *perTablet = PerTablet.FindPtr(tabletId);
LOG_LOG_S_SAMPLED_BY(ctx, ((msg->GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::COMPLETE ||
- msg->GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::ABORTED ||
- msg->GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::RESPONSE_DATA)
+ msg->GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::ABORTED ||
+ msg->GetStatus() == NKikimrTxDataShard::TEvProposeTransactionResult::RESPONSE_DATA)
? NActors::NLog::PRI_DEBUG : NActors::NLog::PRI_ERROR),
NKikimrServices::TX_PROXY, TxId,
"Actor# " << ctx.SelfID.ToString() << " txid# " << TxId
@@ -2330,76 +2330,76 @@ void TDataReq::HandlePlan(TEvPipeCache::TEvDeliveryProblem::TPtr &ev, const TAct
"Actor# " << ctx.SelfID.ToString() << " txid# " << TxId << " lost pipe with unknown endpoint, ignoring");
}
-void TDataReq::Handle(TEvDataShard::TEvGetReadTableSinkStateRequest::TPtr &ev, const TActorContext &ctx) {
- auto *response = new TEvDataShard::TEvGetReadTableSinkStateResponse;
-
- if (!ReadTableRequest) {
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::GENERIC_ERROR);
- auto *issue = response->Record.MutableStatus()->AddIssues();
- issue->set_severity(NYql::TSeverityIds::S_ERROR);
- issue->set_message("not a ReadTable request");
- ctx.Send(ev->Sender, response);
- return;
- }
-
- auto &rec = response->Record;
- rec.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
-
- rec.SetTxId(TxId);
- rec.SetWallClockAccepted(WallClockAccepted.GetValue());
- rec.SetWallClockResolveStarted(WallClockResolveStarted.GetValue());
- rec.SetWallClockResolved(WallClockResolved.GetValue());
- rec.SetWallClockPrepared(WallClockPrepared.GetValue());
- rec.SetWallClockPlanned(WallClockPlanned.GetValue());
- rec.SetExecTimeoutPeriod(ExecTimeoutPeriod.GetValue());
- rec.SetSelectedCoordinator(SelectedCoordinator);
- rec.SetRequestSource(ToString(RequestSource));
- rec.SetRequestVersion(ReadTableRequest->RequestVersion);
- rec.SetResponseVersion(ReadTableRequest->ResponseVersion);
- for (auto &pr : ReadTableRequest->ClearanceSenders)
- rec.AddClearanceRequests()->SetId(pr.first);
- for (auto &pr : ReadTableRequest->QuotaRequests)
- rec.AddQuotaRequests()->SetId(pr.second.ShardId);
- for (auto &pr : ReadTableRequest->StreamingShards)
- rec.AddStreamingShards()->SetId(pr.first);
- auto queue = ReadTableRequest->KeySpace.GetShardsQueue();
- while (!queue.empty()) {
- rec.AddShardsQueue()->SetId(queue.front());
- queue.pop();
- }
- rec.SetOrdered(ReadTableRequest->Ordered);
- rec.SetRowsLimited(ReadTableRequest->RowsLimited);
- rec.SetRowsRemain(ReadTableRequest->RowsRemain);
-
- ctx.Send(ev->Sender, response);
-}
-
-void TDataReq::Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr &ev, const TActorContext &ctx) {
- if (ReadTableRequest) {
- ctx.Send(ev->Forward(RequestSource));
- } else {
- auto *response = new TEvDataShard::TEvGetReadTableStreamStateResponse;
- response->Record.MutableStatus()->SetCode(Ydb::StatusIds::GENERIC_ERROR);
- auto *issue = response->Record.MutableStatus()->AddIssues();
- issue->set_severity(NYql::TSeverityIds::S_ERROR);
- issue->set_message("Proxy actor doesn't process ReadTable request");
- ctx.Send(ev->Sender, response);
- }
-}
-
-void TDataReq::Handle(TEvTxProcessing::TEvStreamClearanceRequest::TPtr &ev, const TActorContext &ctx)
-{
- auto &rec = ev->Get()->Record;
- ui64 shard = rec.GetShardId();
-
- Y_VERIFY(ReadTableRequest);
-
- // Handle shard restart. For now temporary snapshots are used by scan transaction
- // and therefore any shard restart may cause inconsistent response.
+void TDataReq::Handle(TEvDataShard::TEvGetReadTableSinkStateRequest::TPtr &ev, const TActorContext &ctx) {
+ auto *response = new TEvDataShard::TEvGetReadTableSinkStateResponse;
+
+ if (!ReadTableRequest) {
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::GENERIC_ERROR);
+ auto *issue = response->Record.MutableStatus()->AddIssues();
+ issue->set_severity(NYql::TSeverityIds::S_ERROR);
+ issue->set_message("not a ReadTable request");
+ ctx.Send(ev->Sender, response);
+ return;
+ }
+
+ auto &rec = response->Record;
+ rec.MutableStatus()->SetCode(Ydb::StatusIds::SUCCESS);
+
+ rec.SetTxId(TxId);
+ rec.SetWallClockAccepted(WallClockAccepted.GetValue());
+ rec.SetWallClockResolveStarted(WallClockResolveStarted.GetValue());
+ rec.SetWallClockResolved(WallClockResolved.GetValue());
+ rec.SetWallClockPrepared(WallClockPrepared.GetValue());
+ rec.SetWallClockPlanned(WallClockPlanned.GetValue());
+ rec.SetExecTimeoutPeriod(ExecTimeoutPeriod.GetValue());
+ rec.SetSelectedCoordinator(SelectedCoordinator);
+ rec.SetRequestSource(ToString(RequestSource));
+ rec.SetRequestVersion(ReadTableRequest->RequestVersion);
+ rec.SetResponseVersion(ReadTableRequest->ResponseVersion);
+ for (auto &pr : ReadTableRequest->ClearanceSenders)
+ rec.AddClearanceRequests()->SetId(pr.first);
+ for (auto &pr : ReadTableRequest->QuotaRequests)
+ rec.AddQuotaRequests()->SetId(pr.second.ShardId);
+ for (auto &pr : ReadTableRequest->StreamingShards)
+ rec.AddStreamingShards()->SetId(pr.first);
+ auto queue = ReadTableRequest->KeySpace.GetShardsQueue();
+ while (!queue.empty()) {
+ rec.AddShardsQueue()->SetId(queue.front());
+ queue.pop();
+ }
+ rec.SetOrdered(ReadTableRequest->Ordered);
+ rec.SetRowsLimited(ReadTableRequest->RowsLimited);
+ rec.SetRowsRemain(ReadTableRequest->RowsRemain);
+
+ ctx.Send(ev->Sender, response);
+}
+
+void TDataReq::Handle(TEvDataShard::TEvGetReadTableStreamStateRequest::TPtr &ev, const TActorContext &ctx) {
+ if (ReadTableRequest) {
+ ctx.Send(ev->Forward(RequestSource));
+ } else {
+ auto *response = new TEvDataShard::TEvGetReadTableStreamStateResponse;
+ response->Record.MutableStatus()->SetCode(Ydb::StatusIds::GENERIC_ERROR);
+ auto *issue = response->Record.MutableStatus()->AddIssues();
+ issue->set_severity(NYql::TSeverityIds::S_ERROR);
+ issue->set_message("Proxy actor doesn't process ReadTable request");
+ ctx.Send(ev->Sender, response);
+ }
+}
+
+void TDataReq::Handle(TEvTxProcessing::TEvStreamClearanceRequest::TPtr &ev, const TActorContext &ctx)
+{
+ auto &rec = ev->Get()->Record;
+ ui64 shard = rec.GetShardId();
+
+ Y_VERIFY(ReadTableRequest);
+
+ // Handle shard restart. For now temporary snapshots are used by scan transaction
+ // and therefore any shard restart may cause inconsistent response.
if (ReadTableRequest->ClearanceSenders.contains(shard) || PerTablet[shard].StreamCleared) {
LOG_ERROR_S(ctx, NKikimrServices::TX_PROXY,
"Cannot recover from shard restart, shard: " << shard << ", txid: " << TxId);
-
+
// We must send response to current request too
auto response = MakeHolder<TEvTxProcessing::TEvStreamClearanceResponse>();
response->Record.SetTxId(TxId);
@@ -2410,36 +2410,36 @@ void TDataReq::Handle(TEvTxProcessing::TEvStreamClearanceRequest::TPtr &ev, cons
Die(ctx);
return;
}
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_PROXY,
- "Got clearance request, shard: " << rec.GetShardId()
- << ", txid: " << rec.GetTxId());
-
- ctx.Send(ev->Sender, new TEvTxProcessing::TEvStreamClearancePending(TxId));
-
- ReadTableRequest->ClearanceSenders.emplace(shard, ev->Sender);
- ReadTableRequest->KeySpace.AddRange(rec.GetKeyRange(), shard);
-
- if (ReadTableRequest->KeySpace.IsFull()) {
- LOG_DEBUG_S(ctx, NKikimrServices::TX_PROXY,
- "Collected all clerance requests, txid: " << TxId);
- }
-
- ProcessStreamClearance(true, ctx);
-}
-
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_PROXY,
+ "Got clearance request, shard: " << rec.GetShardId()
+ << ", txid: " << rec.GetTxId());
+
+ ctx.Send(ev->Sender, new TEvTxProcessing::TEvStreamClearancePending(TxId));
+
+ ReadTableRequest->ClearanceSenders.emplace(shard, ev->Sender);
+ ReadTableRequest->KeySpace.AddRange(rec.GetKeyRange(), shard);
+
+ if (ReadTableRequest->KeySpace.IsFull()) {
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_PROXY,
+ "Collected all clerance requests, txid: " << TxId);
+ }
+
+ ProcessStreamClearance(true, ctx);
+}
+
void TDataReq::Handle(TEvTxProcessing::TEvStreamIsDead::TPtr &ev, const TActorContext &ctx)
-{
+{
Y_UNUSED(ev);
- Y_VERIFY(ReadTableRequest);
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_PROXY,
- "Abort read table transaction because stream is dead txid: " << TxId);
-
- ReportStatus(TEvTxUserProxy::TResultStatus::ExecComplete, NKikimrIssues::TStatusIds::REJECTED, true, ctx);
- Die(ctx);
-}
-
+ Y_VERIFY(ReadTableRequest);
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_PROXY,
+ "Abort read table transaction because stream is dead txid: " << TxId);
+
+ ReportStatus(TEvTxUserProxy::TResultStatus::ExecComplete, NKikimrIssues::TStatusIds::REJECTED, true, ctx);
+ Die(ctx);
+}
+
void TDataReq::HandleResolve(TEvTxProcessing::TEvStreamIsDead::TPtr &ev, const TActorContext &ctx) {
Y_UNUSED(ev);
Y_VERIFY(ReadTableRequest);
@@ -2450,35 +2450,35 @@ void TDataReq::HandleResolve(TEvTxProcessing::TEvStreamIsDead::TPtr &ev, const T
Become(&TThis::StateResolveTimeout);
}
-void TDataReq::Handle(TEvTxProcessing::TEvStreamQuotaRequest::TPtr &ev, const TActorContext &ctx)
-{
- Y_VERIFY_DEBUG(ReadTableRequest);
-
- auto id = ReadTableRequest->QuotaRequestId++;
- TReadTableRequest::TQuotaRequest req{ev->Sender, ev->Get()->Record.GetShardId()};
- ReadTableRequest->QuotaRequests.insert(std::make_pair(id, req));
- ctx.Send(RequestSource, ev->Release().Release(), 0, id);
-}
-
-void TDataReq::Handle(TEvTxProcessing::TEvStreamQuotaResponse::TPtr &ev, const TActorContext &ctx)
-{
- Y_VERIFY_DEBUG(ReadTableRequest);
-
- auto it = ReadTableRequest->QuotaRequests.find(ev->Cookie);
- Y_VERIFY_DEBUG(it != ReadTableRequest->QuotaRequests.end());
-
- if (ReadTableRequest->RowsLimited)
- ev->Get()->Record.SetRowLimit(ReadTableRequest->RowsRemain);
-
- ctx.Send(it->second.Sender, ev->Release().Release());
- ReadTableRequest->QuotaRequests.erase(it);
-}
-
-void TDataReq::Handle(TEvTxProcessing::TEvStreamQuotaRelease::TPtr &ev, const TActorContext &ctx)
-{
- ctx.Send(ev->Forward(RequestSource));
-}
-
+void TDataReq::Handle(TEvTxProcessing::TEvStreamQuotaRequest::TPtr &ev, const TActorContext &ctx)
+{
+ Y_VERIFY_DEBUG(ReadTableRequest);
+
+ auto id = ReadTableRequest->QuotaRequestId++;
+ TReadTableRequest::TQuotaRequest req{ev->Sender, ev->Get()->Record.GetShardId()};
+ ReadTableRequest->QuotaRequests.insert(std::make_pair(id, req));
+ ctx.Send(RequestSource, ev->Release().Release(), 0, id);
+}
+
+void TDataReq::Handle(TEvTxProcessing::TEvStreamQuotaResponse::TPtr &ev, const TActorContext &ctx)
+{
+ Y_VERIFY_DEBUG(ReadTableRequest);
+
+ auto it = ReadTableRequest->QuotaRequests.find(ev->Cookie);
+ Y_VERIFY_DEBUG(it != ReadTableRequest->QuotaRequests.end());
+
+ if (ReadTableRequest->RowsLimited)
+ ev->Get()->Record.SetRowLimit(ReadTableRequest->RowsRemain);
+
+ ctx.Send(it->second.Sender, ev->Release().Release());
+ ReadTableRequest->QuotaRequests.erase(it);
+}
+
+void TDataReq::Handle(TEvTxProcessing::TEvStreamQuotaRelease::TPtr &ev, const TActorContext &ctx)
+{
+ ctx.Send(ev->Forward(RequestSource));
+}
+
void TDataReq::HandleExecTimeoutResolve(const TActorContext &ctx) {
LOG_ERROR_S_SAMPLED_BY(ctx, NKikimrServices::TX_PROXY, TxId,
"Actor# " << ctx.SelfID.ToString() << " txid# " << TxId
@@ -2517,10 +2517,10 @@ void TDataReq::MergeResult(TEvDataShard::TEvProposeTransactionResult::TPtr &ev,
"Got stats for txid: " << TxId << " datashard: " << tabletId << " " << *perTablet->Stats);
}
- if (StreamResponse) {
- return FinishShardStream(ev, ctx);
- }
-
+ if (StreamResponse) {
+ return FinishShardStream(ev, ctx);
+ }
+
Y_VERIFY(FlatMKQLRequest);
NCpuTime::TCpuTimer timer;
NMiniKQL::IEngineFlat &engine = *FlatMKQLRequest->Engine;
@@ -2646,58 +2646,58 @@ void TDataReq::MakeFlatMKQLResponse(const TActorContext &ctx, const NCpuTime::TC
}
}
-void TDataReq::ProcessStreamResponseData(TEvDataShard::TEvProposeTransactionResult::TPtr &ev,
- const TActorContext &ctx)
-{
- Y_VERIFY_DEBUG(ReadTableRequest);
-
- ctx.Send(ev->Sender, new TEvTxProcessing::TEvStreamDataAck);
-
- auto &rec = ev->Get()->Record;
- ReadTableRequest->ResponseData = rec.GetTxResult();
- ReadTableRequest->ResponseDataFrom = rec.GetOrigin();
+void TDataReq::ProcessStreamResponseData(TEvDataShard::TEvProposeTransactionResult::TPtr &ev,
+ const TActorContext &ctx)
+{
+ Y_VERIFY_DEBUG(ReadTableRequest);
+
+ ctx.Send(ev->Sender, new TEvTxProcessing::TEvStreamDataAck);
+
+ auto &rec = ev->Get()->Record;
+ ReadTableRequest->ResponseData = rec.GetTxResult();
+ ReadTableRequest->ResponseDataFrom = rec.GetOrigin();
if (rec.HasApiVersion()) {
ReadTableRequest->ResponseVersion = rec.GetApiVersion();
}
-
- if (ReadTableRequest->RowsLimited) {
- auto rows = rec.RowOffsetsSize();
- if (rows > ReadTableRequest->RowsRemain) {
- ReadTableRequest->ResponseData.resize(rec.GetRowOffsets(ReadTableRequest->RowsRemain));
- ReadTableRequest->RowsRemain = 0;
- } else {
- ReadTableRequest->RowsRemain -= rows;
- }
- }
-
- ReportStatus(TEvTxUserProxy::TResultStatus::ExecResponseData, NKikimrIssues::TStatusIds::TRANSIENT, false, ctx);
-
- if (ReadTableRequest->RowsLimited && !ReadTableRequest->RowsRemain)
- FinishStreamResponse(ctx);
-}
-
-void TDataReq::FinishShardStream(TEvDataShard::TEvProposeTransactionResult::TPtr &ev, const TActorContext &ctx) {
-
- auto &rec = ev->Get()->Record;
- auto shard = rec.GetOrigin();
-
+
+ if (ReadTableRequest->RowsLimited) {
+ auto rows = rec.RowOffsetsSize();
+ if (rows > ReadTableRequest->RowsRemain) {
+ ReadTableRequest->ResponseData.resize(rec.GetRowOffsets(ReadTableRequest->RowsRemain));
+ ReadTableRequest->RowsRemain = 0;
+ } else {
+ ReadTableRequest->RowsRemain -= rows;
+ }
+ }
+
+ ReportStatus(TEvTxUserProxy::TResultStatus::ExecResponseData, NKikimrIssues::TStatusIds::TRANSIENT, false, ctx);
+
+ if (ReadTableRequest->RowsLimited && !ReadTableRequest->RowsRemain)
+ FinishStreamResponse(ctx);
+}
+
+void TDataReq::FinishShardStream(TEvDataShard::TEvProposeTransactionResult::TPtr &ev, const TActorContext &ctx) {
+
+ auto &rec = ev->Get()->Record;
+ auto shard = rec.GetOrigin();
+
Y_VERIFY_DEBUG(ReadTableRequest->StreamingShards.contains(shard));
- ReadTableRequest->StreamingShards.erase(shard);
-
- if (ReadTableRequest->KeySpace.IsFull()
- && ReadTableRequest->StreamingShards.empty()
- && ReadTableRequest->KeySpace.IsShardsQueueEmpty()) {
- FinishStreamResponse(ctx);
- } else {
- ProcessStreamClearance(true, ctx);
- }
-}
-
-void TDataReq::FinishStreamResponse(const TActorContext &ctx) {
+ ReadTableRequest->StreamingShards.erase(shard);
+
+ if (ReadTableRequest->KeySpace.IsFull()
+ && ReadTableRequest->StreamingShards.empty()
+ && ReadTableRequest->KeySpace.IsShardsQueueEmpty()) {
+ FinishStreamResponse(ctx);
+ } else {
+ ProcessStreamClearance(true, ctx);
+ }
+}
+
+void TDataReq::FinishStreamResponse(const TActorContext &ctx) {
ReportStatus(TEvTxUserProxy::TResultStatus::ExecComplete, NKikimrIssues::TStatusIds::SUCCESS, true, ctx);
- Die(ctx);
-}
-
+ Die(ctx);
+}
+
NSchemeCache::TDomainInfo::TPtr FindDomainInfo(NSchemeCache::TSchemeCacheRequest &cacheRequest) {
for (const auto& entry :cacheRequest.ResultSet) {
if (entry.DomainInfo) {
@@ -2866,84 +2866,84 @@ void TDataReq::HandleWatchdog(const TActorContext &ctx) {
ctx.Schedule(TDuration::MilliSeconds(KIKIMR_DATAREQ_WATCHDOG_PERIOD), new TEvPrivate::TEvProxyDataReqOngoingTransactionWatchdog());
}
-void TDataReq::SendStreamClearanceResponse(ui64 shard, bool cleared, const TActorContext &ctx)
-{
- TAutoPtr<TEvTxProcessing::TEvStreamClearanceResponse> response
- = new TEvTxProcessing::TEvStreamClearanceResponse;
- response->Record.SetTxId(TxId);
- response->Record.SetCleared(cleared);
-
- // For unordered streams we may get multiple entries for the same
- // shard in clearance queue due to shard restarts. Avoid multiple
- // responses by removing sender from the senders map.
- auto it = ReadTableRequest->ClearanceSenders.find(shard);
- if (it == ReadTableRequest->ClearanceSenders.end()) {
- LOG_WARN_S(ctx, NKikimrServices::TX_PROXY,
- "No sender for clearance request, shard: " << shard
- << ", txid: " << TxId << ", cleared: " << cleared);
- return;
- }
-
- LOG_DEBUG_S(ctx, NKikimrServices::TX_PROXY,
- "Send stream clearance, shard: " << shard
- << ", txid: " << TxId << ", cleared: " << cleared);
-
- ctx.Send(it->second, response.Release());
-
- if (cleared) {
- ReadTableRequest->StreamingShards.insert(*it);
- PerTablet[shard].StreamCleared = true;
- }
-
- ReadTableRequest->ClearanceSenders.erase(it);
-}
-
-void TDataReq::ProcessNextStreamClearance(bool cleared, const TActorContext &ctx)
-{
- Y_VERIFY(ReadTableRequest);
- Y_VERIFY_DEBUG(!ReadTableRequest->KeySpace.IsShardsQueueEmpty());
-
- auto shard = ReadTableRequest->KeySpace.ShardsQueueFront();
- ReadTableRequest->KeySpace.ShardsQueuePop();
-
- SendStreamClearanceResponse(shard, cleared, ctx);
-}
-
-void TDataReq::ProcessStreamClearance(bool cleared, const TActorContext &ctx)
-{
- if (!ReadTableRequest)
- return;
-
- if (cleared) {
- auto &cfg = AppData(ctx)->StreamingConfig.GetOutputStreamConfig();
-
- ui32 limit = ReadTableRequest->Ordered ? 1 : cfg.GetMaxStreamingShards();
- while (!ReadTableRequest->KeySpace.IsShardsQueueEmpty()
- && limit > ReadTableRequest->StreamingShards.size()) {
- ProcessNextStreamClearance(cleared, ctx);
- }
- } else {
- if (ReadTableRequest->Ordered && !ReadTableRequest->KeySpace.IsFull()) {
- ReadTableRequest->KeySpace.FlushShardsToQueue();
- }
-
- while (!ReadTableRequest->KeySpace.IsShardsQueueEmpty())
- ProcessNextStreamClearance(cleared, ctx);
- }
-}
-
-bool TDataReq::ParseRangeKey(const NKikimrMiniKQL::TParams &proto,
- TConstArrayRef<NScheme::TTypeId> keyType,
+void TDataReq::SendStreamClearanceResponse(ui64 shard, bool cleared, const TActorContext &ctx)
+{
+ TAutoPtr<TEvTxProcessing::TEvStreamClearanceResponse> response
+ = new TEvTxProcessing::TEvStreamClearanceResponse;
+ response->Record.SetTxId(TxId);
+ response->Record.SetCleared(cleared);
+
+ // For unordered streams we may get multiple entries for the same
+ // shard in clearance queue due to shard restarts. Avoid multiple
+ // responses by removing sender from the senders map.
+ auto it = ReadTableRequest->ClearanceSenders.find(shard);
+ if (it == ReadTableRequest->ClearanceSenders.end()) {
+ LOG_WARN_S(ctx, NKikimrServices::TX_PROXY,
+ "No sender for clearance request, shard: " << shard
+ << ", txid: " << TxId << ", cleared: " << cleared);
+ return;
+ }
+
+ LOG_DEBUG_S(ctx, NKikimrServices::TX_PROXY,
+ "Send stream clearance, shard: " << shard
+ << ", txid: " << TxId << ", cleared: " << cleared);
+
+ ctx.Send(it->second, response.Release());
+
+ if (cleared) {
+ ReadTableRequest->StreamingShards.insert(*it);
+ PerTablet[shard].StreamCleared = true;
+ }
+
+ ReadTableRequest->ClearanceSenders.erase(it);
+}
+
+void TDataReq::ProcessNextStreamClearance(bool cleared, const TActorContext &ctx)
+{
+ Y_VERIFY(ReadTableRequest);
+ Y_VERIFY_DEBUG(!ReadTableRequest->KeySpace.IsShardsQueueEmpty());
+
+ auto shard = ReadTableRequest->KeySpace.ShardsQueueFront();
+ ReadTableRequest->KeySpace.ShardsQueuePop();
+
+ SendStreamClearanceResponse(shard, cleared, ctx);
+}
+
+void TDataReq::ProcessStreamClearance(bool cleared, const TActorContext &ctx)
+{
+ if (!ReadTableRequest)
+ return;
+
+ if (cleared) {
+ auto &cfg = AppData(ctx)->StreamingConfig.GetOutputStreamConfig();
+
+ ui32 limit = ReadTableRequest->Ordered ? 1 : cfg.GetMaxStreamingShards();
+ while (!ReadTableRequest->KeySpace.IsShardsQueueEmpty()
+ && limit > ReadTableRequest->StreamingShards.size()) {
+ ProcessNextStreamClearance(cleared, ctx);
+ }
+ } else {
+ if (ReadTableRequest->Ordered && !ReadTableRequest->KeySpace.IsFull()) {
+ ReadTableRequest->KeySpace.FlushShardsToQueue();
+ }
+
+ while (!ReadTableRequest->KeySpace.IsShardsQueueEmpty())
+ ProcessNextStreamClearance(cleared, ctx);
+ }
+}
+
+bool TDataReq::ParseRangeKey(const NKikimrMiniKQL::TParams &proto,
+ TConstArrayRef<NScheme::TTypeId> keyType,
TSerializedCellVec &buf,
EParseRangeKeyExp exp)
-{
+{
TVector<TCell> key;
if (proto.HasValue()) {
if (!proto.HasType()) {
UnresolvedKeys.push_back("No type was specified in the range key tuple");
return false;
}
-
+
auto& value = proto.GetValue();
auto& type = proto.GetType();
TString errStr;
@@ -2951,9 +2951,9 @@ bool TDataReq::ParseRangeKey(const NKikimrMiniKQL::TParams &proto,
if (!res) {
UnresolvedKeys.push_back("Failed to parse range key tuple: " + errStr);
return false;
- }
- }
-
+ }
+ }
+
switch (exp) {
case EParseRangeKeyExp::TO_NULL:
key.resize(keyType.size());
@@ -2963,9 +2963,9 @@ bool TDataReq::ParseRangeKey(const NKikimrMiniKQL::TParams &proto,
}
buf.Parse(TSerializedCellVec::Serialize(key));
- return true;
-}
-
+ return true;
+}
+
bool TDataReq::IsReadOnlyRequest() const {
if (FlatMKQLRequest) {
return FlatMKQLRequest->ReadOnlyProgram;
diff --git a/ydb/core/tx/tx_proxy/mon.cpp b/ydb/core/tx/tx_proxy/mon.cpp
index e435e0ee13d..14f5d47064e 100644
--- a/ydb/core/tx/tx_proxy/mon.cpp
+++ b/ydb/core/tx/tx_proxy/mon.cpp
@@ -1,14 +1,14 @@
#include "mon.h"
#include <ydb/core/base/counters.h>
-
+
namespace NKikimr {
namespace NTxProxy {
TTxProxyMon::TTxProxyMon(const TIntrusivePtr<NMonitoring::TDynamicCounters>& counters)
: Counters(counters)
- , TxGroup(GetServiceCounters(counters, "proxy")->GetSubgroup("subsystem", "tx"))
- , DataReqGroup(GetServiceCounters(counters, "proxy")->GetSubgroup("subsystem", "datareq"))
+ , TxGroup(GetServiceCounters(counters, "proxy")->GetSubgroup("subsystem", "tx"))
+ , DataReqGroup(GetServiceCounters(counters, "proxy")->GetSubgroup("subsystem", "datareq"))
, AllocPoolCounters(counters, "tx_proxy")
{
CacheRequestLatency = TxGroup->GetHistogram("CacheRequest/LatencyMs", NMonitoring::ExponentialHistogram(10, 4, 1));
@@ -32,7 +32,7 @@ TTxProxyMon::TTxProxyMon(const TIntrusivePtr<NMonitoring::TDynamicCounters>& cou
ReportStatusOK = DataReqGroup->GetCounter("ReportStatus/OK", true);
ReportStatusNotOK = DataReqGroup->GetCounter("ReportStatus/NotOK", true);
- ReportStatusStreamData = DataReqGroup->GetCounter("ReportStatus/StreamData", true);
+ ReportStatusStreamData = DataReqGroup->GetCounter("ReportStatus/StreamData", true);
TxPrepareTimeHgram = DataReqGroup->GetHistogram("TxPrepareTimesMs",
NMonitoring::ExponentialHistogram(20, 2, 1));
@@ -61,9 +61,9 @@ TTxProxyMon::TTxProxyMon(const TIntrusivePtr<NMonitoring::TDynamicCounters>& cou
MiniKQLResolveSentToShard = DataReqGroup->GetCounter("MiniKQLResolve/SentToShard", true);
MiniKQLWrongRequest = DataReqGroup->GetCounter("MiniKQLResolve/WrongRequest", true);
- ReadTableResolveSentToShard = DataReqGroup->GetCounter("ReadTableResolve/SentToShard", true);
- ReadTableWrongRequest = DataReqGroup->GetCounter("ReadTableResolve/WrongRequest", true);
-
+ ReadTableResolveSentToShard = DataReqGroup->GetCounter("ReadTableResolve/SentToShard", true);
+ ReadTableWrongRequest = DataReqGroup->GetCounter("ReadTableResolve/WrongRequest", true);
+
MiniKQLProgramSize = DataReqGroup->GetCounter("MiniKQLProgramSize", true);
MiniKQLParamsSize = DataReqGroup->GetCounter("MiniKQLParamsSize", true);
@@ -95,7 +95,7 @@ TTxProxyMon::TTxProxyMon(const TIntrusivePtr<NMonitoring::TDynamicCounters>& cou
ResolveKeySetLegacySuccess = DataReqGroup->GetCounter("ResolveKeySet/LegacySuccess", true);
ResolveKeySetMiniKQLSuccess = DataReqGroup->GetCounter("ResolveKeySet/MiniKQLSuccess", true);
- ResolveKeySetReadTableSuccess = DataReqGroup->GetCounter("ResolveKeySet/ReadTableSuccess", true);
+ ResolveKeySetReadTableSuccess = DataReqGroup->GetCounter("ResolveKeySet/ReadTableSuccess", true);
ResolveKeySetRedirectUnavaible = DataReqGroup->GetCounter("ResolveKeySet/RedirectUnavaible", true);
ResolveKeySetFail = DataReqGroup->GetCounter("ResolveKeySet/Fail", true);
ResolveKeySetWrongRequest = DataReqGroup->GetCounter("ResolveKeySet/WrongRequest", true);
diff --git a/ydb/core/tx/tx_proxy/mon.h b/ydb/core/tx/tx_proxy/mon.h
index a744b70702f..d747ab4f998 100644
--- a/ydb/core/tx/tx_proxy/mon.h
+++ b/ydb/core/tx/tx_proxy/mon.h
@@ -43,7 +43,7 @@ namespace NTxProxy {
NMonitoring::TDynamicCounters::TCounterPtr ReportStatusOK;
NMonitoring::TDynamicCounters::TCounterPtr ReportStatusNotOK;
- NMonitoring::TDynamicCounters::TCounterPtr ReportStatusStreamData;
+ NMonitoring::TDynamicCounters::TCounterPtr ReportStatusStreamData;
NMonitoring::THistogramPtr TxPrepareTimeHgram;
NMonitoring::THistogramPtr TxExecuteTimeHgram;
@@ -61,9 +61,9 @@ namespace NTxProxy {
NMonitoring::TDynamicCounters::TCounterPtr MiniKQLResolveSentToShard;
NMonitoring::TDynamicCounters::TCounterPtr MiniKQLWrongRequest;
- NMonitoring::TDynamicCounters::TCounterPtr ReadTableResolveSentToShard;
- NMonitoring::TDynamicCounters::TCounterPtr ReadTableWrongRequest;
-
+ NMonitoring::TDynamicCounters::TCounterPtr ReadTableResolveSentToShard;
+ NMonitoring::TDynamicCounters::TCounterPtr ReadTableWrongRequest;
+
NMonitoring::TDynamicCounters::TCounterPtr MiniKQLProgramSize;
NMonitoring::TDynamicCounters::TCounterPtr MiniKQLParamsSize;
@@ -93,7 +93,7 @@ namespace NTxProxy {
NMonitoring::TDynamicCounters::TCounterPtr ResolveKeySetLegacySuccess;
NMonitoring::TDynamicCounters::TCounterPtr ResolveKeySetMiniKQLSuccess;
- NMonitoring::TDynamicCounters::TCounterPtr ResolveKeySetReadTableSuccess;
+ NMonitoring::TDynamicCounters::TCounterPtr ResolveKeySetReadTableSuccess;
NMonitoring::TDynamicCounters::TCounterPtr ResolveKeySetFail;
NMonitoring::TDynamicCounters::TCounterPtr ResolveKeySetWrongRequest;
NMonitoring::TDynamicCounters::TCounterPtr ResolveKeySetDomainLocalityFail;
diff --git a/ydb/core/tx/tx_proxy/proxy.h b/ydb/core/tx/tx_proxy/proxy.h
index 8afd4a56fdb..86d4f1ac79e 100644
--- a/ydb/core/tx/tx_proxy/proxy.h
+++ b/ydb/core/tx/tx_proxy/proxy.h
@@ -99,8 +99,8 @@ struct TEvTxUserProxy {
bool HasMakeProposal() const {
const NKikimrTxUserProxy::TTransaction &tx = Record.GetTransaction();
- return (tx.HasMiniKQLTransaction() && tx.GetMiniKQLTransaction().HasProgram())
- || tx.HasReadTableTransaction();
+ return (tx.HasMiniKQLTransaction() && tx.GetMiniKQLTransaction().HasProgram())
+ || tx.HasReadTableTransaction();
}
bool HasSnapshotProposal() const {
diff --git a/ydb/core/tx/tx_proxy/proxy_impl.cpp b/ydb/core/tx/tx_proxy/proxy_impl.cpp
index a57bfa36f57..20dc8cce176 100644
--- a/ydb/core/tx/tx_proxy/proxy_impl.cpp
+++ b/ydb/core/tx/tx_proxy/proxy_impl.cpp
@@ -433,7 +433,7 @@ public:
"actor# " << SelfId() <<
" Bootstrap");
TxProxyMon = new TTxProxyMon(AppData(ctx)->Counters);
- CacheCounters = GetServiceCounters(AppData(ctx)->Counters, "proxy")->GetSubgroup("subsystem", "cache");
+ CacheCounters = GetServiceCounters(AppData(ctx)->Counters, "proxy")->GetSubgroup("subsystem", "cache");
Services.Proxy = SelfId();
diff --git a/ydb/core/viewer/content/viewer.js b/ydb/core/viewer/content/viewer.js
index 774c8b32770..1108f42278c 100644
--- a/ydb/core/viewer/content/viewer.js
+++ b/ydb/core/viewer/content/viewer.js
@@ -1492,10 +1492,10 @@ function tabletTypeToSymbol(type) {
return "BP";
case "BlockStoreVolume":
return "BV";
- case "Console":
- return "CN";
- case "TenantSlotBroker":
- return "TB";
+ case "Console":
+ return "CN";
+ case "TenantSlotBroker":
+ return "TB";
case "Kesus":
return "K";
case "OlapShard":
@@ -1546,10 +1546,10 @@ function tabletTypeToColor(type) {
return "#B0E0E6";
case "BlockStoreVolume":
return "#B0C4DE";
- case "Console":
- return "SlateBlue";
- case "TenantSlotBroker":
- return "SlateGray";
+ case "Console":
+ return "SlateBlue";
+ case "TenantSlotBroker":
+ return "SlateGray";
default:
return "white";
}
diff --git a/ydb/core/viewer/json_counters.h b/ydb/core/viewer/json_counters.h
index 9d9dee370f4..cac1e0885c4 100644
--- a/ydb/core/viewer/json_counters.h
+++ b/ydb/core/viewer/json_counters.h
@@ -173,7 +173,7 @@ public:
template <typename ResponseType>
void RenderStats(TStringStream& json,
THolder<ResponseType>& response,
- const TEvInterconnect::TNodeInfo& nodeInfo,
+ const TEvInterconnect::TNodeInfo& nodeInfo,
const TString& subsystem,
const TVector<const FieldDescriptor*>& groupFields) {
@@ -206,7 +206,7 @@ public:
void RenderStats(TStringStream& json,
THolder<TEvWhiteboard::TEvVDiskStateResponse>& response,
- const TEvInterconnect::TNodeInfo& nodeInfo) {
+ const TEvInterconnect::TNodeInfo& nodeInfo) {
if (response == nullptr)
return;
static TVector<const FieldDescriptor*> groupFields
@@ -216,7 +216,7 @@ public:
void RenderStats(TStringStream& json,
THolder<TEvWhiteboard::TEvPDiskStateResponse>& response,
- const TEvInterconnect::TNodeInfo& nodeInfo) {
+ const TEvInterconnect::TNodeInfo& nodeInfo) {
if (response == nullptr)
return;
static TVector<const FieldDescriptor*> groupFields
@@ -226,7 +226,7 @@ public:
void RenderStats(TStringStream& json,
THolder<TEvWhiteboard::TEvTabletStateResponse>& response,
- const TEvInterconnect::TNodeInfo& nodeInfo) {
+ const TEvInterconnect::TNodeInfo& nodeInfo) {
if (response == nullptr)
return;
static TVector<const FieldDescriptor*> groupFields
@@ -241,8 +241,8 @@ public:
json << "\"sensors\":[";
Sort(NodesInfo->Nodes, [](
- const TEvInterconnect::TNodeInfo& a,
- const TEvInterconnect::TNodeInfo& b) -> bool {
+ const TEvInterconnect::TNodeInfo& a,
+ const TEvInterconnect::TNodeInfo& b) -> bool {
return a.NodeId < b.NodeId;
});
diff --git a/ydb/core/viewer/json_tenantinfo.h b/ydb/core/viewer/json_tenantinfo.h
index bbd9b584e47..749422ba396 100644
--- a/ydb/core/viewer/json_tenantinfo.h
+++ b/ydb/core/viewer/json_tenantinfo.h
@@ -125,7 +125,7 @@ public:
void Handle(NConsole::TEvConsole::TEvListTenantsResponse::TPtr& ev) {
Ydb::Cms::ListDatabasesResult listTenantsResult;
- ev->Get()->Record.GetResponse().operation().result().UnpackTo(&listTenantsResult);
+ ev->Get()->Record.GetResponse().operation().result().UnpackTo(&listTenantsResult);
for (const TString& path : listTenantsResult.paths()) {
if (!Path.empty() && path != Path) {
continue;
@@ -138,7 +138,7 @@ public:
void Handle(NConsole::TEvConsole::TEvGetTenantStatusResponse::TPtr& ev) {
Ydb::Cms::GetDatabaseStatusResult getTenantStatusResult;
- ev->Get()->Record.GetResponse().operation().result().UnpackTo(&getTenantStatusResult);
+ ev->Get()->Record.GetResponse().operation().result().UnpackTo(&getTenantStatusResult);
TString path = getTenantStatusResult.path();
NKikimrViewer::TTenant& tenant = TenantByPath[path];
tenant.SetName(path);
diff --git a/ydb/core/viewer/json_tenants.h b/ydb/core/viewer/json_tenants.h
index 532eb7371e2..762d5e3b436 100644
--- a/ydb/core/viewer/json_tenants.h
+++ b/ydb/core/viewer/json_tenants.h
@@ -64,7 +64,7 @@ public:
void Handle(NConsole::TEvConsole::TEvListTenantsResponse::TPtr& ev) {
Ydb::Cms::ListDatabasesResult listTenantsResult;
- ev->Get()->Record.GetResponse().operation().result().UnpackTo(&listTenantsResult);
+ ev->Get()->Record.GetResponse().operation().result().UnpackTo(&listTenantsResult);
for (const TString& path : listTenantsResult.paths()) {
NKikimrViewer::TTenant& tenant = *Result.AddTenants();
tenant.SetName(path);
@@ -78,7 +78,7 @@ public:
void Handle(NConsole::TEvConsole::TEvGetTenantStatusResponse::TPtr& ev) {
Ydb::Cms::GetDatabaseStatusResult getTenantStatusResult;
- ev->Get()->Record.GetResponse().operation().result().UnpackTo(&getTenantStatusResult);
+ ev->Get()->Record.GetResponse().operation().result().UnpackTo(&getTenantStatusResult);
auto itTenant = TenantIndex.find(getTenantStatusResult.path());
if (itTenant != TenantIndex.end()) {
NKikimrViewer::TTenant& tenant = *itTenant->second;
diff --git a/ydb/core/ydb_convert/ydb_convert_ut.cpp b/ydb/core/ydb_convert/ydb_convert_ut.cpp
index 766c39a922b..cb802069264 100644
--- a/ydb/core/ydb_convert/ydb_convert_ut.cpp
+++ b/ydb/core/ydb_convert/ydb_convert_ut.cpp
@@ -104,7 +104,7 @@ Y_UNIT_TEST_SUITE(ConvertMiniKQLTypeToYdbTypeTest) {
const TString input =
"Kind: Data\n"
"Data {\n"
- " Scheme: 4865\n"
+ " Scheme: 4865\n"
" DecimalParams {\n"
" Precision: 21\n"
" Scale: 8\n"
@@ -430,7 +430,7 @@ Y_UNIT_TEST_SUITE(ConvertMiniKQLValueToYdbValueTest) {
const TString inputType =
"Kind: Data\n"
"Data {\n"
- " Scheme: 4865\n"
+ " Scheme: 4865\n"
" DecimalParams {\n"
" Precision: 21\n"
" Scale: 8\n"
diff --git a/ydb/library/aclib/aclib.h b/ydb/library/aclib/aclib.h
index a601f34c52f..655ca4b6693 100644
--- a/ydb/library/aclib/aclib.h
+++ b/ydb/library/aclib/aclib.h
@@ -83,8 +83,8 @@ public:
TString GetOriginalUserToken() const;
TString SerializeAsString() const;
void AddGroupSID(const TSID& groupSID);
-
- using NACLibProto::TUserToken::ShortDebugString;
+
+ using NACLibProto::TUserToken::ShortDebugString;
protected:
static TSID GetUserFromVector(const TVector<TSID>& userAndGroupSIDs);
diff --git a/ydb/library/yql/minikql/aligned_page_pool.cpp b/ydb/library/yql/minikql/aligned_page_pool.cpp
index 2b7e1d8ea8c..e015c255c81 100644
--- a/ydb/library/yql/minikql/aligned_page_pool.cpp
+++ b/ydb/library/yql/minikql/aligned_page_pool.cpp
@@ -112,12 +112,12 @@ TAlignedPagePoolCounters::TAlignedPagePoolCounters(NMonitoring::TDynamicCounterP
TAlignedPagePool::~TAlignedPagePool() {
if (CheckLostMem && !UncaughtException()) {
- Y_VERIFY_DEBUG(TotalAllocated == FreePages.size() * POOL_PAGE_SIZE,
+ Y_VERIFY_DEBUG(TotalAllocated == FreePages.size() * POOL_PAGE_SIZE,
"Expected %ld, actual %ld (%ld page(s), %ld offloaded)", TotalAllocated,
FreePages.size() * POOL_PAGE_SIZE, FreePages.size(), OffloadedActiveBytes);
Y_VERIFY_DEBUG(OffloadedActiveBytes == 0, "offloaded: %ld", OffloadedActiveBytes);
}
-
+
size_t activeBlocksSize = 0;
for (auto it = ActiveBlocks.cbegin(); ActiveBlocks.cend() != it; ActiveBlocks.erase(it++)) {
activeBlocksSize += it->second;
@@ -145,16 +145,16 @@ TAlignedPagePool::~TAlignedPagePool() {
--(*Counters.PoolsCntr);
}
TotalAllocated = 0;
-}
-
-void TAlignedPagePool::ReleaseFreePages() {
- TotalAllocated -= FreePages.size() * POOL_PAGE_SIZE;
- if (Counters.TotalBytesAllocatedCntr) {
- (*Counters.TotalBytesAllocatedCntr) -= FreePages.size() * POOL_PAGE_SIZE;
- }
-
+}
+
+void TAlignedPagePool::ReleaseFreePages() {
+ TotalAllocated -= FreePages.size() * POOL_PAGE_SIZE;
+ if (Counters.TotalBytesAllocatedCntr) {
+ (*Counters.TotalBytesAllocatedCntr) -= FreePages.size() * POOL_PAGE_SIZE;
+ }
+
for (; !FreePages.empty(); FreePages.pop()) {
- AllPages.erase(FreePages.top());
+ AllPages.erase(FreePages.top());
TGlobalPools::Instance().Get(0).PushPage(FreePages.top());
}
}
@@ -207,9 +207,9 @@ void* TAlignedPagePool::GetPage() {
}
if (Limit && TotalAllocated + POOL_PAGE_SIZE > Limit && !TryIncreaseLimit(TotalAllocated + POOL_PAGE_SIZE)) {
- throw TMemoryLimitExceededException();
- }
-
+ throw TMemoryLimitExceededException();
+ }
+
if (const auto ptr = TGlobalPools::Instance().Get(0).GetPage()) {
TotalAllocated += POOL_PAGE_SIZE;
if (AllocNotifyCallback) {
@@ -260,11 +260,11 @@ void TAlignedPagePool::ReturnBlock(void* ptr, size_t size) noexcept {
void* TAlignedPagePool::Alloc(size_t size) {
void* res = nullptr;
size = AlignUp(size, SYS_PAGE_SIZE);
-
+
if (Limit && TotalAllocated + size > Limit && !TryIncreaseLimit(TotalAllocated + size)) {
- throw TMemoryLimitExceededException();
- }
-
+ throw TMemoryLimitExceededException();
+ }
+
if (AllocNotifyCallback) {
if (AllocNotifyCurrentBytes > AllocNotifyBytes) {
AllocNotifyCallback();
@@ -372,8 +372,8 @@ void* TAlignedPagePool::Alloc(size_t size) {
void TAlignedPagePool::Free(void* ptr, size_t size) noexcept {
size = AlignUp(size, SYS_PAGE_SIZE);
- if (size <= MaxMidSize)
- size = FastClp2(size);
+ if (size <= MaxMidSize)
+ size = FastClp2(size);
if (size <= MaxMidSize) {
auto level = LeastSignificantBit(size) - LeastSignificantBit(TAlignedPagePool::POOL_PAGE_SIZE);
Y_VERIFY_DEBUG(level >= 1 && level <= MidLevels);
diff --git a/ydb/library/yql/minikql/aligned_page_pool.h b/ydb/library/yql/minikql/aligned_page_pool.h
index ded028ab603..2ef28786554 100644
--- a/ydb/library/yql/minikql/aligned_page_pool.h
+++ b/ydb/library/yql/minikql/aligned_page_pool.h
@@ -1,6 +1,6 @@
#pragma once
-#include <util/generic/yexception.h>
+#include <util/generic/yexception.h>
#include <util/stream/output.h>
#include <util/system/yassert.h>
#include <util/system/defaults.h>
@@ -34,7 +34,7 @@ struct TAlignedPagePoolCounters {
// NOTE: We intentionally avoid inheritance from std::exception here to make it harder
// to catch this exception in UDFs code, so we can handle it in the host.
class TMemoryLimitExceededException {};
-
+
class TAlignedPagePool {
public:
static constexpr ui64 POOL_PAGE_SIZE = 1ULL << 16; // 64k
@@ -150,15 +150,15 @@ public:
static ui64 GetGlobalPagePoolSize();
ui64 GetLimit() const noexcept {
- return Limit;
- }
-
+ return Limit;
+ }
+
void SetLimit(size_t limit) noexcept {
- Limit = limit;
- }
-
- void ReleaseFreePages();
-
+ Limit = limit;
+ }
+
+ void ReleaseFreePages();
+
void DisableStrictAllocationCheck() noexcept {
CheckLostMem = false;
}
@@ -188,14 +188,14 @@ protected:
bool TryIncreaseLimit(ui64 required);
protected:
- std::stack<void*, std::vector<void*>> FreePages;
+ std::stack<void*, std::vector<void*>> FreePages;
std::unordered_set<void*> AllPages;
std::unordered_map<void*, size_t> ActiveBlocks;
size_t TotalAllocated = 0;
size_t PeakAllocated = 0;
size_t PeakUsed = 0;
- size_t Limit = 0;
-
+ size_t Limit = 0;
+
ui64 AllocCount = 0;
ui64 PageAllocCount = 0;
ui64 PageHitCount = 0;
diff --git a/ydb/library/yql/minikql/computation/mkql_computation_node_pack.cpp b/ydb/library/yql/minikql/computation/mkql_computation_node_pack.cpp
index 14d237cd63d..625a269eaf6 100644
--- a/ydb/library/yql/minikql/computation/mkql_computation_node_pack.cpp
+++ b/ydb/library/yql/minikql/computation/mkql_computation_node_pack.cpp
@@ -489,12 +489,12 @@ NUdf::TUnboxedValue TValuePacker::UnpackImpl(const TType* type, TStringBuf& buf,
buf.Skip(16);
return MakeString(NUdf::TStringRef(ptr, 16));
}
- case NUdf::EDataSlot::Decimal: {
+ case NUdf::EDataSlot::Decimal: {
const auto des = NYql::NDecimal::Deserialize(buf.data());
MKQL_ENSURE(!NYql::NDecimal::IsError(des.first), "Bad packed data: invalid decimal.");
buf.Skip(des.second);
return NUdf::TUnboxedValuePod(des.first);
- }
+ }
default:
ui32 size = 0;
if (Properties.Test(EProps::UseTopLength)) {
@@ -734,11 +734,11 @@ void TValuePacker::PackImpl(const TType* type, const NUdf::TUnboxedValuePod& val
NDetails::PackUInt16(value.GetTimezoneId(), Buffer);
break;
}
- case NUdf::EDataSlot::Decimal: {
+ case NUdf::EDataSlot::Decimal: {
char buff[0x10U];
Buffer.Append(buff, NYql::NDecimal::Serialize(value.GetInt128(), buff));
- break;
- }
+ break;
+ }
default: {
auto stringRef = value.AsStringRef();
if (!Properties.Test(EProps::UseTopLength)) {
diff --git a/ydb/library/yql/minikql/mkql_alloc.h b/ydb/library/yql/minikql/mkql_alloc.h
index 967c9d3a0f5..5e864cdc4c8 100644
--- a/ydb/library/yql/minikql/mkql_alloc.h
+++ b/ydb/library/yql/minikql/mkql_alloc.h
@@ -107,18 +107,18 @@ public:
}
}
- size_t GetUsed() const { return MyState_.GetUsed(); }
+ size_t GetUsed() const { return MyState_.GetUsed(); }
size_t GetPeakUsed() const { return MyState_.GetPeakUsed(); }
- size_t GetAllocated() const { return MyState_.GetAllocated(); }
+ size_t GetAllocated() const { return MyState_.GetAllocated(); }
size_t GetPeakAllocated() const { return MyState_.GetPeakAllocated(); }
-
- size_t GetLimit() const { return MyState_.GetLimit(); }
- void SetLimit(size_t limit) { MyState_.SetLimit(limit); }
+
+ size_t GetLimit() const { return MyState_.GetLimit(); }
+ void SetLimit(size_t limit) { MyState_.SetLimit(limit); }
void DisableStrictAllocationCheck() { MyState_.DisableStrictAllocationCheck(); }
-
- void ReleaseFreePages() { MyState_.ReleaseFreePages(); }
+
+ void ReleaseFreePages() { MyState_.ReleaseFreePages(); }
void InvalidateMemInfo() { MyState_.InvalidateMemInfo(); }
-
+
bool IsAttached() const { return AttachedCount_ > 0; }
private:
diff --git a/ydb/library/yql/public/types/yql_types.proto b/ydb/library/yql/public/types/yql_types.proto
index 58ce15be89a..f9ebaf1390b 100644
--- a/ydb/library/yql/public/types/yql_types.proto
+++ b/ydb/library/yql/public/types/yql_types.proto
@@ -28,6 +28,6 @@ enum TypeIds {
TzDate = 0x0034;
TzDatetime = 0x0035;
TzTimestamp = 0x0036;
- Decimal = 0x1301;
+ Decimal = 0x1301;
DyNumber = 0x1302;
}
diff --git a/ydb/public/api/grpc/ydb_cms_v1.proto b/ydb/public/api/grpc/ydb_cms_v1.proto
index 34fc3ef9c12..11e4517381f 100644
--- a/ydb/public/api/grpc/ydb_cms_v1.proto
+++ b/ydb/public/api/grpc/ydb_cms_v1.proto
@@ -1,30 +1,30 @@
-syntax = "proto3";
-
+syntax = "proto3";
+
package Ydb.Cms.V1;
option java_package = "com.yandex.ydb.cms.v1";
-
+
import "ydb/public/api/protos/ydb_cms.proto";
-
+
// CMS stands for Cluster Management System. CmsService provides some
// functionality for managing cluster, i.e. managing YDB Database
// instances for example.
-service CmsService {
+service CmsService {
// Create a new database.
rpc CreateDatabase(Cms.CreateDatabaseRequest) returns (Cms.CreateDatabaseResponse);
-
+
// Get current database's status.
rpc GetDatabaseStatus(Cms.GetDatabaseStatusRequest) returns (Cms.GetDatabaseStatusResponse);
-
+
// Alter database resources.
rpc AlterDatabase(Cms.AlterDatabaseRequest) returns (Cms.AlterDatabaseResponse);
-
+
// List all databases.
rpc ListDatabases(Cms.ListDatabasesRequest) returns (Cms.ListDatabasesResponse);
-
+
// Remove database.
rpc RemoveDatabase(Cms.RemoveDatabaseRequest) returns (Cms.RemoveDatabaseResponse);
-
- // Describe supported database options.
- rpc DescribeDatabaseOptions(Cms.DescribeDatabaseOptionsRequest) returns (Cms.DescribeDatabaseOptionsResponse);
+
+ // Describe supported database options.
+ rpc DescribeDatabaseOptions(Cms.DescribeDatabaseOptionsRequest) returns (Cms.DescribeDatabaseOptionsResponse);
}
diff --git a/ydb/public/api/grpc/ydb_table_v1.proto b/ydb/public/api/grpc/ydb_table_v1.proto
index 25d5db82c87..dbbf62c5c8e 100644
--- a/ydb/public/api/grpc/ydb_table_v1.proto
+++ b/ydb/public/api/grpc/ydb_table_v1.proto
@@ -67,9 +67,9 @@ service TableService {
// Performs a rollback of the specified active transaction.
rpc RollbackTransaction(Table.RollbackTransactionRequest) returns (Table.RollbackTransactionResponse);
-
- // Describe supported table options.
- rpc DescribeTableOptions(Table.DescribeTableOptionsRequest) returns (Table.DescribeTableOptionsResponse);
+
+ // Describe supported table options.
+ rpc DescribeTableOptions(Table.DescribeTableOptionsRequest) returns (Table.DescribeTableOptionsResponse);
// Streaming read table
rpc StreamReadTable(Table.ReadTableRequest) returns (stream Table.ReadTableResponse);
diff --git a/ydb/public/api/protos/ydb_cms.proto b/ydb/public/api/protos/ydb_cms.proto
index 1e800c26bdc..1a569c70812 100644
--- a/ydb/public/api/protos/ydb_cms.proto
+++ b/ydb/public/api/protos/ydb_cms.proto
@@ -1,67 +1,67 @@
-syntax = "proto3";
-option cc_enable_arenas = true;
-
-package Ydb.Cms;
+syntax = "proto3";
+option cc_enable_arenas = true;
+
+package Ydb.Cms;
option java_package = "com.yandex.ydb.cms";
-
+
import "ydb/public/api/protos/ydb_operation.proto";
-
-// A set of uniform storage units.
-// Single storage unit can be thought of as a reserved part of a RAID.
-message StorageUnits {
- // Required. Kind of the storage unit. Determine guarantees
- // for all main unit parameters: used hard disk type, capacity
- // throughput, IOPS etc.
- string unit_kind = 1;
- // Required. The number of units in this set.
- uint64 count = 2;
-}
-
-// A set of uniform computational units.
-message ComputationalUnits {
- // Required. Kind of the computational unit. Determine main
- // unit parameters like available memory, CPU, etc.
- string unit_kind = 1;
- // The availability zone all unit should be located in.
- // By default any availability zone can be used.
- string availability_zone = 2;
- // Required. The number of units in this set.
- uint64 count = 3;
-}
-
+
+// A set of uniform storage units.
+// Single storage unit can be thought of as a reserved part of a RAID.
+message StorageUnits {
+ // Required. Kind of the storage unit. Determine guarantees
+ // for all main unit parameters: used hard disk type, capacity
+ // throughput, IOPS etc.
+ string unit_kind = 1;
+ // Required. The number of units in this set.
+ uint64 count = 2;
+}
+
+// A set of uniform computational units.
+message ComputationalUnits {
+ // Required. Kind of the computational unit. Determine main
+ // unit parameters like available memory, CPU, etc.
+ string unit_kind = 1;
+ // The availability zone all unit should be located in.
+ // By default any availability zone can be used.
+ string availability_zone = 2;
+ // Required. The number of units in this set.
+ uint64 count = 3;
+}
+
// Computational unit allocated for database. Used to register
-// externally allocated computational resources in CMS.
-message AllocatedComputationalUnit {
- // Required. Computational unit host name.
- string host = 1;
- // Required. Computational unit port.
- uint32 port = 2;
- // Required. Computational unit kind.
- string unit_kind = 3;
-}
-
-// A set of computational and storage resources.
-message Resources {
- // Storage resources.
- repeated StorageUnits storage_units = 1;
- // Computational resources.
- repeated ComputationalUnits computational_units = 2;
-}
-
+// externally allocated computational resources in CMS.
+message AllocatedComputationalUnit {
+ // Required. Computational unit host name.
+ string host = 1;
+ // Required. Computational unit port.
+ uint32 port = 2;
+ // Required. Computational unit kind.
+ string unit_kind = 3;
+}
+
+// A set of computational and storage resources.
+message Resources {
+ // Storage resources.
+ repeated StorageUnits storage_units = 1;
+ // Computational resources.
+ repeated ComputationalUnits computational_units = 2;
+}
+
message ServerlessResources {
// Full path to shared database's home dir whose resources will be used.
string shared_database_path = 1;
}
-message DatabaseOptions {
- // Do not initialize services required for transactions processing.
- bool disable_tx_service = 1;
+message DatabaseOptions {
+ // Do not initialize services required for transactions processing.
+ bool disable_tx_service = 1;
// Old-style database, do not create external schemeshard for database
bool disable_external_subdomain = 2;
// Transaction plan resolution in milliseconds
uint32 plan_resolution = 3;
-}
-
+}
+
// A set of quotas for schema operations
message SchemaOperationQuotas {
// A single quota based on leaky bucket
@@ -102,7 +102,7 @@ message DatabaseQuotas {
message CreateDatabaseRequest {
Ydb.Operations.OperationParams operation_params = 1;
// Required. Full path to database's home dir. Used as database ID.
- string path = 2;
+ string path = 2;
oneof resources_kind {
// Resources to allocate for database by CMS.
Resources resources = 3;
@@ -111,9 +111,9 @@ message CreateDatabaseRequest {
// If specified, the created database will be "serverless".
ServerlessResources serverless_resources = 7;
}
- // Additional database options.
- DatabaseOptions options = 4;
- // Attach attributes to database.
+ // Additional database options.
+ DatabaseOptions options = 4;
+ // Attach attributes to database.
map<string, string> attributes = 5;
// Optional quotas for schema operations
SchemaOperationQuotas schema_operation_quotas = 8;
@@ -121,39 +121,39 @@ message CreateDatabaseRequest {
string idempotency_key = 9;
// Optional quotas for the database
DatabaseQuotas database_quotas = 10;
-}
-
+}
+
message CreateDatabaseResponse {
Ydb.Operations.Operation operation = 1;
-}
-
+}
+
// Get current database status.
message GetDatabaseStatusRequest {
// Required. Full path to database's home dir.
- string path = 1;
+ string path = 1;
// Operation parameters
Ydb.Operations.OperationParams operation_params = 2;
}
-
+
message GetDatabaseStatusResponse {
- // operation.result holds GetDatabaseStatusResult
+ // operation.result holds GetDatabaseStatusResult
Ydb.Operations.Operation operation = 1;
}
-
+
message GetDatabaseStatusResult {
- enum State {
+ enum State {
STATE_UNSPECIFIED = 0;
- CREATING = 1;
- RUNNING = 2;
- REMOVING = 3;
- PENDING_RESOURCES = 4;
+ CREATING = 1;
+ RUNNING = 2;
+ REMOVING = 3;
+ PENDING_RESOURCES = 4;
CONFIGURING = 5;
- }
-
+ }
+
// Full path to database's home dir.
- string path = 1;
+ string path = 1;
// Current database state.
- State state = 2;
+ State state = 2;
oneof resources_kind {
// Database resources requested for allocation.
Resources required_resources = 3;
@@ -161,36 +161,36 @@ message GetDatabaseStatusResult {
ServerlessResources serverless_resources = 8;
}
// Database resources allocated by CMS.
- Resources allocated_resources = 4;
+ Resources allocated_resources = 4;
// Externally allocated database resources registered in CMS.
- repeated AllocatedComputationalUnit registered_resources = 5;
- // Current database generation. Incremented at each successful
- // alter request.
- uint64 generation = 6;
+ repeated AllocatedComputationalUnit registered_resources = 5;
+ // Current database generation. Incremented at each successful
+ // alter request.
+ uint64 generation = 6;
// Current quotas for schema operations
SchemaOperationQuotas schema_operation_quotas = 9;
// Current quotas for the database
DatabaseQuotas database_quotas = 10;
}
-
+
// Change resources allocated for database.
message AlterDatabaseRequest {
// Required. Full path to database's home dir.
- string path = 1;
+ string path = 1;
// Additional computational units to allocate for database.
- repeated ComputationalUnits computational_units_to_add = 2;
- // Computational units to deallocate.
- repeated ComputationalUnits computational_units_to_remove = 3;
+ repeated ComputationalUnits computational_units_to_add = 2;
+ // Computational units to deallocate.
+ repeated ComputationalUnits computational_units_to_remove = 3;
// Additional storage units to allocate for database.
- repeated StorageUnits storage_units_to_add = 4;
+ repeated StorageUnits storage_units_to_add = 4;
// Externally allocated computational units to register for database.
- repeated AllocatedComputationalUnit computational_units_to_register = 5;
- // Externally allocated computational units to deregister.
- repeated AllocatedComputationalUnit computational_units_to_deregister = 6;
- // Operation parameters.
+ repeated AllocatedComputationalUnit computational_units_to_register = 5;
+ // Externally allocated computational units to deregister.
+ repeated AllocatedComputationalUnit computational_units_to_deregister = 6;
+ // Operation parameters.
Ydb.Operations.OperationParams operation_params = 7;
- // Current generation of altered database.
- uint64 generation = 8;
+ // Current generation of altered database.
+ uint64 generation = 8;
// Change quotas for schema operations
SchemaOperationQuotas schema_operation_quotas = 9;
// Optional idempotency key
@@ -199,67 +199,67 @@ message AlterDatabaseRequest {
DatabaseQuotas database_quotas = 11;
// Alter attributes. Leave the value blank to drop an attribute.
map<string, string> alter_attributes = 12;
-}
-
+}
+
message AlterDatabaseResponse {
Ydb.Operations.Operation operation = 1;
-}
-
+}
+
// List all databases known by CMS.
message ListDatabasesRequest {
// Operation parameters
Ydb.Operations.OperationParams operation_params = 1;
-}
-
+}
+
message ListDatabasesResponse {
- // operation.result holds ListDatabasesResult
+ // operation.result holds ListDatabasesResult
Ydb.Operations.Operation operation = 1;
-}
-
+}
+
message ListDatabasesResult {
- repeated string paths = 1;
-}
-
+ repeated string paths = 1;
+}
+
// Completely remove database and all his data.
message RemoveDatabaseRequest {
// Required. Full path to database's home dir.
- string path = 1;
+ string path = 1;
Ydb.Operations.OperationParams operation_params = 2;
-}
-
+}
+
message RemoveDatabaseResponse {
Ydb.Operations.Operation operation = 1;
-}
-
-message StorageUnitDescription {
- string kind = 1;
- map<string, string> labels = 2;
-}
-
-message AvailabilityZoneDescription {
- string name = 1;
- map<string, string> labels = 2;
-}
-
-message ComputationalUnitDescription {
- string kind = 1;
- map<string, string> labels = 2;
- repeated string allowed_availability_zones = 3;
-}
-
-message DescribeDatabaseOptionsRequest {
+}
+
+message StorageUnitDescription {
+ string kind = 1;
+ map<string, string> labels = 2;
+}
+
+message AvailabilityZoneDescription {
+ string name = 1;
+ map<string, string> labels = 2;
+}
+
+message ComputationalUnitDescription {
+ string kind = 1;
+ map<string, string> labels = 2;
+ repeated string allowed_availability_zones = 3;
+}
+
+message DescribeDatabaseOptionsRequest {
// Operation parameters
Ydb.Operations.OperationParams operation_params = 1;
-}
-
-message DescribeDatabaseOptionsResponse {
- // operation.result holds DescribeDatabaseOptionsResult
- Ydb.Operations.Operation operation = 1;
-}
-
-message DescribeDatabaseOptionsResult {
- repeated StorageUnitDescription storage_units = 1;
- repeated AvailabilityZoneDescription availability_zones = 2;
- repeated ComputationalUnitDescription computational_units = 3;
-}
+}
+
+message DescribeDatabaseOptionsResponse {
+ // operation.result holds DescribeDatabaseOptionsResult
+ Ydb.Operations.Operation operation = 1;
+}
+
+message DescribeDatabaseOptionsResult {
+ repeated StorageUnitDescription storage_units = 1;
+ repeated AvailabilityZoneDescription availability_zones = 2;
+ repeated ComputationalUnitDescription computational_units = 3;
+}
diff --git a/ydb/public/api/protos/ydb_status_codes.proto b/ydb/public/api/protos/ydb_status_codes.proto
index fb1c628a532..4c500dc43ac 100644
--- a/ydb/public/api/protos/ydb_status_codes.proto
+++ b/ydb/public/api/protos/ydb_status_codes.proto
@@ -20,7 +20,7 @@ message StatusIds {
TIMEOUT = 400090;
BAD_SESSION = 400100;
PRECONDITION_FAILED = 400120;
- ALREADY_EXISTS = 400130;
+ ALREADY_EXISTS = 400130;
NOT_FOUND = 400140;
SESSION_EXPIRED = 400150;
CANCELLED = 400160;
diff --git a/ydb/public/api/protos/ydb_table.proto b/ydb/public/api/protos/ydb_table.proto
index 27b55f853da..c8063d9475c 100644
--- a/ydb/public/api/protos/ydb_table.proto
+++ b/ydb/public/api/protos/ydb_table.proto
@@ -120,9 +120,9 @@ message IndexBuildMetadata {
message StoragePool {
string media = 1;
}
-
-message StoragePolicy {
- string preset_name = 1;
+
+message StoragePolicy {
+ string preset_name = 1;
StoragePool syslog = 2;
StoragePool log = 3;
StoragePool data = 4;
@@ -130,7 +130,7 @@ message StoragePolicy {
Ydb.FeatureFlag.Status keep_in_memory = 6;
repeated ColumnFamilyPolicy column_families = 7;
}
-
+
message ColumnFamilyPolicy {
enum Compression {
COMPRESSION_UNSPECIFIED = 0;
@@ -154,19 +154,19 @@ message ColumnFamilyPolicy {
Compression compression = 5;
}
-message CompactionPolicy {
- string preset_name = 1;
+message CompactionPolicy {
+ string preset_name = 1;
}
-
-message ExplicitPartitions {
- // Specify key values used to split table into partitions.
- // Each value becomes the first key of a new partition.
- // Key values should go in ascending order.
- // Total number of created partitions is number of specified
- // keys + 1.
- repeated TypedValue split_points = 1;
+
+message ExplicitPartitions {
+ // Specify key values used to split table into partitions.
+ // Each value becomes the first key of a new partition.
+ // Key values should go in ascending order.
+ // Total number of created partitions is number of specified
+ // keys + 1.
+ repeated TypedValue split_points = 1;
}
-
+
message PartitionStats {
// Approximate number of rows in shard
uint64 rows_estimate = 1;
@@ -189,58 +189,58 @@ message TableStats {
google.protobuf.Timestamp modification_time = 6;
}
-message PartitioningPolicy {
- enum AutoPartitioningPolicy {
+message PartitioningPolicy {
+ enum AutoPartitioningPolicy {
AUTO_PARTITIONING_POLICY_UNSPECIFIED = 0;
DISABLED = 1;
AUTO_SPLIT = 2;
AUTO_SPLIT_MERGE = 3;
- }
-
- string preset_name = 1;
- AutoPartitioningPolicy auto_partitioning = 2;
- oneof partitions {
- // Allows to enable uniform sharding using given shards number.
- // The first components of primary key must have Uint32/Uint64 type.
- uint64 uniform_partitions = 3;
- // Explicitly specify key values which are used as borders for
- // created partitions.
- ExplicitPartitions explicit_partitions = 4;
- }
-}
-
-message ExecutionPolicy {
- string preset_name = 1;
-}
-
-message ReplicationPolicy {
- string preset_name = 1;
- // If value is non-zero then it specifies a number of read-only
- // replicas to create for a table. Zero value means preset
- // setting usage.
- uint32 replicas_count = 2;
- // If this feature in enabled then requested number of replicas
- // will be created in each availability zone.
+ }
+
+ string preset_name = 1;
+ AutoPartitioningPolicy auto_partitioning = 2;
+ oneof partitions {
+ // Allows to enable uniform sharding using given shards number.
+ // The first components of primary key must have Uint32/Uint64 type.
+ uint64 uniform_partitions = 3;
+ // Explicitly specify key values which are used as borders for
+ // created partitions.
+ ExplicitPartitions explicit_partitions = 4;
+ }
+}
+
+message ExecutionPolicy {
+ string preset_name = 1;
+}
+
+message ReplicationPolicy {
+ string preset_name = 1;
+ // If value is non-zero then it specifies a number of read-only
+ // replicas to create for a table. Zero value means preset
+ // setting usage.
+ uint32 replicas_count = 2;
+ // If this feature in enabled then requested number of replicas
+ // will be created in each availability zone.
Ydb.FeatureFlag.Status create_per_availability_zone = 3;
- // If this feature in enabled then read-only replicas can be promoted
+ // If this feature in enabled then read-only replicas can be promoted
// to leader.
Ydb.FeatureFlag.Status allow_promotion = 4;
}
-
-message CachingPolicy {
- string preset_name = 1;
-}
-
-message TableProfile {
- string preset_name = 1;
- StoragePolicy storage_policy = 2;
- CompactionPolicy compaction_policy = 3;
- PartitioningPolicy partitioning_policy = 4;
- ExecutionPolicy execution_policy = 5;
- ReplicationPolicy replication_policy = 6;
- CachingPolicy caching_policy = 7;
-}
-
+
+message CachingPolicy {
+ string preset_name = 1;
+}
+
+message TableProfile {
+ string preset_name = 1;
+ StoragePolicy storage_policy = 2;
+ CompactionPolicy compaction_policy = 3;
+ PartitioningPolicy partitioning_policy = 4;
+ ExecutionPolicy execution_policy = 5;
+ ReplicationPolicy replication_policy = 6;
+ CachingPolicy caching_policy = 7;
+}
+
message ColumnMeta {
// Name of column
string name = 1;
@@ -403,7 +403,7 @@ message CreateTableRequest {
// List of columns used as primary key
repeated string primary_key = 4;
// Table profile
- TableProfile profile = 5;
+ TableProfile profile = 5;
Ydb.Operations.OperationParams operation_params = 6;
// List of secondary indexes
repeated TableIndex indexes = 7;
@@ -820,71 +820,71 @@ message RollbackTransactionResponse {
Ydb.Operations.Operation operation = 1;
}
-message StoragePolicyDescription {
- string name = 1;
- map<string, string> labels = 2;
-}
-
-message CompactionPolicyDescription {
- string name = 1;
- map<string, string> labels = 2;
-}
-
-message PartitioningPolicyDescription {
- string name = 1;
- map<string, string> labels = 2;
-}
-
-message ExecutionPolicyDescription {
- string name = 1;
- map<string, string> labels = 2;
-}
-
-message ReplicationPolicyDescription {
- string name = 1;
- map<string, string> labels = 2;
-}
-
-message CachingPolicyDescription {
- string name = 1;
- map<string, string> labels = 2;
-}
-
-message TableProfileDescription {
- string name = 1;
- map<string, string> labels = 2;
- string default_storage_policy = 3;
- repeated string allowed_storage_policies = 4;
- string default_compaction_policy = 5;
- repeated string allowed_compaction_policies = 6;
- string default_partitioning_policy = 7;
- repeated string allowed_partitioning_policies = 8;
- string default_execution_policy = 9;
- repeated string allowed_execution_policies = 10;
- string default_replication_policy = 11;
- repeated string allowed_replication_policies = 12;
- string default_caching_policy = 13;
- repeated string allowed_caching_policies = 14;
-}
-
-message DescribeTableOptionsRequest {
+message StoragePolicyDescription {
+ string name = 1;
+ map<string, string> labels = 2;
+}
+
+message CompactionPolicyDescription {
+ string name = 1;
+ map<string, string> labels = 2;
+}
+
+message PartitioningPolicyDescription {
+ string name = 1;
+ map<string, string> labels = 2;
+}
+
+message ExecutionPolicyDescription {
+ string name = 1;
+ map<string, string> labels = 2;
+}
+
+message ReplicationPolicyDescription {
+ string name = 1;
+ map<string, string> labels = 2;
+}
+
+message CachingPolicyDescription {
+ string name = 1;
+ map<string, string> labels = 2;
+}
+
+message TableProfileDescription {
+ string name = 1;
+ map<string, string> labels = 2;
+ string default_storage_policy = 3;
+ repeated string allowed_storage_policies = 4;
+ string default_compaction_policy = 5;
+ repeated string allowed_compaction_policies = 6;
+ string default_partitioning_policy = 7;
+ repeated string allowed_partitioning_policies = 8;
+ string default_execution_policy = 9;
+ repeated string allowed_execution_policies = 10;
+ string default_replication_policy = 11;
+ repeated string allowed_replication_policies = 12;
+ string default_caching_policy = 13;
+ repeated string allowed_caching_policies = 14;
+}
+
+message DescribeTableOptionsRequest {
Ydb.Operations.OperationParams operation_params = 1;
-}
-
-message DescribeTableOptionsResponse {
- // operation.result holds ListTableParametersResult
- Ydb.Operations.Operation operation = 1;
-}
-
-message DescribeTableOptionsResult {
- repeated TableProfileDescription table_profile_presets = 1;
- repeated StoragePolicyDescription storage_policy_presets = 2;
- repeated CompactionPolicyDescription compaction_policy_presets = 3;
- repeated PartitioningPolicyDescription partitioning_policy_presets = 4;
- repeated ExecutionPolicyDescription execution_policy_presets = 5;
- repeated ReplicationPolicyDescription replication_policy_presets = 6;
- repeated CachingPolicyDescription caching_policy_presets = 7;
-}
+}
+
+message DescribeTableOptionsResponse {
+ // operation.result holds ListTableParametersResult
+ Ydb.Operations.Operation operation = 1;
+}
+
+message DescribeTableOptionsResult {
+ repeated TableProfileDescription table_profile_presets = 1;
+ repeated StoragePolicyDescription storage_policy_presets = 2;
+ repeated CompactionPolicyDescription compaction_policy_presets = 3;
+ repeated PartitioningPolicyDescription partitioning_policy_presets = 4;
+ repeated ExecutionPolicyDescription execution_policy_presets = 5;
+ repeated ReplicationPolicyDescription replication_policy_presets = 6;
+ repeated CachingPolicyDescription caching_policy_presets = 7;
+}
// ReadTable request/response
diff --git a/ydb/public/lib/base/defs.h b/ydb/public/lib/base/defs.h
index d445491118e..97e933c93ac 100644
--- a/ydb/public/lib/base/defs.h
+++ b/ydb/public/lib/base/defs.h
@@ -68,7 +68,7 @@ namespace NTxProxy {
XX(ExecTimeout, 51) \
XX(ExecError, 52) \
XX(ExecInProgress, 53) \
- XX(ExecResponseData, 54) \
+ XX(ExecResponseData, 54) \
XX(ExecResultUnavailable, 55) \
XX(ExecCancelled, 56) \
\
diff --git a/ydb/public/lib/base/msgbus.h b/ydb/public/lib/base/msgbus.h
index fef20381e44..f11bd9771f1 100644
--- a/ydb/public/lib/base/msgbus.h
+++ b/ydb/public/lib/base/msgbus.h
@@ -32,7 +32,7 @@ enum {
MTYPE_CLIENT_REQUEST_JOB_INFORMATION = 10417, // deprecated
MTYPE_CLIENT_DATASHARD_SET_CONFIG = 10418, // deprecated
MTYPE_CLIENT_DESTROY_JOB = 10419, // deprecated
- MTYPE_CLIENT_COMPACTION_BROKER_SET_CONFIG = 10420, // deprecated
+ MTYPE_CLIENT_COMPACTION_BROKER_SET_CONFIG = 10420, // deprecated
MTYPE_CLIENT_OLD_HIVE_CREATE_TABLET = 10421, // deprecated
MTYPE_CLIENT_HIVE_CREATE_TABLET_RESULT = 10422, // deprecated
MTYPE_CLIENT_OLD_LOCAL_ENUMERATE_TABLETS = 10423, // deprecated
@@ -71,23 +71,23 @@ enum {
MTYPE_CLIENT_DRAIN_NODE = 10460,
MTYPE_CLIENT_FILL_NODE = 10461,
MTYPE_CLIENT_RESOLVE_NODE = 10462,
- MTYPE_CLIENT_NODE_REGISTRATION_REQUEST = 10463,
- MTYPE_CLIENT_NODE_REGISTRATION_RESPONSE = 10464,
- MTYPE_CLIENT_CMS_REQUEST = 10465,
- MTYPE_CLIENT_CMS_RESPONSE = 10466,
- MTYPE_CLIENT_RESOURCE_BROKER_SET_CONFIG = 10467,
+ MTYPE_CLIENT_NODE_REGISTRATION_REQUEST = 10463,
+ MTYPE_CLIENT_NODE_REGISTRATION_RESPONSE = 10464,
+ MTYPE_CLIENT_CMS_REQUEST = 10465,
+ MTYPE_CLIENT_CMS_RESPONSE = 10466,
+ MTYPE_CLIENT_RESOURCE_BROKER_SET_CONFIG = 10467,
MTYPE_CLIENT_CHOOSE_PROXY = 10468,
MTYPE_CLIENT_SQS_REQUEST = 10469,
MTYPE_CLIENT_SQS_RESPONSE = 10470,
MTYPE_CLIENT_WHOAMI = 10471,
- MTYPE_CLIENT_STREAM_REQUEST = 10472,
+ MTYPE_CLIENT_STREAM_REQUEST = 10472,
MTYPE_CLIENT_S3_LISTING_REQUEST = 10474,
MTYPE_CLIENT_S3_LISTING_RESPONSE = 10475,
MTYPE_CLIENT_INTERCONNECT_DEBUG = 10476,
- MTYPE_CLIENT_CONSOLE_REQUEST = 10477,
- MTYPE_CLIENT_CONSOLE_RESPONSE = 10478,
- MTYPE_CLIENT_TENANT_SLOT_BROKER_REQUEST = 10479,
- MTYPE_CLIENT_TENANT_SLOT_BROKER_RESPONSE = 10480,
+ MTYPE_CLIENT_CONSOLE_REQUEST = 10477,
+ MTYPE_CLIENT_CONSOLE_RESPONSE = 10478,
+ MTYPE_CLIENT_TENANT_SLOT_BROKER_REQUEST = 10479,
+ MTYPE_CLIENT_TENANT_SLOT_BROKER_RESPONSE = 10480,
MTYPE_CLIENT_TEST_SHARD_CONTROL = 10481,
};
@@ -136,20 +136,20 @@ struct TBusBlobStorageConfigRequest : TBusMessage<TBusBlobStorageConfigRequest,
struct TBusDrainNode : TBusMessage<TBusDrainNode, NKikimrClient::TDrainNodeRequest, MTYPE_CLIENT_DRAIN_NODE> {};
struct TBusFillNode : TBusMessage<TBusFillNode, NKikimrClient::TFillNodeRequest, MTYPE_CLIENT_FILL_NODE> {};
struct TBusResolveNode : TBusMessage<TBusResolveNode, NKikimrClient::TResolveNodeRequest, MTYPE_CLIENT_RESOLVE_NODE> {};
-struct TBusNodeRegistrationRequest : TBusMessage<TBusNodeRegistrationRequest, NKikimrClient::TNodeRegistrationRequest, MTYPE_CLIENT_NODE_REGISTRATION_REQUEST> {};
-struct TBusNodeRegistrationResponse : TBusMessage<TBusNodeRegistrationResponse, NKikimrClient::TNodeRegistrationResponse, MTYPE_CLIENT_NODE_REGISTRATION_RESPONSE> {};
-struct TBusCmsRequest : TBusMessage<TBusCmsRequest, NKikimrClient::TCmsRequest, MTYPE_CLIENT_CMS_REQUEST> {};
-struct TBusCmsResponse : TBusMessage<TBusCmsResponse, NKikimrClient::TCmsResponse, MTYPE_CLIENT_CMS_RESPONSE> {};
+struct TBusNodeRegistrationRequest : TBusMessage<TBusNodeRegistrationRequest, NKikimrClient::TNodeRegistrationRequest, MTYPE_CLIENT_NODE_REGISTRATION_REQUEST> {};
+struct TBusNodeRegistrationResponse : TBusMessage<TBusNodeRegistrationResponse, NKikimrClient::TNodeRegistrationResponse, MTYPE_CLIENT_NODE_REGISTRATION_RESPONSE> {};
+struct TBusCmsRequest : TBusMessage<TBusCmsRequest, NKikimrClient::TCmsRequest, MTYPE_CLIENT_CMS_REQUEST> {};
+struct TBusCmsResponse : TBusMessage<TBusCmsResponse, NKikimrClient::TCmsResponse, MTYPE_CLIENT_CMS_RESPONSE> {};
struct TBusChooseProxy : TBusMessage<TBusChooseProxy, NKikimrClient::TChooseProxyRequest, MTYPE_CLIENT_CHOOSE_PROXY> {};
struct TBusSqsRequest : TBusMessage<TBusSqsRequest, NKikimrClient::TSqsRequest, MTYPE_CLIENT_SQS_REQUEST> {};
struct TBusSqsResponse : TBusMessage<TBusSqsResponse, NKikimrClient::TSqsResponse, MTYPE_CLIENT_SQS_RESPONSE> {};
struct TBusWhoAmI : TBusMessage<TBusWhoAmI, NKikimrClient::TWhoAmI, MTYPE_CLIENT_WHOAMI> {};
-struct TBusStreamRequest : TBusMessage<TBusStreamRequest, NKikimrClient::TRequest, MTYPE_CLIENT_STREAM_REQUEST> {};
+struct TBusStreamRequest : TBusMessage<TBusStreamRequest, NKikimrClient::TRequest, MTYPE_CLIENT_STREAM_REQUEST> {};
struct TBusS3ListingRequest : TBusMessage<TBusS3ListingRequest, NKikimrClient::TS3ListingRequest, MTYPE_CLIENT_S3_LISTING_REQUEST> {};
struct TBusS3ListingResponse : TBusMessage<TBusS3ListingResponse, NKikimrClient::TS3ListingResponse, MTYPE_CLIENT_S3_LISTING_RESPONSE> {};
struct TBusInterconnectDebug : TBusMessage<TBusInterconnectDebug, NKikimrClient::TInterconnectDebug, MTYPE_CLIENT_INTERCONNECT_DEBUG> {};
-struct TBusConsoleRequest : TBusMessage<TBusConsoleRequest, NKikimrClient::TConsoleRequest, MTYPE_CLIENT_CONSOLE_REQUEST> {};
-struct TBusConsoleResponse : TBusMessage<TBusConsoleResponse, NKikimrClient::TConsoleResponse, MTYPE_CLIENT_CONSOLE_RESPONSE> {};
+struct TBusConsoleRequest : TBusMessage<TBusConsoleRequest, NKikimrClient::TConsoleRequest, MTYPE_CLIENT_CONSOLE_REQUEST> {};
+struct TBusConsoleResponse : TBusMessage<TBusConsoleResponse, NKikimrClient::TConsoleResponse, MTYPE_CLIENT_CONSOLE_RESPONSE> {};
struct TBusTestShardControlRequest : TBusMessage<TBusTestShardControlRequest, NKikimrClient::TTestShardControlRequest, MTYPE_CLIENT_TEST_SHARD_CONTROL> {};
class TBusResponseStatus : public TBusResponse {
@@ -233,18 +233,18 @@ public:
RegisterType(new TBusDrainNode);
RegisterType(new TBusFillNode);
RegisterType(new TBusResolveNode);
- RegisterType(new TBusNodeRegistrationRequest);
- RegisterType(new TBusNodeRegistrationResponse);
- RegisterType(new TBusCmsRequest);
- RegisterType(new TBusCmsResponse);
+ RegisterType(new TBusNodeRegistrationRequest);
+ RegisterType(new TBusNodeRegistrationResponse);
+ RegisterType(new TBusCmsRequest);
+ RegisterType(new TBusCmsResponse);
RegisterType(new TBusChooseProxy);
RegisterType(new TBusWhoAmI);
- RegisterType(new TBusStreamRequest);
+ RegisterType(new TBusStreamRequest);
RegisterType(new TBusS3ListingRequest);
RegisterType(new TBusS3ListingResponse);
RegisterType(new TBusInterconnectDebug);
- RegisterType(new TBusConsoleRequest);
- RegisterType(new TBusConsoleResponse);
+ RegisterType(new TBusConsoleRequest);
+ RegisterType(new TBusConsoleResponse);
RegisterType(new TBusTestShardControlRequest);
}
diff --git a/ydb/public/lib/deprecated/client/grpc_client.cpp b/ydb/public/lib/deprecated/client/grpc_client.cpp
index 67d1de9feca..dbf808ef752 100644
--- a/ydb/public/lib/deprecated/client/grpc_client.cpp
+++ b/ydb/public/lib/deprecated/client/grpc_client.cpp
@@ -6,29 +6,29 @@
#include <util/system/mutex.h>
#include <util/generic/maybe.h>
#include <util/generic/queue.h>
-#include <util/generic/set.h>
+#include <util/generic/set.h>
#include <grpc++/grpc++.h>
namespace NKikimr {
namespace NGRpcProxy {
class TGRpcClient::TImpl : ISimpleThread {
- struct IProcessorBase {
- virtual ~IProcessorBase() = default;
- virtual void Start() = 0;
- };
-
- struct IRequestProcessor : public IProcessorBase
+ struct IProcessorBase {
+ virtual ~IProcessorBase() = default;
+ virtual void Start() = 0;
+ };
+
+ struct IRequestProcessor : public IProcessorBase
{
virtual void Finished() = 0;
};
struct IStreamRequestReadProcessor : public IProcessorBase
- {
- virtual void InvokeProcess() = 0;
- virtual void InvokeFinish() = 0;
- };
-
+ {
+ virtual void InvokeProcess() = 0;
+ virtual void InvokeFinish() = 0;
+ };
+
public:
using TStub = NKikimrClient::TGRpcServer::Stub;
@@ -93,88 +93,88 @@ namespace NKikimr {
}
};
- template<typename TRequest, typename TResponse>
- class TStreamRequestProcessor
+ template<typename TRequest, typename TResponse>
+ class TStreamRequestProcessor
: public IStreamRequestReadProcessor
- {
- public:
- using TAsyncReaderPtr = std::unique_ptr<grpc::ClientAsyncReader<TResponse>>;
- using TAsyncRequest = TAsyncReaderPtr (TStub::*)(grpc::ClientContext*, const TRequest&, grpc::CompletionQueue*, void*);
- grpc::ClientContext Context;
- TAsyncReaderPtr Reader;
- TMutex ReaderLock;
- TImpl *Impl;
- TAsyncRequest AsyncRequest;
- TRequest Params;
- const TSimpleCallback<TResponse> Process;
- const TFinishCallback Finish;
- TResponse Reply;
- grpc::Status Status;
- bool Initialized;
- bool Finished;
-
- public:
- TStreamRequestProcessor(TImpl *impl,
- TAsyncRequest asyncRequest,
- const TRequest& params,
- TSimpleCallback<TResponse>&& process,
- TFinishCallback &&finish,
- const TMaybe<TDuration>& timeout)
- : Reader(nullptr)
- , Impl(impl)
- , AsyncRequest(asyncRequest)
- , Params(params)
- , Process(std::move(process))
- , Finish(std::move(finish))
- , Initialized(false)
- , Finished(false)
- {
- if (timeout) {
- Context.set_deadline(std::chrono::system_clock::now() +
- std::chrono::microseconds(timeout->MicroSeconds()));
- }
- }
-
- ~TStreamRequestProcessor() {
- if (!Finished) {
+ {
+ public:
+ using TAsyncReaderPtr = std::unique_ptr<grpc::ClientAsyncReader<TResponse>>;
+ using TAsyncRequest = TAsyncReaderPtr (TStub::*)(grpc::ClientContext*, const TRequest&, grpc::CompletionQueue*, void*);
+ grpc::ClientContext Context;
+ TAsyncReaderPtr Reader;
+ TMutex ReaderLock;
+ TImpl *Impl;
+ TAsyncRequest AsyncRequest;
+ TRequest Params;
+ const TSimpleCallback<TResponse> Process;
+ const TFinishCallback Finish;
+ TResponse Reply;
+ grpc::Status Status;
+ bool Initialized;
+ bool Finished;
+
+ public:
+ TStreamRequestProcessor(TImpl *impl,
+ TAsyncRequest asyncRequest,
+ const TRequest& params,
+ TSimpleCallback<TResponse>&& process,
+ TFinishCallback &&finish,
+ const TMaybe<TDuration>& timeout)
+ : Reader(nullptr)
+ , Impl(impl)
+ , AsyncRequest(asyncRequest)
+ , Params(params)
+ , Process(std::move(process))
+ , Finish(std::move(finish))
+ , Initialized(false)
+ , Finished(false)
+ {
+ if (timeout) {
+ Context.set_deadline(std::chrono::system_clock::now() +
+ std::chrono::microseconds(timeout->MicroSeconds()));
+ }
+ }
+
+ ~TStreamRequestProcessor() {
+ if (!Finished) {
TGrpcError error = {"request left unhandled", -1};
- Finish(&error);
- }
- }
-
- void Start() override {
- // Stub call will cause async call to InvokeProcess. Lock reader to avoid race.
- auto guard = Guard(ReaderLock);
- Reader = (Impl->Stub.*AsyncRequest)(&Context, Params, &Impl->CQ, this);
- }
-
- private:
- void InvokeProcess() override {
- auto guard = Guard(ReaderLock);
-
- Y_VERIFY(!Finished);
- Y_VERIFY_DEBUG(Reader);
-
- if (Initialized)
- Process(Reply);
- Reader->Read(&Reply, this);
- Initialized = true;
- }
-
- void InvokeFinish() override {
- Y_VERIFY(!Finished);
- Finished = true;
-
- if (Status.ok()) {
- Finish(nullptr);
- } else {
- const auto& msg = Status.error_message();
+ Finish(&error);
+ }
+ }
+
+ void Start() override {
+ // Stub call will cause async call to InvokeProcess. Lock reader to avoid race.
+ auto guard = Guard(ReaderLock);
+ Reader = (Impl->Stub.*AsyncRequest)(&Context, Params, &Impl->CQ, this);
+ }
+
+ private:
+ void InvokeProcess() override {
+ auto guard = Guard(ReaderLock);
+
+ Y_VERIFY(!Finished);
+ Y_VERIFY_DEBUG(Reader);
+
+ if (Initialized)
+ Process(Reply);
+ Reader->Read(&Reply, this);
+ Initialized = true;
+ }
+
+ void InvokeFinish() override {
+ Y_VERIFY(!Finished);
+ Finished = true;
+
+ if (Status.ok()) {
+ Finish(nullptr);
+ } else {
+ const auto& msg = Status.error_message();
TGrpcError error = {TString(msg.data(), msg.length()), Status.error_code()};
- Finish(&error);
- }
- }
- };
-
+ Finish(&error);
+ }
+ }
+ };
+
private:
std::shared_ptr<grpc::ChannelInterface> Channel;
TStub Stub;
@@ -221,61 +221,61 @@ namespace NKikimr {
}
}
- template<typename TRequest, typename TResponse>
- void IssueStream(const TRequest& request,
- TSimpleCallback<TResponse>&& processCb,
- TFinishCallback&& finishCb,
- typename TStreamRequestProcessor<TRequest, TResponse>::TAsyncRequest streamRequest) {
- auto processor = MakeHolder<TStreamRequestProcessor<TRequest, TResponse>>
- (this, streamRequest, request, std::move(processCb), std::move(finishCb), Timeout);
- with_lock (Mutex) {
- StreamTags.insert(processor.Get());
- if (!MaxInFlight || InFlight < MaxInFlight) {
- Start(std::move(processor));
- } else {
- PendingQ.push(std::move(processor));
- }
- }
- }
-
- bool IsStreamTag(void *tag) {
- with_lock (Mutex) {
+ template<typename TRequest, typename TResponse>
+ void IssueStream(const TRequest& request,
+ TSimpleCallback<TResponse>&& processCb,
+ TFinishCallback&& finishCb,
+ typename TStreamRequestProcessor<TRequest, TResponse>::TAsyncRequest streamRequest) {
+ auto processor = MakeHolder<TStreamRequestProcessor<TRequest, TResponse>>
+ (this, streamRequest, request, std::move(processCb), std::move(finishCb), Timeout);
+ with_lock (Mutex) {
+ StreamTags.insert(processor.Get());
+ if (!MaxInFlight || InFlight < MaxInFlight) {
+ Start(std::move(processor));
+ } else {
+ PendingQ.push(std::move(processor));
+ }
+ }
+ }
+
+ bool IsStreamTag(void *tag) {
+ with_lock (Mutex) {
return StreamTags.contains(tag);
- }
- }
-
- void EraseStreamTag(void *tag) {
- with_lock (Mutex) {
- StreamTags.erase(tag);
- }
- }
-
+ }
+ }
+
+ void EraseStreamTag(void *tag) {
+ with_lock (Mutex) {
+ StreamTags.erase(tag);
+ }
+ }
+
void *ThreadProc() override {
for (;;) {
void *tag;
bool ok = false;
- bool finished = true;
+ bool finished = true;
if (!CQ.Next(&tag, &ok)) {
break;
}
- if (IsStreamTag(tag)) {
+ if (IsStreamTag(tag)) {
THolder<IStreamRequestReadProcessor> processor(static_cast<IStreamRequestReadProcessor*>(tag));
- if (ok) {
- processor->InvokeProcess();
+ if (ok) {
+ processor->InvokeProcess();
Y_UNUSED(processor.Release()); // keep processor alive
- finished = false;
- } else {
- processor->InvokeFinish();
- EraseStreamTag(tag);
- }
- } else {
- THolder<IRequestProcessor> processor(static_cast<IRequestProcessor*>(tag));
- if (ok) {
- processor->Finished();
- }
- }
-
- if (finished) {
+ finished = false;
+ } else {
+ processor->InvokeFinish();
+ EraseStreamTag(tag);
+ }
+ } else {
+ THolder<IRequestProcessor> processor(static_cast<IRequestProcessor*>(tag));
+ if (ok) {
+ processor->Finished();
+ }
+ }
+
+ if (finished) {
with_lock (Mutex) {
--InFlight;
while (PendingQ && InFlight < MaxInFlight) {
@@ -288,7 +288,7 @@ namespace NKikimr {
return nullptr;
}
- void Start(THolder<IProcessorBase> &&processor) {
+ void Start(THolder<IProcessorBase> &&processor) {
processor->Start();
Y_UNUSED(processor.Release());
++InFlight;
@@ -328,8 +328,8 @@ namespace NKikimr {
IMPL_REQUEST(HiveCreateTablet, THiveCreateTablet, TResponse)
IMPL_REQUEST(LocalEnumerateTablets, TLocalEnumerateTablets, TResponse)
IMPL_REQUEST(KeyValue, TKeyValueRequest, TResponse)
- IMPL_REQUEST(RegisterNode, TNodeRegistrationRequest, TNodeRegistrationResponse)
- IMPL_REQUEST(CmsRequest, TCmsRequest, TCmsResponse)
+ IMPL_REQUEST(RegisterNode, TNodeRegistrationRequest, TNodeRegistrationResponse)
+ IMPL_REQUEST(CmsRequest, TCmsRequest, TCmsResponse)
IMPL_REQUEST(SqsRequest, TSqsRequest, TSqsResponse)
IMPL_REQUEST(S3Listing, TS3ListingRequest, TS3ListingResponse)
IMPL_REQUEST(LocalMKQL, TLocalMKQL, TResponse)
@@ -343,7 +343,7 @@ namespace NKikimr {
IMPL_REQUEST(DbOperation, TJSON, TJSON)
IMPL_REQUEST(DbBatch, TJSON, TJSON)
IMPL_REQUEST(ChooseProxy, TChooseProxyRequest, TResponse)
- IMPL_REQUEST(ConsoleRequest, TConsoleRequest, TConsoleResponse)
+ IMPL_REQUEST(ConsoleRequest, TConsoleRequest, TConsoleResponse)
IMPL_REQUEST(WhoAmI, TWhoAmI, TResponse)
IMPL_REQUEST(FillNode, TFillNodeRequest, TResponse)
IMPL_REQUEST(DrainNode, TDrainNodeRequest, TResponse)
diff --git a/ydb/public/lib/deprecated/client/grpc_client.h b/ydb/public/lib/deprecated/client/grpc_client.h
index 48829ec1df3..b0483a2646f 100644
--- a/ydb/public/lib/deprecated/client/grpc_client.h
+++ b/ydb/public/lib/deprecated/client/grpc_client.h
@@ -13,21 +13,21 @@ namespace NKikimr {
using TGrpcError = std::pair<TString, int>;
template<typename T>
- using TSimpleCallback = std::function<void (const T&)>;
-
- template<typename T>
+ using TSimpleCallback = std::function<void (const T&)>;
+
+ template<typename T>
using TCallback = std::function<void (const TGrpcError*, const T&)>;
using TResponseCallback = TCallback<NKikimrClient::TResponse>;
using TJSONCallback = TCallback<NKikimrClient::TJSON>;
- using TNodeRegistrationResponseCallback = TCallback<NKikimrClient::TNodeRegistrationResponse>;
- using TCmsResponseCallback = TCallback<NKikimrClient::TCmsResponse>;
+ using TNodeRegistrationResponseCallback = TCallback<NKikimrClient::TNodeRegistrationResponse>;
+ using TCmsResponseCallback = TCallback<NKikimrClient::TCmsResponse>;
using TSqsResponseCallback = TCallback<NKikimrClient::TSqsResponse>;
using TS3ListingResponseCallback = TCallback<NKikimrClient::TS3ListingResponse>;
- using TConsoleResponseCallback = TCallback<NKikimrClient::TConsoleResponse>;
+ using TConsoleResponseCallback = TCallback<NKikimrClient::TConsoleResponse>;
using TFinishCallback = std::function<void (const TGrpcError*)>;
-
+
class TGRpcClient {
TGRpcClientConfig Config;
class TImpl;
@@ -44,9 +44,9 @@ namespace NKikimr {
// ChooseProxy request
void ChooseProxy(const NKikimrClient::TChooseProxyRequest& request, TResponseCallback callback);
- // Stream request
- void StreamRequest(const NKikimrClient::TRequest& request, TSimpleCallback<NKikimrClient::TResponse> process, TFinishCallback finish);
-
+ // Stream request
+ void StreamRequest(const NKikimrClient::TRequest& request, TSimpleCallback<NKikimrClient::TResponse> process, TFinishCallback finish);
+
// DML transactions
void SchemeOperation(const NKikimrClient::TSchemeOperation& request, TResponseCallback callback);
// status polling for scheme transactions
@@ -76,16 +76,16 @@ namespace NKikimr {
void KeyValue(const NKikimrClient::TKeyValueRequest& request, TResponseCallback callback);
/////////////////////////////////////////////////////////////////////////////////////////////////
- // DYNAMIC NODES INTERNAL INTERFACE
- /////////////////////////////////////////////////////////////////////////////////////////////////
- void RegisterNode(const NKikimrClient::TNodeRegistrationRequest& request, TNodeRegistrationResponseCallback callback);
-
- /////////////////////////////////////////////////////////////////////////////////////////////////
- // CMS INTERFACE
- /////////////////////////////////////////////////////////////////////////////////////////////////
- void CmsRequest(const NKikimrClient::TCmsRequest& request, TCmsResponseCallback callback);
-
- /////////////////////////////////////////////////////////////////////////////////////////////////
+ // DYNAMIC NODES INTERNAL INTERFACE
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ void RegisterNode(const NKikimrClient::TNodeRegistrationRequest& request, TNodeRegistrationResponseCallback callback);
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ // CMS INTERFACE
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ void CmsRequest(const NKikimrClient::TCmsRequest& request, TCmsResponseCallback callback);
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////
// SQS INTERFACE
/////////////////////////////////////////////////////////////////////////////////////////////////
void SqsRequest(const NKikimrClient::TSqsRequest& request, TSqsResponseCallback callback);
@@ -96,11 +96,11 @@ namespace NKikimr {
void S3Listing(const NKikimrClient::TS3ListingRequest& request, TS3ListingResponseCallback callback);
/////////////////////////////////////////////////////////////////////////////////////////////////
- // CONSOLE INTERFACE
- /////////////////////////////////////////////////////////////////////////////////////////////////
- void ConsoleRequest(const NKikimrClient::TConsoleRequest& request, TConsoleResponseCallback callback);
-
- /////////////////////////////////////////////////////////////////////////////////////////////////
+ // CONSOLE INTERFACE
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ void ConsoleRequest(const NKikimrClient::TConsoleRequest& request, TConsoleResponseCallback callback);
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////
// INTROSPECTION
/////////////////////////////////////////////////////////////////////////////////////////////////
void LocalMKQL(const NKikimrClient::TLocalMKQL& request, TResponseCallback callback);
diff --git a/ydb/public/lib/deprecated/kicli/configurator.cpp b/ydb/public/lib/deprecated/kicli/configurator.cpp
index f48f481d494..2b3c28cf3fc 100644
--- a/ydb/public/lib/deprecated/kicli/configurator.cpp
+++ b/ydb/public/lib/deprecated/kicli/configurator.cpp
@@ -1,54 +1,54 @@
-#include "kicli.h"
-
+#include "kicli.h"
+
#include <ydb/public/lib/deprecated/client/msgbus_client.h>
-
-namespace NKikimr {
-namespace NClient {
-
-TConfigurationResult::TConfigurationResult(const TResult& result)
- : TResult(result)
-{
-}
-
-const NKikimrClient::TConsoleResponse& TConfigurationResult::Record() const
-{
- return GetResponse<NMsgBusProxy::TBusConsoleResponse>().Record;
-}
-
-bool TConfigurationResult::IsSuccess() const
-{
- return (GetError().Success()
- && Record().GetStatus().GetCode() == Ydb::StatusIds::SUCCESS);
-}
-
-TString TConfigurationResult::GetErrorMessage() const
-{
- if (!GetError().Success())
- return GetError().GetMessage();
- return Record().GetStatus().GetReason();
-}
-
-const NKikimrConfig::TAppConfig &TConfigurationResult::GetConfig() const
-{
- return Record().GetGetNodeConfigResponse().GetConfig();
-}
-
-TNodeConfigurator::TNodeConfigurator(TKikimr& kikimr)
- : Kikimr(&kikimr)
-{
-}
-
-TConfigurationResult TNodeConfigurator::SyncGetNodeConfig(ui32 nodeId,
- const TString &host,
- const TString &tenant,
- const TString &nodeType,
+
+namespace NKikimr {
+namespace NClient {
+
+TConfigurationResult::TConfigurationResult(const TResult& result)
+ : TResult(result)
+{
+}
+
+const NKikimrClient::TConsoleResponse& TConfigurationResult::Record() const
+{
+ return GetResponse<NMsgBusProxy::TBusConsoleResponse>().Record;
+}
+
+bool TConfigurationResult::IsSuccess() const
+{
+ return (GetError().Success()
+ && Record().GetStatus().GetCode() == Ydb::StatusIds::SUCCESS);
+}
+
+TString TConfigurationResult::GetErrorMessage() const
+{
+ if (!GetError().Success())
+ return GetError().GetMessage();
+ return Record().GetStatus().GetReason();
+}
+
+const NKikimrConfig::TAppConfig &TConfigurationResult::GetConfig() const
+{
+ return Record().GetGetNodeConfigResponse().GetConfig();
+}
+
+TNodeConfigurator::TNodeConfigurator(TKikimr& kikimr)
+ : Kikimr(&kikimr)
+{
+}
+
+TConfigurationResult TNodeConfigurator::SyncGetNodeConfig(ui32 nodeId,
+ const TString &host,
+ const TString &tenant,
+ const TString &nodeType,
const TString& domain,
const TString& token) const
-{
+{
auto future = Kikimr->GetNodeConfig(nodeId, host, tenant, nodeType, domain, token);
- auto result = future.GetValue(TDuration::Max());
- return TConfigurationResult(result);
-}
-
-} // NClient
-} // NKikimr
+ auto result = future.GetValue(TDuration::Max());
+ return TConfigurationResult(result);
+}
+
+} // NClient
+} // NKikimr
diff --git a/ydb/public/lib/deprecated/kicli/cpp_ut.cpp b/ydb/public/lib/deprecated/kicli/cpp_ut.cpp
index 869dbf57ec8..cb7dc3ed6d9 100644
--- a/ydb/public/lib/deprecated/kicli/cpp_ut.cpp
+++ b/ydb/public/lib/deprecated/kicli/cpp_ut.cpp
@@ -30,8 +30,8 @@ Tests::TServer StartupKikimr(NMsgBusProxy::TMsgBusClientConfig& clientConfig,
}
Tests::TServer StartupKikimr(NGRpcProxy::TGRpcClientConfig& clientConfig,
- const TAutoPtr<TLogBackend> logBackend = {},
- const NKikimrConfig::TAppConfig &config = {})
+ const TAutoPtr<TLogBackend> logBackend = {},
+ const NKikimrConfig::TAppConfig &config = {})
{
TPortManager pm;
const ui32 msgbusPort = pm.GetPort(12001);
@@ -39,7 +39,7 @@ Tests::TServer StartupKikimr(NGRpcProxy::TGRpcClientConfig& clientConfig,
auto settings = Tests::TServerSettings(msgbusPort);
settings.SetLogBackend(logBackend);
- settings.AppConfig.CopyFrom(config);
+ settings.AppConfig.CopyFrom(config);
settings.SetEnableSystemViews(false);
settings.SetEnableMvcc(false);
@@ -2138,37 +2138,37 @@ Y_UNIT_TEST_SUITE(ClientLib) {
}
NKikimrTxUserProxy::TKeyRange MakeRange(const TVector<TString> from, const TVector<TString> to,
- bool fromInclusive, bool toInclusive)
-{
- NKikimrTxUserProxy::TKeyRange range;
- if (!from.empty()) {
- range.MutableFrom()->MutableType()->SetKind(NKikimrMiniKQL::Tuple);
- auto &tuple = *range.MutableFrom()->MutableType()->MutableTuple();
- for (auto &s : from) {
- if (s)
+ bool fromInclusive, bool toInclusive)
+{
+ NKikimrTxUserProxy::TKeyRange range;
+ if (!from.empty()) {
+ range.MutableFrom()->MutableType()->SetKind(NKikimrMiniKQL::Tuple);
+ auto &tuple = *range.MutableFrom()->MutableType()->MutableTuple();
+ for (auto &s : from) {
+ if (s)
range.MutableFrom()->MutableValue()->AddTuple()->MutableOptional()->SetText(s);
- auto &elem = *tuple.AddElement();
+ auto &elem = *tuple.AddElement();
elem.SetKind(NKikimrMiniKQL::Optional);
auto &item = *elem.MutableOptional()->MutableItem();
item.SetKind(NKikimrMiniKQL::Data);
item.MutableData()->SetScheme(NUdf::TDataType<NUdf::TUtf8>::Id);
- }
- }
- if (!to.empty()) {
- range.MutableTo()->MutableType()->SetKind(NKikimrMiniKQL::Tuple);
- auto &tuple = *range.MutableTo()->MutableType()->MutableTuple();
- for (auto &s : to) {
- if (s)
+ }
+ }
+ if (!to.empty()) {
+ range.MutableTo()->MutableType()->SetKind(NKikimrMiniKQL::Tuple);
+ auto &tuple = *range.MutableTo()->MutableType()->MutableTuple();
+ for (auto &s : to) {
+ if (s)
range.MutableTo()->MutableValue()->AddTuple()->MutableOptional()->SetText(s);
- auto &elem = *tuple.AddElement();
+ auto &elem = *tuple.AddElement();
elem.SetKind(NKikimrMiniKQL::Optional);
auto &item = *elem.MutableOptional()->MutableItem();
item.SetKind(NKikimrMiniKQL::Data);
item.MutableData()->SetScheme(NUdf::TDataType<NUdf::TUtf8>::Id);
- }
- }
- range.SetFromInclusive(fromInclusive);
- range.SetToInclusive(toInclusive);
-
- return range;
-}
+ }
+ }
+ range.SetFromInclusive(fromInclusive);
+ range.SetToInclusive(toInclusive);
+
+ return range;
+}
diff --git a/ydb/public/lib/deprecated/kicli/dynamic_node.cpp b/ydb/public/lib/deprecated/kicli/dynamic_node.cpp
index 4f51118f14e..f5095a622c4 100644
--- a/ydb/public/lib/deprecated/kicli/dynamic_node.cpp
+++ b/ydb/public/lib/deprecated/kicli/dynamic_node.cpp
@@ -1,38 +1,38 @@
-#include "kicli.h"
-
+#include "kicli.h"
+
#include <ydb/public/lib/deprecated/client/msgbus_client.h>
-
-namespace NKikimr {
-namespace NClient {
-
-TRegistrationResult::TRegistrationResult(const TResult& result)
- : TResult(result)
-{
-}
-
-const NKikimrClient::TNodeRegistrationResponse& TRegistrationResult::Record() const
-{
- return GetResponse<NMsgBusProxy::TBusNodeRegistrationResponse>().Record;
-}
-
-bool TRegistrationResult::IsSuccess() const
-{
- return (GetError().Success()
- && Record().GetStatus().GetCode() == NKikimrNodeBroker::TStatus::OK);
-}
-
-TString TRegistrationResult::GetErrorMessage() const
-{
- if (!GetError().Success())
- return GetError().GetMessage();
- return Record().GetStatus().GetReason();
-}
-
-ui32 TRegistrationResult::GetNodeId() const
-{
- return Record().GetNodeId();
-}
-
+
+namespace NKikimr {
+namespace NClient {
+
+TRegistrationResult::TRegistrationResult(const TResult& result)
+ : TResult(result)
+{
+}
+
+const NKikimrClient::TNodeRegistrationResponse& TRegistrationResult::Record() const
+{
+ return GetResponse<NMsgBusProxy::TBusNodeRegistrationResponse>().Record;
+}
+
+bool TRegistrationResult::IsSuccess() const
+{
+ return (GetError().Success()
+ && Record().GetStatus().GetCode() == NKikimrNodeBroker::TStatus::OK);
+}
+
+TString TRegistrationResult::GetErrorMessage() const
+{
+ if (!GetError().Success())
+ return GetError().GetMessage();
+ return Record().GetStatus().GetReason();
+}
+
+ui32 TRegistrationResult::GetNodeId() const
+{
+ return Record().GetNodeId();
+}
+
NActors::TScopeId TRegistrationResult::GetScopeId() const
{
const auto& record = Record();
@@ -42,25 +42,25 @@ NActors::TScopeId TRegistrationResult::GetScopeId() const
return {};
}
-TNodeRegistrant::TNodeRegistrant(TKikimr& kikimr)
- : Kikimr(&kikimr)
-{
-}
-
-TRegistrationResult
-TNodeRegistrant::SyncRegisterNode(const TString& domainPath,
- const TString& host,
- ui16 port,
- const TString& address,
- const TString& resolveHost,
+TNodeRegistrant::TNodeRegistrant(TKikimr& kikimr)
+ : Kikimr(&kikimr)
+{
+}
+
+TRegistrationResult
+TNodeRegistrant::SyncRegisterNode(const TString& domainPath,
+ const TString& host,
+ ui16 port,
+ const TString& address,
+ const TString& resolveHost,
const NActors::TNodeLocation& location,
bool fixedNodeId,
TMaybe<TString> path) const
-{
+{
auto future = Kikimr->RegisterNode(domainPath, host, port, address, resolveHost, location, fixedNodeId, path);
- auto result = future.GetValue(TDuration::Max());
- return TRegistrationResult(result);
-}
-
-} // NClient
-} // NKikimr
+ auto result = future.GetValue(TDuration::Max());
+ return TRegistrationResult(result);
+}
+
+} // NClient
+} // NKikimr
diff --git a/ydb/public/lib/deprecated/kicli/error.cpp b/ydb/public/lib/deprecated/kicli/error.cpp
index 0a951cd5ee1..473a981f607 100644
--- a/ydb/public/lib/deprecated/kicli/error.cpp
+++ b/ydb/public/lib/deprecated/kicli/error.cpp
@@ -40,7 +40,7 @@ bool TError::Success() const {
case NTxProxy::TResultStatus::EStatus::ExecComplete:
case NTxProxy::TResultStatus::EStatus::ExecAlready:
case NTxProxy::TResultStatus::EStatus::ExecInProgress:
- case NTxProxy::TResultStatus::EStatus::ExecResponseData:
+ case NTxProxy::TResultStatus::EStatus::ExecResponseData:
return true;
default:
break;
diff --git a/ydb/public/lib/deprecated/kicli/kicli.h b/ydb/public/lib/deprecated/kicli/kicli.h
index 7c6bb4ff626..9dc472d2314 100644
--- a/ydb/public/lib/deprecated/kicli/kicli.h
+++ b/ydb/public/lib/deprecated/kicli/kicli.h
@@ -372,33 +372,33 @@ protected:
TQueryResult(const TResult& result);
};
-class TReadTableResult : public TResult {
- friend class TTableStream;
-public:
- TReadTableResult(TReadTableResult&&) = default;
- TReadTableResult(const TReadTableResult&) = default;
- TReadTableResult& operator=(TReadTableResult&&) = default;
- TReadTableResult& operator=(const TReadTableResult&) = default;
-
+class TReadTableResult : public TResult {
+ friend class TTableStream;
+public:
+ TReadTableResult(TReadTableResult&&) = default;
+ TReadTableResult(const TReadTableResult&) = default;
+ TReadTableResult& operator=(TReadTableResult&&) = default;
+ TReadTableResult& operator=(const TReadTableResult&) = default;
+
const YdbOld::ResultSet &GetResultSet() const;
-
- template<typename TFormat>
- TString GetTypeText(const TFormat &format) const;
- template<typename TFormat>
- TString GetValueText(const TFormat &format) const;
-
-protected:
- TReadTableResult(const TResult& result);
-
- template<typename TFormat>
+
+ template<typename TFormat>
+ TString GetTypeText(const TFormat &format) const;
+ template<typename TFormat>
+ TString GetValueText(const TFormat &format) const;
+
+protected:
+ TReadTableResult(const TResult& result);
+
+ template<typename TFormat>
static TString ValueToString(const YdbOld::Value &value, const YdbOld::DataType &type);
- template<typename TFormat>
+ template<typename TFormat>
static TString ValueToString(const YdbOld::Value &value, const YdbOld::Type &type);
-
+
mutable YdbOld::ResultSet Result;
- mutable bool Parsed = false;
-};
-
+ mutable bool Parsed = false;
+};
+
class TPrepareResult : public TResult {
friend class TKikimr;
friend class TTextQuery;
@@ -616,93 +616,93 @@ protected:
EPathType PathType;
};
-class TRegistrationResult : public TResult {
- friend class TNodeRegistrant;
-public:
- TRegistrationResult(const TRegistrationResult& other) = default;
- TRegistrationResult(TRegistrationResult&& other) = default;
- TRegistrationResult& operator=(const TRegistrationResult& other) = default;
- TRegistrationResult& operator=(TRegistrationResult&& other) = default;
-
- bool IsSuccess() const;
- TString GetErrorMessage() const;
-
- ui32 GetNodeId() const;
+class TRegistrationResult : public TResult {
+ friend class TNodeRegistrant;
+public:
+ TRegistrationResult(const TRegistrationResult& other) = default;
+ TRegistrationResult(TRegistrationResult&& other) = default;
+ TRegistrationResult& operator=(const TRegistrationResult& other) = default;
+ TRegistrationResult& operator=(TRegistrationResult&& other) = default;
+
+ bool IsSuccess() const;
+ TString GetErrorMessage() const;
+
+ ui32 GetNodeId() const;
NActors::TScopeId GetScopeId() const;
-
- const NKikimrClient::TNodeRegistrationResponse& Record() const;
-
-private:
- TRegistrationResult(const TResult& result);
-};
-
-class TNodeRegistrant {
- friend class TKikimr;
-public:
- TRegistrationResult SyncRegisterNode(const TString& domainPath, const TString& host, ui16 port,
- const TString& address, const TString& resolveHost,
+
+ const NKikimrClient::TNodeRegistrationResponse& Record() const;
+
+private:
+ TRegistrationResult(const TResult& result);
+};
+
+class TNodeRegistrant {
+ friend class TKikimr;
+public:
+ TRegistrationResult SyncRegisterNode(const TString& domainPath, const TString& host, ui16 port,
+ const TString& address, const TString& resolveHost,
const NActors::TNodeLocation& location,
bool fixedNodeId = false, TMaybe<TString> path = {}) const;
-
-private:
- TNodeRegistrant(TKikimr& kikimr);
-
-private:
- TKikimr* Kikimr;
-};
-
-class TTableStream {
- friend class TKikimr;
-public:
- NThreading::TFuture<TResult> AsyncRead(const TString &path, bool ordered,
- std::function<void(NClient::TReadTableResult)> processPart,
+
+private:
+ TNodeRegistrant(TKikimr& kikimr);
+
+private:
+ TKikimr* Kikimr;
+};
+
+class TTableStream {
+ friend class TKikimr;
+public:
+ NThreading::TFuture<TResult> AsyncRead(const TString &path, bool ordered,
+ std::function<void(NClient::TReadTableResult)> processPart,
const TVector<TString> &columns = TVector<TString>(),
- const NKikimrTxUserProxy::TKeyRange &range = NKikimrTxUserProxy::TKeyRange(),
- ui64 limit = 0);
-
-private:
- TTableStream(TKikimr& kikimr);
-
-private:
- TKikimr* Kikimr;
-};
-
-class TConfigurationResult : public TResult {
- friend class TNodeConfigurator;
-public:
- TConfigurationResult(const TConfigurationResult& other) = default;
- TConfigurationResult(TConfigurationResult&& other) = default;
- TConfigurationResult& operator=(const TConfigurationResult& other) = default;
- TConfigurationResult& operator=(TConfigurationResult&& other) = default;
-
- bool IsSuccess() const;
- TString GetErrorMessage() const;
-
- const NKikimrConfig::TAppConfig &GetConfig() const;
-
- const NKikimrClient::TConsoleResponse &Record() const;
-
-private:
- TConfigurationResult(const TResult& result);
-};
-
-class TNodeConfigurator {
- friend class TKikimr;
-public:
- TConfigurationResult SyncGetNodeConfig(ui32 nodeId,
- const TString &host,
- const TString &tenant,
- const TString &nodeType,
+ const NKikimrTxUserProxy::TKeyRange &range = NKikimrTxUserProxy::TKeyRange(),
+ ui64 limit = 0);
+
+private:
+ TTableStream(TKikimr& kikimr);
+
+private:
+ TKikimr* Kikimr;
+};
+
+class TConfigurationResult : public TResult {
+ friend class TNodeConfigurator;
+public:
+ TConfigurationResult(const TConfigurationResult& other) = default;
+ TConfigurationResult(TConfigurationResult&& other) = default;
+ TConfigurationResult& operator=(const TConfigurationResult& other) = default;
+ TConfigurationResult& operator=(TConfigurationResult&& other) = default;
+
+ bool IsSuccess() const;
+ TString GetErrorMessage() const;
+
+ const NKikimrConfig::TAppConfig &GetConfig() const;
+
+ const NKikimrClient::TConsoleResponse &Record() const;
+
+private:
+ TConfigurationResult(const TResult& result);
+};
+
+class TNodeConfigurator {
+ friend class TKikimr;
+public:
+ TConfigurationResult SyncGetNodeConfig(ui32 nodeId,
+ const TString &host,
+ const TString &tenant,
+ const TString &nodeType,
const TString& domain = "",
const TString& token = "") const;
-
-private:
- TNodeConfigurator(TKikimr& kikimr);
-
-private:
- TKikimr* Kikimr;
-};
-
+
+private:
+ TNodeConfigurator(TKikimr& kikimr);
+
+private:
+ TKikimr* Kikimr;
+};
+
struct TRetryPolicy {
ui32 RetryLimitCount;
TDuration MinRetryTime;
@@ -739,8 +739,8 @@ class TKikimr {
friend class TTextQuery;
friend class TPreparedQuery;
friend class TSchemaObject;
- friend class TNodeRegistrant;
- friend class TNodeConfigurator;
+ friend class TNodeRegistrant;
+ friend class TNodeConfigurator;
class TImpl;
class TMsgBusImpl;
class TGRpcImpl;
@@ -764,9 +764,9 @@ public:
void SetSecurityToken(const TString& securityToken);
TString GetCurrentLocation() const;
- TNodeRegistrant GetNodeRegistrant();
- TNodeConfigurator GetNodeConfigurator();
-
+ TNodeRegistrant GetNodeRegistrant();
+ TNodeConfigurator GetNodeConfigurator();
+
// execute arbitrary message bus request
template <typename RecordType, int MessageType>
NThreading::TFuture<TResult> ExecuteRequest(NBus::TBusBufferMessage<RecordType, MessageType>* request) {
@@ -790,14 +790,14 @@ protected:
NThreading::TFuture<TResult> CreateTable(TSchemaObject& object, const TString& name, const TVector<TColumn>& columns,
const TTablePartitionConfig* partitionConfig);
NBus::EMessageStatus ExecuteRequestInternal(NThreading::TPromise<TResult> promise, TAutoPtr<NBus::TBusMessage> request);
- NThreading::TFuture<TResult> RegisterNode(const TString& domainPath, const TString& host, ui16 port,
- const TString& address, const TString& resolveHost,
+ NThreading::TFuture<TResult> RegisterNode(const TString& domainPath, const TString& host, ui16 port,
+ const TString& address, const TString& resolveHost,
const NActors::TNodeLocation& location,
bool fixedNodeId, TMaybe<TString> path);
- NThreading::TFuture<TResult> GetNodeConfig(ui32 nodeId,
- const TString &host,
- const TString &tenant,
- const TString &nodeType,
+ NThreading::TFuture<TResult> GetNodeConfig(ui32 nodeId,
+ const TString &host,
+ const TString &tenant,
+ const TString &nodeType,
const TString& domain,
const TString& token = TString());
@@ -826,24 +826,24 @@ protected:
}
}
- void PrepareRequest(NKikimrClient::TCmsRequest& request) const {
- if (!SecurityToken.empty()) {
- request.SetSecurityToken(SecurityToken);
- }
- }
-
- void PrepareRequest(NKikimrClient::TConsoleRequest& request) const {
- if (!SecurityToken.empty()) {
- request.SetSecurityToken(SecurityToken);
- }
- }
-
- void PrepareRequest(NKikimrClient::TSchemeDescribe& request) const {
- if (!SecurityToken.empty()) {
- request.SetSecurityToken(SecurityToken);
- }
- }
-
+ void PrepareRequest(NKikimrClient::TCmsRequest& request) const {
+ if (!SecurityToken.empty()) {
+ request.SetSecurityToken(SecurityToken);
+ }
+ }
+
+ void PrepareRequest(NKikimrClient::TConsoleRequest& request) const {
+ if (!SecurityToken.empty()) {
+ request.SetSecurityToken(SecurityToken);
+ }
+ }
+
+ void PrepareRequest(NKikimrClient::TSchemeDescribe& request) const {
+ if (!SecurityToken.empty()) {
+ request.SetSecurityToken(SecurityToken);
+ }
+ }
+
void PrepareRequest(NKikimrClient::TSchemeOperation& request) const {
if (!SecurityToken.empty()) {
request.SetSecurityToken(SecurityToken);
diff --git a/ydb/public/lib/deprecated/kicli/kikimr.cpp b/ydb/public/lib/deprecated/kicli/kikimr.cpp
index b0c5e847ee8..4156d72d4b3 100644
--- a/ydb/public/lib/deprecated/kicli/kikimr.cpp
+++ b/ydb/public/lib/deprecated/kicli/kikimr.cpp
@@ -281,8 +281,8 @@ public:
return ExecuteGRpcRequest<NMsgBusProxy::TBusS3ListingRequest, NMsgBusProxy::TBusS3ListingResponse>(&NGRpcProxy::TGRpcClient::S3Listing, promise, request);
case NMsgBusProxy::MTYPE_CLIENT_INTERCONNECT_DEBUG:
return ExecuteGRpcRequest<NMsgBusProxy::TBusInterconnectDebug>(&NGRpcProxy::TGRpcClient::InterconnectDebug, promise, request);
- case NMsgBusProxy::MTYPE_CLIENT_CONSOLE_REQUEST:
- return ExecuteGRpcRequest<NMsgBusProxy::TBusConsoleRequest, NMsgBusProxy::TBusConsoleResponse>(&NGRpcProxy::TGRpcClient::ConsoleRequest, promise, request);
+ case NMsgBusProxy::MTYPE_CLIENT_CONSOLE_REQUEST:
+ return ExecuteGRpcRequest<NMsgBusProxy::TBusConsoleRequest, NMsgBusProxy::TBusConsoleResponse>(&NGRpcProxy::TGRpcClient::ConsoleRequest, promise, request);
case NMsgBusProxy::MTYPE_CLIENT_WHOAMI:
return ExecuteGRpcRequest<NMsgBusProxy::TBusWhoAmI, NMsgBusProxy::TBusResponse>(&NGRpcProxy::TGRpcClient::WhoAmI, promise, request);
case NMsgBusProxy::MTYPE_CLIENT_RESOLVE_NODE:
@@ -564,56 +564,56 @@ TKikimr::TKikimr(TKikimr&& kikimr)
, Impl(std::move(kikimr.Impl))
{}
-TNodeRegistrant TKikimr::GetNodeRegistrant()
-{
- return TNodeRegistrant(*this);
+TNodeRegistrant TKikimr::GetNodeRegistrant()
+{
+ return TNodeRegistrant(*this);
+}
+
+TNodeConfigurator TKikimr::GetNodeConfigurator()
+{
+ return TNodeConfigurator(*this);
}
-
-TNodeConfigurator TKikimr::GetNodeConfigurator()
-{
- return TNodeConfigurator(*this);
-}
-
-NThreading::TFuture<TResult> TKikimr::RegisterNode(const TString& domainPath, const TString& host, ui16 port,
- const TString& address, const TString& resolveHost,
+
+NThreading::TFuture<TResult> TKikimr::RegisterNode(const TString& domainPath, const TString& host, ui16 port,
+ const TString& address, const TString& resolveHost,
const NActors::TNodeLocation& location,
bool fixedNodeId, TMaybe<TString> path)
-{
- TAutoPtr<NMsgBusProxy::TBusNodeRegistrationRequest> request = new NMsgBusProxy::TBusNodeRegistrationRequest;
- request->Record.SetHost(host);
- request->Record.SetPort(port);
- request->Record.SetAddress(address);
- request->Record.SetResolveHost(resolveHost);
+{
+ TAutoPtr<NMsgBusProxy::TBusNodeRegistrationRequest> request = new NMsgBusProxy::TBusNodeRegistrationRequest;
+ request->Record.SetHost(host);
+ request->Record.SetPort(port);
+ request->Record.SetAddress(address);
+ request->Record.SetResolveHost(resolveHost);
location.Serialize(request->Record.MutableLocation());
location.GetLegacyValue().Serialize(request->Record.MutableLocation());
- request->Record.SetDomainPath(domainPath);
- request->Record.SetFixedNodeId(fixedNodeId);
+ request->Record.SetDomainPath(domainPath);
+ request->Record.SetFixedNodeId(fixedNodeId);
if (path) {
request->Record.SetPath(*path);
}
- return ExecuteRequest(request.Release());
+ return ExecuteRequest(request.Release());
}
-
-NThreading::TFuture<TResult> TKikimr::GetNodeConfig(ui32 nodeId,
- const TString &host,
- const TString &tenant,
- const TString &nodeType,
+
+NThreading::TFuture<TResult> TKikimr::GetNodeConfig(ui32 nodeId,
+ const TString &host,
+ const TString &tenant,
+ const TString &nodeType,
const TString& domain,
const TString& token)
-{
- TAutoPtr<NMsgBusProxy::TBusConsoleRequest> request = new NMsgBusProxy::TBusConsoleRequest;
- auto &node = *request->Record.MutableGetNodeConfigRequest()->MutableNode();
- node.SetNodeId(nodeId);
- node.SetHost(host);
- node.SetTenant(tenant);
- node.SetNodeType(nodeType);
- if (domain)
- request->Record.SetDomainName(domain);
+{
+ TAutoPtr<NMsgBusProxy::TBusConsoleRequest> request = new NMsgBusProxy::TBusConsoleRequest;
+ auto &node = *request->Record.MutableGetNodeConfigRequest()->MutableNode();
+ node.SetNodeId(nodeId);
+ node.SetHost(host);
+ node.SetTenant(tenant);
+ node.SetNodeType(nodeType);
+ if (domain)
+ request->Record.SetDomainName(domain);
if (token)
request->Record.SetSecurityToken(token);
- return ExecuteRequest(request.Release());
-}
-
-
-}
-}
+ return ExecuteRequest(request.Release());
+}
+
+
+}
+}
diff --git a/ydb/public/lib/deprecated/kicli/result.cpp b/ydb/public/lib/deprecated/kicli/result.cpp
index 261ba314c70..0f86ba4340a 100644
--- a/ydb/public/lib/deprecated/kicli/result.cpp
+++ b/ydb/public/lib/deprecated/kicli/result.cpp
@@ -3,8 +3,8 @@
#include <ydb/public/lib/deprecated/client/msgbus_client.h>
#include <ydb/library/yql/public/decimal/yql_decimal.h>
-#include <util/generic/ymath.h>
-
+#include <util/generic/ymath.h>
+
namespace NKikimr {
namespace NClient {
@@ -86,198 +86,198 @@ TValue TQueryResult::GetValue() const {
return TValue::Create(result.GetValue(), result.GetType());
}
-TReadTableResult::TReadTableResult(const TResult& result)
- : TResult(result)
-{}
-
+TReadTableResult::TReadTableResult(const TResult& result)
+ : TResult(result)
+{}
+
const YdbOld::ResultSet &TReadTableResult::GetResultSet() const {
- if (!Parsed) {
- const NKikimrClient::TResponse& response = GetResult<NKikimrClient::TResponse>();
- const auto& result = response.GetSerializedReadTableResponse();
+ if (!Parsed) {
+ const NKikimrClient::TResponse& response = GetResult<NKikimrClient::TResponse>();
+ const auto& result = response.GetSerializedReadTableResponse();
Y_PROTOBUF_SUPPRESS_NODISCARD Result.ParseFromArray(result.data(), result.size());
- }
- return Result;
-}
-
+ }
+ return Result;
+}
+
template <> TString TReadTableResult::ValueToString<TFormatCSV>(const YdbOld::Value &value,
const YdbOld::DataType &type) {
switch (type.id()) {
- case NYql::NProto::Bool:
+ case NYql::NProto::Bool:
return value.bool_value() ? "true" : "false";
- case NYql::NProto::Uint64:
+ case NYql::NProto::Uint64:
return ToString(value.uint64_value());
- case NScheme::NTypeIds::Int64:
+ case NScheme::NTypeIds::Int64:
return ToString(value.int64_value());
- case NScheme::NTypeIds::Uint32:
+ case NScheme::NTypeIds::Uint32:
return ToString(value.uint32_value());
- case NScheme::NTypeIds::Int32:
+ case NScheme::NTypeIds::Int32:
return ToString(value.int32_value());
- case NScheme::NTypeIds::Uint16:
+ case NScheme::NTypeIds::Uint16:
return ToString(static_cast<ui16>(value.uint32_value()));
- case NScheme::NTypeIds::Int16:
+ case NScheme::NTypeIds::Int16:
return ToString(static_cast<i16>(value.int32_value()));
- case NScheme::NTypeIds::Uint8:
+ case NScheme::NTypeIds::Uint8:
return ToString(static_cast<ui8>(value.uint32_value()));
- case NScheme::NTypeIds::Int8:
+ case NScheme::NTypeIds::Int8:
return ToString(static_cast<i8>(value.int32_value()));
- case NScheme::NTypeIds::Double:
+ case NScheme::NTypeIds::Double:
return ToString(value.double_value());
- case NScheme::NTypeIds::Float:
+ case NScheme::NTypeIds::Float:
return ToString(value.float_value());
- case NScheme::NTypeIds::Utf8:
- case NScheme::NTypeIds::Json:
- case NScheme::NTypeIds::Yson:
+ case NScheme::NTypeIds::Utf8:
+ case NScheme::NTypeIds::Json:
+ case NScheme::NTypeIds::Yson:
return "\"" + TFormatCSV::EscapeString(value.text_value()) + "\"";
- case NScheme::NTypeIds::String:
+ case NScheme::NTypeIds::String:
return value.bytes_value();
- case NScheme::NTypeIds::Date:
- {
- auto val = TInstant::Days(value.uint32_value());
- return val.FormatGmTime("%Y-%m-%d");
- }
- case NScheme::NTypeIds::Datetime:
- {
- auto val = TInstant::Seconds(value.uint32_value());
- return val.FormatGmTime("%Y-%m-%dT%H:%M:%SZ");
- }
- case NScheme::NTypeIds::Timestamp:
- {
- auto val = TInstant::MicroSeconds(value.uint64_value());
- return val.ToString();
- }
- case NScheme::NTypeIds::Interval:
- {
- i64 val = value.int64_value();
- if (val >= 0)
- return TDuration::MicroSeconds(static_cast<ui64>(val)).ToString();
- return TString("-") + TDuration::MicroSeconds(static_cast<ui64>(-val)).ToString();
- }
- case NScheme::NTypeIds::Decimal:
- {
+ case NScheme::NTypeIds::Date:
+ {
+ auto val = TInstant::Days(value.uint32_value());
+ return val.FormatGmTime("%Y-%m-%d");
+ }
+ case NScheme::NTypeIds::Datetime:
+ {
+ auto val = TInstant::Seconds(value.uint32_value());
+ return val.FormatGmTime("%Y-%m-%dT%H:%M:%SZ");
+ }
+ case NScheme::NTypeIds::Timestamp:
+ {
+ auto val = TInstant::MicroSeconds(value.uint64_value());
+ return val.ToString();
+ }
+ case NScheme::NTypeIds::Interval:
+ {
+ i64 val = value.int64_value();
+ if (val >= 0)
+ return TDuration::MicroSeconds(static_cast<ui64>(val)).ToString();
+ return TString("-") + TDuration::MicroSeconds(static_cast<ui64>(-val)).ToString();
+ }
+ case NScheme::NTypeIds::Decimal:
+ {
NYql::NDecimal::TInt128 val;
- auto p = reinterpret_cast<char*>(&val);
- reinterpret_cast<ui64*>(p)[0] = value.low_128();
+ auto p = reinterpret_cast<char*>(&val);
+ reinterpret_cast<ui64*>(p)[0] = value.low_128();
reinterpret_cast<ui64*>(p)[1] = value.high_128();
- // In Kikimr the only decimal column type supported is Decimal(22,9).
- return NYql::NDecimal::ToString(val, NScheme::DECIMAL_PRECISION, NScheme::DECIMAL_SCALE);
- }
- default:
- return "<UNSUPPORTED VALUE>";
- }
-}
-
+ // In Kikimr the only decimal column type supported is Decimal(22,9).
+ return NYql::NDecimal::ToString(val, NScheme::DECIMAL_PRECISION, NScheme::DECIMAL_SCALE);
+ }
+ default:
+ return "<UNSUPPORTED VALUE>";
+ }
+}
+
template <> TString TReadTableResult::ValueToString<TFormatCSV>(const YdbOld::Value &value,
const YdbOld::Type &type) {
- switch (type.type_type_case()) {
+ switch (type.type_type_case()) {
case YdbOld::Type::kDataType:
return ValueToString<TFormatCSV>(value, type.data_type());
case YdbOld::Type::kOptionalType:
if (value.Hasnull_flag_value())
- return "NULL";
- // If we have Value field for optional type then it is always
- // should be followed (even for Optional<Variant<T>> case).
+ return "NULL";
+ // If we have Value field for optional type then it is always
+ // should be followed (even for Optional<Variant<T>> case).
if (value.Hasnested_value())
return ValueToString<TFormatCSV>(value.nested_value(), type.optional_type().item());
return ValueToString<TFormatCSV>(value, type.optional_type().item());
case YdbOld::Type::kListType:
- {
- TString res = "[";
+ {
+ TString res = "[";
const auto &items = value.items();
const auto &itemType = type.list_type().item();
- for (auto it = items.begin(); it != items.end(); ++it) {
- if (it != items.begin())
- res += ",";
- res += ValueToString<TFormatCSV>(*it, itemType);
- }
- res += "]";
- return res;
- }
+ for (auto it = items.begin(); it != items.end(); ++it) {
+ if (it != items.begin())
+ res += ",";
+ res += ValueToString<TFormatCSV>(*it, itemType);
+ }
+ res += "]";
+ return res;
+ }
case YdbOld::Type::kTupleType:
- {
- TString res = "[";
+ {
+ TString res = "[";
const auto &items = value.items();
const auto &types = type.tuple_type().elements();
- for (int i = 0; i < items.size(); ++i) {
- if (i)
- res += ",";
- res += ValueToString<TFormatCSV>(items[i], types[i]);
- }
- res += "]";
- return res;
- }
+ for (int i = 0; i < items.size(); ++i) {
+ if (i)
+ res += ",";
+ res += ValueToString<TFormatCSV>(items[i], types[i]);
+ }
+ res += "]";
+ return res;
+ }
case YdbOld::Type::kStructType:
- {
- TString res = "{";
+ {
+ TString res = "{";
const auto &items = value.items();
const auto &members = type.struct_type().members();
- for (int i = 0; i < members.size(); ++i) {
- if (i)
- res += ",";
+ for (int i = 0; i < members.size(); ++i) {
+ if (i)
+ res += ",";
res += ValueToString<TFormatCSV>(items[i], members[i].type());
- }
- res += "}";
- return res;
- }
+ }
+ res += "}";
+ return res;
+ }
case YdbOld::Type::kDictType:
- {
- TString res = "[";
+ {
+ TString res = "[";
const auto &pairs = value.pairs();
const auto &dictType = type.dict_type();
- for (int i = 0; i < pairs.size(); ++i) {
- if (i)
- res += ",";
+ for (int i = 0; i < pairs.size(); ++i) {
+ if (i)
+ res += ",";
res += ValueToString<TFormatCSV>(pairs[i].key(), dictType.key());
- res += ":";
+ res += ":";
res += ValueToString<TFormatCSV>(pairs[i].payload(), dictType.payload());
- }
- res += "]";
- return res;
- }
+ }
+ res += "]";
+ return res;
+ }
case YdbOld::Type::kVariantType:
- return "<VARIANT IS NOT SUPPORTED>";
- default:
- return "";
- }
-}
-
-template <> TString TReadTableResult::GetTypeText<TFormatCSV>(const TFormatCSV &format) const {
- auto &proto = GetResultSet();
- TString res;
- bool first = true;
+ return "<VARIANT IS NOT SUPPORTED>";
+ default:
+ return "";
+ }
+}
+
+template <> TString TReadTableResult::GetTypeText<TFormatCSV>(const TFormatCSV &format) const {
+ auto &proto = GetResultSet();
+ TString res;
+ bool first = true;
for (auto &meta : proto.column_meta()) {
- if (!first)
- res += format.Delim;
- first = false;
+ if (!first)
+ res += format.Delim;
+ first = false;
res += meta.name();
- }
- return res;
-}
-
-template <> TString TReadTableResult::GetValueText<TFormatCSV>(const TFormatCSV &format) const {
- auto &proto = GetResultSet();
- TString res;
-
- if (format.PrintHeader) {
- res += GetTypeText(format);
- res += "\n";
- }
-
+ }
+ return res;
+}
+
+template <> TString TReadTableResult::GetValueText<TFormatCSV>(const TFormatCSV &format) const {
+ auto &proto = GetResultSet();
+ TString res;
+
+ if (format.PrintHeader) {
+ res += GetTypeText(format);
+ res += "\n";
+ }
+
auto &colTypes = proto.column_meta();
- bool first = true;
+ bool first = true;
for (auto &row : proto.rows()) {
- if (!first)
- res += "\n";
- first = false;
- for (int i = 0; i < colTypes.size(); ++i) {
- if (i)
- res += format.Delim;
+ if (!first)
+ res += "\n";
+ first = false;
+ for (int i = 0; i < colTypes.size(); ++i) {
+ if (i)
+ res += format.Delim;
res += ValueToString<TFormatCSV>(row.items(i), colTypes[i].type());
- }
- }
-
- return res;
-}
-
+ }
+ }
+
+ return res;
+}
+
/// @warning It's mistake to store Query as a row pointer here. TQuery could be a tmp object.
/// TPrepareResult result = kikimr.Query(some).SyncPrepare();
/// TPreparedQuery query = result.GetQuery(); //< error here. Query is obsolete.
diff --git a/ydb/public/lib/deprecated/kicli/ya.make b/ydb/public/lib/deprecated/kicli/ya.make
index 991a96f5047..d9aa54bc4cd 100644
--- a/ydb/public/lib/deprecated/kicli/ya.make
+++ b/ydb/public/lib/deprecated/kicli/ya.make
@@ -9,9 +9,9 @@ OWNER(
)
SRCS(
- configurator.cpp
- dynamic_node.cpp
- error.cpp
+ configurator.cpp
+ dynamic_node.cpp
+ error.cpp
kicli.h
kikimr.cpp
query.cpp
diff --git a/ydb/public/lib/operation_id/operation_id.cpp b/ydb/public/lib/operation_id/operation_id.cpp
index 40d5319355f..725da690f41 100644
--- a/ydb/public/lib/operation_id/operation_id.cpp
+++ b/ydb/public/lib/operation_id/operation_id.cpp
@@ -31,8 +31,8 @@ TString ProtoToString(const Ydb::TOperationId& proto) {
res << "ydb://preparedqueryid";
break;
case Ydb::TOperationId::CMS_REQUEST:
- res << "ydb://cmsrequest";
- break;
+ res << "ydb://cmsrequest";
+ break;
case Ydb::TOperationId::EXPORT:
res << "ydb://export";
break;
diff --git a/ydb/public/lib/operation_id/protos/operation_id.proto b/ydb/public/lib/operation_id/protos/operation_id.proto
index c8430e3278b..b6534e794ba 100644
--- a/ydb/public/lib/operation_id/protos/operation_id.proto
+++ b/ydb/public/lib/operation_id/protos/operation_id.proto
@@ -9,7 +9,7 @@ message TOperationId {
OPERATION_DML = 2;
SESSION_YQL = 3;
PREPARED_QUERY_ID = 4;
- CMS_REQUEST = 5;
+ CMS_REQUEST = 5;
EXPORT = 6;
BUILD_INDEX = 7;
IMPORT = 8;
diff --git a/ydb/public/lib/scheme_types/scheme_type_id.h b/ydb/public/lib/scheme_types/scheme_type_id.h
index f122204f780..22fada2a7da 100644
--- a/ydb/public/lib/scheme_types/scheme_type_id.h
+++ b/ydb/public/lib/scheme_types/scheme_type_id.h
@@ -8,9 +8,9 @@
namespace NKikimr {
namespace NScheme {
-constexpr ui32 DECIMAL_PRECISION = 22;
-constexpr ui32 DECIMAL_SCALE = 9;
-
+constexpr ui32 DECIMAL_PRECISION = 22;
+constexpr ui32 DECIMAL_SCALE = 9;
+
using TTypeId = ui16;
namespace NTypeIds {
@@ -48,8 +48,8 @@ static constexpr TTypeId JsonDocument = NYql::NProto::JsonDocument;
static constexpr TTypeId DyNumber = NYql::NProto::DyNumber;
-static constexpr TTypeId Decimal = NYql::NProto::Decimal;
-
+static constexpr TTypeId Decimal = NYql::NProto::Decimal;
+
static constexpr TTypeId YqlIds[] = {
Int32,
Uint32,
@@ -62,11 +62,11 @@ static constexpr TTypeId YqlIds[] = {
String,
Utf8,
Yson,
- Json,
- Decimal,
- Date,
- Datetime,
- Timestamp,
+ Json,
+ Decimal,
+ Date,
+ Datetime,
+ Timestamp,
Interval,
JsonDocument,
DyNumber,
@@ -115,7 +115,7 @@ const char *TypeName(TTypeId typeId) {
case NTypeIds::Yson: return "Yson";
case NTypeIds::Json: return "Json";
case NTypeIds::JsonDocument: return "JsonDocument";
- case NTypeIds::Decimal: return "Decimal";
+ case NTypeIds::Decimal: return "Decimal";
case NTypeIds::DyNumber: return "DyNumber";
default: return "Unknown";
}
diff --git a/ydb/public/lib/value/value.cpp b/ydb/public/lib/value/value.cpp
index d368ca87b7c..0ed8b826895 100644
--- a/ydb/public/lib/value/value.cpp
+++ b/ydb/public/lib/value/value.cpp
@@ -1,7 +1,7 @@
#include "value.h"
#include <ydb/library/yql/public/decimal/yql_decimal.h>
-
+
#include <library/cpp/string_utils/base64/base64.h>
#include <util/charset/utf8.h>
@@ -402,16 +402,16 @@ TString TValue::GetDataText() const {
case NScheme::NTypeIds::String4k:
case NScheme::NTypeIds::String2m:
return Value.GetBytes();
- case NScheme::NTypeIds::Decimal:
- {
- NYql::NDecimal::TInt128 val;
- auto p = reinterpret_cast<char*>(&val);
- reinterpret_cast<ui64*>(p)[0] = Value.GetLow128();
- reinterpret_cast<ui64*>(p)[1] = Value.GetHi128();
- return NYql::NDecimal::ToString(val,
- Type.GetData().GetDecimalParams().GetPrecision(),
- Type.GetData().GetDecimalParams().GetScale());
- }
+ case NScheme::NTypeIds::Decimal:
+ {
+ NYql::NDecimal::TInt128 val;
+ auto p = reinterpret_cast<char*>(&val);
+ reinterpret_cast<ui64*>(p)[0] = Value.GetLow128();
+ reinterpret_cast<ui64*>(p)[1] = Value.GetHi128();
+ return NYql::NDecimal::ToString(val,
+ Type.GetData().GetDecimalParams().GetPrecision(),
+ Type.GetData().GetDecimalParams().GetScale());
+ }
case NScheme::NTypeIds::Date:
case NScheme::NTypeIds::Datetime:
return ToString(Value.GetUint32());
@@ -518,65 +518,65 @@ TString EscapeJsonASCII(const TString& s) {
return result;
}
-TString TFormatCSV::EscapeString(const TString& s) {
- TString result;
- result.reserve(s.size());
- const char* b = s.begin();
- const char* e = s.end();
- const char* p = b;
- while (p < e) {
- char c = *p;
- auto len = UTF8RuneLen(c);
- if (len < 2) {
- if (c < ' ') {
- result += Sprintf("\\u%04x", int(c));
- } else if (c == '"') {
- result += "\"\"";
- } else {
- result += c;
- }
- ++p;
- } else {
- len = std::min<decltype(len)>(len, e - p);
- result.append(p, len);
- p += len;
- }
- }
- return result;
-}
-
-TString PrintCsvHeader(const NKikimrMiniKQL::TType& type,
- const TFormatCSV &format) {
- TString hdr = "";
-
- switch(type.GetKind()) {
- case NKikimrMiniKQL::ETypeKind::Void:
- case NKikimrMiniKQL::ETypeKind::Data:
- case NKikimrMiniKQL::ETypeKind::Optional:
- break;
- case NKikimrMiniKQL::ETypeKind::List:
- return PrintCsvHeader(type.GetList().GetItem(), format);
- case NKikimrMiniKQL::ETypeKind::Tuple:
- case NKikimrMiniKQL::ETypeKind::Dict:
- break;
- case NKikimrMiniKQL::ETypeKind::Struct:
- {
- const auto& member = type.GetStruct().GetMember();
- for (auto it = member.begin(); it != member.end(); ++it) {
- if (it != member.begin())
- hdr += format.Delim;
- hdr += it->GetName();
- }
- break;
- }
- default:
- hdr = "<unknown>";
- break;
- }
-
- return hdr;
-}
-
+TString TFormatCSV::EscapeString(const TString& s) {
+ TString result;
+ result.reserve(s.size());
+ const char* b = s.begin();
+ const char* e = s.end();
+ const char* p = b;
+ while (p < e) {
+ char c = *p;
+ auto len = UTF8RuneLen(c);
+ if (len < 2) {
+ if (c < ' ') {
+ result += Sprintf("\\u%04x", int(c));
+ } else if (c == '"') {
+ result += "\"\"";
+ } else {
+ result += c;
+ }
+ ++p;
+ } else {
+ len = std::min<decltype(len)>(len, e - p);
+ result.append(p, len);
+ p += len;
+ }
+ }
+ return result;
+}
+
+TString PrintCsvHeader(const NKikimrMiniKQL::TType& type,
+ const TFormatCSV &format) {
+ TString hdr = "";
+
+ switch(type.GetKind()) {
+ case NKikimrMiniKQL::ETypeKind::Void:
+ case NKikimrMiniKQL::ETypeKind::Data:
+ case NKikimrMiniKQL::ETypeKind::Optional:
+ break;
+ case NKikimrMiniKQL::ETypeKind::List:
+ return PrintCsvHeader(type.GetList().GetItem(), format);
+ case NKikimrMiniKQL::ETypeKind::Tuple:
+ case NKikimrMiniKQL::ETypeKind::Dict:
+ break;
+ case NKikimrMiniKQL::ETypeKind::Struct:
+ {
+ const auto& member = type.GetStruct().GetMember();
+ for (auto it = member.begin(); it != member.end(); ++it) {
+ if (it != member.begin())
+ hdr += format.Delim;
+ hdr += it->GetName();
+ }
+ break;
+ }
+ default:
+ hdr = "<unknown>";
+ break;
+ }
+
+ return hdr;
+}
+
template <> TString TValue::GetValueText<TFormatJSON>(const TFormatJSON& format) const {
switch(Type.GetKind()) {
case NKikimrMiniKQL::ETypeKind::Void:
@@ -777,96 +777,96 @@ template <> TString TValue::GetValueText<TFormatRowset>(const TFormatRowset& for
return "<null>";
}
-template <> TString TValue::GetValueText<TFormatCSV>(const TFormatCSV &format) const {
- if (format.PrintHeader) {
- auto hdr = PrintCsvHeader(Type, format) + "\n";
- TFormatCSV fmt = format;
- fmt.PrintHeader = false;
- return hdr + GetValueText(fmt);
- }
-
- switch(Type.GetKind()) {
- case NKikimrMiniKQL::ETypeKind::Void:
- return "null";
- case NKikimrMiniKQL::ETypeKind::Data: {
- switch (Type.GetData().GetScheme()) {
- case NScheme::NTypeIds::Utf8:
- case NScheme::NTypeIds::String:
- case NScheme::NTypeIds::String4k:
- case NScheme::NTypeIds::String2m:
- return "\"" + format.EscapeString(GetDataText()) + "\"";
- default:
- return GetDataText();
- }
- }
- case NKikimrMiniKQL::ETypeKind::Optional: {
- if (Value.HasOptional()) {
- return TValue::Create(Value.GetOptional(), Type.GetOptional().GetItem()).GetValueText(format);
- } else {
- return "null";
- }
- }
- case NKikimrMiniKQL::ETypeKind::List:
- {
- TString valueText = "";
- const auto& list = Value.GetList();
- const auto& type = Type.GetList().GetItem();
- for (auto it = list.begin(); it != list.end(); ++it) {
- if (it != list.begin())
- valueText += "\n";
- valueText += TValue::Create(*it, type).GetValueText(format);
- }
- return valueText;
- }
- case NKikimrMiniKQL::ETypeKind::Tuple:
- {
- TString valueText = "[";
- const auto& tuple = Value.GetTuple();
- const auto& type = Type.GetTuple().GetElement();
- size_t maxElements = type.size();
- for (size_t element = 0; element < maxElements; ++element) {
- if (element != 0)
- valueText += ", ";
- valueText += TValue::Create(tuple.Get(element), type.Get(element)).GetValueText(format);
- }
- valueText += "]";
- return valueText;
- }
- case NKikimrMiniKQL::ETypeKind::Struct:
- {
- TString valueText = "";
- const auto& str = Value.GetStruct();
- const auto& type = Type.GetStruct().GetMember();
- size_t maxElements = type.size();
- for (size_t element = 0; element < maxElements; ++element) {
- if (element != 0)
- valueText += format.Delim;
- valueText += TValue::Create(str.Get(element), type.Get(element).GetType()).GetValueText(format);
- }
- return valueText;
- }
- case NKikimrMiniKQL::ETypeKind::Dict:
- {
- TString valueText = "{";
- const auto& dict = Value.GetDict();
- const auto& type = Type.GetDict();
- for (auto it = dict.begin(); it != dict.end(); ++it) {
- if (it != dict.begin())
- valueText += ", ";
- valueText += "\"Key\": ";
- valueText += TValue::Create(it->GetKey(), type.GetKey()).GetValueText(format);
- valueText += ", ";
- valueText += "\"Payload\": ";
- valueText += TValue::Create(it->GetPayload(), type.GetPayload()).GetValueText(format);
- }
- valueText += '}';
- return valueText;
- }
- default:
- return "null";
- }
-}
-
+template <> TString TValue::GetValueText<TFormatCSV>(const TFormatCSV &format) const {
+ if (format.PrintHeader) {
+ auto hdr = PrintCsvHeader(Type, format) + "\n";
+ TFormatCSV fmt = format;
+ fmt.PrintHeader = false;
+ return hdr + GetValueText(fmt);
+ }
+
+ switch(Type.GetKind()) {
+ case NKikimrMiniKQL::ETypeKind::Void:
+ return "null";
+ case NKikimrMiniKQL::ETypeKind::Data: {
+ switch (Type.GetData().GetScheme()) {
+ case NScheme::NTypeIds::Utf8:
+ case NScheme::NTypeIds::String:
+ case NScheme::NTypeIds::String4k:
+ case NScheme::NTypeIds::String2m:
+ return "\"" + format.EscapeString(GetDataText()) + "\"";
+ default:
+ return GetDataText();
+ }
+ }
+ case NKikimrMiniKQL::ETypeKind::Optional: {
+ if (Value.HasOptional()) {
+ return TValue::Create(Value.GetOptional(), Type.GetOptional().GetItem()).GetValueText(format);
+ } else {
+ return "null";
+ }
+ }
+ case NKikimrMiniKQL::ETypeKind::List:
+ {
+ TString valueText = "";
+ const auto& list = Value.GetList();
+ const auto& type = Type.GetList().GetItem();
+ for (auto it = list.begin(); it != list.end(); ++it) {
+ if (it != list.begin())
+ valueText += "\n";
+ valueText += TValue::Create(*it, type).GetValueText(format);
+ }
+ return valueText;
+ }
+ case NKikimrMiniKQL::ETypeKind::Tuple:
+ {
+ TString valueText = "[";
+ const auto& tuple = Value.GetTuple();
+ const auto& type = Type.GetTuple().GetElement();
+ size_t maxElements = type.size();
+ for (size_t element = 0; element < maxElements; ++element) {
+ if (element != 0)
+ valueText += ", ";
+ valueText += TValue::Create(tuple.Get(element), type.Get(element)).GetValueText(format);
+ }
+ valueText += "]";
+ return valueText;
+ }
+ case NKikimrMiniKQL::ETypeKind::Struct:
+ {
+ TString valueText = "";
+ const auto& str = Value.GetStruct();
+ const auto& type = Type.GetStruct().GetMember();
+ size_t maxElements = type.size();
+ for (size_t element = 0; element < maxElements; ++element) {
+ if (element != 0)
+ valueText += format.Delim;
+ valueText += TValue::Create(str.Get(element), type.Get(element).GetType()).GetValueText(format);
+ }
+ return valueText;
+ }
+ case NKikimrMiniKQL::ETypeKind::Dict:
+ {
+ TString valueText = "{";
+ const auto& dict = Value.GetDict();
+ const auto& type = Type.GetDict();
+ for (auto it = dict.begin(); it != dict.end(); ++it) {
+ if (it != dict.begin())
+ valueText += ", ";
+ valueText += "\"Key\": ";
+ valueText += TValue::Create(it->GetKey(), type.GetKey()).GetValueText(format);
+ valueText += ", ";
+ valueText += "\"Payload\": ";
+ valueText += TValue::Create(it->GetPayload(), type.GetPayload()).GetValueText(format);
+ }
+ valueText += '}';
+ return valueText;
+ }
+ default:
+ return "null";
+ }
+}
+
TValue TValue::EatOptional() const {
if (Type.HasOptional() && (Value.HasOptional() || !HaveValue()))
return TValue::Create(Value.HasOptional() ? Value.GetOptional() : Null, Type.GetOptional().GetItem()).EatOptional();
diff --git a/ydb/public/lib/value/value.h b/ydb/public/lib/value/value.h
index a8384a10826..8ae368ac027 100644
--- a/ydb/public/lib/value/value.h
+++ b/ydb/public/lib/value/value.h
@@ -214,16 +214,16 @@ struct TFormatJSON {
struct TFormatRowset {};
struct TFormatCSV {
- TFormatCSV(TString delim = ",", bool printHeader = false)
- : Delim(delim)
- , PrintHeader(printHeader)
- {}
-
- static TString EscapeString(const TString& s);
-
- TString Delim;
- bool PrintHeader;
-};
-
+ TFormatCSV(TString delim = ",", bool printHeader = false)
+ : Delim(delim)
+ , PrintHeader(printHeader)
+ {}
+
+ static TString EscapeString(const TString& s);
+
+ TString Delim;
+ bool PrintHeader;
+};
+
} // namespace NClient
} // namespace NKikimr
diff --git a/ydb/public/sdk/cpp/client/ydb_value/value.h b/ydb/public/sdk/cpp/client/ydb_value/value.h
index 1684645b1ee..4a163b92206 100644
--- a/ydb/public/sdk/cpp/client/ydb_value/value.h
+++ b/ydb/public/sdk/cpp/client/ydb_value/value.h
@@ -198,7 +198,7 @@ private:
struct TDecimalValue {
TString ToString() const;
TDecimalValue(const Ydb::Value& decimalValueProto, const TDecimalType& decimalType);
- TDecimalValue(const TString& decimalString, ui8 precision = 22, ui8 scale = 9);
+ TDecimalValue(const TString& decimalString, ui8 precision = 22, ui8 scale = 9);
TDecimalType DecimalType_;
ui64 Low_;
diff --git a/ydb/services/cms/cms_ut.cpp b/ydb/services/cms/cms_ut.cpp
index b1faf3fde96..7d5234715e0 100644
--- a/ydb/services/cms/cms_ut.cpp
+++ b/ydb/services/cms/cms_ut.cpp
@@ -1,36 +1,36 @@
#include <library/cpp/testing/unittest/tests_data.h>
#include <library/cpp/testing/unittest/registar.h>
-
-#include <grpc++/client_context.h>
-#include <grpc++/create_channel.h>
-
+
+#include <grpc++/client_context.h>
+#include <grpc++/create_channel.h>
+
#include <ydb/core/testlib/test_client.h>
-
+
#include <ydb/library/aclib/aclib.h>
-
+
#include <ydb/public/api/grpc/ydb_cms_v1.grpc.pb.h>
#include <ydb/public/api/grpc/ydb_operation_v1.grpc.pb.h>
-
+
#include <library/cpp/grpc/client/grpc_client_low.h>
-
+
#include <google/protobuf/any.h>
-
+
#include <ydb/library/yql/public/issue/yql_issue.h>
#include <ydb/library/yql/public/issue/yql_issue_message.h>
-
-// new grpc client
+
+// new grpc client
#include <ydb/public/sdk/cpp/client/ydb_driver/driver.h>
#include <ydb/public/sdk/cpp/client/ydb_params/params.h>
#include <ydb/public/sdk/cpp/client/ydb_result/result.h>
#include <ydb/public/sdk/cpp/client/resources/ydb_resources.h>
-
+
#include <ydb/services/ydb/ydb_common_ut.h>
-
-namespace NKikimr {
-
-using namespace Tests;
+
+namespace NKikimr {
+
+using namespace Tests;
using namespace NYdb;
-
+
struct TCmsTestSettings : TKikimrTestSettings {
static constexpr bool PrecreatePools = false;
};
@@ -45,24 +45,24 @@ static Ydb::StatusIds::StatusCode WaitForOperationStatus(std::shared_ptr<grpc::C
std::unique_ptr<Ydb::Operation::V1::OperationService::Stub> stub;
stub = Ydb::Operation::V1::OperationService::NewStub(channel);
Ydb::Operations::GetOperationRequest request;
- request.set_id(opId);
+ request.set_id(opId);
Ydb::Operations::GetOperationResponse response;
- bool run = true;
- while (run) {
- grpc::ClientContext context;
- if (token)
+ bool run = true;
+ while (run) {
+ grpc::ClientContext context;
+ if (token)
context.AddMetadata(YDB_AUTH_TICKET_HEADER, token);
- auto status = stub->GetOperation(&context, request, &response);
- UNIT_ASSERT(status.ok()); //GRpc layer - OK
+ auto status = stub->GetOperation(&context, request, &response);
+ UNIT_ASSERT(status.ok()); //GRpc layer - OK
if (response.operation().ready() == false) {
- Sleep(ITERATION_DURATION);
- } else {
- run = false;
- }
- }
+ Sleep(ITERATION_DURATION);
+ } else {
+ run = false;
+ }
+ }
return response.operation().status();
-}
-
+}
+
static Ydb::Cms::GetDatabaseStatusResult WaitForTenantState(std::shared_ptr<grpc::Channel> channel, const TString& path, Ydb::Cms::GetDatabaseStatusResult::State state = Ydb::Cms::GetDatabaseStatusResult::RUNNING, const TString &token = "") {
std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
stub = Ydb::Cms::V1::CmsService::NewStub(channel);
@@ -90,56 +90,56 @@ static Ydb::Cms::GetDatabaseStatusResult WaitForTenantState(std::shared_ptr<grpc
}
}
-void InitConsoleConfig(TKikimrWithGrpcAndRootSchema &server)
-{
- TClient client(*server.ServerSettings);
- TAutoPtr<NMsgBusProxy::TBusConsoleRequest> request(new NMsgBusProxy::TBusConsoleRequest());
- auto &config = *request->Record.MutableSetConfigRequest()->MutableConfig()->MutableTenantsConfig();
- {
- auto &zone = *config.AddAvailabilityZoneKinds();
- zone.SetKind("dc-1");
- zone.SetDataCenterName("DC-1");
- }
- {
- auto &zone = *config.AddAvailabilityZoneKinds();
- zone.SetKind("any");
- }
- {
- auto &zoneSet = *config.AddAvailabilityZoneSets();
- zoneSet.SetName("all");
- zoneSet.AddZoneKinds("dc-1");
- zoneSet.AddZoneKinds("any");
- }
- {
- auto &kind = *config.AddComputationalUnitKinds();
- kind.SetKind("slot");
- kind.SetTenantSlotType("default");
- kind.SetAvailabilityZoneSet("all");
- }
- TAutoPtr<NBus::TBusMessage> reply;
- NBus::EMessageStatus msgStatus = client.SyncCall(request, reply);
- UNIT_ASSERT_VALUES_EQUAL(msgStatus, NBus::MESSAGE_OK);
- auto resp = dynamic_cast<NMsgBusProxy::TBusConsoleResponse*>(reply.Get())->Record;
- UNIT_ASSERT_VALUES_EQUAL(resp.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
-}
-
+void InitConsoleConfig(TKikimrWithGrpcAndRootSchema &server)
+{
+ TClient client(*server.ServerSettings);
+ TAutoPtr<NMsgBusProxy::TBusConsoleRequest> request(new NMsgBusProxy::TBusConsoleRequest());
+ auto &config = *request->Record.MutableSetConfigRequest()->MutableConfig()->MutableTenantsConfig();
+ {
+ auto &zone = *config.AddAvailabilityZoneKinds();
+ zone.SetKind("dc-1");
+ zone.SetDataCenterName("DC-1");
+ }
+ {
+ auto &zone = *config.AddAvailabilityZoneKinds();
+ zone.SetKind("any");
+ }
+ {
+ auto &zoneSet = *config.AddAvailabilityZoneSets();
+ zoneSet.SetName("all");
+ zoneSet.AddZoneKinds("dc-1");
+ zoneSet.AddZoneKinds("any");
+ }
+ {
+ auto &kind = *config.AddComputationalUnitKinds();
+ kind.SetKind("slot");
+ kind.SetTenantSlotType("default");
+ kind.SetAvailabilityZoneSet("all");
+ }
+ TAutoPtr<NBus::TBusMessage> reply;
+ NBus::EMessageStatus msgStatus = client.SyncCall(request, reply);
+ UNIT_ASSERT_VALUES_EQUAL(msgStatus, NBus::MESSAGE_OK);
+ auto resp = dynamic_cast<NMsgBusProxy::TBusConsoleResponse*>(reply.Get())->Record;
+ UNIT_ASSERT_VALUES_EQUAL(resp.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
+}
+
template<typename TRequest>
static void SetSyncOperation(TRequest& req) {
req.mutable_operation_params()->set_operation_mode(Ydb::Operations::OperationParams::SYNC);
}
-
+
static void doSimpleTenantsTest(bool sync) {
TKikimrWithGrpcAndRootSchema server;
server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CMS_TENANTS, NLog::PRI_TRACE);
-
+
ui16 grpc = server.GetPort();
TString id;
-
+
std::shared_ptr<grpc::Channel> channel;
std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
channel = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
-
+
const TString tenant = "/Root/users/user-1";
// create tenant
{
@@ -163,38 +163,38 @@ static void doSimpleTenantsTest(bool sync) {
UNIT_ASSERT_EQUAL(response.operation().status(), Ydb::StatusIds::SUCCESS);
} else {
id = response.operation().id();
- }
+ }
+ }
+
+ if (!sync) {
+ auto status = WaitForOperationStatus(channel, id);
+ UNIT_ASSERT_EQUAL(status, Ydb::StatusIds::SUCCESS);
}
- if (!sync) {
- auto status = WaitForOperationStatus(channel, id);
- UNIT_ASSERT_EQUAL(status, Ydb::StatusIds::SUCCESS);
- }
-
{
server.Tenants_->Run(tenant);
WaitForTenantState(channel, tenant, Ydb::Cms::GetDatabaseStatusResult::RUNNING);
}
-
+
// alter tenant
{
stub = Ydb::Cms::V1::CmsService::NewStub(channel);
grpc::ClientContext context;
-
+
Ydb::Cms::AlterDatabaseRequest request;
request.set_path(tenant);
-
+
auto unit = request.add_storage_units_to_add();
unit->set_unit_kind("hdd");
unit->set_count(1);
-
+
Ydb::Cms::AlterDatabaseResponse response;
auto status = stub->AlterDatabase(&context, request, &response);
UNIT_ASSERT(status.ok());
UNIT_ASSERT(response.operation().ready());
UNIT_ASSERT_EQUAL(response.operation().status(), Ydb::StatusIds::SUCCESS);
}
-
+
// get tenant status
{
Ydb::Cms::GetDatabaseStatusResult result = WaitForTenantState(channel, tenant, Ydb::Cms::GetDatabaseStatusResult::RUNNING);
@@ -205,14 +205,14 @@ static void doSimpleTenantsTest(bool sync) {
UNIT_ASSERT_VALUES_EQUAL(unit.unit_kind(), "hdd");
UNIT_ASSERT_VALUES_EQUAL(unit.count(), 2);
}
-
+
// list tenants
{
stub = Ydb::Cms::V1::CmsService::NewStub(channel);
grpc::ClientContext context;
-
+
Ydb::Cms::ListDatabasesRequest request;
-
+
Ydb::Cms::ListDatabasesResponse response;
auto status = stub->ListDatabases(&context, request, &response);
UNIT_ASSERT(status.ok());
@@ -224,7 +224,7 @@ static void doSimpleTenantsTest(bool sync) {
UNIT_ASSERT_VALUES_EQUAL(result.paths_size(), 1);
UNIT_ASSERT_VALUES_EQUAL(result.paths(0), tenant);
}
-
+
// remove tenants
{
stub = Ydb::Cms::V1::CmsService::NewStub(channel);
@@ -243,35 +243,35 @@ static void doSimpleTenantsTest(bool sync) {
UNIT_ASSERT(response.operation().status() == Ydb::StatusIds::SUCCESS);
} else {
id = response.operation().id();
- }
+ }
}
if (!sync) {
auto status = WaitForOperationStatus(channel, id);
UNIT_ASSERT(status == Ydb::StatusIds::SUCCESS);
}
-
+
// get tenant status
{
stub = Ydb::Cms::V1::CmsService::NewStub(channel);
grpc::ClientContext context;
-
+
Ydb::Cms::GetDatabaseStatusRequest request;
request.set_path("/Root/users/user-1");
-
+
Ydb::Cms::GetDatabaseStatusResponse response;
auto status = stub->GetDatabaseStatus(&context, request, &response);
UNIT_ASSERT(status.ok());
UNIT_ASSERT(response.operation().ready());
UNIT_ASSERT(response.operation().status() == Ydb::StatusIds::NOT_FOUND);
}
-
+
// list tenants
{
stub = Ydb::Cms::V1::CmsService::NewStub(channel);
grpc::ClientContext context;
-
+
Ydb::Cms::ListDatabasesRequest request;
-
+
Ydb::Cms::ListDatabasesResponse response;
auto status = stub->ListDatabases(&context, request, &response);
UNIT_ASSERT(status.ok());
@@ -281,82 +281,82 @@ static void doSimpleTenantsTest(bool sync) {
auto res = response.operation().result().UnpackTo(&result);
UNIT_ASSERT(res);
UNIT_ASSERT_VALUES_EQUAL(result.paths_size(), 0);
- }
+ }
}
-
+
template <typename TTestSettings>
void CheckCreateDatabase(NYdb::TBasicKikimrWithGrpcAndRootSchema<TTestSettings> &server,
- std::shared_ptr<grpc::Channel> channel,
- const TString &path,
- bool disableTx = false,
- bool runNode = false,
- const TString &token = "")
-{
- std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
- TString id;
-
- stub = Ydb::Cms::V1::CmsService::NewStub(channel);
- grpc::ClientContext context;
- if (token)
- context.AddMetadata(YDB_AUTH_TICKET_HEADER, token);
-
- {
- Ydb::Cms::CreateDatabaseRequest request;
- request.set_path(path);
- if (disableTx)
- request.mutable_options()->set_disable_tx_service(true);
- auto unit = request.mutable_resources()->add_storage_units();
- unit->set_unit_kind("hdd");
- unit->set_count(1);
-
- Ydb::Cms::CreateDatabaseResponse response;
- auto status = stub->CreateDatabase(&context, request, &response);
- UNIT_ASSERT(status.ok());
- UNIT_ASSERT(!response.operation().ready());
- id = response.operation().id();
- }
- {
- auto status = WaitForOperationStatus(channel, id, token);
+ std::shared_ptr<grpc::Channel> channel,
+ const TString &path,
+ bool disableTx = false,
+ bool runNode = false,
+ const TString &token = "")
+{
+ std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
+ TString id;
+
+ stub = Ydb::Cms::V1::CmsService::NewStub(channel);
+ grpc::ClientContext context;
+ if (token)
+ context.AddMetadata(YDB_AUTH_TICKET_HEADER, token);
+
+ {
+ Ydb::Cms::CreateDatabaseRequest request;
+ request.set_path(path);
+ if (disableTx)
+ request.mutable_options()->set_disable_tx_service(true);
+ auto unit = request.mutable_resources()->add_storage_units();
+ unit->set_unit_kind("hdd");
+ unit->set_count(1);
+
+ Ydb::Cms::CreateDatabaseResponse response;
+ auto status = stub->CreateDatabase(&context, request, &response);
+ UNIT_ASSERT(status.ok());
+ UNIT_ASSERT(!response.operation().ready());
+ id = response.operation().id();
+ }
+ {
+ auto status = WaitForOperationStatus(channel, id, token);
UNIT_ASSERT_VALUES_EQUAL(status, Ydb::StatusIds::SUCCESS);
- }
-
- if (runNode) {
- //WaitForTenantState(channel, path, Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES, token);
- server.Tenants_->Run(path);
- WaitForTenantState(channel, path, Ydb::Cms::GetDatabaseStatusResult::RUNNING, token);
- }
-}
-
-void CheckRemoveDatabase(std::shared_ptr<grpc::Channel> channel,
- const TString &path,
- const TString &token = "",
- Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
-{
- std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
- TString id;
-
- stub = Ydb::Cms::V1::CmsService::NewStub(channel);
- grpc::ClientContext context;
- if (token)
- context.AddMetadata(YDB_AUTH_TICKET_HEADER, token);
-
- {
- Ydb::Cms::RemoveDatabaseRequest request;
- request.set_path(path);
-
- Ydb::Cms::RemoveDatabaseResponse response;
- auto status = stub->RemoveDatabase(&context, request, &response);
- UNIT_ASSERT(status.ok());
- UNIT_ASSERT(!response.operation().ready());
- id = response.operation().id();
- }
-
- {
- auto status = WaitForOperationStatus(channel, id);
- UNIT_ASSERT(status == code);
- }
-}
-
+ }
+
+ if (runNode) {
+ //WaitForTenantState(channel, path, Ydb::Cms::GetDatabaseStatusResult::PENDING_RESOURCES, token);
+ server.Tenants_->Run(path);
+ WaitForTenantState(channel, path, Ydb::Cms::GetDatabaseStatusResult::RUNNING, token);
+ }
+}
+
+void CheckRemoveDatabase(std::shared_ptr<grpc::Channel> channel,
+ const TString &path,
+ const TString &token = "",
+ Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
+{
+ std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
+ TString id;
+
+ stub = Ydb::Cms::V1::CmsService::NewStub(channel);
+ grpc::ClientContext context;
+ if (token)
+ context.AddMetadata(YDB_AUTH_TICKET_HEADER, token);
+
+ {
+ Ydb::Cms::RemoveDatabaseRequest request;
+ request.set_path(path);
+
+ Ydb::Cms::RemoveDatabaseResponse response;
+ auto status = stub->RemoveDatabase(&context, request, &response);
+ UNIT_ASSERT(status.ok());
+ UNIT_ASSERT(!response.operation().ready());
+ id = response.operation().id();
+ }
+
+ {
+ auto status = WaitForOperationStatus(channel, id);
+ UNIT_ASSERT(status == code);
+ }
+}
+
Y_UNIT_TEST_SUITE(TGRpcCmsTest) {
Y_UNIT_TEST(SimpleTenantsTest) {
doSimpleTenantsTest(false);
@@ -366,187 +366,187 @@ Y_UNIT_TEST_SUITE(TGRpcCmsTest) {
doSimpleTenantsTest(true);
}
- Y_UNIT_TEST(AuthTokenTest) {
+ Y_UNIT_TEST(AuthTokenTest) {
NYdb::TBasicKikimrWithGrpcAndRootSchema<TCmsTestSettingsWithAuth> server;
- server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CMS_TENANTS, NLog::PRI_TRACE);
- ui16 grpc = server.GetPort();
- TString id;
-
- std::shared_ptr<grpc::Channel> channel;
+ server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CMS_TENANTS, NLog::PRI_TRACE);
+ ui16 grpc = server.GetPort();
+ TString id;
+
+ std::shared_ptr<grpc::Channel> channel;
std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
- channel = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
-
- // create tenant
- CheckCreateDatabase(server, channel, "/Root/users/user-1", false, true, BUILTIN_ACL_ROOT);
-
- // Check owner
- {
- TClient client(*server.ServerSettings);
- auto resp = client.Ls("/Root/users/user-1");
- UNIT_ASSERT_VALUES_EQUAL(resp->Record.GetPathDescription().GetSelf().GetOwner(), BUILTIN_ACL_ROOT);
- }
- }
-
- Y_UNIT_TEST(DescribeOptionsTest) {
- TKikimrWithGrpcAndRootSchema server;
- server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CMS_TENANTS, NLog::PRI_TRACE);
- ui16 grpc = server.GetPort();
- TString id;
-
- // Configure Console.
- InitConsoleConfig(server);
-
- std::shared_ptr<grpc::Channel> channel;
+ channel = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+
+ // create tenant
+ CheckCreateDatabase(server, channel, "/Root/users/user-1", false, true, BUILTIN_ACL_ROOT);
+
+ // Check owner
+ {
+ TClient client(*server.ServerSettings);
+ auto resp = client.Ls("/Root/users/user-1");
+ UNIT_ASSERT_VALUES_EQUAL(resp->Record.GetPathDescription().GetSelf().GetOwner(), BUILTIN_ACL_ROOT);
+ }
+ }
+
+ Y_UNIT_TEST(DescribeOptionsTest) {
+ TKikimrWithGrpcAndRootSchema server;
+ server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CMS_TENANTS, NLog::PRI_TRACE);
+ ui16 grpc = server.GetPort();
+ TString id;
+
+ // Configure Console.
+ InitConsoleConfig(server);
+
+ std::shared_ptr<grpc::Channel> channel;
std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
- channel = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
-
+ channel = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+
stub = Ydb::Cms::V1::CmsService::NewStub(channel);
- grpc::ClientContext context;
-
- Ydb::Cms::DescribeDatabaseOptionsRequest request;
- Ydb::Cms::DescribeDatabaseOptionsResponse response;
- auto status = stub->DescribeDatabaseOptions(&context, request, &response);
- UNIT_ASSERT(status.ok());
- UNIT_ASSERT(response.operation().ready());
- UNIT_ASSERT(response.operation().status() == Ydb::StatusIds::SUCCESS);
-
+ grpc::ClientContext context;
+
+ Ydb::Cms::DescribeDatabaseOptionsRequest request;
+ Ydb::Cms::DescribeDatabaseOptionsResponse response;
+ auto status = stub->DescribeDatabaseOptions(&context, request, &response);
+ UNIT_ASSERT(status.ok());
+ UNIT_ASSERT(response.operation().ready());
+ UNIT_ASSERT(response.operation().status() == Ydb::StatusIds::SUCCESS);
+
// In testing env we have pools kinds test, ssd, hdd, hdd1, hdd2 all with
- // none erasure and ROT disk.
+ // none erasure and ROT disk.
THashSet<TString> poolKinds = {{TString("test"), TString("ssd"), TString("hdd"), TString("hdd1"), TString("hdd2")}};
- Ydb::Cms::DescribeDatabaseOptionsResult result;
- auto res = response.operation().result().UnpackTo(&result);
- UNIT_ASSERT(res);
- UNIT_ASSERT_VALUES_EQUAL(result.storage_units_size(), poolKinds.size());
- for (auto &pool : result.storage_units()) {
+ Ydb::Cms::DescribeDatabaseOptionsResult result;
+ auto res = response.operation().result().UnpackTo(&result);
+ UNIT_ASSERT(res);
+ UNIT_ASSERT_VALUES_EQUAL(result.storage_units_size(), poolKinds.size());
+ for (auto &pool : result.storage_units()) {
UNIT_ASSERT(poolKinds.contains(pool.kind()));
- UNIT_ASSERT_VALUES_EQUAL(pool.labels().size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(pool.labels().at("disk_type"), "ROT");
- UNIT_ASSERT_VALUES_EQUAL(pool.labels().at("erasure"), "none");
- poolKinds.erase(pool.kind());
- }
-
- // Check availability zone dc-1 and any.
- THashSet<TString> zones = {{TString("dc-1"), TString("any")}};
- UNIT_ASSERT_VALUES_EQUAL(result.availability_zones_size(), zones.size());
- for (auto &zone: result.availability_zones()) {
+ UNIT_ASSERT_VALUES_EQUAL(pool.labels().size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(pool.labels().at("disk_type"), "ROT");
+ UNIT_ASSERT_VALUES_EQUAL(pool.labels().at("erasure"), "none");
+ poolKinds.erase(pool.kind());
+ }
+
+ // Check availability zone dc-1 and any.
+ THashSet<TString> zones = {{TString("dc-1"), TString("any")}};
+ UNIT_ASSERT_VALUES_EQUAL(result.availability_zones_size(), zones.size());
+ for (auto &zone: result.availability_zones()) {
UNIT_ASSERT(zones.contains(zone.name()));
- if (zone.name() == "dc-1") {
- UNIT_ASSERT_VALUES_EQUAL(zone.labels().size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(zone.labels().at("fixed_data_center"), "DC-1");
- UNIT_ASSERT_VALUES_EQUAL(zone.labels().at("collocation"), "disabled");
- } else if (zone.name() == "any") {
- UNIT_ASSERT_VALUES_EQUAL(zone.labels().size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(zone.labels().at("any_data_center"), "true");
- UNIT_ASSERT_VALUES_EQUAL(zone.labels().at("collocation"), "disabled");
- } else {
- Y_FAIL("unexpected zone");
- }
- zones.erase(zone.name());
- }
-
- // Check computational unit.
- THashSet<TString> unitZones = {{TString("dc-1"), TString("any")}};
- UNIT_ASSERT_VALUES_EQUAL(result.computational_units_size(), 1);
- auto &unit = result.computational_units(0);
- UNIT_ASSERT_VALUES_EQUAL(unit.kind(), "slot");
- UNIT_ASSERT_VALUES_EQUAL(unit.allowed_availability_zones_size(), unitZones.size());
- for (auto &zone : unit.allowed_availability_zones()) {
+ if (zone.name() == "dc-1") {
+ UNIT_ASSERT_VALUES_EQUAL(zone.labels().size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(zone.labels().at("fixed_data_center"), "DC-1");
+ UNIT_ASSERT_VALUES_EQUAL(zone.labels().at("collocation"), "disabled");
+ } else if (zone.name() == "any") {
+ UNIT_ASSERT_VALUES_EQUAL(zone.labels().size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(zone.labels().at("any_data_center"), "true");
+ UNIT_ASSERT_VALUES_EQUAL(zone.labels().at("collocation"), "disabled");
+ } else {
+ Y_FAIL("unexpected zone");
+ }
+ zones.erase(zone.name());
+ }
+
+ // Check computational unit.
+ THashSet<TString> unitZones = {{TString("dc-1"), TString("any")}};
+ UNIT_ASSERT_VALUES_EQUAL(result.computational_units_size(), 1);
+ auto &unit = result.computational_units(0);
+ UNIT_ASSERT_VALUES_EQUAL(unit.kind(), "slot");
+ UNIT_ASSERT_VALUES_EQUAL(unit.allowed_availability_zones_size(), unitZones.size());
+ for (auto &zone : unit.allowed_availability_zones()) {
UNIT_ASSERT(unitZones.contains(zone));
- unitZones.erase(zone);
- }
- UNIT_ASSERT_VALUES_EQUAL(unit.labels().size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(unit.labels().at("type"), "dynamic_slot");
- UNIT_ASSERT_VALUES_EQUAL(unit.labels().at("slot_type"), "default");
- }
-
- Y_UNIT_TEST(DisabledTxTest) {
- TKikimrWithGrpcAndRootSchema server;
- ui16 grpc = server.GetPort();
- TString id;
-
- std::shared_ptr<grpc::Channel> channel;
- std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
- channel = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
-
- // create tenant with no computational resources
- // it should succeed if we don't need transactions support
- CheckCreateDatabase(server, channel, "/Root/users/user-1", true);
- WaitForTenantState(channel, "/Root/users/user-1", Ydb::Cms::GetDatabaseStatusResult::RUNNING);
- }
-
- Y_UNIT_TEST(AlterRemoveTest) {
- TKikimrWithGrpcAndRootSchema server;
- server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CMS_TENANTS, NLog::PRI_TRACE);
-
- ui16 grpc = server.GetPort();
- TString id;
-
- std::shared_ptr<grpc::Channel> channel;
- std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
- channel = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
-
- const TString tenant = "/Root/users/user-1";
- CheckCreateDatabase(server, channel, tenant);
-
- // alter tenant
- {
- stub = Ydb::Cms::V1::CmsService::NewStub(channel);
- grpc::ClientContext context;
-
- Ydb::Cms::AlterDatabaseRequest request;
- request.set_path(tenant);
- auto unit = request.add_storage_units_to_add();
- unit->set_unit_kind("hdd");
- unit->set_count(1);
-
- Ydb::Cms::AlterDatabaseResponse response;
- auto status = stub->AlterDatabase(&context, request, &response);
- UNIT_ASSERT(status.ok());
- UNIT_ASSERT(response.operation().ready());
- UNIT_ASSERT_EQUAL(response.operation().status(), Ydb::StatusIds::SUCCESS);
- }
-
- // remove tenants
- CheckRemoveDatabase(channel, "/Root/users/user-1");
- }
-
- Y_UNIT_TEST(RemoveWithAnotherTokenTest) {
- TKikimrWithGrpcAndRootSchema server;
- server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CMS_TENANTS, NLog::PRI_TRACE);
- ui16 grpc = server.GetPort();
- TString id;
-
- std::shared_ptr<grpc::Channel> channel;
- std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
- channel = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
-
- {
- NACLib::TDiffACL acl;
- acl.AddAccess(NACLib::EAccessType::Allow, NACLib::GenericFull,
- "user-1@" BUILTIN_ACL_DOMAIN);
- TClient client(*server.ServerSettings);
- client.ModifyACL("/", "Root", acl.SerializeAsString());
- }
-
- CheckCreateDatabase(server, channel, "/Root/users/user-1",
- false, true, "user-1@" BUILTIN_ACL_DOMAIN);
-
- CheckRemoveDatabase(channel, "/Root/users/user-1",
- "user-2@" BUILTIN_ACL_DOMAIN,
- Ydb::StatusIds::UNAUTHORIZED);
-
- {
- NACLib::TDiffACL acl;
- acl.AddAccess(NACLib::EAccessType::Allow, NACLib::GenericFull,
- "user-2@" BUILTIN_ACL_DOMAIN);
- TClient client(*server.ServerSettings);
- client.ModifyACL("/Root/users", "user-1", acl.SerializeAsString());
- client.RefreshPathCache(server.Server_->GetRuntime(), "/Root/users/user-1");
- }
-
- CheckRemoveDatabase(channel, "/Root/users/user-1",
- "user-2@" BUILTIN_ACL_DOMAIN);
- }
-}
-
-} // namespace NKikimr
+ unitZones.erase(zone);
+ }
+ UNIT_ASSERT_VALUES_EQUAL(unit.labels().size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(unit.labels().at("type"), "dynamic_slot");
+ UNIT_ASSERT_VALUES_EQUAL(unit.labels().at("slot_type"), "default");
+ }
+
+ Y_UNIT_TEST(DisabledTxTest) {
+ TKikimrWithGrpcAndRootSchema server;
+ ui16 grpc = server.GetPort();
+ TString id;
+
+ std::shared_ptr<grpc::Channel> channel;
+ std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
+ channel = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+
+ // create tenant with no computational resources
+ // it should succeed if we don't need transactions support
+ CheckCreateDatabase(server, channel, "/Root/users/user-1", true);
+ WaitForTenantState(channel, "/Root/users/user-1", Ydb::Cms::GetDatabaseStatusResult::RUNNING);
+ }
+
+ Y_UNIT_TEST(AlterRemoveTest) {
+ TKikimrWithGrpcAndRootSchema server;
+ server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CMS_TENANTS, NLog::PRI_TRACE);
+
+ ui16 grpc = server.GetPort();
+ TString id;
+
+ std::shared_ptr<grpc::Channel> channel;
+ std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
+ channel = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+
+ const TString tenant = "/Root/users/user-1";
+ CheckCreateDatabase(server, channel, tenant);
+
+ // alter tenant
+ {
+ stub = Ydb::Cms::V1::CmsService::NewStub(channel);
+ grpc::ClientContext context;
+
+ Ydb::Cms::AlterDatabaseRequest request;
+ request.set_path(tenant);
+ auto unit = request.add_storage_units_to_add();
+ unit->set_unit_kind("hdd");
+ unit->set_count(1);
+
+ Ydb::Cms::AlterDatabaseResponse response;
+ auto status = stub->AlterDatabase(&context, request, &response);
+ UNIT_ASSERT(status.ok());
+ UNIT_ASSERT(response.operation().ready());
+ UNIT_ASSERT_EQUAL(response.operation().status(), Ydb::StatusIds::SUCCESS);
+ }
+
+ // remove tenants
+ CheckRemoveDatabase(channel, "/Root/users/user-1");
+ }
+
+ Y_UNIT_TEST(RemoveWithAnotherTokenTest) {
+ TKikimrWithGrpcAndRootSchema server;
+ server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CMS_TENANTS, NLog::PRI_TRACE);
+ ui16 grpc = server.GetPort();
+ TString id;
+
+ std::shared_ptr<grpc::Channel> channel;
+ std::unique_ptr<Ydb::Cms::V1::CmsService::Stub> stub;
+ channel = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+
+ {
+ NACLib::TDiffACL acl;
+ acl.AddAccess(NACLib::EAccessType::Allow, NACLib::GenericFull,
+ "user-1@" BUILTIN_ACL_DOMAIN);
+ TClient client(*server.ServerSettings);
+ client.ModifyACL("/", "Root", acl.SerializeAsString());
+ }
+
+ CheckCreateDatabase(server, channel, "/Root/users/user-1",
+ false, true, "user-1@" BUILTIN_ACL_DOMAIN);
+
+ CheckRemoveDatabase(channel, "/Root/users/user-1",
+ "user-2@" BUILTIN_ACL_DOMAIN,
+ Ydb::StatusIds::UNAUTHORIZED);
+
+ {
+ NACLib::TDiffACL acl;
+ acl.AddAccess(NACLib::EAccessType::Allow, NACLib::GenericFull,
+ "user-2@" BUILTIN_ACL_DOMAIN);
+ TClient client(*server.ServerSettings);
+ client.ModifyACL("/Root/users", "user-1", acl.SerializeAsString());
+ client.RefreshPathCache(server.Server_->GetRuntime(), "/Root/users/user-1");
+ }
+
+ CheckRemoveDatabase(channel, "/Root/users/user-1",
+ "user-2@" BUILTIN_ACL_DOMAIN);
+ }
+}
+
+} // namespace NKikimr
diff --git a/ydb/services/cms/grpc_service.cpp b/ydb/services/cms/grpc_service.cpp
index 92cb5226189..33a7569982c 100644
--- a/ydb/services/cms/grpc_service.cpp
+++ b/ydb/services/cms/grpc_service.cpp
@@ -1,74 +1,74 @@
-#include "grpc_service.h"
-
+#include "grpc_service.h"
+
#include <ydb/core/grpc_services/grpc_helper.h>
#include <ydb/core/grpc_services/grpc_request_proxy.h>
#include <ydb/core/grpc_services/rpc_calls.h>
-
-namespace NKikimr {
-namespace NGRpcService {
-
-TGRpcCmsService::TGRpcCmsService(NActors::TActorSystem *system,
- TIntrusivePtr<NMonitoring::TDynamicCounters> counters,
+
+namespace NKikimr {
+namespace NGRpcService {
+
+TGRpcCmsService::TGRpcCmsService(NActors::TActorSystem *system,
+ TIntrusivePtr<NMonitoring::TDynamicCounters> counters,
NActors::TActorId id)
- : ActorSystem_(system)
- , Counters_(counters)
- , GRpcRequestProxyId_(id)
-{
-}
-
+ : ActorSystem_(system)
+ , Counters_(counters)
+ , GRpcRequestProxyId_(id)
+{
+}
+
void TGRpcCmsService::InitService(grpc::ServerCompletionQueue *cq, NGrpc::TLoggerPtr logger) {
- CQ_ = cq;
+ CQ_ = cq;
SetupIncomingRequests(std::move(logger));
-}
-
+}
+
void TGRpcCmsService::SetGlobalLimiterHandle(NGrpc::TGlobalLimiter* limiter)
-{
- Limiter_ = limiter;
-}
-
-bool TGRpcCmsService::IncRequest() {
- return Limiter_->Inc();
-}
-
-void TGRpcCmsService::DecRequest() {
- Limiter_->Dec();
- Y_ASSERT(Limiter_->GetCurrentInFlight() >= 0);
-}
-
+{
+ Limiter_ = limiter;
+}
+
+bool TGRpcCmsService::IncRequest() {
+ return Limiter_->Inc();
+}
+
+void TGRpcCmsService::DecRequest() {
+ Limiter_->Dec();
+ Y_ASSERT(Limiter_->GetCurrentInFlight() >= 0);
+}
+
void TGRpcCmsService::SetupIncomingRequests(NGrpc::TLoggerPtr logger) {
- auto getCounterBlock = CreateCounterCb(Counters_, ActorSystem_);
-#ifdef ADD_REQUEST
-#error ADD_REQUEST macro already defined
-#endif
-#define ADD_REQUEST(NAME, IN, OUT, ACTION) \
+ auto getCounterBlock = CreateCounterCb(Counters_, ActorSystem_);
+#ifdef ADD_REQUEST
+#error ADD_REQUEST macro already defined
+#endif
+#define ADD_REQUEST(NAME, IN, OUT, ACTION) \
MakeIntrusive<TGRpcRequest<Ydb::Cms::IN, Ydb::Cms::OUT, TGRpcCmsService>>(this, &Service_, CQ_, \
[this](NGrpc::IRequestContextBase *ctx) { \
ReportGrpcReqToMon(*ActorSystem_, ctx->GetPeer()); \
ACTION; \
}, &Ydb::Cms::V1::CmsService::AsyncService::Request ## NAME, \
#NAME, logger, getCounterBlock("cms", #NAME))->Run();
-
+
ADD_REQUEST(CreateDatabase, CreateDatabaseRequest, CreateDatabaseResponse, {
- ActorSystem_->Send(GRpcRequestProxyId_, new TEvCreateTenantRequest(ctx));
- })
+ ActorSystem_->Send(GRpcRequestProxyId_, new TEvCreateTenantRequest(ctx));
+ })
ADD_REQUEST(AlterDatabase, AlterDatabaseRequest, AlterDatabaseResponse, {
- ActorSystem_->Send(GRpcRequestProxyId_, new TEvAlterTenantRequest(ctx));
- })
+ ActorSystem_->Send(GRpcRequestProxyId_, new TEvAlterTenantRequest(ctx));
+ })
ADD_REQUEST(GetDatabaseStatus, GetDatabaseStatusRequest, GetDatabaseStatusResponse, {
- ActorSystem_->Send(GRpcRequestProxyId_, new TEvGetTenantStatusRequest(ctx));
- })
+ ActorSystem_->Send(GRpcRequestProxyId_, new TEvGetTenantStatusRequest(ctx));
+ })
ADD_REQUEST(ListDatabases, ListDatabasesRequest, ListDatabasesResponse, {
- ActorSystem_->Send(GRpcRequestProxyId_, new TEvListTenantsRequest(ctx));
- })
+ ActorSystem_->Send(GRpcRequestProxyId_, new TEvListTenantsRequest(ctx));
+ })
ADD_REQUEST(RemoveDatabase, RemoveDatabaseRequest, RemoveDatabaseResponse, {
- ActorSystem_->Send(GRpcRequestProxyId_, new TEvRemoveTenantRequest(ctx));
- })
- ADD_REQUEST(DescribeDatabaseOptions, DescribeDatabaseOptionsRequest, DescribeDatabaseOptionsResponse, {
- ActorSystem_->Send(GRpcRequestProxyId_, new TEvDescribeTenantOptionsRequest(ctx));
- })
-
-#undef ADD_REQUEST
-}
-
-} // namespace NGRpcService
-} // namespace NKikimr
+ ActorSystem_->Send(GRpcRequestProxyId_, new TEvRemoveTenantRequest(ctx));
+ })
+ ADD_REQUEST(DescribeDatabaseOptions, DescribeDatabaseOptionsRequest, DescribeDatabaseOptionsResponse, {
+ ActorSystem_->Send(GRpcRequestProxyId_, new TEvDescribeTenantOptionsRequest(ctx));
+ })
+
+#undef ADD_REQUEST
+}
+
+} // namespace NGRpcService
+} // namespace NKikimr
diff --git a/ydb/services/cms/grpc_service.h b/ydb/services/cms/grpc_service.h
index ddbccc297cf..80f3bbe9283 100644
--- a/ydb/services/cms/grpc_service.h
+++ b/ydb/services/cms/grpc_service.h
@@ -1,37 +1,37 @@
-#pragma once
-
+#pragma once
+
#include <library/cpp/actors/core/actorsystem.h>
#include <library/cpp/grpc/server/grpc_server.h>
#include <ydb/public/api/grpc/ydb_cms_v1.grpc.pb.h>
-
-
-namespace NKikimr {
-namespace NGRpcService {
-
-class TGRpcCmsService
+
+
+namespace NKikimr {
+namespace NGRpcService {
+
+class TGRpcCmsService
: public NGrpc::TGrpcServiceBase<Ydb::Cms::V1::CmsService>
-{
-public:
- TGRpcCmsService(NActors::TActorSystem* system,
- TIntrusivePtr<NMonitoring::TDynamicCounters> counters,
+{
+public:
+ TGRpcCmsService(NActors::TActorSystem* system,
+ TIntrusivePtr<NMonitoring::TDynamicCounters> counters,
NActors::TActorId id);
-
+
void InitService(grpc::ServerCompletionQueue* cq, NGrpc::TLoggerPtr logger) override;
void SetGlobalLimiterHandle(NGrpc::TGlobalLimiter* limiter) override;
-
- bool IncRequest();
- void DecRequest();
-
- private:
+
+ bool IncRequest();
+ void DecRequest();
+
+ private:
void SetupIncomingRequests(NGrpc::TLoggerPtr logger);
-
- NActors::TActorSystem* ActorSystem_;
+
+ NActors::TActorSystem* ActorSystem_;
grpc::ServerCompletionQueue* CQ_ = nullptr;
-
- TIntrusivePtr<NMonitoring::TDynamicCounters> Counters_;
+
+ TIntrusivePtr<NMonitoring::TDynamicCounters> Counters_;
NActors::TActorId GRpcRequestProxyId_;
NGrpc::TGlobalLimiter* Limiter_ = nullptr;
-};
-
-} // namespace NGRpcService
-} // namespace NKikimr
+};
+
+} // namespace NGRpcService
+} // namespace NKikimr
diff --git a/ydb/services/cms/ut/ya.make b/ydb/services/cms/ut/ya.make
index ad193f878f7..646ff009e90 100644
--- a/ydb/services/cms/ut/ya.make
+++ b/ydb/services/cms/ut/ya.make
@@ -1,26 +1,26 @@
UNITTEST_FOR(ydb/services/cms)
-OWNER(g:kikimr)
-
-FORK_SUBTESTS()
-
-IF (SANITIZER_TYPE OR WITH_VALGRIND)
- SIZE(MEDIUM)
-ENDIF()
-
-SRCS(
- cms_ut.cpp
-)
-
-PEERDIR(
+OWNER(g:kikimr)
+
+FORK_SUBTESTS()
+
+IF (SANITIZER_TYPE OR WITH_VALGRIND)
+ SIZE(MEDIUM)
+ENDIF()
+
+SRCS(
+ cms_ut.cpp
+)
+
+PEERDIR(
library/cpp/getopt
library/cpp/grpc/client
library/cpp/regex/pcre
library/cpp/svnversion
ydb/core/testlib
ydb/services/cms
-)
-
+)
+
YQL_LAST_ABI_VERSION()
-END()
+END()
diff --git a/ydb/services/cms/ya.make b/ydb/services/cms/ya.make
index b0f791dbba5..7a5f822d624 100644
--- a/ydb/services/cms/ya.make
+++ b/ydb/services/cms/ya.make
@@ -1,12 +1,12 @@
-LIBRARY()
-
-OWNER(g:kikimr)
-
-SRCS(
- grpc_service.cpp
-)
-
-PEERDIR(
+LIBRARY()
+
+OWNER(g:kikimr)
+
+SRCS(
+ grpc_service.cpp
+)
+
+PEERDIR(
library/cpp/grpc/server
ydb/core/grpc_services
ydb/core/mind
@@ -14,9 +14,9 @@ PEERDIR(
ydb/public/api/grpc
ydb/public/lib/operation_id
ydb/public/sdk/cpp/client/resources
-)
-
-END()
+)
+
+END()
RECURSE_FOR_TESTS(
ut
diff --git a/ydb/services/ydb/ydb_common_ut.h b/ydb/services/ydb/ydb_common_ut.h
index bcd4d521e74..c067928c785 100644
--- a/ydb/services/ydb/ydb_common_ut.h
+++ b/ydb/services/ydb/ydb_common_ut.h
@@ -52,10 +52,10 @@ public:
{
ui16 port = PortManager.GetPort(2134);
ui16 grpc = PortManager.GetPort(2135);
- ServerSettings = new TServerSettings(port);
+ ServerSettings = new TServerSettings(port);
ServerSettings->SetGrpcPort(grpc);
- ServerSettings->SetLogBackend(logBackend);
- ServerSettings->SetDomainName("Root");
+ ServerSettings->SetLogBackend(logBackend);
+ ServerSettings->SetDomainName("Root");
ServerSettings->SetDynamicNodeCount(2);
if (TestSettings::PrecreatePools) {
ServerSettings->AddStoragePool("ssd");
@@ -93,7 +93,7 @@ public:
Server_.Reset(new TServer(*ServerSettings));
Tenants_.Reset(new Tests::TTenants(Server_));
-
+
//Server_->GetRuntime()->SetLogPriority(NKikimrServices::TX_PROXY_SCHEME_CACHE, NActors::NLog::PRI_DEBUG);
//Server_->GetRuntime()->SetLogPriority(NKikimrServices::SCHEME_BOARD_REPLICA, NActors::NLog::PRI_DEBUG);
Server_->GetRuntime()->SetLogPriority(NKikimrServices::FLAT_TX_SCHEMESHARD, NActors::NLog::PRI_INFO);
@@ -118,7 +118,7 @@ public:
}
Server_->EnableGRpc(grpcOption);
- TClient annoyingClient(*ServerSettings);
+ TClient annoyingClient(*ServerSettings);
if (ServerSettings->AppConfig.GetDomainsConfig().GetSecurityConfig().GetEnforceUserTokenRequirement()) {
annoyingClient.SetSecurityToken("root@builtin");
}
@@ -148,7 +148,7 @@ public:
return *Server_;
}
- TServerSettings::TPtr ServerSettings;
+ TServerSettings::TPtr ServerSettings;
Tests::TServer::TPtr Server_;
THolder<Tests::TTenants> Tenants_;
private:
diff --git a/ydb/services/ydb/ydb_table.cpp b/ydb/services/ydb/ydb_table.cpp
index f73ac382608..7189614b8e8 100644
--- a/ydb/services/ydb/ydb_table.cpp
+++ b/ydb/services/ydb/ydb_table.cpp
@@ -106,9 +106,9 @@ void TGRpcYdbTableService::SetupIncomingRequests(NGrpc::TLoggerPtr logger) {
ADD_REQUEST(RollbackTransaction, RollbackTransactionRequest, RollbackTransactionResponse, {
ActorSystem_->Send(GRpcRequestProxyId_, new TEvRollbackTransactionRequest(ctx));
})
- ADD_REQUEST(DescribeTableOptions, DescribeTableOptionsRequest, DescribeTableOptionsResponse, {
- ActorSystem_->Send(GRpcRequestProxyId_, new TEvDescribeTableOptionsRequest(ctx));
- })
+ ADD_REQUEST(DescribeTableOptions, DescribeTableOptionsRequest, DescribeTableOptionsResponse, {
+ ActorSystem_->Send(GRpcRequestProxyId_, new TEvDescribeTableOptionsRequest(ctx));
+ })
ADD_REQUEST(BulkUpsert, BulkUpsertRequest, BulkUpsertResponse, {
ActorSystem_->Send(GRpcRequestProxyId_, new TEvBulkUpsertRequest(ctx));
})
diff --git a/ydb/services/ydb/ydb_table_ut.cpp b/ydb/services/ydb/ydb_table_ut.cpp
index 7c7659a2f5e..4861c06b92e 100644
--- a/ydb/services/ydb/ydb_table_ut.cpp
+++ b/ydb/services/ydb/ydb_table_ut.cpp
@@ -622,7 +622,7 @@ Y_UNIT_TEST_SUITE(YdbYqlClient) {
auto session = CreateSession(connection);
auto result = session.ExecuteDataQuery(R"___(
- SELECT CAST("184467440737.12345678" as Decimal(22,9));
+ SELECT CAST("184467440737.12345678" as Decimal(22,9));
)___", TTxControl::BeginTx(TTxSettings::SerializableRW()).CommitTx()).ExtractValueSync();
UNIT_ASSERT_EQUAL(result.IsTransportError(), false);
@@ -665,7 +665,7 @@ Y_UNIT_TEST_SUITE(YdbYqlClient) {
auto tableBuilder = client.GetTableBuilder();
tableBuilder
.AddNullableColumn("Key", EPrimitiveType::Int32)
- .AddNullableColumn("Value", TDecimalType(22,9));
+ .AddNullableColumn("Value", TDecimalType(22,9));
tableBuilder.SetPrimaryKeyColumn("Key");
auto result = session.CreateTable("/Root/FooTable", tableBuilder.Build()).ExtractValueSync();
UNIT_ASSERT_EQUAL(result.IsTransportError(), false);
@@ -674,7 +674,7 @@ Y_UNIT_TEST_SUITE(YdbYqlClient) {
{
TString query = R"___(
- DECLARE $Value AS "Decimal(22,9)";
+ DECLARE $Value AS "Decimal(22,9)";
DECLARE $Key AS Int32;
UPSERT INTO [Root/FooTable] (Key, Value) VALUES
($Key, $Value);
diff --git a/ydb/services/ydb/ydb_ut.cpp b/ydb/services/ydb/ydb_ut.cpp
index 7d521262b8d..2d370630799 100644
--- a/ydb/services/ydb/ydb_ut.cpp
+++ b/ydb/services/ydb/ydb_ut.cpp
@@ -31,8 +31,8 @@
#include "ydb_common_ut.h"
-#include <util/generic/ymath.h>
-
+#include <util/generic/ymath.h>
+
namespace NKikimr {
using namespace Tests;
@@ -3179,8 +3179,8 @@ tx_meta {
}
}
-namespace {
-
+namespace {
+
NKikimrSchemeOp::TCompactionPolicy DEFAULT_COMPACTION_POLICY;
NKikimrSchemeOp::TCompactionPolicy COMPACTION_POLICY1;
NKikimrSchemeOp::TCompactionPolicy COMPACTION_POLICY2;
@@ -3188,26 +3188,26 @@ NKikimrSchemeOp::TPipelineConfig PIPELINE_CONFIG1;
NKikimrSchemeOp::TPipelineConfig PIPELINE_CONFIG2;
NKikimrSchemeOp::TStorageConfig STORAGE_CONFIG1;
NKikimrSchemeOp::TStorageConfig STORAGE_CONFIG2;
-NKikimrConfig::TExecutionPolicy EXECUTION_POLICY1;
-NKikimrConfig::TExecutionPolicy EXECUTION_POLICY2;
-NKikimrConfig::TPartitioningPolicy PARTITIONING_POLICY1;
-NKikimrConfig::TPartitioningPolicy PARTITIONING_POLICY2;
-NKikimrConfig::TStoragePolicy STORAGE_POLICY1;
-NKikimrConfig::TStoragePolicy STORAGE_POLICY2;
-NKikimrConfig::TReplicationPolicy REPLICATION_POLICY1;
-NKikimrConfig::TReplicationPolicy REPLICATION_POLICY2;
-NKikimrConfig::TCachingPolicy CACHING_POLICY1;
-NKikimrConfig::TCachingPolicy CACHING_POLICY2;
-
-TStoragePools CreatePoolsForTenant(TClient& client, const TDomainsInfo::TDomain::TStoragePoolKinds& pool_types, const TString& tenant)
-{
- TStoragePools result;
- for (auto& poolType: pool_types) {
- auto& poolKind = poolType.first;
- result.emplace_back(client.CreateStoragePool(poolKind, tenant), poolKind);
- }
- return result;
-}
+NKikimrConfig::TExecutionPolicy EXECUTION_POLICY1;
+NKikimrConfig::TExecutionPolicy EXECUTION_POLICY2;
+NKikimrConfig::TPartitioningPolicy PARTITIONING_POLICY1;
+NKikimrConfig::TPartitioningPolicy PARTITIONING_POLICY2;
+NKikimrConfig::TStoragePolicy STORAGE_POLICY1;
+NKikimrConfig::TStoragePolicy STORAGE_POLICY2;
+NKikimrConfig::TReplicationPolicy REPLICATION_POLICY1;
+NKikimrConfig::TReplicationPolicy REPLICATION_POLICY2;
+NKikimrConfig::TCachingPolicy CACHING_POLICY1;
+NKikimrConfig::TCachingPolicy CACHING_POLICY2;
+
+TStoragePools CreatePoolsForTenant(TClient& client, const TDomainsInfo::TDomain::TStoragePoolKinds& pool_types, const TString& tenant)
+{
+ TStoragePools result;
+ for (auto& poolType: pool_types) {
+ auto& poolKind = poolType.first;
+ result.emplace_back(client.CreateStoragePool(poolKind, tenant), poolKind);
+ }
+ return result;
+}
NKikimrSubDomains::TSubDomainSettings GetSubDomainDeclarationSetting(const TString& name)
{
@@ -3216,22 +3216,22 @@ NKikimrSubDomains::TSubDomainSettings GetSubDomainDeclarationSetting(const TStri
return subdomain;
}
-NKikimrSubDomains::TSubDomainSettings GetSubDomainDefaultSetting(const TString& name, const TStoragePools& pools = {})
-{
- NKikimrSubDomains::TSubDomainSettings subdomain;
- subdomain.SetName(name);
- subdomain.SetCoordinators(1);
- subdomain.SetMediators(1);
- subdomain.SetPlanResolution(10);
- subdomain.SetTimeCastBucketsPerMediator(2);
- for (auto& pool: pools) {
- *subdomain.AddStoragePools() = pool;
- }
- return subdomain;
+NKikimrSubDomains::TSubDomainSettings GetSubDomainDefaultSetting(const TString& name, const TStoragePools& pools = {})
+{
+ NKikimrSubDomains::TSubDomainSettings subdomain;
+ subdomain.SetName(name);
+ subdomain.SetCoordinators(1);
+ subdomain.SetMediators(1);
+ subdomain.SetPlanResolution(10);
+ subdomain.SetTimeCastBucketsPerMediator(2);
+ for (auto& pool: pools) {
+ *subdomain.AddStoragePools() = pool;
+ }
+ return subdomain;
}
-void InitConfigs(TKikimrWithGrpcAndRootSchema &server) {
- {
+void InitConfigs(TKikimrWithGrpcAndRootSchema &server) {
+ {
TString tenant_name = "ydb_ut_tenant";
TString tenant = Sprintf("/Root/%s", tenant_name.c_str());
@@ -3248,412 +3248,412 @@ void InitConfigs(TKikimrWithGrpcAndRootSchema &server) {
}
{
- NLocalDb::TCompactionPolicyPtr policy = NLocalDb::CreateDefaultUserTablePolicy();
- DEFAULT_COMPACTION_POLICY.Clear();
- policy->Serialize(DEFAULT_COMPACTION_POLICY);
- }
-
- {
- NLocalDb::TCompactionPolicy policy;
- policy.Generations.push_back({0, 8, 8, 128 * 1024 * 1024, NLocalDb::LegacyQueueIdToTaskName(1), true});
- COMPACTION_POLICY1.Clear();
- policy.Serialize(COMPACTION_POLICY1);
- }
-
- {
- NLocalDb::TCompactionPolicy policy;
- policy.Generations.push_back({0, 8, 8, 128 * 1024 * 1024, NLocalDb::LegacyQueueIdToTaskName(1), true});
- policy.Generations.push_back({40 * 1024 * 1024, 5, 16, 512 * 1024 * 1024, NLocalDb::LegacyQueueIdToTaskName(2), false});
- COMPACTION_POLICY2.Clear();
- policy.Serialize(COMPACTION_POLICY2);
- }
-
- {
- PIPELINE_CONFIG1.Clear();
- PIPELINE_CONFIG1.SetNumActiveTx(1);
- PIPELINE_CONFIG1.SetEnableOutOfOrder(false);
- PIPELINE_CONFIG1.SetDisableImmediate(false);
- PIPELINE_CONFIG1.SetEnableSoftUpdates(true);
- }
-
- {
- PIPELINE_CONFIG2.Clear();
- PIPELINE_CONFIG2.SetNumActiveTx(8);
- PIPELINE_CONFIG2.SetEnableOutOfOrder(true);
- PIPELINE_CONFIG2.SetDisableImmediate(true);
- PIPELINE_CONFIG2.SetEnableSoftUpdates(false);
- }
-
- {
- EXECUTION_POLICY1.Clear();
- EXECUTION_POLICY1.MutablePipelineConfig()->CopyFrom(PIPELINE_CONFIG1);
- EXECUTION_POLICY1.SetResourceProfile("profile1");
- EXECUTION_POLICY1.SetEnableFilterByKey(true);
- EXECUTION_POLICY1.SetExecutorFastLogPolicy(false);
- EXECUTION_POLICY1.SetTxReadSizeLimit(10000000);
- }
- {
- EXECUTION_POLICY2.Clear();
- EXECUTION_POLICY2.MutablePipelineConfig()->CopyFrom(PIPELINE_CONFIG2);
- EXECUTION_POLICY2.SetResourceProfile("profile2");
- EXECUTION_POLICY2.SetEnableFilterByKey(false);
- EXECUTION_POLICY2.SetExecutorFastLogPolicy(true);
- EXECUTION_POLICY2.SetTxReadSizeLimit(20000000);
- }
-
- {
- PARTITIONING_POLICY1.Clear();
- PARTITIONING_POLICY1.SetUniformPartitionsCount(10);
- PARTITIONING_POLICY1.SetAutoSplit(true);
- PARTITIONING_POLICY1.SetAutoMerge(false);
- PARTITIONING_POLICY1.SetSizeToSplit(123456);
- }
-
- {
- PARTITIONING_POLICY2.Clear();
- PARTITIONING_POLICY2.SetUniformPartitionsCount(20);
- PARTITIONING_POLICY2.SetAutoSplit(true);
- PARTITIONING_POLICY2.SetAutoMerge(true);
- PARTITIONING_POLICY2.SetSizeToSplit(1000000000);
- }
-
- {
- STORAGE_CONFIG1.Clear();
- STORAGE_CONFIG1.MutableSysLog()->SetPreferredPoolKind("hdd");
- STORAGE_CONFIG1.MutableLog()->SetPreferredPoolKind("hdd");
- STORAGE_CONFIG1.MutableData()->SetPreferredPoolKind("hdd");
- STORAGE_CONFIG1.MutableExternal()->SetPreferredPoolKind("hdd");
+ NLocalDb::TCompactionPolicyPtr policy = NLocalDb::CreateDefaultUserTablePolicy();
+ DEFAULT_COMPACTION_POLICY.Clear();
+ policy->Serialize(DEFAULT_COMPACTION_POLICY);
+ }
+
+ {
+ NLocalDb::TCompactionPolicy policy;
+ policy.Generations.push_back({0, 8, 8, 128 * 1024 * 1024, NLocalDb::LegacyQueueIdToTaskName(1), true});
+ COMPACTION_POLICY1.Clear();
+ policy.Serialize(COMPACTION_POLICY1);
+ }
+
+ {
+ NLocalDb::TCompactionPolicy policy;
+ policy.Generations.push_back({0, 8, 8, 128 * 1024 * 1024, NLocalDb::LegacyQueueIdToTaskName(1), true});
+ policy.Generations.push_back({40 * 1024 * 1024, 5, 16, 512 * 1024 * 1024, NLocalDb::LegacyQueueIdToTaskName(2), false});
+ COMPACTION_POLICY2.Clear();
+ policy.Serialize(COMPACTION_POLICY2);
+ }
+
+ {
+ PIPELINE_CONFIG1.Clear();
+ PIPELINE_CONFIG1.SetNumActiveTx(1);
+ PIPELINE_CONFIG1.SetEnableOutOfOrder(false);
+ PIPELINE_CONFIG1.SetDisableImmediate(false);
+ PIPELINE_CONFIG1.SetEnableSoftUpdates(true);
+ }
+
+ {
+ PIPELINE_CONFIG2.Clear();
+ PIPELINE_CONFIG2.SetNumActiveTx(8);
+ PIPELINE_CONFIG2.SetEnableOutOfOrder(true);
+ PIPELINE_CONFIG2.SetDisableImmediate(true);
+ PIPELINE_CONFIG2.SetEnableSoftUpdates(false);
+ }
+
+ {
+ EXECUTION_POLICY1.Clear();
+ EXECUTION_POLICY1.MutablePipelineConfig()->CopyFrom(PIPELINE_CONFIG1);
+ EXECUTION_POLICY1.SetResourceProfile("profile1");
+ EXECUTION_POLICY1.SetEnableFilterByKey(true);
+ EXECUTION_POLICY1.SetExecutorFastLogPolicy(false);
+ EXECUTION_POLICY1.SetTxReadSizeLimit(10000000);
+ }
+ {
+ EXECUTION_POLICY2.Clear();
+ EXECUTION_POLICY2.MutablePipelineConfig()->CopyFrom(PIPELINE_CONFIG2);
+ EXECUTION_POLICY2.SetResourceProfile("profile2");
+ EXECUTION_POLICY2.SetEnableFilterByKey(false);
+ EXECUTION_POLICY2.SetExecutorFastLogPolicy(true);
+ EXECUTION_POLICY2.SetTxReadSizeLimit(20000000);
+ }
+
+ {
+ PARTITIONING_POLICY1.Clear();
+ PARTITIONING_POLICY1.SetUniformPartitionsCount(10);
+ PARTITIONING_POLICY1.SetAutoSplit(true);
+ PARTITIONING_POLICY1.SetAutoMerge(false);
+ PARTITIONING_POLICY1.SetSizeToSplit(123456);
+ }
+
+ {
+ PARTITIONING_POLICY2.Clear();
+ PARTITIONING_POLICY2.SetUniformPartitionsCount(20);
+ PARTITIONING_POLICY2.SetAutoSplit(true);
+ PARTITIONING_POLICY2.SetAutoMerge(true);
+ PARTITIONING_POLICY2.SetSizeToSplit(1000000000);
+ }
+
+ {
+ STORAGE_CONFIG1.Clear();
+ STORAGE_CONFIG1.MutableSysLog()->SetPreferredPoolKind("hdd");
+ STORAGE_CONFIG1.MutableLog()->SetPreferredPoolKind("hdd");
+ STORAGE_CONFIG1.MutableData()->SetPreferredPoolKind("hdd");
+ STORAGE_CONFIG1.MutableExternal()->SetPreferredPoolKind("hdd");
STORAGE_CONFIG1.SetExternalThreshold(Max<ui32>());
- }
-
- {
- STORAGE_CONFIG2.Clear();
- STORAGE_CONFIG2.MutableSysLog()->SetPreferredPoolKind("ssd");
- STORAGE_CONFIG2.MutableLog()->SetPreferredPoolKind("ssd");
- STORAGE_CONFIG2.MutableData()->SetPreferredPoolKind("ssd");
- STORAGE_CONFIG2.MutableExternal()->SetPreferredPoolKind("ssd");
- STORAGE_CONFIG2.SetDataThreshold(30000);
- }
-
- {
- REPLICATION_POLICY1.Clear();
+ }
+
+ {
+ STORAGE_CONFIG2.Clear();
+ STORAGE_CONFIG2.MutableSysLog()->SetPreferredPoolKind("ssd");
+ STORAGE_CONFIG2.MutableLog()->SetPreferredPoolKind("ssd");
+ STORAGE_CONFIG2.MutableData()->SetPreferredPoolKind("ssd");
+ STORAGE_CONFIG2.MutableExternal()->SetPreferredPoolKind("ssd");
+ STORAGE_CONFIG2.SetDataThreshold(30000);
+ }
+
+ {
+ REPLICATION_POLICY1.Clear();
REPLICATION_POLICY1.SetFollowerCount(1);
- REPLICATION_POLICY1.SetCrossDataCenter(true);
+ REPLICATION_POLICY1.SetCrossDataCenter(true);
REPLICATION_POLICY1.SetAllowFollowerPromotion(false);
- }
-
- {
- REPLICATION_POLICY2.Clear();
+ }
+
+ {
+ REPLICATION_POLICY2.Clear();
REPLICATION_POLICY2.SetFollowerCount(2);
- REPLICATION_POLICY2.SetCrossDataCenter(false);
+ REPLICATION_POLICY2.SetCrossDataCenter(false);
REPLICATION_POLICY2.SetAllowFollowerPromotion(true);
- }
-
- {
- CACHING_POLICY1.Clear();
- CACHING_POLICY1.SetExecutorCacheSize(10000000);
- }
-
- {
- CACHING_POLICY2.Clear();
- CACHING_POLICY2.SetExecutorCacheSize(20000000);
- }
-
- {
- STORAGE_POLICY1.Clear();
- auto &family = *STORAGE_POLICY1.AddColumnFamilies();
- family.SetId(0);
+ }
+
+ {
+ CACHING_POLICY1.Clear();
+ CACHING_POLICY1.SetExecutorCacheSize(10000000);
+ }
+
+ {
+ CACHING_POLICY2.Clear();
+ CACHING_POLICY2.SetExecutorCacheSize(20000000);
+ }
+
+ {
+ STORAGE_POLICY1.Clear();
+ auto &family = *STORAGE_POLICY1.AddColumnFamilies();
+ family.SetId(0);
family.SetColumnCodec(NKikimrSchemeOp::ColumnCodecLZ4);
- family.MutableStorageConfig()->CopyFrom(STORAGE_CONFIG1);
- }
-
- {
- STORAGE_POLICY2.Clear();
- auto &family = *STORAGE_POLICY2.AddColumnFamilies();
- family.SetId(0);
+ family.MutableStorageConfig()->CopyFrom(STORAGE_CONFIG1);
+ }
+
+ {
+ STORAGE_POLICY2.Clear();
+ auto &family = *STORAGE_POLICY2.AddColumnFamilies();
+ family.SetId(0);
family.SetColumnCache(NKikimrSchemeOp::ColumnCacheEver);
- family.MutableStorageConfig()->CopyFrom(STORAGE_CONFIG2);
- }
-
- TClient client(*server.ServerSettings);
- TAutoPtr<NMsgBusProxy::TBusConsoleRequest> request(new NMsgBusProxy::TBusConsoleRequest());
- auto &item = *request->Record.MutableConfigureRequest()->AddActions()
- ->MutableAddConfigItem()->MutableConfigItem();
- item.SetKind((ui32)NKikimrConsole::TConfigItem::TableProfilesConfigItem);
- auto &profiles = *item.MutableConfig()->MutableTableProfilesConfig();
- {
- auto &policy = *profiles.AddCompactionPolicies();
- policy.SetName("default");
- }
- {
- auto &policy = *profiles.AddCompactionPolicies();
- policy.SetName("compaction1");
- policy.MutableCompactionPolicy()->CopyFrom(COMPACTION_POLICY1);
- }
- {
- auto &policy = *profiles.AddCompactionPolicies();
- policy.SetName("compaction2");
- policy.MutableCompactionPolicy()->CopyFrom(COMPACTION_POLICY2);
- }
- {
- auto &policy = *profiles.AddExecutionPolicies();
- policy.SetName("default");
- }
- {
- auto &policy = *profiles.AddExecutionPolicies();
- policy.CopyFrom(EXECUTION_POLICY1);
- policy.SetName("execution1");
- }
- {
- auto &policy = *profiles.AddExecutionPolicies();
- policy.CopyFrom(EXECUTION_POLICY2);
- policy.SetName("execution2");
- }
- {
- auto &policy = *profiles.AddPartitioningPolicies();
- policy.SetName("default");
- }
- {
- auto &policy = *profiles.AddPartitioningPolicies();
- policy.CopyFrom(PARTITIONING_POLICY1);
- policy.SetName("partitioning1");
- }
- {
- auto &policy = *profiles.AddPartitioningPolicies();
- policy.CopyFrom(PARTITIONING_POLICY2);
- policy.SetName("partitioning2");
- }
- {
- auto &policy = *profiles.AddStoragePolicies();
- policy.SetName("default");
- }
- {
- auto &policy = *profiles.AddStoragePolicies();
- policy.CopyFrom(STORAGE_POLICY1);
- policy.SetName("storage1");
- }
- {
- auto &policy = *profiles.AddStoragePolicies();
- policy.CopyFrom(STORAGE_POLICY2);
- policy.SetName("storage2");
- }
- {
- auto &policy = *profiles.AddReplicationPolicies();
- policy.SetName("default");
- }
- {
- auto &policy = *profiles.AddReplicationPolicies();
- policy.CopyFrom(REPLICATION_POLICY1);
- policy.SetName("replication1");
- }
- {
- auto &policy = *profiles.AddReplicationPolicies();
- policy.CopyFrom(REPLICATION_POLICY2);
- policy.SetName("replication2");
- }
- {
- auto &policy = *profiles.AddCachingPolicies();
- policy.SetName("default");
- }
- {
- auto &policy = *profiles.AddCachingPolicies();
- policy.CopyFrom(CACHING_POLICY1);
- policy.SetName("caching1");
- }
- {
- auto &policy = *profiles.AddCachingPolicies();
- policy.CopyFrom(CACHING_POLICY2);
- policy.SetName("caching2");
- }
- {
- auto &profile = *profiles.AddTableProfiles();
- profile.SetName("default");
- profile.SetCompactionPolicy("default");
- profile.SetExecutionPolicy("default");
- profile.SetPartitioningPolicy("default");
- profile.SetStoragePolicy("default");
- profile.SetReplicationPolicy("default");
- profile.SetCachingPolicy("default");
- }
- {
- auto &profile = *profiles.AddTableProfiles();
- profile.SetName("profile1");
- profile.SetCompactionPolicy("compaction1");
- profile.SetExecutionPolicy("execution1");
- profile.SetPartitioningPolicy("partitioning1");
- profile.SetStoragePolicy("storage1");
- profile.SetReplicationPolicy("replication1");
- profile.SetCachingPolicy("caching1");
- }
- {
- auto &profile = *profiles.AddTableProfiles();
- profile.SetName("profile2");
- profile.SetCompactionPolicy("compaction2");
- profile.SetExecutionPolicy("execution2");
- profile.SetPartitioningPolicy("partitioning2");
- profile.SetStoragePolicy("storage2");
- profile.SetReplicationPolicy("replication2");
- profile.SetCachingPolicy("caching2");
- }
- TAutoPtr<NBus::TBusMessage> reply;
- NBus::EMessageStatus msgStatus = client.SyncCall(request, reply);
- UNIT_ASSERT_VALUES_EQUAL(msgStatus, NBus::MESSAGE_OK);
- auto resp = dynamic_cast<NMsgBusProxy::TBusConsoleResponse*>(reply.Get())->Record;
- UNIT_ASSERT_VALUES_EQUAL(resp.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
-}
-
-void CheckTableSettings(const TKikimrWithGrpcAndRootSchema &server,
- const TString &path,
+ family.MutableStorageConfig()->CopyFrom(STORAGE_CONFIG2);
+ }
+
+ TClient client(*server.ServerSettings);
+ TAutoPtr<NMsgBusProxy::TBusConsoleRequest> request(new NMsgBusProxy::TBusConsoleRequest());
+ auto &item = *request->Record.MutableConfigureRequest()->AddActions()
+ ->MutableAddConfigItem()->MutableConfigItem();
+ item.SetKind((ui32)NKikimrConsole::TConfigItem::TableProfilesConfigItem);
+ auto &profiles = *item.MutableConfig()->MutableTableProfilesConfig();
+ {
+ auto &policy = *profiles.AddCompactionPolicies();
+ policy.SetName("default");
+ }
+ {
+ auto &policy = *profiles.AddCompactionPolicies();
+ policy.SetName("compaction1");
+ policy.MutableCompactionPolicy()->CopyFrom(COMPACTION_POLICY1);
+ }
+ {
+ auto &policy = *profiles.AddCompactionPolicies();
+ policy.SetName("compaction2");
+ policy.MutableCompactionPolicy()->CopyFrom(COMPACTION_POLICY2);
+ }
+ {
+ auto &policy = *profiles.AddExecutionPolicies();
+ policy.SetName("default");
+ }
+ {
+ auto &policy = *profiles.AddExecutionPolicies();
+ policy.CopyFrom(EXECUTION_POLICY1);
+ policy.SetName("execution1");
+ }
+ {
+ auto &policy = *profiles.AddExecutionPolicies();
+ policy.CopyFrom(EXECUTION_POLICY2);
+ policy.SetName("execution2");
+ }
+ {
+ auto &policy = *profiles.AddPartitioningPolicies();
+ policy.SetName("default");
+ }
+ {
+ auto &policy = *profiles.AddPartitioningPolicies();
+ policy.CopyFrom(PARTITIONING_POLICY1);
+ policy.SetName("partitioning1");
+ }
+ {
+ auto &policy = *profiles.AddPartitioningPolicies();
+ policy.CopyFrom(PARTITIONING_POLICY2);
+ policy.SetName("partitioning2");
+ }
+ {
+ auto &policy = *profiles.AddStoragePolicies();
+ policy.SetName("default");
+ }
+ {
+ auto &policy = *profiles.AddStoragePolicies();
+ policy.CopyFrom(STORAGE_POLICY1);
+ policy.SetName("storage1");
+ }
+ {
+ auto &policy = *profiles.AddStoragePolicies();
+ policy.CopyFrom(STORAGE_POLICY2);
+ policy.SetName("storage2");
+ }
+ {
+ auto &policy = *profiles.AddReplicationPolicies();
+ policy.SetName("default");
+ }
+ {
+ auto &policy = *profiles.AddReplicationPolicies();
+ policy.CopyFrom(REPLICATION_POLICY1);
+ policy.SetName("replication1");
+ }
+ {
+ auto &policy = *profiles.AddReplicationPolicies();
+ policy.CopyFrom(REPLICATION_POLICY2);
+ policy.SetName("replication2");
+ }
+ {
+ auto &policy = *profiles.AddCachingPolicies();
+ policy.SetName("default");
+ }
+ {
+ auto &policy = *profiles.AddCachingPolicies();
+ policy.CopyFrom(CACHING_POLICY1);
+ policy.SetName("caching1");
+ }
+ {
+ auto &policy = *profiles.AddCachingPolicies();
+ policy.CopyFrom(CACHING_POLICY2);
+ policy.SetName("caching2");
+ }
+ {
+ auto &profile = *profiles.AddTableProfiles();
+ profile.SetName("default");
+ profile.SetCompactionPolicy("default");
+ profile.SetExecutionPolicy("default");
+ profile.SetPartitioningPolicy("default");
+ profile.SetStoragePolicy("default");
+ profile.SetReplicationPolicy("default");
+ profile.SetCachingPolicy("default");
+ }
+ {
+ auto &profile = *profiles.AddTableProfiles();
+ profile.SetName("profile1");
+ profile.SetCompactionPolicy("compaction1");
+ profile.SetExecutionPolicy("execution1");
+ profile.SetPartitioningPolicy("partitioning1");
+ profile.SetStoragePolicy("storage1");
+ profile.SetReplicationPolicy("replication1");
+ profile.SetCachingPolicy("caching1");
+ }
+ {
+ auto &profile = *profiles.AddTableProfiles();
+ profile.SetName("profile2");
+ profile.SetCompactionPolicy("compaction2");
+ profile.SetExecutionPolicy("execution2");
+ profile.SetPartitioningPolicy("partitioning2");
+ profile.SetStoragePolicy("storage2");
+ profile.SetReplicationPolicy("replication2");
+ profile.SetCachingPolicy("caching2");
+ }
+ TAutoPtr<NBus::TBusMessage> reply;
+ NBus::EMessageStatus msgStatus = client.SyncCall(request, reply);
+ UNIT_ASSERT_VALUES_EQUAL(msgStatus, NBus::MESSAGE_OK);
+ auto resp = dynamic_cast<NMsgBusProxy::TBusConsoleResponse*>(reply.Get())->Record;
+ UNIT_ASSERT_VALUES_EQUAL(resp.GetStatus().GetCode(), Ydb::StatusIds::SUCCESS);
+}
+
+void CheckTableSettings(const TKikimrWithGrpcAndRootSchema &server,
+ const TString &path,
NKikimrSchemeOp::TTableDescription expected)
-{
- TClient client(*server.ServerSettings);
- auto desc = client.Ls(path)->Record.GetPathDescription();
+{
+ TClient client(*server.ServerSettings);
+ auto desc = client.Ls(path)->Record.GetPathDescription();
NKikimrSchemeOp::TTableDescription resp = desc.GetTable();
- // Table profiles affect only few fields. Clear other fields to simplify comparison.
- THashSet<ui32> affectedFields = {
- 7 // PartitionConfig
- };
-
- if (expected.HasUniformPartitionsCount()) {
- UNIT_ASSERT_VALUES_EQUAL(desc.TablePartitionsSize(), expected.GetUniformPartitionsCount());
- expected.ClearUniformPartitionsCount();
- } else {
- UNIT_ASSERT_VALUES_EQUAL(desc.TablePartitionsSize(), 1);
- }
-
- std::vector<const ::google::protobuf::FieldDescriptor*> fields;
- auto *reflection = resp.GetReflection();
- reflection->ListFields(resp, &fields);
- for (auto field : fields)
+ // Table profiles affect only few fields. Clear other fields to simplify comparison.
+ THashSet<ui32> affectedFields = {
+ 7 // PartitionConfig
+ };
+
+ if (expected.HasUniformPartitionsCount()) {
+ UNIT_ASSERT_VALUES_EQUAL(desc.TablePartitionsSize(), expected.GetUniformPartitionsCount());
+ expected.ClearUniformPartitionsCount();
+ } else {
+ UNIT_ASSERT_VALUES_EQUAL(desc.TablePartitionsSize(), 1);
+ }
+
+ std::vector<const ::google::protobuf::FieldDescriptor*> fields;
+ auto *reflection = resp.GetReflection();
+ reflection->ListFields(resp, &fields);
+ for (auto field : fields)
if (!affectedFields.contains(field->number()))
- reflection->ClearField(&resp, field);
-
- UNIT_ASSERT_VALUES_EQUAL(resp.DebugString(), expected.DebugString());
-}
-
-void CheckTablePartitions(const TKikimrWithGrpcAndRootSchema &server,
- const TString &path,
- const ::google::protobuf::RepeatedPtrField<Ydb::TypedValue> &points)
-{
- TClient client(*server.ServerSettings);
- auto desc = client.Ls(path)->Record.GetPathDescription();
-
- UNIT_ASSERT_VALUES_EQUAL(points.size(), desc.TablePartitionsSize() - 1);
- for (int i = 0; i < points.size(); ++i) {
- auto &bnd = desc.GetTablePartitions(i);
- auto &vals = points[i].value();
- auto &types = points[i].type();
-
- TSerializedCellVec vec;
- vec.Parse(bnd.GetEndOfRangeKeyPrefix());
- auto cells = vec.GetCells();
-
- UNIT_ASSERT_VALUES_EQUAL(cells.size(), vals.items_size());
- UNIT_ASSERT_VALUES_EQUAL(vals.items_size(), types.tuple_type().elements_size());
-
- for (size_t j = 0; j < cells.size(); ++j) {
- auto cell = cells[j];
- auto &val = vals.items(j);
- auto &type = types.tuple_type().elements(j);
- ui32 typeId = type.optional_type().item().type_id();
-
- TString cellStr;
- DbgPrintValue(cellStr, cell, typeId);
-
- TString valStr;
- switch (typeId) {
- case Ydb::Type::UINT64:
- valStr = ToString(val.uint64_value());
- break;
- case Ydb::Type::UTF8:
- valStr = ToString(val.text_value());
- break;
- case Ydb::Type::STRING:
- valStr = ToString(val.bytes_value());
- break;
- default:
- valStr = "UNKNOWN";
- }
-
- UNIT_ASSERT_VALUES_EQUAL(cellStr, valStr);
- Cout << cellStr << " " << valStr << Endl;
- }
- }
-}
-
+ reflection->ClearField(&resp, field);
+
+ UNIT_ASSERT_VALUES_EQUAL(resp.DebugString(), expected.DebugString());
+}
+
+void CheckTablePartitions(const TKikimrWithGrpcAndRootSchema &server,
+ const TString &path,
+ const ::google::protobuf::RepeatedPtrField<Ydb::TypedValue> &points)
+{
+ TClient client(*server.ServerSettings);
+ auto desc = client.Ls(path)->Record.GetPathDescription();
+
+ UNIT_ASSERT_VALUES_EQUAL(points.size(), desc.TablePartitionsSize() - 1);
+ for (int i = 0; i < points.size(); ++i) {
+ auto &bnd = desc.GetTablePartitions(i);
+ auto &vals = points[i].value();
+ auto &types = points[i].type();
+
+ TSerializedCellVec vec;
+ vec.Parse(bnd.GetEndOfRangeKeyPrefix());
+ auto cells = vec.GetCells();
+
+ UNIT_ASSERT_VALUES_EQUAL(cells.size(), vals.items_size());
+ UNIT_ASSERT_VALUES_EQUAL(vals.items_size(), types.tuple_type().elements_size());
+
+ for (size_t j = 0; j < cells.size(); ++j) {
+ auto cell = cells[j];
+ auto &val = vals.items(j);
+ auto &type = types.tuple_type().elements(j);
+ ui32 typeId = type.optional_type().item().type_id();
+
+ TString cellStr;
+ DbgPrintValue(cellStr, cell, typeId);
+
+ TString valStr;
+ switch (typeId) {
+ case Ydb::Type::UINT64:
+ valStr = ToString(val.uint64_value());
+ break;
+ case Ydb::Type::UTF8:
+ valStr = ToString(val.text_value());
+ break;
+ case Ydb::Type::STRING:
+ valStr = ToString(val.bytes_value());
+ break;
+ default:
+ valStr = "UNKNOWN";
+ }
+
+ UNIT_ASSERT_VALUES_EQUAL(cellStr, valStr);
+ Cout << cellStr << " " << valStr << Endl;
+ }
+ }
+}
+
void Apply(const NKikimrSchemeOp::TCompactionPolicy &policy,
NKikimrSchemeOp::TTableDescription &description)
-{
- description.MutablePartitionConfig()->MutableCompactionPolicy()->CopyFrom(policy);
-}
-
-void Apply(const NKikimrConfig::TExecutionPolicy &policy,
+{
+ description.MutablePartitionConfig()->MutableCompactionPolicy()->CopyFrom(policy);
+}
+
+void Apply(const NKikimrConfig::TExecutionPolicy &policy,
NKikimrSchemeOp::TTableDescription &description)
-{
- auto &partition = *description.MutablePartitionConfig();
-
- if (policy.HasPipelineConfig())
- partition.MutablePipelineConfig()->CopyFrom(policy.GetPipelineConfig());
- else
- partition.ClearPipelineConfig();
- if (policy.HasResourceProfile())
- partition.SetResourceProfile(policy.GetResourceProfile());
- else
- partition.ClearResourceProfile();
- if (policy.HasEnableFilterByKey())
- partition.SetEnableFilterByKey(policy.GetEnableFilterByKey());
- else
- partition.ClearEnableFilterByKey();
- if (policy.HasExecutorFastLogPolicy())
- partition.SetExecutorFastLogPolicy(policy.GetExecutorFastLogPolicy());
- else
- partition.ClearExecutorFastLogPolicy();
- if (policy.HasTxReadSizeLimit())
- partition.SetTxReadSizeLimit(policy.GetTxReadSizeLimit());
- else
- partition.ClearTxReadSizeLimit();
-}
-
-void Apply(const NKikimrConfig::TPartitioningPolicy &policy,
+{
+ auto &partition = *description.MutablePartitionConfig();
+
+ if (policy.HasPipelineConfig())
+ partition.MutablePipelineConfig()->CopyFrom(policy.GetPipelineConfig());
+ else
+ partition.ClearPipelineConfig();
+ if (policy.HasResourceProfile())
+ partition.SetResourceProfile(policy.GetResourceProfile());
+ else
+ partition.ClearResourceProfile();
+ if (policy.HasEnableFilterByKey())
+ partition.SetEnableFilterByKey(policy.GetEnableFilterByKey());
+ else
+ partition.ClearEnableFilterByKey();
+ if (policy.HasExecutorFastLogPolicy())
+ partition.SetExecutorFastLogPolicy(policy.GetExecutorFastLogPolicy());
+ else
+ partition.ClearExecutorFastLogPolicy();
+ if (policy.HasTxReadSizeLimit())
+ partition.SetTxReadSizeLimit(policy.GetTxReadSizeLimit());
+ else
+ partition.ClearTxReadSizeLimit();
+}
+
+void Apply(const NKikimrConfig::TPartitioningPolicy &policy,
NKikimrSchemeOp::TTableDescription &description)
-{
- auto &partition = *description.MutablePartitionConfig();
-
- if (policy.HasUniformPartitionsCount())
- description.SetUniformPartitionsCount(policy.GetUniformPartitionsCount());
- else
- description.ClearUniformPartitionsCount();
- if (policy.GetAutoSplit()) {
- partition.MutablePartitioningPolicy()->SetSizeToSplit(policy.GetSizeToSplit());
- if (policy.HasMaxPartitionsCount())
- partition.MutablePartitioningPolicy()->SetMaxPartitionsCount(policy.GetMaxPartitionsCount());
- else
- partition.MutablePartitioningPolicy()->ClearMaxPartitionsCount();
- if (policy.GetAutoMerge()) {
- partition.MutablePartitioningPolicy()->SetMinPartitionsCount(Max((ui32)1, policy.GetUniformPartitionsCount()));
- } else {
- partition.MutablePartitioningPolicy()->ClearMinPartitionsCount();
- }
- } else {
- partition.ClearPartitioningPolicy();
- }
-}
-
-void Apply(const NKikimrConfig::TStoragePolicy &policy,
+{
+ auto &partition = *description.MutablePartitionConfig();
+
+ if (policy.HasUniformPartitionsCount())
+ description.SetUniformPartitionsCount(policy.GetUniformPartitionsCount());
+ else
+ description.ClearUniformPartitionsCount();
+ if (policy.GetAutoSplit()) {
+ partition.MutablePartitioningPolicy()->SetSizeToSplit(policy.GetSizeToSplit());
+ if (policy.HasMaxPartitionsCount())
+ partition.MutablePartitioningPolicy()->SetMaxPartitionsCount(policy.GetMaxPartitionsCount());
+ else
+ partition.MutablePartitioningPolicy()->ClearMaxPartitionsCount();
+ if (policy.GetAutoMerge()) {
+ partition.MutablePartitioningPolicy()->SetMinPartitionsCount(Max((ui32)1, policy.GetUniformPartitionsCount()));
+ } else {
+ partition.MutablePartitioningPolicy()->ClearMinPartitionsCount();
+ }
+ } else {
+ partition.ClearPartitioningPolicy();
+ }
+}
+
+void Apply(const NKikimrConfig::TStoragePolicy &policy,
NKikimrSchemeOp::TTableDescription &description)
-{
- auto &partition = *description.MutablePartitionConfig();
-
- partition.ClearColumnFamilies();
- for (auto &family : policy.GetColumnFamilies())
- partition.AddColumnFamilies()->CopyFrom(family);
-}
-
-void Apply(const NKikimrConfig::TReplicationPolicy &policy,
+{
+ auto &partition = *description.MutablePartitionConfig();
+
+ partition.ClearColumnFamilies();
+ for (auto &family : policy.GetColumnFamilies())
+ partition.AddColumnFamilies()->CopyFrom(family);
+}
+
+void Apply(const NKikimrConfig::TReplicationPolicy &policy,
NKikimrSchemeOp::TTableDescription &description)
-{
- auto &partition = *description.MutablePartitionConfig();
-
+{
+ auto &partition = *description.MutablePartitionConfig();
+
partition.ClearFollowerCount();
partition.ClearCrossDataCenterFollowerCount();
partition.ClearAllowFollowerPromotion();
@@ -3669,173 +3669,173 @@ void Apply(const NKikimrConfig::TReplicationPolicy &policy,
if (policy.HasAllowFollowerPromotion()) {
followerGroup.SetAllowLeaderPromotion(policy.GetAllowFollowerPromotion());
}
- }
-}
-
-void Apply(const NKikimrConfig::TCachingPolicy &policy,
+ }
+}
+
+void Apply(const NKikimrConfig::TCachingPolicy &policy,
NKikimrSchemeOp::TTableDescription &description)
-{
- auto &partition = *description.MutablePartitionConfig();
-
- if (policy.HasExecutorCacheSize())
- partition.SetExecutorCacheSize(policy.GetExecutorCacheSize());
- else
- partition.ClearExecutorCacheSize();
-}
-
-void CreateTable(TKikimrWithGrpcAndRootSchema &server,
- const Ydb::Table::CreateTableRequest &request,
- Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
-{
- std::shared_ptr<grpc::Channel> Channel_;
- Channel_ = grpc::CreateChannel("localhost:" + ToString(server.GetPort()), grpc::InsecureChannelCredentials());
+{
+ auto &partition = *description.MutablePartitionConfig();
+
+ if (policy.HasExecutorCacheSize())
+ partition.SetExecutorCacheSize(policy.GetExecutorCacheSize());
+ else
+ partition.ClearExecutorCacheSize();
+}
+
+void CreateTable(TKikimrWithGrpcAndRootSchema &server,
+ const Ydb::Table::CreateTableRequest &request,
+ Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
+{
+ std::shared_ptr<grpc::Channel> Channel_;
+ Channel_ = grpc::CreateChannel("localhost:" + ToString(server.GetPort()), grpc::InsecureChannelCredentials());
std::unique_ptr<Ydb::Table::V1::TableService::Stub> Stub_;
Stub_ = Ydb::Table::V1::TableService::NewStub(Channel_);
- grpc::ClientContext context;
+ grpc::ClientContext context;
Ydb::Table::CreateTableResponse response;
- auto status = Stub_->CreateTable(&context, request, &response);
- auto deferred = response.operation();
- UNIT_ASSERT(status.ok());
- UNIT_ASSERT(deferred.ready());
- if (deferred.status() != code)
- Cerr << deferred.DebugString();
- UNIT_ASSERT_VALUES_EQUAL(deferred.status(), code);
-}
-
-void CreateTable(TKikimrWithGrpcAndRootSchema &server,
- const TString &path,
- const Ydb::Table::CreateTableRequest &extension = Ydb::Table::CreateTableRequest(),
- Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
-{
- Ydb::Table::CreateTableRequest request = extension;
- request.set_path(path);
- auto &col = *request.add_columns();
- col.set_name("key");
- col.mutable_type()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
- request.add_primary_key("key");
-
- CreateTable(server, request, code);
-}
-
-void CreateTable(TKikimrWithGrpcAndRootSchema &server,
- const TString &path,
+ auto status = Stub_->CreateTable(&context, request, &response);
+ auto deferred = response.operation();
+ UNIT_ASSERT(status.ok());
+ UNIT_ASSERT(deferred.ready());
+ if (deferred.status() != code)
+ Cerr << deferred.DebugString();
+ UNIT_ASSERT_VALUES_EQUAL(deferred.status(), code);
+}
+
+void CreateTable(TKikimrWithGrpcAndRootSchema &server,
+ const TString &path,
+ const Ydb::Table::CreateTableRequest &extension = Ydb::Table::CreateTableRequest(),
+ Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
+{
+ Ydb::Table::CreateTableRequest request = extension;
+ request.set_path(path);
+ auto &col = *request.add_columns();
+ col.set_name("key");
+ col.mutable_type()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
+ request.add_primary_key("key");
+
+ CreateTable(server, request, code);
+}
+
+void CreateTable(TKikimrWithGrpcAndRootSchema &server,
+ const TString &path,
const Ydb::Table::TableProfile &profile,
- Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
-{
+ Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
+{
+ Ydb::Table::CreateTableRequest request;
+ request.mutable_profile()->CopyFrom(profile);
+ CreateTable(server, path, request, code);
+}
+
+void CreateTableComplexKey(TKikimrWithGrpcAndRootSchema &server,
+ const TString &path,
+ const Ydb::Table::CreateTableRequest &extension = Ydb::Table::CreateTableRequest(),
+ Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
+{
+ Ydb::Table::CreateTableRequest request = extension;
+ request.set_path(path);
+ auto &col1 = *request.add_columns();
+ col1.set_name("key1");
+ col1.mutable_type()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UTF8);
+ request.add_primary_key("key1");
+ auto &col2 = *request.add_columns();
+ col2.set_name("key2");
+ col2.mutable_type()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
+ request.add_primary_key("key2");
+ auto &col3 = *request.add_columns();
+ col3.set_name("key3");
+ col3.mutable_type()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::STRING);
+ request.add_primary_key("key3");
+
+ CreateTable(server, request, code);
+}
+
+void CreateTableComplexKey(TKikimrWithGrpcAndRootSchema &server,
+ const TString &path,
+ const Ydb::Table::TableProfile &profile,
+ Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
+{
Ydb::Table::CreateTableRequest request;
- request.mutable_profile()->CopyFrom(profile);
- CreateTable(server, path, request, code);
-}
-
-void CreateTableComplexKey(TKikimrWithGrpcAndRootSchema &server,
- const TString &path,
- const Ydb::Table::CreateTableRequest &extension = Ydb::Table::CreateTableRequest(),
- Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
-{
- Ydb::Table::CreateTableRequest request = extension;
- request.set_path(path);
- auto &col1 = *request.add_columns();
- col1.set_name("key1");
- col1.mutable_type()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UTF8);
- request.add_primary_key("key1");
- auto &col2 = *request.add_columns();
- col2.set_name("key2");
- col2.mutable_type()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
- request.add_primary_key("key2");
- auto &col3 = *request.add_columns();
- col3.set_name("key3");
- col3.mutable_type()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::STRING);
- request.add_primary_key("key3");
-
- CreateTable(server, request, code);
-}
-
-void CreateTableComplexKey(TKikimrWithGrpcAndRootSchema &server,
- const TString &path,
- const Ydb::Table::TableProfile &profile,
- Ydb::StatusIds::StatusCode code = Ydb::StatusIds::SUCCESS)
-{
- Ydb::Table::CreateTableRequest request;
- request.mutable_profile()->CopyFrom(profile);
- CreateTableComplexKey(server, path, request, code);
-}
-
-} // anonymous namespace
-
-Y_UNIT_TEST_SUITE(TTableProfileTests) {
- Y_UNIT_TEST(UseDefaultProfile) {
+ request.mutable_profile()->CopyFrom(profile);
+ CreateTableComplexKey(server, path, request, code);
+}
+
+} // anonymous namespace
+
+Y_UNIT_TEST_SUITE(TTableProfileTests) {
+ Y_UNIT_TEST(UseDefaultProfile) {
TKikimrWithGrpcAndRootSchema server;
- //server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CMS_CONFIGS, NLog::PRI_TRACE);
- //server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CONFIGS_DISPATCHER, NLog::PRI_TRACE);
- InitConfigs(server);
-
+ //server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CMS_CONFIGS, NLog::PRI_TRACE);
+ //server.Server_->GetRuntime()->SetLogPriority(NKikimrServices::CONFIGS_DISPATCHER, NLog::PRI_TRACE);
+ InitConfigs(server);
+
NKikimrSchemeOp::TTableDescription defaultDescription;
- defaultDescription.MutablePartitionConfig()->MutableCompactionPolicy()->CopyFrom(DEFAULT_COMPACTION_POLICY);
+ defaultDescription.MutablePartitionConfig()->MutableCompactionPolicy()->CopyFrom(DEFAULT_COMPACTION_POLICY);
//defaultDescription.MutablePartitionConfig()->SetChannelProfileId(0);
-
- {
- CreateTable(server, "/Root/table-1");
- CheckTableSettings(server, "/Root/table-1", defaultDescription);
- }
-
- {
+
+ {
+ CreateTable(server, "/Root/table-1");
+ CheckTableSettings(server, "/Root/table-1", defaultDescription);
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("default");
- CreateTable(server, "/Root/table-2", profile);
-
- CheckTableSettings(server, "/Root/table-2", defaultDescription);
- }
-
- {
+ profile.set_preset_name("default");
+ CreateTable(server, "/Root/table-2", profile);
+
+ CheckTableSettings(server, "/Root/table-2", defaultDescription);
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("default");
- profile.mutable_compaction_policy()->set_preset_name("default");
- profile.mutable_execution_policy()->set_preset_name("default");
- profile.mutable_partitioning_policy()->set_preset_name("default");
- profile.mutable_storage_policy()->set_preset_name("default");
- CreateTable(server, "/Root/table-3", profile);
-
- CheckTableSettings(server, "/Root/table-3", defaultDescription);
- }
- }
-
- Y_UNIT_TEST(UseTableProfilePreset) {
+ profile.set_preset_name("default");
+ profile.mutable_compaction_policy()->set_preset_name("default");
+ profile.mutable_execution_policy()->set_preset_name("default");
+ profile.mutable_partitioning_policy()->set_preset_name("default");
+ profile.mutable_storage_policy()->set_preset_name("default");
+ CreateTable(server, "/Root/table-3", profile);
+
+ CheckTableSettings(server, "/Root/table-3", defaultDescription);
+ }
+ }
+
+ Y_UNIT_TEST(UseTableProfilePreset) {
TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
- {
+ InitConfigs(server);
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
+ profile.set_preset_name("profile1");
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(STORAGE_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
-
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(STORAGE_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-1", description);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile2");
+ profile.set_preset_name("profile2");
CreateTable(server, "/Root/ydb_ut_tenant/table-2", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY2, description);
- Apply(EXECUTION_POLICY2, description);
- Apply(PARTITIONING_POLICY2, description);
- Apply(STORAGE_POLICY2, description);
- Apply(REPLICATION_POLICY2, description);
- Apply(CACHING_POLICY2, description);
-
+ Apply(COMPACTION_POLICY2, description);
+ Apply(EXECUTION_POLICY2, description);
+ Apply(PARTITIONING_POLICY2, description);
+ Apply(STORAGE_POLICY2, description);
+ Apply(REPLICATION_POLICY2, description);
+ Apply(CACHING_POLICY2, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-2", description);
- }
- }
-
+ }
+ }
+
Y_UNIT_TEST(UseTableProfilePresetViaSdk) {
TKikimrWithGrpcAndRootSchema server;
InitConfigs(server);
@@ -3862,8 +3862,8 @@ Y_UNIT_TEST_SUITE(TTableProfileTests) {
Apply(EXECUTION_POLICY1, description);
Apply(PARTITIONING_POLICY1, description);
Apply(STORAGE_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-1", description);
}
@@ -3881,8 +3881,8 @@ Y_UNIT_TEST_SUITE(TTableProfileTests) {
Apply(EXECUTION_POLICY2, description);
Apply(PARTITIONING_POLICY2, description);
Apply(STORAGE_POLICY2, description);
- Apply(REPLICATION_POLICY2, description);
- Apply(CACHING_POLICY2, description);
+ Apply(REPLICATION_POLICY2, description);
+ Apply(CACHING_POLICY2, description);
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-2", description);
}
@@ -3899,189 +3899,189 @@ Y_UNIT_TEST_SUITE(TTableProfileTests) {
}
- Y_UNIT_TEST(OverwriteCompactionPolicy) {
+ Y_UNIT_TEST(OverwriteCompactionPolicy) {
TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
- {
+ InitConfigs(server);
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_compaction_policy()->set_preset_name("compaction2");
+ profile.set_preset_name("profile1");
+ profile.mutable_compaction_policy()->set_preset_name("compaction2");
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY2, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(STORAGE_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
-
+ Apply(COMPACTION_POLICY2, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(STORAGE_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-1", description);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_compaction_policy()->set_preset_name("default");
+ profile.set_preset_name("profile1");
+ profile.mutable_compaction_policy()->set_preset_name("default");
CreateTable(server, "/Root/ydb_ut_tenant/table-2", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(DEFAULT_COMPACTION_POLICY, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(STORAGE_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
-
+ Apply(DEFAULT_COMPACTION_POLICY, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(STORAGE_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-2", description);
- }
- }
-
-
- Y_UNIT_TEST(OverwriteExecutionPolicy) {
+ }
+ }
+
+
+ Y_UNIT_TEST(OverwriteExecutionPolicy) {
TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
- {
+ InitConfigs(server);
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_execution_policy()->set_preset_name("execution2");
+ profile.set_preset_name("profile1");
+ profile.mutable_execution_policy()->set_preset_name("execution2");
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY2, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(STORAGE_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
-
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY2, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(STORAGE_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-1", description);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_execution_policy()->set_preset_name("default");
+ profile.set_preset_name("profile1");
+ profile.mutable_execution_policy()->set_preset_name("default");
CreateTable(server, "/Root/ydb_ut_tenant/table-2", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(STORAGE_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
-
+ Apply(COMPACTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(STORAGE_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-2", description);
- }
- }
-
- Y_UNIT_TEST(OverwritePartitioningPolicy) {
+ }
+ }
+
+ Y_UNIT_TEST(OverwritePartitioningPolicy) {
TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
- {
+ InitConfigs(server);
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_partitioning_policy()->set_preset_name("partitioning2");
+ profile.set_preset_name("profile1");
+ profile.mutable_partitioning_policy()->set_preset_name("partitioning2");
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(PARTITIONING_POLICY2, description);
- Apply(STORAGE_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
-
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY2, description);
+ Apply(STORAGE_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-1", description);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_partitioning_policy()->set_preset_name("default");
+ profile.set_preset_name("profile1");
+ profile.mutable_partitioning_policy()->set_preset_name("default");
CreateTable(server, "/Root/ydb_ut_tenant/table-2", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(STORAGE_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
-
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(STORAGE_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-2", description);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
+ profile.set_preset_name("profile1");
profile.mutable_partitioning_policy()->set_auto_partitioning(Ydb::Table::PartitioningPolicy::DISABLED);
- profile.mutable_partitioning_policy()->set_uniform_partitions(5);
+ profile.mutable_partitioning_policy()->set_uniform_partitions(5);
CreateTable(server, "/Root/ydb_ut_tenant/table-3", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
- auto policy = PARTITIONING_POLICY1;
- policy.SetUniformPartitionsCount(5);
- policy.SetAutoSplit(false);
- policy.SetAutoMerge(false);
- Apply(policy, description);
- Apply(STORAGE_POLICY1, description);
-
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+ auto policy = PARTITIONING_POLICY1;
+ policy.SetUniformPartitionsCount(5);
+ policy.SetAutoSplit(false);
+ policy.SetAutoMerge(false);
+ Apply(policy, description);
+ Apply(STORAGE_POLICY1, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-3", description);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_partitioning_policy()->set_preset_name("partitioning2");
+ profile.set_preset_name("profile1");
+ profile.mutable_partitioning_policy()->set_preset_name("partitioning2");
profile.mutable_partitioning_policy()->set_auto_partitioning(Ydb::Table::PartitioningPolicy::DISABLED);
- profile.mutable_partitioning_policy()->set_uniform_partitions(5);
+ profile.mutable_partitioning_policy()->set_uniform_partitions(5);
CreateTable(server, "/Root/ydb_ut_tenant/table-4", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
- auto policy = PARTITIONING_POLICY2;
- policy.SetUniformPartitionsCount(5);
- policy.SetAutoSplit(false);
- policy.SetAutoMerge(false);
- Apply(policy, description);
- Apply(STORAGE_POLICY1, description);
-
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+ auto policy = PARTITIONING_POLICY2;
+ policy.SetUniformPartitionsCount(5);
+ policy.SetAutoSplit(false);
+ policy.SetAutoMerge(false);
+ Apply(policy, description);
+ Apply(STORAGE_POLICY1, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-4", description);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_partitioning_policy()->set_preset_name("default");
+ profile.set_preset_name("profile1");
+ profile.mutable_partitioning_policy()->set_preset_name("default");
profile.mutable_partitioning_policy()->set_auto_partitioning(Ydb::Table::PartitioningPolicy::AUTO_SPLIT);
CreateTable(server, "/Root/ydb_ut_tenant/table-5", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
- NKikimrConfig::TPartitioningPolicy policy;
- policy.SetAutoSplit(true);
- policy.SetSizeToSplit(1 << 30);
- Apply(policy, description);
- Apply(STORAGE_POLICY1, description);
-
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+ NKikimrConfig::TPartitioningPolicy policy;
+ policy.SetAutoSplit(true);
+ policy.SetSizeToSplit(1 << 30);
+ Apply(policy, description);
+ Apply(STORAGE_POLICY1, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-5", description);
- }
-
- }
-
+ }
+
+ }
+
Y_UNIT_TEST(DescribeTableWithPartitioningPolicy) {
TKikimrWithGrpcAndRootSchema server;
InitConfigs(server);
@@ -4171,1119 +4171,1119 @@ Y_UNIT_TEST_SUITE(TTableProfileTests) {
}
}
- Y_UNIT_TEST(OverwriteStoragePolicy) {
+ Y_UNIT_TEST(OverwriteStoragePolicy) {
TKikimrWithGrpcAndRootSchema server;
server.Server_->GetRuntime()->GetAppData().FeatureFlags.SetEnablePublicApiKeepInMemory(true);
- InitConfigs(server);
-
- {
+ InitConfigs(server);
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_storage_policy()->set_preset_name("storage2");
+ profile.set_preset_name("profile1");
+ profile.mutable_storage_policy()->set_preset_name("storage2");
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(STORAGE_POLICY2, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
-
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(STORAGE_POLICY2, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-1", description);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_storage_policy()->set_preset_name("default");
+ profile.set_preset_name("profile1");
+ profile.mutable_storage_policy()->set_preset_name("default");
CreateTable(server, "/Root/ydb_ut_tenant/table-2", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
- // TODO: remove this line when storage config is supported in SchemeShard.
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+ // TODO: remove this line when storage config is supported in SchemeShard.
//description.MutablePartitionConfig()->SetChannelProfileId(0);
-
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-2", description);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
+ profile.set_preset_name("profile1");
profile.mutable_storage_policy()->mutable_syslog()->set_media("ssd");
profile.mutable_storage_policy()->mutable_data()->set_media("ssd");
profile.mutable_storage_policy()->set_keep_in_memory(Ydb::FeatureFlag::ENABLED);
CreateTable(server, "/Root/ydb_ut_tenant/table-3", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
- auto policy = STORAGE_POLICY1;
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableSysLog()->SetPreferredPoolKind("ssd");
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableSysLog()->SetAllowOtherKinds(false);
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableData()->SetPreferredPoolKind("ssd");
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableData()->SetAllowOtherKinds(false);
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+ auto policy = STORAGE_POLICY1;
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableSysLog()->SetPreferredPoolKind("ssd");
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableSysLog()->SetAllowOtherKinds(false);
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableData()->SetPreferredPoolKind("ssd");
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableData()->SetAllowOtherKinds(false);
policy.MutableColumnFamilies(0)->SetColumnCache(NKikimrSchemeOp::ColumnCacheEver);
- Apply(policy, description);
-
+ Apply(policy, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-3", description);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_storage_policy()->set_preset_name("storage2");
+ profile.set_preset_name("profile1");
+ profile.mutable_storage_policy()->set_preset_name("storage2");
profile.mutable_storage_policy()->mutable_log()->set_media("hdd");
profile.mutable_storage_policy()->mutable_external()->set_media("hdd");
profile.mutable_storage_policy()->set_keep_in_memory(Ydb::FeatureFlag::DISABLED);
CreateTable(server, "/Root/ydb_ut_tenant/table-4", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
- auto policy = STORAGE_POLICY2;
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableLog()->SetPreferredPoolKind("hdd");
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableLog()->SetAllowOtherKinds(false);
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableExternal()->SetPreferredPoolKind("hdd");
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableExternal()->SetAllowOtherKinds(false);
- policy.MutableColumnFamilies(0)->ClearColumnCache();
- Apply(policy, description);
-
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+ auto policy = STORAGE_POLICY2;
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableLog()->SetPreferredPoolKind("hdd");
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableLog()->SetAllowOtherKinds(false);
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableExternal()->SetPreferredPoolKind("hdd");
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableExternal()->SetAllowOtherKinds(false);
+ policy.MutableColumnFamilies(0)->ClearColumnCache();
+ Apply(policy, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-4", description);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_storage_policy()->set_preset_name("default");
+ profile.set_preset_name("profile1");
+ profile.mutable_storage_policy()->set_preset_name("default");
profile.mutable_storage_policy()->mutable_syslog()->set_media("ssd");
profile.mutable_storage_policy()->mutable_log()->set_media("ssd");
profile.mutable_storage_policy()->set_keep_in_memory(Ydb::FeatureFlag::ENABLED);
CreateTable(server, "/Root/ydb_ut_tenant/table-5", profile);
-
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY1, description);
- NKikimrConfig::TStoragePolicy policy;
- policy.AddColumnFamilies()->SetId(0);
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableSysLog()->SetPreferredPoolKind("ssd");
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableSysLog()->SetAllowOtherKinds(false);
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableLog()->SetPreferredPoolKind("ssd");
- policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableLog()->SetAllowOtherKinds(false);
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY1, description);
+ NKikimrConfig::TStoragePolicy policy;
+ policy.AddColumnFamilies()->SetId(0);
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableSysLog()->SetPreferredPoolKind("ssd");
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableSysLog()->SetAllowOtherKinds(false);
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableLog()->SetPreferredPoolKind("ssd");
+ policy.MutableColumnFamilies(0)->MutableStorageConfig()->MutableLog()->SetAllowOtherKinds(false);
policy.MutableColumnFamilies(0)->SetColumnCache(NKikimrSchemeOp::ColumnCacheEver);
- Apply(policy, description);
-
+ Apply(policy, description);
+
CheckTableSettings(server, "/Root/ydb_ut_tenant/table-5", description);
- }
- }
-
- Y_UNIT_TEST(OverwriteCachingPolicy) {
+ }
+ }
+
+ Y_UNIT_TEST(OverwriteCachingPolicy) {
TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
- {
- Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_caching_policy()->set_preset_name("caching2");
- CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile);
-
+ InitConfigs(server);
+
+ {
+ Ydb::Table::TableProfile profile;
+ profile.set_preset_name("profile1");
+ profile.mutable_caching_policy()->set_preset_name("caching2");
+ CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile);
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(STORAGE_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
- Apply(CACHING_POLICY2, description);
-
- CheckTableSettings(server, "/Root/ydb_ut_tenant/table-1", description);
- }
-
- {
- Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_caching_policy()->set_preset_name("default");
- CreateTable(server, "/Root/ydb_ut_tenant/table-2", profile);
-
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(STORAGE_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+ Apply(CACHING_POLICY2, description);
+
+ CheckTableSettings(server, "/Root/ydb_ut_tenant/table-1", description);
+ }
+
+ {
+ Ydb::Table::TableProfile profile;
+ profile.set_preset_name("profile1");
+ profile.mutable_caching_policy()->set_preset_name("default");
+ CreateTable(server, "/Root/ydb_ut_tenant/table-2", profile);
+
NKikimrSchemeOp::TTableDescription description;
- Apply(COMPACTION_POLICY1, description);
- Apply(EXECUTION_POLICY1, description);
- Apply(PARTITIONING_POLICY1, description);
- Apply(STORAGE_POLICY1, description);
- Apply(REPLICATION_POLICY1, description);
-
- CheckTableSettings(server, "/Root/ydb_ut_tenant/table-2", description);
- }
- }
-
- Y_UNIT_TEST(WrongTableProfile) {
+ Apply(COMPACTION_POLICY1, description);
+ Apply(EXECUTION_POLICY1, description);
+ Apply(PARTITIONING_POLICY1, description);
+ Apply(STORAGE_POLICY1, description);
+ Apply(REPLICATION_POLICY1, description);
+
+ CheckTableSettings(server, "/Root/ydb_ut_tenant/table-2", description);
+ }
+ }
+
+ Y_UNIT_TEST(WrongTableProfile) {
TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
- {
+ InitConfigs(server);
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("unknown");
+ profile.set_preset_name("unknown");
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_compaction_policy();
+ profile.set_preset_name("profile1");
+ profile.mutable_compaction_policy();
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_compaction_policy()->set_preset_name("unknown");
+ profile.set_preset_name("profile1");
+ profile.mutable_compaction_policy()->set_preset_name("unknown");
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_execution_policy();
+ profile.set_preset_name("profile1");
+ profile.mutable_execution_policy();
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_execution_policy()->set_preset_name("unknown");
+ profile.set_preset_name("profile1");
+ profile.mutable_execution_policy()->set_preset_name("unknown");
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
- }
-
- {
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_partitioning_policy()->set_preset_name("unknown");
+ profile.set_preset_name("profile1");
+ profile.mutable_partitioning_policy()->set_preset_name("unknown");
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
- }
-
- {
+ }
+
+ {
+ Ydb::Table::TableProfile profile;
+ profile.set_preset_name("profile1");
+ profile.mutable_storage_policy()->set_preset_name("unknown");
+ CreateTable(server, "/Root/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
+ }
+
+ {
+ Ydb::Table::TableProfile profile;
+ profile.set_preset_name("profile1");
+ profile.mutable_replication_policy()->set_preset_name("unknown");
+ CreateTable(server, "/Root/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
+ }
+
+ {
Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_storage_policy()->set_preset_name("unknown");
- CreateTable(server, "/Root/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
- }
-
- {
- Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_replication_policy()->set_preset_name("unknown");
- CreateTable(server, "/Root/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
- }
-
- {
- Ydb::Table::TableProfile profile;
- profile.set_preset_name("profile1");
- profile.mutable_caching_policy()->set_preset_name("unknown");
- CreateTable(server, "/Root/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
- }
- }
-
- Y_UNIT_TEST(ExplicitPartitionsSimple) {
- TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
- Ydb::Table::TableProfile profile;
- profile.set_preset_name("default");
- auto &policy = *profile.mutable_partitioning_policy();
- Ydb::TypedValue point;
- auto &keyType = *point.mutable_type()->mutable_tuple_type();
- keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
- auto &keyVal = *point.mutable_value();
- keyVal.add_items()->set_uint64_value(10);
- auto &points = *policy.mutable_explicit_partitions();
- points.add_split_points()->CopyFrom(point);
- keyVal.mutable_items(0)->set_uint64_value(20);
- points.add_split_points()->CopyFrom(point);
- keyVal.mutable_items(0)->set_uint64_value(30);
- points.add_split_points()->CopyFrom(point);
- CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile);
-
- CheckTablePartitions(server, "/Root/ydb_ut_tenant/table-1",
- policy.explicit_partitions().split_points());
- }
-
- Y_UNIT_TEST(ExplicitPartitionsUnordered) {
- TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
- Ydb::Table::TableProfile profile;
- profile.set_preset_name("default");
- auto &policy = *profile.mutable_partitioning_policy();
- Ydb::TypedValue point;
- auto &keyType = *point.mutable_type()->mutable_tuple_type();
- keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
- auto &keyVal = *point.mutable_value();
- keyVal.add_items()->set_uint64_value(10);
- auto &points = *policy.mutable_explicit_partitions();
- points.add_split_points()->CopyFrom(point);
- keyVal.mutable_items(0)->set_uint64_value(30);
- points.add_split_points()->CopyFrom(point);
- keyVal.mutable_items(0)->set_uint64_value(20);
- points.add_split_points()->CopyFrom(point);
+ profile.set_preset_name("profile1");
+ profile.mutable_caching_policy()->set_preset_name("unknown");
+ CreateTable(server, "/Root/table-1", profile, Ydb::StatusIds::BAD_REQUEST);
+ }
+ }
+
+ Y_UNIT_TEST(ExplicitPartitionsSimple) {
+ TKikimrWithGrpcAndRootSchema server;
+ InitConfigs(server);
+
+ Ydb::Table::TableProfile profile;
+ profile.set_preset_name("default");
+ auto &policy = *profile.mutable_partitioning_policy();
+ Ydb::TypedValue point;
+ auto &keyType = *point.mutable_type()->mutable_tuple_type();
+ keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
+ auto &keyVal = *point.mutable_value();
+ keyVal.add_items()->set_uint64_value(10);
+ auto &points = *policy.mutable_explicit_partitions();
+ points.add_split_points()->CopyFrom(point);
+ keyVal.mutable_items(0)->set_uint64_value(20);
+ points.add_split_points()->CopyFrom(point);
+ keyVal.mutable_items(0)->set_uint64_value(30);
+ points.add_split_points()->CopyFrom(point);
+ CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile);
+
+ CheckTablePartitions(server, "/Root/ydb_ut_tenant/table-1",
+ policy.explicit_partitions().split_points());
+ }
+
+ Y_UNIT_TEST(ExplicitPartitionsUnordered) {
+ TKikimrWithGrpcAndRootSchema server;
+ InitConfigs(server);
+
+ Ydb::Table::TableProfile profile;
+ profile.set_preset_name("default");
+ auto &policy = *profile.mutable_partitioning_policy();
+ Ydb::TypedValue point;
+ auto &keyType = *point.mutable_type()->mutable_tuple_type();
+ keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
+ auto &keyVal = *point.mutable_value();
+ keyVal.add_items()->set_uint64_value(10);
+ auto &points = *policy.mutable_explicit_partitions();
+ points.add_split_points()->CopyFrom(point);
+ keyVal.mutable_items(0)->set_uint64_value(30);
+ points.add_split_points()->CopyFrom(point);
+ keyVal.mutable_items(0)->set_uint64_value(20);
+ points.add_split_points()->CopyFrom(point);
CreateTable(server, "/Root/ydb_ut_tenant/table-1", profile, Ydb::StatusIds::SCHEME_ERROR);
- }
-
- Y_UNIT_TEST(ExplicitPartitionsComplex) {
- TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
- Ydb::Table::TableProfile profile;
- profile.set_preset_name("default");
- auto &policy = *profile.mutable_partitioning_policy();
- Ydb::TypedValue point;
- auto &keyType = *point.mutable_type()->mutable_tuple_type();
- keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UTF8);
- keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
- keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::STRING);
- auto &keyVal = *point.mutable_value();
- keyVal.add_items()->set_text_value("key1");
- keyVal.add_items()->set_uint64_value(10);
- keyVal.add_items()->set_bytes_value("value1");
- auto &points = *policy.mutable_explicit_partitions();
- points.add_split_points()->CopyFrom(point);
- keyVal.mutable_items(0)->set_text_value("key2");
- keyVal.mutable_items(1)->set_uint64_value(20);
- keyVal.mutable_items(2)->set_bytes_value("value2");
- points.add_split_points()->CopyFrom(point);
- keyVal.mutable_items(0)->set_text_value("key3");
- keyVal.mutable_items(1)->set_uint64_value(30);
- keyVal.mutable_items(2)->set_bytes_value("value3");
- points.add_split_points()->CopyFrom(point);
- CreateTableComplexKey(server, "/Root/ydb_ut_tenant/table-1", profile);
-
- CheckTablePartitions(server, "/Root/ydb_ut_tenant/table-1",
- policy.explicit_partitions().split_points());
- }
-
- Y_UNIT_TEST(ExplicitPartitionsWrongKeyFormat) {
- TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
- Ydb::Table::TableProfile profile;
- profile.set_preset_name("default");
- auto &policy = *profile.mutable_partitioning_policy();
- Ydb::TypedValue point;
- auto &keyType = *point.mutable_type()->mutable_tuple_type();
- keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UTF8);
- keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
- keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::STRING);
- auto &keyVal = *point.mutable_value();
- keyVal.add_items()->set_text_value("key1");
- keyVal.add_items()->set_text_value("10");
- keyVal.add_items()->set_bytes_value("value1");
- auto &points = *policy.mutable_explicit_partitions();
- points.add_split_points()->CopyFrom(point);
- CreateTableComplexKey(server, "/Root/ydb_ut_tenant/table-1", profile,
- Ydb::StatusIds::BAD_REQUEST);
- }
-
- Y_UNIT_TEST(ExplicitPartitionsWrongKeyType) {
- TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
- Ydb::Table::TableProfile profile;
- profile.set_preset_name("default");
- auto &policy = *profile.mutable_partitioning_policy();
- Ydb::TypedValue point;
- auto &keyType = *point.mutable_type()->mutable_tuple_type();
- keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UTF8);
- keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UTF8);
- keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::STRING);
- auto &keyVal = *point.mutable_value();
- keyVal.add_items()->set_text_value("key1");
- keyVal.add_items()->set_text_value("10");
- keyVal.add_items()->set_bytes_value("value1");
- auto &points = *policy.mutable_explicit_partitions();
- points.add_split_points()->CopyFrom(point);
+ }
+
+ Y_UNIT_TEST(ExplicitPartitionsComplex) {
+ TKikimrWithGrpcAndRootSchema server;
+ InitConfigs(server);
+
+ Ydb::Table::TableProfile profile;
+ profile.set_preset_name("default");
+ auto &policy = *profile.mutable_partitioning_policy();
+ Ydb::TypedValue point;
+ auto &keyType = *point.mutable_type()->mutable_tuple_type();
+ keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UTF8);
+ keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
+ keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::STRING);
+ auto &keyVal = *point.mutable_value();
+ keyVal.add_items()->set_text_value("key1");
+ keyVal.add_items()->set_uint64_value(10);
+ keyVal.add_items()->set_bytes_value("value1");
+ auto &points = *policy.mutable_explicit_partitions();
+ points.add_split_points()->CopyFrom(point);
+ keyVal.mutable_items(0)->set_text_value("key2");
+ keyVal.mutable_items(1)->set_uint64_value(20);
+ keyVal.mutable_items(2)->set_bytes_value("value2");
+ points.add_split_points()->CopyFrom(point);
+ keyVal.mutable_items(0)->set_text_value("key3");
+ keyVal.mutable_items(1)->set_uint64_value(30);
+ keyVal.mutable_items(2)->set_bytes_value("value3");
+ points.add_split_points()->CopyFrom(point);
+ CreateTableComplexKey(server, "/Root/ydb_ut_tenant/table-1", profile);
+
+ CheckTablePartitions(server, "/Root/ydb_ut_tenant/table-1",
+ policy.explicit_partitions().split_points());
+ }
+
+ Y_UNIT_TEST(ExplicitPartitionsWrongKeyFormat) {
+ TKikimrWithGrpcAndRootSchema server;
+ InitConfigs(server);
+
+ Ydb::Table::TableProfile profile;
+ profile.set_preset_name("default");
+ auto &policy = *profile.mutable_partitioning_policy();
+ Ydb::TypedValue point;
+ auto &keyType = *point.mutable_type()->mutable_tuple_type();
+ keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UTF8);
+ keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UINT64);
+ keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::STRING);
+ auto &keyVal = *point.mutable_value();
+ keyVal.add_items()->set_text_value("key1");
+ keyVal.add_items()->set_text_value("10");
+ keyVal.add_items()->set_bytes_value("value1");
+ auto &points = *policy.mutable_explicit_partitions();
+ points.add_split_points()->CopyFrom(point);
+ CreateTableComplexKey(server, "/Root/ydb_ut_tenant/table-1", profile,
+ Ydb::StatusIds::BAD_REQUEST);
+ }
+
+ Y_UNIT_TEST(ExplicitPartitionsWrongKeyType) {
+ TKikimrWithGrpcAndRootSchema server;
+ InitConfigs(server);
+
+ Ydb::Table::TableProfile profile;
+ profile.set_preset_name("default");
+ auto &policy = *profile.mutable_partitioning_policy();
+ Ydb::TypedValue point;
+ auto &keyType = *point.mutable_type()->mutable_tuple_type();
+ keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UTF8);
+ keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::UTF8);
+ keyType.add_elements()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::STRING);
+ auto &keyVal = *point.mutable_value();
+ keyVal.add_items()->set_text_value("key1");
+ keyVal.add_items()->set_text_value("10");
+ keyVal.add_items()->set_bytes_value("value1");
+ auto &points = *policy.mutable_explicit_partitions();
+ points.add_split_points()->CopyFrom(point);
CreateTableComplexKey(server, "/Root/ydb_ut_tenant/table-1", profile, Ydb::StatusIds::SCHEME_ERROR);
- }
-
- void CheckRepeated(const ::google::protobuf::RepeatedPtrField<TString> &array,
- THashSet<TString> expected)
- {
- UNIT_ASSERT_VALUES_EQUAL(array.size(), expected.size());
- for (auto &val : array) {
+ }
+
+ void CheckRepeated(const ::google::protobuf::RepeatedPtrField<TString> &array,
+ THashSet<TString> expected)
+ {
+ UNIT_ASSERT_VALUES_EQUAL(array.size(), expected.size());
+ for (auto &val : array) {
UNIT_ASSERT(expected.contains(val));
- expected.erase(val);
- }
- }
-
- void CheckAllowedPolicies(const Ydb::Table::TableProfileDescription &profile,
- const THashSet<TString> &storage,
- const THashSet<TString> &partitioning,
- const THashSet<TString> &execution,
- const THashSet<TString> &compaction,
- const THashSet<TString> &replication,
- const THashSet<TString> &caching)
- {
- CheckRepeated(profile.allowed_storage_policies(), storage);
- CheckRepeated(profile.allowed_partitioning_policies(), partitioning);
- CheckRepeated(profile.allowed_execution_policies(), execution);
- CheckRepeated(profile.allowed_compaction_policies(), compaction);
- CheckRepeated(profile.allowed_replication_policies(), replication);
- CheckRepeated(profile.allowed_caching_policies(), caching);
- }
-
- void CheckLabels(const ::google::protobuf::Map<TString, TString> &labels,
- THashMap<TString, TString> expected)
- {
- UNIT_ASSERT_VALUES_EQUAL(labels.size(), expected.size());
- for (auto &pr : labels) {
+ expected.erase(val);
+ }
+ }
+
+ void CheckAllowedPolicies(const Ydb::Table::TableProfileDescription &profile,
+ const THashSet<TString> &storage,
+ const THashSet<TString> &partitioning,
+ const THashSet<TString> &execution,
+ const THashSet<TString> &compaction,
+ const THashSet<TString> &replication,
+ const THashSet<TString> &caching)
+ {
+ CheckRepeated(profile.allowed_storage_policies(), storage);
+ CheckRepeated(profile.allowed_partitioning_policies(), partitioning);
+ CheckRepeated(profile.allowed_execution_policies(), execution);
+ CheckRepeated(profile.allowed_compaction_policies(), compaction);
+ CheckRepeated(profile.allowed_replication_policies(), replication);
+ CheckRepeated(profile.allowed_caching_policies(), caching);
+ }
+
+ void CheckLabels(const ::google::protobuf::Map<TString, TString> &labels,
+ THashMap<TString, TString> expected)
+ {
+ UNIT_ASSERT_VALUES_EQUAL(labels.size(), expected.size());
+ for (auto &pr : labels) {
UNIT_ASSERT(expected.contains(pr.first));
- UNIT_ASSERT_VALUES_EQUAL(expected.at(pr.first), pr.second);
- expected.erase(pr.first);
- }
- }
-
- Y_UNIT_TEST(DescribeTableOptions) {
+ UNIT_ASSERT_VALUES_EQUAL(expected.at(pr.first), pr.second);
+ expected.erase(pr.first);
+ }
+ }
+
+ Y_UNIT_TEST(DescribeTableOptions) {
TKikimrWithGrpcAndRootSchema server;
- InitConfigs(server);
-
-
- std::shared_ptr<grpc::Channel> Channel_;
- Channel_ = grpc::CreateChannel("localhost:" + ToString(server.GetPort()), grpc::InsecureChannelCredentials());
+ InitConfigs(server);
+
+
+ std::shared_ptr<grpc::Channel> Channel_;
+ Channel_ = grpc::CreateChannel("localhost:" + ToString(server.GetPort()), grpc::InsecureChannelCredentials());
std::unique_ptr<Ydb::Table::V1::TableService::Stub> Stub_;
Stub_ = Ydb::Table::V1::TableService::NewStub(Channel_);
- grpc::ClientContext context;
- Ydb::Table::DescribeTableOptionsRequest request;
- Ydb::Table::DescribeTableOptionsResponse response;
- auto status = Stub_->DescribeTableOptions(&context, request, &response);
- auto deferred = response.operation();
- UNIT_ASSERT(status.ok());
- UNIT_ASSERT(deferred.ready());
- UNIT_ASSERT_VALUES_EQUAL(deferred.status(), Ydb::StatusIds::SUCCESS);
-
- Ydb::Table::DescribeTableOptionsResult result;
- deferred.result().UnpackTo(&result);
-
- THashSet<TString> storage = {{TString("default"), TString("storage1"), TString("storage2")}};
- THashSet<TString> partitioning = {{TString("default"), TString("partitioning1"), TString("partitioning2")}};
- THashSet<TString> execution = {{TString("default"), TString("execution1"), TString("execution2")}};
- THashSet<TString> compaction = {{TString("default"), TString("compaction1"), TString("compaction2")}};
- THashSet<TString> replication = {{TString("default"), TString("replication1"), TString("replication2")}};
- THashSet<TString> caching = {{TString("default"), TString("caching1"), TString("caching2")}};
- for (auto &profile: result.table_profile_presets()) {
- if (profile.name() == "default") {
- UNIT_ASSERT_VALUES_EQUAL(profile.default_storage_policy(), "default");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_partitioning_policy(), "default");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_execution_policy(), "default");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_compaction_policy(), "default");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_replication_policy(), "default");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_caching_policy(), "default");
- } else if (profile.name() == "profile1") {
- UNIT_ASSERT_VALUES_EQUAL(profile.default_storage_policy(), "storage1");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_partitioning_policy(), "partitioning1");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_execution_policy(), "execution1");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_compaction_policy(), "compaction1");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_replication_policy(), "replication1");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_caching_policy(), "caching1");
- } else {
- UNIT_ASSERT_VALUES_EQUAL(profile.name(), "profile2");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_storage_policy(), "storage2");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_partitioning_policy(), "partitioning2");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_execution_policy(), "execution2");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_compaction_policy(), "compaction2");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_replication_policy(), "replication2");
- UNIT_ASSERT_VALUES_EQUAL(profile.default_caching_policy(), "caching2");
- }
- CheckAllowedPolicies(profile, storage, partitioning, execution,
- compaction, replication, caching);
- }
-
- for (auto &description : result.storage_policy_presets()) {
- if (description.name() == "default") {
- CheckLabels(description.labels(), {});
- } else if (description.name() == "storage1") {
- CheckLabels(description.labels(),
- {{ {TString("syslog"), TString("hdd")},
- {TString("log"), TString("hdd")},
- {TString("data"), TString("hdd")},
- {TString("external"), TString("hdd")},
+ grpc::ClientContext context;
+ Ydb::Table::DescribeTableOptionsRequest request;
+ Ydb::Table::DescribeTableOptionsResponse response;
+ auto status = Stub_->DescribeTableOptions(&context, request, &response);
+ auto deferred = response.operation();
+ UNIT_ASSERT(status.ok());
+ UNIT_ASSERT(deferred.ready());
+ UNIT_ASSERT_VALUES_EQUAL(deferred.status(), Ydb::StatusIds::SUCCESS);
+
+ Ydb::Table::DescribeTableOptionsResult result;
+ deferred.result().UnpackTo(&result);
+
+ THashSet<TString> storage = {{TString("default"), TString("storage1"), TString("storage2")}};
+ THashSet<TString> partitioning = {{TString("default"), TString("partitioning1"), TString("partitioning2")}};
+ THashSet<TString> execution = {{TString("default"), TString("execution1"), TString("execution2")}};
+ THashSet<TString> compaction = {{TString("default"), TString("compaction1"), TString("compaction2")}};
+ THashSet<TString> replication = {{TString("default"), TString("replication1"), TString("replication2")}};
+ THashSet<TString> caching = {{TString("default"), TString("caching1"), TString("caching2")}};
+ for (auto &profile: result.table_profile_presets()) {
+ if (profile.name() == "default") {
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_storage_policy(), "default");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_partitioning_policy(), "default");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_execution_policy(), "default");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_compaction_policy(), "default");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_replication_policy(), "default");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_caching_policy(), "default");
+ } else if (profile.name() == "profile1") {
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_storage_policy(), "storage1");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_partitioning_policy(), "partitioning1");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_execution_policy(), "execution1");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_compaction_policy(), "compaction1");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_replication_policy(), "replication1");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_caching_policy(), "caching1");
+ } else {
+ UNIT_ASSERT_VALUES_EQUAL(profile.name(), "profile2");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_storage_policy(), "storage2");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_partitioning_policy(), "partitioning2");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_execution_policy(), "execution2");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_compaction_policy(), "compaction2");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_replication_policy(), "replication2");
+ UNIT_ASSERT_VALUES_EQUAL(profile.default_caching_policy(), "caching2");
+ }
+ CheckAllowedPolicies(profile, storage, partitioning, execution,
+ compaction, replication, caching);
+ }
+
+ for (auto &description : result.storage_policy_presets()) {
+ if (description.name() == "default") {
+ CheckLabels(description.labels(), {});
+ } else if (description.name() == "storage1") {
+ CheckLabels(description.labels(),
+ {{ {TString("syslog"), TString("hdd")},
+ {TString("log"), TString("hdd")},
+ {TString("data"), TString("hdd")},
+ {TString("external"), TString("hdd")},
{TString("external_threshold"), ToString(Max<ui32>())},
- {TString("codec"), TString("lz4")},
- {TString("in_memory"), TString("false")} }});
- } else {
- UNIT_ASSERT_VALUES_EQUAL(description.name(), "storage2");
- CheckLabels(description.labels(),
- {{ {TString("syslog"), TString("ssd")},
- {TString("log"), TString("ssd")},
- {TString("data"), TString("ssd")},
- {TString("external"), TString("ssd")},
- {TString("medium_threshold"), TString("30000")},
- {TString("codec"), TString("none")},
- {TString("in_memory"), TString("true")} }});
- }
- }
-
- for (auto &description : result.partitioning_policy_presets()) {
- if (description.name() == "default") {
- CheckLabels(description.labels(),
- {{ {TString("auto_split"), TString("disabled")},
- {TString("auto_merge"), TString("disabled")} }});
- } else if (description.name() == "partitioning1"){
- CheckLabels(description.labels(),
- {{ {TString("auto_split"), TString("enabled")},
- {TString("auto_merge"), TString("disabled")},
- {TString("split_threshold"), TString("123456")},
- {TString("uniform_parts"), TString("10")} }});
- } else {
- UNIT_ASSERT_VALUES_EQUAL(description.name(), "partitioning2");
- CheckLabels(description.labels(),
- {{ {TString("auto_split"), TString("enabled")},
- {TString("auto_merge"), TString("enabled")},
- {TString("split_threshold"), TString("1000000000")},
- {TString("uniform_parts"), TString("20")} }});
- }
- }
-
- for (auto &description : result.execution_policy_presets()) {
- if (description.name() == "default") {
- CheckLabels(description.labels(),
- {{ {TString("out_of_order"), TString("enabled")},
- {TString("pipeline_width"), TString("8")},
- {TString("immediate_tx"), TString("enabled")},
- {TString("bloom_filter"), TString("disabled")} }});
- } else if (description.name() == "execution1"){
- CheckLabels(description.labels(),
- {{ {TString("out_of_order"), TString("disabled")},
- {TString("immediate_tx"), TString("enabled")},
- {TString("bloom_filter"), TString("enabled")},
- {TString("tx_read_limit"), TString("10000000")} }});
- } else {
- UNIT_ASSERT_VALUES_EQUAL(description.name(), "execution2");
- CheckLabels(description.labels(),
- {{ {TString("out_of_order"), TString("enabled")},
- {TString("pipeline_width"), TString("8")},
- {TString("immediate_tx"), TString("disabled")},
- {TString("bloom_filter"), TString("disabled")},
- {TString("tx_read_limit"), TString("20000000")} }});
- }
- }
-
- for (auto &description : result.compaction_policy_presets()) {
- if (description.name() == "default") {
- CheckLabels(description.labels(), {});
- } else if (description.name() == "compaction1"){
- CheckLabels(description.labels(),
- {{ {TString("generations"), TString("1")} }});
- } else {
- UNIT_ASSERT_VALUES_EQUAL(description.name(), "compaction2");
- CheckLabels(description.labels(),
- {{ {TString("generations"), TString("2")} }});
- }
- }
-
- for (auto &description : result.replication_policy_presets()) {
- if (description.name() == "default") {
- CheckLabels(description.labels(),
+ {TString("codec"), TString("lz4")},
+ {TString("in_memory"), TString("false")} }});
+ } else {
+ UNIT_ASSERT_VALUES_EQUAL(description.name(), "storage2");
+ CheckLabels(description.labels(),
+ {{ {TString("syslog"), TString("ssd")},
+ {TString("log"), TString("ssd")},
+ {TString("data"), TString("ssd")},
+ {TString("external"), TString("ssd")},
+ {TString("medium_threshold"), TString("30000")},
+ {TString("codec"), TString("none")},
+ {TString("in_memory"), TString("true")} }});
+ }
+ }
+
+ for (auto &description : result.partitioning_policy_presets()) {
+ if (description.name() == "default") {
+ CheckLabels(description.labels(),
+ {{ {TString("auto_split"), TString("disabled")},
+ {TString("auto_merge"), TString("disabled")} }});
+ } else if (description.name() == "partitioning1"){
+ CheckLabels(description.labels(),
+ {{ {TString("auto_split"), TString("enabled")},
+ {TString("auto_merge"), TString("disabled")},
+ {TString("split_threshold"), TString("123456")},
+ {TString("uniform_parts"), TString("10")} }});
+ } else {
+ UNIT_ASSERT_VALUES_EQUAL(description.name(), "partitioning2");
+ CheckLabels(description.labels(),
+ {{ {TString("auto_split"), TString("enabled")},
+ {TString("auto_merge"), TString("enabled")},
+ {TString("split_threshold"), TString("1000000000")},
+ {TString("uniform_parts"), TString("20")} }});
+ }
+ }
+
+ for (auto &description : result.execution_policy_presets()) {
+ if (description.name() == "default") {
+ CheckLabels(description.labels(),
+ {{ {TString("out_of_order"), TString("enabled")},
+ {TString("pipeline_width"), TString("8")},
+ {TString("immediate_tx"), TString("enabled")},
+ {TString("bloom_filter"), TString("disabled")} }});
+ } else if (description.name() == "execution1"){
+ CheckLabels(description.labels(),
+ {{ {TString("out_of_order"), TString("disabled")},
+ {TString("immediate_tx"), TString("enabled")},
+ {TString("bloom_filter"), TString("enabled")},
+ {TString("tx_read_limit"), TString("10000000")} }});
+ } else {
+ UNIT_ASSERT_VALUES_EQUAL(description.name(), "execution2");
+ CheckLabels(description.labels(),
+ {{ {TString("out_of_order"), TString("enabled")},
+ {TString("pipeline_width"), TString("8")},
+ {TString("immediate_tx"), TString("disabled")},
+ {TString("bloom_filter"), TString("disabled")},
+ {TString("tx_read_limit"), TString("20000000")} }});
+ }
+ }
+
+ for (auto &description : result.compaction_policy_presets()) {
+ if (description.name() == "default") {
+ CheckLabels(description.labels(), {});
+ } else if (description.name() == "compaction1"){
+ CheckLabels(description.labels(),
+ {{ {TString("generations"), TString("1")} }});
+ } else {
+ UNIT_ASSERT_VALUES_EQUAL(description.name(), "compaction2");
+ CheckLabels(description.labels(),
+ {{ {TString("generations"), TString("2")} }});
+ }
+ }
+
+ for (auto &description : result.replication_policy_presets()) {
+ if (description.name() == "default") {
+ CheckLabels(description.labels(),
{{ {TString("followers"), TString("disabled")} }});
- } else if (description.name() == "replication1"){
- CheckLabels(description.labels(),
+ } else if (description.name() == "replication1"){
+ CheckLabels(description.labels(),
{{ {TString("followers"), TString("1")},
- {TString("promotion"), TString("disabled")},
- {TString("per_zone"), TString("true")} }});
- } else {
- UNIT_ASSERT_VALUES_EQUAL(description.name(), "replication2");
- CheckLabels(description.labels(),
+ {TString("promotion"), TString("disabled")},
+ {TString("per_zone"), TString("true")} }});
+ } else {
+ UNIT_ASSERT_VALUES_EQUAL(description.name(), "replication2");
+ CheckLabels(description.labels(),
{{ {TString("followers"), TString("2")},
- {TString("promotion"), TString("enabled")},
- {TString("per_zone"), TString("false")} }});
- }
- }
-
- for (auto &description : result.caching_policy_presets()) {
- if (description.name() == "default") {
- CheckLabels(description.labels(), {});
- } else if (description.name() == "caching1"){
- CheckLabels(description.labels(),
- {{ {TString("executor_cache"), TString("10000000")} }});
- } else {
- UNIT_ASSERT_VALUES_EQUAL(description.name(), "caching2");
- CheckLabels(description.labels(),
- {{ {TString("executor_cache"), TString("20000000")} }});
- }
- }
- }
-}
-
-#ifndef _win_
-
-void ExecSchemeYql(std::shared_ptr<grpc::Channel> channel, const TString &sessionId, const TString &yql)
-{
+ {TString("promotion"), TString("enabled")},
+ {TString("per_zone"), TString("false")} }});
+ }
+ }
+
+ for (auto &description : result.caching_policy_presets()) {
+ if (description.name() == "default") {
+ CheckLabels(description.labels(), {});
+ } else if (description.name() == "caching1"){
+ CheckLabels(description.labels(),
+ {{ {TString("executor_cache"), TString("10000000")} }});
+ } else {
+ UNIT_ASSERT_VALUES_EQUAL(description.name(), "caching2");
+ CheckLabels(description.labels(),
+ {{ {TString("executor_cache"), TString("20000000")} }});
+ }
+ }
+ }
+}
+
+#ifndef _win_
+
+void ExecSchemeYql(std::shared_ptr<grpc::Channel> channel, const TString &sessionId, const TString &yql)
+{
std::unique_ptr<Ydb::Table::V1::TableService::Stub> stub;
stub = Ydb::Table::V1::TableService::NewStub(channel);
- grpc::ClientContext context;
-
- Ydb::Table::ExecuteSchemeQueryRequest request;
- request.set_session_id(sessionId);
- request.set_yql_text(yql);
-
- Ydb::Table::ExecuteSchemeQueryResponse response;
- auto status = stub->ExecuteSchemeQuery(&context, request, &response);
+ grpc::ClientContext context;
+
+ Ydb::Table::ExecuteSchemeQueryRequest request;
+ request.set_session_id(sessionId);
+ request.set_yql_text(yql);
+
+ Ydb::Table::ExecuteSchemeQueryResponse response;
+ auto status = stub->ExecuteSchemeQuery(&context, request, &response);
UNIT_ASSERT(status.ok());
- auto deferred = response.operation();
-
- UNIT_ASSERT(deferred.ready() == true);
- UNIT_ASSERT(deferred.status() == Ydb::StatusIds::SUCCESS);
-}
-
+ auto deferred = response.operation();
+
+ UNIT_ASSERT(deferred.ready() == true);
+ UNIT_ASSERT(deferred.status() == Ydb::StatusIds::SUCCESS);
+}
+
Ydb::Table::ExecuteQueryResult ExecYql(std::shared_ptr<grpc::Channel> channel, const TString &sessionId, const TString &yql, bool withStat)
-{
+{
std::unique_ptr<Ydb::Table::V1::TableService::Stub> stub;
stub = Ydb::Table::V1::TableService::NewStub(channel);
- grpc::ClientContext context;
- Ydb::Table::ExecuteDataQueryRequest request;
- request.set_session_id(sessionId);
- request.mutable_query()->set_yql_text(yql);
- request.mutable_tx_control()->mutable_begin_tx()->mutable_serializable_read_write();
- request.mutable_tx_control()->set_commit_tx(true);
+ grpc::ClientContext context;
+ Ydb::Table::ExecuteDataQueryRequest request;
+ request.set_session_id(sessionId);
+ request.mutable_query()->set_yql_text(yql);
+ request.mutable_tx_control()->mutable_begin_tx()->mutable_serializable_read_write();
+ request.mutable_tx_control()->set_commit_tx(true);
if (withStat) {
request.set_collect_stats(Ydb::Table::QueryStatsCollection::STATS_COLLECTION_BASIC);
}
- Ydb::Table::ExecuteDataQueryResponse response;
- auto status = stub->ExecuteDataQuery(&context, request, &response);
- UNIT_ASSERT(status.ok());
- auto deferred = response.operation();
- UNIT_ASSERT(deferred.ready() == true);
+ Ydb::Table::ExecuteDataQueryResponse response;
+ auto status = stub->ExecuteDataQuery(&context, request, &response);
+ UNIT_ASSERT(status.ok());
+ auto deferred = response.operation();
+ UNIT_ASSERT(deferred.ready() == true);
NYql::TIssues issues;
NYql::IssuesFromMessage(deferred.issues(), issues);
issues.PrintTo(Cerr);
- UNIT_ASSERT(deferred.status() == Ydb::StatusIds::SUCCESS);
-
- Ydb::Table::ExecuteQueryResult result;
- Y_VERIFY(deferred.result().UnpackTo(&result));
- return result;
-}
-
-void CheckYqlDecimalValues(std::shared_ptr<grpc::Channel> channel, const TString &sessionId, const TString &yql,
- TVector<std::pair<i64, ui64>> vals)
-{
- auto result = ExecYql(channel, sessionId, yql);
- UNIT_ASSERT_VALUES_EQUAL(result.result_sets_size(), 1);
-
- TVector<std::pair<ui64, ui64>> halves;
- for (auto &pr : vals) {
+ UNIT_ASSERT(deferred.status() == Ydb::StatusIds::SUCCESS);
+
+ Ydb::Table::ExecuteQueryResult result;
+ Y_VERIFY(deferred.result().UnpackTo(&result));
+ return result;
+}
+
+void CheckYqlDecimalValues(std::shared_ptr<grpc::Channel> channel, const TString &sessionId, const TString &yql,
+ TVector<std::pair<i64, ui64>> vals)
+{
+ auto result = ExecYql(channel, sessionId, yql);
+ UNIT_ASSERT_VALUES_EQUAL(result.result_sets_size(), 1);
+
+ TVector<std::pair<ui64, ui64>> halves;
+ for (auto &pr : vals) {
NYql::NDecimal::TInt128 val = pr.first;
- val *= Power(10, NScheme::DECIMAL_SCALE);
- if (val >= 0)
- val += pr.second;
- else
- val -= pr.second;
- halves.push_back(std::make_pair(reinterpret_cast<ui64*>(&val)[0], reinterpret_cast<ui64*>(&val)[1]));
- }
-
- auto &result_set = result.result_sets(0);
- UNIT_ASSERT_VALUES_EQUAL(result_set.rows_size(), halves.size());
- for (size_t i = 0; i < halves.size(); ++i) {
- UNIT_ASSERT_VALUES_EQUAL(result_set.rows(i).items(0).low_128(), halves[i].first);
+ val *= Power(10, NScheme::DECIMAL_SCALE);
+ if (val >= 0)
+ val += pr.second;
+ else
+ val -= pr.second;
+ halves.push_back(std::make_pair(reinterpret_cast<ui64*>(&val)[0], reinterpret_cast<ui64*>(&val)[1]));
+ }
+
+ auto &result_set = result.result_sets(0);
+ UNIT_ASSERT_VALUES_EQUAL(result_set.rows_size(), halves.size());
+ for (size_t i = 0; i < halves.size(); ++i) {
+ UNIT_ASSERT_VALUES_EQUAL(result_set.rows(i).items(0).low_128(), halves[i].first);
UNIT_ASSERT_VALUES_EQUAL(result_set.rows(i).items(0).high_128(), halves[i].second);
- }
-}
-
-void CreateTable(std::shared_ptr<grpc::Channel> channel,
- const Ydb::Table::CreateTableRequest &request)
-{
+ }
+}
+
+void CreateTable(std::shared_ptr<grpc::Channel> channel,
+ const Ydb::Table::CreateTableRequest &request)
+{
std::unique_ptr<Ydb::Table::V1::TableService::Stub> stub;
stub = Ydb::Table::V1::TableService::NewStub(channel);
- grpc::ClientContext context;
- Ydb::Table::CreateTableResponse response;
- auto status = stub->CreateTable(&context, request, &response);
- auto deferred = response.operation();
- UNIT_ASSERT(status.ok());
- UNIT_ASSERT(deferred.ready());
- UNIT_ASSERT_VALUES_EQUAL(deferred.status(), Ydb::StatusIds::SUCCESS);
-}
-
-void CreateTable(std::shared_ptr<grpc::Channel> channel)
-{
- Ydb::Table::CreateTableRequest request;
- request.set_path("/Root/table-1");
- auto &col1 = *request.add_columns();
- col1.set_name("key");
+ grpc::ClientContext context;
+ Ydb::Table::CreateTableResponse response;
+ auto status = stub->CreateTable(&context, request, &response);
+ auto deferred = response.operation();
+ UNIT_ASSERT(status.ok());
+ UNIT_ASSERT(deferred.ready());
+ UNIT_ASSERT_VALUES_EQUAL(deferred.status(), Ydb::StatusIds::SUCCESS);
+}
+
+void CreateTable(std::shared_ptr<grpc::Channel> channel)
+{
+ Ydb::Table::CreateTableRequest request;
+ request.set_path("/Root/table-1");
+ auto &col1 = *request.add_columns();
+ col1.set_name("key");
col1.mutable_type()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::INT32);
- auto &col2 = *request.add_columns();
- col2.set_name("value");
- auto &decimalType = *col2.mutable_type()->mutable_optional_type()->mutable_item()->mutable_decimal_type();
- decimalType.set_precision(NScheme::DECIMAL_PRECISION);
- decimalType.set_scale(NScheme::DECIMAL_SCALE);
- request.add_primary_key("key");
-
- CreateTable(channel, request);
-}
-
-Y_UNIT_TEST_SUITE(TYqlDecimalTests) {
- Y_UNIT_TEST(SimpleUpsertSelect) {
- TKikimrWithGrpcAndRootSchema server;
- ui16 grpc = server.GetPort();
-
- std::shared_ptr<grpc::Channel> channel
- = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
- TString sessionId = CreateSession(channel);
-
- CreateTable(channel);
-
- ExecYql(channel, sessionId,
- "UPSERT INTO [/Root/table-1] (key, value) VALUES "
- "(1, CAST(\"1\" as DECIMAL(22,9))),"
- "(2, CAST(\"22.22\" as DECIMAL(22,9))),"
- "(3, CAST(\"9999999999999.999999999\" as DECIMAL(22,9)));");
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=1;",
- {{1, 0}});
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key >= 1 AND key <= 3;",
- {{1, 0}, {22, 220000000}, {9999999999999, 999999999}});
- }
-
- Y_UNIT_TEST(NegativeValues) {
- TKikimrWithGrpcAndRootSchema server;
- ui16 grpc = server.GetPort();
-
- std::shared_ptr<grpc::Channel> channel
- = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
- TString sessionId = CreateSession(channel);
-
- CreateTable(channel);
-
- ExecYql(channel, sessionId,
- "UPSERT INTO [/Root/table-1] (key, value) VALUES "
- "(1, CAST(\"-1\" as DECIMAL(22,9))),"
- "(2, CAST(\"-22.22\" as DECIMAL(22,9))),"
- "(3, CAST(\"-9999999999999.999999999\" as DECIMAL(22,9)));");
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=1;",
- {{-1, 0}});
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key >= 1 AND key <= 3;",
- {{-1, 0}, {-22, 220000000}, {-9999999999999, 999999999}});
- }
-
- Y_UNIT_TEST(DecimalKey) {
- TKikimrWithGrpcAndRootSchema server;
- ui16 grpc = server.GetPort();
-
- std::shared_ptr<grpc::Channel> channel
- = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
- TString sessionId = CreateSession(channel);
-
- Ydb::Table::CreateTableRequest request;
- request.set_path("/Root/table-1");
- auto &col1 = *request.add_columns();
- col1.set_name("key");
- auto &decimalType = *col1.mutable_type()->mutable_optional_type()->mutable_item()->mutable_decimal_type();
- decimalType.set_precision(NScheme::DECIMAL_PRECISION);
- decimalType.set_scale(NScheme::DECIMAL_SCALE);
- auto &col2 = *request.add_columns();
- col2.set_name("value");
- col2.mutable_type()->CopyFrom(col1.type());
- request.add_primary_key("key");
-
- CreateTable(channel, request);
-
- ExecYql(channel, sessionId, R"(
- UPSERT INTO [/Root/table-1] (key, value) VALUES
- (CAST("1" as DECIMAL(22,9)), CAST("1" as DECIMAL(22,9))),
- (CAST("22.22" as DECIMAL(22,9)), CAST("22.22" as DECIMAL(22,9))),
- (CAST("9999999999999.999999999" as DECIMAL(22,9)), CAST("9999999999999.999999999" as DECIMAL(22,9))),
- (CAST("-1" as DECIMAL(22,9)), CAST("-1" as DECIMAL(22,9))),
- (CAST("-22.22" as DECIMAL(22,9)), CAST("-22.22" as DECIMAL(22,9))),
- (CAST("-9999999999999.999999999" as DECIMAL(22,9)), CAST("-9999999999999.999999999" as DECIMAL(22,9)));
- )");
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"1\" as DECIMAL(22,9));",
- {{1, 0}});
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"22.22\" as DECIMAL(22,9));",
- {{22, 220000000}});
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"9999999999999.999999999\" as DECIMAL(22,9));",
- {{9999999999999, 999999999}});
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"-1\" as DECIMAL(22,9));",
- {{-1, 0}});
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"-22.22\" as DECIMAL(22,9));",
- {{-22, 220000000}});
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"-9999999999999.999999999\" as DECIMAL(22,9));",
- {{-9999999999999, 999999999}});
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key >= CAST(\"-22.22\" as DECIMAL(22,9))",
- {{-22, 220000000}, {-1, 0},
- {1, 0}, {22, 220000000}, {9999999999999, 999999999}});
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key < CAST(\"-22.22\" as DECIMAL(22,9))",
- {{-9999999999999, 999999999}});
-
- CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key > CAST(\"-22.222\" as DECIMAL(22,9)) AND key < CAST(\"22.222\" as DECIMAL(22,9))",
- {{-22, 220000000}, {-1, 0},
- {1, 0}, {22, 220000000}});
- }
-}
-
-void CheckDateValues(std::shared_ptr<grpc::Channel> channel,
- const TString &sessionId,
- const TString &yql,
- TVector<TInstant> vals)
-{
- auto result = ExecYql(channel, sessionId, yql);
- UNIT_ASSERT_VALUES_EQUAL(result.result_sets_size(), 1);
-
- auto &res = result.result_sets(0);
- UNIT_ASSERT_VALUES_EQUAL(res.rows_size(), vals.size());
- for (size_t i = 0; i < vals.size(); ++i) {
- UNIT_ASSERT_VALUES_EQUAL(res.rows(i).items(0).uint32_value(), vals[i].Days());
- }
-}
-
-void CheckDatetimeValues(std::shared_ptr<grpc::Channel> channel,
- const TString &sessionId,
- const TString &yql,
- TVector<TInstant> vals)
-{
- auto result = ExecYql(channel, sessionId, yql);
- UNIT_ASSERT_VALUES_EQUAL(result.result_sets_size(), 1);
-
- auto &res = result.result_sets(0);
- UNIT_ASSERT_VALUES_EQUAL(res.rows_size(), vals.size());
- for (size_t i = 0; i < vals.size(); ++i) {
- UNIT_ASSERT_VALUES_EQUAL(res.rows(i).items(0).uint32_value(), vals[i].Seconds());
- }
-}
-
-void CheckTimestampValues(std::shared_ptr<grpc::Channel> channel,
- const TString &sessionId,
- const TString &yql,
- TVector<TInstant> vals)
-{
- auto result = ExecYql(channel, sessionId, yql);
- UNIT_ASSERT_VALUES_EQUAL(result.result_sets_size(), 1);
-
- auto &res = result.result_sets(0);
- UNIT_ASSERT_VALUES_EQUAL(res.rows_size(), vals.size());
- for (size_t i = 0; i < vals.size(); ++i) {
- UNIT_ASSERT_VALUES_EQUAL(res.rows(i).items(0).uint64_value(), vals[i].MicroSeconds());
- }
-}
-
-void CheckIntervalValues(std::shared_ptr<grpc::Channel> channel,
- const TString &sessionId,
- const TString &yql,
- TVector<i64> vals)
-{
- auto result = ExecYql(channel, sessionId, yql);
- UNIT_ASSERT_VALUES_EQUAL(result.result_sets_size(), 1);
-
- auto &res = result.result_sets(0);
- UNIT_ASSERT_VALUES_EQUAL(res.rows_size(), vals.size());
- for (size_t i = 0; i < vals.size(); ++i) {
- UNIT_ASSERT_VALUES_EQUAL(res.rows(i).items(0).int64_value(), vals[i]);
- }
-}
-
-Y_UNIT_TEST_SUITE(TYqlDateTimeTests) {
- Y_UNIT_TEST(SimpleUpsertSelect) {
- TKikimrWithGrpcAndRootSchema server;
- ui16 grpc = server.GetPort();
-
- std::shared_ptr<grpc::Channel> channel
- = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
- TString sessionId = CreateSession(channel);
-
- Ydb::Table::CreateTableRequest request;
- TString scheme(R"___(
- path: "/Root/table-1"
- columns { name: "key" type: { optional_type { item { type_id: UINT64 } } } }
- columns { name: "val1" type: { optional_type { item { type_id: DATE } } } }
- columns { name: "val2" type: { optional_type { item { type_id: DATETIME } } } }
- columns { name: "val3" type: { optional_type { item { type_id: TIMESTAMP } } } }
- columns { name: "val4" type: { optional_type { item { type_id: INTERVAL } } } }
- primary_key: ["key"]
- )___");
- ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
-
- CreateTable(channel, request);
-
- ExecYql(channel, sessionId, R"___(
- UPSERT INTO [/Root/table-1] (key, val1, val2, val3, val4) VALUES
- (1, CAST(0 as DATE),
- CAST(0 as DATETIME),
- CAST(0 as TIMESTAMP),
- CAST(0 as INTERVAL)),
- (2, CAST(1000 as DATE),
- CAST(1000 as DATETIME),
- CAST(1000 as TIMESTAMP),
- CAST(1000 as INTERVAL)),
- (3, CAST('2050-01-01' as DATE),
- CAST('2050-01-01T00:00:00Z' as DATETIME),
- CAST('2050-01-01T00:00:00.000000Z' as TIMESTAMP),
- CAST(-1000 as INTERVAL));
- )___");
-
- CheckDateValues(channel, sessionId, "SELECT val1 FROM [/Root/table-1];",
- {TInstant::Zero(), TInstant::Days(1000), TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
-
- CheckDatetimeValues(channel, sessionId, "SELECT val2 FROM [/Root/table-1];",
- {TInstant::Zero(), TInstant::Seconds(1000), TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
-
- CheckTimestampValues(channel, sessionId, "SELECT val3 FROM [/Root/table-1];",
- {TInstant::Zero(), TInstant::MicroSeconds(1000), TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
-
- CheckIntervalValues(channel, sessionId, "SELECT val4 FROM [/Root/table-1];",
- {0, 1000, -1000});
- }
-
- Y_UNIT_TEST(DateKey) {
- TKikimrWithGrpcAndRootSchema server;
- ui16 grpc = server.GetPort();
-
- std::shared_ptr<grpc::Channel> channel
- = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
- TString sessionId = CreateSession(channel);
-
- Ydb::Table::CreateTableRequest request;
- TString scheme(R"___(
- path: "/Root/table-1"
- columns { name: "key" type: { optional_type { item { type_id: DATE } } } }
- primary_key: ["key"]
- )___");
- ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
-
- CreateTable(channel, request);
-
- ExecYql(channel, sessionId, R"___(
- UPSERT INTO [/Root/table-1] (key) VALUES
- (CAST('2000-01-01' as DATE)),
- (CAST('2020-01-01' as DATE)),
- (CAST('2050-01-01' as DATE));
- )___");
-
- CheckDateValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key = CAST('2050-01-01' as DATE);",
- {TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
- CheckDateValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key > CAST('2000-01-01' as DATE);",
- {TInstant::ParseIso8601("2020-01-01T00:00:00Z"),
- TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
- CheckDateValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key < CAST('2050-01-01' as DATE);",
- {TInstant::ParseIso8601("2000-01-01T00:00:00Z"),
- TInstant::ParseIso8601("2020-01-01T00:00:00Z")});
- }
-
- Y_UNIT_TEST(DatetimeKey) {
- TKikimrWithGrpcAndRootSchema server;
- ui16 grpc = server.GetPort();
-
- std::shared_ptr<grpc::Channel> channel
- = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
- TString sessionId = CreateSession(channel);
-
- Ydb::Table::CreateTableRequest request;
- TString scheme(R"___(
- path: "/Root/table-1"
- columns { name: "key" type: { optional_type { item { type_id: DATETIME } } } }
- primary_key: ["key"]
- )___");
- ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
-
- CreateTable(channel, request);
-
- ExecYql(channel, sessionId, R"___(
- UPSERT INTO [/Root/table-1] (key) VALUES
- (CAST('2000-01-01T00:00:00Z' as DATETIME)),
- (CAST('2020-01-01T00:00:00Z' as DATETIME)),
- (CAST('2050-01-01T00:00:00Z' as DATETIME));
- )___");
-
- CheckDatetimeValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key = CAST('2050-01-01T00:00:00Z' as DATETIME);",
- {TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
- CheckDatetimeValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key > CAST('2000-01-01T00:00:00Z' as DATETIME);",
- {TInstant::ParseIso8601("2020-01-01T00:00:00Z"),
- TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
- CheckDatetimeValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key < CAST('2050-01-01T00:00:00Z' as DATETIME);",
- {TInstant::ParseIso8601("2000-01-01T00:00:00Z"),
- TInstant::ParseIso8601("2020-01-01T00:00:00Z")});
- }
-
- Y_UNIT_TEST(TimestampKey) {
- TKikimrWithGrpcAndRootSchema server;
- ui16 grpc = server.GetPort();
-
- std::shared_ptr<grpc::Channel> channel
- = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
- TString sessionId = CreateSession(channel);
-
- Ydb::Table::CreateTableRequest request;
- TString scheme(R"___(
- path: "/Root/table-1"
- columns { name: "key" type: { optional_type { item { type_id: TIMESTAMP } } } }
- primary_key: ["key"]
- )___");
- ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
-
- CreateTable(channel, request);
-
- ExecYql(channel, sessionId, R"___(
- UPSERT INTO [/Root/table-1] (key) VALUES
- (CAST('2000-01-01T00:00:00.000000Z' as TIMESTAMP)),
- (CAST('2020-01-01T00:00:00.000000Z' as TIMESTAMP)),
- (CAST('2050-01-01T00:00:00.000000Z' as TIMESTAMP));
- )___");
-
- CheckTimestampValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key = CAST('2050-01-01T00:00:00.000000Z' as TIMESTAMP);",
- {TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
- CheckTimestampValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key > CAST('2000-01-01T00:00:00.000000Z' as TIMESTAMP);",
- {TInstant::ParseIso8601("2020-01-01T00:00:00Z"),
- TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
- CheckTimestampValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key < CAST('2050-01-01T00:00:00.000000Z' as TIMESTAMP);",
- {TInstant::ParseIso8601("2000-01-01T00:00:00Z"),
- TInstant::ParseIso8601("2020-01-01T00:00:00Z")});
- }
-
- Y_UNIT_TEST(IntervalKey) {
- TKikimrWithGrpcAndRootSchema server;
- ui16 grpc = server.GetPort();
-
- std::shared_ptr<grpc::Channel> channel
- = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
- TString sessionId = CreateSession(channel);
-
- Ydb::Table::CreateTableRequest request;
- TString scheme(R"___(
- path: "/Root/table-1"
- columns { name: "key" type: { optional_type { item { type_id: INTERVAL } } } }
- primary_key: ["key"]
- )___");
- ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
-
- CreateTable(channel, request);
-
- ExecYql(channel, sessionId, R"___(
- UPSERT INTO [/Root/table-1] (key) VALUES
- (CAST(0 as INTERVAL)),
- (CAST(1000 as INTERVAL)),
- (CAST(-1000 as INTERVAL));
- )___");
-
- CheckIntervalValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key = CAST(1000 as INTERVAL);",
- {1000});
- CheckIntervalValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key >= CAST(0 as INTERVAL);",
- {0, 1000});
- CheckIntervalValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key < CAST(1000 as INTERVAL);",
- {-1000, 0});
- }
-
- Y_UNIT_TEST(SimpleOperations) {
- TKikimrWithGrpcAndRootSchema server;
- ui16 grpc = server.GetPort();
-
- std::shared_ptr<grpc::Channel> channel
- = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
- TString sessionId = CreateSession(channel);
-
- {
- Ydb::Table::CreateTableRequest request;
- TString scheme(R"___(
- path: "/Root/table-1"
- columns { name: "key" type: { optional_type { item { type_id: UINT32 } } } }
- columns { name: "val" type: { optional_type { item { type_id: TIMESTAMP } } } }
- primary_key: ["key"]
- )___");
- ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
-
- CreateTable(channel, request);
- }
- {
- Ydb::Table::CreateTableRequest request;
- TString scheme(R"___(
- path: "/Root/table-2"
- columns { name: "key" type: { optional_type { item { type_id: UINT32 } } } }
- columns { name: "val" type: { optional_type { item { type_id: INTERVAL } } } }
- primary_key: ["key"]
- )___");
- ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
-
- CreateTable(channel, request);
- }
-
- ExecYql(channel, sessionId, R"___(
- UPSERT INTO [/Root/table-1] (key, val) VALUES
- (1, CAST('2000-01-01T00:00:00.000000Z' as TIMESTAMP)),
- (2, CAST('2020-01-01T00:00:00.000000Z' as TIMESTAMP));
- )___");
- ExecYql(channel, sessionId, R"___(
- UPSERT INTO [/Root/table-2] (key, val) VALUES
- (1, CAST(3600000000 as INTERVAL)),
- (2, CAST(143123456 as INTERVAL));
- )___");
-
- ExecYql(channel, sessionId, R"___(
- $t1 = (SELECT val FROM [/Root/table-1] WHERE key = 1);
- $t2 = (SELECT val FROM [/Root/table-1] WHERE key = 2);
- $i1 = (SELECT val FROM [/Root/table-2] WHERE key = 1);
- $i2 = (SELECT val FROM [/Root/table-2] WHERE key = 2);
- UPSERT INTO [/Root/table-1] (key, val) VALUES
- (3, $t1 + $i1),
- (4, $t2 + $i2);
- )___");
-
- ExecYql(channel, sessionId, R"___(
- $t1 = (SELECT val FROM [/Root/table-1] WHERE key = 1);
- $t2 = (SELECT val FROM [/Root/table-1] WHERE key = 2);
- $i1 = (SELECT val FROM [/Root/table-2] WHERE key = 1);
- $i2 = (SELECT val FROM [/Root/table-2] WHERE key = 2);
- UPSERT INTO [/Root/table-2] (key, val) VALUES
- (3, $i1 + $i2),
- (4, $t2 - $t1),
- (5, $t1 - $t2);
- )___");
-
- CheckTimestampValues(channel, sessionId, "SELECT val FROM [/Root/table-1] WHERE key = 3;",
- {TInstant::ParseIso8601("2000-01-01T01:00:00Z")});
-
- CheckTimestampValues(channel, sessionId, "SELECT val FROM [/Root/table-1] WHERE key = 4;",
- {TInstant::ParseIso8601("2020-01-01T00:00:00Z") + TDuration::MicroSeconds(143123456)});
-
- CheckIntervalValues(channel, sessionId, "SELECT val FROM [/Root/table-2] WHERE key = 3;",
- {3743123456});
-
- auto diff = TInstant::ParseIso8601("2020-01-01T00:00:00Z") - TInstant::ParseIso8601("2000-01-01T00:00:00Z");
- CheckIntervalValues(channel, sessionId, "SELECT val FROM [/Root/table-2] WHERE key = 4;",
- {static_cast<i64>(diff.MicroSeconds())});
-
- CheckIntervalValues(channel, sessionId, "SELECT val FROM [/Root/table-2] WHERE key = 5;",
- {- static_cast<i64>(diff.MicroSeconds())});
-
- CheckTimestampValues(channel, sessionId, R"___(
- $v1 = (SELECT val FROM [/Root/table-1] WHERE key = 1);
- $v2 = (SELECT val FROM [/Root/table-2] WHERE key = 1);
- SELECT ($v1 + $v2);)___",
- {TInstant::ParseIso8601("2000-01-01T01:00:00Z")});
- }
-}
-#endif
-
+ auto &col2 = *request.add_columns();
+ col2.set_name("value");
+ auto &decimalType = *col2.mutable_type()->mutable_optional_type()->mutable_item()->mutable_decimal_type();
+ decimalType.set_precision(NScheme::DECIMAL_PRECISION);
+ decimalType.set_scale(NScheme::DECIMAL_SCALE);
+ request.add_primary_key("key");
+
+ CreateTable(channel, request);
+}
+
+Y_UNIT_TEST_SUITE(TYqlDecimalTests) {
+ Y_UNIT_TEST(SimpleUpsertSelect) {
+ TKikimrWithGrpcAndRootSchema server;
+ ui16 grpc = server.GetPort();
+
+ std::shared_ptr<grpc::Channel> channel
+ = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+ TString sessionId = CreateSession(channel);
+
+ CreateTable(channel);
+
+ ExecYql(channel, sessionId,
+ "UPSERT INTO [/Root/table-1] (key, value) VALUES "
+ "(1, CAST(\"1\" as DECIMAL(22,9))),"
+ "(2, CAST(\"22.22\" as DECIMAL(22,9))),"
+ "(3, CAST(\"9999999999999.999999999\" as DECIMAL(22,9)));");
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=1;",
+ {{1, 0}});
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key >= 1 AND key <= 3;",
+ {{1, 0}, {22, 220000000}, {9999999999999, 999999999}});
+ }
+
+ Y_UNIT_TEST(NegativeValues) {
+ TKikimrWithGrpcAndRootSchema server;
+ ui16 grpc = server.GetPort();
+
+ std::shared_ptr<grpc::Channel> channel
+ = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+ TString sessionId = CreateSession(channel);
+
+ CreateTable(channel);
+
+ ExecYql(channel, sessionId,
+ "UPSERT INTO [/Root/table-1] (key, value) VALUES "
+ "(1, CAST(\"-1\" as DECIMAL(22,9))),"
+ "(2, CAST(\"-22.22\" as DECIMAL(22,9))),"
+ "(3, CAST(\"-9999999999999.999999999\" as DECIMAL(22,9)));");
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=1;",
+ {{-1, 0}});
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key >= 1 AND key <= 3;",
+ {{-1, 0}, {-22, 220000000}, {-9999999999999, 999999999}});
+ }
+
+ Y_UNIT_TEST(DecimalKey) {
+ TKikimrWithGrpcAndRootSchema server;
+ ui16 grpc = server.GetPort();
+
+ std::shared_ptr<grpc::Channel> channel
+ = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+ TString sessionId = CreateSession(channel);
+
+ Ydb::Table::CreateTableRequest request;
+ request.set_path("/Root/table-1");
+ auto &col1 = *request.add_columns();
+ col1.set_name("key");
+ auto &decimalType = *col1.mutable_type()->mutable_optional_type()->mutable_item()->mutable_decimal_type();
+ decimalType.set_precision(NScheme::DECIMAL_PRECISION);
+ decimalType.set_scale(NScheme::DECIMAL_SCALE);
+ auto &col2 = *request.add_columns();
+ col2.set_name("value");
+ col2.mutable_type()->CopyFrom(col1.type());
+ request.add_primary_key("key");
+
+ CreateTable(channel, request);
+
+ ExecYql(channel, sessionId, R"(
+ UPSERT INTO [/Root/table-1] (key, value) VALUES
+ (CAST("1" as DECIMAL(22,9)), CAST("1" as DECIMAL(22,9))),
+ (CAST("22.22" as DECIMAL(22,9)), CAST("22.22" as DECIMAL(22,9))),
+ (CAST("9999999999999.999999999" as DECIMAL(22,9)), CAST("9999999999999.999999999" as DECIMAL(22,9))),
+ (CAST("-1" as DECIMAL(22,9)), CAST("-1" as DECIMAL(22,9))),
+ (CAST("-22.22" as DECIMAL(22,9)), CAST("-22.22" as DECIMAL(22,9))),
+ (CAST("-9999999999999.999999999" as DECIMAL(22,9)), CAST("-9999999999999.999999999" as DECIMAL(22,9)));
+ )");
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"1\" as DECIMAL(22,9));",
+ {{1, 0}});
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"22.22\" as DECIMAL(22,9));",
+ {{22, 220000000}});
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"9999999999999.999999999\" as DECIMAL(22,9));",
+ {{9999999999999, 999999999}});
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"-1\" as DECIMAL(22,9));",
+ {{-1, 0}});
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"-22.22\" as DECIMAL(22,9));",
+ {{-22, 220000000}});
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key=CAST(\"-9999999999999.999999999\" as DECIMAL(22,9));",
+ {{-9999999999999, 999999999}});
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key >= CAST(\"-22.22\" as DECIMAL(22,9))",
+ {{-22, 220000000}, {-1, 0},
+ {1, 0}, {22, 220000000}, {9999999999999, 999999999}});
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key < CAST(\"-22.22\" as DECIMAL(22,9))",
+ {{-9999999999999, 999999999}});
+
+ CheckYqlDecimalValues(channel, sessionId, "SELECT value FROM [/Root/table-1] WHERE key > CAST(\"-22.222\" as DECIMAL(22,9)) AND key < CAST(\"22.222\" as DECIMAL(22,9))",
+ {{-22, 220000000}, {-1, 0},
+ {1, 0}, {22, 220000000}});
+ }
+}
+
+void CheckDateValues(std::shared_ptr<grpc::Channel> channel,
+ const TString &sessionId,
+ const TString &yql,
+ TVector<TInstant> vals)
+{
+ auto result = ExecYql(channel, sessionId, yql);
+ UNIT_ASSERT_VALUES_EQUAL(result.result_sets_size(), 1);
+
+ auto &res = result.result_sets(0);
+ UNIT_ASSERT_VALUES_EQUAL(res.rows_size(), vals.size());
+ for (size_t i = 0; i < vals.size(); ++i) {
+ UNIT_ASSERT_VALUES_EQUAL(res.rows(i).items(0).uint32_value(), vals[i].Days());
+ }
+}
+
+void CheckDatetimeValues(std::shared_ptr<grpc::Channel> channel,
+ const TString &sessionId,
+ const TString &yql,
+ TVector<TInstant> vals)
+{
+ auto result = ExecYql(channel, sessionId, yql);
+ UNIT_ASSERT_VALUES_EQUAL(result.result_sets_size(), 1);
+
+ auto &res = result.result_sets(0);
+ UNIT_ASSERT_VALUES_EQUAL(res.rows_size(), vals.size());
+ for (size_t i = 0; i < vals.size(); ++i) {
+ UNIT_ASSERT_VALUES_EQUAL(res.rows(i).items(0).uint32_value(), vals[i].Seconds());
+ }
+}
+
+void CheckTimestampValues(std::shared_ptr<grpc::Channel> channel,
+ const TString &sessionId,
+ const TString &yql,
+ TVector<TInstant> vals)
+{
+ auto result = ExecYql(channel, sessionId, yql);
+ UNIT_ASSERT_VALUES_EQUAL(result.result_sets_size(), 1);
+
+ auto &res = result.result_sets(0);
+ UNIT_ASSERT_VALUES_EQUAL(res.rows_size(), vals.size());
+ for (size_t i = 0; i < vals.size(); ++i) {
+ UNIT_ASSERT_VALUES_EQUAL(res.rows(i).items(0).uint64_value(), vals[i].MicroSeconds());
+ }
+}
+
+void CheckIntervalValues(std::shared_ptr<grpc::Channel> channel,
+ const TString &sessionId,
+ const TString &yql,
+ TVector<i64> vals)
+{
+ auto result = ExecYql(channel, sessionId, yql);
+ UNIT_ASSERT_VALUES_EQUAL(result.result_sets_size(), 1);
+
+ auto &res = result.result_sets(0);
+ UNIT_ASSERT_VALUES_EQUAL(res.rows_size(), vals.size());
+ for (size_t i = 0; i < vals.size(); ++i) {
+ UNIT_ASSERT_VALUES_EQUAL(res.rows(i).items(0).int64_value(), vals[i]);
+ }
+}
+
+Y_UNIT_TEST_SUITE(TYqlDateTimeTests) {
+ Y_UNIT_TEST(SimpleUpsertSelect) {
+ TKikimrWithGrpcAndRootSchema server;
+ ui16 grpc = server.GetPort();
+
+ std::shared_ptr<grpc::Channel> channel
+ = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+ TString sessionId = CreateSession(channel);
+
+ Ydb::Table::CreateTableRequest request;
+ TString scheme(R"___(
+ path: "/Root/table-1"
+ columns { name: "key" type: { optional_type { item { type_id: UINT64 } } } }
+ columns { name: "val1" type: { optional_type { item { type_id: DATE } } } }
+ columns { name: "val2" type: { optional_type { item { type_id: DATETIME } } } }
+ columns { name: "val3" type: { optional_type { item { type_id: TIMESTAMP } } } }
+ columns { name: "val4" type: { optional_type { item { type_id: INTERVAL } } } }
+ primary_key: ["key"]
+ )___");
+ ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
+
+ CreateTable(channel, request);
+
+ ExecYql(channel, sessionId, R"___(
+ UPSERT INTO [/Root/table-1] (key, val1, val2, val3, val4) VALUES
+ (1, CAST(0 as DATE),
+ CAST(0 as DATETIME),
+ CAST(0 as TIMESTAMP),
+ CAST(0 as INTERVAL)),
+ (2, CAST(1000 as DATE),
+ CAST(1000 as DATETIME),
+ CAST(1000 as TIMESTAMP),
+ CAST(1000 as INTERVAL)),
+ (3, CAST('2050-01-01' as DATE),
+ CAST('2050-01-01T00:00:00Z' as DATETIME),
+ CAST('2050-01-01T00:00:00.000000Z' as TIMESTAMP),
+ CAST(-1000 as INTERVAL));
+ )___");
+
+ CheckDateValues(channel, sessionId, "SELECT val1 FROM [/Root/table-1];",
+ {TInstant::Zero(), TInstant::Days(1000), TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
+
+ CheckDatetimeValues(channel, sessionId, "SELECT val2 FROM [/Root/table-1];",
+ {TInstant::Zero(), TInstant::Seconds(1000), TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
+
+ CheckTimestampValues(channel, sessionId, "SELECT val3 FROM [/Root/table-1];",
+ {TInstant::Zero(), TInstant::MicroSeconds(1000), TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
+
+ CheckIntervalValues(channel, sessionId, "SELECT val4 FROM [/Root/table-1];",
+ {0, 1000, -1000});
+ }
+
+ Y_UNIT_TEST(DateKey) {
+ TKikimrWithGrpcAndRootSchema server;
+ ui16 grpc = server.GetPort();
+
+ std::shared_ptr<grpc::Channel> channel
+ = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+ TString sessionId = CreateSession(channel);
+
+ Ydb::Table::CreateTableRequest request;
+ TString scheme(R"___(
+ path: "/Root/table-1"
+ columns { name: "key" type: { optional_type { item { type_id: DATE } } } }
+ primary_key: ["key"]
+ )___");
+ ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
+
+ CreateTable(channel, request);
+
+ ExecYql(channel, sessionId, R"___(
+ UPSERT INTO [/Root/table-1] (key) VALUES
+ (CAST('2000-01-01' as DATE)),
+ (CAST('2020-01-01' as DATE)),
+ (CAST('2050-01-01' as DATE));
+ )___");
+
+ CheckDateValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key = CAST('2050-01-01' as DATE);",
+ {TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
+ CheckDateValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key > CAST('2000-01-01' as DATE);",
+ {TInstant::ParseIso8601("2020-01-01T00:00:00Z"),
+ TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
+ CheckDateValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key < CAST('2050-01-01' as DATE);",
+ {TInstant::ParseIso8601("2000-01-01T00:00:00Z"),
+ TInstant::ParseIso8601("2020-01-01T00:00:00Z")});
+ }
+
+ Y_UNIT_TEST(DatetimeKey) {
+ TKikimrWithGrpcAndRootSchema server;
+ ui16 grpc = server.GetPort();
+
+ std::shared_ptr<grpc::Channel> channel
+ = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+ TString sessionId = CreateSession(channel);
+
+ Ydb::Table::CreateTableRequest request;
+ TString scheme(R"___(
+ path: "/Root/table-1"
+ columns { name: "key" type: { optional_type { item { type_id: DATETIME } } } }
+ primary_key: ["key"]
+ )___");
+ ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
+
+ CreateTable(channel, request);
+
+ ExecYql(channel, sessionId, R"___(
+ UPSERT INTO [/Root/table-1] (key) VALUES
+ (CAST('2000-01-01T00:00:00Z' as DATETIME)),
+ (CAST('2020-01-01T00:00:00Z' as DATETIME)),
+ (CAST('2050-01-01T00:00:00Z' as DATETIME));
+ )___");
+
+ CheckDatetimeValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key = CAST('2050-01-01T00:00:00Z' as DATETIME);",
+ {TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
+ CheckDatetimeValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key > CAST('2000-01-01T00:00:00Z' as DATETIME);",
+ {TInstant::ParseIso8601("2020-01-01T00:00:00Z"),
+ TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
+ CheckDatetimeValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key < CAST('2050-01-01T00:00:00Z' as DATETIME);",
+ {TInstant::ParseIso8601("2000-01-01T00:00:00Z"),
+ TInstant::ParseIso8601("2020-01-01T00:00:00Z")});
+ }
+
+ Y_UNIT_TEST(TimestampKey) {
+ TKikimrWithGrpcAndRootSchema server;
+ ui16 grpc = server.GetPort();
+
+ std::shared_ptr<grpc::Channel> channel
+ = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+ TString sessionId = CreateSession(channel);
+
+ Ydb::Table::CreateTableRequest request;
+ TString scheme(R"___(
+ path: "/Root/table-1"
+ columns { name: "key" type: { optional_type { item { type_id: TIMESTAMP } } } }
+ primary_key: ["key"]
+ )___");
+ ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
+
+ CreateTable(channel, request);
+
+ ExecYql(channel, sessionId, R"___(
+ UPSERT INTO [/Root/table-1] (key) VALUES
+ (CAST('2000-01-01T00:00:00.000000Z' as TIMESTAMP)),
+ (CAST('2020-01-01T00:00:00.000000Z' as TIMESTAMP)),
+ (CAST('2050-01-01T00:00:00.000000Z' as TIMESTAMP));
+ )___");
+
+ CheckTimestampValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key = CAST('2050-01-01T00:00:00.000000Z' as TIMESTAMP);",
+ {TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
+ CheckTimestampValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key > CAST('2000-01-01T00:00:00.000000Z' as TIMESTAMP);",
+ {TInstant::ParseIso8601("2020-01-01T00:00:00Z"),
+ TInstant::ParseIso8601("2050-01-01T00:00:00Z")});
+ CheckTimestampValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key < CAST('2050-01-01T00:00:00.000000Z' as TIMESTAMP);",
+ {TInstant::ParseIso8601("2000-01-01T00:00:00Z"),
+ TInstant::ParseIso8601("2020-01-01T00:00:00Z")});
+ }
+
+ Y_UNIT_TEST(IntervalKey) {
+ TKikimrWithGrpcAndRootSchema server;
+ ui16 grpc = server.GetPort();
+
+ std::shared_ptr<grpc::Channel> channel
+ = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+ TString sessionId = CreateSession(channel);
+
+ Ydb::Table::CreateTableRequest request;
+ TString scheme(R"___(
+ path: "/Root/table-1"
+ columns { name: "key" type: { optional_type { item { type_id: INTERVAL } } } }
+ primary_key: ["key"]
+ )___");
+ ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
+
+ CreateTable(channel, request);
+
+ ExecYql(channel, sessionId, R"___(
+ UPSERT INTO [/Root/table-1] (key) VALUES
+ (CAST(0 as INTERVAL)),
+ (CAST(1000 as INTERVAL)),
+ (CAST(-1000 as INTERVAL));
+ )___");
+
+ CheckIntervalValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key = CAST(1000 as INTERVAL);",
+ {1000});
+ CheckIntervalValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key >= CAST(0 as INTERVAL);",
+ {0, 1000});
+ CheckIntervalValues(channel, sessionId, "SELECT key FROM [/Root/table-1] WHERE key < CAST(1000 as INTERVAL);",
+ {-1000, 0});
+ }
+
+ Y_UNIT_TEST(SimpleOperations) {
+ TKikimrWithGrpcAndRootSchema server;
+ ui16 grpc = server.GetPort();
+
+ std::shared_ptr<grpc::Channel> channel
+ = grpc::CreateChannel("localhost:" + ToString(grpc), grpc::InsecureChannelCredentials());
+ TString sessionId = CreateSession(channel);
+
+ {
+ Ydb::Table::CreateTableRequest request;
+ TString scheme(R"___(
+ path: "/Root/table-1"
+ columns { name: "key" type: { optional_type { item { type_id: UINT32 } } } }
+ columns { name: "val" type: { optional_type { item { type_id: TIMESTAMP } } } }
+ primary_key: ["key"]
+ )___");
+ ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
+
+ CreateTable(channel, request);
+ }
+ {
+ Ydb::Table::CreateTableRequest request;
+ TString scheme(R"___(
+ path: "/Root/table-2"
+ columns { name: "key" type: { optional_type { item { type_id: UINT32 } } } }
+ columns { name: "val" type: { optional_type { item { type_id: INTERVAL } } } }
+ primary_key: ["key"]
+ )___");
+ ::google::protobuf::TextFormat::ParseFromString(scheme, &request);
+
+ CreateTable(channel, request);
+ }
+
+ ExecYql(channel, sessionId, R"___(
+ UPSERT INTO [/Root/table-1] (key, val) VALUES
+ (1, CAST('2000-01-01T00:00:00.000000Z' as TIMESTAMP)),
+ (2, CAST('2020-01-01T00:00:00.000000Z' as TIMESTAMP));
+ )___");
+ ExecYql(channel, sessionId, R"___(
+ UPSERT INTO [/Root/table-2] (key, val) VALUES
+ (1, CAST(3600000000 as INTERVAL)),
+ (2, CAST(143123456 as INTERVAL));
+ )___");
+
+ ExecYql(channel, sessionId, R"___(
+ $t1 = (SELECT val FROM [/Root/table-1] WHERE key = 1);
+ $t2 = (SELECT val FROM [/Root/table-1] WHERE key = 2);
+ $i1 = (SELECT val FROM [/Root/table-2] WHERE key = 1);
+ $i2 = (SELECT val FROM [/Root/table-2] WHERE key = 2);
+ UPSERT INTO [/Root/table-1] (key, val) VALUES
+ (3, $t1 + $i1),
+ (4, $t2 + $i2);
+ )___");
+
+ ExecYql(channel, sessionId, R"___(
+ $t1 = (SELECT val FROM [/Root/table-1] WHERE key = 1);
+ $t2 = (SELECT val FROM [/Root/table-1] WHERE key = 2);
+ $i1 = (SELECT val FROM [/Root/table-2] WHERE key = 1);
+ $i2 = (SELECT val FROM [/Root/table-2] WHERE key = 2);
+ UPSERT INTO [/Root/table-2] (key, val) VALUES
+ (3, $i1 + $i2),
+ (4, $t2 - $t1),
+ (5, $t1 - $t2);
+ )___");
+
+ CheckTimestampValues(channel, sessionId, "SELECT val FROM [/Root/table-1] WHERE key = 3;",
+ {TInstant::ParseIso8601("2000-01-01T01:00:00Z")});
+
+ CheckTimestampValues(channel, sessionId, "SELECT val FROM [/Root/table-1] WHERE key = 4;",
+ {TInstant::ParseIso8601("2020-01-01T00:00:00Z") + TDuration::MicroSeconds(143123456)});
+
+ CheckIntervalValues(channel, sessionId, "SELECT val FROM [/Root/table-2] WHERE key = 3;",
+ {3743123456});
+
+ auto diff = TInstant::ParseIso8601("2020-01-01T00:00:00Z") - TInstant::ParseIso8601("2000-01-01T00:00:00Z");
+ CheckIntervalValues(channel, sessionId, "SELECT val FROM [/Root/table-2] WHERE key = 4;",
+ {static_cast<i64>(diff.MicroSeconds())});
+
+ CheckIntervalValues(channel, sessionId, "SELECT val FROM [/Root/table-2] WHERE key = 5;",
+ {- static_cast<i64>(diff.MicroSeconds())});
+
+ CheckTimestampValues(channel, sessionId, R"___(
+ $v1 = (SELECT val FROM [/Root/table-1] WHERE key = 1);
+ $v2 = (SELECT val FROM [/Root/table-2] WHERE key = 1);
+ SELECT ($v1 + $v2);)___",
+ {TInstant::ParseIso8601("2000-01-01T01:00:00Z")});
+ }
+}
+#endif
+
Y_UNIT_TEST_SUITE(LocalityOperation) {
Y_UNIT_TEST(LocksFromAnotherTenants) {
TKikimrWithGrpcAndRootSchema server;
//server.Server_->SetupLogging(
-
+
auto connection = NYdb::TDriver(
TDriverConfig()
.SetEndpoint(TStringBuilder() << "localhost:" << server.GetPort()));
diff --git a/ydb/tests/functional/tenants/test_dynamic_tenants.py b/ydb/tests/functional/tenants/test_dynamic_tenants.py
index b2558d0bde8..bdf7d597824 100644
--- a/ydb/tests/functional/tenants/test_dynamic_tenants.py
+++ b/ydb/tests/functional/tenants/test_dynamic_tenants.py
@@ -1,8 +1,8 @@
-# -*- coding: utf-8 -*-
+# -*- coding: utf-8 -*-
import os
-import logging
+import logging
import time
-
+
from hamcrest import (
any_of,
assert_that,
@@ -12,12 +12,12 @@ from hamcrest import (
)
import ydb
-
+
from common import DBWithDynamicSlot, DBForStaticSlots, Runtime
-
-logger = logging.getLogger(__name__)
-
-
+
+logger = logging.getLogger(__name__)
+
+
class TestCreateTenantNoCPU(DBWithDynamicSlot):
def test_case(self):
database = '/Root/users/database'
@@ -26,9 +26,9 @@ class TestCreateTenantNoCPU(DBWithDynamicSlot):
storage_pool_units_count={
'hdd': 1
}
- )
+ )
self.cluster.remove_database(database)
-
+
class TestCreateTenantWithCPU(DBWithDynamicSlot):
def test_case(self):
@@ -115,10 +115,10 @@ class TestCreateTenantThenExecYQL(DBWithDynamicSlot):
storage_pool_units_count={
'hdd': 1
}
- )
+ )
self.cluster.register_and_start_slots(database, count=1)
self.cluster.wait_tenant_up(database)
-
+
d_configs = [driver_config, driver_config2]
for d_config in d_configs:
table_path = '%s/table-1' % database
@@ -130,12 +130,12 @@ class TestCreateTenantThenExecYQL(DBWithDynamicSlot):
table_path
)
)
-
+
session.transaction().execute(
"upsert into `{}` (key) values (101);".format(table_path),
commit_tx=True
)
-
+
session.transaction().execute("select key from `{}`;".format(table_path), commit_tx=True)
diff --git a/ydb/tests/functional/tenants/ya.make b/ydb/tests/functional/tenants/ya.make
index 20e2925c0db..dee204013e0 100644
--- a/ydb/tests/functional/tenants/ya.make
+++ b/ydb/tests/functional/tenants/ya.make
@@ -4,7 +4,7 @@ ENV(YDB_DRIVER_BINARY="ydb/apps/ydbd/ydbd")
TEST_SRCS(
common.py
test_db_counters.py
- test_dynamic_tenants.py
+ test_dynamic_tenants.py
test_tenants.py
test_storage_config.py
test_system_views.py
diff --git a/ydb/tests/library/common/protobuf_console.py b/ydb/tests/library/common/protobuf_console.py
index 75a80b0b94f..2706cfc1b0d 100644
--- a/ydb/tests/library/common/protobuf_console.py
+++ b/ydb/tests/library/common/protobuf_console.py
@@ -1,32 +1,32 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
import ydb.core.protos.msgbus_pb2 as msgbus
-
+
from ydb.tests.library.common.protobuf import AbstractProtobufBuilder
-
-
-class CreateTenantRequest(AbstractProtobufBuilder):
- """
+
+
+class CreateTenantRequest(AbstractProtobufBuilder):
+ """
See /arcadia/ydb/public/api/protos/ydb_cms.proto
- """
-
- def __init__(self, path):
- super(CreateTenantRequest, self).__init__(msgbus.TConsoleRequest())
- self.protobuf.CreateTenantRequest.Request.path = path
-
- def add_storage_pool(self, pool_type, pool_size):
- pool = self.protobuf.CreateTenantRequest.Request.resources.storage_units.add()
- pool.unit_kind = pool_type
- pool.count = pool_size
- return self
-
- def add_slot(self, count, kind='slot', zone='any'):
- slot = self.protobuf.CreateTenantRequest.Request.resources.computational_units.add()
- slot.unit_kind = kind
- slot.availability_zone = zone
- slot.count = count
- return self
-
+ """
+
+ def __init__(self, path):
+ super(CreateTenantRequest, self).__init__(msgbus.TConsoleRequest())
+ self.protobuf.CreateTenantRequest.Request.path = path
+
+ def add_storage_pool(self, pool_type, pool_size):
+ pool = self.protobuf.CreateTenantRequest.Request.resources.storage_units.add()
+ pool.unit_kind = pool_type
+ pool.count = pool_size
+ return self
+
+ def add_slot(self, count, kind='slot', zone='any'):
+ slot = self.protobuf.CreateTenantRequest.Request.resources.computational_units.add()
+ slot.unit_kind = kind
+ slot.availability_zone = zone
+ slot.count = count
+ return self
+
def add_shared_storage_pool(self, pool_type, pool_size):
pool = self.protobuf.CreateTenantRequest.Request.shared_resources.storage_units.add()
pool.unit_kind = pool_type
@@ -97,15 +97,15 @@ class AlterTenantRequest(AbstractProtobufBuilder):
quotas.data_size_soft_quota = soft
-class GetTenantStatusRequest(AbstractProtobufBuilder):
- """
+class GetTenantStatusRequest(AbstractProtobufBuilder):
+ """
See /arcadia/ydb/public/api/protos/ydb_cms.proto
- """
-
- def __init__(self, path):
- super(GetTenantStatusRequest, self).__init__(msgbus.TConsoleRequest())
- self.protobuf.GetTenantStatusRequest.Request.path = path
-
+ """
+
+ def __init__(self, path):
+ super(GetTenantStatusRequest, self).__init__(msgbus.TConsoleRequest())
+ self.protobuf.GetTenantStatusRequest.Request.path = path
+
class RemoveTenantRequest(AbstractProtobufBuilder):
"""
@@ -117,37 +117,37 @@ class RemoveTenantRequest(AbstractProtobufBuilder):
self.protobuf.RemoveTenantRequest.Request.path = path
-class SetConfigRequest(AbstractProtobufBuilder):
- """
+class SetConfigRequest(AbstractProtobufBuilder):
+ """
See /arcadia/ydb/core/protos/console.proto
- """
-
- def __init__(self):
- super(SetConfigRequest, self).__init__(msgbus.TConsoleRequest())
-
+ """
+
+ def __init__(self):
+ super(SetConfigRequest, self).__init__(msgbus.TConsoleRequest())
+
def set_restrictions(self, tenant_usage_scope_kinds=()):
restrictions = self.protobuf.SetConfigRequest.Config.ConfigsConfig.UsageScopeRestrictions
restrictions.AllowedTenantUsageScopeKinds.extend(tenant_usage_scope_kinds)
return self
- def add_zone(self, kind, dc):
- zone = self.protobuf.SetConfigRequest.Config.TenantsConfig.AvailabilityZoneKinds.add()
- zone.Kind = kind
- zone.DataCenterName = dc
- return self
-
- def add_zone_set(self, name, zones):
- zone_set = self.protobuf.SetConfigRequest.Config.TenantsConfig.AvailabilityZoneSets.add()
- zone_set.Name = name
+ def add_zone(self, kind, dc):
+ zone = self.protobuf.SetConfigRequest.Config.TenantsConfig.AvailabilityZoneKinds.add()
+ zone.Kind = kind
+ zone.DataCenterName = dc
+ return self
+
+ def add_zone_set(self, name, zones):
+ zone_set = self.protobuf.SetConfigRequest.Config.TenantsConfig.AvailabilityZoneSets.add()
+ zone_set.Name = name
zone_set.ZoneKinds.extend(zones)
- return self
-
- def add_unit_kind(self, kind, slot_type, zone_set):
- unit = self.protobuf.SetConfigRequest.Config.TenantsConfig.ComputationalUnitKinds.add()
- unit.Kind = kind
- unit.TenantSlotType = slot_type
- unit.AvailabilityZoneSet = zone_set
- return self
+ return self
+
+ def add_unit_kind(self, kind, slot_type, zone_set):
+ unit = self.protobuf.SetConfigRequest.Config.TenantsConfig.ComputationalUnitKinds.add()
+ unit.Kind = kind
+ unit.TenantSlotType = slot_type
+ unit.AvailabilityZoneSet = zone_set
+ return self
class GetOperationRequest(AbstractProtobufBuilder):
diff --git a/ydb/tests/library/common/types.py b/ydb/tests/library/common/types.py
index 2d21c0370e7..5ec564d65fa 100644
--- a/ydb/tests/library/common/types.py
+++ b/ydb/tests/library/common/types.py
@@ -161,10 +161,10 @@ class TabletTypes(Enum):
FLAT_HIVE = _tablet_type(14, 0xA001, is_unique=True, service_name='HIVE')
FLAT_SCHEMESHARD = _tablet_type(16, 0x8587a0, is_unique=True, service_name='FLAT_TX_SCHEMESHARD')
- CMS = _tablet_type(21, 0x2000, is_unique=True, service_name='CMS')
+ CMS = _tablet_type(21, 0x2000, is_unique=True, service_name='CMS')
NODE_BROKER = _tablet_type(22, 0x2001, is_unique=True, service_name='NODE_BROKER')
- TENANT_SLOT_BROKER = _tablet_type(27, 0x2002, is_unique=True, service_name='TENANT_SLOT_BROKER')
- CONSOLE = _tablet_type(28, 0x2003, is_unique=True, service_name='CONSOLE')
+ TENANT_SLOT_BROKER = _tablet_type(27, 0x2002, is_unique=True, service_name='TENANT_SLOT_BROKER')
+ CONSOLE = _tablet_type(28, 0x2003, is_unique=True, service_name='CONSOLE')
FLAT_BS_CONTROLLER = _tablet_type(15, 0x1001, is_unique=True, service_name='BS_CONTROLLER')
USER_TYPE_START = _tablet_type(0xFF, 0)
diff --git a/ydb/tests/library/harness/kikimr_config.py b/ydb/tests/library/harness/kikimr_config.py
index d35b80ea26b..57c282b9f41 100644
--- a/ydb/tests/library/harness/kikimr_config.py
+++ b/ydb/tests/library/harness/kikimr_config.py
@@ -159,7 +159,7 @@ class KikimrConfigGenerator(object):
self.__udfs_path = udfs_path
self.__yql_config_path = yql_config_path
self.__auth_config_path = auth_config_path
- self.__slot_count = slot_count
+ self.__slot_count = slot_count
self._dcs = [1]
if erasure == Erasure.MIRROR_3_DC:
self._dcs = [1, 2, 3]
diff --git a/ydb/tests/library/harness/kikimr_runner.py b/ydb/tests/library/harness/kikimr_runner.py
index e3b1eeebc8e..251f485b5db 100644
--- a/ydb/tests/library/harness/kikimr_runner.py
+++ b/ydb/tests/library/harness/kikimr_runner.py
@@ -5,7 +5,7 @@ import shutil
import tempfile
import time
import itertools
-from google.protobuf import text_format
+from google.protobuf import text_format
import ydb.tests.library.common.yatest_common as yatest_common
@@ -67,8 +67,8 @@ class KiKiMRNode(daemon.Daemon, kikimr_node_interface.NodeInterface):
if configurator.sqs_service_enabled:
self.sqs_port = port_allocator.sqs_port
- self.__role = role
- self.__node_broker_port = node_broker_port
+ self.__role = role
+ self.__node_broker_port = node_broker_port
self.__log_file = tempfile.NamedTemporaryFile(dir=self.cwd, prefix="logfile_", suffix=".log", delete=False)
self.__cms_config_cache_file = tempfile.NamedTemporaryFile(
dir=self.cwd,
@@ -124,9 +124,9 @@ class KiKiMRNode(daemon.Daemon, kikimr_node_interface.NodeInterface):
"grpcs://" if self.__configurator.grpc_ssl_enable else "",
self.host,
self.__node_broker_port))
- else:
+ else:
command.append("--node=%d" % self.node_id)
-
+
if self.__configurator.grpc_ssl_enable:
command.append(
"--ca=%s" % self.__configurator.grpc_tls_ca_path
@@ -136,7 +136,7 @@ class KiKiMRNode(daemon.Daemon, kikimr_node_interface.NodeInterface):
command.append(
"--tenant=%s" % self._tenant_affiliation
)
-
+
if self.__configurator.grpc_ssl_enable:
command.append(
"--grpcs-port={}".format(
@@ -291,7 +291,7 @@ class KiKiMR(kikimr_cluster_interface.KiKiMRClusterInterface):
self.__wait_for_bs_controller_to_start()
self.__add_bs_box()
-
+
pools = {}
for p in self.__configurator.dynamic_storage_pools:
@@ -354,46 +354,46 @@ class KiKiMR(kikimr_cluster_interface.KiKiMRClusterInterface):
)
self._slots[slot_index] = KiKiMRNode(
slot_index,
- self.config_path,
+ self.config_path,
port_allocator=self.__port_allocator.get_slot_port_allocator(slot_index),
- cluster_name=self.__cluster_name,
- configurator=self.__configurator,
- udfs_dir=self.__common_udfs_dir,
- role='slot',
+ cluster_name=self.__cluster_name,
+ configurator=self.__configurator,
+ udfs_dir=self.__common_udfs_dir,
+ role='slot',
node_broker_port=node_broker_port,
tenant_affiliation=tenant_affiliation,
encryption_key=encryption_key,
- )
+ )
return self._slots[slot_index]
-
- def __stop_node(self, node):
- ret = None
- try:
- node.stop()
+
+ def __stop_node(self, node):
+ ret = None
+ try:
+ node.stop()
except daemon.DaemonError as exceptions:
- ret = exceptions
- else:
- if self.__tmpdir is not None:
- shutil.rmtree(self.__tmpdir, ignore_errors=True)
- if self.__common_udfs_dir is not None:
- shutil.rmtree(self.__common_udfs_dir, ignore_errors=True)
- return ret
-
+ ret = exceptions
+ else:
+ if self.__tmpdir is not None:
+ shutil.rmtree(self.__tmpdir, ignore_errors=True)
+ if self.__common_udfs_dir is not None:
+ shutil.rmtree(self.__common_udfs_dir, ignore_errors=True)
+ return ret
+
def stop(self):
saved_exceptions = []
- for slot in self.slots.values():
- exception = self.__stop_node(slot)
- if exception is not None:
- saved_exceptions.append(exception)
-
+ for slot in self.slots.values():
+ exception = self.__stop_node(slot)
+ if exception is not None:
+ saved_exceptions.append(exception)
+
for node in self.nodes.values():
exception = self.__stop_node(node)
if exception is not None:
saved_exceptions.append(exception)
self.__port_allocator.release_ports()
-
+
if saved_exceptions:
raise daemon.SeveralDaemonErrors(saved_exceptions)
@@ -430,31 +430,31 @@ class KiKiMR(kikimr_cluster_interface.KiKiMRClusterInterface):
self.nodes[node_id].format_pdisk(**pdisk)
- def __add_bs_box(self):
+ def __add_bs_box(self):
request = bs.TConfigRequest()
-
- for node_id in self.__configurator.all_node_ids():
+
+ for node_id in self.__configurator.all_node_ids():
cmd = request.Command.add()
cmd.DefineHostConfig.HostConfigId = node_id
for drive in self.__configurator.pdisks_info:
if drive['node_id'] != node_id:
continue
- drive_proto = cmd.DefineHostConfig.Drive.add()
+ drive_proto = cmd.DefineHostConfig.Drive.add()
drive_proto.Path = drive['pdisk_path']
drive_proto.Kind = drive['pdisk_user_kind']
drive_proto.Type = drive.get('pdisk_type', 0)
-
- cmd = request.Command.add()
- cmd.DefineBox.BoxId = 1
- for node_id, node in self.nodes.items():
- host = cmd.DefineBox.Host.add()
- host.Key.Fqdn = node.host
- host.Key.IcPort = node.ic_port
- host.HostConfigId = node_id
-
+
+ cmd = request.Command.add()
+ cmd.DefineBox.BoxId = 1
+ for node_id, node in self.nodes.items():
+ host = cmd.DefineBox.Host.add()
+ host.Key.Fqdn = node.host
+ host.Key.IcPort = node.ic_port
+ host.HostConfigId = node_id
+
self._bs_config_invoke(request)
-
+
def _bs_config_invoke(self, request):
timeout = yatest_common.plain_or_under_sanitizer(120, 240)
sleep = 5
@@ -484,8 +484,8 @@ class KiKiMR(kikimr_cluster_interface.KiKiMRClusterInterface):
if erasure is None:
erasure = self.__configurator.static_erasure
request = bs.TConfigRequest()
- cmd = request.Command.add()
- cmd.DefineStoragePool.BoxId = 1
+ cmd = request.Command.add()
+ cmd.DefineStoragePool.BoxId = 1
pool_id = cmd.DefineStoragePool.StoragePoolId = next(self.__storage_pool_id_allocator)
if name is None:
@@ -494,7 +494,7 @@ class KiKiMR(kikimr_cluster_interface.KiKiMRClusterInterface):
cmd.DefineStoragePool.Name = name
cmd.DefineStoragePool.Kind = kind
cmd.DefineStoragePool.ErasureSpecies = str(erasure)
- cmd.DefineStoragePool.VDiskKind = "Default"
+ cmd.DefineStoragePool.VDiskKind = "Default"
cmd.DefineStoragePool.NumGroups = 2
pdisk_filter = cmd.DefineStoragePool.PDiskFilter.add()
@@ -502,7 +502,7 @@ class KiKiMR(kikimr_cluster_interface.KiKiMRClusterInterface):
pdisk_filter.Property.add().Kind = pdisk_user_kind
self._bs_config_invoke(request)
return name
-
+
def __wait_for_bs_controller_to_start(self):
monitors = [node.monitor for node in self.nodes.values()]