@@ -120,11 +120,64 @@ func (exec *Executor) SetQueueClient(qcli queue.Client) {
120
120
go exec .procExecCheckTx (msg )
121
121
} else if msg .Ty == types .EventBlockChainQuery {
122
122
go exec .procExecQuery (msg )
123
+ } else if msg .Ty == types .EventUpgrade {
124
+ //执行升级过程中不允许执行其他的事件,这个事件直接不采用异步执行
125
+ exec .procUpgrade (msg )
123
126
}
124
127
}
125
128
}()
126
129
}
127
130
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
+
128
181
func (exec * Executor ) procExecQuery (msg * queue.Message ) {
129
182
//panic 处理
130
183
defer func () {
0 commit comments