From 6c3341b4fe5739d3a53a0a8ac3f6cb028548ca8d Mon Sep 17 00:00:00 2001 From: Matt Bovel <matthieu@bovel.net> Date: Wed, 25 May 2022 13:43:20 +0200 Subject: [PATCH] Add instructions for dry-run --- .../concpar21final01/concpar21final01.md | 55 ++++++ .../dry-run/concpar21final01/leaderboard.png | Bin 0 -> 54814 bytes .../concpar21final02/concpar21final02.md | 85 +++++++++ .../concpar21final03/concpar21final03.md | 161 ++++++++++++++++++ 4 files changed, 301 insertions(+) create mode 100644 final/dry-run/concpar21final01/concpar21final01.md create mode 100644 final/dry-run/concpar21final01/leaderboard.png create mode 100644 final/dry-run/concpar21final02/concpar21final02.md create mode 100644 final/dry-run/concpar21final03/concpar21final03.md diff --git a/final/dry-run/concpar21final01/concpar21final01.md b/final/dry-run/concpar21final01/concpar21final01.md new file mode 100644 index 0000000..74b069a --- /dev/null +++ b/final/dry-run/concpar21final01/concpar21final01.md @@ -0,0 +1,55 @@ +# Problem 1: Futures + +## Setup + +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b concpar21final01 git@gitlab.epfl.ch:lamp/student-repositories-s22/cs206-GASPAR.git concpar21final01 +``` + +If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#troubleshooting), +if you still have problems, use `compile` in sbt instead. + +## Useful links + + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + * [The API documentation of the Play framework](https://www.playframework.com/documentation/2.8.x/api/scala/index.html) + +## Exercise + +In this exercise, your task is to implement a leaderboard webpage for a GitLab-based exam. This leaderboard is live in the sense that it is constructed on the fly by extracting grades directly from GitLab pipelines: it is always up to date. + +This exercise uses the Play framework, a popular web application framework. +Play is entirely asynchronous and uses futures for concurrency. + +In `src/main/scala/f1/MyComponents.scala`, we define a minimal Play application to display the leaderboard (you do not need to modify this file). + +You can start this application using `sbt run` and open the leaderboard in a web browser at [http://localhost:9000/](http://localhost:9000/). After having completed this exercise, you should see a populated leaderboard as shown in this screenshot: + + + +In this exercise, your task is to implement the `leaderboard()` method in `src/main/scala/f1/F1.scala` which asynchronously retrieves and sorts student grades. +Grades should be sorted such that maximum grades appear at the head of the list, like in the screenshot above. +Your implementation should use the following two methods to get the list of students and the grade of a particular student: + +```scala +/** Retrieve a student's grade using GitLab's API */ +def getGrade(sciper: Int): Future[Option[Grade]] + +/** Retrieve the list of enrolled students from IS-academia */ +def getScipers(): Future[List[Int]] +``` + +These methods have mock implementations that return made-up values after a short delay (simulating a network call). +Your implementation should be asynchronous (it is forbidden to use the `Await.result` method). +Furthermore, given the large number of students, calls to the GitLab API should be made in parallel such that the overall request is completed in about 1 second. + +*Hint:* this exercise can be solved without writing any recursive functions! You are allowed to use every function defined on [Future][1] and [List][2], as well as functions defined on their companion objects ([Future][3], [List][4]). + +[1]: https://www.scala-lang.org/api/2.13.4/scala/concurrent/Future.html +[2]: https://www.scala-lang.org/api/2.13.4/scala/collection/immutable/List.html +[3]: https://www.scala-lang.org/api/2.13.4/scala/concurrent/Future$.html +[4]: https://www.scala-lang.org/api/2.13.4/scala/collection/immutable/List$.html diff --git a/final/dry-run/concpar21final01/leaderboard.png b/final/dry-run/concpar21final01/leaderboard.png new file mode 100644 index 0000000000000000000000000000000000000000..345da3a6dfb917967344ef7546d41755623336e3 GIT binary patch literal 54814 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 Z@N(J{mPyQ{aBqM=F(GNeGXC$r{|jOs+LQnQ literal 0 HcmV?d00001 diff --git a/final/dry-run/concpar21final02/concpar21final02.md b/final/dry-run/concpar21final02/concpar21final02.md new file mode 100644 index 0000000..f5498d5 --- /dev/null +++ b/final/dry-run/concpar21final02/concpar21final02.md @@ -0,0 +1,85 @@ +# Problem 2: Actors + +## Setup + +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b concpar21final02 git@gitlab.epfl.ch:lamp/student-repositories-s22/cs206-GASPAR.git concpar21final02 +``` + +If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#troubleshooting), +if you still have problems, use `compile` in sbt instead. + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +## Exercise + +Your task is to implement a couple of actors in Discord like service. You will only focus on two actors in the system: (1) the `NotificationService` and (2) and a `DiscordChannel`. + +A user will be able to post messages on the channel and retrieve the messages from the channel. +A user also has the ability to (un)register from the notifications. +Before it can receive requests, each channel is initialized with a notification service. +When a message is posted to the channel, it tells its notification service to notify the users. + +The following diagram shows how the communication between actors works. Requests are within `()` and responses are within `[]`. + +```none + (Post) [Active] + (GetLastPosts) â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”┓ [AlreadyActive] â”â”â”â”â”â”â”â”â”â”┓ + ┌──────────────────────>┃ ┃──────────────────►┃ ┃ + │ ┃ DiscordChannel ┃ ┃ System ┃ + │ ┃ ┃◄──────────────────┨ ┃ + │ [Posts] â”—â”┯â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”┯┛ (Init) â”—â”â”â”â”â”â”â”â”â”â”› + â”â”â”â”·â”â”â”┓ [NotActive] │ │ + ┃ ┃◄────────────────────┘ │ + ┃ User ┃ │ + ┃ ┃◄────────────────┠│ + â”—â”â”┯â”â”â”â”› [Registered] │ │ (NotifyAll) + │ [Notification] │ │ + │ │ │ + │ â”â”â”â”â”â”·â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”┓ │ + └───────────────►┃ ┃ │ + (Register) ┃ NotificationService ┃◄─┘ + (UnRegister) ┃ ┃ + â”—â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”› +``` + +Your tasks in the exercise will be to: + +TASK 1: Complete the implementation of the `NotificationService` by implementing method `receive` to handle messages from `NotificationService.Protocol`: + +```scala +def receive: Receive = ??? +``` +TASK 2: Complete the implementation of the `DiscordChannel` by implementing methods `nonActive` and `active` to handle messages from `DiscordChannel.Protocol`: + +```scala +def nonActive: Receive = ??? +def active(notificationService: ActorRef): Receive = ??? +``` + +### NotificationService protocol + +* __Register__: Registers the user for notifications and responds with a `Registered(true)`. +* __UnRegister__: Un-registers the user for notifications and responds with a `Registered(false)`. +* __NotifyAll__: Sends a `Notification` to all registered users. + + +### DiscordService protocol + +The channel can be in one of two states: _non-active_ or _active_. + +* __Init__: When _non-active_, responds with `Active` and the state becomes _active_. Otherwise responds `AlreadyActive`. +* __Post__: When _active_, stores the message and sends `NotifyAll` to its `NotificationService`. Otherwise responds `NotActive`. +* __GetLastPosts__: When _active_, responds with `Posts` containing the latest messages (ordered from most to least recent). Otherwise responds `NotActive`. + +### Running the code + +Apart from the grading tests, we include a `@main def debug` method, where you can write your own tests to help you debug your implementation. This method is __not__ graded. It can be executed using `run` within SBT. diff --git a/final/dry-run/concpar21final03/concpar21final03.md b/final/dry-run/concpar21final03/concpar21final03.md new file mode 100644 index 0000000..0954e94 --- /dev/null +++ b/final/dry-run/concpar21final03/concpar21final03.md @@ -0,0 +1,161 @@ +# Problem 3: Concurrency + +## Setup + +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b concpar21final03 git@gitlab.epfl.ch:lamp/student-repositories-s22/cs206-GASPAR.git concpar21final03 +``` + +If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#troubleshooting), +if you still have problems, use `compile` in sbt instead. + +## Useful links + + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +## Problem description +### Preliminary: File handling + +In this exercise, we will work with files using the following trait to handle +all file operations: +```scala +type FileName = String +trait FileSystem: + /** Create a new file named `file` with the passed `content`. */ + def createFile(file: File, content: String): Unit + /** If `file` exists, return its content, otherwise crash. */ + def readFile(file: File): String + /** If `file` exists, delete it, otherwise crash. */ + def deleteFile(file: File): Unit +``` +Note that to make testing easier, the actual implementation of `FileSystem` we will use +won't actually create files on disks, instead it will simply use a `Map` to +represent files and their content in memory, but that's an implementation detail +that won't affect how this exercise should be solved. + +### The update distribution problem + +You work at a game company on the popular online game EPFNiteâ„¢. Your job is +to distribute game updates to the players from the update server represented by +the following class: +```scala +class UpdateServer: + def fetchUpdate(): Option[String] + def newUpdate(newName: FileName, newContent: String): Unit +``` +The requirements of the update server are as follows: +- When a player starts his game, it connects to the update server which starts a + new thread and run `fetchUpdate()` which should return the content of the latest game update + if one is available. +- When a new version of the game is available, the developers call + `newUpdate` with the name of the update file and its content. +- Storage space is limited on the server, so when a new update is stored on the + server, old ones must be deleted. + +Based on these requirements, you come up with the following implementation: + +```scala +class UpdateServer(fs: FileSystem): + @volatile private var updateFile: Option[FileName] = None + + def fetchUpdate(): Option[String] = + updateFile.map(fs.readFile) + + def newUpdate(newName: FileName, newContent: String): Unit = + val oldFile = updateFile + fs.createFile(newName, newContent) + updateFile = Some(newName) + oldFile.foreach(fs.deleteFile) +``` +Unfortunately, it turns out that reading a file is not an atomic operation: if +you delete a file while another thread is reading it, your program crashes. +Theoretically, you could solve this using locks to make sure `deleteFile` +is never called at the same time as `readFile`, but this solution isn't good +enough for EPFNite: it's important that a player is never blocked from playing +the game because `fetchUpdate` is waiting for a lock to become available. + +Thankfully, there is one property of the problem which we can take advantage of: +a call to `fetchUpdate` which happens *after* `updateFile = Some(newName)` will +read the new file and not the old one, so all we need to do is to wait until all +calls to `fetchUpdate` which were started *before* we mutated `updateFile` have +finished before calling `deleteFile`. It turns out that there exists one +mechanism to do this efficiently: **RCU** (Read-copy-update) which you will implement in the next +section. + +## Implementation +### Part 1: Complete the `ThreadMap` implementation + +To implement RCU we will need a thread-safe way to associate a value to a +thread: this is the job of `ThreadMap` (defined in `ThreadMap.scala`) which we +implement with a `Map` whose keys are instances of `Thread` +(`Thread.currentThread` can be used to retrieve the instance for the current +thread). + +Instead of the usual `forall` method on collections, `ThreadMap` has a +`waitForall` method which will **block** until all entries of the map return +true for the predicate. For example given `val m: ThreadMap[Int]`, if one thread +runs: +```scala +m.setCurrentThread(1) +``` +and another thread runs: +```scala +m.waitForall(_ < 0) +``` +Then the second thread will be blocked, but if the first thread then runs: +```scala +m.setCurrentThread(-1) +``` +The second thread will be immediately unblocked. + +Your first task is to **implement all methods in `ThreadMap.scala` whose body is +currently `???`.** Once you're done, the "Part 1" test will pass. + +### Part 2: Complete the `RCU` implementation + +#### What is RCU ? + +The RCU API defines three methods: + +```scala +class RCU: + def startRead(): Unit + def stopRead(): Unit + def waitForOldReads(): Unit +``` + +It has the following contract: +- The first two methods are meant to be used by threads that read shared data: + they must must call `startRead` *before* reading shared data, then call + `stopRead` once they're done reading. +- `waitForOldReaders()` can be called from any thread: this is a blocking method + that only returns when all reads started *before* the call to + `waitForOldReaders()` are stopped (new reads may have started since then). + +#### Implementing RCU + +To implement RCU we need a way to differentiate reads started before a call to +`waitForOldReaders()` from those started after. To do so we will use *version +numbers*: the RCU version (starting at 0) is stored in `latestVersion`, and for +each *active* reader thread, we remember the value of `latestVersion` *at the time +startRead() was called* in `readersVersion`. Implementing `waitForOldReaders` is +then easy: +1. Increment the RCU version. +2. Wait until there's no active reader associated with a previous version. + +**Implement `waitForOldReaders` in `RCU.scala`**, for simplicity you can assume +that `waitForOldReaders` will never be called from multiple threads at once. +Once you're done, the "Part 2" test will pass. + +### Part 3: Using RCU in `UpdateServer` + +Finally, its time to put our RCU implementation to good use: **complete the +implementation of `fetchUpdate` and `newUpdate`** (defined in `UpdateServer.scala`) by adding calls to +`rcu.startRead()`, `rcu.stopRead()` and `rcu.waitForOldReaders()` where they +need to be to allow multiple calls to `fetchUpdate` and at most one call to +`newUpdate` to be run concurrently. Once you're done, the "Part 3" test will +pass. -- GitLab