FILE_IO(3)
π FILE_IO(3) β the file_io module, bestie edition π
okay so real talk, this is the page for nfstest.file_io, a.k.a. the File I/O module from file_io version 1.3, and yes she's iconic, yes she's in section 3 of the manual, and yes we're gonna get through every single line together. grab a snack. π
β¨ NAME β¨
nfstest.file_io β File I/O module. that's it, that's the name, short and slay. π
πΈ DESCRIPTION πΈ
so what does she do? she gives you an interface to create and manipulate files of different types. the arguments let you run for a specified period of time, and also let you run multiple processes. here's the cute part: each process modifies a single file at a time, and the file name space is different for each process, so there are no collisions between two different processes modifying the same file. no drama, no fighting over the same file, we love a peaceful household. π«Ά
File types she's serving:
- Regular file
- Hard link
- Symbolic link
File operations on the menu:
- Open (create or re-open)
- Open downgrade
- This is done by opening the file for read and write, then the file is opened again as read only and finally closing the read and write file descriptor
- Read (sequential or random access)
- Write (sequential or random access)
- Remove
- Rename
- Truncate (path or file descriptor)
- Readdir
- Lock
- Unlock
- Tlock
π CLASSES π
π class FileIO(baseobj.BaseObj)
the FileIO object. main character energy, fr fr.
Usage:
from nfstest.file_io import FileIO
# Instantiate FileIO object given top level directory
x = FileIO(datadir="/tmp/data")
# Run workload creating the top level directory if necessary
x.run()
Methods defined here:
__del__(self)
Destructor. she says goodbye when it's time to go. π
__init__(self, **kwargs)
Constructor. Initialize object's private data.
okay bestie, here's the full kwargs menu, and I am not skipping a single one, not on my watch:
datadirβ Top level directory where files will be created, it will be created if it does not existseedβ Seed to initialized the random number generator [default: automatically generated]nprocsβ Number of processes to use [default:1]runtimeβ Run time [default:0(indefinitely)]verboseβ Verbose level:none|info|debug|dbg1-7|all[default:'none']exiterrβ Exit on first error [default:False]readβ Read file percentage [default:40.0]writeβ Write file percentage [default:40.0]rdwrβ Read/write file percentage [default:20.0]randioβ Random file access percentage [default:50.0]iodelayβ Seconds to delay I/O operations [default:0.0]directβ Use direct I/O [default:False]rdwronlyβ Use read and write only, no rename, remove, etc. [default:False]createβ Create file percentage [default:5.0]odgradeβ Open downgrade percentage [default:5.0]osyncβ Open file withO_SYNC[default:10.0]fsyncβ Percentage of fsync after write [default:2.0]renameβ Rename file percentage [default:5.0]removeβ Remove file percentage [default:5.0]truncβ Truncate file percentage [default:2.0]ftruncβ Truncate opened file percentage [default:2.0]linkβ Create hard link percentage [default:1.0]slinkβ Create symbolic link percentage [default:0.2]readdirβ List contents of directory percentage [default:0.5]lockβ Lock file percentage [default:20.0]unlockβ Unlock file percentage [default:80.0]tlockβ Lock test percentage [default:20.0]lockfullβ Lock full file percentage [default:50.0]minfilesβ Minimum number of files to create before any file operation is executed [default:10]fsizeavgβ File size average [default:1m]fsizedevβ File size standard deviation [default:256k]rsizeβ Read block size [default:64k]rsizedevβ Read block size standard deviation [default:8k]wsizeβ Write block size [default:64k]wsizedevβ Write block size standard deviation [default:8k]sizemultβ Size multiplier [default:1.0]createlogβ Create log file [default:False]createlogsβ Create a log file for each process [default:False]logdirβ Log directory [default:'/tmp']
get_mountpoint(self)
Get mount point from data directory. detective work, but make it filesystem. π
run(self)
Main function where all processes are started. this is where the party actually begins. π
run_process(self, tid=0)
Main loop for each process.
π¦ class FileObj(baseobj.BaseObj)
Base class so objects will inherit the methods providing the string representation of the object and a simple debug printing and logging mechanism.
Usage:
from baseobj import BaseObj
# Named arguments
x = BaseObj(a=1, b=2)
# Dictionary argument
x = BaseObj({'a':1, 'b':2})
# Tuple arguments: first for keys and second for the values
x = BaseObj(['a', 'b'], [1, 2])
# All of the above will create an object having two attributes:
x.a = 1 and x.b = 2
# Add attribute name, this will be the only attribute to be displayed
x.set_attrlist("a")
# Add list of attribute names to be displayed in that order
x.set_attrlist(["a", "b"])
# Set attribute with ordered display rights
x.set_attr("a", 1)
# This is the same as
setattr(x, "a", 1) or x.a = 1
x.set_attrlist("a")
# Set attribute with switch duplicate
# The following creates an extra attribute "switch" with
# the same value as attribute "a":
# x.a == x.switch
# x.a is x.switch
x.set_attr("a", 1, switch=True)
# Make the current object flat by allowing all the attributes
# for the new attribute to be accessed directly by the current
# object so the following is True:
# x.d == x.c.d
x.set_attr("c", BaseObj(d=11, e=22), switch=True)
# Set the comparison attribute so x == x.a is True
x.set_eqattr("a")
# Set verbose level of object's string representation
x.debug_repr(level)
# Set string format for verbose level 1
x.set_strfmt(1, "arg1:{0}")
# In the above example the first positional argument is "a"
# so the str(x) gives "arg1:1"
# Set attribute shared by all instances
# If a global or shared attribute is set on one instance,
# all other instances will have access to it:
# y = BaseObj(d=2, e=3)
# then the following is true
# x.g == y.g
# x.g is y.g
x.set_global("g", 5)
# Set level mask to display all debug messages matching mask
x.debug_level(0xFF)
# Add a debug mapping for mask 0x100
x.debug_map(0x100, 'opts', "OPTS: ")
# Set global indentation to 4 spaces for dprint
x.dindent(4)
# Set global indentation to 4 spaces for displaying objects
x.sindent(4)
# Set global truncation to 64 for displaying string objects
x.strsize(64)
# Do not display timestamp for dprint messages
x.tstamp(enable=False)
# Change timestamp format to include the date
x.tstamp(fmt="{0:date:%Y-%m-%d %H:%M:%S.%q} ")
# Get timestamp if enabled, else return an empty string
out = x.timestamp()
# Open log file
x.open_log(logfile)
# Close log file
x.close_log()
# Write data to log file
x.write_log(data)
# Format the given arguments
out = x.format("{0:x} - {1}", 1, "hello")
# Format the object attributes set by set_attrlist()
out = x.format("{0:x} - {1}")
# Print debug message only if OPTS bitmap matches the current
# debug level mask
x.dprint("OPTS", "This is an OPTS debug message")
β class TermSignal(builtins.Exception)
Exception to be raised on SIGTERM signal. she's the one who catches the vibe shift. π
π FUNCTIONS π
stop_handler(signum, frame)
Signal handler to catch SIGTERM and allow for graceful termination of subprocesses. no cap, she keeps everything tidy on the way out. π§
π SEE ALSO π
π BUGS π
No known bugs. she's flawless and we're obsessed. π β¨
π AUTHOR π
Jorge Mora (mora@netapp.com). thank you for your service, king. π«‘
and that's the whole page bestie!! π this was NFStest 3.2, dated 21 March 2023, and the manual page you just read is FILE_IO(3) β so go forth, create some files, no collisions, no stress, periodt. πΈπ¦β
π¦ where this page comes from
- debian trixie: nfstest 3.2-3
- fedora 43: NFStest 3.2-14.fc43 Β· GPL-2.0-or-later
- fedora 44: NFStest 3.2-16.fc44 Β· GPL-2.0-or-later
- ubuntu noble: nfstest 3.2-2
- ubuntu questing: nfstest 3.2-3
- ubuntu resolute: nfstest 3.2-3build1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms