Skip to content

Commit b558d20

Browse files
Added configuration property to specify durable buffer path to address issue #106
1 parent c186312 commit b558d20

8 files changed

Lines changed: 140 additions & 28 deletions

File tree

agent/MTConnect.NET-Agent/agent.config.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ modules:
8484
- mqtt-relay: # - Add MQTT Relay module (Document Structure)
8585
server: localhost
8686
port: 1883
87+
durableRelay: false
8788
currentInterval: 10000
8889
sampleInterval: 500
8990
documentFormat: JSON-CPPAGENT-MQTT
@@ -137,6 +138,7 @@ assetBufferSize: 1000
137138

138139
# Sets whether the Agent buffers are durable and retain state after restart
139140
# durable: true
141+
# durableBufferPath: C:\mtconnect\agent\buffer
140142

141143
# Disables the Agent Device
142144
# enableAgentDevice: false

agent/MTConnect.NET-Applications-Agents/MTConnectAgentApplication.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -282,15 +282,15 @@ public void Run(string[] args, bool isBlocking = false)
282282
_applicationLogger.Info("Reset Buffer requested..");
283283

284284
// Clear the Observation Buffer
285-
MTConnectObservationFileBuffer.Reset();
285+
MTConnectObservationFileBuffer.Reset(configuration.DurableBufferPath);
286286
_applicationLogger.Info("Observation Buffer Reset Successfully");
287287

288288
// Clear the Asset Buffer
289-
MTConnectAssetFileBuffer.Reset();
289+
MTConnectAssetFileBuffer.Reset(configuration.DurableBufferPath);
290290
_applicationLogger.Info("Asset Buffer Reset Successfully");
291291

292292
// Clear the Index
293-
FileIndex.Reset();
293+
FileIndex.Reset(configuration.DurableBufferPath);
294294
_applicationLogger.Info("Indexes Reset Successfully");
295295

296296
break;
@@ -358,14 +358,14 @@ public void StartAgent(IAgentApplicationConfiguration configuration, bool verbos
358358
if (configuration.Durable)
359359
{
360360
// Create Observation File Buffer
361-
var observationBuffer = new MTConnectObservationFileBuffer(configuration);
361+
var observationBuffer = new MTConnectObservationFileBuffer(configuration, configuration.DurableBufferPath);
362362
observationBuffer.UseCompression = configuration.UseBufferCompression;
363363
observationBuffer.BufferLoadStarted += ObservationBufferStarted;
364364
observationBuffer.BufferLoadCompleted += ObservationBufferCompleted;
365365
observationBuffer.BufferRetentionCompleted += ObservationBufferRetentionCompleted;
366366

367367
// Create Asset File Buffer
368-
_assetBuffer = new MTConnectAssetFileBuffer(configuration);
368+
_assetBuffer = new MTConnectAssetFileBuffer(configuration, configuration.DurableBufferPath);
369369
_assetBuffer.UseCompression = configuration.UseBufferCompression;
370370
_assetBuffer.BufferLoadStarted += AssetBufferStarted;
371371
_assetBuffer.BufferLoadCompleted += AssetBufferCompleted;
@@ -406,10 +406,10 @@ public void StartAgent(IAgentApplicationConfiguration configuration, bool verbos
406406
if (configuration.Durable)
407407
{
408408
// Read Device Indexes
409-
_mtconnectAgent.InitializeDeviceIndex(FileIndex.ToDictionary(FileIndex.FromFile(FileIndex.DevicesFileName)));
409+
_mtconnectAgent.InitializeDeviceIndex(FileIndex.ToDictionary(FileIndex.FromFile(configuration.DurableBufferPath, FileIndex.DevicesFileName)));
410410

411411
// Read DataItem Indexes
412-
_mtconnectAgent.InitializeDataItemIndex(FileIndex.ToDictionary(FileIndex.FromFile(FileIndex.DataItemsFileName)));
412+
_mtconnectAgent.InitializeDataItemIndex(FileIndex.ToDictionary(FileIndex.FromFile(configuration.DurableBufferPath, FileIndex.DataItemsFileName)));
413413
}
414414

415415
if (verboseLogging)
@@ -492,10 +492,10 @@ public void StartAgent(IAgentApplicationConfiguration configuration, bool verbos
492492
if (configuration.Durable)
493493
{
494494
// Save Device Indexes
495-
FileIndex.ToFile(FileIndex.DevicesFileName, FileIndex.Create(_mtconnectAgent.DeviceIndexes));
495+
FileIndex.ToFile(configuration.DurableBufferPath, FileIndex.DevicesFileName, FileIndex.Create(_mtconnectAgent.DeviceIndexes));
496496

497497
// Save DataItem Indexes
498-
FileIndex.ToFile(FileIndex.DataItemsFileName, FileIndex.Create(_mtconnectAgent.DataItemIndexes));
498+
FileIndex.ToFile(configuration.DurableBufferPath, FileIndex.DataItemsFileName, FileIndex.Create(_mtconnectAgent.DataItemIndexes));
499499
}
500500

501501
// Start Agent

libraries/MTConnect.NET-Common/Agents/MTConnectAgentBroker.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using System;
1616
using System.Collections.Generic;
1717
using System.Linq;
18-
using System.Runtime.Serialization;
1918

2019
namespace MTConnect.Agents
2120
{

libraries/MTConnect.NET-Common/Buffers/FileIndex.cs

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,31 @@ public static IDictionary<string, int> ToDictionary(IEnumerable<FileIndex> fileI
7979
}
8080

8181

82-
public static IEnumerable<FileIndex> FromFile(string filePath)
82+
//public static IEnumerable<FileIndex> FromFile(string filePath)
83+
//{
84+
// return FromFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "buffer"), filePath);
85+
//}
86+
87+
public static IEnumerable<FileIndex> FromFile(string basePath, string filePath)
8388
{
8489
var fileIndexes = new List<FileIndex>();
8590

8691
if (!string.IsNullOrEmpty(filePath))
8792
{
8893
try
8994
{
90-
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "buffer", "index", filePath);
95+
var baseDir = basePath;
96+
97+
if (!string.IsNullOrEmpty(baseDir))
98+
{
99+
if (!Path.IsPathRooted(baseDir)) baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, baseDir);
100+
}
101+
else
102+
{
103+
baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "buffer");
104+
}
105+
106+
var path = Path.Combine(baseDir, "index", filePath);
91107
if (File.Exists(path))
92108
{
93109
var lines = File.ReadAllLines(path);
@@ -107,7 +123,12 @@ public static IEnumerable<FileIndex> FromFile(string filePath)
107123
return fileIndexes;
108124
}
109125

110-
public static bool ToFile(string filePath, IEnumerable<FileIndex> fileIndexes)
126+
//public static bool ToFile(string filePath, IEnumerable<FileIndex> fileIndexes)
127+
//{
128+
// return ToFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "buffer"), filePath, fileIndexes);
129+
//}
130+
131+
public static bool ToFile(string basePath, string filePath, IEnumerable<FileIndex> fileIndexes)
111132
{
112133
if (!string.IsNullOrEmpty(filePath) && !fileIndexes.IsNullOrEmpty())
113134
{
@@ -120,7 +141,18 @@ public static bool ToFile(string filePath, IEnumerable<FileIndex> fileIndexes)
120141

121142
try
122143
{
123-
var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "buffer", "index");
144+
var baseDir = basePath;
145+
146+
if (!string.IsNullOrEmpty(baseDir))
147+
{
148+
if (!Path.IsPathRooted(baseDir)) baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, baseDir);
149+
}
150+
else
151+
{
152+
baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "buffer");
153+
}
154+
155+
var dir = Path.Combine(baseDir, "index");
124156
if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
125157

126158
var path = Path.Combine(dir, filePath);
@@ -134,9 +166,20 @@ public static bool ToFile(string filePath, IEnumerable<FileIndex> fileIndexes)
134166
return false;
135167
}
136168

137-
public static void Reset()
169+
public static void Reset(string basePath)
138170
{
139-
var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "buffer", "index");
171+
var baseDir = basePath;
172+
173+
if (!string.IsNullOrEmpty(baseDir))
174+
{
175+
if (!Path.IsPathRooted(baseDir)) baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, baseDir);
176+
}
177+
else
178+
{
179+
baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "buffer");
180+
}
181+
182+
var dir = Path.Combine(baseDir, "index");
140183
if (Directory.Exists(dir))
141184
{
142185
try

libraries/MTConnect.NET-Common/Buffers/MTConnectAssetFileBuffer.cs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class MTConnectAssetFileBuffer : MTConnectAssetBuffer, IDisposable
2222
public const string DirectoryBuffer = "buffer";
2323
public const string DirectoryAssets = "assets";
2424

25+
private readonly string _basePath;
2526
private readonly MTConnectAssetQueue _items;
2627
private readonly Regex _regex = new Regex("([0-9]*)_(.*)");
2728

@@ -52,8 +53,9 @@ public MTConnectAssetFileBuffer()
5253
Start();
5354
}
5455

55-
public MTConnectAssetFileBuffer(IAgentConfiguration configuration) : base(configuration)
56+
public MTConnectAssetFileBuffer(IAgentConfiguration configuration, string basePath = null) : base(configuration)
5657
{
58+
_basePath = basePath;
5759
_items = new MTConnectAssetQueue();
5860

5961
Start();
@@ -104,9 +106,9 @@ public void Dispose()
104106
GC.SuppressFinalize(this);
105107
}
106108

107-
public static void Reset()
109+
public static void Reset(string basePath)
108110
{
109-
var dir = GetDirectory(false);
111+
var dir = GetDirectory(basePath, false);
110112
if (Directory.Exists(dir))
111113
{
112114
try
@@ -406,9 +408,25 @@ private async Task<bool> WriteToFile(uint index, IAsset asset, uint originalInde
406408
#endregion
407409

408410

409-
private static string GetDirectory(bool createIfNotExists = true)
411+
private string GetDirectory(bool createIfNotExists = true)
410412
{
411-
string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DirectoryBuffer, DirectoryAssets);
413+
return GetDirectory(_basePath, createIfNotExists);
414+
}
415+
416+
private static string GetDirectory(string basePath, bool createIfNotExists = true)
417+
{
418+
var baseDir = basePath;
419+
420+
if (!string.IsNullOrEmpty(baseDir))
421+
{
422+
if (!Path.IsPathRooted(baseDir)) baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, baseDir);
423+
}
424+
else
425+
{
426+
baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DirectoryBuffer);
427+
}
428+
429+
string dir = Path.Combine(baseDir, DirectoryAssets);
412430
if (createIfNotExists && !Directory.Exists(dir)) Directory.CreateDirectory(dir);
413431

414432
return dir;

libraries/MTConnect.NET-Common/Buffers/MTConnectObservationFileBuffer.cs

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ public class MTConnectObservationFileBuffer : MTConnectObservationBuffer, IDispo
2525
private const string DirectoryObservations = "observations";
2626
private const string DirectoryCurrent = "current";
2727

28+
private readonly string _basePath;
2829
private readonly object _lock = new object();
2930
private readonly MTConnectObservationQueue _items;
31+
3032
private CancellationTokenSource stop;
3133
private bool _isStarted;
3234
private bool _isLoading;
@@ -56,12 +58,15 @@ public class MTConnectObservationFileBuffer : MTConnectObservationBuffer, IDispo
5658
public MTConnectObservationFileBuffer()
5759
{
5860
_items = new MTConnectObservationQueue();
61+
5962
Start();
6063
}
6164

62-
public MTConnectObservationFileBuffer(IAgentConfiguration configuration) : base(configuration)
65+
public MTConnectObservationFileBuffer(IAgentConfiguration configuration, string basePath = null) : base(configuration)
6366
{
67+
_basePath = basePath;
6468
_items = new MTConnectObservationQueue();
69+
6570
Start();
6671
}
6772

@@ -129,9 +134,9 @@ public void Dispose()
129134
}
130135

131136

132-
public static void Reset()
137+
public static void Reset(string basePath)
133138
{
134-
var dir = GetDirectory(false);
139+
var dir = GetDirectory(basePath, false);
135140
if (Directory.Exists(dir))
136141
{
137142
try
@@ -912,17 +917,50 @@ private async Task<bool> WriteToCurrentFile(string path, IEnumerable<BufferObser
912917
#endregion
913918

914919

915-
private static string GetDirectory(bool createIfNotExists = true)
920+
921+
private string GetDirectory(bool createIfNotExists = true)
916922
{
917-
string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DirectoryBuffer, DirectoryObservations);
923+
return GetDirectory(_basePath, createIfNotExists);
924+
}
925+
926+
private static string GetDirectory(string basePath, bool createIfNotExists = true)
927+
{
928+
var baseDir = basePath;
929+
930+
if (!string.IsNullOrEmpty(baseDir))
931+
{
932+
if (!Path.IsPathRooted(baseDir)) baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, baseDir);
933+
}
934+
else
935+
{
936+
baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DirectoryBuffer);
937+
}
938+
939+
string dir = Path.Combine(baseDir, DirectoryObservations);
918940
if (createIfNotExists && !Directory.Exists(dir)) Directory.CreateDirectory(dir);
919941

920942
return dir;
921943
}
922944

923-
private static string GetCurrentDirectory(bool createIfNotExists = true)
945+
private string GetCurrentDirectory(bool createIfNotExists = true)
946+
{
947+
return GetCurrentDirectory(_basePath, createIfNotExists);
948+
}
949+
950+
private static string GetCurrentDirectory(string basePath, bool createIfNotExists = true)
924951
{
925-
string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DirectoryBuffer, DirectoryObservations, DirectoryCurrent);
952+
var baseDir = basePath;
953+
954+
if (!string.IsNullOrEmpty(baseDir))
955+
{
956+
if (!Path.IsPathRooted(baseDir)) baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, baseDir);
957+
}
958+
else
959+
{
960+
baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DirectoryBuffer);
961+
}
962+
963+
string dir = Path.Combine(baseDir, DirectoryObservations, DirectoryCurrent);
926964
if (createIfNotExists && !Directory.Exists(dir)) Directory.CreateDirectory(dir);
927965

928966
return dir;

libraries/MTConnect.NET-Common/Configurations/AgentApplicationConfiguration.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ public class AgentApplicationConfiguration : AgentConfiguration, IAgentApplicati
5454
[JsonPropertyName("durable")]
5555
public bool Durable { get; set; }
5656

57+
/// <summary>
58+
/// The base path to the directory to write the File Buffers when 'durable = true'
59+
/// </summary>
60+
[JsonPropertyName("durableBufferPath")]
61+
public string DurableBufferPath { get; set; }
62+
5763
/// <summary>
5864
/// Gets or Sets whether the durable Agent buffers use Compression
5965
/// </summary>

libraries/MTConnect.NET-Common/Configurations/IAgentApplicationConfiguration.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// TrakHound Inc. licenses this file to you under the MIT license.
33

44
using System.Collections.Generic;
5+
using System.Text.Json.Serialization;
56

67
namespace MTConnect.Configurations
78
{
@@ -43,6 +44,11 @@ public interface IAgentApplicationConfiguration : IAgentConfiguration
4344
/// </summary>
4445
bool Durable { get; set; }
4546

47+
/// <summary>
48+
/// The base path to the directory to write the File Buffers when 'durable = true'
49+
/// </summary>
50+
string DurableBufferPath { get; set; }
51+
4652
/// <summary>
4753
/// Gets or Sets whether the durable Agent buffers use Compression
4854
/// </summary>

0 commit comments

Comments
 (0)