From 9478b64da2f09f9bd3f996a173da98d47f9c7b4c Mon Sep 17 00:00:00 2001 From: Frederic Suter Date: Tue, 3 Sep 2019 14:15:53 +0200 Subject: [PATCH] working implementation of storage on disks + add a s4u::Disk + modify a lot of things to make it working + add a small example to test read/write --- MANIFEST.in | 2 + examples/platforms/hosts_with_disks.xml | 4 +- examples/s4u/CMakeLists.txt | 2 +- examples/s4u/io-disk-raw/s4u-io-disk-raw.cpp | 57 +++++++++++++ examples/s4u/io-disk-raw/s4u-io-disk-raw.tesh | 11 +++ include/simgrid/forward.h | 4 + include/simgrid/s4u.hpp | 1 + include/simgrid/s4u/Disk.hpp | 85 +++++++++++++++++++ include/simgrid/s4u/Engine.hpp | 6 ++ include/simgrid/s4u/Host.hpp | 1 + include/simgrid/s4u/Io.hpp | 3 + src/kernel/EngineImpl.hpp | 1 + src/kernel/activity/IoImpl.cpp | 14 ++- src/kernel/activity/IoImpl.hpp | 2 + src/kernel/resource/DiskImpl.cpp | 9 +- src/kernel/resource/DiskImpl.hpp | 3 +- src/s4u/s4u_Disk.cpp | 80 +++++++++++++++++ src/s4u/s4u_Engine.cpp | 30 +++++++ src/s4u/s4u_Host.cpp | 4 + src/s4u/s4u_Io.cpp | 28 ++++-- src/surf/HostImpl.cpp | 9 ++ src/surf/HostImpl.hpp | 2 + src/surf/disk_s19.cpp | 2 +- src/surf/host_clm03.cpp | 10 ++- tools/cmake/DefinePackages.cmake | 2 + 25 files changed, 350 insertions(+), 22 deletions(-) create mode 100644 examples/s4u/io-disk-raw/s4u-io-disk-raw.cpp create mode 100644 examples/s4u/io-disk-raw/s4u-io-disk-raw.tesh create mode 100644 include/simgrid/s4u/Disk.hpp create mode 100644 src/s4u/s4u_Disk.cpp diff --git a/MANIFEST.in b/MANIFEST.in index 165ccda4b9..5a4621f5c1 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1946,6 +1946,7 @@ include include/simgrid/s4u/Actor.hpp include include/simgrid/s4u/Barrier.hpp include include/simgrid/s4u/Comm.hpp include include/simgrid/s4u/ConditionVariable.hpp +include include/simgrid/s4u/Disk.hpp include include/simgrid/s4u/Engine.hpp include include/simgrid/s4u/Exec.hpp include include/simgrid/s4u/Host.hpp @@ -2276,6 +2277,7 @@ include src/s4u/s4u_Actor.cpp include src/s4u/s4u_Barrier.cpp include src/s4u/s4u_Comm.cpp include src/s4u/s4u_ConditionVariable.cpp +include src/s4u/s4u_Disk.cpp include src/s4u/s4u_Engine.cpp include src/s4u/s4u_Exec.cpp include src/s4u/s4u_Host.cpp diff --git a/examples/platforms/hosts_with_disks.xml b/examples/platforms/hosts_with_disks.xml index d543c25063..b59a8d197c 100644 --- a/examples/platforms/hosts_with_disks.xml +++ b/examples/platforms/hosts_with_disks.xml @@ -3,13 +3,13 @@ - + - + diff --git a/examples/s4u/CMakeLists.txt b/examples/s4u/CMakeLists.txt index e6d1930592..5672278463 100644 --- a/examples/s4u/CMakeLists.txt +++ b/examples/s4u/CMakeLists.txt @@ -10,7 +10,7 @@ foreach (example actor-create actor-daemon actor-exiting actor-join actor-kill energy-exec energy-boot energy-link energy-vm engine-filtering exec-async exec-basic exec-dvfs exec-ptask exec-remote exec-waitany - io-async io-file-system io-file-remote io-storage-raw + io-async io-file-system io-file-remote io-storage-raw io-disk-raw platform-failures platform-profile platform-properties plugin-hostload replay-comm replay-storage diff --git a/examples/s4u/io-disk-raw/s4u-io-disk-raw.cpp b/examples/s4u/io-disk-raw/s4u-io-disk-raw.cpp new file mode 100644 index 0000000000..a490816774 --- /dev/null +++ b/examples/s4u/io-disk-raw/s4u-io-disk-raw.cpp @@ -0,0 +1,57 @@ +/* Copyright (c) 2017-2019. The SimGrid Team. All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "simgrid/s4u.hpp" +#include +#include + +XBT_LOG_NEW_DEFAULT_CATEGORY(disk, "Messages specific for this simulation"); + +static void host() +{ + /* - Display information on the disks mounted by the current host */ + XBT_INFO("*** Storage info on %s ***", simgrid::s4u::Host::current()->get_cname()); + + /* - Retrieve all mount points of current host */ + std::vector const& disk_list = simgrid::s4u::Host::current()->get_disks(); + + /* - For each disk mounted on host, display disk name and mount point */ + for (auto disk : disk_list) + XBT_INFO("Disk name: %s", disk->get_cname()); + + /* - Write 400,000 bytes on Disk4 */ + simgrid::s4u::Disk* disk = simgrid::s4u::Disk::by_name("Disk1"); + sg_size_t write = disk->write(400000); + XBT_INFO("Wrote %llu bytes on '%s'", write, disk->get_cname()); + + /* - Now read 200,000 bytes */ + sg_size_t read = disk->read(200000); + XBT_INFO("Read %llu bytes on '%s'", read, disk->get_cname()); + + /* - Attach some user data to disk1 */ + XBT_INFO("*** Get/set data for storage element: Disk1 ***"); + + std::string* data = static_cast(disk->get_data()); + + XBT_INFO("Get storage data: '%s'", data ? data->c_str() : "No user data"); + + disk->set_data(new std::string("Some user data")); + data = static_cast(disk->get_data()); + XBT_INFO("Set and get data: '%s'", data->c_str()); + delete data; +} + +int main(int argc, char** argv) +{ + simgrid::s4u::Engine e(&argc, argv); + e.load_platform(argv[1]); + + simgrid::s4u::Actor::create("", simgrid::s4u::Host::by_name("bob"), host); + + e.run(); + XBT_INFO("Simulated time: %g", simgrid::s4u::Engine::get_clock()); + + return 0; +} diff --git a/examples/s4u/io-disk-raw/s4u-io-disk-raw.tesh b/examples/s4u/io-disk-raw/s4u-io-disk-raw.tesh new file mode 100644 index 0000000000..a1967ac6f1 --- /dev/null +++ b/examples/s4u/io-disk-raw/s4u-io-disk-raw.tesh @@ -0,0 +1,11 @@ +#!/usr/bin/env tesh + +$ ${bindir}/s4u-io-disk-raw ${platfdir}/hosts_with_disks.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (1:@bob) *** Storage info on bob *** +> [ 0.000000] (1:@bob) Disk name: Disk1 +> [ 0.010000] (1:@bob) Wrote 400000 bytes on 'Disk1' +> [ 0.012000] (1:@bob) Read 200000 bytes on 'Disk1' +> [ 0.012000] (1:@bob) *** Get/set data for storage element: Disk1 *** +> [ 0.012000] (1:@bob) Get storage data: 'No user data' +> [ 0.012000] (1:@bob) Set and get data: 'Some user data' +> [ 0.012000] (0:maestro@) Simulated time: 0.012 diff --git a/include/simgrid/forward.h b/include/simgrid/forward.h index 840569927b..8ce7d7b8e6 100644 --- a/include/simgrid/forward.h +++ b/include/simgrid/forward.h @@ -81,6 +81,7 @@ typedef boost::intrusive_ptr SemaphorePtr; XBT_PUBLIC void intrusive_ptr_release(Semaphore* m); XBT_PUBLIC void intrusive_ptr_add_ref(Semaphore* m); +class Disk; class Storage; } // namespace s4u @@ -185,6 +186,7 @@ typedef simgrid::s4u::File s4u_File; typedef simgrid::s4u::ConditionVariable s4u_ConditionVariable; typedef simgrid::s4u::Mutex s4u_Mutex; typedef simgrid::s4u::Semaphore s4u_Semaphore; +typedef simgrid::s4u::Disk s4u_Disk; typedef simgrid::s4u::Storage s4u_Storage; typedef simgrid::s4u::NetZone s4u_NetZone; typedef simgrid::s4u::VirtualMachine s4u_VM; @@ -207,6 +209,7 @@ typedef struct s4u_File s4u_File; typedef struct s4u_ConditionVariable s4u_ConditionVariable; typedef struct s4u_Mutex s4u_Mutex; typedef struct s4u_Semaphore s4u_Semaphore; +typedef struct s4u_Disk s4u_Disk; typedef struct s4u_Storage s4u_Storage; typedef struct s4u_NetZone s4u_NetZone; typedef struct s4u_VM s4u_VM; @@ -228,6 +231,7 @@ typedef s4u_Semaphore* sg_sem_t; typedef s4u_NetZone* sg_netzone_t; typedef s4u_Host* sg_host_t; typedef s4u_Link* sg_link_t; +typedef s4u_Disk* sg_disk_t; typedef s4u_Storage* sg_storage_t; typedef s4u_File* sg_file_t; typedef s4u_VM* sg_vm_t; diff --git a/include/simgrid/s4u.hpp b/include/simgrid/s4u.hpp index dcbc463eb3..7dc400515a 100644 --- a/include/simgrid/s4u.hpp +++ b/include/simgrid/s4u.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include diff --git a/include/simgrid/s4u/Disk.hpp b/include/simgrid/s4u/Disk.hpp new file mode 100644 index 0000000000..29ea07db5a --- /dev/null +++ b/include/simgrid/s4u/Disk.hpp @@ -0,0 +1,85 @@ +/* Copyright (c) 2019. The SimGrid Team. All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#ifndef INCLUDE_SIMGRID_S4U_DISK_HPP_ +#define INCLUDE_SIMGRID_S4U_DISK_HPP_ + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace simgrid { +namespace s4u { + +/** Disk represent the disk resources associated to a host + * + * By default, SimGrid does not keep track of the actual data being written but + * only computes the time taken by the corresponding data movement. + */ + +class XBT_PUBLIC Disk : public xbt::Extendable { + friend Engine; + friend Io; + friend kernel::resource::DiskImpl; + +public: + explicit Disk(const std::string& name, kernel::resource::DiskImpl* pimpl); + +protected: + virtual ~Disk() = default; + +public: + /** @brief Callback signal fired when a new Storage is created */ + static xbt::signal on_creation; + /** @brief Callback signal fired when a Storage is destroyed */ + static xbt::signal on_destruction; + /** @brief Callback signal fired when a Storage's state changes */ + static xbt::signal on_state_change; + + /** Retrieve a Storage by its name. It must exist in the platform file */ + static Disk* by_name(const std::string& name); + static Disk* by_name_or_null(const std::string& name); + + /** @brief Retrieves the name of that storage as a C++ string */ + std::string const& get_name() const { return name_; } + /** @brief Retrieves the name of that storage as a C string */ + const char* get_cname() const { return name_.c_str(); } + + Host* get_host() { return attached_to_; }; + void set_host(Host* host) { attached_to_ = host; } + + const std::unordered_map* get_properties() const; + const char* get_property(const std::string& key) const; + void set_property(const std::string&, const std::string& value); + + void set_data(void* data) { userdata_ = data; } + void* get_data() { return userdata_; } + + IoPtr io_init(sg_size_t size, s4u::Io::OpType type); + + IoPtr read_async(sg_size_t size); + sg_size_t read(sg_size_t size); + + IoPtr write_async(sg_size_t size); + sg_size_t write(sg_size_t size); + kernel::resource::DiskImpl* get_impl() const { return pimpl_; } + +private: + Host* attached_to_ = nullptr; + kernel::resource::DiskImpl* const pimpl_; + std::string name_; + void* userdata_ = nullptr; +}; + +} // namespace s4u +} // namespace simgrid + +#endif /* INCLUDE_SIMGRID_S4U_DISK_HPP_ */ diff --git a/include/simgrid/s4u/Engine.hpp b/include/simgrid/s4u/Engine.hpp index 941b7cde68..acca2fb055 100644 --- a/include/simgrid/s4u/Engine.hpp +++ b/include/simgrid/s4u/Engine.hpp @@ -87,6 +87,7 @@ protected: #ifndef DOXYGEN friend Host; friend Link; + friend Disk; friend Storage; friend kernel::routing::NetPoint; friend kernel::routing::NetZoneImpl; @@ -95,6 +96,8 @@ protected: void host_unregister(const std::string& name); void link_register(const std::string& name, Link* link); void link_unregister(const std::string& name); + void disk_register(const std::string& name, Disk* storage); + void disk_unregister(const std::string& name); void storage_register(const std::string& name, Storage* storage); void storage_unregister(const std::string& name); void netpoint_register(simgrid::kernel::routing::NetPoint* card); @@ -119,6 +122,9 @@ public: std::vector get_all_actors(); std::vector get_filtered_actors(const std::function& filter); + Disk* disk_by_name(const std::string& name); + Disk* disk_by_name_or_null(const std::string& name); + size_t get_storage_count(); std::vector get_all_storages(); Storage* storage_by_name(const std::string& name); diff --git a/include/simgrid/s4u/Host.hpp b/include/simgrid/s4u/Host.hpp index 7702d6bfb6..16c5ffe862 100644 --- a/include/simgrid/s4u/Host.hpp +++ b/include/simgrid/s4u/Host.hpp @@ -115,6 +115,7 @@ public: void set_pstate(int pstate_index); int get_pstate() const; + std::vector get_disks() const; std::vector get_attached_storages() const; /** Get an associative list [mount point]->[Storage] of all local mount points. diff --git a/include/simgrid/s4u/Io.hpp b/include/simgrid/s4u/Io.hpp index d486b342f1..73593abf41 100644 --- a/include/simgrid/s4u/Io.hpp +++ b/include/simgrid/s4u/Io.hpp @@ -26,17 +26,20 @@ public: private: Storage* storage_ = nullptr; + Disk* disk_ = nullptr; sg_size_t size_ = 0; OpType type_ = OpType::READ; std::string name_ = ""; std::atomic_int_fast32_t refcount_{0}; explicit Io(sg_storage_t storage, sg_size_t size, OpType type); + explicit Io(sg_disk_t disk, sg_size_t size, OpType type); public: #ifndef DOXYGEN friend XBT_PUBLIC void intrusive_ptr_release(simgrid::s4u::Io* i); friend XBT_PUBLIC void intrusive_ptr_add_ref(simgrid::s4u::Io* i); + friend Disk; // Factory of IOs friend Storage; // Factory of IOs #endif diff --git a/src/kernel/EngineImpl.hpp b/src/kernel/EngineImpl.hpp index f82414901d..2a197f51ce 100644 --- a/src/kernel/EngineImpl.hpp +++ b/src/kernel/EngineImpl.hpp @@ -15,6 +15,7 @@ namespace kernel { class EngineImpl { std::map hosts_; std::map links_; + std::map disks_; std::map storages_; std::unordered_map netpoints_; friend s4u::Engine; diff --git a/src/kernel/activity/IoImpl.cpp b/src/kernel/activity/IoImpl.cpp index 6022c2d9bb..63f5381293 100644 --- a/src/kernel/activity/IoImpl.cpp +++ b/src/kernel/activity/IoImpl.cpp @@ -7,6 +7,7 @@ #include "simgrid/Exception.hpp" #include "simgrid/kernel/resource/Action.hpp" #include "simgrid/s4u/Host.hpp" +#include "src/kernel/resource/DiskImpl.hpp" #include "src/mc/mc_replay.hpp" #include "src/simix/smx_private.hpp" #include "src/surf/StorageImpl.hpp" @@ -44,6 +45,12 @@ IoImpl& IoImpl::set_size(sg_size_t size) return *this; } +IoImpl& IoImpl::set_disk(resource::DiskImpl* disk) +{ + disk_ = disk; + return *this; +} + IoImpl& IoImpl::set_storage(resource::StorageImpl* storage) { storage_ = storage; @@ -53,7 +60,10 @@ IoImpl& IoImpl::set_storage(resource::StorageImpl* storage) IoImpl* IoImpl::start() { state_ = SIMIX_RUNNING; - surf_action_ = storage_->io_start(size_, type_); + if (storage_) + surf_action_ = storage_->io_start(size_, type_); + else + surf_action_ = disk_->io_start(size_, type_); surf_action_->set_activity(this); XBT_DEBUG("Create IO synchro %p %s", this, get_cname()); @@ -66,7 +76,7 @@ void IoImpl::post() { performed_ioops_ = surf_action_->get_cost(); if (surf_action_->get_state() == resource::Action::State::FAILED) { - if (storage_ && not storage_->is_on()) + if ((storage_ && not storage_->is_on()) || (disk_ && not disk_->is_on())) state_ = SIMIX_FAILED; else state_ = SIMIX_CANCELED; diff --git a/src/kernel/activity/IoImpl.hpp b/src/kernel/activity/IoImpl.hpp index 2ab4ff700d..8d8f04c8c6 100644 --- a/src/kernel/activity/IoImpl.hpp +++ b/src/kernel/activity/IoImpl.hpp @@ -16,6 +16,7 @@ namespace activity { class XBT_PUBLIC IoImpl : public ActivityImpl_T { resource::StorageImpl* storage_ = nullptr; + resource::DiskImpl* disk_ = nullptr; sg_size_t size_ = 0; s4u::Io::OpType type_ = s4u::Io::OpType::READ; sg_size_t performed_ioops_ = 0; @@ -24,6 +25,7 @@ public: IoImpl& set_size(sg_size_t size); IoImpl& set_type(s4u::Io::OpType type); IoImpl& set_storage(resource::StorageImpl* storage); + IoImpl& set_disk(resource::DiskImpl* disk); sg_size_t get_performed_ioops() { return performed_ioops_; } diff --git a/src/kernel/resource/DiskImpl.cpp b/src/kernel/resource/DiskImpl.cpp index 5f2a72c9cb..f2877f2684 100644 --- a/src/kernel/resource/DiskImpl.cpp +++ b/src/kernel/resource/DiskImpl.cpp @@ -37,8 +37,7 @@ DiskModel::~DiskModel() DiskImpl::DiskImpl(kernel::resource::Model* model, const std::string& name, kernel::lmm::System* maxminSystem, double read_bw, double write_bw) - : Resource(model, name, maxminSystem->constraint_new(this, std::max(read_bw, write_bw))) -// FIXME , piface_(name, this) + : Resource(model, name, maxminSystem->constraint_new(this, std::max(read_bw, write_bw))), piface_(name, this) { DiskImpl::turn_on(); XBT_DEBUG("Create resource with read_bw '%f' write_bw '%f'", read_bw, write_bw); @@ -59,7 +58,7 @@ void DiskImpl::destroy() { if (not currently_destroying_) { currently_destroying_ = true; - // FIXME s4u::Storage::on_destruction(this->piface_); + s4u::Disk::on_destruction(this->piface_); delete this; } } @@ -78,14 +77,14 @@ void DiskImpl::turn_on() { if (not is_on()) { Resource::turn_on(); - // FIXME s4u::Storage::on_state_change(this->piface_); + s4u::Disk::on_state_change(this->piface_); } } void DiskImpl::turn_off() { if (is_on()) { Resource::turn_off(); - // FIXME s4u::Storage::on_state_change(this->piface_); + s4u::Disk::on_state_change(this->piface_); } } diff --git a/src/kernel/resource/DiskImpl.hpp b/src/kernel/resource/DiskImpl.hpp index 8645dd0f07..dde80f529b 100644 --- a/src/kernel/resource/DiskImpl.hpp +++ b/src/kernel/resource/DiskImpl.hpp @@ -6,6 +6,7 @@ #include "simgrid/kernel/resource/Action.hpp" #include "simgrid/kernel/resource/Model.hpp" #include "simgrid/kernel/resource/Resource.hpp" +#include "simgrid/s4u/Disk.hpp" #include "simgrid/s4u/Io.hpp" #include "src/surf/PropertyHolder.hpp" #include "src/surf/surf_interface.hpp" @@ -57,7 +58,7 @@ public: ~DiskImpl() override; /** @brief Public interface */ - // FIXME s4u::Storage piface_; + s4u::Disk piface_; /** @brief Check if the Storage is used (if an action currently uses its resources) */ bool is_used() override; diff --git a/src/s4u/s4u_Disk.cpp b/src/s4u/s4u_Disk.cpp new file mode 100644 index 0000000000..b543f9499e --- /dev/null +++ b/src/s4u/s4u_Disk.cpp @@ -0,0 +1,80 @@ +/* Copyright (c) 2019. The SimGrid Team. All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "simgrid/s4u/Disk.hpp" +#include "simgrid/s4u/Engine.hpp" +#include "simgrid/s4u/Host.hpp" +#include "simgrid/s4u/Io.hpp" +#include "src/kernel/resource/DiskImpl.hpp" + +namespace simgrid { +namespace xbt { +template class Extendable; +} // namespace xbt + +namespace s4u { + +xbt::signal Disk::on_creation; +xbt::signal Disk::on_destruction; +xbt::signal Disk::on_state_change; + +Disk::Disk(const std::string& name, kernel::resource::DiskImpl* pimpl) : pimpl_(pimpl), name_(name) +{ + Engine::get_instance()->disk_register(name_, this); +} + +Disk* Disk::by_name(const std::string& name) +{ + return Engine::get_instance()->disk_by_name(name); +} + +Disk* Disk::by_name_or_null(const std::string& name) +{ + return Engine::get_instance()->disk_by_name_or_null(name); +} + +const std::unordered_map* Disk::get_properties() const +{ + return pimpl_->get_properties(); +} + +const char* Disk::get_property(const std::string& key) const +{ + return this->pimpl_->get_property(key); +} + +void Disk::set_property(const std::string& key, const std::string& value) +{ + kernel::actor::simcall([this, &key, &value] { this->pimpl_->set_property(key, value); }); +} + +IoPtr Disk::io_init(sg_size_t size, Io::OpType type) +{ + return IoPtr(new Io(this, size, type)); +} + +IoPtr Disk::read_async(sg_size_t size) +{ + return IoPtr(io_init(size, Io::OpType::READ))->start(); +} + +sg_size_t Disk::read(sg_size_t size) +{ + return IoPtr(io_init(size, Io::OpType::READ))->start()->wait()->get_performed_ioops(); +} + +IoPtr Disk::write_async(sg_size_t size) +{ + + return IoPtr(io_init(size, Io::OpType::WRITE)->start()); +} + +sg_size_t Disk::write(sg_size_t size) +{ + return IoPtr(io_init(size, Io::OpType::WRITE))->start()->wait()->get_performed_ioops(); +} + +} // namespace s4u +} // namespace simgrid diff --git a/src/s4u/s4u_Engine.cpp b/src/s4u/s4u_Engine.cpp index 64cb7f62bd..c92bdaa769 100644 --- a/src/s4u/s4u_Engine.cpp +++ b/src/s4u/s4u_Engine.cpp @@ -8,6 +8,7 @@ #include "mc/mc.h" #include "simgrid/kernel/routing/NetPoint.hpp" #include "simgrid/kernel/routing/NetZoneImpl.hpp" +#include "simgrid/s4u/Disk.hpp" #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/Host.hpp" #include "simgrid/s4u/Mailbox.hpp" @@ -210,6 +211,25 @@ std::vector Engine::get_all_storages() return res; } +/** @brief Find a disk from its name. + * + * @throw std::invalid_argument if the searched disk does not exist. + */ +Disk* Engine::disk_by_name(const std::string& name) +{ + if (pimpl->disks_.find(name) == pimpl->disks_.end()) + throw std::invalid_argument(std::string("Disk not found: ") + name); + + return pimpl->disks_.at(name); +} + +/** @brief Find a disk from its name (or nullptr if that disk does not exist) */ +Disk* Engine::disk_by_name_or_null(const std::string& name) +{ + auto disk = pimpl->disks_.find(name); + return disk == pimpl->disks_.end() ? nullptr : disk->second; +} + /** @brief Find a storage from its name. * * @throw std::invalid_argument if the searched storage does not exist. @@ -239,6 +259,16 @@ void Engine::storage_unregister(const std::string& name) pimpl->storages_.erase(name); } +void Engine::disk_register(const std::string& name, Disk* disk) +{ + pimpl->disks_[name] = disk; +} + +void Engine::disk_unregister(const std::string& name) +{ + pimpl->disks_.erase(name); +} + /** @brief Returns the amount of links in the platform */ size_t Engine::get_link_count() { diff --git a/src/s4u/s4u_Host.cpp b/src/s4u/s4u_Host.cpp index 29eb24bf9f..02698af270 100644 --- a/src/s4u/s4u_Host.cpp +++ b/src/s4u/s4u_Host.cpp @@ -284,6 +284,10 @@ int Host::get_pstate() const return this->pimpl_cpu->get_pstate(); } +std::vector Host::get_disks() const +{ + return kernel::actor::simcall([this] { return this->pimpl_->get_disks(); }); +} /** * @ingroup simix_storage_management * @brief Returns the list of storages attached to a host. diff --git a/src/s4u/s4u_Io.cpp b/src/s4u/s4u_Io.cpp index 924dfec086..4cf33bc8d4 100644 --- a/src/s4u/s4u_Io.cpp +++ b/src/s4u/s4u_Io.cpp @@ -3,6 +3,7 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include "simgrid/s4u/Disk.hpp" #include "simgrid/s4u/Io.hpp" #include "simgrid/s4u/Storage.hpp" #include "src/kernel/activity/IoImpl.hpp" @@ -13,6 +14,12 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_io, s4u_activity, "S4U asynchronous IOs"); namespace simgrid { namespace s4u { +Io::Io(sg_disk_t disk, sg_size_t size, OpType type) : disk_(disk), size_(size), type_(type) +{ + Activity::set_remaining(size_); + pimpl_ = kernel::activity::IoImplPtr(new kernel::activity::IoImpl()); +} + Io::Io(sg_storage_t storage, sg_size_t size, OpType type) : storage_(storage), size_(size), type_(type) { Activity::set_remaining(size_); @@ -22,12 +29,21 @@ Io::Io(sg_storage_t storage, sg_size_t size, OpType type) : storage_(storage), s Io* Io::start() { kernel::actor::simcall([this] { - (*boost::static_pointer_cast(pimpl_)) - .set_name(name_) - .set_storage(storage_->get_impl()) - .set_size(size_) - .set_type(type_) - .start(); + if (storage_) { + (*boost::static_pointer_cast(pimpl_)) + .set_name(name_) + .set_storage(storage_->get_impl()) + .set_size(size_) + .set_type(type_) + .start(); + } else { + (*boost::static_pointer_cast(pimpl_)) + .set_name(name_) + .set_disk(disk_->get_impl()) + .set_size(size_) + .set_type(type_) + .start(); + } }); state_ = State::STARTED; return this; diff --git a/src/surf/HostImpl.cpp b/src/surf/HostImpl.cpp index e598461f5f..a749282b60 100644 --- a/src/surf/HostImpl.cpp +++ b/src/surf/HostImpl.cpp @@ -147,6 +147,15 @@ size_t HostImpl::get_actor_count() { return process_list_.size(); } + +std::vector HostImpl::get_disks() +{ + std::vector disks; + for (auto const& d : disks_) + disks.push_back(&d->piface_); + return disks; +} + std::vector HostImpl::get_attached_storages() { std::vector storages; diff --git a/src/surf/HostImpl.hpp b/src/surf/HostImpl.hpp index b5f4d5c9bd..daf38412b7 100644 --- a/src/surf/HostImpl.hpp +++ b/src/surf/HostImpl.hpp @@ -7,6 +7,7 @@ #define SURF_HOST_INTERFACE_HPP_ #include "src/kernel/actor/ActorImpl.hpp" +#include "src/kernel/resource/DiskImpl.hpp" #include "src/surf/PropertyHolder.hpp" #include "src/surf/StorageImpl.hpp" #include "src/surf/cpu_interface.hpp" @@ -47,6 +48,7 @@ public: explicit HostImpl(s4u::Host* host); virtual ~HostImpl(); + std::vector get_disks(); /** @brief Get the vector of storages (by names) attached to the Host */ virtual std::vector get_attached_storages(); diff --git a/src/surf/disk_s19.cpp b/src/surf/disk_s19.cpp index 160279aa69..c8730947ed 100644 --- a/src/surf/disk_s19.cpp +++ b/src/surf/disk_s19.cpp @@ -66,7 +66,7 @@ DiskS19::DiskS19(DiskModel* model, const std::string& name, lmm::System* maxminS : DiskImpl(model, name, maxminSystem, read_bw, write_bw) { XBT_DEBUG("Create resource with read_bw '%f' write_bw '%f'", read_bw, write_bw); - // FIXME s4u::Storage::on_creation(this->piface_); + s4u::Disk::on_creation(this->piface_); } DiskAction* DiskS19::io_start(sg_size_t size, s4u::Io::OpType type) diff --git a/src/surf/host_clm03.cpp b/src/surf/host_clm03.cpp index 7aa840b985..955e6b8252 100644 --- a/src/surf/host_clm03.cpp +++ b/src/surf/host_clm03.cpp @@ -36,17 +36,19 @@ double HostCLM03Model::next_occuring_event(double now) double min_by_net = surf_network_model->next_occuring_event_is_idempotent() ? surf_network_model->next_occuring_event(now) : -1; double min_by_sto = surf_storage_model->next_occuring_event(now); + double min_by_dsk = surf_disk_model->next_occuring_event(now); - XBT_DEBUG("model %p, %s min_by_cpu %f, %s min_by_net %f, %s min_by_sto %f", - this, typeid(surf_cpu_model_pm).name(), min_by_cpu, - typeid(surf_network_model).name(), min_by_net, - typeid(surf_storage_model).name(), min_by_sto); + XBT_DEBUG("model %p, %s min_by_cpu %f, %s min_by_net %f, %s min_by_sto %f, %s min_by_dsk %f", this, + typeid(surf_cpu_model_pm).name(), min_by_cpu, typeid(surf_network_model).name(), min_by_net, + typeid(surf_storage_model).name(), min_by_sto, typeid(surf_disk_model).name(), min_by_dsk); double res = min_by_cpu; if (res < 0 || (min_by_net >= 0.0 && min_by_net < res)) res = min_by_net; if (res < 0 || (min_by_sto >= 0.0 && min_by_sto < res)) res = min_by_sto; + if (res < 0 || (min_by_dsk >= 0.0 && min_by_dsk < res)) + res = min_by_dsk; return res; } diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 7ebc788ef1..6b18fd179c 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -442,6 +442,7 @@ set(S4U_SRC src/s4u/s4u_Barrier.cpp src/s4u/s4u_ConditionVariable.cpp src/s4u/s4u_Comm.cpp + src/s4u/s4u_Disk.cpp src/s4u/s4u_Engine.cpp src/s4u/s4u_Exec.cpp src/s4u/s4u_Host.cpp @@ -711,6 +712,7 @@ set(headers_to_install include/simgrid/s4u/Barrier.hpp include/simgrid/s4u/Comm.hpp include/simgrid/s4u/ConditionVariable.hpp + include/simgrid/s4u/Disk.hpp include/simgrid/s4u/Engine.hpp include/simgrid/s4u/Exec.hpp include/simgrid/s4u/Host.hpp -- 2.20.1