본문 바로가기
[ Laboratory ]/System Software & Storage

[SPDK] blobfs/blobstore layer에서의 read 작업 처리

by dev charlotte 2024. 8. 27.

0. examples

examples 디렉토리에서 hello_blob과 hello_bdev를 통해 확인하려고 했으나 

예제 작동만을 위해 hello를 포함하는 함수들이 많았고 

물론 내부 구현은 실제 작동에 사용되는 함수들로 구현되어 있겠지만

실제 작동에 잘 사용되지 않는 함수도 포함되어 있어 

이해하기 쉽게 헤더 파일을 기반으로 코드를 확인했다

1. blobfs.c

1-1. spdk_file_read_async()

아직 spdk도 익숙하지 않고 커널 코드 분석도 익숙하지 않아서 

헤더를 보고 read 작업이 본격적으로 시작되는 지점일 것 같은 함수를 찾아서

탐색을 시작했다

 

예상했던 지점보다 조금 더 먼저 시작하는 것 같아서 

조금 더 이전 함수로 올라가서 내려가는 방식으로 확인했다

 

blobfs/blobstore layer에서는 blobstore 기반으로 blobfs가 동작하기 때문에

blobfs부터 application layer의 요청을 전달받는다

 

즉 read 작업을 본격적으로 수행하게 되면

blobfs 관련 함수부터 동작하게 되는 것이다

 

서론이 길었다

spdk_file_read_async()부터 시작점으로 삼았고

해당 함수는 파일을 비동기적으로 처리하는 함수이다

 

비동기란 요청한 작업이 종료될 때까지 기다리는 것이 아니라

다른 작업을 수행하고 있다가 먼저 진행 중인 것이 종료되면

나머지를 수행하는 방식이다

 

 

1-2. __readwrite()

파일 읽기 쓰기 함수로 실제 읽기 작업이 시작된다

 

 

1-3. __readwritev()

파일 r/w에 필요한 파일 i/o 벡터를 처리하는 함수로

본격적인 읽기 작업을 위해서 __do_blob_read를 호출하게 된다

 

 

1-4. __do_blob_read()

blob file system은 blob에서 데이터를 읽기 위해 blobstore.c에 속하는

spdk_blob_io_read()를 호출한다

 

 

2. blobstore.c

2-1. spdk_blob_io_read()

blobstore에 저장된 데이터를 기본 단위인 blob으로 읽는

즉 blob의 데이터를 읽는 함수이다

 

 

2-2. blob_request_submit_op()

블록 디바이스에서 데이터 읽기를 수행하도록 하는 함수이다

 

요청을 수행하는 방식을 결정하는 코드를 포함하고 있고

단일 io로 처리하면 single 함수를,

분할 io로 처리하면 split 함수를 호출하게 된다

 

 

2-3-1-1. blob_request_submit_op_single()

블록 디바이스에서 단일 io 처리 방식으로 읽을 때 호출되는 함수이다

 

 

2-3-1-2. cb_fn()

할당에 실패하는 경우 에러를 출력하는 cb_fn을 콜백한다

 

동일한 이름의 사용자 정의 콜백 함수가 정말 많았으나

spdk_bs_cpl 구조체의 
spdk_blob_op_complete에 해당하는 콜백 함수로 예상된다

 

 

2-3-2-1. blob_request_submit_op_split()

블록 디바이스에서 분할 io 처리 방식으로 읽을 때 호출되는 함수이다

 

 

2-3-2-2. blob_request_submit_op_split_next()

 

split 함수가 정상적으로 실행되면

split_next 함수도 호출한다

 

2-4. blob_request_submit_op()

 

split next 함수의 Spdk_blob_read case에서

Spdk_blob_io_read()를 호출하고

 

이전에 io처리 방식을 결정했던

blob_request_submit_op 로

다시 돌아오게 된다

 

 

 

 

 

728x90