cloud-barista / cb-tumblebug

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

Add dist-lock for safe in-parallel processing of MCI dynamic creation #1927

Closed yunkon-kim closed 5 days ago

yunkon-kim commented 5 days ago

Note - Distributed-lock is applied, considering that multiple CB-Tumblebugs could be running.

Related to #1925

seokho-son commented 5 days ago

@yunkon-kim 감사합니다! 내부적으로 어떻게 동작하게 되는지 간략히 설명해주실 수 있으실까요? ^^

seokho-son commented 5 days ago

@yunkon-kim cloud-migrator 릴리스 등 시급성을 고려하여, 우선 승인하겠습니다. ^^

seokho-son commented 5 days ago

/approve

sykim-etri commented 5 days ago

@yunkon-kim defer unlock()이 있는데, 명시적으로 unlock을 다시 하는 특별한 이유가 있을까요?

yunkon-kim commented 5 days ago

@seokho-son

Case: SharedResource로 활용되는 vNet의 유무를 체크하고 -> 없으면 -> OnDemand 조건인 경우 SharedResource인 vNet을 생성하는데요.

상위 함수에서 func checkCommonResAvailableForVmDynamicReq(req *model.TbVmDynamicReq) error {}를 병렬로 호출하고 있어 정상적으로 동작하지 않았습니다. 자세한 사항은 #1925참고하시면 될 것 같습니다.

그래서, 위 case 를 Critical Section으로 보고, 앞 뒤에 Lock, unlock을 추가하여 정상 동작하게 만들었습니다.

yunkon-kim commented 5 days ago

@sykim-etri

vNet 유무 확인 및 생성 이후에, SshKey 유무 확인 및 생성, SecurityGroup 유무 확인 및 생성 프로세스가 수행됩니다.

defer lock.Unlock()만 사용할 시 해당 영역까지 Lock을 잡고 있게 됩니다. 그래서, Critical Section인 vNet에 유무 확인 및 생성 이후에 명시적으로 Unlock 하였습니다.

별도로, defer lock.Unlock()을 설정한 이유는 Critical Section 내에서 Error 발생 등으로 인해 Deadlock에 빠지지 않도록 추가되었습니다. 관련해서 etcd 쪽 에러가 발생해도 무시하면 될 것으로 판단했지만, 필요 시에 Exception 처리 추가가 필요할 것 같습니다.