From 0db6cc85edfccb16ce5308eea767530e1a3f6906 Mon Sep 17 00:00:00 2001 From: Vivek Goyal Date: Wed, 3 Dec 2014 13:06:43 -0500 Subject: [PATCH] devmapper: Remove transaction Id update from saveMetaData() Right now saveMetaData() is kind of little overloaded function. It is supposed to save file metadata to disk. But in addition if user has bumped up NewTransactionId before calling saveMetaData(), then it will also update the transaction ID in pool. Keep saveMetaData() simple and let it just save the file. Any update of pool transaction ID is done inline in the code which needs it. Also create an helper function updatePoolTransactionId() to update pool transaction Id. Signed-off-by: Vivek Goyal --- daemon/graphdriver/devmapper/deviceset.go | 26 +++++++++++++++++------ 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/daemon/graphdriver/devmapper/deviceset.go b/daemon/graphdriver/devmapper/deviceset.go index 7ffabc3e2..d6891f809 100644 --- a/daemon/graphdriver/devmapper/deviceset.go +++ b/daemon/graphdriver/devmapper/deviceset.go @@ -204,6 +204,16 @@ func (devices *DeviceSet) allocateTransactionId() uint64 { return devices.NewTransactionId } +func (devices *DeviceSet) updatePoolTransactionId() error { + if devices.NewTransactionId != devices.TransactionId { + if err := devicemapper.SetTransactionId(devices.getPoolDevName(), devices.TransactionId, devices.NewTransactionId); err != nil { + return fmt.Errorf("Error setting devmapper transaction ID: %s", err) + } + devices.TransactionId = devices.NewTransactionId + } + return nil +} + func (devices *DeviceSet) removeMetadata(info *DevInfo) error { if err := os.RemoveAll(devices.metadataFile(info)); err != nil { return fmt.Errorf("Error removing metadata file %s: %s", devices.metadataFile(info), err) @@ -246,13 +256,6 @@ func (devices *DeviceSet) saveMetadata(info *DevInfo) error { if err := devices.writeMetaFile(jsonData, devices.metadataFile(info)); err != nil { return err } - - if devices.NewTransactionId != devices.TransactionId { - if err = devicemapper.SetTransactionId(devices.getPoolDevName(), devices.TransactionId, devices.NewTransactionId); err != nil { - return fmt.Errorf("Error setting devmapper transition ID: %s", err) - } - devices.TransactionId = devices.NewTransactionId - } return nil } @@ -294,6 +297,15 @@ func (devices *DeviceSet) registerDevice(id int, hash string, size uint64) (*Dev return nil, err } + if err := devices.updatePoolTransactionId(); err != nil { + // Remove unused device + devices.devicesLock.Lock() + delete(devices.Devices, hash) + devices.devicesLock.Unlock() + devices.removeMetadata(info) + return nil, err + } + return info, nil }