panic:sync:负的WaitGroup计数器,对同一端点有多个请求

问题描述 投票:-2回答:1

我正在做一个哈希密码生成器,我在服务器上有一个端点,该端点生成一个goroutine来创建哈希密码,然后在goroutine结束时将其作为响应发送。

这是用于生成哈希密码的函数

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()
}

当我发出单个请求时,一切正常,但是当我一次发送多个请求(压力测试)时,应用程序会发送此错误。

紧急:同步:否WaitGroup计数器

goroutine 1566 [正在运行]:同步。(* WaitGroup)。添加(0xc0001320a0,0xffffffffffffffffff)/usr/local/go/src/sync/waitgroup.go:74 + 0x139 sync。(* WaitGroup).Done(0xc0001320a0)/usr/local/go/src/sync/waitgroup.go:99 + 0x34 tigoApi / utils.GenerateSaltedHashAsync(0x8e5324,0xa,0x0,0x2,0xc000226240)/home/crdzbird/goApps/src/tigoApi/utils/hashing.go:46 + 0x3cc由tigoApi / controller.SetHash创建/home/crdzbird/goApps/src/tigoApi/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)
}
go goroutine
1个回答
2
投票

sync程序包docs

包含在此(同步)包中定义的类型的值不应复制。

因此,如果需要引用,请使用指针。

更改函数签名,使wg为指针引用:

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

然后使用该引用进行调用:

go utils.GenerateSaltedHashAsync("demoprueba", &wg, hashedhPassword)
© www.soinside.com 2019 - 2024. All rights reserved.