91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

hadoop源碼解析---INodeReference機制

發布時間:2020-07-04 13:52:07 來源:網絡 閱讀:9107 作者:yushaoqing 欄目:大數據

本文主要介紹了hadoop源碼中hdfs的INodeReference機制。


在hdfs2.6版本中,引入了許多新的功能,一些原有的源代碼設計也有一定的改造。一個重要的更新就是引入了快照功能。但是當HDFS文件或者目錄處于某個快照中,并且這個文件或者目錄被重命名或者移動到其他路徑時,該文件或者目錄就會存在多條訪問路徑。INodeReference就是為了解決這個問題產生的。


問題描述

/a是hdfs中的一個普通目錄,s0為/a的一個快照,在/a目錄下有一個文件test。根據快照的定義,我們可以通過/a/test以及/a/snapshot/s0/test訪問test文件。

但是當用戶將/a/test文件重命名成/x/test1時,通過快照路徑/a/snapshot/s0/test將無法訪問test文件,這種情況是不符合快照規范的。


引入INodeReference

為了解決上述問題,hdfs引入了INodeReference類。圖1-1給出了INodeReference的繼承關系圖。這里的WithName,WithCoount,DstReference都是INodeReference的子類,同時也是INodeReference的內部類。WithName對象用于替代重命名操作前源路徑中的INode對象,DstReference對象則用于替代重命名操作后目標路徑中的INode對象,WithName和DstReference共同指向了一個WithCount對象,WithCount對象則指向了文件系統目錄樹中真正的INode對象。

hadoop源碼解析---INodeReference機制

圖1

INodeReference代碼實現

INodeReference是一個抽象類,它拓展自INode類,所以INodeReference及其子類是可以添加到文件系統目錄樹中以替代原有的INodeFile節點的。INodeReference定義了referred字段,這個字段用于保存當前INodeReference類指向的INode節點,所以WithName和RstReference,referred字段就指向了WithCount對象,對于WithCount,referred指向了真正的INode對象。INodeReference還定義了getReferredINode()方法,在文件系統目錄樹的操作中,如果判斷當前節點是一個引用節點,則會調用getReferredINode()方法獲取INodeReference指向的INode對象。

public abstract class INodeReference extends INode {
    private INode referred;//指向的INode節點
    public INodeReference(INode parent,INode referred){
        super(parent);
        this.referred = referred;
    }
    public final INode getReferredINode() {  //獲取指向的INode節點
        return referred;
    }
    public final void setReferredINode(INode referred) {
        this.referred = referred;
    }
    //...
}

然后,我們在來看看WithCount類的實現。

WithCount類定義了一個集合字段withNameList用于保存所有指向這個WithCount對象的WithName對象集合。WithCount類還定義了addReference()方法,任何指向WithCount對象的WithName對象以及DstReference對象都需要調用這個方法來添加指向關系。對于指向這個WithCount對象的DstReference對象,addReference()方法會將這個對象設置為自己的父INode節點;而對于WithName對象,addReference()方法則將這個對象放入withNameList集合中保存。

public static class WithCount extends INodeReference {
    //保存所有指向這個WithCount對象的WithName對象的集合
    private final List<WithName> withNameList = new ArrayList<WithName>();
    
    public WithCount(INodeReference parent,INode referred) {
        super(parent,referred); //調用父類的構造方法,指向文件系統目錄樹中的INode
        Preconditions.checkArgument(!referred.isReference());
        refferred.setParentReferenct(this); //設置真實INode的父節點為當前WithCount對象
    }
    
    public void addReferenct(INodeReference ref){
        if ( ref instanceof WithName) { //如果是WithName對象,則加入withNameList
            WithName refWithName = (WithName) ref;
            int i = Collections.binarySearch(withNameList, refWithName,WITHNAME_COMPARATOR);
            Preconditions.checkState(i<0);
            withNameList.add(-i-1,refWithName);
        } else if (ref instanceof DstReference) { //如果是DstReference對象,則設置為父節點
            setParentReference(ref);
        }
    }
    //...
}

看完WithCount后,在看看WithName和DstReference。WithName類定義了name字段用于保存重命名前文件的名稱,同事定義了lastSnapshotId字段用于保存WithName對象構造時源路徑的快照版本號。DstReference類的實現就更簡單了,只定義了一個dstSnapshotId字段用于保存重命名操作前目標路徑的最新快照的版本號。WithName和DstReference在構造時都會調用父類的構造方法指向WithCount對象,同時還會調用WithCount.addReference()方法配置WithCount對象。

public static class WithName extend INodeReference {
    private final byte[] name;//重命名前的文件名
    private final int lastSnapshotId;
    public WithName(INodeDirectory parent,WithCount referred,bytep[] name,int lastSnapshotId){
        super(parent,referred); //調用父類構造方法,指向WithCount節點
        this.name = name;
        this.lastSnapshotId = lastSnapshotId;
        referred.addReferenct(this); //調用WithCount.addReferenct()
     }
     //...
}

public static class DstReference extends INodeReference {
    private final int dstSnapshotId;
    public DstReference (INodeDirectory parent,WithCount referred,final int dstSnapshotId){
    super(parent,referred);
    this.lastSnapshotId = lastSnapshotId;
    referred.addReferenct(this); //調用WithCount.addReferenct()
  }
  //..
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

三穗县| 静海县| 东阳市| 锡林郭勒盟| 清流县| 辰溪县| 上栗县| 靖宇县| 延安市| 晋江市| 富蕴县| 辉县市| 阿荣旗| 巴林右旗| 贵州省| 专栏| 平南县| 枣强县| 蓬莱市| 屯留县| 松阳县| 浏阳市| 全州县| 福贡县| 无为县| 九江市| 宁波市| 府谷县| 临朐县| 竹北市| 建阳市| 衡水市| 天津市| 绵竹市| 余江县| 昌邑市| 普兰店市| 沈阳市| 简阳市| 巩留县| 佛教|