MLCP加载引发死锁-MarkLogic 8
我在集群的2台RHEL6服务器上使用MarkLogic 8。 我在使用mlcp加载数据时遇到死锁(注意)错误。详情: 数据: 500多个CSV文件MLCP加载引发死锁-MarkLogic 8,marklogic,database-deadlocks,marklogic-8,mlcp,Marklogic,Database Deadlocks,Marklogic 8,Mlcp,我在集群的2台RHEL6服务器上使用MarkLogic 8。 我在使用mlcp加载数据时遇到死锁(注意)错误。详情: 数据: 500多个CSV文件 File name Examples: File1: 20170927_**ABC**_XX_YY.CSV File2: 20170927_**DEF**_QX_QY.CSV File3: 20170927_**DE**_QX_QY.CSV 要求: 我需要加载这些文档,同时在加载过程中将每个CSV分配给一个集合。 因此,文件1应该属于ABC集合,文
File name Examples:
File1: 20170927_**ABC**_XX_YY.CSV
File2: 20170927_**DEF**_QX_QY.CSV
File3: 20170927_**DE**_QX_QY.CSV
要求:
我需要加载这些文档,同时在加载过程中将每个CSV分配给一个集合。
因此,文件1应该属于ABC集合,文件2应该属于DEF集合,文件3应该属于DE集合
脚本:
我试图通过使用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中,没有任何错误。
但是,我在日志中看到了“通知”级别的死锁消息,加载被暂停
问题:
我知道当两个或更多的查询(更新)试图在已经持有写锁的URI上实现锁时,就会发生死锁
(: 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")
(:下一行确保它作为更新语句运行:)
如果(1=2),那么(xdmp:documentinsert(“foobar”),else(),
doc(“/docs/test.xml”),
xdmp:eval(“xdmp:node replace(doc('/docs/test.xml')/a,再见)”,
(),
不同交易
) ,
doc(“/docs/test.xml”)
我真的不明白为什么会出现死锁。我仍然怀疑MLCP之外有什么东西在产生这些信息。是否有一些时间表或只是一些完全独立的过程导致了这些消息
我可以试着解释一下关于MLCP的死锁
死锁通常发生在您在更新模式下触摸文件,然后生成、调用或评估触摸同一文件的代码时。生成、调用或评估的请求尚未完成,因此自动读或写锁尚未释放。子进程确实看到了锁,并被迫等待它被释放。但父进程将等待子进程完成,因此会出现死锁
由于MLCP将打开持久的事务,并且将发出多个参与同一事务的调用,因此MLCP变得稍微复杂一些。在整个持久事务被释放之前,这些自动锁不会被释放。因此,如果MLCP尝试在同一事务中插入同一文件两次,那将是一个麻烦
可能有一种方法可以检查是否真的是MLCP造成了问题。有几个命令行参数可以控制使用了多少线程,以及一个事务中包含了多少请求。尝试使用:
-transaction_size 1 -batch_size 1
此外,如果确实希望以顺序方式处理文件,请另外添加以下内容:
-thread_count 1
您可以只使用import
命令(不使用其他参数)运行MLCP,以获得所有命令行选项的摘要
嗯 是否存在MLCP转换?或者CPF或触发器?没有在mlcp命令中看到的转换。未激活CPF/触发器。这是一个普通的mlcp加载。这些CSV文件中有多少行?您可以发布一个记录死锁的URI示例吗?生成的URI是否与预期模式匹配,即filename-split-sequence.xml?您是否在内容数据库上启用了目录创建?非常感谢@grtjn。我想我在某种程度上明白了。我想这是因为我进行了集群设置。如前所述,我有两台集群服务器。但我没有提到的是,两台服务器上各有一个林。i、 e,Forest1位于服务器1存储上,Forest2位于服务器2存储上。此外,这两台服务器位于不同的网络上。我移走了一片森林,所有的人都跑得很好。尽管如此,我还是想知道为什么即使有这样的设置也会出现死锁?我确实添加了集群服务器,并尝试了选项-transaction\u size、-batch\u size和-thread\u count。我看到当我没有提到-thread\u count[即,当thread\u count默认为4]时,死锁就会发生。在这样的设置中,似乎有更多的线程导致MLCP在一个事务中多次访问同一文档。我觉得这很奇怪!请帮助理解原因。您可能在MLCP中发现了错误。你能试试最新的MLCP吗?如果没有帮助的话,考虑把票归档,你是对的!我用的是8-0-6版本。9-0-3(最新版本)没有抛出此类“通知”级别的死锁错误[虽然速度非常慢…但不知道我可以分配的最大线程数是多少:)]