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.