-
cmd
模块 也有一个main.go
-
github.com/minio/cli
fork 别人的项目 -
"net/http"
用的标准库的 http 框架 -
http
模块 ->server.go
->func NewServer
创建一个新的 http 服务 -
cmd
->storage-errors.go
自定义的错误, 用errors.As
或errors.Is
来检查 -
当程序出现需要终止的错误时使用
logger.Fatal()
-
logger.FatalIf()
是一个自定义的函数,如果有错误的话,就Fatal
这样可以简化错误检查
代码 -
cmd
->storage-errors.go
->osErrToFileErr
系统地把文件系统的错误转换成 minio 的错误 -
func initDataScanner
: 相当于后台定时运行一个协程 -
使用
ioutil.WriteFile
写入文件
测试的结果是: 两个客户端可以同时并发上传文件到同一个 key,两个都会成功,都没有阻塞,后完成上传的会覆盖先完成上传的。 跟谁先开始上传没关系。
上传文件时, minio
会将文件内容保存到临时目录drive/.minio.sys/tmp/[fsUUID]/[tempObjUUID]
。再重命名到目标路径。
fsUUID
每次启动程序的时候生产一个, 可以理解为对应一个单独的实例
tempObjUUID
每调用一次putObject
函数生成一个, 可以立即为一次请求生产一个。
putObject函数执行完毕后, 不管出错还是成功,都会删除这个临时文件。
工具:cyberduck 或者 自带 web 界面
export _MINIO_SERVER_DEBUG = on
-
minio
-
cmd # 具体的读写本地文件都在这个模块,看起来像是 control + view
- ***-hangdlers.go # 处理器,类似于 views
- api-errors.go # 自定义 http 错误,利用了常量 iota
-
internal
-
http # http 服务
-
logger # 封装的自定义日志组件
-
dsync # 锁?
-
-
cmd
-> FSObjects
是 ObjectLayer
接口的实现
serverMain
-> configureServerHandler
-> registerAPIRouter
进行s3 接口的路由配置
drives
: 存储路径
// Config represents cache config settings
type Config struct {
Enabled bool `json:"-"` // - 表示序列化的时候忽略该字段
Drives []string `json:"drives"`
Expiry int `json:"expiry"`
...
}
fsMetaV1
结构体的 WriteTo()
方法用来保存 json 文件, 也就是元数据
routers
-> objectAPIHandlers.DeleteObjectHandler()
-> objects.DeleteObject()
PutObjectHandler
-> FSObjects{}.PutObject()
-> FSObjects{}.putObject
-> fsCreateFile()