A method comprising: executing, by data processing hardware of a client device, an instruction to execute a query (q) for a data block; during a download phase, determining, by the data processing hardware, whether the data block is stored in a block stash on memory hardware residing at the client device; when the data block is stored in the block stash: removing, by the data processing hardware, the data block from the block stash; sending, by the data processing hardware, a fake query to a distributed system in communication with the data processing hardware, the fake query retrieving a random data block stored in memory of the distributed system; and discarding, by the data processing hardware, the random data block retrieved from the distributed system; during an overwrite phase, executing, by the data processing hardware, a read or write operation on the data block removed from the block stash; determining, by the data processing hardware, whether to store a current version of the data block in the block stash on the memory hardware residing at the client device or on the memory of the distributed system based on a probability; and when the current version of the data block is stored in the block stash: sending, by the data processing hardware, a fake query to the distributed system to retrieve another random data block stored in the memory of the distributed system; decrypting, by the data processing hardware, the retrieved random data block; re-encrypting, by the data processing hardware, the random data block with fresh randomness; and re-uploading, by the data processing hardware, the re-encrypted random data block onto the memory of the distributed system. executing, by data processing hardware of a client device, an instruction to execute a query (q) for a data block; during a download phase, determining, by the data processing hardware, whether the data block is stored in a block stash on memory hardware residing at the client device; when the data block is stored in the block stash: removing, by the data processing hardware, the data block from the block stash; sending, by the data processing hardware, a fake query to a distributed system in communication with the data processing hardware, the fake query retrieving a random data block stored in memory of the distributed system; and discarding, by the data processing hardware, the random data block retrieved from the distributed system; removing, by the data processing hardware, the data block from the block stash; sending, by the data processing hardware, a fake query to a distributed system in communication with the data processing hardware, the fake query retrieving a random data block stored in memory of the distributed system; and discarding, by the data processing hardware, the random data block retrieved from the distributed system; during an overwrite phase, executing, by the data processing hardware, a read or write operation on the data block removed from the block stash; determining, by the data processing hardware, whether to store a current version of the data block in the block stash on the memory hardware residing at the client device or on the memory of the distributed system based on a probability; and when the current version of the data block is stored in the block stash: sending, by the data processing hardware, a fake query to the distributed system to retrieve another random data block stored in the memory of the distributed system; decrypting, by the data processing hardware, the retrieved random data block; re-encrypting, by the data processing hardware, the random data block with fresh randomness; and re-uploading, by the data processing hardware, the re-encrypted random data block onto the memory of the distributed system. sending, by the data processing hardware, a fake query to the distributed system to retrieve another random data block stored in the memory of the distributed system; decrypting, by the data processing hardware, the retrieved random data block; re-encrypting, by the data processing hardware, the random data block with fresh randomness; and re-uploading, by the data processing hardware, the re-encrypted random data block onto the memory of the distributed system.