Skip to content

Commit fc076b0

Browse files
authored
Bugfix/next session breadcrumbs path (#159)
* WiP * Finished breadcrumbs multi session support * override file if the breadcrumb file exists
1 parent 9819c7a commit fc076b0

File tree

7 files changed

+90
-4
lines changed

7 files changed

+90
-4
lines changed

Runtime/BacktraceClient.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,6 @@ public void Refresh()
570570
}
571571
_nativeClient = NativeClientFactory.CreateNativeClient(Configuration, name, _breadcrumbs, scopedAttributes, nativeAttachments);
572572
AttributeProvider.AddDynamicAttributeProvider(_nativeClient);
573-
Database.EnableBreadcrumbsSupport();
574573
}
575574
}
576575

Runtime/BacktraceDatabase.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,8 @@ private void Start()
265265
LoadReports();
266266
// remove orphaned files
267267
RemoveOrphaned();
268+
// enable breadcrumb support after finishing loading reports
269+
EnableBreadcrumbsSupport();
268270
if (DatabaseSettings.AutoSendMode)
269271
{
270272
_lastConnection = Time.unscaledTime;
@@ -622,7 +624,20 @@ protected virtual void LoadReports()
622624
{
623625
return;
624626
}
625-
var files = BacktraceDatabaseFileContext.GetRecords();
627+
var files = BacktraceDatabaseFileContext.GetRecords().ToArray();
628+
if (files.Length == 0)
629+
{
630+
return;
631+
}
632+
string breadcrumbPath = string.Empty;
633+
string breadcrumbArchive = string.Empty;
634+
635+
if (Breadcrumbs != null)
636+
{
637+
breadcrumbPath = Breadcrumbs.GetBreadcrumbLogPath();
638+
breadcrumbArchive = Breadcrumbs.Archive();
639+
}
640+
var shouldUseArchiveBreadcrumbArchive = !string.IsNullOrEmpty(breadcrumbArchive);
626641
foreach (var file in files)
627642
{
628643
var record = BacktraceDatabaseRecord.ReadFromFile(file);
@@ -635,6 +650,17 @@ protected virtual void LoadReports()
635650
BacktraceDatabaseFileContext.Delete(record);
636651
continue;
637652
}
653+
654+
// Use always the breadcrumb archive instead of the old breadcrumb file.
655+
if (shouldUseArchiveBreadcrumbArchive)
656+
{
657+
bool replacementResult = record.Attachments.Remove(breadcrumbPath);
658+
if (replacementResult)
659+
{
660+
record.Attachments.Add(breadcrumbArchive);
661+
}
662+
}
663+
638664
BacktraceDatabaseContext.Add(record);
639665
ValidateDatabaseSize();
640666
record.Unlock();

Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ internal sealed class BacktraceBreadcrumbs : IBacktraceBreadcrumbs
2929
/// Determine if breadcrumbs are enabled
3030
/// </summary>
3131
private bool _enabled = false;
32+
3233
public BacktraceBreadcrumbs(IBacktraceLogManager logManager, BacktraceBreadcrumbType level, UnityEngineLogLevel unityLogLevel)
3334
{
3435
BreadcrumbsLevel = level;
@@ -191,5 +192,23 @@ public static bool CanStoreBreadcrumbs(UnityEngineLogLevel logLevel, BacktraceBr
191192
{
192193
return backtraceBreadcrumbsLevel != BacktraceBreadcrumbType.None && logLevel != UnityEngineLogLevel.None;
193194
}
195+
/// <summary>
196+
/// Archives a breadcrumb file from the previous session.
197+
/// </summary>
198+
/// <returns>
199+
/// Path to the archived breadcrumb library.
200+
/// If the operation failed then the method returns
201+
/// an empty string.
202+
/// </returns>
203+
public string Archive()
204+
{
205+
var breadcrumbArchiveManager = LogManager as IArchiveableBreadcrumbManager;
206+
if (breadcrumbArchiveManager == null)
207+
{
208+
return string.Empty;
209+
}
210+
return breadcrumbArchiveManager.Archive();
211+
212+
}
194213
}
195214
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace Backtrace.Unity.Model.Breadcrumbs
2+
{
3+
internal interface IArchiveableBreadcrumbManager
4+
{
5+
/// <summary>
6+
/// Archive current breadcrumb file
7+
/// </summary>
8+
/// <returns>Path to the archived breadcurmb file if archiving process went successfully. Otherwise empty string.</returns>
9+
string Archive();
10+
}
11+
}

Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Runtime/Model/Breadcrumbs/IBacktraceBreadcrumbs.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,6 @@ public interface IBacktraceBreadcrumbs
2929
double BreadcrumbId();
3030
void UnregisterEvents();
3131
void Update();
32+
string Archive();
3233
}
3334
}

Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Backtrace.Unity.Model.Breadcrumbs.Storage
99
{
10-
internal sealed class BacktraceStorageLogManager : IBacktraceLogManager
10+
internal sealed class BacktraceStorageLogManager : IBacktraceLogManager, IArchiveableBreadcrumbManager
1111
{
1212
/// <summary>
1313
/// Path to the breadcrumbs file
@@ -86,6 +86,11 @@ public long BreadcrumbsSize
8686
/// </summary>
8787
private readonly Queue<long> _logSize = new Queue<long>();
8888

89+
/// <summary>
90+
/// Breadcrumb storage directory
91+
/// </summary>
92+
private readonly string _storagePath;
93+
8994
internal IBreadcrumbFile BreadcrumbFile { get; set; }
9095

9196
public BacktraceStorageLogManager(string storagePath)
@@ -94,7 +99,8 @@ public BacktraceStorageLogManager(string storagePath)
9499
{
95100
throw new ArgumentException("Breadcrumbs storage path is null or empty");
96101
}
97-
BreadcrumbsFilePath = Path.Combine(storagePath, BreadcrumbLogFileName);
102+
_storagePath = storagePath;
103+
BreadcrumbsFilePath = Path.Combine(_storagePath, BreadcrumbLogFileName);
98104
BreadcrumbFile = new BreadcrumbFile(BreadcrumbsFilePath);
99105
}
100106

@@ -317,5 +323,18 @@ public double BreadcrumbId()
317323
{
318324
return _breadcrumbId;
319325
}
326+
327+
public string Archive()
328+
{
329+
if (!File.Exists(BreadcrumbsFilePath))
330+
{
331+
return string.Empty;
332+
}
333+
334+
const string archivePattern = "{0}-1";
335+
var copyPath = Path.Combine(_storagePath, string.Format(archivePattern, BreadcrumbLogFilePrefix));
336+
File.Copy(BreadcrumbsFilePath, copyPath, true);
337+
return copyPath;
338+
}
320339
}
321340
}

0 commit comments

Comments
 (0)