sbcli-pre 1.2.6__zip → 1.2.7__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/PKG-INFO +1 -1
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/env_var +1 -1
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/PKG-INFO +1 -1
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_cli/cli.py +28 -24
- sbcli_pre-1.2.7/simplyblock_core/constants.py +91 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/lvol_controller.py +26 -3
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/snapshot_controller.py +27 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/kv_store.py +15 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/storage_node.py +5 -1
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/tasks_runner_restart.py +1 -1
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/storage_node_ops.py +115 -32
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/utils.py +80 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_storage_node.py +14 -7
- sbcli_pre-1.2.6/simplyblock_core/constants.py +0 -63
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/README.md +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/pyproject.toml +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/SOURCES.txt +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/dependency_links.txt +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/entry_points.txt +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/requires.txt +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/sbcli_pre.egg-info/top_level.txt +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/setup.cfg +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/setup.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_cli/main.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/__init__.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/cluster_ops.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/cnode_client.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/compute_node_ops.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/__init__.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/caching_node_controller.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/cluster_events.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/device_controller.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/device_events.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/events_controller.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/health_controller.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/lvol_events.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/mgmt_events.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/pool_controller.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/pool_events.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/snapshot_events.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/storage_events.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/tasks_controller.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/controllers/tasks_events.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/distr_controller.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/mgmt_node_ops.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/__init__.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/base_model.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/caching_node.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/cluster.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/compute_node.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/deployer.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/events.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/global_settings.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/iface.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/job_schedule.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/lvol_model.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/mgmt_node.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/nvme_device.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/pool.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/port_stat.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/snapshot.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/models/stats.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/pci_utils.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/rpc_client.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/__init__.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/config_docker.sh +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/devices.json +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/dashboards/pools.json +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/datasource.yml +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/db_config_double.sh +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/db_config_single.sh +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/deploy_stack.sh +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/docker-compose-swarm.yml +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/haproxy.cfg +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/install_deps.sh +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/prometheus.yml +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/run_ssh.sh +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/set_db_config.sh +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/__init__.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/caching_node_monitor.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/cap_monitor.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/device_monitor.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/distr_event_collector.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/health_check_service.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/install_service.sh +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/log_agg_service.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/lvol_monitor.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/lvol_stat_collector.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/port_stat_collector.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/remove_service.sh +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/service_template.service +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/storage_node_monitor.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/services/tasks_runner_migration.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/shell_utils.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_core/snode_client.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/__init__.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/app.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/auth_middleware.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/__init__.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/node_api_basic.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/snode_ops.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_device.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_pool.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/caching_node_app.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/caching_node_app_k8s.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/node_utils.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/node_webapp.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/snode_app.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/static/delete.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/static/deploy.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/static/deploy_cnode.yaml +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/static/deploy_spdk.yaml +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/static/is_up.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/static/list_deps.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/static/rpac.yaml +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/static/tst.py +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/templates/deploy_spdk.yaml.j2 +0 -0
- {sbcli_pre-1.2.6 → sbcli_pre-1.2.7}/simplyblock_web/utils.py +0 -0
@@ -43,12 +43,14 @@ class CLIWrapper:
|
|
43
43
|
sub_command.add_argument("--jm-percent", help='Number in percent to use for JM from each device',
|
44
44
|
type=int, default=3, dest='jm_percent')
|
45
45
|
sub_command.add_argument("--data-nics", help='Data interface names', nargs='+', dest='data_nics')
|
46
|
-
sub_command.add_argument("--
|
46
|
+
sub_command.add_argument("--max-lvol", help='Max lvol per storage node', dest='max_lvol', type=int)
|
47
|
+
sub_command.add_argument("--max-snap", help='Max snapshot per storage node', dest='max_snap', type=int)
|
48
|
+
sub_command.add_argument("--max-prov", help='Max provisioning size of all storage nodes', dest='max_prov')
|
49
|
+
sub_command.add_argument("--number-of-devices", help='Number of devices per storage node if it\'s not supported EC2 instance', dest='number_of_devices', type=int)
|
50
|
+
|
47
51
|
sub_command.add_argument("--spdk-image", help='SPDK image uri', dest='spdk_image')
|
48
52
|
sub_command.add_argument("--spdk-debug", help='Enable spdk debug logs', dest='spdk_debug', required=False, action='store_true')
|
49
53
|
|
50
|
-
sub_command.add_argument("--iobuf_small_pool_count", help='bdev_set_options param', dest='small_pool_count', type=int, default=0)
|
51
|
-
sub_command.add_argument("--iobuf_large_pool_count", help='bdev_set_options param', dest='large_pool_count', type=int, default=0)
|
52
54
|
sub_command.add_argument("--iobuf_small_bufsize", help='bdev_set_options param', dest='small_bufsize', type=int, default=0)
|
53
55
|
sub_command.add_argument("--iobuf_large_bufsize", help='bdev_set_options param', dest='large_bufsize', type=int, default=0)
|
54
56
|
|
@@ -77,12 +79,14 @@ class CLIWrapper:
|
|
77
79
|
'During restart, the node does not accept IO. In a high-availability setup, '
|
78
80
|
'this will not impact operations')
|
79
81
|
sub_command.add_argument("node_id", help='UUID of storage node')
|
80
|
-
sub_command.add_argument("--
|
82
|
+
sub_command.add_argument("--max-lvol", help='Max lvol per storage node', dest='max_lvol', type=int, default=0)
|
83
|
+
sub_command.add_argument("--max-snap", help='Max snapshot per storage node', dest='max_snap', type=int, default=0)
|
84
|
+
sub_command.add_argument("--max-prov", help='Max provisioning size of all storage nodes', dest='max_prov', default="")
|
85
|
+
sub_command.add_argument("--number-of-devices", help='Number of devices per storage node if it\'s not supported EC2 instance', dest='number_of_devices', type=int)
|
86
|
+
|
81
87
|
sub_command.add_argument("--spdk-image", help='SPDK image uri', dest='spdk_image')
|
82
88
|
sub_command.add_argument("--spdk-debug", help='Enable spdk debug logs', dest='spdk_debug', required=False, action='store_true')
|
83
89
|
|
84
|
-
sub_command.add_argument("--iobuf_small_pool_count", help='bdev_set_options param', dest='small_pool_count', type=int, default=0)
|
85
|
-
sub_command.add_argument("--iobuf_large_pool_count", help='bdev_set_options param', dest='large_pool_count', type=int, default=0)
|
86
90
|
sub_command.add_argument("--iobuf_small_bufsize", help='bdev_set_options param', dest='small_bufsize', type=int, default=0)
|
87
91
|
sub_command.add_argument("--iobuf_large_bufsize", help='bdev_set_options param', dest='large_bufsize', type=int, default=0)
|
88
92
|
|
@@ -636,6 +640,12 @@ class CLIWrapper:
|
|
636
640
|
ret = storage_ops.deploy_cleaner()
|
637
641
|
|
638
642
|
elif sub_command == "add-node":
|
643
|
+
if not args.max_lvol:
|
644
|
+
self.parser.error(f"Mandatory argument '--max-lvol' not provided for {sub_command}")
|
645
|
+
if not args.max_snap:
|
646
|
+
self.parser.error(f"Mandatory argument '--max-snap' not provided for {sub_command}")
|
647
|
+
if not args.max_prov:
|
648
|
+
self.parser.error(f"Mandatory argument '--max-prov' not provided for {sub_command}")
|
639
649
|
cluster_id = args.cluster_id
|
640
650
|
node_ip = args.node_ip
|
641
651
|
ifname = args.ifname
|
@@ -643,22 +653,21 @@ class CLIWrapper:
|
|
643
653
|
spdk_image = args.spdk_image
|
644
654
|
spdk_debug = args.spdk_debug
|
645
655
|
|
646
|
-
small_pool_count = args.small_pool_count
|
647
|
-
large_pool_count = args.large_pool_count
|
648
656
|
small_bufsize = args.small_bufsize
|
649
657
|
large_bufsize = args.large_bufsize
|
650
658
|
num_partitions_per_dev = args.partitions
|
651
659
|
jm_percent = args.jm_percent
|
652
660
|
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
661
|
+
max_lvol = args.max_lvol
|
662
|
+
max_snap = args.max_snap
|
663
|
+
max_prov = self.parse_size(args.max_prov)
|
664
|
+
number_of_devices = args.number_of_devices
|
665
|
+
if max_prov < 1 * 1024 * 1024:
|
666
|
+
return f"Max provisioning memory:{args.max_prov} must be larger than 1G"
|
658
667
|
|
659
668
|
out = storage_ops.add_node(
|
660
|
-
cluster_id, node_ip, ifname, data_nics,
|
661
|
-
|
669
|
+
cluster_id, node_ip, ifname, data_nics, max_lvol, max_snap, max_prov, spdk_image, spdk_debug,
|
670
|
+
small_bufsize, large_bufsize, num_partitions_per_dev, jm_percent, number_of_devices)
|
662
671
|
return out
|
663
672
|
|
664
673
|
elif sub_command == "list":
|
@@ -676,22 +685,17 @@ class CLIWrapper:
|
|
676
685
|
spdk_image = args.spdk_image
|
677
686
|
spdk_debug = args.spdk_debug
|
678
687
|
|
679
|
-
spdk_mem = None
|
680
|
-
if args.spdk_mem:
|
681
|
-
spdk_mem = self.parse_size(args.spdk_mem)
|
682
|
-
if spdk_mem < 1 * 1024 * 1024:
|
683
|
-
return f"SPDK memory:{args.spdk_mem} must be larger than 1G"
|
684
688
|
|
689
|
+
max_lvol = args.max_lvol
|
690
|
+
max_snap = args.max_snap
|
691
|
+
max_prov = self.parse_size(args.max_prov)
|
685
692
|
|
686
|
-
small_pool_count = args.small_pool_count
|
687
|
-
large_pool_count = args.large_pool_count
|
688
693
|
small_bufsize = args.small_bufsize
|
689
694
|
large_bufsize = args.large_bufsize
|
690
695
|
|
691
696
|
ret = storage_ops.restart_storage_node(
|
692
|
-
node_id,
|
697
|
+
node_id, max_lvol, max_snap, max_prov,
|
693
698
|
spdk_image, spdk_debug,
|
694
|
-
small_pool_count, large_pool_count,
|
695
699
|
small_bufsize, large_bufsize)
|
696
700
|
|
697
701
|
elif sub_command == "list-devices":
|
@@ -0,0 +1,91 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
|
4
|
+
KVD_DB_VERSION = 730
|
5
|
+
KVD_DB_FILE_PATH = '/etc/foundationdb/fdb.cluster'
|
6
|
+
KVD_DB_TIMEOUT_MS = 10000
|
7
|
+
SPK_DIR = '/home/ec2-user/spdk'
|
8
|
+
RPC_HTTP_PROXY_PORT = 8080
|
9
|
+
LOG_LEVEL = logging.INFO
|
10
|
+
LOG_WEB_DEBUG = True
|
11
|
+
|
12
|
+
INSTALL_DIR = os.path.dirname(os.path.realpath(__file__))
|
13
|
+
|
14
|
+
NODE_MONITOR_INTERVAL_SEC = 3
|
15
|
+
DEVICE_MONITOR_INTERVAL_SEC = 5
|
16
|
+
STAT_COLLECTOR_INTERVAL_SEC = 60*5 # 5 minutes
|
17
|
+
LVOL_STAT_COLLECTOR_INTERVAL_SEC = 2
|
18
|
+
LVOL_MONITOR_INTERVAL_SEC = 60
|
19
|
+
DEV_MONITOR_INTERVAL_SEC = 10
|
20
|
+
DEV_STAT_COLLECTOR_INTERVAL_SEC = 2
|
21
|
+
PROT_STAT_COLLECTOR_INTERVAL_SEC = 2
|
22
|
+
DISTR_EVENT_COLLECTOR_INTERVAL_SEC = 2
|
23
|
+
DISTR_EVENT_COLLECTOR_NUM_OF_EVENTS = 10
|
24
|
+
CAP_MONITOR_INTERVAL_SEC = 30
|
25
|
+
SSD_VENDOR_WHITE_LIST = ["1d0f:cd01", "1d0f:cd00"]
|
26
|
+
|
27
|
+
PMEM_DIR = '/tmp/pmem'
|
28
|
+
|
29
|
+
NVME_PROGRAM_FAIL_COUNT = 50
|
30
|
+
NVME_ERASE_FAIL_COUNT = 50
|
31
|
+
NVME_CRC_ERROR_COUNT = 50
|
32
|
+
DEVICE_OVERLOAD_STDEV_VALUE = 50
|
33
|
+
DEVICE_OVERLOAD_CAPACITY_THRESHOLD = 50
|
34
|
+
|
35
|
+
CLUSTER_NQN = "nqn.2023-02.io.simplyblock"
|
36
|
+
|
37
|
+
weights = {
|
38
|
+
"lvol": 50,
|
39
|
+
"cpu": 10,
|
40
|
+
"r_io": 10,
|
41
|
+
"w_io": 10,
|
42
|
+
"r_b": 10,
|
43
|
+
"w_b": 10
|
44
|
+
}
|
45
|
+
|
46
|
+
# To use 75% of hugepages to calculate ssd size to use for the ocf bdev
|
47
|
+
CACHING_NODE_MEMORY_FACTOR = 0.75
|
48
|
+
|
49
|
+
HEALTH_CHECK_INTERVAL_SEC = 60
|
50
|
+
|
51
|
+
GRAYLOG_CHECK_INTERVAL_SEC = 60
|
52
|
+
|
53
|
+
FDB_CHECK_INTERVAL_SEC = 60
|
54
|
+
|
55
|
+
SIMPLY_BLOCK_DOCKER_IMAGE = "simplyblock/simplyblock:pre-release"
|
56
|
+
SIMPLY_BLOCK_CLI_NAME = "sbcli"
|
57
|
+
TASK_EXEC_INTERVAL_SEC = 30
|
58
|
+
TASK_EXEC_RETRY_COUNT = 8
|
59
|
+
|
60
|
+
SIMPLY_BLOCK_SPDK_CORE_IMAGE = "simplyblock/spdk-core:latest"
|
61
|
+
SIMPLY_BLOCK_SPDK_ULTRA_IMAGE = "simplyblock/spdk:prerelease-latest"
|
62
|
+
|
63
|
+
GELF_PORT = 12201
|
64
|
+
|
65
|
+
MIN_HUGE_PAGE_MEMORY_FOR_LVOL = 209715200
|
66
|
+
MIN_SYS_MEMORY_FOR_LVOL = 524288000
|
67
|
+
EXTRA_SMALL_POOL_COUNT = 1024
|
68
|
+
EXTRA_LARGE_POOL_COUNT = 128
|
69
|
+
EXTRA_HUGE_PAGE_MEMORY = 2147483648
|
70
|
+
EXTRA_SYS_MEMORY = 2147483648
|
71
|
+
|
72
|
+
INSTANCE_STORAGE_DATA = {
|
73
|
+
'i4i.large': {'number_of_devices': 1, 'size_per_device_gb': 468},
|
74
|
+
'i4i.xlarge': {'number_of_devices': 1, 'size_per_device_gb': 937},
|
75
|
+
'i4i.2xlarge': {'number_of_devices': 1, 'size_per_device_gb': 1875},
|
76
|
+
'i4i.4xlarge': {'number_of_devices': 1, 'size_per_device_gb': 3750},
|
77
|
+
'i4i.8xlarge': {'number_of_devices': 2, 'size_per_device_gb': 3750},
|
78
|
+
'i4i.12xlarge': {'number_of_devices': 3, 'size_per_device_gb': 3750},
|
79
|
+
'i4i.16xlarge': {'number_of_devices': 4, 'size_per_device_gb': 3750},
|
80
|
+
'i4i.24xlarge': {'number_of_devices': 6, 'size_per_device_gb': 3750},
|
81
|
+
'i4i.32xlarge': {'number_of_devices': 8, 'size_per_device_gb': 3750},
|
82
|
+
'i4i.metal': {'number_of_devices': 8, 'size_per_device_gb': 3750},
|
83
|
+
'i3en.large': {'number_of_devices': 1, 'size_per_device_gb': 1250},
|
84
|
+
'i3en.xlarge': {'number_of_devices': 1, 'size_per_device_gb': 2500},
|
85
|
+
'i3en.2xlarge': {'number_of_devices': 2, 'size_per_device_gb': 2500},
|
86
|
+
'i3en.3xlarge': {'number_of_devices': 1, 'size_per_device_gb': 7500},
|
87
|
+
'i3en.6xlarge': {'number_of_devices': 2, 'size_per_device_gb': 7500},
|
88
|
+
'i3en.12xlarge': {'number_of_devices': 4, 'size_per_device_gb': 7500},
|
89
|
+
'i3en.24xlarge': {'number_of_devices': 8, 'size_per_device_gb': 7500},
|
90
|
+
'i3en.metal': {'number_of_devices': 8, 'size_per_device_gb': 7500},
|
91
|
+
}
|
@@ -17,7 +17,7 @@ from simplyblock_core.models.pool import Pool
|
|
17
17
|
from simplyblock_core.models.lvol_model import LVol
|
18
18
|
from simplyblock_core.models.storage_node import StorageNode
|
19
19
|
from simplyblock_core.rpc_client import RPCClient
|
20
|
-
|
20
|
+
from simplyblock_core.snode_client import SNodeClient
|
21
21
|
|
22
22
|
logger = lg.getLogger()
|
23
23
|
db_controller = DBController()
|
@@ -364,12 +364,23 @@ def add_lvol(name, size, host_id_or_name, pool_id_or_name, use_comp, use_crypto,
|
|
364
364
|
return lvol_id, None
|
365
365
|
|
366
366
|
|
367
|
-
def _get_next_3_nodes(cluster_id):
|
367
|
+
def _get_next_3_nodes(cluster_id, lvol_size=0):
|
368
368
|
snodes = db_controller.get_storage_nodes_by_cluster_id(cluster_id)
|
369
369
|
online_nodes = []
|
370
370
|
node_stats = {}
|
371
371
|
for node in snodes:
|
372
372
|
if node.status == node.STATUS_ONLINE:
|
373
|
+
# Validate Eligible nodes for adding lvol
|
374
|
+
snode_api = SNodeClient(node.api_endpoint)
|
375
|
+
result, _ = snode_api.info()
|
376
|
+
memory_free = result["memory_details"]["free"]
|
377
|
+
huge_free = result["memory_details"]["huge_free"]
|
378
|
+
total_node_capacity = db_controller.get_snode_size(node.get_id())
|
379
|
+
error = utils.validate_add_lvol_or_snap_on_node(memory_free, huge_free, node.max_lvol, lvol_size, total_node_capacity, len(node.lvols))
|
380
|
+
if error:
|
381
|
+
logger.warning(error)
|
382
|
+
continue
|
383
|
+
|
373
384
|
online_nodes.append(node)
|
374
385
|
node_stat_list = db_controller.get_node_stats(node, limit=1000)
|
375
386
|
combined_record = utils.sum_records(node_stat_list)
|
@@ -695,7 +706,7 @@ def add_lvol_ha(name, size, host_id_or_name, ha_type, pool_id_or_name, use_comp,
|
|
695
706
|
lvol.lvol_type += ',compress'
|
696
707
|
lvol.top_bdev = lvol.comp_bdev
|
697
708
|
|
698
|
-
nodes = _get_next_3_nodes(cl.get_id())
|
709
|
+
nodes = _get_next_3_nodes(cl.get_id(), lvol.size)
|
699
710
|
if not nodes:
|
700
711
|
return False, f"No nodes found with enough resources to create the LVol"
|
701
712
|
|
@@ -800,6 +811,18 @@ def add_lvol_on_node(lvol, snode, ha_comm_addrs=None, ha_inode_self=None):
|
|
800
811
|
rpc_client = RPCClient(snode.mgmt_ip, snode.rpc_port, snode.rpc_username, snode.rpc_password)
|
801
812
|
spdk_mem_info_before = rpc_client.ultra21_util_get_malloc_stats()
|
802
813
|
|
814
|
+
# Validate adding lvol on storage node
|
815
|
+
snode_api = SNodeClient(snode.api_endpoint)
|
816
|
+
result, _ = snode_api.info()
|
817
|
+
memory_free = result["memory_details"]["free"]
|
818
|
+
huge_free = result["memory_details"]["huge_free"]
|
819
|
+
|
820
|
+
total_node_capacity = db_controller.get_snode_size(snode.get_id())
|
821
|
+
error = utils.validate_add_lvol_or_snap_on_node(memory_free, huge_free, snode.max_lvol, lvol.size, total_node_capacity, len(snode.lvols))
|
822
|
+
if error:
|
823
|
+
logger.error(error)
|
824
|
+
return False, f"Failed to add lvol on node {snode.get_id()}"
|
825
|
+
|
803
826
|
ret, msg = _create_bdev_stack(lvol, snode, ha_comm_addrs, ha_inode_self)
|
804
827
|
if not ret:
|
805
828
|
return False, msg
|
@@ -13,6 +13,8 @@ from simplyblock_core.models.pool import Pool
|
|
13
13
|
from simplyblock_core.models.snapshot import SnapShot
|
14
14
|
from simplyblock_core.models.lvol_model import LVol
|
15
15
|
from simplyblock_core.rpc_client import RPCClient
|
16
|
+
from simplyblock_core.snode_client import SNodeClient
|
17
|
+
|
16
18
|
|
17
19
|
logger = lg.getLogger()
|
18
20
|
|
@@ -33,6 +35,21 @@ def add(lvol_id, snapshot_name):
|
|
33
35
|
logger.info(f"Creating snapshot: {snapshot_name} from LVol: {lvol.id}")
|
34
36
|
snode = db_controller.get_storage_node_by_id(lvol.node_id)
|
35
37
|
|
38
|
+
##############################################################################
|
39
|
+
# Validate adding snap on storage node
|
40
|
+
snode_api = SNodeClient(snode.api_endpoint)
|
41
|
+
result, _ = snode_api.info()
|
42
|
+
memory_free = result["memory_details"]["free"]
|
43
|
+
huge_free = result["memory_details"]["huge_free"]
|
44
|
+
total_node_capacity = db_controller.get_snode_size(snode.get_id())
|
45
|
+
|
46
|
+
error = utils.validate_add_lvol_or_snap_on_node(memory_free, huge_free, snode.max_snap, lvol.size, total_node_capacity,
|
47
|
+
len(db_controller.get_snapshots_by_node_id(snode.get_id())))
|
48
|
+
|
49
|
+
if error:
|
50
|
+
logger.error(f"Failed to add snap on node {snode.get_id()}")
|
51
|
+
logger.error(error)
|
52
|
+
return False
|
36
53
|
|
37
54
|
##############################################################################
|
38
55
|
snap_count = 0
|
@@ -199,6 +216,16 @@ def clone(snapshot_id, clone_name, new_size=0):
|
|
199
216
|
logger.error(msg)
|
200
217
|
return False, msg
|
201
218
|
|
219
|
+
# Validate cloning snap on storage node
|
220
|
+
snode_api = SNodeClient(snode.api_endpoint)
|
221
|
+
result, _ = snode_api.info()
|
222
|
+
memory_free = result["memory_details"]["free"]
|
223
|
+
huge_free = result["memory_details"]["huge_free"]
|
224
|
+
total_node_capacity = db_controller.get_snode_size(snode.get_id())
|
225
|
+
error = utils.validate_add_lvol_or_snap_on_node(memory_free, huge_free, snode.max_lvol, snap.lvol.size, total_node_capacity, len(snode.lvols))
|
226
|
+
if error:
|
227
|
+
logger.error(error)
|
228
|
+
return False, f"Failed to add lvol on node {snode.get_id()}"
|
202
229
|
lvol = LVol()
|
203
230
|
lvol.lvol_name = clone_name
|
204
231
|
lvol.size = snap.lvol.size
|
@@ -288,3 +288,18 @@ class DBController:
|
|
288
288
|
for task in self.get_job_tasks(""):
|
289
289
|
if task.uuid == task_id:
|
290
290
|
return task
|
291
|
+
|
292
|
+
def get_snapshots_by_node_id(self, node_id):
|
293
|
+
ret = []
|
294
|
+
snaps = SnapShot().read_from_db(self.kv_store)
|
295
|
+
for snap in snaps:
|
296
|
+
if snap.lvol.host_id == node_id:
|
297
|
+
ret.append(snap)
|
298
|
+
return ret
|
299
|
+
|
300
|
+
def get_snode_size(self, node_id):
|
301
|
+
snode = self.get_storage_node_by_id(node_id)
|
302
|
+
total_node_capacity = 0
|
303
|
+
for dev in snode.nvme_devices:
|
304
|
+
total_node_capacity += dev.size
|
305
|
+
return total_node_capacity
|
@@ -61,7 +61,9 @@ class StorageNode(BaseModel):
|
|
61
61
|
"remote_devices": {"type": List[NVMeDevice], 'default': []},
|
62
62
|
"host_secret": {"type": str, "default": ""},
|
63
63
|
"ctrl_secret": {"type": str, "default": ""},
|
64
|
-
|
64
|
+
"max_lvol": {"type": int, "default": 0},
|
65
|
+
"max_snap": {"type": int, "default": 0},
|
66
|
+
"max_prov": {"type": str, "default": ""},
|
65
67
|
"cpu": {"type": int, "default": 0},
|
66
68
|
"cpu_hz": {"type": int, "default": 0},
|
67
69
|
"memory": {"type": int, "default": 0},
|
@@ -73,11 +75,13 @@ class StorageNode(BaseModel):
|
|
73
75
|
"app_thread_mask": {"type": str, "default": ""},
|
74
76
|
"pollers_mask": {"type": str, "default": ""},
|
75
77
|
"os_cores": {"type": str, "default": []},
|
78
|
+
"nvme_pollers_cores": {"type": str, "default": ""},
|
76
79
|
"dev_cpu_mask": {"type": str, "default": ""},
|
77
80
|
"spdk_mem": {"type": int, "default": 0},
|
78
81
|
"spdk_image": {"type": str, "default": ""},
|
79
82
|
"spdk_debug": {"type": bool, "default": False},
|
80
83
|
|
84
|
+
|
81
85
|
"ec2_metadata": {"type": dict, "default": {}},
|
82
86
|
"ec2_instance_id": {"type": str, "default": ""},
|
83
87
|
"ec2_public_ip": {"type": str, "default": ""},
|
@@ -209,7 +209,7 @@ while True:
|
|
209
209
|
if task.function_name in [JobSchedule.FN_DEV_RESTART, JobSchedule.FN_NODE_RESTART]:
|
210
210
|
while task.status != JobSchedule.STATUS_DONE:
|
211
211
|
# get new task object because it could be changed from cancel task
|
212
|
-
task = db_controller.get_task_by_id(task.
|
212
|
+
task = db_controller.get_task_by_id(task.uuid)
|
213
213
|
res = task_runner(task)
|
214
214
|
if res:
|
215
215
|
tasks_events.task_updated(task)
|
@@ -550,9 +550,9 @@ def _connect_to_remote_devs(this_node):
|
|
550
550
|
|
551
551
|
|
552
552
|
def add_node(cluster_id, node_ip, iface_name, data_nics_list,
|
553
|
-
|
554
|
-
|
555
|
-
num_partitions_per_dev=0, jm_percent=0):
|
553
|
+
max_lvol, max_snap, max_prov, spdk_image=None, spdk_debug=False,
|
554
|
+
small_bufsize=0, large_bufsize=0,
|
555
|
+
num_partitions_per_dev=0, jm_percent=0, number_of_devices=0):
|
556
556
|
db_controller = DBController()
|
557
557
|
kv_store = db_controller.kv_store
|
558
558
|
|
@@ -608,26 +608,12 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
|
|
608
608
|
logger.error(f"Node already exists, try remove it first: {ec2_metadata['instanceId']}")
|
609
609
|
return False
|
610
610
|
|
611
|
-
# check for memory
|
612
|
-
if "memory_details" in node_info and node_info['memory_details']:
|
613
|
-
memory_details = node_info['memory_details']
|
614
|
-
logger.info("Node Memory info")
|
615
|
-
logger.info(f"Total: {utils.humanbytes(memory_details['total'])}")
|
616
|
-
logger.info(f"Free: {utils.humanbytes(memory_details['free'])}")
|
617
|
-
logger.info(f"Hugepages Total: {utils.humanbytes(memory_details['huge_total'])}")
|
618
|
-
huge_free = memory_details['huge_free']
|
619
|
-
logger.info(f"Hugepages Free: {utils.humanbytes(huge_free)}")
|
620
|
-
if huge_free < 1 * 1024 * 1024:
|
621
|
-
logger.warning(f"Free hugepages are less than 1G: {utils.humanbytes(huge_free)}")
|
622
|
-
if not spdk_mem:
|
623
|
-
spdk_mem = huge_free
|
624
|
-
logger.info(f"Using the free hugepages for spdk memory: {utils.humanbytes(huge_free)}")
|
625
|
-
|
626
611
|
# Tune cpu maks parameters
|
627
612
|
cpu_count = node_info["cpu_count"]
|
628
613
|
pollers_mask = ""
|
629
614
|
app_thread_mask = ""
|
630
615
|
dev_cpu_mask = ""
|
616
|
+
nvme_pollers_cores = []
|
631
617
|
if cpu_count < 8:
|
632
618
|
mask = (1 << (cpu_count - 1)) - 1
|
633
619
|
mask <<= 1
|
@@ -643,6 +629,50 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
|
|
643
629
|
spdk_cpu_mask = utils.generate_mask(spdk_cores)
|
644
630
|
dev_cpu_mask = utils.generate_mask(dev_cpu_cores)
|
645
631
|
|
632
|
+
# Calculate pool count
|
633
|
+
if ec2_metadata and ec2_metadata.get('instanceType'):
|
634
|
+
supported_type, storage_devices, device_size = utils.get_total_size_per_instance_type(ec2_metadata["instanceType"])
|
635
|
+
if not supported_type:
|
636
|
+
logger.warning(f"Unsupported ec2 instance-type {ec2_metadata['instanceType']} for deployment")
|
637
|
+
if not number_of_devices:
|
638
|
+
logger.error(f"Unsupported ec2 instance-type {ec2_metadata['instanceType']} "
|
639
|
+
"for deployment, please specify --number-of-devices")
|
640
|
+
return False
|
641
|
+
number_of_devices = storage_devices
|
642
|
+
else:
|
643
|
+
logger.warning("Can not get ec2 instance type for this instance.")
|
644
|
+
if not number_of_devices:
|
645
|
+
logger.error("Unsupported instance type please specify --number-of-devices.")
|
646
|
+
return False
|
647
|
+
|
648
|
+
number_of_split = num_partitions_per_dev if num_partitions_per_dev else num_partitions_per_dev + 1
|
649
|
+
number_of_alceml_devices = number_of_devices * number_of_split
|
650
|
+
small_pool_count, large_pool_count = utils.calculate_pool_count(
|
651
|
+
number_of_alceml_devices, max_lvol, max_snap, cpu_count, len(nvme_pollers_cores) or cpu_count)
|
652
|
+
|
653
|
+
# Calculate minimum huge page memory
|
654
|
+
minimum_hp_memory = utils.calculate_minimum_hp_memory(small_pool_count, large_pool_count, max_lvol, max_snap, cpu_count)
|
655
|
+
|
656
|
+
# Calculate minimum sys memory
|
657
|
+
minimum_sys_memory = utils.calculate_minimum_sys_memory(max_prov)
|
658
|
+
|
659
|
+
# check for memory
|
660
|
+
if "memory_details" in node_info and node_info['memory_details']:
|
661
|
+
memory_details = node_info['memory_details']
|
662
|
+
logger.info("Node Memory info")
|
663
|
+
logger.info(f"Total: {utils.humanbytes(memory_details['total'])}")
|
664
|
+
logger.info(f"Free: {utils.humanbytes(memory_details['free'])}")
|
665
|
+
else:
|
666
|
+
logger.error(f"Cannot get memory info from the ec2 instance.. Exiting")
|
667
|
+
return False
|
668
|
+
|
669
|
+
satisfied, spdk_mem = utils.calculate_spdk_memory(minimum_hp_memory,
|
670
|
+
minimum_sys_memory,
|
671
|
+
int(memory_details['free']),
|
672
|
+
int(memory_details['huge_total']))
|
673
|
+
if not satisfied:
|
674
|
+
logger.error(f"Not enough memory for the provided max_lvo: {max_lvol}, max_snap: {max_snap}, max_prov: {max_prov}.. Exiting")
|
675
|
+
return False
|
646
676
|
|
647
677
|
logger.info("Joining docker swarm...")
|
648
678
|
cluster_docker = utils.get_docker_client(cluster_id)
|
@@ -717,12 +747,17 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
|
|
717
747
|
snode.hugepages = node_info['hugepages']
|
718
748
|
|
719
749
|
snode.spdk_cpu_mask = spdk_cpu_mask or ""
|
720
|
-
snode.spdk_mem = spdk_mem
|
750
|
+
snode.spdk_mem = spdk_mem
|
751
|
+
snode.max_lvol = max_lvol
|
752
|
+
snode.max_snap = max_snap
|
753
|
+
snode.max_prov = max_prov
|
754
|
+
snode.number_of_devices = number_of_devices
|
721
755
|
snode.spdk_image = spdk_image or ""
|
722
756
|
snode.spdk_debug = spdk_debug or 0
|
723
757
|
snode.write_to_db(kv_store)
|
724
758
|
snode.app_thread_mask = app_thread_mask or ""
|
725
759
|
snode.pollers_mask = pollers_mask or ""
|
760
|
+
snode.nvme_pollers_cores = nvme_pollers_cores or []
|
726
761
|
snode.dev_cpu_mask = dev_cpu_mask or ""
|
727
762
|
snode.os_cores = os_cores or []
|
728
763
|
|
@@ -975,12 +1010,10 @@ def remove_storage_node(node_id, force_remove=False, force_migrate=False):
|
|
975
1010
|
|
976
1011
|
|
977
1012
|
def restart_storage_node(
|
978
|
-
node_id,
|
979
|
-
spdk_mem=None,
|
1013
|
+
node_id, max_lvol=0, max_snap=0, max_prov="",
|
980
1014
|
spdk_image=None,
|
981
1015
|
set_spdk_debug=None,
|
982
|
-
|
983
|
-
small_bufsize=0, large_bufsize=0):
|
1016
|
+
small_bufsize=0, large_bufsize=0, number_of_devices=0):
|
984
1017
|
|
985
1018
|
db_controller = DBController()
|
986
1019
|
kv_store = db_controller.kv_store
|
@@ -1011,14 +1044,67 @@ def restart_storage_node(
|
|
1011
1044
|
logger.info(f"Node info: {node_info}")
|
1012
1045
|
|
1013
1046
|
logger.info("Restarting SPDK")
|
1014
|
-
|
1015
|
-
if spdk_mem:
|
1016
|
-
mem = spdk_mem
|
1017
|
-
snode.spdk_mem = mem
|
1047
|
+
|
1018
1048
|
img = snode.spdk_image
|
1049
|
+
if max_lvol:
|
1050
|
+
snode.max_lvol = max_lvol
|
1051
|
+
if max_snap:
|
1052
|
+
snode.max_snap = max_snap
|
1053
|
+
if max_prov:
|
1054
|
+
snode.max_prov = max_prov
|
1019
1055
|
if spdk_image:
|
1020
1056
|
img = spdk_image
|
1021
1057
|
snode.spdk_image = img
|
1058
|
+
|
1059
|
+
# Calculate pool count
|
1060
|
+
if snode.ec2_metadata and snode.ec2_metadata.get('instanceType'):
|
1061
|
+
supported_type, storage_devices, device_size = utils.get_total_size_per_instance_type(snode.ec2_metadata["instanceType"])
|
1062
|
+
if not supported_type:
|
1063
|
+
logger.warning(f"Unsupported ec2 instance-type {snode.ec2_metadata['instanceType']} for deployment")
|
1064
|
+
if not number_of_devices:
|
1065
|
+
logger.error(f"Unsupported ec2 instance-type {snode.ec2_metadata['instanceType']} "
|
1066
|
+
"for deployment, please specify --number-of-devices")
|
1067
|
+
return False
|
1068
|
+
number_of_devices = storage_devices
|
1069
|
+
else:
|
1070
|
+
logger.warning("Can not get ec2 instance type for this instance..")
|
1071
|
+
if not number_of_devices:
|
1072
|
+
if snode.number_of_devices:
|
1073
|
+
number_of_devices = snode.number_of_devices
|
1074
|
+
else:
|
1075
|
+
logger.error("Unsupported instance type please specify --number-of-devices")
|
1076
|
+
return False
|
1077
|
+
|
1078
|
+
snode.number_of_devices = number_of_devices
|
1079
|
+
|
1080
|
+
number_of_split = snode.num_partitions_per_dev if snode.num_partitions_per_dev else snode.num_partitions_per_dev + 1
|
1081
|
+
number_of_alceml_devices = number_of_devices * number_of_split
|
1082
|
+
small_pool_count, large_pool_count = utils.calculate_pool_count(
|
1083
|
+
number_of_alceml_devices, snode.max_lvol, snode.max_snap, snode.cpu, len(snode.nvme_pollers_cores) or snode.cpu)
|
1084
|
+
|
1085
|
+
# Calculate minimum huge page memory
|
1086
|
+
minimum_hp_memory = utils.calculate_minimum_hp_memory(small_pool_count, large_pool_count, snode.max_lvol, snode.max_snap, snode.cpu)
|
1087
|
+
|
1088
|
+
# Calculate minimum sys memory
|
1089
|
+
minimum_sys_memory = utils.calculate_minimum_sys_memory(snode.max_prov)
|
1090
|
+
|
1091
|
+
# check for memory
|
1092
|
+
if "memory_details" in node_info and node_info['memory_details']:
|
1093
|
+
memory_details = node_info['memory_details']
|
1094
|
+
logger.info("Node Memory info")
|
1095
|
+
logger.info(f"Total: {utils.humanbytes(memory_details['total'])}")
|
1096
|
+
logger.info(f"Free: {utils.humanbytes(memory_details['free'])}")
|
1097
|
+
else:
|
1098
|
+
logger.error(f"Cannot get memory info from the ec2 instance.. Exiting")
|
1099
|
+
|
1100
|
+
satisfied, spdk_mem = utils.calculate_spdk_memory(minimum_hp_memory,
|
1101
|
+
minimum_sys_memory,
|
1102
|
+
int(memory_details['free']),
|
1103
|
+
int(memory_details['huge_total']))
|
1104
|
+
if not satisfied:
|
1105
|
+
logger.error(f"Not enough memory for the provided max_lvo: {snode.max_lvol}, max_snap: {snode.max_snap}, max_prov: {utils.humanbytes(snode.max_prov)}.. Exiting")
|
1106
|
+
|
1107
|
+
|
1022
1108
|
spdk_debug = snode.spdk_debug
|
1023
1109
|
if set_spdk_debug:
|
1024
1110
|
spdk_debug = spdk_debug
|
@@ -1026,17 +1112,14 @@ def restart_storage_node(
|
|
1026
1112
|
|
1027
1113
|
cluster_docker = utils.get_docker_client(snode.cluster_id)
|
1028
1114
|
cluster_ip = cluster_docker.info()["Swarm"]["NodeAddr"]
|
1029
|
-
results, err = snode_api.spdk_process_start(snode.spdk_cpu_mask,
|
1115
|
+
results, err = snode_api.spdk_process_start(snode.spdk_cpu_mask, spdk_mem, img, spdk_debug, cluster_ip)
|
1030
1116
|
|
1031
1117
|
if not results:
|
1032
1118
|
logger.error(f"Failed to start spdk: {err}")
|
1033
1119
|
return False
|
1034
1120
|
time.sleep(3)
|
1035
1121
|
|
1036
|
-
|
1037
|
-
snode.iobuf_small_pool_count = small_pool_count
|
1038
|
-
if large_pool_count:
|
1039
|
-
snode.iobuf_large_pool_count = large_pool_count
|
1122
|
+
|
1040
1123
|
if small_bufsize:
|
1041
1124
|
snode.iobuf_small_bufsize = small_bufsize
|
1042
1125
|
if large_bufsize:
|