X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=schema.sql;h=5017d9bf530461c01a040fe56973674ba3835605;hb=248b2455853ed082bf3b032fea4cb6b557a145ae;hp=096069b5662dc051b4b1c2e3ce69ab365382bda5;hpb=534e35d886de4eb7b6022c0ecb4a804475c820ea;p=cumulus.git diff --git a/schema.sql b/schema.sql index 096069b..5017d9b 100644 --- a/schema.sql +++ b/schema.sql @@ -3,20 +3,54 @@ -- -- 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, + 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, - timestamp real + 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 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 as benefit from + (select segmentid, + cast(used as real) / size as u, julianday('now') - mtime as age + from segment_info) +where benefit > 0;