Skip to content
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

[Page File Management] 재즈(함석명) 미션 제출합니다. #5

Conversation

seokmyungham
Copy link
Collaborator

@seokmyungham seokmyungham commented Aug 28, 2024

페이지 메타데이터와 페이지 객체를 정의하고 간단한 글로벌 버퍼 풀을 설계하였습니다.
엔진과 핸들러는 아직 존재하지 않으며, 추후에 엔진은 버퍼 풀을 통해 페이지를 관리하고 데이터를 조작할 수 있습니다.
에러 핸들링은 기능을 추가하면서 개선할 예정입니다.

구현 과정에서 페이지 구조를 학습하였고 페이지 헤더를 커스터마이징 하였습니다.

public class Page implements Serializable {

    public static final int PAGE_SIZE = 16 * 1024;

    private final PageHeader header;
    private final List<Record> records;
    private int freeSpace;
    private int pinCount;
}
public class PageHeader implements Serializable {

    public static final int HEADER_SIZE = 13;

    private final int pageNum;
    private final PageType pageType;
    private int recordCount;
    private boolean isDirty;
}

현재 구현에 필요한 페이지 번호(오프셋), 페이지 타입, 더티 페이지 여부, 레코드 수의 정보를 포함하였습니다.
포함되지 않은 부가 정보들은 필요 시에 추후 추가될 수 있습니다.

현재 버퍼 풀의 페이지 교체 전략을 LinkedHashMap을 통한 LRU(Least Recently Used) 알고리즘을 우선으로 하였는데
InnoDB 버퍼 풀을 참고했을 때 캐시 히트 확률을 높이는데 유리하고, 구현이 단순하여 빠르게 버퍼 풀을 구현하는데 유리하다고 판단하였습니다.

@seokmyungham seokmyungham added the enhancement New feature or request label Aug 28, 2024
@seokmyungham seokmyungham self-assigned this Aug 28, 2024
Copy link
Member

@Chocochip101 Chocochip101 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드가 깔끔해서 가독성이 좋네요!

관련해서 간단한 리뷰 남겼으니 확인해주세요 :)

Comment on lines +3 to +8
public enum PageType {

CLUSTERED_INDEX,
SECONDARY_INDEX,
UNDO_LOG;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

페이지 타입은 어떤 기준으로 나누셨나요?


@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
boolean isBufferPoolOverCapacity = size() > bufferSize;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메서드가 아닌 변수로 분리한 이유가 있나요?

public void writePage(PageId pageId, Page page) {
Path filePath = Paths.get(DIRECTORY_PATH, pageId.getFileName() + FILE_EXTENSION);

try (RandomAccessFile file = new RandomAccessFile(filePath.toString(), "rw")) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏻

Comment on lines +35 to +44
public void flush() {
for (Map.Entry<PageId, Page> entry : bufferPool.entrySet()) {
Page page = entry.getValue();

if (!page.isPinned() && page.isDirty()) {
pageManager.savePage(entry.getKey(), page);
page.setDirty(false);
}
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 플러시 리스트 플러시까지 구현하셨군요 👍🏻

this.recordCount--;
}

public void setDirty(boolean isDirty) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

더 의미있는 메서드들로 나눌수 있을 것 같아요.

return false;
}

private void flushIfDirty(PageId pageId, Page page) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
private void flushIfDirty(PageId pageId, Page page) {
private void flush(PageId pageId, Page page) {

해당 메서드를 사용하는 측에서는 더티 페이지의 여부가 중요하나요?

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

Successfully merging this pull request may close these issues.

2 participants