chore: enable more linter (#1557)

This commit is contained in:
Jan-Otto Kröpke
2024-08-10 22:05:33 +02:00
committed by GitHub
parent 27a3553dac
commit 9b02e4a0ea
87 changed files with 337 additions and 494 deletions

View File

@@ -113,6 +113,7 @@ Data for some of the objects is also available through WMI:
import (
"bytes"
"encoding/binary"
"errors"
"fmt"
"io"
"strings"
@@ -120,7 +121,7 @@ import (
"unsafe"
)
// TODO: There's a LittleEndian field in the PERF header - we ought to check it
// TODO: There's a LittleEndian field in the PERF header - we ought to check it.
var bo = binary.LittleEndian
const averageCount64Type = 1073874176
@@ -204,9 +205,8 @@ func queryRawData(query string) ([]byte, error) {
buffer = make([]byte, bufLen)
name, err := syscall.UTF16PtrFromString(query)
if err != nil {
return nil, fmt.Errorf("failed to encode query string: %v", err)
return nil, fmt.Errorf("failed to encode query string: %w", err)
}
for {
@@ -220,14 +220,15 @@ func queryRawData(query string) ([]byte, error) {
(*byte)(unsafe.Pointer(&buffer[0])),
&bufLen)
if err == error(syscall.ERROR_MORE_DATA) {
if errors.Is(err, error(syscall.ERROR_MORE_DATA)) {
newBuffer := make([]byte, len(buffer)+16384)
copy(newBuffer, buffer)
buffer = newBuffer
continue
} else if err != nil {
if errno, ok := err.(syscall.Errno); ok {
return nil, fmt.Errorf("ReqQueryValueEx failed: %v errno %d", err, uint(errno))
var errNo syscall.Errno
if errors.As(err, &errNo) {
return nil, fmt.Errorf("ReqQueryValueEx failed: %w errno %d", err, uint(errNo))
}
return nil, err
@@ -266,7 +267,6 @@ more than you asked for.
*/
func QueryPerformanceData(query string) ([]*PerfObject, error) {
buffer, err := queryRawData(query)
if err != nil {
return nil, err
}
@@ -277,7 +277,6 @@ func QueryPerformanceData(query string) ([]*PerfObject, error) {
header := new(perfDataBlock)
err = header.BinaryReadFrom(r)
if err != nil {
return nil, fmt.Errorf("failed to read performance data block for %q with: %w", query, err)
}
@@ -294,7 +293,7 @@ func QueryPerformanceData(query string) ([]*PerfObject, error) {
objOffset := int64(header.HeaderLength)
for i := 0; i < numObjects; i++ {
for i := range numObjects {
_, err := r.Seek(objOffset, io.SeekStart)
if err != nil {
return nil, err
@@ -328,7 +327,7 @@ func QueryPerformanceData(query string) ([]*PerfObject, error) {
rawData: obj,
}
for i := 0; i < numCounterDefs; i++ {
for i := range numCounterDefs {
def := new(perfCounterDefinition)
err := def.BinaryReadFrom(r)
if err != nil {
@@ -349,10 +348,10 @@ func QueryPerformanceData(query string) ([]*PerfObject, error) {
}
}
if obj.NumInstances <= 0 {
if obj.NumInstances <= 0 { //nolint:nestif
blockOffset := objOffset + int64(obj.DefinitionLength)
_, err := r.Seek(blockOffset, io.SeekStart)
if err != nil {
if _, err := r.Seek(blockOffset, io.SeekStart); err != nil {
return nil, err
}
@@ -370,20 +369,20 @@ func QueryPerformanceData(query string) ([]*PerfObject, error) {
} else {
instOffset := objOffset + int64(obj.DefinitionLength)
for i := 0; i < numInstances; i++ {
_, err := r.Seek(instOffset, io.SeekStart)
if err != nil {
for i := range numInstances {
if _, err := r.Seek(instOffset, io.SeekStart); err != nil {
return nil, err
}
inst := new(perfInstanceDefinition)
err = inst.BinaryReadFrom(r)
if err != nil {
if err = inst.BinaryReadFrom(r); err != nil {
return nil, err
}
name, _ := readUTF16StringAtPos(r, instOffset+int64(inst.NameOffset), inst.NameLength)
pos := instOffset + int64(inst.ByteLength)
offset, counters, err := parseCounterBlock(buffer, r, pos, counterDefs)
if err != nil {
return nil, err
@@ -438,6 +437,7 @@ func parseCounterBlock(b []byte, r io.ReadSeeker, pos int64, defs []*PerfCounter
return int64(block.ByteLength), counters, nil
}
//nolint:nonamedreturns
func convertCounterValue(counterDef *perfCounterDefinition, buffer []byte, valueOffset int64) (value int64) {
/*
We can safely ignore the type since we're not interested in anything except the raw value.

View File

@@ -1,39 +1,9 @@
package perflib
import (
"fmt"
"testing"
)
func ExampleQueryPerformanceData() {
objects, err := QueryPerformanceData("2")
if err != nil {
panic(err)
}
for _, object := range objects {
fmt.Printf("%d %s [%d counters, %d instances]\n",
object.NameIndex, object.Name, len(object.CounterDefs), len(object.Instances))
for _, instance := range object.Instances {
if !((instance.Name == "_Total") || (instance.Name == "")) {
continue
}
if instance.Name == "" {
fmt.Println("No instance.", instance.Name)
} else {
fmt.Println("Instance:", instance.Name)
}
for _, counter := range instance.Counters {
fmt.Printf(" -> %s %d\n", counter.Def.Name, counter.Def.NameIndex)
}
}
}
}
func BenchmarkQueryPerformanceData(b *testing.B) {
for n := 0; n < b.N; n++ {
_, _ = QueryPerformanceData("Global")

View File

@@ -10,7 +10,7 @@ import (
"github.com/go-kit/log/level"
)
// Conversion factors
// Conversion factors.
const (
TicksToSecondScaleFactor = 1 / 1e7
WindowsEpoch = 116444736000000000
@@ -48,7 +48,7 @@ func UnmarshalObject(obj *PerfObject, vs interface{}, logger log.Logger) error {
}
}
for i := 0; i < target.NumField(); i++ {
for i := range target.NumField() {
f := rt.Field(i)
tag := f.Tag.Get("perflib")
if tag == "" {

View File

@@ -6,17 +6,15 @@ import (
"syscall"
)
// readUTF16StringAtPos Read an unterminated UTF16 string at a given position, specifying its length
// readUTF16StringAtPos Read an unterminated UTF16 string at a given position, specifying its length.
func readUTF16StringAtPos(r io.ReadSeeker, absPos int64, length uint32) (string, error) {
value := make([]uint16, length/2)
_, err := r.Seek(absPos, io.SeekStart)
if err != nil {
return "", err
}
err = binary.Read(r, bo, value)
if err != nil {
return "", err
}
@@ -24,7 +22,7 @@ func readUTF16StringAtPos(r io.ReadSeeker, absPos int64, length uint32) (string,
return syscall.UTF16ToString(value), nil
}
// readUTF16String Reads a null-terminated UTF16 string at the current offset
// readUTF16String Reads a null-terminated UTF16 string at the current offset.
func readUTF16String(r io.Reader) (string, error) {
var err error

View File

@@ -14,6 +14,8 @@ type simple struct {
}
func TestUnmarshalPerflib(t *testing.T) {
t.Parallel()
cases := []struct {
name string
obj *PerfObject
@@ -110,6 +112,8 @@ func TestUnmarshalPerflib(t *testing.T) {
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
t.Parallel()
output := make([]simple, 0)
err := UnmarshalObject(c.obj, &output, log.NewNopLogger())
if err != nil && !c.expectError {