jackrabbit-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jiri Frolik (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (JCR-3866) Performance issue when adding large files to Apache Jackrabbit 2.8.0 using DbDataStore
Date Fri, 03 Apr 2015 14:20:52 GMT

     [ https://issues.apache.org/jira/browse/JCR-3866?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

Jiri Frolik updated JCR-3866:
    Attachment: jackrabbit-repo.xml

Current jackrabbit configuration.

> Performance issue when adding large files to Apache Jackrabbit 2.8.0 using DbDataStore
> --------------------------------------------------------------------------------------
>                 Key: JCR-3866
>                 URL: https://issues.apache.org/jira/browse/JCR-3866
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-core, jackrabbit-data
>    Affects Versions: 2.8
>         Environment: Windows 8, Windows Server 2012 R2;
> using Oracle jdk1.7.0_51
>            Reporter: Jiri Frolik
>              Labels: performance
>         Attachments: jackrabbit-repo.xml
>   Original Estimate: 48h
>  Remaining Estimate: 48h
> When adding large (> 10MB) files into Jackrabbit 2.8.0, there can be seen a noticeable
delay (e.g. 10-20 seconds by 100MB file, tested on more environments - Windows 8, Windows
Server 2012 R2).
> I am using org.apache.jackrabbit.core.data.db.DbDataStore (see configuration in attachment).
> I found out that the delay is made by calling following from my Java application:
> org.apache.jackrabbit.core.NodeImpl.setProperty("jcr:data", new org.apache.jackrabbit.value.BinaryImpl(inputStream));
  // input stream of added large file
> By debugging I further found out that the BinaryImpl object creates a temp file from
given input stream.
> Assuming that there is used a default setting of DbDataStore.storeStream property (which
is equal to "tempFile"), I found two long-lasting instructions in org.apache.jackrabbit.core.data.db.DbDataStore.addRecord(InputStream).
> (Here the input stream is of the newly created temp file).
> One delay is caused by storing the content on line 357: conHelper.exec(updateDataSQL,
wrapper, tempId);
> But I understand that this is an unnecessary step and cannot be simply optimized.
> The second delay, on line 350, is caused by creating of a new temp file from current
input stream, just to see its length, by calling:
> org.apache.commons.io.IOUtils.copy(InputStream, OutputStream), which copies the file
by 4kB (!) buffer by default.
> When I tried to change the value of the DbDataStore.storeStream property to "max" and
skip the temp file creation, an exception raised from line 357 (conHelper.exec(updateDataSQL,
wrapper, tempId);):
> java.lang.RuntimeException: Unable to reset the Stream.
> 	at org.apache.jackrabbit.core.util.db.ConnectionHelper.execute(ConnectionHelper.java:527)
> 	at org.apache.jackrabbit.core.util.db.ConnectionHelper.reallyExec(ConnectionHelper.java:313)
> 	at org.apache.jackrabbit.core.util.db.ConnectionHelper$1.call(ConnectionHelper.java:294)
> 	at org.apache.jackrabbit.core.util.db.ConnectionHelper$1.call(ConnectionHelper.java:290)
> 	at org.apache.jackrabbit.core.util.db.ConnectionHelper$RetryManager.doTry(ConnectionHelper.java:559)
> 	at org.apache.jackrabbit.core.util.db.ConnectionHelper.exec(ConnectionHelper.java:290)
> 	at org.apache.jackrabbit.core.data.db.DbDataStore.addRecord(DbDataStore.java:357)
> 	at org.apache.jackrabbit.core.value.BLOBInDataStore.getInstance(BLOBInDataStore.java:132)
> 	at org.apache.jackrabbit.core.value.InternalValue.getBLOBFileValue(InternalValue.java:626)
> 	at org.apache.jackrabbit.core.value.InternalValue.create(InternalValue.java:381)
> 	at org.apache.jackrabbit.core.value.InternalValueFactory.create(InternalValueFactory.java:108)
> 	at org.apache.jackrabbit.core.value.ValueFactoryImpl.createValue(ValueFactoryImpl.java:130)
> 	at org.apache.jackrabbit.core.value.ValueFactoryImpl.createValue(ValueFactoryImpl.java:119)
> 	at org.apache.jackrabbit.core.NodeImpl.setProperty(NodeImpl.java:3467)
> ...
> Could you please give me some advice, how to either avoid creation of the second temp
file in Jackrabbit and solve the exception above, or configure the Jackrabbit to increase
performance by adding large files to the DbDataStore?
> Thank you in advance
> Jiri Frolik

This message was sent by Atlassian JIRA

View raw message