enum rspamd_hyperscan_status
rspamd_re_cache_load_hyperscan (struct rspamd_re_cache *cache,
- const char *cache_dir)
+ const char *cache_dir, bool try_load)
{
g_assert (cache != NULL);
g_assert (cache_dir != NULL);
rspamd_snprintf (path, sizeof (path), "%s%c%s.hs", cache_dir,
G_DIR_SEPARATOR, re_class->hash);
- if (rspamd_re_cache_is_valid_hyperscan_file (cache, path, FALSE, FALSE)) {
+ if (rspamd_re_cache_is_valid_hyperscan_file (cache, path, try_load, FALSE)) {
msg_debug_re_cache ("load hyperscan database from '%s'",
re_class->hash);
map = mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (map == MAP_FAILED) {
- msg_err_re_cache ("cannot mmap %s: %s", path, strerror (errno));
+ if (!try_load) {
+ msg_err_re_cache ("cannot mmap %s: %s", path, strerror (errno));
+ }
+ else {
+ msg_debug_re_cache ("cannot mmap %s: %s", path, strerror (errno));
+ }
+
close (fd);
all_valid = FALSE;
continue;
RSPAMD_HS_MAGIC_LEN + /* header */
sizeof (cache->plt) > (gsize)st.st_size) {
/* Some wrong amount of regexps */
- msg_err_re_cache ("bad number of expressions in %s: %d",
- path, n);
+ if (!try_load) {
+ msg_err_re_cache ("bad number of expressions in %s: %d",
+ path, n);
+ }
+ else {
+ msg_debug_re_cache ("bad number of expressions in %s: %d",
+ path, n);
+ }
+
munmap (map, st.st_size);
all_valid = FALSE;
continue;
if ((ret = hs_deserialize_database (p, end - p, &re_class->hs_db))
!= HS_SUCCESS) {
- msg_err_re_cache ("bad hs database in %s: %d", path, ret);
+ if (!try_load) {
+ msg_err_re_cache ("bad hs database in %s: %d", path, ret);
+ }
+ else {
+ msg_debug_re_cache ("bad hs database in %s: %d", path, ret);
+ }
munmap (map, st.st_size);
g_free (hs_ids);
g_free (hs_flags);
}
}
else {
- msg_err_re_cache ("invalid hyperscan hash file '%s'",
- path);
+ if (!try_load) {
+ msg_err_re_cache ("invalid hyperscan hash file '%s'",
+ path);
+ }
+ else {
+ msg_debug_re_cache ("invalid hyperscan hash file '%s'",
+ path);
+ }
all_valid = FALSE;
continue;
}
* Returns TRUE if the specified file is valid hyperscan cache
*/
gboolean rspamd_re_cache_is_valid_hyperscan_file (struct rspamd_re_cache *cache,
- const char *path, gboolean silent, gboolean try_load);
+ const char *path,
+ gboolean silent,
+ gboolean try_load);
/**
* Loads all hyperscan regexps precompiled
*/
enum rspamd_hyperscan_status rspamd_re_cache_load_hyperscan (
struct rspamd_re_cache *cache,
- const char *cache_dir);
+ const char *cache_dir, bool try_load);
/**
* Registers lua selector in the cache