Skip to content
This repository has been archived by the owner on Oct 13, 2023. It is now read-only.

Ensure that a device mapper task is referenced until task is complete #4

Merged
merged 1 commit into from
Jun 5, 2017

Conversation

mlaventure
Copy link
Contributor

DeviceMapper tasks in go use SetFinalizer to clean up C construct
counterparts in the C LVM library. While thats well and good, it relies
heavily on the exact interpretation of when the golang garbage collector
determines that an object is unreachable is subject to reclaimation.
While common sense would assert that for stack variables (which these DM
tasks always are), are unreachable when the stack frame in which they
are declared returns, thats not the case. According to this:

https://golang.org/pkg/runtime/#SetFinalizer

The garbage collector decides that, if a function calls into a
systemcall (which task.run() always will in LVM), and there are no
subsequent references to the task variable within that stack frame, then
it can be reclaimed. Those conditions are met in several devmapper.go
routines, and if the garbage collector runs in the middle of a
deviceMapper operation, then the task can be destroyed while the
operation is in progress, leading to crashes, failed operations and
other unpredictable behavior.

The fix is to use the KeepAlive interface:

https://golang.org/pkg/runtime/#KeepAlive

The KeepAlive method is effectively an empy reference that fools the
garbage collector into thinking that a variable is still reachable. By
adding a call to KeepAlive in the task.run() method, we can ensure that
the garbage collector won't reclaim a task object until its execution
within the deviceMapper C library is complete.

Signed-off-by: Neil Horman [email protected]
(cherry picked from commit d764d8b)

--

Cherry pick of moby/moby#33376

DeviceMapper tasks in go use SetFinalizer to clean up C construct
counterparts in the C LVM library.  While thats well and good, it relies
heavily on the exact interpretation of when the golang garbage collector
determines that an object is unreachable is subject to reclaimation.
While common sense would assert that for stack variables (which these DM
tasks always are), are unreachable when the stack frame in which they
are declared returns, thats not the case.  According to this:

https://golang.org/pkg/runtime/#SetFinalizer

The garbage collector decides that, if a function calls into a
systemcall (which task.run() always will in LVM), and there are no
subsequent references to the task variable within that stack frame, then
it can be reclaimed.  Those conditions are met in several devmapper.go
routines, and if the garbage collector runs in the middle of a
deviceMapper operation, then the task can be destroyed while the
operation is in progress, leading to crashes, failed operations and
other unpredictable behavior.

The fix is to use the KeepAlive interface:

https://golang.org/pkg/runtime/#KeepAlive

The KeepAlive method is effectively an empy reference that fools the
garbage collector into thinking that a variable is still reachable.  By
adding a call to KeepAlive in the task.run() method, we can ensure that
the garbage collector won't reclaim a task object until its execution
within the deviceMapper C library is complete.

Signed-off-by: Neil Horman <[email protected]>
(cherry picked from commit d764d8b)
@mavenugo mavenugo mentioned this pull request May 31, 2017
23 tasks
andrewhsu pushed a commit that referenced this pull request Jun 1, 2017
Add armhf dockerfiles for deb building

Signed-off-by: Eli Uriegas <[email protected]>
Upstream-commit: f0c8cea
Component: packaging
@andrewhsu
Copy link
Contributor

LGTM

integration tests and unit tests are green

@andrewhsu andrewhsu merged commit 3a237ea into docker-archive:17.06 Jun 5, 2017
@mlaventure mlaventure deleted the chp-moby-33376 branch June 5, 2017 15:05
@andrewhsu andrewhsu modified the milestone: 17.06.0 Jul 12, 2017
docker-jenkins pushed a commit that referenced this pull request Jul 6, 2018
…atypes

[18.06] Register OCI image media types
Upstream-commit: 85b4dbd3db3761dc3e21f3361cf840eefc1e9fb3
Component: engine
ShemTovYosef referenced this pull request in jingxiaolu/docker-ce Jan 11, 2020
silvin-lubecki pushed a commit to silvin-lubecki/docker-ce that referenced this pull request Jan 30, 2020
Add armhf dockerfiles for deb building

Signed-off-by: Eli Uriegas <[email protected]>
Upstream-commit: f0c8cea
Component: packaging
silvin-lubecki pushed a commit to silvin-lubecki/docker-ce that referenced this pull request Jan 30, 2020
Add armhf dockerfiles for deb building

Signed-off-by: Eli Uriegas <[email protected]>
silvin-lubecki pushed a commit to silvin-lubecki/docker-ce that referenced this pull request Jan 31, 2020
Add armhf dockerfiles for deb building

Signed-off-by: Eli Uriegas <[email protected]>
(cherry picked from commit f0c8cea)
Signed-off-by: Andrew Hsu <[email protected]>
silvin-lubecki pushed a commit to silvin-lubecki/docker-ce that referenced this pull request Feb 3, 2020
Ensure that a device mapper task is referenced until task is complete
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants