blob: 86e6f80ac5fb29eed8e8f14f010b34e7bf4818f2 [file] [log] [blame]
/*
* 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.flink.state.changelog;
import org.apache.flink.annotation.Internal;
import org.apache.flink.api.common.state.ListState;
import org.apache.flink.core.memory.DataOutputView;
import org.apache.flink.util.function.ThrowingConsumer;
import java.io.Closeable;
import java.io.IOException;
/**
* Logs changes to a state created by {@link ChangelogKeyedStateBackend}. The changes are intended
* to be stored durably, included into a checkpoint and replayed on recovery in case of failure.
*
* <p>Note that the order of updating the delegated state and logging it using this class usually
* doesn't matter. However in some cases an already updated state needs to be logged. Besides that,
* delegated state update is usually local and would fail faster. Therefore, consider updating the
* delegated state first and logging the change second.
*
* <p>If state update succeeds and changelog append fails immediately then the updated change is
* discarded as no checkpoints can proceed.
*
* <p>If changelog append fails asynchronously then subsequent checkpoints can only succeed after
* state materialization.
*
* @param <Value> type of state (value)
* @param <Namespace> type of namespace
*/
@Internal
public interface StateChangeLogger<Value, Namespace> extends Closeable {
/** State updated, such as by {@link ListState#update}. */
void valueUpdated(Value newValue, Namespace ns) throws IOException;
/** State update internally (usually with a value that the user has no control over). */
void valueUpdatedInternal(Value newValue, Namespace ns) throws IOException;
/** State added, such as append to list.addAll. */
void valueAdded(Value addedValue, Namespace ns) throws IOException;
/** State cleared. */
void valueCleared(Namespace ns) throws IOException;
/** State element added, such as append of a single element to a list. */
void valueElementAdded(
ThrowingConsumer<DataOutputView, IOException> dataSerializer, Namespace ns)
throws IOException;
/** State element added or updated, such as put into a map. */
void valueElementAddedOrUpdated(
ThrowingConsumer<DataOutputView, IOException> dataSerializer, Namespace ns)
throws IOException;
/** State element removed, such mapping removal from a map. */
void valueElementRemoved(
ThrowingConsumer<DataOutputView, IOException> dataSerializer, Namespace ns)
throws IOException;
/** Enable logging meta data before next writes. */
void resetWritingMetaFlag();
}