add new osmdehd map style
[osmrrze.git] / scripts / deletecheaptiles.pl
CommitLineData
385ef3cf
MM
1#!/usr/bin/perl -w
2
3# This script is used to delete tiles that are extremely cheap to rerender.
4# If a tile can be regenerated in one second, we really don't need to keep it
5# on disk and regularily update it. This can happen on the fly when it is
6# requested instead.
7
8# Where are the tile directories?
9$tiledirprefix = '/mnt/tiles/tiles/';
10# Map for map-ID in DB to tile subdir.
11%tiledirmap = ( 1 => 'osm',
12 2 => 'osmde',
9705b3ad
MM
13 4 => 'osmhd',
14 5 => 'osmdehd'
385ef3cf
MM
15 );
16# What is the maximum rendertime to consider a tile useless?
17$maxuselesstime = 0.5;
18
19# How old do files need to be before we delete them? in seconds
20$minuselessage = 48 * 60 * 60;
21
22# Where is the osm stats database?
23$statsdb = 'osmstats';
24
25# -----------------------------------------------------------------------------
26
27use DBI;
28use POSIX qw(strftime mktime);
29use Fcntl ':mode';
30
31# Par. 0: x
32# Par. 1: y
33sub calcpathfromcomponents($$) {
34 my @res = ();
35 my $i; my $x = $_[0]; my $y = $_[1];
36 for ($i = 4; $i >= 0; $i--) {
37 $res[$i] = sprintf("%d", (($x & 0x0f) << 4) + ($y & 0x0f));
38 $x = $x >> 4;
39 $y = $y >> 4;
40 }
41 return $res[0] . "/" . $res[1] . "/" . $res[2] . "/" . $res[3] . "/" . $res[4];
42}
43
44unless ($dbh = DBI->connect("dbi:Pg:dbname=$statsdb","","")) {
45 print(STDERR "Failed to open database. Please try again later.\n"); exit(1);
46}
47# select x, y, z, avg(rendertime) as avgrt, max(rendertime) as maxrt from renderrequests where mapid=1 group by x, y, z
48# select distinct on (x, y, z) x, y, z, rendertime from renderrequests where mapid=1 order by x,y,z,ts desc;
49foreach $mapid (sort(keys(%tiledirmap))) {
50 my $ndeleted = 0;
51 my $sth = $dbh->prepare("select distinct on (x, y, z) x, y, z, rendertime"
52 . " from renderrequests where mapid=? order by x, y, z, ts desc");
53 unless ($sth->execute($mapid)) {
54 print(STDERR "Sorry, database query blew up.!\n");
55 exit(1);
56 }
57 while (($x, $y, $z, $rendertime) = $sth->fetchrow_array()) {
58 if ($z < 5) { next; }
59 if ($rendertime > $maxuselesstime) {
60 #print("$tiledirmap{$mapid} $z/$x/$y rendered in $rendertime seconds, leaving it alone\n");
61 next;
62 }
63 my $tilepath = $tiledirprefix . $tiledirmap{$mapid} . '/';
64 $tilepath .= $z . '/' . calcpathfromcomponents($x, $y) . '.meta';
65 unless (-e $tilepath) {
66 #print("...file does not exist, nothing to delete.\n");
67 next;
68 }
69 @statres = lstat($tilepath);
70 unless (@statres > 12) {
71 # This usually happens if we have a symlink to a file for which we have
72 # no permission to read.
73 #print("...stat failed\n");
74 next;
75 }
76 if (S_ISLNK($statres[2])) { next; } # A symlink? We no like.
77 if (($statres[9] + $minuselessage) >= time()) {
78 #print("...not old enough, skipped\n");
79 next;
80 }
81 print("$tiledirmap{$mapid} $z/$x/$y rendered in $rendertime seconds, deleting $tilepath\n");
82 unlink($tilepath);
83 $ndeleted++;
84 }
85 $sth->finish();
86 print("Deleted $ndeleted tiles in $tiledirmap{$mapid}\n");
87}
This page took 0.258653 seconds and 4 git commands to generate.