Skip to content

Commit dcfb6d2

Browse files
authored
Merge pull request #73 from ydb-platform/details-string
trace.Details.String() and trace.DetailsFromString()
2 parents 72d1629 + 71778fc commit dcfb6d2

File tree

3 files changed

+278
-0
lines changed

3 files changed

+278
-0
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
## 3.6.2
22
* Refactored table retry helpers
33
* Added new `PreferLocations[WithFallback][RegEx]` balancers
4+
* Added `trace.Details.String()` and `trace.Details.Strings()` helpers
5+
* Added `trace.DetailsFromString(s)` and `trace.DetailsFromStrings(s)` helper
46

57
## 3.6.1
68
* Switched closing cluster after closing all sub-services

trace/details.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package trace
22

3+
import (
4+
"sort"
5+
"strings"
6+
)
7+
38
type Details uint64
49

510
const (
@@ -32,3 +37,90 @@ const (
3237
TablePoolAPIEvents // 15360
3338
DetailsAll = ^Details(0) // 18446744073709551615
3439
)
40+
41+
var (
42+
detailsToString = map[Details]string{
43+
DriverSystemEvents: "DriverSystemEvents",
44+
DriverClusterEvents: "DriverClusterEvents",
45+
DriverNetEvents: "DriverNetEvents",
46+
DriverCoreEvents: "DriverCoreEvents",
47+
DriverCredentialsEvents: "DriverCredentialsEvents",
48+
DriverDiscoveryEvents: "DriverDiscoveryEvents",
49+
TableSessionLifeCycleEvents: "TableSessionLifeCycleEvents",
50+
TableSessionQueryInvokeEvents: "TableSessionQueryInvokeEvents",
51+
TableSessionQueryStreamEvents: "TableSessionQueryStreamEvents",
52+
TableSessionTransactionEvents: "TableSessionTransactionEvents",
53+
TablePoolLifeCycleEvents: "TablePoolLifeCycleEvents",
54+
TablePoolRetryEvents: "TablePoolRetryEvents",
55+
TablePoolSessionLifeCycleEvents: "TablePoolSessionLifeCycleEvents",
56+
TablePoolAPIEvents: "TablePoolAPIEvents",
57+
}
58+
stringToDetails = map[string]Details{
59+
"DriverSystemEvents": DriverSystemEvents,
60+
"DriverClusterEvents": DriverClusterEvents,
61+
"DriverNetEvents": DriverNetEvents,
62+
"DriverCoreEvents": DriverCoreEvents,
63+
"DriverCredentialsEvents": DriverCredentialsEvents,
64+
"DriverDiscoveryEvents": DriverDiscoveryEvents,
65+
"TableSessionLifeCycleEvents": TableSessionLifeCycleEvents,
66+
"TableSessionQueryInvokeEvents": TableSessionQueryInvokeEvents,
67+
"TableSessionQueryStreamEvents": TableSessionQueryStreamEvents,
68+
"TableSessionTransactionEvents": TableSessionTransactionEvents,
69+
"TablePoolLifeCycleEvents": TablePoolLifeCycleEvents,
70+
"TablePoolRetryEvents": TablePoolRetryEvents,
71+
"TablePoolSessionLifeCycleEvents": TablePoolSessionLifeCycleEvents,
72+
"TablePoolAPIEvents": TablePoolAPIEvents,
73+
"DriverConnEvents": DriverConnEvents,
74+
"TableSessionQueryEvents": TableSessionQueryEvents,
75+
"TableSessionEvents": TableSessionEvents,
76+
"TablePoolEvents": TablePoolEvents,
77+
"DetailsAll": DetailsAll,
78+
}
79+
maskDetails = DriverSystemEvents |
80+
DriverClusterEvents |
81+
DriverNetEvents |
82+
DriverCoreEvents |
83+
DriverCredentialsEvents |
84+
DriverDiscoveryEvents |
85+
TableSessionLifeCycleEvents |
86+
TableSessionQueryInvokeEvents |
87+
TableSessionQueryStreamEvents |
88+
TableSessionTransactionEvents |
89+
TablePoolLifeCycleEvents |
90+
TablePoolRetryEvents |
91+
TablePoolSessionLifeCycleEvents |
92+
TablePoolAPIEvents
93+
)
94+
95+
func DetailsFromString(s string) (d Details) {
96+
return DetailsFromStrings(strings.Split(s, "|"))
97+
}
98+
99+
func DetailsFromStrings(ss []string) (d Details) {
100+
if len(ss) == 0 {
101+
return 0
102+
}
103+
for _, sss := range ss {
104+
if v, ok := stringToDetails[sss]; ok {
105+
d |= v
106+
}
107+
}
108+
return d
109+
}
110+
111+
func (d Details) String() string {
112+
if s, ok := detailsToString[d]; ok {
113+
return s
114+
}
115+
return strings.Join(d.Strings(), "|")
116+
}
117+
118+
func (d Details) Strings() (ss []string) {
119+
for k, v := range detailsToString {
120+
if d&k != 0 {
121+
ss = append(ss, v)
122+
}
123+
}
124+
sort.Strings(ss)
125+
return
126+
}

trace/details_test.go

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
package trace
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestDetailsString(t *testing.T) {
8+
for _, test := range []struct {
9+
details Details
10+
exp string
11+
}{
12+
{
13+
details: DriverSystemEvents,
14+
exp: "DriverSystemEvents",
15+
},
16+
{
17+
details: DriverClusterEvents,
18+
exp: "DriverClusterEvents",
19+
},
20+
{
21+
details: DriverNetEvents,
22+
exp: "DriverNetEvents",
23+
},
24+
{
25+
details: DriverCoreEvents,
26+
exp: "DriverCoreEvents",
27+
},
28+
{
29+
details: DriverCredentialsEvents,
30+
exp: "DriverCredentialsEvents",
31+
},
32+
{
33+
details: DriverDiscoveryEvents,
34+
exp: "DriverDiscoveryEvents",
35+
},
36+
{
37+
details: TableSessionLifeCycleEvents,
38+
exp: "TableSessionLifeCycleEvents",
39+
},
40+
{
41+
details: TableSessionQueryInvokeEvents,
42+
exp: "TableSessionQueryInvokeEvents",
43+
},
44+
{
45+
details: TableSessionQueryStreamEvents,
46+
exp: "TableSessionQueryStreamEvents",
47+
},
48+
{
49+
details: TableSessionTransactionEvents,
50+
exp: "TableSessionTransactionEvents",
51+
},
52+
{
53+
details: TablePoolLifeCycleEvents,
54+
exp: "TablePoolLifeCycleEvents",
55+
},
56+
{
57+
details: TablePoolRetryEvents,
58+
exp: "TablePoolRetryEvents",
59+
},
60+
{
61+
details: TablePoolSessionLifeCycleEvents,
62+
exp: "TablePoolSessionLifeCycleEvents",
63+
},
64+
{
65+
details: TablePoolAPIEvents,
66+
exp: "TablePoolAPIEvents",
67+
},
68+
{
69+
details: DriverSystemEvents | DriverCoreEvents,
70+
exp: "DriverCoreEvents|DriverSystemEvents",
71+
},
72+
{
73+
details: DriverClusterEvents | TablePoolAPIEvents,
74+
exp: "DriverClusterEvents|TablePoolAPIEvents",
75+
},
76+
{
77+
details: DriverSystemEvents | DriverClusterEvents | DriverCoreEvents | TablePoolEvents,
78+
exp: "DriverClusterEvents|DriverCoreEvents|DriverSystemEvents|TablePoolAPIEvents|" +
79+
"TablePoolLifeCycleEvents|TablePoolRetryEvents|TablePoolSessionLifeCycleEvents",
80+
},
81+
} {
82+
t.Run(test.exp, func(t *testing.T) {
83+
if test.details.String() != test.exp {
84+
t.Fatalf("unexpected %d serialize to string, act %s, exp %s", test.details, test.details.String(), test.exp)
85+
}
86+
})
87+
}
88+
}
89+
90+
func TestDetailsFromString(t *testing.T) {
91+
for _, test := range []struct {
92+
exp Details
93+
s string
94+
}{
95+
{
96+
s: "DriverSystemEvents",
97+
exp: DriverSystemEvents,
98+
},
99+
{
100+
s: "DriverClusterEvents",
101+
exp: DriverClusterEvents,
102+
},
103+
{
104+
s: "DriverNetEvents",
105+
exp: DriverNetEvents,
106+
},
107+
{
108+
s: "DriverCoreEvents",
109+
exp: DriverCoreEvents,
110+
},
111+
{
112+
s: "DriverCredentialsEvents",
113+
exp: DriverCredentialsEvents,
114+
},
115+
{
116+
s: "DriverDiscoveryEvents",
117+
exp: DriverDiscoveryEvents,
118+
},
119+
{
120+
s: "TableSessionLifeCycleEvents",
121+
exp: TableSessionLifeCycleEvents,
122+
},
123+
{
124+
s: "TableSessionQueryInvokeEvents",
125+
exp: TableSessionQueryInvokeEvents,
126+
},
127+
{
128+
s: "TableSessionQueryStreamEvents",
129+
exp: TableSessionQueryStreamEvents,
130+
},
131+
{
132+
s: "TableSessionTransactionEvents",
133+
exp: TableSessionTransactionEvents,
134+
},
135+
{
136+
s: "TablePoolLifeCycleEvents",
137+
exp: TablePoolLifeCycleEvents,
138+
},
139+
{
140+
s: "TablePoolRetryEvents",
141+
exp: TablePoolRetryEvents,
142+
},
143+
{
144+
s: "TablePoolSessionLifeCycleEvents",
145+
exp: TablePoolSessionLifeCycleEvents,
146+
},
147+
{
148+
s: "TablePoolAPIEvents",
149+
exp: TablePoolAPIEvents,
150+
},
151+
{
152+
s: "DriverCoreEvents|DriverSystemEvents",
153+
exp: DriverSystemEvents | DriverCoreEvents,
154+
},
155+
{
156+
s: "DriverClusterEvents|TablePoolAPIEvents",
157+
exp: DriverClusterEvents | TablePoolAPIEvents,
158+
},
159+
{
160+
s: "DriverClusterEvents|DriverCoreEvents|DriverSystemEvents|TablePoolAPIEvents|" +
161+
"TablePoolLifeCycleEvents|TablePoolRetryEvents|TablePoolSessionLifeCycleEvents",
162+
exp: DriverSystemEvents | DriverClusterEvents | DriverCoreEvents | TablePoolEvents,
163+
},
164+
} {
165+
t.Run(test.s, func(t *testing.T) {
166+
if DetailsFromString(test.s) != test.exp {
167+
t.Fatalf("unexpected %s deserialize to Details, act %d, exp %d", test.s, DetailsFromString(test.s), test.exp)
168+
}
169+
})
170+
}
171+
}
172+
173+
func TestDetailsToStringToDetails(t *testing.T) {
174+
for i := 0; i < int(maskDetails); i++ {
175+
d := Details(i)
176+
s := d.String()
177+
t.Run(s, func(t *testing.T) {
178+
dd := DetailsFromString(s)
179+
if dd != d {
180+
t.Fatalf("unexpected serialize-deserialize, act %d, exp %d, intermediate string %s", dd, d, s)
181+
}
182+
})
183+
}
184+
}

0 commit comments

Comments
 (0)