aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/Sync/TargetDataProvider.cs
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2017-01-18 01:05:54 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2017-01-18 01:05:54 -0500
commitc1c4726fbdba6f6b66f0c3e394ad7f1538983653 (patch)
treed4a5c32594f791ed248ce936701816d187e202a6 /Emby.Server.Implementations/Sync/TargetDataProvider.cs
parent80a9bbf5ef624c7e60835649192aaeeb521a7472 (diff)
update data.json locking for sync
Diffstat (limited to 'Emby.Server.Implementations/Sync/TargetDataProvider.cs')
-rw-r--r--Emby.Server.Implementations/Sync/TargetDataProvider.cs32
1 files changed, 26 insertions, 6 deletions
diff --git a/Emby.Server.Implementations/Sync/TargetDataProvider.cs b/Emby.Server.Implementations/Sync/TargetDataProvider.cs
index fbd82aa7a..cac8f0cd8 100644
--- a/Emby.Server.Implementations/Sync/TargetDataProvider.cs
+++ b/Emby.Server.Implementations/Sync/TargetDataProvider.cs
@@ -19,6 +19,7 @@ namespace Emby.Server.Implementations.Sync
private readonly IServerSyncProvider _provider;
private readonly SemaphoreSlim _dataLock = new SemaphoreSlim(1, 1);
+ private readonly SemaphoreSlim _remoteDataLock = new SemaphoreSlim(1, 1);
private List<LocalItem> _items;
private readonly ILogger _logger;
@@ -63,15 +64,24 @@ namespace Emby.Server.Implementations.Sync
{
_logger.Debug("Getting {0} from {1}", string.Join(MediaSync.PathSeparatorString, GetRemotePath().ToArray()), _provider.Name);
- var fileResult = await _provider.GetFiles(GetRemotePath().ToArray(), _target, cancellationToken).ConfigureAwait(false);
+ await _remoteDataLock.WaitAsync(cancellationToken).ConfigureAwait(false);
- if (fileResult.Items.Length > 0)
+ try
{
- using (var stream = await _provider.GetFile(fileResult.Items[0].FullName, _target, new Progress<double>(), cancellationToken))
+ var fileResult = await _provider.GetFiles(GetRemotePath().ToArray(), _target, cancellationToken).ConfigureAwait(false);
+
+ if (fileResult.Items.Length > 0)
{
- return _json.DeserializeFromStream<List<LocalItem>>(stream);
+ using (var stream = await _provider.GetFile(fileResult.Items[0].FullName, _target, new Progress<double>(), cancellationToken))
+ {
+ return _json.DeserializeFromStream<List<LocalItem>>(stream);
+ }
}
}
+ finally
+ {
+ _remoteDataLock.Release();
+ }
return new List<LocalItem>();
}
@@ -93,9 +103,19 @@ namespace Emby.Server.Implementations.Sync
// Save to sync provider
stream.Position = 0;
var remotePath = GetRemotePath();
- _logger.Debug("Saving data.json to {0}. Remote path: {1}", _provider.Name, string.Join("/", remotePath));
- await _provider.SendFile(stream, remotePath, _target, new Progress<double>(), cancellationToken).ConfigureAwait(false);
+ await _remoteDataLock.WaitAsync(cancellationToken).ConfigureAwait(false);
+
+ try
+ {
+ _logger.Debug("Saving data.json to {0}. Remote path: {1}", _provider.Name, string.Join("/", remotePath));
+
+ await _provider.SendFile(stream, remotePath, _target, new Progress<double>(), cancellationToken).ConfigureAwait(false);
+ }
+ finally
+ {
+ _remoteDataLock.Release();
+ }
}
}