package main

import (
	"flag"
	"github.com/pingcap/schrodinger/pkg/test_client"
	"golang.org/x/net/context"
	_ "net/http/pprof"
	"os"
	"os/signal"
	"syscall"
	"time"
)

var (
	dbName       = flag.String("db", "test", "database name. default: test")
	concurrency  = flag.Int("concurrency", 200, "concurrency of sql.DB. default: 200")
	timeLimit    = flag.Int64("time", 60, "time limit (in minutes) to run the test. pass 0 to run forever. default: 60")
	logInterval  = flag.Int("log-interval", 300, "time interval (in secs) of logging count of executed commands. default: 300")
	queryThreads = flag.Int("query-threads", 16, "threads to run normal CURD queries. default: 16")
)

func main() {
	client.Info("[scan end limit] start...")
	flag.Parse()

	ctx, cancel := context.WithCancel(context.Background())
	cli := client.New(ctx, client.ModeOnline)

	//Monitoring system exit message
	sc := make(chan os.Signal, 1)
	signal.Notify(sc,
		syscall.SIGHUP,
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGQUIT)

	go func() {
		sig := <-sc
		client.Infof("[scan end limit] Got signal [%s] to exist.", sig)
		cancel()
		os.Exit(0)
	}()

	scanEndLimitCase := NewScanEndLimitCase(
		cli,
		*dbName,
		time.Minute*time.Duration(*timeLimit),
		time.Second*time.Duration(*logInterval),
		*queryThreads,
	)

	if err := scanEndLimitCase.Prepare(); err != nil {
		client.Fatalf("[scan end limit] Failed to prepare DB for test.")
	}
	if err := scanEndLimitCase.Run(ctx); err != nil {
		client.Fatalf("[scan end limit] Test failed.")
	}
}
