@GeraZlo

В чем причина утечки памяти в программе на rust?

В программе на rust утекает память, комментировал куски кода пока не нашел, что память течет из-за метода filter.

Метод принимает в себя rss структуру и возвращает bool о том нужно выводить уведомление о новости или нет.
Так же он сохраняет в локальный файл/базу rustbreak дату последней выведенной новости.

Не понимаю почему происходит утечка.

Исходники фильтра:
https://github.com/NightStr/rust_rss_bot/blob/deve...

Основной цикл программы:
https://github.com/NightStr/rust_rss_bot/blob/deve...
  • Вопрос задан
  • 424 просмотра
Решения вопроса 1
@GeraZlo Автор вопроса
Устранил утечку переписав большую страшную функцию, в замыкании на две маленькие, вынеся всю логику за пределы замыкания.

Было:
impl UserRssItemsFilter for FilterByLastRequestData {
    fn filter(&self, user: i64, rep: &String, item: &RssItem) -> bool {
        let key = format!("{} {}", user, rep);
        let r = self.last_request_cache.write(|db| {
            let last_request: DateTime<Utc> = if let Some(last_request_str) = db.get(&key) {
                DateTime::parse_from_rfc2822(&last_request_str).unwrap().into()
            } else {
                Utc::now() - Duration::days(2)
            };
            if last_request < item.created_date {
                db.insert(key, item.created_date.to_rfc2822());
                true
            } else {
                false
            }
        }).unwrap();
        self.last_request_cache.save().unwrap();
        r
    }
}


Стало:
impl UserRssItemsFilter for FilterByLastRequestData {
    fn filter(&self, user: i64, rep: &String, item: &RssItem) -> bool {
        let key = format!("{} {}", user, rep);
        let last_request = match  self.last_request_cache.read(|db| {
            match db.get(&key) {
                Some(v) => Some(DateTime::parse_from_rfc2822(v).unwrap().into()),
                None => None
            }
        }).unwrap() {
            Some(v) => v,
            None => Utc::now() - Duration::days(2)
        };

        if last_request < item.created_date {
            self.last_request_cache.write(|db| {
                db.insert(key, item.created_date.to_rfc2822());
            }).unwrap();
            self.last_request_cache.save().unwrap();
            true
        } else {
            false
        }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@blandger
Для тех кто будет читать, но вдруг не знает. Rust может гарантировать отсутствие "гонки данных", но не может во всех возможных случаях гарантировать "отсутствие утечки памяти", хотя определенным образом этому способствует.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы