Commit 62933df4 authored by szh's avatar szh

add updateBlocks

parent a4a04d65
...@@ -10,6 +10,7 @@ import ( ...@@ -10,6 +10,7 @@ import (
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
ttype "github.com/33cn/plugin/plugin/dapp/ticket/types" ttype "github.com/33cn/plugin/plugin/dapp/ticket/types"
"github.com/jinzhu/gorm" "github.com/jinzhu/gorm"
"golang.org/x/net/html/atom"
) )
func Setup() { func Setup() {
...@@ -53,27 +54,56 @@ func SyncBlock() { ...@@ -53,27 +54,56 @@ func SyncBlock() {
prev.lock.Lock() prev.lock.Lock()
lastHeight := prev.Height lastHeight := prev.Height
startHeight := prev.LocalHeight startHeight := prev.LocalHeight
maxDownload := prev.DownloadHeight
if lastHeight > startHeight { if lastHeight > startHeight {
if lastHeight - startHeight > prev.DownloadHeight {
maxDownload = 1
}
//速度模式 //速度模式
for processHeight := startHeight + 1; processHeight <= lastHeight; processHeight += prev.DownloadHeight + 1 { for processHeight := startHeight + 1; processHeight <= lastHeight; processHeight += maxDownload + 1 {
statMap := make(map[string]*models.RaspMinerStat,0)
txsMap := make(map[int64]*models.RaspMinerTxs,0)
statList := make([]*models.RaspMinerStat,0)
txsList := make([]*models.RaspMinerTxs,0)
var wg sync.WaitGroup var wg sync.WaitGroup
for height := processHeight ;height <= processHeight + prev.DownloadHeight;height ++ { for height := processHeight ;height <= processHeight + maxDownload;height ++ {
wg.Add(1) wg.Add(1)
go func(height int64) { go func(height int64) {
defer wg.Done() defer wg.Done()
err := DealBlock(height) stat,txs,err := DealBlock(height)
if err != nil { if err != nil {
logging.Error("DealBlock err",err) logging.Error("DealBlock err",err)
panic(err) panic(err)
} }
statList = append(statList,stat)
txsList = append(txsList,txs)
}(height) }(height)
} }
//db.SetMainNetHeight(int(processHeight + types.MaxProcessBlocks + 1)) //db.SetMainNetHeight(int(processHeight + types.MaxProcessBlocks + 1))
wg.Wait() wg.Wait()
for _,v := range statList {
if v != nil && v.Addr != "" {
if _,ok:= statMap[v.Addr];!ok {
statMap[v.Addr] = v
}
}
}
for _,v := range txsList {
if v != nil && v.Height >0 {
if _, ok := txsMap[v.Height];!ok {
txsMap[v.Height] = v
}
}
}
err := models.UpdateBlocks(txsMap,statMap,processHeight+maxDownload+1)
if err != nil {
panic(err)
}
prev.LocalHeight += prev.DownloadHeight + 1
logging.Info("startHeight:",processHeight," endHeight:",processHeight+maxDownload+1)
} }
prev.LocalHeight += prev.DownloadHeight + 1
t = time.Millisecond * 50 t = time.Millisecond * 50
} else { } else {
prev.SetMainHeight() prev.SetMainHeight()
...@@ -99,11 +129,11 @@ func (prev *prevHeight) SetMainHeight() error { ...@@ -99,11 +129,11 @@ func (prev *prevHeight) SetMainHeight() error {
} }
func DealBlock(height int64) error { func DealBlock(height int64) ( *models.RaspMinerStat, *models.RaspMinerTxs,error) {
blocks ,err := client.GetBlocks(&types.ReqBlocks{Start:height,End:height,IsDetail:true}) blocks ,err := client.GetBlocks(&types.ReqBlocks{Start:height,End:height,IsDetail:true})
if err != nil { if err != nil {
logging.Error("GetBlocks err",err) logging.Error("GetBlocks err",err)
return err return nil,nil,err
} }
block := blocks.GetItems()[0] block := blocks.GetItems()[0]
rs := &RMinerStat{} rs := &RMinerStat{}
...@@ -114,7 +144,7 @@ func DealBlock(height int64) error { ...@@ -114,7 +144,7 @@ func DealBlock(height int64) error {
rt1,rs1,err := dealTx(v) rt1,rs1,err := dealTx(v)
if err != nil { if err != nil {
logging.Error("dealTx err ",err) logging.Error("dealTx err ",err)
return err return nil,nil,err
} }
if rt1 != nil && rt1.Miner != ""{ if rt1 != nil && rt1.Miner != ""{
rt.Miner = rt1.Miner rt.Miner = rt1.Miner
...@@ -144,13 +174,12 @@ func DealBlock(height int64) error { ...@@ -144,13 +174,12 @@ func DealBlock(height int64) error {
//} //}
raspStat := NewMinerStat(rs) raspStat := NewMinerStat(rs)
raspTxs := NewMinerTxs(rt) raspTxs := NewMinerTxs(rt)
err = models.UpdateBlock(raspTxs,raspStat) //err = models.UpdateBlock(raspTxs,raspStat)
if err != nil { //if err != nil {
logging.Error("UpdateBlock err ",err) // logging.Error("UpdateBlock err ",err)
return err // return err
} //}
logging.Info("HEIGHT :",height," is ok ") return raspStat,raspTxs,nil
return nil
} }
type RMinerTxs struct { type RMinerTxs struct {
......
...@@ -32,7 +32,7 @@ func UpdateBlock(rt *RaspMinerTxs,rs *RaspMinerStat) error { ...@@ -32,7 +32,7 @@ func UpdateBlock(rt *RaspMinerTxs,rs *RaspMinerStat) error {
MinedAmount:prev.MinedAmount+rs.MinedAmount, MinedAmount:prev.MinedAmount+rs.MinedAmount,
MinedTicketCount:prev.MinedTicketCount+rs.MinedTicketCount, MinedTicketCount:prev.MinedTicketCount+rs.MinedTicketCount,
MiningTicketCount:prev.MiningTicketCount+rs.MiningTicketCount, MiningTicketCount:prev.MiningTicketCount+rs.MiningTicketCount,
Height:rs.Time, Height:rs.Height,
Time:rs.Time, Time:rs.Time,
}).Error;err != nil { }).Error;err != nil {
tx.Rollback() tx.Rollback()
...@@ -52,3 +52,60 @@ func UpdateBlock(rt *RaspMinerTxs,rs *RaspMinerStat) error { ...@@ -52,3 +52,60 @@ func UpdateBlock(rt *RaspMinerTxs,rs *RaspMinerStat) error {
return tx.Commit().Error return tx.Commit().Error
} }
func UpdateBlocks(rt map[int64]*RaspMinerTxs,rs map[string]*RaspMinerStat,height int64) error {
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Error; err != nil {
return err
}
for _,v := range rt {
var res RaspMinerTxs
if err := tx.Where(&RaspMinerTxs{Height:v.Height}).Assign(v).FirstOrCreate(&res).Error;err != nil {
tx.Rollback()
return err
}
}
for _,v:= range rs {
var prev RaspMinerStat
err := tx.Model(&RaspMinerStat{}).Where(&RaspMinerStat{Addr:v.Addr}).First(&prev).Error
if err != nil {
//不存在创建
if err == gorm.ErrRecordNotFound {
if err := tx.Create(v).Error;err != nil {
tx.Rollback()
return err
}
} else {
tx.Rollback()
return err
}
} else {
//存在 则更新状态
if err := tx.Model(&RaspMinerStat{}).Where("Addr = ? ",v.Addr).Update(&RaspMinerStat{
MinedAmount:prev.MinedAmount+v.MinedAmount,
MinedTicketCount:prev.MinedTicketCount+v.MinedTicketCount,
MiningTicketCount:prev.MiningTicketCount+v.MiningTicketCount,
Height:v.Height,
Time:v.Time,
}).Error;err != nil {
tx.Rollback()
return err
}
}
}
if err := tx.Model(&RaspConfig{}).Where("config = ? ","height").Update("Height",height).Error;err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment