X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=schema.sql;h=2cca99a34d367888c0c36c41d5715dcd5114ad8b;hb=a855c59ca566ee7a55fc3dda56ab70943a85ef32;hp=8518c4fa7fc2922ae9575b4a50c19a77d3620be6;hpb=da87780779a2f165503d019ee0b59d10e5d31ec8;p=cumulus.git diff --git a/schema.sql b/schema.sql index 8518c4f..2cca99a 100644 --- a/schema.sql +++ b/schema.sql @@ -3,19 +3,57 @@ -- -- The index is stored in an SQLite3 database. This is its schema. +-- 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, + path text, + checksum text +); + -- 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 index block_name_index on block_index(segment, object); +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, - snapshot text + 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 join segments using (segmentid) 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;