Index: solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java
===================================================================
--- solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java  (revision 1425166)
+++ solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java  (working copy)
@@ -21,6 +21,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
+import java.nio.channels.ClosedByInterruptException;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.lucene.codecs.Codec;
@@ -146,6 +147,8 @@
         } catch (ThreadInterruptedException e) {
           // don't allow interruption
           continue;
+        } catch (ClosedByInterruptException e) {
+          forceUnlock();
         }
         break;
       }
Index: lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/index/IndexWriter.java (revision 1425166)
+++ lucene/core/src/java/org/apache/lucene/index/IndexWriter.java (working copy)
@@ -1802,6 +1802,17 @@
   public void forceMergeDeletes() throws IOException {
     forceMergeDeletes(true);
   }
+  
+  /**
+   * Forcibly unlocks the index in the named directory.
+   * <P>
+   * Caution: this should only be used by failure recovery code, when it is
+   * known that no other process nor thread is in fact currently accessing this
+   * index.
+   */
+  public void forceUnlock() throws IOException {
+    writeLock.release();
+  }
 
   /**
    * Expert: asks the mergePolicy whether any merges are
@@ -4024,6 +4035,10 @@
    * Caution: this should only be used by failure recovery code,
    * when it is known that no other process nor thread is in fact
    * currently accessing this index.
+   * 
+   * WARNING: if you are using a native lock factory, you should
+   * use {@link IndexWriter#forceUnlock()} instead.
+   * 
    */
   public static void unlock(Directory directory) throws IOException {
     directory.makeLock(IndexWriter.WRITE_LOCK_NAME).release();
