MCPcopy Create free account
hub / github.com/apple/foundationdb / writeRangeToNativeTransaction

Method writeRangeToNativeTransaction

fdbclient/ReadYourWrites.actor.cpp:1904–1979  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1902}
1903
1904void ReadYourWritesTransaction::writeRangeToNativeTransaction(KeyRangeRef const& keys) {
1905 WriteMap::iterator it(&writes);
1906 it.skip(keys.begin);
1907
1908 bool inClearRange = false;
1909 ExtStringRef clearBegin;
1910
1911 // Clear ranges must be done first because of keys that are both cleared and set to a new value
1912 for (; it.beginKey() < keys.end; ++it) {
1913 if (it.is_cleared_range() && !inClearRange) {
1914 clearBegin = std::max(ExtStringRef(keys.begin), it.beginKey());
1915 inClearRange = true;
1916 } else if (!it.is_cleared_range() && inClearRange) {
1917 tr.clear(KeyRangeRef(clearBegin.toArenaOrRef(arena), it.beginKey().toArenaOrRef(arena)),
1918 AddConflictRange::False);
1919 inClearRange = false;
1920 }
1921 }
1922
1923 if (inClearRange) {
1924 tr.clear(KeyRangeRef(clearBegin.toArenaOrRef(arena), keys.end), AddConflictRange::False);
1925 }
1926
1927 it.skip(keys.begin);
1928
1929 bool inConflictRange = false;
1930 ExtStringRef conflictBegin;
1931
1932 for (; it.beginKey() < keys.end; ++it) {
1933 if (it.is_conflict_range() && !inConflictRange) {
1934 conflictBegin = std::max(ExtStringRef(keys.begin), it.beginKey());
1935 inConflictRange = true;
1936 } else if (!it.is_conflict_range() && inConflictRange) {
1937 tr.addWriteConflictRange(KeyRangeRef(conflictBegin.toArenaOrRef(arena), it.beginKey().toArenaOrRef(arena)));
1938 inConflictRange = false;
1939 }
1940
1941 // SOMEDAY: make atomicOp take set to avoid switch
1942 if (it.is_operation()) {
1943 auto op = it.op();
1944 for (int i = 0; i < op.size(); ++i) {
1945 switch (op[i].type) {
1946 case MutationRef::SetValue:
1947 if (op[i].value.present()) {
1948 tr.set(it.beginKey().assertRef(), op[i].value.get(), AddConflictRange::False);
1949 } else {
1950 tr.clear(it.beginKey().assertRef(), AddConflictRange::False);
1951 }
1952 break;
1953 case MutationRef::AddValue:
1954 case MutationRef::AppendIfFits:
1955 case MutationRef::And:
1956 case MutationRef::Or:
1957 case MutationRef::Xor:
1958 case MutationRef::Max:
1959 case MutationRef::Min:
1960 case MutationRef::SetVersionstampedKey:
1961 case MutationRef::SetVersionstampedValue:

Callers 1

Future<Void> commitFunction · 0.80

Calls 15

ExtStringRefClass · 0.85
is_cleared_rangeMethod · 0.80
toArenaOrRefMethod · 0.80
is_conflict_rangeMethod · 0.80
is_operationMethod · 0.80
assertRefMethod · 0.80
clearMethod · 0.65
addWriteConflictRangeMethod · 0.65
setMethod · 0.65
getMethod · 0.65
KeyRangeRefClass · 0.50
skipMethod · 0.45

Tested by

no test coverage detected