diff options
Diffstat (limited to 'weed/command/iam.go')
| -rw-r--r-- | weed/command/iam.go | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/weed/command/iam.go b/weed/command/iam.go index 8f4ac878d..8fae7ec96 100644 --- a/weed/command/iam.go +++ b/weed/command/iam.go @@ -15,6 +15,7 @@ import ( "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" "github.com/seaweedfs/seaweedfs/weed/security" "github.com/seaweedfs/seaweedfs/weed/util" + "github.com/seaweedfs/seaweedfs/weed/util/grace" // Import credential stores to register them _ "github.com/seaweedfs/seaweedfs/weed/credential/filer_etc" @@ -35,16 +36,18 @@ type IamOptions struct { func init() { cmdIam.Run = runIam // break init cycle - iamStandaloneOptions.filer = cmdIam.Flag.String("filer", "localhost:8888", "filer server address") + iamStandaloneOptions.filer = cmdIam.Flag.String("filer", "localhost:8888", "comma-separated filer server addresses for high availability") iamStandaloneOptions.masters = cmdIam.Flag.String("master", "localhost:9333", "comma-separated master servers") iamStandaloneOptions.ip = cmdIam.Flag.String("ip", util.DetectedHostAddress(), "iam server http listen ip address") iamStandaloneOptions.port = cmdIam.Flag.Int("port", 8111, "iam server http listen port") } var cmdIam = &Command{ - UsageLine: "iam [-port=8111] [-filer=<ip:port>] [-master=<ip:port>,<ip:port>]", + UsageLine: "iam [-port=8111] [-filer=<ip:port>[,<ip:port>]...] [-master=<ip:port>,<ip:port>]", Short: "start a iam API compatible server", - Long: "start a iam API compatible server.", + Long: `start a iam API compatible server. + + Multiple filer addresses can be specified for high availability, separated by commas.`, } func runIam(cmd *Command, args []string) bool { @@ -52,24 +55,24 @@ func runIam(cmd *Command, args []string) bool { } func (iamopt *IamOptions) startIamServer() bool { - filerAddress := pb.ServerAddress(*iamopt.filer) + filerAddresses := pb.ServerAddresses(*iamopt.filer).ToAddresses() util.LoadSecurityConfiguration() grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") for { - err := pb.WithGrpcFilerClient(false, 0, filerAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + err := pb.WithOneOfGrpcFilerClients(false, filerAddresses, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { resp, err := client.GetFilerConfiguration(context.Background(), &filer_pb.GetFilerConfigurationRequest{}) if err != nil { - return fmt.Errorf("get filer %s configuration: %v", filerAddress, err) + return fmt.Errorf("get filer configuration: %v", err) } glog.V(0).Infof("IAM read filer configuration: %s", resp) return nil }) if err != nil { - glog.V(0).Infof("wait to connect to filer %s grpc address %s", *iamopt.filer, filerAddress.ToGrpcAddress()) + glog.V(0).Infof("wait to connect to filers %v", filerAddresses) time.Sleep(time.Second) } else { - glog.V(0).Infof("connected to filer %s grpc address %s", *iamopt.filer, filerAddress.ToGrpcAddress()) + glog.V(0).Infof("connected to filers %v", filerAddresses) break } } @@ -78,7 +81,7 @@ func (iamopt *IamOptions) startIamServer() bool { router := mux.NewRouter().SkipClean(true) iamApiServer, iamApiServer_err := iamapi.NewIamApiServer(router, &iamapi.IamServerOption{ Masters: masters, - Filer: filerAddress, + Filers: filerAddresses, Port: *iamopt.port, GrpcDialOption: grpcDialOption, }) @@ -87,8 +90,10 @@ func (iamopt *IamOptions) startIamServer() bool { glog.Fatalf("IAM API Server startup error: %v", iamApiServer_err) } - // Ensure cleanup on shutdown - defer iamApiServer.Shutdown() + // Register shutdown handler to prevent goroutine leak + grace.OnInterrupt(func() { + iamApiServer.Shutdown() + }) listenAddress := fmt.Sprintf(":%d", *iamopt.port) iamApiListener, iamApiLocalListener, err := util.NewIpAndLocalListeners(*iamopt.ip, *iamopt.port, time.Duration(10)*time.Second) |
