Skip to content

Commit 4072ba8

Browse files
committed
feat: prevent duplicate active orders
fixes #531
1 parent 32b9281 commit 4072ba8

File tree

6 files changed

+33
-8
lines changed

6 files changed

+33
-8
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ require (
2424
github.com/lithammer/shortuuid v1.0.1-0.20190319200910-1be5ab5d90f6
2525
github.com/magiconair/properties v1.8.2-0.20191019074931-a586bb8b7dea // indirect
2626
github.com/mattn/go-runewidth v0.0.6 // indirect
27+
github.com/pkg/errors v0.9.1
2728
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
2829
github.com/rakyll/statik v0.1.7
2930
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 // indirect

x/deployment/handler/endblock.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ func OnEndBlock(ctx sdk.Context, keeper keeper.Keeper, mkeeper MarketKeeper) {
2525
continue
2626
}
2727

28-
// TODO: check for active order.
29-
3028
// create order.
31-
mkeeper.CreateOrder(ctx, group.ID(), group.GroupSpec)
29+
if _, err := mkeeper.CreateOrder(ctx, group.ID(), group.GroupSpec); err != nil {
30+
ctx.Logger().With("group", group.ID(), "error", err).Error("creating order")
31+
continue
32+
}
3233

3334
// set state to ordered
3435
keeper.OnOrderCreated(ctx, group)

x/deployment/handler/keepers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ import (
88

99
// MarketKeeper Interface includes market methods
1010
type MarketKeeper interface {
11-
CreateOrder(ctx sdk.Context, id types.GroupID, spec types.GroupSpec) mtypes.Order
11+
CreateOrder(ctx sdk.Context, id types.GroupID, spec types.GroupSpec) (mtypes.Order, error)
1212
OnGroupClosed(ctx sdk.Context, id types.GroupID)
1313
}

x/market/keeper/keeper.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
sdk "github.com/cosmos/cosmos-sdk/types"
66
dtypes "github.com/ovrclk/akash/x/deployment/types"
77
"github.com/ovrclk/akash/x/market/types"
8+
"github.com/pkg/errors"
89
)
910

1011
const (
@@ -29,15 +30,24 @@ func (k Keeper) Codec() *codec.Codec {
2930
}
3031

3132
// CreateOrder creates a new order with given group id and specifications. It returns created order
32-
func (k Keeper) CreateOrder(ctx sdk.Context, gid dtypes.GroupID, spec dtypes.GroupSpec) types.Order {
33+
func (k Keeper) CreateOrder(ctx sdk.Context, gid dtypes.GroupID, spec dtypes.GroupSpec) (types.Order, error) {
3334
store := ctx.KVStore(k.skey)
3435

3536
oseq := uint32(1)
36-
k.WithOrdersForGroup(ctx, gid, func(types.Order) bool {
37+
var err error
38+
39+
k.WithOrdersForGroup(ctx, gid, func(order types.Order) bool {
40+
if err = order.ValidateInactive(); err != nil {
41+
return true
42+
}
3743
oseq++
3844
return false
3945
})
4046

47+
if err != nil {
48+
return types.Order{}, errors.Wrap(err, "create order: active order exists")
49+
}
50+
4151
order := types.Order{
4252
OrderID: types.MakeOrderID(gid, oseq),
4353
Spec: spec,
@@ -54,7 +64,7 @@ func (k Keeper) CreateOrder(ctx sdk.Context, gid dtypes.GroupID, spec dtypes.Gro
5464
ctx.EventManager().EmitEvent(
5565
types.EventOrderCreated{ID: order.ID()}.ToSDKEvent(),
5666
)
57-
return order
67+
return order, nil
5868
}
5969

6070
// CreateBid creates a bid for a order with given orderID, price for bid and provider

x/market/keeper/keeper_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/ovrclk/akash/sdl"
1111
dtypes "github.com/ovrclk/akash/x/deployment/types"
1212
"github.com/ovrclk/akash/x/market/types"
13+
"github.com/stretchr/testify/require"
1314
"github.com/stretchr/testify/suite"
1415
)
1516

@@ -69,7 +70,8 @@ func (s *TestSuite) TestKeeper() {
6970

7071
if len(groups) > 0 {
7172
s.T().Log("verify create order")
72-
order := s.keeper.CreateOrder(s.ctx, groups[0].GroupID, groups[0].GroupSpec)
73+
order, err := s.keeper.CreateOrder(s.ctx, groups[0].GroupID, groups[0].GroupSpec)
74+
require.NoError(s.T(), err)
7375
_, ok := s.keeper.GetOrder(s.ctx, order.ID())
7476
s.Require().True(ok, "Order not created")
7577

x/market/types/types.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,17 @@ func (o Order) ValidateCanBid() error {
6464
}
6565
}
6666

67+
func (o Order) ValidateInactive() error {
68+
switch o.State {
69+
case OrderClosed:
70+
return nil
71+
case OrderMatched:
72+
return fmt.Errorf("order matched")
73+
default:
74+
return fmt.Errorf("order open")
75+
}
76+
}
77+
6778
// Price method returns price of specific order
6879
func (o Order) Price() sdk.Coin {
6980
return o.Spec.Price()

0 commit comments

Comments
 (0)