From 91a43e34d6d0f8ad08ef6541b05860b3405927e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=AF=E9=98=B3?= <1656488874@qq.com> Date: Tue, 10 Dec 2019 07:19:18 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix=20=E5=89=8D=E7=AB=AF=E7=9A=84=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/request.js | 70 +++++++++++++++---------------------- 1 file changed, 28 insertions(+), 42 deletions(-) diff --git a/frontend/src/api/request.js b/frontend/src/api/request.js index 9c5943f5..5f91f2ac 100644 --- a/frontend/src/api/request.js +++ b/frontend/src/api/request.js @@ -1,53 +1,39 @@ import axios from 'axios' import router from '../router' +import { Message } from 'element-ui' let baseUrl = process.env.VUE_APP_BASE_URL ? process.env.VUE_APP_BASE_URL : 'http://localhost:8000' -const request = async (method, path, params, data, others = {}) => { - try { - const url = baseUrl + path - const headers = { - 'Authorization': window.localStorage.getItem('token') +const request = (method, path, params, data, others = {}) => { + const url = baseUrl + path + const headers = { + 'Authorization': window.localStorage.getItem('token') + } + return axios({ + method, + url, + params, + data, + headers, + ...others + }).then((response) => { + if (response.status === 200) { + return Promise.resolve(response) } - const response = await axios({ - method, - url, - params, - data, - headers, - ...others - }) - // console.log(response) - return response - } catch (e) { - if (e.response.status === 401 && router.currentRoute.path !== '/login') { + return Promise.reject(response) + }).catch((e) => { + let response = e.response + if (response.status === 400) { + Message.error(response.data.error) + } + if (response.status === 401 && router.currentRoute.path !== '/login') { + console.log('login') router.push('/login') } - await Promise.reject(e) - } - - // return new Promise((resolve, reject) => { - // const url = baseUrl + path - // const headers = { - // 'Authorization': window.localStorage.getItem('token') - // } - // axios({ - // method, - // url, - // params, - // data, - // headers, - // ...others - // }) - // .then(resolve) - // .catch(error => { - // console.log(error) - // if (error.response.status === 401) { - // router.push('/login') - // } - // reject(error) - // }) - // }) + if (response.status === 500) { + Message.error(response.data.error) + } + }) } const get = (path, params) => { From c071a93c5b7884db456a53f410a05b1d3871d48a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=AF=E9=98=B3?= <1656488874@qq.com> Date: Tue, 10 Dec 2019 09:22:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix=20=E5=90=8C=E6=AD=A5=E9=94=81=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=BC=82=E5=B8=B8=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/database/redis.go | 35 +++++++++++++++++++++++++---------- backend/services/node.go | 5 +++-- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/backend/database/redis.go b/backend/database/redis.go index 54f716d0..b165aaa3 100644 --- a/backend/database/redis.go +++ b/backend/database/redis.go @@ -155,42 +155,57 @@ func Sub(channel string, consume ConsumeFunc) error { return nil } +// 构建同步锁key func (r *Redis) getLockKey(lockKey string) string { lockKey = strings.ReplaceAll(lockKey, ":", "-") return "nodes:lock:" + lockKey } -func (r *Redis) Lock(lockKey string) error { +// 获得锁 +func (r *Redis) Lock(lockKey string) (int64, error) { c := r.pool.Get() defer utils.Close(c) lockKey = r.getLockKey(lockKey) - ts := time.Now() - v, err := c.Do("SET", lockKey, ts, "NX", "PX", 30000) + ts := time.Now().Unix() + ok, err := c.Do("SET", lockKey, ts, "NX", "PX", 30000) if err != nil { log.Errorf("get lock fail with error: %s", err.Error()) debug.PrintStack() - return err + return 0, err } - if err == nil && v == nil { + if err == nil && ok == nil { log.Errorf("the lockKey is locked: key=%s", lockKey) - return errors.New("the lockKey is locked") + return 0, errors.New("the lockKey is locked") } - return nil + return ts, nil } -func (r *Redis) UnLock(lockKey string) { +func (r *Redis) UnLock(lockKey string, value int64) { c := r.pool.Get() defer utils.Close(c) lockKey = r.getLockKey(lockKey) - v, err := c.Do("DEL", lockKey) + getValue, err := redis.Int64(c.Do("GET", lockKey)) + if err != nil { + log.Errorf("get lockKey error: %s", err.Error()) + debug.PrintStack() + return + } + + if getValue != value { + log.Errorf("the lockKey value diff: %d, %d", value, getValue) + return + } + + v, err := redis.Int64(c.Do("DEL", lockKey)) if err != nil { log.Errorf("unlock failed, error: %s", err.Error()) debug.PrintStack() return } - if v.(int64) == 0 { + + if v == 0 { log.Errorf("unlock failed: key=%s", lockKey) return } diff --git a/backend/services/node.go b/backend/services/node.go index 26cd3b89..36934746 100644 --- a/backend/services/node.go +++ b/backend/services/node.go @@ -96,10 +96,11 @@ func UpdateNodeStatus() { func handleNodeInfo(key string, data Data) { // 添加同步锁 - if err := database.RedisClient.Lock(key); err != nil { + v, err := database.RedisClient.Lock(key) + if err != nil { return } - defer database.RedisClient.UnLock(key) + defer database.RedisClient.UnLock(key, v) // 更新节点信息到数据库 s, c := database.GetCol("nodes")