pani c: syn c: отрицательный счетчик WaitGroup с несколькими запросами к одной и той же конечной точке - PullRequest
0 голосов
/ 27 февраля 2020

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

это функция, которая вызывается для генерации хешированного пароля

func SetHash(c echo.Context) error {
    hashedhPassword := make(chan string)
    var wg sync.WaitGroup
    wg.Add(2)
    go utils.GenerateSaltedHashAsync("demoprueba", wg, hashedhPassword)
    return response.Success(c, map[string]string{
        "salt": <-hashedhPassword,
    })
}

и это класс хеширования

package utils

import (
    "encoding/base64"
    "fmt"
    "golang.org/x/crypto/argon2"
    "sync"
    "tigoApi/config"
)

const (
    Time         = 4
    Memory       = 64 * 1024
    KeyLen       = 80
    Threads      = 10
)

var environment = config.Instance()

func GenerateSaltedHashAsync(password string,wg sync.WaitGroup, hashedPassword chan string) {
    cryptoKey := argon2.IDKey([]byte(password), []byte(environment.SaltedPassword), Time, Memory, uint8(Threads), KeyLen)
    encodedPassword := base64.StdEncoding.EncodeToString(cryptoKey)
    consoleHash := fmt.Sprintf("%s$%d$%d$%d$%d$%s$%s", environment.PepperPassword, Time, Memory, Threads, KeyLen, environment.SaltedPassword, encodedPassword)
    defer wg.Done()
    hashedPassword <- consoleHash
    wg.Wait()
}

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

pani c: syn c: отрицательный счетчик WaitGroup

goroutine 1566 [выполняется]: syn c. (* WaitGroup) .Add (0xc0001320a0, 0xffffffffffffffff) /usr/local/go/src/sync/waitgroup.go:74 + 0x139 syn c. (* WaitGroup) .Done (0xc0001320a0) / usr / local / go src / sync / waitgroup. go: 99 + 0x34 tigoApi / utils.GenerateSaltedHashAsyn c (0x8e5324, 0xa, 0x0, 0x2, 0xc000226240) /home/crdzbird/goApps/src/tilsAashing/ : 46 + 0x3 cc, созданный tigoApi / controller.SetHash / home / crdzbird / goApps / src / tig oApi / controller / user_controller. go: 23 + 0xcd

Процесс завершен с кодом выхода 2

Пожалуйста, кто-нибудь может сказать мне, что не так с кодом.

ОБНОВЛЕНИЕ.

Благодаря предложениям работающий код должен быть таким ...

func SetHash(c echo.Context) error {
    hashedhPassword := make(chan string)
    go utils.GenerateSaltedHashAsync("lacb2208", hashedhPassword)
    return response.Success(c, map[string]string{
        "salt": <-hashedhPassword,
    })
}


func GenerateSaltedHashAsync(password string, hashedPassword chan string) {
    cryptoKey := argon2.IDKey([]byte(password), []byte(environment.SaltedPassword), Time, Memory, uint8(Threads), KeyLen)
    encodedPassword := base64.StdEncoding.EncodeToString(cryptoKey)
    consoleHash := fmt.Sprintf("%s$%d$%d$%d$%d$%s$%s", environment.PepperPassword, Time, Memory, Threads, KeyLen, environment.SaltedPassword, encodedPassword)
    hashedPassword <- consoleHash
    close(hashedPassword)
}

1 Ответ

2 голосов
/ 27 февраля 2020

Из пакета sync документы :

Значения, содержащие типы, определенные в этом (syn c) пакете, копировать не следует.

Так что, если что-то нуждается в ссылке, используйте указатель.

Измените сигнатуру своей функции, чтобы wg была ссылкой на указатель:

func GenerateSaltedHashAsync(password string,wg *sync.WaitGroup, hashedPassword chan string)

, а затем вызовите с этой ссылкой:

go utils.GenerateSaltedHashAsync("demoprueba", &wg, hashedhPassword)
...