Skip to content

Commit 7f58f0c

Browse files
committed
aisloader: mem-pool work orders (micro-optimize)
Signed-off-by: Alex Aizman <alex.aizman@gmail.com>
1 parent 73636fb commit 7f58f0c

File tree

2 files changed

+53
-33
lines changed

2 files changed

+53
-33
lines changed

bench/tools/aisloader/run.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,7 @@ MainLoop:
457457
break MainLoop
458458
case wo := <-resCh:
459459
completeWorkOrder(wo, false)
460+
freeWO(wo)
460461
if runParams.statsShowInterval == 0 && runParams.putSizeUpperBound != 0 {
461462
accumulatedStats.aggregate(&intervalStats)
462463
intervalStats = newStats(time.Now())

bench/tools/aisloader/work.go

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ import (
2626
)
2727

2828
const (
29-
opPut = iota
29+
opFree = iota
30+
opPut
3031
opGet
3132
opUpdateExisting // {GET followed by PUT(same name, same size)} combo
3233
opConfig
@@ -50,6 +51,31 @@ type (
5051
}
5152
)
5253

54+
var (
55+
woPool sync.Pool
56+
wo0 workOrder
57+
)
58+
59+
func allocWO(op int) *workOrder {
60+
v := woPool.Get()
61+
if v == nil {
62+
return &workOrder{op: op}
63+
}
64+
wo := v.(*workOrder)
65+
debug.Assert(wo.op == opFree)
66+
wo.op = op
67+
return wo
68+
}
69+
70+
func freeWO(wo *workOrder) {
71+
// - work orders with SGLs are freed via wo2Free
72+
// - opFree when already freed
73+
if wo.sgl == nil && wo.op != opFree {
74+
*wo = wo0
75+
woPool.Put(wo)
76+
}
77+
}
78+
5379
func postNewWorkOrder() (err error) {
5480
if runParams.getConfig {
5581
workCh <- newGetConfigWorkOrder()
@@ -171,6 +197,8 @@ func completeWorkOrder(wo *workOrder, terminating bool) {
171197
}
172198
if w.sgl != nil && !w.sgl.IsNil() {
173199
w.sgl.Free()
200+
w.sgl = nil
201+
freeWO(w)
174202
copy(wo2Free[i:], wo2Free[i+1:])
175203
i--
176204
l--
@@ -347,6 +375,10 @@ func worker(wos <-chan *workOrder, results chan<- *workOrder, wg *sync.WaitGroup
347375
///////////////
348376

349377
func newPutWorkOrder() (*workOrder, error) {
378+
return newPutWO(opPut)
379+
}
380+
381+
func newPutWO(op int) (*workOrder, error) {
350382
objName, err := _genObjName()
351383
if err != nil {
352384
return nil, err
@@ -357,35 +389,20 @@ func newPutWorkOrder() (*workOrder, error) {
357389
size = runParams.minSize + d
358390
}
359391
putPending++
360-
return &workOrder{
361-
proxyURL: runParams.proxyURL,
362-
bck: runParams.bck,
363-
op: opPut,
364-
objName: objName,
365-
size: size,
366-
cksumType: runParams.cksumType,
367-
}, nil
392+
393+
wo := allocWO(op)
394+
{
395+
wo.proxyURL = runParams.proxyURL
396+
wo.bck = runParams.bck
397+
wo.objName = objName
398+
wo.size = size
399+
wo.cksumType = runParams.cksumType
400+
}
401+
return wo, nil
368402
}
369403

370404
func newMultipartWorkOrder() (*workOrder, error) {
371-
objName, err := _genObjName()
372-
if err != nil {
373-
return nil, err
374-
}
375-
size := runParams.minSize
376-
if runParams.maxSize != runParams.minSize {
377-
d := rnd.Int64N(runParams.maxSize + 1 - runParams.minSize)
378-
size = runParams.minSize + d
379-
}
380-
putPending++
381-
return &workOrder{
382-
proxyURL: runParams.proxyURL,
383-
bck: runParams.bck,
384-
op: opPutMultipart,
385-
objName: objName,
386-
size: size,
387-
cksumType: runParams.cksumType,
388-
}, nil
405+
return newPutWO(opPutMultipart)
389406
}
390407

391408
func _genObjName() (string, error) {
@@ -423,17 +440,19 @@ func _genObjName() (string, error) {
423440
}
424441

425442
func newGetWorkOrder(op int) (*workOrder, error) {
443+
debug.Assert(op == opGet || op == opUpdateExisting, op)
426444
if objnameGetter.Len() == 0 {
427445
return nil, errors.New("no objects in bucket")
428446
}
429447

430448
getPending++
431-
return &workOrder{
432-
proxyURL: runParams.proxyURL,
433-
bck: runParams.bck,
434-
op: op,
435-
objName: objnameGetter.Pick(),
436-
}, nil
449+
wo := allocWO(op)
450+
{
451+
wo.proxyURL = runParams.proxyURL
452+
wo.bck = runParams.bck
453+
wo.objName = objnameGetter.Pick()
454+
}
455+
return wo, nil
437456
}
438457

439458
func newGetConfigWorkOrder() *workOrder {

0 commit comments

Comments
 (0)