Lorawan-stack: IDs de correlação duplicados

Criado em 10 mai. 2019  ·  8Comentários  ·  Fonte: TheThingsNetwork/lorawan-stack

Resumo

Os IDs de correlação em alguns eventos (ou seja, gs.up.receive e as.up.receive ) são duplicados.

Passos para reproduzir

  1. Inscreva-se em eventos, ou seja, ttn-lw-cli events subscribe --gateway-id ...

O que você vê agora?

Por exemplo:

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

O que você quer ver em vez disso?

Sem duplicatas em correlation_ids

Como você pretende implementar isso?

Os IDs de correlação provavelmente são adicionados duas vezes. Isso pode estar no pacote de eventos onde os IDs de correlação são incluídos quando estão no contexto.

Você pode fazer isso sozinho e enviar uma solicitação pull?

sim

bug shared

Comentários muito úteis

Eu preferiria usar o algoritmo de mesclagem de @rvolosatovs (veja meu comentário). Já gastamos muito tempo fazendo uma implementação eficiente para mesclar IDs de correlação, então seria uma pena se fundíssemos / descompactássemos com a implementação de mapa proposta de

Todos 8 comentários

@htdvisser o problema parece que os IDs de correlação da carga útil do evento são anexados aos do contexto, ou seja, se você tiver isso;

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

Os IDs de correlação são duplicados no evento, pois eles estão em ctx e em msg (por meio de GetCorrelationIDs() ).

Devemos verificar a exclusividade aqui?

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

Sim, podemos mover o algoritmo de mesclagem em pkg/events/correlation_context.go em sua própria função ( mergeCorrelationIDs ) e usá-lo em 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)
    }

Provavelmente devemos adicionar uma observação de que evt.innerEvent.CorrelationIDs deve ser classificado (o que é, porque os IDs de correlação no contexto são classificados).

Qual é o status @ pgalic96 ?

fiquei ocupado com as coisas, fiz a verificação de exclusividade, algo assim:

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

não escrevi um teste ainda, mas seria criar um evento com TestCorrelationID e, em seguida, fornecer o mesmo TestCorrelationID na carga útil e, em seguida, verificar se o comprimento dos CorrelationIDs da mensagem é na verdade, 1 e não 2.

Além do nome da variável, geralmente parece bom, embora evt.innerEvent.CorrelationIDs não seja desduplicado desta forma

Eu preferiria usar o algoritmo de mesclagem de @rvolosatovs (veja meu comentário). Já gastamos muito tempo fazendo uma implementação eficiente para mesclar IDs de correlação, então seria uma pena se fundíssemos / descompactássemos com a implementação de mapa proposta de

@ pgalic96 você pode dar uma atualização de status?

Não estive trabalhando nisso esta semana ainda, voltarei ao escritório amanhã depois do exame. tentará finalizá-lo amanhã.

Vou mudar o código de acordo com a sugestão de @htdvisser .

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

MatteMoveSRL picture MatteMoveSRL  ·  7Comentários

rvolosatovs picture rvolosatovs  ·  9Comentários

adamsondelacruz picture adamsondelacruz  ·  7Comentários

w4tsn picture w4tsn  ·  6Comentários

kschiffer picture kschiffer  ·  7Comentários