// paxos_commit to inform higher layers of the agreed value for this
// instance.
-proposer_acceptor::proposer_acceptor(class paxos_change *_delegate,
+proposer_acceptor::proposer_acceptor(paxos_change *_delegate,
bool _first, const node_t & _me, const value_t & _value)
: delegate(_delegate), me (_me)
{
bool r = false;
proposal.n = max(promise.n, proposal.n) + 1;
nodes_t accepts;
- value_t v = newv;
+ value_t v;
if (prepare(instance, accepts, cur_nodes, v)) {
if (majority(cur_nodes, accepts)) {
LOG("received a majority of prepare responses");
+ if (!v.size())
+ v = newv;
+
breakpoint1();
nodes_t nodes;
if (!r)
continue;
auto status = (paxos_protocol::status)r->call_timeout(
- paxos_protocol::preparereq, rpcc::to(1000), res, me, instance, proposal);
+ paxos_protocol::preparereq, milliseconds(100), res, me, instance, proposal);
if (status == paxos_protocol::OK) {
if (res.oldinstance) {
LOG("commiting old instance!");
continue;
bool accept = false;
int status = r->call_timeout(
- paxos_protocol::acceptreq, rpcc::to(1000), accept, me, instance, proposal, v);
+ paxos_protocol::acceptreq, milliseconds(100), accept, me, instance, proposal, v);
if (status == paxos_protocol::OK && accept)
accepts.push_back(i);
}
if (!r)
continue;
int res = 0;
- r->call_timeout(paxos_protocol::decidereq, rpcc::to(1000), res, me, instance, v);
+ r->call_timeout(paxos_protocol::decidereq, milliseconds(100), res, me, instance, v);
}
}
}
void proposer_acceptor::commit(unsigned instance, const value_t & value, lock & pxs_mutex_lock) {
- LOG("acceptor::commit: instance=" << instance << " has v=" << value);
+ LOG("instance=" << instance << " has v=" << value);
if (instance > instance_h) {
- LOG("commit: highestacceptedinstance = " << instance);
+ LOG("highestacceptedinstance = " << instance);
values[instance] = value;
l.loginstance(instance, value);
instance_h = instance;
accepted = promise = {0, me};
- accepted_value.clear();
+ string v = value; // gaaahhh aliasing of value and accepted_value
+ accepted_value.clear(); // this wipes out "value", too
if (delegate) {
pxs_mutex_lock.unlock();
- delegate->paxos_commit(instance, value);
+ delegate->paxos_commit(instance, v);
pxs_mutex_lock.lock();
}
}
void proposer_acceptor::breakpoint(int b) {
if (b == 3) {
- LOG("Proposer: breakpoint 1");
+ LOG("breakpoint 1");
break1 = true;
} else if (b == 4) {
- LOG("Proposer: breakpoint 2");
+ LOG("breakpoint 2");
break2 = true;
}
}