Skip to content

Commit a1a78c8

Browse files
committed
change datafetchingmanager queue system and how cancellation of data fetch requests works
1 parent a3c1bda commit a1a78c8

File tree

7 files changed

+108
-142
lines changed

7 files changed

+108
-142
lines changed

Runtime/Mapbox/BaseModule/Data/DataFetchers/DataFetchingManager.cs

Lines changed: 60 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -12,104 +12,97 @@ namespace Mapbox.BaseModule.Data.DataFetchers
1212
{
1313
public class DataFetchingManager : IFileSource
1414
{
15-
protected Action<FetchInfo> TileInitialized = (t)=> {};
16-
private const float _requestDelay = 0.2f;
17-
15+
/// <summary>
16+
/// A fetch command in queue is about the get started.
17+
/// </summary>
18+
public Action<FetchInfo> TileInitialized = (t)=> {};
19+
20+
/// <summary>
21+
/// This doesn't mean success or failure, it shows a fetch command fired from queue
22+
/// has finalized. Can be success, error, cancellation.
23+
/// Tile object inside the attached FetchInfo contains the details.
24+
/// </summary>
25+
public event Action<FetchInfo> FetchFinished = (t)=> {};
26+
27+
/// <summary>
28+
/// This is an event for when data fetching command is removed from queue.
29+
/// Command may have been cancelled much earlier but getting removed from queue (this event)
30+
/// much later. This shouldn't be used for attaching logic to data fetching cancellation
31+
/// </summary>
32+
public event Action<FetchInfo> FetchCancelled = (t)=> {};
33+
34+
protected const float _requestDelay = 0.2f;
1835
protected IFileSource _fileSource;
19-
protected Queue<int> _tileOrder;
20-
protected Dictionary<int, FetchInfo> _tileFetchInfos;
21-
protected Dictionary<int, Tile> _globalActiveRequests;
36+
protected Queue<FetchInfo> _fetchQueue;
37+
protected HashSet<FetchInfo> _globalActiveRequests;
2238
protected int _activeRequestLimit = 30;
2339
private bool _isDestroying = false;
2440

2541
public DataFetchingManager(string getAccessToken, Func<string> getSkuToken)
2642
{
2743
_fileSource = new ResilientWebRequestFileSource(getAccessToken, getSkuToken);
28-
_tileOrder = new Queue<int>();
29-
_tileFetchInfos = new Dictionary<int, FetchInfo>();
30-
_globalActiveRequests = new Dictionary<int, Tile>();
44+
_fetchQueue = new Queue<FetchInfo>();
45+
_globalActiveRequests = new HashSet<FetchInfo>();
3146
Runnable.Run(UpdateTick());
3247
}
3348

3449
public virtual void EnqueueForFetching(FetchInfo info)
3550
{
36-
var key = info.Tile.Id.GenerateKey(info.Tile.TilesetId);
37-
38-
if (!_tileFetchInfos.ContainsKey(key))
39-
{
40-
info.Callback += (result) =>
41-
{
42-
if (!_isDestroying)
43-
{
44-
_globalActiveRequests.Remove(key);
45-
}
46-
};
47-
48-
info.Tile.AddLog(Time.frameCount + " Enqueued for fetching");
49-
_tileOrder.Enqueue(key);
50-
info.QueueTime = Time.time;
51-
_tileFetchInfos.Add(key, info);
52-
}
53-
else
54-
{
55-
//same requests is already in queue.
56-
//this probably means first one was supposed to be cancelled but for some reason has not.
57-
//ensure all data fetchers (including unorthodox ones like file data fetcher) handling
58-
//tile cancelling properly
59-
#if DEPLOY_DEV || UNITY_EDITOR
60-
Debug.Log("tile request is already in queue. This most likely means first request was supposed to be cancelled but not. " + info.Tile.Id + " " + info.Tile.TilesetId);
61-
#endif
62-
}
51+
info.QueueTime = Time.time;
52+
_fetchQueue.Enqueue(info);
6353
}
6454

55+
public virtual TileJSON GetTileJSON(int timeout = 10)
56+
{
57+
return new TileJSON(_fileSource, timeout);
58+
}
59+
60+
public void OnDestroy()
61+
{
62+
_isDestroying = true;
63+
_fetchQueue.Clear();
64+
_fetchQueue = null;
65+
_fileSource.OnDestroy();
66+
_fileSource = null;
67+
}
68+
6569
private IEnumerator UpdateTick()
6670
{
6771
while (!_isDestroying)
6872
{
69-
var fallbackCounter = 0;
70-
while (_tileOrder.Count > 0 &&
71-
_globalActiveRequests.Count < _activeRequestLimit &&
72-
fallbackCounter < _activeRequestLimit)
73+
while (_fetchQueue.Count > 0 &&
74+
_globalActiveRequests.Count < _activeRequestLimit)
7375
{
74-
fallbackCounter++;
75-
var tileKey = _tileOrder.Peek(); //we just peek first as we might want to hold it until delay timer runs out
76-
if (!_tileFetchInfos.ContainsKey(tileKey))
76+
var info = _fetchQueue.Peek(); //we just peek first as we might want to hold it until delay timer runs out
77+
if (info.Tile.CurrentTileState == TileState.Canceled)
7778
{
78-
_tileOrder.Dequeue(); //but we dequeue it if it's not in tileFetchInfos, which means it's cancelled
79+
_fetchQueue.Dequeue();
80+
FetchCancelled(info);
7981
continue;
8082
}
8183

82-
if (QueueTimeHasMatured(_tileFetchInfos[tileKey].QueueTime, _requestDelay) || !Application.isPlaying)
84+
if (QueueTimeHasMatured(info.QueueTime, _requestDelay) || !Application.isPlaying)
8385
{
84-
tileKey = _tileOrder.Dequeue();
85-
var fi = _tileFetchInfos[tileKey];
86-
87-
if (fi.Tile.CurrentTileState == TileState.Canceled)
88-
continue;
89-
90-
_tileFetchInfos.Remove(tileKey);
91-
if (!_globalActiveRequests.ContainsKey(tileKey))
92-
{
93-
_globalActiveRequests.Add(tileKey, fi.Tile);
94-
}
95-
else
96-
{
97-
Debug.Log("here");
98-
}
99-
TileInitialized(fi);
100-
fi.Tile.Initialize(
86+
_fetchQueue.Dequeue();
87+
_globalActiveRequests.Add(info);
88+
TileInitialized(info);
89+
info.Tile.Initialize(
10190
_fileSource,
102-
fi.Tile.Id,
103-
fi.Tile.TilesetId,
91+
info.Tile.Id,
92+
info.Tile.TilesetId,
10493
(dataFetchingResult) =>
10594
{
106-
fi.Callback(dataFetchingResult);
95+
_globalActiveRequests.Remove(info);
96+
info.Callback(dataFetchingResult);
97+
FetchFinished?.Invoke(info);
10798
});
10899
yield return null;
109100
}
101+
else
102+
{
103+
yield return null;
104+
}
110105
}
111-
112-
//Debug.Log("request count " + _tileFetchInfos.Count + " " + _globalActiveRequests.Count);
113106
yield return null;
114107
}
115108
}
@@ -118,50 +111,7 @@ private static bool QueueTimeHasMatured(float queueTime, float maturationAge)
118111
{
119112
return Time.time - queueTime >= maturationAge;
120113
}
121-
122-
public virtual void CancelFetching(Tile tile, string tilesetId)
123-
{
124-
var key = tile.Id.GenerateKey(tilesetId);
125-
126-
//is this correct?
127-
if (_globalActiveRequests.ContainsKey(key))
128-
{
129-
_globalActiveRequests.Remove(key);
130-
}
131-
132-
if (_tileFetchInfos.ContainsKey(key))
133-
{
134-
tile.AddLog(Time.frameCount + " CancelFetching executing");
135-
tile.Cancel();
136-
_tileFetchInfos[key].Callback(new DataFetchingResult()
137-
{
138-
State = WebResponseResult.Cancelled
139-
});
140-
_tileFetchInfos.Remove(key);
141-
}
142-
}
143114

144-
public virtual TileJSON GetTileJSON(int timeout = 10)
145-
{
146-
return new TileJSON(_fileSource, timeout);
147-
}
148-
149-
public void OnDestroy()
150-
{
151-
_isDestroying = true;
152-
foreach (var request in _globalActiveRequests)
153-
{
154-
request.Value.Cancel();
155-
}
156-
_globalActiveRequests.Clear();
157-
_globalActiveRequests = null;
158-
_tileFetchInfos.Clear();
159-
_tileFetchInfos = null;
160-
_tileOrder.Clear();
161-
_tileOrder = null;
162-
_fileSource.OnDestroy();
163-
_fileSource = null;
164-
}
165115

166116

167117
#region IFileSource interface for direct access without queue

Runtime/Mapbox/BaseModule/Data/Tiles/Tile.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ public int Key
7474
return _key;
7575
}
7676
}
77-
public Action Cancelled = () => { };
7877
protected List<string> _logs;
7978

8079
protected Tile()
@@ -196,7 +195,6 @@ public virtual void Cancel()
196195

197196
TileState = TileState.Canceled;
198197
AddLog(string.Format("{0} - {1}", Time.unscaledTime, " state cancelled with cancel call"));
199-
Cancelled();
200198
}
201199

202200
// Get the tile resource (raster/vector/etc).

Runtime/Mapbox/BaseModule/Map/MapboxMap.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,18 @@ public void LoadMapView(Action callback)
5050
{
5151
Runnable.Instance.StartCoroutine(LoadMapViewCoroutine(callback));
5252
}
53+
54+
public void LoadMapView(Action callback, LatitudeLongitude coordinates)
55+
{
56+
Status = InitializationStatus.Initialized;
57+
MapInformation.SetInformation(coordinates);
58+
Runnable.Instance.StartCoroutine(LoadMapViewCoroutine(() =>
59+
{
60+
Status = InitializationStatus.ViewLoaded;
61+
callback();
62+
Status = InitializationStatus.ReadyForUpdates;
63+
}));
64+
}
5365

5466
public IEnumerator LoadMapViewCoroutine(Action callback)
5567
{

Runtime/Mapbox/MapDebug/Scripts/Logging/LoggingDataFetchingManager.cs

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public LoggingDataFetchingManager(string getAccessToken, Func<string> getSkuToke
2727
TotalRequestCount++;
2828
Records[f].StartTime = Time.realtimeSinceStartup;
2929
};
30+
31+
base.FetchCancelled += info => { TotalCancelledCount++; };
3032
}
3133

3234
public override void EnqueueForFetching(FetchInfo info)
@@ -47,42 +49,30 @@ public override void EnqueueForFetching(FetchInfo info)
4749
base.EnqueueForFetching(info);
4850
}
4951

50-
public override void CancelFetching(Tile tile, string tilesetId)
51-
{
52-
if (_tileFetchInfos.ContainsKey(tile.Key))
53-
{
54-
TotalCancelledCount++;
55-
var record = Records[_tileFetchInfos[tile.Key]];
56-
record.IsCancelled = true;
57-
record.CancelTime = Time.realtimeSinceStartup;
58-
}
59-
base.CancelFetching(tile, tilesetId);
60-
}
61-
6252
public override TileJSON GetTileJSON(int timeout = 10)
6353
{
6454
return base.GetTileJSON(timeout);
6555
}
6656

67-
public Queue<int> GetTileOrderQueue()
68-
{
69-
return _tileOrder;
70-
}
71-
72-
public Dictionary<int, FetchInfo> GetFetchInfoQueue()
73-
{
74-
return _tileFetchInfos;
75-
}
57+
// public Queue<int> GetTileOrderQueue()
58+
// {
59+
// return _tileOrder;
60+
// }
61+
//
62+
// public Dictionary<int, FetchInfo> GetFetchInfoQueue()
63+
// {
64+
// return _tileFetchInfos;
65+
// }
7666

7767
public int GetActiveRequestLimit()
7868
{
7969
return _activeRequestLimit;
8070
}
8171

82-
public Dictionary<int, Tile> GetActiveRequests()
83-
{
84-
return _globalActiveRequests;
85-
}
72+
// public Dictionary<int, Tile> GetActiveRequests()
73+
// {
74+
// return _globalActiveRequests;
75+
// }
8676

8777
public void ClearLogsAndStats()
8878
{
@@ -134,7 +124,7 @@ public JObject DumpLogs()
134124

135125
public string PrintScreen()
136126
{
137-
return string.Format("Web Requests | Queue: {0}, Running: {1}, Total: {2}, Cancelled: {3}", _tileFetchInfos.Count, _globalActiveRequests.Count, TotalRequestCount, TotalCancelledCount);
127+
return string.Format("Web Requests | Queue: {0}, Running: {1}, Total: {2}, Cancelled: {3}", 0, _globalActiveRequests.Count, TotalRequestCount, TotalCancelledCount);
138128
}
139129

140130
private JObject CreateLogEntry(KeyValuePair<FetchInfo, LoggingDataFetchingManager.InfoRecord> pair)

Runtime/Mapbox/UnityMapService/DataSources/ImageSource.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ public override void CancelActiveRequests(CanonicalTileId unityTileId)
8484
var tile = _waitingList[unityTileId];
8585
if (tile != null)
8686
{
87-
tile.Cancel();
8887
CancelFetching(tile, _tilesetId);
8988
}
9089

Runtime/Mapbox/UnityMapService/DataSources/PbfSource.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ public override void CancelActiveRequests(CanonicalTileId unityTileId)
8585
if (_waitingList.ContainsKey(unityTileId))
8686
{
8787
var tile = _waitingList[unityTileId];
88-
tile.Cancel();
8988
CancelFetching(tile, _tilesetId);
9089
_waitingList.Remove(unityTileId);
9190
}

Runtime/Mapbox/UnityMapService/DataSources/UnitySource.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
using System;
22
using System.Collections;
3+
using System.Collections.Generic;
34
using Mapbox.BaseModule.Data.DataFetchers;
45
using Mapbox.BaseModule.Data.Platform;
56
using Mapbox.BaseModule.Data.Platform.Cache;
67
using Mapbox.BaseModule.Data.Platform.TileJSON;
8+
using Mapbox.BaseModule.Data.Tasks;
79
using Mapbox.BaseModule.Data.Tiles;
810
using UnityEngine;
911

@@ -24,12 +26,22 @@ public override bool IsReady()
2426
private readonly DataFetchingManager _dataFetchingManager;
2527
private readonly MapboxCacheManager _cacheManager;
2628
private IAsyncRequest _tileJsonRequest;
29+
private Dictionary<Tile, FetchInfo> _activeRequests;
2730

2831
protected UnitySource(DataFetchingManager dataFetchingManager, MapboxCacheManager cacheManager, string tilesetId)
2932
{
3033
_tilesetId = tilesetId;
3134
_dataFetchingManager = dataFetchingManager;
3235
_cacheManager = cacheManager;
36+
_activeRequests = new Dictionary<Tile, FetchInfo>();
37+
_dataFetchingManager.FetchFinished += info =>
38+
{
39+
_activeRequests.Remove(info.Tile);
40+
};
41+
_dataFetchingManager.FetchCancelled += info =>
42+
{
43+
_activeRequests.Remove(info.Tile);
44+
};
3345
}
3446

3547
public override IEnumerator Initialize()
@@ -61,13 +73,19 @@ public override IEnumerator Initialize()
6173

6274
protected void WebRequestData(Tile tile, Action<DataFetchingResult> callback)
6375
{
64-
_dataFetchingManager.EnqueueForFetching(new FetchInfo(tile, callback));
76+
var fetchInfo = new FetchInfo(tile, callback);
77+
_activeRequests.Add(tile, fetchInfo);
78+
_dataFetchingManager.EnqueueForFetching(fetchInfo);
6579
}
6680

6781
protected void CancelFetching(Tile tile, string tilesetId)
6882
{
83+
tile.Cancel();
6984
_cacheManager.CancelFetching(tile.Id, tilesetId);
70-
_dataFetchingManager.CancelFetching(tile, tilesetId);
85+
//we removed data fetching cancel here as data fetching now track
86+
//removal through the tile.Cancel
87+
//no further calls are necessary
88+
// _dataFetchingManager.CancelFetching(tile, tilesetId);
7189
}
7290

7391
public void SaveBlob(MapboxTileData vectorCacheItem, bool forceInsert)

0 commit comments

Comments
 (0)