@@ -919,18 +919,30 @@ public void endVerification(String seed) {
919
919
920
920
@ Override
921
921
public RepositoryData getRepositoryData () {
922
- final long generation ;
923
- try {
924
- generation = latestIndexBlobId ();
925
- } catch (IOException ioe ) {
926
- throw new RepositoryException (metadata .name (), "Could not determine repository generation from root blobs" , ioe );
927
- }
928
- final long genToLoad = latestKnownRepoGen .updateAndGet (known -> Math .max (known , generation ));
929
- if (genToLoad != generation ) {
930
- logger .warn ("Determined repository generation [" + generation + "] from repository contents but correct generation must be " +
931
- "at least [" + genToLoad + "]" );
922
+ // Retry loading RepositoryData in a loop in case we run into concurrent modifications of the repository.
923
+ while (true ) {
924
+ final long generation ;
925
+ try {
926
+ generation = latestIndexBlobId ();
927
+ } catch (IOException ioe ) {
928
+ throw new RepositoryException (metadata .name (), "Could not determine repository generation from root blobs" , ioe );
929
+ }
930
+ final long genToLoad = latestKnownRepoGen .updateAndGet (known -> Math .max (known , generation ));
931
+ if (genToLoad != generation ) {
932
+ logger .warn ("Determined repository generation [" + generation
933
+ + "] from repository contents but correct generation must be at least [" + genToLoad + "]" );
934
+ }
935
+ try {
936
+ return getRepositoryData (genToLoad );
937
+ } catch (RepositoryException e ) {
938
+ if (genToLoad != latestKnownRepoGen .get ()) {
939
+ logger .warn ("Failed to load repository data generation [" + genToLoad +
940
+ "] because a concurrent operation moved the current generation to [" + latestKnownRepoGen .get () + "]" , e );
941
+ continue ;
942
+ }
943
+ throw e ;
944
+ }
932
945
}
933
- return getRepositoryData (genToLoad );
934
946
}
935
947
936
948
private RepositoryData getRepositoryData (long indexGen ) {
@@ -947,6 +959,13 @@ private RepositoryData getRepositoryData(long indexGen) {
947
959
return RepositoryData .snapshotsFromXContent (parser , indexGen );
948
960
}
949
961
} catch (IOException ioe ) {
962
+ // If we fail to load the generation we tracked in latestKnownRepoGen we reset it.
963
+ // This is done as a fail-safe in case a user manually deletes the contents of the repository in which case subsequent
964
+ // operations must start from the EMPTY_REPO_GEN again
965
+ if (RepositoryData .EMPTY_REPO_GEN ==
966
+ latestKnownRepoGen .updateAndGet (known -> known == indexGen ? RepositoryData .EMPTY_REPO_GEN : known )) {
967
+ logger .warn ("Resetting repository generation tracker because we failed to read generation [" + indexGen + "]" );
968
+ }
950
969
throw new RepositoryException (metadata .name (), "could not read repository data from index blob" , ioe );
951
970
}
952
971
}
0 commit comments