diff options
46 files changed, 2135 insertions, 1 deletions
diff --git a/doc/book/src/intro.md b/doc/book/src/intro.md index 3440aef3..352f1be1 100644 --- a/doc/book/src/intro.md +++ b/doc/book/src/intro.md @@ -89,7 +89,9 @@ If you encounter a specific bug in Garage or plan to patch it, you may jump dire We love to talk and hear about Garage, that's why we keep a log here: - - [(fr, 2020-12-02) Garage : jouer dans la cour des grands quand on est un hébergeur associatif](https://git.deuxfleurs.fr/Deuxfleurs/garage/src/branch/main/doc/20201202_talk/talk.pdf) + - [(en, 2021-04-28) Distributed object storage is centralised](https://git.deuxfleurs.fr/Deuxfleurs/garage/raw/branch/talks/doc/main/2021-04-28_spirals-team/talk.pdf) + + - [(fr, 2020-12-02) Garage : jouer dans la cour des grands quand on est un hébergeur associatif](https://git.deuxfleurs.fr/Deuxfleurs/garage/raw/branch/main/doc/talks/2020-12-02_wide-team/talk.pdf) *Did you write or talk about Garage? [Open a pull request](https://git.deuxfleurs.fr/Deuxfleurs/garage/) to add a link here!* diff --git a/doc/20201202_talk/.gitignore b/doc/talks/2020-12-02_wide-team/.gitignore index a5e8d18b..a5e8d18b 100644 --- a/doc/20201202_talk/.gitignore +++ b/doc/talks/2020-12-02_wide-team/.gitignore diff --git a/doc/20201202_talk/Makefile b/doc/talks/2020-12-02_wide-team/Makefile index 27dbf788..27dbf788 100644 --- a/doc/20201202_talk/Makefile +++ b/doc/talks/2020-12-02_wide-team/Makefile diff --git a/doc/20201202_talk/img/Amazon-S3.jpg b/doc/talks/2020-12-02_wide-team/img/Amazon-S3.jpg Binary files differindex a9501973..a9501973 100644 --- a/doc/20201202_talk/img/Amazon-S3.jpg +++ b/doc/talks/2020-12-02_wide-team/img/Amazon-S3.jpg diff --git a/doc/20201202_talk/img/cloud.png b/doc/talks/2020-12-02_wide-team/img/cloud.png Binary files differindex d95b2ae3..d95b2ae3 100644 --- a/doc/20201202_talk/img/cloud.png +++ b/doc/talks/2020-12-02_wide-team/img/cloud.png diff --git a/doc/20201202_talk/img/consistent_hashing_1.svg b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_1.svg index f8d24fd8..f8d24fd8 100644 --- a/doc/20201202_talk/img/consistent_hashing_1.svg +++ b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_1.svg diff --git a/doc/20201202_talk/img/consistent_hashing_2.svg b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_2.svg index 5ac8faf6..5ac8faf6 100644 --- a/doc/20201202_talk/img/consistent_hashing_2.svg +++ b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_2.svg diff --git a/doc/20201202_talk/img/consistent_hashing_3.svg b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_3.svg index fdfd3efc..fdfd3efc 100644 --- a/doc/20201202_talk/img/consistent_hashing_3.svg +++ b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_3.svg diff --git a/doc/20201202_talk/img/consistent_hashing_4.svg b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_4.svg index 95ed0e02..95ed0e02 100644 --- a/doc/20201202_talk/img/consistent_hashing_4.svg +++ b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_4.svg diff --git a/doc/20201202_talk/img/dc.jpg b/doc/talks/2020-12-02_wide-team/img/dc.jpg Binary files differindex 52cb1e70..52cb1e70 100644 --- a/doc/20201202_talk/img/dc.jpg +++ b/doc/talks/2020-12-02_wide-team/img/dc.jpg diff --git a/doc/20201202_talk/img/death.jpg b/doc/talks/2020-12-02_wide-team/img/death.jpg Binary files differindex 2ffa9180..2ffa9180 100644 --- a/doc/20201202_talk/img/death.jpg +++ b/doc/talks/2020-12-02_wide-team/img/death.jpg diff --git a/doc/20201202_talk/img/garage_distributed.svg b/doc/talks/2020-12-02_wide-team/img/garage_distributed.svg index 2db03626..2db03626 100644 --- a/doc/20201202_talk/img/garage_distributed.svg +++ b/doc/talks/2020-12-02_wide-team/img/garage_distributed.svg diff --git a/doc/20201202_talk/img/garage_tables.svg b/doc/talks/2020-12-02_wide-team/img/garage_tables.svg index fc3d8fc5..fc3d8fc5 100644 --- a/doc/20201202_talk/img/garage_tables.svg +++ b/doc/talks/2020-12-02_wide-team/img/garage_tables.svg diff --git a/doc/20201202_talk/img/rustacean-flat-happy.png b/doc/talks/2020-12-02_wide-team/img/rustacean-flat-happy.png Binary files differindex ebce1a14..ebce1a14 100644 --- a/doc/20201202_talk/img/rustacean-flat-happy.png +++ b/doc/talks/2020-12-02_wide-team/img/rustacean-flat-happy.png diff --git a/doc/20201202_talk/img/shh.jpg b/doc/talks/2020-12-02_wide-team/img/shh.jpg Binary files differindex ad4689ce..ad4689ce 100644 --- a/doc/20201202_talk/img/shh.jpg +++ b/doc/talks/2020-12-02_wide-team/img/shh.jpg diff --git a/doc/20201202_talk/img/sync.png b/doc/talks/2020-12-02_wide-team/img/sync.png Binary files differindex d0404996..d0404996 100644 --- a/doc/20201202_talk/img/sync.png +++ b/doc/talks/2020-12-02_wide-team/img/sync.png diff --git a/doc/20201202_talk/talk.pdf b/doc/talks/2020-12-02_wide-team/talk.pdf Binary files differindex b27eca29..b27eca29 100644 --- a/doc/20201202_talk/talk.pdf +++ b/doc/talks/2020-12-02_wide-team/talk.pdf diff --git a/doc/20201202_talk/talk.tex b/doc/talks/2020-12-02_wide-team/talk.tex index 1acda842..1acda842 100644 --- a/doc/20201202_talk/talk.tex +++ b/doc/talks/2020-12-02_wide-team/talk.tex diff --git a/doc/talks/2021-04-28_spirals-team/.gitignore b/doc/talks/2021-04-28_spirals-team/.gitignore new file mode 100644 index 00000000..450d4638 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/.gitignore @@ -0,0 +1,10 @@ +*.bbl +*.aux +*.bcf +*.blg +*.log +*.run.xml +*.synctex.gz +build/ +main.pdf +figures/crdt.pdf diff --git a/doc/talks/2021-04-28_spirals-team/Makefile b/doc/talks/2021-04-28_spirals-team/Makefile new file mode 100644 index 00000000..1db0c37a --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/Makefile @@ -0,0 +1,33 @@ +.PHONY: all viewpdf pdf clean + +TARGET = main +SOURCE_FILES = $(shell find . -type f -name "*.tex" -print) +CLASS_FILES = $(shell find . -type f -name "*.cls" -print) +BIB_FILES = $(shell find . -type f -name "*.bib" -print) +FIGURES = $(shell find . -path "./figures/*" -type f -print) +BUILD_PATH = build +BUILD_FILES = $(shell find $(BUILD_PATH) -type f -print) + +BIB_PROCESSOR := biber + +.PHONY: all pdf clean figures + +all: pdf + +pdf: $(TARGET).pdf + +clean: + @rm $(TARGET).pdf $(BUILD_FILES) > /dev/null 2>&1 || exit 0 + +figures: figures/crdt.pdf + +$(TARGET).pdf: figures $(FIGURES) $(SOURCE_FILES) $(BIB_FILES) $(CLASS_FILES) + @mkdir -p $(BUILD_PATH) > /dev/null 2>&1 || exit 0 + @pdflatex -interaction=nonstopmode -jobname=$(TARGET) -output-directory $(BUILD_PATH) $(TARGET).tex + @$(BIB_PROCESSOR) --output-directory $(BUILD_PATH) $(TARGET) + @pdflatex -interaction=nonstopmode -jobname=$(TARGET) -output-directory $(BUILD_PATH) $(TARGET).tex # For biber + @pdflatex -interaction=nonstopmode -jobname=$(TARGET) -output-directory $(BUILD_PATH) $(TARGET).tex # For biber + @ln -fs $(BUILD_PATH)/$(TARGET).pdf $(TARGET).pdf + +figures/crdt.pdf: figures/svg/crdt.svg + @inkscape -C --file=$< --export-pdf=$@
\ No newline at end of file diff --git a/doc/talks/2021-04-28_spirals-team/README.md b/doc/talks/2021-04-28_spirals-team/README.md new file mode 100644 index 00000000..9fb940c4 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/README.md @@ -0,0 +1 @@ +Presentation of Garage by Adrien on April, 28th 2021, for his research team [Spirals](https://team.inria.fr/spirals/).
\ No newline at end of file diff --git a/doc/talks/2021-04-28_spirals-team/bibliography.bib b/doc/talks/2021-04-28_spirals-team/bibliography.bib new file mode 100644 index 00000000..d145d2c3 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/bibliography.bib @@ -0,0 +1,27 @@ + +@inproceedings{brewer_towards_2000, + title = {Towards {{Robust Distributed Systems}}}, + booktitle = {{{ACM PODC}}}, + author = {Brewer, Eric}, + year = {2000} +} + + + +@incollection{defago_conflict-free_2011, + title = {Conflict-{{Free Replicated Data Types}}}, + booktitle = {Stabilization, {{Safety}}, and {{Security}} of {{Distributed Systems}}}, + author = {Shapiro, Marc and Pregui{\c c}a, Nuno and Baquero, Carlos and Zawirski, Marek}, + year = {2011}, + address = {{Berlin, Heidelberg}}, +} + + +@inproceedings{decandia_dynamo:_2007, + title = {Dynamo: {{Amazon}}'s {{Highly Available Key}}-Value {{Store}}}, + booktitle = {{ACM SOSP}}, + author = {DeCandia, Giuseppe and Hastorun, Deniz and Jampani, Madan and Kakulapati, Gunavardhan and Lakshman, Avinash and Pilchin, Alex and Sivasubramanian, Swaminathan and Vosshall, Peter and Vogels, Werner}, + year = {2007}, + address = {{New York, USA}}, +} + diff --git a/doc/talks/2021-04-28_spirals-team/conclusion.tex b/doc/talks/2021-04-28_spirals-team/conclusion.tex new file mode 100644 index 00000000..ddbcf0b4 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/conclusion.tex @@ -0,0 +1,7 @@ +\section{Conclusion} + +\begin{frame}{The future is cooler when we bend it our way} + +Contributions welcome! :D + +\end{frame}
\ No newline at end of file diff --git a/doc/talks/2021-04-28_spirals-team/escaping_the_cloud.tex b/doc/talks/2021-04-28_spirals-team/escaping_the_cloud.tex new file mode 100644 index 00000000..9f1f13ba --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/escaping_the_cloud.tex @@ -0,0 +1,124 @@ +\section{Escaping the cloud} + +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \begin{frame}{Down to Earth with home-hosting} + + +% \todo{Stanley Parabole reference?} + +% \end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Why?} + +\begin{itemize} + \item \textbf{Privacy}: no prying eyes besides your ISP + \item \textbf{Control} of your infrastructure + \item \textbf{Ecology}: reuse old hardware +\end{itemize} + +\vfill +\begin{block}{\emph{Tim Berners-Lee} (1994)} +``Now, if someone tries to monopolize the Web, for example pushes proprietary variations on network protocols, then that would make me unhappy.'' +\end{block} + +\begin{itemize} + \item Make Tim Berners-Lee happy +\end{itemize} + +\end{frame} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{What?} + +\centering\Large +A data store for commodity hardware on heterogenous household connections. + + +\vfill\raggedright\normalsize + + +\begin{block}{Targetting user-facing services} +\begin{itemize} + \item Static sites + \item E-mails + \item Instant communication + %\item Video streaming % No need for a data store + \item Collaboration +\end{itemize} +\end{block} +\vfill + +Nothing fancy like sensors data streams, AI or IoT. + +\end{frame} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{What?} + + +\begin{block}{Requirements} +\begin{itemize} + \item \textbf{No single point of failure} / flat hierarchy: + + Any node can die for extended periods of time. + \item \textbf{Multi-site}: cluster spans regions/countries. + \item \textbf{Acceptable performance}. + \item \textbf{Lightweight}: targets legacy hardware. + \item \textbf{Conceptually simple}: built for low-tech organisations. + + Adding/maintaining cluster nodes should be easy. +\end{itemize} +\end{block} +\vfill + +\begin{block}{Non-goals} +\begin{itemize} + \item \textbf{Super badass performance}. + \item \textbf{NAT traversal} etc.: we require full-mesh connectivity. +\end{itemize} +\end{block} +\end{frame} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{How?} + +\begin{itemize} + \item Theoretically possible with object storage \& CRDTs. + \vfill + \item Household uplinks are getting decent (optical fibers). +\end{itemize} + + + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Research Questions} + +\begin{itemize} + \item Decent performance despite bad inter-node connectivity. + \vfill + + \item Tailoring workloads as a function of nodes' capabilities: + + \begin{itemize} + \item Make use of low-end nodes (e.g. Raspberry Pis), + \item Avoid impeding global performance because of low-end nodes. + \end{itemize} + \vfill + + \item Building CRDTs for target use-cases: + + \begin{itemize} + \item Software engineering: DSL or native code? + \item Provide APIs to data store users? Risky? + \end{itemize} + \vfill + + \item Cluster management: effortless UX, low perf. overhead. +\end{itemize} +\end{frame}
\ No newline at end of file diff --git a/doc/talks/2021-04-28_spirals-team/figures/c1.pdf b/doc/talks/2021-04-28_spirals-team/figures/c1.pdf Binary files differnew file mode 100644 index 00000000..4568b702 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/c1.pdf diff --git a/doc/talks/2021-04-28_spirals-team/figures/c2.pdf b/doc/talks/2021-04-28_spirals-team/figures/c2.pdf Binary files differnew file mode 100644 index 00000000..63be7d3c --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/c2.pdf diff --git a/doc/talks/2021-04-28_spirals-team/figures/c3.pdf b/doc/talks/2021-04-28_spirals-team/figures/c3.pdf Binary files differnew file mode 100644 index 00000000..514e66f4 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/c3.pdf diff --git a/doc/talks/2021-04-28_spirals-team/figures/c4.pdf b/doc/talks/2021-04-28_spirals-team/figures/c4.pdf Binary files differnew file mode 100644 index 00000000..348e900e --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/c4.pdf diff --git a/doc/talks/2021-04-28_spirals-team/figures/conflict_acid.pdf b/doc/talks/2021-04-28_spirals-team/figures/conflict_acid.pdf Binary files differnew file mode 100644 index 00000000..4175e14a --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/conflict_acid.pdf diff --git a/doc/talks/2021-04-28_spirals-team/figures/conflict_base.pdf b/doc/talks/2021-04-28_spirals-team/figures/conflict_base.pdf Binary files differnew file mode 100644 index 00000000..95fe0544 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/conflict_base.pdf diff --git a/doc/talks/2021-04-28_spirals-team/figures/conflict_crdt.pdf b/doc/talks/2021-04-28_spirals-team/figures/conflict_crdt.pdf Binary files differnew file mode 100644 index 00000000..bf4354ce --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/conflict_crdt.pdf diff --git a/doc/talks/2021-04-28_spirals-team/figures/conflict_problem.pdf b/doc/talks/2021-04-28_spirals-team/figures/conflict_problem.pdf Binary files differnew file mode 100644 index 00000000..b07ad3b4 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/conflict_problem.pdf diff --git a/doc/talks/2021-04-28_spirals-team/figures/dag_crdt.png b/doc/talks/2021-04-28_spirals-team/figures/dag_crdt.png Binary files differnew file mode 100644 index 00000000..f7abe7fd --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/dag_crdt.png diff --git a/doc/talks/2021-04-28_spirals-team/figures/garage_distributed.png b/doc/talks/2021-04-28_spirals-team/figures/garage_distributed.png Binary files differnew file mode 100644 index 00000000..da658f3b --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/garage_distributed.png diff --git a/doc/talks/2021-04-28_spirals-team/figures/garage_tables.pdf b/doc/talks/2021-04-28_spirals-team/figures/garage_tables.pdf Binary files differnew file mode 100644 index 00000000..a7dd13b3 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/garage_tables.pdf diff --git a/doc/talks/2021-04-28_spirals-team/figures/m_proxy_gray.pdf b/doc/talks/2021-04-28_spirals-team/figures/m_proxy_gray.pdf Binary files differnew file mode 100644 index 00000000..fc96e3ab --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/m_proxy_gray.pdf diff --git a/doc/talks/2021-04-28_spirals-team/figures/minio_edge.png b/doc/talks/2021-04-28_spirals-team/figures/minio_edge.png Binary files differnew file mode 100644 index 00000000..0efce4b7 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/minio_edge.png diff --git a/doc/talks/2021-04-28_spirals-team/figures/rustacean-flat-happy.png b/doc/talks/2021-04-28_spirals-team/figures/rustacean-flat-happy.png Binary files differnew file mode 100644 index 00000000..ebce1a14 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/rustacean-flat-happy.png diff --git a/doc/talks/2021-04-28_spirals-team/figures/svg/conflict.svg b/doc/talks/2021-04-28_spirals-team/figures/svg/conflict.svg new file mode 100644 index 00000000..1c39af9f --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/svg/conflict.svg @@ -0,0 +1,930 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="119.30722mm" + height="121.49291mm" + viewBox="0 0 119.30722 121.49291" + version="1.1" + id="svg8" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="conflict.svg"> + <defs + id="defs2"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker2999" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path2997" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.4,0,0,-0.4,-4,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker2964" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path2962" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.4,0,0,-0.4,-4,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker1467" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path1465" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.4,0,0,-0.4,-4,0)" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker1449" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Mend"> + <path + inkscape:connector-curvature="0" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1447" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker12071" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Mend" + inkscape:collect="always"> + <path + transform="matrix(-0.4,0,0,-0.4,-4,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path12069" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker9668" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Mend" + inkscape:collect="always"> + <path + transform="matrix(-0.4,0,0,-0.4,-4,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path9666" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker6943" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path6941" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker5445" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Mend"> + <path + transform="matrix(-0.4,0,0,-0.4,-4,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path5443" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker1115" + style="overflow:visible" + inkscape:isstock="true" + inkscape:collect="always"> + <path + id="path861" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path826" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path820" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="marker1101" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path1099" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path817" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="244.86596" + inkscape:cy="205.06317" + inkscape:document-units="mm" + inkscape:current-layer="layer5" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="1055" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:snap-global="false" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="Common" + transform="translate(-43.663712,-16.067619)" + style="display:inline"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 99.856918,34.684511 h 4.913692" + id="path1257" + inkscape:connector-curvature="0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79374999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="M 102.31376,23.208557 V 135.9963" + id="path815" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="90.524658" + y="19.57423" + id="text838"><tspan + sodipodi:role="line" + id="tspan836" + x="90.524658" + y="19.57423" + style="font-weight:bold;stroke-width:0.26458332px"># vaccines</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="46.748138" + y="19.57423" + id="text13775"><tspan + sodipodi:role="line" + id="tspan13773" + x="46.748138" + y="19.57423" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Iwona;-inkscape-font-specification:'Iwona Italic';stroke-width:0.26458332px">Paris</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="148.20457" + y="19.57423" + id="text13798"><tspan + sodipodi:role="line" + id="tspan13796" + x="148.20457" + y="19.57423" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Iwona;-inkscape-font-specification:'Iwona Italic';stroke-width:0.26458332px">Lille</tspan></text> + </g> + <g + inkscape:label="The problem" + inkscape:groupmode="layer" + id="layer1" + style="display:none" + transform="translate(-43.663712,-16.067619)"> + <g + id="g13753" + transform="translate(0,12.170833)"> + <path + inkscape:connector-curvature="0" + id="path850" + d="M 97.820644,51.619712 75.828475,64.316897" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1115)" /> + <text + y="-108.69946" + x="-183.00148" + transform="rotate(180,91.874093,54.229103)" + id="text7803" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><textPath + id="textPath7973" + xlink:href="#path850"><tspan + id="tspan7801" + style="font-weight:bold;stroke-width:0.26458332px">R</tspan></textPath></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9668)" + d="M 75.056888,72.78638 97.049057,85.483565" + id="path9498" + inkscape:connector-curvature="0" /> + <text + transform="translate(9.4212508,3.3408691)" + y="2.986012" + x="8.5186663" + id="text10668" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><textPath + id="textPath10836" + xlink:href="#path9498"><tspan + id="tspan10666" + style="font-weight:bold;stroke-width:0.26458332px">W</tspan></textPath></text> + </g> + <g + id="g13763" + transform="translate(0,12.170833)"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12071)" + d="m 106.80689,51.619712 21.99218,12.697185" + id="path11899" + inkscape:connector-curvature="0" /> + <path + inkscape:connector-curvature="0" + id="path11901" + d="M 129.57066,72.78638 107.57848,85.483565" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9668)" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="text13737" + transform="rotate(-115.89278,108.31787,47.643413)" + x="-372.04132" + y="-217.15767"><textPath + xlink:href="#path850" + id="textPath13735"><tspan + style="font-weight:bold;stroke-width:0.26458332px" + id="tspan13733">R</tspan></textPath></text> + <text + transform="rotate(-58.856754,100.88692,38.870944)" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="text13743" + x="46.604572" + y="6.6609678"><textPath + xlink:href="#path9498" + id="textPath13741"><tspan + style="font-weight:bold;stroke-width:0.26458332px" + id="tspan13739">W</tspan></textPath></text> + </g> + <path + inkscape:connector-curvature="0" + id="path13768" + d="m 99.856918,112.89149 h 4.913692" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="43.564934" + y="53.51746" + id="text13802"><tspan + sodipodi:role="line" + id="tspan13800" + x="43.564934" + y="53.51746" + style="stroke-width:0.26458332px">We acquired 1000 doses!</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="49.979401" + y="82.649841" + id="text13806"><tspan + sodipodi:role="line" + id="tspan13804" + x="49.979401" + y="82.649841" + style="stroke-width:0.26458332px">x + 1000</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="136.842" + y="82.649841" + id="text13810"><tspan + sodipodi:role="line" + id="tspan13808" + x="136.842" + y="82.649841" + style="stroke-width:0.26458332px">x + 500</tspan></text> + <text + id="text13814" + y="53.51746" + x="112.88577" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:0.26458332px" + y="53.51746" + x="112.88577" + id="tspan13812" + sodipodi:role="line">We acquired 500 doses!</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="108.70142" + y="114.62009" + id="text13818"><tspan + sodipodi:role="line" + id="tspan13816" + x="108.70142" + y="114.62009" + style="font-weight:bold;stroke-width:0.26458332px">???</tspan></text> + <text + id="text3109" + y="36.388439" + x="108.80019" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px" + y="36.388439" + x="108.80019" + id="tspan3107" + sodipodi:role="line">T0: 5000</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="ACID" + style="display:none"> + <rect + ry="5.2916665" + y="67.923912" + x="61.174206" + height="39.498508" + width="54.42857" + id="rect14092" + style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:0.97409327;fill-rule:nonzero;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.91191711;paint-order:fill markers stroke" /> + <rect + style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:0.97409327;fill-rule:nonzero;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.91191711;paint-order:fill markers stroke" + id="rect14090" + width="54.42857" + height="39.498508" + x="1.6973262" + y="21.886396" + ry="5.2916665" /> + <path + inkscape:connector-curvature="0" + id="path14037" + d="m 56.193207,64.654408 h 4.913692" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 56.193207,110.69192 h 4.913692" + id="path14040" + inkscape:connector-curvature="0" /> + <g + id="g14075" + transform="translate(0,-1.9988201)"> + <g + id="g13993" + transform="translate(-43.663711,-25.06345)" + style="display:inline"> + <path + inkscape:connector-curvature="0" + id="path13977" + d="M 97.820644,51.619712 75.828475,64.316897" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1115)" /> + <text + y="-108.69946" + x="-183.00148" + transform="rotate(180,91.874093,54.229103)" + id="text13983" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><textPath + id="textPath13981" + xlink:href="#path850"><tspan + id="tspan13979" + style="font-weight:bold;stroke-width:0.26458332px">R</tspan></textPath></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9668)" + d="M 75.056888,72.78638 97.049057,85.483565" + id="path13985" + inkscape:connector-curvature="0" /> + <text + transform="translate(9.4212508,3.3408691)" + y="2.986012" + x="8.5186663" + id="text13991" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><textPath + id="textPath13989" + xlink:href="#path9498"><tspan + id="tspan13987" + style="font-weight:bold;stroke-width:0.26458332px">W</tspan></textPath></text> + </g> + <text + id="text14044" + y="29.833508" + x="3.4844763" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:0.26458332px" + y="29.833508" + x="3.4844763" + id="tspan14042" + sodipodi:role="line">AcqDoses(1000)</tspan></text> + </g> + <g + id="g14088" + transform="translate(0,-0.41130478)"> + <g + id="g14011" + transform="translate(-43.663711,19.386549)" + style="display:inline"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12071)" + d="m 106.80689,51.619712 21.99218,12.697185" + id="path13995" + inkscape:connector-curvature="0" /> + <path + inkscape:connector-curvature="0" + id="path13997" + d="M 129.57066,72.78638 107.57848,85.483565" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9668)" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="text14003" + transform="rotate(-115.89278,108.31787,47.643413)" + x="-372.04132" + y="-217.15767"><textPath + xlink:href="#path850" + id="textPath14001"><tspan + style="font-weight:bold;stroke-width:0.26458332px" + id="tspan13999">R</tspan></textPath></text> + <text + transform="rotate(-58.856754,100.88692,38.870944)" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="text14009" + x="46.604572" + y="6.6609678"><textPath + xlink:href="#path9498" + id="textPath14007"><tspan + style="font-weight:bold;stroke-width:0.26458332px" + id="tspan14005">W</tspan></textPath></text> + </g> + <text + id="text14044-8" + y="74.283508" + x="82.76487" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:0.26458332px" + y="74.283508" + x="82.76487" + id="tspan14042-8" + sodipodi:role="line">AcqDoses(500)</tspan></text> + </g> + <text + transform="translate(-43.663711,-16.067619)" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="108.80019" + y="82.757004" + id="text832-6"><tspan + sodipodi:role="line" + id="tspan830-8" + x="108.80019" + y="82.757004" + style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px">T1: 6000</tspan></text> + <text + transform="translate(-43.663711,-16.067619)" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="108.80019" + y="128.8701" + id="text832-3"><tspan + sodipodi:role="line" + id="tspan830-83" + x="108.80019" + y="128.8701" + style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px">T2: 6500</tspan></text> + <text + transform="translate(-43.663711,-16.067619)" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="108.80019" + y="36.388439" + id="text3117"><tspan + sodipodi:role="line" + id="tspan3115" + x="108.80019" + y="36.388439" + style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px">T0: 5000</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="layer4" + inkscape:label="BASE" + style="display:none"> + <g + id="g1463" + transform="translate(0,-21.166667)"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1449)" + d="M 54.156933,47.722926 32.164764,60.420111" + id="path1369" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="text1375" + transform="rotate(180,70.308075,52.117558)" + x="-279.42224" + y="-209.36409"><textPath + xlink:href="#path850" + id="textPath1373"><tspan + style="font-weight:bold;stroke-width:0.26458332px" + id="tspan1371">R</tspan></textPath></text> + </g> + <g + id="g1481" + transform="translate(0,-21.166667)"> + <path + inkscape:connector-curvature="0" + id="path1377" + d="M 31.393177,68.889594 53.385346,81.586779" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1467)" /> + <text + transform="translate(-34.395836)" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="text1383" + x="17.939917" + y="6.3268809"><textPath + xlink:href="#path9498" + id="textPath1381"><tspan + style="font-weight:bold;stroke-width:0.26458332px" + id="tspan1379">W</tspan></textPath></text> + </g> + <g + style="display:inline" + transform="translate(-43.663711,-25.063453)" + id="g1403"> + <path + inkscape:connector-curvature="0" + id="path1387" + d="m 106.80689,51.619712 21.99218,12.697185" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12071)" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9668)" + d="M 129.57066,72.78638 107.57848,85.483565" + id="path1389" + inkscape:connector-curvature="0" /> + <text + y="-217.15767" + x="-372.04132" + transform="rotate(-115.89278,108.31787,47.643413)" + id="text1395" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><textPath + id="textPath1393" + xlink:href="#path850"><tspan + id="tspan1391" + style="font-weight:bold;stroke-width:0.26458332px">R</tspan></textPath></text> + <text + y="6.6609678" + x="46.604572" + id="text1401" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + transform="rotate(-58.856754,100.88692,38.870944)"><textPath + id="textPath1399" + xlink:href="#path9498"><tspan + id="tspan1397" + style="font-weight:bold;stroke-width:0.26458332px">W</tspan></textPath></text> + </g> + <path + inkscape:connector-curvature="0" + id="path1503" + d="m 56.193207,73.650233 h 4.913692" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <text + id="text1507" + y="75.354156" + x="64.607315" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px" + y="75.354156" + x="64.607315" + id="tspan1505" + sodipodi:role="line">T1: [(T0, 6000),(T0, 5500)]</tspan></text> + <g + id="g1530" + transform="translate(0,38.100002)"> + <path + inkscape:connector-curvature="0" + id="path1522" + d="M 54.156933,47.722926 32.164764,60.420111" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1449)" /> + <text + y="-209.36409" + x="-279.42224" + transform="rotate(180,70.308075,52.117558)" + id="text1528" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><textPath + id="textPath1526" + xlink:href="#path850"><tspan + id="tspan1524" + style="font-weight:bold;stroke-width:0.26458332px">R</tspan></textPath></text> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="8.5044641" + y="109.58665" + id="text1534"><tspan + sodipodi:role="line" + id="tspan1532" + x="8.5044641" + y="109.58665" + style="font-weight:normal;stroke-width:0.26458332px">Now solve this!</tspan><tspan + sodipodi:role="line" + x="8.5044641" + y="115.76025" + style="font-weight:normal;stroke-width:0.26458332px" + id="tspan3159">And write back!</tspan></text> + <text + id="text1538" + y="44.886383" + x="6.3156896" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:0.26458332px" + y="44.886383" + x="6.3156896" + id="tspan1536" + sodipodi:role="line">x + 1000</tspan></text> + <text + id="text1542" + y="44.886383" + x="93.178284" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:0.26458332px" + y="44.886383" + x="93.178284" + id="tspan1540" + sodipodi:role="line">x + 500</tspan></text> + <text + transform="translate(-43.663711,-16.067619)" + id="text3103" + y="36.388439" + x="108.80019" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px" + y="36.388439" + x="108.80019" + id="tspan3101" + sodipodi:role="line">T0: (⊥, 5000)</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="layer5" + inkscape:label="CRDT" + style="display:inline"> + <g + style="display:inline" + transform="translate(0,-21.166667)" + id="g2920"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1467)" + d="M 31.393177,68.889594 53.385346,81.586779" + id="path2912" + inkscape:connector-curvature="0" /> + <text + y="6.3268809" + x="17.939917" + id="text2918" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + transform="translate(-34.395836)"><textPath + id="textPath2916" + xlink:href="#path9498"><tspan + id="tspan2914" + style="font-weight:bold;stroke-width:0.26458332px">W</tspan></textPath></text> + </g> + <g + id="g3013"> + <path + inkscape:connector-curvature="0" + id="path2924" + d="M 85.906949,47.722927 63.914769,60.420112" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2999)" /> + <text + transform="rotate(-58.856754,57.228059,65.935492)" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="text2936" + x="7.1585193" + y="48.970455"><textPath + xlink:href="#path9498" + id="textPath2934"><tspan + style="font-weight:bold;stroke-width:0.26458332px" + id="tspan2932">W</tspan></textPath></text> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="15.648211" + y="44.007793" + id="text2976"><tspan + sodipodi:role="line" + id="tspan2974" + x="15.648211" + y="44.007793" + style="font-weight:normal;stroke-width:0.26458332px">incr(1000)</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="82.927979" + y="44.007793" + id="text2980"><tspan + sodipodi:role="line" + id="tspan2978" + x="82.927979" + y="44.007793" + style="font-weight:normal;stroke-width:0.26458332px">incr(500)</tspan></text> + <path + inkscape:connector-curvature="0" + id="path2982" + d="m 56.193207,72.591896 h 4.913692" + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <text + id="text2986" + y="74.295815" + x="65.136482" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px" + y="74.295815" + x="65.136482" + sodipodi:role="line" + id="tspan2995">T1: (5000, </tspan><tspan + style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px" + y="79.777985" + x="65.136482" + sodipodi:role="line" + id="tspan1204"> {(a, 1000), (b, 500)})</tspan></text> + <g + style="display:inline" + transform="translate(0,38.100003)" + id="g3042"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1449)" + d="M 54.156933,47.722926 32.164764,60.420111" + id="path3034" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="text3040" + transform="rotate(180,70.308075,52.117558)" + x="-279.42224" + y="-209.36409"><textPath + xlink:href="#path850" + id="textPath3038"><tspan + style="font-weight:bold;stroke-width:0.26458332px" + id="tspan3036">R</tspan></textPath></text> + </g> + <text + id="text3051" + y="102.21611" + x="17.764879" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-weight:normal;stroke-width:0.26458332px" + y="102.21611" + x="17.764879" + id="tspan3049" + sodipodi:role="line">6500</tspan></text> + <text + transform="translate(-43.663711,-16.067619)" + id="text3097" + y="36.388439" + x="108.80019" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px" + y="36.388439" + x="108.80019" + id="tspan3095" + sodipodi:role="line">T0: (5000, ∅)</tspan></text> + </g> +</svg> diff --git a/doc/talks/2021-04-28_spirals-team/figures/svg/crdt.svg b/doc/talks/2021-04-28_spirals-team/figures/svg/crdt.svg new file mode 100644 index 00000000..6104116b --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/figures/svg/crdt.svg @@ -0,0 +1,227 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="82.010674mm" + height="17.561125mm" + viewBox="0 0 82.010674 17.561125" + version="1.1" + id="svg1579" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="crdt.svg"> + <defs + id="defs1573"> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker2645" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Mend"> + <path + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + id="path2643" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker2605" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Mstart"> + <path + transform="scale(0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + id="path2603" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mend" + style="overflow:visible" + inkscape:isstock="true" + inkscape:collect="always"> + <path + id="path2206" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart" + style="overflow:visible" + inkscape:isstock="true" + inkscape:collect="always"> + <path + id="path2203" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path2197" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(1.1,0,0,1.1,1.1,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Sstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path2191" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(0.2,0,0,0.2,1.2,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.8" + inkscape:cx="148.82928" + inkscape:cy="-32.722297" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-bbox="true" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1920" + inkscape:window-height="1055" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" /> + <metadata + id="metadata1576"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-21.438257,-19.857903)"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart);marker-end:url(#Arrow2Mend)" + d="M 44.979166,28.87314 H 58.822544" + id="path2177" + inkscape:connector-curvature="0" /> + <g + id="g2153"> + <rect + rx="0" + ry="3.8793426" + y="19.990194" + x="21.570549" + height="17.296541" + width="23.537758" + id="rect2124" + style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:0.97409327;fill-rule:nonzero;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.91191711;paint-order:fill markers stroke" /> + <text + id="text2132" + y="29.799105" + x="29.366098" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-weight:normal;stroke-width:0.26458332px" + y="29.799105" + x="29.366098" + id="tspan2130" + sodipodi:role="line">App</tspan></text> + </g> + <rect + rx="0" + ry="3.8793426" + y="19.990194" + x="58.612213" + height="17.296541" + width="23.537758" + id="rect2155" + style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:0.97409327;fill-rule:nonzero;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.91191711;paint-order:fill markers stroke" /> + <text + id="text2159" + y="30.367077" + x="63.842014" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-weight:normal;stroke-width:0.26458332px" + y="30.367077" + x="63.842014" + id="tspan2157" + sodipodi:role="line">CRDT</tspan></text> + <g + id="g4137" + transform="translate(-15.875)"> + <rect + rx="0" + ry="3.8793426" + y="19.990194" + x="95.653885" + height="17.296541" + width="23.537758" + id="rect2163" + style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:0.97409327;fill-rule:nonzero;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.91191711;paint-order:fill markers stroke" /> + <text + id="text2167" + y="30.367077" + x="96.969627" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-weight:normal;stroke-width:0.26458332px" + y="30.367077" + x="96.969627" + id="tspan2165" + sodipodi:role="line">Datastore</tspan></text> + </g> + </g> +</svg> diff --git a/doc/talks/2021-04-28_spirals-team/garage.tex b/doc/talks/2021-04-28_spirals-team/garage.tex new file mode 100644 index 00000000..9f953602 --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/garage.tex @@ -0,0 +1,147 @@ +\section{Introducing Garage} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Brought to you by the Deuxfleurs association} + +\begin{block}{\textbf{deuxfleurs.fr} -- a libre hosting association with a vision} +``Shifting the current structure of the Internet from a world of a few very large service providers, to a world where services are hosted by a variety of smaller organisations.'' +\end{block} + + +\begin{block}{Our goals} +\begin{itemize} + \item To propose performant \& reliable libre services for the masses + \item To host and administer our infrastructure ourselves + \item To allow members to contribute storage/compute nodes + \item Resilience: for availability \& the sysadmins' sleep + \item Conceptual simplicity to ease onboarding \& demistify hosting +\end{itemize} +\end{block} + + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{The lacking state of the practice} + +\begin{block}{Object storage fitted our needs} +\begin{itemize} + \item Distributed by design + \item Objects are replicated + \item Conceptually simple +\end{itemize} +\end{block} +\vfill + +\begin{block}{Existing object stores did not} + \begin{itemize} + \item Too specific / complex + \item Resource hungry + \item Hidden constraints + \end{itemize} +\end{block} +\vfill + +We developed Garage, an object store with minimal functionality. + +It works, and serves our static sites and media. + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Introducing Garage} + +\centering +\url{garagehq.deuxfleurs.fr} + +\url{git.deuxfleurs.fr/Deuxfleurs/garage} + +\includegraphics[width=.4\columnwidth]{figures/garage_distributed.png} +\vfill + +\raggedright +\begin{itemize} + \item Distributed data store + \item Based on DynamoDB object store (P2P!) + \item Modular data types/protocols with CRDTs: + \begin{itemize} + \item Done: objects (media, static sites, backups...) via S3 API + \item To do: e-mails via IMAP protocol, and more + \end{itemize} +\end{itemize} + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[t]{The \textbf{RING}} + +\centering +\fullcite{decandia_dynamo:_2007} +\vspace{3ex} + +\only<1>{\includegraphics[width=.5\columnwidth]{figures/c1.pdf}}% +\only<2>{\includegraphics[width=.5\columnwidth]{figures/c2.pdf}}% +\only<3>{\includegraphics[width=.5\columnwidth]{figures/c3.pdf}}% +\only<4>{\includegraphics[width=.5\columnwidth]{figures/c4.pdf}}% +\vspace{5ex} + +%\raggedright +\only<1>{Each node is assigned a unique ID on the circular address space.}% +\only<2-3>{When a new object is added to the store...}% +\only<3>{\\ It is assigned a unique ID (its \emph{key}) on the address space.}% +\only<4>{The $R$ nodes after the object are in charge of replicating it.}% + +\end{frame} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Distributed metadata} + +\centering +\includegraphics[width=.8\columnwidth]{figures/garage_tables.pdf} +\vfill + +The objects, versions and blocks are all stored in the ring. + +\end{frame} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Written in Rust} + +\begin{columns} +\column{.65\columnwidth} +Entirely written in Rust! +\column{.35\columnwidth} +\centering +\includegraphics[width=.85\columnwidth]{figures/rustacean-flat-happy.png} +\end{columns} +\vfill + +\begin{columns} +\column[t]{.6\columnwidth} + \textbf{Pros:} + \begin{itemize} + \item Compiled and fast + \item Features prevent usual mistakes: + + strongly typed, immutable by default, ownership instead of GC... + + \item Best of several paradigms: + + imperative, OO, functional + + \item Good libraries for network programmings: + + serialization, http, async/await... + \end{itemize} +\column[t]{.4\columnwidth} + \textbf{Cons}: + \begin{itemize} + \item Steep learning curve + \item Long compilation times + \item Compiler rage + \end{itemize} +\end{columns} + +\end{frame}
\ No newline at end of file diff --git a/doc/talks/2021-04-28_spirals-team/header.tex b/doc/talks/2021-04-28_spirals-team/header.tex new file mode 100644 index 00000000..42eaa25a --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/header.tex @@ -0,0 +1,134 @@ +%% Imports %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\usepackage{graphicx} +\usepackage[utf8]{inputenc} +\usepackage{csquotes} % Elegant quotes (must be loaded before babel) +\usepackage[english]{babel} +\usepackage[T1]{fontenc} +% \usepackage{amsfonts} +% \usepackage{amssymb} +%\usepackage{lmodern} +\usepackage{iwona} +\usepackage{color} +\usepackage{xspace} +\usepackage{amsmath} +\usepackage{hanging} +\usepackage{listings} +\lstset{basicstyle=\scriptsize} +\usepackage{tikz} +\usepackage{tikzsymbols} % For emojis +%\usepackage{setspace} % Activation disables footnoes +\usepackage{perpage} % Reset footnote counter every page +\MakePerPage{footnote} +\usepackage{nameref} % For printing the sections' name +\usepackage{hyperref} + +%% Biblio %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\usepackage[style=alphabetic,giveninits=true,sorting=none,hyperref,backend=biber,maxnames=3]{biblatex} +\addbibresource{bibliography.bib} + +%% Templating %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\usepackage{pgf} +\usepackage{xifthen, tikz} + +\usetheme{default} + +\makeatletter + + +%%% colors +\definecolor{bleuroi}{RGB}{0, 8, 88} +\definecolor{vertemeraude}{RGB}{0, 64, 44} +\definecolor{lightgray}{RGB}{245,245,245} +\definecolor{encre_de_chine}{RGB}{9,36,53} +\definecolor{im_lost_in_your_eyes}{RGB}{110,138,159} +\definecolor{metallic_grey}{RGB}{209,219,221} +\definecolor{metallic_white}{RGB}{229,239,241} +\definecolor{boss}{RGB}{229,72,27} +\definecolor{toon_eyes}{RGB}{3,4,6} + +\setbeamercolor{frametitle}{bg=bleuroi,fg=white} +\setbeamercolor*{normal text}{fg=toon_eyes,bg=white} +\setbeamercolor*{block title}{fg=white,bg=vertemeraude} +\setbeamercolor*{block body}{fg=toon_eyes,bg=vertemeraude!5} +\setbeamercolor{alerted text}{fg=vertemeraude} +\setbeamercolor*{example text}{fg=toon_eyes,bg=white} +\setbeamercolor*{structure}{fg=bleuroi,bg=white} +% sectionnavigation: +\setbeamercolor*{section in head/foot}{fg=bleuroi,bg=white} + +% \let\oldtextbf\textbf +% \renewcommand{\textbf}[1]{\textcolor{bleuroi}{\oldtextbf{#1}}} + +%%% Rounded boxes with no shading +\pgfdeclareverticalshading[lower.bg,upper.bg]{bmb@transition}{200cm}{% + color(0pt)=(upper.bg); color(2pt)=(upper.bg); color(4pt)=(upper.bg)} +\setbeamertemplate{blocks}[rounded][shadow=false] + +%%% Who on Earth uses navigation bars? +\setbeamertemplate{navigation symbols}{} + + +%%% Headline with sections +\setbeamertemplate{headline} +{% + \begin{beamercolorbox}[wd=\paperwidth,dp=.5ex,ht=2ex]{section in head/foot} + \insertsectionnavigationhorizontal{\paperwidth}{\hskip0pt plus1fill}{\hskip0pt plus1fill}\par % Centered + %\insertsectionnavigationhorizontal{\paperwidth}{}{\hfill\hfill} % Left aligned + \end{beamercolorbox}% +} +% Set the colors of the section bar +\usesectionheadtemplate + {\colorbox{fg}{\color{bg} \insertsectionhead}} + {\color{fg!40!bg} \insertsectionhead} + +% \newlength\lpg@linewd +% \setbox0=\hbox{\strut} +% \newlength\strutht \strutht\ht0 +% \newlength\strutdp \strutdp\dp0 + +\setbeamertemplate{frametitle} +{ + \begin{beamercolorbox}[wd=\paperwidth,dp=1ex,ht=2.6ex,leftskip=.7cm,rightskip=.7cm]{frametitle} + %\vskip-1ex + %[wd=\lpg@linewd, ht=\strutht, dp=\strutdp]{frametitle} + %\vskip-.8ex\hskip0.7cm + %\vskip-.8ex + \usebeamerfont{frametitle}\strut\insertframetitle + \ifx\insertframesubtitle\@empty + \else + \hfill \usebeamerfont{framesubtitle}\strut\insertframesubtitle + \fi% + \end{beamercolorbox} +} + + +%%% Page numbering in footline +\setbeamertemplate{footline}{ +\hbox{\begin{beamercolorbox}[wd=1\paperwidth,ht=2.5ex,dp=1ex,right]{framenumber in head/foot}% + \usebeamerfont{framenumber in head/foot}% + %\insertframenumber\space/\space\inserttotalframenumber\hspace{0.3em} + \insertframenumber\hspace{0.5em} +\end{beamercolorbox}}} + +%%% Reduce foot citation size +\renewcommand{\footnotesize}{\tiny} + +%%% Display footnotes (not working, still no footnotes) +% \setbeamertemplate{footnote}{% +% \hangpara{2em}{1}% +% \makebox[2em][l]{\insertfootnotemark}\footnotesize\insertfootnotetext\par% +% } + + +\makeatother + +%% Commentaires %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\annote}[3]{{ + \colorbox{#3}{\bfseries\sffamily\footnotesize\textcolor{white}{#2}} + \color{#3} + $\blacktriangleright$\textit{#1}$\blacktriangleleft$} +} +%% Uncomment for final version (removes notes) +%\renewcommand{\annote}[3]{} + +\newcommand{\todo}[1]{\annote{#1}{TODO}{green}} diff --git a/doc/talks/2021-04-28_spirals-team/introduction.tex b/doc/talks/2021-04-28_spirals-team/introduction.tex new file mode 100644 index 00000000..a977c09b --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/introduction.tex @@ -0,0 +1,99 @@ +\section{Introduction} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{A very casual motivation} + + +\begin{center} +\Large +I want to host \textbf{resilient web services} with \textbf{acceptable performance} on commodity hardware behind \textbf{household networks}. +\end{center} +\vfill + +\begin{block}{Keywords} +\begin{columns} +\column{.5\columnwidth} + \begin{itemize} + \item Decentralised networks + \item Edge computing + \end{itemize} +\column{.5\columnwidth} + \begin{itemize} + \item Distributed storage + \item Privacy + \end{itemize} +\end{columns} +\end{block} + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Context} + +\textbf{Resilience}: Ability to recover quickly from failures and changes. +\vspace{1ex} + +Only achievable through distribution of the hosted applications across several physical locations. +\vfill + + +\begin{block}{Application = \textbf{computations} on \textbf{data}} +\begin{itemize} + \item \textbf{Computation}: Stateless; easy to distribute \& orchestrate. + % where it is performed does not matter as long as the application's state is accessible R/W + %Computation units are "easy" to distribute and orchestrate. + + \item \textbf{Data}: Stateful; hard to distribute \& full of trade-offs. +\end{itemize} +\end{block} + +\end{frame} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Concurrent writes example}{How to lose vaccines} + +\centering + +\includegraphics[width=.5\columnwidth]{figures/conflict_problem.pdf} +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{The problem} + +% \textbf{Path dependency}: existing data stores are built for data centres. + +% $\implies$ They assume good inter-node connectivity. +% \vfill + +\begin{center} +\Large +Can we design an available data store tailored for adverse network conditions? +\end{center} + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Maybe more framing of the context. What kind of data storage? Object vs Block vs what? +% \begin{frame}{``Stateless'', ``serverless'', and the elephant in the room} + +% It seems easy to deploy \& administer web services nowadays ... + +% Because the inherent complexity is shadowed by proprietary ``cloud'' solutions. + +% The IT crowd can gloss over ``statelessness'' \emph{ad nauseam} ... + +% But storing \emph{state} remains an open research problem. + +% Data storage is either: + +% \begin{itemize} +% \item A single point of failure; +% \item Delegated to proprietary solutions; +% \item Pain. +% \end{itemize} + +% Today, we will review networked storage's history, and discuss open research questions. + +% \end{frame}
\ No newline at end of file diff --git a/doc/talks/2021-04-28_spirals-team/main.tex b/doc/talks/2021-04-28_spirals-team/main.tex new file mode 100644 index 00000000..5cd9dc0c --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/main.tex @@ -0,0 +1,70 @@ +\documentclass[compress]{beamer} + +\input{header.tex} + +%% Metadata %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\title{Distributed object storage is centralised} +\subtitle{A quest for autonomy in the modern hosting ecology} +\author{Adrien Luxey} +\date{Wednesday, 28th April, 2021} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Begin document %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{document} + +%% Title page %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +{ +\setbeamertemplate{footline}{} +\setbeamertemplate{headline}{} +\begin{frame} +\titlepage +\end{frame} +} + +%% Contents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\input{introduction.tex} +\input{sota.tex} +\input{escaping_the_cloud.tex} +\input{garage.tex} +\input{conclusion.tex} + + +%% Bibliography %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% \begin{frame} +% \large +% \raggedright +% Références + +% \printbibliography +% \end{frame} + +%% Ending %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +{ +\setbeamertemplate{footline}{} +\setbeamertemplate{headline}{} +\begin{frame} +\centering + +\vspace{1cm} +\Large Thank you for your attention. + +\vspace{2cm} +\large Now let's chat! + +\vspace{1cm} +\raggedleft +\includegraphics[width=.2\textwidth]{figures/m_proxy_gray.pdf} +\end{frame} +} + +%% Appendices %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% \appendix +% \input{sprinkler_appendix.tex} +% \input{cascade_appendix.tex} +% \input{spores_appendix.tex} + + +\end{document}
\ No newline at end of file diff --git a/doc/talks/2021-04-28_spirals-team/sota.tex b/doc/talks/2021-04-28_spirals-team/sota.tex new file mode 100644 index 00000000..23b9087a --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/sota.tex @@ -0,0 +1,323 @@ +\section{State of the art} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{The CAP theorem}{Consistency vs. Availability} + +\begin{block}{Eric Brewer's theorem} +``A shared-state system can have \textbf{at most two} of the following properties at any given time: + +\begin{itemize} + \item \textbf{C}onsistency + \item \textbf{A}vailability + \item \textbf{P}artition tolerance'' +\end{itemize} +\end{block} + + +\begin{center} +\Large +Under network partitions, a distributed data store has to sacrifice either availability or consistency. +\end{center} +\vfill + +\begin{itemize} + \item \textbf{Consistency-first}: Abort incoming queries; + \item \textbf{Availability-first}: Return possibly stale data. +\end{itemize} + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Consistency-first: the ACID model}{Consistency vs. Availability} + +\textbf{Transaction}: unit of work within an ACID data store. +%Comprises multiple operations. +%E.g. bank transfer. +%E.g. a bank transfer from A to B is a transaction involving two operations: withdraw money from A & credit B with the same money amount. +\vfill + +\begin{itemize} + \item \textbf{\underline{A}tomicity}: Transactions either complete entirely or fail. + + No transaction ever seen as in-progress. + + \item \textbf{\underline{C}onsistency}: Transactions always generate a valid state. + + The database maintains its invariants across transactions. + + \item \textbf{\underline{I}solation}: Concurrent transactions are seen as sequential. + + Transactions are serializable, or sequentially consistent. + + \item \textbf{\underline{D}urability}: Committed transactions are never forgotten. +\end{itemize} +\vfill\centering + +Reads are fast, writes are slow. + +\vfill\raggedright + +Example: relational databases. +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Concurrent writes in ACID}{Consistency vs. Availability} + + +\begin{columns} +\column{.5\columnwidth} + \begin{block}{} + \begin{lstlisting} +transaction AcqDoses(y): + x <- SELECT #vaccines; + UPDATE #vaccines = (x + y); + \end{lstlisting} + \end{block} + \vspace{5ex} + + Supports compound operations. +\column{.5\columnwidth} +\centering +\includegraphics[width=\columnwidth]{figures/conflict_acid.pdf} +\end{columns} + +\end{frame} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Availability-first: the BASE model}{Consistency vs. Availability} + + +Some apps prefer availability, e.g. Amazon products' reviews. +\vfill + +The BASE model trades Consistency \& Isolation for Availability. + + +%Some applications do not care about strong consistency and prefer being highly available (e.g. Amazon's product reviews). + +%In order to achieve higher availability, the BASE model relaxes consistency constraints of the ACID model: "eventual consistency". +\vfill + +\begin{itemize} + \item \textbf{\underline{B}asic \underline{A}vailability}: + The data store thrives to be available. + + \item \textbf{\underline{S}oft-state}: + Replicas can disagree on the valid state. + + \item \textbf{\underline{E}ventual consistency}: + In the absence of write queries, + the data store will eventually converge to a single valid state. +\end{itemize} +\vfill\centering + +Writes are fast, reads are slow. + +\vfill\raggedright + +Examples: key-value \& object stores. + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Concurrent writes in BASE}{Consistency vs. Availability} + +\begin{columns} +\column{.5\columnwidth} + \begin{block}{Object} + \begin{itemize} + \item Unique key + \item Arbitrary value + \item Metadata + \end{itemize} + \end{block} + \vspace{5ex} + + Conflict resolution = client's job! + \vspace{5ex} + + No compound operations. +\column{.5\columnwidth} + \centering + \includegraphics[width=\columnwidth]{figures/conflict_base.pdf} +\end{columns} + +% KV storage is another example, distinction is minor here + +% Object = unique key, arbitrary value, metadata. + +% Object storage only provides semantics to investigate causal order of queries *for individual objects*. No compound operations, no transactions. + +% Much easier to distribute, and "scale-out". + +% Write is fast, read is slow (gotta collect all object versions). + +% \todo{vaccines example with BASE model} + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{Strong Eventual Consistency w/ CRDTs}{Consistency vs. Availability} + +\centering\small + +\fullcite{defago_conflict-free_2011} + +\vfill\raggedright\normalsize + +\begin{block}{Strong Eventual Consistency (SEC)} + \begin{itemize} + \item CRDTs specify distributed operations + \item Conflicts will be solved according to specification + \item Proven \& bound eventual convergence + \end{itemize} +\end{block} + +\vfill\centering +\includegraphics[width=.5\columnwidth]{figures/crdt.pdf} + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Concurrent writes with CRDTs}{Consistency vs. Availability} + +\begin{columns} +\column{.5\columnwidth} + \begin{block}{} + \begin{lstlisting} +CRDT Counter(x0): + history = {} + op. incr(y): + history U= {(UUID(), y)} + op. decr(y): + history U= {(UUID(), -y)} + op. read(): + x = x0 + for (_, y) in history: + x += y + return x + \end{lstlisting} + \end{block} + \vspace{2ex} + + Operations commute? + + $\implies$ screw total order! +\column{.5\columnwidth} + \centering + \includegraphics[width=\columnwidth]{figures/conflict_crdt.pdf} +\end{columns} + +\end{frame} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{A complex CRDT: the DAG}{Consistency vs. Availability} + +\centering +\only<1>{\includegraphics[height=\textheight]{figures/dag_crdt.png}}% +\only<2>{ + Just to say I swept a lot under the rug. + \vfill + + For details, go read: + + \fullcite{defago_conflict-free_2011} + \vfill + + For an implementation, check \textbf{AntidoteDB}. +} + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}{State of the practice}{Path dependency to the ``cloud''} + +\begin{block}{The BASE model is fashionable because} +\centering + +``\emph{High-performance} object storage for \emph{AI analytics} with PBs of \emph{IoT data streams} at the \emph{edge}, using \emph{5G}.'' + % \begin{itemize} + % \item Highest performance + % \item IoT data streams are inherently distributed + % \end{itemize} +\end{block} + +\vfill\centering + +\includegraphics[width=.9\columnwidth]{figures/minio_edge.png} + +\vfill\raggedright + + +%\begin{block}{} +\begin{itemize} + \item Always backed by cloud: high performance network links. + \item Edge nodes always seen as clients or data sources, not peers. +\end{itemize} +%\end{block} + +% There is \textbf{always a central cloud cluster} in these use-cases. + +% Hidden constraint: \textbf{high performance inter-node connectivity}. + + + +\end{frame} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \begin{frame}{A brief history of storage} + +% We keep it short because we'll follow chronological order in the next section too. + +% \end{frame} + + +% \begin{frame}{In the beginning, there were \emph{monoliths}} + +% \includegraphics[width=.5\columnwidth]{figures/stonehenge.jpg} + +% Web applications used to be monolithic: + +% \begin{itemize} +% \item One or two servers; +% \item Availability was not an obsession; +% \item Latency was acceptable. +% \end{itemize} + +% Relational databases were queens. + +% \end{frame} + + +% \begin{frame}{Then came \emph{expectations}} +% Then, the whole world went online, and suddenly: expectations! + +% \begin{itemize} +% \item ``Milliseconds matter.'' (Algolia slogan) +% \item Critical networked services (healthcare, logistics) need 100\% availability +% \end{itemize} + +% $\implies$ Microservices \& horizontal scalability. + +% \todo{Develop on the `herd not sheep' paradigm a bit.} + +% \end{frame} + + +% \begin{frame}{Distributing state/storage: the remaining unknown} + +% The microservices orchestration game works well for \emph{stateless} services. + +% However, any application requires \emph{state}, persistent data. + +% And this is tough. As we will now see. + +% (Not that it's not well studied: distributed storage has always been fashionable.) + +% \end{frame}
\ No newline at end of file diff --git a/doc/talks/2021-04-28_spirals-team/talk.pdf b/doc/talks/2021-04-28_spirals-team/talk.pdf Binary files differnew file mode 100644 index 00000000..051d8f6c --- /dev/null +++ b/doc/talks/2021-04-28_spirals-team/talk.pdf |