blob: 0df84910b3bc360208340be992bcaa7648e30ccc [file] [log] [blame]
// Copyright (C) 2020 The Android Open Source Project
//
// Licensed 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 com.google.gerrit.server.update;
import com.google.gerrit.server.submit.MergeOpRepoManager;
import java.util.Collection;
import java.util.Optional;
/**
* Status and progress of a submission.
*
* <p>{@link SubmissionExecutor} reports the progress of the submission through this interface. An
* instance is reused between retries but should not be reused for different submissions.
*/
public interface SubmissionListener {
/**
* This submission is a dryrun.
*
* <p>In dryrun, the submission adds objects to storage, generates receive commands and creates a
* BatchRefUpdate, but it won't execute the BRU (i.e. it won't update the refs).
*
* <p>The submission receives the listeners and the dryrun flag at construction time. This method
* is called if needed at that point (i.e. before anything else) and never again inside the
* submission. Listeners instances should not be reused between submissions (note that the dryrun
* state would not be reverted).
*/
void setDryrun();
/**
* Submission will execute these updates.
*
* <p>The BatchUpdates haven't execute anything yet.
*
* <p>This method is called once per submission try. The retry calls can have only a subset of the
* BatchUpdates (what failed in the previous attempt). On retries the BatchUpdates are not reused.
* Implementations must store intermediate results if needed on {@link
* #afterSubmission(MergeOpRepoManager)}.
*
* @param updates updates to execute in this try of the submission. Implementations should not
* modify them.
*/
void beforeBatchUpdates(Collection<BatchUpdate> updates);
/**
* Submission completed (either success or giving up retrying).
*
* <p>This is called after all (successfull) updates have been committed to storage and there
* won't be more retries.
*
* @param orm the orm to use if the after submission steps need to read from the repositories.
* This could be a pristine repo manager (if the previous op didn't use MergeOpRepoManager) or
* the latest orm used after retrying.
*/
void afterSubmission(MergeOpRepoManager orm);
/**
* If the submission needs to know more about the BatchUpdate execution, it can provide a {@link
* BatchUpdateListener}.
*
* @return a BatchUpdateListener
*/
Optional<BatchUpdateListener> listensToBatchUpdates();
}