Merge branch 'stable-3.1'
* stable-3.1:
Prevent persistent task listing interruptions on IOExceptions
Change-Id: Iaa7a6e354b629fac9afdb8bf18074a4662b61541
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java
index b805c72..49cb059 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java
@@ -28,6 +28,7 @@
import java.nio.file.DirectoryStream;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
@@ -222,13 +223,21 @@
private List<ReplicateRefUpdate> list(Path tasks) {
List<ReplicateRefUpdate> results = new ArrayList<>();
try (DirectoryStream<Path> events = Files.newDirectoryStream(tasks)) {
- for (Path e : events) {
- if (Files.isRegularFile(e)) {
- String json = new String(Files.readAllBytes(e), UTF_8);
- results.add(GSON.fromJson(json, ReplicateRefUpdate.class));
- } else if (Files.isDirectory(e)) {
+ for (Path path : events) {
+ if (Files.isRegularFile(path)) {
try {
- results.addAll(list(e));
+ String json = new String(Files.readAllBytes(path), UTF_8);
+ results.add(GSON.fromJson(json, ReplicateRefUpdate.class));
+ } catch (NoSuchFileException ex) {
+ logger.atFine().log(
+ "File %s not found while listing waiting tasks (likely in-flight or completed by another node)",
+ path);
+ } catch (IOException e) {
+ logger.atSevere().withCause(e).log("Error when firing pending event %s", path);
+ }
+ } else if (Files.isDirectory(path)) {
+ try {
+ results.addAll(list(path));
} catch (DirectoryIteratorException d) {
// iterating over the sub-directories is expected to have dirs disappear
Nfs.throwIfNotStaleFileHandle(d.getCause());