보람찬 코기의 개발자 블로그
article thumbnail
Published 2023. 11. 16. 14:19
[AWS S3] s3fs-fuse 오픈소스 분석 AWS
반응형

이번 포스팅은 오픈소스의 S3FS-FUSE의 코드 분석에 관한 글이다.

 

이번 팀프로젝트를 완수하기 위해선, 오픈 소스의 코드를 다 분석해야하지만 S3fs-Fuse의 소스는 어떻게 이루어졌는지 파악해야한다.

 

C++ 소스코드를 보고 함수의 기능을 살펴보며 구동하는 흐름을 학습할 것이다.

 

아래는 이전 포스팅이다

 

https://boramchan-corgi.tistory.com/25

 

[AWS] S3FS-FUSE(Foreign File System in User Space) 란?

대학교 수업 '오픈소스 소프트웨어' 강의를 들으면서 프로젝트를 하게 되었다. 우리 팀은 오픈소스인 s3fs-FUSE를 탐구하고 I/O 속도 개선을 목표로 주제를 선정하였다. 인프라에 관심있는 나에게

boramchan-corgi.tistory.com


 

    • autolock.cpp
      • 자원 접근을 동기화하기 위한 AutoLock 클래스를 정의한다.
      • pthread 뮤텍스를 사용하여 동시에 여러 스레드에서 안전하게 공유 자원에 접근할 수 있게 한다
    • cache.cpp
      • 파일 시스템과 관련된 통계 정보 및 캐시 관리를 수행한다. 파일 시스템에서 파일 및 디렉토리의 메타데이터를 캐싱하고 관리하는 데 사용됩니다
      • SetCacheSize, SetExpireTime, AddStat, AddNoObjectCache, AddSymlink: 메타데이터 캐싱을 관리하기 위한 메서드로, 메타데이터를 캐시에 추가하거나 캐시 크기 만료 시간을 설정할 있다.
      • 성능 및 캐시 관리를 위한 도구로 사용될 수 있으며, 메타데이터 및 심볼릭 링크 정보를 효율적으로 관리하는 데 도움이 된다.
    • common_auth.cpp
      • MD5 및 SHA-256 해시 작업을 수행한다
      • 파일 다운로드 중에 전송된 파일의 해시와 로컬 파일의 해시를 비교하여 파일 무결성을 확인하는 데 사용할 수 있다.
    • curl_handlerpool.cpp
      • CURL(C Library for URL)핸들러를 관리하는 역할
      • 멀티스레딩 환경에서 안전하게 CURL 핸들러를 관리하기위해 pthread_mutex를 사용하고 있다.
    • curl_multi.cpp
      • CURL(C Library for URL)을 사용하여 S3(Simple Storage Service)와 통신을 처리하는 멀티 스레드 환경에서의 요청 처리를 담당
      • S3fsMultiCurl 클래스는 최대 병렬성 수준을 인수로 받는 생성자를 가지고 있다. 최대 병렬성 수준은 번에 동시에 처리할 있는 요청의 최대 수를 나타낸다.
      • S3fs 파일 시스템의 핵심적인 동작을 담당
    • curl_util.cpp
      • libcurl 사용하여 Amazon S3 서비스와 상호 작용하는 사용되는 여러 유틸리티 함수와 도우미 함수를 정의하고 있.
    • curl.cpp
      • 이 코드는 Amazon S3와 상호 작용하는 데 필요한 설정 및 초기화를 수행합니다.
      • 122개 이상의 실행에 필요한 함수가 존재
    • fdcache_auto.cpp
      • 파일 디스크립터 엔터티를 자동으로 관리
      • AutoFdEntity 클래스는 파일 디스크립터 엔터티를 자동으로 생성하고 관리하는 데 사용될 수 있으며, 파일 디스크립터의 열기, 닫기, 연결 및 연결 해제를 처리하는 기능을 제공
    • fdcache_entity.cpp
      • 파일 디스크립터 엔터티 클래스와 관련된 설정 및 도우미 메서드를 정의하고 있으며, S3 멀티파트 업로드 및 스트리밍 업로드와 관련된 설정을 변경하는 데 사용
      • 여러 스레드 간에 안전한 방식으로 파일 조작 및 업로드 작업을 수행합니다. 다양한 업로드 모드 및 예약된 로컬 디스크 공간을 관리하여 효율적인 파일 조작을 지원
    • fdcache_fdinfo.cpp
      • 스토리지로 데이터를 업로드하고 관리하는 복잡한 작업을 수행하는 데 사용됩니다.
      • 함수들은 데이터 정렬, 업로드, 다운로드 및 취소 작업을 효율적으로 처리하기 위해 다양한 로직을 구현합니다.
      • 이러한 코드는 S3 파일 시스템과 같은 클라우드 스토리지 시스템과의 통합을 관리하고 데이터를 안전하게 업로드하는 데 중요한 역할한다
    • fdcache_page.cpp
      • 파일의 페이지 또는 블록 상태를 관리하고 확인하는 기능을 구현
      • 파일의 스파스 상태를 확인하거나 압축된 페이지 목록을 생성하는 데 사용된다. 이러한 정보를 사용하여 파일의 상태를 관리하고 파일 시스템의 동작을 최적화한다
    • fdcache_pseudofd.cpp
      • PseudoFdManager 클래스는 스레드 간의 안전한 가상 파일 디스크립터 관리를 제공한다.
      • Get() 및 Release() 메서드를 통해 가상 파일 디스크립터를 얻고 해제할 수 있고, 이는 다수의 스레드에서 가상 파일 디스크립터를 안전하게 공유하고 활용할 때 유용한 클래스이다.
    • fdcache_stat.cpp
      • 캐시 파일 통계 및 파일 관리를 위한 유틸리티 함수와 CacheFileStat 클래스를 제공하며, 파일 및 디렉토리 관리를 위한 다양한 도구를 제공
    • fdcache_stat.cpp
      • CacheFileStat 클래스 및 그와 관련된 함수들을 포함한 파일입니다.
      • 파일 시스템의 통계 정보를 저장하고 관리하기 위한 기능을 제공합니다.
    • fdcache_untreated.cpp
      • UntreatedParts 클래스는 부분의 추가, 삭제, 검색 및 관리를 담당하며, 다중 스레드 환경에서 안전하게 작동하도록 뮤텍스 락을 사용한다.
      • 이를 통해 캐시 및 파일 관리 시스템에서 처리되지 않은 데이터 부분을 관리하는 데 사용된다.
    • fdcache.cpp
      • 캐시 파일 및 통계 정보의 일관성을 확인하고 문제가 있는 경우 이를 식별하여 디버깅 및 유지 관리를 위한 도구.
      • 파일 및 파일 디스크립터 관리의 복잡성을 처리하고, 여러 파일을 동시에 열고 관리하는 기능을 제공하는 데 사용.
    • gnutls_auth.cpp
      • 보안 및 암호화 관련 기능을 처리하는 유틸리티 함수와 라이브러리 초기화에 관련된 함수를 포함하고 있다.
      • 네트워크 통신 및 데이터 보호와 관련된 중요한 보안 작업을 처리하기 위한 기반을 제공, 무결성 제공
    • nss_auth.cpp
      • 유틸리티 함수와 초기화 함수는 암호화, 해시 계산 및 SSL 관련 작업을 수행하는 데 사용한다.
      • 코드는 네트워크 보안 및 데이터 무결성을 유지하고 보안된 통신을 위한 필수 도구이다.
    • s3fs.cpp
      • S3 파일 시스템과 상호 작용하는 FUSE 기반 파일 시스템에서 사용되는 여러 가지 함수를 정의하고 있습니다. 
      • 대략 5000줄 가량 되는 파일이고 기능이 다 있음.
    • s3fs_cred.cpp
      • 인증 및 자격 증명을 확인하고 연결하는 기능을 구현
    • threadpoolman.cpp
      • 스레드 풀을 관리하는 데 사용되며, 여러 작업을 병렬로 실행하고 관리하기 위한 기반을 제공한다.
      • 코드의 핵심 아이디어는 스레드 풀을 효과적으로 사용하여 병렬 작업을 처리하는 것이며, 스레드 동기화 및 스레드 관리와 관련된 여러 도우미 클래스와 함수를 포함하고 있다.

그리고 우리 조는 S3FS-FUSE가 작동하면서 호출하는 함수를 파악하기위해 함수명을 출력하는 코드를 작성하였고,

 

모든 C++ 함수에 코드를 추가하였다

#include <iostream>
#include <ostream>
#include <fstream>

    std::string logMessage = std::string(__func__) + " function is called.\n";
    std::string logFilePath = "/s3fs_logs/log.txt";
    std::ofstream logFile(logFilePath, std::ios::out | std::ios::app);

    if (logFile.is_open()) {
        logFile << logMessage;
        logFile.close();
    } else {
        std::cerr << "Unable to open log file." << std::endl;
    }

 

작업 이후 Ubuntu OS에서 정상적으로 빌드를 하였고 잘 작동하였다.

 

다만 로그가 1000줄은 나오더라구요,,,, 로그는 추후 포스팅에서...다루겠다.

반응형

'AWS' 카테고리의 다른 글

[AWS] S3FS-FUSE(Foreign File System in User Space) 란?  (1) 2023.11.16
profile

보람찬 코기의 개발자 블로그

@BoChan

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!