commitcloud: don't take wlock when storing commit cloud state

Summary: Commit cloud state is stored in the store, so the wlock is not necessary.

Reviewed By: liubov-dmitrieva

Differential Revision: D8121600

fbshipit-source-id: f96f4764e3cf0637cd45a0bc83d1227318ac9083
This commit is contained in:
Mark Thomas 2018-06-20 12:37:03 -07:00 committed by Facebook Github Bot
parent 54f1c1f14f
commit a55b165063
2 changed files with 15 additions and 17 deletions

View File

@ -56,7 +56,7 @@ from __future__ import absolute_import
from mercurial import error, extensions, localrepo, registrar, util
from mercurial.i18n import _
from . import commitcloudcommands, commitcloudcommon, commitcloudutil
from . import commitcloudcommands, commitcloudcommon, commitcloudutil, state
cmdtable = commitcloudcommands.cmdtable
@ -137,9 +137,8 @@ def extsetup(ui):
commitcloudcommands.infinitepush = infinitepush
commitcloudcommands.infinitepushbackup = infinitepushbackup
localrepo.localrepository._wlockfreeprefix.update(
[commitcloudutil._obsmarkerssyncing]
)
localrepo.localrepository._wlockfreeprefix.add(commitcloudutil._obsmarkerssyncing)
localrepo.localrepository._lockfreeprefix.add(state.SyncState.prefix)
def reposetup(ui, repo):

View File

@ -21,27 +21,27 @@ class SyncState(object):
last sync.
"""
@staticmethod
def _filename(workspace):
prefix = "commitcloudstate."
@classmethod
def _filename(cls, workspace):
# make a unique valid filename
return (
"commitcloudstate."
cls.prefix
+ "".join(x for x in workspace if x.isalnum())
+ ".%s" % (hashlib.sha256(workspace).hexdigest()[0:5])
)
@staticmethod
def erasestate(repo):
@classmethod
def erasestate(cls, repo):
# get current workspace
workspace = commitcloudutil.getworkspacename(repo)
if not workspace:
raise commitcloudcommon.WorkspaceError(repo.ui, _("undefined workspace"))
filename = SyncState._filename(workspace)
filename = cls._filename(workspace)
# clean up the current state in force recover mode
if repo.svfs.exists(filename):
with repo.wlock(), repo.lock():
repo.svfs.unlink(filename)
repo.svfs.tryunlink(filename)
def __init__(self, repo):
# get current workspace
@ -49,7 +49,7 @@ class SyncState(object):
if not workspace:
raise commitcloudcommon.WorkspaceError(repo.ui, _("undefined workspace"))
self.filename = SyncState._filename(workspace)
self.filename = self._filename(workspace)
repo = shareutil.getsrcrepo(repo)
self.repo = repo
if repo.svfs.exists(self.filename):
@ -73,9 +73,8 @@ class SyncState(object):
def update(self, newversion, newheads, newbookmarks):
data = {"version": newversion, "heads": newheads, "bookmarks": newbookmarks}
with self.repo.wlock(), self.repo.lock():
with self.repo.svfs.open(self.filename, "w", atomictemp=True) as f:
json.dump(data, f)
with self.repo.svfs.open(self.filename, "w", atomictemp=True) as f:
json.dump(data, f)
self.version = newversion
self.heads = newheads
self.bookmarks = newbookmarks