package com.jivesoftware.os.amza.service.storage.delta;
import com.google.common.collect.Maps;
import com.google.common.io.Files;
import com.jivesoftware.os.amza.api.AmzaInterner;
import com.jivesoftware.os.amza.api.partition.PartitionName;
import com.jivesoftware.os.amza.api.partition.VersionedPartitionName;
import com.jivesoftware.os.amza.api.stream.RowType;
import com.jivesoftware.os.amza.api.wal.PrimaryRowMarshaller;
import com.jivesoftware.os.amza.api.wal.WALKey;
import com.jivesoftware.os.amza.api.wal.WALValue;
import com.jivesoftware.os.amza.api.IoStats;
import com.jivesoftware.os.amza.service.storage.HighwaterRowMarshaller;
import com.jivesoftware.os.amza.service.storage.binary.BinaryHighwaterRowMarshaller;
import com.jivesoftware.os.amza.service.storage.binary.BinaryPrimaryRowMarshaller;
import com.jivesoftware.os.amza.service.storage.binary.BinaryRowIOProvider;
import com.jivesoftware.os.jive.utils.ordered.id.ConstantWriterIdProvider;
import com.jivesoftware.os.jive.utils.ordered.id.OrderIdProviderImpl;
import java.io.File;
import java.util.Map;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* @author jonathan.colt
*/
public class DeltaWALNGTest {
@Test
public void testLoad() throws Exception {
AmzaInterner amzaInterner = new AmzaInterner();
VersionedPartitionName versionedPartitionName = new VersionedPartitionName(new PartitionName(true, "test".getBytes(), "test".getBytes()),
VersionedPartitionName.STATIC_VERSION);
File tmp = Files.createTempDir();
final PrimaryRowMarshaller primaryRowMarshaller = new BinaryPrimaryRowMarshaller();
final HighwaterRowMarshaller<byte[]> highwaterRowMarshaller = new BinaryHighwaterRowMarshaller(amzaInterner);
String[] workingDirs = new String[] { tmp.getAbsolutePath() };
IoStats ioStats = new IoStats();
BinaryRowIOProvider binaryRowIOProvider = new BinaryRowIOProvider(4_096, 64, false);
OrderIdProviderImpl ids = new OrderIdProviderImpl(new ConstantWriterIdProvider(1));
DeltaWALFactory deltaWALFactory = new DeltaWALFactory(ids, tmp, binaryRowIOProvider, primaryRowMarshaller, highwaterRowMarshaller, 1);
DeltaWAL deltaWAL = deltaWALFactory.create(ioStats, -1);
Map<WALKey, WALValue> apply1 = Maps.newLinkedHashMap();
for (int i = 0; i < 10; i++) {
byte[] bytes = (i + "k").getBytes();
long timestampAndVersion = ids.nextId();
apply1.put(new WALKey(bytes, bytes), new WALValue(RowType.primary, (i + "v").getBytes(), timestampAndVersion, false, timestampAndVersion));
}
DeltaWAL.DeltaWALApplied update1 = deltaWAL.update(ioStats, RowType.primary, versionedPartitionName, apply1, null);
for (DeltaWAL.KeyValueHighwater kvh : update1.keyValueHighwaters) {
System.out.println("update1 k=" + new String(kvh.key) + " v=" + new WALValue(kvh.rowType, kvh.value, kvh.valueTimestamp, kvh.valueTombstone,
kvh.valueVersion));
}
Map<WALKey, WALValue> apply2 = Maps.newLinkedHashMap();
for (int i = 0; i < 10; i++) {
byte[] bytes = (i + "k").getBytes();
long timestampAndVersion = ids.nextId();
apply2.put(new WALKey(bytes, bytes), new WALValue(RowType.primary, (i + "v").getBytes(), timestampAndVersion, false, timestampAndVersion));
}
DeltaWAL.DeltaWALApplied update2 = deltaWAL.update(ioStats, RowType.primary, versionedPartitionName, apply2, null);
for (DeltaWAL.KeyValueHighwater kvh : update2.keyValueHighwaters) {
System.out.println("update2 k=" + new String(kvh.key) + " v=" + new WALValue(kvh.rowType, kvh.value, kvh.valueTimestamp, kvh.valueTombstone,
kvh.valueVersion));
}
deltaWAL.load(ioStats, (long rowFP, long rowTxId, RowType rowType, byte[] rawRow) -> {
if (rowType == RowType.primary) {
primaryRowMarshaller.fromRows(fpRowStream -> fpRowStream.stream(rowFP, rowType, rawRow),
(fp, rowType2, prefix, key, value, valueTimestamp, valueTombstoned, valueVersion) -> {
System.out.println("rfp=" + rowFP + " rid" + rowTxId + " rt=" + rowType2
+ " key=" + new String(key) + " value=" + new String(value)
+ " ts=" + valueTimestamp + " tombstone=" + valueTombstoned);
return true;
});
}
return true;
});
for (int i = 0; i < update1.fps.length; i++) {
DeltaWAL.KeyValueHighwater kvh = update1.keyValueHighwaters[i];
System.out.println(update1.fps[i] + " hydrate k=" + new String(kvh.key)
+ " v=" + new WALValue(kvh.rowType, kvh.value, kvh.valueTimestamp, kvh.valueTombstone, kvh.valueVersion));
long fp1 = update1.fps[i];
deltaWAL.hydrate(new IoStats(), fpStream -> fpStream.stream(fp1),
(fp, rowType, prefix, key, value, valueTimestamp, valueTombstone, valueVersion) -> {
System.out.println(fp + " hydrated:" + new WALValue(rowType, value, valueTimestamp, valueTombstone, valueVersion));
Assert.assertEquals(
new WALValue(rowType, value, valueTimestamp, valueTombstone, valueVersion),
apply1.get(new WALKey(kvh.prefix, kvh.key)));
return true;
});
}
for (int i = 0; i < update2.fps.length; i++) {
DeltaWAL.KeyValueHighwater kvh = update2.keyValueHighwaters[i];
System.out.println(update2.fps[i] + " hydrate k=" + new String(kvh.key)
+ " v=" + new WALValue(kvh.rowType, kvh.value, kvh.valueTimestamp, kvh.valueTombstone, kvh.valueVersion));
long fp2 = update2.fps[i];
deltaWAL.hydrate(new IoStats(), fpStream -> fpStream.stream(fp2),
(fp, rowType, prefix, key, value, valueTimestamp, valueTombstone, valueVersion) -> {
System.out.println(fp + " hydrated:" + new WALValue(rowType, value, valueTimestamp, valueTombstone, valueVersion));
Assert.assertEquals(
new WALValue(rowType, value, valueTimestamp, valueTombstone, valueVersion),
apply2.get(new WALKey(kvh.prefix, kvh.key)));
return true;
});
}
}
}