Address some feedback on paper
All checks were successful
Tests / Clang total: 1130, passed: 1130
Clang |Total|New|Outstanding|Fixed|Trend
|:-:|:-:|:-:|:-:|:-:
|0|0|0|0|:clap:
Tests / SIMD fallback total: 1130, passed: 1130
Tests / Release [gcc] total: 1130, passed: 1130
GNU C Compiler (gcc) |Total|New|Outstanding|Fixed|Trend
|:-:|:-:|:-:|:-:|:-:
|0|0|0|0|:clap:
Tests / Release [gcc,aarch64] total: 844, passed: 844
Tests / Coverage total: 848, passed: 848
weaselab/conflict-set/pipeline/head This commit looks good
All checks were successful
Tests / Clang total: 1130, passed: 1130
Clang |Total|New|Outstanding|Fixed|Trend
|:-:|:-:|:-:|:-:|:-:
|0|0|0|0|:clap:
Tests / SIMD fallback total: 1130, passed: 1130
Tests / Release [gcc] total: 1130, passed: 1130
GNU C Compiler (gcc) |Total|New|Outstanding|Fixed|Trend
|:-:|:-:|:-:|:-:|:-:
|0|0|0|0|:clap:
Tests / Release [gcc,aarch64] total: 844, passed: 844
Tests / Coverage total: 848, passed: 848
weaselab/conflict-set/pipeline/head This commit looks good
This commit is contained in:
@@ -33,8 +33,41 @@ This implementation is available at \url{https://git.weaselab.dev/weaselab/confl
|
|||||||
|
|
||||||
Let's begin by considering design options for \emph{lastCommit}.
|
Let's begin by considering design options for \emph{lastCommit}.
|
||||||
In order to manage half-open intervals we need an ordered data structure, so hash tables are out of consideration.
|
In order to manage half-open intervals we need an ordered data structure, so hash tables are out of consideration.
|
||||||
For any ordered data structure we can implement \emph{lastCommit} using a representation where a logical key is mapped to the value of the last physical key less than or equal to the logical key.
|
For any ordered data structure we can implement \emph{lastCommit} using a representation where a logical key range (figure \ref{fig:logicalrangemap}) is mapped so that the value of a key is the value of the last physical key (figure \ref{fig:physicalrangemap}) less than or equal to the key.
|
||||||
This is a standard technique used throughout FoundationDB.
|
This is a standard technique used throughout FoundationDB called a \emph{range map}.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\caption{Physical structure of range map}
|
||||||
|
\label{fig:physicalrangemap}
|
||||||
|
\centering
|
||||||
|
\begin{tikzpicture}
|
||||||
|
\draw[-latex] (-3.5,0) -- (3.5,0);
|
||||||
|
\foreach \x [count=\xi from 0] in {\epsilon, a, b}
|
||||||
|
{
|
||||||
|
\draw[shift={(\xi * 2.333 - 3.5,0)},color=black] (0pt,3pt) -- (0pt,-3pt);
|
||||||
|
\node[] at (\xi * 2.333 - 3.5,0.5) {$\x$};
|
||||||
|
\node[anchor=west] at (\xi * 2.333 - 3.5,-0.5) {$\x \mapsto \xi$};
|
||||||
|
};
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\caption{Logical structure of range map}
|
||||||
|
\label{fig:logicalrangemap}
|
||||||
|
\centering
|
||||||
|
\begin{tikzpicture}
|
||||||
|
\draw[-latex] (-3.5,0) -- (3.5,0);
|
||||||
|
\foreach \x [count=\xi from 0] in {\epsilon, a, b}
|
||||||
|
{
|
||||||
|
\draw[shift={(\xi * 2.333 - 3.5,0)},color=black] (0pt,3pt) -- (0pt,-3pt);
|
||||||
|
\node[] at (\xi * 2.333 - 3.5,0.5) {$\x$};
|
||||||
|
};
|
||||||
|
\foreach \x [count=\xi from 0] in {{$[\epsilon, a) \mapsto \xi$}, {$[a, b) \mapsto \xi$}, {$[b, \infty) \mapsto \xi$}}
|
||||||
|
{
|
||||||
|
\node[anchor=west] at (\xi * 2.333 - 3.5,-0.5) {\x};
|
||||||
|
};
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
The problem with applying this to an off-the-shelf ordered data structure is that checking a read range is linear in the number of intersecting physical keys.
|
The problem with applying this to an off-the-shelf ordered data structure is that checking a read range is linear in the number of intersecting physical keys.
|
||||||
Scanning through every recent point write intersecting a large range read would make conflict checking unacceptably slow for high-write-throughput workloads.
|
Scanning through every recent point write intersecting a large range read would make conflict checking unacceptably slow for high-write-throughput workloads.
|
||||||
@@ -204,7 +237,7 @@ Libfuzzer's minimized corpus achieves 98\% line coverage on its own.
|
|||||||
We regenerate the corpus on an ad hoc basis by running libfuzzer for a few cpu-hours, during which it tests millions of unique inputs.
|
We regenerate the corpus on an ad hoc basis by running libfuzzer for a few cpu-hours, during which it tests millions of unique inputs.
|
||||||
|
|
||||||
In addition to asserting correct externally-visible behavior, in each of these tests we assert that internal invariants hold between operations.
|
In addition to asserting correct externally-visible behavior, in each of these tests we assert that internal invariants hold between operations.
|
||||||
We also use address sanitizer \cite{10.5555/2342821.2342849} to detect memory errors, undefined behavior sanitizer \cite{ubsan} to detect invocations of undefined behavior, and thread sanitizer \cite{10.1145/1791194.1791203} (while exercising concurrent access as allowed by the documented contract) to detect data-race-related undefined behavior.
|
We also use address sanitizer \cite{10.5555/2342821.2342849} to detect memory errors, undefined behavior sanitizer \cite{ubsan} to detect invocations of undefined behavior, and thread sanitizer \cite{10.1145/1791194.1791203} (while exercising concurrent access as allowed by the contract documented in the c++ header file) to detect data-race-related undefined behavior.
|
||||||
|
|
||||||
Each of these sanitizers is implemented using compiler instrumentation, which means that they are not testing the final binary artifact that will be run in production.
|
Each of these sanitizers is implemented using compiler instrumentation, which means that they are not testing the final binary artifact that will be run in production.
|
||||||
Therefore we also run the test inputs linking directly to the final release artifact, both standalone and under valgrind \cite{10.5555/1247360.1247362}.
|
Therefore we also run the test inputs linking directly to the final release artifact, both standalone and under valgrind \cite{10.5555/1247360.1247362}.
|
||||||
|
Reference in New Issue
Block a user