如何在 Marklogic 集群之间移动大文档时增加超时时间?

How do I increase the timeout time when moving large documents between Marklogic clusters?

我在尝试在两个 MarkLogic 集群之间传输大型文档时不断收到内部服务器错误。 5 分钟后超时。

SVC-SOCRECV: xdmp:http-post(...) Timeout (decodeResponseLine1)

url 看起来像这样:

http://source-host:8020/uri.transfer.xqy?key=/COLLECTION/DB/VeryLargeDoc.xml&srcdb=DB&destdb=DB&desthost=dest-host

我尝试在函数中使用 xdmp:set-request-time-limit(600) 将超时设置为 10 分钟。 xquery 函数:

declare function my-ns:transfer-records(
    $record as element(record),
    $database as xs:string,
    $host as xs:string)
{
  let $response :=
    xdmp:set-request-time-limit(600,
    xdmp:http-post("http://" || $host || ":" || $PORT || "/doc_transfer.xqy?database=" || $database,
        <options xmlns="xdmp:http">
            <headers>
                <content-type>application/gzip</content-type>
            </headers>
        </options>,
        xdmp:gzip($record)
    )
  )
  return
    xdmp:set-response-code($response[1]//*:code, $response[1]//*:message)
};

这是行不通的。我应该在哪里修改超时。超时似乎发生在源主机上。

有多个超时可能会困扰您:

  • 保留 xdmp:set-request-time-limit,否则如果 http-post 太慢,MarkLogic 可能会不耐烦地终止整个语句。
  • <timeout> 添加到 xdmp:http-post options 以确保 http-post 不会取消请求 client-side。默认值是组的 http 超时。 (注意:SVC-SOCRECV 似乎表明这是正在发生的事情)
  • 还要确保 server-side 时间限制足够长。将有代码 运行 server-side 来编写您要发送的任何内容。它将受到 default time limit 的约束,除非 doc_transfer.xqy 也包含明确的 xdmp:set-request-time-limit

HTH!

对于那些可能希望看到有效解决方案的人。 (感谢@grtjn)我添加了一个 <timeout>900</timeout> 元素,将超时设置为 900 秒。对我来说,这个集群上这个组的默认值是 300 秒。

declare function my-ns:transfer-records(
    $record as element(record),
    $database as xs:string,
    $host as xs:string)
{
  let $response :=
    xdmp:set-request-time-limit(600,
    xdmp:http-post("http://" || $host || ":" || $PORT || "/doc_transfer.xqy?database=" || $database,
        <options xmlns="xdmp:http">
            <headers>
                <content-type>application/gzip</content-type>
            </headers>
            <timeout>900</timeout>
        </options>,
        xdmp:gzip($record)
    )
  )
  return
    xdmp:set-response-code($response[1]//*:code, $response[1]//*:message)
};