package main

import (
	"flag"
	"fmt"
	"github.com/pingcap/schrodinger/pkg/test_client"
	"golang.org/x/net/context"
	"io/ioutil"
	"os"
	"os/exec"
	"os/signal"
	"syscall"
)

func main() {
	flag.Parse()
	client.Info("[rocksdb_stress] start...")

	_, cancel := context.WithCancel(context.Background())

	sc := make(chan os.Signal, 1)
	signal.Notify(sc,
		syscall.SIGHUP,
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGQUIT)
	go func() {
		sig := <-sc
		client.Infof("[rocksdb_stress] Got signal [%s] to exist.", sig)
		cancel()
		os.Exit(0)
	}()

	client.Info("[rocksdb_stress ] Running shell command: db_stress")

	cmdProps := "--ops_per_thread=10000 --threads=40 --value_size_mult=33 " +
		"--set_options_one_in=1 --compact_range_one_in=1 --acquire_snapshot_one_in=1 " +
		"--ingest_external_file_one_in=1 --compact_files_one_in=1 --checkpoint_one_in=1 " +
		"--backup_one_in=0 --nooverwritepercent=0 --delrangepercent=10 --delpercent=15 " +
		"--readpercent=15 --writepercent=30 --iterpercent=15 --prefixpercent=15 " +
		"--max_background_compactions=20 --max_background_flushes=20 --enable_pipelined_write=true"
	cmd := exec.Command("sh", "-c", fmt.Sprintf("/usr/local/rocksdb/bin/db_stress %s", cmdProps))
	stdout, err := cmd.StdoutPipe()
	if err != nil {
		client.Fatalf("[rocksdb_stress] Get db_stress stdout error %v", client.ErrorStack(err))
	}
	if err := cmd.Start(); err != nil {
		client.Fatalf("[rocksdb_stress] Start db_stress error %v", client.ErrorStack(err))
	}

	b, err := ioutil.ReadAll(stdout)
	if err != nil {
		client.Fatalf("[rocksdb_stress] Read db_stress stdout out error %v", client.ErrorStack(err))
	} else {
		client.Infof("[rocksdb_stress] Read db_stress stdout %s", b)
	}

	if err := cmd.Wait(); err != nil {
		client.Fatalf("[rocksdb_stress] db_stress exit error %v", client.ErrorStack(err))
	}

	client.Infof("[rocksdb_stress] Finish db_stress")
}
