rpc rewrite: control RPCs using gRPC + separate RPC for data transfer
transport/ssh: update go-netssh to new version
=> supports CloseWrite and Deadlines
=> build: require Go 1.11 (netssh requires it)
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"os"
|
||||
|
||||
"github.com/pkg/profile"
|
||||
"github.com/zrepl/zrepl/rpc/dataconn"
|
||||
"github.com/zrepl/zrepl/logger"
|
||||
"github.com/zrepl/zrepl/replication/pdu"
|
||||
)
|
||||
|
||||
func orDie(err error) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
type devNullHandler struct{}
|
||||
|
||||
func (devNullHandler) Send(ctx context.Context, r *pdu.SendReq) (*pdu.SendRes, io.ReadCloser, error) {
|
||||
var res pdu.SendRes
|
||||
return &res, os.Stdin, nil
|
||||
}
|
||||
|
||||
func (devNullHandler) Receive(ctx context.Context, r *pdu.ReceiveReq, stream io.Reader) (*pdu.ReceiveRes, error) {
|
||||
var buf [1<<15]byte
|
||||
_, err := io.CopyBuffer(os.Stdout, stream, buf[:])
|
||||
var res pdu.ReceiveRes
|
||||
return &res, err
|
||||
}
|
||||
|
||||
type tcpConnecter struct {
|
||||
net, addr string
|
||||
}
|
||||
|
||||
func (c tcpConnecter) Connect(ctx context.Context) (net.Conn, error) {
|
||||
return net.Dial(c.net, c.addr)
|
||||
}
|
||||
|
||||
var args struct {
|
||||
addr string
|
||||
appmode string
|
||||
direction string
|
||||
profile bool
|
||||
}
|
||||
|
||||
func server() {
|
||||
|
||||
log := logger.NewStderrDebugLogger()
|
||||
log.Debug("starting server")
|
||||
l, err := net.Listen("tcp", args.addr)
|
||||
orDie(err)
|
||||
|
||||
srvConfig := dataconn.ServerConfig{
|
||||
Shared: dataconn.SharedConfig {
|
||||
MaxProtoLen: 4096,
|
||||
MaxHeaderLen: 4096,
|
||||
SendChunkSize: 1 << 17,
|
||||
MaxRecvChunkSize: 1 << 17,
|
||||
},
|
||||
}
|
||||
srv := dataconn.NewServer(devNullHandler{}, srvConfig, nil)
|
||||
|
||||
ctx := context.Background()
|
||||
ctx = dataconn.WithLogger(ctx, log)
|
||||
srv.Serve(ctx, l)
|
||||
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
||||
flag.BoolVar(&args.profile, "profile", false, "")
|
||||
flag.StringVar(&args.addr, "address", ":8888", "")
|
||||
flag.StringVar(&args.appmode, "appmode", "client|server", "")
|
||||
flag.StringVar(&args.direction, "direction", "", "send|recv")
|
||||
flag.Parse()
|
||||
|
||||
if args.profile {
|
||||
defer profile.Start(profile.CPUProfile).Stop()
|
||||
}
|
||||
|
||||
switch args.appmode {
|
||||
case "client":
|
||||
client()
|
||||
case "server":
|
||||
server()
|
||||
default:
|
||||
orDie(fmt.Errorf("unknown appmode %q", args.appmode))
|
||||
}
|
||||
}
|
||||
|
||||
func client() {
|
||||
|
||||
logger := logger.NewStderrDebugLogger()
|
||||
ctx := context.Background()
|
||||
ctx = dataconn.WithLogger(ctx, logger)
|
||||
|
||||
clientConfig := dataconn.ClientConfig{
|
||||
Shared: dataconn.SharedConfig {
|
||||
MaxProtoLen: 4096,
|
||||
MaxHeaderLen: 4096,
|
||||
SendChunkSize: 1 << 17,
|
||||
MaxRecvChunkSize: 1 << 17,
|
||||
},
|
||||
}
|
||||
orDie(clientConfig.Validate())
|
||||
|
||||
connecter := tcpConnecter{"tcp", args.addr}
|
||||
client := dataconn.NewClient(connecter, clientConfig)
|
||||
|
||||
switch args.direction {
|
||||
case "send":
|
||||
req := pdu.SendReq{}
|
||||
_, stream, err := client.ReqSendStream(ctx, &req)
|
||||
orDie(err)
|
||||
var buf [1<<15]byte
|
||||
_, err = io.CopyBuffer(os.Stdout, stream, buf[:])
|
||||
orDie(err)
|
||||
case "recv":
|
||||
var buf bytes.Buffer
|
||||
buf.WriteString("teststreamtobereceived")
|
||||
req := pdu.ReceiveReq{}
|
||||
_, err := client.ReqRecv(ctx, &req, os.Stdin)
|
||||
orDie(err)
|
||||
default:
|
||||
orDie(fmt.Errorf("unknown direction%q", args.direction))
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user