X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=schema.sql;h=6d89b4b2cd7fd55f5ae551116bbedbb823548d7e;hb=def20364a3596d7b1fa4a07f3d3ee056cfff2d1e;hp=114670c76da37d0ffc04ebdb7026e50340d2fdf4;hpb=ed5a047c1b8a8f5c43b0192e8e774b91497c9706;p=cumulus.git diff --git a/schema.sql b/schema.sql index 114670c..6d89b4b 100644 --- a/schema.sql +++ b/schema.sql @@ -3,12 +3,55 @@ -- -- The index is stored in an SQLite3 database. This is its schema. --- Index of all blocks which have been stored in one snapshot, by checksum. +-- List of snapshots which have been created. +create table snapshots ( + snapshotid integer primary key, + name text not null, + scheme text, + timestamp real +); + +-- List of segments which have been created. +create table segments ( + segmentid integer primary key, + segment text unique not null +); + +-- Index of all blocks which have been stored in a snapshot, by checksum. create table block_index ( blockid integer primary key, - segment text, - object text, + segmentid integer not null, + object text not null, checksum text, - size integer + size integer, + timestamp real, + expired integer ); create index block_content_index on block_index(checksum); +create unique index block_name_index on block_index(segmentid, object); + +-- Index tracking which blocks are used by which snapshots. +create table snapshot_contents ( + blockid integer, + snapshotid integer +); +create unique index snapshot_contents_unique + on snapshot_contents(blockid, snapshotid); + +-- Summary statistics for each segment. +create view segment_info as select * from + (select segmentid, max(timestamp) as mtime, + sum(size) as size, count(*) as objects + from block_index natural join segments group by segmentid) +natural join + (select segmentid, sum(size) as used, count(*) as objects_used + from block_index where blockid in + (select blockid from snapshot_contents) group by segmentid); + +-- Ranking of segments to be cleaned, using a benefit function of +-- (fraction free space)*(age of youngest object). +create view cleaning_order as select *, (1-u)*age/(u+0.1) as benefit from + (select segmentid, + cast(used as real) / size as u, julianday('now') - mtime as age + from segment_info) +where benefit > 0;