use of suite.file.ExtentAllocator.Extent in project suite by stupidsing.
the class LazyIbTreeExtentFilePersister method save_.
private Extent save_(List<Slot<T>> slots) {
IdentityKey<List<Slot<T>>> key = IdentityKey.of(slots);
Extent extent = slotsByExtent.inverse().get(key);
if (extent == null) {
List<Pair<T, Extent>> pairs = //
Read.from(//
slots).map(//
slot -> Pair.of(slot.pivot, save_(slot.readSlots()))).toList();
slotsByExtent.put(extent = saveSlot(nPages, new PersistSlot<>(pairs)), key);
nPages = extent.end;
}
return extent;
}
use of suite.file.ExtentAllocator.Extent in project suite by stupidsing.
the class LazyIbTreeExtentFilePersister method gc.
@Override
public Map<Extent, Extent> gc(List<Extent> roots, int back) {
synchronized (writeLock) {
int end = nPages;
int start = max(0, end - back);
Set<Extent> isInUse = new HashSet<>();
Sink<List<Extent>> use = extents_ -> {
for (Extent extent : extents_) if (start <= extent.start)
isInUse.add(extent);
};
use.sink(roots);
List<Extent> extents = extentFile.scan(start, end);
for (Extent extent : Read.from(extents).reverse()) if (isInUse.contains(extent))
use.sink(Read.from(loadSlot(extent).pairs).map(Pair::second).toList());
Map<Extent, Extent> map = new HashMap<>();
if (!extents.isEmpty()) {
int pointer = extents.get(0).start;
for (Extent extent0 : extents) if (isInUse.contains(extent0)) {
PersistSlot<T> ps0 = loadSlot(extent0);
List<Pair<T, Extent>> pairs0 = ps0.pairs;
List<Pair<T, Extent>> pairsx = Read.from(pairs0).map(Pair.map1(p -> map.getOrDefault(p, p))).toList();
PersistSlot<T> psx = new PersistSlot<>(pairsx);
Extent extentx = saveSlot(pointer, psx);
pointer = extentx.end;
map.put(extent0, extentx);
}
nPages = pointer;
slotsByExtent.clear();
}
return map;
}
}
use of suite.file.ExtentAllocator.Extent in project suite by stupidsing.
the class FileFactory method extentFile.
public static ExtentFile extentFile(PageFile pf) {
Serialize serialize = Serialize.me;
Serializer<Extent> extentSerializer = serialize.extent();
Serializer<Bytes> bytesSerializer = serialize.variableLengthBytes;
SerializedPageFile<Block> pageFile = SerializedFileFactory.serialized(pf, new Serializer<>() {
public Block read(DataInput_ dataInput) throws IOException {
Extent extent = extentSerializer.read(dataInput);
Bytes bytes = bytesSerializer.read(dataInput);
return new Block(extent, bytes);
}
public void write(DataOutput_ dataOutput, Block block) throws IOException {
extentSerializer.write(dataOutput, block.extent);
bytesSerializer.write(dataOutput, block.bytes);
}
});
return new ExtentFile() {
public void close() throws IOException {
pageFile.close();
}
public void sync() {
pageFile.sync();
}
public Bytes load(Extent extent) {
BytesBuilder bb = new BytesBuilder();
for (int pointer = extent.start; pointer < extent.end; pointer++) {
Block block = pageFile.load(pointer);
Util.assert_(Objects.equals(block.extent, extent));
bb.append(block.bytes);
}
return bb.toBytes();
}
public void save(Extent extent, Bytes bytes) {
for (int pointer = extent.start, p = 0; pointer < extent.end; pointer++) {
int p1 = p + blockSize;
pageFile.save(pointer, new Block(extent, bytes.range(p, p1)));
p = p1;
}
}
public List<Extent> scan(int start, int end) {
List<Extent> extents = new ArrayList<>();
int pointer = start;
while (pointer < end) {
Extent extent = pageFile.load(pointer).extent;
if (start <= extent.start && extent.end <= end)
extents.add(extent);
pointer = extent.end;
}
return extents;
}
};
}
use of suite.file.ExtentAllocator.Extent in project suite by stupidsing.
the class LazyIbTreeExtentFilePersister method saveSlot.
private Extent saveSlot(int start, PersistSlot<T> value) {
int bs = ExtentFile.blockSize;
Bytes bytes = To.bytes(dataOutput -> serializer.write(dataOutput, value));
Extent extent = new Extent(start, start + (bytes.size() + bs - 1) / bs);
extentFile.save(extent, bytes);
return extent;
}
Aggregations