mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-09 22:51:02 +00:00
Merge pull request #1347 from yuce/1342-remove-bench
Removes bench command
This commit is contained in:
commit
d79586a434
6 changed files with 10 additions and 330 deletions
57
cmd/bench.go
57
cmd/bench.go
|
|
@ -1,57 +0,0 @@
|
|||
// Copyright 2017 Pilosa Corp.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"os"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"github.com/pilosa/pilosa/ctl"
|
||||
)
|
||||
|
||||
var Bencher *ctl.BenchCommand
|
||||
|
||||
func NewBenchCommand(stdin io.Reader, stdout, stderr io.Writer) *cobra.Command {
|
||||
Bencher = ctl.NewBenchCommand(os.Stdin, os.Stdout, os.Stderr)
|
||||
benchCmd := &cobra.Command{
|
||||
Use: "bench",
|
||||
Short: "Benchmark operations.",
|
||||
Long: `
|
||||
Executes a benchmark for a given operation against the index.
|
||||
`,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if err := Bencher.Run(context.Background()); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
},
|
||||
}
|
||||
flags := benchCmd.Flags()
|
||||
flags.StringVarP(&Bencher.Host, "host", "", "localhost:10101", "host:port of Pilosa.")
|
||||
flags.StringVarP(&Bencher.Index, "index", "i", "", "Pilosa index to benchmark.")
|
||||
flags.StringVarP(&Bencher.Frame, "frame", "f", "", "Frame to benchmark.")
|
||||
flags.StringVarP(&Bencher.Op, "operation", "o", "set-bit", "Operation to perform: choose from [set-bit]")
|
||||
flags.IntVarP(&Bencher.N, "num", "n", 0, "Number of operations to perform.")
|
||||
ctl.SetTLSConfig(flags, &Bencher.TLS.CertificatePath, &Bencher.TLS.CertificateKeyPath, &Bencher.TLS.SkipVerify)
|
||||
|
||||
return benchCmd
|
||||
}
|
||||
|
||||
func init() {
|
||||
subcommandFns["bench"] = NewBenchCommand
|
||||
}
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
// Copyright 2017 Pilosa Corp.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package cmd_test
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/pilosa/pilosa/cmd"
|
||||
)
|
||||
|
||||
func TestBenchHelp(t *testing.T) {
|
||||
output, err := ExecNewRootCommand(t, "bench", "--help")
|
||||
if !strings.Contains(output, "Usage:") ||
|
||||
!strings.Contains(output, "Flags:") ||
|
||||
!strings.Contains(output, "pilosa bench") || err != nil {
|
||||
t.Fatalf("Command 'bench --help' not working, err: '%v', output: '%s'", err, output)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBenchConfig(t *testing.T) {
|
||||
tests := []commandTest{
|
||||
{
|
||||
args: []string{"bench", "--operation", "set-bit"},
|
||||
env: map[string]string{"PILOSA_HOST": "localhost:12345"},
|
||||
cfgFileContent: `
|
||||
index = "myindex"
|
||||
frame = "f1"
|
||||
`,
|
||||
validation: func() error {
|
||||
v := validator{}
|
||||
v.Check(cmd.Bencher.Host, "localhost:12345")
|
||||
v.Check(cmd.Bencher.Index, "myindex")
|
||||
v.Check(cmd.Bencher.Frame, "f1")
|
||||
v.Check(cmd.Bencher.Op, "set-bit")
|
||||
v.Check(cmd.Bencher.N, 0)
|
||||
return v.Error()
|
||||
},
|
||||
},
|
||||
}
|
||||
executeDry(t, tests)
|
||||
}
|
||||
116
ctl/bench.go
116
ctl/bench.go
|
|
@ -1,116 +0,0 @@
|
|||
// Copyright 2017 Pilosa Corp.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package ctl
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
||||
"github.com/pilosa/pilosa"
|
||||
"github.com/pilosa/pilosa/internal"
|
||||
"github.com/pilosa/pilosa/server"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// BenchCommand represents a command for benchmarking index operations.
|
||||
type BenchCommand struct {
|
||||
// Destination host and port.
|
||||
Host string
|
||||
|
||||
// Name of the index & frame to execute against.
|
||||
Index string
|
||||
Frame string
|
||||
|
||||
// Type of operation and number to execute.
|
||||
Op string
|
||||
N int
|
||||
|
||||
// Standard input/output
|
||||
*pilosa.CmdIO
|
||||
|
||||
TLS server.TLSConfig
|
||||
}
|
||||
|
||||
// NewBenchCommand returns a new instance of BenchCommand.
|
||||
func NewBenchCommand(stdin io.Reader, stdout, stderr io.Writer) *BenchCommand {
|
||||
return &BenchCommand{
|
||||
CmdIO: pilosa.NewCmdIO(stdin, stdout, stderr),
|
||||
}
|
||||
}
|
||||
|
||||
// Run executes the bench command.
|
||||
func (cmd *BenchCommand) Run(ctx context.Context) error {
|
||||
// Create a client to the server.
|
||||
client, err := CommandClient(cmd)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "creating client")
|
||||
}
|
||||
|
||||
switch cmd.Op {
|
||||
case "set-bit":
|
||||
return cmd.runSetBit(ctx, client)
|
||||
case "":
|
||||
return errors.New("op required")
|
||||
default:
|
||||
return fmt.Errorf("unknown bench op: %q", cmd.Op)
|
||||
}
|
||||
}
|
||||
|
||||
// runSetBit executes a benchmark of random SetBit() operations.
|
||||
func (cmd *BenchCommand) runSetBit(ctx context.Context, client pilosa.InternalClient) error {
|
||||
if cmd.N == 0 {
|
||||
return errors.New("operation count required")
|
||||
} else if cmd.Index == "" {
|
||||
return pilosa.ErrIndexRequired
|
||||
} else if cmd.Frame == "" {
|
||||
return pilosa.ErrFrameRequired
|
||||
}
|
||||
|
||||
const maxRowID = 1000
|
||||
const maxColumnID = 100000
|
||||
|
||||
startTime := time.Now()
|
||||
|
||||
// Execute operation continuously.
|
||||
for i := 0; i < cmd.N; i++ {
|
||||
rowID := rand.Intn(maxRowID)
|
||||
columnID := rand.Intn(maxColumnID)
|
||||
|
||||
queryRequest := &internal.QueryRequest{
|
||||
Query: fmt.Sprintf(`SetBit(row=%d, frame="%s", col=%d)`, rowID, cmd.Frame, columnID),
|
||||
Remote: false,
|
||||
}
|
||||
if _, err := client.Query(ctx, cmd.Index, queryRequest); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Print results.
|
||||
elapsed := time.Since(startTime)
|
||||
fmt.Fprintf(cmd.Stdout, "Executed %d operations in %s (%0.3f op/sec)\n", cmd.N, elapsed, float64(cmd.N)/elapsed.Seconds())
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cmd *BenchCommand) TLSHost() string {
|
||||
return cmd.Host
|
||||
}
|
||||
|
||||
func (cmd *BenchCommand) TLSConfiguration() server.TLSConfig {
|
||||
return cmd.TLS
|
||||
}
|
||||
|
|
@ -1,98 +0,0 @@
|
|||
// Copyright 2017 Pilosa Corp.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package ctl
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/pilosa/pilosa"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func TestBenchCommand_InvalidOption(t *testing.T) {
|
||||
buf := bytes.Buffer{}
|
||||
stdin, stdout, stderr := GetIO(buf)
|
||||
|
||||
cm := NewBenchCommand(stdin, stdout, stderr)
|
||||
err := cm.Run(context.Background())
|
||||
if errors.Cause(err) != pilosa.ErrHostRequired {
|
||||
t.Fatalf("Expect err: %s, actual err: %s", pilosa.ErrHostRequired, err)
|
||||
}
|
||||
|
||||
cm.Host = "localhost:10101"
|
||||
err = cm.Run(context.Background())
|
||||
if err.Error() != "op required" {
|
||||
t.Fatalf("Expect err: %s, actual err: %s", "op required", err)
|
||||
}
|
||||
|
||||
cm.Op = "test"
|
||||
err = cm.Run(context.Background())
|
||||
if err.Error() != "unknown bench op: \"test\"" {
|
||||
t.Fatalf("Expect err: %s, actual err: %s", "unknown bench op: test", err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestBenchCommand_Run(t *testing.T) {
|
||||
rder := []byte{}
|
||||
stdin := bytes.NewReader(rder)
|
||||
r, w, _ := os.Pipe()
|
||||
|
||||
cm := NewBenchCommand(stdin, w, w)
|
||||
cm.Op = "set-bit"
|
||||
cm.Host = "localhost:10101"
|
||||
|
||||
err := cm.Run(context.Background())
|
||||
if err.Error() != "operation count required" {
|
||||
t.Fatalf("Expect error: %s, actual err: %s", "operation count required", err)
|
||||
}
|
||||
|
||||
cm.N = 1
|
||||
err = cm.Run(context.Background())
|
||||
if err != pilosa.ErrIndexRequired {
|
||||
t.Fatalf("Expect error: %s, actual err: %s", pilosa.ErrIndexRequired, err)
|
||||
}
|
||||
|
||||
cm.Index = "i"
|
||||
err = cm.Run(context.Background())
|
||||
if err != pilosa.ErrFrameRequired {
|
||||
t.Fatalf("Expect error: %s, actual err: %s", pilosa.ErrFrameRequired, err)
|
||||
}
|
||||
|
||||
cm.Frame = "f"
|
||||
err = cm.Run(context.Background())
|
||||
w.Close()
|
||||
var buf bytes.Buffer
|
||||
io.Copy(&buf, r)
|
||||
fmt.Println(buf.String())
|
||||
if err != nil {
|
||||
fmt.Println(buf.String())
|
||||
}
|
||||
}
|
||||
|
||||
// declare stdin, stdout, stderr
|
||||
func GetIO(buf bytes.Buffer) (io.Reader, io.Writer, io.Writer) {
|
||||
rder := []byte{}
|
||||
stdin := bytes.NewReader(rder)
|
||||
stdout := bufio.NewWriter(&buf)
|
||||
stderr := bufio.NewWriter(&buf)
|
||||
return stdin, stdout, stderr
|
||||
}
|
||||
|
|
@ -15,6 +15,7 @@
|
|||
package ctl
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"io"
|
||||
|
|
@ -180,3 +181,12 @@ func MustNewHTTPRequest(method, urlStr string, body io.Reader) *http.Request {
|
|||
}
|
||||
return req
|
||||
}
|
||||
|
||||
// declare stdin, stdout, stderr
|
||||
func GetIO(buf bytes.Buffer) (io.Reader, io.Writer, io.Writer) {
|
||||
rder := []byte{}
|
||||
stdin := bytes.NewReader(rder)
|
||||
stdout := bufio.NewWriter(&buf)
|
||||
stderr := bufio.NewWriter(&buf)
|
||||
return stdin, stdout, stderr
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,7 +49,6 @@ There are four ways to install Pilosa on MacOS: Use [Homebrew](https://brew.sh/)
|
|||
pilosa [command]
|
||||
|
||||
Available Commands:
|
||||
bench Benchmark operations.
|
||||
check Do a consistency check on a pilosa data file.
|
||||
config Print the current configuration.
|
||||
export Export data from pilosa.
|
||||
|
|
@ -108,7 +107,6 @@ There are four ways to install Pilosa on MacOS: Use [Homebrew](https://brew.sh/)
|
|||
pilosa [command]
|
||||
|
||||
Available Commands:
|
||||
bench Benchmark operations.
|
||||
check Do a consistency check on a pilosa data file.
|
||||
config Print the current configuration.
|
||||
export Export data from pilosa.
|
||||
|
|
@ -173,7 +171,6 @@ There are four ways to install Pilosa on MacOS: Use [Homebrew](https://brew.sh/)
|
|||
pilosa [command]
|
||||
|
||||
Available Commands:
|
||||
bench Benchmark operations.
|
||||
check Do a consistency check on a pilosa data file.
|
||||
config Print the current configuration.
|
||||
export Export data from pilosa.
|
||||
|
|
@ -262,7 +259,6 @@ There are three ways to install Pilosa on Linux: download the binary (recommende
|
|||
pilosa [command]
|
||||
|
||||
Available Commands:
|
||||
bench Benchmark operations.
|
||||
check Do a consistency check on a pilosa data file.
|
||||
config Print the current configuration.
|
||||
export Export data from pilosa.
|
||||
|
|
@ -327,7 +323,6 @@ There are three ways to install Pilosa on Linux: download the binary (recommende
|
|||
pilosa [command]
|
||||
|
||||
Available Commands:
|
||||
bench Benchmark operations.
|
||||
check Do a consistency check on a pilosa data file.
|
||||
config Print the current configuration.
|
||||
export Export data from pilosa.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue