diff --git a/cmd/cmd/run.go b/cmd/cmd/run.go index f642e0b..3ec9449 100644 --- a/cmd/cmd/run.go +++ b/cmd/cmd/run.go @@ -11,7 +11,6 @@ import ( "fmt" "os" "path/filepath" - "strings" "time" "github.com/CESSProject/DeOSS/configs" @@ -45,7 +44,6 @@ func cmd_run_func(cmd *cobra.Command, args []string) { fadebackDir string ufileDir string dfileDir string - bootEnv string syncSt chain.SysSyncState peerRecord = node.NewPeerRecord() n = node.New() @@ -134,24 +132,6 @@ func cmd_run_func(cmd *cobra.Command, args []string) { time.Sleep(time.Second) out.Tip(fmt.Sprintf("chain network: %s", n.GetNetworkEnv())) - out.Tip(fmt.Sprintf("p2p network: %s", bootEnv)) - if strings.Contains(bootEnv, "test") { - if !strings.Contains(n.GetNetworkEnv(), "test") { - out.Warn("chain and p2p are not in the same network") - } - } - - if strings.Contains(bootEnv, "main") { - if !strings.Contains(n.GetNetworkEnv(), "main") { - out.Warn("chain and p2p are not in the same network") - } - } - - if strings.Contains(bootEnv, "dev") { - if !strings.Contains(n.GetNetworkEnv(), "dev") { - out.Warn("chain and p2p are not in the same network") - } - } if registerFlag { _, err = n.RegisterOss(n.GetPeerPublickey(), n.GetDomainName()) diff --git a/go.mod b/go.mod index 0fb8bcf..004f75d 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/CESSProject/DeOSS go 1.20 require ( - github.com/CESSProject/cess-go-sdk v0.5.1-0.20240511074236-0962272b87ad + github.com/CESSProject/cess-go-sdk v0.5.1-0.20240516132726-775a705e4c76 github.com/CESSProject/cess-go-tools v0.2.6 github.com/CESSProject/go-keyring v0.0.0-20220614131247-ee3a8da30fde github.com/CESSProject/p2p-go v0.3.14 diff --git a/go.sum b/go.sum index 41939ca..18cdf65 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,8 @@ dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CESSProject/cess-go-sdk v0.5.1-0.20240511074236-0962272b87ad h1:oknDc9mWkxphN3ICRcJQNqPaudZOJkKx6t8uYYsXKEQ= -github.com/CESSProject/cess-go-sdk v0.5.1-0.20240511074236-0962272b87ad/go.mod h1:9BGRFkU3Zc5CYqK9EIz3DY14MjDg6a0bA1DWgMk3qFc= +github.com/CESSProject/cess-go-sdk v0.5.1-0.20240516132726-775a705e4c76 h1:6nYML8LknGbCa+l5BIseOjJuDxoXEl3fLGkDmFnkxTg= +github.com/CESSProject/cess-go-sdk v0.5.1-0.20240516132726-775a705e4c76/go.mod h1:9BGRFkU3Zc5CYqK9EIz3DY14MjDg6a0bA1DWgMk3qFc= github.com/CESSProject/cess-go-tools v0.2.6 h1:kZjqHN8uIyExTu8EEQApLN4qsmpWaWQfgBQD/0wF2+A= github.com/CESSProject/cess-go-tools v0.2.6/go.mod h1:g86Xkq1+FZHg1srAvkwGqD3WoG+EIdeA2JHQAhhtKqQ= github.com/CESSProject/go-keyring v0.0.0-20220614131247-ee3a8da30fde h1:5MDRjjtg6PEhqyVjupwaapN96cOZiddOGAYwKQeaTu0= diff --git a/node/delHandle.go b/node/delHandle.go index 94b9de0..95758d3 100644 --- a/node/delHandle.go +++ b/node/delHandle.go @@ -30,6 +30,16 @@ func (n *Node) delHandle(c *gin.Context) { clientIp string ) + if n.GetBalances() <= 1 { + c.JSON(http.StatusInternalServerError, "service balance is insufficient, please try again later.") + return + } + + if !n.GetRpcState() { + c.JSON(http.StatusInternalServerError, "service rpc connection failed, please try again later.") + return + } + clientIp = c.Request.Header.Get("X-Forwarded-For") n.Del("info", fmt.Sprintf("[%v] %v", clientIp, INFO_DelRequest)) // verify the authorization diff --git a/node/getHandle.go b/node/getHandle.go index 6838ad1..284e037 100644 --- a/node/getHandle.go +++ b/node/getHandle.go @@ -66,8 +66,25 @@ type FileMetaData struct { Owner []RtnUserBrief } +const max_concurrent_get = 30 + +var max_concurrent_get_ch chan bool + +func init() { + max_concurrent_get_ch = make(chan bool, max_concurrent_get) + for i := 0; i < max_concurrent_get; i++ { + max_concurrent_get_ch <- true + } +} + // getHandle func (n *Node) getHandle(c *gin.Context) { + if _, ok := <-max_concurrent_get_ch; !ok { + c.JSON(http.StatusTooManyRequests, "service is busy, please try again later.") + return + } + defer func() { max_concurrent_get_ch <- true }() + clientIp := c.Request.Header.Get("X-Forwarded-For") n.Query("info", fmt.Sprintf("[%s] %s", clientIp, INFO_GetRequest)) diff --git a/node/putHandle.go b/node/putHandle.go index 747ef8b..9b839e5 100644 --- a/node/putHandle.go +++ b/node/putHandle.go @@ -51,11 +51,21 @@ func init() { // putHandle func (n *Node) putHandle(c *gin.Context) { if _, ok := <-max_concurrent_req_ch; !ok { - c.JSON(http.StatusTooManyRequests, "The server is busy, please try again later.") + c.JSON(http.StatusTooManyRequests, "service is busy, please try again later.") return } defer func() { max_concurrent_req_ch <- true }() + if n.GetBalances() <= 1 { + c.JSON(http.StatusInternalServerError, "service balance is insufficient, please try again later.") + return + } + + if !n.GetRpcState() { + c.JSON(http.StatusInternalServerError, "service rpc connection failed, please try again later.") + return + } + var ( ok bool err error diff --git a/node/taskMgt.go b/node/taskMgt.go index 892bd73..9019993 100644 --- a/node/taskMgt.go +++ b/node/taskMgt.go @@ -9,9 +9,11 @@ package node import ( "fmt" + "math" + "math/big" "time" - "github.com/CESSProject/cess-go-sdk/chain" + schain "github.com/CESSProject/cess-go-sdk/chain" sconfig "github.com/CESSProject/cess-go-sdk/config" "github.com/CESSProject/p2p-go/out" "github.com/mr-tron/base58" @@ -19,24 +21,28 @@ import ( func (n *Node) TaskMgt() { var ( - ch_trackFile = make(chan bool, 1) - ch_sdkMgt = make(chan bool, 1) + ch_trackFile = make(chan bool, 1) + ch_sdkMgt = make(chan bool, 1) + ch_refreshMiner = make(chan bool, 1) ) - go n.refreshMiner() + go n.refreshMiner(ch_refreshMiner) go n.tracker(ch_trackFile) go n.sdkMgt(ch_sdkMgt) - task_10S := time.NewTicker(time.Duration(time.Second * 10)) - defer task_10S.Stop() + task_block := time.NewTicker(time.Duration(time.Second * 6)) + defer task_block.Stop() + + task_Minute := time.NewTicker(time.Duration(time.Second * 57)) + defer task_Minute.Stop() count := 0 for { select { - case <-task_10S.C: + case <-task_block.C: err := n.connectChain() if err != nil { - n.Log("err", chain.ERR_RPC_CONNECTION.Error()) - out.Err(chain.ERR_RPC_CONNECTION.Error()) + n.Log("err", schain.ERR_RPC_CONNECTION.Error()) + out.Err(schain.ERR_RPC_CONNECTION.Error()) } count++ if count >= 4320 { //blacklist released every 12 hours @@ -44,11 +50,22 @@ func (n *Node) TaskMgt() { n.ClearBlackList() } + case <-task_Minute.C: + err := n.refreshSelf() + if err != nil { + n.Log("err", err.Error()) + } + case <-ch_trackFile: go n.tracker(ch_trackFile) - case <-ch_sdkMgt: - go n.sdkMgt(ch_sdkMgt) + default: + if time.Now().Hour()%5 == 0 { + if len(ch_refreshMiner) > 0 { + <-ch_refreshMiner + go n.refreshMiner(ch_refreshMiner) + } + } } } } @@ -56,8 +73,8 @@ func (n *Node) TaskMgt() { func (n *Node) connectChain() error { var err error if !n.GetRpcState() { - n.Log("err", fmt.Sprintf("[%s] %v", n.GetCurrentRpcAddr(), chain.ERR_RPC_CONNECTION)) - out.Err(fmt.Sprintf("[%s] %v", n.GetCurrentRpcAddr(), chain.ERR_RPC_CONNECTION)) + n.Log("err", fmt.Sprintf("[%s] %v", n.GetCurrentRpcAddr(), schain.ERR_RPC_CONNECTION)) + out.Err(fmt.Sprintf("[%s] %v", n.GetCurrentRpcAddr(), schain.ERR_RPC_CONNECTION)) err = n.ReconnectRpc() if err != nil { return err @@ -69,7 +86,8 @@ func (n *Node) connectChain() error { return nil } -func (n *Node) refreshMiner() { +func (n *Node) refreshMiner(ch chan<- bool) { + defer func() { ch <- true }() sminerList, err := n.QueryAllMiner(-1) if err == nil { for i := 0; i < len(sminerList); i++ { @@ -85,3 +103,23 @@ func (n *Node) refreshMiner() { } } } + +func (n *Node) refreshSelf() error { + accInfo, err := n.QueryAccountInfoByAccountID(n.GetSignatureAccPulickey(), -1) + if err != nil { + return err + } + if len(accInfo.Data.Free.Bytes()) <= 0 { + n.SetBalances(0) + } else { + free_bi, _ := new(big.Int).SetString(accInfo.Data.Free.String(), 10) + minBanlance_bi, _ := new(big.Int).SetString(schain.MinTransactionBalance, 10) + free_bi = free_bi.Div(free_bi, minBanlance_bi) + if free_bi.IsUint64() { + n.SetBalances(free_bi.Uint64()) + } else { + n.SetBalances(math.MaxUint64) + } + } + return nil +}