Skip to content

Commit 1ee2a04

Browse files
committed
Handle expired dates in cull
1 parent 97b77d0 commit 1ee2a04

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

django_mongodb_backend/cache.py

+17-5
Original file line numberDiff line numberDiff line change
@@ -138,23 +138,35 @@ def _cull(self, num):
138138
if self._cull_frequency == 0:
139139
self.clear()
140140
else:
141-
cull_num = num // self._cull_frequency
141+
keep_num = num - num // self._cull_frequency
142142
try:
143143
# Delete the first expiration date.
144144
deleted_from = next(
145145
self.collection.aggregate(
146146
[
147-
{"$sort": SON([("expired_at", 1), ("key", 1)])},
148-
{"$skip": cull_num},
147+
{"$sort": SON([("expires_at", -1), ("key", 1)])},
148+
{"$skip": keep_num},
149149
{"$limit": 1},
150-
{"$project": {"key": 1}},
150+
{"$project": {"key": 1, "expires_at": 1}},
151151
]
152152
)
153153
)
154154
except StopIteration:
155155
pass
156156
else:
157-
self.collection.delete_many({"key": {"$lt": deleted_from["key"]}})
157+
self.collection.delete_many(
158+
{
159+
"$or": [
160+
{"expires_at": {"$lt": deleted_from["expires_at"]}},
161+
{
162+
"$and": [
163+
{"expires_at": deleted_from["expires_at"]},
164+
{"key": {"$gte": deleted_from["key"]}},
165+
]
166+
},
167+
]
168+
}
169+
)
158170

159171
def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None):
160172
key = self.make_and_validate_key(key, version=version)

0 commit comments

Comments
 (0)