util/disk_cache: don't fallback to an empty cache dir on evict
If we fail to randomly select a two letter cache dir, don't select an empty dir on fallback. In real world use we should never hit the fallback path but it can be hit by tests when the cache is set to a very small max value. Reviewed-by: Grazvydas Ignotas <notasas@gmail.com>
This commit is contained in:
@@ -576,14 +576,13 @@ unlink_random_file_from_directory(const char *path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unlink(filename);
|
unlink(filename);
|
||||||
|
|
||||||
free (filename);
|
free (filename);
|
||||||
|
|
||||||
return sb.st_size;
|
return sb.st_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is entry a directory with a two-character name, (and not the
|
/* Is entry a directory with a two-character name, (and not the
|
||||||
* special name of "..")
|
* special name of ".."). We also return false if the dir is empty.
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
is_two_character_sub_directory(const struct dirent *entry, const char *path)
|
is_two_character_sub_directory(const struct dirent *entry, const char *path)
|
||||||
@@ -594,15 +593,37 @@ is_two_character_sub_directory(const struct dirent *entry, const char *path)
|
|||||||
|
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
int res = stat(subdir, &sb);
|
int res = stat(subdir, &sb);
|
||||||
|
if (res == -1 || !S_ISDIR(sb.st_mode)) {
|
||||||
|
free(subdir);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen(entry->d_name) != 2) {
|
||||||
|
free(subdir);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(entry->d_name, "..") == 0) {
|
||||||
|
free(subdir);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DIR *dir = opendir(subdir);
|
||||||
free(subdir);
|
free(subdir);
|
||||||
|
|
||||||
if (res == -1 || !S_ISDIR(sb.st_mode))
|
if (dir == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (strlen(entry->d_name) != 2)
|
unsigned subdir_entries = 0;
|
||||||
return false;
|
struct dirent *d;
|
||||||
|
while ((d = readdir(dir)) != NULL) {
|
||||||
|
if(++subdir_entries > 2)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
|
||||||
if (strcmp(entry->d_name, "..") == 0)
|
/* If dir only contains '.' and '..' it must be empty */
|
||||||
|
if (subdir_entries <= 2)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Reference in New Issue
Block a user