From 5b8f52cdd0b790158fdbe88d0fd902d24f8a996d Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Fri, 3 May 2024 18:49:35 +0200 Subject: pkg/fuzzer: introduce a request restarter layer Make Result statuses more elaborate. Instead of retrying inputs directly in rpc.go, extract this logic to a separate entity in pkg/fuzzer/queue. --- pkg/fuzzer/queue/retry.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 pkg/fuzzer/queue/retry.go (limited to 'pkg/fuzzer/queue/retry.go') diff --git a/pkg/fuzzer/queue/retry.go b/pkg/fuzzer/queue/retry.go new file mode 100644 index 000000000..0b2e02ba5 --- /dev/null +++ b/pkg/fuzzer/queue/retry.go @@ -0,0 +1,37 @@ +// Copyright 2024 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package queue + +type retryer struct { + pq *PlainQueue + base Source +} + +// Retry adds a layer that resends results with Status=Restarted. +func Retry(base Source) Source { + return &retryer{ + base: base, + pq: Plain(), + } +} + +func (r *retryer) Next() *Request { + req := r.pq.tryNext() + if req == nil { + req = r.base.Next() + } + if req != nil { + req.OnDone(r.done) + } + return req +} + +func (r *retryer) done(req *Request, res *Result) bool { + // The input was on a restarted VM. + if res.Status == Restarted { + r.pq.Submit(req) + return false + } + return true +} -- cgit mrf-deployment