add a check for queue status to avoid hanging downloads
This commit is contained in:
		
							
								
								
									
										2
									
								
								MareAPI
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								MareAPI
									
									
									
									
									
								
							 Submodule MareAPI updated: 5ac8a753dd...9fea4c30da
									
								
							| @@ -60,16 +60,44 @@ public partial class ApiController | |||||||
|         return requestId; |         return requestId; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private async Task WaitForDownloadReady(DownloadFileTransfer downloadFileTransfer, Guid requestId, CancellationToken ct) |     private async Task WaitForDownloadReady(DownloadFileTransfer downloadFileTransfer, Guid requestId, CancellationToken downloadCt) | ||||||
|     { |     { | ||||||
|         bool alreadyCancelled = false; |         bool alreadyCancelled = false; | ||||||
|         try |         try | ||||||
|         { |         { | ||||||
|             while (!ct.IsCancellationRequested && _downloadReady.TryGetValue(requestId, out bool isReady) && !isReady) |             CancellationTokenSource localTimeoutCts = new CancellationTokenSource(); | ||||||
|  |             localTimeoutCts.CancelAfter(TimeSpan.FromSeconds(5)); | ||||||
|  |             CancellationTokenSource composite = CancellationTokenSource.CreateLinkedTokenSource(downloadCt, localTimeoutCts.Token); | ||||||
|  |  | ||||||
|  |             while (_downloadReady.TryGetValue(requestId, out bool isReady) && !isReady) | ||||||
|             { |             { | ||||||
|                 Logger.Verbose($"Waiting for {requestId} to become ready for download"); |                 try | ||||||
|                 await Task.Delay(250, ct).ConfigureAwait(false); |                 { | ||||||
|  |                     await Task.Delay(250, composite.Token).ConfigureAwait(false); | ||||||
|                 } |                 } | ||||||
|  |                 catch (TaskCanceledException) | ||||||
|  |                 { | ||||||
|  |                     if (downloadCt.IsCancellationRequested) throw; | ||||||
|  |  | ||||||
|  |                     var req = await SendRequestAsync<object>(HttpMethod.Get, MareFiles.RequestCheckQueueFullPath(downloadFileTransfer.DownloadUri, requestId, downloadFileTransfer.Hash), downloadCt).ConfigureAwait(false); | ||||||
|  |                     try | ||||||
|  |                     { | ||||||
|  |                         req.EnsureSuccessStatusCode(); | ||||||
|  |                         localTimeoutCts.Dispose(); | ||||||
|  |                         composite.Dispose(); | ||||||
|  |                         localTimeoutCts = new CancellationTokenSource(); | ||||||
|  |                         localTimeoutCts.CancelAfter(TimeSpan.FromSeconds(5)); | ||||||
|  |                         composite = CancellationTokenSource.CreateLinkedTokenSource(downloadCt, localTimeoutCts.Token); | ||||||
|  |                     } | ||||||
|  |                     catch (HttpRequestException) | ||||||
|  |                     { | ||||||
|  |                         throw; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             localTimeoutCts.Dispose(); | ||||||
|  |             composite.Dispose(); | ||||||
|  |  | ||||||
|             Logger.Debug($"Download {requestId} ready"); |             Logger.Debug($"Download {requestId} ready"); | ||||||
|         } |         } | ||||||
| @@ -77,7 +105,7 @@ public partial class ApiController | |||||||
|         { |         { | ||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 await SendRequestAsync<object>(HttpMethod.Get, MareFiles.RequestCancelFullPath(downloadFileTransfer.DownloadUri, requestId), ct).ConfigureAwait(false); |                 await SendRequestAsync<object>(HttpMethod.Get, MareFiles.RequestCancelFullPath(downloadFileTransfer.DownloadUri, requestId), downloadCt).ConfigureAwait(false); | ||||||
|                 alreadyCancelled = true; |                 alreadyCancelled = true; | ||||||
|             } |             } | ||||||
|             catch { } |             catch { } | ||||||
| @@ -86,11 +114,11 @@ public partial class ApiController | |||||||
|         } |         } | ||||||
|         finally |         finally | ||||||
|         { |         { | ||||||
|             if (ct.IsCancellationRequested && !alreadyCancelled) |             if (downloadCt.IsCancellationRequested && !alreadyCancelled) | ||||||
|             { |             { | ||||||
|                 try |                 try | ||||||
|                 { |                 { | ||||||
|                     await SendRequestAsync<object>(HttpMethod.Get, MareFiles.RequestCancelFullPath(downloadFileTransfer.DownloadUri, requestId), ct).ConfigureAwait(false); |                     await SendRequestAsync<object>(HttpMethod.Get, MareFiles.RequestCancelFullPath(downloadFileTransfer.DownloadUri, requestId), downloadCt).ConfigureAwait(false); | ||||||
|                 } |                 } | ||||||
|                 catch { } |                 catch { } | ||||||
|             } |             } | ||||||
| @@ -184,7 +212,7 @@ public partial class ApiController | |||||||
|         { |         { | ||||||
|             requestMessage.Content = JsonContent.Create(content); |             requestMessage.Content = JsonContent.Create(content); | ||||||
|         } |         } | ||||||
|         requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", Authorization); |         requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", this.Authorization); | ||||||
|  |  | ||||||
|         if (content != default) |         if (content != default) | ||||||
|         { |         { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Stanley Dimant
					Stanley Dimant