Skip to content

Commit a4d8b36

Browse files
kingwangvipwzw
kingwang
authored andcommitted
add upgrade option when blockchain is start
1 parent ef01c7b commit a4d8b36

File tree

5 files changed

+85
-0
lines changed

5 files changed

+85
-0
lines changed

blockchain/restore.go

+15
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,25 @@ func (chain *BlockChain) Upgrade() {
2020
chain.UpgradeChain()
2121
chainlog.Info("storedb upgrade start")
2222
chain.UpgradeStore()
23+
chainlog.Info("upgrade all dapp")
24+
chain.upgradePlugin()
2325
chainlog.Info("chain reduce start")
2426
chain.ReduceChain()
2527
}
2628

29+
func (chain *BlockChain) upgradePlugin() {
30+
client := chain.client
31+
msg := client.NewMessage("execs", types.EventUpgrade, nil)
32+
err := client.Send(msg, true)
33+
if err != nil {
34+
panic(err)
35+
}
36+
_, err = client.Wait(msg)
37+
if err != nil {
38+
panic(err)
39+
}
40+
}
41+
2742
//UpgradeStore 升级storedb
2843
func (chain *BlockChain) UpgradeStore() {
2944
meta, err := chain.blockStore.GetStoreUpgradeMeta()

executor/executor.go

+53
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,64 @@ func (exec *Executor) SetQueueClient(qcli queue.Client) {
120120
go exec.procExecCheckTx(msg)
121121
} else if msg.Ty == types.EventBlockChainQuery {
122122
go exec.procExecQuery(msg)
123+
} else if msg.Ty == types.EventUpgrade {
124+
//执行升级过程中不允许执行其他的事件,这个事件直接不采用异步执行
125+
exec.procUpgrade(msg)
123126
}
124127
}
125128
}()
126129
}
127130

131+
func (exec *Executor) procUpgrade(msg *queue.Message) {
132+
for _, plugin := range pluginmgr.GetExecList() {
133+
elog.Info("begin upgrade plugin ", "name", plugin)
134+
err := exec.upgradePlugin(msg, plugin)
135+
if err != nil {
136+
panic(err)
137+
}
138+
}
139+
}
140+
141+
func (exec *Executor) upgradePlugin(msg *queue.Message, plugin string) error {
142+
header, err := exec.qclient.GetLastHeader()
143+
if err != nil {
144+
msg.Reply(exec.client.NewMessage("", types.EventUpgrade, err))
145+
return err
146+
}
147+
driver, err := drivers.LoadDriverWithClient(exec.qclient, plugin, header.GetHeight())
148+
if err == types.ErrUnknowDriver { //已经注册插件,但是没有启动
149+
elog.Info("upgrade ignore ", "name", plugin)
150+
return nil
151+
}
152+
if err != nil {
153+
msg.Reply(exec.client.NewMessage("", types.EventUpgrade, err))
154+
return err
155+
}
156+
var localdb dbm.KVDB
157+
if !exec.disableLocal {
158+
localdb = NewLocalDB(exec.client)
159+
defer localdb.(*LocalDB).Close()
160+
driver.SetLocalDB(localdb)
161+
}
162+
//目前升级不允许访问statedb
163+
driver.SetStateDB(nil)
164+
driver.SetAPI(exec.qclient)
165+
driver.SetExecutorAPI(exec.qclient, exec.grpccli)
166+
driver.SetEnv(header.GetHeight(), header.GetBlockTime(), uint64(header.GetDifficulty()))
167+
localdb.Begin()
168+
err = driver.Upgrade()
169+
if err != nil {
170+
localdb.Rollback()
171+
msg.Reply(exec.client.NewMessage("", types.EventUpgrade, err))
172+
return err
173+
}
174+
localdb.Commit()
175+
msg.Reply(exec.client.NewMessage("", types.EventUpgrade, &types.Reply{
176+
IsOk: true,
177+
}))
178+
return nil
179+
}
180+
128181
func (exec *Executor) procExecQuery(msg *queue.Message) {
129182
//panic 处理
130183
defer func() {

pluginmgr/manager.go

+8
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ func InitExec(cfg *typ.Chain33Config) {
2626
})
2727
}
2828

29+
//GetExecList 获取插件名字列表
30+
func GetExecList() (datas []string) {
31+
for _, plugin := range pluginItems {
32+
datas = append(datas, plugin.GetExecutorName())
33+
}
34+
return
35+
}
36+
2937
// InitWallet init wallet plugin
3038
func InitWallet(wallet wcom.WalletOperate, sub map[string][]byte) {
3139
once.Do(func() {

system/dapp/driver.go

+7
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ type Driver interface {
7373
GetExecutorType() types.ExecutorType
7474
CheckReceiptExecOk() bool
7575
ExecutorOrder() int64
76+
Upgrade() error
7677
}
7778

7879
// DriverBase defines driverbase type
@@ -97,6 +98,12 @@ type DriverBase struct {
9798
ety types.ExecutorType
9899
}
99100

101+
//Upgrade default upgrade only print a message
102+
func (d *DriverBase) Upgrade() error {
103+
blog.Info("upgrade ", "dapp", d.GetName())
104+
return nil
105+
}
106+
100107
// GetPayloadValue define get payload func
101108
func (d *DriverBase) GetPayloadValue() types.Message {
102109
if d.ety == nil {

types/event.go

+2
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ const (
156156
//exec
157157
EventBlockChainQuery = 212
158158
EventConsensusQuery = 213
159+
EventUpgrade = 214
159160

160161
// BlockChain 接收的事件
161162
EventGetLastBlockMainSequence = 300
@@ -336,4 +337,5 @@ var eventName = map[int]string{
336337
EventReplyHeightByTitle: "EventReplyHeightByTitle",
337338
EventGetParaTxByTitleAndHeight: "EventGetParaTxByTitleAndHeight",
338339
EventCmpBestBlock: "EventCmpBestBlock",
340+
EventUpgrade: "EventUpgrade",
339341
}

0 commit comments

Comments
 (0)