From 9840cd7659177c74f7f694d437c5f9f16a1d8be2 Mon Sep 17 00:00:00 2001 From: David Howells Date: Fri, 5 May 2023 18:29:33 +0100 Subject: [PATCH] Add dumpvldb --- kafs/vl_fileservers.C | 13 ++++ kafs/vl_volumes.C | 6 +- kafs/vlservice.H | 3 +- kafs/vos_examine.C | 1 + kafs/vos_listvldb.C | 143 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 160 insertions(+), 6 deletions(-) diff --git a/kafs/vl_fileservers.C b/kafs/vl_fileservers.C index 445eda7..6ac7428 100644 --- a/kafs/vl_fileservers.C +++ b/kafs/vl_fileservers.C @@ -487,3 +487,16 @@ void VL_service::map_volume_sites(Vldb_entry *vldb) } } } + +/** + * VL_service::map_volume_sites - Map sites to servers for a list of volumes + * @vlist: List of volume DB entries + * + * Map the locations of a group of volumes, as specified by @vlist, to the file + * and volume servers where the data is stored. + */ +void VL_service::map_volume_sites(Vldb_entry_list &vlist) +{ + for (unsigned int i = 0; i < vlist.size(); i++) + map_volume_sites(vlist[i]); +} diff --git a/kafs/vl_volumes.C b/kafs/vl_volumes.C index 4ca2d78..560f1a0 100644 --- a/kafs/vl_volumes.C +++ b/kafs/vl_volumes.C @@ -84,7 +84,7 @@ static void kafs::nentries_to_vldb_entries(std::vector &entries site.partition.id = entry.serverPartition[j]; site.flags = entry.serverFlags[j]; site.addr_number = htonl(entry.serverNumber[j]); - site.has_addr_number = true; + site.has_addr_number = site.flags != 0; } vlist.push_back(vldb); @@ -225,7 +225,6 @@ void VL_service::look_up_volume_by_name(Volume_spec &name, _enter(""); VL_GetEntryByName(name.name, vlist); - map_volume_sites(vlist[vlist.size() - 1]); } /** @@ -352,7 +351,4 @@ void VL_service::look_up_volumes_by_attributes(Fileserver_spec &fsspec, } VL_ListAttributes(attr, volume_name_pattern, vlist); - - for (i = 0; i < vlist.size(); i++) - map_volume_sites(vlist[i]); } diff --git a/kafs/vlservice.H b/kafs/vlservice.H index 6e294ca..bfcca95 100644 --- a/kafs/vlservice.H +++ b/kafs/vlservice.H @@ -45,7 +45,7 @@ public: unsigned int clone_id; unsigned int flags; unsigned int match_index; - bool has_match_index:1; + bool has_match_index; std::vector sites; Vldb_entry(size_t nr_sites); @@ -76,6 +76,7 @@ public: rxrpc::ref look_up_fileserver_by_addr(const struct sockaddr_rxrpc &addr); rxrpc::ref look_up_fileserver_by_index(int server_index); void map_volume_sites(Vldb_entry *vldb); + void map_volume_sites(Vldb_entry_list &vlist); /* vl_probe.C */ VL_service(Context *); diff --git a/kafs/vos_examine.C b/kafs/vos_examine.C index 51030ed..83825be 100644 --- a/kafs/vos_examine.C +++ b/kafs/vos_examine.C @@ -72,6 +72,7 @@ void COMMAND_vos_examine( ref vlservice = new kafs::VL_service(ctx); vlservice->look_up_volume_by_name(a_id, vlist); + vlservice->map_volume_sites(vlist); kafs::Vldb_entry *vldb = vlist[0]; if (a_id.is_numeric) { diff --git a/kafs/vos_listvldb.C b/kafs/vos_listvldb.C index c5964b5..4687a50 100644 --- a/kafs/vos_listvldb.C +++ b/kafs/vos_listvldb.C @@ -18,6 +18,9 @@ #include "display.H" using rxrpc::ref; +using kafs::afs::RWVOL; +using kafs::afs::ROVOL; +using kafs::afs::BACKVOL; static void print_vl_record(kafs::Context *ctx, kafs::Vldb_entry *vldb) @@ -85,10 +88,12 @@ void COMMAND_vos_listvldb( !a_locked && a_name.name.find('*') == std::string::npos) { vlservice->look_up_volume_by_name(a_name, vlist); + vlservice->map_volume_sites(vlist); print_vl_record(ctx, vlist[0]); } else { vlservice->look_up_volumes_by_attributes(a_server, a_partition, a_locked, a_name.name, vlist); + vlservice->map_volume_sites(vlist); if (!a_quiet && a_server.specified) std::cout << "VLDB entries for server " << a_server.name << "\n"; @@ -105,3 +110,141 @@ void COMMAND_vos_listvldb( /*** * ALIAS: vos listloc - listvldb */ + +static std::string keyval(const char *key, std::string val) +{ + return fmt::format("\e[33m{:s}\e[m={:s}", key, val); +} + +static std::string keyval(const char *key, unsigned int val) +{ + return fmt::format("\e[33m{:s}\e[m={:x}", key, val); +} + +/*** + * COMMAND: vos dumpvldb - Dump the VLDB + * ARG: "[-name ]" + * ARG: "[-server ]" + * ARG: "[-partition ]" + * ARG: "[-locked]" + * ARG: "[-nosort]" + * ARG: "[-cell ]" + * ARG: "[-noauth]" - Auth + * ARG: "[-localauth]" - Auth + * ARG: "[-verbose]" + * ARG: "[-encrypt]" - Auth + * NOCOMBINE: name, server + * NOCOMBINE: name, partition + * NOCOMBINE: name, locked + * + * Displays a volume's VLDB entry + */ +void COMMAND_vos_dumpvldb( + kafs::Context *ctx, + kafs::Volume_spec &a_name, + kafs::Fileserver_spec &a_server, + kafs::Partition_spec &a_partition, + bool a_locked, + bool a_nosort, + bool a_verbose) +{ + kafs::Vldb_entry_list vlist; + unsigned int i; + + _enter(""); + + ref vlservice = new kafs::VL_service(ctx); + + if (a_name.specified && + !a_server.specified && + !a_partition.specified && + !a_locked && + a_name.name.find('*') == std::string::npos) { + vlservice->look_up_volume_by_name(a_name, vlist); + } else { + vlservice->look_up_volumes_by_attributes(a_server, a_partition, + a_locked, a_name.name, vlist); + if (!a_nosort) + std::sort(vlist.begin(), vlist.end(), cmp_entries_by_name); + } + + std::cout << "VOLUME WRB\n"; + std::cout << "================================================================ ===\n"; + + for (i = 0; i < vlist.size(); i++) { + kafs::Vldb_entry *vldb = vlist[i]; + unsigned int flags = vldb->flags; + std::cout << fmt::format("\e[32m{:64s}\e[m {:c}{:c}{:c}\n", + vldb->name, + (flags & kafs::afs::VLF_RWEXISTS) ? 'w' : '-', + (flags & kafs::afs::VLF_ROEXISTS) ? 'r' : '-', + (flags & kafs::afs::VLF_BACKEXISTS) ? 'b' : '-'); + + std::cout << " " << keyval("rw", vldb->volume_id[RWVOL]) + << " " << keyval("ro", vldb->volume_id[ROVOL]) + << " " << keyval("bak", vldb->volume_id[BACKVOL]); + + if (vldb->clone_id) + std::cout << keyval("clone", vldb->volume_id[BACKVOL]); + if (vldb->has_match_index) + std::cout << " " << keyval("mix", vldb->match_index); + + std::cout << "\n"; + + for (unsigned int j = 0; j < vldb->sites.size(); j++) { + kafs::Vldb_site *site = &vldb->sites[j]; + unsigned int flags = site->flags; + + if (!flags) + continue; + + std::cout << " [" << j << "]"; + if (site->has_uuid) { + char buf[48]; + uuid_unparse(site->uuid.uuid, buf); + std::cout << " " << keyval("uuid", buf); + } + + if (flags) { + const char *sep = ""; + std::string f = ""; + + if (flags & kafs::afs::VLSF_NEWREPSITE) { + f = f + sep + "new"; + sep = ","; + } + if (flags & kafs::afs::VLSF_RWVOL) { + f = f + sep + "rw"; + sep = ","; + } + if (flags & kafs::afs::VLSF_ROVOL) { + f = f + sep + "ro"; + sep = ","; + } + if (flags & kafs::afs::VLSF_BACKVOL) { + f = f + sep + "bak"; + sep = ","; + } + if (flags & kafs::afs::VLSF_UUID) { + f = f + sep + "uu"; + sep = ","; + } + if (flags & kafs::afs::VLSF_DONTUSE) { + f = f + sep + "dont"; + sep = ","; + } + std::cout << " " << keyval("fl", f); + } else { + std::cout << " " << keyval("fl", "0"); + } + + if (site->has_unique) + std::cout << " " << keyval("uq", site->unique); + if (site->nr_addrs) + std::cout << " " << keyval("naddrs", site->nr_addrs); + std::cout << " " << keyval("part", sprint_partition(site->partition)); + + std::cout << "\n"; + } + } +} -- 2.49.0