クラスタ化された2つのRHEL6サーバーでMarkLogic 8を使用しています。 mlcpを使用してデータをロードする際にDEADLOCK(通知)エラーが発生することがあります。詳細:MLCP load throw DeadLock - MarkLogic 8
データ: 500+ CSVファイル
File name Examples:
File1: 20170927_**ABC**_XX_YY.CSV
File2: 20170927_**DEF**_QX_QY.CSV
File3: 20170927_**DE**_QX_QY.CSV
要件: 私は、負荷時にコレクションに各CSVを割り当てる際、これらの文書をロードする必要があります。 したがって、File1はABC Collectionに属し、File2はDEFコレクションに属し、File3はDE collectionに属している必要があります。
スクリプト: mlcpを使用して各CSVを個別に読み込むことでこれを達成しようとしました。
#!/bin/sh
listFiles=`ls -l /location/*.CSV | awk '{print $9}'`
for each in $listFiles
do
collName=`echo $each | cut -d_ -f2`
$MLCP_HOME/mlcp.sh import -mode local -options_file connect.txt \
-input_file_path $each -input_file_type delimited_text \
-generate_uri -output_collections $collName
done
問題: ファイルの一部がエラーなしMarkLogicにロードされてしまっています。 しかし、ログに「通知」レベルのDEADLOCKメッセージが表示され、読み込みがストールしています。
質問:2つ以上のクエリ(更新)が既に書き込みロックを保持しているURIをロックしようとすると、DEADLOCKが発生することが分かります。
- 私は、mlcp負荷の任意の数のスレッドが1度に1つのURIにデータ を書き込むことを望んでいました。デッドロックはどのように可能ですか?
- へのもう1つのクエリが完了するのを1つのクエリが待っているときに、それがDEADLOCKと呼ばれるのはなぜですか?キューイングだけではないのですか?
marklogicドキュメントのデッドロックの例として、次のコードがあります。なぜそれがデッドロックであるのか分かりません。あるコマンドがもう一方のコマンドを完了するのを待っています。
(: the next line ensures this runs as an update statement :)
if (1 = 2) then (xdmp:document-insert("foobar", <a/>)) else(),
doc("/docs/test.xml"),
xdmp:eval("xdmp:node-replace(doc('/docs/test.xml')/a, <b>goodbye</b>)",
(),
<options xmlns="xdmp:eval">
<isolation>different-transaction</isolation>
</options>) ,
doc("/docs/test.xml")
再生中のMLCP変換はありますか?またはCPFまたはトリガーですか? – grtjn
mlcpコマンドで見られるように変換されません。 CPF /トリガを有効にしませんでした。プレーンなmlcp負荷です。 – Bharadwaj
これらのCSVファイルにはいくつの行がありますか?デッドロックをログに記録しているURIの例を投稿できますか?生成されたURIが予想されるパターン(filename-split-sequence.xml)と一致していますか?コンテンツデータベースでディレクトリの作成を有効にしていますか? https://help.marklogic.com/knowledgebase/article/View/17/16/understanding-xdmp-deadlock –