2

Elasticsearch を使用して Django で並列テストを実行した人はいますか? もしそうなら、それを実現するために必要な構成変更を共有できますか?

here で説明されているソリューションを含め、機能させるために考えられるすべてのことを試しました。Django 自体が並列 DB を行う方法からインスピレーションを得て、現在ParallelTestSuite、init_worker をオーバーライドして各インデックス/ドキュメントタイプを反復処理し、インデックス名を次のように大まかに変更するカスタム new を作成しました。

_worker_id = 0
def _elastic_search_init_worker(counter):
    global _worker_id

    with counter.get_lock():
        counter.value += 1
        _worker_id = counter.value

    for alias in connections:
        connection = connections[alias]
        settings_dict = connection.creation.get_test_db_clone_settings(_worker_id)
        # connection.settings_dict must be updated in place for changes to be
        # reflected in django.db.connections. If the following line assigned
        # connection.settings_dict = settings_dict, new threads would connect
        # to the default database instead of the appropriate clone.
        connection.settings_dict.update(settings_dict)
        connection.close()

    ### Everything above this is from the Django version of this function ###

    # Update index names in doctypes
    for doc in registry.get_documents():
        doc._doc_type.index += f"_{_worker_id}"

    # Update index names for indexes and create new indexes
    for index in registry.get_indices():
        index._name += f"_{_worker_id}"
        index.delete(ignore=[404])
        index.create()

    print(f"Started thread # {_worker_id}")

これは通常はうまくいくように見えますが、一見ランダムに発生する奇妙な点があります (つまり、テスト スイートを再度実行しても問題が確実に再現されないか、エラー メッセージが変化します)。以下は、私が得たさまざまなエラーであり、テストの実行ごとにそのうちの 1 つでランダムに失敗するようです。

  • 上記の関数でインデックスを作成しようとすると 404 が発生します (404 が PUT 要求から返されることを確認しましたが、Elasticsearch サーバー ログでは、問題なくインデックスが作成されたことが示されています)。
  • インデックスを作成しようとすると 500 になりますが、これはしばらく発生していないため、他の方法で修正されたと思います
  • クエリ応答には、elasticsearch ライブラリitemsの関数内に辞書値がない場合があります。_process_bulk_chunk

接続レイヤーで何か奇妙なことが起こっていると考えています (Django テスト ランナー プロセス間の接続が応答を混同しているように) が、Django がmultiprocessing を使用してテストを並列化するため、テストはそれぞれ独自のプロセスで実行されます。スピンオフされたプロセスがまだ元のプロセスの接続プールなどを使用しようとしている可能性はありますか? 私は本当にここから他に試してみることができず、いくつかのヒントや、これが実際に可能であることの確認さえもいただければ幸いです。

4

0 に答える 0