Compare commits
4 Commits
fd93300ce8
...
309d315956
| Author | SHA1 | Date | |
|---|---|---|---|
| 309d315956 | |||
| eab2e46a56 | |||
| 85db1a8786 | |||
| 717f9d6829 |
@@ -261,13 +261,14 @@ if(BUILD_TESTING)
|
||||
|
||||
# scripted tests. Written manually to fill in anything libfuzzer couldn't
|
||||
# find.
|
||||
add_executable(script_test ScriptTest.cpp)
|
||||
target_compile_options(script_test PRIVATE ${TEST_FLAGS})
|
||||
target_link_libraries(script_test PRIVATE ${PROJECT_NAME})
|
||||
file(GLOB SCRIPT_TESTS ${CMAKE_SOURCE_DIR}/script_tests/*)
|
||||
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
||||
execute_process(
|
||||
COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/test_conflict_set.py list
|
||||
OUTPUT_VARIABLE SCRIPT_TESTS)
|
||||
foreach(TEST ${SCRIPT_TESTS})
|
||||
get_filename_component(name ${TEST} NAME)
|
||||
add_test(NAME conflict_set_script_${name} COMMAND script_test ${TEST})
|
||||
add_test(NAME script_test_${TEST}
|
||||
COMMAND ${Python3_EXECUTABLE}
|
||||
${CMAKE_SOURCE_DIR}/test_conflict_set.py test ${TEST})
|
||||
endforeach()
|
||||
|
||||
find_program(VALGRIND_EXE valgrind)
|
||||
|
||||
@@ -2510,6 +2510,10 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||
}
|
||||
|
||||
explicit Impl(int64_t oldestVersion) : oldestVersion(oldestVersion) {
|
||||
#if DEBUG_VERBOSE
|
||||
fprintf(stderr, "radix_tree: create\n");
|
||||
#endif
|
||||
|
||||
// Insert ""
|
||||
root = allocators.node0.allocate(0);
|
||||
root->numChildren = 0;
|
||||
@@ -2524,7 +2528,12 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||
root->entry.pointVersion = oldestVersion;
|
||||
root->entry.rangeVersion = oldestVersion;
|
||||
}
|
||||
~Impl() { destroyTree(root); }
|
||||
~Impl() {
|
||||
#if DEBUG_VERBOSE
|
||||
fprintf(stderr, "radix_tree: destroy\n");
|
||||
#endif
|
||||
destroyTree(root);
|
||||
}
|
||||
|
||||
NodeAllocators allocators;
|
||||
|
||||
@@ -2647,17 +2656,27 @@ ConflictSet_check(void *cs, const ConflictSet_ReadRange *reads,
|
||||
__attribute__((__visibility__("default"))) void
|
||||
ConflictSet_addWrites(void *cs, const ConflictSet_WriteRange *writes, int count,
|
||||
int64_t writeVersion) {
|
||||
auto *impl = ((ConflictSet::Impl *)cs);
|
||||
auto *impl = (ConflictSet::Impl *)cs;
|
||||
mallocBytesDelta = 0;
|
||||
impl->addWrites(writes, count, writeVersion);
|
||||
impl->totalBytes += mallocBytesDelta;
|
||||
#if SHOW_MEMORY
|
||||
if (impl->totalBytes != mallocBytes) {
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
__attribute__((__visibility__("default"))) void
|
||||
ConflictSet_setOldestVersion(void *cs, int64_t oldestVersion) {
|
||||
auto *impl = ((ConflictSet::Impl *)cs);
|
||||
auto *impl = (ConflictSet::Impl *)cs;
|
||||
mallocBytesDelta = 0;
|
||||
impl->setOldestVersion(oldestVersion);
|
||||
impl->totalBytes += mallocBytesDelta;
|
||||
#if SHOW_MEMORY
|
||||
if (impl->totalBytes != mallocBytes) {
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
__attribute__((__visibility__("default"))) void *
|
||||
ConflictSet_create(int64_t oldestVersion) {
|
||||
@@ -2995,6 +3014,7 @@ void removeKey(Node *n) {
|
||||
|
||||
struct __attribute__((visibility("default"))) PeakPrinter {
|
||||
~PeakPrinter() {
|
||||
printf("--- radix_tree ---\n");
|
||||
printf("malloc bytes: %g\n", double(mallocBytes));
|
||||
printf("Peak malloc bytes: %g\n", double(peakMallocBytes));
|
||||
printf("Node bytes: %g\n", double(nodeBytes));
|
||||
|
||||
155
ScriptTest.cpp
155
ScriptTest.cpp
@@ -1,155 +0,0 @@
|
||||
#include "Internal.h"
|
||||
#include <ConflictSet.h>
|
||||
|
||||
#include <chrono>
|
||||
#include <cstring>
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <vector>
|
||||
|
||||
inline size_t getPageSize() {
|
||||
static size_t kPageSize = sysconf(_SC_PAGESIZE);
|
||||
return kPageSize;
|
||||
}
|
||||
|
||||
/// Helper for rounding up to page size (or some other alignment)
|
||||
constexpr inline size_t rightAlign(size_t offset, size_t alignment) {
|
||||
return offset % alignment == 0 ? offset
|
||||
: ((offset / alignment) + 1) * alignment;
|
||||
}
|
||||
|
||||
using StringView = std::basic_string_view<uint8_t>;
|
||||
|
||||
inline StringView operator"" _v(const char *str, size_t size) {
|
||||
return {reinterpret_cast<const uint8_t *>(str), size};
|
||||
}
|
||||
|
||||
int main(int argc, const char **argv) {
|
||||
|
||||
ConflictSet cs{0};
|
||||
ReferenceImpl ref{0};
|
||||
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
int fd = open(argv[i], O_RDONLY);
|
||||
struct stat st;
|
||||
if (fstat(fd, &st) == -1) {
|
||||
int err = errno;
|
||||
fprintf(stderr, "stat error %s - %s\n", argv[i], strerror(err));
|
||||
fflush(stderr);
|
||||
abort();
|
||||
}
|
||||
|
||||
int64_t size = rightAlign(st.st_size, getPageSize());
|
||||
const uint8_t *begin =
|
||||
(uint8_t *)mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
madvise((void *)begin, size, MADV_SEQUENTIAL);
|
||||
auto *const mapOriginal = begin;
|
||||
const auto sizeOriginal = size;
|
||||
|
||||
StringView b;
|
||||
StringView e;
|
||||
int64_t v = 0;
|
||||
int64_t lastWriteVersion = 0;
|
||||
int64_t lastOldestVersion = 0;
|
||||
std::vector<ConflictSet::WriteRange> writeRanges;
|
||||
std::vector<ConflictSet::ReadRange> readRanges;
|
||||
std::vector<ConflictSet::Result> results;
|
||||
|
||||
for (uint8_t *end = (uint8_t *)memchr(begin, '\n', size); end != nullptr;) {
|
||||
StringView line{begin, static_cast<size_t>(end - begin)};
|
||||
size -= end - begin + 1;
|
||||
begin = end + 1;
|
||||
end = (uint8_t *)memchr(begin, '\n', size);
|
||||
|
||||
if (line.starts_with("begin"_v)) {
|
||||
b = line.substr("begin "_v.size(), line.size());
|
||||
printf("b <- %.*s\n", int(b.size()), b.data());
|
||||
} else if (line.starts_with("end"_v)) {
|
||||
e = line.substr("end "_v.size(), line.size());
|
||||
printf("e <- %.*s\n", int(e.size()), e.data());
|
||||
} else if (line.starts_with("version"_v)) {
|
||||
line = line.substr("version "_v.size(), line.size());
|
||||
v = 0;
|
||||
for (auto c : line) {
|
||||
v = v * 10 + int(c) - int('0');
|
||||
}
|
||||
printf("v <- %" PRId64 "\n", v);
|
||||
} else if (line.starts_with("pointread"_v)) {
|
||||
printf("pointread\n");
|
||||
ConflictSet::ReadRange r;
|
||||
r.begin.p = b.data();
|
||||
r.begin.len = b.size();
|
||||
r.end.len = 0;
|
||||
r.readVersion = v;
|
||||
readRanges.push_back(r);
|
||||
} else if (line.starts_with("pointwrite"_v)) {
|
||||
printf("pointwrite\n");
|
||||
assert(writeRanges.empty() ||
|
||||
(writeRanges.back().end.len == 0 ? writeRanges.back().begin
|
||||
: writeRanges.back().end) < b);
|
||||
ConflictSet::WriteRange w;
|
||||
w.begin.p = b.data();
|
||||
w.begin.len = b.size();
|
||||
w.end.len = 0;
|
||||
writeRanges.push_back(w);
|
||||
} else if (line.starts_with("rangeread"_v)) {
|
||||
printf("rangeread\n");
|
||||
ConflictSet::ReadRange r;
|
||||
r.begin.p = b.data();
|
||||
r.begin.len = b.size();
|
||||
r.end.p = e.data();
|
||||
r.end.len = e.size();
|
||||
r.readVersion = v;
|
||||
readRanges.push_back(r);
|
||||
} else if (line.starts_with("rangewrite"_v)) {
|
||||
printf("rangewrite\n");
|
||||
assert(b < e);
|
||||
assert(writeRanges.empty() ||
|
||||
(writeRanges.back().end.len == 0 ? writeRanges.back().begin
|
||||
: writeRanges.back().end) < b);
|
||||
ConflictSet::WriteRange w;
|
||||
w.begin.p = b.data();
|
||||
w.begin.len = b.size();
|
||||
w.end.p = e.data();
|
||||
w.end.len = e.size();
|
||||
writeRanges.push_back(w);
|
||||
} else if (line.starts_with("check"_v)) {
|
||||
printf("check\n");
|
||||
Arena arena;
|
||||
auto *expected = new (arena) ConflictSet::Result[readRanges.size()];
|
||||
auto *actual = new (arena) ConflictSet::Result[readRanges.size()];
|
||||
ref.check(readRanges.data(), expected, readRanges.size());
|
||||
cs.check(readRanges.data(), actual, readRanges.size());
|
||||
for (int i = 0; i < int(readRanges.size()); ++i) {
|
||||
if (expected[i] != actual[i]) {
|
||||
fprintf(stderr, "Expected %s, got %s at index %d\n",
|
||||
resultToStr(expected[i]), resultToStr(actual[i]), i);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
readRanges = {};
|
||||
} else if (line.starts_with("addwrites"_v)) {
|
||||
printf("addwrites\n");
|
||||
assert(v > lastWriteVersion);
|
||||
lastWriteVersion = v;
|
||||
cs.addWrites(writeRanges.data(), writeRanges.size(), v);
|
||||
ref.addWrites(writeRanges.data(), writeRanges.size(), v);
|
||||
writeRanges = {};
|
||||
} else if (line.starts_with("setoldest"_v)) {
|
||||
printf("setoldest\n");
|
||||
assert(v > lastOldestVersion);
|
||||
lastOldestVersion = v;
|
||||
cs.setOldestVersion(v);
|
||||
ref.setOldestVersion(v);
|
||||
} else if (line.empty() || line.starts_with(";"_v)) {
|
||||
// skip
|
||||
} else {
|
||||
printf("Unrecognized line: %.*s\n", int(line.size()), line.data());
|
||||
}
|
||||
}
|
||||
munmap((void *)mapOriginal, sizeOriginal);
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
38
SkipList.cpp
38
SkipList.cpp
@@ -16,6 +16,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* This source code is modified to compile outside of FoundationDB
|
||||
*/
|
||||
|
||||
#include "ConflictSet.h"
|
||||
@@ -268,13 +270,21 @@ public:
|
||||
}
|
||||
|
||||
explicit SkipList(Version version = 0) {
|
||||
#if DEBUG_VERBOSE
|
||||
fprintf(stderr, "skip_list: create\n");
|
||||
#endif
|
||||
header = Node::create(StringRef(), MaxLevels - 1);
|
||||
for (int l = 0; l < MaxLevels; l++) {
|
||||
header->setNext(l, nullptr);
|
||||
header->setMaxVersion(l, version);
|
||||
}
|
||||
}
|
||||
~SkipList() { destroy(); }
|
||||
~SkipList() {
|
||||
#if DEBUG_VERBOSE
|
||||
fprintf(stderr, "skip_list: destroy\n");
|
||||
#endif
|
||||
destroy();
|
||||
}
|
||||
SkipList(SkipList &&other) noexcept : header(other.header) {
|
||||
other.header = nullptr;
|
||||
}
|
||||
@@ -702,16 +712,35 @@ ConflictSet_check(void *cs, const ConflictSet_ReadRange *reads,
|
||||
__attribute__((__visibility__("default"))) void
|
||||
ConflictSet_addWrites(void *cs, const ConflictSet_WriteRange *writes, int count,
|
||||
int64_t writeVersion) {
|
||||
((ConflictSet::Impl *)cs)->addWrites(writes, count, writeVersion);
|
||||
auto *impl = (ConflictSet::Impl *)cs;
|
||||
mallocBytesDelta = 0;
|
||||
impl->addWrites(writes, count, writeVersion);
|
||||
impl->totalBytes += mallocBytesDelta;
|
||||
#if SHOW_MEMORY
|
||||
if (impl->totalBytes != mallocBytes) {
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
__attribute__((__visibility__("default"))) void
|
||||
ConflictSet_setOldestVersion(void *cs, int64_t oldestVersion) {
|
||||
((ConflictSet::Impl *)cs)->setOldestVersion(oldestVersion);
|
||||
auto *impl = (ConflictSet::Impl *)cs;
|
||||
mallocBytesDelta = 0;
|
||||
impl->setOldestVersion(oldestVersion);
|
||||
impl->totalBytes += mallocBytesDelta;
|
||||
#if SHOW_MEMORY
|
||||
if (impl->totalBytes != mallocBytes) {
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
__attribute__((__visibility__("default"))) void *
|
||||
ConflictSet_create(int64_t oldestVersion) {
|
||||
return new (safe_malloc(sizeof(ConflictSet::Impl)))
|
||||
mallocBytesDelta = 0;
|
||||
auto *result = new (safe_malloc(sizeof(ConflictSet::Impl)))
|
||||
ConflictSet::Impl{oldestVersion};
|
||||
result->totalBytes += mallocBytesDelta;
|
||||
return result;
|
||||
}
|
||||
__attribute__((__visibility__("default"))) void ConflictSet_destroy(void *cs) {
|
||||
using Impl = ConflictSet::Impl;
|
||||
@@ -728,6 +757,7 @@ ConflictSet_getBytes(void *cs) {
|
||||
#if SHOW_MEMORY
|
||||
struct __attribute__((visibility("default"))) PeakPrinter {
|
||||
~PeakPrinter() {
|
||||
printf("--- skip_list ---\n");
|
||||
printf("malloc bytes: %g\n", double(mallocBytes));
|
||||
printf("Peak malloc bytes: %g\n", double(peakMallocBytes));
|
||||
}
|
||||
|
||||
113
conflict_set.py
113
conflict_set.py
@@ -4,22 +4,6 @@ import os
|
||||
|
||||
from typing import Optional
|
||||
|
||||
_lib = None
|
||||
for f in (
|
||||
os.path.dirname(__file__) + "/build/radix_tree/libconflict-set.so.0",
|
||||
os.path.dirname(__file__) + "/build/radix_tree/libconflict-set.0.dylib",
|
||||
):
|
||||
try:
|
||||
_lib = ctypes.cdll.LoadLibrary(f)
|
||||
except:
|
||||
pass
|
||||
|
||||
if _lib is None:
|
||||
import sys
|
||||
|
||||
print("Could not find libconflict-set", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
class _Key(ctypes.Structure):
|
||||
_fields_ = [("p", ctypes.POINTER(ctypes.c_ubyte)), ("len", ctypes.c_int)]
|
||||
@@ -37,31 +21,6 @@ class WriteRange(ctypes.Structure):
|
||||
_fields_ = [("begin", _Key), ("end", _Key)]
|
||||
|
||||
|
||||
_lib.ConflictSet_create.argtypes = (ctypes.c_int64,)
|
||||
_lib.ConflictSet_create.restype = ctypes.c_void_p
|
||||
|
||||
_lib.ConflictSet_check.argtypes = (
|
||||
ctypes.c_void_p,
|
||||
ctypes.POINTER(ReadRange),
|
||||
ctypes.POINTER(ctypes.c_int),
|
||||
ctypes.c_int,
|
||||
)
|
||||
|
||||
_lib.ConflictSet_addWrites.argtypes = (
|
||||
ctypes.c_void_p,
|
||||
ctypes.POINTER(WriteRange),
|
||||
ctypes.c_int,
|
||||
ctypes.c_int64,
|
||||
)
|
||||
|
||||
_lib.ConflictSet_setOldestVersion.argtypes = (ctypes.c_void_p, ctypes.c_int64)
|
||||
|
||||
_lib.ConflictSet_destroy.argtypes = (ctypes.c_void_p,)
|
||||
|
||||
_lib.ConflictSet_getBytes.argtypes = (ctypes.c_void_p,)
|
||||
_lib.ConflictSet_getBytes.restype = ctypes.c_int64
|
||||
|
||||
|
||||
class Result(enum.Enum):
|
||||
COMMIT = 0
|
||||
CONFLICT = 1
|
||||
@@ -93,34 +52,86 @@ def read(version: int, begin: bytes, end: Optional[bytes] = None) -> ReadRange:
|
||||
|
||||
|
||||
class ConflictSet:
|
||||
def __init__(self, version: int = 0) -> None:
|
||||
self.p = _lib.ConflictSet_create(version)
|
||||
def __init__(self, version: int = 0, implementation: Optional[str] = None) -> None:
|
||||
self._lib = None
|
||||
if implementation is None:
|
||||
implementation = "radix_tree"
|
||||
for f in (
|
||||
os.path.dirname(__file__)
|
||||
+ "/build/"
|
||||
+ implementation
|
||||
+ "/libconflict-set.so.0",
|
||||
os.path.dirname(__file__)
|
||||
+ "/build/"
|
||||
+ implementation
|
||||
+ "/libconflict-set.0.dylib",
|
||||
):
|
||||
try:
|
||||
self._lib = ctypes.cdll.LoadLibrary(f)
|
||||
except:
|
||||
pass
|
||||
|
||||
if self._lib is None:
|
||||
import sys
|
||||
|
||||
print(
|
||||
"Could not find libconflict-set implementation " + implementation,
|
||||
file=sys.stderr,
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
self._lib.ConflictSet_create.argtypes = (ctypes.c_int64,)
|
||||
self._lib.ConflictSet_create.restype = ctypes.c_void_p
|
||||
|
||||
self._lib.ConflictSet_check.argtypes = (
|
||||
ctypes.c_void_p,
|
||||
ctypes.POINTER(ReadRange),
|
||||
ctypes.POINTER(ctypes.c_int),
|
||||
ctypes.c_int,
|
||||
)
|
||||
|
||||
self._lib.ConflictSet_addWrites.argtypes = (
|
||||
ctypes.c_void_p,
|
||||
ctypes.POINTER(WriteRange),
|
||||
ctypes.c_int,
|
||||
ctypes.c_int64,
|
||||
)
|
||||
|
||||
self._lib.ConflictSet_setOldestVersion.argtypes = (
|
||||
ctypes.c_void_p,
|
||||
ctypes.c_int64,
|
||||
)
|
||||
|
||||
self._lib.ConflictSet_destroy.argtypes = (ctypes.c_void_p,)
|
||||
|
||||
self._lib.ConflictSet_getBytes.argtypes = (ctypes.c_void_p,)
|
||||
self._lib.ConflictSet_getBytes.restype = ctypes.c_int64
|
||||
|
||||
self.p = self._lib.ConflictSet_create(version)
|
||||
|
||||
def addWrites(self, version: int, *writes: WriteRange):
|
||||
_lib.ConflictSet_addWrites(
|
||||
self._lib.ConflictSet_addWrites(
|
||||
self.p, (WriteRange * len(writes))(*writes), len(writes), version
|
||||
)
|
||||
|
||||
def check(self, *reads: ReadRange) -> list[Result]:
|
||||
r = (ctypes.c_int * len(reads))()
|
||||
_lib.ConflictSet_check(self.p, *reads, r, 1)
|
||||
self._lib.ConflictSet_check(self.p, *reads, r, 1)
|
||||
return [Result(x) for x in r]
|
||||
|
||||
def setOldestVersion(self, version: int) -> None:
|
||||
_lib.ConflictSet_setOldestVersion(self.p, version)
|
||||
self._lib.ConflictSet_setOldestVersion(self.p, version)
|
||||
|
||||
def getBytes(self) -> int:
|
||||
return _lib.ConflictSet_getBytes(self.p)
|
||||
return self._lib.ConflictSet_getBytes(self.p)
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def close(self) -> None:
|
||||
if self.p is not None:
|
||||
_lib.ConflictSet_destroy(self.p)
|
||||
self._lib.ConflictSet_destroy(self.p)
|
||||
self.p = None
|
||||
|
||||
def __exit__(self, exception_type, exception_value, exception_traceback):
|
||||
if self.p is not None:
|
||||
_lib.ConflictSet_destroy(self.p)
|
||||
self.p = None
|
||||
self.close()
|
||||
|
||||
@@ -1,262 +0,0 @@
|
||||
|
||||
; Create a node with a large partial key capacity
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
pointwrite
|
||||
|
||||
; Make it a Node256
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaA
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaB
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaC
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaD
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaE
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaF
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaG
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaH
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaI
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJ
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaK
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaL
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaM
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaN
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaO
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaP
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQ
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaR
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaS
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaT
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaU
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaV
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaW
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaX
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaY
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZ
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaae
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaf
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaai
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaj
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaak
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaam
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaan
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaao
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaap
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaq
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaat
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaau
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaav
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaw
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaax
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz
|
||||
pointwrite
|
||||
version 1
|
||||
addwrites
|
||||
|
||||
; Lower its partial key length
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
pointwrite
|
||||
|
||||
version 2
|
||||
addwrites
|
||||
|
||||
; Create work for setoldest
|
||||
|
||||
begin x
|
||||
end y
|
||||
rangewrite
|
||||
version 3
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 4
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 5
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 6
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 7
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 8
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 9
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 10
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 11
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 12
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 13
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 14
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 15
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 16
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 17
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 18
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 19
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 20
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 21
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 22
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 23
|
||||
addwrites
|
||||
|
||||
version 1
|
||||
setoldest
|
||||
@@ -1,147 +0,0 @@
|
||||
; Create a node with a large partial key capacity
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0
|
||||
pointwrite
|
||||
|
||||
; Make it a Node48
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaae
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaf
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaai
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaj
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaak
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaam
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaan
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaao
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaap
|
||||
pointwrite
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaq
|
||||
pointwrite
|
||||
version 2
|
||||
addwrites
|
||||
|
||||
; Lower its partial key length
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
pointwrite
|
||||
|
||||
version 3
|
||||
addwrites
|
||||
|
||||
; Create work for setoldest
|
||||
|
||||
begin x
|
||||
end y
|
||||
rangewrite
|
||||
version 4
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 5
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 6
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 7
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 8
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 9
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 10
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 11
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 12
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 13
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 14
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 15
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 16
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 17
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 18
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 19
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 20
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 21
|
||||
addwrites
|
||||
|
||||
rangewrite
|
||||
version 22
|
||||
addwrites
|
||||
|
||||
version 1
|
||||
setoldest
|
||||
@@ -1,124 +0,0 @@
|
||||
begin
|
||||
pointwrite
|
||||
begin 0
|
||||
pointwrite
|
||||
begin 00
|
||||
pointwrite
|
||||
begin 00A
|
||||
pointwrite
|
||||
begin 00B
|
||||
pointwrite
|
||||
begin 00C
|
||||
pointwrite
|
||||
begin 00D
|
||||
pointwrite
|
||||
begin 00E
|
||||
pointwrite
|
||||
begin 00F
|
||||
pointwrite
|
||||
begin 00G
|
||||
pointwrite
|
||||
begin 00H
|
||||
pointwrite
|
||||
begin 00I
|
||||
pointwrite
|
||||
begin 00J
|
||||
pointwrite
|
||||
begin 00K
|
||||
pointwrite
|
||||
begin 00L
|
||||
pointwrite
|
||||
begin 00M
|
||||
pointwrite
|
||||
begin 00N
|
||||
pointwrite
|
||||
begin 00O
|
||||
pointwrite
|
||||
begin 00P
|
||||
pointwrite
|
||||
begin 00Q
|
||||
pointwrite
|
||||
begin 00R
|
||||
pointwrite
|
||||
begin 00S
|
||||
pointwrite
|
||||
begin 00T
|
||||
pointwrite
|
||||
begin 00U
|
||||
pointwrite
|
||||
begin 00V
|
||||
pointwrite
|
||||
begin 00W
|
||||
pointwrite
|
||||
begin 00X
|
||||
pointwrite
|
||||
begin 00Y
|
||||
pointwrite
|
||||
begin 00Z
|
||||
pointwrite
|
||||
begin 00a
|
||||
pointwrite
|
||||
begin 00b
|
||||
pointwrite
|
||||
begin 00c
|
||||
pointwrite
|
||||
begin 00d
|
||||
pointwrite
|
||||
begin 00e
|
||||
pointwrite
|
||||
begin 00f
|
||||
pointwrite
|
||||
begin 00g
|
||||
pointwrite
|
||||
begin 00h
|
||||
pointwrite
|
||||
begin 00i
|
||||
pointwrite
|
||||
begin 00j
|
||||
pointwrite
|
||||
begin 00k
|
||||
pointwrite
|
||||
begin 00l
|
||||
pointwrite
|
||||
begin 00m
|
||||
pointwrite
|
||||
begin 00n
|
||||
pointwrite
|
||||
begin 00o
|
||||
pointwrite
|
||||
begin 00p
|
||||
pointwrite
|
||||
begin 00q
|
||||
pointwrite
|
||||
begin 00r
|
||||
pointwrite
|
||||
begin 00s
|
||||
pointwrite
|
||||
begin 00t
|
||||
pointwrite
|
||||
begin 00u
|
||||
pointwrite
|
||||
begin 00v
|
||||
pointwrite
|
||||
begin 00w
|
||||
pointwrite
|
||||
begin 00x
|
||||
pointwrite
|
||||
begin 00y
|
||||
pointwrite
|
||||
begin 00z
|
||||
pointwrite
|
||||
version 1
|
||||
addwrites
|
||||
|
||||
begin 0
|
||||
end 000
|
||||
rangewrite
|
||||
version 2
|
||||
addwrites
|
||||
|
||||
begin
|
||||
end 00
|
||||
rangewrite
|
||||
version 3
|
||||
addwrites
|
||||
@@ -1,72 +0,0 @@
|
||||
begin
|
||||
pointwrite
|
||||
begin 0
|
||||
pointwrite
|
||||
begin 00
|
||||
pointwrite
|
||||
begin 00a
|
||||
pointwrite
|
||||
begin 00b
|
||||
pointwrite
|
||||
begin 00c
|
||||
pointwrite
|
||||
begin 00d
|
||||
pointwrite
|
||||
begin 00e
|
||||
pointwrite
|
||||
begin 00f
|
||||
pointwrite
|
||||
begin 00g
|
||||
pointwrite
|
||||
begin 00h
|
||||
pointwrite
|
||||
begin 00i
|
||||
pointwrite
|
||||
begin 00j
|
||||
pointwrite
|
||||
begin 00k
|
||||
pointwrite
|
||||
begin 00l
|
||||
pointwrite
|
||||
begin 00m
|
||||
pointwrite
|
||||
begin 00n
|
||||
pointwrite
|
||||
begin 00o
|
||||
pointwrite
|
||||
begin 00p
|
||||
pointwrite
|
||||
begin 00q
|
||||
pointwrite
|
||||
begin 00r
|
||||
pointwrite
|
||||
begin 00s
|
||||
pointwrite
|
||||
begin 00t
|
||||
pointwrite
|
||||
begin 00u
|
||||
pointwrite
|
||||
begin 00v
|
||||
pointwrite
|
||||
begin 00w
|
||||
pointwrite
|
||||
begin 00x
|
||||
pointwrite
|
||||
begin 00y
|
||||
pointwrite
|
||||
begin 00z
|
||||
pointwrite
|
||||
version 1
|
||||
addwrites
|
||||
|
||||
begin 0
|
||||
end 000
|
||||
rangewrite
|
||||
version 2
|
||||
addwrites
|
||||
|
||||
begin
|
||||
end 00
|
||||
rangewrite
|
||||
version 3
|
||||
addwrites
|
||||
@@ -1,9 +0,0 @@
|
||||
begin aa
|
||||
pointwrite
|
||||
version 1
|
||||
addwrites
|
||||
begin aa
|
||||
end bb
|
||||
version 0
|
||||
rangeread
|
||||
check
|
||||
@@ -1,212 +0,0 @@
|
||||
; insert \x3fa at version 1
|
||||
begin ?a
|
||||
pointwrite
|
||||
|
||||
; insert \x81a at version 1
|
||||
begin a
|
||||
pointwrite
|
||||
version 1
|
||||
addwrites
|
||||
|
||||
; insert [\x40-\x80]a at version 2
|
||||
begin @a
|
||||
pointwrite
|
||||
|
||||
begin Aa
|
||||
pointwrite
|
||||
|
||||
begin Ba
|
||||
pointwrite
|
||||
|
||||
begin Ca
|
||||
pointwrite
|
||||
|
||||
begin Da
|
||||
pointwrite
|
||||
|
||||
begin Ea
|
||||
pointwrite
|
||||
|
||||
begin Fa
|
||||
pointwrite
|
||||
|
||||
begin Ga
|
||||
pointwrite
|
||||
|
||||
begin Ha
|
||||
pointwrite
|
||||
|
||||
begin Ia
|
||||
pointwrite
|
||||
|
||||
begin Ja
|
||||
pointwrite
|
||||
|
||||
begin Ka
|
||||
pointwrite
|
||||
|
||||
begin La
|
||||
pointwrite
|
||||
|
||||
begin Ma
|
||||
pointwrite
|
||||
|
||||
begin Na
|
||||
pointwrite
|
||||
|
||||
begin Oa
|
||||
pointwrite
|
||||
|
||||
begin Pa
|
||||
pointwrite
|
||||
|
||||
begin Qa
|
||||
pointwrite
|
||||
|
||||
begin Ra
|
||||
pointwrite
|
||||
|
||||
begin Sa
|
||||
pointwrite
|
||||
|
||||
begin Ta
|
||||
pointwrite
|
||||
|
||||
begin Ua
|
||||
pointwrite
|
||||
|
||||
begin Va
|
||||
pointwrite
|
||||
|
||||
begin Wa
|
||||
pointwrite
|
||||
|
||||
begin Xa
|
||||
pointwrite
|
||||
|
||||
begin Ya
|
||||
pointwrite
|
||||
|
||||
begin Za
|
||||
pointwrite
|
||||
|
||||
begin [a
|
||||
pointwrite
|
||||
|
||||
begin \a
|
||||
pointwrite
|
||||
|
||||
begin ]a
|
||||
pointwrite
|
||||
|
||||
begin ^a
|
||||
pointwrite
|
||||
|
||||
begin _a
|
||||
pointwrite
|
||||
|
||||
begin `a
|
||||
pointwrite
|
||||
|
||||
begin aa
|
||||
pointwrite
|
||||
|
||||
begin ba
|
||||
pointwrite
|
||||
|
||||
begin ca
|
||||
pointwrite
|
||||
|
||||
begin da
|
||||
pointwrite
|
||||
|
||||
begin ea
|
||||
pointwrite
|
||||
|
||||
begin fa
|
||||
pointwrite
|
||||
|
||||
begin ga
|
||||
pointwrite
|
||||
|
||||
begin ha
|
||||
pointwrite
|
||||
|
||||
begin ia
|
||||
pointwrite
|
||||
|
||||
begin ja
|
||||
pointwrite
|
||||
|
||||
begin ka
|
||||
pointwrite
|
||||
|
||||
begin la
|
||||
pointwrite
|
||||
|
||||
begin ma
|
||||
pointwrite
|
||||
|
||||
begin na
|
||||
pointwrite
|
||||
|
||||
begin oa
|
||||
pointwrite
|
||||
|
||||
begin pa
|
||||
pointwrite
|
||||
|
||||
begin qa
|
||||
pointwrite
|
||||
|
||||
begin ra
|
||||
pointwrite
|
||||
|
||||
begin sa
|
||||
pointwrite
|
||||
|
||||
begin ta
|
||||
pointwrite
|
||||
|
||||
begin ua
|
||||
pointwrite
|
||||
|
||||
begin va
|
||||
pointwrite
|
||||
|
||||
begin wa
|
||||
pointwrite
|
||||
|
||||
begin xa
|
||||
pointwrite
|
||||
|
||||
begin ya
|
||||
pointwrite
|
||||
|
||||
begin za
|
||||
pointwrite
|
||||
|
||||
begin {a
|
||||
pointwrite
|
||||
|
||||
begin |a
|
||||
pointwrite
|
||||
|
||||
begin }a
|
||||
pointwrite
|
||||
|
||||
begin ~a
|
||||
pointwrite
|
||||
|
||||
begin a
|
||||
pointwrite
|
||||
|
||||
version 2
|
||||
addwrites
|
||||
|
||||
; readrange a superset at version 1
|
||||
begin !
|
||||
end
|
||||
version 1
|
||||
rangeread
|
||||
check
|
||||
@@ -1,19 +0,0 @@
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
end aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
|
||||
rangeread
|
||||
check
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
end aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaaaaab
|
||||
rangeread
|
||||
check
|
||||
|
||||
begin aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
end aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaa
|
||||
rangeread
|
||||
check
|
||||
|
||||
begin aaaaaaaaaa
|
||||
end aaaaaaabaa
|
||||
rangeread
|
||||
check
|
||||
@@ -1,8 +1,45 @@
|
||||
from conflict_set import *
|
||||
|
||||
|
||||
class DebugConflictSet:
|
||||
"""
|
||||
Bisimulates the skip list and radix tree conflict sets for testing purposes
|
||||
"""
|
||||
|
||||
def __init__(self, version: int = 0) -> None:
|
||||
self.skip_list = ConflictSet(version, implementation="skip_list")
|
||||
self.radix_tree = ConflictSet(version, implementation="radix_tree")
|
||||
|
||||
def addWrites(self, version: int, *writes: WriteRange):
|
||||
self.skip_list.addWrites(version, *writes)
|
||||
self.radix_tree.addWrites(version, *writes)
|
||||
|
||||
def check(self, *reads: ReadRange) -> list[Result]:
|
||||
expected = self.skip_list.check(*reads)
|
||||
actual = self.radix_tree.check(*reads)
|
||||
assert expected == actual
|
||||
return actual
|
||||
|
||||
def setOldestVersion(self, version: int) -> None:
|
||||
self.skip_list.setOldestVersion(version)
|
||||
self.radix_tree.setOldestVersion(version)
|
||||
|
||||
def getBytes(self) -> int:
|
||||
return self.radix_tree.getBytes()
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def close(self) -> None:
|
||||
self.skip_list.close()
|
||||
self.radix_tree.close()
|
||||
|
||||
def __exit__(self, exception_type, exception_value, exception_traceback):
|
||||
self.close()
|
||||
|
||||
|
||||
def test_conflict_set():
|
||||
with ConflictSet() as cs:
|
||||
with DebugConflictSet() as cs:
|
||||
before = cs.getBytes()
|
||||
key = b"a key"
|
||||
cs.addWrites(1, write(key))
|
||||
@@ -10,3 +47,31 @@ def test_conflict_set():
|
||||
assert cs.check(read(0, key)) == [Result.CONFLICT]
|
||||
cs.setOldestVersion(1)
|
||||
assert cs.check(read(0, key)) == [Result.TOO_OLD]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# budget "pytest" for ctest integration without pulling in a dependency. You can of course still use pytest in local development.
|
||||
import argparse
|
||||
import inspect
|
||||
import sys
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
subparsers = parser.add_subparsers(dest="command")
|
||||
|
||||
list_parser = subparsers.add_parser("list")
|
||||
test_parser = subparsers.add_parser("test")
|
||||
test_parser.add_argument("test")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.command == "list":
|
||||
sys.stdout.write(
|
||||
";".join(
|
||||
name[5:]
|
||||
for name in dir()
|
||||
if name.startswith("test_")
|
||||
and inspect.isfunction(getattr(sys.modules[__name__], name))
|
||||
)
|
||||
)
|
||||
elif args.command == "test":
|
||||
globals()["test_" + args.test]()
|
||||
|
||||
Reference in New Issue
Block a user