blob: 0744838df048db2a0ea480cbdc3453f28f251973 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hdfs.tools.offlineImageViewer;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
/**
* ImageVisitor to spot check an fsimage and generate several statistics
* about it that we can compare with known values to give a reasonable
* assertion that the image was processed correctly.
*/
class SpotCheckImageVisitor extends ImageVisitor {
// Statistics gathered by the visitor for Inodes and InodesUnderConstruction
static public class ImageInfo {
public long totalNumBlocks = 0; // Total number of blocks in section
public Set<String> pathNames = new HashSet<String>(); // All path names
public long totalFileSize = 0; // Total size of all the files
public long totalReplications = 0; // Sum of all the replications
}
final private ImageInfo inodes = new ImageInfo();
final private ImageInfo INUCs = new ImageInfo();
private ImageInfo current = null;
@Override
void visit(ImageElement element, String value) throws IOException {
if(element == ImageElement.NUM_BYTES)
current.totalFileSize += Long.valueOf(value);
else if (element == ImageElement.REPLICATION)
current.totalReplications += Long.valueOf(value);
else if (element == ImageElement.INODE_PATH)
current.pathNames.add(value);
}
@Override
void visitEnclosingElement(ImageElement element, ImageElement key,
String value) throws IOException {
switch(element) {
case INODES:
current = inodes;
break;
case INODES_UNDER_CONSTRUCTION:
current = INUCs;
break;
case BLOCKS:
current.totalNumBlocks += Long.valueOf(value);
break;
// OK to not have a default, we're skipping most of the values
}
}
public ImageInfo getINodesInfo() { return inodes; }
public ImageInfo getINUCsInfo() { return INUCs; }
// Unnecessary visitor methods
@Override
void finish() throws IOException {}
@Override
void finishAbnormally() throws IOException {}
@Override
void leaveEnclosingElement() throws IOException {}
@Override
void start() throws IOException {}
@Override
void visitEnclosingElement(ImageElement element) throws IOException {}
}