-
Notifications
You must be signed in to change notification settings - Fork 3
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
[Page File Management] 재즈(함석명) 미션 제출합니다. #5
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드가 깔끔해서 가독성이 좋네요!
관련해서 간단한 리뷰 남겼으니 확인해주세요 :)
public enum PageType { | ||
|
||
CLUSTERED_INDEX, | ||
SECONDARY_INDEX, | ||
UNDO_LOG; | ||
} |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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")) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍🏻
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); | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
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) { |
There was a problem hiding this comment.
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) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
private void flushIfDirty(PageId pageId, Page page) { | |
private void flush(PageId pageId, Page page) { |
해당 메서드를 사용하는 측에서는 더티 페이지의 여부가 중요하나요?
페이지 메타데이터와 페이지 객체를 정의하고 간단한 글로벌 버퍼 풀을 설계하였습니다.
엔진과 핸들러는 아직 존재하지 않으며, 추후에 엔진은 버퍼 풀을 통해 페이지를 관리하고 데이터를 조작할 수 있습니다.
에러 핸들링은 기능을 추가하면서 개선할 예정입니다.
구현 과정에서 페이지 구조를 학습하였고 페이지 헤더를 커스터마이징 하였습니다.
현재 구현에 필요한 페이지 번호(오프셋), 페이지 타입, 더티 페이지 여부, 레코드 수의 정보를 포함하였습니다.
포함되지 않은 부가 정보들은 필요 시에 추후 추가될 수 있습니다.
현재 버퍼 풀의 페이지 교체 전략을 LinkedHashMap을 통한 LRU(Least Recently Used) 알고리즘을 우선으로 하였는데
InnoDB 버퍼 풀을 참고했을 때 캐시 히트 확률을 높이는데 유리하고, 구현이 단순하여 빠르게 버퍼 풀을 구현하는데 유리하다고 판단하였습니다.