X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fjcr.h;h=6f037c77abcca813c78a3ea9dcba439bf558da33;hb=e2c4a73ab70ed8a6e4c6c5cb6508a156e29ff710;hp=e7bfc436bca2fa5cfaad5d6346b0deb2b7b3cb3f;hpb=c369a18cfaa0cb4fe7c93398f8c55a356f857719;p=bacula%2Fbacula diff --git a/bacula/src/jcr.h b/bacula/src/jcr.h index e7bfc436bc..6f037c77ab 100644 --- a/bacula/src/jcr.h +++ b/bacula/src/jcr.h @@ -10,7 +10,7 @@ */ /* - Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker + Copyright (C) 2000-2004 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 @@ -33,15 +33,17 @@ #define __JCR_H_ 1 /* Backup/Verify level code. These are stored in the DB */ -#define L_FULL 'F' +#define L_FULL 'F' /* Full backup */ #define L_INCREMENTAL 'I' /* since last backup */ #define L_DIFFERENTIAL 'D' /* since last full backup */ -#define L_LEVEL 'L' #define L_SINCE 'S' #define L_VERIFY_CATALOG 'C' /* verify from catalog */ #define L_VERIFY_INIT 'V' /* verify save (init DB) */ #define L_VERIFY_VOLUME_TO_CATALOG 'O' /* verify Volume to catalog entries */ +#define L_VERIFY_DISK_TO_CATALOG 'd' /* verify Disk attributes to catalog */ #define L_VERIFY_DATA 'A' /* verify data on volume */ +#define L_BASE 'B' /* Base level job */ +#define L_NONE ' ' /* None, for Restore and Admin */ /* Job Types. These are stored in the DB */ @@ -49,6 +51,7 @@ #define JT_VERIFY 'V' /* Verify Job */ #define JT_RESTORE 'R' /* Restore Job */ #define JT_CONSOLE 'C' /* console program */ +#define JT_SYSTEM 'S' /* internal system "job" */ #define JT_ADMIN 'D' /* admin job */ #define JT_ARCHIVE 'A' @@ -61,31 +64,47 @@ #define JS_Error 'e' /* Non-fatal error */ #define JS_FatalError 'f' /* Fatal error */ #define JS_Differences 'D' /* Verify differences */ -#define JS_Cancelled 'A' /* cancelled by user */ +#define JS_Canceled 'A' /* canceled by user */ #define JS_WaitFD 'F' /* waiting on File daemon */ #define JS_WaitSD 'S' /* waiting on the Storage daemon */ #define JS_WaitMedia 'm' /* waiting for new media */ #define JS_WaitMount 'M' /* waiting for Mount */ +#define JS_WaitStoreRes 's' /* Waiting for storage resource */ +#define JS_WaitJobRes 'j' /* Waiting for job resource */ +#define JS_WaitClientRes 'c' /* Waiting for Client resource */ +#define JS_WaitMaxJobs 'd' /* Waiting for maximum jobs */ +#define JS_WaitStartTime 't' /* Waiting for start time */ +#define JS_WaitPriority 'p' /* Waiting for higher priority jobs to finish */ -#define job_cancelled(jcr) \ - (jcr->JobStatus == JS_Cancelled || \ +#define job_canceled(jcr) \ + (jcr->JobStatus == JS_Canceled || \ jcr->JobStatus == JS_ErrorTerminated || \ jcr->JobStatus == JS_FatalError) -typedef void (JCR_free_HANDLER)(struct s_jcr *jcr); +#define foreach_jcr(jcr) \ + for ((jcr)=NULL; ((jcr)=get_next_jcr(jcr)); ) + + + +struct JCR; +typedef void (JCR_free_HANDLER)(JCR *jcr); /* Job Control Record (JCR) */ -struct s_jcr { +struct JCR { /* Global part of JCR common to all daemons */ - struct s_jcr *next; - struct s_jcr *prev; + JCR *next; + JCR *prev; + volatile int use_count; /* use count */ pthread_t my_thread_id; /* id of thread controlling jcr */ pthread_mutex_t mutex; /* jcr mutex */ BSOCK *dir_bsock; /* Director bsock or NULL if we are him */ BSOCK *store_bsock; /* Storage connection socket */ BSOCK *file_bsock; /* File daemon connection socket */ JCR_free_HANDLER *daemon_free_jcr; /* Local free routine */ - int use_count; /* use count */ + dlist *msg_queue; /* Queued messages */ + alist job_end_push; /* Job end pushed calls */ + int reload_id; /* SIGHUP reload table id */ + bool dequeuing; /* dequeuing messages */ POOLMEM *errmsg; /* edited error message */ char Job[MAX_NAME_LENGTH]; /* Unique name of this Job */ uint32_t JobId; /* Director's JobId */ @@ -96,9 +115,10 @@ struct s_jcr { uint64_t JobBytes; /* Number of bytes processed this job */ uint64_t ReadBytes; /* Bytes read -- before compression */ uint32_t Errors; /* Number of non-fatal errors */ - int JobStatus; /* ready, running, blocked, terminated */ + volatile int JobStatus; /* ready, running, blocked, terminated */ int JobType; /* backup, restore, verify ... */ int JobLevel; /* Job level */ + int JobPriority; /* Job priority */ int authenticated; /* set when client authenticated */ time_t sched_time; /* job schedule time, i.e. when it should start */ time_t start_time; /* when job actually started */ @@ -106,10 +126,15 @@ struct s_jcr { time_t end_time; /* job end time */ POOLMEM *VolumeName; /* Volume name desired -- pool_memory */ POOLMEM *client_name; /* client name */ - char *RestoreBootstrap; /* Bootstrap file to restore */ + POOLMEM *RestoreBootstrap; /* Bootstrap file to restore */ char *sd_auth_key; /* SD auth key */ MSGS *jcr_msgs; /* Copy of message resource -- actually used */ uint32_t ClientId; /* Client associated with Job */ + char *where; /* prefix to restore files to */ + bool prefix_links; /* Prefix links with Where path */ + bool gui; /* set if gui using console */ + int cached_pnl; /* cached path length */ + POOLMEM *cached_path; /* cached path */ /* Daemon specific part of JCR */ /* This should be empty in the library */ @@ -118,17 +143,25 @@ struct s_jcr { /* Director Daemon specific part of JCR */ pthread_t SD_msg_chan; /* Message channel thread id */ pthread_cond_t term_wait; /* Wait for job termination */ - int msg_thread_done; /* Set when Storage message thread terms */ + workq_ele_t *work_item; /* Work queue item if scheduled */ + volatile bool sd_msg_thread_done; /* Set when Storage message thread terms */ BSOCK *ua; /* User agent */ JOB *job; /* Job resource */ STORE *store; /* Storage resource */ CLIENT *client; /* Client resource */ POOL *pool; /* Pool resource */ + POOL *full_pool; /* Full backup pool resource */ + POOL *inc_pool; /* Incremental backup pool resource */ + POOL *dif_pool; /* Differential backup pool resource */ FILESET *fileset; /* FileSet resource */ CAT *catalog; /* Catalog resource */ MSGS *messages; /* Default message handler */ - int SDJobStatus; /* Storage Job Status */ - int mode; /* manual/auto run */ + uint32_t SDJobFiles; /* Number of files written, this job */ + uint64_t SDJobBytes; /* Number of bytes processed this job */ + uint32_t SDErrors; /* Number of non-fatal errors */ + volatile int SDJobStatus; /* Storage Job Status */ + volatile int FDJobStatus; /* File daemon Job Status */ + uint32_t ExpectedFiles; /* Expected restore files */ B_DB *db; /* database pointer */ uint32_t MediaId; /* DB record IDs associated with this job */ uint32_t PoolId; /* Pool record id */ @@ -137,12 +170,18 @@ struct s_jcr { POOLMEM *fname; /* name to put into catalog */ int fn_printed; /* printed filename */ POOLMEM *stime; /* start time for incremental/differential */ - JOB_DBR jr; /* Job record in Database */ + JOB_DBR jr; /* Job DB record for current job */ + JOB_DBR *verify_jr; /* Pointer to target job */ uint32_t RestoreJobId; /* Id specified by UA */ - char *RestoreWhere; /* Where to restore the files */ POOLMEM *client_uname; /* client uname */ + int replace; /* Replace option */ + bool acquired_resource_locks; /* set if resource locks acquired */ + int NumVols; /* Number of Volume used in pool */ + int reschedule_count; /* Number of times rescheduled */ + bool spool_data; /* Spool data in SD */ #endif /* DIRECTOR_DAEMON */ + #ifdef FILE_DAEMON /* File Daemon specific part of JCR */ uint32_t num_files_examined; /* files examined this job */ @@ -150,31 +189,33 @@ struct s_jcr { /*********FIXME********* add missing files and files to be retried */ int incremental; /* set if incremental for SINCE */ time_t mtime; /* begin time for SINCE */ - int mode; /* manual/auto run */ - int status; /* job status */ + int listing; /* job listing in estimate */ long Ticket; /* Ticket */ - int save_level; /* save level */ char *big_buf; /* I/O buffer */ POOLMEM *compress_buf; /* Compression buffer */ int32_t compress_buf_size; /* Length of compression buffer */ - POOLMEM *where; /* Root where to restore */ int replace; /* Replace options */ int buf_size; /* length of buffer */ - FF_PKT *ff; /* Find Files packet */ + void *ff; /* Find Files packet */ char stored_addr[MAX_NAME_LENGTH]; /* storage daemon address */ uint32_t StartFile; uint32_t EndFile; uint32_t StartBlock; uint32_t EndBlock; + pthread_t heartbeat_id; /* id of heartbeat thread */ + volatile BSOCK *hb_bsock; /* duped SD socket */ + POOLMEM *RunAfterJob; /* Command to run after job */ #endif /* FILE_DAEMON */ + #ifdef STORAGE_DAEMON /* Storage Daemon specific part of JCR */ - struct s_jcr *next_dev; /* next JCR attached to device */ - struct s_jcr *prev_dev; /* previous JCR attached to device */ + JCR *next_dev; /* next JCR attached to device */ + JCR *prev_dev; /* previous JCR attached to device */ pthread_cond_t job_start_wait; /* Wait for FD to start Job */ int type; - DEVRES *device; /* device to use */ + DCR *dcr; /* device context record */ + DEVRES *device; /* device resource to use */ VOLUME_CAT_INFO VolCatInfo; /* Catalog info for desired volume */ POOLMEM *job_name; /* base Job name (not unique) */ POOLMEM *fileset_name; /* FileSet */ @@ -184,22 +225,18 @@ struct s_jcr { POOLMEM *media_type; /* media type */ POOLMEM *dev_name; /* device name */ VOL_LIST *VolList; /* list to read */ - long NumVolumes; /* number of volumes used */ - long CurVolume; /* current volume number */ - int mode; /* manual/auto run */ - int spool_attributes; /* set if spooling attributes */ - int no_attributes; /* set if no attributes wanted */ + int32_t NumVolumes; /* number of volumes used */ + int32_t CurVolume; /* current volume number */ int label_status; /* device volume label status */ int label_errors; /* count of label errors */ - int session_opened; - DEV_RECORD rec; /* Read/Write record */ + bool session_opened; long Ticket; /* ticket for this job */ - uint32_t VolFirstFile; /* First file index this Volume */ - uint32_t FileIndex; /* Current File Index */ - uint32_t EndFile; /* End file written */ - uint32_t StartFile; /* Start write file */ - uint32_t StartBlock; /* Start write block */ - uint32_t EndBlock; /* Ending block written */ + bool ignore_label_errors; /* ignore Volume label errors */ + bool spool_attributes; /* set if spooling attributes */ + bool no_attributes; /* set if no attributes wanted */ + bool spool_data; /* set to spool data */ + int CurVol; /* Current Volume count */ + uint32_t FileId; /* Last file id inserted */ /* Parmaters for Open Read Session */ @@ -215,14 +252,18 @@ struct s_jcr { }; + + /* * Structure for all daemons that keeps some summary * info on the last job run. */ struct s_last_job { - int NumJobs; + dlink link; + int xNumJobs; /* no longer used */ int JobType; int JobStatus; + int JobLevel; uint32_t JobId; uint32_t VolSessionId; uint32_t VolSessionTime; @@ -233,15 +274,13 @@ struct s_last_job { char Job[MAX_NAME_LENGTH]; }; -extern struct s_last_job last_job; - -#undef JCR -typedef struct s_jcr JCR; +extern struct s_last_job last_job; +extern dlist *last_jobs; /* The following routines are found in lib/jcr.c */ +extern bool init_jcr_subsystem(void); extern JCR *new_jcr(int size, JCR_free_HANDLER *daemon_free_jcr); -extern void free_jcr(JCR *jcr); extern void free_locked_jcr(JCR *jcr); extern JCR *get_jcr_by_id(uint32_t JobId); extern JCR *get_jcr_by_session(uint32_t SessionId, uint32_t SessionTime); @@ -250,5 +289,13 @@ extern JCR *get_jcr_by_full_name(char *Job); extern JCR *get_next_jcr(JCR *jcr); extern void lock_jcr_chain(); extern void unlock_jcr_chain(); +extern void set_jcr_job_status(JCR *jcr, int JobStatus); + +#ifdef DEBUG +extern void b_free_jcr(const char *file, int line, JCR *jcr); +#define free_jcr(jcr) b_free_jcr(__FILE__, __LINE__, (jcr)) +#else +extern void free_jcr(JCR *jcr); +#endif #endif /* __JCR_H_ */