1.调试入口

在go-ipfs/cmd/ipfs/runmain_test中加上参数,开始调试

args := []string{"add","./init.go"}

2.进入core

在go-ipfs/core/add.go 里面有add命令的执行函数AddCmd,主要有prerun,run和postrun,如果调试的时候没有开启ipfs daemon,那么这三个函数均在本地执行,如果这个时候开启了daemon,本地执行的是prerun,postrun。而run则由daemon来执行。其中run和postrun是并发执行的(详见ipfs/go-ipfs-cmds/exector.go),如下图

3.add命令参数

add命令参数很多,prerun和run里面大部分都是进行参数初始化的操作。

4.api add

     for addit.Next() {_, dir := addit.Node().(files.Directory)go func() {var err errordefer close(events)_, err = api.Unixfs().Add(req.Context, addit.Node(), opts...)errCh <- err}()for event := range events {output, ok := event.(*coreiface.AddEvent)if !ok {return errors.New("unknown event type")}h := ""if output.Path != nil {h = enc.Encode(output.Path.Cid())}if !dir && addit.Name() != "" {output.Name = addit.Name()} else {output.Name = path.Join(addit.Name(), output.Name)}if err := res.Emit(&AddEvent{Name:  output.Name,Hash:  h,Bytes: output.Bytes,Size:  output.Size,}); err != nil {return err}}

在获取要添加的文件后,代码发起了一个goruntine来调用unixfs的api(add)。进入go-ipfs/core/coreapi/uinxfs.go的add函数

5.uinxfs.go的add函数

在该函数里面,初始化了一个fileadder,文件添加器。之后执行

nd, err := fileAdder.AddAllAndPin(files) 

添加文件并且pin,pin表示将文件添加到localstorage,并且不会被gc删除。

6.fileAdder.AddAllAndPin

该函数内有

adder.addFileNode
func (adder *Adder)  addFileNode(path string, file files.Node, toplevel bool) error {defer file.Close()err := adder.maybePauseForGC() //ToDo: unreadif err != nil {return err}if adder.liveNodes >= liveCacheSize {// TODO: A smarter cache that uses some sort of lru cache with an eviction handlermr, err := adder.mfsRoot()if err != nil {return err}if err := mr.FlushMemFree(adder.ctx); err != nil {return err}adder.liveNodes = 0}adder.liveNodes++switch f := file.(type) {case files.Directory:return adder.addDir(path, f, toplevel)case *files.Symlink:return adder.addSymlink(path, f)case files.File:return adder.addFile(path, f)default:return errors.New("unknown file type")}
}

主要就是判断文件类型,根据不同的类型执行相应的操作。如果是目录的话就递归添加,继续调用这个函数,直到文件类型是file或者link。

先到这里。。。下次接着写

ipfs add命令相关推荐

  1. dockerfile COPY ADD 命令

    目录 Build 上下文的概念 COPY 命令的简单性 ADD 命令还可以干其它事情 加速镜像构建的技巧 总结 Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两 ...

  2. Linux下route add 命令加入路由列表

    route add命令的主要作用是加入静态路由,通常的格式是: route ADD 157.0.0.0 MASK 255.0.0.0  157.55.80.1 METRIC 3 IF 2 參数含义:d ...

  3. (转) Dockerfile 中的 COPY 与 ADD 命令

    原文:https://www.cnblogs.com/sparkdev/p/9573248.html Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令的基 ...

  4. 通过srvctl add命令添加database信息到srvctl管理器

    ================================================ 通过srvctl add命令添加database信息到srvctl管理器 ============== ...

  5. DockerFile : COPY 和 ADD 命令不能拷贝上下文之外的本地文件

    对于 COPY 和 ADD 命令来说,如果要把本地的文件拷贝到镜像中,那么本地的文件必须是在上下文目录中的文件.其实这一点很好解释,因为在执行 build 命令时,docker 客户端会把上下文中的所 ...

  6. Windwos命令工作笔记001---route add命令详解

    技术交流QQ群[JAVA,.NET,BigData,AI]:170933152 今天去出差对方公司用这个在控制上网流量,偶然看到查了一下 route add命令的主要作用是添加静态路由,通常的格式是: ...

  7. (转) Dockerfile 中的 COPY 与 ADD 命令 1

    原文:https://www.cnblogs.com/sparkdev/p/9573248.html Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令的基 ...

  8. ROUTE ADD 命令详解

    随笔- 18  文章- 59  评论- 37 route add命令详解 1.具体功能  该命令用于在本地IP路由表中显示和修改条目.使用不带参数的ROUTE可以显示帮助.  2.语法详解  rout ...

  9. 使用ADD命令将目录复制到Docker的其他目录

    本文翻译自:Copy directory to other directory at Docker using ADD command I have read http://docs.docker.c ...

最新文章

  1. Python-PyCharm 报错解决:ImportError: cannot import name 'InteractiveConsole' from 'code'
  2. Unity之Math等方法的使用
  3. nodejs ajax进度条,Ajax异步文件上传与NodeJS express服务端处理的示例分析
  4. rabbitMQ教程 spring整合rabbitMQ代码实例
  5. Live Rate creation中的Territory check逻辑
  6. 工程师总结:单片机C语言编程心得
  7. 大文件打开工具 PilotEdit
  8. java中 object创建对象_java创建对象的几种方式
  9. linux 0.11 源码学习(十四)
  10. Exception in thread http-apr-8080-exec-
  11. mysql基础之日志管理(查询日志、慢查询日志、错误日志、二进制日志、中继日志、事务日志)...
  12. 【AngularJS】—— 13 服务Service
  13. python参考手册文字版_Python3.8标准库参考手册 中文完整pdf高清版
  14. 微信好友检测助手App
  15. VS创建和使用C++动态链接库教程
  16. Mybatis整合达梦数据库
  17. 我的世界风格字体 艺术字生成 Textcraft的介绍及使用
  18. SAP 信息记录条件 无法维护多个条件
  19. 华为云D-Plan解决方案为企业数智升级注入AI新动力
  20. Ubuntu18+ 使用redshift调色温 夜间闪烁

热门文章

  1. opengl 多边形线框_opengl基础学习专题 (三) 多边形绘制的几种样式
  2. vcf 文件拼接(snp、indel)
  3. 关于示波器探头的输入容抗问题解决
  4. Java内存大小换算
  5. AtCoder Beginner Contest 171 D - Replacing
  6. 飞控陀螺仪,磁力计,加速计,四元数姿态结算
  7. java set方法_Set的常用方法(java)
  8. PTK(Pulmonarytoolkit)环境搭建与 ITK4.13+VS2015的配置
  9. 计算机网络有三大功能 数据通信,计算机网络的三大功能
  10. 算法时间复杂度分析——大O、大Ω、大θ、小o,小ω