map data requesting: the stock site no longer performs unlimited retries on 'error: TIMEOUT' map data tiles, so update IITC to match

split tiles that are retried into smaller requests - might help things at the server side??? no harm in it...
This commit is contained in:
Jon Atkins 2014-08-12 18:47:48 +01:00
parent c8fd938cd3
commit 1a200269bd

View File

@ -31,8 +31,8 @@ window.MapDataRequest = function() {
this.NUM_TILES_PER_REQUEST = nemesis.dashboard.config.TILES_PER_REQUEST_CACHE_EXP || 4;
} catch(e) {}
// number of times to retry a tile after a 'bad' error (i.e. not a timeout)
this.MAX_TILE_RETRIES = 2;
// number of times to retry a tile after an error (including "error: TIMEOUT" now - as stock intel does)
this.MAX_TILE_RETRIES = 4;
try {
// stock has a variable for this - try to use it
this.MAX_TILE_RETRIES = nemesis.dashboard.DataManager.MAX_QUADKEY_RETRY_ATTEMPTS_;
@ -69,7 +69,7 @@ window.MapDataRequest = function() {
this.REFRESH_CLOSE = 300; // refresh time to use for close views z>12 when not idle and not moving
this.REFRESH_FAR = 900; // refresh time for far views z <= 12
this.FETCH_TO_REFRESH_FACTOR = 2; //refresh time is based on the time to complete a data fetch, times this value
this.FETCH_TO_REFRESH_FACTOR = 2; //minumum refresh time is based on the time to complete a data fetch, times this value
// ensure we have some initial map status
this.setStatus ('startup', undefined, -1);
@ -342,6 +342,11 @@ window.MapDataRequest.prototype.processRequestQueue = function(isFirstPass) {
// if nothing left in the queue, finish
if (Object.keys(this.queuedTiles).length == 0) {
// we leave the renderQueue code to handle ending the render pass now
// (but we need to make sure it's not left without it's timer running!)
if (!this.renderQueuePaused) {
this.startQueueTimer(this.RENDER_PAUSE);
}
return;
}
@ -356,12 +361,27 @@ window.MapDataRequest.prototype.processRequestQueue = function(isFirstPass) {
// console.log('- request state: '+Object.keys(this.requestedTiles).length+' tiles in '+this.activeRequestCount+' active requests, '+pendingTiles.length+' tiles queued');
var requestBuckets = this.MAX_REQUESTS - this.activeRequestCount;
if (pendingTiles.length > 0 && requestBuckets > 0) {
for (var bucket=0; bucket < requestBuckets; bucket++) {
var tiles = pendingTiles.splice(0, this.NUM_TILES_PER_REQUEST);
// if the tiles for this request have had several retries, use smaller requests
// maybe some of the tiles caused all the others to error? no harm anyway, and it may help...
var numTilesThisRequest = Math.min(this.NUM_TILES_PER_REQUEST,pendingTiles.length);
var id = pendingTiles[0];
var retryTotal = (this.tileErrorCount[id]||0);
for (var i=1; i<numTilesThisRequest; i++) {
id = pendingTiles[i];
retryTotal += (this.tileErrorCount[id]||0);
if (retryTotal > this.MAX_TILE_RETRIES) {
numTilesThisRequest = i;
break;
}
}
var tiles = pendingTiles.splice(0, numTilesThisRequest);
if (tiles.length > 0) {
this.sendTileRequest(tiles);
}
@ -492,7 +512,7 @@ window.MapDataRequest.prototype.handleResponse = function (data, tiles, success)
// server returned an error for this individual data tile
if (val.error == "TIMEOUT") {
// TIMEOUT errors for individual tiles are 'expected'(!) - and result in a silent unlimited retries
// TIMEOUT errors for individual tiles are quite common. used to be unlimited retries, but not any more
timeoutTiles.push (id);
} else {
console.warn('map data tile '+id+' failed: error=='+val.error);
@ -538,7 +558,8 @@ window.MapDataRequest.prototype.handleResponse = function (data, tiles, success)
for (var i in timeoutTiles) {
var id = timeoutTiles[i];
delete this.requestedTiles[id];
this.requeueTile(id, false);
this.requeueTile(id, true);
}
}
@ -556,7 +577,6 @@ window.MapDataRequest.prototype.handleResponse = function (data, tiles, success)
}
//.. should this also be delayed a small amount?
this.delayProcessRequestQueue(nextQueueDelay);
}