* @throws InterruptedException
*/
private void applyUpdates() throws InterruptedException, ExecutionException {
AbstractWorkspaceImpl workspace = resources.getWorkspace();
ErrorContextBuilder errorContextBuilder = new ErrorContextBuilder();
errorContextBuilder.allWorkToBeDone( queue );
IndexWriter indexWriter = workspace.getIndexWriter( errorContextBuilder );
if ( indexWriter == null ) {
log.cannotOpenIndexWriterCausePreviousError();
return;
}
boolean someFailureHappened = false;
try {
ExecutorService executor = resources.getWorkersExecutor();
int queueSize = queue.size();
Future[] submittedTasks = new Future[ queueSize ];
for ( int i = 0; i < queueSize; i++ ) {
SingleTaskRunnable task = new SingleTaskRunnable( queue.get( i ), resources, indexWriter, monitor );
submittedTasks[i] = executor.submit( task );
}
// now wait for all tasks being completed before releasing our lock
// (this thread waits even in async backend mode)
LinkedList<LuceneWork> failedUpdates = new LinkedList<LuceneWork>();
for ( int i = 0; i < queueSize; i++ ) {
Future task = submittedTasks[i];
try {
task.get();
errorContextBuilder.workCompleted( queue.get( i ) );
}
catch (ExecutionException e) {
someFailureHappened = true;
failedUpdates.add( queue.get( i ) );
errorContextBuilder.errorThatOccurred( e.getCause() );
}
}
if ( someFailureHappened ) {
errorContextBuilder.addAllWorkThatFailed( failedUpdates );
resources.getErrorHandler().handle( errorContextBuilder.createErrorContext() );
}
else {
if ( !streaming ) {
workspace.optimizerPhase();
}