From 71403d41741cca9d3d7790fce4e517c9cd7ef2d1 Mon Sep 17 00:00:00 2001 From: Athou Date: Thu, 1 Aug 2013 21:11:45 +0200 Subject: [PATCH] if under heavy load, don't refresh feeds for users who logged in more than a month ago for the last time --- .../com/commafeed/backend/dao/FeedDAO.java | 31 +++++++++++++++---- .../backend/feeds/FeedRefreshTaskGiver.java | 14 +++++++-- .../resources/changelogs/db.changelog-1.2.xml | 6 ++++ 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedDAO.java b/src/main/java/com/commafeed/backend/dao/FeedDAO.java index 20d576ab..957d8b1f 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedDAO.java @@ -7,11 +7,13 @@ import javax.ejb.Stateless; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Join; import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.persistence.criteria.SetJoin; +import javax.persistence.criteria.Subquery; import javax.persistence.metamodel.SingularAttribute; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -25,6 +27,8 @@ import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.FeedSubscription_; import com.commafeed.backend.model.Feed_; +import com.commafeed.backend.model.User; +import com.commafeed.backend.model.User_; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -38,30 +42,45 @@ public class FeedDAO extends GenericDAO { public List feeds; } - private Predicate getUpdatablePredicate(Root root) { + private List getUpdatablePredicates(CriteriaQuery query, Root root, Date lastLoginThreshold) { + List preds = Lists.newArrayList(); Predicate isNull = builder.isNull(root.get(Feed_.disabledUntil)); Predicate lessThan = builder.lessThan(root.get(Feed_.disabledUntil), new Date()); + preds.add(builder.or(isNull, lessThan)); - return builder.or(isNull, lessThan); + if (lastLoginThreshold != null) { + Subquery subquery = query.subquery(Long.class); + Root subroot = subquery.from(FeedSubscription.class); + subquery.select(builder.count(subroot.get(FeedSubscription_.id))); + + Join userJoin = subroot.join(FeedSubscription_.user); + Predicate p1 = builder.equal(subroot.get(FeedSubscription_.feed), root); + Predicate p2 = builder.greaterThanOrEqualTo(userJoin.get(User_.lastLogin), lastLoginThreshold); + subquery.where(p1, p2); + + preds.add(builder.exists(subquery)); + } + + return preds; } - public Long getUpdatableCount() { + public Long getUpdatableCount(Date lastLoginThreshold) { CriteriaQuery query = builder.createQuery(Long.class); Root root = query.from(getType()); query.select(builder.count(root)); - query.where(getUpdatablePredicate(root)); + query.where(getUpdatablePredicates(query, root, lastLoginThreshold).toArray(new Predicate[0])); TypedQuery q = em.createQuery(query); return q.getSingleResult(); } - public List findNextUpdatable(int count) { + public List findNextUpdatable(int count, Date lastLoginThreshold) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); - query.where(getUpdatablePredicate(root)); + query.where(getUpdatablePredicates(query, root, lastLoginThreshold).toArray(new Predicate[0])); query.orderBy(builder.asc(root.get(Feed_.disabledUntil))); TypedQuery q = em.createQuery(query); diff --git a/src/main/java/com/commafeed/backend/feeds/FeedRefreshTaskGiver.java b/src/main/java/com/commafeed/backend/feeds/FeedRefreshTaskGiver.java index d4bc643a..f7ef1222 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedRefreshTaskGiver.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedRefreshTaskGiver.java @@ -122,7 +122,7 @@ public class FeedRefreshTaskGiver { } public Long getUpdatableCount() { - return feedDAO.getUpdatableCount(); + return feedDAO.getUpdatableCount(getLastLoginThreshold()); } /** @@ -139,12 +139,12 @@ public class FeedRefreshTaskGiver { * refills the refresh queue and empties the giveBack queue while at it */ private void refill() { - int count = Math.min(300, 3 * backgroundThreads); + int count = Math.min(100, 3 * backgroundThreads); // first, get feeds that are up to refresh from the database List contexts = Lists.newArrayList(); if (!applicationSettingsService.get().isCrawlingPaused()) { - List feeds = feedDAO.findNextUpdatable(count); + List feeds = feedDAO.findNextUpdatable(count, getLastLoginThreshold()); for (Feed feed : feeds) { contexts.add(new FeedRefreshContext(feed, false)); } @@ -195,4 +195,12 @@ public class FeedRefreshTaskGiver { giveBackQueue.add(feed); } + private Date getLastLoginThreshold() { + if (applicationSettingsService.get().isHeavyLoad()) { + return DateUtils.addDays(new Date(), -30); + } else { + return null; + } + } + } diff --git a/src/main/resources/changelogs/db.changelog-1.2.xml b/src/main/resources/changelogs/db.changelog-1.2.xml index 477112e7..34a17eab 100644 --- a/src/main/resources/changelogs/db.changelog-1.2.xml +++ b/src/main/resources/changelogs/db.changelog-1.2.xml @@ -128,5 +128,11 @@ + + + + + +