-- Database schema changes: the size and mtime columns were added to the
-- segments table, and the segments_used table was added. Rather than upgrade
-- the segments table in-place, we create a new table and then rename it over
--- the old segments table.
+-- the old segments table. The intent column was also added to the snapshots
+-- table.
create table segments_new (
segmentid integer primary key,
segment text unique not null,
utilization real
);
+alter table snapshots add column intent real;
+
+-- Initialize the intent column; set all old snapshots to have intent 1
+-- (intended to be a daily snapshot).
+update snapshots set intent = 1;
+
-- Compute the size of each of the segments, if possible, based on our
-- knowledge of the objects stored in them.
insert into segments_new
}
void LocalDb::Open(const char *path, const char *snapshot_name,
- const char *snapshot_scheme)
+ const char *snapshot_scheme, double intent)
{
int rc;
/* Insert this snapshot into the database, and determine the integer key
* which will be used to identify it. */
sqlite3_stmt *stmt = Prepare("insert into "
- "snapshots(name, scheme, timestamp) "
- "values (?, ?, julianday('now'))");
+ "snapshots(name, scheme, timestamp, intent) "
+ "values (?, ?, julianday('now'), ?)");
sqlite3_bind_text(stmt, 1, snapshot_name, strlen(snapshot_name),
SQLITE_TRANSIENT);
if (snapshot_scheme == NULL)
else
sqlite3_bind_text(stmt, 2, snapshot_scheme, strlen(snapshot_scheme),
SQLITE_TRANSIENT);
+ sqlite3_bind_double(stmt, 3, intent);
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE) {
class LocalDb {
public:
void Open(const char *path, const char *snapshot_name,
- const char *snapshot_scheme);
+ const char *snapshot_scheme, double intent);
void Close();
void StoreObject(const ObjectReference& ref,
const std::string &checksum, int64_t size, double age);
/* Keep track of all segments which are needed to reconstruct the snapshot. */
std::set<string> segment_list;
+/* Snapshot intent: 1=daily, 7=weekly, etc. This is not used directly, but is
+ * stored in the local database and can help guide segment cleaning and
+ * snapshot expiration policies. */
+double snapshot_intent = 1.0;
+
/* Selection of files to include/exclude in the snapshot. */
std::list<string> includes; // Paths in which files should be saved
std::list<string> excludes; // Paths which will not be saved
" (defaults to \".bz2\")\n"
" --signature-filter=COMMAND\n"
" program though which to filter descriptor\n"
- " --scheme=NAME optional name for this snapshot\n",
+ " --scheme=NAME optional name for this snapshot\n"
+ " --intent=FLOAT intended backup type: 1=daily, 7=weekly, ...\n"
+ " (defaults to \"1\")\n",
lbs_version, program
);
}
{"dest", 1, 0, 0}, // 4
{"scheme", 1, 0, 0}, // 5
{"signature-filter", 1, 0, 0}, // 6
+ {"intent", 1, 0, 0}, // 7
{NULL, 0, 0, 0},
};
case 6: // --signature-filter
signature_filter = optarg;
break;
+ case 7: // --intent
+ snapshot_intent = atof(optarg);
+ if (snapshot_intent <= 0)
+ snapshot_intent = 1;
+ break;
default:
fprintf(stderr, "Unhandled long option!\n");
return 1;
string database_path = localdb_dir + "/localdb.sqlite";
db = new LocalDb;
db->Open(database_path.c_str(), desc_buf,
- backup_scheme.size() ? backup_scheme.c_str() : NULL);
+ backup_scheme.size() ? backup_scheme.c_str() : NULL,
+ snapshot_intent);
tss = new TarSegmentStore(backup_dest, db);
snapshotid integer primary key,
name text not null,
scheme text,
- timestamp real
+ timestamp real,
+ intent real
);
-- List of segments which have been created.