Commit Diff


commit - 7b72080ddf926d271a4a4cad6f6ffe6e6c00e332
commit + 19d1f1cc0a2180730219a5fe24580c6d7fbcc239
blob - /dev/null
blob + 201f3af65239141f4911cd715f10a698fc2bb3f3 (mode 644)
--- /dev/null
+++ changelogs/unreleased/gh-10123-vy-tuple-field-lookup-fix.md
@@ -0,0 +1,4 @@
+## bugfix/vinyl
+
+* Fixed a bug when internal optimization algorithm caused a crash while a read
+  thread tried to look up a tuple field (gh-10123).
blob - f0873279909740da73c514f90acb4c82d73d71bf
blob + df0cad361bd46a0f0ddac35fd060173f476c9a18
--- src/box/tuple.h
+++ src/box/tuple.h
@@ -1106,19 +1106,23 @@ tuple_field_raw_by_part(struct tuple_format *format, c
 			const uint32_t *field_map,
 			struct key_part *part, int multikey_idx)
 {
-	if (unlikely(part->format_epoch != format->epoch)) {
-		assert(format->epoch != 0);
-		part->format_epoch = format->epoch;
-		/*
-		 * Clear the offset slot cache, since it's stale.
-		 * The cache will be reset by the lookup.
-		 */
-		part->offset_slot_cache = TUPLE_OFFSET_SLOT_NIL;
+	int32_t *offset_slot_cache = NULL;
+	if (cord_is_main()) {
+		offset_slot_cache = &part->offset_slot_cache;
+		if (unlikely(part->format_epoch != format->epoch)) {
+			assert(format->epoch != 0);
+			part->format_epoch = format->epoch;
+			/*
+			 * Clear the offset slot cache, since it's stale.
+			 * The cache will be reset by the lookup.
+			 */
+			*offset_slot_cache = TUPLE_OFFSET_SLOT_NIL;
+		}
 	}
 	return tuple_field_raw_by_path(format, data, field_map, part->fieldno,
 				       part->path, part->path_len,
 				       TUPLE_INDEX_BASE,
-				       &part->offset_slot_cache, multikey_idx);
+				       offset_slot_cache, multikey_idx);
 }
 
 /**