cgswtsu78
2015-01-08 07:24:29 UTC
Hello,
I'm using SVNKit version 1.8.5. I'm getting several SVN Conflict Exceptions
when my application is under heavy load. I have multiple threads
concurrently trying to commit changes to the same files using the
addorUpdateSVNFiles API below. Could it be that one threads gets an out of
date version of a file when calling editor.openFile since another thread has
just updated that file?
*Code:*
//inputDataMap contains the full file path (key) and Stream representing the
actual file (value).
public long addorUpdateSVNFiles(Map<String, ByteArrayOutputStream>
inputDataMap) throws Exception {
Set<String> filesToAdd = new TreeSet<String>();
Set<String> filesToUpdate = new TreeSet<String>();
SVNRepository repo = null;
ISVNEditor editor = null;
try {
repo = openSession(); //gets a SVN connection from a pool
Iterator<Map.Entry<String, ByteArrayOutputStream>> filesIterator
= inputDataMap.entrySet().iterator();
//loop over all the files being committed and determine if the file
exists or not
while (filesIterator.hasNext()) {
Map.Entry<String, ByteArrayOutputStream> entry =
filesIterator.next();
//key contains the full path to the file and the file name
(/150238966/projecta/150239541.xml)
String key = entry.getKey();
SVNNodeKind nodeKind = repo.checkPath(key, -1);
//if the file exists update else add
if (nodeKind == SVNNodeKind.FILE) {
filesToUpdate.add(key);
} else if (nodeKind == SVNNodeKind.NONE) {
filesToAdd.add(key);
} else {
throw new Exception("Unsupported SVN Node" + nodeKind);
}
}
//filter out directories that exists or that are not directories (files)
LinkedHashSet<String> dirsToCreate = findDirectories(filesToAdd);
for (Iterator<String> dirIterator = dirsToCreate.iterator();
dirIterator.hasNext();) {
String directory = dirIterator.next();
if (directory.contains(XML_FILE_EXTENSION)) {
dirIterator.remove();
} else if (isDirectory(directory, repo)) {
dirIterator.remove();
}
}
editor = repo.getCommitEditor("Adding/Updating Files and
Directories", null);
editor.openRoot(-1);
// create missing directories to support the files being added
for (String folder : dirsToCreate) {
editor.addDir(folder, null, -1);
editor.closeDir();
}
// add new files
for (String file : filesToAdd) {
editor.addFile(file, null, -1);
handleFile(editor, file, inputDataMap);
}
// update existing files
for (String file : filesToUpdate) {
editor.openFile(file, -1);
handleFile(editor, file, inputDataMap);
}
editor.closeEdit();
return 0;
} catch (Exception ex) {
//log error
} finally {
closeSession(repo);
}
}
/**
* findDirectories processes directory paths and returns the unique
directories for SVN to create
* in parent child order.
*/
private LinkedHashSet<String> findDirectories(Set<String> directoryList) {
LinkedHashSet<String> fullSet = new LinkedHashSet<String>();
for (String i : directoryList) {
String[] str = removeLeadingSlash(i).split("\\" + File.separator);
StringBuilder sb = new StringBuilder();
for (String s : str) {
sb.append(s);
fullSet.add(sb.toString());
sb.append(File.separator);
}
}
return fullSet;
}
private void handleFile(ISVNEditor editor, String file, Map<String,
ByteArrayOutputStream> data) throws SVNException {
editor.applyTextDelta(file, null);
SVNDeltaGenerator gen = new SVNDeltaGenerator();
String checksum = gen.sendDelta(file, new
ByteArrayInputStream(data.get(file).toByteArray()), editor, true);
editor.closeFile(file, checksum);
}
}
*StackTrace:*
Timestamp="2015-01-08T06:16:35.184" Logger="Caller+0 at
com.test.SvnTest.addorUpdateSVNFiles(SvnTest.java:200)
" LogLevel="ERROR" ThreadId="contentContainer-5"
Class="SvnTest.java:addorUpdateSVNFiles:200" - SVN Add/Update XML File
Failure, retry attempt failed for username:
org.tmatesoft.svn.core.SVNException: svn: E160024: Conflict at
'/150238966/projecta/150239541.xml'
at
org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:64)
at
org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:51)
at
org.tmatesoft.svn.core.internal.io.svn.SVNReader.handleFailureStatus(SVNReader.java:269)
at
org.tmatesoft.svn.core.internal.io.svn.SVNReader.parse(SVNReader.java:248)
at
org.tmatesoft.svn.core.internal.io.svn.SVNConnection.read(SVNConnection.java:272)
at
org.tmatesoft.svn.core.internal.io.svn.SVNCommitEditor.closeEdit(SVNCommitEditor.java:203)
at com.test.SvnTest.addorUpdateSVNFiles(SvnTest.java:192)
at com.test.create(CreateImpl.java:447)
at sun.reflect.GeneratedMethodAccessor273.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
at
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
at
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
at
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
at
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy94.create(Unknown Source)
at com.test.TestListener.onMessage(TestListener.java:38)
at
org.springframework.jms.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:341)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:537)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:497)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:468)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1102)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1094)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:991)
at java.lang.Thread.run(Thread.java:662)
--
View this message in context: http://subversion.1072662.n5.nabble.com/Concurrent-ISVNEditor-openFile-Calls-Throwing-E160024-Conflict-SVNException-tp191424.html
Sent from the SVNKit - Users mailing list archive at Nabble.com.
I'm using SVNKit version 1.8.5. I'm getting several SVN Conflict Exceptions
when my application is under heavy load. I have multiple threads
concurrently trying to commit changes to the same files using the
addorUpdateSVNFiles API below. Could it be that one threads gets an out of
date version of a file when calling editor.openFile since another thread has
just updated that file?
*Code:*
//inputDataMap contains the full file path (key) and Stream representing the
actual file (value).
public long addorUpdateSVNFiles(Map<String, ByteArrayOutputStream>
inputDataMap) throws Exception {
Set<String> filesToAdd = new TreeSet<String>();
Set<String> filesToUpdate = new TreeSet<String>();
SVNRepository repo = null;
ISVNEditor editor = null;
try {
repo = openSession(); //gets a SVN connection from a pool
Iterator<Map.Entry<String, ByteArrayOutputStream>> filesIterator
= inputDataMap.entrySet().iterator();
//loop over all the files being committed and determine if the file
exists or not
while (filesIterator.hasNext()) {
Map.Entry<String, ByteArrayOutputStream> entry =
filesIterator.next();
//key contains the full path to the file and the file name
(/150238966/projecta/150239541.xml)
String key = entry.getKey();
SVNNodeKind nodeKind = repo.checkPath(key, -1);
//if the file exists update else add
if (nodeKind == SVNNodeKind.FILE) {
filesToUpdate.add(key);
} else if (nodeKind == SVNNodeKind.NONE) {
filesToAdd.add(key);
} else {
throw new Exception("Unsupported SVN Node" + nodeKind);
}
}
//filter out directories that exists or that are not directories (files)
LinkedHashSet<String> dirsToCreate = findDirectories(filesToAdd);
for (Iterator<String> dirIterator = dirsToCreate.iterator();
dirIterator.hasNext();) {
String directory = dirIterator.next();
if (directory.contains(XML_FILE_EXTENSION)) {
dirIterator.remove();
} else if (isDirectory(directory, repo)) {
dirIterator.remove();
}
}
editor = repo.getCommitEditor("Adding/Updating Files and
Directories", null);
editor.openRoot(-1);
// create missing directories to support the files being added
for (String folder : dirsToCreate) {
editor.addDir(folder, null, -1);
editor.closeDir();
}
// add new files
for (String file : filesToAdd) {
editor.addFile(file, null, -1);
handleFile(editor, file, inputDataMap);
}
// update existing files
for (String file : filesToUpdate) {
editor.openFile(file, -1);
handleFile(editor, file, inputDataMap);
}
editor.closeEdit();
return 0;
} catch (Exception ex) {
//log error
} finally {
closeSession(repo);
}
}
/**
* findDirectories processes directory paths and returns the unique
directories for SVN to create
* in parent child order.
*/
private LinkedHashSet<String> findDirectories(Set<String> directoryList) {
LinkedHashSet<String> fullSet = new LinkedHashSet<String>();
for (String i : directoryList) {
String[] str = removeLeadingSlash(i).split("\\" + File.separator);
StringBuilder sb = new StringBuilder();
for (String s : str) {
sb.append(s);
fullSet.add(sb.toString());
sb.append(File.separator);
}
}
return fullSet;
}
private void handleFile(ISVNEditor editor, String file, Map<String,
ByteArrayOutputStream> data) throws SVNException {
editor.applyTextDelta(file, null);
SVNDeltaGenerator gen = new SVNDeltaGenerator();
String checksum = gen.sendDelta(file, new
ByteArrayInputStream(data.get(file).toByteArray()), editor, true);
editor.closeFile(file, checksum);
}
}
*StackTrace:*
Timestamp="2015-01-08T06:16:35.184" Logger="Caller+0 at
com.test.SvnTest.addorUpdateSVNFiles(SvnTest.java:200)
" LogLevel="ERROR" ThreadId="contentContainer-5"
Class="SvnTest.java:addorUpdateSVNFiles:200" - SVN Add/Update XML File
Failure, retry attempt failed for username:
org.tmatesoft.svn.core.SVNException: svn: E160024: Conflict at
'/150238966/projecta/150239541.xml'
at
org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:64)
at
org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:51)
at
org.tmatesoft.svn.core.internal.io.svn.SVNReader.handleFailureStatus(SVNReader.java:269)
at
org.tmatesoft.svn.core.internal.io.svn.SVNReader.parse(SVNReader.java:248)
at
org.tmatesoft.svn.core.internal.io.svn.SVNConnection.read(SVNConnection.java:272)
at
org.tmatesoft.svn.core.internal.io.svn.SVNCommitEditor.closeEdit(SVNCommitEditor.java:203)
at com.test.SvnTest.addorUpdateSVNFiles(SvnTest.java:192)
at com.test.create(CreateImpl.java:447)
at sun.reflect.GeneratedMethodAccessor273.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
at
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
at
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
at
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
at
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy94.create(Unknown Source)
at com.test.TestListener.onMessage(TestListener.java:38)
at
org.springframework.jms.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:341)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:537)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:497)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:468)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1102)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1094)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:991)
at java.lang.Thread.run(Thread.java:662)
--
View this message in context: http://subversion.1072662.n5.nabble.com/Concurrent-ISVNEditor-openFile-Calls-Throwing-E160024-Conflict-SVNException-tp191424.html
Sent from the SVNKit - Users mailing list archive at Nabble.com.