Description
Today you cannot do realtime-gets through CloudSolrServer, because it will not route the request to the correct replica (the leader-replica of the shard where the document to be fetched lives according to routing rules)
Doing realtime-gets from clients are important in several scenarios. For example in common optimistic locking scenario. Pseudo-code:
public void createOrUpdateDoc(String id, ChangeInfo changes) { outherLoop: while(true) { try { // Assume that document with id does not exist already // Just try to store it as a new document SolrInputDocument newDoc = createNewSolrInputDocument(id, changes); sendUpdateRequestToSolr(newDoc); return; } catch (DocumentAlreadyExists e) { // Ok the document already existed while(true) { // Fetch the existing document - realtime-get so that you do not // have to wait until next commit to be able to fetch it, if the document // was created/updated after last commit SolrDocument fetchedDoc = realTimeGet(id); // Merge the changes into the existing document // Including copy of _version_ from fetchedDoc to updatedDoc SolrInputDocument updatedDoc = merge(fetchedDoc, changes); // Try to store the updated document try { sendUpdateRequestToSolr(updatedDoc); return; } catch (VersionConflict e) { // Someone updated the doc, between my fetch and update // Ignore, just take another round in the inner while(true)-loop } catch (DocumentDoesNotExist e) { // Someone deleted the document since when I tried to // create it as a new document the first time // Will create it again by taking another round in outher // while(true)-loop continue outherLoop; } } } } }
Sorry if the code is not perfect, but I just wrote it directly here - I sure you get the idea.
I would like to enable realtime-get through CloudSolrServer in order to be able to do scenarios as e.g. the one shown above