Hello Andrzej,
You can also try http://issues.apache.org/jira/browse/NUTCH-79
- I think it should also help here - it is a bit complicated as it contain additional functionality but if you have any problems I am willing to help. I am going to perform some test of it again and maybe commit it in some time if others think it is worth it.
Regrads
Piotr

Andrzej Bialecki wrote:
Hi,

I was doing performance testing of a distributed search setup, with JMeter, using the code from trunk/.

Whenever one of the backend Servers goes down, there is a hiccup on the frontend, because all ParallelCalls started by the Client, which still use that dead address, need to timeout. This is expected, and acceptable.

New calls being made in the meantime (before updateSegments() discovers that the host is down) will also need to timeout - which is so so, I think it could be improved by removing the offending address at the first sign of trouble, i.e. not to wait for updateSegments() but immediately remove the dead host from liveAddresses. Anyway, read on...

What was curious was that the same hiccup would then occur every 10 seconds, which is the hardcoded interval for calling Client.updateSegments(). It was as if the call to updateSegments() was synchronized on the whole class, so that all other calls are blocked until updateSegments() completes. I modified the code, so that instead of using DistributedSearch$Client itself as a Thread instance, a new independent Thread instance is created.

The hiccups are gone now - the list of liveAddresses is still being updated as it should whenever Servers go down/up, but now updateSegments() doesn't interfere with other calls. I attach the patch - but to be honest I'm still not quite sure what was happening...


------------------------------------------------------------------------

Index: DistributedSearch.java
===================================================================
--- DistributedSearch.java      (revision 280515)
+++ DistributedSearch.java      (working copy)
@@ -112,8 +112,9 @@
     public Client(InetSocketAddress[] addresses) throws IOException {
       this.defaultAddresses = addresses;
       updateSegments();
-      setDaemon(true);
-      start();
+      Thread t = new Thread(this);
+      t.setDaemon(true);
+      t.start();
     }
private static final Method GET_SEGMENTS;
@@ -168,8 +169,10 @@
         liveSegments+=segments.length;
       }
- this.liveAddresses = (InetSocketAddress[]) // update liveAddresses
-        liveAddresses.toArray(new InetSocketAddress[liveAddresses.size()]);
+      synchronized(this.liveAddresses) {
+        this.liveAddresses = (InetSocketAddress[]) // update liveAddresses
+          liveAddresses.toArray(new InetSocketAddress[liveAddresses.size()]);
+      }
LOG.info("STATS: "+liveServers+" servers, "+liveSegments+" segments.");
     }

Reply via email to