WEB / WEB-18.04
Object storage, filesystem, and persistence flow
Follow public-note bytes, store keys, and database references separately; distinguish the owners of write, flush, and commit outcomes.
1. Core · Mechanism
Read every scenario without motion
Store + reference
- Public bytes ready
The application prepares to write public note text Çay followed by a newline under key notes/tea.txt. File bytes and SQLite references have different owners; neither write nor reference commit has occurred.
- Application
- Public note bytes prepared
- Local storage adapter
- Mapping not selected
- Owned file bytes
- No content/reference decision
- SQLite reference
- No committed reference
- Mapping/encode
The adapter maps logical key notes/tea.txt to fixed backing file tea.txt. Çay plus newline has four characters and five UTF-8 bytes c38761790a; contentType=text/plain does not alter those bytes.
- Application
- Public note bytes prepared
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- No content/reference decision
- SQLite reference
- No committed reference
- Buffered write
Python buffered file write accepts the selected bytes; the language buffer and durability boundary differ.
- Application
- Public note bytes prepared
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- Buffered write accepted 5 octets
- SQLite reference
- No committed reference
- Flush buffer
flush pushes language-level write buffers into the underlying stream; actual crash recovery is not measured.
- Application
- Public note bytes prepared
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- Flushed to underlying stream
- SQLite reference
- No committed reference
- fsync completion
os.fsync has completed and the selected file readback matches c38761790a. This ordinary readback is not a power-loss-recovery or directory-metadata-durability guarantee.
- Application
- Public note bytes prepared
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- fsync completed; bytes readable
- SQLite reference
- No committed reference
- Reference write
The SQLite reference write and explicit COMMIT succeed with noteId=tea, key=notes/tea.txt and octets=5. Another connection can read this row; file writing and database commit are not one atomic transaction.
- Application
- Public note bytes prepared
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- fsync completed; bytes readable
- SQLite reference
- Committed tea/key/5 octets
- Application result
The application uses both selected owner outcomes; HTTP arrival and power-loss durability are not inferred.
- Application
- Available; readback matched
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- fsync completed; bytes readable
- SQLite reference
- Committed tea/key/5 octets
Orphan bytes
- Public bytes ready
The application prepares to write public note text Çay followed by a newline under key notes/tea.txt. File bytes and SQLite references have different owners; neither write nor reference commit has occurred.
- Application
- Public note bytes prepared
- Local storage adapter
- Mapping not selected
- Owned file bytes
- No content/reference decision
- SQLite reference
- No committed reference
- Mapping/encode
The adapter maps logical key notes/tea.txt to fixed backing file tea.txt. Çay plus newline has four characters and five UTF-8 bytes c38761790a; contentType=text/plain does not alter those bytes.
- Application
- Public note bytes prepared
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- No content/reference decision
- SQLite reference
- No committed reference
- Buffered write
Python buffered file write accepts the selected bytes; the language buffer and durability boundary differ.
- Application
- Public note bytes prepared
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- Buffered write accepted 5 octets
- SQLite reference
- No committed reference
- Flush buffer
flush pushes language-level write buffers into the underlying stream; actual crash recovery is not measured.
- Application
- Public note bytes prepared
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- Flushed to underlying stream
- SQLite reference
- No committed reference
- fsync completion
os.fsync has completed and the selected file readback matches c38761790a. This ordinary readback is not a power-loss-recovery or directory-metadata-durability guarantee.
- Application
- Public note bytes prepared
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- fsync completed; bytes readable
- SQLite reference
- No committed reference
- Reference write
The reference candidate fails a NOT NULL constraint; metadataCommitted=false and the transaction remains open. The five previously written file bytes remain; explicit rollback is the next local step.
- Application
- Public note bytes prepared
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- fsync completed; bytes readable
- SQLite reference
- NOT NULL failure; transaction active
- Rollback reference
Database rollback removes the reference candidate without deleting previously written owned file bytes.
- Application
- Public note bytes prepared
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- fsync completed; bytes readable
- SQLite reference
- Explicit rollback; referenceRows=0
- Application result
The application uses both selected owner outcomes; HTTP arrival and power-loss durability are not inferred.
- Application
- Unavailable; orphan bytes retained
- Local storage adapter
- Fixed key → tea.txt; UTF-8: 5 octets
- Owned file bytes
- fsync completed; bytes readable
- SQLite reference
- Explicit rollback; referenceRows=0
Missing backing
- Note read ready
The application requests the existing reference and backing content for noteId=tea. This branch writes no new Çay bytes; neither reference nor file presence is known before lookup.
- Application
- tea read ready; no content yet
- Local storage adapter
- Read mapping not selected
- Owned file bytes
- Backing file not yet read
- SQLite reference
- Reference not yet read
- Mapping/encode
The read adapter maps noteId=tea through key notes/tea.txt to fixed backing file tea.txt. This is read mapping, with no UTF-8 encoding or file write and no assumption that bytes are present.
- Application
- tea read ready; no content yet
- Local storage adapter
- notes/tea.txt → tea.txt; read mapping
- Owned file bytes
- Backing file not yet read
- SQLite reference
- Reference not yet read
- Reference read
Independent metadata lookup finds a reference row; it does not yet prove that file bytes exist.
- Application
- tea read ready; no content yet
- Local storage adapter
- notes/tea.txt → tea.txt; read mapping
- Owned file bytes
- Backing file not yet read
- SQLite reference
- Committed tea reference exists
- Backing read
The fixed owned file is absent, producing FileNotFoundError; metadata success does not become content success.
- Application
- tea read ready; no content yet
- Local storage adapter
- notes/tea.txt → tea.txt; read mapping
- Owned file bytes
- Fixed file absent; read error
- SQLite reference
- Committed tea reference exists
- Explicit failure
The application exposes an inconsistent-reference outcome without claiming available public content.
- Application
- Unavailable; dangling reference
- Local storage adapter
- notes/tea.txt → tea.txt; read mapping
- Owned file bytes
- Fixed file absent; read error
- SQLite reference
- Committed tea reference exists
ACTORS · STATE · DATA FLOW
Where are a note bytes and identity?
A public note has content bytes and metadata such as title, media type, and a storage reference. Object storage addresses an object by key in a selected namespace. In Amazon S3, bucket plus key identifies its name; with versioning, the selected version also matters. Slash prefixes need not be directories: S3 has a flat object model while its console can show logical folders. A filesystem path resolves in an operating-system directory/file namespace. Similar-looking strings do not imply the same mechanism.
Our authored identity is public-notes / notes/tea.txt; the own adapter maps it to a fixed owned tea.txt file. No S3 request or SDK runs. The UTF-8 bytes of Çay plus newline occupy five octets despite four characters. contentType=text/plain metadata neither transforms the bytes nor proves parsing. S3 user-defined metadata is assigned at creation and changing it requires a copy; this does not apply to every metadata category. Fixture object metadata uses a local dictionary, while its application reference is a separate SQLite row.
Application, bytes, and database finish separately
In the normal flow the application encodes trusted public data, writes a buffered binary file, flushes its language-level buffer into the underlying stream, then calls os.fsync on the descriptor. Python write reports an accepted byte count; flush and fsync are separate stages. A successful system call is not an actual power-loss recovery test here. Durability depends on the operating system, filesystem, device, and directory metadata boundaries; no crash injection or universal platform guarantee is made.
The application then uses a fixed statement and bound values to write note ID, selected key, and length into a SQLite metadata table. An independent connection reads the reference after explicit COMMIT. The file operation and SQLite transaction are not one atomic transaction. If a NOT NULL insert fails, explicit rollback removes the reference but leaves the already written bytes: orphaned bytes. A reference without its backing file is instead dangling. “Available” is reported only for the selected successful outcomes of both owners; compensation or reconciliation separately manages the gap.
2. Red · Trust & Impact
Read every scenario without motion
Orphan bytes
- Two storage owners were separated
The orphan record has filePresent=true and metadataCommitted=false. File bytes and application references are state of different owners; neither completes the other’s commit outcome.
- Storage owner state
- File present=true
- Reference/content gate
- Metadata commit=false
- Application availability
- Availability pending
- The identity-mapping context was read
noteId=tea, object key=notes/tea.txt and fixedBackingFile=tea.txt are values in different namespaces. The fixed mapping requires correct linkage between bytes and reference.
- Storage owner state
- Object key: notes/tea.txt
- Reference/content gate
- Backing: tea.txt
- Application availability
- Mapping distinct from availability
- The partial-failure outcome was established
The reference candidate failed a NOT NULL constraint and underwent explicit rollback. referenceRows=0 remains; database rollback did not undo the earlier file write.
- Storage owner state
- Reference rows=0
- Reference/content gate
- File write not rolled back
- Application availability
- Partial state known
- The availability gate remained closed
available=false. Readable bytes cannot produce public-resource success without a committed application reference.
- Storage owner state
- Owner states inconsistent
- Reference/content gate
- Available=false
- Application availability
- No false success
- Recovery was not counted as atomic commit
Later orphan cleanup may be possible, but it cannot make two earlier writes one transaction. crossStoreAtomic=false remains to explain this partial completion.
- Storage owner state
- Cross-store atomic=false
- Reference/content gate
- Recovery separate
- Application availability
- Availability withheld
- No public-delivery outcome was added
This persistence record shows an application-availability decision. Without HTTP-response or browser-receipt observations, actual consumer delivery remains a separate unknown.
- Storage owner state
- Availability=false known
- Reference/content gate
- HTTP receipt unobserved
- Application availability
- No delivery guarantee
Dangling reference
- Two storage owners were separated
The dangling record has referenceRows=1 but filePresent=false. A metadata row cannot guarantee present backing bytes.
- Storage owner state
- Reference rows=1
- Reference/content gate
- File present=false
- Application availability
- Availability pending
- The identity-mapping context was read
noteId=tea, object key=notes/tea.txt and fixedBackingFile=tea.txt are values in different namespaces. The fixed mapping requires correct linkage between bytes and reference.
- Storage owner state
- Object key: notes/tea.txt
- Reference/content gate
- Backing: tea.txt
- Application availability
- Mapping distinct from availability
- The partial-failure outcome was established
The fixed file read gives FileNotFoundError. This is not an absent reference but inconsistency between the reference and bytes owner.
- Storage owner state
- Reference rows=1
- Reference/content gate
- Read: FileNotFoundError
- Application availability
- Partial state known
- The availability gate remained closed
available=false. A metadata-only lookup cannot promise content to the consumer while full-content reading fails.
- Storage owner state
- Owner states inconsistent
- Reference/content gate
- Available=false
- Application availability
- No false success
- Recovery was not counted as atomic commit
Later orphan cleanup may be possible, but it cannot make two earlier writes one transaction. crossStoreAtomic=false remains to explain this partial completion.
- Storage owner state
- Cross-store atomic=false
- Reference/content gate
- Recovery separate
- Application availability
- Availability withheld
- No public-delivery outcome was added
This persistence record shows an application-availability decision. Without HTTP-response or browser-receipt observations, actual consumer delivery remains a separate unknown.
- Storage owner state
- Availability=false known
- Reference/content gate
- HTTP receipt unobserved
- Application availability
- No delivery guarantee
ASSUMPTION · BOUNDARY · CONTROL
One success field cannot describe every state
The controlled ledger records write success, fsync completion, and metadata commit separately. File bytes can exist while the reference transaction rolled back, leaving an orphan and an unavailable application result. Reading the file does not establish a committed reference; finding a row does not establish available bytes or the expected representation. Review checks both owners independently.
Object keys, file paths, and note IDs belong to different namespaces. An incorrect mapping could connect a public resource to the wrong backing record; slashes do not turn object keys into correct directories. This fixture uses one fixed mapping and only its own temporary files. It has no real upload, arbitrary client pathname, or user filesystem access. Named metadata must not substitute for data validity or application permissions.
Keep recovery boundaries visible
Reading the same bytes after an orderly reopen proves a normal lifecycle outcome, not power-loss, hardware-cache, or filesystem recovery. Labeling fsync completion as durability across every deployment teaches the wrong boundary. S3 documentation likewise cannot turn a local file read into measured S3 durability.
The failure branch supplies a harmless NULL reference field that violates a constraint; it executes no imported query or malformed input. The purpose is ownership: database rollback cannot undo a previous file write. Later cleanup can remove the orphan but is not an atomic cross-store commit. Preparing a public result does not prove client receipt either; no HTTP transfer or browser capture is shown.
3. Blue · Secure development & defense
Read every scenario without motion
Bytes / reference
- The representation-byte count was selected
Çay followed by a newline has four characters but five bytes in UTF-8 c38761790a. Reference octets=5 is calculated separately from character count.
- Persistence observation
- Characters=4
- Tuple/selector review
- Octets=5
- Evidence conclusion
- Reference review pending
- File-operation boundaries were read
The normal record has writtenOctets=5, flushCompleted=true and fsyncCompleted=true. Buffered writing, flushing and syscall completion are separate observations.
- Persistence observation
- Write=5 bytes
- Tuple/selector review
- Flush/fsync completed
- Evidence conclusion
- Metadata commit pending
- The metadata-reference tuple was matched
The reference with metadataCommitted=true carries noteId=tea, key=notes/tea.txt and octets=5. This tuple links file-byte identity with application identity.
- Persistence observation
- Metadata committed=true
- Tuple/selector review
- Reference octets=5
- Evidence conclusion
- Mapping matched
- Readback was checked separately
readbackHex=c38761790a matches the expected encoded bytes. Readback and reference together support available=true; a metadata label alone is insufficient.
- Persistence observation
- Readback bytes match
- Tuple/selector review
- Available=true
- Evidence conclusion
- Content/reference linked
- The durability claim was bounded
crashRecoveryTested=false. Fsync completion and orderly readback are not durability measurements for power loss, directory sync or every deployment topology.
- Persistence observation
- Syscall/readback known
- Tuple/selector review
- Crash recovery untested
- Evidence conclusion
- No universal durability claim
- Object-service scope was separated
actualS3Executed=false remains. Object metadata is explained using a local dictionary and file example without claiming S3 replication or service durability.
- Persistence observation
- Local persistence tuple known
- Tuple/selector review
- S3 not executed
- Evidence conclusion
- Service guarantees unobserved
Availability check
- The persistence-selector condition was opened
The selector counts observations with metadataCommitted=false and available=true. It reviews consistency between application availability and reference commit.
- Persistence observation
- No commit + available condition
- Tuple/selector review
- Selector review pending
- Evidence conclusion
- Publication review pending
- The normal negative tuple was read
The XML has metadataCommitted=false and available=false with expected=0. This no-match is bound to the safe unavailable decision in one observation.
- Persistence observation
- Metadata commit=false
- Tuple/selector review
- Available=false
- Evidence conclusion
- Expected=0
- The positive comparison remained separate
positiveFixtureXml has metadataCommitted=false and available=true with positiveExpected=1. This inconsistent tuple is not presented as an actual publication event.
- Persistence observation
- Comparison expected=1
- Tuple/selector review
- Inconsistent fixture
- Evidence conclusion
- No incident claim
- The orphan/dangling distinction was preserved
An orphan has bytes without a reference; a dangling reference has a reference without bytes. The same unavailable outcome can arise from different missing owners.
- Persistence observation
- Orphan: bytes only
- Tuple/selector review
- Dangling: reference only
- Evidence conclusion
- Unavailable causes differ
- A missing observation remained unknown
With a missing commit or available field, zero matches cannot prove correct publication control. File and reference state need a shared resource binding.
- Persistence observation
- Coverage may be missing
- Tuple/selector review
- Publication UNKNOWN
- Evidence conclusion
- Resource binding required
- Separate recovery observation was requested
Orphan reconciliation needs separate observation of who cleaned which key or completed its reference. A zero selector count proves neither cleanup nor cross-store atomicity.
- Persistence observation
- Recovery evidence separate
- Tuple/selector review
- Cross-store atomic=false
- Evidence conclusion
- No invented cleanup result
IMPLEMENTATION · SECURITY CONTROL · VERIFICATION
Record reference and data contracts together
Select a mapping from note ID to fixed store identity, then independently verify that the database reference has the same key and byte length. The adapter returns bytes for content and explicit fields for metadata. This fixture uses text/plain and public synthetic data; validation and authorization remain separate application decisions. Its bounded mapping makes the namespace difference visible without arbitrarily joining object keys into local paths.
Compare encoded bytes with raw file reads and calculate byte counts separately from character counts. Buffered write, flush, fsync, and orderly reopen after close are distinct observations. Successful os.fsync and matching readback do not establish crash durability, directory sync, or object-service replication. The artifact therefore keeps the meaning of each completion separate.
Design partial completion as recoverable state
After file-store success and database failure, the application reports no false success. Reference rollback and retained bytes are distinct outcomes; the orphaned bytes can still be read. Cleanup or reconciliation needs clear key ownership. Removing the local example’s temporary directory does not establish production orphan scanning or an appropriate cleanup policy for user files.
In the backing-missing case the database reference exists, but reading the fixed file raises FileNotFoundError. The application returns an explicit inconsistent/unavailable result. Metadata-only lookup and content read are different tasks. Application-to-database does not require storing all bytes in the database: it can retain relational references while the file/object owner holds bytes. Cross-owner atomicity, recovery, and public exposure are separate requirements.
NOW APPLY IT TO THE CASE
Why can a resource remain unavailable with present bytes or a reference?
The Çay newline representation belongs to the file owner while the note reference belongs to the database owner. Partial completion across both owners is assessed separately for availability and recovery.
Compare the cached case representation with its authoritative data owner. Keep stored value, revision, transaction and cache-copy completion separate.
Open the related case file ↗READ THE EXAMPLE TOGETHER
Public note bytes/reference ledger
Select a field and examine what it supports and where the evidence ends.
Read the raw artifact and field explanations
{
"identity": {
"namespace": "public-notes",
"key": "notes/tea.txt",
"fixedBackingFile": "tea.txt",
"objectMetadata": {
"contentType": "text/plain"
},
"actualS3Executed": false
},
"bytes": {
"text": "Çay\n",
"utf8Hex": "c38761790a",
"octets": 5,
"characters": 4
},
"normal": {
"writtenOctets": 5,
"flushCompleted": true,
"fsyncCompleted": true,
"metadataCommitted": true,
"reference": {
"noteId": "tea",
"key": "notes/tea.txt",
"octets": 5
},
"readbackHex": "c38761790a",
"available": true,
"crashRecoveryTested": false
},
"orphan": {
"filePresent": true,
"metadataCommitted": false,
"referenceRows": 0,
"available": false,
"failure": "benign NOT NULL reference candidate; explicit rollback",
"fileWriteRolledBackByDatabase": false
},
"dangling": {
"referenceRows": 1,
"filePresent": false,
"readError": "FileNotFoundError",
"available": false
},
"atomicity": {
"crossStoreAtomic": false,
"actualStorage": "owned temporary fixed files + sqlite3 references; local metadata dictionary"
},
"selector": {
"language": "XPath",
"xml": "<audit><persistence metadataCommitted=\"false\" available=\"false\"/></audit>",
"xpath": "count(/audit/persistence[@metadataCommitted='false' and @available='true'])",
"expected": 0,
"positiveFixtureXml": "<audit><persistence metadataCommitted=\"false\" available=\"true\"/></audit>",
"positiveExpected": 1,
"scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
"missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
}
}- identity
- Object keys and fixed owned files are separate namespaces.
- bytes
- Independent UTF-8 byte/character counts.
- normal/orphan/dangling
- Separate store/reference completion outcomes.
- selector
- Synthetic false success across owners.
Fixed synthetic content and own temporary files/SQLite references only. No S3, upload, user files, or power-loss test.
Two reality checks
A slash in an object key creates a filesystem directory.
S3 flat object names can use logical prefixes; filesystem namespaces use a different mechanism.
File write and database COMMIT form one atomic persistence step.
Separate owners can leave partial completion; rollback does not undo file writes, and crash durability requires other evidence.
YOUR TURN
Work through this story.
Predict the outcome, find the evidence boundary, and explain it in your own words.
The file was written but the metadata transaction rolled back. Is the note considered available?
- No; an orphan file may remain but referenceRows is 0.
- Yes; filePresent satisfies every application-publication condition.
Read the explained answer
No; an orphan file may remain but referenceRows is 0. — The selected availability gate requires committed metadata; a database rollback does not undo the file write.
A reference exists but its backing file is absent. Does key notes/tea.txt select an arbitrary filesystem path in this example?
Selected lesson artifact fields; teaching example
- dangling
- {"referenceRows":1,"filePresent":false,"readError":"FileNotFoundError","available":false}
- identity.key
- notes/tea.txt
- identity.fixedBackingFile
- tea.txt
- A slash inside an object key provides every filesystem-path permission.
- No; the key is logical identity and backing tea.txt is fixed; read failure makes available=false.
Read the explained answer
No; the key is logical identity and backing tea.txt is fixed; read failure makes available=false. — Namespace/key form a metadata identity; the selected mapping neither executes S3 nor uses arbitrary physical paths.
Flush/fsync and metadata commit completed. Why is that not a cross-store atomic crash-recovery guarantee?
Read the explained answer
Normal readback verifies selected bytes; crashRecoveryTested=false. A database-reference transaction does not automatically form one atomic unit with file/object writes. Orphan and dangling branches show different partial outcomes; recovery/compensation policy must be separately designed and verified.
□ I did not count successful readback as a crash test.
□ I required cross-store atomicity separately.
Open the application console · request / response / browser
Also open request, URL, cookie and DOM examples
Sources and scope
- Amazon S3 — Working with object metadataWorking with object metadata · User-defined metadata
- Amazon S3 — Naming objectsNaming Amazon S3 objects · Choosing object key names
- Python 3.14 — ioI/O Base Classes: flush() · BufferedWriter: flush() · BufferedWriter: write(b)
- Python 3.14 — osos.fsync(fd)
- SQLite — Transaction2. Transactions · 2.1. Read transactions versus write transactions · 2.2. DEFERRED, IMMEDIATE, and EXCLUSIVE transactions · 2.3. Implicit versus explicit transactions
- Python 3.14 — sqlite3Tutorial · sqlite3.connect · Cursor.execute · How to use placeholders to bind values in SQL queries · Transaction control via the isolation_level attribute · How to use the connection context manager