diff options
-rw-r--r-- | ceph.spec.in | 1 | ||||
-rw-r--r-- | debian/ceph.install | 1 | ||||
-rw-r--r-- | src/.gitignore | 1 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/tools/Makefile.am | 4 | ||||
-rw-r--r-- | src/tools/mon_store_converter.cc | 335 |
6 files changed, 1 insertions, 343 deletions
diff --git a/ceph.spec.in b/ceph.spec.in index 126433eef0d..93692b177c3 100644 --- a/ceph.spec.in +++ b/ceph.spec.in @@ -461,7 +461,6 @@ fi %{_bindir}/cephfs-journal-tool %{_bindir}/ceph-debugpack %{_bindir}/ceph-coverage -%{_bindir}/ceph_mon_store_converter %{_initrddir}/ceph %{_sbindir}/ceph-disk %{_sbindir}/ceph-disk-activate diff --git a/debian/ceph.install b/debian/ceph.install index 2205e5e20b2..8089577c7a1 100644 --- a/debian/ceph.install +++ b/debian/ceph.install @@ -12,7 +12,6 @@ usr/bin/ceph-osd usr/bin/ceph-run usr/bin/ceph-rest-api usr/lib/python*/dist-packages/ceph_rest_api.py -usr/bin/ceph_mon_store_converter usr/bin/crushtool usr/bin/monmaptool usr/bin/osdmaptool diff --git a/src/.gitignore b/src/.gitignore index 6e76998b46e..5bd73313c31 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -25,7 +25,6 @@ Makefile /ceph.conf /ceph_bench_log /ceph-objectstore-tool -/ceph_mon_store_converter /ceph_multi_stress_watch /ceph_erasure_code /ceph_erasure_code_benchmark diff --git a/src/Makefile.am b/src/Makefile.am index 303e9bd50c2..9e52d71e213 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -661,7 +661,7 @@ admin-tools: monmaptool osdmaptool crushtool ceph-authtool base: core-daemons admin-tools \ cephfs ceph-syn ceph-conf \ rados radosgw-admin librados-config \ - init-ceph ceph_mon_store_converter ceph-post-file \ + init-ceph ceph-post-file \ ceph diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am index d92ed558536..b914aba710d 100644 --- a/src/tools/Makefile.am +++ b/src/tools/Makefile.am @@ -94,10 +94,6 @@ ceph_authtool_SOURCES = tools/ceph_authtool.cc ceph_authtool_LDADD = $(CEPH_GLOBAL) $(LIBCOMMON) bin_PROGRAMS += ceph-authtool -ceph_mon_store_converter_SOURCES = tools/mon_store_converter.cc -ceph_mon_store_converter_LDADD = $(LIBMON) $(LIBOS) $(CEPH_GLOBAL) -bin_PROGRAMS += ceph_mon_store_converter - noinst_HEADERS += \ tools/cephfs/JournalTool.h \ tools/cephfs/JournalScanner.h \ diff --git a/src/tools/mon_store_converter.cc b/src/tools/mon_store_converter.cc deleted file mode 100644 index 59b3265dd85..00000000000 --- a/src/tools/mon_store_converter.cc +++ /dev/null @@ -1,335 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab -/* -* Ceph - scalable distributed file system -* -* Copyright (C) 2012 Inktank, Inc. -* -* This is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License version 2.1, as published by the Free Software -* Foundation. See file COPYING. -*/ -#include <boost/scoped_ptr.hpp> - -#include <set> -#include <string> - -#include "common/ceph_argparse.h" -#include "common/debug.h" - -#include "include/types.h" -#include "include/buffer.h" - -#include "global/global_init.h" - -#include "mon/MonitorDBStore.h" -#include "mon/MonitorStore.h" - -using namespace std; - -class MonitorStoreConverter { - - boost::scoped_ptr<MonitorDBStore> db; - boost::scoped_ptr<MonitorStore> store; - - set<version_t> gvs; - version_t highest_last_pn; - version_t highest_accepted_pn; - - static const int PAXOS_MAX_VERSIONS = 50; - string MONITOR_NAME; - - public: - MonitorStoreConverter(string &store_path, string &db_store_path) - : db(0), store(0), - highest_last_pn(0), highest_accepted_pn(0), - MONITOR_NAME("monitor") - { - MonitorStore *store_ptr = new MonitorStore(store_path); - assert(!store_ptr->mount()); - store.reset(store_ptr); - - MonitorDBStore *db_ptr = new MonitorDBStore(db_store_path); - db.reset(db_ptr); - } - - int convert() { - if (db->open(std::cerr) >= 0) { - std::cerr << "store already exists" << std::endl; - return EEXIST; - } - assert(!db->create_and_open(std::cerr)); - if (db->exists("mon_convert", "on_going")) { - std::cout << __func__ << " found a mon store in mid-convertion; abort!" - << std::endl; - return EEXIST; - } - _mark_convert_start(); - _convert_monitor(); - _convert_machines(); - _mark_convert_finish(); - - std::cout << __func__ << " finished conversion" << std::endl; - - return 0; - } - - bool match() { - return true; - } - - private: - - set<string> _get_machines_names() { - set<string> names; - names.insert("auth"); - names.insert("logm"); - names.insert("mdsmap"); - names.insert("monmap"); - names.insert("osdmap"); - names.insert("pgmap"); - - return names; - } - - void _mark_convert_start() { - MonitorDBStore::TransactionRef tx(new MonitorDBStore::Transaction); - tx->put("mon_convert", "on_going", 1); - db->apply_transaction(tx); - } - - void _mark_convert_finish() { - MonitorDBStore::TransactionRef tx(new MonitorDBStore::Transaction); - tx->erase("mon_convert", "on_going"); - db->apply_transaction(tx); - } - - void _convert_monitor() { - - assert(store->exists_bl_ss("magic")); - assert(store->exists_bl_ss("keyring")); - assert(store->exists_bl_ss("feature_set")); - assert(store->exists_bl_ss("election_epoch")); - - MonitorDBStore::TransactionRef tx(new MonitorDBStore::Transaction); - - if (store->exists_bl_ss("joined")) { - version_t joined = store->get_int("joined"); - tx->put(MONITOR_NAME, "joined", joined); - } - - vector<string> keys; - keys.push_back("magic"); - keys.push_back("feature_set"); - keys.push_back("election_epoch"); - keys.push_back("cluster_uuid"); - - vector<string>::iterator it; - for (it = keys.begin(); it != keys.end(); ++it) { - if (!store->exists_bl_ss((*it).c_str())) - continue; - - bufferlist bl; - int r = store->get_bl_ss(bl, (*it).c_str(), 0); - assert(r > 0); - tx->put(MONITOR_NAME, *it, bl); - } - - assert(!tx->empty()); - db->apply_transaction(tx); - } - - void _convert_machines(string machine) { - std::cout << __func__ << " " << machine << std::endl; - - version_t first_committed = - store->get_int(machine.c_str(), "first_committed"); - version_t last_committed = - store->get_int(machine.c_str(), "last_committed"); - - version_t accepted_pn = store->get_int(machine.c_str(), "accepted_pn"); - version_t last_pn = store->get_int(machine.c_str(), "last_pn"); - - if (accepted_pn > highest_accepted_pn) - highest_accepted_pn = accepted_pn; - if (last_pn > highest_last_pn) - highest_last_pn = last_pn; - - string machine_gv(machine); - machine_gv.append("_gv"); - bool has_gv = true; - - if (!store->exists_bl_ss(machine_gv.c_str())) { - std::cerr << __func__ << " " << machine - << " no gv dir '" << machine_gv << "'" << std::endl; - has_gv = false; - } - - for (version_t ver = first_committed; ver <= last_committed; ver++) { - if (!store->exists_bl_sn(machine.c_str(), ver)) { - std::cerr << __func__ << " " << machine - << " ver " << ver << " dne" << std::endl; - continue; - } - - bufferlist bl; - int r = store->get_bl_sn(bl, machine.c_str(), ver); - assert(r >= 0); - std::cout << __func__ << " " << machine - << " ver " << ver << " bl " << bl.length() << std::endl; - - MonitorDBStore::TransactionRef tx(new MonitorDBStore::Transaction); - tx->put(machine, ver, bl); - tx->put(machine, "last_committed", ver); - - if (has_gv && store->exists_bl_sn(machine_gv.c_str(), ver)) { - stringstream s; - s << ver; - string ver_str = s.str(); - - version_t gv = store->get_int(machine_gv.c_str(), ver_str.c_str()); - std::cerr << __func__ << " " << machine - << " ver " << ver << " -> " << gv << std::endl; - - if (gvs.count(gv) == 0) { - gvs.insert(gv); - } else { - std::cerr << __func__ << " " << machine - << " gv " << gv << " already exists" - << std::endl; - } - - bufferlist tx_bl; - tx->encode(tx_bl); - tx->put("paxos", gv, tx_bl); - } - db->apply_transaction(tx); - } - - version_t lc = db->get(machine, "last_committed"); - assert(lc == last_committed); - - MonitorDBStore::TransactionRef tx(new MonitorDBStore::Transaction); - tx->put(machine, "first_committed", first_committed); - tx->put(machine, "last_committed", last_committed); - - if (store->exists_bl_ss(machine.c_str(), "latest")) { - bufferlist latest_bl_raw; - int r = store->get_bl_ss(latest_bl_raw, machine.c_str(), "latest"); - assert(r >= 0); - if (!latest_bl_raw.length()) { - std::cerr << __func__ << " machine " << machine - << " skip latest with size 0" << std::endl; - goto out; - } - - tx->put(machine, "latest", latest_bl_raw); - - bufferlist::iterator lbl_it = latest_bl_raw.begin(); - bufferlist latest_bl; - version_t latest_ver; - ::decode(latest_ver, lbl_it); - ::decode(latest_bl, lbl_it); - - std::cout << __func__ << " machine " << machine - << " latest ver " << latest_ver << std::endl; - - tx->put(machine, "full_latest", latest_ver); - stringstream os; - os << "full_" << latest_ver; - tx->put(machine, os.str(), latest_bl); - } - out: - db->apply_transaction(tx); - } - - void _convert_paxos() { - assert(!gvs.empty()); - - set<version_t>::reverse_iterator rit = gvs.rbegin(); - version_t highest_gv = *rit; - version_t last_gv = highest_gv; - - int n = 0; - for (; (rit != gvs.rend()) && (n < PAXOS_MAX_VERSIONS); ++rit, ++n) { - - version_t gv = *rit; - - if (last_gv == gv) - continue; - - if ((last_gv - gv) > 1) { - // we are done; we found a gap and we are only interested in keeping - // contiguous paxos versions. - break; - } - last_gv = gv; - } - - // erase all paxos versions between [first, last_gv[, with first being the - // first gv in the map. - MonitorDBStore::TransactionRef tx(new MonitorDBStore::Transaction); - set<version_t>::iterator it = gvs.begin(); - std::cout << __func__ << " first gv " << (*it) - << " last gv " << last_gv << std::endl; - for (; it != gvs.end() && (*it < last_gv); ++it) { - tx->erase("paxos", *it); - } - tx->put("paxos", "first_committed", last_gv); - tx->put("paxos", "last_committed", highest_gv); - tx->put("paxos", "accepted_pn", highest_accepted_pn); - tx->put("paxos", "last_pn", highest_last_pn); - db->apply_transaction(tx); - } - - void _convert_machines() { - - set<string> machine_names = _get_machines_names(); - set<string>::iterator it = machine_names.begin(); - - std::cout << __func__ << std::endl; - - for (; it != machine_names.end(); ++it) { - _convert_machines(*it); - } - - _convert_paxos(); - } -}; - - -void usage(const char *pname) -{ - std::cerr << "Usage: " << pname << " <old store path>\n" - << std::endl; -} - -int main(int argc, const char *argv[]) -{ - vector<const char*> def_args; - vector<const char*> args; - const char *our_name = argv[0]; - argv_to_vec(argc, argv, args); - - global_init(&def_args, args, - CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, - CINIT_FLAG_NO_DEFAULT_CONFIG_FILE); - common_init_finish(g_ceph_context); - g_ceph_context->_conf->apply_changes(NULL); - - if (args.empty()) { - usage(our_name); - return 1; - } - string store(args[0]); - string new_store(store); - MonitorStoreConverter converter(store, new_store); - int ret = converter.convert(); - assert(!ret); - assert(converter.match()); - - std::cout << "store successfully converted to new format" << std::endl; - - return 0; -} |