Skip to content

Commit 0b837f7

Browse files
swordqiuQiu Jian
andauthored
fix: bucket perform mon random string generation consume high cpu load (#22637)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
1 parent d029097 commit 0b837f7

File tree

1 file changed

+29
-3
lines changed

1 file changed

+29
-3
lines changed

pkg/mcclient/modules/compute/mod_buckets.go

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,42 @@ func (w *nullWriter) WriteAt(p []byte, off int64) (n int, err error) {
117117
return len(p), nil
118118
}
119119

120-
func getRandReader() io.Reader {
121-
return rand.New(rand.NewSource(time.Now().UnixNano()))
120+
var (
121+
randBuffer [1024]byte
122+
)
123+
124+
func init() {
125+
for i := range randBuffer {
126+
randBuffer[i] = byte(rand.Intn(256))
127+
}
128+
}
129+
130+
type randReader struct {
131+
}
132+
133+
func newRandReader() io.Reader {
134+
return &randReader{}
135+
}
136+
137+
func (r *randReader) Read(p []byte) (n int, err error) {
138+
offset := 0
139+
for offset < len(p) {
140+
readLen := len(randBuffer)
141+
if readLen > len(p)-offset {
142+
readLen = len(p) - offset
143+
}
144+
copy(p[offset:], randBuffer[:readLen])
145+
offset += readLen
146+
}
147+
return offset, nil
122148
}
123149

124150
func ProbeBucketStats(ctx context.Context, bucket cloudprovider.ICloudBucket, testKey string, sizeBytes int64) (*api.BucketProbeResult, error) {
125151
result := &api.BucketProbeResult{}
126152
start := time.Now()
127153

128154
// force upload object in one shot
129-
err := cloudprovider.UploadObject(ctx, bucket, testKey, sizeBytes*2, getRandReader(), sizeBytes, cloudprovider.ACLPrivate, "", nil, false)
155+
err := cloudprovider.UploadObject(ctx, bucket, testKey, sizeBytes*2, newRandReader(), sizeBytes, cloudprovider.ACLPrivate, "", nil, false)
130156
if err != nil {
131157
return nil, errors.Wrap(err, "cloudprovider.UploadObject")
132158
}

0 commit comments

Comments
 (0)