示例#1
0
        /////////////////////////////////////////////////////////

        private RemoteIndexerResponse SendRequest(RemoteIndexerRequest request)
        {
            RemoteIndexerResponse response = null;
            int  exception_count           = 0;
            bool start_helper_by_hand      = false;

            if (Environment.GetEnvironmentVariable("BEAGREP_RUN_HELPER_BY_HAND") != null)
            {
                start_helper_by_hand = true;
            }

            request.RemoteIndexName         = remote_index_name;
            request.RemoteIndexMinorVersion = remote_index_minor_version;

            while (response == null &&
                   exception_count < 5 &&
                   !Shutdown.ShutdownRequested)
            {
                bool need_helper = false;

                //Logger.Log.Debug ("Sending request!");
                try {
                    response = request.Send() as RemoteIndexerResponse;
                    //Logger.Log.Debug ("Done sending request");
                } catch (ResponseMessageException ex) {
                    Logger.Log.Debug("Caught ResponseMessageException: {0}", ex.Message);

                    if (ex.InnerException is System.Net.Sockets.SocketException)
                    {
                        Logger.Log.Debug("InnerException is SocketException -- we probably need to launch a helper");
                        need_helper = true;
                    }
                    else if (ex.InnerException is IOException)
                    {
                        Logger.Log.Debug("InnerException is IOException -- we probably need to launch a helper");
                        need_helper = true;
                    }
                    else
                    {
                        Logger.Log.Debug(ex, "Unexpected exception from IndexHelper. Giving up sending this request.");
                        return(null);
                    }
                }

                // If we caught an exception...
                if (response == null)
                {
                    if (!start_helper_by_hand || !need_helper)
                    {
                        ++exception_count;
                    }

                    if (start_helper_by_hand)
                    {
                        // Sleep briefly before trying again.
                        Thread.Sleep(1000);
                    }
                    else
                    {
                        // Try to activate the helper.
                        LaunchHelper();
                    }
                }
            }

            if (response == null && exception_count >= 5)
            {
                Logger.Log.Error("Exception limit exceeded trying to activate a helper.  Giving up on indexing!");
            }

            return(response);
        }
示例#2
0
		public override ResponseMessage Execute (RequestMessage raw_request)
		{
			RemoteIndexerRequest remote_request = (RemoteIndexerRequest) raw_request;

			IndexHelperTool.ReportActivity ();

			// Find the appropriate driver for this request.
			LuceneIndexingDriver indexer;
			lock (indexer_table) {
				indexer = (LuceneIndexingDriver) indexer_table [remote_request.RemoteIndexName];

				if (indexer == null) {
					indexer = new LuceneIndexingDriver (remote_request.RemoteIndexName,
									    remote_request.RemoteIndexMinorVersion);
					indexer.DisableTextCache = IndexHelperTool.DisableTextCache;

					indexer_table [remote_request.RemoteIndexName] = indexer;

					indexer.FileFilterNotifier += delegate (Uri display_uri, Uri content_uri, Filter filter) {
						IndexHelperTool.ReportActivity ();
						IndexHelperTool.CurrentDisplayUri = display_uri;
						IndexHelperTool.CurrentContentUri = content_uri;
						IndexHelperTool.CurrentFilter = filter;
					};
				}
			}

			IndexerReceipt [] receipts = null;
			int item_count = 0;

			try {
				if (remote_request.Request != null) // If we just want the item count, this will be null
					receipts = indexer.Flush (remote_request.Request);
				item_count = indexer.GetItemCount ();
			} catch (Exception e) {
				// Send error response
				++Count;
				return new ErrorResponse (e);
			}

			// Construct a response containing the item count and
			// the receipts produced by the actual indexing.
			RemoteIndexerResponse response = new RemoteIndexerResponse ();
			response.ItemCount = item_count;
			response.Receipts = receipts;

			++Count;

			IndexHelperTool.ReportActivity ();

			return response;
		}