Source file src/runtime/testdata/testgoroutineleakprofile/goker/cockroach16167.go

     1  // Copyright 2025 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a MIT
     3  // license that can be found in the LICENSE file.
     4  
     5  /*
     6   * Project: cockroach
     7   * Issue or PR  : https://github.com/cockroachdb/cockroach/pull/16167
     8   * Buggy version: 36fa784aa846b46c29e077634c4e362635f6e74a
     9   * fix commit-id: d064942b067ab84628f79cbfda001fa3138d8d6e
    10   * Flaky: 1/100
    11   */
    12  
    13  package main
    14  
    15  import (
    16  	"os"
    17  	"runtime"
    18  	"runtime/pprof"
    19  	"sync"
    20  	"time"
    21  )
    22  
    23  func init() {
    24  	register("Cockroach16167", Cockroach16167)
    25  }
    26  
    27  type PreparedStatements_cockroach16167 struct {
    28  	session *Session_cockroach16167
    29  }
    30  
    31  func (ps PreparedStatements_cockroach16167) New(e *Executor_cockroach16167) {
    32  	e.Prepare(ps.session)
    33  }
    34  
    35  type Session_cockroach16167 struct {
    36  	PreparedStatements PreparedStatements_cockroach16167
    37  }
    38  
    39  func (s *Session_cockroach16167) resetForBatch(e *Executor_cockroach16167) {
    40  	e.getDatabaseCache()
    41  }
    42  
    43  type Executor_cockroach16167 struct {
    44  	systemConfigCond *sync.Cond
    45  	systemConfigMu   sync.RWMutex // L1
    46  }
    47  
    48  func (e *Executor_cockroach16167) Start() {
    49  	e.updateSystemConfig()
    50  }
    51  
    52  func (e *Executor_cockroach16167) execParsed(session *Session_cockroach16167) {
    53  	e.systemConfigCond.L.Lock() // Same as e.systemConfigMu.RLock()
    54  	runtime.Gosched()
    55  	defer e.systemConfigCond.L.Unlock()
    56  	runTxnAttempt_cockroach16167(e, session)
    57  }
    58  
    59  func (e *Executor_cockroach16167) execStmtsInCurrentTxn(session *Session_cockroach16167) {
    60  	e.execStmtInOpenTxn(session)
    61  }
    62  
    63  func (e *Executor_cockroach16167) execStmtInOpenTxn(session *Session_cockroach16167) {
    64  	session.PreparedStatements.New(e)
    65  }
    66  
    67  func (e *Executor_cockroach16167) Prepare(session *Session_cockroach16167) {
    68  	session.resetForBatch(e)
    69  }
    70  
    71  func (e *Executor_cockroach16167) getDatabaseCache() {
    72  	e.systemConfigMu.RLock()
    73  	defer e.systemConfigMu.RUnlock()
    74  }
    75  
    76  func (e *Executor_cockroach16167) updateSystemConfig() {
    77  	e.systemConfigMu.Lock()
    78  	runtime.Gosched()
    79  	defer e.systemConfigMu.Unlock()
    80  }
    81  
    82  func runTxnAttempt_cockroach16167(e *Executor_cockroach16167, session *Session_cockroach16167) {
    83  	e.execStmtsInCurrentTxn(session)
    84  }
    85  
    86  func NewExectorAndSession_cockroach16167() (*Executor_cockroach16167, *Session_cockroach16167) {
    87  	session := &Session_cockroach16167{}
    88  	session.PreparedStatements = PreparedStatements_cockroach16167{session}
    89  	e := &Executor_cockroach16167{}
    90  	return e, session
    91  }
    92  
    93  func Cockroach16167() {
    94  	prof := pprof.Lookup("goroutineleak")
    95  	defer func() {
    96  		time.Sleep(100 * time.Millisecond)
    97  		prof.WriteTo(os.Stdout, 2)
    98  	}()
    99  
   100  	for i := 0; i < 100; i++ {
   101  		go func() { // G1
   102  			e, s := NewExectorAndSession_cockroach16167()
   103  			e.systemConfigCond = sync.NewCond(e.systemConfigMu.RLocker())
   104  			go e.Start()    // G2
   105  			e.execParsed(s)
   106  		}()
   107  	}
   108  }
   109  

View as plain text