Showing posts with label Solr. Show all posts
Showing posts with label Solr. Show all posts

Wednesday, September 22, 2010

tomcat 7 with solr 1.4, HTTP Status 404 - /solr/admin/file/index.jsp

there might be something wrong between the solr 1.4 and tomcat 7. here is one quick story.

After I install the solr 1.4 in tomcat 7. I Open the  /sor/admin and click schema or config .

image

get 404 error.

image

the answer here is pretty simple after I did a lot debugging. Just remove the last slash.

new url will be http://localhost:8888/solr/admin/file?file=schema.xml
   instead of http://localhost:8888/solr/admin/file/?file=schema.xml

after this, you can change the index.jsp locatd in webapps/solr/admin/index.jsp

<td>
  <% if (null != core.getSchemaResource()) { %>
  [<a href="file?file=<%=core.getSchemaResource()%>">Schema</a>]
  <% }
     if (null != core.getConfigResource()) { %>
  [<a href="file?file=<%=core.getConfigResource()%>">Config</a>]
  <% } %>

Solr CSharp /.NET Client Solrsharp , exception Object reference not set to an instance of an object.

After we installed the Solr 1.4 , we use use the solrj as the library Client integration with Solr by using SolrJ .

the latest version of solr is 1.4.x, however, if you want to use the C# client SolrSharp which has not been update sine late 2007. you might need to change something to make the client works with the new version of Solr. say 1.4.

the first exception is called Object reference not set to an instance of an object.

here is one basic snippet to upload one document to solr server via solrsharp. in this example, My solr server is listening on 9999 port. and I started the tcptrace which listens on 8888 and forward all traffic to localhost 9999. based on this, we can see the raw traffic between client and solr server.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using org.apache.solr.SolrSharp.Configuration;
using org.apache.solr.SolrSharp.Update;
using org.apache.solr.SolrSharp.Indexing;

namespace ConsoleApplication6
{
    class TestSolrSharp
    {
        public static void Main()
        {
            //upload document
            try
            {
                SolrSearcher solrSearcher = new SolrSearcher("http://localhost:8888/solr", Mode.ReadWrite);
                SolrUpdater update = new SolrUpdater(solrSearcher);

                UpdateIndexDocument doc = new UpdateIndexDocument();
                doc.Add("id", "1");
                doc.Add("title", "test solr");

                update.PostToIndex(doc, true);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

When I run it , I get the following error.

System.NullReferenceException: Object reference not set to an instance of an object.
   at org.apache.solr.SolrSharp.Configuration.Schema.SolrSchema..ctor(SolrSearcher solrSearcher) in C:\Users\xx\Downloads\solrsharp-Dec-30-2007\src\Configuration\Schema\SolrSchema.cs:line 76
   at org.apache.solr.SolrSharp.Configuration.SolrSearcher.SetSolrSchema() in C:\Users\xx\Downloads\solrshar
p-Dec-30-2007\src\Configuration\SolrSearcher.cs:line 93
   at org.apache.solr.SolrSharp.Configuration.SolrSearcher..ctor(String solrUrl, Mode searcherMode) in C:\Users\xx\Downloads\solrsharp-Dec-30-2007\src\Configuration\SolrSearcher.cs:line 77
   at ConsoleApplication6.TestSolrSharp.Main() in C:\Users\xx\documents\visual studio 2010\Projects\ConsoleA
pplication6\ConsoleApplication6\Class1.cs:line 18
Press any key to continue . . .


then I check the tcptrace traffic, get the access exception.

image

it looks like the client library will first pull the Scheme.xml of solr. When it try to get the schema.xml from /solr/admin/get-file.jsp?file=schema.xml, the solr server returns error of No Access.

So we need to make sure http://localhost:9999/solr/admin/get-file.jsp?file=schema.xml is accessible. Why we dont’t have access at this time.

Let’s check the soure code of the get-file.jsp, as shown in the bellow.

<%@ page contentType="text/plain; charset=utf-8" pageEncoding="UTF-8" %>
<%--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--%>
<%@ page import="org.apache.solr.core.Config,
                 org.apache.solr.core.SolrCore,
                 org.apache.solr.core.SolrConfig,
                 java.io.InputStream,
                 java.io.InputStreamReader,
                 java.io.Reader,
                 java.util.StringTokenizer,
                 java.util.logging.Logger"%>
<%!
  static Logger log = Logger.getLogger(SolrCore.class.getName());
%>
<%
  // NOTE -- this file will be removed in a future release
  log.warning("Using deprecated JSP: " + request.getRequestURL().append("?").append(request.getQueryString()) + " -- check the ShowFileRequestHandler"  );

  Object ocore = request.getAttribute("org.apache.solr.SolrCore");
  SolrCore core = ocore instanceof SolrCore? (SolrCore) ocore : SolrCore.getSolrCore();
  String fname = request.getParameter("file");
  String optional = request.getParameter("optional");
  String gettableFiles = core.getSolrConfig().get("admin/gettableFiles","");
  StringTokenizer st = new StringTokenizer(gettableFiles);
  InputStream is;
  boolean isValid = false;
  boolean isOptional = false;
  if (fname != null) {
    // Validate fname
    while(st.hasMoreTokens()) {
      if (st.nextToken().compareTo(fname) == 0) isValid = true;
    }
  }
  if (optional!=null && optional.equalsIgnoreCase("y")) {
    isOptional=true;
  }
  if (isValid) {
    try {
    is= core.getSolrConfig().openResource(fname);
    Reader input = new InputStreamReader(is);
    char[] buf = new char[4096];
    while (true) {
      int len = input.read(buf);
      if (len<=0) break;
      out.write(buf,0,len);
    }
    }
    catch (RuntimeException re) {
      if (!isOptional) {
        throw re;
      }
    }
  } else {
    out.println("<ERROR>");
    out.println("Permission denied for file "+ fname);
    out.println("</ERROR>");
  }
%>

from the code, it will check the configuration of gettablefiles in solrconfig.config  by default, there is no such configration in the solrconfig.xml (which comes with the new verson), so it means those files are not getable by default. Why?

the newer version expose this file get functionality via another url called /admin/file?
  which is configed in solrconfigxml

 image

we get the answer , so fix is easy. just put one more entry in the admin section of solrconfig.xml, rememer to restart solr also.

image

Now we can use the solrsharp to upload some documents to solr.

image

For more information.

Tuesday, June 15, 2010

Fix the classpnp.sys problem, Windows 7 SSD macbook

After I did a lot pressure on CPU performance testing, My windows 7 64 bit [macbook, OCZ SSD, 64 bit ultimate edition]become no responding at all. then I just hold the power key and force a reboot. Sadly enough, it even can’t boot up. Press F8 to try the safemode, no Luck . Get an error like this,  one system driver can’t be loaded. Always, It means the file is corrupt and All you need to fix is find a way to replace the file.

alt

Here is How-to, It is proved to work great on my Macbook win 7 74 bit.

  1. Copy the Classpnp.sys file from another PC to an external hd or USB drive. PLEASE Note, 32 bit /64 bit system differs. Make sure you get the same version as you OS.
  2. Insert one windows DVD to the dvdrom, try boot with the DVD, to setup a New OS (don’t click to go further, all we need is just a command promot that we can copy the file from USB to your Primary HD), For MACbook, Hold and Press “C” to initial the setup.
  3. after the setup GUI is loaded, Run “Shift + F10” to Bring a Command Prompt, this feature has been in the Windows setup GUI since win 2000. So for step 2, inserting any version of windows is fine.

Shift-F10

  1. Copy the file from your backup drive to \windows\system32\drivers\classPNP.sys
  2. remove the DVD and external HD, restart the PC
  3. if you get a hint to Repair the PC, forget it. Not make any sense here. until now, all will be fixed.

 

For more troubleshooting entries.

 
Locations of visitors to this page