// Freeze freezes (or thaws) the cluster. The freeze request is sent to the // specified node. func (c *Cluster) Freeze(nodeIdx int, freeze bool) { addr := c.RPCAddr(nodeIdx) conn, err := c.rpcCtx.GRPCDial(addr) if err != nil { log.Fatalf(context.Background(), "unable to dial: %s: %v", addr, err) } adminClient := serverpb.NewAdminClient(conn) stream, err := adminClient.ClusterFreeze( context.Background(), &serverpb.ClusterFreezeRequest{Freeze: freeze}) if err != nil { log.Fatal(context.Background(), err) } for { resp, err := stream.Recv() if err != nil { if err == io.EOF { break } log.Fatal(context.Background(), err) } fmt.Println(resp.Message) } fmt.Println("ok") }
func TestStopServer(t *testing.T) { defer leaktest.AfterTest(t)() // Use insecure mode so our servers listen on util.IsolatedTestAddr // and they fail cleanly instead of interfering with other tests. // See https://github.com/cockroachdb/cockroach/issues/9256 tc := StartTestCluster(t, 3, base.TestClusterArgs{ ServerArgs: base.TestServerArgs{ Insecure: true, }, ReplicationMode: base.ReplicationAuto, }) defer tc.Stopper().Stop() // Connect to server 1, ensure it is answering requests over HTTP and GRPC. server1 := tc.Server(1) var response serverpb.HealthResponse httpClient1, err := server1.GetHTTPClient() if err != nil { t.Fatal(err) } url := server1.AdminURL() + "/_admin/v1/health" if err := httputil.GetJSON(httpClient1, url, &response); err != nil { t.Fatal(err) } rpcContext := rpc.NewContext( log.AmbientContext{}, tc.Server(1).RPCContext().Config, tc.Server(1).Clock(), tc.Stopper(), ) conn, err := rpcContext.GRPCDial(server1.ServingAddr()) if err != nil { t.Fatal(err) } adminClient1 := serverpb.NewAdminClient(conn) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() if _, err := adminClient1.Health(ctx, &serverpb.HealthRequest{}); err != nil { t.Fatal(err) } // Stop server 1. tc.StopServer(1) // Verify HTTP and GRPC requests to server now fail. httpErrorText := "connection refused" if err := httputil.GetJSON(httpClient1, url, &response); err == nil { t.Fatal("Expected HTTP Request to fail after server stopped") } else if !testutils.IsError(err, httpErrorText) { t.Fatalf("Expected error from server with text %q, got error with text %q", httpErrorText, err.Error()) } grpcErrorText := "rpc error" if _, err := adminClient1.Health(ctx, &serverpb.HealthRequest{}); err == nil { t.Fatal("Expected GRPC Request to fail after server stopped") } else if !testutils.IsError(err, grpcErrorText) { t.Fatalf("Expected error from GRPC with text %q, got error with text %q", grpcErrorText, err.Error()) } // Verify that request to Server 0 still works. httpClient1, err = tc.Server(0).GetHTTPClient() if err != nil { t.Fatal(err) } url = tc.Server(0).AdminURL() + "/_admin/v1/health" if err := httputil.GetJSON(httpClient1, url, &response); err != nil { t.Fatal(err) } }