Lorawan-stack: ID de corrélation en double

Créé le 10 mai 2019  ·  8Commentaires  ·  Source: TheThingsNetwork/lorawan-stack

Résumé

Les ID de corrélation dans certains événements (c'est- gs.up.receive dire as.up.receive ) sont en double.

Étapes à suivre pour reproduire

  1. Abonnez-vous à des événements, c.- ttn-lw-cli events subscribe --gateway-id ... d.

Que voyez-vous maintenant?

Par example:

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

Que voulez-vous voir à la place?

Aucun doublon dans correlation_ids

Comment proposez-vous de mettre cela en œuvre?

Les ID de corrélation sont probablement ajoutés deux fois. Cela peut se trouver dans le package d'événements où les ID de corrélation sont ajoutés lorsqu'ils sont dans le contexte.

Pouvez-vous le faire vous-même et soumettre une demande de tirage?

Oui

bug shared

Commentaire le plus utile

Je préférerais utiliser l'algorithme de fusion de @rvolosatovs (voir mon commentaire). Nous avons déjà passé du temps à faire une implémentation efficace pour fusionner les ID de corrélation, il serait donc dommage que nous fusionnions / dédoublions avec l'implémentation de carte proposée par @ pgalic96 qui est beaucoup moins efficace et renvoie également des ID non triés.

Tous les 8 commentaires

@htdvisser le problème semble que les ID de corrélation de la charge utile d'événement sont ajoutés à ceux du contexte, c'est à dire si vous avez ceci;

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

Les ID de corrélation sont dupliqués dans l'événement car ils sont tous les deux dans ctx et dans msg (via GetCorrelationIDs() ).

Devrions-nous vérifier l'unicité ici?

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

Oui, nous pouvons déplacer l'algorithme de fusion dans pkg/events/correlation_context.go dans sa propre fonction ( mergeCorrelationIDs ) et l'utiliser dans 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)
    }

Nous devrions probablement ajouter une note que evt.innerEvent.CorrelationIDs doit être trié (ce qui est le cas, car les ID de corrélation dans le contexte sont triés).

Quel est le statut @ pgalic96 ?

je me suis occupé de trucs, j'ai vérifié l'unicité, quelque chose comme ça:

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

Je n'ai pas encore écrit de test, mais cela créerait un événement avec TestCorrelationID , puis fournirait le même TestCorrelationID dans la charge utile, puis vérifierait que la longueur des ID de corrélation du message est en effet 1 et non 2.

Mis à part le nom de la variable, il semble généralement bon, bien que le evt.innerEvent.CorrelationIDs ne soit pas dédupliqué de cette façon

Je préférerais utiliser l'algorithme de fusion de @rvolosatovs (voir mon commentaire). Nous avons déjà passé du temps à faire une implémentation efficace pour fusionner les ID de corrélation, il serait donc dommage que nous fusionnions / dédoublions avec l'implémentation de carte proposée par @ pgalic96 qui est beaucoup moins efficace et renvoie également des ID non triés.

@ pgalic96 pouvez-vous donner une mise à jour du statut?

Je n'ai pas encore travaillé dessus cette semaine, je viens au bureau demain après l'examen. essaiera de le finaliser demain.

Je vais changer le code selon la suggestion de @htdvisser .

Cette page vous a été utile?
0 / 5 - 0 notes