Skip to content

Two deployments in the same directory: the second one fails 문제 해결하기 #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
spilist opened this issue Dec 16, 2018 · 4 comments

Comments

@spilist
Copy link

spilist commented Dec 16, 2018

Refer to aws#185.

18/12/16 온라인 모각코.

목표

  • 버그 재현하기
  • 버그 원인에 대해 이해하기
  • 고치는 데 얼마나 들지 일정 추정해보기
@spilist
Copy link
Author

spilist commented Dec 16, 2018

버그 재현하기

특정 ubuntu version(18.04 등)에서 발생한다는 언급이 많다. 그런데 내 ec2 instance가 무슨 OS를 쓰는거지?

$ cat /etc/os-release

NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"

Amazon Linux를 쓴다. 페도라 계열인듯. 여기서 재현되는지는 확인해봐야 한다. -> 결국 상관없었음

Rakefile에서 특정 테스트만 실행되게 하는 법 알았음

  • rsepc, codeall 실행 안되게 하고, 특정 minitest만 실행되게 함

이슈에서 언급된 코드 부분과, 테스트 코드 살펴보면서 문제가 일어나는 순서를 알게 됨

irb로 FileUtils.rmdir이라는 걸 직접 실행해보고, 빈 디렉토리가 아닌 경우 이슈에서 이야기하는 에러가 뜨는 걸 확인함

테스트 코드에서, 저 에러가 발생하는 상태를 인위적으로 stub해보려고 했는데 어려웠고 (ruby source code까지 봤지만) 정훈님이 그건 실제로 확인하더라도 테스트 코드에 넣으면 안되는 부분인 것 같고, 실제로 재현되는지만 확인해보면 되겠다고 하심

ec2 instance에서 로그 찍어보면서 재현해보려고 했으나 아직 못함

지난번과 똑같은 실수들을 함

  • 서비스 리스타트 안함
  • log 함수 정의 없이 쓰려고 함 (description 없다고 한 것까지 똑같음..)
    -> 전부 지난번에 했던 실수들. 그런데 이번에는 무슨 실수인지 바로 알아서 바로 해결 가능하긴 했음

잘한 것

  • tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log | grep "WHQ" 를 써서 특정 로그가 출력되는지 실시간으로 확인
  • 지난번에 배웠던 것들을 다 써먹음 (appsepc 수정해서 배포하고, log 찍고, log 보고, 서비스 시작하고, ...)

좋았던 것

  • 확실히 아예 시간을 분배해서 + 화면 공유하면서 작업하니까 집중해서 할 수 있었고, 주중에도 이런 식으로 진전될 수 있구나 라는 걸 느꼈다. 독서실 같은 곳에 같이 있는 느낌이 들었다.
  • 중간에 잠깐 수다도 떨고, 서로 모르는 것 이야기해가면서 하니까 막힐 때 같이 논의할 수 있는 사람이 있어서, 프로그레스가 더 잘 되는 느낌이 들었다.

아쉬운 것

  • 명시적으로 중간에 시간을 끊고 (1시간 지났을때?) 상대방에게 지금까지 뭐했는지 공유했다면 진전이 더 빨리 될 수 있지 않았을까? 하는 생각. (os 알아보기, ruby source code 보기 같은 걸 더 적게 할 수 있지 않았을까?)

정훈님

  • 시간 정해서 하니까 놀 때 마음이 편하다. '해야 하는데' 하는 생각 때문에 마음 한 켠에 찝찝함이 있는데, 이따 할거니까 라는 생각 덕분에 편하다.
  • 같이 하니까 심심하지 않고, 딴짓을 안하게 됨
  • 어제는 중간중간 서로 어떤거 하는지 얘기하면서 공유가 됨 (의도한 건 아니었지만) -> 설명하면서 스스로 정리도 됨

@spilist
Copy link
Author

spilist commented Dec 19, 2018

18/12/19 모각코

ec2 instance에서 상황 재현에 실패.

ec2 instance의 ruby version은 2.0.0인데, FileUtils.rmdir()했을 때 dir이 비어있지 않으면 에러는 나지 않고, 삭제도 되지 않는다.
내 로컬인 ruby 2.5.1은 에러가 난다.

재밌는 건, FileUtils.rmdir은 내부적으로 Dir.rmdir()을 쓰는데 Dir.rmdir()2.0.02.5.1에서 구현은 살짝 달라졌지만 동일하게 Dir not empty 에러를 뱉는다.

즉 FileUtils.rmdir 구현이 달라진 것인데

  • 2.0.0은 begin 안에서 Errno::ENOTEMPTY를 rescue하기 때문에 silently fail한다.
    begin
      Dir.rmdir(dir = dir.chomp(?/))
      if parents
        until (parent = File.dirname(dir)) == '.' or parent == dir
          Dir.rmdir(dir)
        end
      end
    rescue Errno::ENOTEMPTY, Errno::EEXIST, Errno::ENOENT
  • 2.5.1은 parents option이 있을 때, parents도 지워주는 그런 느낌인데 parents 에 대해서만 rescue가 되어 있다. 그래서 이것 자체를 지워줄 때는 rescue가 안돼서 에러가 난다.
    Dir.rmdir(dir = remove_trailing_slash(dir))
    if parents
      begin
        until (parent = File.dirname(dir)) == '.' or parent == dir
          dir = parent
          Dir.rmdir(dir)
        end
      rescue Errno::ENOTEMPTY, Errno::EEXIST, Errno::ENOENT
      end
    end

사람들이 ubuntu 버전에 따라 문제가 생긴다고 했는데, 어쩌면 낮은 ubuntu version에서는 ruby도 버전이 낮아서 그런 것 아닐까? 추가로 확인해보니, ruby 2.4.3에서조차 silently fail하게 되어있다. 그렇다면 ubuntu 18.04 버전부터 ruby 2.5를 지원하면서 생기게 된 문제일 수도 있다.

그리고 재밌게도, silently fail이 났던 상황이 사람들이 원하던 상황이라고 한다면, 2.5에서도 그냥 이슈에서 언급한 것처럼 rescue하는 것만으로 잘 해결이 될 수도 있다. 다만 StandardError가 아닌 Errno::ENOTEMPTY를 rescue하는 게 더 정확할 것 같다. 나머지 에러는 그럼 뭘까?

  • 참고: ruby system call errors, linux system call errors
  • Errno::EEXISTFile exists 라서 remove할때 이 에러가 나긴 하는건지도 모르겠다. 이걸 대체 왜 rescue하고 있는것일까???
  • Errno::ENOENTNo such file or directory다. 즉 삭제하려는 대상이 존재하지 않는다는 것.

@spilist
Copy link
Author

spilist commented Dec 26, 2018

ubuntu ec2 instance를 18.04로 띄우고 ruby version을 낮춰보자.

@spilist
Copy link
Author

spilist commented Dec 30, 2018

현재 ec2 instance에서 ruby version 올리기

  • yum install ruby 했는데 최신버전 설치되어있다고 뜬다. 이 OS에서는 더 높이 못올리는건가?

ubuntu 18.04로 재현

  • instance 띄우기
    • ubuntu 18.04 선택했는데 보안 그룹 등 설정이 생각 안남. https://jojoldu.tistory.com/281 다시 보자.
    • 인스턴스 구성에서 IAM을 ec2 deploy 가능한 IAM으로 해야 함.
  • aws cli 설치
  • install
    • ./install auto 하는데 gdebi 설치 안된다고 해서 apt-get update 후 재시도하니까 됨.
  • 한번 배포하고, cleanup file 조작해서 임의의 디렉토리를 클린업하게 했다. 해당 디렉토리에 아무 파일 추가해놓고, 배포 재시도.
    • 생각한대로 directory not empty 에러가 뜬다.
  • ruby version 낮춰서 재시도
    • apt install ruby 2.4.3 -> 왜케 오래 걸리나 했더니 ruby 는 already installed latest 라고 해서 무시되고 2.4.3 이라는 regex로 검색된 걸 다 설치하고 있었다...
    • 걍 내가 아는대로 rvm 쓰자.
      • rvm group에 user를 추가하라고 하는데..? source /etc/profile.d/rvm.sh 하면 일시적으로 그냥 쓸수 있다.
    • rvm으로 2.4.3 설치. 근데 codedeploy가 이미 깔아놓은 2.5.1을 안쓰게 하려면 어떻게 해야 하는지 모르겠다. 그냥 삭제하자.
    • 2.4.3으로 재시도했는데 계속 같은 에러가 나서, 이상해서 로그를 살펴보니 ruby 2.5.0으로 실행되고 있다. 이게 뭐지.. 그래서 service restart하려고 하니 service가 떠있지 않다고 한다..?? 서비스 파일 자체가 없다. ruby 삭제해서 그런가? ruby -v 하면 있는데?
    • install을 다시 하려고 하니 /usr/bin/env에 ruby가 없다고 한다. 경로가 없는듯.
    • 계속 삽질했지만 계속 실패하고 있다. 뭔가 처음부터 꼬인것같다. 나중에 다시 해보든가 해야겠다..

그냥 새로 하나 더 띄워서 실험. 낮은 루비 버전에서 돌아가는 것 확인.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant