Os IDs de correlação em alguns eventos (ou seja, gs.up.receive
e as.up.receive
) são duplicados.
ttn-lw-cli events subscribe --gateway-id ...
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"
}
Sem duplicatas em correlation_ids
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.
sim
@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 .
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