What version of Go are you using (go version)?
$ go version
go version go1.16.9 linux/amd64
Does this issue reproduce with the latest release?
Didn't checked
What operating system and processor architecture are you using (go env)?
go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/dba/.cache/go-build"
GOENV="/home/dba/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/dba/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/dba/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.16.9"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/mnt/projects/test/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2403385863=/tmp/go-build -gno-record-gcc-switches"
What did you do?
I'm tryint to figure out why IO count not working on virtual machine like VirtualBox or VMWare. On Dedicated Windows server it works as expected.
Code example
// +build windows
package main
import (
"fmt"
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
type diskPerformance struct {
BytesRead int64
BytesWritten int64
ReadTime int64
WriteTime int64
IdleTime int64
ReadCount uint32
WriteCount uint32
QueueDepth uint32
SplitCount uint32
QueryTime int64
StorageDeviceNumber uint32
StorageManagerName [8]uint16
alignmentPadding uint32 // necessary for 32bit support, see elastic/beats#16553
}
func main() {
maps()
}
func maps() {
var diskPerformance diskPerformance
lpBuffer := make([]uint16, 254)
lpBufferLen, err := windows.GetLogicalDriveStrings(uint32(len(lpBuffer)), &lpBuffer[0])
if err != nil {
fmt.Println("1", err)
return
}
for _, v := range lpBuffer[:lpBufferLen] {
if 'A' <= v && v <= 'Z' {
path := string(rune(v)) + ":"
typepath, _ := windows.UTF16PtrFromString(path)
typeret := windows.GetDriveType(typepath)
if typeret == 0 {
fmt.Println("2", windows.GetLastError())
return
}
if typeret != windows.DRIVE_FIXED {
continue
}
szDevice := fmt.Sprintf(\\.\%s, path)
const IOCTL_DISK_PERFORMANCE = 0x70020
h, err := windows.CreateFile(syscall.StringToUTF16Ptr(szDevice), 0, windows.FILE_SHARE_READ|windows.FILE_SHARE_WRITE, nil, windows.OPEN_EXISTING, 0, 0)
if err != nil {
fmt.Println("3", err)
if err == windows.ERROR_FILE_NOT_FOUND {
continue
}
return
}
defer windows.CloseHandle(h)
var diskPerformanceSize uint32
err = windows.DeviceIoControl(h, IOCTL_DISK_PERFORMANCE, nil, 0, (*byte)(unsafe.Pointer(&diskPerformance)), uint32(unsafe.Sizeof(diskPerformance)), &diskPerformanceSize, nil)
if err != nil {
fmt.Println("4", err)
return
}
fmt.Println(diskPerformanceSize)
}
}
return
}
What did you expect to see?
Execution without errors
What did you see instead?
Error in windows.DeviceIoControl
What version of Go are you using (
go version)?Does this issue reproduce with the latest release?
Didn't checked
What operating system and processor architecture are you using (
go env)?go envOutputWhat did you do?
I'm tryint to figure out why IO count not working on virtual machine like VirtualBox or VMWare. On Dedicated Windows server it works as expected.
Code example
What did you expect to see?
Execution without errors
What did you see instead?
Error in windows.DeviceIoControl