[ 
https://issues.apache.org/jira/browse/OAK-8343?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16850780#comment-16850780
 ] 

Thomas Mueller commented on OAK-8343:
-------------------------------------

Using an index that is not yet indexed is of course problematic. It would 
require quite many changes. The start could be:

{noformat}
IndexTracker.java:
         if (!node.hasChildNode(INDEX_DEFINITION_NODE)) {
+            // no stored index definition
+            if (waitForIndex && 
node.hasProperty(IndexConstants.WAIT_FOR_INDEX)) {
+                log.info("Possibly using index " + indexPath + " even if it is 
not ready");
+                // this will internally use the configured (not the stored) 
index definition
+                return new LuceneIndexDefinition(root, node,
+                        
LuceneIndexDefinition.determineIndexFormatVersion(node),
+                        LuceneIndexDefinition.determineUniqueId(node),
+                        indexPath
+                        );
+            }
+            // usually, wait until it's ready
             return null;
         }
{noformat}


> Allow queries to be delayed until an index is available
> -------------------------------------------------------
>
>                 Key: OAK-8343
>                 URL: https://issues.apache.org/jira/browse/OAK-8343
>             Project: Jackrabbit Oak
>          Issue Type: Improvement
>          Components: lucene, query
>            Reporter: Thomas Mueller
>            Assignee: Thomas Mueller
>            Priority: Major
>             Fix For: 1.14.0
>
>         Attachments: OAK-8343-b.patch, OAK-8343.patch
>
>
> Currently, indexes are built asynchronously. That is, if an index definition 
> is added, the index is eventually built, but it's quite hard to say when it 
> is ready for queries. This can be specially a problem right after the initial 
> repository initialization, or after an upgrade.
> In theory, system startup could be delayed until all indexes are ready (e.g. 
> set the "reindex" flag for important indexes, and at startup, wait until the 
> "reindex" flag is set to "false"). However, doing that would block threads 
> that _don't_ need an index. It would be better to only block threads that 
> actually do run queries. That would make startup deterministic, without 
> delaying other threads unnecessarily.
> To solve the problem, we can add a property "waitForIndex" in the index 
> definition (just Lucene indexes is fine for now, as those are the important 
> asynchronous ones). If set, then queries that potentially use those indexes 
> are delayed, until the indexes are ready for sure. Reindex would need to 
> remove that property (the same as it removes e.g. refresh or sets reindex to 
> false). For added security, queries are only blocked as long as "reindex" is 
> also set to true (this ensures that waitForIndex is removed eventually), and 
> waiting should time out after 2 minutes, to ensure the feature doesn't block 
> startup forever if indexing fails for some reason.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to