From 6b18f55ed827f67a8e6e0b55b14283a886c62307 Mon Sep 17 00:00:00 2001 From: Eric Brewer Date: Fri, 25 Mar 2005 18:16:24 +0000 Subject: [PATCH] figures/edits --- doc/paper2/LLADD.tex | 65 ++++++++++++++++------------------- doc/paper2/bulk-load-raw.pdf | Bin 11538 -> 11559 bytes doc/paper2/bulk-load.pdf | Bin 11197 -> 11215 bytes doc/paper2/mem-pressure.pdf | Bin 8582 -> 8216 bytes 4 files changed, 29 insertions(+), 36 deletions(-) diff --git a/doc/paper2/LLADD.tex b/doc/paper2/LLADD.tex index c6f56e9..68ab39c 100644 --- a/doc/paper2/LLADD.tex +++ b/doc/paper2/LLADD.tex @@ -629,9 +629,10 @@ This implies that the redo information for each operation in the log must contain the physical address (page number) of the information that it modifies, and the portion of the operation executed by a single redo log entry must only rely upon the contents of that -page. (Since we assume that pages are propagated to disk atomically, -the redo phase can rely upon information contained within a single -page.) +page. +% (Since we assume that pages are propagated to disk atomically, +%the redo phase can rely upon information contained within a single +%page.) Once redo completes, we have essentially repeated history: replaying all redo entries to ensure that the page file is in a physically @@ -704,7 +705,7 @@ multithreaded application development. The Lock Manager is flexible enough to also provide index locks for hashtable implementations and more complex locking protocols. -Also, it would be relatively easy to build a strict two-phase +For example, it would be relatively easy to build a strict two-phase locking hierarchical lock manager~\cite{hierarcicalLocking,hierarchicalLockingOnAriesExample} on top of \yad. Such a lock manager would provide isolation guarantees @@ -870,10 +871,12 @@ passed to the function may utilize application-specific properties in order to be significantly smaller than the physical change made to the page. +\eab{add versioned records?} + This forms the basis of \yad's flexible page layouts. We current -support three layouts: a raw page (RawPage), which is just an array of -bytes, a record-oriented page with fixed-size records (FixedPage), and -a slotted-page that support variable-sized records (SlottedPage). +support three layouts: a raw page, which is just an array of +bytes, a record-oriented page with fixed-size records, and +a slotted-page that support variable-sized records. Data structures can pick the layout that is most convenient or implement new layouts. @@ -906,9 +909,9 @@ each update is atomic. For updates that span multiple pages there are two basic By full isolation, we mean that no other transactions see the in-progress updates, which can be trivially acheived with a big lock -around the whole transaction. Given isolation, \yad needs nothing else to +around the whole structure. Given isolation, \yad needs nothing else to make multi-page updates transactional: although many pages might be -modified they will commit or abort as a group and recovered +modified they will commit or abort as a group and be recovered accordingly. However, this level of isolation reduces concurrency within a data @@ -918,8 +921,8 @@ transaction, $A$, rearranged the layout of a data structure, a second transaction, $B$, added a value to the rearranged structure, and then the first transaction aborted. (Note that the structure is not isolated.) While applying physical undo information to the altered -data structure, the $A$ would undo the writes that it performed -without considering the data values and structural changes introduced +data structure, $A$ would undo its writes +without considering the modifications made by $B$, which is likely to cause corruption. At this point, $B$ would have to be aborted as well ({\em cascading aborts}). @@ -935,19 +938,16 @@ action and obtaining appropriate latches at runtime. This approach reduces development of atomic page spanning operations to something very similar to conventional multithreaded development that use mutexes for synchronization. - In particular, we have found a simple recipe for converting a non-concurrent data structure into a concurrent one, which involves three steps: \begin{enumerate} \item Wrap a mutex around each operation. If full transactional isolation with deadlock detection is required, this can be done with the lock - manager. Alternatively, this can be done using pthread mutexes which - provides fine-grain isolation and allows the application to decide - what sort of isolation scheme to use. + manager. Alternatively, this can be done using mutexes for fine-grain isolation. \item Define a logical UNDO for each operation (rather than just using a lower-level physical undo). For example, this is easy for a - hashtable; e.g. the undo for an {\em insert} is {\em remove}. + hashtable; e.g. the UNDO for an {\em insert} is {\em remove}. \item For mutating operations (not read-only), add a ``begin nested top action'' right after the mutex acquisition, and a ``commit nested top action'' right before the mutex is released. @@ -956,10 +956,9 @@ This recipe ensures that operations that might span multiple pages atomically apply and commit any structural changes and thus avoids cascading aborts. If the transaction that encloses the operations aborts, the logical undo will {\em compensate} for -its effects, but leave its structural changes intact (or augment -them). Note that by releasing the mutex before we commit, we are +its effects, but leave its structural changes intact. Note that by releasing the mutex before we commit, we are violating strict two-phase locking in exchange for better performance -and support for deadlock avoidance schemes. +and support for deadlock avoidance. We have found the recipe to be easy to follow and very effective, and we use it everywhere our concurrent data structures may make structural changes, such as growing a hash table or array. @@ -1028,7 +1027,7 @@ while Undo operations use these or logical names/keys or ``big locks'' (which drastically reduce concurrency) for multi-page updates. \end{enumerate} -\subsubsection{Example: Increment/Decrement} +\noindent{\bf An Example: Increment/Decrement} A common optimization for TPC benchmarks is to provide hand-built operations that support adding/subtracting from an account. Such @@ -1046,7 +1045,6 @@ typedef struct { \noindent {\normalsize Here is the increment operation; decrement is analogous:} \begin{verbatim} - // p is the bufferPool's current copy of the page. int operateIncrement(int xid, Page* p, lsn_t lsn, recordid rid, const void *d) { @@ -1075,7 +1073,7 @@ ops[OP_INCREMENT].redoOperation = OP_INCREMENT; // set UNDO to be the inverse ops[OP_INCREMENT].undoOperation = OP_DECREMENT; \end{verbatim} -\noindent {\normalsize Finally, here is the wrapper that uses the +{\normalsize Finally, here is the wrapper that uses the operation, which is indentified via {\small\tt OP\_INCREMENT}; applications use the wrapper rather than the operation, as it tends to be cleaner.} @@ -1097,9 +1095,6 @@ int Tincrement(int xid, recordid rid, int amount) { \end{verbatim} \end{small} - -\subsubsection{Correctness} - With some examination it is possible to show that this example meets the invariants. In addition, because the redo code is used for normal operation, most bugs are easy to find with conventional testing @@ -1282,15 +1277,13 @@ similar to \yad, and it was designed for high-performance, high-concurrency environments. All benchmarks were run on an Intel Xeon 2.8 GHz with 1GB of RAM and a -10K RPM SCSI drive, formatted with reiserfs\footnote{We found that -the relative performance of Berkeley DB and \yad is highly sensitive -to filesystem choice, and we plan to investigate the reasons why the +10K RPM SCSI drive, formatted with reiserfs\footnote{We found that the +relative performance of Berkeley DB and \yad is highly sensitive to +filesystem choice, and we plan to investigate the reasons why the performance of \yad under ext3 is degraded. However, the results relating to the \yad optimizations are consistent across filesystem -types.}. -All reported numbers -correspond to the mean of multiple runs and represent a 95\% -confidence interval with a standard deviation of +/- 5\%. +types.}. All reported numbers correspond to the mean of multiple runs +with a 95\% confidence interval with a half-width of 5\%. We used Berkeley DB 4.2.52 as it existed in Debian Linux's testing branch during March of 2005, with the flags DB\_TXN\_SYNC, and DB\_THREAD @@ -1356,7 +1349,7 @@ reproduce the trends reported here on multiple systems. Hash table indices are common in databases and are also applicable to a large number of applications. In this section, we describe how we -implemented two variants of Linear Hash tables on top of \yad and +implemented two variants of linear hash tables on top of \yad and describe how \yad's flexible page and log formats enable interesting optimizations. We also argue that \yad makes it trivial to produce concurrent data structure implementations. @@ -1374,7 +1367,7 @@ hash table in order to this emphasize that it is easy to implement high-performance transactional data structures with \yad and because it is easy to understand. -We decided to implement a {\em linear} hash table. Linear hash tables are +We decided to implement a {\em linear} hash table~\cite{lht}. Linear hash tables are hash tables that are able to extend their bucket list incrementally at runtime. They work as follows. Imagine that we want to double the size of a hash table of size $2^{n}$ and that the hash table has been @@ -1392,11 +1385,11 @@ we know that the contents of each bucket, $m$, will be split between bucket $m$ and bucket $m+2^{n}$. Therefore, if we keep track of the last bucket that was split then we can split a few buckets at a time, resizing the hash -table without introducing long pauses.~\cite{lht}. +table without introducing long pauses~\cite{lht}. In order to implement this scheme we need two building blocks. We need a data structure that can handle bucket overflow, and we need to -be able index into an expandible set of buckets using the bucket +be able index into an expandable set of buckets using the bucket number. \subsection{The Bucket List} diff --git a/doc/paper2/bulk-load-raw.pdf b/doc/paper2/bulk-load-raw.pdf index 4f0e44be15a127f68ae0114612cc543fc1e2ff04..1800b31ac543518f1fdbd5ffd9dda815ff17bdd4 100644 GIT binary patch delta 4774 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 diff --git a/doc/paper2/mem-pressure.pdf b/doc/paper2/mem-pressure.pdf index 65e3d7c46b3840dea67ed9cd560df242ff21a53a..aabacbf1ecfe1fddd4a5fd49cf309a8443599077 100644 GIT binary patch delta 2910 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