Merge branch '17840-unparsed-args'
authorTom Clegg <tom@curii.com>
Thu, 18 Nov 2021 16:37:06 +0000 (11:37 -0500)
committerTom Clegg <tom@curii.com>
Thu, 18 Nov 2021 16:37:06 +0000 (11:37 -0500)
fixes #17840

Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

1  2 
services/keepstore/command.go

index 519f45d2c64d4c722ea9e4154e537bd193b32794,94dabfda6207d564fc605cce499c967f0af25b35..555f16dfe1f290edbd1797437efd3842ad29dd4e
@@@ -27,21 -27,23 +27,22 @@@ import 
  )
  
  var (
 -      version = "dev"
        Command = service.Command(arvados.ServiceNameKeepstore, newHandlerOrErrorHandler)
  )
  
  func runCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
-       args, ok := convertKeepstoreFlagsToServiceFlags(args, ctxlog.FromContext(context.Background()))
+       args, ok, code := convertKeepstoreFlagsToServiceFlags(prog, args, ctxlog.FromContext(context.Background()), stderr)
        if !ok {
-               return 2
+               return code
        }
        return Command.RunCommand(prog, args, stdin, stdout, stderr)
  }
  
  // Parse keepstore command line flags, and return equivalent
- // service.Command flags. The second return value ("ok") is true if
- // all provided flags were successfully converted.
- func convertKeepstoreFlagsToServiceFlags(args []string, lgr logrus.FieldLogger) ([]string, bool) {
+ // service.Command flags. If the second return value ("ok") is false,
+ // the program should exit, and the third return value is a suitable
+ // exit code.
+ func convertKeepstoreFlagsToServiceFlags(prog string, args []string, lgr logrus.FieldLogger, stderr io.Writer) ([]string, bool, int) {
        flags := flag.NewFlagSet("", flag.ContinueOnError)
        flags.String("listen", "", "Services.Keepstore.InternalURLs")
        flags.Int("max-buffers", 0, "API.MaxKeepBlobBuffers")
        flags.String("config", "", "")
        flags.String("legacy-keepstore-config", "", "")
  
-       err := flags.Parse(args)
-       if err == flag.ErrHelp {
-               return []string{"-help"}, true
-       } else if err != nil {
-               return nil, false
+       if ok, code := cmd.ParseFlags(flags, prog, args, "", stderr); !ok {
+               return nil, false, code
        }
  
        args = nil
                }
        })
        if !ok {
-               return nil, false
+               return nil, false, 2
        }
  
-       flags = flag.NewFlagSet("", flag.ExitOnError)
+       flags = flag.NewFlagSet("", flag.ContinueOnError)
        loader := config.NewLoader(nil, lgr)
        loader.SetupFlags(flags)
-       return loader.MungeLegacyConfigArgs(lgr, args, "-legacy-keepstore-config"), true
+       return loader.MungeLegacyConfigArgs(lgr, args, "-legacy-keepstore-config"), true, 0
  }
  
  type handler struct {
@@@ -168,7 -167,7 +166,7 @@@ func (h *handler) setup(ctx context.Con
                return errors.New("no volumes configured")
        }
  
 -      h.Logger.Printf("keepstore %s starting, pid %d", version, os.Getpid())
 +      h.Logger.Printf("keepstore %s starting, pid %d", cmd.Version.String(), os.Getpid())
  
        // Start a round-robin VolumeManager with the configured volumes.
        vm, err := makeRRVolumeManager(h.Logger, h.Cluster, serviceURL, newVolumeMetricsVecs(reg))