Show More
@@ -91,21 +91,27 b' beaker.cache.regions=super_short_term,sh' | |||
|
91 | 91 | |
|
92 | 92 | beaker.cache.super_short_term.type=memory |
|
93 | 93 | beaker.cache.super_short_term.expire=10 |
|
94 | beaker.cache.super_short_term.key_length = 256 | |
|
94 | 95 | |
|
95 | 96 | beaker.cache.short_term.type=memory |
|
96 | 97 | beaker.cache.short_term.expire=60 |
|
98 | beaker.cache.short_term.key_length = 256 | |
|
97 | 99 | |
|
98 | 100 | beaker.cache.long_term.type=memory |
|
99 | 101 | beaker.cache.long_term.expire=36000 |
|
102 | beaker.cache.long_term.key_length = 256 | |
|
100 | 103 | |
|
101 | 104 | beaker.cache.sql_cache_short.type=memory |
|
102 | 105 | beaker.cache.sql_cache_short.expire=10 |
|
106 | beaker.cache.sql_cache_short.key_length = 256 | |
|
103 | 107 | |
|
104 | 108 | beaker.cache.sql_cache_med.type=memory |
|
105 | 109 | beaker.cache.sql_cache_med.expire=360 |
|
110 | beaker.cache.sql_cache_med.key_length = 256 | |
|
106 | 111 | |
|
107 | 112 | beaker.cache.sql_cache_long.type=file |
|
108 | 113 | beaker.cache.sql_cache_long.expire=3600 |
|
114 | beaker.cache.sql_cache_long.key_length = 256 | |
|
109 | 115 | |
|
110 | 116 | #################################### |
|
111 | 117 | ### BEAKER SESSION #### |
@@ -91,21 +91,27 b' beaker.cache.regions=super_short_term,sh' | |||
|
91 | 91 | |
|
92 | 92 | beaker.cache.super_short_term.type=memory |
|
93 | 93 | beaker.cache.super_short_term.expire=10 |
|
94 | beaker.cache.super_short_term.key_length = 256 | |
|
94 | 95 | |
|
95 | 96 | beaker.cache.short_term.type=memory |
|
96 | 97 | beaker.cache.short_term.expire=60 |
|
98 | beaker.cache.short_term.key_length = 256 | |
|
97 | 99 | |
|
98 | 100 | beaker.cache.long_term.type=memory |
|
99 | 101 | beaker.cache.long_term.expire=36000 |
|
102 | beaker.cache.long_term.key_length = 256 | |
|
100 | 103 | |
|
101 | 104 | beaker.cache.sql_cache_short.type=memory |
|
102 | 105 | beaker.cache.sql_cache_short.expire=10 |
|
106 | beaker.cache.sql_cache_short.key_length = 256 | |
|
103 | 107 | |
|
104 | 108 | beaker.cache.sql_cache_med.type=memory |
|
105 | 109 | beaker.cache.sql_cache_med.expire=360 |
|
110 | beaker.cache.sql_cache_med.key_length = 256 | |
|
106 | 111 | |
|
107 | 112 | beaker.cache.sql_cache_long.type=file |
|
108 | 113 | beaker.cache.sql_cache_long.expire=3600 |
|
114 | beaker.cache.sql_cache_long.key_length = 256 | |
|
109 | 115 | |
|
110 | 116 | #################################### |
|
111 | 117 | ### BEAKER SESSION #### |
@@ -91,21 +91,27 b' beaker.cache.regions=super_short_term,sh' | |||
|
91 | 91 | |
|
92 | 92 | beaker.cache.super_short_term.type=memory |
|
93 | 93 | beaker.cache.super_short_term.expire=10 |
|
94 | beaker.cache.super_short_term.key_length = 256 | |
|
94 | 95 | |
|
95 | 96 | beaker.cache.short_term.type=memory |
|
96 | 97 | beaker.cache.short_term.expire=60 |
|
98 | beaker.cache.short_term.key_length = 256 | |
|
97 | 99 | |
|
98 | 100 | beaker.cache.long_term.type=memory |
|
99 | 101 | beaker.cache.long_term.expire=36000 |
|
102 | beaker.cache.long_term.key_length = 256 | |
|
100 | 103 | |
|
101 | 104 | beaker.cache.sql_cache_short.type=memory |
|
102 | 105 | beaker.cache.sql_cache_short.expire=10 |
|
106 | beaker.cache.sql_cache_short.key_length = 256 | |
|
103 | 107 | |
|
104 | 108 | beaker.cache.sql_cache_med.type=memory |
|
105 | 109 | beaker.cache.sql_cache_med.expire=360 |
|
110 | beaker.cache.sql_cache_med.key_length = 256 | |
|
106 | 111 | |
|
107 | 112 | beaker.cache.sql_cache_long.type=file |
|
108 | 113 | beaker.cache.sql_cache_long.expire=3600 |
|
114 | beaker.cache.sql_cache_long.key_length = 256 | |
|
109 | 115 | |
|
110 | 116 | #################################### |
|
111 | 117 | ### BEAKER SESSION #### |
@@ -154,6 +160,7 b' sqlalchemy.db1.url = sqlite:///%(here)s/' | |||
|
154 | 160 | # MySQL |
|
155 | 161 | # sqlalchemy.db1.url = mysql://user:pass@localhost/rhodecode |
|
156 | 162 | |
|
163 | # see sqlalchemy docs for others | |
|
157 | 164 | |
|
158 | 165 | sqlalchemy.db1.echo = false |
|
159 | 166 | sqlalchemy.db1.pool_recycle = 3600 |
@@ -36,7 +36,9 b' from vcs.exceptions import ChangesetErro' | |||
|
36 | 36 | from pylons import tmpl_context as c, request, url |
|
37 | 37 | from pylons.i18n.translation import _ |
|
38 | 38 | |
|
39 | from rhodecode.model.db import Statistics | |
|
39 | from beaker.cache import cache_region, region_invalidate | |
|
40 | ||
|
41 | from rhodecode.model.db import Statistics, CacheInvalidation | |
|
40 | 42 | from rhodecode.lib import ALL_READMES, ALL_EXTS |
|
41 | 43 | from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator |
|
42 | 44 | from rhodecode.lib.base import BaseRepoController, render |
@@ -50,7 +52,7 b' from rhodecode.lib.compat import json, O' | |||
|
50 | 52 | |
|
51 | 53 | log = logging.getLogger(__name__) |
|
52 | 54 | |
|
53 |
README_FILES = [''.join([x[0][0], x[1][0]]) for x in |
|
|
55 | README_FILES = [''.join([x[0][0], x[1][0]]) for x in | |
|
54 | 56 | sorted(list(product(ALL_READMES, ALL_EXTS)), |
|
55 | 57 | key=lambda y:y[0][1] + y[1][1])] |
|
56 | 58 | |
@@ -166,32 +168,43 b' class SummaryController(BaseRepoControll' | |||
|
166 | 168 | if c.enable_downloads: |
|
167 | 169 | c.download_options = self._get_download_links(c.rhodecode_repo) |
|
168 | 170 | |
|
169 | c.readme_data,c.readme_file = self.__get_readme_data() | |
|
171 | c.readme_data, c.readme_file = self.__get_readme_data(c.rhodecode_repo) | |
|
170 | 172 | return render('summary/summary.html') |
|
171 | 173 | |
|
172 | def __get_readme_data(self): | |
|
173 | readme_data = None | |
|
174 | readme_file = None | |
|
175 | ||
|
176 | try: | |
|
177 | cs = c.rhodecode_repo.get_changeset('tip') | |
|
178 | renderer = MarkupRenderer() | |
|
179 | for f in README_FILES: | |
|
180 | try: | |
|
181 | readme = cs.get_node(f) | |
|
182 | readme_file = f | |
|
183 | readme_data = renderer.render(readme.content, f) | |
|
184 | break | |
|
185 | except NodeDoesNotExistError: | |
|
186 | continue | |
|
187 | except ChangesetError: | |
|
188 | pass | |
|
189 | except EmptyRepositoryError: | |
|
190 | pass | |
|
191 | except Exception: | |
|
192 | log.error(traceback.format_exc()) | |
|
174 | def __get_readme_data(self, repo): | |
|
193 | 175 | |
|
194 | return readme_data, readme_file | |
|
176 | @cache_region('long_term') | |
|
177 | def _get_readme_from_cache(key): | |
|
178 | readme_data = None | |
|
179 | readme_file = None | |
|
180 | log.debug('Fetching readme file') | |
|
181 | try: | |
|
182 | cs = repo.get_changeset('tip') | |
|
183 | renderer = MarkupRenderer() | |
|
184 | for f in README_FILES: | |
|
185 | try: | |
|
186 | readme = cs.get_node(f) | |
|
187 | readme_file = f | |
|
188 | readme_data = renderer.render(readme.content, f) | |
|
189 | log.debug('Found readme %s' % readme_file) | |
|
190 | break | |
|
191 | except NodeDoesNotExistError: | |
|
192 | continue | |
|
193 | except ChangesetError: | |
|
194 | pass | |
|
195 | except EmptyRepositoryError: | |
|
196 | pass | |
|
197 | except Exception: | |
|
198 | log.error(traceback.format_exc()) | |
|
199 | ||
|
200 | return readme_data, readme_file | |
|
201 | ||
|
202 | key = repo.name + '_README' | |
|
203 | inv = CacheInvalidation.invalidate(key) | |
|
204 | if inv is not None: | |
|
205 | region_invalidate(_get_readme_from_cache, None, key) | |
|
206 | CacheInvalidation.set_valid(inv.cache_key) | |
|
207 | return _get_readme_from_cache(key) | |
|
195 | 208 | |
|
196 | 209 | def _get_download_links(self, repo): |
|
197 | 210 |
@@ -663,29 +663,13 b' class Repository(Base, BaseModel):' | |||
|
663 | 663 | |
|
664 | 664 | @property |
|
665 | 665 | def invalidate(self): |
|
666 | """ | |
|
667 | Returns Invalidation object if this repo should be invalidated | |
|
668 | None otherwise. `cache_active = False` means that this cache | |
|
669 | state is not valid and needs to be invalidated | |
|
670 | """ | |
|
671 | return CacheInvalidation.query()\ | |
|
672 | .filter(CacheInvalidation.cache_key == self.repo_name)\ | |
|
673 | .filter(CacheInvalidation.cache_active == False)\ | |
|
674 | .scalar() | |
|
666 | return CacheInvalidation.invalidate(self.repo_name) | |
|
675 | 667 | |
|
676 | 668 | def set_invalidate(self): |
|
677 | 669 | """ |
|
678 | 670 | set a cache for invalidation for this instance |
|
679 | 671 | """ |
|
680 |
|
|
|
681 | .filter(CacheInvalidation.cache_key == self.repo_name)\ | |
|
682 | .scalar() | |
|
683 | ||
|
684 | if inv is None: | |
|
685 | inv = CacheInvalidation(self.repo_name) | |
|
686 | inv.cache_active = True | |
|
687 | Session.add(inv) | |
|
688 | Session.commit() | |
|
672 | CacheInvalidation.set_invalidate(self.repo_name) | |
|
689 | 673 | |
|
690 | 674 | @LazyProperty |
|
691 | 675 | def scm_instance(self): |
@@ -696,19 +680,13 b' class Repository(Base, BaseModel):' | |||
|
696 | 680 | @cache_region('long_term') |
|
697 | 681 | def _c(repo_name): |
|
698 | 682 | return self.__get_instance() |
|
699 | ||
|
700 | # TODO: remove this trick when beaker 1.6 is released | |
|
701 | # and have fixed this issue with not supporting unicode keys | |
|
702 | rn = safe_str(self.repo_name) | |
|
683 | rn = self.repo_name | |
|
703 | 684 | |
|
704 | 685 | inv = self.invalidate |
|
705 | 686 | if inv is not None: |
|
706 | 687 | region_invalidate(_c, None, rn) |
|
707 | 688 | # update our cache |
|
708 | inv.cache_active = True | |
|
709 | Session.add(inv) | |
|
710 | Session.commit() | |
|
711 | ||
|
689 | CacheInvalidation.set_valid(inv.cache_key) | |
|
712 | 690 | return _c(rn) |
|
713 | 691 | |
|
714 | 692 | def __get_instance(self): |
@@ -730,7 +708,7 b' class Repository(Base, BaseModel):' | |||
|
730 | 708 | |
|
731 | 709 | repo = backend(safe_str(repo_full_path), create=False, |
|
732 | 710 | baseui=self._ui) |
|
733 | #skip hidden web repository | |
|
711 | # skip hidden web repository | |
|
734 | 712 | if repo._get_hidden(): |
|
735 | 713 | return |
|
736 | 714 | else: |
@@ -855,7 +833,7 b' class Group(Base, BaseModel):' | |||
|
855 | 833 | |
|
856 | 834 | :param group_name: |
|
857 | 835 | """ |
|
858 |
path_prefix = (self.parent_group.full_path_splitted if |
|
|
836 | path_prefix = (self.parent_group.full_path_splitted if | |
|
859 | 837 | self.parent_group else []) |
|
860 | 838 | return Group.url_sep().join(path_prefix + [group_name]) |
|
861 | 839 | |
@@ -1060,6 +1038,57 b' class CacheInvalidation(Base, BaseModel)' | |||
|
1060 | 1038 | return "<%s('%s:%s')>" % (self.__class__.__name__, |
|
1061 | 1039 | self.cache_id, self.cache_key) |
|
1062 | 1040 | |
|
1041 | @classmethod | |
|
1042 | def invalidate(cls, key): | |
|
1043 | """ | |
|
1044 | Returns Invalidation object if this given key should be invalidated | |
|
1045 | None otherwise. `cache_active = False` means that this cache | |
|
1046 | state is not valid and needs to be invalidated | |
|
1047 | ||
|
1048 | :param key: | |
|
1049 | """ | |
|
1050 | return cls.query()\ | |
|
1051 | .filter(CacheInvalidation.cache_key == key)\ | |
|
1052 | .filter(CacheInvalidation.cache_active == False)\ | |
|
1053 | .scalar() | |
|
1054 | ||
|
1055 | @classmethod | |
|
1056 | def set_invalidate(cls, key): | |
|
1057 | """ | |
|
1058 | Mark this Cache key for invalidation | |
|
1059 | ||
|
1060 | :param key: | |
|
1061 | """ | |
|
1062 | ||
|
1063 | log.debug('marking %s for invalidation' % key) | |
|
1064 | inv_obj = Session().query(cls)\ | |
|
1065 | .filter(cls.cache_key == key).scalar() | |
|
1066 | if inv_obj: | |
|
1067 | inv_obj.cache_active = False | |
|
1068 | else: | |
|
1069 | log.debug('cache key not found in invalidation db -> creating one') | |
|
1070 | inv_obj = CacheInvalidation(key) | |
|
1071 | ||
|
1072 | try: | |
|
1073 | Session.add(inv_obj) | |
|
1074 | Session.commit() | |
|
1075 | except Exception: | |
|
1076 | log.error(traceback.format_exc()) | |
|
1077 | Session.rollback() | |
|
1078 | ||
|
1079 | @classmethod | |
|
1080 | def set_valid(cls, key): | |
|
1081 | """ | |
|
1082 | Mark this cache key as active and currently cached | |
|
1083 | ||
|
1084 | :param key: | |
|
1085 | """ | |
|
1086 | inv_obj = Session().query(CacheInvalidation)\ | |
|
1087 | .filter(CacheInvalidation.cache_key == key).scalar() | |
|
1088 | inv_obj.cache_active = True | |
|
1089 | Session.add(inv_obj) | |
|
1090 | Session.commit() | |
|
1091 | ||
|
1063 | 1092 | class DbMigrateVersion(Base, BaseModel): |
|
1064 | 1093 | __tablename__ = 'db_migrate_version' |
|
1065 | 1094 | __table_args__ = {'extend_existing':True} |
@@ -197,24 +197,8 b' class ScmModel(BaseModel):' | |||
|
197 | 197 | |
|
198 | 198 | :param repo_name: this repo that should invalidation take place |
|
199 | 199 | """ |
|
200 | ||
|
201 | log.debug('marking %s for invalidation', repo_name) | |
|
202 | cache = self.sa.query(CacheInvalidation)\ | |
|
203 | .filter(CacheInvalidation.cache_key == repo_name).scalar() | |
|
204 | ||
|
205 | if cache: | |
|
206 | # mark this cache as inactive | |
|
207 | cache.cache_active = False | |
|
208 | else: | |
|
209 | log.debug('cache key not found in invalidation db -> creating one') | |
|
210 | cache = CacheInvalidation(repo_name) | |
|
211 | ||
|
212 | try: | |
|
213 | self.sa.add(cache) | |
|
214 | self.sa.commit() | |
|
215 | except (DatabaseError,): | |
|
216 | log.error(traceback.format_exc()) | |
|
217 | self.sa.rollback() | |
|
200 | CacheInvalidation.set_invalidate(repo_name) | |
|
201 | CacheInvalidation.set_invalidate(repo_name+"_README") | |
|
218 | 202 | |
|
219 | 203 | def toggle_following_repo(self, follow_repo_id, user_id): |
|
220 | 204 | |
@@ -395,20 +379,5 b' class ScmModel(BaseModel):' | |||
|
395 | 379 | |
|
396 | 380 | self.mark_for_invalidation(repo_name) |
|
397 | 381 | |
|
398 | ||
|
399 | 382 | def get_unread_journal(self): |
|
400 | 383 | return self.sa.query(UserLog).count() |
|
401 | ||
|
402 | def _should_invalidate(self, repo_name): | |
|
403 | """Looks up database for invalidation signals for this repo_name | |
|
404 | ||
|
405 | :param repo_name: | |
|
406 | """ | |
|
407 | ||
|
408 | ret = self.sa.query(CacheInvalidation)\ | |
|
409 | .filter(CacheInvalidation.cache_key == repo_name)\ | |
|
410 | .filter(CacheInvalidation.cache_active == False)\ | |
|
411 | .scalar() | |
|
412 | ||
|
413 | return ret | |
|
414 |
@@ -88,21 +88,27 b' beaker.cache.regions=super_short_term,sh' | |||
|
88 | 88 | |
|
89 | 89 | beaker.cache.super_short_term.type=memory |
|
90 | 90 | beaker.cache.super_short_term.expire=10 |
|
91 | beaker.cache.super_short_term.key_length = 256 | |
|
91 | 92 | |
|
92 | 93 | beaker.cache.short_term.type=memory |
|
93 | 94 | beaker.cache.short_term.expire=60 |
|
95 | beaker.cache.short_term.key_length = 256 | |
|
94 | 96 | |
|
95 | 97 | beaker.cache.long_term.type=memory |
|
96 | 98 | beaker.cache.long_term.expire=36000 |
|
99 | beaker.cache.long_term.key_length = 256 | |
|
97 | 100 | |
|
98 | 101 | beaker.cache.sql_cache_short.type=memory |
|
99 | 102 | beaker.cache.sql_cache_short.expire=10 |
|
103 | beaker.cache.sql_cache_short.key_length = 256 | |
|
100 | 104 | |
|
101 | 105 | beaker.cache.sql_cache_med.type=memory |
|
102 | 106 | beaker.cache.sql_cache_med.expire=360 |
|
107 | beaker.cache.sql_cache_med.key_length = 256 | |
|
103 | 108 | |
|
104 | 109 | beaker.cache.sql_cache_long.type=file |
|
105 | 110 | beaker.cache.sql_cache_long.expire=3600 |
|
111 | beaker.cache.sql_cache_long.key_length = 256 | |
|
106 | 112 | |
|
107 | 113 | #################################### |
|
108 | 114 | ### BEAKER SESSION #### |
@@ -143,7 +149,7 b' logview.pylons.util = #eee' | |||
|
143 | 149 | ######################################################### |
|
144 | 150 | sqlalchemy.db1.url = sqlite:///%(here)s/test.db |
|
145 | 151 | #sqlalchemy.db1.url = postgresql://postgres:qwe@localhost/rhodecode_tests |
|
146 |
#sqlalchemy.db1.echo = |
|
|
152 | #sqlalchemy.db1.echo = false | |
|
147 | 153 | #sqlalchemy.db1.pool_recycle = 3600 |
|
148 | 154 | sqlalchemy.convert_unicode = true |
|
149 | 155 |
General Comments 0
You need to be logged in to leave comments.
Login now