Lorawan-stack: 重複する相関ID

作成日 2019年05月10日  ·  8コメント  ·  ソース: TheThingsNetwork/lorawan-stack

概要

一部のイベント(つまり、 gs.up.receiveas.up.receive )の相関IDが重複しています。

再現する手順

  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重複はありません

これをどのように実装することを提案しますか?

相関IDはおそらく2回追加されます。 これは、コンテキスト内にあるときに相関IDが追加されるイベントパッケージに含まれている可能性があります。

これを自分で行い、プルリクエストを送信できますか?

はい

bug shared

最も参考になるコメント

@rvolosatovsのマージアルゴリズムを使用することをお@ pgalic96の提案されたマップ実装とマージ/重複排除すると、効率が大幅に低下し、ソートされていないIDも返されます。

全てのコメント8件

@htdvisser問題は、イベントペイロードからの相関IDがコンテキストの相関IDに追加されているようです。つまり、これがある場合です。

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

相関IDは、 ctxmsgGetCorrelationIDs()介して)の両方にあるため、イベントで重複しています。

ここで一意性を確認する必要がありますか?

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

はい、 pkg/events/correlation_context.goのマージアルゴリズムを独自の関数( 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ソートする必要があることに注意してください(これは、コンテキスト内の相関IDがソートされているためです)。

ステータス@ 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して、メッセージのCorrelationIDの長さが次のようになっていることを確認します。確かに1であり、2ではありません。

evt.innerEvent.CorrelationIDsはこのように重複排除されませんが、変数名は別として、一般的には見栄えがします。

@rvolosatovsのマージアルゴリズムを使用することをお@ pgalic96の提案されたマップ実装とマージ/重複排除すると、効率が大幅に低下し、ソートされていないIDも返されます。

@ pgalic96ステータスを更新できますか?

今週はまだ取り組んでおらず、明日試験後に出社します。 明日それを完成させようとします。

@htdvisserの提案に従ってコードを変更します。

このページは役に立ちましたか?
0 / 5 - 0 評価