hanm commented on a change in pull request #1069: ZOOKEEPER-3056: Fails to load 
database with missing snapshot file but with valid transaction log file.
URL: https://github.com/apache/zookeeper/pull/1069#discussion_r319691423
 
 

 ##########
 File path: 
zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileTxnSnapLog.java
 ##########
 @@ -232,11 +242,19 @@ public long restore(DataTree dt, Map<Long, Integer> 
sessions, PlayBackListener l
         } else {
             trustEmptyDB = autoCreateDB;
         }
+
         if (-1L == deserializeResult) {
             /* this means that we couldn't find any snapshot, so we need to
              * initialize an empty database (reported in ZOOKEEPER-2325) */
             if (txnLog.getLastLoggedZxid() != -1) {
-                throw new IOException("No snapshot found, but there are log 
entries. " + "Something is broken!");
+                // ZOOKEEPER-3056: provides an escape hatch for users upgrading
+                // from old versions of zookeeper (3.4.x, pre 3.5.3).
+                if (!trustEmptySnapshot) {
+                    throw new IOException(EMPTY_SNAPSHOT_WARNING + "Something 
is broken!");
+                } else {
+                    LOG.warn(EMPTY_SNAPSHOT_WARNING + "This should only be 
allowed during upgrading.");
+                    trustEmptySnapshot = false;
 
 Review comment:
   >> during internal reloads of the database
   
   database will only be loaded once from disk during a process's life time now 
we don't clear the in memory data base anymore every time a server (object) 
restarts; so this is less a concern. 
   
   >> I wonder if there is a cleaner way to allow this special case only during 
"start" and not during all of the other code paths
   
   "start" and "other code paths" are no different, from server point of view 
they are all recovery cases, be it a first start up or recovery from faults. So 
if we care about empty snapshot, we should check in all places. If we ignore 
empty snapshot, we should ignore in all places. The check logic and the skip 
check logic should be co-located, so refactoring sequence of start ups will not 
impact that.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to