Skip to content
This repository has been archived by the owner on Aug 23, 2020. It is now read-only.

Increase rescan performance of old milestones after IRI restart #1204

Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,14 @@ public interface MilestoneService {
* the signature to analyze if the given milestone was really issued by the coordinator.<br />
*
* @param transactionViewModel transaction that shall be analyzed
* @param milestoneIndex milestone index of the transaction (see {@link #getMilestoneIndex(TransactionViewModel)})
* @param mode mode that gets used for the signature verification
* @param securityLevel security level that gets used for the signature verification
* @return validity status of the transaction regarding its role as a milestone
* @throws MilestoneException if anything unexpected goes wrong while validating the milestone transaction
*/
MilestoneValidity validateMilestone(TransactionViewModel transactionViewModel, SpongeFactory.Mode mode,
int securityLevel) throws MilestoneException;
MilestoneValidity validateMilestone(TransactionViewModel transactionViewModel, int milestoneIndex,
SpongeFactory.Mode mode, int securityLevel) throws MilestoneException;

/**
* Updates the milestone index of all transactions that belong to a milestone.<br />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@
public enum MilestoneValidity {
VALID,
INVALID,
INCOMPLETE
INCOMPLETE,
IRRELEVANT
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@

import static com.iota.iri.service.milestone.MilestoneValidity.INCOMPLETE;
import static com.iota.iri.service.milestone.MilestoneValidity.INVALID;
import static com.iota.iri.service.milestone.MilestoneValidity.VALID;

/**
* Creates a tracker that automatically detects new milestones by incorporating a background worker that periodically
Expand Down Expand Up @@ -210,7 +209,9 @@ public MilestoneValidity analyzeMilestoneCandidate(TransactionViewModel transact

int milestoneIndex = milestoneService.getMilestoneIndex(transaction);

switch (milestoneService.validateMilestone(transaction, SpongeFactory.Mode.CURLP27, 1)) {
MilestoneValidity validity = milestoneService.validateMilestone(transaction, milestoneIndex,
SpongeFactory.Mode.CURLP27, 1);
switch (validity) {
case VALID:
if (milestoneIndex > latestMilestoneIndex) {
setLatestMilestone(transaction.getHash(), milestoneIndex);
Expand All @@ -222,17 +223,17 @@ public MilestoneValidity analyzeMilestoneCandidate(TransactionViewModel transact

transaction.isMilestone(tangle, snapshotProvider.getInitialSnapshot(), true);

return VALID;
return validity;

case INCOMPLETE:
milestoneSolidifier.add(transaction.getHash(), milestoneIndex);

transaction.isMilestone(tangle, snapshotProvider.getInitialSnapshot(), true);

return INCOMPLETE;
return validity;

default:
return INVALID;
return validity;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import static com.iota.iri.controllers.TransactionViewModel.OBSOLETE_TAG_TRINARY_OFFSET;
import static com.iota.iri.service.milestone.MilestoneValidity.INCOMPLETE;
import static com.iota.iri.service.milestone.MilestoneValidity.INVALID;
import static com.iota.iri.service.milestone.MilestoneValidity.IRRELEVANT;
import static com.iota.iri.service.milestone.MilestoneValidity.VALID;

/**
Expand Down Expand Up @@ -160,14 +161,17 @@ public void resetCorruptedMilestone(int index) throws MilestoneException {
}

@Override
public MilestoneValidity validateMilestone(TransactionViewModel transactionViewModel, SpongeFactory.Mode mode,
int securityLevel) throws MilestoneException {
public MilestoneValidity validateMilestone(TransactionViewModel transactionViewModel, int milestoneIndex,
Copy link
Contributor

Choose a reason for hiding this comment

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

nice addition of parameter

SpongeFactory.Mode mode, int securityLevel) throws MilestoneException {

int milestoneIndex = getMilestoneIndex(transactionViewModel);
if (milestoneIndex < 0 || milestoneIndex >= 0x200000) {
return INVALID;
}

if (milestoneIndex <= snapshotProvider.getInitialSnapshot().getIndex()) {
return IRRELEVANT;
}

try {
if (MilestoneViewModel.get(tangle, milestoneIndex) != null) {
// Already validated.
Expand Down