Example #1
0
        public async Task <ResponseModel> Write(string collectionName, HttpRequest request)
        {
            try
            {
                var collectionId = collectionName.ToHash();
                var timer        = Stopwatch.StartNew();

                var payload = new MemoryStream();
                await request.Body.CopyToAsync(payload);

                if (request.ContentLength.Value != payload.Length)
                {
                    throw new DataMisalignedException();
                }

                var compressed = payload.ToArray();
                var messageBuf = QuickLZ.decompress(compressed);

                // A write request is either a request to write new data
                // or a request to concat two existing pages.

                if (request.Query.ContainsKey("concat") &&
                    request.Query["concat"].ToArray()[0].ToLower() == "true")
                {
                    await _data.Concat(collectionId, Deserialize(messageBuf));

                    return(new ResponseModel());
                }
                else
                {
                    this.Log(string.Format("serialized {0} bytes in {1}", messageBuf.Length, timer.Elapsed));

                    timer.Restart();

                    MemoryStream responseStream;

                    lock (Sync)
                    {
                        this.Log("waited for synchronization for {0}", timer.Elapsed);

                        timer.Restart();

                        responseStream = _data.Write(collectionId, messageBuf);

                        timer.Stop();

                        var t = timer.ElapsedMilliseconds > 0 ? timer.ElapsedMilliseconds : 1;

                        this.Log(string.Format(
                                     "wrote {0} bytes in {1}: {2} bytes/ms",
                                     messageBuf.Length, timer.Elapsed, messageBuf.Length / t));
                    }

                    return(new ResponseModel {
                        Stream = responseStream, MediaType = "application/octet-stream"
                    });
                }
            }
            catch (Exception ex)
            {
                this.Log(ex);

                throw;
            }
        }