Added -r option for crash_gen.sh, recording data opersions, for power-off tests
This commit is contained in:
parent
53892448df
commit
815cb83904
|
@ -14,6 +14,7 @@
|
||||||
from __future__ import annotations # For type hinting before definition, ref: https://stackoverflow.com/questions/33533148/how-do-i-specify-that-the-return-type-of-a-method-is-the-same-as-the-class-itsel
|
from __future__ import annotations # For type hinting before definition, ref: https://stackoverflow.com/questions/33533148/how-do-i-specify-that-the-return-type-of-a-method-is-the-same-as-the-class-itsel
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
import os
|
||||||
import traceback
|
import traceback
|
||||||
# Require Python 3
|
# Require Python 3
|
||||||
if sys.version_info[0] < 3:
|
if sys.version_info[0] < 3:
|
||||||
|
@ -1168,6 +1169,24 @@ class DropFixedSuperTableTask(StateTransitionTask):
|
||||||
|
|
||||||
class AddFixedDataTask(StateTransitionTask):
|
class AddFixedDataTask(StateTransitionTask):
|
||||||
activeTable : Set[int] = set() # Track which table is being actively worked on
|
activeTable : Set[int] = set() # Track which table is being actively worked on
|
||||||
|
LARGE_NUMBER_OF_TABLES = 35
|
||||||
|
SMALL_NUMBER_OF_TABLES = 3
|
||||||
|
LARGE_NUMBER_OF_RECORDS = 50
|
||||||
|
SMALL_NUMBER_OF_RECORDS = 3
|
||||||
|
|
||||||
|
# We use these two files to record operations to DB, useful for power-off tests
|
||||||
|
fAddLogReady = None
|
||||||
|
fAddLogDone = None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def prepToRecordOps(cls):
|
||||||
|
if gConfig.record_ops :
|
||||||
|
if ( cls.fAddLogReady == None ):
|
||||||
|
logger.info("Recording in a file operations to be performed...")
|
||||||
|
cls.fAddLogReady = open("add_log_ready.txt", "w")
|
||||||
|
if ( cls.fAddLogDone == None ):
|
||||||
|
logger.info("Recording in a file operations completed...")
|
||||||
|
cls.fAddLogDone = open("add_log_done.txt", "w")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def getInfo(cls):
|
def getInfo(cls):
|
||||||
|
@ -1183,7 +1202,7 @@ class AddFixedDataTask(StateTransitionTask):
|
||||||
def _executeInternal(self, te: TaskExecutor, wt: WorkerThread):
|
def _executeInternal(self, te: TaskExecutor, wt: WorkerThread):
|
||||||
ds = self._dbState
|
ds = self._dbState
|
||||||
wt.execSql("use db") # TODO: seems to be an INSERT bug to require this
|
wt.execSql("use db") # TODO: seems to be an INSERT bug to require this
|
||||||
tblSeq = list(range(35 if gConfig.larger_data else 2))
|
tblSeq = list(range(self.LARGE_NUMBER_OF_TABLES if gConfig.larger_data else self.SMALL_NUMBER_OF_TABLES))
|
||||||
random.shuffle(tblSeq)
|
random.shuffle(tblSeq)
|
||||||
for i in tblSeq:
|
for i in tblSeq:
|
||||||
if ( i in self.activeTable ): # wow already active
|
if ( i in self.activeTable ): # wow already active
|
||||||
|
@ -1193,13 +1212,24 @@ class AddFixedDataTask(StateTransitionTask):
|
||||||
else:
|
else:
|
||||||
self.activeTable.add(i) # marking it active
|
self.activeTable.add(i) # marking it active
|
||||||
# No need to shuffle data sequence, unless later we decide to do non-increment insertion
|
# No need to shuffle data sequence, unless later we decide to do non-increment insertion
|
||||||
for j in range(50 if gConfig.larger_data else 2) : # number of records per table
|
for j in range(self.LARGE_NUMBER_OF_RECORDS if gConfig.larger_data else self.SMALL_NUMBER_OF_RECORDS) : # number of records per table
|
||||||
sql = "insert into db.reg_table_{} using {} tags ('{}', {}) values ('{}', {});".format(
|
nextInt = ds.getNextInt()
|
||||||
i,
|
regTableName = "db.reg_table_{}".format(i)
|
||||||
|
if gConfig.record_ops:
|
||||||
|
self.prepToRecordOps()
|
||||||
|
self.fAddLogReady.write("Ready to write {} to {}\n".format(nextInt, regTableName))
|
||||||
|
self.fAddLogReady.flush()
|
||||||
|
os.fsync(self.fAddLogReady)
|
||||||
|
sql = "insert into {} using {} tags ('{}', {}) values ('{}', {});".format(
|
||||||
|
regTableName,
|
||||||
ds.getFixedSuperTableName(),
|
ds.getFixedSuperTableName(),
|
||||||
ds.getNextBinary(), ds.getNextFloat(),
|
ds.getNextBinary(), ds.getNextFloat(),
|
||||||
ds.getNextTick(), ds.getNextInt())
|
ds.getNextTick(), nextInt)
|
||||||
wt.execSql(sql)
|
wt.execSql(sql)
|
||||||
|
if gConfig.record_ops:
|
||||||
|
self.fAddLogDone.write("Wrote {} to {}\n".format(nextInt, regTableName))
|
||||||
|
self.fAddLogDone.flush()
|
||||||
|
os.fsync(self.fAddLogDone)
|
||||||
self.activeTable.discard(i) # not raising an error, unlike remove
|
self.activeTable.discard(i) # not raising an error, unlike remove
|
||||||
|
|
||||||
|
|
||||||
|
@ -1329,6 +1359,8 @@ def main():
|
||||||
help='Write larger amount of data during write operations (default: false)')
|
help='Write larger amount of data during write operations (default: false)')
|
||||||
parser.add_argument('-p', '--per-thread-db-connection', action='store_true',
|
parser.add_argument('-p', '--per-thread-db-connection', action='store_true',
|
||||||
help='Use a single shared db connection (default: false)')
|
help='Use a single shared db connection (default: false)')
|
||||||
|
parser.add_argument('-r', '--record-ops', action='store_true',
|
||||||
|
help='Use a pair of always-fsynced fils to record operations performing + performed, for power-off tests (default: false)')
|
||||||
parser.add_argument('-s', '--max-steps', action='store', default=100, type=int,
|
parser.add_argument('-s', '--max-steps', action='store', default=100, type=int,
|
||||||
help='Maximum number of steps to run (default: 100)')
|
help='Maximum number of steps to run (default: 100)')
|
||||||
parser.add_argument('-t', '--num-threads', action='store', default=10, type=int,
|
parser.add_argument('-t', '--num-threads', action='store', default=10, type=int,
|
||||||
|
|
Loading…
Reference in New Issue