Giter Site home page Giter Site logo

yyu-nim / poseidonos-rtype Goto Github PK

View Code? Open in Web Editor NEW
9.0 3.0 6.0 420.01 MB

poseidonos in rust for fun!

License: BSD 3-Clause "New" or "Revised" License

Makefile 0.31% CMake 0.52% Shell 4.37% C 7.58% Python 5.80% C++ 64.25% Rust 14.32% Filebench WML 0.10% Go 2.74% GDB 0.01%
nvmeof rust storage poseidonos

poseidonos-rtype's Introduction

Poseidon OS R-type

포세이돈 OS의 메모리 안정성을 향상시키기 위한 실험적인 방안의 하나로 RUST 도입을 생각해 볼 수 있다. C++ 애플리케이션을 RUST로 마이그레이션 하는 다양한 방법이 있을 수 있는데, 본 repo에서는 탑다운 방식으로, RUST로 작성된 main()에서 시작하여, POS에 구현된 기능들을 그대로 가져오거나, Fake를 가져오거나, Stub 만드는 방식으로 진행해볼 예정이다. 현재로서는 순수한 호기심/재미/공부의 목적임을 분명히 하고, Poseidon OS 과제의 로드맵과는 관련이 없음을 미리 밝혀둔다. Production에서의 사용을 권하지 않는다. PR 환영!

.cpp 파일에 대해 그에 상응하는 .rs 파일을 하나씩 만들어갈 예정이다. SPDK의 경우에는, stub만 만들어 둘 생각이고 추후에 실제 라이브러리와 링크될 수 있도록 살펴보면 될 것 같고, NVMe 디바이스의 경우에는, fake 구현을 해볼 생각이다.

실행하는 법 1 (Local)

$ cargo run --bin poseidonos
[2022-10-20T11:01:16Z INFO  poseidonos] Hello, PoseidonOS R-type!
[2022-10-20T11:01:16Z INFO  poseidonos_rtype::spdk_wrapper::spdk] waiting for spdk initialization...
[2022-10-20T11:01:16Z INFO  poseidonos_rtype::spdk_wrapper::spdk::spdk_clib] Invoking start_fn in a new thread...
[2022-10-20T11:01:16Z INFO  poseidonos_rtype::spdk_wrapper::spdk] poseidonos started
[2022-10-20T11:01:16Z INFO  poseidonos_rtype::spdk_wrapper::spdk] spdk_app_start result = 0
[2022-10-20T11:01:17Z INFO  poseidonos_rtype::master_context::config_manager] Configuration [transport]
    trType = "TCP"
    bufCacheSize = 64
    numSharedBuf = 4096
    ioUnitSize = 512

    [journal]
    enable = true
    buffer_size_in_mb = 0
    number_of_log_groups = 2
    debug_mode = false
    interval_in_msec_for_metric = 1000
    enable_vsc = true
[2022-10-20T11:01:17Z INFO  poseidonos_rtype::helper::rpc::spdk_rpc_client] SpdkRpcClient is about to create a transport TCP 64 4096 512
[2022-10-20T11:01:17Z INFO  poseidonos_rtype::helper::rpc::spdk_rpc_client] TODO: send json message to domain socket on /var/tmp/spdk.sock
[2022-10-20T11:01:17Z INFO  poseidonos_rtype::metafs::config::metafs_config_manager] need to build a config
[2022-10-20T11:01:17Z INFO  poseidonos_rtype::main::poseidonos] CLI client is sleeping for 3 seconds...
[2022-10-20T11:01:17Z INFO  poseidonos_rtype::main::poseidonos] CLI server is up...
[2022-10-20T11:01:20Z INFO  poseidonos_rtype::main::poseidonos] CLI client is sending CreateArray msg to CLI server...
[2022-10-20T11:01:20Z INFO  poseidonos_rtype::main::poseidonos] Waiting CLI server to terminate...
[2022-10-20T11:01:20Z INFO  poseidonos_rtype::main::poseidonos] Creating POS array...
[2022-10-20T11:01:20Z INFO  poseidonos_rtype::array_mgmt::array_manager] ArrayManager has been created
[2022-10-20T11:01:20Z INFO  poseidonos_rtype::array_mgmt::array_manager] Creating an array POSArray with devices DeviceSet { nvm: ["uram0"], data: ["data1", "data2", "data3"], spares: ["spare1"] } with meta RAID1 and data RAID5
[2022-10-20T11:01:20Z INFO  poseidonos_rtype::array::state::array_state] ArrayState has been created
[2022-10-20T11:01:20Z INFO  poseidonos_rtype::array_components::array_components] [CREATE_ARRAY_DEBUG_MSG] Creating array component for POSArray
[2022-10-20T11:01:21Z INFO  poseidonos_rtype::array::device::array_device_manager] Importing DeviceSet { nvm: ["uram0"], data: ["data1", "data2", "data3"], spares: ["spare1"] }...
[2022-10-20T11:01:21Z INFO  poseidonos_rtype::array::device::array_device_manager] Exporting devices info with DeviceMeta
[2022-10-20T11:01:21Z INFO  poseidonos_rtype::array::array] [UPDATE_ABR_DEBUG_MSG] Trying to save Array to MBR, name:POSArray, metaRaid:RAID1, dataRaid:RAID5
[2022-10-20T11:01:21Z INFO  poseidonos_rtype::array::array] TODO: _CreatePartitions() ...
[2022-10-20T11:01:21Z INFO  poseidonos_rtype::array::array] [POS_TRACE_ARRAY_CREATED] Array has been created
[2022-10-20T11:01:21Z INFO  poseidonos_rtype::metafs::metafs] Creating MetaFs for POSArray with idx 0
[2022-10-20T11:01:21Z INFO  poseidonos_rtype::volume::volume_manager] Creating VolumeManager for POSArray with idx 0
[2022-10-20T11:01:21Z INFO  poseidonos_rtype::network::nvmf] Creating NVMf for POSArray with idx 0
[2022-10-20T11:01:21Z INFO  poseidonos_rtype::allocator::allocator] Creating Allocator for POSArray
[2022-10-20T11:01:21Z INFO  poseidonos_rtype::journal_manager::journal_manager] Creating JournalManager for POSArray

실행하는 법 2 (Codespaces)

repo 첫페이지에 "Code" 녹색 버튼 누른 뒤, "Codespaces" 실행하면 곧바로 vscode web 버전으로 컴파일 및 실행 가능 image

poseidonos-rtype's People

Contributors

cheolho-kang avatar cleanior avatar dhihm avatar dydwls-lee avatar git-ohkwon avatar hsung-yang avatar huijeong-kim avatar isaac-baek avatar jeddy-choi avatar jg121-lim avatar junghyun-34 avatar madcatlove avatar manim777 avatar minjoon-ahn avatar mjlee34 avatar mmm5027 avatar mmschoi avatar munseoplim avatar next0262 avatar parkvibes avatar queoh avatar ray5273 avatar ringopow avatar sejun000 avatar seochokid avatar so931 avatar sungtankim avatar syeonshin avatar wonchul08lee avatar yyu-nim avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

poseidonos-rtype's Issues

pos logger 추가

  1. event id 를 건네주면, event id의 string representation 이 찍히도록.
  2. pos의 structured logging 과 유사하게

WriteSubmission 추가

(branch) https://github.com/yyu-nim/poseidonos-rtype/tree/wip/write_submission

UNVMfSubmitHandler() 에 IO workload generator를 연결하기

"UNVMfSubmitHandler"와 "UNVMfCompleteHandler"는 SPDK에 등록되어 NVMe-oF 요청들이 오고갈때 호출되게 된다. 즉, poseidon-rtype 어딘가에 IO workload generator thread를 하나 만들어서 이 두 function 들과 통신할 수 있게 되면, SPDK 없이도 end-to-end 에 가까운 테스트를 수행할 수 있을 가능성. SPDK 통합이 이루어지기 전까지는, 나름 유용한 통합 테스트를 만들 수 있을지도.

(SPDK 에 등록을 해주는 부분) https://github.com/yyu-nim/poseidonos-rtype/blob/main/src/network/nvmf.rs
(SPDK 에 건네질 핸들러) https://github.com/yyu-nim/poseidonos-rtype/blob/main/src/io/frontend_io/unvmf_io_handler.rs

Device Manager 구현

class DeviceManager
: public IDevInfo
{
public:
    DeviceManager(
        AffinityManager* affinityManager = AffinityManagerSingleton::Instance(),
        SpdkNvmeCaller* spdkNvmeCaller = new SpdkNvmeCaller());

    virtual ~DeviceManager(void);

    virtual void Initialize(IIODispatcher* ioDispatcherInterface); // IIODispatcher Singleton 주입

    virtual void ScanDevs(void); // 지정된 디렉토리에서 UfileSsd에 해당하는 file들의 존재여부를 스캔
    virtual UblockSharedPtr GetDev(DeviceIdentifier& devID);  // UfileSsd 를 arc mutex clone 으로 리턴해줌 (아니면 GetDev 없애는 것도 좋을듯?)
    virtual vector<UblockSharedPtr> GetDevs(void);
    virtual vector<DeviceProperty> ListDevs(void);  // 단순 getter
    virtual void AttachDevice(UblockSharedPtr dev); // UfileSsd 를 DeviceManager에 붙여줄것
    virtual int DetachDevice(DevUid sn);  // UfileSsd를 DeviceManager에서 제외할 것
    virtual int RemoveDevice(UblockSharedPtr dev); // UfileSsd를 삭제할 것 (?)
    virtual struct spdk_nvme_ctrlr* GetNvmeCtrlr(std::string& deviceName);  // UfileSsd에선 필요없을지도

    virtual int IterateDevicesAndDoFunc(DeviceIterFunc func, void* ctx);  // SaveMbr, LoadMbr에 필요한 기능인듯.
    virtual void SetDeviceEventCallback(IDeviceEvent* event);

UfileSsd를 DeviceManager에 통합해볼 것.

Allocator::Init()

  • caller 부분 path 뚫는 것
  • ContextManager::Init()
  • BlockManager::Init()
  • WBStripeManager::Init()

까지 구현해보기. 이 다음은 action item은 Mapper::Init() 이 될 듯.

Callback에 임의의 함수&파라미터 전달할 수 있도록 디자인

#11

몇가지 안을 비교해보고, 한가지 구현해 볼 것.

  1. Callback 파라미터 & 리턴을 enum 타입으로 묶어서 처리
enum CallbackParam {
  CallbackParam1(~, ~, ~),
  CallbackParam2(~, ~), 
  ...
}
enum CallbackResponse {
  CallbackResponse1(~, ~, ~, ~),
  CallbackResponse2(~), 
  ...
}
trait Callback {
  fn Execute(&self, param: CallbackParam) -> CallbackResponse;
}
  1. Trait의 associated type 으로 처리
trait Callback {
  type CallbackParam;
  type CallbackResponse;
  fn Execute(&self, param: Self::CallbackParam) -> Self::CallbackResponse;
}
  1. Any 타입 활용해서 upcasting & downcasting 하기
trait Callback {
  fn Execute(&self, param: Any) -> Any;
}

IArrayInfo를 idiomatic RUST 버전으로 리팩토링

#9 의 코멘트 내용:

IArrayInfo에서 정적인 부분과 동적인 부분을 별도의 데이터 구조로 나누어, 정적인 부분은 clone()으로 항상 데이터 전달하도록 하고 동적인 부분은 lock() 보호. array level에서 명시적으로 어떤 데이터가 보호되어야 할지 드러날 수 있도록 데이터 구조를 가져가면 좋을 듯

Callback의 실행 결과를 blocking 모드로 기다릴 수 있도록 하기

#11

경우에 따라서, callback이 끝나기를 synchronous 하게 기다리고 싶을 수 있다. 예를 들어, pos에서 callback에 flag를 건네주고, caller가 while { usleep }으로 callback이 끝날때까지 기다리도록 하는 코드를 들 수 있다. rust 에서 parker/unparker, waitgroup, oneshot channel 등으로 비슷한 구현을 할 수 있을 것이다. 이를 구현해보기.

SRM의 CopyData 코드 부분 (Memcpy)

현 구현 그대로 C style로 raw pointer 써서 복사 구현할지, 아니면 RUST 방식으로 구현할지 정할 것. MBR 영역이 항상 전체 읽기/쓰기 방식으로 동작하는 것 같으므로, 아예 JSON encoding 하여 통째로 저장하고 읽어오는 것도 고려해볼 수 있음

PR #3

Singleton 리팩토링

#9 (comment)

  1. singleton 들의 dependency graph 파악하고, cycle 이 있다면 없앨 수 있도록 리팩토링
  2. singleton 들의 생성 (Create)과 초기화 (Init)가 분리된 부분들을 합칠 수 있는 부분이 있다면 리팩토링

Abr Manager 관련 path 에서 UBlockSharedPtr의 구현 포팅

현 구현 그대로 UBlock 구현체를 shared ptr로 여러 쓰레드간 공유하여 lock().unwrap()으로 사용하게 하는게 나을지, 아니면 channel 사용버전으로 내부 구현을 하여 UBlock 메서드 호출이, 다른 쓰레드로 메시지를 전달하는 형태로 할지... 디자인 고민해볼 것

PR #3

ubio 코드 (혹은 그것을 사용하는 코드)에 parker/unparker 통합

#24

현재의 구현은, I/O를 issue하고 싶은 주체가 직접 parker/unparker를 생성해서 callback closure에 넘겨주는 방식. 이것은 I/O를 하기 위해 상당히 많은 (?) 사전 지식을 요하는 것으로 볼 수 있으므로, ubio 혹은 관련 코드들에 parker/unparker로 sync를 맞추는 코드가 caller에 보이지 않게 통합될 수 있을지 고민해보고 구현.

Clion 이 hang처럼 되거나 느려지면

  1. Help - Diagnostic Tool - Activity Monitor 에 가서 CPU 사용률이 500% + 이상으로 나타남 확인

  2. Help - Change Memory Setting 에 가서 메모리 제한을 늘려줌 (e.g., 2000 MB -> 8000 MB)

  3. Help - Diagnostic Tool - Activity Monitor 에 가서 CPU 사용률이 50% 미만으로 정상화 됨을 확인

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.