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 관리] 로키 미션 제출합니다. #2

Open
wants to merge 14 commits into
base: HaiSeong
Choose a base branch
from

Conversation

HaiSeong
Copy link
Collaborator

페이지는 어떻게 구성되나요?

public class Page {
    private final int pageNum;
    private byte[] data;
    private boolean dirty;
...
}
  • Page 객체에는 페이지 번호, 데이터 저장/조회를 위한 byte 배열, 더티 페이지 여부를 구성했습니다.
  • 페이지에도 메타 데이터를 위한 헤더가 필요할것 같지만 아직 레코드를 구현하지 않아 구현을 보류했습니다.

페이지 교체 알고리즘은 어떤 것으로 결정하고, 왜 결정했나요?

  • LRU (Least Recently Used) 알고리즘을 이용해서 구현했습니다.
  • 가장 간단한 구현으로 좋은 성능을 낼 수 있다 판단했습니다.
    • 대량의 데이터를 읽는 경우를 제외하고 자주 사용되는 데이터는 앞으로도 사용될 가능성이 높다고 판단했습니다.
    • 반대로 최근에 사용되지 않았다면 앞으로 사용되지 않을 가능성이 높다고 판단됩니다.
  • 추후에 확장이 가능하도록 PageReplacementPolicy 인터페이스로 추상화 하였습니다.
  • LRU-k 알고리즘을 고려중입니다.
    • 마지막 k번 조회된 시점을 기준으로 판단하여 LRU 보다 hit 확률을 높임

스크레치 페이지

  • 스크래치 페이지(임시 페이지)를 구현했습니다.
  • 스크래치 페이지는 파일에 저장되지 않고 메모리에 임시 저장됩니다.
  • 스크래치 페이지는 페이지 교체 알고리즘을 따르지 않고 명시적으로 해제하기 전까지 버퍼풀에 고정되도록 하였습니다.

@HaiSeong HaiSeong added the enhancement New feature or request label Aug 27, 2024
@HaiSeong HaiSeong self-assigned this Aug 27, 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 +9 to +13
private final Map<String, PagedFile> openFiles;

public PagedFileManager(Map<String, PagedFile> openFiles) {
this.openFiles = openFiles;
}
Copy link
Member

Choose a reason for hiding this comment

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

[질문] open된 파일을 메모리에서 갖고 있는 것이 어떤 이점이 있나요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

우선 RedBase Project의 기본 인터페이스에서 open 된 파일들을 관리하는것을 보고 같은 설계 방향으로 고려해봤습니다.
open된 파일을 관리하게 되면 더이상 파일의 블럭을 사용하지 않아 파일을 close 되었을때 명시적으로 파일을 close 시켜줄 수 있습니다. 이를 통해 자원의 누수를 막을 수 있다고 생각했습니다. 이 점이 큰 장점이라 생각했습니다.

@@ -1,19 +1,34 @@
package database.page;

public class Page {
Copy link
Member

Choose a reason for hiding this comment

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

Serializable에 대해 학습해보면 좋을것 같습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Serializable로 직렬화 할수도 있지만 단점도 명확히 존재한다 생각하여 byte 단위로 직접 파일에 접근하는 방식을 사용해 보겠습니다!

@@ -3,7 +3,8 @@
public class Application {

public static void main(String[] args) {
DatabaseServer server = new DatabaseServer(3306);
ParameterHandler parameterHandler = new ParameterHandler(args);
Copy link
Member

Choose a reason for hiding this comment

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

👍🏻


public class ParameterHandler {

private static final Map<String, String> DEFAULT_OPTIONS = Map.of(
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 +16 to +21
public Page getPage(PageId pageId) {
if (!pageBuffer.containsKey(pageId)) {
return null;
}
return pageBuffer.get(pageId);
}
Copy link
Member

Choose a reason for hiding this comment

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

Optional을 활용해보는 것은 어떠신가요?

}

public long getPageNum() {
public int getPageNum() {
Copy link
Member

Choose a reason for hiding this comment

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

저도 고민했던 사항인데, 페이지 번호는 평균적으로 int 범위를 넘어갈 정도로 많나요?(궁금)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

사실 int 로 해도 충분하다 생각했습니다. mysql의 경우도 int 타입을 사용한다고 알고 있습니다!

Comment on lines +19 to +20
private static final String testFileName = "testfile.db";
private static final String oldFileName = "oldFile.db";
Copy link
Member

Choose a reason for hiding this comment

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

파일 확장자가 db인 이유가 있나요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

딱히 확장자 이름을 모르겠어서 db 라는 확장자를 사용했습니다. innodb 와 동일하게 idb 확장자를 따를까 고민중입니다!

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