cloud-barista / cb-tumblebug

Cloud-Barista Multi-Cloud Infra Management Framework
Apache License 2.0
56 stars 51 forks source link

Concurrency issue in `POST /ns/{nsId}/mciDynamic` #1925

Closed yunkon-kim closed 5 days ago

yunkon-kim commented 1 week ago

What happened : It looks like there's a concurrency issue in POST /ns/{nsId}/mciDynamic

What you expected to happen : POST /ns/{nsId}/mciDynamic의 request body에 2 VM requests인 경우 error: already exists, vNet: xxx 에러가 발생합니다.

{
    "name": "mmci01",
    "installMonAgent": "no",
    "description": "A cloud infra recommended by CM-Beetle",
    "vm": [
      {
        "name": "rehosted-cm-nfs",
        "description": "a recommended virtual machine",
        "commonSpec": "aws+ap-northeast-2+i3.8xlarge",
        "commonImage": "aws+ap-northeast-2+ubuntu22.04"
      },
      {
        "name": "rehosted-cm-web",
        "description": "a recommended virtual machine",
        "commonSpec": "aws+ap-northeast-2+i3.8xlarge",
        "commonImage": "aws+ap-northeast-2+ubuntu22.04"
      }
    ]
}

: error log

cb-tumblebug       | 6:12AM ERR src/core/resource/vnet.go:401 >
cb-tumblebug       | 6:12AM ERR src/core/resource/common.go:1901 > Failed to create vNet error="already exists, vNet: default-shared-aws-ap-northeast-2"
cb-tumblebug       | 6:12AM ERR src/core/infra/provisioning.go:1157 > Failed to create new default vNet default-shared-aws-ap-northeast-2 from aws-ap-northeast-2 error="already exists, vNet: default-shared-aws-ap-northeast-2"
cb-tumblebug       | 6:12AM ERR src/core/infra/provisioning.go:974 > Failed to prepare resources for dynamic MCI creation error="already exists, vNet: default-shared-aws-ap-northeast-2"

Observation

: getVmReqFromDynamicReq(reqID, nsId, &vmReq)이 병렬 실행됩니다.

https://github.com/cloud-barista/cb-tumblebug/blob/b2749b8d873ab4f522bf7a74f7cff437e1e487ae/src/core/infra/provisioning.go#L965-L984

: Lines 1146-1147 부분은 자원의 유무를 판단하고, 자원이 있을 시 생성을 진행하지 않는 메커니즘입니다. : 병렬 실행 되는 상황에서는 자원의 유무 판단 로직이 제대로 동작하지 않는 경우가 있습니다.

https://github.com/cloud-barista/cb-tumblebug/blob/b2749b8d873ab4f522bf7a74f7cff437e1e487ae/src/core/infra/provisioning.go#L1146-L1164

Any other context : 예를 들어, 2개의 루틴 동작한다고 가정하겠습니다. 두 루틴에서 거의 동시에 기존 자원이 없다고 판단하면, 양쪽에서 자원 생성을 시도합니다. 그러나 결국 먼저 생성되는 자원이 있고, 이로 인해 에러가 발생하며, 롤백 후 API 요청 실패를 리턴합니다.

yunkon-kim commented 5 days ago

Resolved by #1927