mirror of
https://we.phorge.it/source/phorge.git
synced 2025-02-09 05:18:29 +01:00
Summary: See T344. Currently, there's a hard-coded 12MB filesize limit and some awkward interactions with MySQL's max_allowed_packet. Make this system generally more robust: - Move the upload limit to configuration. - Add setup steps which reconcile max_allowed_packet vs MySQL file storage limits. - Add a layer of indirection between uploading files and storage engines. - Allow the definition of new storage engines. - Define a local disk storage engine. - Add a "storage engine selector" class which manages choosing which storage engines to put files in. - Document storage engines. - Document file storage classes. Test Plan: Setup mode: - Disabled MySQL storage engine, misconfigured it, configured it correctly. - Disabled file storage engine, set it to something invalid, set it to something valid. - Verified max_allowed_packet is read correctly. Application mode: - Configured local file storage. - Uploaded large and small files. - Verified larger files were written to local storage. - Verified smaller files were written to MySQL blob storage. Documentation: - Read documentation. Reviewed By: jungejason Reviewers: jungejason, tuomaspelkonen, aran CC: aran, epriestley, jungejason Differential Revision: 695
39 lines
No EOL
1.7 KiB
Text
39 lines
No EOL
1.7 KiB
Text
@title File Storage Technical Documentation
|
|
@group filestorage
|
|
|
|
Phabricator file storage details.
|
|
|
|
= Overview =
|
|
|
|
Phabricator has a simple, general-purpose file storage system with configurable
|
|
storage backends that allows you to choose where files are stored. For a user
|
|
guide, see @{article:Configuring File Storage}.
|
|
|
|
= Class Relationships =
|
|
|
|
@{class:PhabricatorFile} holds file metadata (name, author, phid), including an
|
|
identifier for a @{class:PhabricatorFileStorageEngine} where the actual file
|
|
data is stored, and a data handle which identifies the data within that storage
|
|
engine.
|
|
|
|
When writing data, a @{class:PhabricatorFileStorageEngineSelector} is
|
|
instantiated (by default, @{class:PhabricatorDefaultFileStorageEngineSelector},
|
|
but you can change this by setting the ##storage.engine-selector## key in your
|
|
configuration). The selector returns a list of satisfactory
|
|
@{class:PhabricatorFileStorageEngine}s, in order of preference.
|
|
|
|
For instance, suppose the user is uploading a picture. The upload pipeline would
|
|
instantiate the configured selector, which might return a
|
|
@{class:PhabricatorMySQLFileStorageEngine} and a
|
|
@{class:PhabricatorLocalDiskFileStorageEngine}, indicating that the picture may
|
|
be stored in either storage engine but MySQL is preferred. If a given storage
|
|
engine fails to perform the write, it will fall back to the next engine.
|
|
|
|
= Adding New Storage Engines =
|
|
|
|
To add a new storage engine, extend @{class:PhabricatorFileStorageEngine}. In
|
|
order to make files actually get written to it, you also need to extend
|
|
@{class:PhabricatorFileStorageEngineSelector}, provide an implementation which
|
|
selects your storage engine for whatever files you want to store there, and then
|
|
configure Phabricator to use your selector by setting
|
|
##storage.engine-selector##. |