featurebase/systemlayer.go
pokeeffe-molecula dca0dd84e3 implement fb_exec_requests system table (#2327)
implements an fb_exec_requests system table. The purpose of this table is to allow access to internal state to see what queries are running and have been run.
Co-authored-by: Travis Turner <travis@molecula.com>

(cherry picked from commit 47d8be26f5)
2022-12-12 09:01:20 -08:00

99 lines
2.7 KiB
Go

package pilosa
import (
"strings"
"time"
)
// ExecutionRequest holds data about an (sql) execution request
type ExecutionRequest struct {
// the id of the request
RequestID string
// the id of the user
UserID string
// time the request started
StartTime time.Time
// time the request finished - zero iif it has not finished
EndTime time.Time
// status of the request 'running' or 'complete' now, could have other values later
Status string
// future: if the request is waiting, the type of wait that is occuring
WaitType string
// future: the cumulative wait time for this request
WaitTime time.Duration
// futuure: if the request is waiting, the thing it is waiting on
WaitResource string
// future: the cululative cpu time for this request
CPUTime time.Duration
// the elapsed time for this request
ElapsedTime time.Duration
// future: the cumulative number of physical reads for this request
Reads int64
// future: the cumulative number of physical writes for this request
Writes int64
// future: the cumulative number of logical reads for this request
LogicalReads int64
// future: the cumulative number of rows affected for this request
RowCount int64
// the query plan for this request formatted in json
Plan string
// the sql for this request
SQL string
}
// Copy returns a copy of the ExecutionRequest passed
func (e *ExecutionRequest) Copy() ExecutionRequest {
var elapsedTime time.Duration
if !strings.EqualFold(e.Status, "complete") {
elapsedTime = time.Since(e.StartTime)
} else {
elapsedTime = e.EndTime.Sub(e.StartTime)
}
return ExecutionRequest{
RequestID: e.RequestID,
UserID: e.UserID,
StartTime: e.StartTime,
EndTime: e.EndTime,
Status: e.Status,
WaitType: e.WaitType,
WaitTime: e.WaitTime,
WaitResource: e.WaitResource,
CPUTime: e.CPUTime,
ElapsedTime: elapsedTime,
SQL: e.SQL,
Plan: e.Plan,
}
}
// ExecutionRequestsAPI defines the API for storing, updating and querying internal state
// around (sql) execution requests
type ExecutionRequestsAPI interface {
// add a request
AddRequest(requestID string, userID string, startTime time.Time, sql string) error
// update a request
UpdateRequest(requestID string,
endTime time.Time,
status string,
waitType string,
waitTime time.Duration,
waitResource string,
cpuTime time.Duration,
reads int64,
writes int64,
logicalReads int64,
rowCount int64,
plan string) error
// list all the requests
ListRequests() ([]ExecutionRequest, error)
// get a specific request
GetRequest(requestID string) (ExecutionRequest, error)
}
// SystemLayerAPI defines an api to allow access to internal FeatureBase state
type SystemLayerAPI interface {
ExecutionRequests() ExecutionRequestsAPI
}