package main

import (
	"os"
	"os/signal"
	"syscall"
	"time"

	"github.com/juju/errors"
	"github.com/pingcap/schrodinger-test/nemesis/arsenal"
	"github.com/pingcap/schrodinger/pkg/test_client"
	"golang.org/x/net/context"
)

var (
	injectTime = 10 * time.Minute
)

func main() {
	client.Info("[failpoint] start...")

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

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

	for {
		if err := failpoint(cli); err != nil {
			client.Fatalf("[failpoint] return with error %v", client.ErrorStack(err))
		}
	}
}

func failpoint(nemesisCli *client.Client) error {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	arsenal.RecoverNodes(ctx, nemesisCli)

	return errors.Trace(arsenal.InjectFailpointWithRecover(ctx, nemesisCli, "tikv", injectTime))
}
