-
Notifications
You must be signed in to change notification settings - Fork 4
/
default.go
91 lines (69 loc) · 2.12 KB
/
default.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
Package defaultcontext manage the default context and timeouts
Copyright 2021 Portworx
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package defaultcontext
import (
"sync"
"time"
grpcgw "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
)
var (
inst *defaultContextManager
instLock sync.Mutex
defaultDuration = 5 * time.Minute
// Inst returns the singleton to the default context manager
Inst = func() *defaultContextManager {
return defaultContextManagerGetInst()
}
)
func defaultContextManagerGetInst() *defaultContextManager {
instLock.Lock()
defer instLock.Unlock()
if inst == nil {
inst = newDefaultContextManager()
}
return inst
}
type defaultContextManager struct {
lock sync.RWMutex
timeout time.Duration
}
func newDefaultContextManager() *defaultContextManager {
d := &defaultContextManager{
timeout: defaultDuration,
}
d.apply()
return d
}
// SetDefaultTimeout sets the default timeout duration used by contexts without a timeout
func (d *defaultContextManager) SetDefaultTimeout(t time.Duration) error {
d.lock.Lock()
defer d.lock.Unlock()
d.timeout = t
d.apply()
return nil
}
// GetDefaultTimeout returns the default timeout duration used by contexts without a timeout.
//
// It is recommended to use grpcutils.WithDefaultTimeout(ctx) which calls this function,
// instead of calling this function directly.
func (d *defaultContextManager) GetDefaultTimeout() time.Duration {
d.lock.RLock()
defer d.lock.RUnlock()
return d.timeout
}
// Add here any external default timeouts that need to be set
func (d *defaultContextManager) apply() {
// Set Rest Gateway default context
grpcgw.DefaultContextTimeout = d.timeout
}