diff --git a/Architecture.md b/Architecture.md index 72d2f12..e9993b4 100644 --- a/Architecture.md +++ b/Architecture.md @@ -8,5 +8,43 @@ **Worker's** main role is securely _compile_, _run_ and _evaluate_ given submit against model solutions provided by author of each task. It is logicaly divided into three objects: - **Message Frontend** communicates with **WebApp** using messaging queue [ZeroMQ](http://zeromq.org/). It receives new submits, operates the evaluation through **Work API** and reports progress back. -- **Worker Core** can do all evaluating steps and is responsible for security of them. Great sandbox [Isolate](https://github.com/ioi/isolate) is used. -- **File Server Frontend** ensures via **File API** access to files on **File Server**, where are stored testing inputs and corresponding outputs for each task and other required files. It's possible to upload files, too. \ No newline at end of file +- **Worker Core** can do all evaluating steps and is responsible for security of them. Sandbox [Isolate](https://github.com/ioi/isolate) is used. +- **File Server Frontend** ensures via **File API** access to files on **File Server**, where are stored testing inputs and corresponding outputs for each task and other required files. It's possible to upload files, too. + +## File Server +![File Server Infrastructure](https://github.com/ReCodEx/GlobalWiki/blob/master/images/File_Server.png) + +**File Server** stores data, which is better keep out of **WebApp's** database. It should meet following requirements: +- store files without duplicates +- keep consistent state with main database +- serve files to workers on demand + +To meet these requirements, **Storage** and **Database** must be set as bellow. + +### Storage +**Storage** is meant as disc space with some commonly used filesystem. We'll use `ext4`, but the other ones should work too. **Storage** file structure is: +``` +. +├── submits +│   └── user_id +│   └── advanced_dot_net_1 +│   ├── bf216fa9274261628f4d952a103c6cfd1cbbc587 +│   └── e6ae49bbfda4a8bb57aceeb64fb117990b226ca5 +├── tasks +│   ├── a +│   │   ├── a014ed2abb56371bfaf2b4298a85d5dfb56509ed +│   │   └── a5edbd8b12e670ed1e3110d6c0524000cd4c3c7a +│   └── b +│   └── b1696358b8540923eb79b68f95c0f94c13a83fa7 +└── temp + └── 1795184136b8bdddabe50453cc2cc2d46f0f7c5e +``` +- **submits** keep information about all files submited by users to ReCodEx. There are subdirectoris _user_id_ and _advanced_dot_net_1_ which divides submits by users and class they took part of. This structure is easy to maintain for new and deleted users. +- **tasks** contains all files for all existing task in ReCodEx. To avoid too much files in one directory, files are separated to subfolders by first character of their name. +- **temp** directory is dedicated to temporary storing outputs of programs on teachers' demand. This directory will be erased by cron job on daily basis. + +### Database +For user friendly access and modifying tasks following information should be stored in database: +- list of tasks with their newest version number +- for every task and version list of used files (their hashed names) +- for every hash name one human readable filename \ No newline at end of file