Skip to content

Commit f019892

Browse files
committed
Merge branch 'master' into gnmi_native_write
2 parents 2cd6dfa + ae72767 commit f019892

File tree

8 files changed

+345
-294
lines changed

8 files changed

+345
-294
lines changed

azure-pipelines.yml

+19-3
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,6 @@ stages:
102102
sudo dpkg -i ../target/debs/bullseye/libnl-nf-3-200_*.deb
103103
sudo dpkg -i ../target/debs/bullseye/libhiredis0.14_*.deb
104104
sudo dpkg -i ../target/debs/bullseye/libhiredis-dev_*.deb
105-
sudo dpkg -i ../target/debs/bullseye/libswsscommon_1.0.0_amd64.deb
106-
sudo dpkg -i ../target/debs/bullseye/libswsscommon-dev_1.0.0_amd64.deb
107-
sudo dpkg -i ../target/debs/bullseye/python3-swsscommon_1.0.0_amd64.deb
108105
displayName: "Install libswsscommon dependencies"
109106
110107
- script: |
@@ -116,6 +113,25 @@ stages:
116113
sudo apt-get install -y dotnet-sdk-5.0
117114
displayName: "Install .NET CORE"
118115
116+
- task: DownloadPipelineArtifact@2
117+
inputs:
118+
source: specific
119+
project: build
120+
pipeline: Azure.sonic-swss-common
121+
artifact: sonic-swss-common.bullseye.amd64
122+
runVersion: 'latestFromBranch'
123+
runBranch: 'refs/heads/master'
124+
displayName: "Download sonic-swss-common"
125+
126+
- script: |
127+
set -ex
128+
# LIBSWSSCOMMON
129+
sudo dpkg -i libswsscommon_1.0.0_amd64.deb
130+
sudo dpkg -i libswsscommon-dev_1.0.0_amd64.deb
131+
sudo dpkg -i python3-swsscommon_1.0.0_amd64.deb
132+
workingDirectory: $(Pipeline.Workspace)/
133+
displayName: 'Install libswsscommon package'
134+
119135
- script: |
120136
set -ex
121137
ls -l

common_utils/context.go

+53-23
Original file line numberDiff line numberDiff line change
@@ -36,23 +36,58 @@ const requestContextKey contextkey = 0
3636
// Request Id generator
3737
var requestCounter uint64
3838

39-
var CountersName = [...]string {
40-
"GNMI get",
41-
"GNMI get fail",
42-
"GNMI set",
43-
"GNMI set fail",
44-
"GNOI reboot",
45-
"DBUS",
46-
"DBUS fail",
47-
"DBUS apply patch db",
48-
"DBUS apply patch yang",
49-
"DBUS create checkpoint",
50-
"DBUS delete checkpoint",
51-
"DBUS config save",
52-
"DBUS config reload",
39+
type CounterType int
40+
const (
41+
GNMI_GET CounterType = iota
42+
GNMI_GET_FAIL
43+
GNMI_SET
44+
GNMI_SET_FAIL
45+
GNOI_REBOOT
46+
DBUS
47+
DBUS_FAIL
48+
DBUS_APPLY_PATCH_DB
49+
DBUS_APPLY_PATCH_YANG
50+
DBUS_CREATE_CHECKPOINT
51+
DBUS_DELETE_CHECKPOINT
52+
DBUS_CONFIG_SAVE
53+
DBUS_CONFIG_RELOAD
54+
COUNTER_SIZE
55+
)
56+
57+
func (c CounterType) String() string {
58+
switch c {
59+
case GNMI_GET:
60+
return "GNMI get"
61+
case GNMI_GET_FAIL:
62+
return "GNMI get fail"
63+
case GNMI_SET:
64+
return "GNMI set"
65+
case GNMI_SET_FAIL:
66+
return "GNMI set fail"
67+
case GNOI_REBOOT:
68+
return "GNOI reboot"
69+
case DBUS:
70+
return "DBUS"
71+
case DBUS_FAIL:
72+
return "DBUS fail"
73+
case DBUS_APPLY_PATCH_DB:
74+
return "DBUS apply patch db"
75+
case DBUS_APPLY_PATCH_YANG:
76+
return "DBUS apply patch yang"
77+
case DBUS_CREATE_CHECKPOINT:
78+
return "DBUS create checkpoint"
79+
case DBUS_DELETE_CHECKPOINT:
80+
return "DBUS delete checkpoint"
81+
case DBUS_CONFIG_SAVE:
82+
return "DBUS config save"
83+
case DBUS_CONFIG_RELOAD:
84+
return "DBUS config reload"
85+
default:
86+
return ""
87+
}
5388
}
5489

55-
var globalCounters [len(CountersName)]uint64
90+
var globalCounters [COUNTER_SIZE]uint64
5691

5792

5893
// GetContext function returns the RequestContext object for a
@@ -80,19 +115,14 @@ func GetUsername(ctx context.Context, username *string) {
80115
}
81116

82117
func InitCounters() {
83-
for i := 0; i < len(CountersName); i++ {
118+
for i := 0; i < int(COUNTER_SIZE); i++ {
84119
globalCounters[i] = 0
85120
}
86121
SetMemCounters(&globalCounters)
87122
}
88123

89-
func IncCounter(name string) {
90-
for i := 0; i < len(CountersName); i++ {
91-
if CountersName[i] == name {
92-
atomic.AddUint64(&globalCounters[i], 1)
93-
break
94-
}
95-
}
124+
func IncCounter(cnt CounterType) {
125+
atomic.AddUint64(&globalCounters[cnt], 1)
96126
SetMemCounters(&globalCounters)
97127
}
98128

common_utils/shareMem.go

+64-64
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,64 @@
1-
package common_utils
2-
3-
import (
4-
"fmt"
5-
"syscall"
6-
"unsafe"
7-
)
8-
9-
// Use share memory to dump GNMI internal counters,
10-
// GNMI server and gnmi_dump should use memKey to access the share memory,
11-
// memSize is 1024 bytes, so we can support 128 counters
12-
// memMode is 0x380, this value is O_RDWR|IPC_CREAT,
13-
// O_RDWR means: Owner can write and read the file, everyone else can't.
14-
// IPC_CREAT means: Create a shared memory segment if a shared memory identifier does not exist for memKey.
15-
var (
16-
memKey = 7749
17-
memSize = 1024
18-
memMode = 0x380
19-
)
20-
21-
func SetMemCounters(counters *[len(CountersName)]uint64) error {
22-
shmid, _, err := syscall.Syscall(syscall.SYS_SHMGET, uintptr(memKey), uintptr(memSize), uintptr(memMode))
23-
if int(shmid) == -1 {
24-
return fmt.Errorf("syscall error, err: %v\n", err)
25-
}
26-
27-
shmaddr, _, err := syscall.Syscall(syscall.SYS_SHMAT, shmid, 0, 0)
28-
if int(shmaddr) == -1 {
29-
return fmt.Errorf("syscall error, err: %v\n", err)
30-
}
31-
defer syscall.Syscall(syscall.SYS_SHMDT, shmaddr, 0, 0)
32-
33-
const size = unsafe.Sizeof(uint64(0))
34-
addr := uintptr(unsafe.Pointer(shmaddr))
35-
36-
for i := 0; i < len(counters); i++ {
37-
*(*uint64)(unsafe.Pointer(addr)) = counters[i]
38-
addr += size
39-
}
40-
return nil
41-
}
42-
43-
func GetMemCounters(counters *[len(CountersName)]uint64) error {
44-
shmid, _, err := syscall.Syscall(syscall.SYS_SHMGET, uintptr(memKey), uintptr(memSize), uintptr(memMode))
45-
if int(shmid) == -1 {
46-
return fmt.Errorf("syscall error, err: %v\n", err)
47-
}
48-
49-
shmaddr, _, err := syscall.Syscall(syscall.SYS_SHMAT, shmid, 0, 0)
50-
if int(shmaddr) == -1 {
51-
return fmt.Errorf("syscall error, err: %v\n", err)
52-
}
53-
defer syscall.Syscall(syscall.SYS_SHMDT, shmaddr, 0, 0)
54-
55-
const size = unsafe.Sizeof(uint64(0))
56-
addr := uintptr(unsafe.Pointer(shmaddr))
57-
58-
for i := 0; i < len(counters); i++ {
59-
counters[i] = *(*uint64)(unsafe.Pointer(addr))
60-
addr += size
61-
}
62-
return nil
63-
}
64-
1+
package common_utils
2+
3+
import (
4+
"fmt"
5+
"syscall"
6+
"unsafe"
7+
)
8+
9+
// Use share memory to dump GNMI internal counters,
10+
// GNMI server and gnmi_dump should use memKey to access the share memory,
11+
// memSize is 1024 bytes, so we can support 128 counters
12+
// memMode is 0x380, this value is O_RDWR|IPC_CREAT,
13+
// O_RDWR means: Owner can write and read the file, everyone else can't.
14+
// IPC_CREAT means: Create a shared memory segment if a shared memory identifier does not exist for memKey.
15+
var (
16+
memKey = 7749
17+
memSize = 1024
18+
memMode = 0x380
19+
)
20+
21+
func SetMemCounters(counters *[int(COUNTER_SIZE)]uint64) error {
22+
shmid, _, err := syscall.Syscall(syscall.SYS_SHMGET, uintptr(memKey), uintptr(memSize), uintptr(memMode))
23+
if int(shmid) == -1 {
24+
return fmt.Errorf("syscall error, err: %v\n", err)
25+
}
26+
27+
shmaddr, _, err := syscall.Syscall(syscall.SYS_SHMAT, shmid, 0, 0)
28+
if int(shmaddr) == -1 {
29+
return fmt.Errorf("syscall error, err: %v\n", err)
30+
}
31+
defer syscall.Syscall(syscall.SYS_SHMDT, shmaddr, 0, 0)
32+
33+
const size = unsafe.Sizeof(uint64(0))
34+
addr := uintptr(unsafe.Pointer(shmaddr))
35+
36+
for i := 0; i < len(counters); i++ {
37+
*(*uint64)(unsafe.Pointer(addr)) = counters[i]
38+
addr += size
39+
}
40+
return nil
41+
}
42+
43+
func GetMemCounters(counters *[int(COUNTER_SIZE)]uint64) error {
44+
shmid, _, err := syscall.Syscall(syscall.SYS_SHMGET, uintptr(memKey), uintptr(memSize), uintptr(memMode))
45+
if int(shmid) == -1 {
46+
return fmt.Errorf("syscall error, err: %v\n", err)
47+
}
48+
49+
shmaddr, _, err := syscall.Syscall(syscall.SYS_SHMAT, shmid, 0, 0)
50+
if int(shmaddr) == -1 {
51+
return fmt.Errorf("syscall error, err: %v\n", err)
52+
}
53+
defer syscall.Syscall(syscall.SYS_SHMDT, shmaddr, 0, 0)
54+
55+
const size = unsafe.Sizeof(uint64(0))
56+
addr := uintptr(unsafe.Pointer(shmaddr))
57+
58+
for i := 0; i < len(counters); i++ {
59+
counters[i] = *(*uint64)(unsafe.Pointer(addr))
60+
addr += size
61+
}
62+
return nil
63+
}
64+

gnmi_dump/gnmi_dump.go

+30-29
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
1-
package main
2-
3-
import (
4-
"flag"
5-
"fmt"
6-
"github.com/sonic-net/sonic-gnmi/common_utils"
7-
)
8-
9-
const help = `
10-
gnmi_dump is used to dump internal counters for debugging purpose,
11-
including GNMI request counter, GNOI request counter and DBUS request counter.
12-
`
13-
14-
func main() {
15-
flag.Usage = func() {
16-
fmt.Print(help)
17-
}
18-
flag.Parse()
19-
var counters [len(common_utils.CountersName)]uint64
20-
err := common_utils.GetMemCounters(&counters)
21-
if err != nil {
22-
fmt.Printf("Error: Fail to read counters, %v", err)
23-
return
24-
}
25-
fmt.Printf("Dump GNMI counters\n")
26-
for i := 0; i < len(common_utils.CountersName); i++ {
27-
fmt.Printf("%v---%v\n", common_utils.CountersName[i], counters[i])
28-
}
29-
}
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"github.com/sonic-net/sonic-gnmi/common_utils"
7+
)
8+
9+
const help = `
10+
gnmi_dump is used to dump internal counters for debugging purpose,
11+
including GNMI request counter, GNOI request counter and DBUS request counter.
12+
`
13+
14+
func main() {
15+
flag.Usage = func() {
16+
fmt.Print(help)
17+
}
18+
flag.Parse()
19+
var counters [common_utils.COUNTER_SIZE]uint64
20+
err := common_utils.GetMemCounters(&counters)
21+
if err != nil {
22+
fmt.Printf("Error: Fail to read counters, %v", err)
23+
return
24+
}
25+
fmt.Printf("Dump GNMI counters\n")
26+
for i := 0; i < int(common_utils.COUNTER_SIZE); i++ {
27+
cnt := common_utils.CounterType(i)
28+
fmt.Printf("%v---%v\n", cnt.String(), counters[i])
29+
}
30+
}

0 commit comments

Comments
 (0)