diff --git a/docs/usage/cli.en.md b/docs/usage/cli.en.md index 0b700725..6d315485 100644 --- a/docs/usage/cli.en.md +++ b/docs/usage/cli.en.md @@ -410,8 +410,8 @@ Create a pool. Required parameters: | | | |--------------------------|-----------------------------------------------------------------------------------------| -| `-s R` or `--pg_size R` | Number of replicas for replicated pools | -| `--ec N+K` | Number of data (N) and parity (K) chunks for erasure-coded pools | +| `-s R` or `--pg_size R` | Number of replicas for replicated pools, from 1 to 64 | +| `--ec N+K` | Number of data (N) and parity (K) chunks for erasure-coded pools, N+K from 3 to 64 | | `-n N` or `--pg_count N` | PG count for the new pool (start with 10*\/pg_size rounded to a power of 2) | Optional parameters: diff --git a/docs/usage/cli.ru.md b/docs/usage/cli.ru.md index e4787d15..16ec40b7 100644 --- a/docs/usage/cli.ru.md +++ b/docs/usage/cli.ru.md @@ -429,8 +429,8 @@ OSD PARENT UP SIZE USED% TAGS WEIGHT BLOCK BITMAP | | | |---------------------------|-----------------------------------------------------------------------------------------------| -| `-s R` или `--pg_size R` | Число копий данных для реплицированных пулов | -| `--ec N+K` | Число частей данных (N) и чётности (K) для пулов с кодами коррекции ошибок | +| `-s R` или `--pg_size R` | Число копий данных для реплицированных пулов, от 1 до 64 | +| `--ec N+K` | Число частей данных (N) и чётности (K) для пулов с кодами коррекции ошибок, N+K от 3 до 64 | | `-n N` или `--pg_count N` | Число PG для нового пула (начните с 10*\<число OSD\>/pg_size, округлённого до степени двойки) | Необязательные параметры: diff --git a/src/cmd/cli.cpp b/src/cmd/cli.cpp index 28ba05af..57354401 100644 --- a/src/cmd/cli.cpp +++ b/src/cmd/cli.cpp @@ -197,8 +197,8 @@ static const char* help_text = "\n" "vitastor-cli create-pool|pool-create (-s |--ec +) -n [OPTIONS]\n" " Create a pool. Required parameters:\n" - " -s|--pg_size R Number of replicas for replicated pools\n" - " --ec N+K Number of data (N) and parity (K) chunks for erasure-coded pools\n" + " -s|--pg_size R Number of replicas for replicated pools, from 1 to 64\n" + " --ec N+K Number of data (N) and parity (K) chunks for erasure-coded pools, N+K from 3 to 64\n" " -n|--pg_count N PG count for the new pool (start with 10*/pg_size rounded to a power of 2)\n" " Optional parameters:\n" " --pg_minsize R or N+K minus number of failures to tolerate without downtime\n" diff --git a/src/cmd/cli_pool_cfg.cpp b/src/cmd/cli_pool_cfg.cpp index 83cb2ff6..459a16fe 100644 --- a/src/cmd/cli_pool_cfg.cpp +++ b/src/cmd/cli_pool_cfg.cpp @@ -233,9 +233,10 @@ std::string validate_pool_config(json11::Json::object & new_cfg, json11::Json ol { return "PG size can't be smaller than 3 for EC/XOR pools"; } - if (pg_size > 256) + // same limit as in etcd_state_client.cpp and mon/pool_config.js + if (pg_size > 64) { - return "PG size can't be greater than 256"; + return "PG size can't be greater than 64"; } // PG rules diff --git a/tests/run_tests.sh b/tests/run_tests.sh index d72fcf78..5a4323c0 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -48,6 +48,8 @@ OLD=1 SCHEME=ec IMMEDIATE_COMMIT=1 ./test_interrupted_rebalance.sh ./test_failure_domain.sh +./test_pool_pg_size_limit.sh + ./test_level_placement.sh ./test_snapshot.sh diff --git a/tests/test_pool_pg_size_limit.sh b/tests/test_pool_pg_size_limit.sh new file mode 100755 index 00000000..c92f9c4f --- /dev/null +++ b/tests/test_pool_pg_size_limit.sh @@ -0,0 +1,27 @@ +#!/bin/bash -ex + +# Test that create-pool and modify-pool refuse pg_size > 64, which OSDs and clients don't support + +. `dirname $0`/common.sh + +wait_etcd + +$ETCDCTL put /vitastor/config/pools '{"1":{"name":"testpool","scheme":"replicated","pg_size":2,"pg_minsize":1,"pg_count":1,"failure_domain":"osd"}}' + +for args in "create-pool bigpool -s 65 -n 1 --force" "create-pool bigpool --ec 62+3 -n 1 --force" "modify-pool testpool -s 65"; do + r=0 + $VITASTOR_CLI $args || r=$? + if [[ $r != 22 ]]; then + format_error "$args should fail with EINVAL (22), but exited with $r" + fi +done + +$ETCDCTL get --print-value-only /vitastor/config/pools | jq -e 'keys == ["1"] and .["1"].pg_size == 2' || \ + format_error "Pool configuration should not change after refused commands" + +# 64 is still accepted +$VITASTOR_CLI modify-pool testpool -s 64 +$ETCDCTL get --print-value-only /vitastor/config/pools | jq -e '.["1"].pg_size == 64' || \ + format_error "modify-pool -s 64 should set pg_size to 64" + +format_green OK