StalenessChecker: Expose some more public methods
Used by our custom index backend implementation, and may be useful for others as well (e.g. to write an offline staleness checker). Change-Id: Icb48993da89fae60c62663347dbdbb48667e0a94
This commit is contained in:
		@@ -84,7 +84,7 @@ public class StalenessChecker {
 | 
			
		||||
    this.db = db;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  boolean isStale(Change.Id id) throws IOException, OrmException {
 | 
			
		||||
  public boolean isStale(Change.Id id) throws IOException, OrmException {
 | 
			
		||||
    ChangeIndex i = indexes.getSearchIndex();
 | 
			
		||||
    if (i == null) {
 | 
			
		||||
      return false; // No index; caller couldn't do anything if it is stale.
 | 
			
		||||
@@ -100,17 +100,24 @@ public class StalenessChecker {
 | 
			
		||||
      return true; // Not in index, but caller wants it to be.
 | 
			
		||||
    }
 | 
			
		||||
    ChangeData cd = result.get();
 | 
			
		||||
    if (reviewDbChangeIsStale(
 | 
			
		||||
        cd.change(),
 | 
			
		||||
        ChangeNotes.readOneReviewDbChange(db.get(), cd.getId()))) {
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    return isStale(repoManager, id, cd.change(),
 | 
			
		||||
        ChangeNotes.readOneReviewDbChange(db.get(), id),
 | 
			
		||||
        parseStates(cd), parsePatterns(cd));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    return isStale(repoManager, id, parseStates(cd), parsePatterns(cd));
 | 
			
		||||
  public static boolean isStale(
 | 
			
		||||
      GitRepositoryManager repoManager,
 | 
			
		||||
      Change.Id id,
 | 
			
		||||
      Change indexChange,
 | 
			
		||||
      @Nullable Change reviewDbChange,
 | 
			
		||||
      SetMultimap<Project.NameKey, RefState> states,
 | 
			
		||||
      Multimap<Project.NameKey, RefStatePattern> patterns) {
 | 
			
		||||
    return reviewDbChangeIsStale(indexChange, reviewDbChange)
 | 
			
		||||
        || refsAreStale(repoManager, id, states, patterns);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @VisibleForTesting
 | 
			
		||||
  static boolean isStale(GitRepositoryManager repoManager,
 | 
			
		||||
  static boolean refsAreStale(GitRepositoryManager repoManager,
 | 
			
		||||
      Change.Id id,
 | 
			
		||||
      SetMultimap<Project.NameKey, RefState> states,
 | 
			
		||||
      Multimap<Project.NameKey, RefStatePattern> patterns) {
 | 
			
		||||
@@ -118,7 +125,7 @@ public class StalenessChecker {
 | 
			
		||||
        Sets.union(states.keySet(), patterns.keySet());
 | 
			
		||||
 | 
			
		||||
    for (Project.NameKey p : projects) {
 | 
			
		||||
      if (isStale(repoManager, id, p, states, patterns)) {
 | 
			
		||||
      if (refsAreStale(repoManager, id, p, states, patterns)) {
 | 
			
		||||
        return true;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
@@ -145,8 +152,7 @@ public class StalenessChecker {
 | 
			
		||||
    return parseStates(cd.getRefStates());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @VisibleForTesting
 | 
			
		||||
  static SetMultimap<Project.NameKey, RefState> parseStates(
 | 
			
		||||
  public static SetMultimap<Project.NameKey, RefState> parseStates(
 | 
			
		||||
      Iterable<byte[]> states) {
 | 
			
		||||
    RefState.check(states != null, null);
 | 
			
		||||
    SetMultimap<Project.NameKey, RefState> result = HashMultimap.create();
 | 
			
		||||
@@ -188,7 +194,7 @@ public class StalenessChecker {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static boolean isStale(GitRepositoryManager repoManager,
 | 
			
		||||
  private static boolean refsAreStale(GitRepositoryManager repoManager,
 | 
			
		||||
      Change.Id id, Project.NameKey project,
 | 
			
		||||
      SetMultimap<Project.NameKey, RefState> allStates,
 | 
			
		||||
      Multimap<Project.NameKey, RefStatePattern> allPatterns) {
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ package com.google.gerrit.server.index.change;
 | 
			
		||||
 | 
			
		||||
import static com.google.common.truth.Truth.assertThat;
 | 
			
		||||
import static com.google.common.truth.Truth.assert_;
 | 
			
		||||
import static com.google.gerrit.server.index.change.StalenessChecker.isStale;
 | 
			
		||||
import static com.google.gerrit.server.index.change.StalenessChecker.refsAreStale;
 | 
			
		||||
import static com.google.gerrit.testutil.TestChanges.newChange;
 | 
			
		||||
import static java.nio.charset.StandardCharsets.UTF_8;
 | 
			
		||||
import static java.util.stream.Collectors.toList;
 | 
			
		||||
@@ -189,7 +189,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
 | 
			
		||||
    // Not stale.
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, id1.name()),
 | 
			
		||||
@@ -199,7 +199,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
 | 
			
		||||
    // Wrong ref value.
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, SHA1),
 | 
			
		||||
@@ -209,7 +209,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
 | 
			
		||||
    // Swapped repos.
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, id2.name()),
 | 
			
		||||
@@ -222,7 +222,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
    ObjectId id3 = tr1.update(ref3, tr1.commit().message("commit 3"));
 | 
			
		||||
    tr1.update(ref3, id3);
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, id1.name()),
 | 
			
		||||
@@ -232,7 +232,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
 | 
			
		||||
    // Ignore ref not mentioned.
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, id1.name())),
 | 
			
		||||
@@ -241,7 +241,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
 | 
			
		||||
    // One ref wrong.
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, id1.name()),
 | 
			
		||||
@@ -257,7 +257,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
 | 
			
		||||
    // ref1 is only ref matching pattern.
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, id1.name())),
 | 
			
		||||
@@ -269,7 +269,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
    String ref2 = "refs/heads/bar";
 | 
			
		||||
    ObjectId id2 = tr1.update(ref2, tr1.commit().message("commit 2"));
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, id1.name())),
 | 
			
		||||
@@ -277,7 +277,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
                    P1, RefStatePattern.create("refs/heads/*"))))
 | 
			
		||||
        .isTrue();
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, id1.name()),
 | 
			
		||||
@@ -295,7 +295,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
 | 
			
		||||
    // ref1 is only ref matching pattern.
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, id1.name())),
 | 
			
		||||
@@ -307,7 +307,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
    String ref3 = "refs/other/foo";
 | 
			
		||||
    ObjectId id3 = tr1.update(ref3, tr1.commit().message("commit 3"));
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, id1.name())),
 | 
			
		||||
@@ -315,7 +315,7 @@ public class StalenessCheckerTest extends GerritBaseTests {
 | 
			
		||||
                    P1, RefStatePattern.create("refs/*/foo"))))
 | 
			
		||||
        .isTrue();
 | 
			
		||||
    assertThat(
 | 
			
		||||
            isStale(
 | 
			
		||||
            refsAreStale(
 | 
			
		||||
                repoManager, C,
 | 
			
		||||
                ImmutableSetMultimap.of(
 | 
			
		||||
                    P1, RefState.create(ref1, id1.name()),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user