// Start starts the test cluster by bootstrapping an in-memory store // (defaults to maximum of 50M). The server is started, launching the // node RPC server and all HTTP endpoints. Use the value of // TestServer.Addr after Start() for client connections. Use Stop() // to shutdown the server after the test completes. func (ltc *LocalTestCluster) Start(t util.Tester, baseCtx *base.Config, initSender InitSenderFn) { ambient := log.AmbientContext{Tracer: tracing.NewTracer()} nc := &base.NodeIDContainer{} ambient.AddLogTag("n", nc) nodeID := roachpb.NodeID(1) nodeDesc := &roachpb.NodeDescriptor{NodeID: nodeID} ltc.tester = t ltc.Manual = hlc.NewManualClock(0) ltc.Clock = hlc.NewClock(ltc.Manual.UnixNano) ltc.Stopper = stop.NewStopper() rpcContext := rpc.NewContext(ambient, baseCtx, ltc.Clock, ltc.Stopper) server := rpc.NewServer(rpcContext) // never started ltc.Gossip = gossip.New(ambient, nc, rpcContext, server, nil, ltc.Stopper, metric.NewRegistry()) ltc.Eng = engine.NewInMem(roachpb.Attributes{}, 50<<20) ltc.Stopper.AddCloser(ltc.Eng) ltc.Stores = storage.NewStores(ambient, ltc.Clock) ltc.Sender = initSender(nodeDesc, ambient.Tracer, ltc.Clock, ltc.Latency, ltc.Stores, ltc.Stopper, ltc.Gossip) if ltc.DBContext == nil { dbCtx := client.DefaultDBContext() ltc.DBContext = &dbCtx } ltc.DB = client.NewDBWithContext(ltc.Sender, *ltc.DBContext) transport := storage.NewDummyRaftTransport() cfg := storage.TestStoreConfig() if ltc.RangeRetryOptions != nil { cfg.RangeRetryOptions = *ltc.RangeRetryOptions } cfg.AmbientCtx = ambient cfg.Clock = ltc.Clock cfg.DB = ltc.DB cfg.Gossip = ltc.Gossip cfg.Transport = transport cfg.MetricsSampleInterval = metric.TestSampleInterval ltc.Store = storage.NewStore(cfg, ltc.Eng, nodeDesc) if err := ltc.Store.Bootstrap(roachpb.StoreIdent{NodeID: nodeID, StoreID: 1}); err != nil { t.Fatalf("unable to start local test cluster: %s", err) } ltc.Stores.AddStore(ltc.Store) if err := ltc.Store.BootstrapRange(nil); err != nil { t.Fatalf("unable to start local test cluster: %s", err) } if err := ltc.Store.Start(context.Background(), ltc.Stopper); err != nil { t.Fatalf("unable to start local test cluster: %s", err) } nc.Set(context.TODO(), nodeDesc.NodeID) if err := ltc.Gossip.SetNodeDescriptor(nodeDesc); err != nil { t.Fatalf("unable to set node descriptor: %s", err) } }
// MakeServer instantiates a new Server which services requests with data from // the supplied DB. func MakeServer(ambient log.AmbientContext, db *DB, cfg ServerConfig, stopper *stop.Stopper) Server { ambient.AddLogTag("ts-srv", nil) queryWorkerMax := queryWorkerMax if cfg.QueryWorkerMax != 0 { queryWorkerMax = cfg.QueryWorkerMax } return Server{ AmbientContext: ambient, db: db, stopper: stopper, workerSem: make(chan struct{}, queryWorkerMax), } }
// NewTest is a simplified wrapper around New that creates the NodeIDContainer // internally. Used for testing. func NewTest( nodeID roachpb.NodeID, rpcContext *rpc.Context, grpcServer *grpc.Server, resolvers []resolver.Resolver, stopper *stop.Stopper, registry *metric.Registry, ) *Gossip { n := &base.NodeIDContainer{} var ac log.AmbientContext ac.AddLogTag("n", n) gossip := New(ac, n, rpcContext, grpcServer, resolvers, stopper, registry) if nodeID != 0 { n.Set(context.TODO(), nodeID) } return gossip }
// PollSource begins a Goroutine which periodically queries the supplied // DataSource for time series data, storing the returned data in the server. // Stored data will be sampled using the provided Resolution. The polling // process will continue until the provided stop.Stopper is stopped. func (db *DB) PollSource( ambient log.AmbientContext, source DataSource, frequency time.Duration, r Resolution, stopper *stop.Stopper, ) { ambient.AddLogTag("ts-poll", nil) p := &poller{ AmbientContext: ambient, db: db, source: source, frequency: frequency, r: r, stopper: stopper, } p.start() }
// newStatusServer allocates and returns a statusServer. func newStatusServer( ambient log.AmbientContext, db *client.DB, gossip *gossip.Gossip, metricSource metricMarshaler, rpcCtx *rpc.Context, stores *storage.Stores, ) *statusServer { ambient.AddLogTag("status", nil) server := &statusServer{ AmbientContext: ambient, db: db, gossip: gossip, metricSource: metricSource, rpcCtx: rpcCtx, stores: stores, } return server }