Add initial function batching API

Disabling locking/syncing in a batched operation not yet implemented

Signed-off-by: Matthew Heon <matthew.heon@gmail.com>

Closes: #222
Approved by: rhatdan
This commit is contained in:
Matthew Heon 2018-01-12 15:34:38 -05:00 committed by Atomic Bot
parent 9c5a42eb1f
commit 5599b64e72
1 changed files with 40 additions and 0 deletions

View File

@ -72,6 +72,11 @@ type Container struct {
state *containerRuntimeInfo
// Locked indicates that a container has been locked as part of a
// Batch() operation
// Functions called on a locked container will not lock or sync
locked bool
valid bool
lock storage.Locker
runtime *Runtime
@ -1266,3 +1271,38 @@ func (c *Container) copyHostFileToRundir(sourcePath string) (string, error) {
func (c *Container) StopTimeout() uint {
return c.config.StopTimeout
}
// Batch starts a batch operation on the given container
// All commands in the passed function will execute under the same lock and
// without syncronyzing state after each operation
// This will result in substantial performance benefits when running numerous
// commands on the same container
// Note that the container passed into the Batch function cannot be removed
// during batched operations. runtime.RemoveContainer can only be called outside
// of Batch
// Any error returned by the given batch function will be returned unmodified by
// Batch
func (c *Container) Batch(batchFunc func(*Container) error) error {
c.lock.Lock()
defer c.lock.Unlock()
if err := c.syncContainer(); err != nil {
return err
}
newCtr := new(Container)
newCtr.config = c.config
newCtr.state = c.state
newCtr.runtime = c.runtime
newCtr.valid = true
newCtr.locked = true
if err := batchFunc(newCtr); err != nil {
return err
}
newCtr.locked = false
return c.save()
}