public async Task Append(string streamName, byte[] data, long expectedStreamVersion = -1)
        {
            int retry = 0;

            try
            {
                var azurehelper = new AzureBlobAppenderHelper(this.storage, this.container, this.options);
                await azurehelper.WriteContent(streamName, data, expectedStreamVersion);
            }
            catch (ConcurrentIndexException)
            {
                while (retry < retrypolicy.Length)
                {
                    await Task.Delay(retrypolicy[retry]);
                    await this.Append(streamName, data, expectedStreamVersion);
                    retry++;
                }

                throw;
            }
            catch (StorageException ex)
            {
                var requestInformation = ex.RequestInformation;
                var extended = requestInformation.ExtendedErrorInformation;
                throw;
            }
        }
Beispiel #2
0
        public async Task Append(string streamName, byte[] data, long expectedStreamVersion = -1)
        {
            int retry = 0;

            try
            {
                var azurehelper = new AzureBlobAppenderHelper(this.storage, this.container, this.options);
                await azurehelper.WriteContent(streamName, data, expectedStreamVersion);
            }
            catch (ConcurrentIndexException)
            {
                while (retry < retrypolicy.Length)
                {
                    await Task.Delay(retrypolicy[retry]);

                    await this.Append(streamName, data, expectedStreamVersion);

                    retry++;
                }

                throw;
            }
            catch (StorageException ex)
            {
                var requestInformation = ex.RequestInformation;
                var extended           = requestInformation.ExtendedErrorInformation;
                throw;
            }
        }
 public async Task<DataWithVersion[]> ReadRecords(string streamName, long afterVersion, int maxCount)
 {
     try
     {
         var azurehelper = new AzureBlobAppenderHelper(this.storage, this.container, this.options);
         var items = await azurehelper.ReadStreamCache(streamName);
         return items.Where(x => x.Version > afterVersion && x.Version <= maxCount).Select(x => new DataWithVersion(x.Version, x.Bytes)).ToArray();
     }
     catch (StorageException ex)
     {
         var requestInformation = ex.RequestInformation;
         var extended = requestInformation.ExtendedErrorInformation;
         throw;
     }            
 }
Beispiel #4
0
        public async Task <DataWithVersion[]> ReadRecords(string streamName, long afterVersion, int maxCount)
        {
            try
            {
                var azurehelper = new AzureBlobAppenderHelper(this.storage, this.container, this.options);
                var items       = await azurehelper.ReadStreamCache(streamName);

                return(items.Where(x => x.Version > afterVersion && x.Version <= maxCount).Select(x => new DataWithVersion(x.Version, x.Bytes)).ToArray());
            }
            catch (StorageException ex)
            {
                var requestInformation = ex.RequestInformation;
                var extended           = requestInformation.ExtendedErrorInformation;
                throw;
            }
        }
Beispiel #5
0
        public async Task <DataWithName[]> ReadRecords(long afterVersion, int maxCount)
        {
            try
            {
                var azurehelper = new AzureBlobAppenderHelper(this.storage, this.container, this.options);
                var items       = await azurehelper.ReadMasterCache();

                return(items.Where(x => x.Version > afterVersion && x.Version <= maxCount).Select(x => new DataWithName(x.Name, x.Bytes)).ToArray());
            }
            catch (StorageException ex)
            {
                if (ex.HResult == 404)
                {
                    return(new DataWithName[0]);
                }

                var requestInformation = ex.RequestInformation;
                var extended           = requestInformation.ExtendedErrorInformation;
                throw;
            }
        }
        public async Task WriteAll()
        {
            var helper = new AzureBlobAppenderHelper(storage, container, options);

            var master = helper.GetMasterCache();

            master.StreamWriteSizeInBytes = 1024 * 1024 * 4;

            using (var masterindex = new MemoryStream())
            {
                var writer = new StreamWriter(masterindex);
                using (var stream = new MemoryStream())
                {
                    foreach (var record in records)
                    {
                        record.WriteContentToStream(stream);
                        var hashhex = string.Join(String.Empty, record.Hash.Select(x => x.ToString("x2")));
                        writer.WriteLine(String.Join("\t", record.Name, record.Version, hashhex, this.options.NamingPolicy.GetStreamPath(record.Name)));
                    }

                    await writer.FlushAsync();

                    stream.Position      = 0;
                    masterindex.Position = 0;

                    await master.CreateOrReplaceAsync();

                    await master.AppendFromStreamAsync(stream);

                    var indexblob = storage.CreateCloudBlobClient().GetContainerReference(container).GetAppendBlobReference(this.options.NamingPolicy.GetIndexPath());
                    await indexblob.CreateOrReplaceAsync();

                    await indexblob.AppendFromStreamAsync(masterindex);

                    var streams = GetNamedStreams(helper);
                    await Task.WhenAll(streams);
                }
            }
        }
        private IEnumerable <Task> GetNamedStreams(AzureBlobAppenderHelper helper)
        {
            foreach (var name in names)
            {
                yield return(Task.Run(async() =>
                {
                    using (var indexstream = new MemoryStream())
                    {
                        var writer = new StreamWriter(indexstream);

                        using (var s = new MemoryStream())
                        {
                            var blobstream = helper.GetStreamCache(name);
                            blobstream.StreamWriteSizeInBytes = 1024 * 1024 * 3;

                            foreach (var record in this.records.Where(x => x.Name.Equals(name)).OrderBy(x => x.Version))
                            {
                                record.WriteContentToStream(s);
                                var hashhex = string.Join(String.Empty, record.Hash.Select(x => x.ToString("x2")));
                                writer.WriteLine(String.Join("\t", record.Name, record.Version, hashhex, blobstream.Name));
                            }

                            await writer.FlushAsync();

                            s.Position = 0;
                            indexstream.Position = 0;

                            var indexblob = storage.CreateCloudBlobClient().GetContainerReference(container).GetAppendBlobReference(this.options.NamingPolicy.GetIndexPath(name));
                            await indexblob.CreateOrReplaceAsync();
                            await indexblob.AppendFromStreamAsync(indexstream);
                            await blobstream.CreateOrReplaceAsync();
                            await blobstream.AppendFromStreamAsync(s);
                        }
                    }
                }));
            }
        }
        public async Task WriteAll()
        {
            var helper = new AzureBlobAppenderHelper(storage, container, options);

            var master = helper.GetMasterCache();
            master.StreamWriteSizeInBytes = 1024 * 1024 * 4;

            using (var masterindex = new MemoryStream())
            {
                var writer = new StreamWriter(masterindex);
                using (var stream = new MemoryStream())
                {
                    foreach (var record in records)
                    {
                        record.WriteContentToStream(stream);
                        var hashhex = string.Join(String.Empty, record.Hash.Select(x => x.ToString("x2")));
                        writer.WriteLine(String.Join("\t", record.Name, record.Version, hashhex, this.options.NamingPolicy.GetStreamPath(record.Name)));
                    }

                    await writer.FlushAsync();

                    stream.Position = 0;
                    masterindex.Position = 0;

                    await master.CreateOrReplaceAsync();
                    await master.AppendFromStreamAsync(stream);
                    
                    var indexblob = storage.CreateCloudBlobClient().GetContainerReference(container).GetAppendBlobReference(this.options.NamingPolicy.GetIndexPath());
                    await indexblob.CreateOrReplaceAsync();
                    await indexblob.AppendFromStreamAsync(masterindex);

                    var streams = GetNamedStreams(helper);
                    await Task.WhenAll(streams);
                }
            }
        }
        public async Task<DataWithName[]> ReadRecords(long afterVersion, int maxCount)
        {
            try
            {
                var azurehelper = new AzureBlobAppenderHelper(this.storage, this.container, this.options);
                var items = await azurehelper.ReadMasterCache();
                return items.Where(x => x.Version > afterVersion && x.Version <= maxCount).Select(x => new DataWithName(x.Name, x.Bytes)).ToArray();
            }
            catch (StorageException ex)
            {
                if (ex.HResult == 404)
                {
                    return new DataWithName[0];
                }

                var requestInformation = ex.RequestInformation;
                var extended = requestInformation.ExtendedErrorInformation;
                throw;
            }
            
        }
        private IEnumerable<Task> GetNamedStreams(AzureBlobAppenderHelper helper)
        {
            foreach (var name in names)
            {
                yield return Task.Run(async () =>
                {
                    using (var indexstream = new MemoryStream())
                    {
                        var writer = new StreamWriter(indexstream);
                        
                        using (var s = new MemoryStream())
                        {
                            var blobstream = helper.GetStreamCache(name);
                            blobstream.StreamWriteSizeInBytes = 1024*1024*3;

                            foreach (var record in this.records.Where(x => x.Name.Equals(name)).OrderBy(x => x.Version))
                            {
                                record.WriteContentToStream(s);
                                var hashhex = string.Join(String.Empty, record.Hash.Select(x => x.ToString("x2")));
                                writer.WriteLine(String.Join("\t", record.Name, record.Version, hashhex, blobstream.Name));                                
                            }

                            await writer.FlushAsync();

                            s.Position = 0;
                            indexstream.Position = 0;

                            var indexblob = storage.CreateCloudBlobClient().GetContainerReference(container).GetAppendBlobReference(this.options.NamingPolicy.GetIndexPath(name));
                            await indexblob.CreateOrReplaceAsync();
                            await indexblob.AppendFromStreamAsync(indexstream);
                            await blobstream.CreateOrReplaceAsync();
                            await blobstream.AppendFromStreamAsync(s);
                        }
                    }
                });
            }
        }