Lorawan-stack: معرفات ارتباط مكررة

تم إنشاؤها على ١٠ مايو ٢٠١٩  ·  8تعليقات  ·  مصدر: TheThingsNetwork/lorawan-stack

ملخص

معرفات الارتباط في بعض الأحداث (مثل gs.up.receive و as.up.receive ) مكررة.

خطوات التكاثر

  1. اشترك في الأحداث ، مثل 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

كيف تقترح تنفيذ هذا؟

من المحتمل أن تتم إضافة معرفات الارتباط مرتين. قد يكون هذا في حزمة الأحداث حيث يتم إضافة معرفات الارتباط عندما تكون في السياق.

هل يمكنك القيام بذلك بنفسك وإرسال طلب سحب؟

نعم

bug shared

التعليق الأكثر فائدة

أفضل استخدام خوارزمية الدمج rvolosatovs (انظر تعليقي). لقد أمضينا الوقت بالفعل في إجراء تنفيذ فعال لدمج معرفات الارتباط ، لذلك سيكون من العار إذا قمنا بدمج / حذف تطبيق الخريطة المقترح من @ pgalic96 والذي يكون أقل كفاءة بكثير ويعيد أيضًا معرفات غير مفروزة.

ال 8 كومينتر

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 هل يمكنك إعطاء تحديث الحالة؟

لم أعمل على ذلك هذا الأسبوع حتى الآن ، وأتي إلى المكتب غدًا بعد الامتحان. سيحاول وضع اللمسات الأخيرة عليه غدًا.

سأغير الكود وفقًا لاقتراح

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات