proxygen
wangle::FilePersistenceLayer< K, V > Class Template Reference

#include <FilePersistentCache-inl.h>

Inheritance diagram for wangle::FilePersistenceLayer< K, V >:
wangle::CachePersistence< K, V >

Public Member Functions

 FilePersistenceLayer (const std::string &file)
 
 ~FilePersistenceLayer () override
 
bool persist (const folly::dynamic &arrayOfKvPairs) noexceptoverride
 
folly::Optional< folly::dynamicload () noexceptoverride
 
void clear () override
 
- Public Member Functions inherited from wangle::CachePersistence< K, V >
 CachePersistence ()
 
virtual ~CachePersistence ()=default
 
bool persistVersionedData (const folly::dynamic &kvPairs, const CacheDataVersion &version)
 
virtual CacheDataVersion getLastPersistedVersion () const
 
virtual void setPersistedVersion (CacheDataVersion version) noexcept
 

Private Attributes

std::string file_
 

Detailed Description

template<typename K, typename V>
class wangle::FilePersistenceLayer< K, V >

Definition at line 26 of file FilePersistentCache-inl.h.

Constructor & Destructor Documentation

template<typename K , typename V >
wangle::FilePersistenceLayer< K, V >::FilePersistenceLayer ( const std::string file)
inlineexplicit

Definition at line 28 of file FilePersistentCache-inl.h.

28 : file_(file) {}

Member Function Documentation

template<typename K , typename V >
void wangle::FilePersistenceLayer< K, V >::clear ( )
overridevirtual

Clears Persistent cache

Implements wangle::CachePersistence< K, V >.

Definition at line 108 of file FilePersistentCache-inl.h.

References wangle::FilePersistenceLayer< K, V >::file_.

Referenced by wangle::FilePersistenceLayer< K, V >::~FilePersistenceLayer().

108  {
109  // This may fail but it's ok
110  ::unlink(file_.c_str());
111 }
template<typename K , typename V >
folly::Optional< folly::dynamic > wangle::FilePersistenceLayer< K, V >::load ( )
overridevirtualnoexcept

Returns a list of key value pairs that are present in this persistence store.

Implements wangle::CachePersistence< K, V >.

Definition at line 87 of file FilePersistentCache-inl.h.

References folly::json::serialization_opts::allow_non_string_keys, wangle::FilePersistenceLayer< K, V >::file_, folly::none, folly::parseJson(), folly::readFile(), and string.

Referenced by wangle::FilePersistenceLayer< K, V >::~FilePersistenceLayer().

87  {
88  std::string serializedCache;
89  // not being able to read the backing storage means we just
90  // start with an empty cache. Failing to deserialize, or write,
91  // is a real error so we report errors there.
92  if (!folly::readFile(file_.c_str(), serializedCache)) {
93  return folly::none;
94  }
95 
96  try {
98  opts.allow_non_string_keys = true;
99  return folly::parseJson(serializedCache, opts);
100  } catch (const std::exception& err) {
101  LOG(ERROR) << "Deserialization of cache file " << file_
102  << " failed with parse error: " << err.what();
103  }
104  return folly::none;
105 }
bool readFile(int fd, Container &out, size_t num_bytes=std::numeric_limits< size_t >::max())
Definition: FileUtil.h:125
dynamic parseJson(StringPiece range)
Definition: json.cpp:900
const char * string
Definition: Conv.cpp:212
constexpr None none
Definition: Optional.h:87
template<typename K , typename V >
bool wangle::FilePersistenceLayer< K, V >::persist ( const folly::dynamic kvPairs)
overridevirtualnoexcept

Persist a folly::dynamic array of key value pairs. Returns true on success.

Implements wangle::CachePersistence< K, V >.

Definition at line 42 of file FilePersistentCache-inl.h.

References folly::json::serialization_opts::allow_non_string_keys, folly::closeNoInt(), folly::fdatasyncNoInt(), wangle::FilePersistenceLayer< K, V >::file_, folly::openNoInt(), folly::json::serialize(), string, and folly::writeFull().

Referenced by wangle::FilePersistenceLayer< K, V >::~FilePersistenceLayer().

43  {
44  std::string serializedCache;
45  try {
47  opts.allow_non_string_keys = true;
48  serializedCache = folly::json::serialize(dynObj, opts);
49  } catch (const std::exception& err) {
50  LOG(ERROR) << "Serializing to JSON failed with error: " << err.what();
51  return false;
52  }
53  bool persisted = false;
54  const auto fd = folly::openNoInt(
55  file_.c_str(),
56  O_WRONLY | O_CREAT | O_TRUNC,
57  S_IRUSR | S_IWUSR
58  );
59  if (fd == -1) {
60  return false;
61  }
62  const auto nWritten = folly::writeFull(
63  fd,
64  serializedCache.data(),
65  serializedCache.size()
66  );
67  persisted = nWritten >= 0 &&
68  (static_cast<size_t>(nWritten) == serializedCache.size());
69  if (!persisted) {
70  LOG(ERROR) << "Failed to write to " << file_ << ":";
71  if (nWritten == -1) {
72  LOG(ERROR) << "write failed with errno " << errno;
73  }
74  }
75  if (folly::fdatasyncNoInt(fd) != 0) {
76  LOG(ERROR) << "Failed to sync " << file_ << ": errno " << errno;
77  persisted = false;
78  }
79  if (folly::closeNoInt(fd) != 0) {
80  LOG(ERROR) << "Failed to close " << file_ << ": errno " << errno;
81  persisted = false;
82  }
83  return persisted;
84 }
int closeNoInt(int fd)
Definition: FileUtil.cpp:56
int fdatasyncNoInt(int fd)
Definition: FileUtil.cpp:76
ssize_t writeFull(int fd, const void *buf, size_t count)
Definition: FileUtil.cpp:134
int openNoInt(const char *name, int flags, mode_t mode)
Definition: FileUtil.cpp:36
const char * string
Definition: Conv.cpp:212
std::string serialize(dynamic const &dyn, serialization_opts const &opts)
Definition: json.cpp:621

Member Data Documentation


The documentation for this class was generated from the following file: