语境
请仔细阅读代码中的注释。一切都在他们身上。
如果您有使用经验discordgo
完整的代码可以在这里找到:https ://github.com/telephrag/kubinka/tree/bug (查看包strg和main)添加 goroutine 命令处理程序也会停止正常工作。与数据库交互相关的所有内容(分别在 /deploy 和 /return 上存储和从数据库中删除)根本不起作用。用户只会收到“应用程序未响应”消息而不是正确的响应(请参阅以cmd_前缀开头的包)。
package main
import (
"context"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
"go.etcd.io/bbolt"
)
/* TO REPRODUCE:
Start the program wait a few seconds and press ^C.
Expect the case of program not shutting down after few attempts.
*/
func WatchExpirations(ctx context.Context, db *bbolt.DB, bkt string) error {
timeout := time.After(time.Second * 5)
for {
select {
case <-timeout:
tx, err := db.Begin(true)
if err != nil {
return fmt.Errorf("bolt: failed to start transaction")
}
bkt := tx.Bucket([]byte(bkt))
c := bkt.Cursor()
for k, v := c.First(); k != nil; k, v = c.Next() {
// do stuff with bucket...
fmt.Println(v) // check if v matches condition, delete if does
if err := tx.Commit(); err != nil { // BUG: commiting transaction in a loop
tx.Rollback()
return fmt.Errorf("bolt: failed to commit transaction: %w", err)
}
timeout = time.After(time.Second * 5)
}
case <-ctx.Done():
return ctx.Err()
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
db, err := bbolt.Open("kubinka.db", 0666, nil)
if err != nil {
log.Panicf("failed to open db %s: %v", "kubinka.db", err)
}
if err = db.Update(func(tx *bbolt.Tx) error {
_, err := tx.CreateBucketIfNotExists([]byte("players"))
if err != nil {
return fmt.Errorf("failed to create bucket %s: %w", "players", err)
}
return nil
}); err != nil {
log.Panic(err)
}
慕仙森
相关分类