diff --git a/code/map_data.js b/code/map_data.js index c1d5c78f..9788a088 100644 --- a/code/map_data.js +++ b/code/map_data.js @@ -40,7 +40,7 @@ window.debugSetTileColour = function(qk,bordercol,fillcol) { window._requestCache = {} // cache entries older than the fresh age, and younger than the max age, are stale. they're used in the case of an error from the server -window.REQUEST_CACHE_FRESH_AGE = 60; // if younger than this, use data in the cache rather than fetching from the server +window.REQUEST_CACHE_FRESH_AGE = 90; // if younger than this, use data in the cache rather than fetching from the server window.REQUEST_CACHE_MAX_AGE = 60*60; // maximum cache age. entries are deleted from the cache after this time window.REQUEST_CACHE_MIN_SIZE = 200; // if fewer than this many entries, don't expire any window.REQUEST_CACHE_MAX_SIZE = 2000; // if more than this many entries, expire early @@ -63,6 +63,11 @@ window.getDataCache = function(qk) { return undefined; } +window.getCacheItemTime = function(qk) { + if (qk in window._requestCache) return window._requestCache[qk].time; + else return 0; +} + window.isDataCacheFresh = function(qk) { if (qk in window._requestCache) { var d = new Date(); @@ -187,15 +192,7 @@ window.requestData = function() { lngEast ); - // when the server is returning 'timeout' errors for some tiles in the list, it's always the tiles - // at the end of the request. therefore, let's push tiles we don't have cache entries for to the front, and those we do to the back - if (getDataCache(tile_id)) { - // cache entry exists - push to back - tiles[bucket].push(boundsParam); - } else { - // no cache entry - unshift to front - tiles[bucket].unshift(boundsParam); - } + tiles[bucket].push(boundsParam); debugSetTileColour(tile_id,'#00f','#000'); } @@ -209,6 +206,16 @@ window.requestData = function() { // send ajax requests console.log('requesting '+requestTileCount+' tiles in '+Object.keys(tiles).length+' requests'); $.each(tiles, function(ind, tls) { + // sort the tiles by the cache age - oldest/missing first. the server often times out requests and the first listed + // are more likely to succeed. this will ensure we're more likely to have fresh data + tls.sort(function(a,b) { + var timea = getCacheItemTime(a.qk); + var timeb = getCacheItemTime(b.qk); + if (timea < timeb) return -1; + if (timea > timeb) return 1; + return 0; + }); + data = { zoom: z }; data.boundsParamsList = tls; // keep a list of tile_ids with each request. in the case of a server error, we can try and use cached tiles if available