FileSnap

作者: mirroru | 来源:发表于2020-12-14 15:12 被阅读0次

    FileSnap.java

    找到100个snapshot文件,按zxid降序排序
    遍历找到的snapshot文件,从zxid最大的开始
    将快照文件反序列化化
    校验快照完整性,通过提取内容的checksum与文件中的val字段比较
    如果有一个文件是完整的,则退出循环。

     public long deserialize(DataTree dt, Map<Long, Integer> sessions) throws IOException {
            // we run through 100 snapshots (not all of them)
            // if we cannot get it running within 100 snapshots
            // we should  give up
            List<File> snapList = findNValidSnapshots(100);
            if (snapList.size() == 0) {
                return -1L;
            }
            File snap = null;
            long snapZxid = -1;
            boolean foundValid = false;
            for (int i = 0, snapListSize = snapList.size(); i < snapListSize; i++) {
                snap = snapList.get(i);
                LOG.info("Reading snapshot {}", snap);
                snapZxid = Util.getZxidFromName(snap.getName(), SNAPSHOT_FILE_PREFIX);
                try (CheckedInputStream snapIS = SnapStream.getInputStream(snap)) {
                    InputArchive ia = BinaryInputArchive.getArchive(snapIS);
                    deserialize(dt, sessions, ia);
                    SnapStream.checkSealIntegrity(snapIS, ia);
    
                    // Digest feature was added after the CRC to make it backward
                    // compatible, the older code can still read snapshots which
                    // includes digest.
                    //
                    // To check the intact, after adding digest we added another
                    // CRC check.
                    if (dt.deserializeZxidDigest(ia, snapZxid)) {
                        SnapStream.checkSealIntegrity(snapIS, ia);
                    }
    
                    foundValid = true;
                    break;
                } catch (IOException e) {
                    LOG.warn("problem reading snap file {}", snap, e);
                }
            }
            if (!foundValid) {
                throw new IOException("Not able to find valid snapshots in " + snapDir);
            }
            dt.lastProcessedZxid = snapZxid;
            lastSnapshotInfo = new SnapshotInfo(dt.lastProcessedZxid, snap.lastModified() / 1000);
    
            // compare the digest if this is not a fuzzy snapshot, we want to compare
            // and find inconsistent asap.
            if (dt.getDigestFromLoadedSnapshot() != null) {
                dt.compareSnapshotDigests(dt.lastProcessedZxid);
            }
            return dt.lastProcessedZxid;
        }
    
    

    相关文章

      网友评论

          本文标题:FileSnap

          本文链接:https://www.haomeiwen.com/subject/eqvvgktx.html