aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/fuzzer/queue/retry.go
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-05-03 18:49:35 +0200
committerDmitry Vyukov <dvyukov@google.com>2024-05-16 15:38:27 +0000
commit5b8f52cdd0b790158fdbe88d0fd902d24f8a996d (patch)
tree2827ebd34598426f41ad4c1e43c0549f29e8446a /pkg/fuzzer/queue/retry.go
parent03820adaef911ce08278d95f034f134c3c0c852e (diff)
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.
Diffstat (limited to 'pkg/fuzzer/queue/retry.go')
-rw-r--r--pkg/fuzzer/queue/retry.go37
1 files changed, 37 insertions, 0 deletions
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
+}