summaryrefslogtreecommitdiff
path: root/myisammrg
diff options
context:
space:
mode:
authorunknown <Kristofer.Pettersson@naruto.>2006-09-19 17:40:09 +0200
committerunknown <Kristofer.Pettersson@naruto.>2006-09-19 17:40:09 +0200
commit18edc55b83a2b9fb4ac6e36c88f86825c207b55f (patch)
treebd18651be61661b07a4846ec2c0dba96be7b19c2 /myisammrg
parent2247a2ab81708fba82ae3839b48d5fc788f96f02 (diff)
downloadmariadb-git-18edc55b83a2b9fb4ac6e36c88f86825c207b55f.tar.gz
Bug#20789 Merge Subtable Rename Causes Crash
- When a MyISAM table which belongs to a merge table union and is renamed the associated file descriptors are closed on windows. This causes a server crash next time an insert or update is performed on the merge table. - This patch prevents the system from crashing on windows by checking for bad file descriptors every time the MyISAM table is locked by associated the merge table. myisam/mi_locking.c: - Added check for bad file descriptors when table is part of merge union. - This patch prevents the server from crash on windows. myisam/myisamdef.h: Added boolean value to indicate that this myisam table is part of a merge union. myisammrg/myrg_locking.c: Added paramter owned_by_merge=TRUE for mi_lock_database through MYRG_TABLE struct.
Diffstat (limited to 'myisammrg')
-rw-r--r--myisammrg/myrg_locking.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/myisammrg/myrg_locking.c b/myisammrg/myrg_locking.c
index e5a8d3f3d9d..98e8305b9ce 100644
--- a/myisammrg/myrg_locking.c
+++ b/myisammrg/myrg_locking.c
@@ -26,8 +26,19 @@ int myrg_lock_database(MYRG_INFO *info, int lock_type)
MYRG_TABLE *file;
error=0;
- for (file=info->open_tables ; file != info->end_table ; file++)
+ for (file=info->open_tables ; file != info->end_table ; file++)
+ {
+#ifdef __WIN__
+ /*
+ Make sure this table is marked as owned by a merge table.
+ The semaphore is never released as long as table remains
+ in memory. This should be refactored into a more generic
+ approach (observer pattern)
+ */
+ (file->table)->owned_by_merge = TRUE;
+#endif
if ((new_error=mi_lock_database(file->table,lock_type)))
error=new_error;
+ }
return(error);
}