Пример #1
0
 private static int SizeOf(VectorStorage value, out RetainedMemory <byte> temporaryBuffer,
                           SerializationFormat format = default,
                           Timestamp timestamp        = default)
 {
     return(BinarySerializer.SizeOf(new VectorStorage <T>(value), out temporaryBuffer,
                                    format, timestamp));
 }
Пример #2
0
        private IEnumerable <DirectBuffer> AsEnumerable(ReadOnlyTransaction txn, RetainedMemory <byte> key)
        {
            if (((int)OpenFlags & (int)DbFlags.DuplicatesSort) == 0)
            {
                throw new InvalidOperationException("AsEnumerable overload with key parameter should only be provided for dupsorted dbs");
            }

            try
            {
                var          key1  = new DirectBuffer(key.GetSpan());
                DirectBuffer value = default;
                using (var c = OpenReadOnlyCursor(txn))
                {
                    if (c.TryGet(ref key1, ref value, CursorGetOption.SetKey) &&
                        c.TryGet(ref key1, ref value, CursorGetOption.FirstDuplicate))
                    {
                        yield return(value);

                        while (c.TryGet(ref key1, ref value, CursorGetOption.NextDuplicate))
                        {
                            yield return(value);
                        }
                    }
                }
            }
            finally
            {
                key.Dispose();
            }
        }
Пример #3
0
 private static int Write(VectorStorage value,
                          ref DirectBuffer pinnedDestination,
                          RetainedMemory <byte> temporaryBuffer = default,
                          SerializationFormat format            = default,
                          Timestamp timestamp = default)
 {
     return(BinarySerializer.Write(new VectorStorage <T>(value), ref pinnedDestination,
                                   temporaryBuffer, format, timestamp));
 }
Пример #4
0
        public void CannotRetainDisposed(Func <int, RetainableMemory <byte> > factory)
        {
            var memory = factory(32 * 1024);

            ((IDisposable)memory).Dispose();

            Assert.Throws <ObjectDisposedException>(() => { var _ = memory.Retain(); });
            Assert.Throws <ObjectDisposedException>(() => { var _ = new RetainedMemory <byte>(memory, 0, memory.Length, false); });
        }
Пример #5
0
        internal static DirectBuffer ToDirectBuffer(this RetainedMemory <byte> rm)
        {
            if (!rm.IsPinned)
            {
                ThrowHelper.ThrowInvalidOperationException("Cannot create DirectBuffer from RetainedMemory because it is not pinned.");
            }

            return(new DirectBuffer(rm));
        }
Пример #6
0
 public static int SizeOf(T value, out RetainedMemory <byte> temporaryBuffer, out bool withPadding)
 {
     // offset 16 to allow writing header + length + ts without copy
     Debug.Assert(DataTypeHeader.Size + 4 + 8 == 16);
     Debug.Assert(BinarySerializer.BC_PADDING == 16);
     temporaryBuffer = JsonSerializer.SerializeToRetainedMemory(value, BinarySerializer.BC_PADDING);
     withPadding     = true;
     return(temporaryBuffer.Length - BinarySerializer.BC_PADDING);
 }
Пример #7
0
        public static bool TryGetArray(this RetainedMemory <byte> rm, out ArraySegment <byte> segment)
        {
            // throw new NotImplementedException("What about R-edM start & length!?"); // TODO fix & test
            if (MemoryMarshal.TryGetArray(rm.Memory, out segment))
            {
                segment = new ArraySegment <byte>(segment.Array, segment.Offset + rm._start, rm.Length);
                return(true);
            }

            return(false);
        }
Пример #8
0
        public int SizeOf(VectorStorage <T> value, out RetainedMemory <byte> temporaryBuffer, out bool withPadding)
        {
            if (value.Storage.Stride != 1 || !TypeHelper <T> .IsFixedSize)
            {
                ThrowHelper.ThrowNotSupportedException();
            }

            temporaryBuffer = default;
            withPadding     = default;
            return(4 + value.Storage.Length * Unsafe.SizeOf <T>());
        }
Пример #9
0
        public void CannotRetainDisposed()
        {
            var path = TestUtils.GetPath();
            var pool = new SharedMemoryPool(path, 10 * 1024, (Wpid)1, rmMaxBufferLength: SharedMemoryPool.RmMaxPoolBufferLength);

            var memory = pool.RentMemory(32 * 1024);

            ((IDisposable)memory).Dispose();

            Assert.Throws <ObjectDisposedException>(() => { var _ = memory.Retain(); });
            Assert.Throws <ObjectDisposedException>(() => { var _ = new RetainedMemory <byte>(memory, 0, memory.Length, false); });

            pool.Dispose();
        }
Пример #10
0
        public void CouldCreateRetainedMemoryFromArray()
        {
            var array = new byte[100];

            using var rm = new RetainedMemory <byte>(array);

            using var rmc = rm.Clone(10);

            GC.Collect(2, GCCollectionMode.Forced, true);
            GC.WaitForPendingFinalizers();
            GC.Collect(2, GCCollectionMode.Forced, true);
            GC.WaitForPendingFinalizers();

            rmc.GetSpan()[1] = 1;

            Assert.AreEqual(1, array[11]);
        }
Пример #11
0
        public void OffsetsAreOk()
        {
            var array = new byte[100];

            using var rm = new RetainedMemory <byte>(ArrayMemory <byte> .Create(array, 50, 50, true), 25, 25, true);

            // 85 - 95
            using var rmc = rm.Clone(10, 10);

            GC.Collect(2, GCCollectionMode.Forced, true);
            GC.WaitForPendingFinalizers();
            GC.Collect(2, GCCollectionMode.Forced, true);
            GC.WaitForPendingFinalizers();

            rmc.GetSpan()[5] = 1;

            Assert.AreEqual(1, array[90]);
        }
Пример #12
0
        public void ThreadStaticBufferVsSharedPool()
        {
            //Case | MOPS | Elapsed | GC0 | GC1 | GC2 | Memory
            //    ------------------------------------------ -| --------:| ---------:| ------:| ------:| ------:| --------:
            //Direct ArrayPool with StaticBufferSize +1 | 37.04 | 27 ms | 0.0 | 0.0 | 0.0 | 0.008 MB
            //Threadlocal | 34.48 | 29 ms | 0.0 | 0.0 | 0.0 | 0.008 MB
            //    Direct ArrayPool with StaticBufferSize | 34.48 | 29 ms | 0.0 | 0.0 | 0.0 | 0.008 MB
            //    GetBuffer via pool                         | 12.20 | 82 ms | 0.0 | 0.0 | 0.0 | 0.008 MB
            //    GC StaticBufferSize + 1 | 1.49 | 673 ms | 2610.0 | 0.0 | 0.0 | 5.798 MB
            //    GC StaticBufferSize | 1.48 | 675 ms | 2610.0 | 0.0 | 0.0 | 5.795 MB
            for (int r = 0; r < 10; r++)
            {
                int count = (int)TestUtils.GetBenchCount(1_000_000);

                var sum = 0L;

                //using (Benchmark.Run("ThreadStatic", count))
                //{
                //    for (var i = 0; i < count; i++)
                //    {
                //        var wrapper = BufferPool.StaticBuffer;
                //        // using (var wrapper = BufferPool.StaticBufferMemory)
                //        {
                //            var s = wrapper.Memory.Span;
                //            s[0] = 123;
                //            sum += s[0] + s[1];
                //        }
                //    }
                //    Assert.IsTrue(sum > 0);
                //}

                using (Benchmark.Run("BP.Retain", count))
                {
                    sum = 0L;
                    for (var i = 0; i < count; i++)
                    {
                        using (var wrapper = BufferPool.Retain(Settings.LARGE_BUFFER_LIMIT))
                        {
                            var s = wrapper.Memory.Span;
                            s[0] = 123;
                            sum += s[0] + s[1];
                        }
                    }
                    Assert.IsTrue(sum > 0);
                }

                using (Benchmark.Run("BP.RetainTemp", count))
                {
                    sum = 0L;
                    for (var i = 0; i < count; i++)
                    {
                        using (var wrapper = BufferPool.RetainTemp(Settings.LARGE_BUFFER_LIMIT))
                        {
                            var s = wrapper.Memory.Span;
                            s[0] = 123;
                            sum += s[0] + s[1];
                        }
                    }
                    Assert.IsTrue(sum > 0);
                }

                using (Benchmark.Run("RMP", count))
                {
                    sum = 0L;
                    for (var i = 0; i < count; i++)
                    {
                        using (var wrapper = BufferPool.PinnedArrayMemoryPool.RentMemory(Settings.LARGE_BUFFER_LIMIT))
                        {
                            var s = wrapper.Memory.Span;
                            s[0] = 123;
                            sum += s[0] + s[1];
                        }
                    }
                    Assert.IsTrue(sum > 0);
                }

                using (Benchmark.Run("RM([])", count))
                {
                    sum = 0L;
                    for (var i = 0; i < count; i++)
                    {
                        var arr = BufferPool <byte> .Rent(Settings.LARGE_BUFFER_LIMIT);

                        using (var wrapper = new RetainedMemory <byte>(arr))
                        {
                            var s = wrapper.Memory.Span;
                            s[0] = 123;
                            sum += s[0] + s[1];
                        }
                        BufferPool <byte> .Return(arr);
                    }
                    Assert.IsTrue(sum > 0);
                }

                using (Benchmark.Run("ArrayPool", count))
                {
                    sum = 0L;
                    for (var i = 0; i < count; i++)
                    {
                        var buffer = BufferPool <byte> .Rent(Settings.LARGE_BUFFER_LIMIT);

                        buffer[0] = 123;
                        sum      += buffer[0] + buffer[1];
                        BufferPool <byte> .Return(buffer, false);
                    }

                    Assert.IsTrue(sum > 0);
                }

                using (Benchmark.Run("GC", count))
                {
                    sum = 0L;
                    for (var i = 0; i < count; i++)
                    {
                        var buffer = new byte[Settings.LARGE_BUFFER_LIMIT];
                        buffer[0] = 123;
                        sum      += buffer[0] + buffer[1];
                    }

                    Assert.IsTrue(sum > 0);
                }
            }

            Benchmark.Dump($"BufferPool benchmark");
        }
Пример #13
0
 public int SizeOf(TElement[] value, out RetainedMemory <byte> temporaryBuffer, out bool withPadding)
 {
     temporaryBuffer = default;
     withPadding     = default;
     return(4 + value.Length * SizeOf <TElement>());
 }
Пример #14
0
 internal static DirectBuffer ToDirectBuffer(this RetainedMemory <byte> rm)
 {
     return(new DirectBuffer(rm));
 }
Пример #15
0
 public static bool TryGetArray(this RetainedMemory <byte> rm, out ArraySegment <byte> segment)
 {
     return(MemoryMarshal.TryGetArray(rm.Memory, out segment));
 }
Пример #16
0
 public static int SizeOfRaw <T>(T value, out RetainedMemory <byte> temporaryBuffer, out bool withPadding,
                                 bool isBinary = false)
 {
     return(SizeOfRaw(in value, out temporaryBuffer, out withPadding, isBinary));
 }
Пример #17
0
            public unsafe (bool, long) InsertTest(long a, long b, RetainedMemory <byte> rawData)
            {
                const int aColumn = 1;

                const int bColumn = 2;

                const int dataColumn = 3;

                try
                {
                    var sw = new SpinWait();

                    // TODO serialize before bind because we need to release temp buffer
                    InsertTestQuery.Bind((binder, tuple) =>
                    {
                        var blobSize = tuple.rawData.Length;
                        var ptr      = (IntPtr)tuple.rawData.Pointer;
                        Debug.Assert(blobSize > 0);

                        int rc;
                        if ((rc = binder.BindInt64(aColumn, tuple.a)) != 0)
                        {
                            ThrowHelper.FailFast("Cannot bind chunk.StreamId: " + rc);
                        }

                        if ((rc = binder.BindInt64(bColumn, tuple.b)) != 0)
                        {
                            ThrowHelper.FailFast("Cannot bind chunk.FirstVersion: " + rc);
                        }

                        if ((rc = binder.BindBlob(dataColumn, ptr, blobSize)) != 0)
                        {
                            ThrowHelper.FailFast("Cannot bind chunk blob: " + rc);
                        }
                    }, (a, b, rawData));

RETRY:
                    //  var rcBegin = BeginConcurrentQuery.RawStep((hasRow, reader, st) => true, (object)null, out _);
                    // Console.WriteLine("rcBegin: " + rcBegin);

RETRY_TEST:
                    var rcTest = InsertTestQuery.RawStep((hasRow, reader, state) =>
                    {
                        if (hasRow)
                        {
                            ThrowHelper.FailFast("InsertChunk should not return rows");
                        }

                        return(reader.Changes() == 1, reader.LastRowId());
                    }, (object)null, out var result);

                    //if (rcTest != Spreads.SQLite.Interop.Constants.SQLITE_DONE)
                    //{
                    //    Console.WriteLine("rcTest: " + rcTest);
                    //}

RETRY_COMMIT:
                    // var rcCommit = CommitQuery.RawStep((hasRow, reader, st) => true, (object)null, out _);
                    if (rcTest != Spreads.SQLite.Interop.Constants.SQLITE_DONE)
                    {
                        // Console.WriteLine(rcCommit);
                        sw.SpinOnce();
                        goto RETRY_TEST;

                        ////// Console.WriteLine(rcTest);
                        //if (rcCommit == Spreads.SQLite.Interop.Constants.SQLITE_BUSY_SNAPSHOT)
                        //{
                        //    // Console.WriteLine("SQLITE_BUSY_SNAPSHOT");
                        //}
                        //else
                        //{
                        //    //Console.WriteLine("RETRY");
                        //    sw.SpinOnce();
                        //    // Console.WriteLine(rcCommit);
                        //    goto RETRY_COMMIT;
                        //}
                        //////// Console.WriteLine("NOT DONE: " + rcTest);

                        //Rollback();

                        //BeginConcurrentQuery.Reset();
                        //TestQuery.Reset();
                        //CommitQuery.Reset();

                        //sw.SpinOnce();
                        //goto RETRY;
                    }

                    return(result);
                }
                catch (Exception ex)
                {
                    ThrowHelper.FailFast("Cannot insert chunk: " + ex);
                    return(false, 0);
                }
                finally
                {
                    InsertTestQuery.ClearAndReset();

                    //BeginConcurrentQuery.Reset();
                    //CommitQuery.Reset();
                }
            }
Пример #18
0
 int IBinaryConverter <T> .SizeOf(T value, out RetainedMemory <byte> temporaryBuffer, out bool withPadding)
 {
     return(SizeOf(value, out temporaryBuffer, out withPadding));
 }
Пример #19
0
 public int SizeOf(MyPocoWithConvertor value, out RetainedMemory <byte> temporaryBuffer, out bool withPadding)
 {
     throw new NotImplementedException();
 }
Пример #20
0
 public int SizeOf(SampleStruct value, out RetainedMemory <byte> temporaryBuffer, out bool withPadding)
 {
     temporaryBuffer = default;
     withPadding     = default;
     return(4);
 }