[core] Evict cached resources and tiles equally by access time (#7770)

This commit is contained in:
Eric Wolfe
2017-01-18 18:43:24 -08:00
committed by GitHub
parent feb4da4a24
commit a2ceeb4a5b

View File

@@ -792,6 +792,31 @@ bool OfflineDatabase::evict(uint64_t neededFreeSize) {
// The addition of pageSize is a fudge factor to account for non `data` column
// size, and because pages can get fragmented on the database.
while (usedSize() + neededFreeSize + pageSize > maximumCacheSize) {
// clang-format off
Statement accessedStmt = getStatement(
"SELECT max(accessed) "
"FROM ( "
" SELECT accessed "
" FROM resources "
" LEFT JOIN region_resources "
" ON resource_id = resources.id "
" WHERE resource_id IS NULL "
" UNION ALL "
" SELECT accessed "
" FROM tiles "
" LEFT JOIN region_tiles "
" ON tile_id = tiles.id "
" WHERE tile_id IS NULL "
" ORDER BY accessed ASC LIMIT ?1 "
") "
);
accessedStmt->bind(1, 50);
// clang-format on
if (!accessedStmt->run()) {
return false;
}
Timestamp accessed = accessedStmt->get<Timestamp>(0);
// clang-format off
Statement stmt1 = getStatement(
"DELETE FROM resources "
@@ -800,10 +825,10 @@ bool OfflineDatabase::evict(uint64_t neededFreeSize) {
" LEFT JOIN region_resources "
" ON resource_id = resources.id "
" WHERE resource_id IS NULL "
" ORDER BY accessed ASC LIMIT ?1 "
" AND accessed <= ?1 "
") ");
// clang-format on
stmt1->bind(1, 50);
stmt1->bind(1, accessed);
stmt1->run();
uint64_t changes1 = db->changes();
@@ -815,10 +840,10 @@ bool OfflineDatabase::evict(uint64_t neededFreeSize) {
" LEFT JOIN region_tiles "
" ON tile_id = tiles.id "
" WHERE tile_id IS NULL "
" ORDER BY accessed ASC LIMIT ?1 "
" AND accessed <= ?1 "
") ");
// clang-format on
stmt2->bind(1, 50);
stmt2->bind(1, accessed);
stmt2->run();
uint64_t changes2 = db->changes();