void Client::SetMaster(int master_, int nodeID) { Log_Trace("known master: %d, set master: %d, nodeID: %d", master, master_, nodeID); Command** it; Command* cmd; if (master_ == nodeID) { if (master != master_) { // node became the master Log_Message("Node %d is the master", nodeID); master = master_; connectivityStatus = KEYSPACE_SUCCESS; SendCommand(conns[master], safeCommands); } // else node is still the master EventLoop::Reset(&masterTimeout); } else if (master_ < 0 && master == nodeID) { // node lost its mastership Log_Message("Node %d lost its mastership", nodeID); master = -1; connectivityStatus = KEYSPACE_NOMASTER; if (!IsSafe()) return; for (it = result->commands.Head(); it != NULL; it = result->commands.Next(it)) { cmd = *it; cmd->cmdID = NextCommandID(); Log_Trace("new command ID: %" PRIu64 "", cmd->cmdID); if (cmd->status == KEYSPACE_NOSERVICE && cmd->nodeID == nodeID) { Log_Trace("appending to safecommands"); cmd->nodeID = -1; cmd->ClearResponse(); if (!cmd->IsDirty()) safeCommands.Append(cmd); } else { Log_Trace("NOT appending to safecommands: %d %d", cmd->status, cmd->nodeID); } } // set master timeout } }
bool Client::IsSafe() { Command** it; Command* cmd; it = result->commands.Head(); if (!it) return false; cmd = *it; if (cmd->IsDirty()) return false; return true; }