[
https://issues.apache.org/jira/browse/JCR-3754?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13941445#comment-13941445
]
Chetan Mehrotra commented on JCR-3754:
--------------------------------------
Couple of comments wrt patch
{code:java}
public interface AsyncUploadCallback {
public void call(DataIdentifier identifier, File file, RESULT result,
Map<String,Object> args);
public static String EXCEPTION_ARG = "exceptionArg";
public enum RESULT {
/**
* Asynchronous upload has succeeded.
*/
SUCCESS,
/**
* Asynchronous upload has failed.
*/
FAILED,
/**
* Asynchronous upload has been aborted.
*/
ABORTED
};
}
{code}
* As {{AsyncUploadCallback}} is part of API it needs to be documented better.
What is the purpose of file and identifier and what is callback used for
* Using a generic argument map should be avoided. I would prefer if the
callback is modelled on
[FutureCallback|http://docs.guava-libraries.googlecode.com/git-history/v14.0/javadoc/com/google/common/util/concurrent/FutureCallback.html].
The current impl leads to if-else mode of logic in call. Instead they should
be in different methods
{noformat}
+ */
+ protected volatile Map<DataIdentifier, Integer> uploadRetryMap =
Collections.synchronizedMap(new HashMap<DataIdentifier, Integer>());
{noformat}
Use final instead of volatile
{noformat}
+ if (asyncWriteCache.hasEntry(fileName, false)) {
+ synchronized (uploadRetryMap) {
+ Integer retry = uploadRetryMap.get(identifier);
+ if (retry == null) {
+ retry = new Integer(1);
+ } else {
+ retry++;
+ }
+ if (retry <= uploadRetries) {
+ uploadRetryMap.put(identifier, retry);
+ LOG.info("Retring [" + retry
+ + "] times failed upload for dataidentifer [ "
+ + identifier + "]");
+ try {
+ backend.writeAsync(identifier, file, this);
+ } catch (DataStoreException e) {
+
+ }
+ } else {
+ LOG.info("Retries [" + (retry - 1)
+ + "] exhausted for dataidentifer [ "
+ + identifier + "]");
+ uploadRetryMap.remove(identifier);
+ }
+ }
+ }
+ } catch (IOException ie) {
+ LOG.warn(
+ "Cannot retry failed async file upload. Dataidentifer [ "
+ + identifier + "], file [" + file.getAbsolutePath()
+ + "]", ie);
+ }
{noformat}
* DataStoreException getting lost
* Logs should be warning
> [jackrabbit-aws-ext] Add retry logic to S3 asynchronous failed upload
> ---------------------------------------------------------------------
>
> Key: JCR-3754
> URL: https://issues.apache.org/jira/browse/JCR-3754
> Project: Jackrabbit Content Repository
> Issue Type: Improvement
> Components: jackrabbit-data
> Affects Versions: 2.7.5
> Reporter: Shashank Gupta
> Assignee: Chetan Mehrotra
> Fix For: 2.7.6
>
> Attachments: JCR-3754.patch
>
>
> Currently s3 asynchronous uploads are not retried after failure. since
> failed upload file is served from local cache it doesn't hamper datastore
> functionality. During next restart all accumulated failed upload files are
> uploaded to s3 in synchronized manner.
> There should be retry logic for failed s3 asynchronous upload so that failed
> uploads are not accumulated.
--
This message was sent by Atlassian JIRA
(v6.2#6252)