mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
ALF-12273: Merge V4.0-BUG-FIX to HEAD
33119: Merge V3.4-BUG-FIX (3.4.8) to V4.0-BUG-FIX (4.0.1) 33099: ALF-10412 Nonreducing 100% CPU Uploading Large Files to Share Site Document Library ALF-10976 Excel files bigger than 2mb cause soffice.exe to take 100% of one CPU for more than 2 minutes in previews. - Polish TransformerDebug - Better config for txt and xlsx to swf 33095: ALF-10412 Nonreducing 100% CPU Uploading Large Files to Share Site Document Library ALF-10976 Excel files bigger than 2mb cause soffice.exe to take 100% of one CPU for more than 2 minutes in previews. - Improvements to TransformerDebug so that calls to getTransformers use trace rather than debug level logging allowing one to see the wood for the trees 33016: ALF-10412 Nonreducing 100% CPU Uploading Large Files to Share Site Document Library ALF-10976 Excel files bigger than 2mb cause soffice.exe to take 100% of one CPU for more than 2 minutes in previews. - fix build errors - may not get all of them as not tested on Linux 33005: ALF-10412 Nonreducing 100% CPU Uploading Large Files to Share Site Document Library ALF-10976 Excel files bigger than 2mb cause soffice.exe to take 100% of one CPU for more than 2 minutes in previews. - Disable transformers if the source txt or xlsx is too large - avoids transforms that don't finish txt limit is 5MB xlsx limit is 1MB - Added a general 2 minute timeout added (ignored by JOD transformers - which already have a 2 minute timeout and OpenOffice transformers - would require more work) - Previous commit already limited txt -> pdf -> png so that only the 1st pdf page was created when creating a doclib icon - Earlier commit already reduced the priority of the background Thread used for transformations so that user interaction did not suffer. 33004: ALF-10412 Nonreducing 100% CPU Uploading Large Files to Share Site Document Library ALF-10976 Excel files bigger than 2mb cause soffice.exe to take 100% of one CPU for more than 2 minutes in previews. - Added time, size and page limits to transformer configuration to allow one to avoid costly transformations and to stop them if they do occur. Limits avoid a transformer being selected if the source is too large, or make it throw and Exception or discard data after a given time, KBytes read or pages created. - Page limits currently only used by TextToPdfContentTransformer for thumbnail (icon) creation. - Time, Size and Page limits are currently ignored by JodContentTransformer and OpenOfficeContentTransformerWorker once running but the max source size limits may be used to avoid the selection of the transformer in the first place. - TransformerDebug added to be able to see what is going on. A real eye opener! log4j org.alfresco.repo.content.transform.TransformerDebug 32136: ALF-10412 Nonreducing 100% CPU Uploading Large Files to Share Site Document Library Reducing the priority of the async thread pool that is used to perform the transformations so that normal activity (and even garbage collection) is not interrupted by transformations. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@33223 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -35,6 +35,7 @@ import org.alfresco.repo.content.cleanup.EagerContentStoreCleaner;
|
||||
import org.alfresco.repo.content.filestore.FileContentStore;
|
||||
import org.alfresco.repo.content.transform.ContentTransformer;
|
||||
import org.alfresco.repo.content.transform.ContentTransformerRegistry;
|
||||
import org.alfresco.repo.content.transform.TransformerDebug;
|
||||
import org.alfresco.repo.node.NodeServicePolicies;
|
||||
import org.alfresco.repo.policy.ClassPolicyDelegate;
|
||||
import org.alfresco.repo.policy.JavaBehaviour;
|
||||
@@ -89,7 +90,8 @@ public class ContentServiceImpl implements ContentService, ApplicationContextAwa
|
||||
private MimetypeService mimetypeService;
|
||||
private RetryingTransactionHelper transactionHelper;
|
||||
private ApplicationContext applicationContext;
|
||||
|
||||
protected TransformerDebug transformerDebug;
|
||||
|
||||
/** a registry of all available content transformers */
|
||||
private ContentTransformerRegistry transformerRegistry;
|
||||
/** The cleaner that will ensure that rollbacks clean up after themselves */
|
||||
@@ -177,6 +179,15 @@ public class ContentServiceImpl implements ContentService, ApplicationContextAwa
|
||||
this.applicationContext = applicationContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper setter of the transformer debug.
|
||||
* @param transformerDebug
|
||||
*/
|
||||
public void setTransformerDebug(TransformerDebug transformerDebug)
|
||||
{
|
||||
this.transformerDebug = transformerDebug;
|
||||
}
|
||||
|
||||
/**
|
||||
* Service initialise
|
||||
*/
|
||||
@@ -559,40 +570,74 @@ public class ContentServiceImpl implements ContentService, ApplicationContextAwa
|
||||
{
|
||||
throw new AlfrescoRuntimeException("The content writer mimetype must be set: " + writer);
|
||||
}
|
||||
// look for a transformer
|
||||
ContentTransformer transformer = transformerRegistry.getTransformer(sourceMimetype, targetMimetype, options);
|
||||
if (transformer == null)
|
||||
|
||||
try
|
||||
{
|
||||
throw new NoTransformerException(sourceMimetype, targetMimetype);
|
||||
// look for a transformer
|
||||
transformerDebug.pushAvailable(reader.getContentUrl(), sourceMimetype, targetMimetype);
|
||||
long sourceSize = reader.getSize();
|
||||
List<ContentTransformer> transformers = getActiveTransformers(sourceMimetype, sourceSize, targetMimetype, options);
|
||||
transformerDebug.availableTransformers(transformers, sourceSize, "ContentService.transform(...)");
|
||||
|
||||
if (transformers.isEmpty())
|
||||
{
|
||||
throw new NoTransformerException(sourceMimetype, targetMimetype);
|
||||
}
|
||||
|
||||
// we have a transformer, so do it
|
||||
ContentTransformer transformer = transformers.size() == 0 ? null : transformers.get(0);
|
||||
transformer.transform(reader, writer, options);
|
||||
// done
|
||||
}
|
||||
finally
|
||||
{
|
||||
transformerDebug.popAvailable();
|
||||
}
|
||||
// we have a transformer, so do it
|
||||
transformer.transform(reader, writer, options);
|
||||
// done
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @see org.alfresco.repo.content.transform.ContentTransformerRegistry
|
||||
* @see org.alfresco.repo.content.transform.ContentTransformer
|
||||
*/
|
||||
public ContentTransformer getTransformer(String sourceMimetype, String targetMimetype)
|
||||
{
|
||||
return getTransformer(sourceMimetype, targetMimetype, new TransformationOptions());
|
||||
return getTransformer(null, sourceMimetype, -1, targetMimetype, new TransformationOptions());
|
||||
}
|
||||
|
||||
public ContentTransformer getTransformer(String sourceMimetype, String targetMimetype, TransformationOptions options)
|
||||
{
|
||||
return getTransformer(null, sourceMimetype, -1, targetMimetype, options);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.alfresco.service.cmr.repository.ContentService#getTransformer(java.lang.String, java.lang.String, org.alfresco.service.cmr.repository.TransformationOptions)
|
||||
* @see org.alfresco.service.cmr.repository.ContentService#getTransformer(String, java.lang.String, long, java.lang.String, org.alfresco.service.cmr.repository.TransformationOptions)
|
||||
*/
|
||||
public ContentTransformer getTransformer(String sourceMimetype, String targetMimetype, TransformationOptions options)
|
||||
public ContentTransformer getTransformer(String sourceUrl, String sourceMimetype, long sourceSize, String targetMimetype, TransformationOptions options)
|
||||
{
|
||||
return transformerRegistry.getTransformer(sourceMimetype, targetMimetype, options);
|
||||
try
|
||||
{
|
||||
// look for a transformer
|
||||
transformerDebug.pushAvailable(sourceUrl, sourceMimetype, targetMimetype);
|
||||
List<ContentTransformer> transformers = getActiveTransformers(sourceMimetype, sourceSize, targetMimetype, options);
|
||||
transformerDebug.availableTransformers(transformers, sourceSize, "ContentService.getTransformer(...)");
|
||||
return (transformers.isEmpty()) ? null : transformers.get(0);
|
||||
}
|
||||
finally
|
||||
{
|
||||
transformerDebug.popAvailable();
|
||||
}
|
||||
}
|
||||
|
||||
public List<ContentTransformer> getActiveTransformers(String sourceMimetype, String targetMimetype, TransformationOptions options)
|
||||
{
|
||||
return transformerRegistry.getActiveTransformers(sourceMimetype, targetMimetype, options);
|
||||
return getActiveTransformers(sourceMimetype, -1, targetMimetype, options);
|
||||
}
|
||||
|
||||
public List<ContentTransformer> getActiveTransformers(String sourceMimetype, long sourceSize, String targetMimetype, TransformationOptions options)
|
||||
{
|
||||
return transformerRegistry.getActiveTransformers(sourceMimetype, sourceSize, targetMimetype, options);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @see org.alfresco.service.cmr.repository.ContentService#getImageTransformer()
|
||||
*/
|
||||
@@ -628,7 +673,7 @@ public class ContentServiceImpl implements ContentService, ApplicationContextAwa
|
||||
}
|
||||
|
||||
// look for a transformer
|
||||
ContentTransformer transformer = transformerRegistry.getTransformer(sourceMimetype, targetMimetype, options);
|
||||
ContentTransformer transformer = transformerRegistry.getTransformer(sourceMimetype, reader.getSize(), targetMimetype, options);
|
||||
return (transformer != null);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user