The internet. The gift that keeps on giving. 

> On Nov 3, 2023, at 7:54 AM, Al Corona <alvarocorona1...@gmail.com> wrote:
> 
> Off topic question. But does anyone know how I can gain admin access on my 
> work computer? 
> 
>> On Thursday, June 29, 2017 at 12:01:16 AM UTC-7 Kai Zhang wrote:
>> Go version 1.8.3
>> 
>> In DB.QueryContext(), Go will close long live connection which exceeded the 
>> duration setted by  DB.SetConnMaxLifetime(), the code is below
>> database/sql/sql.go
>>  895 func (db *DB) conn(ctx context.Context, strategy connReuseStrategy) 
>> (*driverConn, error) {
>>  896     db.mu.Lock()
>>  897     if db.closed {
>>  898         db.mu.Unlock()
>>  899         return nil, errDBClosed
>>  900     }
>>  901     // Check if the context is expired.
>>  902     select {
>>  903     default:
>>  904     case <-ctx.Done():
>>  905         db.mu.Unlock()
>>  906         return nil, ctx.Err()
>>  907     }
>>  908     lifetime := db.maxLifetime
>>  909 
>>  910     // Prefer a free connection, if possible.
>>  911     numFree := len(db.freeConn)
>>  912     if strategy == cachedOrNewConn && numFree > 0 {
>>  913         conn := db.freeConn[0]
>>  914         copy(db.freeConn, db.freeConn[1:])
>>  915         db.freeConn = db.freeConn[:numFree-1]
>>  916         conn.inUse = true
>>  917         db.mu.Unlock()
>>  918         if conn.expired(lifetime) {
>>  919             conn.Close()
>>  920             return nil, driver.ErrBadConn
>>  921         }                                                               
>>                                                                              
>>            
>>  922         return conn, nil
>>  923     }
>> 
>> 
>> The problem is if driver.Close() has some handshake to tear down the 
>> connection, this may introduce unexpected latency. But the driver.Conn 
>> interface not mention this.
>> database/sql/driver/driver.go
>>  143 type Conn interface {
>>  144     // Prepare returns a prepared statement, bound to this connection.
>>  145     Prepare(query string) (Stmt, error)
>>  146 
>>  147     // Close invalidates and potentially stops any current
>>  148     // prepared statements and transactions, marking this
>>  149     // connection as no longer in use.
>>  150     //
>>  151     // Because the sql package maintains a free pool of
>>  152     // connections and only calls Close when there's a surplus of
>>  153     // idle connections, it shouldn't be necessary for drivers to
>>  154     // do their own connection caching.                                 
>>                                                                              
>>            
>>  155     Close() error
>>  156 
>>  157     // Begin starts and returns a new transaction.
>>  158     //
>>  159     // Deprecated: Drivers should implement ConnBeginTx instead (or 
>> additionally).
>>  160     Begin() (Tx, error)
>>  161 }
>> 
>> There is already a goroutine to clean the connections, why still need a 
>> synchronous check? 
>> database/sql/sql.go
>>  750 func (db *DB) connectionCleaner(d time.Duration) {                      
>>                                                                              
>>            
>>  751     const minInterval = time.Second
>>  752 
>>  753     if d < minInterval {
>>  754         d = minInterval
>>  755     }
>>  756     t := time.NewTimer(d)
>>  757 
>>  758     for {
>>  759         select {
>>  760         case <-t.C:
>>  761         case <-db.cleanerCh: // maxLifetime was changed or db was 
>> closed.
>>  762         }
>>  763 
>>  764         db.mu.Lock()
>>  765         d = db.maxLifetime
>>  766         if db.closed || db.numOpen == 0 || d <= 0 {
>>  767             db.cleanerCh = nil
>>  768             db.mu.Unlock()
>>  769             return
>>  770         }
>>  771 
>>  772         expiredSince := nowFunc().Add(-d)
>>  773         var closing []*driverConn
>>  774         for i := 0; i < len(db.freeConn); i++ {
>>  775             c := db.freeConn[i]
>>  776             if c.createdAt.Before(expiredSince) {
>>  777                 closing = append(closing, c)
>>  778                 last := len(db.freeConn) - 1
>>  779                 db.freeConn[i] = db.freeConn[last]
>>  780                 db.freeConn[last] = nil
>>  781                 db.freeConn = db.freeConn[:last]
>>  782                 i--
>>  783             }
>>  784         }
>> 
>> 
>> 
>> Is this by design or need to be fixed? 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/c5f07284-32a9-4bc9-954c-edc7a8913843n%40googlegroups.com.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/19E42518-C2A6-4AED-BDB4-B5848B29FE30%40ix.netcom.com.

Reply via email to