Extend tracking of used segments to cover metadata segments.
[cumulus.git] / contrib / upgrade0.6-localdb.sql
1 -- SQL script for upgrading the local database to the format expected for LBS
2 -- version 0.6.
3 --
4 -- This script should be loaded after connecting to the database to be
5 -- upgraded.
6
7 -- Database schema changes: the size and mtime columns were added to the
8 -- segments table, and the segments_used table was added.  Rather than upgrade
9 -- the segments table in-place, we create a new table and then rename it over
10 -- the old segments table.  The intent column was also added to the snapshots
11 -- table.
12 create table segments_new (
13     segmentid integer primary key,
14     segment text unique not null,
15     path text,
16     checksum text,
17     mtime real,
18     size integer
19 );
20
21 create table segments_used (
22     snapshotid integer not null,
23     segmentid integer not null,
24     utilization real
25 );
26 create unique index segments_used_index
27     on segments_used(snapshotid, segmentid);
28
29 alter table snapshots add column intent real;
30
31 -- Initialize the intent column; set all old snapshots to have intent 1
32 -- (intended to be a daily snapshot).
33 update snapshots set intent = 1;
34
35 -- Compute the size of each of the segments, if possible, based on our
36 -- knowledge of the objects stored in them.
37 insert into segments_new
38 select segmentid, segment, path, checksum, mtime, size
39 from
40     (select segmentid, segment, path, checksum from segments)
41 left join
42     (select segmentid, sum(size) as size, max(timestamp) as mtime
43      from block_index group by segmentid)
44 using (segmentid);
45
46 drop table segments;
47 alter table segments_new rename to segments;
48
49 -- Populate the segments_used table based upon data contained in
50 -- snapshot_contents--this is roughly the same calculation that is actually
51 -- done, only now this calculation is done when a snapshot is created.
52 insert into segments_used
53 select snapshotid, segmentid, cast(used as real) / size as utilization
54 from
55     (select snapshotid, segmentid, sum(size) as used
56      from snapshot_contents join block_index using (blockid)
57      group by snapshotid, segmentid)
58 join
59     (select segmentid, size from segments)
60 using (segmentid);
61
62 -- The snapshot_contents table is obsolete.
63 drop table snapshot_contents;
64
65 -- Upgrade database views.
66 drop view cleaning_order;
67 drop view segment_info;
68
69 create view segment_info as
70 select segmentid, mtime, size, cast(size * utilization as integer) as used,
71        utilization
72 from segments join
73      (select segmentid, max(utilization) as utilization
74       from segments_used group by segmentid)
75 using (segmentid);