Skip to content

Commit 556e1ea

Browse files
authored
Merge pull request #197 from pradeep-hegde/perf-fix
Reduce CSI proxy CPU usage
2 parents 74279e7 + 1d95f09 commit 556e1ea

File tree

7 files changed

+87
-144
lines changed

7 files changed

+87
-144
lines changed

pkg/os/disk/api.go

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import (
44
"encoding/hex"
55
"encoding/json"
66
"fmt"
7-
"os/exec"
87
"regexp"
98
"strconv"
109
"strings"
1110
"syscall"
1211
"unsafe"
1312

1413
shared "github.com/kubernetes-csi/csi-proxy/pkg/shared/disk"
14+
"github.com/kubernetes-csi/csi-proxy/pkg/utils"
1515
"k8s.io/klog/v2"
1616
)
1717

@@ -64,13 +64,6 @@ func New() DiskAPI {
6464
return DiskAPI{}
6565
}
6666

67-
func runExec(command string) ([]byte, error) {
68-
cmd := exec.Command("powershell", "/c", command)
69-
klog.V(4).Infof("Executing command: %q", cmd.String())
70-
out, err := cmd.CombinedOutput()
71-
return out, err
72-
}
73-
7467
// ListDiskLocations - constructs a map with the disk number as the key and the DiskLocation structure
7568
// as the value. The DiskLocation struct has various fields like the Adapter, Bus, Target and LUNID.
7669
func (DiskAPI) ListDiskLocations() (map[uint32]shared.DiskLocation, error) {
@@ -80,7 +73,7 @@ func (DiskAPI) ListDiskLocations() (map[uint32]shared.DiskLocation, error) {
8073
// "location": "PCI Slot 3 : Adapter 0 : Port 0 : Target 1 : LUN 0"
8174
// }, ...]
8275
cmd := fmt.Sprintf("ConvertTo-Json @(Get-Disk | select Number, Location)")
83-
out, err := runExec(cmd)
76+
out, err := utils.RunPowershellCmd(cmd)
8477
if err != nil {
8578
return nil, fmt.Errorf("failed to list disk location. cmd: %q, output: %q, err %v", cmd, string(out), err)
8679
}
@@ -128,7 +121,7 @@ func (DiskAPI) ListDiskLocations() (map[uint32]shared.DiskLocation, error) {
128121

129122
func (DiskAPI) Rescan() error {
130123
cmd := "Update-HostStorageCache"
131-
out, err := runExec(cmd)
124+
out, err := utils.RunPowershellCmd(cmd)
132125
if err != nil {
133126
return fmt.Errorf("error updating host storage cache output: %q, err: %v", string(out), err)
134127
}
@@ -137,7 +130,7 @@ func (DiskAPI) Rescan() error {
137130

138131
func (DiskAPI) IsDiskInitialized(diskNumber uint32) (bool, error) {
139132
cmd := fmt.Sprintf("Get-Disk -Number %d | Where partitionstyle -eq 'raw'", diskNumber)
140-
out, err := runExec(cmd)
133+
out, err := utils.RunPowershellCmd(cmd)
141134
if err != nil {
142135
return false, fmt.Errorf("error checking initialized status of disk %d: %v, %v", diskNumber, out, err)
143136
}
@@ -150,7 +143,7 @@ func (DiskAPI) IsDiskInitialized(diskNumber uint32) (bool, error) {
150143

151144
func (DiskAPI) InitializeDisk(diskNumber uint32) error {
152145
cmd := fmt.Sprintf("Initialize-Disk -Number %d -PartitionStyle GPT", diskNumber)
153-
out, err := runExec(cmd)
146+
out, err := utils.RunPowershellCmd(cmd)
154147
if err != nil {
155148
return fmt.Errorf("error initializing disk %d: %v, %v", diskNumber, out, err)
156149
}
@@ -159,7 +152,7 @@ func (DiskAPI) InitializeDisk(diskNumber uint32) error {
159152

160153
func (DiskAPI) BasicPartitionsExist(diskNumber uint32) (bool, error) {
161154
cmd := fmt.Sprintf("Get-Partition | Where DiskNumber -eq %d | Where Type -ne Reserved", diskNumber)
162-
out, err := runExec(cmd)
155+
out, err := utils.RunPowershellCmd(cmd)
163156
if err != nil {
164157
return false, fmt.Errorf("error checking presence of partitions on disk %d: %v, %v", diskNumber, out, err)
165158
}
@@ -172,7 +165,7 @@ func (DiskAPI) BasicPartitionsExist(diskNumber uint32) (bool, error) {
172165

173166
func (DiskAPI) CreateBasicPartition(diskNumber uint32) error {
174167
cmd := fmt.Sprintf("New-Partition -DiskNumber %d -UseMaximumSize", diskNumber)
175-
out, err := runExec(cmd)
168+
out, err := utils.RunPowershellCmd(cmd)
176169
if err != nil {
177170
return fmt.Errorf("error creating parition on disk %d: %v, %v", diskNumber, out, err)
178171
}
@@ -238,7 +231,7 @@ func (DiskAPI) GetDiskPage83ID(disk syscall.Handle) (string, error) {
238231

239232
func (imp DiskAPI) GetDiskNumberWithID(page83ID string) (uint32, error) {
240233
cmd := "ConvertTo-Json @(Get-Disk | Select Path)"
241-
out, err := runExec(cmd)
234+
out, err := utils.RunPowershellCmd(cmd)
242235
if err != nil {
243236
return 0, fmt.Errorf("Could not query disk paths")
244237
}
@@ -298,7 +291,7 @@ func (imp DiskAPI) ListDiskIDs() (map[uint32]shared.DiskIDs, error) {
298291
// "SerialNumber": null
299292
// }, ]
300293
cmd := "ConvertTo-Json @(Get-Disk | Select Path, SerialNumber)"
301-
out, err := runExec(cmd)
294+
out, err := utils.RunPowershellCmd(cmd)
302295
if err != nil {
303296
return nil, fmt.Errorf("Could not query disk paths")
304297
}
@@ -329,7 +322,7 @@ func (imp DiskAPI) ListDiskIDs() (map[uint32]shared.DiskIDs, error) {
329322

330323
func (imp DiskAPI) GetDiskStats(diskNumber uint32) (int64, error) {
331324
cmd := fmt.Sprintf("(Get-Disk -Number %d).Size", diskNumber)
332-
out, err := runExec(cmd)
325+
out, err := utils.RunPowershellCmd(cmd)
333326
if err != nil || len(out) == 0 {
334327
return -1, fmt.Errorf("error getting size of disk. cmd: %s, output: %s, error: %v", cmd, string(out), err)
335328
}
@@ -351,7 +344,7 @@ func (imp DiskAPI) GetDiskStats(diskNumber uint32) (int64, error) {
351344

352345
func (imp DiskAPI) SetDiskState(diskNumber uint32, isOnline bool) error {
353346
cmd := fmt.Sprintf("(Get-Disk -Number %d) | Set-Disk -IsOffline $%t", diskNumber, !isOnline)
354-
out, err := runExec(cmd)
347+
out, err := utils.RunPowershellCmd(cmd)
355348
if err != nil {
356349
return fmt.Errorf("error setting disk attach state. cmd: %s, output: %s, error: %v", cmd, string(out), err)
357350
}
@@ -361,7 +354,7 @@ func (imp DiskAPI) SetDiskState(diskNumber uint32, isOnline bool) error {
361354

362355
func (imp DiskAPI) GetDiskState(diskNumber uint32) (bool, error) {
363356
cmd := fmt.Sprintf("(Get-Disk -Number %d) | Select-Object -ExpandProperty IsOffline", diskNumber)
364-
out, err := runExec(cmd)
357+
out, err := utils.RunPowershellCmd(cmd)
365358
if err != nil {
366359
return false, fmt.Errorf("error getting disk state. cmd: %s, output: %s, error: %v", cmd, string(out), err)
367360
}

pkg/os/filesystem/api.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ package filesystem
33
import (
44
"fmt"
55
"os"
6-
"os/exec"
76
"path/filepath"
87
"strings"
8+
9+
"github.com/kubernetes-csi/csi-proxy/pkg/utils"
910
)
1011

1112
// Implements the Filesystem OS API calls. All code here should be very simple
@@ -49,9 +50,9 @@ func (filesystemAPI) PathExists(path string) (bool, error) {
4950
}
5051

5152
func pathValid(path string) (bool, error) {
52-
cmd := exec.Command("powershell", "/c", `Test-Path $Env:remotepath`)
53-
cmd.Env = append(os.Environ(), fmt.Sprintf("remotepath=%s", path))
54-
output, err := cmd.CombinedOutput()
53+
cmd := `Test-Path $Env:remotepath`
54+
cmdEnv := fmt.Sprintf("remotepath=%s", path)
55+
output, err := utils.RunPowershellCmd(cmd, cmdEnv)
5556
if err != nil {
5657
return false, fmt.Errorf("returned output: %s, error: %v", string(output), err)
5758
}

pkg/os/iscsi/api.go

Lines changed: 14 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package iscsi
33
import (
44
"encoding/json"
55
"fmt"
6-
"os"
7-
"os/exec"
6+
7+
"github.com/kubernetes-csi/csi-proxy/pkg/utils"
88
)
99

1010
// Implements the iSCSI OS API calls. All code here should be very simple
@@ -22,12 +22,8 @@ func (APIImplementor) AddTargetPortal(portal *TargetPortal) error {
2222
cmdLine := fmt.Sprintf(
2323
`New-IscsiTargetPortal -TargetPortalAddress ${Env:iscsi_tp_address} ` +
2424
`-TargetPortalPortNumber ${Env:iscsi_tp_port}`)
25-
cmd := exec.Command("powershell.exe", "/c", cmdLine)
26-
cmd.Env = append(os.Environ(),
27-
fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
25+
out, err := utils.RunPowershellCmd(cmdLine, fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
2826
fmt.Sprintf("iscsi_tp_port=%d", portal.Port))
29-
30-
out, err := cmd.CombinedOutput()
3127
if err != nil {
3228
return fmt.Errorf("error adding target portal. cmd %s, output: %s, err: %v", cmdLine, string(out), err)
3329
}
@@ -42,12 +38,8 @@ func (APIImplementor) DiscoverTargetPortal(portal *TargetPortal) ([]string, erro
4238
`ConvertTo-Json -InputObject @(Get-IscsiTargetPortal -TargetPortalAddress ` +
4339
`${Env:iscsi_tp_address} -TargetPortalPortNumber ${Env:iscsi_tp_port} | ` +
4440
`Get-IscsiTarget | Select-Object -ExpandProperty NodeAddress)`)
45-
cmd := exec.Command("powershell.exe", "/c", cmdLine)
46-
cmd.Env = append(os.Environ(),
47-
fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
41+
out, err := utils.RunPowershellCmd(cmdLine, fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
4842
fmt.Sprintf("iscsi_tp_port=%d", portal.Port))
49-
50-
out, err := cmd.CombinedOutput()
5143
if err != nil {
5244
return nil, fmt.Errorf("error discovering target portal. cmd: %s, output: %s, err: %w", cmdLine, string(out), err)
5345
}
@@ -66,8 +58,7 @@ func (APIImplementor) ListTargetPortals() ([]TargetPortal, error) {
6658
`ConvertTo-Json -InputObject @(Get-IscsiTargetPortal | ` +
6759
`Select-Object TargetPortalAddress, TargetPortalPortNumber)`)
6860

69-
cmd := exec.Command("powershell.exe", "/c", cmdLine)
70-
out, err := cmd.CombinedOutput()
61+
out, err := utils.RunPowershellCmd(cmdLine)
7162
if err != nil {
7263
return nil, fmt.Errorf("error listing target portals. cmd %s, output: %s, err: %w", cmdLine, string(out), err)
7364
}
@@ -87,12 +78,8 @@ func (APIImplementor) RemoveTargetPortal(portal *TargetPortal) error {
8778
`-TargetPortalPortNumber ${Env:iscsi_tp_port} | Remove-IscsiTargetPortal ` +
8879
`-Confirm:$false`)
8980

90-
cmd := exec.Command("powershell.exe", "/c", cmdLine)
91-
cmd.Env = append(os.Environ(),
92-
fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
81+
out, err := utils.RunPowershellCmd(cmdLine, fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
9382
fmt.Sprintf("iscsi_tp_port=%d", portal.Port))
94-
95-
out, err := cmd.CombinedOutput()
9683
if err != nil {
9784
return fmt.Errorf("error removing target portal. cmd %s, output: %s, err: %w", cmdLine, string(out), err)
9885
}
@@ -111,24 +98,19 @@ func (APIImplementor) ConnectTarget(portal *TargetPortal, iqn string,
11198
` -AuthenticationType ${Env:iscsi_auth_type}`)
11299

113100
if chapUser != "" {
114-
cmdLine += fmt.Sprintf(` -ChapUsername ${Env:iscsi_chap_user}`)
101+
cmdLine += ` -ChapUsername ${Env:iscsi_chap_user}`
115102
}
116103

117104
if chapSecret != "" {
118-
cmdLine += fmt.Sprintf(` -ChapSecret ${Env:iscsi_chap_secret}`)
105+
cmdLine += ` -ChapSecret ${Env:iscsi_chap_secret}`
119106
}
120107

121-
cmd := exec.Command("powershell.exe", "/c", cmdLine)
122-
cmd.Env = append(os.Environ(),
123-
fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
108+
out, err := utils.RunPowershellCmd(cmdLine, fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
124109
fmt.Sprintf("iscsi_tp_port=%d", portal.Port),
125110
fmt.Sprintf("iscsi_target_iqn=%s", iqn),
126111
fmt.Sprintf("iscsi_auth_type=%s", authType),
127112
fmt.Sprintf("iscsi_chap_user=%s", chapUser),
128-
fmt.Sprintf("iscsi_chap_secret=%s", chapSecret),
129-
)
130-
131-
out, err := cmd.CombinedOutput()
113+
fmt.Sprintf("iscsi_chap_secret=%s", chapSecret))
132114
if err != nil {
133115
return fmt.Errorf("error connecting to target portal. cmd %s, output: %s, err: %w", cmdLine, string(out), err)
134116
}
@@ -144,13 +126,9 @@ func (APIImplementor) DisconnectTarget(portal *TargetPortal, iqn string) error {
144126
` | Get-IscsiTarget | Where-Object { $_.NodeAddress -eq ${Env:iscsi_target_iqn} }) ` +
145127
`-Confirm:$false`)
146128

147-
cmd := exec.Command("powershell.exe", "/c", cmdLine)
148-
cmd.Env = append(os.Environ(),
149-
fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
129+
out, err := utils.RunPowershellCmd(cmdLine, fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
150130
fmt.Sprintf("iscsi_tp_port=%d", portal.Port),
151131
fmt.Sprintf("iscsi_target_iqn=%s", iqn))
152-
153-
out, err := cmd.CombinedOutput()
154132
if err != nil {
155133
return fmt.Errorf("error disconnecting from target portal. cmd %s, output: %s, err: %w", cmdLine, string(out), err)
156134
}
@@ -169,13 +147,9 @@ func (APIImplementor) GetTargetDisks(portal *TargetPortal, iqn string) ([]string
169147
`$ids = $c | Get-Disk | Select -ExpandProperty Number | Out-String -Stream; ` +
170148
`ConvertTo-Json -InputObject @($ids)`)
171149

172-
cmd := exec.Command("powershell.exe", "/c", cmdLine)
173-
cmd.Env = append(os.Environ(),
174-
fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
150+
out, err := utils.RunPowershellCmd(cmdLine, fmt.Sprintf("iscsi_tp_address=%s", portal.Address),
175151
fmt.Sprintf("iscsi_tp_port=%d", portal.Port),
176152
fmt.Sprintf("iscsi_target_iqn=%s", iqn))
177-
178-
out, err := cmd.CombinedOutput()
179153
if err != nil {
180154
return nil, fmt.Errorf("error getting target disks. cmd %s, output: %s, err: %w", cmdLine, string(out), err)
181155
}
@@ -190,13 +164,8 @@ func (APIImplementor) GetTargetDisks(portal *TargetPortal, iqn string) ([]string
190164
}
191165

192166
func (APIImplementor) SetMutualChapSecret(mutualChapSecret string) error {
193-
cmdLine := fmt.Sprintf(
194-
`Set-IscsiChapSecret -ChapSecret ${Env:iscsi_mutual_chap_secret}`)
195-
cmd := exec.Command("powershell.exe", "/c", cmdLine)
196-
cmd.Env = append(os.Environ(),
197-
fmt.Sprintf("iscsi_mutual_chap_secret=%s", mutualChapSecret))
198-
199-
out, err := cmd.CombinedOutput()
167+
cmdLine := `Set-IscsiChapSecret -ChapSecret ${Env:iscsi_mutual_chap_secret}`
168+
out, err := utils.RunPowershellCmd(cmdLine, fmt.Sprintf("iscsi_mutual_chap_secret=%s", mutualChapSecret))
200169
if err != nil {
201170
return fmt.Errorf("error setting mutual chap secret. cmd %s,"+
202171
" output: %s, err: %v", cmdLine, string(out), err)

pkg/os/smb/api.go

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package smb
22

33
import (
44
"fmt"
5-
"os"
6-
"os/exec"
75
"strings"
6+
7+
"github.com/kubernetes-csi/csi-proxy/pkg/utils"
88
)
99

1010
type API interface {
@@ -23,12 +23,9 @@ func New() SmbAPI {
2323
}
2424

2525
func (SmbAPI) IsSmbMapped(remotePath string) (bool, error) {
26-
cmdLine := fmt.Sprintf(`$(Get-SmbGlobalMapping -RemotePath $Env:smbremotepath -ErrorAction Stop).Status `)
27-
cmd := exec.Command("powershell", "/c", cmdLine)
28-
cmd.Env = append(os.Environ(),
29-
fmt.Sprintf("smbremotepath=%s", remotePath))
30-
31-
out, err := cmd.CombinedOutput()
26+
cmdLine := `$(Get-SmbGlobalMapping -RemotePath $Env:smbremotepath -ErrorAction Stop).Status `
27+
cmdEnv := fmt.Sprintf("smbremotepath=%s", remotePath)
28+
out, err := utils.RunPowershellCmd(cmdLine, cmdEnv)
3229
if err != nil {
3330
return false, fmt.Errorf("error checking smb mapping. cmd %s, output: %s, err: %v", remotePath, string(out), err)
3431
}
@@ -54,13 +51,8 @@ func (SmbAPI) NewSmbLink(remotePath, localPath string) error {
5451
remotePath = remotePath + "\\"
5552
}
5653

57-
cmdLine := fmt.Sprintf(`New-Item -ItemType SymbolicLink $Env:smblocalPath -Target $Env:smbremotepath`)
58-
cmd := exec.Command("powershell", "/c", cmdLine)
59-
cmd.Env = append(os.Environ(),
60-
fmt.Sprintf("smbremotepath=%s", remotePath),
61-
fmt.Sprintf("smblocalpath=%s", localPath),
62-
)
63-
output, err := cmd.CombinedOutput()
54+
cmdLine := `New-Item -ItemType SymbolicLink $Env:smblocalPath -Target $Env:smbremotepath`
55+
output, err := utils.RunPowershellCmd(cmdLine, fmt.Sprintf("smbremotepath=%s", remotePath), fmt.Sprintf("smblocalpath=%s", localPath))
6456
if err != nil {
6557
return fmt.Errorf("error linking %s to %s. output: %s, err: %v", remotePath, localPath, string(output), err)
6658
}
@@ -75,21 +67,17 @@ func (SmbAPI) NewSmbGlobalMapping(remotePath, username, password string) error {
7567
`;$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Env:smbuser, $PWord` +
7668
`;New-SmbGlobalMapping -RemotePath $Env:smbremotepath -Credential $Credential -RequirePrivacy $true`)
7769

78-
cmd := exec.Command("powershell", "/c", cmdLine)
79-
cmd.Env = append(os.Environ(),
80-
fmt.Sprintf("smbuser=%s", username),
70+
if output, err := utils.RunPowershellCmd(cmdLine, fmt.Sprintf("smbuser=%s", username),
8171
fmt.Sprintf("smbpassword=%s", password),
82-
fmt.Sprintf("smbremotepath=%s", remotePath))
83-
if output, err := cmd.CombinedOutput(); err != nil {
72+
fmt.Sprintf("smbremotepath=%s", remotePath)); err != nil {
8473
return fmt.Errorf("NewSmbGlobalMapping failed. output: %q, err: %v", string(output), err)
8574
}
8675
return nil
8776
}
8877

8978
func (SmbAPI) RemoveSmbGlobalMapping(remotePath string) error {
90-
cmd := exec.Command("powershell", "/c", `Remove-SmbGlobalMapping -RemotePath $Env:smbremotepath -Force`)
91-
cmd.Env = append(os.Environ(), fmt.Sprintf("smbremotepath=%s", remotePath))
92-
if output, err := cmd.CombinedOutput(); err != nil {
79+
cmd := `Remove-SmbGlobalMapping -RemotePath $Env:smbremotepath -Force`
80+
if output, err := utils.RunPowershellCmd(cmd, fmt.Sprintf("smbremotepath=%s", remotePath)); err != nil {
9381
return fmt.Errorf("UnmountSmbShare failed. output: %q, err: %v", string(output), err)
9482
}
9583
return nil

0 commit comments

Comments
 (0)