簡體   English   中英

boltdb 更新在提交時凍結

[英]boltdb update freezes on commit

我想從 API 中提取數據並將其保存到 boltDB 數據庫中。 問題是該進程在 commit() 調用上被凍結並且沒有發送任何恐慌或錯誤......

有人看到下面的代碼嗎? 我一次最多放 1500 根蠟燭,也許太多了? 如果是這樣,那么這種金額的最佳做法是什么?

非常感謝 !

type Candle struct {
    Close      float32   `json:"close"`
    High       float32   `json:"high"`
    Low        float32   `json:"low"`
    Open       float32   `json:"open"`
    ClockTime  float32   `json:"time"`
    StartTime  time.Time `json:"startTime"`
    Volume     float32   `json:"volume"`
    Resolution string
}

func (s historyDataStore) saveCandles(mkt string, candles []Candle) error {
    tx, err := s.db.Begin(true)
    b := tx.Bucket([]byte(mainBucket)).Bucket([]byte(mkt))
    i := 0
    for _, candle := range candles {
        i++
        js, err := json.Marshal(candle)
        if err != nil {
            return err
        }
        key, err := b.NextSequence()
        err = b.Put(itob(key), js)
        if err != nil {
            return err
        }
    }
    err = tx.Commit()
    if err != nil {
        log.Fatal(err)
    }
    return err
}

這是 SIGQUIT 信息:這似乎是 rwmutex.go 中的 Lock() 函數正在等待其可用性...

PC=0x7fff6b69b882 m=0 sigcode=0

goroutine 0 [idle]:
runtime.pthread_cond_wait(0x1572820, 0x15727e0, 0x0)
        /usr/local/go/src/runtime/sys_darwin.go:384 +0x39
runtime.semasleep(0xffffffffffffffff, 0x7ffeefbff4e0)
        /usr/local/go/src/runtime/os_darwin.go:63 +0x8d
runtime.notesleep(0x15725d0)
        /usr/local/go/src/runtime/lock_sema.go:181 +0xdb
runtime.mPark()
        /usr/local/go/src/runtime/proc.go:1340 +0x39
runtime.stopm()
        /usr/local/go/src/runtime/proc.go:2301 +0x92
runtime.findrunnable(0xc00003b000, 0x0)
        /usr/local/go/src/runtime/proc.go:2960 +0x72e
runtime.schedule()
        /usr/local/go/src/runtime/proc.go:3169 +0x2d7
runtime.park_m(0xc000082900)
        /usr/local/go/src/runtime/proc.go:3318 +0x9d
runtime.mcall(0x106fcf6)
        /usr/local/go/src/runtime/asm_amd64.s:327 +0x5b

goroutine 1 [semacquire, 3 minutes]:
sync.runtime_SemacquireMutex(0xc0001201a0, 0xc0003ece00, 0x0)
        /usr/local/go/src/runtime/sema.go:71 +0x47
sync.(*RWMutex).Lock(0xc000120198)
        /usr/local/go/src/sync/rwmutex.go:116 +0x85
github.com/boltdb/bolt.(*DB).mmap(0xc000120000, 0x9000, 0x0, 0x0)
        /Users/user/go/pkg/mod/github.com/boltdb/bolt@v1.3.1/db.go:246 +0x69
github.com/boltdb/bolt.(*DB).allocate(0xc000120000, 0x1, 0xc0003ecfe0, 0x2, 0x2)
        /Users/user/go/pkg/mod/github.com/boltdb/bolt@v1.3.1/db.go:849 +0x12a
github.com/boltdb/bolt.(*Tx).allocate(0xc000122000, 0x1, 0x8, 0x8, 0xc0002840a8)
        /Users/user/go/pkg/mod/github.com/boltdb/bolt@v1.3.1/tx.go:465 +0xef
github.com/boltdb/bolt.(*node).spill(0xc0002bb110, 0xc0000ba008, 0xc0003ed240)
        /Users/user/go/pkg/mod/github.com/boltdb/bolt@v1.3.1/node.go:368 +0x1bd
github.com/boltdb/bolt.(*Bucket).spill(0xc0002d2080, 0xc00034e100, 0xc0003ed4f0)
        /Users/user/go/pkg/mod/github.com/boltdb/bolt@v1.3.1/bucket.go:571 +0x5e5
github.com/boltdb/bolt.(*Bucket).spill(0xc0002d2000, 0xc00034e000, 0xc0003ed720)
        /Users/user/go/pkg/mod/github.com/boltdb/bolt@v1.3.1/bucket.go:538 +0x496
github.com/boltdb/bolt.(*Bucket).spill(0xc000122018, 0xc0000ba008, 0xc0003ed8a8)
        /Users/user/go/pkg/mod/github.com/boltdb/bolt@v1.3.1/bucket.go:538 +0x496
github.com/boltdb/bolt.(*Tx).Commit(0xc000122000, 0x5, 0xc0003edad0)
        /Users/user/go/pkg/mod/github.com/boltdb/bolt@v1.3.1/tx.go:165 +0x285
github.com/elRomano/gotrader/store/boltdb.historyDataStore.saveCandles(0xc000120000, 0x13690ca, 0xb, 0x1, 0x1367a43, 0x7, 0xc00075a000, 0x5dd, 0x638, 0x60d34ff4, ...)
        /Users/user/Documents/_DEV/Go/test/store/boltdb/boltStore.go:123 +0x539
github.com/elRomano/gotrader/store/boltdb.historyDataStore.updateMarketHistory(0xc000120000, 0x13690ca, 0xb, 0x5, 0x1367a43, 0x7, 0x12fc9c0, 0x13c7f00)
        /Users/user/Documents/_DEV/Go/test/store/boltdb/boltStore.go:71 +0x3ee
github.com/elRomano/gotrader/store/boltdb.(*historyDataStore).UpdateDb(0xc0000be4c0, 0xc0000be4a0, 0x2, 0x2, 0x1, 0x0)
        /Users/user/Documents/_DEV/Go/test/store/boltdb/boltStore.go:43 +0xa5
main.main()
        /Users/user/Documents/_DEV/Go/test/main.go:59 +0xa0d

rax    0x104
rbx    0x2
rcx    0x7ffeefbff2e8
rdx    0x6c00
rdi    0x1572820
rsi    0x6c0100006d00
rbp    0x7ffeefbff380
rsp    0x7ffeefbff2e8
r8     0x0
r9     0xa0
r10    0x0
r11    0x202
r12    0x1572820
r13    0x16
r14    0x6c0100006d00
r15    0xef99dc0
rip    0x7fff6b69b882
rflags 0x203
cs     0x7
fs     0x0
gs     0x0
exit status 2

感謝 SIGQUIT 跟蹤,我發現有一個“開始”事務打開,它鎖定了我想要執行的其他事務。 我在最后添加了一個回滾然后它起作用了。

問題解決了 ! 謝謝@rustyx @mh-cbon @Adrian。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM