示例#1
0
        private T RoundTripThroughCodec <T>(T original)
        {
            T   result;
            var pipe = new Pipe();

            using (var readerSession = _sessionPool.GetSession())
                using (var writeSession = _sessionPool.GetSession())
                {
                    var writer = Writer.Create(pipe.Writer, writeSession);
                    var codec  = _codecProvider.GetCodec <T>();
                    codec.WriteField(
                        ref writer,
                        0,
                        null,
                        original);
                    writer.Commit();
                    _ = pipe.Writer.FlushAsync().AsTask().GetAwaiter().GetResult();
                    pipe.Writer.Complete();

                    _ = pipe.Reader.TryRead(out var readResult);
                    var reader = Reader.Create(readResult.Buffer, readerSession);

                    var previousPos   = reader.Position;
                    var initialHeader = reader.ReadFieldHeader();
                    Assert.True(reader.Position > previousPos);

                    result = codec.ReadValue(ref reader, initialHeader);
                    pipe.Reader.AdvanceTo(readResult.Buffer.End);
                    pipe.Reader.Complete();
                }

            return(result);
        }
示例#2
0
 public MessageSerializer(
     Serializer <object> bodySerializer,
     SerializerSessionPool sessionPool,
     SharedMemoryPool memoryPool,
     IServiceProvider services,
     Serializer <GrainAddress> activationAddressSerializer,
     ICodecProvider codecProvider,
     int maxHeaderSize,
     int maxBodySize)
 {
     _readerSiloAddressCodec = new CachingSiloAddressCodec();
     _writerSiloAddressCodec = new CachingSiloAddressCodec();
     _readerIdSpanCodec      = new CachingIdSpanCodec();
     _writerIdSpanCodec      = new CachingIdSpanCodec();
     _serializer             = ActivatorUtilities.CreateInstance <Serializer>(services);
     _activationAddressCodec = activationAddressSerializer;
     _serializationSession   = sessionPool.GetSession();
     _deserializationSession = sessionPool.GetSession();
     _memoryPool             = memoryPool.Pool;
     _bodySerializer         = bodySerializer;
     _maxHeaderLength        = maxHeaderSize;
     _maxBodyLength          = maxBodySize;
     _sessionPool            = sessionPool;
     _requestContextCodec    = OrleansGeneratedCodeHelper.GetService <DictionaryCodec <string, object> >(this, codecProvider);
 }
示例#3
0
            public IOutputBuffer Serialize(TValue input)
            {
                using var session = _sessionPool.GetSession();
                var writer = Writer.Create(CreateBufferWriter(), session);

                _serializer.Serialize(input, ref writer);
                return(writer.Output);
            }
示例#4
0
        private async Task ReceivePump(CancellationToken cancellation)
        {
            using (var session = _serializerSessionPool.GetSession())
            {
                var input = _connection.Input;
                while (!cancellation.IsCancellationRequested)
                {
                    ReadResult result;
                    while (true)
                    {
                        if (!input.TryRead(out result))
                        {
                            result = await input.ReadAsync(cancellation);
                        }

                        if (result.IsCanceled)
                        {
                            break;
                        }

                        if (result.Buffer.IsEmpty && result.IsCompleted)
                        {
                            break;
                        }

                        var message = ReadMessage(result.Buffer, session, out var consumedTo);
                        session.PartialReset();
                        input.AdvanceTo(consumedTo);
                        if (!_incoming.TryWrite(message))
                        {
                            await _incoming.WriteAsync(message, cancellation);
                        }
                    }

                    if (result.IsCanceled)
                    {
                        break;
                    }

                    if (result.Buffer.IsEmpty && result.IsCompleted)
                    {
                        break;
                    }
                }
            }

            Message ReadMessage(ReadOnlySequence <byte> payload, SerializerSession session, out SequencePosition consumedTo)
            {
                var reader = Reader.Create(payload, session);
                var result = _messageSerializer.Deserialize(ref reader);

                consumedTo = payload.GetPosition(reader.Position);
                return(result);
            }
        }
示例#5
0
        public ComplexTypeBenchmarks()
        {
            _orleansSerializer = new ClientBuilder()
                                 .ConfigureDefaults()
                                 .UseLocalhostClustering()
                                 .ConfigureServices(s => s.ToList().ForEach(r =>
            {
                if (r.ServiceType == typeof(IConfigurationValidator))
                {
                    _ = s.Remove(r);
                }
            }))
                                 .Configure <ClusterOptions>(o => o.ClusterId = o.ServiceId = "test")
                                 .ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(SimpleClass).Assembly).WithCodeGeneration())
                                 .Build().ServiceProvider.GetRequiredService <SerializationManager>();
            var services = new ServiceCollection();

            _ = services
                .AddHagar(hagar => hagar.AddISerializableSupport().AddAssembly(typeof(Program).Assembly));
            var serviceProvider = services.BuildServiceProvider();

            _hagarSerializer  = serviceProvider.GetRequiredService <Serializer <ComplexClass> >();
            _structSerializer = serviceProvider.GetRequiredService <Serializer <SimpleStruct> >();
            _sessionPool      = serviceProvider.GetRequiredService <SerializerSessionPool>();
            _value            = new ComplexClass
            {
                BaseInt = 192,
                Int     = 501,
                String  = "bananas",
                //Array = Enumerable.Range(0, 60).ToArray(),
                //MultiDimensionalArray = new[,] {{0, 2, 4}, {1, 5, 6}}
            };
            _value.AlsoSelf = _value.BaseSelf = _value.Self = _value;

            _structValue = new SimpleStruct
            {
                Int  = 42,
                Bool = true,
                Guid = Guid.NewGuid()
            };
            _session = _sessionPool.GetSession();
            var writer = HagarBuffer.CreateWriter(_session);

            _hagarSerializer.Serialize(_value, ref writer);
            var bytes = new byte[writer.Output.GetMemory().Length];

            writer.Output.GetReadOnlySequence().CopyTo(bytes);
            _hagarBytes = new ReadOnlySequence <byte>(bytes);
            HagarBuffer.Reset();

            var writer2 = new BinaryTokenStreamWriter();

            _orleansSerializer.Serialize(_value, writer2);
            _orleansBytes = writer2.ToBytes();

            _readBytesLength = Math.Min(bytes.Length, _orleansBytes.Sum(x => x.Count));
        }
示例#6
0
        public void CorrectlyAdvancesReferenceCounterStream()
        {
            var stream = new MemoryStream();

            using var writerSession = _sessionPool.GetSession();
            using var readerSession = _sessionPool.GetSession();
            var writer      = Writer.Create(stream, writerSession);
            var writerCodec = CreateCodec();

            // Write the field. This should involve marking at least one reference in the session.
            Assert.Equal(0, writer.Position);

            foreach (var value in TestValues)
            {
                var beforeReference = writer.Session.ReferencedObjects.CurrentReferenceId;
                writerCodec.WriteField(ref writer, 0, typeof(TValue), value);
                Assert.True(writer.Position > 0);

                writer.Commit();
                var afterReference = writer.Session.ReferencedObjects.CurrentReferenceId;
                Assert.True(beforeReference < afterReference, $"Writing a field should result in at least one reference being marked in the session. Before: {beforeReference}, After: {afterReference}");
                if (value is null)
                {
                    Assert.True(beforeReference + 1 == afterReference, $"Writing a null field should result in exactly one reference being marked in the session. Before: {beforeReference}, After: {afterReference}");
                }

                stream.Flush();

                stream.Position = 0;
                var reader = Reader.Create(stream, readerSession);

                var previousPos = reader.Position;
                Assert.Equal(0, previousPos);
                var readerCodec = CreateCodec();
                var readField   = reader.ReadFieldHeader();

                Assert.True(reader.Position > previousPos);
                previousPos = reader.Position;

                beforeReference = reader.Session.ReferencedObjects.CurrentReferenceId;
                var readValue = readerCodec.ReadValue(ref reader, readField);

                Assert.True(reader.Position > previousPos);

                afterReference = reader.Session.ReferencedObjects.CurrentReferenceId;
                Assert.True(beforeReference < afterReference, $"Reading a field should result in at least one reference being marked in the session. Before: {beforeReference}, After: {afterReference}");
                if (readValue is null)
                {
                    Assert.True(beforeReference + 1 == afterReference, $"Reading a null field should result in at exactly one reference being marked in the session. Before: {beforeReference}, After: {afterReference}");
                }
            }
        }