blob: a7544bc8a46a1862192634ee95bb10885b4143d4 [file] [log] [blame] [edit]
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a MIT
// license that can be found in the LICENSE file.
package main
import (
"os"
"runtime"
"runtime/pprof"
"time"
)
func init() {
register("Cockroach2448", Cockroach2448)
}
type Stopper_cockroach2448 struct {
Done chan bool
}
func (s *Stopper_cockroach2448) ShouldStop() <-chan bool {
return s.Done
}
type EventMembershipChangeCommitted_cockroach2448 struct {
Callback func()
}
type MultiRaft_cockroach2448 struct {
stopper *Stopper_cockroach2448
Events chan interface{}
callbackChan chan func()
}
// sendEvent can be invoked many times
func (m *MultiRaft_cockroach2448) sendEvent(event interface{}) {
select {
case m.Events <- event: // Waiting for events consumption
case <-m.stopper.ShouldStop():
}
}
type state_cockroach2448 struct {
*MultiRaft_cockroach2448
}
func (s *state_cockroach2448) start() {
for {
select {
case <-s.stopper.ShouldStop():
return
case cb := <-s.callbackChan:
cb()
default:
s.handleWriteResponse()
time.Sleep(100 * time.Microsecond)
}
}
}
func (s *state_cockroach2448) handleWriteResponse() {
s.sendEvent(&EventMembershipChangeCommitted_cockroach2448{
Callback: func() {
select {
case s.callbackChan <- func() { // Waiting for callbackChan consumption
time.Sleep(time.Nanosecond)
}:
case <-s.stopper.ShouldStop():
}
},
})
}
type Store_cockroach2448 struct {
multiraft *MultiRaft_cockroach2448
}
func (s *Store_cockroach2448) processRaft() {
for {
select {
case e := <-s.multiraft.Events:
switch e := e.(type) {
case *EventMembershipChangeCommitted_cockroach2448:
callback := e.Callback
runtime.Gosched()
if callback != nil {
callback() // Waiting for callbackChan consumption
}
}
case <-s.multiraft.stopper.ShouldStop():
return
}
}
}
func NewStoreAndState_cockroach2448() (*Store_cockroach2448, *state_cockroach2448) {
stopper := &Stopper_cockroach2448{
Done: make(chan bool),
}
mltrft := &MultiRaft_cockroach2448{
stopper: stopper,
Events: make(chan interface{}),
callbackChan: make(chan func()),
}
st := &state_cockroach2448{mltrft}
s := &Store_cockroach2448{mltrft}
return s, st
}
func Cockroach2448() {
prof := pprof.Lookup("goroutineleak")
defer func() {
time.Sleep(100 * time.Millisecond)
prof.WriteTo(os.Stdout, 2)
}()
for i := 0; i < 1000; i++ {
go func() {
s, st := NewStoreAndState_cockroach2448()
go s.processRaft() // G1
go st.start() // G2
}()
}
}