Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 11 additions & 9 deletions OneSTools.EventLog.Exporter.Core/ClickHouse/ClickHouseStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,16 +92,18 @@ public async Task WriteEventLogDataAsync(List<EventLogItem> entities,
item.Session
}).AsEnumerable();

try
{
await copy.WriteToServerAsync(data, cancellationToken);
}
catch (Exception ex)
{
_logger?.LogError(ex, $"Failed to write data to {_databaseName}");
throw;
while(true){
try
{
await copy.WriteToServerAsync(data, cancellationToken);
break;
}
catch (Exception ex)
{
_logger?.LogWarning(ex, $"Failed to write data to {_databaseName}." + System.Environment.NewLine + ex.Message);
await Task.Delay(1000);
}
}

_logger?.LogDebug($"{entities.Count} items were being written to {_databaseName}");
}

Expand Down
34 changes: 27 additions & 7 deletions OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Linq;
using System.Text.RegularExpressions;
using OneSTools.BracketsFile;
using System.Threading.Tasks;

namespace OneSTools.EventLog.Exporter.Manager
{
Expand All @@ -27,8 +28,7 @@ public ClstWatcher(string folder, List<TemplateItem> templates)
_path = Path.Combine(_folder, "1CV8Clst.lst");
if (!File.Exists(_path))
throw new Exception("Couldn't find LST \"1CV8Clst.lst\" file");

_infoBases = ReadInfoBases();

InitializeWatcher();
}

Expand All @@ -43,11 +43,30 @@ public void Dispose()
public event InfoBaseAddedHandler InfoBasesAdded;
public event InfoBaseDeletedHandler InfoBasesDeleted;

private Dictionary<string, (string Name, string DataBaseName)> ReadInfoBases()
private async Task<Dictionary<string, (string Name, string DataBaseName)>> ReadInfoBases()
{
var items = new Dictionary<string, (string, string)>();

var fileData = File.ReadAllText(_path);
String fileData = null;
int tryCount = 10;
while (fileData == null)
{
try
{
using StreamReader stream = new StreamReader(new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
{
fileData = stream.ReadToEnd();
}
}
catch (Exception e)
{
tryCount--;
if (tryCount == 0)
throw new Exception("Ошибка чтения файла списка баз", e);
await Task.Delay(1000);
}
}

var parsedData = BracketsParser.ParseBlock(fileData);

var infoBasesNode = parsedData[2];
Expand All @@ -74,9 +93,9 @@ public void Dispose()
return items;
}

private void ReadInfoBasesAndRaiseEvents()
private async void ReadInfoBasesAndRaiseEvents()
{
var newInfoBases = ReadInfoBases();
var newInfoBases = await ReadInfoBases();

var added = newInfoBases.Except(_infoBases);
foreach (var (key, (item1, item2)) in added)
Expand All @@ -89,8 +108,9 @@ private void ReadInfoBasesAndRaiseEvents()
_infoBases = newInfoBases;
}

private void InitializeWatcher()
private async void InitializeWatcher()
{
_infoBases = await ReadInfoBases();
_clstWatcher = new FileSystemWatcher(_folder, "1CV8Clst.lst")
{
NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite
Expand Down
49 changes: 23 additions & 26 deletions OneSTools.EventLog/EventLogReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.IO;
using System.Linq;
using System.Threading;
using Timers = System.Timers;

namespace OneSTools.EventLog
{
Expand All @@ -14,8 +15,8 @@ public class EventLogReader : IDisposable
private readonly EventLogReaderSettings _settings;
private bool _disposedValue;
private LgfReader _lgfReader;
private ManualResetEvent _lgpChangedCreated;
private FileSystemWatcher _lgpFilesWatcher;
private ManualResetEvent _lgpChangedCreated;
private Timers.Timer _Timer;
private LgpReader _lgpReader;

public EventLogReader(EventLogReaderSettings settings)
Expand Down Expand Up @@ -57,8 +58,8 @@ public EventLogItem ReadNextEventLogItem(CancellationToken cancellationToken = d
if (_lgpReader == null)
SetNextLgpReader();

if (_settings.LiveMode && _lgpFilesWatcher == null)
StartLgpFilesWatcher();
if (_settings.LiveMode && _Timer == null)
StartTimer();

EventLogItem item = null;

Expand Down Expand Up @@ -114,29 +115,28 @@ public EventLogItem ReadNextEventLogItem(CancellationToken cancellationToken = d

private bool SetNextLgpReader()
{
var currentReaderLastWriteDateTime = DateTime.MinValue;
string currentFileName = "19000101000000";

if (_lgpReader != null)
currentReaderLastWriteDateTime = new FileInfo(_lgpReader.LgpPath).LastWriteTime;
currentFileName = new FileInfo(_lgpReader.LgpPath).Name;

var filesDateTime = new List<(string, DateTime)>();
var filesDateTime = new List<(string, string)>();

var files = Directory.GetFiles(_settings.LogFolder, "*.lgp");

foreach (var file in files)
if (_lgpReader != null)
{
if (_lgpReader.LgpPath != file)
filesDateTime.Add((file, new FileInfo(file).LastWriteTime));
filesDateTime.Add((file, new FileInfo(file).Name));
}
else
{
filesDateTime.Add((file, new FileInfo(file).LastWriteTime));
filesDateTime.Add((file, new FileInfo(file).Name));
}

var orderedFiles = filesDateTime.OrderBy(c => c.Item2).ToList();

var (item1, _) = orderedFiles.FirstOrDefault(c => c.Item2 > currentReaderLastWriteDateTime);

filesDateTime.Sort((x, y) => string.Compare(y.Item2, x.Item2));
var (item1, _) = filesDateTime.FirstOrDefault(c => string.Compare(c.Item2, currentFileName) > 0);

if (string.IsNullOrEmpty(item1))
{
Expand All @@ -151,31 +151,28 @@ private bool SetNextLgpReader()
return true;
}

private void StartLgpFilesWatcher()
private void StartTimer()
{
_lgpChangedCreated = new ManualResetEvent(false);

_lgpFilesWatcher = new FileSystemWatcher(_settings.LogFolder, "*.lgp")
{
NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite | NotifyFilters.Size
};
_lgpFilesWatcher.Changed += LgpFilesWatcher_Event;
_lgpFilesWatcher.Created += LgpFilesWatcher_Event;
_lgpFilesWatcher.EnableRaisingEvents = true;
_Timer = new Timers.Timer(_settings.ReadingTimeout);
_Timer.Elapsed += OnTimedEvent;
_Timer.AutoReset = true;
_Timer.Enabled = true;
}

private void LgpFilesWatcher_Event(object sender, FileSystemEventArgs e)
private void OnTimedEvent(Object source, Timers.ElapsedEventArgs e)
{
if (e.ChangeType == WatcherChangeTypes.Created || e.ChangeType == WatcherChangeTypes.Changed)
_lgpChangedCreated.Set();
_lgpChangedCreated.Set();
}

protected virtual void Dispose(bool disposing)
{
if (!_disposedValue)
{
_lgpFilesWatcher?.Dispose();
_lgpFilesWatcher = null;
_Timer?.Stop();
_Timer?.Dispose();
_Timer = null;
_lgpChangedCreated?.Dispose();
_lgpChangedCreated = null;
_lgfReader?.Dispose();
Expand Down