Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] For 1.2 stream: Indexer Patch


This patch has a bunch of indexer error handling improvements and is meant for the 1.2 stream.

In this patch:

- Improved error handling for Indexer
- Improved error handling for MatchLocator
- Bounds checking for mappings in IncudeEntry
- Improved error handling for Merge operations
- Source file name fitering for recreating an already existing index

Test Suite run on Windows.

- Bogdan


Index: index/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/index/ChangeLog,v
retrieving revision 1.24.2.3
diff -u -r1.24.2.3 ChangeLog
--- index/ChangeLog	10 Feb 2004 18:30:32 -0000	1.24.2.3
+++ index/ChangeLog	13 Feb 2004 19:24:00 -0000
@@ -1,16 +1,27 @@
-2004-02-10 Bogdan Gheorghe
+2004-02-13 Bogdan Gheorghe
 	PR 51232
+
+	- Added mapping range checking to IncludeEntry to avoid out of bounds exceptions
+	- Added error handling to MergeFactory to handle problems during the save operation
+	- Added source file name filtering for the recreate an already existing index scenario in
+	  IndexAllProject. 
+	- Added more robust error handling to SourceIndexer
+	- Added error handling routine to Util.getFileCharContent() to deal with potential out of 
+	  memory crash
+	
+	* index/org/eclipse/cdt/internal/core/index/impl/IncludeEntry.java
+	* index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java
+	* index/org/eclipse/cdt/internal/core/index/search/Util.java
+	* index/org/eclipse/cdt/internal/core/index/search/indexing/IndexAllProject.java
+	* index/org/eclipse/cdt/internal/core/index/search/indexing/SourceIndexer.java
+	* index/org/eclipse/cdt/internal/core/index/search/indexing/AddFolderToIndex.java
+	
+2004-02-10 Bogdan Gheorghe
 	
-	- Added a layer of separation between the parser and the indexer: we now
-	  create a worker thread to run the parser in. This allows the indexer to 
-	  finish all scheduled jobs regardless of how the parser performs on
-	  individual files (i.e. indexing no longer affected by parser failures)
-	  
 	- Modified some of the stored index block reading routines to use separate
 	  counters, thus avoiding potential EOF exceptions.
 	  
     * index/org/eclipse/cdt/internal/core/index/impl/BlocksIndexInput.java
-	* index/org/eclipse/cdt/internal/core/index/search/indexing/SourceIndexer.java
 	
 2004-02-03 Alain Magloire
 
Index: index/org/eclipse/cdt/internal/core/Util.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/Util.java,v
retrieving revision 1.2.2.1
diff -u -r1.2.2.1 Util.java
--- index/org/eclipse/cdt/internal/core/Util.java	27 Oct 2003 20:44:57 -0000	1.2.2.1
+++ index/org/eclipse/cdt/internal/core/Util.java	13 Feb 2004 19:24:01 -0000
@@ -148,7 +148,11 @@
 		try {
 			stream = new BufferedInputStream(new FileInputStream(file));
 			return Util.getInputStreamAsCharArray(stream, (int) file.length(), encoding);
-		} finally {
+		}
+		catch (OutOfMemoryError er){
+			return null;
+		}
+		 finally {
 			if (stream != null) {
 				try {
 					stream.close();
Index: index/org/eclipse/cdt/internal/core/index/impl/IncludeEntry.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/IncludeEntry.java,v
retrieving revision 1.1
diff -u -r1.1 IncludeEntry.java
--- index/org/eclipse/cdt/internal/core/index/impl/IncludeEntry.java	26 Sep 2003 17:53:31 -0000	1.1
+++ index/org/eclipse/cdt/internal/core/index/impl/IncludeEntry.java	13 Feb 2004 19:24:01 -0000
@@ -157,8 +157,12 @@
 	 */
 	public void mapRefs(int[] mappings) {
 		int position= 0;
+
 		for (int i= 0; i < fNumRefs; i++) {
-			int map= mappings[fRefs[i]];
+			//Take care that the reference is actually within the bounds of the mapping
+			int map= -1;
+			if(fRefs[i] >= 0 && fRefs[i] < mappings.length) 
+				map= mappings[fRefs[i]];
 			if (map != -1 && map != 0)
 				fRefs[position++]= map;
 		}
Index: index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java,v
retrieving revision 1.3
diff -u -r1.3 MergeFactory.java
--- index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java	26 Sep 2003 17:53:31 -0000	1.3
+++ index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java	13 Feb 2004 19:24:01 -0000
@@ -13,6 +13,9 @@
 import java.io.IOException;
 import java.util.Map;
 
+import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
+import org.eclipse.cdt.internal.core.search.processing.JobManager;
+
 /**
  * A mergeFactory is used to merge 2 indexes into one. One of the indexes 
  * (oldIndex) is on the disk and the other(addsIndex) is in memory.
@@ -81,7 +84,24 @@
 			mergeReferences();
 			mergeIncludes();
 			mergeOutput.flush();
-		} finally {
+		} 
+		catch ( Exception ex ){
+			if (ex instanceof IOException)
+			  throw (IOException) ex;
+			else {
+			  if (IndexManager.VERBOSE) {
+				   JobManager.verbose("-> got the following exception during merge:"); //$NON-NLS-1$
+				   ex.printStackTrace();
+			  }
+			}
+		}
+		catch ( VirtualMachineError er ) {
+			if (IndexManager.VERBOSE) {
+			  JobManager.verbose("-> got the following exception during merge:"); //$NON-NLS-1$
+			  er.printStackTrace();
+			} 
+		}
+		finally {
 			//closes everything
 			oldInput.close();
 			addsInput.close();
Index: index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java,v
retrieving revision 1.5
diff -u -r1.5 AddFolderToIndex.java
--- index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java	9 Sep 2003 17:53:51 -0000	1.5
+++ index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java	13 Feb 2004 19:24:01 -0000
@@ -58,13 +58,12 @@
 					public boolean visit(IResourceProxy proxy) throws CoreException {
 						switch(proxy.getType()) {
 							case IResource.FILE :
-//							TODO: BOG Put the file name checking back
-								//if (Util.isJavaFileName(proxy.getName())) {
+								if (Util.isCCFileName(proxy.getName())) {
 									IResource resource = proxy.requestResource();
 									if (pattern == null || !Util.isExcluded(resource, pattern))
 										indexManager.addSource((IFile)resource, container);
-								//}
-								//return false;
+								}
+								return false;
 							case IResource.FOLDER :
 								if (pattern != null && Util.isExcluded(proxy.requestResource(), pattern))
 									return false;
Index: index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java,v
retrieving revision 1.6.2.1
diff -u -r1.6.2.1 IndexAllProject.java
--- index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java	27 Oct 2003 20:44:57 -0000	1.6.2.1
+++ index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java	13 Feb 2004 19:24:01 -0000
@@ -124,9 +124,8 @@
 									public boolean visit(IResourceProxy proxy) {
 										if (isCancelled) return false;
 										switch(proxy.getType()) {
-											case IResource.FILE :
-//											TODO: BOG Put the file name checking back
-												//if (Util.isCCFileName(proxy.getName())) {
+											case IResource.FILE :					
+												if (Util.isCCFileName(proxy.getName())) {
 													IResource resource = proxy.requestResource();
 													IPath path = resource.getLocation();
 													if (path != null && (patterns == null || !Util.isExcluded(resource, patterns))) {
@@ -136,8 +135,8 @@
 																? (Object) resource
 																: (Object) OK);
 													}
-												//}
-												//return false;
+												}
+												return false;
 											case IResource.FOLDER :
 												if (patterns != null && Util.isExcluded(proxy.requestResource(), patterns))
 													return false;
Index: index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java,v
retrieving revision 1.13.2.1
diff -u -r1.13.2.1 SourceIndexer.java
--- index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java	10 Feb 2004 18:30:32 -0000	1.13.2.1
+++ index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java	13 Feb 2004 19:24:01 -0000
@@ -88,28 +88,39 @@
 							ParserFactory.createScanner( new StringReader( document.getStringContent() ), resourceFile.getLocation().toOSString(), scanInfo, ParserMode.COMPLETE_PARSE, language, requestor ), 
 							requestor, ParserMode.COMPLETE_PARSE, language );
 		
-		ParserRunner p = new ParserRunner(parser);
-		Thread t = new Thread(p, "CDT Indexer Parser Runner");
-		t.start();
-		
+
 		try{
-			t.join();
+			boolean retVal = parser.parse();
+			
+			if (!retVal)
+				org.eclipse.cdt.internal.core.model.Util.log(null, "Failed to index " + resourceFile.getFullPath(), ICLogConstants.CDT);
+
+			if (AbstractIndexer.VERBOSE){
+				if (!retVal)
+					AbstractIndexer.verbose("PARSE FAILED " + resourceFile.getName().toString());
+				else
+					AbstractIndexer.verbose("PARSE SUCCEEDED " + resourceFile.getName().toString());			
+			}	
 		}
-		catch (InterruptedException e){
-			org.eclipse.cdt.internal.core.model.Util.log(null, "Parser Runner InterruptedException - file: " + resourceFile.getFullPath(), ICLogConstants.CDT);
+		catch ( VirtualMachineError vmErr){
+			if (vmErr instanceof OutOfMemoryError){
+				org.eclipse.cdt.internal.core.model.Util.log(null, "Out Of Memory error: " + vmErr.getMessage() + " on File: " + resourceFile.getName(), ICLogConstants.CDT);
+			}
+		}
+		catch ( Exception ex ){
+			if (ex instanceof IOException)
+			  throw (IOException) ex;
+		}
+		finally{
+			//Release all resources
+			parser=null;
+			currentProject = null;
+			requestor = null;
+			provider = null;
+			scanInfo=null;
 		}
 		
-		boolean retVal = p.getResult();
-		
-		if (!retVal)
-			org.eclipse.cdt.internal.core.model.Util.log(null, "Failed to index " + resourceFile.getFullPath(), ICLogConstants.CDT);
 		
-		if (AbstractIndexer.VERBOSE){
-			if (!retVal)
-				AbstractIndexer.verbose("PARSE FAILED " + resourceFile.getName().toString());
-			else
-				AbstractIndexer.verbose("PARSE SUCCEEDED " + resourceFile.getName().toString());			
-		}	
 	}
 	/**
 	 * Sets the document types the <code>IIndexer</code> handles.
@@ -122,25 +133,4 @@
 		return resourceFile;
 	}
 	
-	class ParserRunner implements Runnable {
-		IParser parser;
-		boolean retVal;
-		ParserRunner(IParser parser){
-			this.parser = parser;
-		}
-		/* (non-Javadoc)
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			try{
-				retVal=parser.parse();
-			}
-			catch (Exception e){
-				org.eclipse.cdt.internal.core.model.Util.log(null, "Parser Runner Exception " + resourceFile.getFullPath() + " Message: " + e.getMessage(), ICLogConstants.CDT);
-			}
-		}
-		
-		boolean getResult(){ return retVal;}
-		
-	}
 }
Index: search/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/search/ChangeLog,v
retrieving revision 1.37.2.3
diff -u -r1.37.2.3 ChangeLog
--- search/ChangeLog	5 Feb 2004 19:56:06 -0000	1.37.2.3
+++ search/ChangeLog	13 Feb 2004 19:24:02 -0000
@@ -1,3 +1,7 @@
+2004-02-13 Bogdan Gheorghe
+	- Added error handling to MatchLocator.locateMatches to handle possible
+	  parser failures.
+	
 2004-02-05 Alain Magloire
 	PR 51221
 	Reformat Patch from Bogdan base on Thomas Fletcher original patch
Index: search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java,v
retrieving revision 1.36.2.2
diff -u -r1.36.2.2 MatchLocator.java
--- search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java	5 Nov 2003 18:14:51 -0000	1.36.2.2
+++ search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java	13 Feb 2004 19:24:02 -0000
@@ -16,6 +16,7 @@
 import java.io.CharArrayReader;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
+import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.util.ArrayList;
@@ -439,8 +440,22 @@
 			
 			if (VERBOSE)
 			  MatchLocator.verbose("*** New Search for path: " + pathString);
-			  
-			parser.parse();
+			
+			try{ 
+				parser.parse();
+			}
+			catch(Exception ex){
+				 if (VERBOSE){
+					MatchLocator.verbose("MatchLocator Exception: ");
+					ex.printStackTrace();
+				 }
+			}
+			catch(VirtualMachineError vmErr){
+				if (VERBOSE){
+					MatchLocator.verbose("MatchLocator VM Error: ");
+					vmErr.printStackTrace();
+				 }
+			}
 		}
 	}
 	

Back to the top