X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=app%2Fapp.go;h=358813301b539a8c6ac170366ff7d3031f622b57;hb=10dbb38516c6ac149373ac0fae917a34ab7a9afa;hp=1d44bab534f2d0f711cf4c1cfe82d844f913543e;hpb=0b7bb57744ef4be1855155bccd96f6370061c009;p=pstop.git diff --git a/app/app.go b/app/app.go index 1d44bab..3588133 100644 --- a/app/app.go +++ b/app/app.go @@ -1,6 +1,6 @@ -// lib - library routines for pstop. +// app - pstop application package // -// this file contains the library routines related to the stored state in pstop. +// This file contains the library routines related to running the app. package app import ( @@ -45,12 +45,14 @@ const ( ) var ( - re_valid_version = regexp.MustCompile(`^(5\.[67]\.|10\.[01])`) + re_valid_version = regexp.MustCompile(`^(5\.[67]\.|10\.[01])`) ) type App struct { + done chan struct{} + sigChan chan os.Signal + wi wait_info.WaitInfo finished bool - datadir string dbh *sql.DB help bool hostname string @@ -72,13 +74,11 @@ func (app *App) Setup(dbh *sql.DB) { app.dbh = dbh if err := app.validate_mysql_version(); err != nil { - log.Fatal(err) - } + log.Fatal(err) + } app.finished = false - app.screen.Initialise() - app.setup_instruments = setup_instruments.NewSetupInstruments(dbh) app.setup_instruments.EnableMonitoring() @@ -97,11 +97,11 @@ func (app *App) Setup(dbh *sql.DB) { app.tiwsbt.SetWantRelativeStats(app.want_relative_stats) app.tiwsbt.SetNow() app.users.SetWantRelativeStats(app.want_relative_stats) // ignored - app.users.SetNow() // ignored + app.users.SetNow() // ignored app.essgben.SetWantRelativeStats(app.want_relative_stats) app.essgben.SetNow() app.ewsgben.SetWantRelativeStats(app.want_relative_stats) // ignored - app.ewsgben.SetNow() // ignored + app.ewsgben.SetNow() // ignored app.ResetDBStatistics() @@ -115,10 +115,8 @@ func (app *App) Setup(dbh *sql.DB) { hostname = hostname[0:index] } _, mysql_version := lib.SelectGlobalVariableByVariableName(app.dbh, "VERSION") - _, datadir := lib.SelectGlobalVariableByVariableName(app.dbh, "DATADIR") app.SetHostname(hostname) app.SetMySQLVersion(mysql_version) - app.SetDatadir(datadir) } // have we finished ? @@ -171,6 +169,7 @@ func (app *App) Collect() { case showStages: app.essgben.Collect(app.dbh) } + app.wi.CollectedNow() lib.Logger.Println("app.Collect() took", time.Duration(time.Since(start)).String()) } @@ -178,10 +177,6 @@ func (app App) MySQLVersion() string { return app.mysql_version } -func (app App) Datadir() string { - return app.datadir -} - func (app *App) SetHelp(newHelp bool) { app.help = newHelp @@ -189,10 +184,6 @@ func (app *App) SetHelp(newHelp bool) { app.screen.Flush() } -func (app *App) SetDatadir(datadir string) { - app.datadir = datadir -} - func (app *App) SetMySQLVersion(mysql_version string) { app.mysql_version = mysql_version } @@ -505,42 +496,28 @@ func (app *App) Cleanup() { } } -// make chan for termbox events and run a poller to send events to the channel -// - return the channel -func new_tb_chan() chan termbox.Event { - termboxChan := make(chan termbox.Event) - go func() { - for { - termboxChan <- termbox.PollEvent() - } - }() - return termboxChan -} - // get into a run loop func (app *App) Run() { - done := make(chan struct{}) - defer close(done) + app.done = make(chan struct{}) + defer close(app.done) - sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + app.sigChan = make(chan os.Signal, 1) + signal.Notify(app.sigChan, syscall.SIGINT, syscall.SIGTERM) - var wi wait_info.WaitInfo - wi.SetWaitInterval(time.Second) + app.wi.SetWaitInterval(time.Second) - termboxChan := new_tb_chan() + termboxChan := app.screen.TermBoxChan() for !app.Finished() { select { - case <-done: - fmt.Println("exiting") + case <-app.done: + fmt.Println("app.done(): exiting") app.SetFinished() - case sig := <-sigChan: + case sig := <-app.sigChan: fmt.Println("Caught a signal", sig) - done <- struct{}{} - case <-wi.WaitNextPeriod(): + app.done <- struct{}{} + case <-app.wi.WaitNextPeriod(): app.Collect() - wi.CollectedNow() app.Display() case event := <-termboxChan: // switch on event type @@ -558,11 +535,11 @@ func (app *App) Run() { } switch event.Ch { case '-': // decrease the interval if > 1 - if wi.WaitInterval() > time.Second { - wi.SetWaitInterval(wi.WaitInterval() - time.Second) + if app.wi.WaitInterval() > time.Second { + app.wi.SetWaitInterval(app.wi.WaitInterval() - time.Second) } case '+': // increase interval by creating a new ticker - wi.SetWaitInterval(wi.WaitInterval() + time.Second) + app.wi.SetWaitInterval(app.wi.WaitInterval() + time.Second) case 'h', '?': // help app.SetHelp(!app.Help()) case 'q': // quit @@ -588,37 +565,37 @@ func (app *App) Run() { // rather than giving an error message if the requires P_S tables can't // be found. func (app *App) validate_mysql_version() error { - var tables = [...]string{ - "performance_schema.events_waits_summary_global_by_event_name", - "performance_schema.file_summary_by_instance", - "performance_schema.table_io_waits_summary_by_table", - "performance_schema.table_lock_waits_summary_by_table", - } - - lib.Logger.Println("validate_mysql_version()") - - lib.Logger.Println("- Getting MySQL version") - err, mysql_version := lib.SelectGlobalVariableByVariableName(app.dbh, "VERSION") - if err != nil { - return err - } - lib.Logger.Println("- mysql_version: '" + mysql_version + "'") - - if !re_valid_version.MatchString(mysql_version) { - return errors.New(lib.MyName() + " does not work with MySQL version " + mysql_version) - } - lib.Logger.Println("OK: MySQL version is valid, continuing") - - lib.Logger.Println("Checking access to required tables:") - for i := range tables { - if err := lib.CheckTableAccess(app.dbh, tables[i]); err == nil { - lib.Logger.Println("OK: " + tables[i] + " found") - } else { - return err - } - } - lib.Logger.Println("OK: all table checks passed") - - return nil -} + var tables = [...]string{ + "performance_schema.events_stages_summary_global_by_event_name", + "performance_schema.events_waits_summary_global_by_event_name", + "performance_schema.file_summary_by_instance", + "performance_schema.table_io_waits_summary_by_table", + "performance_schema.table_lock_waits_summary_by_table", + } + + lib.Logger.Println("validate_mysql_version()") + + lib.Logger.Println("- Getting MySQL version") + err, mysql_version := lib.SelectGlobalVariableByVariableName(app.dbh, "VERSION") + if err != nil { + return err + } + lib.Logger.Println("- mysql_version: '" + mysql_version + "'") + if !re_valid_version.MatchString(mysql_version) { + return errors.New(lib.MyName() + " does not work with MySQL version " + mysql_version) + } + lib.Logger.Println("OK: MySQL version is valid, continuing") + + lib.Logger.Println("Checking access to required tables:") + for i := range tables { + if err := lib.CheckTableAccess(app.dbh, tables[i]); err == nil { + lib.Logger.Println("OK: " + tables[i] + " found") + } else { + return err + } + } + lib.Logger.Println("OK: all table checks passed") + + return nil +}