2022-08-15 23:07:17 +02:00
|
|
|
package it.cavallium.dbengine.client;
|
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
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
|
2023-02-09 23:34:25 +01:00
|
|
|
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
|
|
|
}
|
2023-02-09 23:34:25 +01:00
|
|
|
}
|
2022-08-15 23:07:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2023-02-09 23:34:25 +01:00
|
|
|
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
|
|
|
}
|
2023-02-09 23:34:25 +01: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()];
|
|
|
|
}
|
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
protected abstract void onPauseForBackup();
|
2022-08-15 23:07:17 +02:00
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
protected abstract void onResumeAfterBackup();
|
2022-08-15 23:07:17 +02:00
|
|
|
|
|
|
|
public final void setStopped() {
|
|
|
|
state.set(State.STOPPED.ordinal());
|
|
|
|
}
|
|
|
|
}
|