Lorawan-stack: ID korelasi duplikat

Dibuat pada 10 Mei 2019  ·  8Komentar  ·  Sumber: TheThingsNetwork/lorawan-stack

Ringkasan

ID korelasi dalam beberapa peristiwa (yaitu gs.up.receive dan as.up.receive ) adalah duplikat.

Langkah-langkah untuk Mereproduksi

  1. Berlangganan ke acara, misalnya ttn-lw-cli events subscribe --gateway-id ...

Apa yang kamu lihat sekarang

Sebagai contoh:

{
  "name": "gs.up.receive",
  "time": "2019-05-10T08:48:36.397803Z",
  "identifiers": [
    {
      "gateway_ids": {
        "gateway_id": "tektelic-micro",
        "eui": "647FDAFFFE0059AB"
      }
    }
  ],
  "data": {
    "@type": "type.googleapis.com/ttn.lorawan.v3.UplinkMessage",
    "raw_payload": "QKogASYAkdgBU2NToyoatD/C",
    "settings": {
      "data_rate": {
        "lora": {
          "bandwidth": 125000,
          "spreading_factor": 7
        }
      },
      "coding_rate": "4/5",
      "frequency": "867900000",
      "timestamp": 3375161699
    },
    "rx_metadata": [
      {
        "gateway_ids": {
          "gateway_id": "tektelic-micro",
          "eui": "647FDAFFFE0059AB"
        },
        "timestamp": 3375161699,
        "rssi": 2,
        "snr": 10,
        "uplink_token": "ChwKGgoOdGVrdGVsaWMtbWljcm8SCGR/2v/+AFmrEOPCs8kM"
      }
    ],
    "received_at": "2019-05-10T08:48:36.397329Z",
    "correlation_ids": [
      "gs:conn:01DAGEFV4TBH5K9AVAX86NPDXM",
      "gs:uplink:01DAGEW31DQZQNSCQPJ28KGFMF"
    ],
    "gateway_channel_index": 4
  },
  "correlation_ids": [
    "gs:conn:01DAGEFV4TBH5K9AVAX86NPDXM",
    "gs:uplink:01DAGEW31DQZQNSCQPJ28KGFMF",
    "gs:conn:01DAGEFV4TBH5K9AVAX86NPDXM",
    "gs:uplink:01DAGEW31DQZQNSCQPJ28KGFMF"
  ],
  "origin": "Johans-MacBook-Pro.local"
}

Apa yang ingin Anda lihat?

Tidak ada duplikat di correlation_ids

Bagaimana Anda mengusulkan untuk menerapkan ini?

ID korelasi mungkin ditambahkan dua kali. Ini mungkin dalam paket acara di mana ID korelasi ditambahkan ketika mereka berada dalam konteks.

Bisakah Anda melakukan ini sendiri dan mengajukan Permintaan Tarik?

Iya

bug shared

Komentar yang paling membantu

Saya lebih suka menggunakan algoritma penggabungan @rvolosatovs (lihat komentar saya). Kami telah menghabiskan waktu untuk membuat implementasi yang efisien untuk menggabungkan ID korelasi, jadi akan memalukan jika kami menggabungkan / dedup dengan implementasi peta yang diusulkan @ pgalic96 yang jauh kurang efisien dan juga mengembalikan ID yang tidak disortir.

Semua 8 komentar

@htdvisser masalahnya tampaknya bahwa ID korelasi dari muatan peristiwa ditambahkan ke konteksnya, yaitu jika Anda memiliki ini;

ctx := events.ContextWithCorrelationID(ctx, fmt.Sprintf("gs:uplink:%s", events.NewCorrelationID()))
msg.CorrelationIDs = append(msg.CorrelationIDs, events.CorrelationIDsFromContext(ctx)...)
registerReceiveUplink(ctx, conn.Gateway(), msg)

ID korelasi digandakan dalam acara karena keduanya ada di ctx dan di msg (sampai GetCorrelationIDs() ).

Haruskah kita memeriksa keunikan di sini?

https://github.com/TheThingsNetwork/lorawan-stack/blob/master/pkg/events/events.go#L148

Ya, kita dapat memindahkan algoritma penggabungan di pkg/events/correlation_context.go ke dalam funcnya sendiri ( mergeCorrelationIDs ) dan menggunakannya di pkg/events/events.go :

    if cids := data.GetCorrelationIDs(); len(cids) > 0 {
        cids = append(cids[:0:0], cids...)
        sort.Strings(cids)
        evt.innerEvent.CorrelationIDs = mergeCorrelationIDs(evt.innerEvent.CorrelationIDs, cids)
    }

Kami mungkin harus menambahkan catatan bahwa evt.innerEvent.CorrelationIDs harus diurutkan (yang mana, karena ID korelasi dalam konteks diurutkan).

Bagaimana status @ pgalic96 ?

sibuk dengan hal-hal, saya memeriksa keunikan, seperti ini:

if data, ok := data.(interface{ GetCorrelationIDs() []string }); ok {
        mapCorrelationIds := make(map[string]struct{})
        for _, correlationID := range evt.innerEvent.CorrelationIDs {
            mapCorrelationIds[correlationID] = struct{}{}
        }
        for _, correlationID := range data.GetCorrelationIDs() {
            if _, ok := mapCorrelationIds[correlationID]; !ok {
                evt.innerEvent.CorrelationIDs = append(evt.innerEvent.CorrelationIDs, correlationID)
            }
        }
    }

belum menulis tes, tetapi itu akan membuat acara dengan TestCorrelationID dan kemudian memberikan TestCorrelationID dalam payload, dan kemudian memeriksa bahwa panjang dari CorrelationIDs pesan adalah memang 1 dan bukan 2.

Terlepas dari nama variabel umumnya terlihat bagus, meskipun evt.innerEvent.CorrelationIDs tidak dapat dideduplikasi dengan cara ini

Saya lebih suka menggunakan algoritma penggabungan @rvolosatovs (lihat komentar saya). Kami telah menghabiskan waktu untuk membuat implementasi yang efisien untuk menggabungkan ID korelasi, jadi akan memalukan jika kami menggabungkan / dedup dengan implementasi peta yang diusulkan @ pgalic96 yang jauh kurang efisien dan juga mengembalikan ID yang tidak disortir.

@ pgalic96 dapatkah Anda memberikan pembaruan status?

Saya belum mengerjakannya minggu ini, datang ke kantor besok setelah ujian. akan mencoba menyelesaikannya besok.

Saya akan mengubah kode sesuai saran @htdvisser .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat