معرفات الارتباط في بعض الأحداث (مثل gs.up.receive
و as.up.receive
) مكررة.
ttn-lw-cli events subscribe --gateway-id ...
على سبيل المثال:
{
"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"
}
لا توجد تكرارات في correlation_ids
من المحتمل أن تتم إضافة معرفات الارتباط مرتين. قد يكون هذا في حزمة الأحداث حيث يتم إضافة معرفات الارتباط عندما تكون في السياق.
نعم
htdvisser تبدو المشكلة أن معرفات الارتباط من حمولة الحدث يتم إلحاقها بمعرفات السياق ، أي إذا كان لديك هذا ؛
ctx := events.ContextWithCorrelationID(ctx, fmt.Sprintf("gs:uplink:%s", events.NewCorrelationID()))
msg.CorrelationIDs = append(msg.CorrelationIDs, events.CorrelationIDsFromContext(ctx)...)
registerReceiveUplink(ctx, conn.Gateway(), msg)
معرفات الارتباط مكررة في الحدث لأنها في ctx
و msg
(من خلال GetCorrelationIDs()
).
هل يجب أن نتحقق من التفرد هنا؟
https://github.com/TheThingsNetwork/lorawan-stack/blob/master/pkg/events/events.go#L148
نعم ، يمكننا نقل خوارزمية الدمج في pkg/events/correlation_context.go
إلى func الخاص بها ( mergeCorrelationIDs
) واستخدامها في 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)
}
ربما يجب أن نضيف ملاحظة مفادها أنه يجب فرز evt.innerEvent.CorrelationIDs
(وهو كذلك ، لأنه يتم فرز معرفات الارتباط في السياق).
ما هو الوضع @ pgalic96 ؟
انشغلت بالأشياء ، وقمت بالتحقق من التفرد ، شيء من هذا القبيل:
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)
}
}
}
لم تكتب اختبارًا بعد ، ولكنها ستنشئ حدثًا بـ TestCorrelationID
ثم تزود نفس TestCorrelationID
في الحمولة ، ثم التحقق من أن طول معرّفات الارتباط للرسالة هو في الواقع 1 وليس 2.
بصرف النظر عن اسم المتغير ، يبدو بشكل عام جيدًا ، على الرغم من أن evt.innerEvent.CorrelationIDs
لا يتم إلغاء تكرارها بهذه الطريقة
أفضل استخدام خوارزمية الدمج rvolosatovs (انظر تعليقي). لقد أمضينا الوقت بالفعل في إجراء تنفيذ فعال لدمج معرفات الارتباط ، لذلك سيكون من العار إذا قمنا بدمج / حذف تطبيق الخريطة المقترح من @ pgalic96 والذي يكون أقل كفاءة بكثير ويعيد أيضًا معرفات غير مفروزة.
@ pgalic96 هل يمكنك إعطاء تحديث الحالة؟
لم أعمل على ذلك هذا الأسبوع حتى الآن ، وأتي إلى المكتب غدًا بعد الامتحان. سيحاول وضع اللمسات الأخيرة عليه غدًا.
سأغير الكود وفقًا لاقتراح
التعليق الأكثر فائدة
أفضل استخدام خوارزمية الدمج rvolosatovs (انظر تعليقي). لقد أمضينا الوقت بالفعل في إجراء تنفيذ فعال لدمج معرفات الارتباط ، لذلك سيكون من العار إذا قمنا بدمج / حذف تطبيق الخريطة المقترح من @ pgalic96 والذي يكون أقل كفاءة بكثير ويعيد أيضًا معرفات غير مفروزة.