* blob/apitester: rename tenantDebugString() -> debugTenantStr()
* blob/apitester: fix int64_t initialization to -1
* blob/apitester: add missing override for randomOperation()
* blob/cpp: cpp blob tenant operations
* apitester: add tenant to execution context
* apitester: DatabaseOps abstraction
This creates a base abstract class for Database and Tenant operations to
share.
* blob/apitester: add setup phase to verifyRange() prior to operations
This let's us ensure blob storage is setup prior to running apitester
against the cluster.
* apitester: expand execOperation() to take a tenant
Now that db operations can be transparently applied to tenants or
databases through the IDatabaseOps interface, allow execOperation() to
take a tenant accordingly.
* blob/testerapi: blobbify in TesterApiWorkload setup
Before we were blobbifying wholesale through TestRunner. This makes the
change to blobbifying and verifying in setup, so the workload can
properly test database and tenant scope functions.
* ApiTester: test transaction timeout
* ApiTester: Turn off buggify for timeout tests
* ApiTester: Enable failure injection in timeout tests; make write transactions self-conflicting
* Consistently use 4 spaces instead of mixing with tabs
Co-authored-by: Andrew Noyes <andrew.noyes@snowflake.com>
* ApiTester: Refactoring removing unnecessary transaction actor classes
* ApiTester: enable executing non-transactional database operations
* ApiTester: a test for fdb_database_list_blobbified_ranges
* ApiTester: Fix memory ownership of the end key in randomGetRangeOp
* ApiTester: reuse get range result validation in blob granule tests
* ApiTester: More asserts on workload status; Fixing data race in the cleanup phase
* ApiTester: comments explaining assumptions behind synchronization in TransactionContext; declaring immutable fields as const
* Add build dependency between fdb_c_shim and fdb_c