|
@@ -657,6 +657,7 @@ func (s *InboundService) ResetAllTraffics() error {
|
|
|
return s.resetAllTrafficsLocked()
|
|
return s.resetAllTrafficsLocked()
|
|
|
})
|
|
})
|
|
|
if err == nil {
|
|
if err == nil {
|
|
|
|
|
+ s.propagateResetAllTrafficsToNodes()
|
|
|
s.resetAllMtprotoQuotas()
|
|
s.resetAllMtprotoQuotas()
|
|
|
}
|
|
}
|
|
|
return err
|
|
return err
|
|
@@ -666,52 +667,53 @@ func (s *InboundService) resetAllTrafficsLocked() error {
|
|
|
db := database.GetDB()
|
|
db := database.GetDB()
|
|
|
now := time.Now().UnixMilli()
|
|
now := time.Now().UnixMilli()
|
|
|
|
|
|
|
|
- if err := db.Model(model.Inbound{}).
|
|
|
|
|
|
|
+ return db.Model(model.Inbound{}).
|
|
|
Where("user_id > ?", 0).
|
|
Where("user_id > ?", 0).
|
|
|
Updates(map[string]any{
|
|
Updates(map[string]any{
|
|
|
"up": 0,
|
|
"up": 0,
|
|
|
"down": 0,
|
|
"down": 0,
|
|
|
"last_traffic_reset_time": now,
|
|
"last_traffic_reset_time": now,
|
|
|
- }).Error; err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ }).Error
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
+// propagateResetAllTrafficsToNodes tells every node to zero its own counters.
|
|
|
|
|
+// Kept OUT of the traffic-writer transaction: each remote call can block up to
|
|
|
|
|
+// remoteHTTPTimeout, and holding the single serial writer across N such calls
|
|
|
|
|
+// stalls traffic accounting and drops the deltas of every concurrent poll.
|
|
|
|
|
+func (s *InboundService) propagateResetAllTrafficsToNodes() {
|
|
|
nodes, err := (&NodeService{}).GetAll()
|
|
nodes, err := (&NodeService{}).GetAll()
|
|
|
- if err == nil {
|
|
|
|
|
- for _, node := range nodes {
|
|
|
|
|
- if rt, err := runtime.GetManager().RuntimeFor(&node.Id); err == nil {
|
|
|
|
|
- if e := rt.ResetAllTraffics(context.Background()); e != nil {
|
|
|
|
|
- logger.Warning("ResetAllTraffics: remote propagation to", rt.Name(), "failed:", e)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ for _, node := range nodes {
|
|
|
|
|
+ if rt, err := runtime.GetManager().RuntimeFor(&node.Id); err == nil {
|
|
|
|
|
+ if e := rt.ResetAllTraffics(context.Background()); e != nil {
|
|
|
|
|
+ logger.Warning("ResetAllTraffics: remote propagation to", rt.Name(), "failed:", e)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- return nil
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (s *InboundService) ResetInboundTraffic(id int) error {
|
|
func (s *InboundService) ResetInboundTraffic(id int) error {
|
|
|
- return submitTrafficWrite(func() error {
|
|
|
|
|
- db := database.GetDB()
|
|
|
|
|
- if err := db.Model(model.Inbound{}).
|
|
|
|
|
|
|
+ if err := submitTrafficWrite(func() error {
|
|
|
|
|
+ return database.GetDB().Model(model.Inbound{}).
|
|
|
Where("id = ?", id).
|
|
Where("id = ?", id).
|
|
|
- Updates(map[string]any{"up": 0, "down": 0}).Error; err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ Updates(map[string]any{"up": 0, "down": 0}).Error
|
|
|
|
|
+ }); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- inbound, err := s.GetInbound(id)
|
|
|
|
|
- if err == nil && inbound != nil && inbound.NodeID != nil {
|
|
|
|
|
- if rt, rterr := s.runtimeFor(inbound); rterr == nil {
|
|
|
|
|
- if e := rt.ResetInboundTraffic(context.Background(), inbound); e != nil {
|
|
|
|
|
- logger.Warning("ResetInboundTraffic: remote propagation to", rt.Name(), "failed:", e)
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- logger.Warning("ResetInboundTraffic: runtime lookup failed:", rterr)
|
|
|
|
|
|
|
+ inbound, err := s.GetInbound(id)
|
|
|
|
|
+ if err == nil && inbound != nil && inbound.NodeID != nil {
|
|
|
|
|
+ if rt, rterr := s.runtimeFor(inbound); rterr == nil {
|
|
|
|
|
+ if e := rt.ResetInboundTraffic(context.Background(), inbound); e != nil {
|
|
|
|
|
+ logger.Warning("ResetInboundTraffic: remote propagation to", rt.Name(), "failed:", e)
|
|
|
}
|
|
}
|
|
|
|
|
+ } else {
|
|
|
|
|
+ logger.Warning("ResetInboundTraffic: runtime lookup failed:", rterr)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- return nil
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (s *InboundService) DelDepletedClients(id int) (err error) {
|
|
func (s *InboundService) DelDepletedClients(id int) (err error) {
|