From aca2bef15f66e76c6e3fa874d2814e90421756c4 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Thu, 14 Dec 2023 01:11:42 +0300 Subject: [PATCH] Add vitastor-disk update-sb command --- docs/usage/disk.en.md | 9 +++++++++ docs/usage/disk.ru.md | 10 ++++++++++ src/disk_tool.cpp | 13 +++++++++++++ src/disk_tool.h | 1 + src/disk_tool_udev.cpp | 18 ++++++++++++++++++ 5 files changed, 51 insertions(+) diff --git a/docs/usage/disk.en.md b/docs/usage/disk.en.md index 13680829..a0770367 100644 --- a/docs/usage/disk.en.md +++ b/docs/usage/disk.en.md @@ -17,6 +17,7 @@ It supports the following commands: - [purge](#purge) - [read-sb](#read-sb) - [write-sb](#write-sb) +- [update-sb](#update-sb) - [udev](#udev) - [exec-osd](#exec-osd) - [pre-exec](#pre-exec) @@ -182,6 +183,14 @@ Try to read Vitastor OSD superblock from `` and print it in JSON format. Read JSON from STDIN and write it into Vitastor OSD superblock on ``. +## update-sb + +`vitastor-disk update-sb [--force] [-- ] [...]` + +Read Vitastor OSD superblock from , update parameters in it and write it back. + +`--force` allows to ignore validation errors. + ## udev `vitastor-disk udev ` diff --git a/docs/usage/disk.ru.md b/docs/usage/disk.ru.md index 77972fe4..87aff759 100644 --- a/docs/usage/disk.ru.md +++ b/docs/usage/disk.ru.md @@ -17,6 +17,7 @@ vitastor-disk - инструмент командной строки для уп - [purge](#purge) - [read-sb](#read-sb) - [write-sb](#write-sb) +- [update-sb](#update-sb) - [udev](#udev) - [exec-osd](#exec-osd) - [pre-exec](#pre-exec) @@ -187,6 +188,15 @@ throttle_target_mbs, throttle_target_parallelism, throttle_threshold_us. Прочитать JSON со стандартного ввода и записать его в суперблок OSD на диск ``. +## update-sb + +`vitastor-disk update-sb [--force] [--<параметр> <значение>] [...]` + +Прочитать суперблок OSD с диска ``, изменить в нём заданные параметры и записать обратно. + +Опция `--force` позволяет читать суперблок, даже если он считается некорректным +из-за ошибок валидации. + ## udev `vitastor-disk udev ` diff --git a/src/disk_tool.cpp b/src/disk_tool.cpp index 2faa6cd2..4af41824 100644 --- a/src/disk_tool.cpp +++ b/src/disk_tool.cpp @@ -127,6 +127,10 @@ static const char *help_text = "vitastor-disk write-sb \n" " Read JSON from STDIN and write it into Vitastor OSD superblock on .\n" "\n" + "vitastor-disk update-sb [--force] [-- ] [...]\n" + " Read Vitastor OSD superblock from , update parameters in it and write it back.\n" + " --force allows to ignore validation errors.\n" + "\n" "vitastor-disk udev \n" " Try to read Vitastor OSD superblock from and print variables for udev.\n" "\n" @@ -363,6 +367,15 @@ int main(int argc, char *argv[]) } return self.write_sb(cmd[1]); } + else if (!strcmp(cmd[0], "update-sb")) + { + if (cmd.size() != 2) + { + fprintf(stderr, "Exactly 1 device path argument is required\n"); + return 1; + } + return self.update_sb(cmd[1]); + } else if (!strcmp(cmd[0], "start") || !strcmp(cmd[0], "stop") || !strcmp(cmd[0], "restart") || !strcmp(cmd[0], "enable") || !strcmp(cmd[0], "disable")) { diff --git a/src/disk_tool.h b/src/disk_tool.h index a6187189..663871c3 100644 --- a/src/disk_tool.h +++ b/src/disk_tool.h @@ -109,6 +109,7 @@ struct disk_tool_t int udev_import(std::string device); int read_sb(std::string device); int write_sb(std::string device); + int update_sb(std::string device); int exec_osd(std::string device); int systemd_start_stop_osds(const std::vector & cmd, const std::vector & devices); int pre_exec_osd(std::string device); diff --git a/src/disk_tool_udev.cpp b/src/disk_tool_udev.cpp index 45034655..b456abfb 100644 --- a/src/disk_tool_udev.cpp +++ b/src/disk_tool_udev.cpp @@ -86,6 +86,24 @@ int disk_tool_t::write_sb(std::string device) return !write_osd_superblock(device, params); } +int disk_tool_t::update_sb(std::string device) +{ + json11::Json sb = read_osd_superblock(device, true, options.find("force") != options.end()); + if (sb.is_null()) + { + return 1; + } + auto sb_obj = sb["params"].object_items(); + for (auto & kv: options) + { + if (kv.first != "force") + { + sb_obj[kv.first] = kv.second; + } + } + return !write_osd_superblock(device, sb_obj); +} + uint32_t disk_tool_t::write_osd_superblock(std::string device, json11::Json params) { std::string json_data = params.dump();