Skip to content

Trie.get()/Trie.find() does not return data, but the data is present. #427

Closed
@iclighthouse

Description

@iclighthouse

We had this issue during a stress test. orders used the Trie module and had a total of 798 records.

Only this data was encountered unreadable, most of the other data can be read normally.

canister-id: ynbvm-hiaaa-aaaak-adbqa-cai

  1. Can get the data using Trie.filter().
    code:
private func keyb(t: Blob) : Trie.Key<Blob> { return { key = t; hash = Blob.hash(t) }; };

public query func testTrieFilter() : async TrieList<Txid, TradingOrder>{
        let _txid : Text = "000000c28ca1e305eeaeaccdd069e91a45f9668d6a3407e31a5c0db7c9372b28"; // blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+("
        var txid : Blob = Blob.fromArray([]);
        switch(Hex.decode(_txid)){
            case(#ok(r)){ txid := Blob.fromArray(r); };
            case(_){};
        };
        var trie = icdex_orders;
        let page = 1;
        let size = 10;
        trie := Trie.filter<Txid, TradingOrder>(trie, func (k:Txid, v:TradingOrder): Bool{ 
            k == txid; 
        });
        return trieItems<Txid, TradingOrder>(trie, page, size);
    };

execute:
dfx canister --network ic call ynbvm-hiaaa-aaaak-adbqa-cai testTrieFilter
returns:

(
  record {
    total = 1 : nat;
    data = vec {
      record {
        blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+(";
        record {
          fee = record { fee0 = 0 : nat; fee1 = 0 : nat };
          gas = record { gas0 = 0 : nat; gas1 = 0 : nat };
          status = variant { Pending };
          toids = vec {};
          data = null;
          time = 1_668_476_725_633_900_968 : int;
          txid = blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+(";
          icrc1Account = opt record {
            owner = principal "vlpmr-zi3rn-n6nwy-qx6jf-snrkm-nwoje-jghma-7j3lv-irskf-yojl3-eqe";
            subaccount = null;
          };
          orderType = variant { LMT };
          filled = vec {};
          expiration = 1_676_252_725_633_900_968 : int;
          nonce = 194 : nat;
          account = blob "\c1\e9\a9\c94\8f\ef\c3\e04\c9\08L\cd\0b\b0\0f\c4\9a\8e\c2\0a\0f\89\14\b2\a5R\f3\c3P\bc";
          remaining = record {
            quantity = variant { Sell = 100_000_000 : nat };
            price = 300 : nat;
          };
          index = 940 : nat;
          orderPrice = record {
            quantity = variant { Sell = 100_000_000 : nat };
            price = 300 : nat;
          };
          refund = record { 0 : nat; 0 : nat; 0 : nat };
        };
      };
    };
    totalPage = 1 : nat;
  },
)
  1. Can get the data using Trie.mapFilter().
    code:
public query func testTrieMapFilter() : async TrieList<Txid, TradingOrder>{
        let _txid : Text = "000000c28ca1e305eeaeaccdd069e91a45f9668d6a3407e31a5c0db7c9372b28"; // blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+("
        var txid : Blob = Blob.fromArray([]);
        switch(Hex.decode(_txid)){
            case(#ok(r)){ txid := Blob.fromArray(r); };
            case(_){};
        };
        var trie = icdex_orders;
        let page = 1;
        let size = 10;
        trie := Trie.mapFilter<Txid, TradingOrder, TradingOrder>(trie, func (k:Txid, v:TradingOrder): ?TradingOrder{ 
            if (k == txid){
                return ?v;
            }else { return null; }; 
        });
        return trieItems<Txid, TradingOrder>(trie, page, size);
    };

execute:
dfx canister --network ic call ynbvm-hiaaa-aaaak-adbqa-cai testTrieMapFilter
returns:

(
  record {
    total = 1 : nat;
    data = vec {
      record {
        blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+(";
        record {
          fee = record { fee0 = 0 : nat; fee1 = 0 : nat };
          gas = record { gas0 = 0 : nat; gas1 = 0 : nat };
          status = variant { Pending };
          toids = vec {};
          data = null;
          time = 1_668_476_725_633_900_968 : int;
          txid = blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+(";
          icrc1Account = opt record {
            owner = principal "vlpmr-zi3rn-n6nwy-qx6jf-snrkm-nwoje-jghma-7j3lv-irskf-yojl3-eqe";
            subaccount = null;
          };
          orderType = variant { LMT };
          filled = vec {};
          expiration = 1_676_252_725_633_900_968 : int;
          nonce = 194 : nat;
          account = blob "\c1\e9\a9\c94\8f\ef\c3\e04\c9\08L\cd\0b\b0\0f\c4\9a\8e\c2\0a\0f\89\14\b2\a5R\f3\c3P\bc";
          remaining = record {
            quantity = variant { Sell = 100_000_000 : nat };
            price = 300 : nat;
          };
          index = 940 : nat;
          orderPrice = record {
            quantity = variant { Sell = 100_000_000 : nat };
            price = 300 : nat;
          };
          refund = record { 0 : nat; 0 : nat; 0 : nat };
        };
      };
    };
    totalPage = 1 : nat;
  },
)
  1. Cannot query the data using Trie.get()
    code:
public query func testTrieGet() : async OrderStatusResponse{
        let _txid : Text = "000000c28ca1e305eeaeaccdd069e91a45f9668d6a3407e31a5c0db7c9372b28"; // blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+("
        var txid : Blob = Blob.fromArray([]);
        switch(Hex.decode(_txid)){
            case(#ok(r)){ txid := Blob.fromArray(r); };
            case(_){};
        };
        switch(Trie.get(icdex_orders, keyb(txid), Blob.equal)){
            case(?(order)){ return #Pending(order); };
            case(_){ return #None; };
        };
    };

execute:
dfx canister --network ic call ynbvm-hiaaa-aaaak-adbqa-cai testTrieGet
returns:

(variant { None })

It is also

(variant { 870_530_776 })
  1. Cannot query the data using Trie.find()
    code:
public query func testTrieFind() : async OrderStatusResponse{
        let _txid : Text = "000000c28ca1e305eeaeaccdd069e91a45f9668d6a3407e31a5c0db7c9372b28"; // blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+("
        var txid : Blob = Blob.fromArray([]);
        switch(Hex.decode(_txid)){
            case(#ok(r)){ txid := Blob.fromArray(r); };
            case(_){};
        };
        switch(Trie.find(icdex_orders, keyb(txid), Blob.equal)){
            case(?(order)){ return #Pending(order)};
            case(_){ return #None; };
        };
    };

execute:
dfx canister --network ic call ynbvm-hiaaa-aaaak-adbqa-cai testTrieFind
returns:

(variant { None })

It is also

(variant { 870_530_776 })

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions