private IGossipSeedSource GetGossipSource() { IGossipSeedSource gossipSeedSource; if (_discoverViaDns) { gossipSeedSource = new DnsGossipSeedSource(_clusterDns, _clusterGossipPort); } else { if ((_gossipSeeds == null || _gossipSeeds.Count == 0) && _clusterNodeCount > 1) { throw new Exception("DNS discovery is disabled, but no gossip seed endpoints have been specified. " + "Specify gossip seeds"); } if (_gossipSeeds == null) { throw new ApplicationException("Gossip seeds cannot be null"); } gossipSeedSource = new KnownEndpointGossipSeedSource(_gossipSeeds.ToArray()); } return(gossipSeedSource); }
protected override void Create(ClusterNodeOptions opts) { var dbPath = Path.GetFullPath(ResolveDbPath(opts.DbPath, opts.ExternalHttpPort)); if (!opts.InMemDb) { _dbLock = new ExclusiveDbLock(dbPath); if (!_dbLock.Acquire()) { throw new Exception(string.Format("Couldn't acquire exclusive lock on DB at '{0}'.", dbPath)); } } _clusterNodeMutex = new ClusterNodeMutex(); if (!_clusterNodeMutex.Acquire()) { throw new Exception(string.Format("Couldn't acquire exclusive Cluster Node mutex '{0}'.", _clusterNodeMutex.MutexName)); } var dbConfig = CreateDbConfig(dbPath, opts.CachedChunks, opts.ChunksCacheSize, opts.InMemDb); FileStreamExtensions.ConfigureFlush(disableFlushToDisk: opts.UnsafeDisableFlushToDisk); var db = new TFChunkDb(dbConfig); var vNodeSettings = GetClusterVNodeSettings(opts); IGossipSeedSource gossipSeedSource; if (opts.DiscoverViaDns) { gossipSeedSource = new DnsGossipSeedSource(opts.ClusterDns, opts.ClusterGossipPort); } else { if (opts.GossipSeeds.Length == 0) { if (opts.ClusterSize > 1) { Log.Error(string.Format("DNS discovery is disabled, but no gossip seed endpoints have been specified. " + "Specify gossip seeds using the --{0} command line option.", Opts.GossipSeedCmd)); } else { Log.Info(string.Format("DNS discovery is disabled, but no gossip seed endpoints have been specified. Since" + "the cluster size is set to 1, this may be intentional. Gossip seeds can be specified" + "seeds using the --{0} command line option.", Opts.GossipSeedCmd)); } } gossipSeedSource = new KnownEndpointGossipSeedSource(opts.GossipSeeds); } var dbVerifyHashes = !opts.SkipDbVerify; var runProjections = opts.RunProjections; Log.Info("\n{0,-25} {1}\n" + "{2,-25} {3}\n" + "{4,-25} {5} (0x{5:X})\n" + "{6,-25} {7} (0x{7:X})\n" + "{8,-25} {9} (0x{9:X})\n" + "{10,-25} {11} (0x{11:X})\n", "INSTANCE ID:", vNodeSettings.NodeInfo.InstanceId, "DATABASE:", db.Config.Path, "WRITER CHECKPOINT:", db.Config.WriterCheckpoint.Read(), "CHASER CHECKPOINT:", db.Config.ChaserCheckpoint.Read(), "EPOCH CHECKPOINT:", db.Config.EpochCheckpoint.Read(), "TRUNCATE CHECKPOINT:", db.Config.TruncateCheckpoint.Read()); var enabledNodeSubsystems = runProjections >= RunProjections.System ? new[] { NodeSubsystems.Projections } : new NodeSubsystems[0]; _projections = new Projections.Core.ProjectionsSubsystem(opts.ProjectionThreads, opts.RunProjections); _node = new ClusterVNode(db, vNodeSettings, gossipSeedSource, dbVerifyHashes, opts.MaxMemTableSize, _projections); RegisterWebControllers(enabledNodeSubsystems, vNodeSettings); RegisterUiProjections(); }