public async Task MigrateAsync(CancellationToken ct = default) { var version = 0; try { while (!await migrationStatus.TryLockAsync()) { log.LogInformation(w => w .WriteProperty("action", "Migrate") .WriteProperty("mesage", $"Waiting {LockWaitMs}ms to acquire lock.")); await Task.Delay(LockWaitMs, ct); } version = await migrationStatus.GetVersionAsync(); while (!ct.IsCancellationRequested) { var(newVersion, migrations) = migrationPath.GetNext(version); if (migrations == null || !migrations.Any()) { break; } foreach (var migration in migrations) { var name = migration.GetType().ToString(); log.LogInformation(w => w .WriteProperty("action", "Migration") .WriteProperty("status", "Started") .WriteProperty("migrator", name)); try { using (log.MeasureInformation(w => w .WriteProperty("action", "Migration") .WriteProperty("status", "Completed") .WriteProperty("migrator", name))) { await migration.UpdateAsync(); } } catch (Exception ex) { log.LogFatal(ex, w => w .WriteProperty("action", "Migration") .WriteProperty("status", "Failed") .WriteProperty("migrator", name)); throw new MigrationFailedException(name, ex); } } version = newVersion; } } finally { await migrationStatus.UnlockAsync(version); } }
private async Task <InvocationResponse> DispatchEventAsync(InvocationRequest input) { try { var payload = SignPayload(input.Payload, input.Webhook); var requestString = payload.ToString(Formatting.Indented); var responseString = string.Empty; var request = BuildRequest(requestString, input.Webhook); var response = (HttpResponseMessage)null; var isTimeout = false; var watch = Stopwatch.StartNew(); try { using (log.MeasureInformation(w => w .WriteProperty("action", "SendToHook") .WriteProperty("status", "Invoked") .WriteProperty("requestUrl", request.RequestUri.ToString()))) { using (var client = new HttpClient { Timeout = Timeout }) { response = await client.SendAsync(request); } } } catch (TimeoutException) { isTimeout = true; } catch (OperationCanceledException) { isTimeout = true; } finally { watch.Stop(); } if (response != null) { responseString = await response.Content.ReadAsStringAsync(); } var dump = DumpFormatter.BuildDump(request, response, requestString, responseString, watch.Elapsed); var result = WebhookResult.Fail; if (isTimeout) { result = WebhookResult.Timeout; } else if (response?.IsSuccessStatusCode == true) { result = WebhookResult.Success; } return(new InvocationResponse { Dump = dump, Result = result, Elapsed = watch.Elapsed, Webhook = input.Webhook }); } catch (Exception ex) { log.LogError(ex, w => w .WriteProperty("action", "SendToHook") .WriteProperty("status", "Failed")); return(null); } }