From ee48a7cdcc13c6f6e791517feb32c95a1b1338e6 Mon Sep 17 00:00:00 2001 From: Tom Hunger Date: Tue, 7 Feb 2017 11:42:30 +0000 Subject: [PATCH 1/3] Replace a few references to platform to the now more specific projects. --- _includes/footer.html | 6 ++--- documentation.md | 23 ++++++++++--------- index.md | 7 ++---- team.md | 4 ++-- tutorials/1ch.md | 14 ++++++------ tutorials/3ch.md | 52 +++++++++++++++++++++---------------------- tutorials/4ch.md | 24 ++++++++++---------- tutorials/5ch.md | 7 +++--- tutorials/6ch.md | 23 +++++++++---------- 9 files changed, 78 insertions(+), 82 deletions(-) diff --git a/_includes/footer.html b/_includes/footer.html index 386f51d..f35f969 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -5,18 +5,18 @@ - CloudHaskell - Tim Watson

-

+

Code licensed under BSD-3,

- Website design shamelessly derived from Edward Kmett's' + Website design shamelessly derived from Edward Kmett's' lens library github pages under CC BY 3.0.

Glyphicons and Vectorportal images reproduced with permission.

-

- - diff --git a/team.md b/team.md index c16b71d..3532de2 100644 --- a/team.md +++ b/team.md @@ -27,7 +27,7 @@ of Cloud Haskell as a whole. [Edsko De Vries][13], a member of Well-Typed and th author of much of the new implementation we have today, is still closely involved as well. -[Tim][6] is the primary author and maintainer of [disributed-process-platform][8]; +[Tim][6] is the primary author and maintainer of [disributed-process][8]; an effort to port many of the benefits of Erlang's [Open Telecom Platform][10] to the Cloud Haskell ecosystem. @@ -48,7 +48,7 @@ Duncan Coutts, Simon Marlow, Ryan Newton, Eric Kow, Adam Foltzer, Nicolas Wu [5]: http://www.haskell.org/haskellwiki/Parallel_GHC_Project [6]: https://github.com/hyperthunk [7]: https://github.com/jepst -[8]: https://github.com/haskell-distributed/disributed-process-platform +[8]: https://github.com/haskell-distributed/disributed-process [9]: http://hackage.haskell.org/trac/ghc/wiki/Contributors [10]: http://en.wikipedia.org/wiki/Open_Telecom_Platform [11]: https://github.com/jepst/distributed-process-global diff --git a/tutorials/1ch.md b/tutorials/1ch.md index 41f00e1..4eb07d2 100644 --- a/tutorials/1ch.md +++ b/tutorials/1ch.md @@ -138,7 +138,7 @@ main = do -- Die immediately - throws a ProcessExitException with the given reason. Nothing -> die "nothing came back!" Just s -> say $ "got " ++ s ++ " back!" - + -- Without the following delay, the process sometimes exits before the messages are exchanged. liftIO $ threadDelay 2000000 {% endhighlight %} @@ -289,9 +289,9 @@ different ways: ------ -[1]: /static/doc/distributed-process/Control-Distributed-Process.html#v:Message -[2]: http://hackage.haskell.org/package/distributed-process -[3]: /static/doc/distributed-process-platform/Control-Distributed-Process-Platform-Async.html -[4]: /static/doc/distributed-process-platform/Control-Distributed-Process-Platform-ManagedProcess.htmlv:callAsync -[5]: http://hackage.haskell.org/packages/archive/distributed-process/latest/doc/html/Control-Distributed-Process-Internal-Primitives.html#t:Match -[6]: http://hackage.haskell.org/packages/archive/distributed-process/latest/doc/html/Control-Distributed-Process-Closure.html +[1]: https://hackage.haskell.org/package/distributed-process-0.6.6/docs/Control-Distributed-Process.html#t:Message +[2]: https://hackage.haskell.org/package/distributed-process +[3]: https://hackage.haskell.org/package/distributed-process-async/docs/Control-Distributed-Process-Async.html +[4]: https://hackage.haskell.org/package/distributed-process-client-server-0.1.3.2/docs/Control-Distributed-Process-ManagedProcess-Client.html#v:callAsync +[5]: https://hackage.haskell.org/packages/archive/distributed-process/latest/doc/html/Control-Distributed-Process-Internal-Primitives.html#t:Match +[6]: https://hackage.haskell.org/packages/archive/distributed-process/latest/doc/html/Control-Distributed-Process-Closure.html diff --git a/tutorials/3ch.md b/tutorials/3ch.md index 680421e..c5b9dc7 100644 --- a/tutorials/3ch.md +++ b/tutorials/3ch.md @@ -177,9 +177,9 @@ proxy :: Serializable a => ProcessId -> (a -> Process Bool) -> Process () {% endhighlight %} Since `matchAny` operates on `(Message -> Process b)` and `handleMessage` operates on -`a -> Process b` we can compose these to make our proxy server. We must not forward +`a -> Process b` we can compose these to make our proxy server. We must not forward messages for which the predicate function evaluates to `Just False`, nor can we sensibly -forward messages which the predicate function is unable to evaluate due to type +forward messages which the predicate function is unable to evaluate due to type incompatibility. This leaves us with the definition found in distributed-process: {% highlight haskell %} @@ -197,7 +197,7 @@ proxy pid proc = do Beyond simple relays and proxies, the raw message handling capabilities available in distributed-process can be utilised to develop highly generic message processing code. -All the richness of the distributed-process-platform APIs (such as `ManagedProcess`) which +All the richness of the distributed-process-client-server APIs (such as `ManagedProcess`) which will be discussed in later tutorials are, in fact, built upon these families of primitives. ### Typed Channels @@ -234,10 +234,10 @@ is terminated. The `ProcessExitException` signal is sent from one process to another, indicating that the receiver is being asked to terminate. A process can choose to tell itself to exit, and the -[`die`][7] primitive simplifies doing so without worrying about the expected type for the +[`die`][7] primitive simplifies doing so without worrying about the expected type for the action. In fact, [`die`][7] has slightly different semantics from [`exit`][5], since the latter involves sending an internal signal to the local node controller. A direct consequence -of this is that the _exit signal_ may not arrive immediately, since the _Node Controller_ could +of this is that the _exit signal_ may not arrive immediately, since the _Node Controller_ could be busy processing other events. On the other hand, the [`die`][7] primitive throws a `ProcessExitException` directly in the calling thread, thus terminating it without delay. In practise, this means the following two functions could behave quite differently at @@ -247,19 +247,19 @@ runtime: -- this will never print anything... demo1 = die "Boom" >> expect >>= say - + -- this /might/ print something before it exits demo2 = do self <- getSelfPid exit self "Boom" - expect >>= say + expect >>= say {% endhighlight %} The `ProcessExitException` type holds a _reason_ field, which is serialised as a raw `Message`. This exception type is exported, so it is possible to catch these _exit signals_ and decide how to respond to them. Catching _exit signals_ is done via a set of primitives in distributed-process, and the use of them forms a key component of the various fault tolerance -strategies provided by distributed-process-platform. +strategies provided by distributed-process-supervisor. A `ProcessKillException` is intended to be an _untrappable_ exit signal, so its type is not exported and therefore you can __only__ handle it by catching all exceptions, which @@ -296,7 +296,7 @@ special case. Since link exit signals cannot be caught directly, if you find you to _trap_ a link failure, you probably want to use a monitor instead. Whilst the built-in `link` primitive terminates the link-ee regardless of exit reason, -distributed-process-platform provides an alternate function `linkOnFailure`, which only +distributed-process-extras provides an alternate function `linkOnFailure`, which only dispatches the `ProcessLinkException` if the link-ed process dies abnormally (i.e., with some `DiedReason` other than `DiedNormal`). @@ -305,7 +305,7 @@ putting a `ProcessMonitorNotification` into the process' mailbox. This signal an constituent fields can be introspected in order to decide what action (if any) the receiver can/should take in response to the monitored process' death. Let's take a look at how monitors can be used to determine both when and _how_ a process has terminated. Tucked -away in distributed-process-platform, the `linkOnFailure` primitive works in exactly this +away in distributed-process-extras, the `linkOnFailure` primitive works in exactly this way, only terminating the caller if the subject terminates abnormally. Let's take a look... {% highlight haskell %} @@ -366,17 +366,17 @@ process. The `ProcessInfo` type it returns contains the local node id and a list registered names, monitors and links for the process. The call returns `Nothing` if the process in question is not alive. -### Monad Transformer Stacks +### Monad Transformer Stacks -It is not generally necessary, but it may be convenient in your application to use a -custom monad transformer stack with the Process monad at the bottom. For example, +It is not generally necessary, but it may be convenient in your application to use a +custom monad transformer stack with the Process monad at the bottom. For example, you may have decided that in various places in your application you will make calls to a network database. You may create a data access module, and it will need configuration information available to it in -order to connect to the database server. A ReaderT can be a nice way to make +order to connect to the database server. A ReaderT can be a nice way to make configuration data available throughout an application without -schlepping it around by hand. +schlepping it around by hand. -This example is a bit contrived and over-simplified but +This example is a bit contrived and over-simplified but illustrates the concept. Consider the `fetchUser` function below, it runs in the `AppProcess` monad which provides the configuration settings required to connect to the database: @@ -409,7 +409,7 @@ openDB = do closeDB :: DB.Connection -> AppProcess () closeDB db = liftIO (DB.close db) - + {% endhighlight %} So this would mostly work but it is not complete. What happens if an exception @@ -423,17 +423,17 @@ In the base library, [bracket][brkt] is defined in Control.Exception with this s bracket :: IO a --^ computation to run first ("acquire resource") -> (a -> IO b) --^ computation to run last ("release resource") -> (a -> IO c) --^ computation to run in-between - -> IO c + -> IO c {% endhighlight %} Great! We pass an IO action that acquires a resource; `bracket` passes that resource to a function which takes the resource and runs another action. -We also provide a release function which `bracket` is guaranteed to run -even if the primary action raises an exception. +We also provide a release function which `bracket` is guaranteed to run +even if the primary action raises an exception. -Unfortunately, we cannot directly use `bracket` in our +Unfortunately, we cannot directly use `bracket` in our `fetchUser` function: openDB (resource acquisition) runs in the `AppProcess` monad. If our functions ran in IO, we could lift the entire bracket computation into our monad transformer stack with liftIO; but we cannot do that for the computations @@ -473,7 +473,7 @@ onException p what = p `catch` \e -> do _ <- what `distributed-process` needs to do this sort of thing to keep its dependency list small, but do we really want to write this for every transformer stack -we use in our own applications? No! And we do not have to, thanks to +we use in our own applications? No! And we do not have to, thanks to the [monad-control][mctrl] and [lifted-base][lbase] libraries. [monad-control][mctrl] provides several typeclasses and helper functions @@ -489,17 +489,17 @@ bracket that looks like this: {% highlight haskell %} -bracket :: MonadBaseControl IO m +bracket :: MonadBaseControl IO m => m a --^ computation to run first ("acquire resource") -> (a -> m b) --^ computation to run last ("release resource") -> (a -> m c) --^ computation to run in-between - -> m c + -> m c {% endhighlight %} It is just the same as the version found in base, except it is generalized to work with actions in any monad that implements [MonadBaseControl IO][mbc]. [monad-control][mctrl] defines -instances for the standard transformers, but that instance requires the base monad +instances for the standard transformers, but that instance requires the base monad (in this case, `Process`) to also have an instance of these classes. To address this the [distributed-process-monad-control][dpmc] package @@ -520,7 +520,7 @@ fetchUser email = Lifted.bracket openDB closeDB $ \db -> liftIO $ DB.query db email - + {% endhighlight %} diff --git a/tutorials/4ch.md b/tutorials/4ch.md index 83dc0ef..26c92c0 100644 --- a/tutorials/4ch.md +++ b/tutorials/4ch.md @@ -8,9 +8,9 @@ title: 4. Managed Process Tutorial ### Introduction The source code for this tutorial is based on the `BlockingQueue` API -from distributed-process-platform and can be accessed [here][1]. +from distributed-process-task and can be accessed [here][1]. Please note that this tutorial is based on the stable (master) branch -of [distributed-process-platform][3]. +of [distributed-process-task][3]. ### Managed Processes @@ -40,8 +40,8 @@ code to be run on termination/shutdown. {% highlight haskell %} myServer :: ProcessDefinition MyStateType -myServer = - ProcessDefinition { +myServer = + ProcessDefinition { -- handle messages sent to us via the call/cast API functions apiHandlers = [ -- a list of Dispatchers, derived by calling on of the various @@ -113,7 +113,7 @@ that math server that does just that: ---- {% highlight haskell %} -module MathServer +module MathServer ( -- client facing API add -- starting/spawning the server process @@ -241,9 +241,9 @@ more interesting and useful. ### Building a Task Queue This section of the tutorial is based on a real module from the -distributed-process-platform library, called `BlockingQueue`. +distributed-process-task library, called `BlockingQueue`. -Let's imagine we want to execute tasks on an arbitrary node, but want +Let's imagine we want to execute tasks on an arbitrary node, but want the caller to block whilst the remote task is executing. We also want to put an upper bound on the number of concurrent tasks/callers that the server will accept. Let's use `ManagedProcess` to implement a generic @@ -275,7 +275,7 @@ typeclass to allow clients to specify the server's location in whatever manner suits them: The type of a task will be `Closure (Process a)` and the server will explicitly return an /either/ value with `Left String` for errors and `Right a` for successful results. - + {% highlight haskell %} -- enqueues the task in the pool and blocks -- the caller until the task is complete @@ -663,8 +663,8 @@ another to monitor the first and handle failures and/or cancellation. Spawning processes is cheap, but not free as each process is a haskell thread, plus some additional book keeping data. -[1]: https://github.com/haskell-distributed/distributed-process-platform/blob/master/src/Control/Distributed/Process/Platform/Task/Queue/BlockingQueue.hs -[2]: /static/doc/distributed-process-platform/Control-Distributed-Process-Platform-ManagedProcess.html#t:ProcessDefinition -[3]: https://github.com/haskell-distributed/distributed-process-platform/tree/master/ -[4]: https://github.com/haskell-distributed/distributed-process-platform/tree/master/src/Control/Distributed/Process/Platform/UnsafePrimitives.hs +[1]: https://github.com/haskell-distributed/distributed-process-task/blob/master/src/Control/Distributed/Process/Task/Queue/BlockingQueue.hs +[2]: https://hackage.haskell.org/package/distributed-process-client-server-0.1.3.2/docs/Control-Distributed-Process-ManagedProcess.html#t:ProcessDefinition +[3]: https://github.com/haskell-distributed/distributed-process-task +[4]: https://github.com/haskell-distributed/distributed-process-extras/blob/master/src/Control/Distributed/Process/Extras/UnsafePrimitives.hs [5]: /documentation.html diff --git a/tutorials/5ch.md b/tutorials/5ch.md index 1a56c3f..1811c8f 100644 --- a/tutorials/5ch.md +++ b/tutorials/5ch.md @@ -56,7 +56,7 @@ triggered the shutdown/terminate sequence for the supervisor's process explicitl When a supervisor is told directly to terminate a child process, it uses the `ChildTerminationPolicy` to determine whether the child should be terminated _gracefully_ or _brutally killed_. This _shutdown protocol_ is used throughout -[distributed-process-platform][dpp] and in order for a child process to be managed +[distributed-process-supervisor][dpp] and in order for a child process to be managed effectively by its supervisor, it is imperative that it understands the protocol. When a _graceful_ shutdown is required, the supervisor will send an exit signal to the child process, with the `ExitReason` set to `ExitShutdown`, whence the child process is @@ -70,7 +70,7 @@ provide a timeout value. The supervisor attempts a _gracefull_ shutdown initiall however if the child does not exit within the given time window, the supervisor will automatically revert to a _brutal kill_ using `TerminateImmediately`. If the timeout value is set to `Infinity`, the supervisor will wait indefintiely for the -child to exit cleanly. +child to exit cleanly. When a supervisor detects a child exit, it will attempt a restart. Whilst explicitly terminating a child will **only** terminate the specified child process, unexpected @@ -142,11 +142,10 @@ order, otherwise the dependent children might crash whilst we're restarting othe rely on. It follows that, in this setup, we cannot subsequently (re)start the children in the same order we stopped them either. -[dpp]: https://github.com/haskell-distributed/distributed-process-platform +[dpp]: https://github.com/haskell-distributed/distributed-process-supervisor [sup1]: /img/one-for-one.png [sup2]: /img/one-for-all.png [sup3]: /img/one-for-all-left-to-right.png [alert]: /img/alert.png [info]: /img/info.png [erlsup]: http://www.erlang.org/doc/man/supervisor.html - diff --git a/tutorials/6ch.md b/tutorials/6ch.md index 1269745..29a32c6 100644 --- a/tutorials/6ch.md +++ b/tutorials/6ch.md @@ -56,7 +56,7 @@ look at this in action, revisiting the well-trodden _math server_ example from our previous tutorials: {% highlight haskell %} -module MathServer +module MathServer ( -- client facing API MathServer() , add @@ -561,20 +561,19 @@ the client using the send ports supplied in the request data. > passes data to them (via the `SendPort`) is bound to exactly the same type(s)! > Furthermore, adding reply channels (in the form of a `SendPort`) to the request > types ensures that the replies will be handled correctly as well! As a result, -> there can be no ambiguity about the types involved for _either_ side of the +> there can be no ambiguity about the types involved for _either_ side of the > client-server relationship and therefore no unhandled messages due to runtime > type mismatches - the compiler will catch that sort of thing for us! ------ -[1]: http://hackage.haskell.org/package/distributed-process-platform/Control-Distributed-Process-Platform-Service-Registry.html -[2]: http://hackage.haskell.org/package/distributed-process-platform/Control-Distributed-Process-Platform-Async.html -[3]: http://hackage.haskell.org/package/distributed-process-platform/Control-Distributed-Process-Platform-Service-SystemLog.html -[mgmt]: http://hackage.haskell.org/package/distributed-process/Control-Distributed-Process-Management.html -[dbg]: http://hackage.haskell.org/package/distributed-process/Control-Distributed-Process-Debug.html -[rtbl]: http://hackage.haskell.org/package/distributed-proces-platforms/Control-Distributed-Process-Platform.html#t:Routable -[rsbl]: http://hackage.haskell.org/package/distributed-process-platform/Control-Distributed-Process-Platform.html#t:Resolvable +[1]: https://hackage.haskell.org/package/distributed-process-registry/docs/Control-Distributed-Process-Registry.html +[2]: https://hackage.haskell.org/package/distributed-process-async/docs/Control-Distributed-Process-Async.html +[3]: https://hackage.haskell.org/package/distributed-process-extras/docs/Control-Distributed-Process-Extras-SystemLog.html +[mgmt]: https://hackage.haskell.org/package/distributed-process/Control-Distributed-Process-Management.html +[dbg]: https://hackage.haskell.org/package/distributed-process/Control-Distributed-Process-Debug.html +[rtbl]: https://hackage.haskell.org/package/distributed-process-extras/docs/Control-Distributed-Process-Extras.html#t:Routable +[rsbl]: https://hackage.haskell.org/package/distributed-process-extras/docs/Control-Distributed-Process-Extras.html#t:Resolvable [alert]: /img/alert.png [info]: /img/info.png -[policy]: http://hackage.haskell.org/package/distributed-process-platform/Control-Distributed-Process-Platform-ManagedProcess.html#t:UnhandledMessagePolicy -[mailbox]: http://hackage.haskell.org/package/distributed-process-platform/Control-Distributed-Process-Platform-Execution-Mailbox.html - +[policy]: https://hackage.haskell.org/package/distributed-process-client-server/docs/Control-Distributed-Process-ManagedProcess.html#v:unhandledMessagePolicy +[mailbox]: https://hackage.haskell.org/package/distributed-process-execution-0.1.2.2/docs/Control-Distributed-Process-Execution-Mailbox.html From a5312ac246af5b5ed23338a1fda143baf98496a3 Mon Sep 17 00:00:00 2001 From: Tom Hunger Date: Thu, 9 Feb 2017 11:03:34 +0000 Subject: [PATCH 2/3] Opinionated: Remove changelog completely. It's way out of date. --- _includes/nav.html | 1 - _layouts/changelog.html | 59 ----------------------------- _layouts/changes.html | 53 -------------------------- changelog/dp-0.4.1.md | 23 ------------ changelog/dp-0.4.2.md | 28 -------------- changelog/dp-0.5.0.md | 61 ------------------------------ changelog/dpp-0.1.0.md | 83 ----------------------------------------- changelog/ds-0.3.0.0.md | 17 --------- changelog/nt-0.4.0.0.md | 24 ------------ changelog/rd-0.2.0.0.md | 19 ---------- index.md | 2 - 11 files changed, 370 deletions(-) delete mode 100644 _layouts/changelog.html delete mode 100644 _layouts/changes.html delete mode 100644 changelog/dp-0.4.1.md delete mode 100644 changelog/dp-0.4.2.md delete mode 100644 changelog/dp-0.5.0.md delete mode 100644 changelog/dpp-0.1.0.md delete mode 100644 changelog/ds-0.3.0.0.md delete mode 100644 changelog/nt-0.4.0.0.md delete mode 100644 changelog/rd-0.2.0.0.md diff --git a/_includes/nav.html b/_includes/nav.html index 2fa93b1..4e45e25 100644 --- a/_includes/nav.html +++ b/_includes/nav.html @@ -32,7 +32,6 @@