Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions internal/benchmarking/glutton/fake/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ const (
IngestRoute = glutton.IngestRoute
PingRoute = glutton.PingRoute
UseCPURoute = glutton.UseCPURoute
RunScriptRoute = glutton.RunScriptRoute
)

// Server is an httptest-backed stand-in for a glutton actor holding one file.
Expand Down Expand Up @@ -72,6 +73,7 @@ type Server struct {
burnMillis []int64
ingestSizes []int64
cpuRequests []*gluttonpb.UseCPURequest
scripts []*gluttonpb.RunScriptRequest
}

func (s *Server) reportedDigest() []byte {
Expand Down Expand Up @@ -135,6 +137,13 @@ func (s *Server) RecordedRAMReadSizes() []string {
return append([]string(nil), s.ramReadSizes...)
}

// RecordedScripts returns each /runscript request.
func (s *Server) RecordedScripts() []*gluttonpb.RunScriptRequest {
s.mu.Lock()
defer s.mu.Unlock()
return append([]*gluttonpb.RunScriptRequest(nil), s.scripts...)
}

// RecordedCPURequests returns each /usecpu request.
func (s *Server) RecordedCPURequests() []*gluttonpb.UseCPURequest {
s.mu.Lock()
Expand Down Expand Up @@ -317,6 +326,26 @@ func (s *Server) serve(w http.ResponseWriter, r *http.Request) {
resp, _ := proto.Marshal(&gluttonpb.UseCPUResponse{NumCores: req.GetNumCores()})
_, _ = w.Write(resp)

case RunScriptRoute:
body, err := io.ReadAll(r.Body)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
var req gluttonpb.RunScriptRequest
if err := proto.Unmarshal(body, &req); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
s.mu.Lock()
s.scripts = append(s.scripts, &req)
s.mu.Unlock()

// The fake does no work, so the script is instant: every node
// entered once, every request run.
resp, _ := proto.Marshal(&gluttonpb.RunScriptResponse{Result: mirrorBlock(req.GetScript())})
_, _ = w.Write(resp)

default:
http.NotFound(w, r)
}
Expand All @@ -335,3 +364,27 @@ func (s *Server) RecordedIngestSizes() []int64 {
defer s.mu.Unlock()
return append([]int64(nil), s.ingestSizes...)
}

// mirrorBlock builds the result tree the real glutton would return for a
// script that cost nothing: one pass per node and one request per leaf.
func mirrorBlock(block *gluttonpb.Block) *gluttonpb.StepResult {
result := &gluttonpb.StepResult{Stats: &gluttonpb.Stats{Passes: 1}}
for _, step := range block.GetSteps() {
var child *gluttonpb.StepResult
switch kind := step.GetKind().(type) {
case *gluttonpb.Step_Block:
child = mirrorBlock(kind.Block)
case *gluttonpb.Step_Operation:
child = &gluttonpb.StepResult{Stats: &gluttonpb.Stats{Passes: 1}}
for range kind.Operation.GetRequests() {
child.Children = append(child.Children, &gluttonpb.StepResult{Stats: &gluttonpb.Stats{Passes: 1, RequestsRun: 1}})
child.Stats.RequestsRun++
}
default:
child = &gluttonpb.StepResult{Stats: &gluttonpb.Stats{}}
}
result.Children = append(result.Children, child)
result.Stats.RequestsRun += child.GetStats().GetRequestsRun()
}
return result
}
1 change: 1 addition & 0 deletions internal/benchmarking/glutton/glutton.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,5 @@ const (
BurnCPURoute = "/burncpu"
IngestRoute = "/ingest"
UseCPURoute = "/usecpu"
RunScriptRoute = "/runscript"
)
Loading
Loading