Commit d472978b authored by unknown's avatar unknown

BUG#23196 - MySQL server does not exit / shutdown when

            storage engine returns errno 12

If there is not enough memory to store or update blob record
(while allocating record buffer), myisam marks table as crashed.

With this fix myisam attempts to roll an index back and return
an error, not marking a table as crashed.

Affects myisam tables with blobs only. No test case for this fix.


myisam/mi_dynrec.c:
  If there is not enough memory to store or update blob record
  (while allocating record buffer), return HA_ERR_OUT_OF_MEM
  instead of ENOMEM. In this case storage engine can simply
  roll an index back and return an error, not marking table
  as crashed.
myisam/mi_update.c:
  In some cases do not mark a table as crashed if we run out of
  memory. Instead roll an index back and return an error. These
  cases are signalled with my_errno set to HA_ERR_OUT_OF_MEM.
myisam/mi_write.c:
  In some cases do not mark a table as crashed if we run out of
  memory. Instead roll an index back and return an error. These
  cases are signalled with my_errno set to HA_ERR_OUT_OF_MEM.
parent a44762bc
......@@ -81,7 +81,7 @@ int _mi_write_blob_record(MI_INFO *info, const byte *record)
#endif
if (!(rec_buff=(byte*) my_alloca(reclength)))
{
my_errno=ENOMEM;
my_errno= HA_ERR_OUT_OF_MEM; /* purecov: inspected */
return(-1);
}
reclength2= _mi_rec_pack(info,rec_buff+ALIGN_SIZE(MI_MAX_DYN_BLOCK_HEADER),
......@@ -115,7 +115,7 @@ int _mi_update_blob_record(MI_INFO *info, my_off_t pos, const byte *record)
#endif
if (!(rec_buff=(byte*) my_alloca(reclength)))
{
my_errno=ENOMEM;
my_errno= HA_ERR_OUT_OF_MEM; /* purecov: inspected */
return(-1);
}
reclength=_mi_rec_pack(info,rec_buff+ALIGN_SIZE(MI_MAX_DYN_BLOCK_HEADER),
......
......@@ -193,7 +193,8 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec)
save_errno=my_errno;
if (changed)
key_changed|= HA_STATE_CHANGED;
if (my_errno == HA_ERR_FOUND_DUPP_KEY || my_errno == HA_ERR_RECORD_FILE_FULL)
if (my_errno == HA_ERR_FOUND_DUPP_KEY || my_errno == HA_ERR_OUT_OF_MEM ||
my_errno == HA_ERR_RECORD_FILE_FULL)
{
info->errkey= (int) i;
flag=0;
......
......@@ -164,7 +164,7 @@ int mi_write(MI_INFO *info, byte *record)
err:
save_errno=my_errno;
if (my_errno == HA_ERR_FOUND_DUPP_KEY || my_errno == HA_ERR_RECORD_FILE_FULL ||
my_errno == HA_ERR_NULL_IN_SPATIAL)
my_errno == HA_ERR_NULL_IN_SPATIAL || my_errno == HA_ERR_OUT_OF_MEM)
{
if (info->bulk_insert)
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment