jackrabbit-oak-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Vikas Saurabh (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (OAK-8512) Without prefetch CopyOnRead opens index files remotely even if they are locally available
Date Mon, 29 Jul 2019 02:40:00 GMT

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

Vikas Saurabh updated OAK-8512:
-------------------------------
    Summary: Without prefetch CopyOnRead opens index files remotely even if they are locally
available  (was: Without prefetch CopyOnRead opens index file remoted)

> Without prefetch CopyOnRead opens index files remotely even if they are locally available
> -----------------------------------------------------------------------------------------
>
>                 Key: OAK-8512
>                 URL: https://issues.apache.org/jira/browse/OAK-8512
>             Project: Jackrabbit Oak
>          Issue Type: Bug
>            Reporter: Vikas Saurabh
>            Priority: Trivial
>
> Without prefetch enabled, CopyOnReadDirectory schedules a copy of file when {{Directory#openInput}}
is invoked. This happens even if there might a copy of file completely available already (maybe
due to CopyOnWriteDirectory). While the scheduled copy would check if the file is valid already
but by that time often index file are accessed remotely.
> The fix is fairly simple - don't schedule if file exists locally and passes our weak
test that length matches what we expect \[0].
> But, since we strongly advise to enable prefetch, the priority of the issue is minor.
Perf impact would be significant during application start so sev should high I guess.
> \[0]:
> {noformat}
> $ git diff oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/CopyOnReadDirectory.java
> diff --git a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/CopyOnReadDirectory.java
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/CopyOnReadDirectory.java
> index b6b16286d2..d49e5d9ea7 100644
> --- a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/CopyOnReadDirectory.java
> +++ b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/CopyOnReadDirectory.java
> @@ -126,11 +126,12 @@ public class CopyOnReadDirectory extends FilterDirectory {
>          CORFileReference toPut = new CORFileReference(name);
>          CORFileReference old = files.putIfAbsent(name, toPut);
>          if (old == null) {
> -            log.trace("[{}] scheduled local copy for {}", indexPath, name);
> -            copy(toPut);
> +            if (copy(toPut)) {
> +                log.trace("[{}] scheduled local copy for {}", indexPath, name);
> +            }
>          }
>  
> -        //If immediate executor is used the result would be ready right away
> +        //If immediate executor is used OR local file already existed, the result would
be ready right away
>          if (toPut.isLocalValid()) {
>              log.trace("[{}] opening new local file {}", indexPath, name);
>              return toPut.openLocalInput(context);
> @@ -145,7 +146,21 @@ public class CopyOnReadDirectory extends FilterDirectory {
>          return local;
>      }
>  
> -    private void copy(final CORFileReference reference) {
> +    private boolean copy(final CORFileReference reference) {
> +        // quick sanity check
> +        if (reference.isLocalValid()) {
> +            return false;
> +        }
> +        try {
> +            String name = reference.name;
> +            if (local.fileExists(name) && local.fileLength(name) == remote.fileLength(name))
{
> +                reference.markValid();
> +                return false;
> +            }
> +        } catch (IOException e) {
> +            // ignore
> +        }
> +
>          indexCopier.scheduledForCopy();
>          executor.execute(new Runnable() {
>              @Override
> @@ -154,6 +169,8 @@ public class CopyOnReadDirectory extends FilterDirectory {
>                  copyFilesToLocal(reference, true, true);
>              }
>          });
> +
> +        return true;
>      }
> {noformat}



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

Mime
View raw message