Example #1
0
        protected override void Dispose(bool disposing)
        {
            if (!PreventUploadComplete)
            {
                base.Dispose(disposing);

                FileHash = IOExtensions.GetAsHex(md5Hasher.TransformFinalBlock());
                md5Hasher.Dispose();
            }
        }
Example #2
0
        public async Task Execute()
        {
            while (true)
            {
                var read = await inputStream.ReadAsync(buffer).ConfigureAwait(false);

                TotalSizeRead += read;

                if (read == 0) // nothing left to read
                {
                    FileHash = IOExtensions.GetAsHex(md5Hasher.TransformFinalBlock());
                    headers["Content-MD5"] = FileHash;
                    storage.Batch(accessor =>
                    {
                        accessor.CompleteFileUpload(filename);
                        putTriggers.Apply(trigger => trigger.AfterUpload(filename, headers));
                    });
                    return; // task is done
                }

                int  retries = 50;
                bool shouldRetry;

                do
                {
                    try
                    {
                        storage.Batch(accessor =>
                        {
                            var hashKey = accessor.InsertPage(buffer, read);
                            accessor.AssociatePage(filename, hashKey, pos, read);
                            putTriggers.Apply(trigger => trigger.OnUpload(filename, headers, hashKey, pos, read));
                        });

                        shouldRetry = false;
                    }
                    catch (ConcurrencyException)
                    {
                        if (retries-- > 0)
                        {
                            shouldRetry = true;
                            Thread.Sleep(50);
                            continue;
                        }

                        throw;
                    }
                } while (shouldRetry);

                md5Hasher.TransformBlock(buffer, 0, read);

                pos++;
            }
        }