summaryrefslogtreecommitdiffstats
path: root/client/go/internal/cli/cmd/feed.go
diff options
context:
space:
mode:
Diffstat (limited to 'client/go/internal/cli/cmd/feed.go')
-rw-r--r--client/go/internal/cli/cmd/feed.go51
1 files changed, 26 insertions, 25 deletions
diff --git a/client/go/internal/cli/cmd/feed.go b/client/go/internal/cli/cmd/feed.go
index 8635f4aa41b..9d90233e62a 100644
--- a/client/go/internal/cli/cmd/feed.go
+++ b/client/go/internal/cli/cmd/feed.go
@@ -60,22 +60,11 @@ If FILE is a single dash ('-'), documents will be read from standard input.
Example: `$ vespa feed documents.jsonl
$ cat documents.jsonl | vespa feed -
`,
- Args: cobra.ExactArgs(1),
+ Args: cobra.MinimumNArgs(1),
DisableAutoGenTag: true,
SilenceUsage: true,
Hidden: true, // TODO(mpolden): Remove when ready for public use
RunE: func(cmd *cobra.Command, args []string) error {
- var r io.Reader
- if args[0] == "-" {
- r = cli.Stdin
- } else {
- f, err := os.Open(args[0])
- if err != nil {
- return err
- }
- defer f.Close()
- r = f
- }
if options.cpuprofile != "" {
f, err := os.Create(options.cpuprofile)
if err != nil {
@@ -84,7 +73,7 @@ $ cat documents.jsonl | vespa feed -
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
- err := feed(r, cli, options)
+ err := feed(args, options, cli)
if options.memprofile != "" {
f, err := os.Create(options.memprofile)
if err != nil {
@@ -123,7 +112,7 @@ func (opts feedOptions) compressionMode() (document.Compression, error) {
return 0, errHint(fmt.Errorf("invalid compression mode: %s", opts.compression), `Must be "auto", "gzip" or "none"`)
}
-func feed(r io.Reader, cli *CLI, options feedOptions) error {
+func feed(files []string, options feedOptions, cli *CLI) error {
service, err := documentService(cli)
if err != nil {
return err
@@ -145,20 +134,32 @@ func feed(r io.Reader, cli *CLI, options feedOptions) error {
// TODO(mpolden): Make doom duration configurable
circuitBreaker := document.NewCircuitBreaker(10*time.Second, 0)
dispatcher := document.NewDispatcher(client, throttler, circuitBreaker, cli.Stderr, options.verbose)
- dec := document.NewDecoder(r)
-
start := cli.now()
- for {
- doc, err := dec.Decode()
- if err == io.EOF {
- break
- }
- if err != nil {
- cli.printErr(fmt.Errorf("failed to decode document: %w", err))
+ for _, name := range files {
+ var r io.ReadCloser
+ if len(files) == 1 && name == "-" {
+ r = io.NopCloser(cli.Stdin)
+ } else {
+ f, err := os.Open(name)
+ if err != nil {
+ return err
+ }
+ r = f
}
- if err := dispatcher.Enqueue(doc); err != nil {
- cli.printErr(err)
+ dec := document.NewDecoder(r)
+ for {
+ doc, err := dec.Decode()
+ if err == io.EOF {
+ break
+ }
+ if err != nil {
+ cli.printErr(fmt.Errorf("failed to decode document: %w", err))
+ }
+ if err := dispatcher.Enqueue(doc); err != nil {
+ cli.printErr(err)
+ }
}
+ r.Close()
}
if err := dispatcher.Close(); err != nil {
return err