Closed yunkon-kim closed 5 days ago
What happened : It looks like there's a concurrency issue in POST /ns/{nsId}/mciDynamic
POST /ns/{nsId}/mciDynamic
What you expected to happen : POST /ns/{nsId}/mciDynamic의 request body에 2 VM requests인 경우 error: already exists, vNet: xxx 에러가 발생합니다.
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)이 병렬 실행됩니다.
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 요청 실패를 리턴합니다.
Resolved by #1927
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
에러가 발생합니다.: error log
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 요청 실패를 리턴합니다.