You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/05/30 07:22:16 UTC

[james-project] 05/19: MAILBOX-351 Write a PreviousFailuresReIndexationTask

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 5f6ab604173538a80b6ce5015a3756d8143383df
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 23 11:44:56 2019 +0700

    MAILBOX-351 Write a PreviousFailuresReIndexationTask
    
    Taking the list of previous indexing failures, this task will attempt to
    reIndex all of the aforementioned messages.
---
 .../indexer/PreviousFailuresReIndexationTask.java  | 76 ++++++++++++++++++++++
 .../mailbox/tools/indexer/ReIndexerPerformer.java  | 20 ++++++
 .../tools/indexer/ReIndexingExecutionFailures.java | 24 +++++--
 3 files changed, 116 insertions(+), 4 deletions(-)

diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/PreviousFailuresReIndexationTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/PreviousFailuresReIndexationTask.java
new file mode 100644
index 0000000..ceed5cd
--- /dev/null
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/PreviousFailuresReIndexationTask.java
@@ -0,0 +1,76 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.mailbox.tools.indexer;
+
+import java.util.Optional;
+
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
+
+public class PreviousFailuresReIndexationTask implements Task {
+    public static final String PREVIOUS_FAILURES_INDEXING = "ReIndexPreviousFailures";
+
+    public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
+        private final ReprocessingContext reprocessingContext;
+
+        AdditionalInformation(ReprocessingContext reprocessingContext) {
+            this.reprocessingContext = reprocessingContext;
+        }
+
+        public int getSuccessfullyReprocessMailCount() {
+            return reprocessingContext.successfullyReprocessedMailCount();
+        }
+
+        public int getFailedReprocessedMailCount() {
+            return reprocessingContext.failedReprocessingMailCount();
+        }
+
+        public ReIndexingExecutionFailures failures() {
+            return reprocessingContext.failures();
+        }
+    }
+
+    private final ReIndexerPerformer reIndexerPerformer;
+    private final AdditionalInformation additionalInformation;
+    private final ReprocessingContext reprocessingContext;
+    private final ReIndexingExecutionFailures previousFailures;
+
+    public PreviousFailuresReIndexationTask(ReIndexerPerformer reIndexerPerformer, ReIndexingExecutionFailures previousFailures) {
+        this.reIndexerPerformer = reIndexerPerformer;
+        this.previousFailures = previousFailures;
+        this.reprocessingContext = new ReprocessingContext();
+        this.additionalInformation = new AdditionalInformation(reprocessingContext);
+    }
+
+    @Override
+    public Result run() {
+        return reIndexerPerformer.reIndex(reprocessingContext, previousFailures);
+    }
+
+    @Override
+    public String type() {
+        return PREVIOUS_FAILURES_INDEXING;
+    }
+
+    @Override
+    public Optional<TaskExecutionDetails.AdditionalInformation> details() {
+        return Optional.of(additionalInformation);
+    }
+}
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
index 1411d70..035da20 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
@@ -83,6 +83,26 @@ public class ReIndexerPerformer {
         }
     }
 
+    Task.Result reIndex(ReprocessingContext reprocessingContext, ReIndexingExecutionFailures previousReIndexingFailures) {
+        return previousReIndexingFailures.failures()
+            .stream()
+            .map(previousFailure -> reIndex(reprocessingContext, previousFailure))
+            .reduce(Task::combine)
+            .orElse(Task.Result.COMPLETED);
+    }
+
+    private Task.Result reIndex(ReprocessingContext reprocessingContext, ReIndexingExecutionFailures.ReIndexingFailure previousReIndexingFailure) {
+        MailboxId mailboxId = previousReIndexingFailure.getMailboxId();
+        MessageUid uid = previousReIndexingFailure.getUid();
+        try {
+            return handleMessageReIndexing(mailboxId, uid, reprocessingContext);
+        } catch (MailboxException e) {
+            LOGGER.warn("ReIndexing failed for {} {}", mailboxId, uid, e);
+            reprocessingContext.recordFailureDetailsForMessage(mailboxId, uid);
+            return Task.Result.PARTIAL;
+        }
+    }
+
     Task.Result reIndex(ReprocessingContext reprocessingContext) throws MailboxException {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(RE_INDEXING);
         LOGGER.info("Starting a full reindex");
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexingExecutionFailures.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexingExecutionFailures.java
index fd56d09..4ed98ec 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexingExecutionFailures.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexingExecutionFailures.java
@@ -25,8 +25,10 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MailboxId;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonValue;
 import com.github.steveash.guavate.Guavate;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Multimap;
 
 public class ReIndexingExecutionFailures {
@@ -40,13 +42,22 @@ public class ReIndexingExecutionFailures {
         }
 
         @JsonIgnore
-        public String getMailboxId() {
+        public String getSerializedMailboxId() {
             return mailboxId.serialize();
         }
 
-        public long getUid() {
+        public MailboxId getMailboxId() {
+            return mailboxId;
+        }
+
+        @JsonProperty("uid")
+        public long getSerializedUid() {
             return uid.asLong();
         }
+
+        public MessageUid getUid() {
+            return uid;
+        }
     }
 
     private final List<ReIndexingFailure> failures;
@@ -56,8 +67,13 @@ public class ReIndexingExecutionFailures {
     }
 
     @JsonValue
-    public Multimap<String, ReIndexingFailure> failures() {
+    public Multimap<String, ReIndexingFailure> serializedFailures() {
         return failures.stream()
-            .collect(Guavate.toImmutableListMultimap(ReIndexingFailure::getMailboxId));
+            .collect(Guavate.toImmutableListMultimap(ReIndexingFailure::getSerializedMailboxId));
+    }
+
+    @JsonIgnore
+    public List<ReIndexingFailure> failures() {
+        return ImmutableList.copyOf(failures);
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org