1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license.
3
4#pragma once
5
6#include <atomic>
7#include <cstdint>
8#include <string>
9
10#include "../core/gc_state.h"
11#include "../core/light_epoch.h"
12#include "../core/guid.h"
13#include "../environment/file.h"
14
15namespace FASTER {
16namespace device {
17
18/// A dummy (null) disk, used when you want an in-memory-only FASTER store.
19
20struct NullHandler {
21};
22
23class NullFile {
24 public:
25 Status Open(NullHandler* handler) {
26 return Status::Ok;
27 }
28 Status Close() {
29 return Status::Ok;
30 }
31 Status Delete() {
32 return Status::Ok;
33 }
34 void Truncate(uint64_t new_begin_offset, GcState::truncate_callback_t callback) {
35 if(callback) {
36 callback(new_begin_offset);
37 }
38 }
39
40 Status ReadAsync(uint64_t source, void* dest, uint32_t length,
41 AsyncIOCallback callback, IAsyncContext& context) const {
42 callback(&context, Status::Ok, length);
43 return Status::Ok;
44 }
45 Status WriteAsync(const void* source, uint64_t dest, uint32_t length,
46 AsyncIOCallback callback, IAsyncContext& context) {
47 callback(&context, Status::Ok, length);
48 return Status::Ok;
49 }
50
51 static size_t alignment() {
52 // Align null device to cache line.
53 return 64;
54 }
55
56 void set_handler(NullHandler* handler) {
57 }
58};
59
60class NullDisk {
61 public:
62 typedef NullHandler handler_t;
63 typedef NullFile file_t;
64 typedef NullFile log_file_t;
65
66 NullDisk(const std::string& filename, LightEpoch& epoch) {
67 }
68
69 static uint32_t sector_size() {
70 return 64;
71 }
72
73 /// Methods required by the (implicit) disk interface.
74 const file_t& log() const {
75 return log_;
76 }
77 file_t& log() {
78 return log_;
79 }
80
81 std::string relative_index_checkpoint_path(const Guid& token) const {
82 assert(false);
83 return "";
84 }
85 std::string index_checkpoint_path(const Guid& token) const {
86 assert(false);
87 return "";
88 }
89
90 std::string relative_cpr_checkpoint_path(const Guid& token) const {
91 assert(false);
92 return "";
93 }
94 std::string cpr_checkpoint_path(const Guid& token) const {
95 assert(false);
96 return "";
97 }
98
99 void CreateIndexCheckpointDirectory(const Guid& token) {
100 assert(false);
101 }
102 void CreateCprCheckpointDirectory(const Guid& token) {
103 assert(false);
104 }
105
106 file_t NewFile(const std::string& relative_path) {
107 assert(false);
108 return file_t{};
109 }
110
111 handler_t& handler() {
112 return handler_;
113 }
114
115 inline static constexpr bool TryComplete() {
116 return false;
117 }
118
119 private:
120 handler_t handler_;
121 file_t log_;
122};
123
124}
125} // namespace FASTER::device