From: Kern Sibbald Date: Wed, 15 Jan 2003 08:42:31 +0000 (+0000) Subject: Error message suppression X-Git-Tag: Release-1.29~25 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=667e04e550e561f9eaea8047049c1ddbdade98d6;p=bacula%2Fbacula Error message suppression git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@295 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/src/filed/backup.c b/bacula/src/filed/backup.c index 63becda5fa..9dca295e71 100644 --- a/bacula/src/filed/backup.c +++ b/bacula/src/filed/backup.c @@ -394,10 +394,13 @@ static int save_file(FF_PKT *ff_pkt, void *ijcr) ff_pkt->fname, strerror(errno)); } + close(ff_pkt->fid); /* close file */ #ifndef NO_FD_SEND_TEST - bnet_sig(sd, BNET_EOD); /* indicate end of file data */ + if (!bnet_sig(sd, BNET_EOD)) { /* indicate end of file data */ + set_jcr_job_status(jcr, JS_ErrorTerminated); + return 0; + } #endif /* NO_FD_SEND_TEST */ - close(ff_pkt->fid); /* close file */ } diff --git a/bacula/src/filed/job.c b/bacula/src/filed/job.c index b1579624cb..11c9a06efb 100644 --- a/bacula/src/filed/job.c +++ b/bacula/src/filed/job.c @@ -548,9 +548,11 @@ static int backup_cmd(JCR *jcr) Dmsg1(110, "begin blast ff=%p\n", (FF_PKT *)jcr->ff); if (!blast_data_to_storage_daemon(jcr, NULL)) { set_jcr_job_status(jcr, JS_ErrorTerminated); + bnet_suppress_error_messages(sd, 1); } else { set_jcr_job_status(jcr, JS_Terminated); if (jcr->JobStatus != JS_Terminated) { + bnet_suppress_error_messages(sd, 1); goto cleanup; /* bail out now */ } /* diff --git a/bacula/src/lib/bnet.c b/bacula/src/lib/bnet.c index 72f39161aa..e8ef5c122d 100644 --- a/bacula/src/lib/bnet.c +++ b/bacula/src/lib/bnet.c @@ -231,6 +231,20 @@ int is_bnet_error(BSOCK *bsock) return bsock->errors; } +/* + * Call here after error during closing to suppress error + * messages which are due to the other end shutting down too. + */ +void +bnet_suppress_error_messages(BSOCK *bsock, int flag) +{ + bsock->suppress_error_msgs = flag; +} + + +/* + * Transmit spooled data now + */ int bnet_despool(BSOCK *bsock) { int32_t pktsiz; @@ -291,8 +305,10 @@ bnet_send(BSOCK *bsock) bsock->b_errno = errno; } if (rc < 0) { - Jmsg4(bsock->jcr, M_ERROR, 0, _("Write error sending to %s:%s:%d: ERR=%s\n"), - bsock->who, bsock->host, bsock->port, bnet_strerror(bsock)); + if (!bsock->suppress_error_msgs) { + Jmsg4(bsock->jcr, M_ERROR, 0, _("Write error sending to %s:%s:%d: ERR=%s\n"), + bsock->who, bsock->host, bsock->port, bnet_strerror(bsock)); + } } else { Jmsg5(bsock->jcr, M_ERROR, 0, _("Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"), bsock->who, bsock->host, bsock->port, bsock->msglen, rc); @@ -318,8 +334,10 @@ bnet_send(BSOCK *bsock) bsock->b_errno = errno; } if (rc < 0) { - Jmsg4(bsock->jcr, M_ERROR, 0, _("Write error sending to %s:%s:%d: ERR=%s\n"), - bsock->who, bsock->host, bsock->port, bnet_strerror(bsock)); + if (!bsock->suppress_error_msgs) { + Jmsg4(bsock->jcr, M_ERROR, 0, _("Write error sending to %s:%s:%d: ERR=%s\n"), + bsock->who, bsock->host, bsock->port, bnet_strerror(bsock)); + } } else { Jmsg5(bsock->jcr, M_ERROR, 0, _("Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"), bsock->who, bsock->host, bsock->port, bsock->msglen, rc); diff --git a/bacula/src/lib/bsock.h b/bacula/src/lib/bsock.h index f519d7150c..5e0806da0c 100644 --- a/bacula/src/lib/bsock.h +++ b/bacula/src/lib/bsock.h @@ -32,42 +32,43 @@ */ typedef struct s_bsock { - uint64_t read_seqno; /* read sequence number */ - uint32_t in_msg_no; /* intput message number */ - uint32_t out_msg_no; /* output message number */ - int fd; /* socket file descriptor */ - int32_t msglen; /* message length */ - int port; /* desired port */ - int errors; /* set if errors on socket */ - int b_errno; /* bsock errno */ - time_t timer_start; /* time started read/write */ - int timed_out; /* timed out in read/write */ - int timeout; /* time out after this value */ - int terminated; /* set when BNET_TERMINATE arrives */ - int duped; /* set if duped BSOCK */ - POOLMEM *msg; /* message pool buffer */ - char *who; /* Name of daemon to which we are talking */ - char *host; /* Host name/IP */ - POOLMEM *errmsg; /* edited error message (to be implemented) */ - RES *res; /* Resource to which we are connected */ - struct s_bsock *next; /* next BSOCK if duped */ - int spool; /* set for spooling */ - FILE *spool_fd; /* spooling file */ - void *jcr; /* jcr or NULL for error msgs */ + uint64_t read_seqno; /* read sequence number */ + uint32_t in_msg_no; /* intput message number */ + uint32_t out_msg_no; /* output message number */ + int fd; /* socket file descriptor */ + int32_t msglen; /* message length */ + int port; /* desired port */ + int errors; /* set if errors on socket */ + int suppress_error_msgs; /* set to suppress error messages */ + int b_errno; /* bsock errno */ + time_t timer_start; /* time started read/write */ + int timed_out; /* timed out in read/write */ + int timeout; /* time out after this value */ + int terminated; /* set when BNET_TERMINATE arrives */ + int duped; /* set if duped BSOCK */ + POOLMEM *msg; /* message pool buffer */ + char *who; /* Name of daemon to which we are talking */ + char *host; /* Host name/IP */ + POOLMEM *errmsg; /* edited error message (to be implemented) */ + RES *res; /* Resource to which we are connected */ + struct s_bsock *next; /* next BSOCK if duped */ + int spool; /* set for spooling */ + FILE *spool_fd; /* spooling file */ + void *jcr; /* jcr or NULL for error msgs */ } BSOCK; /* Signal definitions for use in bnet_sig() */ -#define BNET_EOD -1 /* End of data stream, new data may follow */ -#define BNET_EOD_POLL -2 /* End of data and poll all in one */ -#define BNET_STATUS -3 /* Send full status */ -#define BNET_TERMINATE -4 /* Conversation terminated, doing close() */ +#define BNET_EOD -1 /* End of data stream, new data may follow */ +#define BNET_EOD_POLL -2 /* End of data and poll all in one */ +#define BNET_STATUS -3 /* Send full status */ +#define BNET_TERMINATE -4 /* Conversation terminated, doing close() */ #define BNET_POLL -5 /* Poll request, I'm hanging on a read */ -#define BNET_HEARTBEAT -6 /* Heartbeat Response requested */ -#define BNET_HB_RESPONSE -7 /* Only response permited to HB */ -#define BNET_PROMPT -8 /* Prompt for UA */ +#define BNET_HEARTBEAT -6 /* Heartbeat Response requested */ +#define BNET_HB_RESPONSE -7 /* Only response permited to HB */ +#define BNET_PROMPT -8 /* Prompt for UA */ -#define BNET_SETBUF_READ 1 /* Arg for bnet_set_buffer_size */ -#define BNET_SETBUF_WRITE 2 /* Arg for bnet_set_buffer_size */ +#define BNET_SETBUF_READ 1 /* Arg for bnet_set_buffer_size */ +#define BNET_SETBUF_WRITE 2 /* Arg for bnet_set_buffer_size */ /* Return status from bnet_recv() */ #define BNET_SIGNAL -1 @@ -78,17 +79,17 @@ typedef struct s_bsock { * This is the structure of the in memory BPKT */ typedef struct s_bpkt { - char *id; /* String identifier or name of field */ - uint8_t type; /* field type */ - uint32_t len; /* field length for string, name, bytes */ - void *value; /* pointer to value */ + char *id; /* String identifier or name of field */ + uint8_t type; /* field type */ + uint32_t len; /* field length for string, name, bytes */ + void *value; /* pointer to value */ } BPKT; /* * These are the data types that can be sent. * For all values other than string, the storage space * is assumed to be allocated in the receiving packet. - * For BP_STRING if the *value is non-zero, it is a + * For BP_STRING if the *value is non-zero, it is a * pointer to a POOLMEM buffer, and the Memory Pool * routines will be used to assure that the length is * adequate. NOTE!!! This pointer will be changed @@ -96,13 +97,13 @@ typedef struct s_bpkt { * does). If the pointer is NULL, a POOLMEM * buffer will be allocated. */ -#define BP_EOF 0 /* end of file */ -#define BP_CHAR 1 /* Character */ -#define BP_INT32 1 /* 32 bit integer */ -#define BP_UINT32 3 /* Unsigned 32 bit integer */ -#define BP_INT64 4 /* 64 bit integer */ -#define BP_STRING 5 /* string */ -#define BP_NAME 6 /* Name string -- limited length */ -#define BP_BYTES 7 /* Binary bytes */ -#define BP_FLOAT32 8 /* 32 bit floating point */ -#define BP_FLOAT64 9 /* 64 bit floating point */ +#define BP_EOF 0 /* end of file */ +#define BP_CHAR 1 /* Character */ +#define BP_INT32 1 /* 32 bit integer */ +#define BP_UINT32 3 /* Unsigned 32 bit integer */ +#define BP_INT64 4 /* 64 bit integer */ +#define BP_STRING 5 /* string */ +#define BP_NAME 6 /* Name string -- limited length */ +#define BP_BYTES 7 /* Binary bytes */ +#define BP_FLOAT32 8 /* 32 bit floating point */ +#define BP_FLOAT64 9 /* 64 bit floating point */ diff --git a/bacula/src/lib/protos.h b/bacula/src/lib/protos.h index c05a1476e1..2efa5524de 100644 --- a/bacula/src/lib/protos.h +++ b/bacula/src/lib/protos.h @@ -24,132 +24,133 @@ */ /* base64.c */ -void base64_init (void); -int to_base64 (intmax_t value, char *where); -int from_base64 (intmax_t *value, char *where); -int bin_to_base64 (char *buf, char *bin, int len); +void base64_init (void); +int to_base64 (intmax_t value, char *where); +int from_base64 (intmax_t *value, char *where); +int bin_to_base64 (char *buf, char *bin, int len); /* bmisc.c */ -char *bstrncpy (char *dest, const char *src, int maxlen); -char *bstrncat (char *dest, const char *src, int maxlen); -void *b_malloc (char *file, int line, size_t size); +char *bstrncpy (char *dest, const char *src, int maxlen); +char *bstrncat (char *dest, const char *src, int maxlen); +void *b_malloc (char *file, int line, size_t size); #ifndef DEBUG -void *bmalloc (size_t size); +void *bmalloc (size_t size); #endif -void *brealloc (void *buf, size_t size); -void *bcalloc (size_t size1, size_t size2); -int bsnprintf (char *str, size_t size, const char *format, ...); -int bvsnprintf (char *str, size_t size, const char *format, va_list ap); -int pool_sprintf (char *pool_buf, char *fmt, ...); -void create_pid_file (char *dir, char *progname, int port); -int delete_pid_file (char *dir, char *progname, int port); +void *brealloc (void *buf, size_t size); +void *bcalloc (size_t size1, size_t size2); +int bsnprintf (char *str, size_t size, const char *format, ...); +int bvsnprintf (char *str, size_t size, const char *format, va_list ap); +int pool_sprintf (char *pool_buf, char *fmt, ...); +void create_pid_file (char *dir, char *progname, int port); +int delete_pid_file (char *dir, char *progname, int port); /* bnet.c */ -int32_t bnet_recv (BSOCK *bsock); -int bnet_send (BSOCK *bsock); -int bnet_fsend (BSOCK *bs, char *fmt, ...); -int bnet_set_buffer_size (BSOCK *bs, uint32_t size, int rw); -int bnet_sig (BSOCK *bs, int sig); -BSOCK * bnet_connect (void *jcr, int retry_interval, - int max_retry_time, char *name, char *host, char *service, - int port, int verbose); -int bnet_wait_data (BSOCK *bsock, int sec); -void bnet_close (BSOCK *bsock); -BSOCK * init_bsock (void *jcr, int sockfd, char *who, char *ip, int port); -BSOCK * dup_bsock (BSOCK *bsock); -void term_bsock (BSOCK *bsock); -char * bnet_strerror (BSOCK *bsock); -char * bnet_sig_to_ascii (BSOCK *bsock); -int bnet_wait_data (BSOCK *bsock, int sec); -int bnet_despool (BSOCK *bsock); -int is_bnet_stop (BSOCK *bsock); -int is_bnet_error (BSOCK *bsock); +int32_t bnet_recv (BSOCK *bsock); +int bnet_send (BSOCK *bsock); +int bnet_fsend (BSOCK *bs, char *fmt, ...); +int bnet_set_buffer_size (BSOCK *bs, uint32_t size, int rw); +int bnet_sig (BSOCK *bs, int sig); +BSOCK * bnet_connect (void *jcr, int retry_interval, + int max_retry_time, char *name, char *host, char *service, + int port, int verbose); +int bnet_wait_data (BSOCK *bsock, int sec); +void bnet_close (BSOCK *bsock); +BSOCK * init_bsock (void *jcr, int sockfd, char *who, char *ip, int port); +BSOCK * dup_bsock (BSOCK *bsock); +void term_bsock (BSOCK *bsock); +char * bnet_strerror (BSOCK *bsock); +char * bnet_sig_to_ascii (BSOCK *bsock); +int bnet_wait_data (BSOCK *bsock, int sec); +int bnet_despool (BSOCK *bsock); +int is_bnet_stop (BSOCK *bsock); +int is_bnet_error (BSOCK *bsock); +void bnet_suppress_error_messages(BSOCK *bsock, int flag); /* cram-md5.c */ int cram_md5_get_auth(BSOCK *bs, char *password); int cram_md5_auth(BSOCK *bs, char *password); void hmac_md5(uint8_t* text, int text_len, uint8_t* key, - int key_len, uint8_t *hmac); + int key_len, uint8_t *hmac); /* crc32.c */ uint32_t bcrc32(uint8_t *buf, int len); /* daemon.c */ -void daemon_start (); +void daemon_start (); /* edit.c */ -uint64_t str_to_uint64(char *str); -int64_t str_to_int64(char *str); -char * edit_uint64_with_commas (uint64_t val, char *buf); -char * add_commas (char *val, char *buf); -char * edit_uint64 (uint64_t val, char *buf); -int duration_to_utime (char *str, utime_t *value); -int size_to_uint64(char *str, int str_len, uint64_t *rtn_value); -char *edit_utime (utime_t val, char *buf); -int is_a_number (const char *num); +uint64_t str_to_uint64(char *str); +int64_t str_to_int64(char *str); +char * edit_uint64_with_commas (uint64_t val, char *buf); +char * add_commas (char *val, char *buf); +char * edit_uint64 (uint64_t val, char *buf); +int duration_to_utime (char *str, utime_t *value); +int size_to_uint64(char *str, int str_len, uint64_t *rtn_value); +char *edit_utime (utime_t val, char *buf); +int is_a_number (const char *num); /* lex.c */ -LEX * lex_close_file (LEX *lf); -LEX * lex_open_file (LEX *lf, char *fname, LEX_ERROR_HANDLER *scan_error); -int lex_get_char (LEX *lf); -void lex_unget_char (LEX *lf); -char * lex_tok_to_str (int token); -int lex_get_token (LEX *lf, int expect); +LEX * lex_close_file (LEX *lf); +LEX * lex_open_file (LEX *lf, char *fname, LEX_ERROR_HANDLER *scan_error); +int lex_get_char (LEX *lf); +void lex_unget_char (LEX *lf); +char * lex_tok_to_str (int token); +int lex_get_token (LEX *lf, int expect); /* message.c */ -void my_name_is (int argc, char *argv[], char *name); -void init_msg (void *jcr, MSGS *msg); -void term_msg (void); -void close_msg (void *jcr); -void add_msg_dest (MSGS *msg, int dest, int type, char *where, char *dest_code); -void rem_msg_dest (MSGS *msg, int dest, int type, char *where); -void Jmsg (void *jcr, int type, int level, char *fmt, ...); -void dispatch_message (void *jcr, int type, int level, char *buf); -void init_console_msg (char *wd); -void free_msgs_res (MSGS *msgs); -int open_spool_file (void *jcr, BSOCK *bs); -int close_spool_file (void *vjcr, BSOCK *bs); +void my_name_is (int argc, char *argv[], char *name); +void init_msg (void *jcr, MSGS *msg); +void term_msg (void); +void close_msg (void *jcr); +void add_msg_dest (MSGS *msg, int dest, int type, char *where, char *dest_code); +void rem_msg_dest (MSGS *msg, int dest, int type, char *where); +void Jmsg (void *jcr, int type, int level, char *fmt, ...); +void dispatch_message (void *jcr, int type, int level, char *buf); +void init_console_msg (char *wd); +void free_msgs_res (MSGS *msgs); +int open_spool_file (void *jcr, BSOCK *bs); +int close_spool_file (void *vjcr, BSOCK *bs); /* bnet_server.c */ -void bnet_thread_server(char *bind_addr, int port, int max_clients, workq_t *client_wq, - void handle_client_request(void *bsock)); -void bnet_server (int port, void handle_client_request(BSOCK *bsock)); -int net_connect (int port); -BSOCK * bnet_bind (int port); -BSOCK * bnet_accept (BSOCK *bsock, char *who); +void bnet_thread_server(char *bind_addr, int port, int max_clients, workq_t *client_wq, + void handle_client_request(void *bsock)); +void bnet_server (int port, void handle_client_request(BSOCK *bsock)); +int net_connect (int port); +BSOCK * bnet_bind (int port); +BSOCK * bnet_accept (BSOCK *bsock, char *who); /* signal.c */ -void init_signals (void terminate(int sig)); -void init_stack_dump (void); +void init_signals (void terminate(int sig)); +void init_stack_dump (void); /* util.c */ -void lcase (char *str); -void bash_spaces (char *str); -void unbash_spaces (char *str); -void strip_trailing_junk (char *str); -void strip_trailing_slashes (char *dir); -int skip_spaces (char **msg); -int skip_nonspaces (char **msg); -int fstrsch (char *a, char *b); -char * encode_time (time_t time, char *buf); -char * encode_mode (mode_t mode, char *buf); -int do_shell_expansion (char *name); -int is_buf_zero (char *buf, int len); -void jobstatus_to_ascii (int JobStatus, char *msg, int maxlen); -void pm_strcat (POOLMEM **pm, char *str); -void pm_strcpy (POOLMEM **pm, char *str); -int run_program (char *prog, int wait, POOLMEM *results); -char * job_type_to_str (int type); -char * job_status_to_str (int stat); -char * job_level_to_str (int level); -void makeSessionKey (char *key, char *seed, int mode); -BPIPE * open_bpipe(char *prog, int wait, char *mode); -int close_wpipe(BPIPE *bpipe); -int close_bpipe(BPIPE *bpipe); -POOLMEM *edit_job_codes(void *jcr, char *omsg, char *imsg, char *to); +void lcase (char *str); +void bash_spaces (char *str); +void unbash_spaces (char *str); +void strip_trailing_junk (char *str); +void strip_trailing_slashes (char *dir); +int skip_spaces (char **msg); +int skip_nonspaces (char **msg); +int fstrsch (char *a, char *b); +char * encode_time (time_t time, char *buf); +char * encode_mode (mode_t mode, char *buf); +int do_shell_expansion (char *name); +int is_buf_zero (char *buf, int len); +void jobstatus_to_ascii (int JobStatus, char *msg, int maxlen); +void pm_strcat (POOLMEM **pm, char *str); +void pm_strcpy (POOLMEM **pm, char *str); +int run_program (char *prog, int wait, POOLMEM *results); +char * job_type_to_str (int type); +char * job_status_to_str (int stat); +char * job_level_to_str (int level); +void makeSessionKey (char *key, char *seed, int mode); +BPIPE * open_bpipe(char *prog, int wait, char *mode); +int close_wpipe(BPIPE *bpipe); +int close_bpipe(BPIPE *bpipe); +POOLMEM *edit_job_codes(void *jcr, char *omsg, char *imsg, char *to); /* watchdog.c */ diff --git a/bacula/src/stored/fd_cmds.c b/bacula/src/stored/fd_cmds.c index ed1180c153..84c52b5e4d 100644 --- a/bacula/src/stored/fd_cmds.c +++ b/bacula/src/stored/fd_cmds.c @@ -11,7 +11,7 @@ * */ /* - Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker + Copyright (C) 2000-2003 Kern Sibbald and John Walker This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -176,6 +176,7 @@ static int append_data_cmd(JCR *jcr) jcr->JobType = JT_BACKUP; return 1; } else { + bnet_suppress_error_messages(fd, 1); /* ignore errors at this point */ bnet_fsend(fd, ERROR_append); return 0; }