Advertisement
TShiva

my_ioengine

Oct 3rd, 2017
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. #include "../basic_element/include/disk_performer/DiskPerformer.hpp"
  5. //#include "../basic_element/include/data_entity/RawDataWrite.hpp"
  6. //#include "../basic_element/include/data_entity/system/DataAtom.hpp"
  7. //#include "../basic_element/include/data_entity/system/SolidData.hpp"
  8. #include "../basic_element/include/data_entity/system/SolidDataChain.hpp"
  9.  
  10.  
  11. #include "../../fio/fio/fio.h"
  12.  
  13.  
  14. void open_and_write_in_file(std::string name) {
  15.     std::ofstream my_fd;
  16.     my_fd.open("/home/user/logi/new_log.txt", std::ios_base::app);
  17.     my_fd << name << std::endl;
  18.     my_fd.flush();
  19.     my_fd.close();
  20. }
  21.  
  22. struct be_data_element {
  23.     io_u *io_us;
  24.     std::shared_ptr<SolidDataChain> chain_;
  25. };
  26.  
  27. struct be_data {
  28.     unsigned int queued = 0;
  29.     unsigned int commited = 0;
  30.     std::deque<std::shared_ptr<be_data_element>> buffer_;
  31.     std::shared_ptr<DiskPerformer> PDiskPerformer;
  32.  
  33. };
  34.  
  35. static struct io_u *fio_be_event(struct thread_data *td, int event) {
  36.     struct be_data *bd = (struct be_data *) td->io_ops_data;
  37. //    std::cout<<"вызывается be_event"<<std::endl;
  38.     return bd->buffer_[event]->io_us;
  39. }
  40.  
  41. static int fio_be_getevents(struct thread_data *td, unsigned int min_events, unsigned int max_events,
  42.                             const struct timespec *t) {
  43.     struct be_data *bd = (struct be_data *) td->io_ops_data;
  44.  
  45.     int completed = 0;
  46.     std::cout << "получили события, min_events "<< min_events <<" max_event "<< max_events << std::endl;
  47. //    std::cout << td->files_size << " наименьший и наибольший размер файла " << td->o.file_size_low << "  "
  48. //              << td->o.file_size_high << " имя файла" << td->o.filename << "thread" << td->thread << std::endl;
  49.     if (t != NULL) {
  50.         std::cout << "t " << t << " &t " << &t << std::endl;
  51.         try {
  52. //        unsigned long long timeout = (t->tv_sec * 1000000) + (t->tv_nsec / 1000);
  53.             std::cout << t->tv_sec << "  " << t->tv_sec << "\n";
  54.             std::cout << t->tv_nsec << "  " << t->tv_nsec << "\n";
  55.         }
  56.         catch (std::exception &exception) {
  57.  
  58.             std::cout << exception.what();
  59.  
  60.         }
  61.     } else {
  62.         std::cout << "Время незаполнено" << std::endl;
  63.     while (1) {
  64.  
  65.             if (completed<min_events) {
  66.                 usleep(500);
  67. //    for (__useconds_t i = 0; i <= timeout; i += sleep_step) {
  68.  
  69.  
  70.                 for (auto cock : bd->buffer_) {
  71.  
  72.                     //std::cout<<"sec "<<t->tv_sec<<" nano_sec "<< t->tv_nsec<< std::endl;
  73.                     std::cout << cock->chain_->getResultCode() << std::endl;
  74.                     if (cock->chain_->isChainCompleted()) {
  75.                         completed++;
  76.                         bd->commited--;
  77.                         std::cout << "Chain completed" << std::endl;
  78.                     } else std::cout << "Chain is not completed" << std::endl;
  79.                 }
  80.  
  81.                 std::cout<<"completed" <<completed<<std::endl;
  82. //        if (completed > 0)
  83. //            break;
  84. //        usleep(sleep_step);
  85. //    }
  86.             }
  87.             else return completed;
  88.         }
  89. //        return completed;
  90.     }
  91.  
  92. }
  93.  
  94. static int fio_be_commit(struct thread_data *td) {
  95.     struct be_data *bd = (struct be_data *) td->io_ops_data;
  96.  
  97.     if (!bd->PDiskPerformer)
  98.         return 0;
  99.  
  100.     for (auto cock : bd->buffer_) {
  101.         try {
  102.             bd->PDiskPerformer->pushSolidDataChain(cock->chain_);
  103.         }
  104.         catch(...){
  105.             open_and_write_in_file("ошибка с пушем Chain-a");
  106.         }
  107.     }
  108.     std::cout<<"сделали commit"<<std::endl;
  109.     bd->commited = bd->queued;
  110.     bd->queued = 0;
  111.  
  112.     return 0;
  113. }
  114.  
  115.  
  116. static int fio_be_queue(struct thread_data *td, struct io_u *io_u) {
  117.  
  118.     struct be_data *bd = (struct be_data *) td->io_ops_data;
  119.  
  120.     fio_ro_check(td, io_u);
  121.  
  122.     if (bd->commited)
  123.         return FIO_Q_BUSY;
  124.     if (io_u->ddir == DDIR_WRITE) {
  125.         try {
  126.             payload_data_vector raw_data(io_u->buflen); // выделяем память для вектора
  127.             memcpy((void *) &raw_data[0], io_u->xfer_buf, io_u->buflen); // сырые данные пихаем в буффер
  128.  
  129.             auto p_rdw = std::make_shared<RawDataWrite>(raw_data);
  130.  
  131.             PhysicalRegion pr(0, 0, io_u->offset, io_u->xfer_buflen);
  132.  
  133.             auto p_da = std::make_shared<DataAtom>(0, pr, p_rdw);
  134.             std::vector<std::shared_ptr<DataAtom>> vec_atoms{p_da};
  135.  
  136.             auto p_sd = std::make_shared<SolidData>(std::move(vec_atoms));
  137.             std::vector<std::shared_ptr<SolidData>> vec_solid_data{p_sd};
  138.  
  139.             auto p_sdc = std::make_shared<SolidDataChain>(std::move(vec_solid_data));
  140.             be_data_element bde{io_u, p_sdc};
  141.             auto p_bde = std::make_shared<be_data_element>(bde);
  142.             bd->buffer_.push_back(std::move(p_bde));
  143.         }
  144.         catch (...) {
  145.             std::cerr<<"Обосрались с Queue"<<std::endl;
  146.         }
  147.         bd->queued++;
  148.  
  149.         return FIO_Q_QUEUED;
  150.     } else {
  151.         std::cerr<<"Флаге не на запись"<<std::endl;
  152.         return FIO_Q_BUSY;
  153.     }
  154. }
  155.  
  156. static void fio_be_cleanup(struct thread_data fio_unused *td) {
  157.     struct be_data *bd = (struct be_data *) td->io_ops_data;
  158.     if (bd) {
  159.         delete bd;
  160.     }
  161.     std::cout<<"удалили структуру"<<std::endl;
  162. }
  163.  
  164. static int fio_be_open(struct thread_data fio_unused *td, struct fio_file fio_unused *f) {
  165.     return 0;
  166. }
  167.  
  168. static int fio_be_init(struct thread_data *td) {
  169.     // struct be_data *bd = (struct be_data *) malloc(sizeof(*bd));
  170.     // memset(bd,0,sizeof(*bd));
  171.     struct be_data *bd = new be_data;
  172.     try {
  173.         auto p_ldq = std::unique_ptr<LocalDiskQueue>(new LocalDiskQueue(std::make_shared<EntityStatisticsBuffer>(0), 1,
  174.                                                                         10)); //ебанутое создание указателя на LocalDiskQueue
  175.  
  176.         auto p_hwqb = std::unique_ptr<HWQueueMirrorBuffer>(new HWQueueMirrorBuffer());
  177.  
  178.  
  179.         auto p_esb = std::unique_ptr<EntityStatisticsBuffer>(new EntityStatisticsBuffer(0));
  180.         auto p_dp = std::unique_ptr<DiskPort>(new DiskPort(td->o.filename));
  181.         //DiskPerformer disk(0,td->o.iodepth,std::move(p_ldq),std::move(p_hwqb),std::move(p_esb),std::move(p_dp)); // создание DiskPerformer-a
  182.  
  183.         auto p_disk = std::make_shared<DiskPerformer>(0, td->o.iodepth, std::move(p_ldq), std::move(p_hwqb),
  184.                                                       std::move(p_esb), std::move(p_dp));
  185.  
  186.         bd->PDiskPerformer = p_disk;
  187.         p_disk->startSensorsProcessingThread();
  188.         p_disk->startReceiveResponseThread();
  189.         p_disk->startSendRequestThread();
  190.  
  191.     }
  192.     catch (std::exception &a) {
  193.         std::cerr << a.what() << std::endl;
  194.         std::cerr << "обосрались с созданием указателей";
  195.     }
  196.     /*if (td->o.iodepth != 1){
  197.         be_data_element *bde = new be_data_element;
  198.         bde->io_us = new io_u [td->o.iodepth];//идея в том, что мы хотим ЗАРАНЕЕ выделить память под дек
  199.     } else
  200.         td->io_ops->flags |= FIO_SYNCIO;*/
  201.  
  202.     td->io_ops_data = bd;
  203.  
  204.     return 0;
  205. }
  206. int fio_get_file_size(struct thread_data *td, struct fio_file *ff) {
  207.     ff->real_file_size=10000000;
  208.     fio_file_set_size_known(ff);
  209.     return 0;
  210. }
  211.  
  212.  
  213. #ifndef __cplusplus
  214.  
  215. static struct ioengine_ops ioengine = {
  216. .name       = "BE",
  217. .version    = FIO_IOOPS_VERSION,
  218. .queue      = fio_be_queue,
  219. .commit     = fio_be_commit,
  220. .getevents  = fio_be_getevents,
  221. .event      = fio_be_event,
  222. .init       = fio_be_init,
  223. .cleanup    = fio_be_cleanup,
  224. .open_file  = generic_open_file,
  225. .get_file_size      = fio_get_file_size,
  226. .flags      = FIO_DISKLESSIO | FIO_FAKEIO,
  227. };
  228.  
  229.  
  230. static void fio_init fio_be_register(void)
  231. {
  232. register_ioengine(&ioengine);
  233. }
  234.  
  235. static void fio_exit fio_be_unregister(void)
  236. {
  237. unregister_ioengine(&ioengine);
  238. }
  239.  
  240. #else
  241.  
  242. #ifdef FIO_EXTERNAL_ENGINE
  243. extern "C" {
  244. static struct ioengine_ops ioengine;
  245. void get_ioengine(struct ioengine_ops **ioengine_ptr) {// функция возвращает через свой параметр указатель на структуру
  246.     *ioengine_ptr = &ioengine;
  247.     ioengine.name = "BE";
  248.     ioengine.version = FIO_IOOPS_VERSION;
  249.     ioengine.init = fio_be_init;
  250.     ioengine.queue = fio_be_queue;
  251.     ioengine.commit = fio_be_commit;
  252.     ioengine.getevents = fio_be_getevents;
  253.     ioengine.event = fio_be_event;
  254.     ioengine.cleanup = fio_be_cleanup;
  255.     ioengine.open_file = fio_be_open;
  256.     ioengine.get_file_size = fio_get_file_size;
  257.     ioengine.flags = FIO_DISKLESSIO | FIO_FAKEIO;
  258. } ;
  259. }
  260. #endif /* FIO_EXTERNAL_ENGINE */
  261.  
  262. #endif /* __cplusplus */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement