본문 바로가기

논문/학위 논문 준비

[논문 조사/코드분석] 스토리지(STORJ) 코드 분석 - Uplink

반응형

최초 작성일 : 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. 그나저나 스토리지가 어떻게 분산되서 저장되는지, 어떤 노드로 선택되는 기준의 알고리즘은 어딨는걸까?

반응형