[Tarantool-patches] [PATCH v2 05/10] sql: make BtCursor's memory aligned

Timur Safin tsafin at tarantool.org
Thu May 28 23:20:18 MSK 2020


Quite tricky case, thanks!

LGTM!

Timur

: -----Original Message-----
: From: Vladislav Shpilevoy <v.shpilevoy at tarantool.org>
: Sent: Thursday, May 28, 2020 2:32 AM
: To: tarantool-patches at dev.tarantool.org; alyapunov at tarantool.org;
: korablev at tarantool.org; tsafin at tarantool.org
: Subject: [PATCH v2 05/10] sql: make BtCursor's memory aligned
: 
: Vdbe at runtime allocates VdbeCursor structure using
: allocateCursor() function. Inside there is a pointer at BtCursor
: structure. To make the allocation faster and improve cache
: locality, both cursors are allocated in one memory block + some
: extra memory for uint32_t array, where BtCursor followed
: VdbeCursor and the array without any padding:
: 
:    VdbeCursor + uint32_t * N + BtCursor
: 
: The problem is that BtCursor needs 8 byte alignment. When it
: followed VdbeCursor (aligned by 8) + some uint32_t values, its
: actual alignment could become 4 bytes. That led to a crash when
: alignment sanitizer is enabled in clang.
: 
: The patch makes BtCursor offset aligned by 8 bytes.
: 
: Part of #4609
: ---
:  src/box/sql/vdbe.c | 8 +++-----
:  1 file changed, 3 insertions(+), 5 deletions(-)
: 
: diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
: index 724bc188b..7a42602a2 100644
: --- a/src/box/sql/vdbe.c
: +++ b/src/box/sql/vdbe.c
: @@ -234,10 +234,9 @@ allocateCursor(
:  	 */
:  	Mem *pMem = iCur>0 ? &p->aMem[p->nMem-iCur] : p->aMem;
: 
: -	int nByte;
:  	VdbeCursor *pCx = 0;
: -	nByte =
: -		ROUND8(sizeof(VdbeCursor)) + sizeof(u32)*nField +
: +	int bt_offset = ROUND8(sizeof(VdbeCursor) + sizeof(uint32_t) *
: nField);
: +	int nByte = bt_offset +
:  		(eCurType==CURTYPE_TARANTOOL ? ROUND8(sizeof(BtCursor)) : 0);
: 
:  	assert(iCur>=0 && iCur<p->nCursor);
: @@ -251,8 +250,7 @@ allocateCursor(
:  		pCx->eCurType = eCurType;
:  		pCx->nField = nField;
:  		if (eCurType==CURTYPE_TARANTOOL) {
: -			pCx->uc.pCursor = (BtCursor*)
: -				&pMem-
: >z[ROUND8(sizeof(VdbeCursor))+sizeof(u32)*nField];
: +			pCx->uc.pCursor = (BtCursor*)&pMem->z[bt_offset];
:  			sqlCursorZero(pCx->uc.pCursor);
:  		}
:  	}
: --
: 2.21.1 (Apple Git-122.3)




More information about the Tarantool-patches mailing list