src/backend/storage/smgr/README Storage Managers ================ In the original Berkeley Postgres system, there were several storage managers, of which only the "magnetic disk" manager remains. (At Berkeley there were also managers for the Sony WORM optical disk jukebox and persistent main memory, but these were never supported in any externally released Postgres, nor in any version of PostgreSQL.) The "magnetic disk" manager is itself seriously misnamed, because actually it supports any kind of device for which the operating system provides standard filesystem operations; which these days is pretty much everything of interest. However, we retain the notion of a storage manager switch in case anyone ever wants to reintroduce other kinds of storage managers. Removing the switch layer would save nothing noticeable anyway, since storage-access operations are surely far more expensive than one extra layer of C function calls. In Berkeley Postgres each relation was tagged with the ID of the storage manager to use for it. This is gone. It would be probably more reasonable to associate storage managers with tablespaces, should we ever re-introduce multiple storage managers into the system catalogs. The files in this directory, and their contents, are smgr.c The storage manager switch dispatch code. The routines in this file call the appropriate storage manager to do storage accesses requested by higher-level code. smgr.c also manages the file handle cache (SMgrRelation table). md.c The "magnetic disk" storage manager, which is really just an interface to the kernel's filesystem operations. Note that md.c in turn relies on src/backend/storage/file/fd.c. Relation Forks ============== Since 8.4, a single smgr relation can be comprised of multiple physical files, called relation forks. This allows storing additional metadata like Free Space information in additional forks, which can be grown and truncated independently of the main data file, while still treating it all as a single physical relation in system catalogs. It is assumed that the main fork, fork number 0 or MAIN_FORKNUM, always exists. Fork numbers are assigned in src/include/common/relpath.h. Functions in smgr.c and md.c take an extra fork number argument, in addition to relfilelocator and block number, to identify which relation fork you want to access. Since most code wants to access the main fork, a shortcut version of ReadBuffer that accesses MAIN_FORKNUM is provided in the buffer manager for convenience.