![JAR search and dependency download from the Maven repository](/logo.png)
org.opendaylight.controller.cluster.raft.RaftActorDelegatingPersistentDataProvider Maven / Gradle / Ivy
/*
* Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.controller.cluster.raft;
import static java.util.Objects.requireNonNull;
import akka.japi.Procedure;
import org.opendaylight.controller.cluster.DataPersistenceProvider;
import org.opendaylight.controller.cluster.DelegatingPersistentDataProvider;
import org.opendaylight.controller.cluster.PersistentDataProvider;
import org.opendaylight.controller.cluster.raft.messages.PersistentPayload;
/**
* The DelegatingPersistentDataProvider used by RaftActor to override the configured persistent provider to
* persist ReplicatedLogEntry's based on whether or not the payload is a PersistentPayload instance.
*
* @author Thomas Pantelis
*/
class RaftActorDelegatingPersistentDataProvider extends DelegatingPersistentDataProvider {
private final PersistentDataProvider persistentProvider;
RaftActorDelegatingPersistentDataProvider(final DataPersistenceProvider delegate,
final PersistentDataProvider persistentProvider) {
super(delegate);
this.persistentProvider = requireNonNull(persistentProvider);
}
@Override
public void persist(final T entry, final Procedure procedure) {
doPersist(entry, procedure, false);
}
@Override
public void persistAsync(final T entry, final Procedure procedure) {
doPersist(entry, procedure, true);
}
private void doPersist(final T entry, final Procedure procedure, final boolean async) {
if (!getDelegate().isRecoveryApplicable() && entry instanceof ReplicatedLogEntry replicatedLogEntry
&& replicatedLogEntry.getData() instanceof PersistentPayload payload) {
// We persist the Payload but not the ReplicatedLogEntry to avoid gaps in the journal indexes on recovery
// if data persistence is later enabled.
if (async) {
persistentProvider.persistAsync(payload, p -> procedure.apply(entry));
} else {
persistentProvider.persist(payload, p -> procedure.apply(entry));
}
} else if (async) {
super.persistAsync(entry, procedure);
} else {
super.persist(entry, procedure);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy