forked from couchbase/gocbcore
-
Notifications
You must be signed in to change notification settings - Fork 0
/
routedata.go
95 lines (73 loc) · 1.84 KB
/
routedata.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
92
93
94
95
package gocbcore
import (
"fmt"
"sync/atomic"
"unsafe"
)
type routeData struct {
revId int64
uuid string
bktType bucketType
ketamaMap *ketamaContinuum
vbMap *vbucketMap
clientMux *memdClientMux
capiEpList []string
mgmtEpList []string
n1qlEpList []string
ftsEpList []string
cbasEpList []string
source *routeConfig
}
func (rd *routeData) DebugString() string {
var outStr string
outStr += fmt.Sprintf("Revision ID: %d\n", rd.revId)
outStr += "Client Multiplexer:"
outStr += reindentLog(" ", rd.clientMux.debugString()) + "\n"
outStr += "Capi Eps:\n"
for _, ep := range rd.capiEpList {
outStr += fmt.Sprintf(" - %s\n", ep)
}
outStr += "Mgmt Eps:\n"
for _, ep := range rd.mgmtEpList {
outStr += fmt.Sprintf(" - %s\n", ep)
}
outStr += "N1ql Eps:\n"
for _, ep := range rd.n1qlEpList {
outStr += fmt.Sprintf(" - %s\n", ep)
}
outStr += "FTS Eps:\n"
for _, ep := range rd.ftsEpList {
outStr += fmt.Sprintf(" - %s\n", ep)
}
outStr += "CBAS Eps:\n"
for _, ep := range rd.cbasEpList {
outStr += fmt.Sprintf(" - %s\n", ep)
}
outStr += "Source Data: *"
//outStr += fmt.Sprintf(" Source Data: %v", d.source)
return outStr
}
type routeDataPtr struct {
data unsafe.Pointer
}
func (ptr *routeDataPtr) Get() *routeData {
return (*routeData)(atomic.LoadPointer(&ptr.data))
}
func (ptr *routeDataPtr) Update(old, new *routeData) bool {
if new == nil {
logErrorf("Attempted to update to nil routeData")
return false
}
if old != nil {
return atomic.CompareAndSwapPointer(&ptr.data, unsafe.Pointer(old), unsafe.Pointer(new))
}
if atomic.SwapPointer(&ptr.data, unsafe.Pointer(new)) != nil {
logErrorf("Updated from nil attempted on initialized routeDataPtr")
return false
}
return true
}
func (ptr *routeDataPtr) Clear() *routeData {
val := atomic.SwapPointer(&ptr.data, nil)
return (*routeData)(val)
}