X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/f2170465073de34adf89161d4287182b518352c4..2546a41ad36fdc9ef6471cb35a1d56930ae1b527:/log.cc diff --git a/log.cc b/log.cc index baf3c2f..627b7ac 100644 --- a/log.cc +++ b/log.cc @@ -1,132 +1,102 @@ #include "paxos.h" #include #include -#include "tprintf.h" +#include "threaded_log.h" // Paxos must maintain some durable state (i.e., that survives power // failures) to run Paxos correct. This module implements a log with // all durable state to run Paxos. Since the values chosen correspond // to views, the log contains all views since the beginning of time. -log::log(acceptor *_acc, std::string _me) - : pxs (_acc) -{ - name = "paxos-" + _me + ".log"; - logread(); +log::log(acceptor *_acc, std::string _me) : pxs (_acc) { + name = "paxos-" + _me + ".log"; + logread(); } -void -log::logread(void) -{ - std::ifstream from; - std::string type; - unsigned instance; +void log::logread(void) { + std::ifstream from; + std::string type; + unsigned instance; - from.open(name.c_str()); - LOG("logread"); - while (from >> type) { - if (type == "done") { - std::string v; - from >> instance; - from.get(); - getline(from, v); - pxs->values[instance] = v; - pxs->instance_h = instance; - LOG("logread: instance: " << instance << " w. v = " << - pxs->values[instance]); - pxs->v_a.clear(); - pxs->n_h.n = 0; - pxs->n_a.n = 0; - } else if (type == "propseen") { - from >> pxs->n_h.n; - from >> pxs->n_h.m; - LOG("logread: high update: " << pxs->n_h.n << "(" << pxs->n_h.m << ")"); - } else if (type == "accepted") { - std::string v; - from >> pxs->n_a.n; - from >> pxs->n_a.m; - from.get(); - getline(from, v); - pxs->v_a = v; - LOG("logread: prop update " << pxs->n_a.n << "(" << pxs->n_a.m << ") with v = " << pxs->v_a); - } else { - LOG("logread: unknown log record"); - VERIFY(0); - } - } - from.close(); + from.open(name.c_str()); + LOG("logread"); + while (from >> type) { + if (type == "done") { + std::string v; + from >> instance; + from.get(); + getline(from, v); + pxs->values[instance] = v; + pxs->instance_h = instance; + LOG("logread: instance: " << instance << " w. v = " << + pxs->values[instance]); + pxs->v_a.clear(); + pxs->n_h.n = 0; + pxs->n_a.n = 0; + } else if (type == "propseen") { + from >> pxs->n_h.n; + from >> pxs->n_h.m; + LOG("logread: high update: " << pxs->n_h.n << "(" << pxs->n_h.m << ")"); + } else if (type == "accepted") { + std::string v; + from >> pxs->n_a.n; + from >> pxs->n_a.m; + from.get(); + getline(from, v); + pxs->v_a = v; + LOG("logread: prop update " << pxs->n_a.n << "(" << pxs->n_a.m << ") with v = " << pxs->v_a); + } else { + LOG("logread: unknown log record"); + VERIFY(0); + } + } + from.close(); } -std::string -log::dump() -{ - std::ifstream from; - std::string res; - std::string v; - from.open(name.c_str()); - while (getline(from, v)) { - res = res + v + "\n"; - } - from.close(); - return res; +std::string log::dump() { + std::ifstream from; + std::string res; + std::string v; + from.open(name.c_str()); + while (getline(from, v)) + res += v + "\n"; + from.close(); + return res; } -void -log::restore(std::string s) -{ - std::ofstream f; - LOG("restore: " << s); - f.open(name.c_str(), std::ios::trunc); - f << s; - f.close(); +void log::restore(std::string s) { + std::ofstream f; + LOG("restore: " << s); + f.open(name.c_str(), std::ios::trunc); + f << s; + f.close(); } // XXX should be an atomic operation -void -log::loginstance(unsigned instance, std::string v) -{ - std::ofstream f; - f.open(name.c_str(), std::ios::app); - f << "done"; - f << " "; - f << instance; - f << " "; - f << v; - f << "\n"; - f.close(); +void log::loginstance(unsigned instance, std::string v) { + std::ofstream f(name, std::ios::app); + f << "done " << instance << " " << v << "\n"; + f.close(); } // an acceptor should call logprop(n_h) when it // receives a prepare to which it responds prepare_ok(). -void -log::logprop(prop_t n_h) -{ - std::ofstream f; - f.open(name.c_str(), std::ios::app); - f << "propseen"; - f << " "; - f << n_h.n; - f << " "; - f << n_h.m; - f << "\n"; - f.close(); +void log::logprop(prop_t n_h) { + std::ofstream f; + f.open(name.c_str(), std::ios::app); + f << "propseen"; + f << " "; + f << n_h.n; + f << " "; + f << n_h.m; + f << "\n"; + f.close(); } // an acceptor should call logaccept(n_a, v_a) when it // receives an accept RPC to which it replies accept_ok(). -void -log::logaccept(prop_t n, std::string v) -{ - std::ofstream f; - f.open(name.c_str(), std::ios::app); - f << "accepted"; - f << " "; - f << n.n; - f << " "; - f << n.m; - f << " "; - f << v; - f << "\n"; - f.close(); +void log::logaccept(prop_t n, std::string v) { + std::ofstream f(name, std::ios::app); + f << "accepted " << n.n << " " << n.m << " " << v << "\n"; + f.close(); } -