private void ProcessLogItems(SqliteProfilerDataService dataService) { if (logItemsQueue.Count == 0) { return; } var watch = Stopwatch.StartNew(); dataService.BeginTransaction(); try { int itemCount = 0; while (TryDequeue()) { foreach (var item in logItemBuffer) { dataService.LogCommandExecution(item, this.FullLogging); itemCount++; } } dataService.Commit(); Log?.LogTrace("Logged {Count} command executions in {Elapsed}", itemCount, watch.Elapsed); } catch { try { dataService.Rollback(); } catch { } throw; } watch.Stop(); }
private static void TryDisposeDataService(SqliteProfilerDataService dataService) { if (dataService != null) { try { dataService.Dispose(); } catch (Exception ex) { Log?.LogError(ex, "Error disposing data service"); } } }
private void ProcessLogItems() { SqliteProfilerDataService dataService = null; var startTime = DateTime.UtcNow; int attempt = 1; try { while (IsRunning) { signal.WaitOne(); try { dataService = EnsureDataServiceAndDeleteOldFiles(dataService); // Log?.LogTrace("DataService Ensured"); startTime = DateTime.UtcNow; attempt = 1; } #pragma warning disable CA1031 // I don't care which exception is thrown, it it fails I need to retry. catch (Exception ex) #pragma warning restore CA1031 // Do not catch general exception types { if (++attempt > 10 && DateTime.UtcNow.Subtract(startTime) > TimeSpan.FromMinutes(2)) { Log?.LogError(ex, "Error opening SqliteProfilerDataService"); return; } continue; } var processLogItemsStartTime = DateTime.UtcNow; try { ProcessLogItems(dataService); } #pragma warning disable CA1031 // I don't care which exception is thrown. If it fails I need to log it and continue catch (Exception ex) #pragma warning restore CA1031 // Do not catch general exception types { Log?.LogError(ex, "Error processing log items after {Elapsed}", DateTime.UtcNow.Subtract(processLogItemsStartTime)); signal.Set(); } } } finally { IsRunning = false; TryDisposeDataService(dataService); Log?.LogInformation("SqliteProfiler stoped"); } }
private void ProcessLogItems(SqliteProfilerDataService dataService) { LogItem item = null; while (!logItems.IsEmpty) { dataService.BeginTransaction(); int itemCount = 0; while (logItems.Dequeue(out item)) { dataService.LogCommandExecution(item, this.FullLogging); itemCount++; } dataService.Commit(); } }
private SqliteProfilerDataService EnsureDataServiceAndDeleteOldFiles(SqliteProfilerDataService dataService) { string filePath = null; if (dataService == null || (DateTime.Today != this.lastDataServiceCreateDay && dataService.FilePath != (filePath = this.GetDatabaseFilePath()))) { TryDisposeDataService(dataService); if (filePath == null) { filePath = this.GetDatabaseFilePath(); } dataService = SqliteProfilerDataService.Create(filePath); lastDataServiceCreateDay = DateTime.Today; dataService.OpenConnection(); ThreadPool.QueueUserWorkItem(DeleteOldFiles); } return(dataService); }
private SqliteProfilerDataService EnsureDataServiceAndDeleteOldFiles(SqliteProfilerDataService dataService) { string filePath = null; if (dataService == null || (DateTime.Today != this.lastDataServiceCreateDay && dataService.FilePath != (filePath = this.GetDatabaseFilePath()))) { TryDisposeDataService(dataService); if (filePath == null) { filePath = this.GetDatabaseFilePath(); } int attempt = 1; while (true) { try { dataService = SqliteProfilerDataService.Create(filePath); lastDataServiceCreateDay = DateTime.Today; dataService.OpenConnection(); ThreadPool.QueueUserWorkItem(DeleteOldFiles); return(dataService); } catch { TryDisposeDataService(dataService); if (++attempt > 20) { throw; } Thread.Sleep(200); } finally { if (attempt > MaxDataServiceAttempts) { MaxDataServiceAttempts = attempt; } } } } return(dataService); }
private void ProcessLogItems() { SqliteProfilerDataService dataService = null; try { while (true) { signal.WaitOne(); dataService = EnsureDataServiceAndDeleteOldFiles(dataService); try { ProcessLogItems(dataService); } catch (Exception ex) { Log.LogError(ex, "Error Profiling"); } if (!IsRunning) { TryDisposeDataService(dataService); dataService = null; return; } } } catch (Exception ex) { Log.LogError(ex, "Error Profiling"); } finally { this.IsRunning = false; TryDisposeDataService(dataService); dataService = null; } }