CavalliumDBEngine/src/main/java/it/cavallium/dbengine/client/Backuppable.java

57 lines
1.4 KiB
Java
Raw Normal View History

2022-08-15 23:07:17 +02:00
package it.cavallium.dbengine.client;
import java.io.IOException;
2022-08-15 23:07:17 +02:00
import java.util.concurrent.atomic.AtomicInteger;
public abstract class Backuppable implements IBackuppable {
public enum State {
RUNNING, PAUSING, PAUSED, RESUMING, STOPPED
}
private final AtomicInteger state = new AtomicInteger();
@Override
public final void pauseForBackup() {
if (state.compareAndSet(State.RUNNING.ordinal(), State.PAUSING.ordinal())) {
try {
onPauseForBackup();
state.compareAndSet(State.PAUSING.ordinal(), State.PAUSED.ordinal());
} catch (Throwable ex) {
state.compareAndSet(State.PAUSING.ordinal(), State.RUNNING.ordinal());
throw ex;
2022-08-15 23:07:17 +02:00
}
}
2022-08-15 23:07:17 +02:00
}
@Override
public final void resumeAfterBackup() {
if (state.compareAndSet(State.PAUSED.ordinal(), State.RESUMING.ordinal())) {
try {
onResumeAfterBackup();
state.compareAndSet(State.RESUMING.ordinal(), State.RUNNING.ordinal());
} catch (Throwable ex) {
state.compareAndSet(State.RESUMING.ordinal(), State.PAUSED.ordinal());
throw ex;
2022-08-15 23:07:17 +02:00
}
}
2022-08-15 23:07:17 +02:00
}
@Override
public final boolean isPaused() {
return state.get() == State.PAUSED.ordinal();
}
public final State getState() {
return State.values()[state.get()];
}
protected abstract void onPauseForBackup();
2022-08-15 23:07:17 +02:00
protected abstract void onResumeAfterBackup();
2022-08-15 23:07:17 +02:00
public final void setStopped() {
state.set(State.STOPPED.ordinal());
}
}