[ https://issues.apache.org/jira/browse/JCR-3568?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Stefan Guggisberg updated JCR-3568: ----------------------------------- Component/s: (was: jackrabbit-api) jackrabbit-webdav Priority: Major (was: Blocker) this is not a jackrabbit-core issue. i ran your test code against a local repository with the default configuration (created with "new TransientRepository()"). i used test files with a total size of about 1gb. there were no temp files created. this might be a sling issue or a webdav-client or -server issue. to further narrow down the problem please run your test with the following configurations: - standalone repository accessed in-proc (not deployed in sling) - standalone repository server accessed via webdav (not deployed in sling) > Property.getBinary().getStream() files in tempDir not removed by > InputStream.close() nor by Binary.dispose() > ------------------------------------------------------------------------------------------------------------- > > Key: JCR-3568 > URL: https://issues.apache.org/jira/browse/JCR-3568 > Project: Jackrabbit Content Repository > Issue Type: Bug > Components: jackrabbit-webdav > Affects Versions: 2.6 > Environment: Windows 7 Pro, Java 6.0.39, WebDAV, JCR 2.0 > Reporter: Ulrich Schmidt > > I need to inspect the the files stored to the jcr:data-Property in Node > jcr:content which is a subnode of a nt:fille-Node. Access mode is WebDAV > using JCR 2.0-API. > Jackrabbit does not drop the tempfiles created by the command > Property.getBinary().getStream() by the closing instruchtions > InputStream.close() nor Binary.dispose(). I get a RepositoryException "No > space left on device" when der tempsace becomes full. > The executed code is; > public class DownloadLoopMain { > private final static Logger LOGGER = > LoggerFactory.getLogger("Test.DownloadLoopMain"); > String repository = "http://localhost:8080/server"; > String user="admin"; > String password="admin"; > Session session; > File temp = new File(System.getProperty("java.io.tmpdir")); > List<String> nodeList = new ArrayList<String>(); > public DownloadLoopMain() throws Exception { > LOGGER.info("TempDir=" + temp.getPath()); > long totalsize=0; > > connectRepository(); > buildNodeList(); > List<String[]> tempfiles = getTempFiles(temp.listFiles()); > LOGGER.info("Start with number of files in Tempdir:" + > tempfiles.size()); > for (String node : nodeList) { > LOGGER.info("Retrieve node " + node); > Node currentNode=session.getNode(node); > Node fileNode = currentNode.getNode("jcr:content"); > Property jcrdata = fileNode.getProperty("jcr:data"); > Binary fileBin=jcrdata.getBinary(); > long filesize=fileBin.getSize(); > totalsize+=filesize; > InputStream file = fileBin.getStream(); > > LOGGER.info("Now we have number of files in Tempdir:" + > tempfiles.size()); > > List<String[]> newTempfiles = > getTempFiles(temp.listFiles()); > // Display new files in temp-directory > compareTempfiles("new", newTempfiles, tempfiles); > > // Display files gone from temp-directory > compareTempfiles("gone", tempfiles, newTempfiles); > > tempfiles=newTempfiles; > > file.close(); > fileBin.dispose(); > } > } > > > /** > * Compare List of tempfiles. > * @param intend > * @param list1 > * @param list2 > */ > public void compareTempfiles(String intend, List<String[]> list1, > List<String[]> list2 ) { > for (String[] list1file : list1) { > boolean known=false; > for (int i=0; i< list2.size(); i++) { > String[] list2file=list2.get(i); > if (list1file[0].equals(list2file[0])) { > known=true; > break; > } > } > if (!known) { > LOGGER.info(intend + " tempfile=" + > list1file[0]+ " " + list1file[1]); > } > } > } > public List<String[]> getTempFiles(File[] files) { > List<String[]> filesList = new ArrayList<String[]>(); > for (File file : files) { > String[] filedesc = new String[2]; > filedesc[0]=file.getName(); > filedesc[1]=file.length()+""; > filesList.add(filedesc); > } > return filesList; > } > > public void buildNodeList() throws IOException { > String path ="E:/Jackrabbit/logs/Populate-Files.log"; > File file = new File(path); > BufferedReader br = new BufferedReader(new FileReader(file)); > String line; > while ((line=br.readLine())!=null) { > nodeList.add(line); > } > br.close(); > String > knownPath="/content/dam/ebase/privatebase/en/media/franz/2012/11_november/1211_VV-Interview_en_640x320_VP8.webm/jcr:content/renditions/original"; > > } > private void connectRepository() throws Exception { > LOGGER.info("About ot connect to " + this.repository); > Repository repository = > org.apache.jackrabbit.commons.JcrUtils.getRepository(this.repository); > char[] password=this.password.toCharArray(); > Credentials cred= new SimpleCredentials(this.user, password); > session = repository.login(cred); > LOGGER.info("connected"); > LOGGER.info("Workspace: " + > session.getWorkspace().getName()); > boolean writeable = > repository.getDescriptorValue(Repository.WRITE_SUPPORTED).getBoolean(); > LOGGER.info("Write supported=" + writeable); > } > public static void main(String[] args) throws Exception { > LOGGER.info("Program-Start"); > DownloadLoopMain dlm = new DownloadLoopMain(); > } > } > Based on a list of repository nodes it retrieves node by node from the > repository an inspects the temp-directory. After every step it displays the > number of files in the tempdir, the name and size of the files which are new > and those which are gone since last inspection. > This proofs, that for each Property.getBinary().getStream() jackrabbit > creates six identical files from the jcr:data-property in the temdir and it > proofs that these files are not deleted by the instructions: > InputStream.close(); > Binary.dispose(); > I tested this by installing the latest jackrabbit-jar > "org.apache.sling.launchpad-6-standalone.jar" from the Sling-Webpage and > populating the repository with several files. > Please provide a patch to make sure deletion of the temporary files is done > in time when issuing the close and/or dispose instruction. > Please rreduce the number of identical temporary files created by the > Property.getBinary().getStream() instruction. In the test, each of the files > was 90MB in size. For each of the instructions I need 550MB storage in the > tempdir. > Thanks in advance, > Ulrich -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira