12 #include "BESH4MCache.h"
15 #include "BESInternalError.h"
16 #include "TheBESKeys.h"
18 #include "HDF4RequestHandler.h"
23 bool BESH4Cache::d_enabled =
true;
25 const string BESH4Cache::PATH_KEY =
"HDF4.Cache.latlon.path";
26 const string BESH4Cache::PREFIX_KEY =
"HDF4.Cache.latlon.prefix";
27 const string BESH4Cache::SIZE_KEY =
"HDF4.Cache.latlon.size";
29 long BESH4Cache::getCacheSizeFromConfig()
31 if (HDF4RequestHandler::get_cache_latlon_size_exist() ==
true) {
33 "In BESH4Cache::getCacheSize(): Located BES key " << SIZE_KEY<<
"=" << HDF4RequestHandler::get_cache_latlon_size() << endl);
34 return HDF4RequestHandler::get_cache_latlon_size();
37 string msg =
"[ERROR] BESH4Cache::getCacheSize() - The BES Key " + SIZE_KEY
38 +
" is not set! It MUST be set to utilize the HDF4 cache. ";
39 BESDEBUG(
"cache", msg);
44 string BESH4Cache::getCachePrefixFromConfig()
46 if (HDF4RequestHandler::get_cache_latlon_prefix_exist() ==
true) {
48 "In BESH4Cache::getCachePrefix(): Located BES key " << PREFIX_KEY<<
"=" << HDF4RequestHandler::get_cache_latlon_prefix() << endl);
49 return HDF4RequestHandler::get_cache_latlon_prefix();
52 string msg =
"[ERROR] BESH4Cache::getCachePrefix() - The BES Key " + PREFIX_KEY
53 +
" is not set! It MUST be set to utilize the HDF4 cache. ";
54 BESDEBUG(
"cache", msg);
59 string BESH4Cache::getCacheDirFromConfig()
61 if (HDF4RequestHandler::get_cache_latlon_path_exist() ==
true) {
63 "In BESH4Cache::getCacheDirFromConfig(): Located BES key " << PATH_KEY<<
"=" << HDF4RequestHandler::get_cache_latlon_path() << endl);
64 return HDF4RequestHandler::get_cache_latlon_path();
67 string msg =
"[ERROR] BESH4Cache::getCachePrefix() - The BES Key " + PREFIX_KEY
68 +
" is not set! It MUST be set to utilize the HDF4 cache. ";
69 BESDEBUG(
"cache", msg);
74 BESH4Cache::BESH4Cache()
76 BESDEBUG(
"cache",
"In BESH4Cache::BESH4Cache()" << endl);
78 string cacheDir = getCacheDirFromConfig();
79 string prefix = getCachePrefixFromConfig();
80 long size_in_megabytes = getCacheSizeFromConfig();
83 "BESH4Cache() - Cache config params: " << cacheDir <<
", " << prefix <<
", " << size_in_megabytes << endl);
88 if (!cacheDir.empty() && size_in_megabytes > 0) {
89 BESDEBUG(
"cache",
"Before calling initialize function." << endl);
90 initialize(cacheDir, prefix, size_in_megabytes);
93 BESDEBUG(
"cache",
"Leaving BESH4Cache::BESH4Cache()" << endl);
102 if (d_enabled && d_instance == 0) {
104 string cache_dir = getCacheDirFromConfig();
105 if ((stat(cache_dir.c_str(), &buf) == 0) && (buf.st_mode & S_IFDIR)) {
109 d_enabled = d_instance->cache_enabled();
113 BESDEBUG(
"cache",
"BESH4Cache::"<<__func__ <<
"() - " <<
114 "Cache is DISABLED"<< endl);
118 atexit(delete_instance);
120 BESDEBUG(
"cache",
"BESH4Cache::" << __func__ <<
"() - " <<
121 "Cache is ENABLED"<< endl);
126 "BESH4Cache::get_instance(): Failed to obtain cache! msg: " << bie.
get_message() << endl);
135 bool BESH4Cache::is_valid(
const string & cache_file_name,
const int expected_file_size)
139 int result = stat(cache_file_name.c_str(), &st);
141 string msg =
"Cannot check the cached file " + cache_file_name;
144 if (expected_file_size == st.st_size)
151 bool BESH4Cache::get_data_from_cache(
const string & cache_file_name,
const int expected_file_size,
int &fd)
154 cerr<<
"coming to get_data_from_cache "<<endl;
155 BESDEBUG(
"cache",
"In BESH4Cache::get_data_from_cache()" << endl);
156 cerr<<
"cache_file_name is "<<cache_file_name <<endl;
158 string cache_file_name1 = cache_file_name;
159 get_read_lock(cache_file_name1,fd1);
161 cerr<<
"After get_read_lock "<<endl;
163 if (
false == get_read_lock(cache_file_name, fd))
165 else if (
false == is_valid(cache_file_name, expected_file_size)) {
166 unlock_and_close(cache_file_name);
167 purge_file(cache_file_name);
174 bool BESH4Cache::write_cached_data(
const string & cache_file_name,
const int expected_file_size,
175 const vector<double> &val)
178 BESDEBUG(
"cache",
"In BESH4Cache::write_cached_data()" << endl);
180 bool ret_value =
false;
183 if (create_and_lock(cache_file_name, fd)) {
188 ret_val = write(fd, &val[0], expected_file_size);
191 if (ret_val != expected_file_size) {
192 if (unlink(cache_file_name.c_str()) != 0) {
193 string msg =
"Cannot remove the corrupt cached file " + cache_file_name;
199 unsigned long long size = update_cache_info(cache_file_name);
200 if (cache_too_big(size)) update_and_purge(cache_file_name);
204 unlock_and_close(cache_file_name);
212 bool BESH4Cache::write_cached_data2(
const string & cache_file_name,
const int expected_file_size,
const void *buf)
215 BESDEBUG(
"cache",
"In BESH4Cache::write_cached_data()" << endl);
217 bool ret_value =
false;
220 if (create_and_lock(cache_file_name, fd)) {
225 ret_val = write(fd, buf, expected_file_size);
228 if (ret_val != expected_file_size) {
229 if (unlink(cache_file_name.c_str()) != 0) {
230 string msg =
"Cannot remove the corrupt cached file " + cache_file_name;
236 unsigned long long size = update_cache_info(cache_file_name);
237 if (cache_too_big(size)) update_and_purge(cache_file_name);
241 unlock_and_close(cache_file_name);
249 void BESH4Cache::dummy_test_func() {
251 cerr<<
"BESH4Cache function is fine "<<endl;
255 string BESH4Cache::get_cache_file_name_h4(
const string & src,
bool mangle) {