update data.json locking for sync

This commit is contained in:
Luke Pulverenti 2017-01-18 01:05:54 -05:00
parent 80a9bbf5ef
commit c1c4726fbd

View File

@ -19,6 +19,7 @@ namespace Emby.Server.Implementations.Sync
private readonly IServerSyncProvider _provider; private readonly IServerSyncProvider _provider;
private readonly SemaphoreSlim _dataLock = new SemaphoreSlim(1, 1); private readonly SemaphoreSlim _dataLock = new SemaphoreSlim(1, 1);
private readonly SemaphoreSlim _remoteDataLock = new SemaphoreSlim(1, 1);
private List<LocalItem> _items; private List<LocalItem> _items;
private readonly ILogger _logger; 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); _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>(); return new List<LocalItem>();
} }
@ -93,9 +103,19 @@ namespace Emby.Server.Implementations.Sync
// Save to sync provider // Save to sync provider
stream.Position = 0; stream.Position = 0;
var remotePath = GetRemotePath(); 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();
}
} }
} }