Class StreamStore

java.lang.Object
org.h2.mvstore.StreamStore

public class StreamStore extends Object
A facility to store streams in a map. Streams are split into blocks, which are stored in a map. Very small streams are inlined in the stream id.

The key of the map is a long (incremented for each stored block). The default initial value is 0. Before storing blocks into the map, the stream store checks if there is already a block with the next key, and if necessary searches the next free entry using a binary search (0 to Long.MAX_VALUE).

Before storing

The format of the binary id is: An empty id represents 0 bytes of data. In-place data is encoded as 0, the size (a variable size int), then the data. A stored block is encoded as 1, the length of the block (a variable size int), then the key (a variable size long). Multiple ids can be concatenated to concatenate the data. If the id is large, it is stored itself, which is encoded as 2, the total length (a variable size long), and the key of the block that contains the id (a variable size long).

  • Field Details

    • map

      private final Map<Long,byte[]> map
    • minBlockSize

      private int minBlockSize
    • maxBlockSize

      private int maxBlockSize
    • nextKey

      private final AtomicLong nextKey
    • nextBuffer

      private final AtomicReference<byte[]> nextBuffer
  • Constructor Details

    • StreamStore

      public StreamStore(Map<Long,byte[]> map)
      Create a stream store instance.
      Parameters:
      map - the map to store blocks of data
  • Method Details

    • getMap

      public Map<Long,byte[]> getMap()
    • setNextKey

      public void setNextKey(long nextKey)
    • getNextKey

      public long getNextKey()
    • setMinBlockSize

      public void setMinBlockSize(int minBlockSize)
      Set the minimum block size. The default is 256 bytes.
      Parameters:
      minBlockSize - the new value
    • getMinBlockSize

      public int getMinBlockSize()
    • setMaxBlockSize

      public void setMaxBlockSize(int maxBlockSize)
      Set the maximum block size. The default is 256 KB.
      Parameters:
      maxBlockSize - the new value
    • getMaxBlockSize

      public long getMaxBlockSize()
    • put

      public byte[] put(InputStream in) throws IOException
      Store the stream, and return the id. The stream is not closed.
      Parameters:
      in - the stream
      Returns:
      the id (potentially an empty array)
      Throws:
      IOException - If an I/O error occurs
    • put

      private boolean put(ByteArrayOutputStream id, InputStream in, int level) throws IOException
      Throws:
      IOException
    • read

      private static byte[] read(InputStream in, byte[] target) throws IOException
      Throws:
      IOException
    • putIndirectId

      private ByteArrayOutputStream putIndirectId(ByteArrayOutputStream id) throws IOException
      Throws:
      IOException
    • writeBlock

      private long writeBlock(byte[] data)
    • onStore

      protected void onStore(int len)
      This method is called after a block of data is stored. Override this method to persist data if necessary.
      Parameters:
      len - the length of the stored block.
    • getAndIncrementNextKey

      private long getAndIncrementNextKey()
      Generate a new key.
      Returns:
      the new key
    • getMaxBlockKey

      public long getMaxBlockKey(byte[] id)
      Get the key of the biggest block, of -1 for inline data. This method is used to garbage collect orphaned blocks.
      Parameters:
      id - the id
      Returns:
      the key, or -1
    • remove

      public void remove(byte[] id)
      Remove all stored blocks for the given id.
      Parameters:
      id - the id
    • toString

      public static String toString(byte[] id)
      Convert the id to a human readable string.
      Parameters:
      id - the stream id
      Returns:
      the string
    • length

      public long length(byte[] id)
      Calculate the number of data bytes for the given id. As the length is encoded in the id, this operation does not cause any reads in the map.
      Parameters:
      id - the id
      Returns:
      the length
    • isInPlace

      public boolean isInPlace(byte[] id)
      Check whether the id itself contains all the data. This operation does not cause any reads in the map.
      Parameters:
      id - the id
      Returns:
      if the id contains the data
    • get

      public InputStream get(byte[] id)
      Open an input stream to read data.
      Parameters:
      id - the id
      Returns:
      the stream
    • getBlock

      byte[] getBlock(long key)
      Get the block.
      Parameters:
      key - the key
      Returns:
      the block