Skip to content

Commit

Permalink
Store all new logs in files.
Browse files Browse the repository at this point in the history
Embedding smaller logs in the pickle was a stupid idea.
  • Loading branch information
jpommerening committed Mar 4, 2014
1 parent 2027f32 commit 9f73985
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 63 deletions.
20 changes: 4 additions & 16 deletions master/buildbot/status/logfile.py
Expand Up @@ -659,28 +659,15 @@ def __setstate__(self, d):

class HTMLLogFile(LogFile):

# logs that are smaller than this will be pickled
maxEmbedSize = 10 * 1000

def __init__(self, parent, name, logfilename, html):
LogFile.__init__(self, parent, name, logfilename)
if len(html) > self.maxEmbedSize:
self.addStderr(html)
self.finish()
else:
self._fakeOpenfile(html)
self.finished = True
self.html = html
self.addStderr(html)
self.finish()

def hasContents(self):
assert not self._isNewStyle, "not available in new-style steps"
return True

def _fakeOpenfile(self, html):
# simulate s serialized stream of log chunks
buf = "%d:%d%s," % (len(html) + 1, STDERR, html)
self.openfile = StringIO(buf)

def __setstate__(self, d):
self.__dict__ = d
self.watchers = []
Expand All @@ -689,7 +676,8 @@ def __setstate__(self, d):

# buildbot <= 0.8.8 stored all html logs in the html property
if 'html' in self.__dict__:
self._fakeOpenfile(self.html)
buf = "%d:%d%s," % (len(self.html) + 1, STDERR, self.html)
self.openfile = StringIO(buf)
del self.__dict__['html']


Expand Down
57 changes: 10 additions & 47 deletions master/buildbot/test/unit/test_status_logfile.py
Expand Up @@ -382,13 +382,6 @@ def pickle_and_restore(self):
self.logfile.master = self.master
step.build.builder.basedir = self.basedir

def create_large_logfile(self):
# fake a logfile that exceeds HTMLLogFile.maxEmbedSize
maxEmbedSize = logfile.HTMLLogFile.maxEmbedSize
logfile.HTMLLogFile.maxEmbedSize = 5
self.logfile = logfile.HTMLLogFile(self.build_step_status, 'error.html', '123-error_html', '<span>You lost the game</span>')
self.logfile.master = self.master

def delete_logfile(self):
if self.logfile.openfile:
try:
Expand All @@ -397,27 +390,17 @@ def delete_logfile(self):
pass # oh well, we tried
os.unlink(os.path.join('basedir', '123-error_html'))

def test_unpickle_embedded(self):
self.pickle_and_restore()

d = self.logfile.finish()

def check(_):
# LogFile.__init__ already creates the file ...
# self.assertFalse(os.path.exists(os.path.join('basedir', '123-error_html')))
pass

d.addCallback(check)
return d

def test_unpickle_fromFile(self):
self.create_large_logfile()
def test_unpickle(self):
self.pickle_and_restore()

d = self.logfile.finish()

def check(_):
self.assertTrue(os.path.exists(os.path.join('basedir', '123-error_html')))
fn = os.path.join('basedir', '123-error_html')
self.assertTrue(os.path.exists(fn))
fp = open(fn, 'r')
self.assertEqual(fp.read(), '31:1<span>You lost the game</span>,')
fp.close()

d.addCallback(check)
return d
Expand Down Expand Up @@ -450,36 +433,16 @@ def test_waitUntilFinished(self):
d = self.logfile.waitUntilFinished()
return d

def test_getText_embedded(self):
def test_getText(self):
self.assertEqual(self.logfile.getText(), '<span>You lost the game</span>')

def test_getText_fromFile(self):
self.create_large_logfile()
self.pickle_and_restore()
def test_getText(self):
self.assertEqual(self.logfile.getText(), '<span>You lost the game</span>')

def test_getTextWithHeaders_embedded(self):
def test_getTextWithHeaders(self):
self.assertEqual(self.logfile.getTextWithHeaders(), '<span>You lost the game</span>')

def test_getTextWithHeaders_fromFile(self):
self.create_large_logfile()
self.pickle_and_restore()
self.assertEqual(self.logfile.getTextWithHeaders(), '<span>You lost the game</span>')

def test_getFile_embedded(self):
fp = self.logfile.getFile()
fp.seek(0, 0)
self.assertEqual(fp.read(), '31:1<span>You lost the game</span>,')

self.pickle_and_restore()

fp = self.logfile.getFile()
fp.seek(0, 0)
self.assertEqual(fp.read(), '31:1<span>You lost the game</span>,')

def test_getFile_fromFile(self):
self.create_large_logfile()

def test_getFile(self):
fp = self.logfile.getFile()
fp.seek(0, 0)
self.assertEqual(fp.read(), '31:1<span>You lost the game</span>,')
Expand Down

0 comments on commit 9f73985

Please sign in to comment.