Skip to content
Merged
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
1 change: 0 additions & 1 deletion Runtime/BacktraceClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,6 @@ public void Refresh()
}
_nativeClient = NativeClientFactory.CreateNativeClient(Configuration, name, _breadcrumbs, scopedAttributes, nativeAttachments);
AttributeProvider.AddDynamicAttributeProvider(_nativeClient);
Database.EnableBreadcrumbsSupport();
}
}

Expand Down
28 changes: 27 additions & 1 deletion Runtime/BacktraceDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,8 @@ private void Start()
LoadReports();
// remove orphaned files
RemoveOrphaned();
// enable breadcrumb support after finishing loading reports
EnableBreadcrumbsSupport();
if (DatabaseSettings.AutoSendMode)
{
_lastConnection = Time.unscaledTime;
Expand Down Expand Up @@ -622,7 +624,20 @@ protected virtual void LoadReports()
{
return;
}
var files = BacktraceDatabaseFileContext.GetRecords();
var files = BacktraceDatabaseFileContext.GetRecords().ToArray();
if (files.Length == 0)
{
return;
}
string breadcrumbPath = string.Empty;
string breadcrumbArchive = string.Empty;

if (Breadcrumbs != null)
{
breadcrumbPath = Breadcrumbs.GetBreadcrumbLogPath();
breadcrumbArchive = Breadcrumbs.Archive();
}
var shouldUseArchiveBreadcrumbArchive = !string.IsNullOrEmpty(breadcrumbArchive);
foreach (var file in files)
{
var record = BacktraceDatabaseRecord.ReadFromFile(file);
Expand All @@ -635,6 +650,17 @@ protected virtual void LoadReports()
BacktraceDatabaseFileContext.Delete(record);
continue;
}

// Use always the breadcrumb archive instead of the old breadcrumb file.
if (shouldUseArchiveBreadcrumbArchive)
{
bool replacementResult = record.Attachments.Remove(breadcrumbPath);
if (replacementResult)
{
record.Attachments.Add(breadcrumbArchive);
}
}

BacktraceDatabaseContext.Add(record);
ValidateDatabaseSize();
record.Unlock();
Expand Down
19 changes: 19 additions & 0 deletions Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ internal sealed class BacktraceBreadcrumbs : IBacktraceBreadcrumbs
/// Determine if breadcrumbs are enabled
/// </summary>
private bool _enabled = false;

public BacktraceBreadcrumbs(IBacktraceLogManager logManager, BacktraceBreadcrumbType level, UnityEngineLogLevel unityLogLevel)
{
BreadcrumbsLevel = level;
Expand Down Expand Up @@ -191,5 +192,23 @@ public static bool CanStoreBreadcrumbs(UnityEngineLogLevel logLevel, BacktraceBr
{
return backtraceBreadcrumbsLevel != BacktraceBreadcrumbType.None && logLevel != UnityEngineLogLevel.None;
}
/// <summary>
/// Archives a breadcrumb file from the previous session.
/// </summary>
/// <returns>
/// Path to the archived breadcrumb library.
/// If the operation failed then the method returns
/// an empty string.
/// </returns>
public string Archive()
{
var breadcrumbArchiveManager = LogManager as IArchiveableBreadcrumbManager;
if (breadcrumbArchiveManager == null)
{
return string.Empty;
}
return breadcrumbArchiveManager.Archive();

}
}
}
11 changes: 11 additions & 0 deletions Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Backtrace.Unity.Model.Breadcrumbs
{
internal interface IArchiveableBreadcrumbManager
{
/// <summary>
/// Archive current breadcrumb file
/// </summary>
/// <returns>Path to the archived breadcurmb file if archiving process went successfully. Otherwise empty string.</returns>
string Archive();
}
}
11 changes: 11 additions & 0 deletions Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Runtime/Model/Breadcrumbs/IBacktraceBreadcrumbs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,6 @@ public interface IBacktraceBreadcrumbs
double BreadcrumbId();
void UnregisterEvents();
void Update();
string Archive();
}
}
23 changes: 21 additions & 2 deletions Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace Backtrace.Unity.Model.Breadcrumbs.Storage
{
internal sealed class BacktraceStorageLogManager : IBacktraceLogManager
internal sealed class BacktraceStorageLogManager : IBacktraceLogManager, IArchiveableBreadcrumbManager
{
/// <summary>
/// Path to the breadcrumbs file
Expand Down Expand Up @@ -86,6 +86,11 @@ public long BreadcrumbsSize
/// </summary>
private readonly Queue<long> _logSize = new Queue<long>();

/// <summary>
/// Breadcrumb storage directory
/// </summary>
private readonly string _storagePath;

internal IBreadcrumbFile BreadcrumbFile { get; set; }

public BacktraceStorageLogManager(string storagePath)
Expand All @@ -94,7 +99,8 @@ public BacktraceStorageLogManager(string storagePath)
{
throw new ArgumentException("Breadcrumbs storage path is null or empty");
}
BreadcrumbsFilePath = Path.Combine(storagePath, BreadcrumbLogFileName);
_storagePath = storagePath;
BreadcrumbsFilePath = Path.Combine(_storagePath, BreadcrumbLogFileName);
BreadcrumbFile = new BreadcrumbFile(BreadcrumbsFilePath);
}

Expand Down Expand Up @@ -317,5 +323,18 @@ public double BreadcrumbId()
{
return _breadcrumbId;
}

public string Archive()
{
if (!File.Exists(BreadcrumbsFilePath))
{
return string.Empty;
}

const string archivePattern = "{0}-1";
var copyPath = Path.Combine(_storagePath, string.Format(archivePattern, BreadcrumbLogFilePrefix));
File.Copy(BreadcrumbsFilePath, copyPath, true);
return copyPath;
}
}
}