Revision: 7234 Author: filnik Date: 2009-09-13 10:11:38 +0000 (Sun, 13 Sep 2009)
Log Message: ----------- Bugfix by xqt to bug: #2810921, patch: #2848941
Modified Paths: -------------- trunk/pywikipedia/wikipedia.py
Modified: trunk/pywikipedia/wikipedia.py =================================================================== --- trunk/pywikipedia/wikipedia.py 2009-09-13 10:03:34 UTC (rev 7233) +++ trunk/pywikipedia/wikipedia.py 2009-09-13 10:11:38 UTC (rev 7234) @@ -1527,10 +1527,10 @@ put_throttle() # Which web-site host are we submitting to? if newPage: - output(u'Creating page %s' % self.aslink()) + output(u'Creating page %s via API' % self.aslink()) params['createonly'] = 1 else: - output(u'Updating page %s' % self.aslink()) + output(u'Updating page %s via API' % self.aslink()) params['nocreate'] = 1 # Submit the prepared information try: @@ -1597,13 +1597,15 @@ errorCode = data['error']['code'] #cannot handle longpageerror and PageNoSave yet if errorCode == 'maxlag' or response.status == 503: - # server lag; Mediawiki recommends waiting 5 seconds - # and retrying + # server lag; wait for the lag time and retry + info = data['error']['info'] if verbose: - output(data, newline=False) - output(u"Pausing 5 seconds due to database server lag.") + output(u'INFO: %s' % info)###xqt + m = re.search('Waiting for (.+?): (.+?) seconds lagged', info) + timelag = int(m.group(2)) + output(u"Pausing %d seconds due to database server lag." % timelag) dblagged = True - time.sleep(5) + time.sleep(timelag) continue elif errorCode == 'editconflict': # 'editconflict':"Edit conflict detected", @@ -1748,6 +1750,7 @@ retry_delay = 1 retry_attempt = 1 dblagged = False + wait = 5 while True: if (maxTries == 0): raise MaxTriesExceededError() @@ -1780,9 +1783,10 @@ # and retrying if verbose: output(data, newline=False) - output(u"Pausing 5 seconds due to database server lag.") + output(u"Pausing %d seconds due to database server lag." % wait) dblagged = True - time.sleep(5) + time.sleep(wait) + wait = min(wait*2, 300) continue # Squid error 503 raise ServerError(response.status) @@ -1806,8 +1810,9 @@ # Check blocks self.site().checkBlocks(sysop = sysop) # A second text area means that an edit conflict has occured. - editconflict = re.compile('id=["']wpTextbox2['"] name="wpTextbox2"') - if editconflict.search(data): + editconflict1 = re.compile('id=["']wpTextbox2['"] name="wpTextbox2"') + editconflict2 = re.compile('name="wpTextbox2" id="wpTextbox2"') + if editconflict1.search(data) or editconflict2.search(data): raise EditConflict(u'An edit conflict has occured.')
# remove the wpAntispam keyword before checking for Spamfilter @@ -1886,6 +1891,14 @@ if retry_delay > 30: retry_delay = 30 continue + if ("1213: Deadlock found when trying to get lock" in data): + output(u"Deadlock error encountered; will retry in %i minute%s." + % (retry_delay, retry_delay != 1 and "s" or "")) + time.sleep(60 * retry_delay) + retry_delay *= 2 + if retry_delay > 30: + retry_delay = 30 + continue if self.site().mediawiki_message('readonly') in data or self.site().mediawiki_message('readonly_lag') in data: output(u"The database is currently locked for write access; will retry in %i minute%s." % (retry_delay, retry_delay != 1 and "s" or "")) @@ -7045,7 +7058,7 @@ if code in ['cs', 'sk']: return ['cs', 'sk'] #German - if code in ['als', 'bar', 'ksh']: + if code in ['als', 'bar', 'ksh', 'pdc']: return ['de'] if code in ['als', 'lb']: return ['de', 'fr']