TODOs: Tweak timings (Retry and Spec Watch)

The Spec Watch polling will occur every 1000ms now.
We also will have join retry up to 30x with a minimum of 1000ms
between the start of each join attempt. (From 15x with 2000ms between
the end and start)

Change-Id: Ib23b1f6be196a5ac967f85ab7e516faf094210c0
diff --git a/app/src/syncbase/java/io/v/todos/persistence/syncbase/SyncbaseMain.java b/app/src/syncbase/java/io/v/todos/persistence/syncbase/SyncbaseMain.java
index c70c92c..a8fa248 100644
--- a/app/src/syncbase/java/io/v/todos/persistence/syncbase/SyncbaseMain.java
+++ b/app/src/syncbase/java/io/v/todos/persistence/syncbase/SyncbaseMain.java
@@ -46,8 +46,8 @@
     private static final String
             TAG = SyncbaseMain.class.getSimpleName();
 
-    private static final int DEFAULT_MAX_JOIN_ATTEMPTS = 15;
-    private static final long RETRY_DELAY = 2000;
+    private static final int DEFAULT_MAX_JOIN_ATTEMPTS = 30;
+    private static final long MIN_RETRY_DELAY = 1000;
 
     private final IdGenerator mIdGenerator = new IdGenerator(IdAlphabets.COLLECTION_ID, true);
     private final Map<String, MainListTracker> mTaskTrackers = new HashMap<>();
@@ -157,7 +157,7 @@
             return joinListSyncgroup(listId);
         }
         // Note: This can be easily converted to exponential backoff.
-        final long delay = RETRY_DELAY;
+        final long startTime = System.currentTimeMillis();
         return Futures.catchingAsync(
                 joinListSyncgroup(listId),
                 SyncgroupJoinFailedException.class,
@@ -165,6 +165,9 @@
                     public ListenableFuture<SyncgroupSpec> apply(@Nullable
                                                                  SyncgroupJoinFailedException
                                                                          input) {
+                        long failTime = System.currentTimeMillis();
+                        long delay = Math.max(0, MIN_RETRY_DELAY + startTime - failTime);
+
                         Log.d(TAG, "Join failed. Sleeping " + debugString + " with delay " + delay);
                         return sExecutor.schedule(new Callable<SyncgroupSpec>() {
 
diff --git a/app/src/syncbase/java/io/v/todos/persistence/syncbase/SyncbasePersistence.java b/app/src/syncbase/java/io/v/todos/persistence/syncbase/SyncbasePersistence.java
index 1777dc0..2b6110d 100644
--- a/app/src/syncbase/java/io/v/todos/persistence/syncbase/SyncbasePersistence.java
+++ b/app/src/syncbase/java/io/v/todos/persistence/syncbase/SyncbasePersistence.java
@@ -104,7 +104,7 @@
     protected static final long
             SHORT_TIMEOUT = 2500,
             MEMBER_TIMER_DELAY = 100,
-            MEMBER_TIMER_PERIOD = 5000;
+            MEMBER_TIMER_PERIOD = 1000;
     public static final String
             USER_COLLECTION_NAME = "userdata",
             MOUNTPOINT = "/ns.dev.v.io:8101/tmp/todos/users/",