mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-14 10:30:45 +02:00
* fix(weed/command) address unhandled errors * fix(command): don't log graceful-shutdown sentinels; plug response-body leak - s3: Serve on unix socket treated http.ErrServerClosed as fatal; now excluded like the other Serve/ServeTLS paths in this file. - mq_agent, mq_broker: filter grpc.ErrServerStopped so clean shutdown doesn't log as an error. - worker_runtime: the added decodeErr early-continue skipped resp.Body.Close(); drop it since the existing check below already surfaces the decode error. - mount_std: the pre-mount Unmount commonly fails when nothing is mounted; demote to V(1) Infof. - fuse_std: tidy panic message to match sibling cases. * fix(mq_broker): filter grpc.ErrServerStopped on localhost listener The localhost listener goroutine logged any Serve error unconditionally, which includes grpc.ErrServerStopped on graceful shutdown. Match the main listener's check so clean stops don't surface as errors. --------- Co-authored-by: Chris Lu <chris.lu@gmail.com>
127 lines
4.8 KiB
Go
127 lines
4.8 KiB
Go
package command
|
|
|
|
import (
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/reflection"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
|
"github.com/seaweedfs/seaweedfs/weed/mq/broker"
|
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/mq_pb"
|
|
"github.com/seaweedfs/seaweedfs/weed/security"
|
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
|
"github.com/seaweedfs/seaweedfs/weed/util/grace"
|
|
)
|
|
|
|
var (
|
|
mqBrokerStandaloneOptions MessageQueueBrokerOptions
|
|
)
|
|
|
|
type MessageQueueBrokerOptions struct {
|
|
masters map[string]pb.ServerAddress
|
|
mastersString *string
|
|
filerGroup *string
|
|
ip *string
|
|
port *int
|
|
dataCenter *string
|
|
rack *string
|
|
cpuprofile *string
|
|
memprofile *string
|
|
logFlushInterval *int
|
|
debug *bool
|
|
debugPort *int
|
|
}
|
|
|
|
func init() {
|
|
cmdMqBroker.Run = runMqBroker // break init cycle
|
|
mqBrokerStandaloneOptions.mastersString = cmdMqBroker.Flag.String("master", "localhost:9333", "comma-separated master servers")
|
|
mqBrokerStandaloneOptions.filerGroup = cmdMqBroker.Flag.String("filerGroup", "", "share metadata with other filers in the same filerGroup")
|
|
mqBrokerStandaloneOptions.ip = cmdMqBroker.Flag.String("ip", util.DetectedHostAddress(), "broker host address")
|
|
mqBrokerStandaloneOptions.port = cmdMqBroker.Flag.Int("port", 17777, "broker gRPC listen port")
|
|
mqBrokerStandaloneOptions.dataCenter = cmdMqBroker.Flag.String("dataCenter", "", "prefer to read and write to volumes in this data center")
|
|
mqBrokerStandaloneOptions.rack = cmdMqBroker.Flag.String("rack", "", "prefer to write to volumes in this rack")
|
|
mqBrokerStandaloneOptions.cpuprofile = cmdMqBroker.Flag.String("cpuprofile", "", "cpu profile output file")
|
|
mqBrokerStandaloneOptions.memprofile = cmdMqBroker.Flag.String("memprofile", "", "memory profile output file")
|
|
mqBrokerStandaloneOptions.logFlushInterval = cmdMqBroker.Flag.Int("logFlushInterval", 5, "log buffer flush interval in seconds")
|
|
mqBrokerStandaloneOptions.debug = cmdMqBroker.Flag.Bool("debug", false, "serves runtime profiling data via pprof on the port specified by -debug.port")
|
|
mqBrokerStandaloneOptions.debugPort = cmdMqBroker.Flag.Int("debug.port", 6060, "http port for debugging")
|
|
}
|
|
|
|
var cmdMqBroker = &Command{
|
|
UsageLine: "mq.broker [-port=17777] [-master=<ip:port>]",
|
|
Short: "<WIP> start a message queue broker",
|
|
Long: `start a message queue broker
|
|
|
|
The broker can accept gRPC calls to write or read messages. The messages are stored via filer.
|
|
The brokers are stateless. To scale up, just add more brokers.
|
|
|
|
`,
|
|
}
|
|
|
|
func runMqBroker(cmd *Command, args []string) bool {
|
|
if *mqBrokerStandaloneOptions.debug {
|
|
grace.StartDebugServer(*mqBrokerStandaloneOptions.debugPort)
|
|
}
|
|
|
|
util.LoadSecurityConfiguration()
|
|
|
|
mqBrokerStandaloneOptions.masters = pb.ServerAddresses(*mqBrokerStandaloneOptions.mastersString).ToAddressMap()
|
|
|
|
return mqBrokerStandaloneOptions.startQueueServer()
|
|
|
|
}
|
|
|
|
func (mqBrokerOpt *MessageQueueBrokerOptions) startQueueServer() bool {
|
|
|
|
grace.SetupProfiling(*mqBrokerStandaloneOptions.cpuprofile, *mqBrokerStandaloneOptions.memprofile)
|
|
|
|
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.msg_broker")
|
|
|
|
qs, err := broker.NewMessageBroker(&broker.MessageQueueBrokerOption{
|
|
Masters: mqBrokerOpt.masters,
|
|
FilerGroup: *mqBrokerOpt.filerGroup,
|
|
DataCenter: *mqBrokerOpt.dataCenter,
|
|
Rack: *mqBrokerOpt.rack,
|
|
DefaultReplication: "",
|
|
MaxMB: 0,
|
|
Ip: *mqBrokerOpt.ip,
|
|
Port: *mqBrokerOpt.port,
|
|
LogFlushInterval: *mqBrokerOpt.logFlushInterval,
|
|
}, grpcDialOption)
|
|
if err != nil {
|
|
glog.Fatalf("failed to create new message broker for queue server: %v", err)
|
|
}
|
|
|
|
// start grpc listener
|
|
grpcL, localL, err := util.NewIpAndLocalListeners("", *mqBrokerOpt.port, 0)
|
|
if err != nil {
|
|
glog.Fatalf("failed to listen on grpc port %d: %v", *mqBrokerOpt.port, err)
|
|
}
|
|
|
|
// Create main gRPC server
|
|
grpcS := pb.NewGrpcServer(security.LoadServerTLS(util.GetViper(), "grpc.msg_broker"))
|
|
mq_pb.RegisterSeaweedMessagingServer(grpcS, qs)
|
|
reflection.Register(grpcS)
|
|
|
|
// Start localhost listener if available
|
|
if localL != nil {
|
|
localGrpcS := pb.NewGrpcServer(security.LoadServerTLS(util.GetViper(), "grpc.msg_broker"))
|
|
mq_pb.RegisterSeaweedMessagingServer(localGrpcS, qs)
|
|
reflection.Register(localGrpcS)
|
|
go func() {
|
|
glog.V(0).Infof("MQ Broker listening on localhost:%d", *mqBrokerOpt.port)
|
|
if err := localGrpcS.Serve(localL); err != nil && err != grpc.ErrServerStopped {
|
|
glog.Errorf("MQ Broker localhost listener error: %v", err)
|
|
}
|
|
}()
|
|
}
|
|
|
|
glog.V(0).Infof("MQ Broker listening on %s:%d", *mqBrokerOpt.ip, *mqBrokerOpt.port)
|
|
if err := grpcS.Serve(grpcL); err != nil && err != grpc.ErrServerStopped {
|
|
glog.Errorf("Failed to serve MQ Broker: %v", err)
|
|
}
|
|
|
|
return true
|
|
|
|
}
|