Merge pull request #356 from wo10378931/develop

Develop
This commit is contained in:
Marvin Zhang
2019-12-11 11:26:22 +08:00
committed by GitHub
3 changed files with 56 additions and 54 deletions

View File

@@ -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
}

View File

@@ -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")

View File

@@ -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) => {