Skip to content

Commit be94b87

Browse files
fix realloc transaction (#265)
1 parent 2817b76 commit be94b87

File tree

1 file changed

+59
-35
lines changed

1 file changed

+59
-35
lines changed

cluster/calcium/realloc.go

+59-35
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55

66
"github.com/pkg/errors"
7+
"github.com/projecteru2/core/engine"
78
enginetypes "github.com/projecteru2/core/engine/types"
89
"github.com/projecteru2/core/resources"
910
resourcetypes "github.com/projecteru2/core/resources/types"
@@ -46,38 +47,60 @@ func (c *Calcium) doReallocOnNode(ctx context.Context, nodename string, containe
4647
return errors.WithStack(types.ErrInsufficientRes)
4748
}
4849

50+
originalContainer := *container
51+
resourceMeta := &types.ResourceMeta{}
4952
return utils.Txn(
5053
ctx,
5154

5255
// if update workload resources
5356
func(ctx context.Context) (err error) {
54-
return c.doReallocContainersOnInstance(ctx, node, plans, container)
57+
resourceMeta := &types.ResourceMeta{}
58+
for _, plan := range plans {
59+
if resourceMeta, err = plan.Dispense(resourcetypes.DispenseOptions{
60+
Node: node,
61+
ExistingInstance: container,
62+
}, resourceMeta); err != nil {
63+
return
64+
}
65+
}
66+
return errors.WithStack(c.doReallocContainersOnInstance(ctx, node.Engine, resourceMeta, container))
5567
},
5668
// then commit changes
5769
func(ctx context.Context) error {
5870
for _, plan := range plans {
5971
plan.ApplyChangesOnNode(node, 1)
6072
}
61-
return c.store.UpdateNodes(ctx, node)
73+
return errors.WithStack(c.store.UpdateNodes(ctx, node))
6274
},
6375
// no need rollback
64-
nil,
76+
func(ctx context.Context, failureByCond bool) (err error) {
77+
if failureByCond {
78+
return
79+
}
80+
r := &types.ResourceMeta{
81+
CPUQuotaRequest: originalContainer.CPUQuotaRequest,
82+
CPUQuotaLimit: originalContainer.CPUQuotaLimit,
83+
CPU: originalContainer.CPU,
84+
NUMANode: originalContainer.NUMANode,
85+
MemoryRequest: originalContainer.MemoryRequest,
86+
MemoryLimit: originalContainer.MemoryLimit,
87+
VolumeRequest: originalContainer.VolumeRequest,
88+
VolumeLimit: originalContainer.VolumeLimit,
89+
VolumePlanRequest: originalContainer.VolumePlanRequest,
90+
VolumePlanLimit: originalContainer.VolumePlanLimit,
91+
VolumeChanged: resourceMeta.VolumeChanged,
92+
StorageRequest: originalContainer.StorageRequest,
93+
StorageLimit: originalContainer.StorageLimit,
94+
}
95+
return errors.WithStack(c.doReallocContainersOnInstance(ctx, node.Engine, r, container))
96+
},
6597

6698
c.config.GlobalTimeout,
6799
)
68100
})
69101
}
70102

71-
func (c *Calcium) doReallocContainersOnInstance(ctx context.Context, node *types.Node, plans []resourcetypes.ResourcePlans, container *types.Container) (err error) {
72-
r := &types.ResourceMeta{}
73-
for _, plan := range plans {
74-
if r, err = plan.Dispense(resourcetypes.DispenseOptions{
75-
Node: node,
76-
ExistingInstance: container,
77-
}, r); err != nil {
78-
return
79-
}
80-
}
103+
func (c *Calcium) doReallocContainersOnInstance(ctx context.Context, engine engine.API, resourceMeta *types.ResourceMeta, container *types.Container) (err error) {
81104

82105
originalContainer := *container
83106
return utils.Txn(
@@ -86,31 +109,32 @@ func (c *Calcium) doReallocContainersOnInstance(ctx context.Context, node *types
86109
// if: update container resources
87110
func(ctx context.Context) error {
88111
r := &enginetypes.VirtualizationResource{
89-
CPU: r.CPU,
90-
Quota: r.CPUQuotaLimit,
91-
NUMANode: r.NUMANode,
92-
Memory: r.MemoryLimit,
93-
Volumes: r.VolumeLimit.ToStringSlice(false, false),
94-
VolumePlan: r.VolumePlanLimit.ToLiteral(),
95-
VolumeChanged: r.VolumeChanged,
96-
Storage: r.StorageLimit,
112+
CPU: resourceMeta.CPU,
113+
Quota: resourceMeta.CPUQuotaLimit,
114+
NUMANode: resourceMeta.NUMANode,
115+
Memory: resourceMeta.MemoryLimit,
116+
Volumes: resourceMeta.VolumeLimit.ToStringSlice(false, false),
117+
VolumePlan: resourceMeta.VolumePlanLimit.ToLiteral(),
118+
VolumeChanged: resourceMeta.VolumeChanged,
119+
Storage: resourceMeta.StorageLimit,
97120
}
98-
return errors.WithStack(node.Engine.VirtualizationUpdateResource(ctx, container.ID, r))
121+
return errors.WithStack(engine.VirtualizationUpdateResource(ctx, container.ID, r))
99122
},
100123

101124
// then: update container meta
102125
func(ctx context.Context) error {
103-
container.CPUQuotaRequest = r.CPUQuotaRequest
104-
container.CPUQuotaLimit = r.CPUQuotaLimit
105-
container.CPU = r.CPU
106-
container.MemoryRequest = r.MemoryRequest
107-
container.MemoryLimit = r.MemoryLimit
108-
container.VolumeRequest = r.VolumeRequest
109-
container.VolumePlanRequest = r.VolumePlanRequest
110-
container.VolumeLimit = r.VolumeLimit
111-
container.VolumePlanLimit = r.VolumePlanLimit
112-
container.StorageRequest = r.StorageRequest
113-
container.StorageLimit = r.StorageLimit
126+
container.CPUQuotaRequest = resourceMeta.CPUQuotaRequest
127+
container.CPUQuotaLimit = resourceMeta.CPUQuotaLimit
128+
container.CPU = resourceMeta.CPU
129+
container.NUMANode = resourceMeta.NUMANode
130+
container.MemoryRequest = resourceMeta.MemoryRequest
131+
container.MemoryLimit = resourceMeta.MemoryLimit
132+
container.VolumeRequest = resourceMeta.VolumeRequest
133+
container.VolumePlanRequest = resourceMeta.VolumePlanRequest
134+
container.VolumeLimit = resourceMeta.VolumeLimit
135+
container.VolumePlanLimit = resourceMeta.VolumePlanLimit
136+
container.StorageRequest = resourceMeta.StorageRequest
137+
container.StorageLimit = resourceMeta.StorageLimit
114138
return errors.WithStack(c.store.UpdateContainer(ctx, container))
115139
},
116140

@@ -126,10 +150,10 @@ func (c *Calcium) doReallocContainersOnInstance(ctx context.Context, node *types
126150
Memory: originalContainer.MemoryLimit,
127151
Volumes: originalContainer.VolumeLimit.ToStringSlice(false, false),
128152
VolumePlan: originalContainer.VolumePlanLimit.ToLiteral(),
129-
VolumeChanged: r.VolumeChanged,
153+
VolumeChanged: resourceMeta.VolumeChanged,
130154
Storage: originalContainer.StorageLimit,
131155
}
132-
return errors.WithStack(node.Engine.VirtualizationUpdateResource(ctx, container.ID, r))
156+
return errors.WithStack(engine.VirtualizationUpdateResource(ctx, container.ID, r))
133157
},
134158

135159
c.config.GlobalTimeout,

0 commit comments

Comments
 (0)