Пример #1
0
        [Fact] // -- too slow
        public async Task tx_session_locks()
        {
            var settings = new PostgresqlSettings();

            using (var conn1 = new NpgsqlConnection(Servers.PostgresConnectionString))
                using (var conn2 = new NpgsqlConnection(Servers.PostgresConnectionString))
                    using (var conn3 = new NpgsqlConnection(Servers.PostgresConnectionString))
                    {
                        await conn1.OpenAsync();

                        await conn2.OpenAsync();

                        await conn3.OpenAsync();

                        var tx1 = conn1.BeginTransaction();
                        await settings.GetGlobalTxLock(conn1, tx1, 4);


                        // Cannot get the lock here
                        var tx2 = conn2.BeginTransaction();
                        (await settings.TryGetGlobalTxLock(conn2, tx2, 4)).ShouldBeFalse();

                        // Can get the new lock
                        var tx3 = conn3.BeginTransaction();
                        (await settings.TryGetGlobalTxLock(conn3, tx3, 5)).ShouldBeTrue();

                        // Cannot get the lock here
                        (await settings.TryGetGlobalTxLock(conn2, tx2, 5)).ShouldBeFalse();

                        tx1.Rollback();
                        tx2.Rollback();
                        tx3.Rollback();
                    }
        }
Пример #2
0
        public static void StoreOutgoing(this IDocumentSession session, PostgresqlSettings settings, Envelope envelope,
                                         int ownerId)
        {
            var operation = new StoreOutgoingEnvelope(settings.OutgoingFullName, envelope, ownerId);

            session.QueueOperation(operation);
        }
Пример #3
0
        public void PasswordFromArgumentsOverridesConnectionString()
        {
            var expected   = Guid.NewGuid().ToString();
            var settings   = new MemstateSettings("--Memstate:StorageProviders:Postgresql:Password", expected);
            var pgSettings = new PostgresqlSettings(settings);

            Assert.Equal(expected, pgSettings.Password);
        }
Пример #4
0
        public void PasswordFromEnvironmentVariableOverridesConnectionString()
        {
            string key      = "Memstate:StorageProviders:Postgresql:Password";
            var    expected = Guid.NewGuid().ToString();

            Environment.SetEnvironmentVariable(key, expected);
            var settings   = new MemstateSettings();
            var pgSettings = new PostgresqlSettings(settings);

            Assert.Equal(expected, pgSettings.Password);
            Environment.SetEnvironmentVariable(key, null);
        }
        public MartenEnvelopeTransaction(IDocumentSession session, IMessageContext bus)
        {
            if (bus.Advanced.Persistence is PostgresqlEnvelopePersistence persistence)
            {
                _settings = persistence.Settings;
                _nodeId   = persistence.Options.UniqueNodeId;
            }
            else
            {
                throw new InvalidOperationException(
                          "This Jasper application is not using Postgresql + Marten as the backing message persistence");
            }

            _session = session;
        }
        public override void SetUp()
        {
            _envelopes.Clear();
            _nodeLockers.Clear();

            _workers = new RecordingWorkerQueue();

            _host = JasperHost.CreateDefaultBuilder()
                    .UseJasper(_ =>
            {
                _.ServiceName = Guid.NewGuid().ToString();

                _.MartenConnectionStringIs(Servers.PostgresConnectionString);

                _.Services.AddSingleton <IWorkerQueue>(_workers);

                _.Include <MartenBackedPersistence>();

                _.Settings.Alter <JasperOptions>(x =>
                {
                    x.Retries.FirstNodeReassignmentExecution = 30.Minutes();
                    x.ScheduledJobs.FirstExecution           = 30.Minutes();
                    x.Retries.FirstNodeReassignmentExecution = 30.Minutes();
                    x.Retries.NodeReassignmentPollingTime    = 30.Minutes();
                });
            })
                    .StartJasper();


            _admin = _host.Get <IEnvelopePersistence>().Admin;
            _admin.RebuildSchemaObjects();

            _settings    = _host.Get <PostgresqlSettings>();
            _serializers = _host.Get <MessagingSerializationGraph>();

            theStore = _host.Get <IDocumentStore>();
            theStore.Advanced.Clean.DeleteAllDocuments();

            _currentNodeId = _host.Get <JasperOptions>().UniqueNodeId;

            _owners["This Node"] = _currentNodeId;
        }
Пример #7
0
        public async Task explicitly_release_global_tx_session_locks()
        {
            var settings = new PostgresqlSettings();

            using (var conn1 = new NpgsqlConnection(Servers.PostgresConnectionString))
                using (var conn2 = new NpgsqlConnection(Servers.PostgresConnectionString))
                    using (var conn3 = new NpgsqlConnection(Servers.PostgresConnectionString))
                    {
                        await conn1.OpenAsync();

                        await conn2.OpenAsync();

                        await conn3.OpenAsync();

                        var tx1 = conn1.BeginTransaction();
                        await settings.GetGlobalTxLock(conn1, tx1, 2);


                        // Cannot get the lock here
                        var tx2 = conn2.BeginTransaction();
                        (await settings.TryGetGlobalTxLock(conn2, tx2, 2)).ShouldBeFalse();


                        tx1.Rollback();


                        for (var j = 0; j < 5; j++)
                        {
                            if (await settings.TryGetGlobalTxLock(conn2, tx2, 2))
                            {
                                tx2.Rollback();
                                return;
                            }

                            await Task.Delay(250);
                        }

                        throw new Exception("Advisory lock was not released");
                    }
        }
Пример #8
0
        public override void SetUp()
        {
            _envelopes.Clear();
            _nodeLockers.Clear();

            _workers = new RecordingWorkerQueue();

            _host = Host.CreateDefaultBuilder()
                    .UseJasper(_ =>
            {
                _.ServiceName = Guid.NewGuid().ToString();

                _.Endpoints.As <TransportCollection>().Add(new StubTransport());

                _.Extensions.UseMarten(Servers.PostgresConnectionString);

                _.Services.AddSingleton <IWorkerQueue>(_workers);


                _.Advanced.FirstNodeReassignmentExecution = 30.Minutes();
                _.Advanced.ScheduledJobFirstExecution     = 30.Minutes();
                _.Advanced.FirstNodeReassignmentExecution = 30.Minutes();
                _.Advanced.NodeReassignmentPollingTime    = 30.Minutes();
            })
                    .Start();


            _admin = _host.Services.GetService <IEnvelopePersistence>().Admin;
            _admin.RebuildSchemaObjects();

            _settings    = _host.Services.GetService <PostgresqlSettings>();
            _serializers = _host.Services.GetService <MessagingSerializationGraph>();

            theStore = _host.Services.GetService <IDocumentStore>();
            theStore.Advanced.Clean.DeleteAllDocuments();

            _currentNodeId = _host.Services.GetService <AdvancedSettings>().UniqueNodeId;

            _owners["This Node"] = _currentNodeId;
        }
Пример #9
0
        public async Task explicitly_release_global_session_locks()
        {
            var settings = new PostgresqlSettings();

            using (var conn1 = new NpgsqlConnection(Servers.PostgresConnectionString))
                using (var conn2 = new NpgsqlConnection(Servers.PostgresConnectionString))
                    using (var conn3 = new NpgsqlConnection(Servers.PostgresConnectionString))
                    {
                        await conn1.OpenAsync();

                        await conn2.OpenAsync();

                        await conn3.OpenAsync();


                        await settings.GetGlobalLock(conn1, 1);


                        // Cannot get the lock here
                        (await settings.TryGetGlobalLock(conn2, 1)).ShouldBeFalse();


                        await settings.ReleaseGlobalLock(conn1, 1);


                        for (var j = 0; j < 5; j++)
                        {
                            if (await settings.TryGetGlobalLock(conn2, 1))
                            {
                                return;
                            }

                            await Task.Delay(250);
                        }

                        throw new Exception("Advisory lock was not released");
                    }
        }
Пример #10
0
        [Fact] // - too slow
        public async Task global_session_locks()
        {
            var settings = new PostgresqlSettings();

            using (var conn1 = new NpgsqlConnection(Servers.PostgresConnectionString))
                using (var conn2 = new NpgsqlConnection(Servers.PostgresConnectionString))
                    using (var conn3 = new NpgsqlConnection(Servers.PostgresConnectionString))
                    {
                        await conn1.OpenAsync();

                        await conn2.OpenAsync();

                        await conn3.OpenAsync();

                        await settings.GetGlobalLock(conn1, 24);


                        try
                        {
                            // Cannot get the lock here
                            (await settings.TryGetGlobalLock(conn2, 24)).ShouldBeFalse();

                            // Can get the new lock
                            (await settings.TryGetGlobalLock(conn3, 25)).ShouldBeTrue();

                            // Cannot get the lock here
                            (await settings.TryGetGlobalLock(conn2, 25)).ShouldBeFalse();
                        }
                        finally
                        {
                            await settings.ReleaseGlobalLock(conn1, 24);

                            await settings.ReleaseGlobalLock(conn3, 25);
                        }
                    }
        }
Пример #11
0
        public static void StoreIncoming(this IDocumentSession session, PostgresqlSettings settings, Envelope envelope)
        {
            var operation = new StoreIncomingEnvelope(settings.IncomingFullName, envelope);

            session.QueueOperation(operation);
        }
 public PostgresqlEnvelopeStorageAdmin(PostgresqlSettings settings)
 {
     _connectionString = settings.ConnectionString;
     SchemaName        = settings.SchemaName;
 }
Пример #13
0
 public PostgresqlSettingsTests(ITestOutputHelper log)
 {
     _log = log;
     _memstateSettings = new MemstateSettings();
     _settings         = new PostgresqlSettings(_memstateSettings);
 }