최초 작성일 : 2021. 05. 01.
마지막 업데이트일 : 2021. 05. 09.
Go 언어는 처음입니다.
그런데 튜토리얼 없이 바로 코드 분석을 하는 스파르타식이라니 ... :(
Go 언어는 변수 선언시 데이터 타입을 뒤에, 변수명을 앞에 적는가봅니다. 제가 했던 대부분의 언어는 데이터 타입이 앞에 있어서 코드 보는데 자주 햇갈리네요.
1. root.go
1-1. Function init
uplink 모듈을 사용하기 위해, storj에 모듈을 등록하는 부분인 듯합니다만,
정확히 컴파일&빌드할 때 바이너리 파일에 등록을 하는 것인지 ?
uplink를 실행할 때 네트워크에 등록을 하는 것인지 추가적인 확인 필요
func init() {
defaultConfDir := fpath.ApplicationDir("storj", "uplink")
cfgstruct.SetupFlag(zap.L(), RootCmd, &confDir, "config-dir", defaultConfDir, "main directory for uplink configuration")
// NB: more-help flag is always retrieved using `findBoolFlagEarly()`
RootCmd.PersistentFlags().BoolVar(new(bool), advancedFlagName, false, "if used in with -h, print advanced flags help")
setBasicFlags(RootCmd.PersistentFlags(), "config-dir", advancedFlagName)
setUsageFunc(RootCmd)
}
1-2. Function addCmd
ls.go - Function init 참고
uplink에서 사용할 옵션들을 추가할 때 호출될 함수로 확인됩니다.
func addCmd(cmd *cobra.Command, root *cobra.Command) *cobra.Command {
root.AddCommand(cmd)
process.Bind(cmd, &cfg, defaults, cfgstruct.ConfDir(getConfDir()))
return cmd
}
2. uplink.go
2-1. Function Upload
// Upload data to specific satellite.
func (client *Uplink) Upload(ctx context.Context, satellite *Satellite, bucket string, path storj.Path, data []byte) error {
return client.UploadWithExpiration(ctx, satellite, bucket, path, data, time.Time{})
}
파라미터를 설명해보면 다음과 같습니다.
ctx : 모듈을 컴파일하여 사용하기 위한 변수. (ex, Uplink/Satellite/Gateway 등등...)
satellite : 위성..? 뭔지 모르겠다. 확인 필요
bucketName : 버킷 이름으로 스토리지를 사용하면 최초에 스토리지 이름을 정하게 되는데, 이 스토리지 이름을 bucketName라 합니다.
path : 특정 버킷의 어떤 경로인지를 말합니다.
data : _데이터 크기를 말하는 것으로 확인되나 정확한 확인 필요
expiration : 조금 더 확인 필요
2-2. Function UploadWithExpiration
func (client *Uplink) UploadWithExpiration(ctx context.Context, satellite *Satellite, bucketName string, path storj.Path, data []byte, expiration time.Time) error {
... (코드 생략) ...
upload, err := project.UploadObject(ctx, bucketName, path, &uplink.UploadOptions{
Expires: expiration,
})
if err != nil {
return err
}
... (코드 생략) ...
return upload.Commit()
}
3. ls_test.go
err = uplinkPeer.Upload(ctx, satellite, "testbucket", "committed-object", testrand.Bytes(5*memory.KiB))
require.NoError(t, err)
err = uplinkPeer.Upload(ctx, satellite, "testbucket", "prefixed/committed-object", testrand.Bytes(5*memory.KiB))
require.NoError(t, err)
위 코드에서 Uplink를 사용하기 위해, 모듈을 준비합니다.
{
cmd := exec.Command(uplinkExe,
"--config-dir", ctx.Dir("uplink"),
"ls",
"--pending",
)
t.Log(cmd)
output, err := cmd.Output()
require.NoError(t, err)
checkOutput(t, output)
}
새로운 cmd라는 변수를 통해 위 모듈을 준비했던 ctx로 uplink를 실행하면서 추가 파라미터 옵션을 부여합니다.
옵션은 ls
를 부여했기 때문에, 리눅스의 ls/윈도우의 dir 명령어와 동일한 역할을 수행합니다.
4. ls.go
4-1. Function init
root.go - Function addCmd 참고
init 함수에서 최초로 addCmd 함수를 호출하면서 ls에 대한 사용법, 반환 값등 ls 옵션에 대한 설정을 세팅합니다.
func init() {
lsCmd := addCmd(&cobra.Command{
Use: "ls [sj://BUCKET[/PREFIX]]",
Short: "List objects and prefixes or all buckets",
RunE: list,
Args: cobra.MaximumNArgs(1),
}, RootCmd)
lsRecursiveFlag = lsCmd.Flags().Bool("recursive", false, "if true, list recursively")
lsEncryptedFlag = lsCmd.Flags().Bool("encrypted", false, "if true, show paths as base64-encoded encrypted paths")
lsPendingFlag = lsCmd.Flags().Bool("pending", false, "if true, list pending objects")
setBasicFlags(lsCmd.Flags(), "recursive", "encrypted", "pending")
}
Use : 옵션에 대한 사용법을 간단히 설명이 작성 되어있습니다.
Short : 이 옵션이 무슨 역할을 하는지 요약 설명이 작성됩니다.
RunE : 이 옵션 실행시 수행될 함수를 작성합니다.
Args : 파라미터는 최대 몇개인지, 어떤 파라미터가 들어가야하는지 정보가 작성됩니다.
ps. 그나저나 스토리지가 어떻게 분산되서 저장되는지, 어떤 노드로 선택되는 기준의 알고리즘은 어딨는걸까?
'논문 > 학위 논문 준비' 카테고리의 다른 글
[논문 조사] 스토리지(STORJ) 블록체인 (0) | 2020.07.30 |
---|---|
[논문 조사] Gossip Protocol - 소문으로 알게되는 프로토콜 (0) | 2020.03.22 |