[REEF-1645] Fix the issue with assertion in RuntimeClock.stop() and log numClientAlarms

JIRA:
  [REEF-1645](https://issues.apache.org/jira/browse/REEF-1645)

Pull Request:
  This closes #1160
diff --git a/lang/java/reef-wake/wake/src/main/java/org/apache/reef/wake/time/runtime/RuntimeClock.java b/lang/java/reef-wake/wake/src/main/java/org/apache/reef/wake/time/runtime/RuntimeClock.java
index 64ae63a..523bce3 100644
--- a/lang/java/reef-wake/wake/src/main/java/org/apache/reef/wake/time/runtime/RuntimeClock.java
+++ b/lang/java/reef-wake/wake/src/main/java/org/apache/reef/wake/time/runtime/RuntimeClock.java
@@ -124,7 +124,15 @@
     final Time alarm = new ClientAlarm(this.timer.getCurrent() + offset, handler);
 
     if (LOG.isLoggable(Level.FINEST)) {
-      LOG.log(Level.FINEST, "Schedule alarm: {0}", alarm);
+
+      final int eventQueueLen;
+      synchronized (this.schedule) {
+        eventQueueLen = this.numClientAlarms;
+      }
+
+      LOG.log(Level.FINEST,
+          "Schedule alarm: {0} Outstanding client alarms: {1}",
+          new Object[] {alarm, eventQueueLen});
     }
 
     synchronized (this.schedule) {
@@ -178,10 +186,12 @@
       this.exceptionCausedStop = exception;
 
       final Time stopEvent = new StopTime(this.timer.getCurrent());
-      LOG.log(Level.FINE, "Stop scheduled immediately: {0}", stopEvent);
+      LOG.log(Level.FINE,
+          "Stop scheduled immediately: {0} Outstanding client alarms: {1}",
+          new Object[] {stopEvent, this.numClientAlarms});
 
-      this.numClientAlarms = 0;
       assert this.numClientAlarms >= 0;
+      this.numClientAlarms = 0;
 
       this.schedule.clear();
       this.schedule.add(stopEvent);
@@ -209,7 +219,9 @@
       this.isClosed = true;
 
       final Time stopEvent = new StopTime(Math.max(this.timer.getCurrent(), this.lastClientAlarm + 1));
-      LOG.log(Level.FINE, "Graceful shutdown scheduled: {0}", stopEvent);
+      LOG.log(Level.FINE,
+          "Graceful shutdown scheduled: {0} Outstanding client alarms: {1}",
+          new Object[] {stopEvent, this.numClientAlarms});
 
       this.schedule.add(stopEvent);
       this.schedule.notify();
@@ -308,10 +320,11 @@
 
           if (this.isIdle()) {
             // Handle an idle clock event, without locking this.schedule
-            this.handlers.onNext(new IdleClock(timer.getCurrent()));
+            this.handlers.onNext(new IdleClock(this.timer.getCurrent()));
           }
 
           final Time event;
+          final int eventQueueLen;
           synchronized (this.schedule) {
 
             while (this.schedule.isEmpty()) {
@@ -333,24 +346,24 @@
 
             // Remove the event from the schedule and process it:
             event = this.schedule.pollFirst();
-          }
-
-          LOG.log(Level.FINER, "Process event: {0}", event);
-          assert event != null;
-
-          if (event instanceof Alarm) {
 
             if (event instanceof ClientAlarm) {
               --this.numClientAlarms;
               assert this.numClientAlarms >= 0;
             }
 
+            eventQueueLen = this.numClientAlarms;
+          }
+
+          assert event != null;
+
+          LOG.log(Level.FINER,
+              "Process event: {0} Outstanding client alarms: {1}", new Object[] {event, eventQueueLen});
+
+          if (event instanceof Alarm) {
             ((Alarm) event).run();
-
           } else {
-
             this.handlers.onNext(event);
-
             if (event instanceof StopTime) {
               break; // we're done.
             }