Golang Panic Crash при поиске Postgres - PullRequest
0 голосов
/ 26 августа 2018

Итак, у меня есть функция, которую я хочу добавить в программу, которую я пишу.По сути, если у пользователя есть файлы cookie, которые говорят, что его имя пользователя и пароль, он будет искать имя пользователя и хэшированное значение файла cookie в сохраненной базе данных postgres и будет возвращать положительный ответ и токен JWT, если я получу совпадение (сделанное такимЯ могу с хэшированием bcrypt - может ли быть еще один вопрос - хранить хешированные пароли?

Этот запрос отправляется на сервер каждый раз, когда пользователь переходит на страницу, требующую сохранения пароля.

Моя проблема в том, что время от времени я получаю следующее

inside CookieLogin
app_1  | search_userinfo_table started
db_1   | FATAL:  sorry, too many clients already
app_1  | 2018/08/26 16:22:25 pq: sorry, too many clients already
app_1  | 2018/08/26 16:22:25 http: panic serving 172.21.0.1:37304: pq: sorry, too many clients already
app_1  | goroutine 704 [running]:
app_1  | net/http.(*conn).serve.func1(0xc420156f00)
app_1  |    /usr/local/go/src/net/http/server.go:1721 +0xd0
app_1  | panic(0x6d63e0, 0xc420102c20)
app_1  |    /usr/local/go/src/runtime/panic.go:489 +0x2cf
app_1  | log.Panic(0xc4200438c0, 0x1, 0x1)
app_1  |    /usr/local/go/src/log/log.go:322 +0xc0
app_1  | github.com/patientplatypus/webserver/database.Search_userinfo_table(0xc42017f29d, 0xb, 0xc4201500c0, 0xc4200c22e0, 0xc420043a10)
app_1  |    /go/src/github.com/patientplatypus/webserver/database/search.go:18 +0x169
app_1  | github.com/patientplatypus/webserver/authentication.loginHandler(0xc42017f29d, 0xb, 0xc42017f2ba, 0x3, 0x899a80, 0xc420148460)
app_1  |    /go/src/github.com/patientplatypus/webserver/authentication/login.go:53 +0x39
app_1  | github.com/patientplatypus/webserver/authentication.CookieLogin(0x899a80, 0xc420148460, 0xc4203fc800)
app_1  |    /go/src/github.com/patientplatypus/webserver/authentication/login.go:35 +0x279
app_1  | net/http.HandlerFunc.ServeHTTP(0x75c658, 0x899a80, 0xc420148460, 0xc4203fc800)
app_1  |    /usr/local/go/src/net/http/server.go:1942 +0x44
app_1  | github.com/gorilla/mux.(*Router).ServeHTTP(0xc420052460, 0x899a80, 0xc420148460, 0xc4203fc800)
app_1  |    /go/src/github.com/gorilla/mux/mux.go:162 +0x101
app_1  | main.JWTHandler.func1(0x899a80, 0xc420148460, 0xc4203fc600)
app_1  |    /go/src/github.com/patientplatypus/webserver/main.go:34 +0x342
app_1  | net/http.HandlerFunc.ServeHTTP(0xc4200b12a0, 0x899a80, 0xc420148460, 0xc4203fc600)
app_1  |    /usr/local/go/src/net/http/server.go:1942 +0x44
app_1  | github.com/rs/cors.(*Cors).Handler.func1(0x899a80, 0xc420148460, 0xc4203fc600)
app_1  |    /go/src/github.com/rs/cors/cors.go:200 +0xe9
app_1  | net/http.HandlerFunc.ServeHTTP(0xc4200b12c0, 0x899a80, 0xc420148460, 0xc4203fc600)
app_1  |    /usr/local/go/src/net/http/server.go:1942 +0x44
app_1  | net/http.serverHandler.ServeHTTP(0xc42008a630, 0x899a80, 0xc420148460, 0xc4203fc600)
app_1  |    /usr/local/go/src/net/http/server.go:2568 +0x92
app_1  | net/http.(*conn).serve(0xc420156f00, 0x899fc0, 0xc4200506c0)
app_1  |    /usr/local/go/src/net/http/server.go:1825 +0x612
app_1  | created by net/http.(*Server).Serve
app_1  |    /usr/local/go/src/net/http/server.go:2668 +0x2ce

... и затем происходит сбой клиента golang, и мне придется перезапускать вручную.Это ошибка, которая возникает только иногда , что невероятно расстраивает, поскольку затрудняет отладку (извините за подробный журнал терминала - я не уверен, когда ошибка снова сработает).

У кого-нибудь есть какие-либо советы или предложения?Это обычная проблема с решением без необходимости?

Спасибо!

РЕДАКТИРОВАТЬ:

Насколько я могу судить, вот неправильный поисковый запрос postgres:

package data

import(
    "fmt"
    "log"
    _ "github.com/lib/pq"
)


func Search_userinfo_table(searchEmail string)(bool, string) {
    fmt.Println("search_userinfo_table started")
    rows, err1 := db.Query("SELECT * FROM userinfo")
    if err1 != nil {
        log.Panic(err1)
    }
    for rows.Next() {
        var email string
        var password string
        var regString string
        var regBool bool
        var uid int
        err2 := rows.Scan(&email, &password, &regString, &regBool, &uid)
        if err2 != nil {
            log.Panic(err2)
        }
        fmt.Println("email | password")
        fmt.Printf("%s | %s", email, password)
        if email == searchEmail{
            return false, password
        }
    }
    return true, ""
}

, который возвращает информацию о том, находится ли пользователь в базе данных или нет, а также хешированный пароль.Разговаривая с несколькими людьми, кажется, что postgres добавляет новое соединение каждый раз, когда делает это чтение, а затем в конечном итоге дает сбой, но я хочу, чтобы он повторно использовал соединения (хотя я думал, что это произошло автоматически?).В любом случае, больше информации.

1 Ответ

0 голосов
/ 26 августа 2018

Вам не хватает необходимого defer rows.Close().

Каждый экземпляр *sql.Rows связан с подключением. Когда вы закрываете экземпляр строки, связанное соединение освобождается и помещается обратно в пул (*DB).

С другой стороны, не закрытие экземпляра строки приведет к тому, что его соединение не будет освобождено . А не освобождение соединений в свою очередь приведет к тому, что пул соединений попытается открыть слишком много новых соединений.

...