Exemple #1
0
        public LightningPersistence(LightningConfig config)
        {
            _config = config.Clone();
            _cts    = new CancellationTokenSource();

            Console.WriteLine($"ThreadId ctor: {Thread.CurrentThread.ManagedThreadId}");
            Env = new LightningEnvironment(_config.Name ?? "db")
            {
                MaxDatabases = _config.MaxTables > 0u ? (int)_config.MaxTables : 20,
                MapSize      = (_config.StorageLimit > 0L ? (long)_config.StorageLimit : 10L) * 1024 * 1024 * 1024
            };
            EnvironmentOpenFlags envFlags;

            switch (config.SyncMode)
            {
            case LightningDbSyncMode.Fsync:
                envFlags = EnvironmentOpenFlags.NoThreadLocalStorage;
                break;

            case LightningDbSyncMode.Async:
                envFlags = EnvironmentOpenFlags.NoThreadLocalStorage | EnvironmentOpenFlags.WriteMap | EnvironmentOpenFlags.MapAsync;
                break;

            case LightningDbSyncMode.NoSync:
                envFlags = EnvironmentOpenFlags.NoThreadLocalStorage | EnvironmentOpenFlags.NoSync;
                break;

            case LightningDbSyncMode.ReadOnly:
                envFlags = EnvironmentOpenFlags.NoThreadLocalStorage | EnvironmentOpenFlags.ReadOnly;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            Env.Open(envFlags);
            _envHandle = GCHandle.Alloc(Env);

            _tables    = new ConcurrentDictionary <string, Table>();
            _dupTables = new ConcurrentDictionary <string, DupTable>();

            _writeQueue = new BlockingCollection <Delegates>();
            var threadStart = new ThreadStart(() =>
            {
                foreach (var batch in DequeueBatch(_writeQueue))
                {
                    ProcessBatch(batch);
                }

                _writeTaskCompletion.SetResult(null);
            });

            var writeThread = new Thread(threadStart)
            {
                Name         = "LMDB Writer thread",
                IsBackground = true
            };

            writeThread.Start();
        }
Exemple #2
0
        public GrpcTestClient(LightningConfig lightningConfig)
        {
            var port = (uint)Interlocked.Increment(ref _startingPort);

            lightningConfig.Name = $"{lightningConfig.Name ?? "db"}_{port}"; // It is safe to do as LightningConfig is a struct

            if (Directory.Exists(lightningConfig.Name))
            {
                Directory.Delete(lightningConfig.Name, true);
            }

            ReplicaConfig = new ReplicaConfig
            {
                ReplicaId   = "replica_1",
                Port        = port,
                Replication = new ReplicationConfig {
                    Port = port + 2000, PageSize = 10000, UseBatching = false
                },
                Persistence = lightningConfig
            };
            _server = new Replica(ReplicaConfig);

            _client = new LightClient(new Channel($"127.0.0.1:{port}", ChannelCredentials.Insecure), new ClientConfig
            {
                UseStreaming = true,
                Compression  = None,
                HashedWith   = Md5
            });
        }
Exemple #3
0
        static void Main(string[] args)
        {
            ConfigureLog($"logs/CacheServer_{DateTime.Now}.nlog");
            GC.AddMemoryPressure(2L * 1024 * 1024 * 1024);
            GrpcEnvironment.SetLogger(new LogLevelFilterLogger(new ConsoleLogger(), LogLevel.Debug));
            // GrpcEnvironment.SetLogger(new TextWriterLogger(new StreamWriter(File.OpenWrite($"logs/CacheServer_{DateTime.Now}.log"))));

            var lightningConfig = new LightningConfig
            {
                Name                          = @"C:\Work2\braindump\LmdbCacheServer\TestDir",
                MaxTables                     = 20,
                StorageLimit                  = 10,
                WriteBatchMaxDelegates        = 1000,
                WriteBatchTimeoutMilliseconds = 1,
                SyncMode                      = LightningDbSyncMode.NoSync
            };

            var replicaConfigMaster = new ReplicaConfig
            {
                ReplicaId          = "replica_1",
                Port               = Port,
                MonitoringInterval = 10000,
                Replication        = new ReplicationConfig {
                    Port = Port + 2000, PageSize = 10000, UseBatching = false
                },
                Persistence = lightningConfig
            };

            var lightningConfigSlave = lightningConfig.Clone();

            lightningConfigSlave.Name = @"C:\Work2\braindump\LmdbCacheServer\TestDir_Slave";
            lightningConfigSlave.WriteBatchMaxDelegates        = 10000;
            lightningConfigSlave.WriteBatchTimeoutMilliseconds = 1;
            lightningConfigSlave.SyncMode = LightningDbSyncMode.NoSync;
            var replicaConfigSlave = new ReplicaConfig
            {
                ReplicaId   = "replica_2",
                MasterNode  = $"{"127.0.0.1"}:{replicaConfigMaster.Replication.Port}",
                Replication = new ReplicationConfig {
                    Port = Port + 2500, PageSize = 10000, UseBatching = false
                },
                Port = Port + 500,
                MonitoringInterval = 10000,
                Persistence        = lightningConfigSlave
            };

            using (var server = new Replica.Replica(args.Length == 0 ? replicaConfigMaster : replicaConfigSlave))
            {
                Console.WriteLine("Cache server started on port " + Port);
                Console.WriteLine("Press any key to stop the server...");

                Console.ReadKey();
            }
        }
Exemple #4
0
        public void Setup()
        {
            if (Directory.Exists(TestDir))
            {
                Directory.Delete(TestDir, true);
            }

            Directory.CreateDirectory(TestDir);

            _config = new LightningConfig {
                Name = TestDir, MaxTables = 20, StorageLimit = 1, WriteBatchMaxDelegates = 100, WriteBatchTimeoutMilliseconds = 1000
            };
        }
Exemple #5
0
 private IClient CreateClient(Type type, LightningConfig config) => ((IClientFactory)Activator.CreateInstance(type)).Create(config);
Exemple #6
0
 public IClient Create(LightningConfig config) => new GrpcTestClient(config);
Exemple #7
0
 public IClient Create(LightningConfig config) => new LmdbLightClient(config);
Exemple #8
0
 public LmdbLightClient(LightningConfig config)
 {
     _lmdb    = new LightningPersistence(config);
     _kvTable = _lmdb.OpenTable("kv");
 }