ID korelasi dalam beberapa peristiwa (yaitu gs.up.receive
dan as.up.receive
) adalah duplikat.
ttn-lw-cli events subscribe --gateway-id ...
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"
}
Tidak ada duplikat di correlation_ids
ID korelasi mungkin ditambahkan dua kali. Ini mungkin dalam paket acara di mana ID korelasi ditambahkan ketika mereka berada dalam konteks.
Iya
@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 .
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.