[
https://issues.apache.org/jira/browse/SCB-938?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16628291#comment-16628291
]
ASF GitHub Bot commented on SCB-938:
------------------------------------
little-cui closed pull request #450: SCB-938 Should check self presevation max
ttl
URL: https://github.com/apache/incubator-servicecomb-service-center/pull/450
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/server/core/backend/common.go b/server/core/backend/common.go
index 7cda6ce1..12127eff 100644
--- a/server/core/backend/common.go
+++ b/server/core/backend/common.go
@@ -27,6 +27,8 @@ const (
eventBlockSize = 1000
deferCheckWindow = 2 * time.Second // instance DELETE event
will be delay.
selfPreservationPercentage = 0.8
+ selfPreservationMaxTTL = 10 * 60 // 10min
+ selfPreservationInitCount = 5
)
var (
diff --git a/server/core/backend/defer_instance.go
b/server/core/backend/defer_instance.go
index ba06f7be..5ddc1212 100644
--- a/server/core/backend/defer_instance.go
+++ b/server/core/backend/defer_instance.go
@@ -28,7 +28,7 @@ import (
)
type deferItem struct {
- ttl *time.Timer
+ ttl int32 // in seconds
event discovery.KvEvent
}
@@ -38,7 +38,7 @@ type InstanceEventDeferHandler struct {
cache discovery.Cache
once sync.Once
enabled bool
- items map[string]deferItem
+ items map[string]*deferItem
pendingCh chan []discovery.KvEvent
deferCh chan discovery.KvEvent
resetCh chan struct{}
@@ -51,7 +51,7 @@ func (iedh *InstanceEventDeferHandler) OnCondition(cache
discovery.Cache, evts [
iedh.once.Do(func() {
iedh.cache = cache
- iedh.items = make(map[string]deferItem)
+ iedh.items = make(map[string]*deferItem)
iedh.pendingCh = make(chan []discovery.KvEvent, eventBlockSize)
iedh.deferCh = make(chan discovery.KvEvent, eventBlockSize)
iedh.resetCh = make(chan struct{})
@@ -79,9 +79,12 @@ func (iedh *InstanceEventDeferHandler) recoverOrDefer(evt
discovery.KvEvent) err
}
instance := kv.Value.(*pb.MicroServiceInstance)
- iedh.items[key] = deferItem{
- ttl: time.NewTimer(
-
time.Duration(instance.HealthCheck.Interval*(instance.HealthCheck.Times+1)) *
time.Second),
+ ttl := instance.HealthCheck.Interval *
(instance.HealthCheck.Times + 1)
+ if ttl <= 0 || ttl > selfPreservationMaxTTL {
+ ttl = selfPreservationMaxTTL
+ }
+ iedh.items[key] = &deferItem{
+ ttl: ttl,
event: evt,
}
}
@@ -96,6 +99,7 @@ func (iedh *InstanceEventDeferHandler) check(ctx
context.Context) {
defer log.Recover()
t, n := time.NewTimer(deferCheckWindow), false
+ interval := int32(deferCheckWindow / time.Second)
defer t.Stop()
for {
select {
@@ -116,7 +120,7 @@ func (iedh *InstanceEventDeferHandler) check(ctx
context.Context) {
}
total := iedh.cache.GetAll(nil)
- if total > 5 && float64(del) >=
float64(total)*iedh.Percent {
+ if total > selfPreservationInitCount && float64(del) >=
float64(total)*iedh.Percent {
iedh.enabled = true
log.Warnf("self preservation is enabled, caught
%d/%d(>=%.0f%%) DELETE events",
del, total, iedh.Percent*100)
@@ -128,25 +132,24 @@ func (iedh *InstanceEventDeferHandler) check(ctx
context.Context) {
}
case <-t.C:
n = false
+ t.Reset(deferCheckWindow)
+
+ if !iedh.enabled {
+ continue
+ }
for key, item := range iedh.items {
- if iedh.enabled {
- select {
- case <-item.ttl.C:
- default:
- continue
- }
- log.Warnf("defer handle timed out,
removed key is %s", key)
+ item.ttl -= interval
+ if item.ttl > 0 {
+ continue
}
+ log.Warnf("defer handle timed out, removed key
is %s", key)
iedh.recover(item.event)
}
-
- if iedh.enabled && len(iedh.items) == 0 {
+ if len(iedh.items) == 0 {
iedh.renew()
log.Warnf("self preservation is stopped")
}
-
- t.Reset(deferCheckWindow)
case <-iedh.resetCh:
iedh.renew()
log.Warnf("self preservation is reset")
@@ -164,10 +167,7 @@ func (iedh *InstanceEventDeferHandler) recover(evt
discovery.KvEvent) {
func (iedh *InstanceEventDeferHandler) renew() {
iedh.enabled = false
- for _, item := range iedh.items {
- item.ttl.Stop()
- }
- iedh.items = make(map[string]deferItem)
+ iedh.items = make(map[string]*deferItem)
}
func (iedh *InstanceEventDeferHandler) Reset() bool {
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> Should check self presevation max ttl
> -------------------------------------
>
> Key: SCB-938
> URL: https://issues.apache.org/jira/browse/SCB-938
> Project: Apache ServiceComb
> Issue Type: Bug
> Components: Service-Center
> Reporter: little-cui
> Assignee: little-cui
> Priority: Major
> Fix For: service-center-1.1.0
>
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)