/*
* 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.activemq.artemis.core.journal.impl;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.core.io.DummyCallback;
import org.apache.activemq.artemis.core.journal.EncodingSupport;
import org.apache.activemq.artemis.core.journal.IOCompletion;
import org.apache.activemq.artemis.core.journal.Journal;
import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.journal.impl.dataformat.ByteArrayEncoding;
abstract class JournalBase implements Journal {
protected final int fileSize;
private final boolean supportsCallback;
JournalBase(boolean supportsCallback, int fileSize) {
if (fileSize < JournalImpl.MIN_FILE_SIZE) {
throw new IllegalArgumentException("File size cannot be less than " + JournalImpl.MIN_FILE_SIZE + " bytes");
}
this.supportsCallback = supportsCallback;
this.fileSize = fileSize;
}
@Override
public void appendAddRecord(long id, byte recordType, byte[] record, boolean sync) throws Exception {
appendAddRecord(id, recordType, new ByteArrayEncoding(record), sync);
}
@Override
public void appendAddRecord(long id, byte recordType, Persister persister, Object record, boolean sync) throws Exception {
SyncIOCompletion callback = getSyncCallback(sync);
appendAddRecord(id, recordType, persister, record, sync, callback);
if (callback != null) {
callback.waitCompletion();
}
}
@Override
public void appendCommitRecord(final long txID, final boolean sync) throws Exception {
SyncIOCompletion syncCompletion = getSyncCallback(sync);
appendCommitRecord(txID, sync, syncCompletion, true);
if (syncCompletion != null) {
syncCompletion.waitCompletion();
}
}
@Override
public void appendCommitRecord(final long txID, final boolean sync, final IOCompletion callback) throws Exception {
appendCommitRecord(txID, sync, callback, true);
}
@Override
public void appendUpdateRecord(final long id,
final byte recordType,
final byte[] record,
final boolean sync) throws Exception {
appendUpdateRecord(id, recordType, new ByteArrayEncoding(record), sync);
}
@Override
public void appendUpdateRecordTransactional(final long txID,
final long id,
final byte recordType,
final byte[] record) throws Exception {
appendUpdateRecordTransactional(txID, id, recordType, new ByteArrayEncoding(record));
}
@Override
public void appendAddRecordTransactional(final long txID,
final long id,
final byte recordType,
final byte[] record) throws Exception {
appendAddRecordTransactional(txID, id, recordType, new ByteArrayEncoding(record));
}
@Override
public void appendDeleteRecordTransactional(final long txID, final long id) throws Exception {
appendDeleteRecordTransactional(txID, id, NullEncoding.instance);
}
@Override
public void appendPrepareRecord(final long txID, final byte[] transactionData, final boolean sync) throws Exception {
appendPrepareRecord(txID, new ByteArrayEncoding(transactionData), sync);
}
@Override
public void appendPrepareRecord(final long txID,
final EncodingSupport transactionData,
final boolean sync) throws Exception {
SyncIOCompletion syncCompletion = getSyncCallback(sync);
appendPrepareRecord(txID, transactionData, sync, syncCompletion);
if (syncCompletion != null) {
syncCompletion.waitCompletion();
}
}
@Override
public void appendDeleteRecordTransactional(final long txID, final long id, final byte[] record) throws Exception {
appendDeleteRecordTransactional(txID, id, new ByteArrayEncoding(record));
}
@Override
public void appendUpdateRecord(final long id,
final byte recordType,
final Persister persister,
final Object record,
final boolean sync) throws Exception {
SyncIOCompletion callback = getSyncCallback(sync);
appendUpdateRecord(id, recordType, persister, record, sync, callback);
if (callback != null) {
callback.waitCompletion();
}
}
@Override
public void appendRollbackRecord(final long txID, final boolean sync) throws Exception {
SyncIOCompletion syncCompletion = getSyncCallback(sync);
appendRollbackRecord(txID, sync, syncCompletion);
if (syncCompletion != null) {
syncCompletion.waitCompletion();
}
}
@Override
public void appendDeleteRecord(final long id, final boolean sync) throws Exception {
SyncIOCompletion callback = getSyncCallback(sync);
appendDeleteRecord(id, sync, callback);
if (callback != null) {
callback.waitCompletion();
}
}
abstract void scheduleReclaim();
protected SyncIOCompletion getSyncCallback(final boolean sync) {
if (sync) {
return new SimpleWaitIOCallback();
}
return DummyCallback.getInstance();
}
private static final class NullEncoding implements EncodingSupport {
private static NullEncoding instance = new NullEncoding();
@Override
public void decode(final ActiveMQBuffer buffer) {
// no-op
}
@Override
public void encode(final ActiveMQBuffer buffer) {
// no-op
}
@Override
public int getEncodeSize() {
return 0;
}
}
@Override
public int getFileSize() {
return fileSize;
}
}