You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flume.apache.org by jm...@apache.org on 2011/09/30 21:54:20 UTC

svn commit: r1177806 - in /incubator/flume/trunk/flume-core/src: main/java/com/cloudera/flume/handlers/rolling/RollSink.java test/java/com/cloudera/flume/handlers/rolling/TestRollSink.java

Author: jmhsieh
Date: Fri Sep 30 19:54:20 2011
New Revision: 1177806

URL: http://svn.apache.org/viewvc?rev=1177806&view=rev
Log:
FLUME-768: Agent deadlock possible due to blocked latch in driver thread (Prasad Mujumdar)


Modified:
    incubator/flume/trunk/flume-core/src/main/java/com/cloudera/flume/handlers/rolling/RollSink.java
    incubator/flume/trunk/flume-core/src/test/java/com/cloudera/flume/handlers/rolling/TestRollSink.java

Modified: incubator/flume/trunk/flume-core/src/main/java/com/cloudera/flume/handlers/rolling/RollSink.java
URL: http://svn.apache.org/viewvc/incubator/flume/trunk/flume-core/src/main/java/com/cloudera/flume/handlers/rolling/RollSink.java?rev=1177806&r1=1177805&r2=1177806&view=diff
==============================================================================
--- incubator/flume/trunk/flume-core/src/main/java/com/cloudera/flume/handlers/rolling/RollSink.java (original)
+++ incubator/flume/trunk/flume-core/src/main/java/com/cloudera/flume/handlers/rolling/RollSink.java Fri Sep 30 19:54:20 2011
@@ -148,15 +148,15 @@ public class RollSink extends EventSink.
             Clock.sleep(checkLatencyMs);
           } catch (InterruptedException e) {
             LOG.debug("TriggerThread interrupted");
-            doneLatch.countDown();
             return;
           }
         }
       } catch (InterruptedException e) {
         LOG.error("RollSink interrupted", e);
-      }
+      } finally {
       LOG.debug("TriggerThread shutdown");
       doneLatch.countDown();
+      }
     }
   };
 

Modified: incubator/flume/trunk/flume-core/src/test/java/com/cloudera/flume/handlers/rolling/TestRollSink.java
URL: http://svn.apache.org/viewvc/incubator/flume/trunk/flume-core/src/test/java/com/cloudera/flume/handlers/rolling/TestRollSink.java?rev=1177806&r1=1177805&r2=1177806&view=diff
==============================================================================
--- incubator/flume/trunk/flume-core/src/test/java/com/cloudera/flume/handlers/rolling/TestRollSink.java (original)
+++ incubator/flume/trunk/flume-core/src/test/java/com/cloudera/flume/handlers/rolling/TestRollSink.java Fri Sep 30 19:54:20 2011
@@ -389,4 +389,53 @@ public class TestRollSink {
     // See above for why there are 4 triggers:
     assertEquals(4, (long) rpt.getLongMetric(RollSink.A_ROLLS));
   }
+
+  /**
+   * This verifies that when roller's trigger aborts, the sink closes correctly
+   */
+  @Test(timeout=30000)
+  public void testTriggerAborted() throws IOException,
+      InterruptedException {
+
+    Tagger tagger = new ProcessTagger() {
+      @Override
+      public String getTag() {
+        return "-testtag";
+      }
+
+      @Override
+      public String newTag() {
+        // throw exception from the Trigger Thread
+        if (Thread.currentThread().getName().contains("Roll-TriggerThread"))
+          throw new RuntimeException("testExp");
+        return "-testtag";
+      }
+    };
+
+    final File f = FileUtil.mktempdir();
+    RollSink snk = new RollSink(new Context(), "test", new TimeTrigger(tagger,
+        10000), 250) {
+      @Override
+      protected EventSink newSink(Context ctx) throws IOException {
+        return new EscapedCustomDfsSink("file:///" + f.getPath(),
+            "sub-%{service}%{rolltag}");
+      }
+    };
+
+    Event e = new EventImpl("this is a test message".getBytes());
+    Attributes.setString(e, "service", "foo");
+    snk.open();
+    snk.append(e);
+    // wait for the trigger thread to abort down
+    while (snk.triggerThread.isAlive()) {
+      Clock.sleep(100);
+    }
+    snk.close();
+    // verify that the trigger thread did the cleanup
+    assertTrue(snk.triggerThread.doneLatch.getCount() == 0);
+    File fo = new File(f.getPath() + "/sub-foo-testtag");
+    assertTrue(fo.exists());
+    FileUtil.rmr(f);
+  }
+
 }