HTRACE-313. htraced span receiver clientDropped file should include timestamps (Colin Patrick McCabe via iwasakims)
diff --git a/htrace-htraced/src/main/java/org/apache/htrace/impl/HTracedSpanReceiver.java b/htrace-htraced/src/main/java/org/apache/htrace/impl/HTracedSpanReceiver.java
index 4e6d56a..6e6bb22 100644
--- a/htrace-htraced/src/main/java/org/apache/htrace/impl/HTracedSpanReceiver.java
+++ b/htrace-htraced/src/main/java/org/apache/htrace/impl/HTracedSpanReceiver.java
@@ -27,8 +27,16 @@
 import java.nio.channels.FileChannel;
 import java.nio.channels.FileLock;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.attribute.PosixFilePermission;
+import java.nio.file.Files;
+import java.nio.file.FileSystems;
 import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.TimeZone;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.ReentrantLock;
@@ -88,6 +96,26 @@
 
   private long unbufferableSpans = 0;
 
+  private static final SimpleDateFormat ISO_DATE_FORMAT;
+
+  private static final Set<PosixFilePermission> DROPPED_SPANS_FILE_PERMS;
+
+  static {
+    ISO_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
+    ISO_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
+    if (FileSystems.getDefault().supportedFileAttributeViews().contains("posix")) {
+      DROPPED_SPANS_FILE_PERMS = new HashSet<PosixFilePermission>();
+      DROPPED_SPANS_FILE_PERMS.add(PosixFilePermission.OWNER_READ);
+      DROPPED_SPANS_FILE_PERMS.add(PosixFilePermission.OWNER_WRITE);
+      DROPPED_SPANS_FILE_PERMS.add(PosixFilePermission.GROUP_READ);
+      DROPPED_SPANS_FILE_PERMS.add(PosixFilePermission.GROUP_WRITE);
+      DROPPED_SPANS_FILE_PERMS.add(PosixFilePermission.OTHERS_READ);
+      DROPPED_SPANS_FILE_PERMS.add(PosixFilePermission.OTHERS_WRITE);
+    } else {
+      DROPPED_SPANS_FILE_PERMS = null;
+    }
+  }
+
   static class FaultInjector {
     static FaultInjector NO_OP = new FaultInjector();
     public void handleContentLengthTrigger(int len) { }
@@ -368,8 +396,9 @@
       return;
     }
     FileLock lock = null;
+    String msg = ISO_DATE_FORMAT.format(new Date()) + ": " + text;
     ByteBuffer bb = ByteBuffer.wrap(
-        text.getBytes(StandardCharsets.UTF_8));
+        msg.getBytes(StandardCharsets.UTF_8));
     // FileChannel locking corresponds to advisory locking on UNIX.  It will
     // protect multiple processes from attempting to write to the same dropped
     // spans log at once.  However, within a single process, we need this
@@ -386,6 +415,11 @@
           throw new IOException("Dropped spans log " +
               conf.droppedSpansLogPath + " is already " + size +
               " bytes; will not add to it.");
+        } else if ((size == 0) && (DROPPED_SPANS_FILE_PERMS != null)) {
+          // Set the permissions of the dropped spans file so that other
+          // processes can write to it.
+          Files.setPosixFilePermissions(Paths.get(conf.droppedSpansLogPath),
+              DROPPED_SPANS_FILE_PERMS);
         }
         channel.write(bb);
       } finally {
diff --git a/htrace-htraced/src/test/java/org/apache/htrace/impl/TestDroppedSpans.java b/htrace-htraced/src/test/java/org/apache/htrace/impl/TestDroppedSpans.java
index 8947365..3f336f1 100644
--- a/htrace-htraced/src/test/java/org/apache/htrace/impl/TestDroppedSpans.java
+++ b/htrace-htraced/src/test/java/org/apache/htrace/impl/TestDroppedSpans.java
@@ -105,7 +105,7 @@
           put(Conf.ADDRESS_KEY, "127.0.0.1:8080");
           put(TracerId.TRACER_ID_KEY, "testWriteToDroppedSpansLog");
           put(Conf.DROPPED_SPANS_LOG_PATH_KEY, logPath);
-          put(Conf.DROPPED_SPANS_LOG_MAX_SIZE_KEY, "78");
+          put(Conf.DROPPED_SPANS_LOG_MAX_SIZE_KEY, "128");
         }});
     HTracedSpanReceiver rcvr = new HTracedSpanReceiver(conf);
     try {
@@ -123,8 +123,8 @@
       List<String> lines =
           Files.readAllLines(Paths.get(logPath), StandardCharsets.UTF_8);
       Assert.assertEquals(2, lines.size());
-      Assert.assertEquals(LINE1, lines.get(0));
-      Assert.assertEquals(LINE2, lines.get(1));
+      Assert.assertEquals(LINE1, lines.get(0).substring(25));
+      Assert.assertEquals(LINE2, lines.get(1).substring(25));
     } finally {
       rcvr.close();
     }