You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2014/02/03 23:53:29 UTC
[03/15] git commit: [#7103] Fixed stale project data issue from
long-running imports and bulk edits
[#7103] Fixed stale project data issue from long-running imports and bulk edits
Signed-off-by: Cory Johns <cj...@slashdotmedia.com>
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/43c4bcee
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/43c4bcee
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/43c4bcee
Branch: refs/heads/cj/7085
Commit: 43c4bcee7b15cff07df2fa26e2d3711584377148
Parents: 49d4ea8
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Mon Jan 27 21:07:09 2014 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Mon Jan 27 21:07:09 2014 +0000
----------------------------------------------------------------------
Allura/allura/model/artifact.py | 7 +++++--
Allura/allura/tests/model/test_artifact.py | 26 ++++++++++++++++++++++++-
ForgeImporters/forgeimporters/base.py | 23 +++++++++++++++++-----
ForgeTracker/forgetracker/tasks.py | 13 ++++++++++++-
4 files changed, 60 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/43c4bcee/Allura/allura/model/artifact.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/artifact.py b/Allura/allura/model/artifact.py
index 56c7643..fed8e02 100644
--- a/Allura/allura/model/artifact.py
+++ b/Allura/allura/model/artifact.py
@@ -65,11 +65,14 @@ class Artifact(MappedClass):
]
def before_save(data):
- if not getattr(artifact_orm_session._get(), 'skip_mod_date', False):
+ _session = artifact_orm_session._get()
+ skip_mod_date = getattr(_session, 'skip_mod_date', False)
+ skip_last_updated = getattr(_session, 'skip_last_updated', False)
+ if not skip_mod_date:
data['mod_date'] = datetime.utcnow()
else:
log.debug('Not updating mod_date')
- if c.project:
+ if c.project and not skip_last_updated:
c.project.last_updated = datetime.utcnow()
type_s = 'Generic Artifact'
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/43c4bcee/Allura/allura/tests/model/test_artifact.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/model/test_artifact.py b/Allura/allura/tests/model/test_artifact.py
index e9ac6ec..d00d935 100644
--- a/Allura/allura/tests/model/test_artifact.py
+++ b/Allura/allura/tests/model/test_artifact.py
@@ -24,7 +24,7 @@ import re
from datetime import datetime
from pylons import tmpl_context as c
-from nose.tools import assert_raises
+from nose.tools import assert_raises, assert_equal
from nose import with_setup
from mock import patch
from ming.orm.ormsession import ThreadLocalORMSession
@@ -197,3 +197,27 @@ def test_messages_unknown_lookup():
m.author_id = ObjectId() # something new
assert type(m.author()) == M.User, type(m.author())
assert m.author() == M.User.anonymous()
+
+
+@with_setup(setUp, tearDown)
+@patch('allura.model.artifact.datetime')
+def test_last_updated(_datetime):
+ c.project.last_updated = datetime(2014, 1, 1)
+ _datetime.utcnow.return_value = datetime(2014, 1, 2)
+ WM.Page(title='TestPage1')
+ ThreadLocalORMSession.flush_all()
+ assert_equal(c.project.last_updated, datetime(2014, 1, 2))
+
+
+@with_setup(setUp, tearDown)
+@patch('allura.model.artifact.datetime')
+def test_last_updated_disabled(_datetime):
+ c.project.last_updated = datetime(2014, 1, 1)
+ _datetime.utcnow.return_value = datetime(2014, 1, 2)
+ try:
+ M.artifact_orm_session._get().skip_last_updated = True
+ WM.Page(title='TestPage1')
+ ThreadLocalORMSession.flush_all()
+ assert_equal(c.project.last_updated, datetime(2014, 1, 1))
+ finally:
+ M.artifact_orm_session._get().skip_last_updated = False
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/43c4bcee/ForgeImporters/forgeimporters/base.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/base.py b/ForgeImporters/forgeimporters/base.py
index 5fbf6e1..848cb38 100644
--- a/ForgeImporters/forgeimporters/base.py
+++ b/ForgeImporters/forgeimporters/base.py
@@ -23,6 +23,7 @@ import urllib2
from collections import defaultdict
import traceback
from urlparse import urlparse
+from datetime import datetime
try:
from cStringIO import StringIO
except ImportError:
@@ -117,13 +118,25 @@ def object_from_path(path):
@task(notifications_disabled=True)
-def import_tool(importer_path, project_name=None, mount_point=None, mount_label=None, **kw):
+def import_tool(importer_path, project_name=None,
+ mount_point=None, mount_label=None, **kw):
importer = object_from_path(importer_path)()
with ImportErrorHandler(importer, project_name, c.project) as handler,\
- M.session.substitute_extensions(M.artifact_orm_session, [M.session.BatchIndexer]):
- app = importer.import_tool(
- c.project, c.user, project_name=project_name,
- mount_point=mount_point, mount_label=mount_label, **kw)
+ M.session.substitute_extensions(M.artifact_orm_session,
+ [M.session.BatchIndexer]):
+ try:
+ M.artifact_orm_session._get().skip_last_updated = True
+ app = importer.import_tool(
+ c.project, c.user, project_name=project_name,
+ mount_point=mount_point, mount_label=mount_label, **kw)
+ # manually update project's last_updated field at the end of the
+ # import instead of it being updated automatically by each artifact
+ # since long-running task can cause stale project data to be saved
+ M.Project.query.update(
+ {'_id': c.project._id},
+ {'$set': {'last_updated': datetime.utcnow()}})
+ finally:
+ M.artifact_orm_session._get().skip_last_updated = False
M.artifact_orm_session.flush()
M.session.BatchIndexer.flush()
if app:
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/43c4bcee/ForgeTracker/forgetracker/tasks.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tasks.py b/ForgeTracker/forgetracker/tasks.py
index 6492d7d..0fdebc5 100644
--- a/ForgeTracker/forgetracker/tasks.py
+++ b/ForgeTracker/forgetracker/tasks.py
@@ -16,6 +16,7 @@
# under the License.
import logging
+from datetime import datetime
from pylons import tmpl_context as c
@@ -41,4 +42,14 @@ def move_tickets(ticket_ids, destination_tracker_id):
@task
def bulk_edit(**post_data):
- c.app.globals.update_tickets(**post_data)
+ try:
+ M.artifact_orm_session._get().skip_last_updated = True
+ c.app.globals.update_tickets(**post_data)
+ # manually update project's last_updated field at the end of the
+ # import instead of it being updated automatically by each artifact
+ # since long-running task can cause stale project data to be saved
+ M.Project.query.update(
+ {'_id': c.project._id},
+ {'$set': {'last_updated': datetime.utcnow()}})
+ finally:
+ M.artifact_orm_session._get().skip_last_updated = False