Entropy/EAPI3 Repository Services:

- implement database setup lock file, to make client wait a little bit before giving up and switching to EAPI2


git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@2152 cd1c1023-2f26-0410-ae45-c471fc1f0318
This commit is contained in:
lxnay
2008-06-16 11:11:56 +00:00
parent 4a8b814dcb
commit 623bc34bc6
2 changed files with 48 additions and 8 deletions
+47 -8
View File
@@ -5923,6 +5923,19 @@ class RepoInterface:
else:
return -1
def get_online_eapi3_lock(self, repo):
self.__validate_repository_id(repo)
url = etpRepositories[repo]['database']+"/"+etpConst['etpdatabaseeapi3lockfile']
data = self.entropyTools.get_remote_data(url)
if not data:
return False
return True
def is_repository_eapi3_locked(self, repo):
self.__validate_repository_id(repo)
return self.get_online_eapi3_lock(repo)
def is_repository_updatable(self, repo):
self.__validate_repository_id(repo)
@@ -5932,7 +5945,7 @@ class RepoInterface:
localstatus = self.Entropy.get_repository_revision(repo)
if (localstatus == onlinestatus) and (not self.forceUpdate):
return False
else: # if == -1, means no repo found online
else: # if == -1 => HTTP 404
return False
return True
@@ -6793,6 +6806,18 @@ class RepoInterface:
header = "\t"
)
return True
# also check for eapi3 lock
if self.dbformat_eapi == 3:
locked = self.is_repository_eapi3_locked(repo)
if locked:
mytxt = "%s: %s." % (bold(_("Attention")),red(_("database will be ready soon")),)
self.Entropy.updateProgress(
mytxt,
importance = 1,
type = "info",
header = "\t"
)
return True
return False
def handle_repository_lock(self, repo):
@@ -16143,7 +16168,8 @@ class RepositorySocketServerInterface(SocketHostInterface):
return True
def lock_scan(self):
do_lock = set()
do_unlock = set()
do_clear = set()
for repository,arch,product in self.repositories:
x = (repository,arch,product)
self.set_repository_db_availability(x)
@@ -16160,14 +16186,15 @@ class RepositorySocketServerInterface(SocketHostInterface):
importance = 1,
type = "info"
)
do_lock.add(repository)
do_clear.add(repository)
continue
if os.path.isfile(self.repositories[x]['download_lock']) and \
not self.repositories[x]['locked']:
self.repositories[x]['locked'] = True
mydbpath = os.path.join(self.repositories[x]['dbpath'],etpConst['etpdatabasefile'])
self.close_db(mydbpath)
do_lock.add(repository)
self.eapi3_lock_repo(*x)
do_clear.add(repository)
mytxt = blue("%s.") % (_("database got locked. Locking services for it"),)
self.updateProgress(
"[%s] %s" % (
@@ -16195,10 +16222,7 @@ class RepositorySocketServerInterface(SocketHostInterface):
)
# woohoo, got unlocked eventually
mydb = self.open_db(mydbpath, docache = False)
mydb.setCacheSize(6000)
mydb.setDefaultCacheSize(6000)
mydb.createAllIndexes()
mydb.commitChanges()
self.updateProgress(
str(mydb.database_checksum(do_order = True, strict = False, strings = True)),
importance = 1,
@@ -16207,9 +16231,24 @@ class RepositorySocketServerInterface(SocketHostInterface):
mydb.closeDB()
self.Entropy.clear_dump_cache(etpCache['repository_server']+"/"+repository+"/")
self.repositories[x]['locked'] = False
for repo in do_lock:
self.eapi3_unlock_repo(*x)
for repo in do_clear:
self.Entropy.clear_dump_cache(etpCache['repository_server']+"/"+repo+"/")
def eapi3_lock_repo(self, repository, arch, product):
lock_file = os.path.join(self.repositories[(repository, arch, product,)]['dbpath'],etpConst['etpdatabaseeapi3lockfile'])
if not os.path.lexists(lock_file):
f = open(lock_file,"w")
f.write("this repository is EAPI3 locked")
f.flush()
f.close()
def eapi3_unlock_repo(self, repository, arch, product):
lock_file = os.path.join(self.repositories[(repository, arch, product,)]['dbpath'],etpConst['etpdatabaseeapi3lockfile'])
if os.path.isfile(lock_file):
os.remove(lock_file)
def get_dcache(self, item, repo = '_norepo_'):
return self.dumpTools.loadobj(etpCache['repository_server']+"/"+repo+"/"+str(hash(item)))
+1
View File
@@ -566,6 +566,7 @@ def const_defaultSettings(rootdir):
'etpdatabasedumphashfilebz2': ETP_DBFILE+".dump.bz2.md5",
'etpdatabasedumphashfilegzip': ETP_DBFILE+".dump.gz.md5",
'etpdatabaselockfile': ETP_DBFILE+".lock", # the remote database lock file
'etpdatabaseeapi3lockfile': ETP_DBFILE+".eapi3_lock", # the remote database lock file
'etpdatabasedownloadlockfile': ETP_DBFILE+".download.lock", # the remote database download lock file
'etpdatabasetaintfile': ETP_DBFILE+".tainted", # when this file exists, the database is not synced anymore with the online one
'etpdatabasefile': ETP_DBFILE, # Entropy sqlite database file ETP_DIR+ETP_DBDIR+"/packages.db"