1. Config file should go to controller layer so that the system 
   can dynamically find and add new node.

2. Consistency problem with Core.(noSyncLog=true).
   It is possible that when recovering, the log has a VV < datastore.cvv:
   i.e.: some updates were lost in log, but it is stored in datastore.
   Solution 1:
     apply imprecise invalidations in log to make it consistency.

   will it hurts the liveness of imprecise -> precise?

   Solution 2: 
     why don't use one berkeleyDB environment for both log and datastore?

        

3. The current implementation:
     log will sync or no sync for every write,
     datastore will commit for every write but it doesn't syn

     what's the guarantee if both are not synced?

     Shouldn't we batching for log sync?

     solutions: 1. expose sync api to application layer
                2. do some batching opertimization in PRACTI.

     Must:
       if noLogSync true, then before gc, we must sync.

4. InvalFilter: racing problem solution:
   In InvalIterator, when it got a new invalidation to send, it rechecks
   with InvalIterator.cvv. If the cvv already covers the new invalidation, 
   just drop it.

   CVV might filter precise invalidations we needed.

5. clean up 
   ISStatus merges with AllprecisesSet.
   Cladifa   LogIterator.java clean up

6. put update persistent log into file system instead of BerkeleyDB

7. cl clean up the PSController stuff.

8. Failure of body is not recoverable.
   because the log doesn't have the body only precise invalidations

9. InvalStreamReceiver has references of the last IncomingConnection, 
   so the shutdown will only shutdown the last IncomingConnection and 
   still need to wait for the other incomingconnection threads to finish.


10.Don't have to return boundInval due to a performance issue  
  
11. bodyRecvWorker:
    we have only one recvWorker for one sender,
    then the body arrives earlier for which its corresponding invalidate 
    hasn't arrived yet will block all the applying of the other bodies.

    A potential fix is that we keep a hashtable so that the recvWorker 
    just put those pending bodies in the hashtable, whenever a thread 
    applies an invalidation, it looks up the hashtable and apply the 
    corresponding pending queue.

    need to contact amol to discuss this. 

12. inside UpdateLog: move the compare of INVALID_NODE_ID inside NodeId 
    class as a method. 

13. replace vector/hashtable with hashmap if the order does not matter.


14. OutgoingConnection can distinguish the first addSubscriptionSet 
    request as initialization. so that the first request doesn't have 
    to go to queue and then deque.

15. The simplified rmi.subscribeInval(sender, receiver, ssString, 
    catchupWithCP), the receiver won't be able to attach the ss as the 
    startVV has a gap with lpvv.

16. cleanup unbindMsg + debargoMsg. in InvalIterator, UpdateLog etc.

17. commit delete is not supported need another field in perObjState to indicated
    if the deleted is committed or not and then we might need to store the
    commit sequence in the perRangeState as well.

18 sanityCheck LogRecordBinding. move all serialization code inside each class and sanitycheck.
