Lorawan-stack: Doppelte Korrelations-IDs

Erstellt am 10. Mai 2019  ·  8Kommentare  ·  Quelle: TheThingsNetwork/lorawan-stack

Zusammenfassung

Die Korrelations-IDs in einigen Ereignissen (dh gs.up.receive und as.up.receive ) sind doppelt vorhanden.

Schritte zum Reproduzieren

  1. Abonnieren Sie Events, dh ttn-lw-cli events subscribe --gateway-id ...

Was siehst du jetzt?

Beispielsweise:

{
  "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"
}

Was möchten Sie stattdessen sehen?

Keine Duplikate in correlation_ids

Wie schlagen Sie vor, dies umzusetzen?

Die Korrelations-IDs werden wahrscheinlich zweimal hinzugefügt. Dies kann im Ereignispaket sein, in dem Korrelations-IDs hinzugefügt werden, wenn sie sich im Kontext befinden.

Können Sie dies selbst tun und eine Pull-Anfrage einreichen?

Ja

bug shared

Hilfreichster Kommentar

Ich würde es vorziehen, den Zusammenführungsalgorithmus von @rvolosatovs zu verwenden (siehe meinen Kommentar). Wir haben bereits viel Zeit damit verbracht, eine effiziente Implementierung zum Zusammenführen von Korrelations-IDs zu erstellen. Daher wäre es eine Schande, wenn wir die von Kartenimplementierung zusammenführen / dedupieren

Alle 8 Kommentare

@htdvisser das Problem scheint, dass die Korrelations-IDs aus der Ereignisnutzlast an die des Kontexts angehängt werden, dh wenn Sie dies haben;

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

Die Korrelations-IDs sind im Ereignis doppelt vorhanden, da sie sowohl in ctx als auch in msg (bis GetCorrelationIDs() ) angegeben sind.

Sollten wir hier die Einzigartigkeit überprüfen?

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

Ja, wir können den Zusammenführungsalgorithmus in pkg/events/correlation_context.go in eine eigene Funktion ( mergeCorrelationIDs ) verschieben und diese in 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)
    }

Wir sollten wahrscheinlich einen Hinweis hinzufügen, dass evt.innerEvent.CorrelationIDs sortiert werden muss (was es ist, weil Korrelations-IDs im Kontext sortiert sind).

Wie ist der Status @ pgalic96 ?

Ich war mit Sachen beschäftigt und überprüfte die Einzigartigkeit, so etwas:

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)
            }
        }
    }

Ich habe noch keinen Test geschrieben, aber es würde ein Ereignis mit TestCorrelationID erstellen und dann das gleiche TestCorrelationID in der Nutzlast bereitstellen und dann überprüfen, ob die Länge der Korrelations-IDs der Nachricht ist in der Tat 1 und nicht 2.

Abgesehen vom Variablennamen sieht es im Allgemeinen gut aus, obwohl die evt.innerEvent.CorrelationIDs auf diese Weise nicht dedupliziert werden

Ich würde es vorziehen, den Zusammenführungsalgorithmus von @rvolosatovs zu verwenden (siehe meinen Kommentar). Wir haben bereits viel Zeit damit verbracht, eine effiziente Implementierung zum Zusammenführen von Korrelations-IDs zu erstellen. Daher wäre es eine Schande, wenn wir die von Kartenimplementierung zusammenführen / dedupieren

@ pgalic96 kannst du ein status update geben?

Ich habe diese Woche noch nicht daran gearbeitet und komme morgen nach der Prüfung ins Büro. werde versuchen, es morgen abzuschließen.

Ich werde den Code gemäß dem Vorschlag von @htdvisser ändern .

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

johanstokking picture johanstokking  ·  5Kommentare

adriansmares picture adriansmares  ·  9Kommentare

johanstokking picture johanstokking  ·  8Kommentare

w4tsn picture w4tsn  ·  6Kommentare

bafonins picture bafonins  ·  5Kommentare