Merge lp:~sergei.glushchenko/percona-server/5.6-BT34246-ps-blueprint-into-outfile-pipe-and-socket into lp:percona-server/5.6

Proposed by Sergei Glushchenko
Status: Merged
Approved by: Alexey Kopytov
Approved revision: no longer in the source branch.
Merged at revision: 426
Proposed branch: lp:~sergei.glushchenko/percona-server/5.6-BT34246-ps-blueprint-into-outfile-pipe-and-socket
Merge into: lp:percona-server/5.6
Diff against target: 392 lines (+239/-14)
11 files modified
Percona-Server/include/my_dir.h (+2/-0)
Percona-Server/include/my_sys.h (+3/-0)
Percona-Server/include/mysql/psi/mysql_file.h (+44/-0)
Percona-Server/include/mysys_err.h (+4/-1)
Percona-Server/mysql-test/include/outfile_fifosocket.inc (+68/-0)
Percona-Server/mysql-test/r/percona_outfile_fifosocket.result (+12/-0)
Percona-Server/mysql-test/t/percona_outfile_fifosocket-master.opt (+1/-0)
Percona-Server/mysql-test/t/percona_outfile_fifosocket.test (+12/-0)
Percona-Server/mysys/errors.c (+7/-1)
Percona-Server/mysys/my_open.c (+53/-0)
Percona-Server/sql/sql_class.cc (+33/-12)
To merge this branch: bzr merge lp:~sergei.glushchenko/percona-server/5.6-BT34246-ps-blueprint-into-outfile-pipe-and-socket
Reviewer Review Type Date Requested Status
Alexey Kopytov (community) Approve
George Ormond Lorch III (community) g2 Approve
Review via email: mp+181120@code.launchpad.net

Description of the change

This is just a merge from 5.5, no changes, no conflicts.
http://jenkins.percona.com/view/PS%205.6/job/percona-server-5.6-param/223/#showFailuresLink

I don't see any correlation of *max*parts* failures with this change.

To post a comment you must log in.
Revision history for this message
George Ormond Lorch III (gl-az) :
review: Approve (g2)
Revision history for this message
Alexey Kopytov (akopytov) wrote :

Same comments as in the 5.5 MP.

review: Needs Fixing
Revision history for this message
Sergei Glushchenko (sergei.glushchenko) wrote :
Revision history for this message
Alexey Kopytov (akopytov) wrote :

Same comment as in 5.5.

review: Needs Fixing
Revision history for this message
Alexey Kopytov (akopytov) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'Percona-Server/include/my_dir.h'
--- Percona-Server/include/my_dir.h 2013-03-19 12:38:59 +0000
+++ Percona-Server/include/my_dir.h 2013-09-19 16:35:15 +0000
@@ -32,6 +32,7 @@
32#define MY_S_IFBLK S_IFBLK /* block special */32#define MY_S_IFBLK S_IFBLK /* block special */
33#define MY_S_IFREG S_IFREG /* regular */33#define MY_S_IFREG S_IFREG /* regular */
34#define MY_S_IFIFO S_IFIFO /* fifo */34#define MY_S_IFIFO S_IFIFO /* fifo */
35#define MY_S_IFSOCK S_IFSOCK /* socket */
35#define MY_S_ISUID S_ISUID /* set user id on execution */36#define MY_S_ISUID S_ISUID /* set user id on execution */
36#define MY_S_ISGID S_ISGID /* set group id on execution */37#define MY_S_ISGID S_ISGID /* set group id on execution */
37#define MY_S_ISVTX S_ISVTX /* save swapped text even after use */38#define MY_S_ISVTX S_ISVTX /* save swapped text even after use */
@@ -44,6 +45,7 @@
44#define MY_S_ISBLK(m) (((m) & MY_S_IFMT) == MY_S_IFBLK)45#define MY_S_ISBLK(m) (((m) & MY_S_IFMT) == MY_S_IFBLK)
45#define MY_S_ISREG(m) (((m) & MY_S_IFMT) == MY_S_IFREG)46#define MY_S_ISREG(m) (((m) & MY_S_IFMT) == MY_S_IFREG)
46#define MY_S_ISFIFO(m) (((m) & MY_S_IFMT) == MY_S_IFIFO)47#define MY_S_ISFIFO(m) (((m) & MY_S_IFMT) == MY_S_IFIFO)
48#define MY_S_ISSOCK(m) (((m) & MY_S_IFMT) == MY_S_IFSOCK)
4749
48#define MY_DONT_SORT 512 /* my_lib; Don't sort files */50#define MY_DONT_SORT 512 /* my_lib; Don't sort files */
49#define MY_WANT_STAT 1024 /* my_lib; stat files */51#define MY_WANT_STAT 1024 /* my_lib; stat files */
5052
=== modified file 'Percona-Server/include/my_sys.h'
--- Percona-Server/include/my_sys.h 2013-08-14 03:57:21 +0000
+++ Percona-Server/include/my_sys.h 2013-09-19 16:35:15 +0000
@@ -582,6 +582,9 @@
582extern char *my_once_strdup(const char *src,myf myflags);582extern char *my_once_strdup(const char *src,myf myflags);
583extern void *my_once_memdup(const void *src, size_t len, myf myflags);583extern void *my_once_memdup(const void *src, size_t len, myf myflags);
584extern File my_open(const char *FileName,int Flags,myf MyFlags);584extern File my_open(const char *FileName,int Flags,myf MyFlags);
585#ifndef __WIN__
586extern File my_unix_socket_connect(const char *FileName,myf MyFlags);
587#endif
585extern File my_register_filename(File fd, const char *FileName,588extern File my_register_filename(File fd, const char *FileName,
586 enum file_type type_of_file,589 enum file_type type_of_file,
587 uint error_message_number, myf MyFlags);590 uint error_message_number, myf MyFlags);
588591
=== modified file 'Percona-Server/include/mysql/psi/mysql_file.h'
--- Percona-Server/include/mysql/psi/mysql_file.h 2013-05-12 06:24:46 +0000
+++ Percona-Server/include/mysql/psi/mysql_file.h 2013-09-19 16:35:15 +0000
@@ -310,6 +310,21 @@
310#endif310#endif
311311
312/**312/**
313 @def mysql_unix_socket_connect(K, N, F)
314 Instrumented open.
315 @c mysql_unix_socket_connect connects to the unix domain socket.
316*/
317#ifndef __WIN__
318#ifdef HAVE_PSI_INTERFACE
319 #define mysql_unix_socket_connect(K, N, F) \
320 inline_mysql_unix_socket_connect(K, __FILE__, __LINE__, N, F)
321#else
322 #define mysql_unix_socket_connect(K, N, F) \
323 inline_mysql_unix_socket_connect(N, F)
324#endif
325#endif
326
327/**
313 @def mysql_file_close(FD, F)328 @def mysql_file_close(FD, F)
314 Instrumented close.329 Instrumented close.
315 @c mysql_file_close is a replacement for @c my_close.330 @c mysql_file_close is a replacement for @c my_close.
@@ -1054,6 +1069,35 @@
1054 return file;1069 return file;
1055}1070}
10561071
1072#ifndef __WIN__
1073static inline File
1074inline_mysql_unix_socket_connect(
1075#ifdef HAVE_PSI_INTERFACE
1076 PSI_file_key key, const char *src_file, uint src_line,
1077#endif
1078 const char *filename, myf myFlags)
1079{
1080 File file;
1081#ifdef HAVE_PSI_INTERFACE
1082 struct PSI_file_locker *locker= NULL;
1083 PSI_file_locker_state state;
1084 if (likely(PSI_server != NULL))
1085 {
1086 locker= PSI_server->get_thread_file_name_locker(&state, key, PSI_FILE_OPEN,
1087 filename, &locker);
1088 if (likely(locker != NULL))
1089 PSI_server->start_file_open_wait(locker, src_file, src_line);
1090 }
1091#endif
1092 file = my_unix_socket_connect(filename, myFlags);
1093#ifdef HAVE_PSI_INTERFACE
1094 if (likely(locker != NULL))
1095 PSI_server->end_file_open_wait_and_bind_to_descriptor(locker, file);
1096#endif
1097 return file;
1098}
1099#endif
1100
1057static inline int1101static inline int
1058inline_mysql_file_close(1102inline_mysql_file_close(
1059#ifdef HAVE_PSI_FILE_INTERFACE1103#ifdef HAVE_PSI_FILE_INTERFACE
10601104
=== modified file 'Percona-Server/include/mysys_err.h'
--- Percona-Server/include/mysys_err.h 2011-09-07 10:08:09 +0000
+++ Percona-Server/include/mysys_err.h 2013-09-19 16:35:15 +0000
@@ -66,7 +66,10 @@
66#define EE_CHANGE_OWNERSHIP 3166#define EE_CHANGE_OWNERSHIP 31
67#define EE_CHANGE_PERMISSIONS 3267#define EE_CHANGE_PERMISSIONS 32
68#define EE_CANT_SEEK 3368#define EE_CANT_SEEK 33
69#define EE_ERROR_LAST 33 /* Copy last error nr */69#define EE_SOCKET 34
70#define EE_CONNECT 35
71#define EE_TOOLONGFILENAME 36
72#define EE_ERROR_LAST 36 /* Copy last error nr */
70/* Add error numbers before EE_ERROR_LAST and change it accordingly. */73/* Add error numbers before EE_ERROR_LAST and change it accordingly. */
7174
72 /* exit codes for all MySQL programs */75 /* exit codes for all MySQL programs */
7376
=== added file 'Percona-Server/mysql-test/include/outfile_fifosocket.inc'
--- Percona-Server/mysql-test/include/outfile_fifosocket.inc 1970-01-01 00:00:00 +0000
+++ Percona-Server/mysql-test/include/outfile_fifosocket.inc 2013-09-19 16:35:15 +0000
@@ -0,0 +1,68 @@
1#
2# Test SELECT INTO OUTFILE/DUMPFILE with fifo and unix socket as destination
3#
4
5perl;
6my $fn = "$ENV{'MYSQL_TMP_DIR'}/regular";
7unlink($fn);
8open(FILE, ">$fn");
9print(FILE "1\n");
10close(FILE);
11EOF
12
13--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
14--error 1086
15--eval SELECT 1,2,3 INTO $select_into '$MYSQL_TMP_DIR/regular'
16
17perl;
18use POSIX qw(mkfifo);
19my $fn = "$ENV{'MYSQL_TMP_DIR'}/fifo";
20unlink($fn);
21mkfifo($fn, 0666) or die("mkfifo: $!");
22EOF
23
24--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
25--send_eval SELECT 1,2,3 INTO $select_into '$MYSQL_TMP_DIR/fifo'
26
27--cat_file $MYSQL_TMP_DIR/fifo
28
29--reap
30
31DELIMITER //;
32# procedure spin waiting when file 'trigger' appears
33--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
34--eval CREATE PROCEDURE p1() BEGIN WHILE ISNULL(LOAD_FILE('$MYSQL_TMP_DIR/trigger')) DO SELECT SLEEP(1); END WHILE; SELECT 1,2,3 INTO $select_into '$MYSQL_TMP_DIR/socket'; END
35DELIMITER ;//
36
37--send CALL p1()
38
39perl;
40use Socket;
41use IO::Handle;
42
43my $fn = "$ENV{'MYSQL_TMP_DIR'}/socket";
44my $trigger = "$ENV{'MYSQL_TMP_DIR'}/trigger";
45
46unlink($fn);
47socket(SERV, PF_UNIX, SOCK_STREAM, 0) or die("socket: $!");
48bind(SERV, sockaddr_un($fn)) or die("bind $fn: $!");
49
50# tell the p1 that we created the socket
51open(FILE, ">$trigger");
52close(FILE);
53
54listen(SERV, 1) or die("listen: $!");
55
56accept(CLIENT, SERV);
57$content = <CLIENT>;
58close(CLIENT);
59close(SERV);
60unlink($fn);
61unlink($trigger);
62
63EOF
64
65--disable_result_log
66--reap
67
68DROP PROCEDURE p1;
069
=== added file 'Percona-Server/mysql-test/r/percona_outfile_fifosocket.result'
--- Percona-Server/mysql-test/r/percona_outfile_fifosocket.result 1970-01-01 00:00:00 +0000
+++ Percona-Server/mysql-test/r/percona_outfile_fifosocket.result 2013-09-19 16:35:15 +0000
@@ -0,0 +1,12 @@
1SELECT 1,2,3 INTO OUTFILE 'MYSQL_TMP_DIR/regular';
2ERROR HY000: File 'MYSQL_TMP_DIR/regular' already exists
3SELECT 1,2,3 INTO OUTFILE 'MYSQL_TMP_DIR/fifo';
41 2 3
5CREATE PROCEDURE p1() BEGIN WHILE ISNULL(LOAD_FILE('MYSQL_TMP_DIR/trigger')) DO SELECT SLEEP(1); END WHILE; SELECT 1,2,3 INTO OUTFILE 'MYSQL_TMP_DIR/socket'; END//
6CALL p1();
7DROP PROCEDURE p1;
8SELECT 1,2,3 INTO DUMPFILE 'MYSQL_TMP_DIR/regular';
9SELECT 1,2,3 INTO DUMPFILE 'MYSQL_TMP_DIR/fifo';
10123CREATE PROCEDURE p1() BEGIN WHILE ISNULL(LOAD_FILE('MYSQL_TMP_DIR/trigger')) DO SELECT SLEEP(1); END WHILE; SELECT 1,2,3 INTO DUMPFILE 'MYSQL_TMP_DIR/socket'; END//
11CALL p1();
12DROP PROCEDURE p1;
013
=== added file 'Percona-Server/mysql-test/t/percona_outfile_fifosocket-master.opt'
--- Percona-Server/mysql-test/t/percona_outfile_fifosocket-master.opt 1970-01-01 00:00:00 +0000
+++ Percona-Server/mysql-test/t/percona_outfile_fifosocket-master.opt 2013-09-19 16:35:15 +0000
@@ -0,0 +1,1 @@
1--secure_file_priv=$MYSQL_TMP_DIR
02
=== added file 'Percona-Server/mysql-test/t/percona_outfile_fifosocket.test'
--- Percona-Server/mysql-test/t/percona_outfile_fifosocket.test 1970-01-01 00:00:00 +0000
+++ Percona-Server/mysql-test/t/percona_outfile_fifosocket.test 2013-09-19 16:35:15 +0000
@@ -0,0 +1,12 @@
1#
2# Test that it is possible to specify fifos and unix sockets as
3# an outfile
4#
5
6--source include/not_windows.inc
7
8--let $select_into=OUTFILE
9--source include/outfile_fifosocket.inc
10
11--let $select_into=DUMPFILE
12--source include/outfile_fifosocket.inc
013
=== modified file 'Percona-Server/mysys/errors.c'
--- Percona-Server/mysys/errors.c 2013-03-01 09:43:31 +0000
+++ Percona-Server/mysys/errors.c 2013-09-19 16:35:15 +0000
@@ -52,7 +52,10 @@
52 "File '%s' (fileno: %d) was not closed",52 "File '%s' (fileno: %d) was not closed",
53 "Can't change ownership of the file '%s' (Errcode: %d - %s)",53 "Can't change ownership of the file '%s' (Errcode: %d - %s)",
54 "Can't change permissions of the file '%s' (Errcode: %d - %s)",54 "Can't change permissions of the file '%s' (Errcode: %d - %s)",
55 "Can't seek in file '%s' (Errcode: %d - %s)"55 "Can't seek in file '%s' (Errcode: %d - %s)",
56 "Can't create socket '%s' (Errcode: %d)",
57 "Can't connect to '%s' (Errcode: %d)",
58 "File name '%s' is too long (max: %d)"
56};59};
5760
58void init_glob_errs(void)61void init_glob_errs(void)
@@ -96,6 +99,9 @@
96 EE(EE_CHANGE_OWNERSHIP) = "Can't change ownership of the file '%s' (Errcode: %d - %s)";99 EE(EE_CHANGE_OWNERSHIP) = "Can't change ownership of the file '%s' (Errcode: %d - %s)";
97 EE(EE_CHANGE_PERMISSIONS) = "Can't change permissions of the file '%s' (Errcode: %d - %s)";100 EE(EE_CHANGE_PERMISSIONS) = "Can't change permissions of the file '%s' (Errcode: %d - %s)";
98 EE(EE_CANT_SEEK) = "Can't seek in file '%s' (Errcode: %d - %s)";101 EE(EE_CANT_SEEK) = "Can't seek in file '%s' (Errcode: %d - %s)";
102 EE(EE_SOCKET) = "Can't create socket '%s' (Errcode: %d)";
103 EE(EE_CONNECT) = "Can't connect to '%s' (Errcode: %d)";
104 EE(EE_TOOLONGFILENAME) = "File name '%s' is too long (max: %d)";
99}105}
100#endif106#endif
101107
102108
=== modified file 'Percona-Server/mysys/my_open.c'
--- Percona-Server/mysys/my_open.c 2013-03-19 12:38:59 +0000
+++ Percona-Server/mysys/my_open.c 2013-09-19 16:35:15 +0000
@@ -17,6 +17,9 @@
17#include "mysys_err.h"17#include "mysys_err.h"
18#include <my_dir.h>18#include <my_dir.h>
19#include <errno.h>19#include <errno.h>
20#ifdef HAVE_SYS_UN_H
21#include <sys/un.h>
22#endif
2023
2124
22/*25/*
@@ -55,6 +58,56 @@
5558
5659
57/*60/*
61 Connect to unix domain socket
62
63 SYNOPSIS
64 my_unix_socket_connect()
65 FileName Fully qualified file name
66 MyFlags Special flags
67
68 RETURN VALUE
69 File descriptor
70*/
71
72#ifndef __WIN__
73File my_unix_socket_connect(const char *FileName, myf MyFlags)
74 /* Path-name of file */
75 /* Read | write .. */
76 /* Special flags */
77{
78 my_socket sd;
79 struct sockaddr_un addr;
80 DBUG_ENTER("my_unix_socket_connect");
81 DBUG_PRINT("my",("Name: '%s' MyFlags: %d",
82 FileName, MyFlags));
83
84 if (strlen(FileName) > (sizeof(addr.sun_path) - 1))
85 {
86 if (MyFlags & (MY_FAE | MY_WME))
87 my_error(EE_TOOLONGFILENAME, MYF(0), FileName, sizeof(addr.sun_path) - 1);
88 DBUG_RETURN(-1);
89 }
90 if ((sd= socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
91 {
92 if (MyFlags & (MY_FAE | MY_WME))
93 my_error(EE_SOCKET, MYF(0), FileName, errno);
94 DBUG_RETURN(-1);
95 }
96 memset(&addr, 0, sizeof(addr));
97 addr.sun_family = AF_UNIX;
98 strcpy(addr.sun_path, FileName);
99 if (connect(sd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
100 close(sd);
101 sd= -1;
102 }
103
104 DBUG_RETURN(my_register_filename((File) sd, FileName, FILE_BY_OPEN,
105 EE_FILENOTFOUND, MyFlags));
106} /* my_unix_socket_connect */
107#endif
108
109
110/*
58 Close a file111 Close a file
59112
60 SYNOPSIS113 SYNOPSIS
61114
=== modified file 'Percona-Server/sql/sql_class.cc'
--- Percona-Server/sql/sql_class.cc 2013-08-14 03:57:21 +0000
+++ Percona-Server/sql/sql_class.cc 2013-09-19 16:35:15 +0000
@@ -2814,7 +2814,10 @@
2814static File create_file(THD *thd, char *path, sql_exchange *exchange,2814static File create_file(THD *thd, char *path, sql_exchange *exchange,
2815 IO_CACHE *cache)2815 IO_CACHE *cache)
2816{2816{
2817 File file;2817 File file= -1;
2818 bool new_file_created= false;
2819 MY_STAT stat_arg;
2820
2818 uint option= MY_UNPACK_FILENAME | MY_RELATIVE_PATH;2821 uint option= MY_UNPACK_FILENAME | MY_RELATIVE_PATH;
28192822
2820#ifdef DONT_ALLOW_FULL_LOAD_DATA_PATHS2823#ifdef DONT_ALLOW_FULL_LOAD_DATA_PATHS
@@ -2837,25 +2840,43 @@
2837 return -1;2840 return -1;
2838 }2841 }
28392842
2840 if (!access(path, F_OK))2843 if (my_stat(path, &stat_arg, MYF(0)))
2841 {2844 {
2842 my_error(ER_FILE_EXISTS_ERROR, MYF(0), exchange->file_name);2845 /* Check if file is named pipe or unix socket */
2843 return -1;2846 if (MY_S_ISFIFO(stat_arg.st_mode))
2847 file= mysql_file_open(key_select_to_file,
2848 path, O_WRONLY, MYF(MY_WME));
2849#ifndef __WIN__
2850 if (MY_S_ISSOCK(stat_arg.st_mode))
2851 file= mysql_unix_socket_connect(key_select_to_file,
2852 path, MYF(MY_WME));
2853#endif
2854 if (file < 0)
2855 {
2856 if (!(MY_S_ISFIFO(stat_arg.st_mode) || MY_S_ISSOCK(stat_arg.st_mode)))
2857 my_error(ER_FILE_EXISTS_ERROR, MYF(0), exchange->file_name);
2858 return -1;
2859 }
2844 }2860 }
2845 /* Create the file world readable */2861 else
2846 if ((file= mysql_file_create(key_select_to_file,2862 {
2847 path, 0666, O_WRONLY|O_EXCL, MYF(MY_WME))) < 0)2863 /* Create the file world readable */
2848 return file;2864 if ((file= mysql_file_create(key_select_to_file,
2865 path, 0666, O_WRONLY|O_EXCL, MYF(MY_WME))) < 0)
2866 return file;
2867 new_file_created= true;
2849#ifdef HAVE_FCHMOD2868#ifdef HAVE_FCHMOD
2850 (void) fchmod(file, 0666); // Because of umask()2869 (void) fchmod(file, 0666); // Because of umask()
2851#else2870#else
2852 (void) chmod(path, 0666);2871 (void) chmod(path, 0666);
2853#endif2872#endif
2873 }
2854 if (init_io_cache(cache, file, 0L, WRITE_CACHE, 0L, 1, MYF(MY_WME)))2874 if (init_io_cache(cache, file, 0L, WRITE_CACHE, 0L, 1, MYF(MY_WME)))
2855 {2875 {
2856 mysql_file_close(file, MYF(0));2876 mysql_file_close(file, MYF(0));
2857 /* Delete file on error, it was just created */2877 /* Delete file on error, if it was just created */
2858 mysql_file_delete(key_select_to_file, path, MYF(0));2878 if (new_file_created)
2879 mysql_file_delete(key_select_to_file, path, MYF(0));
2859 return -1;2880 return -1;
2860 }2881 }
2861 return file;2882 return file;

Subscribers

People subscribed via source and target branches