[ 
https://issues.apache.org/jira/browse/IGNITE-26279?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Aleksandr Polovtsev reassigned IGNITE-26279:
--------------------------------------------

    Assignee: Aleksandr Polovtsev

> Implement segment index files and a checkpointer thread
> -------------------------------------------------------
>
>                 Key: IGNITE-26279
>                 URL: https://issues.apache.org/jira/browse/IGNITE-26279
>             Project: Ignite
>          Issue Type: Improvement
>            Reporter: Ivan Bessonov
>            Assignee: Aleksandr Polovtsev
>            Priority: Major
>              Labels: ignite-3
>
> Index file is a persistent analogue to 
> https://issues.apache.org/jira/browse/IGNITE-26272's mem-tables.
> h2. Files
> First of all, the general data format:
> {code:java}
> +--------+---------------------+-----+---------------------+
> | Header | Payload for group 1 | ... | Payload for group N |
> +--------+---------------------+-----+---------------------+ {code}
> Header should look like this:
> {noformat}
> +---------------------+-----------------------------------------+-----+
> |     Common meta     |            Raft group 1 meta            | ... |
> +---------------------+-----------------------------------------+-----+
> | Magic | Version | N | Group ID | Flags | Offset | Start | End | ... |
> +---------------------+-----------------------------------------+-----+{noformat}
>  * {{Magic number}} is for checking that this is the right file. 4 bytes.
>  * {{Version}} is for format extensibility. 4 bytes.
>  * {{N}} is a number of raft groups in this file. 4 bytes.
>  * {{GroupID}} is a raft group identifier. 8 bytes.
>  * {{Flags}} means additional information about the group, for example “this 
> is the last index for this group” flag. 4 bytes.
>  * {{Offset}} is an offset within this index file that points to "Payload for 
> group X" block. 4 bytes.
>  * {{Start}} and {{End}} here mean the range of raft indexes in this index 
> file. 8 bytes each.
> Payload should look like this:
> {code:java}
> +----------+-----+----------+
> | Offset 1 | ... | Offset M |
> +----------+-----+----------+ {code}
>  * {{Offset}} is an offset in a corresponding segment file that points to a 
> corresponding log entry.
>  * There are exactly {{End-Start}} offsets there.
> h2. Checkpointer
> We can chose other name if this one is confusing.
> The checkpointer thread has to be awaken when log storage switches to the 
> next segment. It does the following:
>  * Collect mem-tables from all stripes and make them immutable. New 
> mem-tables will be allocated automatically.
>  * {{sync}} the segment file.
>  * Write an index file that matches the mem-table.
>  * [Out of scope for now] Create an in-memory metadata structures for the 
> index.
>  * Remove the mem-table from memory.
>  * {{sync}} the index file.
>  * Rename {{.bin.tmp}} file to the {{{}.bin{}}}.
>  * Wait for a next {{{}mem-table{}}}.
> There might be a queue of unwritten mem-tables. We should limit its size. 
> Throttling is out of scope.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to