Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tidy consensus #2156

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/ripple/app/misc/Validations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,14 @@ class ValidationsImp : public Validations
if (!val->isTrusted() && pubKey)
val->setTrusted();

// Do not process partial validations.
if(!val->isFull())
{
// Only forward if current
return isCurrent;
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: The {} really aren't necessary.



if (!val->isTrusted ())
{
JLOG (j_.trace()) <<
Expand Down
59 changes: 39 additions & 20 deletions src/ripple/consensus/Consensus.h
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ class Consensus
startRound(
NetClock::time_point const& now,
typename Ledger_t::ID const& prevLedgerID,
Ledger_t const& prevLedger,
Ledger_t prevLedger,
bool proposing);

/** A peer has proposed a new position, adjust our tracking.
Expand Down Expand Up @@ -638,7 +638,7 @@ void
Consensus<Derived, Traits>::startRound(
NetClock::time_point const& now,
typename Ledger_t::ID const& prevLedgerID,
Ledger_t const& prevLedger,
Ledger_t prevLedger,
bool proposing)
{
std::lock_guard<std::recursive_mutex> _(*lock_);
Expand All @@ -653,11 +653,31 @@ Consensus<Derived, Traits>::startRound(
{
prevCloseTime_ = rawCloseTimes_.self;
}

Mode startMode = proposing ? Mode::proposing : Mode::observing;

// We were handed the wrong ledger
if (prevLedger.id() != prevLedgerID)
{
// try to acquire the correct one
if(auto newLedger = impl().acquireLedger(prevLedgerID))
{
prevLedger = *newLedger;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ledger_t looks like it's usually a thin wrapper around a shared_ptr (i.e. RCLCxLedger). There's a minor benefit if we move here instead of copy.

}
else // Unable to acquire the correct ledger
{
startMode = Mode::wrongLedger;
JLOG(j_.info())
<< "Entering consensus with: " << previousLedger_.id();
JLOG(j_.info()) << "Correct LCL is: " << prevLedgerID;
}
}

startRoundInternal(
now,
prevLedgerID,
prevLedger,
proposing ? Mode::proposing : Mode::observing);
startMode);
}
template <class Derived, class Traits>
void
Expand Down Expand Up @@ -687,19 +707,6 @@ Consensus<Derived, Traits>::startRoundInternal(
previousLedger_.closeAgree(),
previousLedger_.seq() + 1);

if (previousLedger_.id() != prevLedgerID_)
{
handleWrongLedger(prevLedgerID_);

// Unable to acquire the correct ledger
if (mode_ == Mode::wrongLedger)
{
JLOG(j_.info())
<< "Entering consensus with: " << previousLedger_.id();
JLOG(j_.info()) << "Correct LCL is: " << prevLedgerID;
}
}

playbackProposals();
if (peerProposals_.size() > (prevProposers_ / 2))
{
Expand Down Expand Up @@ -1005,14 +1012,15 @@ Consensus<Derived, Traits>::handleWrongLedger(
{
assert(lgrId != prevLedgerID_ || previousLedger_.id() != lgrId);

// Stop proposing because we are out of sync
leaveConsensus();

// First time switching to this ledger
if (prevLedgerID_ != lgrId)
{
// first time switching to this ledger
prevLedgerID_ = lgrId;

// Stop proposing because we are out of sync
leaveConsensus();

// Clear out state
if (result_)
{
result_->disputes.clear();
Expand Down Expand Up @@ -1387,7 +1395,18 @@ Consensus<Derived, Traits>::updateOurPositions()
// Share our new transaction set if we haven't already received
// it from a peer
if (acquired_.emplace(newID, result_->set).second)
{
impl().relay(result_->set);
// Update votes for any peers that have also taken this
// transaction set as their position
for (auto const& p : peerProposals_)
{
if (p.second.position() == newID)
{
updateDisputes(p.first, result_->set);
}
}
}

if (mode_ == Mode::proposing)
impl().propose(result_->position);
Expand Down