forked from rDrama/rDrama
make the site faster by not having GET endpoints waiting for UPDATE statements to finish (they can take really long bc of locks)
parent
b7e6eeebd4
commit
a57ff00e09
|
@ -38,6 +38,7 @@ def cron_fn(every_5m, every_1d):
|
||||||
spin_roulette_wheel()
|
spin_roulette_wheel()
|
||||||
#offsitementions.offsite_mentions_task(cache)
|
#offsitementions.offsite_mentions_task(cache)
|
||||||
_award_timers_task()
|
_award_timers_task()
|
||||||
|
_unpin_expired()
|
||||||
|
|
||||||
if every_1d:
|
if every_1d:
|
||||||
stats.generate_charts_task(SITE)
|
stats.generate_charts_task(SITE)
|
||||||
|
@ -234,3 +235,19 @@ def _award_timers_task():
|
||||||
User.chudded_by: None,
|
User.chudded_by: None,
|
||||||
})
|
})
|
||||||
_process_timer(User.flairchanged, [96], "Your temporary flair-lock has expired. You can now change your flair!")
|
_process_timer(User.flairchanged, [96], "Your temporary flair-lock has expired. You can now change your flair!")
|
||||||
|
|
||||||
|
|
||||||
|
def _unpin_expired():
|
||||||
|
t = int(time.time())
|
||||||
|
pins = []
|
||||||
|
|
||||||
|
for cls in (Post, Comment):
|
||||||
|
pins += g.db.query(cls).options(load_only(cls.id)).filter(cls.stickied_utc < t)
|
||||||
|
|
||||||
|
for pin in pins:
|
||||||
|
pin.stickied = None
|
||||||
|
pin.stickied_utc = None
|
||||||
|
g.db.add(pin)
|
||||||
|
|
||||||
|
if pins:
|
||||||
|
cache.delete_memoized(frontlist)
|
||||||
|
|
|
@ -23,6 +23,19 @@ from files.routes.routehelpers import execute_shadowban_viewers_and_voters
|
||||||
from files.routes.wrappers import *
|
from files.routes.wrappers import *
|
||||||
from files.__main__ import app, cache, limiter
|
from files.__main__ import app, cache, limiter
|
||||||
|
|
||||||
|
def _mark_comment_as_read(cid, vid):
|
||||||
|
db = db_session()
|
||||||
|
|
||||||
|
notif = db.query(Notification).filter_by(comment_id=cid, user_id=vid, read=False).one_or_none()
|
||||||
|
|
||||||
|
if notif:
|
||||||
|
notif.read = True
|
||||||
|
db.add(notif)
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
stdout.flush()
|
||||||
|
|
||||||
@app.get("/comment/<int:cid>")
|
@app.get("/comment/<int:cid>")
|
||||||
@app.get("/post/<int:pid>/<anything>/<int:cid>")
|
@app.get("/post/<int:pid>/<anything>/<int:cid>")
|
||||||
@app.get("/h/<sub>/comment/<int:cid>")
|
@app.get("/h/<sub>/comment/<int:cid>")
|
||||||
|
@ -35,11 +48,7 @@ def post_pid_comment_cid(cid, v, pid=None, anything=None, sub=None):
|
||||||
if not User.can_see(v, comment): abort(403)
|
if not User.can_see(v, comment): abort(403)
|
||||||
|
|
||||||
if v and request.values.get("read"):
|
if v and request.values.get("read"):
|
||||||
notif = g.db.query(Notification).filter_by(comment_id=cid, user_id=v.id, read=False).one_or_none()
|
gevent.spawn(_mark_comment_as_read, comment.id, v.id)
|
||||||
if notif:
|
|
||||||
notif.read = True
|
|
||||||
g.db.add(notif)
|
|
||||||
g.db.flush()
|
|
||||||
|
|
||||||
if comment.parent_post:
|
if comment.parent_post:
|
||||||
post = comment.parent_post
|
post = comment.parent_post
|
||||||
|
|
|
@ -153,11 +153,6 @@ def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words='
|
||||||
|
|
||||||
if v:
|
if v:
|
||||||
pins = pins.filter(or_(Post.sub == None, Post.sub.notin_(v.sub_blocks)))
|
pins = pins.filter(or_(Post.sub == None, Post.sub.notin_(v.sub_blocks)))
|
||||||
for pin in pins:
|
|
||||||
if pin.stickied_utc and int(time.time()) > pin.stickied_utc:
|
|
||||||
pin.stickied = None
|
|
||||||
pin.stickied_utc = None
|
|
||||||
g.db.add(pin)
|
|
||||||
|
|
||||||
|
|
||||||
if v: pins = pins.filter(Post.author_id.notin_(v.userblocks))
|
if v: pins = pins.filter(Post.author_id.notin_(v.userblocks))
|
||||||
|
|
|
@ -30,6 +30,17 @@ from .users import userpagelisting
|
||||||
|
|
||||||
from files.__main__ import app, limiter, redis_instance
|
from files.__main__ import app, limiter, redis_instance
|
||||||
|
|
||||||
|
def _add_post_view(pid):
|
||||||
|
db = db_session()
|
||||||
|
|
||||||
|
p = db.get(Post, pid)
|
||||||
|
p.views += 1
|
||||||
|
db.add(p)
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
stdout.flush()
|
||||||
|
|
||||||
@app.post("/publish/<int:pid>")
|
@app.post("/publish/<int:pid>")
|
||||||
@limiter.limit('1/second', scope=rpath)
|
@limiter.limit('1/second', scope=rpath)
|
||||||
@limiter.limit('1/second', scope=rpath, key_func=get_ID)
|
@limiter.limit('1/second', scope=rpath, key_func=get_ID)
|
||||||
|
@ -90,10 +101,7 @@ def post_id(pid, v, anything=None, sub=None):
|
||||||
if g.is_api_or_xhr: abort(451, "Must be 18+ to view")
|
if g.is_api_or_xhr: abort(451, "Must be 18+ to view")
|
||||||
return render_template("errors/nsfw.html", v=v)
|
return render_template("errors/nsfw.html", v=v)
|
||||||
|
|
||||||
p.views += 1
|
gevent.spawn(_add_post_view, pid)
|
||||||
g.db.add(p)
|
|
||||||
try: g.db.flush()
|
|
||||||
except: g.db.rollback()
|
|
||||||
|
|
||||||
if p.new: defaultsortingcomments = 'new'
|
if p.new: defaultsortingcomments = 'new'
|
||||||
elif v: defaultsortingcomments = v.defaultsortingcomments
|
elif v: defaultsortingcomments = v.defaultsortingcomments
|
||||||
|
@ -163,11 +171,7 @@ def post_id(pid, v, anything=None, sub=None):
|
||||||
if sort == "hot":
|
if sort == "hot":
|
||||||
pinned2 = {}
|
pinned2 = {}
|
||||||
for pin in pinned:
|
for pin in pinned:
|
||||||
if pin.stickied_utc and int(time.time()) > pin.stickied_utc:
|
if pin.level > 1:
|
||||||
pin.stickied = None
|
|
||||||
pin.stickied_utc = None
|
|
||||||
g.db.add(pin)
|
|
||||||
elif pin.level > 1:
|
|
||||||
pinned2[pin.top_comment] = ''
|
pinned2[pin.top_comment] = ''
|
||||||
if pin.top_comment in comments:
|
if pin.top_comment in comments:
|
||||||
comments.remove(pin.top_comment)
|
comments.remove(pin.top_comment)
|
||||||
|
|
|
@ -22,9 +22,22 @@ from files.helpers.sorting_and_time import *
|
||||||
from files.helpers.useractions import badge_grant
|
from files.helpers.useractions import badge_grant
|
||||||
from files.routes.routehelpers import check_for_alts, add_alt
|
from files.routes.routehelpers import check_for_alts, add_alt
|
||||||
from files.routes.wrappers import *
|
from files.routes.wrappers import *
|
||||||
|
from files.routes.comments import _mark_comment_as_read
|
||||||
|
|
||||||
from files.__main__ import app, cache, limiter
|
from files.__main__ import app, cache, limiter
|
||||||
|
|
||||||
|
def _add_profile_view(vid, uid):
|
||||||
|
db = db_session()
|
||||||
|
|
||||||
|
view = db.query(ViewerRelationship).filter_by(viewer_id=vid, user_id=uid).one_or_none()
|
||||||
|
if view: view.last_view_utc = int(time.time())
|
||||||
|
else: view = ViewerRelationship(viewer_id=vid, user_id=uid)
|
||||||
|
db.add(view)
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
stdout.flush()
|
||||||
|
|
||||||
def claim_rewards_all_users():
|
def claim_rewards_all_users():
|
||||||
emails = [x[0] for x in g.db.query(Transaction.email).filter_by(claimed=None).all()]
|
emails = [x[0] for x in g.db.query(Transaction.email).filter_by(claimed=None).all()]
|
||||||
users = g.db.query(User).filter(User.email.in_(emails)).order_by(User.truescore.desc()).all()
|
users = g.db.query(User).filter(User.email.in_(emails)).order_by(User.truescore.desc()).all()
|
||||||
|
@ -941,12 +954,7 @@ def u_username_wall(v:Optional[User], username:str):
|
||||||
is_following = v and u.has_follower(v)
|
is_following = v and u.has_follower(v)
|
||||||
|
|
||||||
if v and v.id != u.id and not v.admin_level and not session.get("GLOBAL"):
|
if v and v.id != u.id and not v.admin_level and not session.get("GLOBAL"):
|
||||||
view = g.db.query(ViewerRelationship).filter_by(viewer_id=v.id, user_id=u.id).one_or_none()
|
gevent.spawn(_add_profile_view, v.id, u.id)
|
||||||
if view: view.last_view_utc = int(time.time())
|
|
||||||
else: view = ViewerRelationship(viewer_id=v.id, user_id=u.id)
|
|
||||||
g.db.add(view)
|
|
||||||
try: g.db.flush()
|
|
||||||
except: g.db.rollback()
|
|
||||||
|
|
||||||
page = get_page()
|
page = get_page()
|
||||||
|
|
||||||
|
@ -993,19 +1001,10 @@ def u_username_wall_comment(v:User, username:str, cid):
|
||||||
is_following = v and u.has_follower(v)
|
is_following = v and u.has_follower(v)
|
||||||
|
|
||||||
if v and v.id != u.id and not v.admin_level and not session.get("GLOBAL"):
|
if v and v.id != u.id and not v.admin_level and not session.get("GLOBAL"):
|
||||||
view = g.db.query(ViewerRelationship).filter_by(viewer_id=v.id, user_id=u.id).one_or_none()
|
gevent.spawn(_add_profile_view, v.id, u.id)
|
||||||
if view: view.last_view_utc = int(time.time())
|
|
||||||
else: view = ViewerRelationship(viewer_id=v.id, user_id=u.id)
|
|
||||||
g.db.add(view)
|
|
||||||
try: g.db.flush()
|
|
||||||
except: g.db.rollback()
|
|
||||||
|
|
||||||
if v and request.values.get("read"):
|
if v and request.values.get("read"):
|
||||||
notif = g.db.query(Notification).filter_by(comment_id=cid, user_id=v.id, read=False).one_or_none()
|
gevent.spawn(_mark_comment_as_read, comment.id, v.id)
|
||||||
if notif:
|
|
||||||
notif.read = True
|
|
||||||
g.db.add(notif)
|
|
||||||
g.db.flush()
|
|
||||||
|
|
||||||
try: context = min(int(request.values.get("context", 8)), 8)
|
try: context = min(int(request.values.get("context", 8)), 8)
|
||||||
except: context = 8
|
except: context = 8
|
||||||
|
@ -1047,12 +1046,7 @@ def u_username(v:Optional[User], username:str):
|
||||||
return render_template("userpage/private.html", u=u, v=v, is_following=is_following), 403
|
return render_template("userpage/private.html", u=u, v=v, is_following=is_following), 403
|
||||||
|
|
||||||
if v and v.id != u.id and not v.admin_level and not session.get("GLOBAL"):
|
if v and v.id != u.id and not v.admin_level and not session.get("GLOBAL"):
|
||||||
view = g.db.query(ViewerRelationship).filter_by(viewer_id=v.id, user_id=u.id).one_or_none()
|
gevent.spawn(_add_profile_view, v.id, u.id)
|
||||||
if view: view.last_view_utc = int(time.time())
|
|
||||||
else: view = ViewerRelationship(viewer_id=v.id, user_id=u.id)
|
|
||||||
g.db.add(view)
|
|
||||||
try: g.db.flush()
|
|
||||||
except: g.db.rollback()
|
|
||||||
|
|
||||||
sort = request.values.get("sort", "new")
|
sort = request.values.get("sort", "new")
|
||||||
t = request.values.get("t", "all")
|
t = request.values.get("t", "all")
|
||||||
|
@ -1119,12 +1113,7 @@ def u_username_comments(username, v):
|
||||||
return render_template("userpage/private.html", u=u, v=v, is_following=is_following), 403
|
return render_template("userpage/private.html", u=u, v=v, is_following=is_following), 403
|
||||||
|
|
||||||
if v and v.id != u.id and not v.admin_level and not session.get("GLOBAL"):
|
if v and v.id != u.id and not v.admin_level and not session.get("GLOBAL"):
|
||||||
view = g.db.query(ViewerRelationship).filter_by(viewer_id=v.id, user_id=u.id).one_or_none()
|
gevent.spawn(_add_profile_view, v.id, u.id)
|
||||||
if view: view.last_view_utc = int(time.time())
|
|
||||||
else: view = ViewerRelationship(viewer_id=v.id, user_id=u.id)
|
|
||||||
g.db.add(view)
|
|
||||||
try: g.db.flush()
|
|
||||||
except: g.db.rollback()
|
|
||||||
|
|
||||||
page = get_page()
|
page = get_page()
|
||||||
|
|
||||||
|
|
|
@ -110,13 +110,11 @@ def get_logged_in_user():
|
||||||
# Check against last_active + ACTIVE_TIME to reduce frequency of
|
# Check against last_active + ACTIVE_TIME to reduce frequency of
|
||||||
# UPDATEs in exchange for a ±ACTIVE_TIME margin of error.
|
# UPDATEs in exchange for a ±ACTIVE_TIME margin of error.
|
||||||
|
|
||||||
if not session.get("GLOBAL"):
|
if not session.get("GLOBAL") and request.method == "POST":
|
||||||
timestamp = int(time.time())
|
timestamp = int(time.time())
|
||||||
if (v.last_active + LOGGEDIN_ACTIVE_TIME) < timestamp:
|
if (v.last_active + LOGGEDIN_ACTIVE_TIME) < timestamp:
|
||||||
v.last_active = timestamp
|
v.last_active = timestamp
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
try: g.db.flush()
|
|
||||||
except: g.db.rollback()
|
|
||||||
|
|
||||||
if not v and SITE == 'rdrama.net' and request.headers.get("Cf-Ipcountry") == 'EG':
|
if not v and SITE == 'rdrama.net' and request.headers.get("Cf-Ipcountry") == 'EG':
|
||||||
abort(404)
|
abort(404)
|
||||||
|
|
Loading…
Reference in New Issue