Syncing in-memory credit with db regularly

pull/2/head
Qian Wang 6 years ago
parent fe19d31158
commit 0702e37391

@ -146,7 +146,7 @@ func main() {
log.Fatal("TicketTimeHint cannot be empty or 0")
}
valve := mux.MakeValve(1e9, 1e9, 1e9, 1e9)
valve := mux.MakeValve(1e12, 1e12, 1e12, 1e12)
obfs := util.MakeObfs(sta.UID)
deobfs := util.MakeDeobfs(sta.UID)
sesh := mux.MakeSession(0, valve, obfs, deobfs, util.ReadTLS)

@ -47,6 +47,14 @@ func (v *Valve) txWait(n int) {
v.txtb.Load().(*ratelimit.Bucket).Wait(int64(n))
}
func (v *Valve) GetRxCredit() int64 {
return atomic.LoadInt64(&v.rxCredit)
}
func (v *Valve) GetTxCredit() int64 {
return atomic.LoadInt64(&v.txCredit)
}
// n can be negative
func (v *Valve) AddRxCredit(n int64) int64 {
return atomic.AddInt64(&v.rxCredit, n)

@ -4,6 +4,7 @@ import (
"encoding/binary"
"errors"
"sync"
"time"
"github.com/boltdb/bolt"
)
@ -24,6 +25,10 @@ func MakeUserpanel(dbPath string) (*Userpanel, error) {
db: db,
activeUsers: make(map[[32]byte]*User),
}
go func() {
time.Sleep(time.Second * 10)
up.updateCredits()
}()
return up, nil
}
@ -147,3 +152,27 @@ func (up *Userpanel) SetSessionsCap(UID [32]byte, newSessionsCap uint32) error {
err := up.updateDBEntryUint32(UID, "sessionsCap", newSessionsCap)
return err
}
func (up *Userpanel) updateCredits() {
up.activeUsersM.RLock()
defer u.activeUsersM.RUnlock()
for _, user := range up.activeUsers {
up.db.Update(func(tx *bolt.Tx) error {
b := tx.Bucket(u.uid[:])
if b == nil {
return ErrUserNotFound
}
oct := make([]byte, 8)
binary.BigEndian.PutUint64(oct, uint64(u.valve.GetRxCredit()))
if err := b.Put([]byte("rxCredit"), oct); err != nil {
return err
}
binary.BigEndian.PutUint64(oct, uint64(u.valve.GetTxCredit()))
if err := b.Put([]byte("txCredit"), oct); err != nil {
return err
}
return nil
})
}
}

Loading…
Cancel
Save