Search in sources :

Example 1 with Extent

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;
}
Also used : SerializedFileFactory(suite.file.impl.SerializedFileFactory) PageFile(suite.file.PageFile) Read(suite.streamlet.Read) DataInput_(suite.util.DataInput_) DataOutput_(suite.util.DataOutput_) HashMap(java.util.HashMap) HashSet(java.util.HashSet) ExtentFile(suite.file.ExtentFile) Rethrow(suite.util.Rethrow) Map(java.util.Map) IdentityKey(suite.adt.IdentityKey) SerializedPageFile(suite.file.SerializedPageFile) FileFactory(suite.file.impl.FileFactory) Serializer(suite.util.Serialize.Serializer) Slot(suite.immutable.LazyIbTree.Slot) Set(java.util.Set) Bytes(suite.primitive.Bytes) IOException(java.io.IOException) HashBiMap(suite.adt.map.HashBiMap) To(suite.util.To) Serialize(suite.util.Serialize) Pair(suite.adt.pair.Pair) Friends.max(suite.util.Friends.max) List(java.util.List) BiMap(suite.adt.map.BiMap) Extent(suite.file.ExtentAllocator.Extent) Sink(suite.util.FunUtil.Sink) As(suite.streamlet.As) Comparator(java.util.Comparator) Extent(suite.file.ExtentAllocator.Extent) List(java.util.List) Pair(suite.adt.pair.Pair)

Example 2 with 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;
    }
}
Also used : SerializedFileFactory(suite.file.impl.SerializedFileFactory) PageFile(suite.file.PageFile) Read(suite.streamlet.Read) DataInput_(suite.util.DataInput_) DataOutput_(suite.util.DataOutput_) HashMap(java.util.HashMap) HashSet(java.util.HashSet) ExtentFile(suite.file.ExtentFile) Rethrow(suite.util.Rethrow) Map(java.util.Map) IdentityKey(suite.adt.IdentityKey) SerializedPageFile(suite.file.SerializedPageFile) FileFactory(suite.file.impl.FileFactory) Serializer(suite.util.Serialize.Serializer) Slot(suite.immutable.LazyIbTree.Slot) Set(java.util.Set) Bytes(suite.primitive.Bytes) IOException(java.io.IOException) HashBiMap(suite.adt.map.HashBiMap) To(suite.util.To) Serialize(suite.util.Serialize) Pair(suite.adt.pair.Pair) Friends.max(suite.util.Friends.max) List(java.util.List) BiMap(suite.adt.map.BiMap) Extent(suite.file.ExtentAllocator.Extent) Sink(suite.util.FunUtil.Sink) As(suite.streamlet.As) Comparator(java.util.Comparator) Extent(suite.file.ExtentAllocator.Extent) HashMap(java.util.HashMap) List(java.util.List) HashSet(java.util.HashSet) Pair(suite.adt.pair.Pair)

Example 3 with Extent

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;
        }
    };
}
Also used : Serialize(suite.util.Serialize) Extent(suite.file.ExtentAllocator.Extent) DataOutput_(suite.util.DataOutput_) ArrayList(java.util.ArrayList) IOException(java.io.IOException) ExtentFile(suite.file.ExtentFile) Bytes(suite.primitive.Bytes) DataInput_(suite.util.DataInput_) BytesBuilder(suite.primitive.Bytes.BytesBuilder)

Example 4 with Extent

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;
}
Also used : Bytes(suite.primitive.Bytes) Extent(suite.file.ExtentAllocator.Extent)

Aggregations

Extent (suite.file.ExtentAllocator.Extent)4 Bytes (suite.primitive.Bytes)4 IOException (java.io.IOException)3 ExtentFile (suite.file.ExtentFile)3 DataInput_ (suite.util.DataInput_)3 DataOutput_ (suite.util.DataOutput_)3 Serialize (suite.util.Serialize)3 Comparator (java.util.Comparator)2 HashMap (java.util.HashMap)2 HashSet (java.util.HashSet)2 List (java.util.List)2 Map (java.util.Map)2 Set (java.util.Set)2 IdentityKey (suite.adt.IdentityKey)2 BiMap (suite.adt.map.BiMap)2 HashBiMap (suite.adt.map.HashBiMap)2 Pair (suite.adt.pair.Pair)2 PageFile (suite.file.PageFile)2 SerializedPageFile (suite.file.SerializedPageFile)2 FileFactory (suite.file.impl.FileFactory)2