OSDN Git Service

fix mov database (#427)
authorPoseidon <shenao.78@163.com>
Mon, 28 Oct 2019 02:45:38 +0000 (10:45 +0800)
committerPaladz <yzhu101@uottawa.ca>
Mon, 28 Oct 2019 02:45:38 +0000 (10:45 +0800)
application/mov/database/mov_store.go
application/mov/database/mov_store_test.go

index 61cc683..eaf04af 100644 (file)
@@ -136,7 +136,7 @@ func (m *LevelDBMovStore) ProcessOrders(addOrders []*common.Order, delOrders []*
        }
 
        batch := m.db.NewBatch()
-       tradePairsCnt := make(map[common.TradePair]int)
+       tradePairsCnt := make(map[string]*common.TradePair)
        if err := m.addOrders(batch, addOrders, tradePairsCnt); err != nil {
                return err
        }
@@ -160,7 +160,7 @@ func (m *LevelDBMovStore) ProcessOrders(addOrders []*common.Order, delOrders []*
        return nil
 }
 
-func (m *LevelDBMovStore) addOrders(batch dbm.Batch, orders []*common.Order, tradePairsCnt map[common.TradePair]int) error {
+func (m *LevelDBMovStore) addOrders(batch dbm.Batch, orders []*common.Order, tradePairsCnt map[string]*common.TradePair) error {
        for _, order := range orders {
                data, err := json.Marshal(order.Utxo)
                if err != nil {
@@ -170,25 +170,31 @@ func (m *LevelDBMovStore) addOrders(batch dbm.Batch, orders []*common.Order, tra
                key := calcOrderKey(order.FromAssetID, order.ToAssetID, calcUTXOHash(order), order.Rate)
                batch.Set(key, data)
 
-               tradePair := common.TradePair{
+               tradePair := &common.TradePair{
                        FromAssetID: order.FromAssetID,
                        ToAssetID:   order.ToAssetID,
                }
-               tradePairsCnt[tradePair] += 1
+               if _, ok := tradePairsCnt[tradePair.Key()]; !ok {
+                       tradePairsCnt[tradePair.Key()] = tradePair
+               }
+               tradePairsCnt[tradePair.Key()].Count++
        }
        return nil
 }
 
-func (m *LevelDBMovStore) deleteOrders(batch dbm.Batch, orders []*common.Order, tradePairsCnt map[common.TradePair]int) {
+func (m *LevelDBMovStore) deleteOrders(batch dbm.Batch, orders []*common.Order, tradePairsCnt map[string]*common.TradePair) {
        for _, order := range orders {
                key := calcOrderKey(order.FromAssetID, order.ToAssetID, calcUTXOHash(order), order.Rate)
                batch.Delete(key)
 
-               tradePair := common.TradePair{
+               tradePair := &common.TradePair{
                        FromAssetID: order.FromAssetID,
                        ToAssetID:   order.ToAssetID,
                }
-               tradePairsCnt[tradePair] -= 1
+               if _, ok := tradePairsCnt[tradePair.Key()]; !ok {
+                       tradePairsCnt[tradePair.Key()] = tradePair
+               }
+               tradePairsCnt[tradePair.Key()].Count--
        }
 }
 
@@ -226,19 +232,19 @@ func (m *LevelDBMovStore) ListTradePairsWithStart(fromAssetIDAfter, toAssetIDAft
        return tradePairs, nil
 }
 
-func (m *LevelDBMovStore) updateTradePairs(batch dbm.Batch, tradePairs map[common.TradePair]int) error {
-       for k, v := range tradePairs {
-               key := calcTradePairKey(k.FromAssetID, k.ToAssetID)
+func (m *LevelDBMovStore) updateTradePairs(batch dbm.Batch, tradePairs map[string]*common.TradePair) error {
+       for _, v := range tradePairs {
+               key := calcTradePairKey(v.FromAssetID, v.ToAssetID)
                tradePairData := &tradePairData{}
                if value := m.db.Get(key); value != nil {
                        if err := json.Unmarshal(value, tradePairData); err != nil {
                                return err
                        }
-               } else if v < 0 {
+               } else if v.Count < 0 {
                        return errors.New("don't find trade pair")
                }
 
-               tradePairData.Count += v
+               tradePairData.Count += v.Count
                if tradePairData.Count > 0 {
                        value, err := json.Marshal(tradePairData)
                        if err != nil {
index b5875ce..b29c2df 100644 (file)
@@ -1541,12 +1541,12 @@ func TestMovStore(t *testing.T) {
                }
 
                batch := movStore.db.NewBatch()
-               tradePairsCnt := make(map[common.TradePair]int)
+               tradePairsCnt := make(map[string]*common.TradePair)
                movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
                if len(c.beforeOrders) > 0 {
-                       tradePairsCnt = make(map[common.TradePair]int)
+                       tradePairsCnt = make(map[string]*common.TradePair)
                        for _, tradePair := range c.beforeTradePairs {
-                               tradePairsCnt[*tradePair] = tradePair.Count
+                               tradePairsCnt[tradePair.Key()] = tradePair
                        }
                        movStore.updateTradePairs(batch, tradePairsCnt)
                        movStore.saveMovDatabaseState(batch, c.beforeDBStatus)
@@ -1975,7 +1975,7 @@ func TestListOrders(t *testing.T) {
                }
 
                batch := movStore.db.NewBatch()
-               tradePairsCnt := make(map[common.TradePair]int)
+               tradePairsCnt := make(map[string]*common.TradePair)
                movStore.addOrders(batch, c.storeOrders, tradePairsCnt)
                movStore.updateTradePairs(batch, tradePairsCnt)
                batch.Write()
@@ -2388,12 +2388,12 @@ func TestAddOrders(t *testing.T) {
                }
 
                batch := movStore.db.NewBatch()
-               tradePairsCnt := make(map[common.TradePair]int)
+               tradePairsCnt := make(map[string]*common.TradePair)
                movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
                movStore.updateTradePairs(batch, tradePairsCnt)
                batch.Write()
 
-               tradePairsCnt = make(map[common.TradePair]int)
+               tradePairsCnt = make(map[string]*common.TradePair)
                movStore.addOrders(batch, c.addOrders, tradePairsCnt)
                batch.Write()
 
@@ -2728,12 +2728,12 @@ func TestDelOrders(t *testing.T) {
                }
 
                batch := movStore.db.NewBatch()
-               tradePairsCnt := make(map[common.TradePair]int)
+               tradePairsCnt := make(map[string]*common.TradePair)
                movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
                movStore.updateTradePairs(batch, tradePairsCnt)
                batch.Write()
 
-               tradePairsCnt = make(map[common.TradePair]int)
+               tradePairsCnt = make(map[string]*common.TradePair)
                movStore.deleteOrders(batch, c.delOrders, tradePairsCnt)
                movStore.updateTradePairs(batch, tradePairsCnt)
                batch.Write()
@@ -2755,7 +2755,7 @@ func TestDelOrders(t *testing.T) {
 func TestListTradePairsWithStart(t *testing.T) {
        cases := []struct {
                desc            string
-               storeTradePairs map[common.TradePair]int
+               storeTradePairs map[string]*common.TradePair
                query           *common.TradePair
                wantTradePairs  []*common.TradePair
        }{
@@ -2766,13 +2766,13 @@ func TestListTradePairsWithStart(t *testing.T) {
                },
                {
                        desc: "query from first",
-                       storeTradePairs: map[common.TradePair]int{
-                               common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
-                               common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
-                               common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
-                               common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
+                       storeTradePairs: map[string]*common.TradePair{
+                               (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
+                               (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
+                               (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
+                               (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
                        },
                        query: &common.TradePair{},
                        wantTradePairs: []*common.TradePair{
@@ -2786,14 +2786,14 @@ func TestListTradePairsWithStart(t *testing.T) {
                },
                {
                        desc: "query from middle",
-                       storeTradePairs: map[common.TradePair]int{
-                               common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
-                               common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
-                               common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
-                               common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
-                               common.TradePair{FromAssetID: assetID6, ToAssetID: assetID8}: 7,
+                       storeTradePairs: map[string]*common.TradePair{
+                               (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
+                               (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
+                               (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
+                               (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
+                               (&common.TradePair{FromAssetID: assetID6, ToAssetID: assetID8}).Key(): {FromAssetID: assetID6, ToAssetID: assetID8, Count: 7},
                        },
                        query: &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
                        wantTradePairs: []*common.TradePair{
@@ -2842,20 +2842,20 @@ func TestListTradePairsWithStart(t *testing.T) {
 func TestUpdateTradePairs(t *testing.T) {
        cases := []struct {
                desc             string
-               beforeTradePairs map[common.TradePair]int
-               addTradePairs    map[common.TradePair]int
-               delTradePairs    map[common.TradePair]int
+               beforeTradePairs map[string]*common.TradePair
+               addTradePairs    map[string]*common.TradePair
+               delTradePairs    map[string]*common.TradePair
                wantTradePairs   []*common.TradePair
        }{
                {
                        desc: "empty",
-                       addTradePairs: map[common.TradePair]int{
-                               common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
-                               common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
-                               common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
-                               common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
+                       addTradePairs: map[string]*common.TradePair{
+                               (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
+                               (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
+                               (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
+                               (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
                        },
                        wantTradePairs: []*common.TradePair{
                                &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
@@ -2868,15 +2868,15 @@ func TestUpdateTradePairs(t *testing.T) {
                },
                {
                        desc: "Stored data already exists",
-                       beforeTradePairs: map[common.TradePair]int{
-                               common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
-                               common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
-                               common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
+                       beforeTradePairs: map[string]*common.TradePair{
+                               (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
+                               (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
+                               (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
                        },
-                       addTradePairs: map[common.TradePair]int{
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
-                               common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
+                       addTradePairs: map[string]*common.TradePair{
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
+                               (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
                        },
                        wantTradePairs: []*common.TradePair{
                                &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
@@ -2889,19 +2889,19 @@ func TestUpdateTradePairs(t *testing.T) {
                },
                {
                        desc: "delete some data",
-                       beforeTradePairs: map[common.TradePair]int{
-                               common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
-                               common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
-                               common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
-                               common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
+                       beforeTradePairs: map[string]*common.TradePair{
+                               (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
+                               (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
+                               (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
+                               (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
                        },
-                       delTradePairs: map[common.TradePair]int{
-                               common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: -1,
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: -4,
-                               common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: -2,
-                               common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: -4,
+                       delTradePairs: map[string]*common.TradePair{
+                               (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: -1},
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: -4},
+                               (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: -2},
+                               (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: -4},
                        },
                        wantTradePairs: []*common.TradePair{
                                &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},