Dicovered unpected database operation result, with ./crash_gen.sh -p -s 100 -t 3 -d
This commit is contained in:
parent
e1ee02e326
commit
a72218378f
|
@ -45,6 +45,14 @@ logger = None
|
||||||
def runThread(wt: WorkerThread):
|
def runThread(wt: WorkerThread):
|
||||||
wt.run()
|
wt.run()
|
||||||
|
|
||||||
|
class CrashGenError(Exception):
|
||||||
|
def __init__(self, msg=None, errno=None):
|
||||||
|
self.msg = msg
|
||||||
|
self.errno = errno
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.msg
|
||||||
|
|
||||||
class WorkerThread:
|
class WorkerThread:
|
||||||
def __init__(self, pool: ThreadPool, tid,
|
def __init__(self, pool: ThreadPool, tid,
|
||||||
tc: ThreadCoordinator,
|
tc: ThreadCoordinator,
|
||||||
|
@ -493,6 +501,9 @@ class DbState():
|
||||||
def transition(self, tasks):
|
def transition(self, tasks):
|
||||||
if ( len(tasks) == 0 ): # before 1st step, or otherwise empty
|
if ( len(tasks) == 0 ): # before 1st step, or otherwise empty
|
||||||
return # do nothing
|
return # do nothing
|
||||||
|
|
||||||
|
self.execSql("show dnodes") # this should show up in the server log, separating steps
|
||||||
|
|
||||||
if ( self._state == self.STATE_EMPTY ):
|
if ( self._state == self.STATE_EMPTY ):
|
||||||
# self.assertNoSuccess(tasks, ReadFixedDataTask) # some read may be successful, since we might be creating a table
|
# self.assertNoSuccess(tasks, ReadFixedDataTask) # some read may be successful, since we might be creating a table
|
||||||
if ( self.hasSuccess(tasks, CreateDbTask) ):
|
if ( self.hasSuccess(tasks, CreateDbTask) ):
|
||||||
|
@ -531,10 +542,14 @@ class DbState():
|
||||||
if ( self.hasSuccess(tasks, DropFixedTableTask) ):
|
if ( self.hasSuccess(tasks, DropFixedTableTask) ):
|
||||||
self.assertAtMostOneSuccess(tasks, DropFixedTableTask)
|
self.assertAtMostOneSuccess(tasks, DropFixedTableTask)
|
||||||
self._state = self.STATE_DB_ONLY
|
self._state = self.STATE_DB_ONLY
|
||||||
elif ( self.hasSuccess(tasks, AddFixedDataTask) ): # no success dropping the table
|
elif ( self.hasSuccess(tasks, AddFixedDataTask) ): # no success dropping the table, but added data
|
||||||
self.assertNoTask(tasks, DropFixedTableTask)
|
self.assertNoTask(tasks, DropFixedTableTask)
|
||||||
self._state = self.STATE_HAS_DATA
|
self._state = self.STATE_HAS_DATA
|
||||||
else: # did not drop table, did not insert data, that is impossible
|
elif ( self.hasSuccess(tasks, ReadFixedDataTask) ): # no success in prev cases, but was able to read data
|
||||||
|
self.assertNoTask(tasks, DropFixedTableTask)
|
||||||
|
self.assertNoTask(tasks, AddFixedDataTask)
|
||||||
|
self._state = self.STATE_TABLE_ONLY # no change
|
||||||
|
else: # did not drop table, did not insert data, did not read successfully, that is impossible
|
||||||
raise RuntimeError("Unexpected no-success scenarios")
|
raise RuntimeError("Unexpected no-success scenarios")
|
||||||
|
|
||||||
elif ( self._state == self.STATE_HAS_DATA ): # Same as above, TODO: adjust
|
elif ( self._state == self.STATE_HAS_DATA ): # Same as above, TODO: adjust
|
||||||
|
@ -577,7 +592,7 @@ class DbState():
|
||||||
def assertNoTask(self, tasks, cls):
|
def assertNoTask(self, tasks, cls):
|
||||||
for task in tasks :
|
for task in tasks :
|
||||||
if isinstance(task, cls):
|
if isinstance(task, cls):
|
||||||
raise RuntimeError("Unexpected task: {}".format(cls))
|
raise CrashGenError("This task: {}, is not expected to be present, given the success/failure of others".format(cls.__name__))
|
||||||
|
|
||||||
def assertNoSuccess(self, tasks, cls):
|
def assertNoSuccess(self, tasks, cls):
|
||||||
for task in tasks :
|
for task in tasks :
|
||||||
|
@ -593,6 +608,8 @@ class DbState():
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TaskExecutor():
|
class TaskExecutor():
|
||||||
def __init__(self, curStep):
|
def __init__(self, curStep):
|
||||||
self._curStep = curStep
|
self._curStep = curStep
|
||||||
|
|
Loading…
Reference in New Issue