| 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. |