From 042d2cf5a6781be200fed01c92a68d828018873b Mon Sep 17 00:00:00 2001 From: Frank Ueberschar Date: Wed, 6 Nov 2019 08:23:09 +0100 Subject: [PATCH] stored: move daemon private data to separate file --- core/src/include/jcr.h | 77 ------------ core/src/plugins/stored/scsicrypto-sd.cc | 5 +- core/src/stored/acquire.cc | 23 ++-- core/src/stored/append.cc | 7 +- core/src/stored/authenticate.cc | 7 +- core/src/stored/bcopy.cc | 27 ++-- core/src/stored/bextract.cc | 7 +- core/src/stored/bls.cc | 11 +- core/src/stored/bscan.cc | 61 +++++---- core/src/stored/bsr.cc | 28 +++-- core/src/stored/btape.cc | 29 +++-- core/src/stored/butil.cc | 59 +++++---- core/src/stored/dev.cc | 26 ++-- core/src/stored/device.cc | 19 +-- core/src/stored/dir_cmd.cc | 50 ++++---- core/src/stored/fd_cmds.cc | 43 +++---- core/src/stored/jcr_private.h | 96 +++++++++++++++ core/src/stored/job.cc | 115 +++++++++-------- core/src/stored/job.h | 2 + core/src/stored/label.cc | 19 +-- core/src/stored/mac.cc | 150 ++++++++++++----------- core/src/stored/mount.cc | 8 +- core/src/stored/ndmp_tape.cc | 53 ++++---- core/src/stored/read.cc | 9 +- core/src/stored/read_ctx.h | 14 +++ core/src/stored/read_record.cc | 22 ++-- core/src/stored/record.cc | 4 +- core/src/stored/record.h | 13 -- core/src/stored/reserve.cc | 66 +++++----- core/src/stored/sd_cmds.cc | 13 +- core/src/stored/sd_plugins.cc | 29 ++--- core/src/stored/sd_stats.cc | 5 +- core/src/stored/spool.cc | 30 ++--- core/src/stored/status.cc | 9 +- core/src/stored/stored.cc | 26 ++-- core/src/tests/sd_reservation.cc | 5 +- 36 files changed, 629 insertions(+), 538 deletions(-) create mode 100644 core/src/stored/jcr_private.h diff --git a/core/src/include/jcr.h b/core/src/include/jcr.h index 8cb8b35e7d7..1299fe1a754 100644 --- a/core/src/include/jcr.h +++ b/core/src/include/jcr.h @@ -37,10 +37,6 @@ #include #include "lib/tls_conf.h" -#ifdef STORAGE_DAEMON -#include "stored/read_ctx.h" -#endif - #ifdef DIRECTOR_DAEMON #include "cats/cats.h" #include "dird/client_connection_handshake_mode.h" @@ -52,13 +48,6 @@ typedef struct s_tree_root TREE_ROOT; class dlist; -namespace storagedaemon { -struct VolumeList; -class DeviceControlRecord; -class DirectorResource; -struct BootStrapRecord; -} // namespace storagedaemon - namespace filedaemon { class BareosAccurateFilelist; struct save_pkt; @@ -391,72 +380,6 @@ class JobControlRecord { bool is_passive_client_connection_probing = false; /**< Set if director probes a passive client connection */ JobControlRecordPrivate* impl_; - -#ifdef STORAGE_DAEMON - /* - * Storage Daemon specific part of JobControlRecord - */ - JobControlRecord* next_dev = nullptr; /**< Next JobControlRecord attached to device */ - JobControlRecord* prev_dev = nullptr; /**< Previous JobControlRecord attached to device */ - char* dir_auth_key = nullptr; /**< Dir auth key */ - pthread_cond_t job_start_wait = PTHREAD_COND_INITIALIZER; /**< Wait for FD to start Job */ - pthread_cond_t job_end_wait = PTHREAD_COND_INITIALIZER; /**< Wait for Job to end */ - int32_t type = 0; - storagedaemon::DeviceControlRecord* read_dcr = nullptr; /**< Device context for reading */ - storagedaemon::DeviceControlRecord* dcr = nullptr; /**< Device context record */ - alist* dcrs = nullptr; /**< List of dcrs open */ - POOLMEM* job_name = nullptr; /**< Base Job name (not unique) */ - POOLMEM* fileset_name = nullptr; /**< FileSet */ - POOLMEM* fileset_md5 = nullptr; /**< MD5 for FileSet */ - POOLMEM* backup_format = nullptr; /**< Backup format used when doing a NDMP backup */ - storagedaemon::VolumeList* VolList = nullptr; /**< List to read */ - int32_t NumWriteVolumes = 0; /**< Number of volumes written */ - int32_t NumReadVolumes = 0; /**< Total number of volumes to read */ - int32_t CurReadVolume = 0; /**< Current read volume number */ - int32_t label_errors = 0; /**< Count of label errors */ - bool session_opened = false; - bool remote_replicate = false; /**< Replicate data to remote SD */ - int32_t Ticket = 0; /**< Ticket for this job */ - bool ignore_label_errors = false; /**< Ignore Volume label errors */ - bool spool_attributes = false; /**< Set if spooling attributes */ - bool no_attributes = false; /**< Set if no attributes wanted */ - int64_t spool_size = 0; /**< Spool size for this job */ - bool spool_data = false; /**< Set to spool data */ - int32_t CurVol = 0; /**< Current Volume count */ - storagedaemon::DirectorResource* director = nullptr; /**< Director resource */ - alist* plugin_options = nullptr; /**< Specific Plugin Options sent by DIR */ - alist* write_store = nullptr; /**< List of write storage devices sent by DIR */ - alist* read_store = nullptr; /**< List of read devices sent by DIR */ - alist* reserve_msgs = nullptr; /**< Reserve fail messages */ - bool acquired_storage = false; /**< Did we acquire our reserved storage already or not */ - bool PreferMountedVols = false; /**< Prefer mounted vols rather than new */ - bool Resched = false; /**< Job may be rescheduled */ - bool insert_jobmedia_records = false; /**< Need to insert job media records */ - uint64_t RemainingQuota = 0; /**< Available bytes to use as quota */ - - /* - * Parameters for Open Read Session - */ - storagedaemon::READ_CTX* rctx = nullptr; /**< Read context used to keep track of what is processed or not */ - storagedaemon::BootStrapRecord* bsr = nullptr; /**< Bootstrap record -- has everything */ - bool mount_next_volume = false; /**< Set to cause next volume mount */ - uint32_t read_VolSessionId = 0; - uint32_t read_VolSessionTime = 0; - uint32_t read_StartFile = 0; - uint32_t read_EndFile = 0; - uint32_t read_StartBlock = 0; - uint32_t read_EndBlock = 0; - - /* - * Device wait times - */ - int32_t min_wait = 0; - int32_t max_wait = 0; - int32_t max_num_wait = 0; - int32_t wait_sec = 0; - int32_t rem_wait_sec = 0; - int32_t num_wait = 0; -#endif /* STORAGE_DAEMON */ }; /* clang-format on */ diff --git a/core/src/plugins/stored/scsicrypto-sd.cc b/core/src/plugins/stored/scsicrypto-sd.cc index 5b251ac2d2a..07b3784055d 100644 --- a/core/src/plugins/stored/scsicrypto-sd.cc +++ b/core/src/plugins/stored/scsicrypto-sd.cc @@ -61,6 +61,7 @@ */ #include "include/bareos.h" #include "stored/stored.h" +#include "stored/jcr_private.h" #include "lib/berrno.h" #include "lib/status.h" #include "lib/crypto_wrap.h" @@ -365,8 +366,8 @@ static bRC do_set_scsi_encryption_key(void* value) * has been wrapped using RFC3394 key wrapping. We first copy the current * wrapped key into a temporary variable for unwrapping. */ - if (dcr->jcr && dcr->jcr->director) { - director = dcr->jcr->director; + if (dcr->jcr && dcr->jcr->impl_->director) { + director = dcr->jcr->impl_->director; if (director->keyencrkey.value) { char WrappedVolEncrKey[MAX_NAME_LENGTH]; diff --git a/core/src/stored/acquire.cc b/core/src/stored/acquire.cc index 9a799575e19..2fa5e2a110b 100644 --- a/core/src/stored/acquire.cc +++ b/core/src/stored/acquire.cc @@ -43,6 +43,7 @@ #include "lib/berrno.h" #include "include/jcr.h" #include "stored/block.h" +#include "stored/jcr_private.h" namespace storagedaemon { @@ -112,7 +113,7 @@ bool AcquireDeviceForRead(DeviceControlRecord* dcr) } /* Find next Volume, if any */ - vol = jcr->VolList; + vol = jcr->impl_->VolList; if (!vol) { char ed1[50]; Jmsg(jcr, M_FATAL, 0, @@ -120,12 +121,12 @@ bool AcquireDeviceForRead(DeviceControlRecord* dcr) edit_int64(jcr->JobId, ed1)); goto get_out; } - jcr->CurReadVolume++; - for (i = 1; i < jcr->CurReadVolume; i++) { vol = vol->next; } + jcr->impl_->CurReadVolume++; + for (i = 1; i < jcr->impl_->CurReadVolume; i++) { vol = vol->next; } if (!vol) { Jmsg(jcr, M_FATAL, 0, _("Logic error: no next volume to read. Numvol=%d Curvol=%d\n"), - jcr->NumReadVolumes, jcr->CurReadVolume); + jcr->impl_->NumReadVolumes, jcr->impl_->CurReadVolume); goto get_out; /* should not happen */ } SetDcrFromVol(dcr, vol); @@ -166,8 +167,8 @@ bool AcquireDeviceForRead(DeviceControlRecord* dcr) LockReservations(); memset(&rctx, 0, sizeof(ReserveContext)); rctx.jcr = jcr; - jcr->read_dcr = dcr; - jcr->reserve_msgs = new alist(10, not_owned_by_alist); + jcr->impl_->read_dcr = dcr; + jcr->impl_->reserve_msgs = new alist(10, not_owned_by_alist); rctx.any_drive = true; rctx.device_name = vol->device; store = new DirectorStorage; @@ -508,7 +509,7 @@ DeviceControlRecord* AcquireDeviceForAppend(DeviceControlRecord* dcr) } dev->num_writers++; /* we are now a writer */ - if (jcr->NumWriteVolumes == 0) { jcr->NumWriteVolumes = 1; } + if (jcr->impl_->NumWriteVolumes == 0) { jcr->impl_->NumWriteVolumes = 1; } dev->VolCatInfo.VolCatJobs++; /* increment number of jobs on vol */ Dmsg4(100, "=== nwriters=%d nres=%d vcatjob=%d dev=%s\n", dev->num_writers, dev->NumReserved(), dev->VolCatInfo.VolCatJobs, dev->print_name()); @@ -782,8 +783,8 @@ void SetupNewDcrDevice(JobControlRecord* jcr, /* * Use job spoolsize prior to device spoolsize */ - if (jcr && jcr->spool_size) { - dcr->max_job_spool_size = jcr->spool_size; + if (jcr && jcr->impl_->spool_size) { + dcr->max_job_spool_size = jcr->impl_->spool_size; } else { dcr->max_job_spool_size = dev->device->max_job_spool_size; } @@ -876,9 +877,9 @@ void FreeDeviceControlRecord(DeviceControlRecord* dcr) if (dcr->rec) { FreeRecord(dcr->rec); } - if (jcr && jcr->dcr == dcr) { jcr->dcr = NULL; } + if (jcr && jcr->impl_->dcr == dcr) { jcr->impl_->dcr = NULL; } - if (jcr && jcr->read_dcr == dcr) { jcr->read_dcr = NULL; } + if (jcr && jcr->impl_->read_dcr == dcr) { jcr->impl_->read_dcr = NULL; } V(dcr->mutex_); diff --git a/core/src/stored/append.cc b/core/src/stored/append.cc index a7492f825ac..0e9d18fe842 100644 --- a/core/src/stored/append.cc +++ b/core/src/stored/append.cc @@ -32,6 +32,7 @@ #include "stored/acquire.h" #include "stored/append.h" #include "stored/fd_cmds.h" +#include "stored/jcr_private.h" #include "stored/label.h" #include "stored/spool.h" #include "lib/bget_msg.h" @@ -60,7 +61,7 @@ bool DoAppendData(JobControlRecord* jcr, BareosSocket* bs, const char* what) int32_t n, file_index, stream, last_file_index, job_elapsed; bool ok = true; char buf1[100]; - DeviceControlRecord* dcr = jcr->dcr; + DeviceControlRecord* dcr = jcr->impl_->dcr; Device* dev; POOLMEM* rec_data; char ec[50]; @@ -362,11 +363,11 @@ bool SendAttrsToDir(JobControlRecord* jcr, DeviceRecord* rec) rec->maskedStream == STREAM_UNIX_ATTRIBUTES_EX || rec->maskedStream == STREAM_RESTORE_OBJECT || CryptoDigestStreamType(rec->maskedStream) != CRYPTO_DIGEST_NONE) { - if (!jcr->no_attributes) { + if (!jcr->impl_->no_attributes) { BareosSocket* dir = jcr->dir_bsock; if (AreAttributesSpooled(jcr)) { dir->SetSpooling(); } Dmsg0(850, "Send attributes to dir.\n"); - if (!jcr->dcr->DirUpdateFileAttributes(rec)) { + if (!jcr->impl_->dcr->DirUpdateFileAttributes(rec)) { Jmsg(jcr, M_FATAL, 0, _("Error updating file attributes. ERR=%s\n"), dir->bstrerror()); dir->ClearSpooling(); diff --git a/core/src/stored/authenticate.cc b/core/src/stored/authenticate.cc index 6d0b0dc7f39..9d0b50831e3 100644 --- a/core/src/stored/authenticate.cc +++ b/core/src/stored/authenticate.cc @@ -30,7 +30,7 @@ #include "include/bareos.h" #include "stored/stored.h" #include "stored/stored_globals.h" -#include "include/jcr.h" +#include "stored/jcr_private.h" #include "lib/parse_conf.h" #include "lib/bsock.h" #include "lib/bnet_network_dump.h" @@ -89,7 +89,7 @@ bool AuthenticateDirector(JobControlRecord* jcr) UnbashSpaces(dirname); director = (DirectorResource*)my_config->GetResWithName(R_DIRECTOR, dirname); - jcr->director = director; + jcr->impl_->director = director; if (!director) { Dmsg2(debuglevel, "Connection from unknown Director %s at %s rejected.\n", @@ -161,7 +161,8 @@ bool AuthenticateWithStoragedaemon(JobControlRecord* jcr) password.value = jcr->sd_auth_key; if (!sd->AuthenticateOutboundConnection( - jcr, my_config->CreateOwnQualifiedNameForNetworkDump(), identity, password, me)) { + jcr, my_config->CreateOwnQualifiedNameForNetworkDump(), identity, + password, me)) { Jmsg1(jcr, M_FATAL, 0, _("Authorization problem: Two way security handshake failed with " "Storage daemon at %s\n"), diff --git a/core/src/stored/bcopy.cc b/core/src/stored/bcopy.cc index 9658c3142dd..7d81fb24996 100644 --- a/core/src/stored/bcopy.cc +++ b/core/src/stored/bcopy.cc @@ -34,6 +34,7 @@ #include "lib/crypto_cache.h" #include "stored/acquire.h" #include "stored/butil.h" +#include "stored/jcr_private.h" #include "stored/label.h" #include "stored/mount.h" #include "stored/read_record.h" @@ -207,9 +208,9 @@ int main(int argc, char* argv[]) true); /* read device */ if (!in_jcr) { exit(1); } - in_jcr->ignore_label_errors = ignore_label_errors; + in_jcr->impl_->ignore_label_errors = ignore_label_errors; - in_dev = in_jcr->dcr->dev; + in_dev = in_jcr->impl_->dcr->dev; if (!in_dev) { exit(1); } /* @@ -222,7 +223,7 @@ int main(int argc, char* argv[]) false); /* write device */ if (!out_jcr) { exit(1); } - out_dev = out_jcr->dcr->dev; + out_dev = out_jcr->impl_->dcr->dev; if (!out_dev) { exit(1); } Dmsg0(100, "About to acquire device for writing\n"); @@ -231,22 +232,22 @@ int main(int argc, char* argv[]) * For we must now acquire the device for writing */ out_dev->rLock(false); - if (!out_dev->open(out_jcr->dcr, OPEN_READ_WRITE)) { + if (!out_dev->open(out_jcr->impl_->dcr, OPEN_READ_WRITE)) { Emsg1(M_FATAL, 0, _("dev open failed: %s\n"), out_dev->errmsg); out_dev->Unlock(); exit(1); } out_dev->Unlock(); - if (!AcquireDeviceForAppend(out_jcr->dcr)) { + if (!AcquireDeviceForAppend(out_jcr->impl_->dcr)) { FreeJcr(in_jcr); exit(1); } - out_block = out_jcr->dcr->block; + out_block = out_jcr->impl_->dcr->block; - ok = ReadRecords(in_jcr->dcr, RecordCb, MountNextReadVolume); + ok = ReadRecords(in_jcr->impl_->dcr, RecordCb, MountNextReadVolume); if (ok || out_dev->CanWrite()) { - if (!out_jcr->dcr->WriteBlockToDevice()) { + if (!out_jcr->impl_->dcr->WriteBlockToDevice()) { Pmsg0(000, _("Write of last block failed.\n")); } } @@ -305,10 +306,10 @@ static bool RecordCb(DeviceControlRecord* in_dcr, DeviceRecord* rec) /* Skipping record, because does not match BootStrapRecord filter */ return true; } - while (!WriteRecordToBlock(out_jcr->dcr, rec)) { + while (!WriteRecordToBlock(out_jcr->impl_->dcr, rec)) { Dmsg2(150, "!WriteRecordToBlock data_len=%d rem=%d\n", rec->data_len, rec->remainder); - if (!out_jcr->dcr->WriteBlockToDevice()) { + if (!out_jcr->impl_->dcr->WriteBlockToDevice()) { Dmsg2(90, "Got WriteBlockToDev error on device %s: ERR=%s\n", out_dev->print_name(), out_dev->bstrerror()); Jmsg(out_jcr, M_FATAL, 0, _("Cannot fixup device error. %s\n"), @@ -316,7 +317,7 @@ static bool RecordCb(DeviceControlRecord* in_dcr, DeviceRecord* rec) return false; } } - if (!out_jcr->dcr->WriteBlockToDevice()) { + if (!out_jcr->impl_->dcr->WriteBlockToDevice()) { Dmsg2(90, "Got WriteBlockToDev error on device %s: ERR=%s\n", out_dev->print_name(), out_dev->bstrerror()); Jmsg(out_jcr, M_FATAL, 0, _("Cannot fixup device error. %s\n"), @@ -341,10 +342,10 @@ static bool RecordCb(DeviceControlRecord* in_dcr, DeviceRecord* rec) return true; } records++; - while (!WriteRecordToBlock(out_jcr->dcr, rec)) { + while (!WriteRecordToBlock(out_jcr->impl_->dcr, rec)) { Dmsg2(150, "!WriteRecordToBlock data_len=%d rem=%d\n", rec->data_len, rec->remainder); - if (!out_jcr->dcr->WriteBlockToDevice()) { + if (!out_jcr->impl_->dcr->WriteBlockToDevice()) { Dmsg2(90, "Got WriteBlockToDev error on device %s: ERR=%s\n", out_dev->print_name(), out_dev->bstrerror()); Jmsg(out_jcr, M_FATAL, 0, _("Cannot fixup device error. %s\n"), diff --git a/core/src/stored/bextract.cc b/core/src/stored/bextract.cc index 927f5b2bb99..6b69b232a14 100644 --- a/core/src/stored/bextract.cc +++ b/core/src/stored/bextract.cc @@ -34,6 +34,7 @@ #include "lib/crypto_cache.h" #include "stored/acquire.h" #include "stored/butil.h" +#include "stored/jcr_private.h" #include "stored/mount.h" #include "stored/read_record.h" #include "findlib/find.h" @@ -402,9 +403,9 @@ static void DoExtract(char* devname) jcr = SetupJcr("bextract", devname, bsr, director, dcr, VolumeName, true); /* read device */ if (!jcr) { exit(1); } - dev = jcr->read_dcr->dev; + dev = jcr->impl_->read_dcr->dev; if (!dev) { exit(1); } - dcr = jcr->read_dcr; + dcr = jcr->impl_->read_dcr; /* * Make sure where directory exists and that it is a directory @@ -453,7 +454,7 @@ static void DoExtract(char* devname) CleanupCompression(jcr); - CleanDevice(jcr->dcr); + CleanDevice(jcr->impl_->dcr); dev->term(); FreeDeviceControlRecord(dcr); FreeJcr(jcr); diff --git a/core/src/stored/bls.cc b/core/src/stored/bls.cc index 6da1a28707c..10a07135c96 100644 --- a/core/src/stored/bls.cc +++ b/core/src/stored/bls.cc @@ -36,6 +36,7 @@ #include "findlib/find.h" #include "stored/acquire.h" #include "stored/butil.h" +#include "stored/jcr_private.h" #include "stored/label.h" #include "stored/match_bsr.h" #include "stored/mount.h" @@ -253,10 +254,10 @@ int main(int argc, char* argv[]) jcr = SetupJcr("bls", argv[i], bsr, director, dcr, VolumeName, true); /* read device */ if (!jcr) { exit(1); } - jcr->ignore_label_errors = ignore_label_errors; - dev = jcr->dcr->dev; + jcr->impl_->ignore_label_errors = ignore_label_errors; + dev = jcr->impl_->dcr->dev; if (!dev) { exit(1); } - dcr = jcr->dcr; + dcr = jcr->impl_->dcr; rec = new_record(); attr = new_attr(jcr); /* @@ -289,9 +290,9 @@ static void do_close(JobControlRecord* jcr) { FreeAttr(attr); FreeRecord(rec); - CleanDevice(jcr->dcr); + CleanDevice(jcr->impl_->dcr); dev->term(); - FreeDeviceControlRecord(jcr->dcr); + FreeDeviceControlRecord(jcr->impl_->dcr); FreeJcr(jcr); } diff --git a/core/src/stored/bscan.cc b/core/src/stored/bscan.cc index 556831c57e9..9960955ad50 100644 --- a/core/src/stored/bscan.cc +++ b/core/src/stored/bscan.cc @@ -33,6 +33,7 @@ #include "include/bareos.h" #include "stored/stored.h" #include "stored/stored_globals.h" +#include "stored/jcr_private.h" #include "lib/crypto_cache.h" #include "findlib/find.h" #include "cats/cats.h" @@ -342,7 +343,7 @@ int main(int argc, char* argv[]) dcr = new DeviceControlRecord; bjcr = SetupJcr("bscan", argv[0], bsr, director, dcr, VolumeName, true); if (!bjcr) { exit(1); } - dev = bjcr->read_dcr->dev; + dev = bjcr->impl_->read_dcr->dev; if (showProgress) { char ed1[50]; @@ -385,9 +386,9 @@ int main(int argc, char* argv[]) } DbFlushBackends(); - CleanDevice(bjcr->dcr); + CleanDevice(bjcr->impl_->dcr); dev->term(); - FreeDeviceControlRecord(bjcr->dcr); + FreeDeviceControlRecord(bjcr->impl_->dcr); FreeJcr(bjcr); return 0; @@ -415,8 +416,8 @@ static bool BscanMountNextReadVolume(DeviceControlRecord* dcr) mdcr->EndBlock = dcr->EndBlock; mdcr->EndFile = dcr->EndFile; mdcr->VolMediaId = dcr->VolMediaId; - mjcr->read_dcr->VolLastIndex = dcr->VolLastIndex; - if (mjcr->insert_jobmedia_records) { + mjcr->impl_->read_dcr->VolLastIndex = dcr->VolLastIndex; + if (mjcr->impl_->insert_jobmedia_records) { if (!CreateJobmediaRecord(db, mjcr)) { Pmsg2(000, _("Could not create JobMedia record for Volume=%s Job=%s\n"), dev->getVolCatName(), mjcr->Job); @@ -463,7 +464,7 @@ static void do_scan() /* * Detach bscan's jcr as we are not a real Job on the tape */ - ReadRecords(bjcr->read_dcr, RecordCb, BscanMountNextReadVolume); + ReadRecords(bjcr->impl_->read_dcr, RecordCb, BscanMountNextReadVolume); if (update_db) { db->WriteBatchFileRecords(bjcr); /* used by bulk batch file insert */ @@ -681,7 +682,7 @@ static bool RecordCb(DeviceControlRecord* dcr, DeviceRecord* rec) * Process label, if Job record exists don't update db */ mjcr = CreateJobRecord(db, &jr, &label, rec); - dcr = mjcr->read_dcr; + dcr = mjcr->impl_->read_dcr; update_db = save_update_db; jr.PoolId = pr.PoolId; @@ -690,8 +691,8 @@ static bool RecordCb(DeviceControlRecord* dcr, DeviceRecord* rec) mjcr->client_name = GetPoolMemory(PM_FNAME); PmStrcpy(mjcr->client_name, label.ClientName); - mjcr->fileset_name = GetPoolMemory(PM_FNAME); - PmStrcpy(mjcr->fileset_name, label.FileSetName); + mjcr->impl_->fileset_name = GetPoolMemory(PM_FNAME); + PmStrcpy(mjcr->impl_->fileset_name, label.FileSetName); bstrncpy(dcr->pool_type, label.PoolType, sizeof(dcr->pool_type)); bstrncpy(dcr->pool_name, label.PoolName, sizeof(dcr->pool_name)); @@ -705,9 +706,9 @@ static bool RecordCb(DeviceControlRecord* dcr, DeviceRecord* rec) jr.JobId); db->SqlQuery(sql_buffer.c_str(), db_int64_handler, &jmr_count); if (jmr_count.value > 0) { - mjcr->insert_jobmedia_records = false; + mjcr->impl_->insert_jobmedia_records = false; } else { - mjcr->insert_jobmedia_records = true; + mjcr->impl_->insert_jobmedia_records = true; } if (rec->VolSessionId != jr.VolSessionId) { @@ -770,9 +771,11 @@ static bool RecordCb(DeviceControlRecord* dcr, DeviceRecord* rec) /* * Create JobMedia record */ - mjcr->read_dcr->VolLastIndex = dcr->VolLastIndex; - if (mjcr->insert_jobmedia_records) { CreateJobmediaRecord(db, mjcr); } - FreeDeviceControlRecord(mjcr->read_dcr); + mjcr->impl_->read_dcr->VolLastIndex = dcr->VolLastIndex; + if (mjcr->impl_->insert_jobmedia_records) { + CreateJobmediaRecord(db, mjcr); + } + FreeDeviceControlRecord(mjcr->impl_->read_dcr); FreeJcr(mjcr); } break; @@ -829,7 +832,7 @@ static bool RecordCb(DeviceControlRecord* dcr, DeviceRecord* rec) } return true; } - dcr = mjcr->read_dcr; + dcr = mjcr->impl_->read_dcr; if (dcr->VolFirstIndex == 0) { dcr->VolFirstIndex = block->FirstIndex; } /* @@ -1068,14 +1071,19 @@ static void BscanFreeJcr(JobControlRecord* jcr) if (jcr->RestoreBootstrap) { free(jcr->RestoreBootstrap); } - if (jcr->dcr) { - FreeDeviceControlRecord(jcr->dcr); - jcr->dcr = NULL; + if (jcr->impl_->dcr) { + FreeDeviceControlRecord(jcr->impl_->dcr); + jcr->impl_->dcr = NULL; + } + + if (jcr->impl_->read_dcr) { + FreeDeviceControlRecord(jcr->impl_->read_dcr); + jcr->impl_->read_dcr = NULL; } - if (jcr->read_dcr) { - FreeDeviceControlRecord(jcr->read_dcr); - jcr->read_dcr = NULL; + if (jcr->impl_) { + delete jcr->impl_; + jcr->impl_ = nullptr; } Dmsg0(200, "End bscan FreeJcr\n"); @@ -1093,7 +1101,7 @@ static bool CreateFileAttributesRecord(BareosDb* db, char* ap, DeviceRecord* rec) { - DeviceControlRecord* dcr = mjcr->read_dcr; + DeviceControlRecord* dcr = mjcr->impl_->read_dcr; ar.fname = fname; ar.link = lname; ar.ClientId = mjcr->ClientId; @@ -1445,7 +1453,7 @@ static bool UpdateJobRecord(BareosDb* db, "Last Volume Bytes: %s\n" "Bareos binary info: %s\n" "Termination: %s\n\n"), - edt, mjcr->JobId, mjcr->Job, mjcr->fileset_name, + edt, mjcr->JobId, mjcr->Job, mjcr->impl_->fileset_name, job_level_to_str(mjcr->getJobLevel()), mjcr->client_name, sdt, edt, edit_uint64_with_commas(mjcr->JobFiles, ec1), edit_uint64_with_commas(mjcr->JobBytes, ec2), mjcr->VolSessionId, @@ -1460,7 +1468,7 @@ static bool UpdateJobRecord(BareosDb* db, static bool CreateJobmediaRecord(BareosDb* db, JobControlRecord* mjcr) { JobMediaDbRecord jmr; - DeviceControlRecord* dcr = mjcr->read_dcr; + DeviceControlRecord* dcr = mjcr->impl_->read_dcr; dcr->EndBlock = dev->EndBlock; dcr->EndFile = dev->EndFile; @@ -1542,6 +1550,7 @@ static JobControlRecord* create_jcr(JobDbRecord* jr, * the JobId and the ClientId. */ jobjcr = new_jcr(sizeof(JobControlRecord), BscanFreeJcr); + jobjcr->impl_ = new JobControlRecordPrivate; jobjcr->setJobType(jr->JobType); jobjcr->setJobLevel(jr->JobLevel); jobjcr->JobStatus = jr->JobStatus; @@ -1552,8 +1561,8 @@ static JobControlRecord* create_jcr(JobDbRecord* jr, jobjcr->VolSessionId = rec->VolSessionId; jobjcr->VolSessionTime = rec->VolSessionTime; jobjcr->ClientId = jr->ClientId; - jobjcr->dcr = jobjcr->read_dcr = new DeviceControlRecord; - SetupNewDcrDevice(jobjcr, jobjcr->dcr, dev, NULL); + jobjcr->impl_->dcr = jobjcr->impl_->read_dcr = new DeviceControlRecord; + SetupNewDcrDevice(jobjcr, jobjcr->impl_->dcr, dev, NULL); return jobjcr; } diff --git a/core/src/stored/bsr.cc b/core/src/stored/bsr.cc index 8bd396b1f35..7b5459c56c6 100644 --- a/core/src/stored/bsr.cc +++ b/core/src/stored/bsr.cc @@ -40,6 +40,7 @@ #include "include/bareos.h" #include "stored/bsr.h" +#include "stored/jcr_private.h" #include "stored/stored.h" #include "include/jcr.h" @@ -795,13 +796,13 @@ static VolumeList* new_restore_volume() */ static bool AddRestoreVolume(JobControlRecord* jcr, VolumeList* vol) { - VolumeList* next = jcr->VolList; + VolumeList* next = jcr->impl_->VolList; /* Add volume to volume manager's read list */ AddReadVolume(jcr, vol->VolumeName); - if (!next) { /* list empty ? */ - jcr->VolList = vol; /* yes, add volume */ + if (!next) { /* list empty ? */ + jcr->impl_->VolList = vol; /* yes, add volume */ } else { /* Loop through all but last */ for (; next->next; next = next->next) { @@ -837,10 +838,10 @@ void CreateRestoreVolumeList(JobControlRecord* jcr) /* * Build a list of volumes to be processed */ - jcr->NumReadVolumes = 0; - jcr->CurReadVolume = 0; - if (jcr->bsr) { - BootStrapRecord* bsr = jcr->bsr; + jcr->impl_->NumReadVolumes = 0; + jcr->impl_->CurReadVolume = 0; + if (jcr->impl_->bsr) { + BootStrapRecord* bsr = jcr->impl_->bsr; if (!bsr->volume || !bsr->volume->VolumeName[0]) { return; } for (; bsr; bsr = bsr->next) { BsrVolume* bsrvol; @@ -860,7 +861,7 @@ void CreateRestoreVolumeList(JobControlRecord* jcr) vol->Slot = bsrvol->Slot; vol->start_file = sfile; if (AddRestoreVolume(jcr, vol)) { - jcr->NumReadVolumes++; + jcr->impl_->NumReadVolumes++; Dmsg2(400, "Added volume=%s mediatype=%s\n", vol->VolumeName, vol->MediaType); } else { @@ -872,14 +873,15 @@ void CreateRestoreVolumeList(JobControlRecord* jcr) } } else { /* This is the old way -- deprecated */ - for (p = jcr->dcr->VolumeName; p && *p;) { + for (p = jcr->impl_->dcr->VolumeName; p && *p;) { n = strchr(p, '|'); /* volume name separator */ if (n) { *n++ = 0; /* Terminate name */ } vol = new_restore_volume(); bstrncpy(vol->VolumeName, p, sizeof(vol->VolumeName)); - bstrncpy(vol->MediaType, jcr->dcr->media_type, sizeof(vol->MediaType)); + bstrncpy(vol->MediaType, jcr->impl_->dcr->media_type, + sizeof(vol->MediaType)); if (AddRestoreVolume(jcr, vol)) { - jcr->NumReadVolumes++; + jcr->impl_->NumReadVolumes++; } else { free((char*)vol); } @@ -890,7 +892,7 @@ void CreateRestoreVolumeList(JobControlRecord* jcr) void FreeRestoreVolumeList(JobControlRecord* jcr) { - VolumeList* vol = jcr->VolList; + VolumeList* vol = jcr->impl_->VolList; VolumeList* tmp; for (; vol;) { @@ -899,7 +901,7 @@ void FreeRestoreVolumeList(JobControlRecord* jcr) free(vol); vol = tmp; } - jcr->VolList = NULL; + jcr->impl_->VolList = NULL; } } /* namespace storagedaemon */ diff --git a/core/src/stored/btape.cc b/core/src/stored/btape.cc index 459ba409663..48b931a6e47 100644 --- a/core/src/stored/btape.cc +++ b/core/src/stored/btape.cc @@ -43,6 +43,7 @@ #include "stored/bsr.h" #include "stored/butil.h" #include "stored/device.h" +#include "stored/jcr_private.h" #include "stored/label.h" #include "stored/read_record.h" #include "stored/sd_backends.h" @@ -310,7 +311,7 @@ int main(int margc, char* margv[]) false); /* write device */ if (!jcr) { exit(1); } - dev = jcr->dcr->dev; + dev = jcr->impl_->dcr->dev; if (!dev) { exit(1); } if (!dev->IsTape()) { @@ -2172,7 +2173,7 @@ static void fillcmd() exit_code = 1; return; } - block = jcr->dcr->block; + block = jcr->impl_->dcr->block; Dmsg0(100, "Just after AcquireDeviceForAppend\n"); /* @@ -2198,7 +2199,7 @@ static void fillcmd() /* * Generate data as if from File daemon, write to device */ - jcr->dcr->VolFirstIndex = 0; + jcr->impl_->dcr->VolFirstIndex = 0; time(&jcr->run_time); /* start counting time for rates */ bstrftime(buf1, sizeof(buf1), jcr->run_time, "%H:%M:%S"); @@ -2344,15 +2345,15 @@ static void fillcmd() Pmsg3(0, _("\n\n%s Done filling tape at %d:%d. Now beginning re-read of " "tape ...\n"), - buf1, jcr->dcr->dev->file, jcr->dcr->dev->block_num); + buf1, jcr->impl_->dcr->dev->file, jcr->impl_->dcr->dev->block_num); } else { Pmsg3(0, _("\n\n%s Done filling tapes at %d:%d. Now beginning re-read of " "first tape ...\n"), - buf1, jcr->dcr->dev->file, jcr->dcr->dev->block_num); + buf1, jcr->impl_->dcr->dev->file, jcr->impl_->dcr->dev->block_num); } - jcr->dcr->block = block; + jcr->impl_->dcr->block = block; if (!do_unfill()) { Pmsg0(000, _("do_unfill failed.\n")); exit_code = 1; @@ -2445,12 +2446,14 @@ static bool do_unfill() last_block = last_block1; FreeRestoreVolumeList(jcr); - jcr->bsr = NULL; + jcr->impl_->bsr = NULL; bstrncpy(dcr->VolumeName, "TestVolume1|TestVolume2", sizeof(dcr->VolumeName)); CreateRestoreVolumeList(jcr); - if (jcr->VolList != NULL) { - jcr->VolList->Slot = 1; - if (jcr->VolList->next != NULL) { jcr->VolList->next->Slot = 2; } + if (jcr->impl_->VolList != NULL) { + jcr->impl_->VolList->Slot = 1; + if (jcr->impl_->VolList->next != NULL) { + jcr->impl_->VolList->next->Slot = 2; + } } SetVolumeName("TestVolume1", 1); @@ -2470,7 +2473,7 @@ static bool do_unfill() dev->close(dcr); dev->num_writers = 0; - jcr->dcr->clear_will_write(); + jcr->impl_->dcr->clear_will_write(); if (!AcquireDeviceForRead(dcr)) { Pmsg1(-1, "%s", dev->errmsg); @@ -2697,7 +2700,7 @@ static int FlushBlock(DeviceBlock* block, int dump) stop = -1; /* stop, but do simplified test */ } else { /* Full test in progress */ - if (!FixupDeviceBlockWriteError(jcr->dcr)) { + if (!FixupDeviceBlockWriteError(jcr->impl_->dcr)) { Pmsg1(000, _("Cannot fixup device error. %s\n"), dev->bstrerror()); ok = false; dev->Unlock(); @@ -3063,7 +3066,7 @@ static bool MyMountNextReadVolume(DeviceControlRecord* dcr) static void SetVolumeName(const char* VolName, int volnum) { - DeviceControlRecord* dcr = jcr->dcr; + DeviceControlRecord* dcr = jcr->impl_->dcr; volumename = VolName; vol_num = volnum; dev->setVolCatName(VolName); diff --git a/core/src/stored/butil.cc b/core/src/stored/butil.cc index 3943f5051a1..955b41a75ef 100644 --- a/core/src/stored/butil.cc +++ b/core/src/stored/butil.cc @@ -40,6 +40,7 @@ #include "stored/autochanger.h" #include "stored/device.h" #include "stored/bsr.h" +#include "stored/jcr_private.h" #include "lib/parse_bsr.h" #include "lib/parse_conf.h" #include "include/jcr.h" @@ -68,27 +69,28 @@ JobControlRecord* SetupJcr(const char* name, bool readonly) { JobControlRecord* jcr = new_jcr(sizeof(JobControlRecord), MyFreeJcr); + jcr->impl_ = new JobControlRecordPrivate; - jcr->bsr = bsr; - jcr->director = director; + jcr->impl_->bsr = bsr; + jcr->impl_->director = director; jcr->VolSessionId = 1; jcr->VolSessionTime = (uint32_t)time(NULL); - jcr->NumReadVolumes = 0; - jcr->NumWriteVolumes = 0; + jcr->impl_->NumReadVolumes = 0; + jcr->impl_->NumWriteVolumes = 0; jcr->JobId = 0; jcr->setJobType(JT_CONSOLE); jcr->setJobLevel(L_FULL); jcr->JobStatus = JS_Terminated; jcr->where = strdup(""); - jcr->job_name = GetPoolMemory(PM_FNAME); - PmStrcpy(jcr->job_name, "Dummy.Job.Name"); + jcr->impl_->job_name = GetPoolMemory(PM_FNAME); + PmStrcpy(jcr->impl_->job_name, "Dummy.Job.Name"); jcr->client_name = GetPoolMemory(PM_FNAME); PmStrcpy(jcr->client_name, "Dummy.Client.Name"); bstrncpy(jcr->Job, name, sizeof(jcr->Job)); - jcr->fileset_name = GetPoolMemory(PM_FNAME); - PmStrcpy(jcr->fileset_name, "Dummy.fileset.name"); - jcr->fileset_md5 = GetPoolMemory(PM_FNAME); - PmStrcpy(jcr->fileset_md5, "Dummy.fileset.md5"); + jcr->impl_->fileset_name = GetPoolMemory(PM_FNAME); + PmStrcpy(jcr->impl_->fileset_name, "Dummy.fileset.name"); + jcr->impl_->fileset_md5 = GetPoolMemory(PM_FNAME); + PmStrcpy(jcr->impl_->fileset_md5, "Dummy.fileset.md5"); NewPlugins(jcr); /* instantiate plugins */ @@ -140,7 +142,7 @@ static bool setup_to_access_device(DeviceControlRecord* dcr, } else { VolName[0] = 0; } - if (!jcr->bsr && VolName[0] == 0) { + if (!jcr->impl_->bsr && VolName[0] == 0) { if (!bstrncmp(dev_name, "/dev/", 5)) { /* Try stripping file part */ p = dev_name + strlen(dev_name); @@ -165,7 +167,7 @@ static bool setup_to_access_device(DeviceControlRecord* dcr, return false; } device->dev = dev; - jcr->dcr = dcr; + jcr->impl_->dcr = dcr; SetupNewDcrDevice(jcr, dcr, dev, NULL); if (!readonly) { dcr->SetWillWrite(); } @@ -179,7 +181,7 @@ static bool setup_to_access_device(DeviceControlRecord* dcr, if (readonly) { /* read only access? */ Dmsg0(100, "Acquire device for read\n"); if (!AcquireDeviceForRead(dcr)) { return false; } - jcr->read_dcr = dcr; + jcr->impl_->read_dcr = dcr; } else { if (!FirstOpenDevice(dcr)) { Jmsg1(jcr, M_FATAL, 0, _("Cannot open %s\n"), dev->print_name()); @@ -196,9 +198,9 @@ static bool setup_to_access_device(DeviceControlRecord* dcr, */ static void MyFreeJcr(JobControlRecord* jcr) { - if (jcr->job_name) { - FreePoolMemory(jcr->job_name); - jcr->job_name = NULL; + if (jcr->impl_->job_name) { + FreePoolMemory(jcr->impl_->job_name); + jcr->impl_->job_name = NULL; } if (jcr->client_name) { @@ -206,14 +208,14 @@ static void MyFreeJcr(JobControlRecord* jcr) jcr->client_name = NULL; } - if (jcr->fileset_name) { - FreePoolMemory(jcr->fileset_name); - jcr->fileset_name = NULL; + if (jcr->impl_->fileset_name) { + FreePoolMemory(jcr->impl_->fileset_name); + jcr->impl_->fileset_name = NULL; } - if (jcr->fileset_md5) { - FreePoolMemory(jcr->fileset_md5); - jcr->fileset_md5 = NULL; + if (jcr->impl_->fileset_md5) { + FreePoolMemory(jcr->impl_->fileset_md5); + jcr->impl_->fileset_md5 = NULL; } if (jcr->comment) { @@ -221,11 +223,16 @@ static void MyFreeJcr(JobControlRecord* jcr) jcr->comment = NULL; } - if (jcr->VolList) { FreeRestoreVolumeList(jcr); } + if (jcr->impl_->VolList) { FreeRestoreVolumeList(jcr); } - if (jcr->dcr) { - FreeDeviceControlRecord(jcr->dcr); - jcr->dcr = NULL; + if (jcr->impl_->dcr) { + FreeDeviceControlRecord(jcr->impl_->dcr); + jcr->impl_->dcr = NULL; + } + + if (jcr->impl_) { + delete jcr->impl_; + jcr->impl_ = nullptr; } return; diff --git a/core/src/stored/dev.cc b/core/src/stored/dev.cc index 834bcccccc8..790cfc4096f 100644 --- a/core/src/stored/dev.cc +++ b/core/src/stored/dev.cc @@ -76,6 +76,8 @@ #include "stored/block.h" #include "stored/stored.h" #include "stored/autochanger.h" +#include "stored/bsr.h" +#include "stored/jcr_private.h" #include "stored/sd_backends.h" #include "lib/btimers.h" #include "include/jcr.h" @@ -445,23 +447,23 @@ void InitDeviceWaitTimers(DeviceControlRecord* dcr) dev->num_wait = 0; dev->poll = false; - jcr->min_wait = 60 * 60; - jcr->max_wait = 24 * 60 * 60; - jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */ - jcr->wait_sec = jcr->min_wait; - jcr->rem_wait_sec = jcr->wait_sec; - jcr->num_wait = 0; + jcr->impl_->min_wait = 60 * 60; + jcr->impl_->max_wait = 24 * 60 * 60; + jcr->impl_->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */ + jcr->impl_->wait_sec = jcr->impl_->min_wait; + jcr->impl_->rem_wait_sec = jcr->impl_->wait_sec; + jcr->impl_->num_wait = 0; } void InitJcrDeviceWaitTimers(JobControlRecord* jcr) { /* ******FIXME******* put these on config variables */ - jcr->min_wait = 60 * 60; - jcr->max_wait = 24 * 60 * 60; - jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */ - jcr->wait_sec = jcr->min_wait; - jcr->rem_wait_sec = jcr->wait_sec; - jcr->num_wait = 0; + jcr->impl_->min_wait = 60 * 60; + jcr->impl_->max_wait = 24 * 60 * 60; + jcr->impl_->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */ + jcr->impl_->wait_sec = jcr->impl_->min_wait; + jcr->impl_->rem_wait_sec = jcr->impl_->wait_sec; + jcr->impl_->num_wait = 0; } /** diff --git a/core/src/stored/device.cc b/core/src/stored/device.cc index fcccbd75507..6b5a21e1e93 100644 --- a/core/src/stored/device.cc +++ b/core/src/stored/device.cc @@ -53,6 +53,7 @@ #include "stored/bsr.h" #include "stored/stored.h" /* pull in Storage Daemon headers */ #include "stored/device.h" +#include "stored/jcr_private.h" #include "stored/match_bsr.h" #include "lib/edit.h" #include "include/jcr.h" @@ -172,7 +173,7 @@ bool FixupDeviceBlockWriteError(DeviceControlRecord* dcr, int retries) } /* Clear NewVol now because DirGetVolumeInfo() already done */ - jcr->dcr->NewVol = false; + jcr->impl_->dcr->NewVol = false; SetNewVolumeParameters(dcr); jcr->run_time += time(NULL) - wait_time; /* correct run time for mount wait */ @@ -230,7 +231,7 @@ void SetNewVolumeParameters(DeviceControlRecord* dcr) Jmsg1(jcr, M_ERROR, 0, "%s", jcr->errmsg); } SetNewFileParameters(dcr); - jcr->NumWriteVolumes++; + jcr->impl_->NumWriteVolumes++; dcr->NewVol = false; } @@ -312,9 +313,9 @@ BootStrapRecord* PositionDeviceToFirstFile(JobControlRecord* jcr, * Now find and position to first file and block * on this tape. */ - if (jcr->bsr) { - jcr->bsr->Reposition = true; /* force repositioning */ - bsr = find_next_bsr(jcr->bsr, dev); + if (jcr->impl_->bsr) { + jcr->impl_->bsr->Reposition = true; /* force repositioning */ + bsr = find_next_bsr(jcr->impl_->bsr, dev); if (GetBsrStartAddr(bsr, &file, &block) > 0) { Jmsg(jcr, M_INFO, 0, _("Forward spacing Volume \"%s\" to file:block %u:%u.\n"), @@ -338,15 +339,15 @@ bool TryDeviceRepositioning(JobControlRecord* jcr, BootStrapRecord* bsr; Device* dev = dcr->dev; - bsr = find_next_bsr(jcr->bsr, dev); - if (bsr == NULL && jcr->bsr->mount_next_volume) { + bsr = find_next_bsr(jcr->impl_->bsr, dev); + if (bsr == NULL && jcr->impl_->bsr->mount_next_volume) { Dmsg0(500, "Would mount next volume here\n"); Dmsg2(500, "Current position (file:block) %u:%u\n", dev->file, dev->block_num); - jcr->bsr->mount_next_volume = false; + jcr->impl_->bsr->mount_next_volume = false; if (!dev->AtEot()) { /* Set EOT flag to force mount of next Volume */ - jcr->mount_next_volume = true; + jcr->impl_->mount_next_volume = true; dev->SetEot(); } rec->Block = 0; diff --git a/core/src/stored/dir_cmd.cc b/core/src/stored/dir_cmd.cc index 92d7297331d..d1eb69bd67d 100644 --- a/core/src/stored/dir_cmd.cc +++ b/core/src/stored/dir_cmd.cc @@ -48,6 +48,7 @@ #include "stored/autochanger.h" #include "stored/bsr.h" #include "stored/fd_cmds.h" +#include "stored/jcr_private.h" #include "stored/job.h" #include "stored/label.h" #include "stored/ndmp_tape.h" @@ -244,17 +245,15 @@ void* HandleDirectorConnection(BareosSocket* dir) /* * This is a connection from the Director, so setup a JobControlRecord */ - jcr = new_jcr(sizeof(JobControlRecord), - StoredFreeJcr); /* create Job Control Record */ - NewPlugins(jcr); /* instantiate plugins */ - jcr->dir_bsock = dir; /* save Director bsock */ + jcr = NewStoredJcr(); + NewPlugins(jcr); /* instantiate plugins */ + jcr->dir_bsock = dir; /* save Director bsock */ jcr->dir_bsock->SetJcr(jcr); - jcr->dcrs = new alist(10, not_owned_by_alist); /* * Initialize Start Job condition variable */ - errstat = pthread_cond_init(&jcr->job_start_wait, NULL); + errstat = pthread_cond_init(&jcr->impl_->job_start_wait, NULL); if (errstat != 0) { BErrNo be; Jmsg1(jcr, M_FATAL, 0, @@ -266,7 +265,7 @@ void* HandleDirectorConnection(BareosSocket* dir) /* * Initialize End Job condition variable */ - errstat = pthread_cond_init(&jcr->job_end_wait, NULL); + errstat = pthread_cond_init(&jcr->impl_->job_end_wait, NULL); if (errstat != 0) { BErrNo be; Jmsg1(jcr, M_FATAL, 0, _("Unable to init job end cond variable: ERR=%s\n"), @@ -305,7 +304,7 @@ void* HandleDirectorConnection(BareosSocket* dir) found = false; for (i = 0; cmds[i].cmd; i++) { if (bstrncmp(cmds[i].cmd, dir->msg, strlen(cmds[i].cmd))) { - if ((!cmds[i].monitoraccess) && (jcr->director->monitor)) { + if ((!cmds[i].monitoraccess) && (jcr->impl_->director->monitor)) { Dmsg1(100, "Command \"%s\" is invalid.\n", cmds[i].cmd); dir->fsend(invalid_cmd); dir->signal(BNET_EOD); @@ -497,7 +496,7 @@ static bool CancelCmd(JobControlRecord* cjcr) Dmsg2(800, "Cancel JobId=%d %p\n", jcr->JobId, jcr); if (!jcr->authenticated && (oldStatus == JS_WaitFD || oldStatus == JS_WaitSD)) { - pthread_cond_signal(&jcr->job_start_wait); /* wake waiting thread */ + pthread_cond_signal(&jcr->impl_->job_start_wait); /* wake waiting thread */ } if (jcr->file_bsock) { @@ -509,7 +508,7 @@ static bool CancelCmd(JobControlRecord* cjcr) /* * Still waiting for FD to connect, release it */ - pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */ + pthread_cond_signal(&jcr->impl_->job_start_wait); /* wake waiting job */ Dmsg2(800, "Signal FD connect jid=%d %p\n", jcr->JobId, jcr); } } @@ -517,16 +516,17 @@ static bool CancelCmd(JobControlRecord* cjcr) /* * If thread waiting on mount, wake him */ - if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->waiting_for_mount()) { - pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol); + if (jcr->impl_->dcr && jcr->impl_->dcr->dev && + jcr->impl_->dcr->dev->waiting_for_mount()) { + pthread_cond_broadcast(&jcr->impl_->dcr->dev->wait_next_vol); Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId); ReleaseDeviceCond(); } - if (jcr->read_dcr && jcr->read_dcr->dev && - jcr->read_dcr->dev->waiting_for_mount()) { - pthread_cond_broadcast(&jcr->read_dcr->dev->wait_next_vol); + if (jcr->impl_->read_dcr && jcr->impl_->read_dcr->dev && + jcr->impl_->read_dcr->dev->waiting_for_mount()) { + pthread_cond_broadcast(&jcr->impl_->read_dcr->dev->wait_next_vol); Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId); ReleaseDeviceCond(); @@ -550,7 +550,7 @@ static bool CancelCmd(JobControlRecord* cjcr) } } - pthread_cond_signal(&jcr->job_end_wait); /* wake waiting job */ + pthread_cond_signal(&jcr->impl_->job_end_wait); /* wake waiting job */ jcr->MyThreadSendSignal(TIMEOUT_SIGNAL); dir->fsend(_("3000 JobId=%ld Job=\"%s\" marked to be %s.\n"), jcr->JobId, @@ -1314,12 +1314,12 @@ static inline bool GetBootstrapFile(JobControlRecord* jcr, BareosSocket* sock) } fclose(bs); Dmsg0(10, "=== end bootstrap file ===\n"); - jcr->bsr = libbareos::parse_bsr(jcr, jcr->RestoreBootstrap); - if (!jcr->bsr) { + jcr->impl_->bsr = libbareos::parse_bsr(jcr, jcr->RestoreBootstrap); + if (!jcr->impl_->bsr) { Jmsg(jcr, M_FATAL, 0, _("Error parsing bootstrap file.\n")); goto bail_out; } - if (debug_level >= 10) { libbareos::DumpBsr(jcr->bsr, true); } + if (debug_level >= 10) { libbareos::DumpBsr(jcr->impl_->bsr, true); } /* If we got a bootstrap, we are reading, so create read volume list */ CreateRestoreVolumeList(jcr); ok = true; @@ -1651,8 +1651,8 @@ static bool ReplicateCmd(JobControlRecord* jcr) storage_daemon_socket->SetSourceAddress(me->SDsrc_addr); if (!jcr->max_bandwidth) { - if (jcr->director->max_bandwidth_per_job) { - jcr->max_bandwidth = jcr->director->max_bandwidth_per_job; + if (jcr->impl_->director->max_bandwidth_per_job) { + jcr->max_bandwidth = jcr->impl_->director->max_bandwidth_per_job; } else if (me->max_bandwidth_per_job) { jcr->max_bandwidth = me->max_bandwidth_per_job; } @@ -1707,7 +1707,7 @@ static bool ReplicateCmd(JobControlRecord* jcr) connect_state(ReplicateCmdState::kAuthenticated); Dmsg0(110, "Authenticated with SD.\n"); - jcr->remote_replicate = true; + jcr->impl_->remote_replicate = true; storage_daemon_socket.release(); /* jcr->store_bsock */ return dir->fsend(OK_replicate); @@ -1828,10 +1828,10 @@ static bool PluginoptionsCmd(JobControlRecord* jcr) } UnbashSpaces(plugin_options); - if (!jcr->plugin_options) { - jcr->plugin_options = new alist(10, owned_by_alist); + if (!jcr->impl_->plugin_options) { + jcr->impl_->plugin_options = new alist(10, owned_by_alist); } - jcr->plugin_options->append(strdup(plugin_options)); + jcr->impl_->plugin_options->append(strdup(plugin_options)); /* * Send OK to Director diff --git a/core/src/stored/fd_cmds.cc b/core/src/stored/fd_cmds.cc index c6d26df588a..82176b42d75 100644 --- a/core/src/stored/fd_cmds.cc +++ b/core/src/stored/fd_cmds.cc @@ -39,6 +39,7 @@ #include "stored/append.h" #include "stored/authenticate.h" #include "stored/fd_cmds.h" +#include "stored/jcr_private.h" #include "stored/read.h" #include "stored/sd_stats.h" #include "lib/bnet.h" @@ -153,7 +154,7 @@ void* HandleFiledConnection(BareosSocket* fd, char* job_name) UpdateJobStatistics(jcr, now); } - pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */ + pthread_cond_signal(&jcr->impl_->job_start_wait); /* wake waiting job */ FreeJcr(jcr); return NULL; @@ -262,7 +263,7 @@ static bool AppendDataCmd(JobControlRecord* jcr) BareosSocket* fd = jcr->file_bsock; Dmsg1(120, "Append data: %s", fd->msg); - if (jcr->session_opened) { + if (jcr->impl_->session_opened) { Dmsg1(110, "msg); jcr->setJobType(JT_BACKUP); if (DoAppendData(jcr, fd, "FD")) { @@ -284,7 +285,7 @@ static bool AppendEndSession(JobControlRecord* jcr) BareosSocket* fd = jcr->file_bsock; Dmsg1(120, "storedmsg); - if (!jcr->session_opened) { + if (!jcr->impl_->session_opened) { PmStrcpy(jcr->errmsg, _("Attempt to close non-open session.\n")); fd->fsend(NOT_opened); return false; @@ -300,13 +301,13 @@ static bool AppendOpenSession(JobControlRecord* jcr) BareosSocket* fd = jcr->file_bsock; Dmsg1(120, "Append open session: %s", fd->msg); - if (jcr->session_opened) { + if (jcr->impl_->session_opened) { PmStrcpy(jcr->errmsg, _("Attempt to open already open session.\n")); fd->fsend(NO_open); return false; } - jcr->session_opened = true; + jcr->impl_->session_opened = true; /* Send "Ticket" to File Daemon */ fd->fsend(OK_open, jcr->VolSessionId); @@ -325,7 +326,7 @@ static bool AppendCloseSession(JobControlRecord* jcr) BareosSocket* fd = jcr->file_bsock; Dmsg1(120, "msg); - if (!jcr->session_opened) { + if (!jcr->impl_->session_opened) { PmStrcpy(jcr->errmsg, _("Attempt to close non-open session.\n")); fd->fsend(NOT_opened); return false; @@ -339,7 +340,7 @@ static bool AppendCloseSession(JobControlRecord* jcr) fd->signal(BNET_EOD); /* send EOD to File daemon */ - jcr->session_opened = false; + jcr->impl_->session_opened = false; return true; } @@ -354,7 +355,7 @@ static bool ReadDataCmd(JobControlRecord* jcr) BareosSocket* fd = jcr->file_bsock; Dmsg1(120, "Read data: %s", fd->msg); - if (jcr->session_opened) { + if (jcr->impl_->session_opened) { Dmsg1(120, "msg); return DoReadData(jcr); } else { @@ -374,31 +375,31 @@ static bool ReadOpenSession(JobControlRecord* jcr) BareosSocket* fd = jcr->file_bsock; Dmsg1(120, "%s\n", fd->msg); - if (jcr->session_opened) { + if (jcr->impl_->session_opened) { PmStrcpy(jcr->errmsg, _("Attempt to open read on non-open session.\n")); fd->fsend(NO_open); return false; } - if (sscanf(fd->msg, read_open, jcr->read_dcr->VolumeName, - &jcr->read_VolSessionId, &jcr->read_VolSessionTime, - &jcr->read_StartFile, &jcr->read_EndFile, &jcr->read_StartBlock, - &jcr->read_EndBlock) == 7) { - if (jcr->session_opened) { + if (sscanf(fd->msg, read_open, jcr->impl_->read_dcr->VolumeName, + &jcr->impl_->read_VolSessionId, &jcr->impl_->read_VolSessionTime, + &jcr->impl_->read_StartFile, &jcr->impl_->read_EndFile, + &jcr->impl_->read_StartBlock, &jcr->impl_->read_EndBlock) == 7) { + if (jcr->impl_->session_opened) { PmStrcpy(jcr->errmsg, _("Attempt to open read on non-open session.\n")); fd->fsend(NOT_opened); return false; } Dmsg4(100, "ReadOpenSession got: JobId=%d Vol=%s VolSessId=%ld VolSessT=%ld\n", - jcr->JobId, jcr->read_dcr->VolumeName, jcr->read_VolSessionId, - jcr->read_VolSessionTime); + jcr->JobId, jcr->impl_->read_dcr->VolumeName, + jcr->impl_->read_VolSessionId, jcr->impl_->read_VolSessionTime); Dmsg4(100, " StartF=%ld EndF=%ld StartB=%ld EndB=%ld\n", - jcr->read_StartFile, jcr->read_EndFile, jcr->read_StartBlock, - jcr->read_EndBlock); + jcr->impl_->read_StartFile, jcr->impl_->read_EndFile, + jcr->impl_->read_StartBlock, jcr->impl_->read_EndBlock); } - jcr->session_opened = true; + jcr->impl_->session_opened = true; jcr->setJobType(JT_RESTORE); /* @@ -419,7 +420,7 @@ static bool ReadCloseSession(JobControlRecord* jcr) BareosSocket* fd = jcr->file_bsock; Dmsg1(120, "Read close session: %s\n", fd->msg); - if (!jcr->session_opened) { + if (!jcr->impl_->session_opened) { fd->fsend(NOT_opened); return false; } @@ -432,7 +433,7 @@ static bool ReadCloseSession(JobControlRecord* jcr) fd->signal(BNET_EOD); /* send EOD to File daemon */ - jcr->session_opened = false; + jcr->impl_->session_opened = false; return true; } diff --git a/core/src/stored/jcr_private.h b/core/src/stored/jcr_private.h new file mode 100644 index 00000000000..147e51a7225 --- /dev/null +++ b/core/src/stored/jcr_private.h @@ -0,0 +1,96 @@ +/* + BAREOSĀ® - Backup Archiving REcovery Open Sourced + + Copyright (C) 2000-2012 Free Software Foundation Europe e.V. + Copyright (C) 2011-2012 Planets Communications B.V. + Copyright (C) 2013-2019 Bareos GmbH & Co. KG + + This program is Free Software; you can redistribute it and/or + modify it under the terms of version three of the GNU Affero General Public + License as published by the Free Software Foundation and included + in the file LICENSE. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef BAREOS_SRC_STORED_JCR_PRIVATE_H_ +#define BAREOS_SRC_STORED_JCR_PRIVATE_H_ + +#include "stored/read_ctx.h" + +namespace storagedaemon { +struct VolumeList; +class DeviceControlRecord; +class DirectorResource; +struct BootStrapRecord; +} // namespace storagedaemon + +/* clang-format off */ +struct JobControlRecordPrivate { + JobControlRecord* next_dev = nullptr; /**< Next JobControlRecord attached to device */ + JobControlRecord* prev_dev = nullptr; /**< Previous JobControlRecord attached to device */ + pthread_cond_t job_start_wait = PTHREAD_COND_INITIALIZER; /**< Wait for FD to start Job */ + pthread_cond_t job_end_wait = PTHREAD_COND_INITIALIZER; /**< Wait for Job to end */ + storagedaemon::DeviceControlRecord* read_dcr = nullptr; /**< Device context for reading */ + storagedaemon::DeviceControlRecord* dcr = nullptr; /**< Device context record */ + POOLMEM* job_name = nullptr; /**< Base Job name (not unique) */ + POOLMEM* fileset_name = nullptr; /**< FileSet */ + POOLMEM* fileset_md5 = nullptr; /**< MD5 for FileSet */ + POOLMEM* backup_format = nullptr; /**< Backup format used when doing a NDMP backup */ + storagedaemon::VolumeList* VolList = nullptr; /**< List to read */ + int32_t NumWriteVolumes = 0; /**< Number of volumes written */ + int32_t NumReadVolumes = 0; /**< Total number of volumes to read */ + int32_t CurReadVolume = 0; /**< Current read volume number */ + int32_t label_errors = 0; /**< Count of label errors */ + bool session_opened = false; + bool remote_replicate = false; /**< Replicate data to remote SD */ + int32_t Ticket = 0; /**< Ticket for this job */ + bool ignore_label_errors = false; /**< Ignore Volume label errors */ + bool spool_attributes = false; /**< Set if spooling attributes */ + bool no_attributes = false; /**< Set if no attributes wanted */ + int64_t spool_size = 0; /**< Spool size for this job */ + bool spool_data = false; /**< Set to spool data */ + storagedaemon::DirectorResource* director = nullptr; /**< Director resource */ + alist* plugin_options = nullptr; /**< Specific Plugin Options sent by DIR */ + alist* write_store = nullptr; /**< List of write storage devices sent by DIR */ + alist* read_store = nullptr; /**< List of read devices sent by DIR */ + alist* reserve_msgs = nullptr; /**< Reserve fail messages */ + bool acquired_storage = false; /**< Did we acquire our reserved storage already or not */ + bool PreferMountedVols = false; /**< Prefer mounted vols rather than new */ + bool insert_jobmedia_records = false; /**< Need to insert job media records */ + uint64_t RemainingQuota = 0; /**< Available bytes to use as quota */ + + /* + * Parameters for Open Read Session + */ + storagedaemon::READ_CTX* rctx = nullptr; /**< Read context used to keep track of what is processed or not */ + storagedaemon::BootStrapRecord* bsr = nullptr; /**< Bootstrap record -- has everything */ + bool mount_next_volume = false; /**< Set to cause next volume mount */ + uint32_t read_VolSessionId = 0; + uint32_t read_VolSessionTime = 0; + uint32_t read_StartFile = 0; + uint32_t read_EndFile = 0; + uint32_t read_StartBlock = 0; + uint32_t read_EndBlock = 0; + + /* + * Device wait times + */ + int32_t min_wait = 0; + int32_t max_wait = 0; + int32_t max_num_wait = 0; + int32_t wait_sec = 0; + int32_t rem_wait_sec = 0; + int32_t num_wait = 0; +}; +/* clang-format on */ + +#endif // BAREOS_SRC_STORED_JCR_PRIVATE_H_ diff --git a/core/src/stored/job.cc b/core/src/stored/job.cc index 0f356b65740..b156fd877a4 100644 --- a/core/src/stored/job.cc +++ b/core/src/stored/job.cc @@ -33,6 +33,7 @@ #include "stored/bsr.h" #include "stored/acquire.h" #include "stored/fd_cmds.h" +#include "stored/jcr_private.h" #include "stored/ndmp_tape.h" #include "stored/read_record.h" #include "stored/stored_globals.h" @@ -134,27 +135,27 @@ bool job_cmd(JobControlRecord* jcr) } bstrncpy(jcr->Job, job, sizeof(jcr->Job)); UnbashSpaces(job_name); - jcr->job_name = GetPoolMemory(PM_NAME); - PmStrcpy(jcr->job_name, job_name); + jcr->impl_->job_name = GetPoolMemory(PM_NAME); + PmStrcpy(jcr->impl_->job_name, job_name); UnbashSpaces(client_name); jcr->client_name = GetPoolMemory(PM_NAME); PmStrcpy(jcr->client_name, client_name); UnbashSpaces(fileset_name); - jcr->fileset_name = GetPoolMemory(PM_NAME); - PmStrcpy(jcr->fileset_name, fileset_name); + jcr->impl_->fileset_name = GetPoolMemory(PM_NAME); + PmStrcpy(jcr->impl_->fileset_name, fileset_name); jcr->setJobType(JobType); jcr->setJobLevel(level); - jcr->no_attributes = no_attributes; - jcr->spool_attributes = spool_attributes; - jcr->spool_data = spool_data; - jcr->spool_size = str_to_int64(spool_size); - jcr->fileset_md5 = GetPoolMemory(PM_NAME); - PmStrcpy(jcr->fileset_md5, fileset_md5); - jcr->PreferMountedVols = PreferMountedVols; - jcr->RemainingQuota = quota; + jcr->impl_->no_attributes = no_attributes; + jcr->impl_->spool_attributes = spool_attributes; + jcr->impl_->spool_data = spool_data; + jcr->impl_->spool_size = str_to_int64(spool_size); + jcr->impl_->fileset_md5 = GetPoolMemory(PM_NAME); + PmStrcpy(jcr->impl_->fileset_md5, fileset_md5); + jcr->impl_->PreferMountedVols = PreferMountedVols; + jcr->impl_->RemainingQuota = quota; UnbashSpaces(backup_format); - jcr->backup_format = GetPoolMemory(PM_NAME); - PmStrcpy(jcr->backup_format, backup_format); + jcr->impl_->backup_format = GetPoolMemory(PM_NAME); + PmStrcpy(jcr->impl_->backup_format, backup_format); jcr->authenticated = false; Dmsg1(50, "Quota set as %llu\n", quota); @@ -199,7 +200,8 @@ bool DoJobRun(JobControlRecord* jcr) */ P(mutex); while (!jcr->authenticated && !JobCanceled(jcr)) { - errstat = pthread_cond_timedwait(&jcr->job_start_wait, &mutex, &timeout); + errstat = + pthread_cond_timedwait(&jcr->impl_->job_start_wait, &mutex, &timeout); if (errstat == ETIMEDOUT || errstat == EINVAL || errstat == EPERM) { break; } @@ -225,7 +227,7 @@ bool DoJobRun(JobControlRecord* jcr) */ Dmsg2(800, "Wait for end job jid=%d %p\n", jcr->JobId, jcr); P(mutex); - pthread_cond_wait(&jcr->job_end_wait, &mutex); + pthread_cond_wait(&jcr->impl_->job_end_wait, &mutex); V(mutex); } Dmsg2(800, "Done jid=%d %p\n", jcr->JobId, jcr); @@ -294,8 +296,8 @@ bool nextRunCmd(JobControlRecord* jcr) P(mutex); while (!jcr->authenticated && !JobCanceled(jcr)) { - errstat = - pthread_cond_timedwait(&jcr->job_start_wait, &mutex, &timeout); + errstat = pthread_cond_timedwait(&jcr->impl_->job_start_wait, &mutex, + &timeout); if (errstat == ETIMEDOUT || errstat == EINVAL || errstat == EPERM) { break; } @@ -318,7 +320,7 @@ bool nextRunCmd(JobControlRecord* jcr) */ Dmsg2(800, "Wait for end job jid=%d %p\n", jcr->JobId, jcr); P(mutex); - pthread_cond_wait(&jcr->job_end_wait, &mutex); + pthread_cond_wait(&jcr->impl_->job_end_wait, &mutex); V(mutex); } Dmsg2(800, "Done jid=%d %p\n", jcr->JobId, jcr); @@ -414,27 +416,27 @@ void StoredFreeJcr(JobControlRecord* jcr) jcr->file_bsock = NULL; } - if (jcr->job_name) { FreePoolMemory(jcr->job_name); } + if (jcr->impl_->job_name) { FreePoolMemory(jcr->impl_->job_name); } if (jcr->client_name) { FreeMemory(jcr->client_name); jcr->client_name = NULL; } - if (jcr->fileset_name) { FreeMemory(jcr->fileset_name); } + if (jcr->impl_->fileset_name) { FreeMemory(jcr->impl_->fileset_name); } - if (jcr->fileset_md5) { FreeMemory(jcr->fileset_md5); } + if (jcr->impl_->fileset_md5) { FreeMemory(jcr->impl_->fileset_md5); } - if (jcr->backup_format) { FreeMemory(jcr->backup_format); } + if (jcr->impl_->backup_format) { FreeMemory(jcr->impl_->backup_format); } - if (jcr->bsr) { - libbareos::FreeBsr(jcr->bsr); - jcr->bsr = NULL; + if (jcr->impl_->bsr) { + libbareos::FreeBsr(jcr->impl_->bsr); + jcr->impl_->bsr = NULL; } - if (jcr->rctx) { - FreeReadContext(jcr->rctx); - jcr->rctx = NULL; + if (jcr->impl_->rctx) { + FreeReadContext(jcr->impl_->rctx); + jcr->impl_->rctx = NULL; } if (jcr->compress.deflate_buffer || jcr->compress.inflate_buffer) { @@ -451,53 +453,48 @@ void StoredFreeJcr(JobControlRecord* jcr) jcr->RestoreBootstrap = NULL; } - if (jcr->next_dev || jcr->prev_dev) { + if (jcr->impl_->next_dev || jcr->impl_->prev_dev) { Emsg0(M_FATAL, 0, _("In FreeJcr(), but still attached to device!!!!\n")); } - pthread_cond_destroy(&jcr->job_start_wait); - pthread_cond_destroy(&jcr->job_end_wait); - - if (jcr->dcrs) { - delete jcr->dcrs; - jcr->dcrs = NULL; - } + pthread_cond_destroy(&jcr->impl_->job_start_wait); + pthread_cond_destroy(&jcr->impl_->job_end_wait); /* * Avoid a double free */ - if (jcr->dcr == jcr->read_dcr) { jcr->read_dcr = NULL; } + if (jcr->impl_->dcr == jcr->impl_->read_dcr) { jcr->impl_->read_dcr = NULL; } - if (jcr->dcr) { - FreeDeviceControlRecord(jcr->dcr); - jcr->dcr = NULL; + if (jcr->impl_->dcr) { + FreeDeviceControlRecord(jcr->impl_->dcr); + jcr->impl_->dcr = NULL; } - if (jcr->read_dcr) { - FreeDeviceControlRecord(jcr->read_dcr); - jcr->read_dcr = NULL; + if (jcr->impl_->read_dcr) { + FreeDeviceControlRecord(jcr->impl_->read_dcr); + jcr->impl_->read_dcr = NULL; } - if (jcr->plugin_options) { delete jcr->plugin_options; } + if (jcr->impl_->plugin_options) { delete jcr->impl_->plugin_options; } - if (jcr->read_store) { + if (jcr->impl_->read_store) { DirectorStorage* store = nullptr; - foreach_alist (store, jcr->read_store) { + foreach_alist (store, jcr->impl_->read_store) { delete store->device; delete store; } - delete jcr->read_store; - jcr->read_store = NULL; + delete jcr->impl_->read_store; + jcr->impl_->read_store = NULL; } - if (jcr->write_store) { + if (jcr->impl_->write_store) { DirectorStorage* store = nullptr; - foreach_alist (store, jcr->write_store) { + foreach_alist (store, jcr->impl_->write_store) { delete store->device; delete store; } - delete jcr->write_store; - jcr->write_store = NULL; + delete jcr->impl_->write_store; + jcr->impl_->write_store = NULL; } FreePlugins(jcr); /* release instantiated plugins */ @@ -508,9 +505,21 @@ void StoredFreeJcr(JobControlRecord* jcr) GetFirstPortHostOrder(me->SDaddrs)); } + if (jcr->impl_) { + delete jcr->impl_; + jcr->impl_ = nullptr; + } + Dmsg0(200, "End stored FreeJcr\n"); return; } +JobControlRecord* NewStoredJcr() +{ + JobControlRecord* jcr = new_jcr(sizeof(JobControlRecord), StoredFreeJcr); + jcr->impl_ = new JobControlRecordPrivate; + return jcr; +} + } /* namespace storagedaemon */ diff --git a/core/src/stored/job.h b/core/src/stored/job.h index 67fce8d3d50..debf04539bf 100644 --- a/core/src/stored/job.h +++ b/core/src/stored/job.h @@ -30,6 +30,8 @@ bool FinishCmd(JobControlRecord* jcr); bool job_cmd(JobControlRecord* jcr); bool nextRunCmd(JobControlRecord* jcr); +JobControlRecord* NewStoredJcr(); + } /* namespace storagedaemon */ #endif // BAREOS_STORED_JOB_H_ diff --git a/core/src/stored/label.cc b/core/src/stored/label.cc index 0ff2e67eb13..b3633d32d07 100644 --- a/core/src/stored/label.cc +++ b/core/src/stored/label.cc @@ -33,6 +33,7 @@ #include "stored/stored_globals.h" #include "stored/dev.h" #include "stored/device.h" +#include "stored/jcr_private.h" #include "stored/label.h" #include "lib/edit.h" #include "include/jcr.h" @@ -131,7 +132,7 @@ int ReadDevVolumeLabel(DeviceControlRecord* dcr) Mmsg(jcr->errmsg, _("Wrong Volume mounted on device %s: Wanted %s have %s\n"), dev->print_name(), VolName, dev->VolHdr.VolumeName); - if (!dev->poll && jcr->label_errors++ > 100) { + if (!dev->poll && jcr->impl_->label_errors++ > 100) { Jmsg(jcr, M_FATAL, 0, _("Too many tries: %s"), jcr->errmsg); } goto bail_out; @@ -177,7 +178,7 @@ int ReadDevVolumeLabel(DeviceControlRecord* dcr) if (!dev->IsVolumeToUnload()) { dev->ClearUnload(); } if (!ok) { - if (forge_on || jcr->ignore_label_errors) { + if (forge_on || jcr->impl_->ignore_label_errors) { dev->SetLabeled(); /* set has Bareos label */ Jmsg(jcr, M_ERROR, 0, "%s", jcr->errmsg); goto ok_out; @@ -213,7 +214,7 @@ int ReadDevVolumeLabel(DeviceControlRecord* dcr) Mmsg(jcr->errmsg, _("Volume on %s has bad Bareos label type: %x\n"), dev->print_name(), dev->VolHdr.LabelType); Dmsg1(130, "%s", jcr->errmsg); - if (!dev->poll && jcr->label_errors++ > 100) { + if (!dev->poll && jcr->impl_->label_errors++ > 100) { Jmsg(jcr, M_FATAL, 0, _("Too many tries: %s"), jcr->errmsg); } Dmsg0(150, "return VOL_LABEL_ERROR\n"); @@ -236,7 +237,7 @@ int ReadDevVolumeLabel(DeviceControlRecord* dcr) * Cancel Job if too many label errors * => we are in a loop */ - if (!dev->poll && jcr->label_errors++ > 100) { + if (!dev->poll && jcr->impl_->label_errors++ > 100) { Jmsg(jcr, M_FATAL, 0, "Too many tries: %s", jcr->errmsg); } Dmsg0(150, "return VOL_NAME_ERROR\n"); @@ -543,8 +544,8 @@ static void CreateVolumeLabelRecord(DeviceControlRecord* dcr, rec->FileIndex = dev->VolHdr.LabelType; rec->VolSessionId = jcr->VolSessionId; rec->VolSessionTime = jcr->VolSessionTime; - rec->Stream = jcr->NumWriteVolumes; - rec->maskedStream = jcr->NumWriteVolumes; + rec->Stream = jcr->impl_->NumWriteVolumes; + rec->maskedStream = jcr->impl_->NumWriteVolumes; Dmsg2(150, "Created Vol label rec: FI=%s len=%d\n", FI_to_ascii(buf, rec->FileIndex), rec->data_len); } @@ -627,16 +628,16 @@ static void CreateSessionLabel(DeviceControlRecord* dcr, SerString(dcr->pool_name); SerString(dcr->pool_type); - SerString(jcr->job_name); /* base Job name */ + SerString(jcr->impl_->job_name); /* base Job name */ SerString(jcr->client_name); /* Added in VerNum 10 */ SerString(jcr->Job); /* Unique name of this Job */ - SerString(jcr->fileset_name); + SerString(jcr->impl_->fileset_name); ser_uint32(jcr->getJobType()); ser_uint32(jcr->getJobLevel()); /* Added in VerNum 11 */ - SerString(jcr->fileset_md5); + SerString(jcr->impl_->fileset_md5); if (label == EOS_LABEL) { ser_uint32(jcr->JobFiles); diff --git a/core/src/stored/mac.cc b/core/src/stored/mac.cc index f103cfdab45..4668430073b 100644 --- a/core/src/stored/mac.cc +++ b/core/src/stored/mac.cc @@ -36,6 +36,7 @@ #include "stored/bsr.h" #include "stored/append.h" #include "stored/device.h" +#include "stored/jcr_private.h" #include "stored/label.h" #include "stored/mount.h" #include "stored/read_record.h" @@ -119,7 +120,7 @@ static bool CloneRecordInternally(DeviceControlRecord* dcr, DeviceRecord* rec) bool retval = false; bool translated_record = false; JobControlRecord* jcr = dcr->jcr; - Device* dev = jcr->dcr->dev; + Device* dev = jcr->impl_->dcr->dev; char buf1[100], buf2[100]; /* @@ -148,10 +149,10 @@ static bool CloneRecordInternally(DeviceControlRecord* dcr, DeviceRecord* rec) if (jcr->is_JobType(JT_MIGRATE) || jcr->is_JobType(JT_COPY)) { bstrncpy(jcr->Job, label->Job, sizeof(jcr->Job)); - PmStrcpy(jcr->job_name, label->JobName); + PmStrcpy(jcr->impl_->job_name, label->JobName); PmStrcpy(jcr->client_name, label->ClientName); - PmStrcpy(jcr->fileset_name, label->FileSetName); - PmStrcpy(jcr->fileset_md5, label->FileSetMD5); + PmStrcpy(jcr->impl_->fileset_name, label->FileSetName); + PmStrcpy(jcr->impl_->fileset_md5, label->FileSetMD5); } jcr->setJobType(label->JobType); jcr->setJobLevel(label->JobLevel); @@ -170,7 +171,7 @@ static bool CloneRecordInternally(DeviceControlRecord* dcr, DeviceRecord* rec) jcr->start_time = jcr->sched_time; /* write the SOS Label with the existing timestamp infos */ - if (!WriteSessionLabel(jcr->dcr, SOS_LABEL)) { + if (!WriteSessionLabel(jcr->impl_->dcr, SOS_LABEL)) { Jmsg1(jcr, M_FATAL, 0, _("Write session label failed. ERR=%s\n"), dev->bstrerror()); jcr->setJobStatus(JS_ErrorTerminated); @@ -222,10 +223,10 @@ static bool CloneRecordInternally(DeviceControlRecord* dcr, DeviceRecord* rec) /* * Perform record translations. */ - jcr->dcr->before_rec = rec; - jcr->dcr->after_rec = NULL; - if (GeneratePluginEvent(jcr, bsdEventWriteRecordTranslation, jcr->dcr) != - bRC_OK) { + jcr->impl_->dcr->before_rec = rec; + jcr->impl_->dcr->after_rec = NULL; + if (GeneratePluginEvent(jcr, bsdEventWriteRecordTranslation, + jcr->impl_->dcr) != bRC_OK) { goto bail_out; } @@ -235,17 +236,17 @@ static bool CloneRecordInternally(DeviceControlRecord* dcr, DeviceRecord* rec) * taken place we just point the after_rec pointer to same DeviceRecord as in * the before_rec pointer. */ - if (!jcr->dcr->after_rec) { - jcr->dcr->after_rec = jcr->dcr->before_rec; + if (!jcr->impl_->dcr->after_rec) { + jcr->impl_->dcr->after_rec = jcr->impl_->dcr->before_rec; } else { translated_record = true; } - while (!WriteRecordToBlock(jcr->dcr, jcr->dcr->after_rec)) { + while (!WriteRecordToBlock(jcr->impl_->dcr, jcr->impl_->dcr->after_rec)) { Dmsg4(200, "!WriteRecordToBlock blkpos=%u:%u len=%d rem=%d\n", dev->file, - dev->block_num, jcr->dcr->after_rec->data_len, - jcr->dcr->after_rec->remainder); - if (!jcr->dcr->WriteBlockToDevice()) { + dev->block_num, jcr->impl_->dcr->after_rec->data_len, + jcr->impl_->dcr->after_rec->remainder); + if (!jcr->impl_->dcr->WriteBlockToDevice()) { Dmsg2(90, "Got WriteBlockToDev error on device %s. %s\n", dev->print_name(), dev->bstrerror()); Jmsg2(jcr, M_FATAL, 0, _("Fatal append error on device %s: ERR=%s\n"), @@ -258,33 +259,34 @@ static bool CloneRecordInternally(DeviceControlRecord* dcr, DeviceRecord* rec) /* * Restore packet */ - jcr->dcr->after_rec->VolSessionId = jcr->dcr->after_rec->last_VolSessionId; - jcr->dcr->after_rec->VolSessionTime = - jcr->dcr->after_rec->last_VolSessionTime; + jcr->impl_->dcr->after_rec->VolSessionId = + jcr->impl_->dcr->after_rec->last_VolSessionId; + jcr->impl_->dcr->after_rec->VolSessionTime = + jcr->impl_->dcr->after_rec->last_VolSessionTime; - if (jcr->dcr->after_rec->FileIndex < 0) { + if (jcr->impl_->dcr->after_rec->FileIndex < 0) { retval = true; /* don't send LABELs to Dir */ goto bail_out; } jcr->JobBytes += - jcr->dcr->after_rec->data_len; /* increment bytes of this job */ + jcr->impl_->dcr->after_rec->data_len; /* increment bytes of this job */ Dmsg5(500, "wrote_record JobId=%d FI=%s SessId=%d Strm=%s len=%d\n", - jcr->JobId, FI_to_ascii(buf1, jcr->dcr->after_rec->FileIndex), - jcr->dcr->after_rec->VolSessionId, - stream_to_ascii(buf2, jcr->dcr->after_rec->Stream, - jcr->dcr->after_rec->FileIndex), - jcr->dcr->after_rec->data_len); + jcr->JobId, FI_to_ascii(buf1, jcr->impl_->dcr->after_rec->FileIndex), + jcr->impl_->dcr->after_rec->VolSessionId, + stream_to_ascii(buf2, jcr->impl_->dcr->after_rec->Stream, + jcr->impl_->dcr->after_rec->FileIndex), + jcr->impl_->dcr->after_rec->data_len); - SendAttrsToDir(jcr, jcr->dcr->after_rec); + SendAttrsToDir(jcr, jcr->impl_->dcr->after_rec); retval = true; bail_out: if (translated_record) { - FreeRecord(jcr->dcr->after_rec); - jcr->dcr->after_rec = NULL; + FreeRecord(jcr->impl_->dcr->after_rec); + jcr->impl_->dcr->after_rec = NULL; } return retval; @@ -433,22 +435,22 @@ static inline void CheckAutoXflation(JobControlRecord* jcr) /* * Check autodeflation. */ - switch (jcr->read_dcr->autodeflate) { + switch (jcr->impl_->read_dcr->autodeflate) { case IO_DIRECTION_IN: case IO_DIRECTION_INOUT: Dmsg0(200, "Clearing autodeflate on read_dcr\n"); - jcr->read_dcr->autodeflate = IO_DIRECTION_NONE; + jcr->impl_->read_dcr->autodeflate = IO_DIRECTION_NONE; break; default: break; } - if (jcr->dcr) { - switch (jcr->dcr->autodeflate) { + if (jcr->impl_->dcr) { + switch (jcr->impl_->dcr->autodeflate) { case IO_DIRECTION_OUT: case IO_DIRECTION_INOUT: Dmsg0(200, "Clearing autodeflate on write dcr\n"); - jcr->dcr->autodeflate = IO_DIRECTION_NONE; + jcr->impl_->dcr->autodeflate = IO_DIRECTION_NONE; break; default: break; @@ -458,22 +460,22 @@ static inline void CheckAutoXflation(JobControlRecord* jcr) /* * Check autoinflation. */ - switch (jcr->read_dcr->autoinflate) { + switch (jcr->impl_->read_dcr->autoinflate) { case IO_DIRECTION_IN: case IO_DIRECTION_INOUT: Dmsg0(200, "Clearing autoinflate on read_dcr\n"); - jcr->read_dcr->autoinflate = IO_DIRECTION_NONE; + jcr->impl_->read_dcr->autoinflate = IO_DIRECTION_NONE; break; default: break; } - if (jcr->dcr) { - switch (jcr->dcr->autoinflate) { + if (jcr->impl_->dcr) { + switch (jcr->impl_->dcr->autoinflate) { case IO_DIRECTION_OUT: case IO_DIRECTION_INOUT: Dmsg0(200, "Clearing autoinflate on write dcr\n"); - jcr->dcr->autoinflate = IO_DIRECTION_NONE; + jcr->impl_->dcr->autoinflate = IO_DIRECTION_NONE; break; default: break; @@ -492,7 +494,7 @@ bool DoMacRun(JobControlRecord* jcr) bool ok = true; bool acquire_fail = false; BareosSocket* dir = jcr->dir_bsock; - Device* dev = jcr->dcr->dev; + Device* dev = jcr->impl_->dcr->dev; switch (jcr->getJobType()) { case JT_MIGRATE: @@ -514,7 +516,7 @@ bool DoMacRun(JobControlRecord* jcr) Dmsg0(20, "Start read data.\n"); - if (jcr->NumReadVolumes == 0) { + if (jcr->impl_->NumReadVolumes == 0) { Jmsg(jcr, M_FATAL, 0, _("No Volume names found for %s.\n"), Type); goto bail_out; } @@ -527,29 +529,30 @@ bool DoMacRun(JobControlRecord* jcr) /* * See if we perform both read and write or read only. */ - if (jcr->remote_replicate) { + if (jcr->impl_->remote_replicate) { BareosSocket* sd; - if (!jcr->read_dcr) { + if (!jcr->impl_->read_dcr) { Jmsg(jcr, M_FATAL, 0, _("Read device not properly initialized.\n")); goto bail_out; } - Dmsg1(100, "read_dcr=%p\n", jcr->read_dcr); - Dmsg3(200, "Found %d volumes names for %s. First=%s\n", jcr->NumReadVolumes, - Type, jcr->VolList->VolumeName); + Dmsg1(100, "read_dcr=%p\n", jcr->impl_->read_dcr); + Dmsg3(200, "Found %d volumes names for %s. First=%s\n", + jcr->impl_->NumReadVolumes, Type, jcr->impl_->VolList->VolumeName); /* * Ready devices for reading. */ - if (!AcquireDeviceForRead(jcr->read_dcr)) { + if (!AcquireDeviceForRead(jcr->impl_->read_dcr)) { ok = false; acquire_fail = true; goto bail_out; } - Dmsg2(200, "===== After acquire pos %u:%u\n", jcr->read_dcr->dev->file, - jcr->read_dcr->dev->block_num); + Dmsg2(200, "===== After acquire pos %u:%u\n", + jcr->impl_->read_dcr->dev->file, + jcr->impl_->read_dcr->dev->block_num); jcr->sendJobStatus(JS_Running); @@ -574,12 +577,12 @@ bool DoMacRun(JobControlRecord* jcr) */ if (BgetMsg(sd) >= 0) { Dmsg1(110, "msg); - if (sscanf(sd->msg, OK_start_replicate, &jcr->Ticket) != 1) { + if (sscanf(sd->msg, OK_start_replicate, &jcr->impl_->Ticket) != 1) { Jmsg(jcr, M_FATAL, 0, _("Bad response to start replicate: %s\n"), sd->msg); goto bail_out; } - Dmsg1(110, "Got Ticket=%d\n", jcr->Ticket); + Dmsg1(110, "Got Ticket=%d\n", jcr->impl_->Ticket); } else { Jmsg(jcr, M_FATAL, 0, _("Bad response from stored to start replicate command\n")); @@ -589,7 +592,7 @@ bool DoMacRun(JobControlRecord* jcr) /* * Let the remote SD know we are now really going to send the data. */ - sd->fsend(ReplicateData, jcr->Ticket); + sd->fsend(ReplicateData, jcr->impl_->Ticket); Dmsg1(110, ">stored: %s", sd->msg); /* @@ -609,7 +612,8 @@ bool DoMacRun(JobControlRecord* jcr) /* * Read all data and send it to remote SD. */ - ok = ReadRecords(jcr->read_dcr, CloneRecordToRemoteSd, MountNextReadVolume); + ok = ReadRecords(jcr->impl_->read_dcr, CloneRecordToRemoteSd, + MountNextReadVolume); /* * Send the last EOD to close the last data transfer and a next EOD to @@ -648,27 +652,28 @@ bool DoMacRun(JobControlRecord* jcr) /* Inform Storage daemon that we are done */ sd->signal(BNET_TERMINATE); } else { - if (!jcr->read_dcr) { + if (!jcr->impl_->read_dcr) { Jmsg(jcr, M_FATAL, 0, _("Read device not properly initialized.\n")); goto bail_out; } - Dmsg2(100, "read_dcr=%p write_dcr=%p\n", jcr->read_dcr, jcr->dcr); - Dmsg3(200, "Found %d volumes names for %s. First=%s\n", jcr->NumReadVolumes, - Type, jcr->VolList->VolumeName); + Dmsg2(100, "read_dcr=%p write_dcr=%p\n", jcr->impl_->read_dcr, + jcr->impl_->dcr); + Dmsg3(200, "Found %d volumes names for %s. First=%s\n", + jcr->impl_->NumReadVolumes, Type, jcr->impl_->VolList->VolumeName); /* * Ready devices for reading and writing. */ - if (!AcquireDeviceForRead(jcr->read_dcr) || - !AcquireDeviceForAppend(jcr->dcr)) { + if (!AcquireDeviceForRead(jcr->impl_->read_dcr) || + !AcquireDeviceForAppend(jcr->impl_->dcr)) { ok = false; acquire_fail = true; goto bail_out; } - Dmsg2(200, "===== After acquire pos %u:%u\n", jcr->dcr->dev->file, - jcr->dcr->dev->block_num); + Dmsg2(200, "===== After acquire pos %u:%u\n", jcr->impl_->dcr->dev->file, + jcr->impl_->dcr->dev->block_num); jcr->sendJobStatus(JS_Running); @@ -678,7 +683,7 @@ bool DoMacRun(JobControlRecord* jcr) now = (utime_t)time(NULL); UpdateJobStatistics(jcr, now); - if (!BeginDataSpool(jcr->dcr)) { + if (!BeginDataSpool(jcr->impl_->dcr)) { ok = false; goto bail_out; } @@ -688,21 +693,22 @@ bool DoMacRun(JobControlRecord* jcr) goto bail_out; } - jcr->dcr->VolFirstIndex = jcr->dcr->VolLastIndex = 0; + jcr->impl_->dcr->VolFirstIndex = jcr->impl_->dcr->VolLastIndex = 0; jcr->run_time = time(NULL); - SetStartVolPosition(jcr->dcr); + SetStartVolPosition(jcr->impl_->dcr); jcr->JobFiles = 0; /* * Read all data and make a local clone of it. */ - ok = ReadRecords(jcr->read_dcr, CloneRecordInternally, MountNextReadVolume); + ok = ReadRecords(jcr->impl_->read_dcr, CloneRecordInternally, + MountNextReadVolume); } bail_out: if (!ok) { jcr->setJobStatus(JS_ErrorTerminated); } - if (!acquire_fail && !jcr->remote_replicate && jcr->dcr) { + if (!acquire_fail && !jcr->impl_->remote_replicate && jcr->impl_->dcr) { /* * Don't use time_t for job_elapsed as time_t can be 32 or 64 bits, * and the subsequent Jmsg() editing will break @@ -722,7 +728,7 @@ bool DoMacRun(JobControlRecord* jcr) /* * Write End Of Session Label */ - DeviceControlRecord* dcr = jcr->dcr; + DeviceControlRecord* dcr = jcr->impl_->dcr; if (!WriteSessionLabel(dcr, EOS_LABEL)) { /* * Print only if ok and not cancelled to avoid spurious messages @@ -741,7 +747,7 @@ bool DoMacRun(JobControlRecord* jcr) /* * Flush out final partial block of this session */ - if (!jcr->dcr->WriteBlockToDevice()) { + if (!jcr->impl_->dcr->WriteBlockToDevice()) { Jmsg2(jcr, M_FATAL, 0, _("Fatal append error on device %s: ERR=%s\n"), dev->print_name(), dev->bstrerror()); Dmsg0(100, _("Set ok=FALSE after WriteBlockToDevice.\n")); @@ -753,12 +759,12 @@ bool DoMacRun(JobControlRecord* jcr) if (!ok) { - DiscardDataSpool(jcr->dcr); + DiscardDataSpool(jcr->impl_->dcr); } else { /* * Note: if commit is OK, the device will remain blocked */ - CommitDataSpool(jcr->dcr); + CommitDataSpool(jcr->impl_->dcr); } job_elapsed = time(NULL) - jcr->run_time; @@ -772,7 +778,7 @@ bool DoMacRun(JobControlRecord* jcr) /* * Release the device -- and send final Vol info to DIR */ - ReleaseDevice(jcr->dcr); + ReleaseDevice(jcr->impl_->dcr); if (!ok || JobCanceled(jcr)) { DiscardAttributeSpool(jcr); @@ -781,8 +787,8 @@ bool DoMacRun(JobControlRecord* jcr) } } - if (jcr->read_dcr) { - if (!ReleaseDevice(jcr->read_dcr)) { ok = false; } + if (jcr->impl_->read_dcr) { + if (!ReleaseDevice(jcr->impl_->read_dcr)) { ok = false; } } jcr->sendJobStatus(); /* update director */ diff --git a/core/src/stored/mount.cc b/core/src/stored/mount.cc index 30afb66a98a..ffe0a98678c 100644 --- a/core/src/stored/mount.cc +++ b/core/src/stored/mount.cc @@ -32,6 +32,7 @@ #include "stored/stored.h" /* pull in Storage Daemon headers */ #include "stored/acquire.h" #include "stored/autochanger.h" +#include "stored/jcr_private.h" #include "stored/label.h" #include "lib/edit.h" #include "include/jcr.h" @@ -952,14 +953,15 @@ bool MountNextReadVolume(DeviceControlRecord* dcr) { Device* dev = dcr->dev; JobControlRecord* jcr = dcr->jcr; - Dmsg2(90, "NumReadVolumes=%d CurReadVolume=%d\n", jcr->NumReadVolumes, - jcr->CurReadVolume); + Dmsg2(90, "NumReadVolumes=%d CurReadVolume=%d\n", jcr->impl_->NumReadVolumes, + jcr->impl_->CurReadVolume); VolumeUnused(dcr); /* release current volume */ /* * End Of Tape -- mount next Volume (if another specified) */ - if (jcr->NumReadVolumes > 1 && jcr->CurReadVolume < jcr->NumReadVolumes) { + if (jcr->impl_->NumReadVolumes > 1 && + jcr->impl_->CurReadVolume < jcr->impl_->NumReadVolumes) { dev->Lock(); dev->close(dcr); dev->SetRead(); diff --git a/core/src/stored/ndmp_tape.cc b/core/src/stored/ndmp_tape.cc index e1f227d65bb..f7264b614f0 100644 --- a/core/src/stored/ndmp_tape.cc +++ b/core/src/stored/ndmp_tape.cc @@ -46,6 +46,7 @@ #include "stored/acquire.h" #include "stored/bsr.h" #include "stored/device.h" +#include "stored/jcr_private.h" #include "stored/label.h" #include "stored/mount.h" #include "stored/read_record.h" @@ -326,7 +327,7 @@ static inline bool bndmp_write_data_to_block(JobControlRecord* jcr, uint32_t data_length) { bool retval = false; - DeviceControlRecord* dcr = jcr->dcr; + DeviceControlRecord* dcr = jcr->impl_->dcr; POOLMEM* rec_data; if (!dcr) { @@ -375,8 +376,8 @@ static inline bool bndmp_read_data_from_block(JobControlRecord* jcr, uint32_t wanted_data_length, uint32_t* data_length) { - DeviceControlRecord* dcr = jcr->read_dcr; - READ_CTX* rctx = jcr->rctx; + DeviceControlRecord* dcr = jcr->impl_->read_dcr; + READ_CTX* rctx = jcr->impl_->rctx; bool done = false; bool ok = true; @@ -479,7 +480,7 @@ static inline bool bndmp_read_data_from_block(JobControlRecord* jcr, */ static inline bool BndmpCreateVirtualFile(JobControlRecord* jcr, char* filename) { - DeviceControlRecord* dcr = jcr->dcr; + DeviceControlRecord* dcr = jcr->impl_->dcr; struct stat statp; time_t now = time(NULL); PoolMem attribs(PM_NAME), data(PM_NAME); @@ -591,7 +592,7 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session* sess, * In NDMP terms this is the same as a FD connecting so wake any waiting * threads. */ - pthread_cond_signal(&jcr->job_start_wait); + pthread_cond_signal(&jcr->impl_->job_start_wait); /* * Save the JobControlRecord to ndm_session binding so everything furher @@ -623,9 +624,9 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session* sess, * Depending on the open mode select the right DeviceControlRecord. */ if (will_write) { - dcr = jcr->dcr; + dcr = jcr->impl_->dcr; } else { - dcr = jcr->read_dcr; + dcr = jcr->impl_->read_dcr; } if (!dcr) { @@ -653,7 +654,7 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session* sess, * One NDMP backup Job can be one or more save sessions so we keep * track if we already acquired the storage. */ - if (!jcr->acquired_storage) { + if (!jcr->impl_->acquired_storage) { /* * Actually acquire the device which we reserved. */ @@ -671,7 +672,7 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session* sess, /* * Keep track that we acquired the storage. */ - jcr->acquired_storage = true; + jcr->impl_->acquired_storage = true; Dmsg1(50, "Begin append device=%s\n", dcr->dev->print_name()); @@ -729,16 +730,16 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session* sess, /* * Setup internal system for reading data (if not done before). */ - if (!jcr->acquired_storage) { + if (!jcr->impl_->acquired_storage) { Dmsg0(20, "Start read data.\n"); - if (jcr->NumReadVolumes == 0) { + if (jcr->impl_->NumReadVolumes == 0) { Jmsg(jcr, M_FATAL, 0, _("No Volume names found for restore.\n")); goto bail_out; } Dmsg2(200, "Found %d volumes names to restore. First=%s\n", - jcr->NumReadVolumes, jcr->VolList->VolumeName); + jcr->impl_->NumReadVolumes, jcr->impl_->VolList->VolumeName); /* * Ready device for reading @@ -757,7 +758,7 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session* sess, /* * Keep track that we acquired the storage. */ - jcr->acquired_storage = true; + jcr->impl_->acquired_storage = true; /* * Change the Job to running state. @@ -767,13 +768,13 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session* sess, Dmsg1(50, "Begin reading device=%s\n", dcr->dev->print_name()); PositionDeviceToFirstFile(jcr, dcr); - jcr->mount_next_volume = false; + jcr->impl_->mount_next_volume = false; /* * Allocate a new read context for this Job. */ rctx = new_read_context(); - jcr->rctx = rctx; + jcr->impl_->rctx = rctx; /* * Read the first block and setup record processing. @@ -851,7 +852,7 @@ extern "C" ndmp9_error BndmpTapeClose(struct ndm_session* sess) } } - pthread_cond_signal(&jcr->job_end_wait); /* wake any waiting thread */ + pthread_cond_signal(&jcr->impl_->job_end_wait); /* wake any waiting thread */ ndmos_tape_initialize(sess); @@ -1033,7 +1034,7 @@ static inline void UnregisterCallbackHooks(struct ndm_session* sess) void EndOfNdmpBackup(JobControlRecord* jcr) { - DeviceControlRecord* dcr = jcr->dcr; + DeviceControlRecord* dcr = jcr->impl_->dcr; char ec[50]; /* @@ -1099,9 +1100,9 @@ void EndOfNdmpBackup(JobControlRecord* jcr) /* * Release the device -- and send final Vol info to DIR and unlock it. */ - if (jcr->acquired_storage) { + if (jcr->impl_->acquired_storage) { ReleaseDevice(dcr); - jcr->acquired_storage = false; + jcr->impl_->acquired_storage = false; } else { dcr->UnreserveDevice(); } @@ -1112,16 +1113,16 @@ void EndOfNdmpBackup(JobControlRecord* jcr) void EndOfNdmpRestore(JobControlRecord* jcr) { - if (jcr->rctx) { - FreeReadContext(jcr->rctx); - jcr->rctx = NULL; + if (jcr->impl_->rctx) { + FreeReadContext(jcr->impl_->rctx); + jcr->impl_->rctx = NULL; } - if (jcr->acquired_storage) { - ReleaseDevice(jcr->read_dcr); - jcr->acquired_storage = false; + if (jcr->impl_->acquired_storage) { + ReleaseDevice(jcr->impl_->read_dcr); + jcr->impl_->acquired_storage = false; } else { - jcr->read_dcr->UnreserveDevice(); + jcr->impl_->read_dcr->UnreserveDevice(); } } diff --git a/core/src/stored/read.cc b/core/src/stored/read.cc index 9b65681bc36..0e9bc57153b 100644 --- a/core/src/stored/read.cc +++ b/core/src/stored/read.cc @@ -32,6 +32,7 @@ #include "stored/stored.h" #include "stored/acquire.h" #include "stored/bsr.h" +#include "stored/jcr_private.h" #include "stored/mount.h" #include "stored/read_record.h" #include "lib/bnet.h" @@ -57,7 +58,7 @@ static char rec_header[] = "rechdr %ld %ld %ld %ld %ld"; bool DoReadData(JobControlRecord* jcr) { BareosSocket* fd = jcr->file_bsock; - DeviceControlRecord* dcr = jcr->read_dcr; + DeviceControlRecord* dcr = jcr->impl_->read_dcr; bool ok = true; Dmsg0(20, "Start read data.\n"); @@ -67,14 +68,14 @@ bool DoReadData(JobControlRecord* jcr) return false; } - if (jcr->NumReadVolumes == 0) { + if (jcr->impl_->NumReadVolumes == 0) { Jmsg(jcr, M_FATAL, 0, _("No Volume names found for restore.\n")); fd->fsend(FD_error); return false; } Dmsg2(200, "Found %d volumes names to restore. First=%s\n", - jcr->NumReadVolumes, jcr->VolList->VolumeName); + jcr->impl_->NumReadVolumes, jcr->impl_->VolList->VolumeName); /* * Ready device for reading @@ -104,7 +105,7 @@ bool DoReadData(JobControlRecord* jcr) */ fd->signal(BNET_EOD); - if (!ReleaseDevice(jcr->read_dcr)) { ok = false; } + if (!ReleaseDevice(jcr->impl_->read_dcr)) { ok = false; } Dmsg0(30, "Done reading.\n"); return ok; diff --git a/core/src/stored/read_ctx.h b/core/src/stored/read_ctx.h index 8af7ba21269..f325ff87c76 100644 --- a/core/src/stored/read_ctx.h +++ b/core/src/stored/read_ctx.h @@ -24,8 +24,22 @@ #ifndef BAREOS_STORED_READ_CTX_H_ #define BAREOS_STORED_READ_CTX_H_ 1 +#include "stored/record.h" + namespace storagedaemon { +struct DeviceRecord; + +/* clang-format off */ +struct Read_Context { + DeviceRecord* rec = nullptr; /**< Record currently being processed */ + dlist* recs = nullptr; /**< Linked list of record packets open */ + Session_Label sessrec; /**< Start Of Session record info */ + uint32_t records_processed = 0; /**< Number of records processed from this block */ + int32_t lastFileIndex = 0; /**< Last File Index processed */ +}; +/* clang-format on */ + typedef struct Read_Context READ_CTX; } /* namespace storagedaemon */ diff --git a/core/src/stored/read_record.cc b/core/src/stored/read_record.cc index d0278560962..cb6de0be79f 100644 --- a/core/src/stored/read_record.cc +++ b/core/src/stored/read_record.cc @@ -39,8 +39,10 @@ #include "stored/stored.h" #include "stored/butil.h" #include "stored/device.h" +#include "stored/jcr_private.h" #include "stored/label.h" #include "stored/match_bsr.h" +#include "stored/read_ctx.h" #include "include/jcr.h" namespace storagedaemon { @@ -220,15 +222,15 @@ bool ReadNextBlockFromDevice(DeviceControlRecord* dcr, trec->FileIndex = EOT_LABEL; trec->File = dcr->dev->file; *status = RecordCb(dcr, trec); - if (jcr->mount_next_volume) { - jcr->mount_next_volume = false; + if (jcr->impl_->mount_next_volume) { + jcr->impl_->mount_next_volume = false; dcr->dev->ClearEot(); } FreeRecord(trec); } return false; } - jcr->mount_next_volume = false; + jcr->impl_->mount_next_volume = false; /* * We just have a new tape up, now read the label (first record) @@ -261,7 +263,7 @@ bool ReadNextBlockFromDevice(DeviceControlRecord* dcr, * I/O error or strange end of tape */ DisplayTapeErrorStatus(jcr, dcr->dev); - if (forge_on || jcr->ignore_label_errors) { + if (forge_on || jcr->impl_->ignore_label_errors) { dcr->dev->fsr(1); /* try skipping bad record */ Pmsg0(000, _("Did fsr in attemp to skip bad record.\n")); continue; @@ -327,11 +329,11 @@ bool ReadNextRecordFromBlock(DeviceControlRecord* dcr, */ if (rec->FileIndex < 0) { HandleSessionRecord(dcr->dev, rec, &rctx->sessrec); - if (jcr->bsr) { + if (jcr->impl_->bsr) { /* * We just check block FI and FT not FileIndex */ - rec->match_stat = MatchBsrBlock(jcr->bsr, dcr->block); + rec->match_stat = MatchBsrBlock(jcr->impl_->bsr, dcr->block); } else { rec->match_stat = 0; } @@ -342,9 +344,9 @@ bool ReadNextRecordFromBlock(DeviceControlRecord* dcr, /* * Apply BootStrapRecord filter */ - if (jcr->bsr) { + if (jcr->impl_->bsr) { rec->match_stat = - MatchBsr(jcr->bsr, rec, &dev->VolHdr, &rctx->sessrec, jcr); + MatchBsr(jcr->impl_->bsr, rec, &dev->VolHdr, &rctx->sessrec, jcr); if (rec->match_stat == -1) { /* no more possible matches */ *done = true; /* all items found, stop */ Dmsg2(debuglevel, "All done=(file:block) %u:%u\n", dev->file, @@ -375,7 +377,7 @@ bool ReadNextRecordFromBlock(DeviceControlRecord* dcr, if (rctx->lastFileIndex != READ_NO_FILEINDEX && rctx->lastFileIndex != rec->FileIndex) { - if (IsThisBsrDone(jcr->bsr, rec) && + if (IsThisBsrDone(jcr->impl_->bsr, rec) && TryDeviceRepositioning(jcr, rec, dcr)) { Dmsg2(debuglevel, "This bsr done, break pos %u:%u\n", dev->file, dev->block_num); @@ -410,7 +412,7 @@ bool ReadRecords(DeviceControlRecord* dcr, rctx = new_read_context(); PositionDeviceToFirstFile(jcr, dcr); - jcr->mount_next_volume = false; + jcr->impl_->mount_next_volume = false; while (ok && !done) { if (JobCanceled(jcr)) { diff --git a/core/src/stored/record.cc b/core/src/stored/record.cc index 9d9a2ca4d94..8b4660bceb8 100644 --- a/core/src/stored/record.cc +++ b/core/src/stored/record.cc @@ -29,6 +29,7 @@ */ #include "include/bareos.h" +#include "stored/jcr_private.h" #include "stored/stored.h" #include "lib/attribs.h" #include "lib/util.h" @@ -684,7 +685,8 @@ bool DeviceControlRecord::WriteRecord() } jcr->JobBytes += after_rec->data_len; /* increment bytes this job */ - if (jcr->RemainingQuota && jcr->JobBytes > jcr->RemainingQuota) { + if (jcr->impl_->RemainingQuota && + jcr->JobBytes > jcr->impl_->RemainingQuota) { Jmsg0(jcr, M_FATAL, 0, _("Quota Exceeded. Job Terminated.\n")); goto bail_out; } diff --git a/core/src/stored/record.h b/core/src/stored/record.h index 368a156ac78..38f92ed3c51 100644 --- a/core/src/stored/record.h +++ b/core/src/stored/record.h @@ -247,19 +247,6 @@ struct Session_Label { #define SERIAL_BUFSIZE 1024 /**< Volume serialisation buffer size */ -/** - * Read context used to keep track of what is processed or not. - */ -/* clang-format off */ -struct Read_Context { - DeviceRecord* rec = nullptr; /**< Record currently being processed */ - dlist* recs = nullptr; /**< Linked list of record packets open */ - Session_Label sessrec; /**< Start Of Session record info */ - uint32_t records_processed = 0; /**< Number of records processed from this block */ - int32_t lastFileIndex = 0; /**< Last File Index processed */ -}; -/* clang-format on */ - struct DelayedDataStream { int32_t stream = 0; /**< stream less new bits */ char* content = nullptr; /**< stream data */ diff --git a/core/src/stored/reserve.cc b/core/src/stored/reserve.cc index 100219cf107..9038413a8ab 100644 --- a/core/src/stored/reserve.cc +++ b/core/src/stored/reserve.cc @@ -33,6 +33,7 @@ #include "stored/stored_globals.h" #include "stored/acquire.h" #include "stored/autochanger.h" +#include "stored/jcr_private.h" #include "stored/wait.h" #include "lib/berrno.h" #include "lib/util.h" @@ -209,7 +210,7 @@ static bool UseDeviceCmd(JobControlRecord* jcr) * If there are multiple devices, the director sends us * use_device for each device that it wants to use. */ - jcr->reserve_msgs = new alist(10, not_owned_by_alist); + jcr->impl_->reserve_msgs = new alist(10, not_owned_by_alist); do { Dmsg1(debuglevel, "msg); ok = sscanf(dir->msg, use_storage, StoreName.c_str(), media_type.c_str(), @@ -218,9 +219,9 @@ static bool UseDeviceCmd(JobControlRecord* jcr) if (!ok) { break; } dirstore = new alist(10, not_owned_by_alist); if (append) { - jcr->write_store = dirstore; + jcr->impl_->write_store = dirstore; } else { - jcr->read_store = dirstore; + jcr->impl_->read_store = dirstore; } rctx.append = append; UnbashSpaces(StoreName); @@ -250,11 +251,11 @@ static bool UseDeviceCmd(JobControlRecord* jcr) } while (ok && dir->recv() >= 0); InitJcrDeviceWaitTimers(jcr); - jcr->dcr = new StorageDaemonDeviceControlRecord; - SetupNewDcrDevice(jcr, jcr->dcr, NULL, NULL); - if (rctx.append) { jcr->dcr->SetWillWrite(); } + jcr->impl_->dcr = new StorageDaemonDeviceControlRecord; + SetupNewDcrDevice(jcr, jcr->impl_->dcr, NULL, NULL); + if (rctx.append) { jcr->impl_->dcr->SetWillWrite(); } - if (!jcr->dcr) { + if (!jcr->impl_->dcr) { BareosSocket* dir = jcr->dir_bsock; dir->fsend(_("3939 Could not get dcr\n")); Dmsg1(debuglevel, ">dird: %s", dir->msg); @@ -281,9 +282,9 @@ static bool UseDeviceCmd(JobControlRecord* jcr) * Put new dcr in proper location */ if (rctx.append) { - rctx.jcr->dcr = jcr->dcr; + rctx.jcr->impl_->dcr = jcr->impl_->dcr; } else { - rctx.jcr->read_dcr = jcr->dcr; + rctx.jcr->impl_->read_dcr = jcr->impl_->dcr; } LockReservations(); @@ -293,7 +294,7 @@ static bool UseDeviceCmd(JobControlRecord* jcr) rctx.have_volume = false; rctx.VolumeName[0] = 0; rctx.any_drive = false; - if (!jcr->PreferMountedVols) { + if (!jcr->impl_->PreferMountedVols) { /* * Here we try to find a drive that is not used. * This will maximize the use of available drives. @@ -428,12 +429,12 @@ bool FindSuitableDeviceForJob(JobControlRecord* jcr, ReserveContext& rctx) DirectorStorage* store; char* device_name = nullptr; alist* dirstore; - DeviceControlRecord* dcr = jcr->dcr; + DeviceControlRecord* dcr = jcr->impl_->dcr; if (rctx.append) { - dirstore = jcr->write_store; + dirstore = jcr->impl_->write_store; } else { - dirstore = jcr->read_store; + dirstore = jcr->impl_->read_store; } Dmsg5(debuglevel, "Start find_suit_dev PrefMnt=%d exact=%d suitable=%d chgronly=%d " @@ -600,11 +601,12 @@ int SearchResForDevice(ReserveContext& rctx) */ if (rctx.store->append == SD_APPEND) { Dmsg2(debuglevel, "Device %s reserved=%d for append.\n", - rctx.device->resource_name_, rctx.jcr->dcr->dev->NumReserved()); + rctx.device->resource_name_, + rctx.jcr->impl_->dcr->dev->NumReserved()); } else { Dmsg2(debuglevel, "Device %s reserved=%d for read.\n", rctx.device->resource_name_, - rctx.jcr->read_dcr->dev->NumReserved()); + rctx.jcr->impl_->read_dcr->dev->NumReserved()); } return status; } @@ -632,11 +634,12 @@ int SearchResForDevice(ReserveContext& rctx) */ if (rctx.store->append == SD_APPEND) { Dmsg2(debuglevel, "Device %s reserved=%d for append.\n", - rctx.device->resource_name_, rctx.jcr->dcr->dev->NumReserved()); + rctx.device->resource_name_, + rctx.jcr->impl_->dcr->dev->NumReserved()); } else { Dmsg2(debuglevel, "Device %s reserved=%d for read.\n", rctx.device->resource_name_, - rctx.jcr->read_dcr->dev->NumReserved()); + rctx.jcr->impl_->read_dcr->dev->NumReserved()); } return status; } @@ -666,11 +669,11 @@ int SearchResForDevice(ReserveContext& rctx) if (rctx.store->append == SD_APPEND) { Dmsg2(debuglevel, "Device %s reserved=%d for append.\n", rctx.device->resource_name_, - rctx.jcr->dcr->dev->NumReserved()); + rctx.jcr->impl_->dcr->dev->NumReserved()); } else { Dmsg2(debuglevel, "Device %s reserved=%d for read.\n", rctx.device->resource_name_, - rctx.jcr->read_dcr->dev->NumReserved()); + rctx.jcr->impl_->read_dcr->dev->NumReserved()); } return status; } @@ -726,11 +729,12 @@ static int ReserveDevice(ReserveContext& rctx) Dmsg1(debuglevel, "try reserve %s\n", rctx.device->resource_name_); if (rctx.store->append) { - SetupNewDcrDevice(rctx.jcr, rctx.jcr->dcr, rctx.device->dev, NULL); - dcr = rctx.jcr->dcr; + SetupNewDcrDevice(rctx.jcr, rctx.jcr->impl_->dcr, rctx.device->dev, NULL); + dcr = rctx.jcr->impl_->dcr; } else { - SetupNewDcrDevice(rctx.jcr, rctx.jcr->read_dcr, rctx.device->dev, NULL); - dcr = rctx.jcr->read_dcr; + SetupNewDcrDevice(rctx.jcr, rctx.jcr->impl_->read_dcr, rctx.device->dev, + NULL); + dcr = rctx.jcr->impl_->read_dcr; } if (!dcr) { @@ -753,7 +757,7 @@ static int ReserveDevice(ReserveContext& rctx) ok = ReserveDeviceForAppend(dcr, rctx); if (!ok) { goto bail_out; } - rctx.jcr->dcr = dcr; + rctx.jcr->impl_->dcr = dcr; Dmsg5(debuglevel, "Reserved=%d dev_name=%s mediatype=%s pool=%s ok=%d\n", dcr->dev->NumReserved(), dcr->dev_name, dcr->media_type, dcr->pool_name, ok); @@ -812,7 +816,7 @@ static int ReserveDevice(ReserveContext& rctx) } else { ok = ReserveDeviceForRead(dcr); if (ok) { - rctx.jcr->read_dcr = dcr; + rctx.jcr->impl_->read_dcr = dcr; Dmsg5(debuglevel, "Read reserved=%d dev_name=%s mediatype=%s pool=%s ok=%d\n", dcr->dev->NumReserved(), dcr->dev_name, dcr->media_type, @@ -1225,7 +1229,7 @@ static void QueueReserveMessage(JobControlRecord* jcr) jcr->lock(); - msgs = jcr->reserve_msgs; + msgs = jcr->impl_->reserve_msgs; if (!msgs) { goto bail_out; } /* * Look for duplicate message. If found, do not insert @@ -1243,7 +1247,7 @@ static void QueueReserveMessage(JobControlRecord* jcr) /* * Message unique, so insert it. */ - jcr->reserve_msgs->push(strdup(jcr->errmsg)); + jcr->impl_->reserve_msgs->push(strdup(jcr->errmsg)); bail_out: jcr->unlock(); @@ -1258,7 +1262,7 @@ static void PopReserveMessages(JobControlRecord* jcr) char* msg; jcr->lock(); - msgs = jcr->reserve_msgs; + msgs = jcr->impl_->reserve_msgs; if (!msgs) { goto bail_out; } while ((msg = (char*)msgs->pop())) { free(msg); } bail_out: @@ -1272,9 +1276,9 @@ void ReleaseReserveMessages(JobControlRecord* jcr) { PopReserveMessages(jcr); jcr->lock(); - if (!jcr->reserve_msgs) { goto bail_out; } - delete jcr->reserve_msgs; - jcr->reserve_msgs = NULL; + if (!jcr->impl_->reserve_msgs) { goto bail_out; } + delete jcr->impl_->reserve_msgs; + jcr->impl_->reserve_msgs = NULL; bail_out: jcr->unlock(); diff --git a/core/src/stored/sd_cmds.cc b/core/src/stored/sd_cmds.cc index 92decc445da..15c9e97be65 100644 --- a/core/src/stored/sd_cmds.cc +++ b/core/src/stored/sd_cmds.cc @@ -38,6 +38,7 @@ #include "stored/stored_globals.h" #include "stored/append.h" #include "stored/authenticate.h" +#include "stored/jcr_private.h" #include "stored/sd_stats.h" #include "stored/sd_stats.h" #include "lib/bnet.h" @@ -145,7 +146,7 @@ void* handle_stored_connection(BareosSocket* sd, char* job_name) if (!jcr->authenticated) { jcr->setJobStatus(JS_ErrorTerminated); } - pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */ + pthread_cond_signal(&jcr->impl_->job_start_wait); /* wake waiting job */ FreeJcr(jcr); return NULL; @@ -238,7 +239,7 @@ bool DoListenRun(JobControlRecord* jcr) */ P(mutex); while (!jcr->authenticated && !JobCanceled(jcr)) { - errstat = pthread_cond_wait(&jcr->job_start_wait, &mutex); + errstat = pthread_cond_wait(&jcr->impl_->job_start_wait, &mutex); if (errstat == EINVAL || errstat == EPERM) { break; } Dmsg1(800, "=== Auth cond errstat=%d\n", errstat); } @@ -299,13 +300,13 @@ static bool StartReplicationSession(JobControlRecord* jcr) BareosSocket* sd = jcr->store_bsock; Dmsg1(120, "Start replication session: %s", sd->msg); - if (jcr->session_opened) { + if (jcr->impl_->session_opened) { PmStrcpy(jcr->errmsg, _("Attempt to open already open session.\n")); sd->fsend(NO_open); return false; } - jcr->session_opened = true; + jcr->impl_->session_opened = true; /* * Send "Ticket" to Storage Daemon @@ -326,7 +327,7 @@ static bool ReplicateData(JobControlRecord* jcr) BareosSocket* sd = jcr->store_bsock; Dmsg1(120, "Replicate data: %s", sd->msg); - if (jcr->session_opened) { + if (jcr->impl_->session_opened) { utime_t now; /* @@ -359,7 +360,7 @@ static bool EndReplicationSession(JobControlRecord* jcr) BareosSocket* sd = jcr->store_bsock; Dmsg1(120, "storedmsg); - if (!jcr->session_opened) { + if (!jcr->impl_->session_opened) { PmStrcpy(jcr->errmsg, _("Attempt to close non-open session.\n")); sd->fsend(NOT_opened); return false; diff --git a/core/src/stored/sd_plugins.cc b/core/src/stored/sd_plugins.cc index 89db607bce3..d346cbe45a9 100644 --- a/core/src/stored/sd_plugins.cc +++ b/core/src/stored/sd_plugins.cc @@ -31,6 +31,7 @@ #include "include/bareos.h" #include "stored/stored.h" #include "stored/stored_globals.h" +#include "stored/jcr_private.h" #include "sd_plugins.h" #include "lib/crypto_cache.h" #include "stored/sd_stats.h" @@ -516,7 +517,7 @@ static inline bpContext* instantiate_plugin(JobControlRecord* jcr, /** * Send a bsdEventNewPluginOptions event to all plugins configured in - * jcr->plugin_options. + * jcr->impl_->plugin_options. */ void DispatchNewPluginOptions(JobControlRecord* jcr) { @@ -532,11 +533,11 @@ void DispatchNewPluginOptions(JobControlRecord* jcr) if (!sd_plugin_list || sd_plugin_list->empty()) { return; } - if (jcr->plugin_options && jcr->plugin_options->size()) { + if (jcr->impl_->plugin_options && jcr->impl_->plugin_options->size()) { eventType = bsdEventNewPluginOptions; event.eventType = eventType; - foreach_alist_index (i, plugin_options, jcr->plugin_options) { + foreach_alist_index (i, plugin_options, jcr->impl_->plugin_options) { /* * Make a private copy of plugin options. */ @@ -703,7 +704,7 @@ static bRC bareosGetValue(bpContext* ctx, bsdrVariable var, void* value) if (jcr) { switch (var) { case bsdVarJob: - *((char**)value) = jcr->job_name; + *((char**)value) = jcr->impl_->job_name; Dmsg1(debuglevel, "sd-plugin: return bsdVarJobName=%s\n", NPRT(*((char**)value))); break; @@ -727,8 +728,8 @@ static bRC bareosGetValue(bpContext* ctx, bsdrVariable var, void* value) NPRT(*((char**)value))); break; case bsdVarPool: - if (jcr->dcr) { - *((char**)value) = jcr->dcr->pool_name; + if (jcr->impl_->dcr) { + *((char**)value) = jcr->impl_->dcr->pool_name; Dmsg1(debuglevel, "sd-plugin: return bsdVarPool=%s\n", NPRT(*((char**)value))); } else { @@ -736,8 +737,8 @@ static bRC bareosGetValue(bpContext* ctx, bsdrVariable var, void* value) } break; case bsdVarPoolType: - if (jcr->dcr) { - *((char**)value) = jcr->dcr->pool_type; + if (jcr->impl_->dcr) { + *((char**)value) = jcr->impl_->dcr->pool_type; Dmsg1(debuglevel, "sd-plugin: return bsdVarPoolType=%s\n", NPRT(*((char**)value))); } else { @@ -745,8 +746,8 @@ static bRC bareosGetValue(bpContext* ctx, bsdrVariable var, void* value) } break; case bsdVarStorage: - if (jcr->dcr && jcr->dcr->device) { - *((char**)value) = jcr->dcr->device->resource_name_; + if (jcr->impl_->dcr && jcr->impl_->dcr->device) { + *((char**)value) = jcr->impl_->dcr->device->resource_name_; Dmsg1(debuglevel, "sd-plugin: return bsdVarStorage=%s\n", NPRT(*((char**)value))); } else { @@ -754,8 +755,8 @@ static bRC bareosGetValue(bpContext* ctx, bsdrVariable var, void* value) } break; case bsdVarMediaType: - if (jcr->dcr) { - *((char**)value) = jcr->dcr->media_type; + if (jcr->impl_->dcr) { + *((char**)value) = jcr->impl_->dcr->media_type; Dmsg1(debuglevel, "sd-plugin: return bsdVarMediaType=%s\n", NPRT(*((char**)value))); } else { @@ -773,8 +774,8 @@ static bRC bareosGetValue(bpContext* ctx, bsdrVariable var, void* value) jcr->JobStatus); break; case bsdVarVolumeName: - if (jcr->dcr) { - *((char**)value) = jcr->dcr->VolumeName; + if (jcr->impl_->dcr) { + *((char**)value) = jcr->impl_->dcr->VolumeName; Dmsg1(debuglevel, "sd-plugin: return bsdVarVolumeName=%s\n", NPRT(*((char**)value))); } else { diff --git a/core/src/stored/sd_stats.cc b/core/src/stored/sd_stats.cc index c0320884dff..dc48c788300 100644 --- a/core/src/stored/sd_stats.cc +++ b/core/src/stored/sd_stats.cc @@ -28,6 +28,7 @@ #include "include/bareos.h" #include "stored/stored.h" #include "stored/stored_globals.h" +#include "stored/jcr_private.h" #include "lib/util.h" #include "include/jcr.h" #include "lib/parse_conf.h" @@ -305,8 +306,8 @@ void UpdateJobStatistics(JobControlRecord* jcr, utime_t now) job_stat->timestamp = now; job_stat->JobFiles = jcr->JobFiles; job_stat->JobBytes = jcr->JobBytes; - if (jcr->dcr && jcr->dcr->device) { - job_stat->DevName = strdup(jcr->dcr->device->resource_name_); + if (jcr->impl_->dcr && jcr->impl_->dcr->device) { + job_stat->DevName = strdup(jcr->impl_->dcr->device->resource_name_); } else { job_stat->DevName = strdup("unknown"); } diff --git a/core/src/stored/spool.cc b/core/src/stored/spool.cc index bde81a61276..a5c8624913d 100644 --- a/core/src/stored/spool.cc +++ b/core/src/stored/spool.cc @@ -32,6 +32,7 @@ #include "stored/stored_globals.h" #include "stored/acquire.h" #include "stored/device.h" +#include "stored/jcr_private.h" #include "lib/berrno.h" #include "lib/bsock.h" #include "lib/edit.h" @@ -118,7 +119,7 @@ bool BeginDataSpool(DeviceControlRecord* dcr) { bool status = true; - if (dcr->jcr->spool_data) { + if (dcr->jcr->impl_->spool_data) { Dmsg0(100, "Turning on data spooling\n"); dcr->spool_data = true; status = OpenDataSpoolFile(dcr); @@ -186,7 +187,7 @@ static bool OpenDataSpoolFile(DeviceControlRecord* dcr) if ((spool_fd = open(name, O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0640)) >= 0) { dcr->spool_fd = spool_fd; - dcr->jcr->spool_attributes = true; + dcr->jcr->impl_->spool_attributes = true; } else { BErrNo be; @@ -250,7 +251,7 @@ static bool DespoolData(DeviceControlRecord* dcr, bool commit) BareosSocket* dir = jcr->dir_bsock; Dmsg0(100, "Despooling data\n"); - if (jcr->dcr->job_spool_size == 0) { + if (jcr->impl_->dcr->job_spool_size == 0) { Jmsg(jcr, M_WARNING, 0, _("Despooling zero bytes. Your disk is probably FULL!\n")); } @@ -264,13 +265,13 @@ static bool DespoolData(DeviceControlRecord* dcr, bool commit) Jmsg(jcr, M_INFO, 0, _("Committing spooled data to Volume \"%s\". Despooling %s bytes " "...\n"), - jcr->dcr->VolumeName, - edit_uint64_with_commas(jcr->dcr->job_spool_size, ec1)); + jcr->impl_->dcr->VolumeName, + edit_uint64_with_commas(jcr->impl_->dcr->job_spool_size, ec1)); jcr->setJobStatus(JS_DataCommitting); } else { Jmsg(jcr, M_INFO, 0, _("Writing spooled data to Volume. Despooling %s bytes ...\n"), - edit_uint64_with_commas(jcr->dcr->job_spool_size, ec1)); + edit_uint64_with_commas(jcr->impl_->dcr->job_spool_size, ec1)); jcr->setJobStatus(JS_DataDespooling); } jcr->sendJobStatus(JS_DataDespooling); @@ -369,12 +370,13 @@ static bool DespoolData(DeviceControlRecord* dcr, bool commit) if (despool_elapsed <= 0) { despool_elapsed = 1; } - Jmsg( - jcr, M_INFO, 0, - _("Despooling elapsed time = %02d:%02d:%02d, Transfer rate = %s " - "Bytes/second\n"), - despool_elapsed / 3600, despool_elapsed % 3600 / 60, despool_elapsed % 60, - edit_uint64_with_suffix(jcr->dcr->job_spool_size / despool_elapsed, ec1)); + Jmsg(jcr, M_INFO, 0, + _("Despooling elapsed time = %02d:%02d:%02d, Transfer rate = %s " + "Bytes/second\n"), + despool_elapsed / 3600, despool_elapsed % 3600 / 60, + despool_elapsed % 60, + edit_uint64_with_suffix( + jcr->impl_->dcr->job_spool_size / despool_elapsed, ec1)); dcr->block = block; /* reset block */ @@ -685,7 +687,7 @@ static bool WriteSpoolData(DeviceControlRecord* dcr) bool AreAttributesSpooled(JobControlRecord* jcr) { - return jcr->spool_attributes && jcr->dir_bsock->spool_fd_ != -1; + return jcr->impl_->spool_attributes && jcr->dir_bsock->spool_fd_ != -1; } /** @@ -697,7 +699,7 @@ bool AreAttributesSpooled(JobControlRecord* jcr) */ bool BeginAttributeSpool(JobControlRecord* jcr) { - if (!jcr->no_attributes && jcr->spool_attributes) { + if (!jcr->impl_->no_attributes && jcr->impl_->spool_attributes) { return OpenAttrSpoolFile(jcr, jcr->dir_bsock); } return true; diff --git a/core/src/stored/status.cc b/core/src/stored/status.cc index 4ea380911da..0cf35d31c9f 100644 --- a/core/src/stored/status.cc +++ b/core/src/stored/status.cc @@ -31,6 +31,7 @@ #include "include/bareos.h" #include "stored/stored.h" #include "stored/stored_globals.h" +#include "stored/jcr_private.h" #include "lib/status.h" #include "stored/spool.h" #include "lib/edit.h" @@ -687,8 +688,8 @@ static void ListRunningJobs(StatusPacket* sp) job_type_to_str(jcr->getJobType()), jcr->Job); sendit(msg, len, sp); } - dcr = jcr->dcr; - rdcr = jcr->read_dcr; + dcr = jcr->impl_->dcr; + rdcr = jcr->impl_->read_dcr; if ((dcr && dcr->device) || (rdcr && rdcr->device)) { bstrncpy(JobName, jcr->Job, sizeof(JobName)); /* There are three periods after the Job name */ @@ -776,7 +777,7 @@ static inline void SendDriveReserveMessages(JobControlRecord* jcr, char* msg; jcr->lock(); - msgs = jcr->reserve_msgs; + msgs = jcr->impl_->reserve_msgs; if (!msgs || msgs->size() == 0) { goto bail_out; } for (i = msgs->size() - 1; i >= 0; i--) { msg = (char*)msgs->get(i); @@ -804,7 +805,7 @@ static void ListJobsWaitingOnReservation(StatusPacket* sp) } foreach_jcr (jcr) { - if (!jcr->reserve_msgs) { continue; } + if (!jcr->impl_->reserve_msgs) { continue; } SendDriveReserveMessages(jcr, sp); } endeach_jcr(jcr); diff --git a/core/src/stored/stored.cc b/core/src/stored/stored.cc index b446d70088f..c312c946593 100644 --- a/core/src/stored/stored.cc +++ b/core/src/stored/stored.cc @@ -40,6 +40,7 @@ #include "stored/autochanger.h" #include "stored/bsr.h" #include "stored/device.h" +#include "stored/jcr_private.h" #include "stored/job.h" #include "stored/label.h" #include "stored/ndmp_tape.h" @@ -533,14 +534,14 @@ extern "C" void* device_initialization(void* arg) LockRes(my_config); pthread_detach(pthread_self()); - jcr = new_jcr(sizeof(JobControlRecord), StoredFreeJcr); + jcr = NewStoredJcr(); NewPlugins(jcr); /* instantiate plugins */ jcr->setJobType(JT_SYSTEM); /* * Initialize job start condition variable */ - errstat = pthread_cond_init(&jcr->job_start_wait, NULL); + errstat = pthread_cond_init(&jcr->impl_->job_start_wait, NULL); if (errstat != 0) { BErrNo be; Jmsg1(jcr, M_ABORT, 0, @@ -551,7 +552,7 @@ extern "C" void* device_initialization(void* arg) /* * Initialize job end condition variable */ - errstat = pthread_cond_init(&jcr->job_end_wait, NULL); + errstat = pthread_cond_init(&jcr->impl_->job_end_wait, NULL); if (errstat != 0) { BErrNo be; Jmsg1(jcr, M_ABORT, 0, @@ -570,9 +571,9 @@ extern "C" void* device_initialization(void* arg) } dcr = new StorageDaemonDeviceControlRecord; - jcr->dcr = dcr; + jcr->impl_->dcr = dcr; SetupNewDcrDevice(jcr, dcr, dev, NULL); - jcr->dcr->SetWillWrite(); + jcr->impl_->dcr->SetWillWrite(); GeneratePluginEvent(jcr, bsdEventDeviceInit, dcr); if (dev->IsAutochanger()) { /* @@ -588,7 +589,7 @@ extern "C" void* device_initialization(void* arg) dev->print_name()); Dmsg1(20, "Could not open device %s\n", dev->print_name()); FreeDeviceControlRecord(dcr); - jcr->dcr = NULL; + jcr->impl_->dcr = NULL; continue; } } @@ -606,7 +607,7 @@ extern "C" void* device_initialization(void* arg) } } FreeDeviceControlRecord(dcr); - jcr->dcr = NULL; + jcr->impl_->dcr = NULL; } FreeJcr(jcr); init_done = true; @@ -660,15 +661,16 @@ static jcr->MyThreadSendSignal(TIMEOUT_SIGNAL); Dmsg1(100, "term_stored killing JobId=%d\n", jcr->JobId); /* ***FIXME*** wiffle through all dcrs */ - if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->blocked()) { - pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol); + if (jcr->impl_->dcr && jcr->impl_->dcr->dev && + jcr->impl_->dcr->dev->blocked()) { + pthread_cond_broadcast(&jcr->impl_->dcr->dev->wait_next_vol); Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId); ReleaseDeviceCond(); } - if (jcr->read_dcr && jcr->read_dcr->dev && - jcr->read_dcr->dev->blocked()) { - pthread_cond_broadcast(&jcr->read_dcr->dev->wait_next_vol); + if (jcr->impl_->read_dcr && jcr->impl_->read_dcr->dev && + jcr->impl_->read_dcr->dev->blocked()) { + pthread_cond_broadcast(&jcr->impl_->read_dcr->dev->wait_next_vol); Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId); ReleaseDeviceCond(); diff --git a/core/src/tests/sd_reservation.cc b/core/src/tests/sd_reservation.cc index 5c93fbee991..4cccc8a33d9 100644 --- a/core/src/tests/sd_reservation.cc +++ b/core/src/tests/sd_reservation.cc @@ -31,6 +31,7 @@ #include "lib/crypto_cache.h" #include "lib/edit.h" #include "lib/parse_conf.h" +#include "stored/jcr_private.h" #include "stored/job.h" #include "stored/sd_plugins.h" #include "stored/sd_stats.h" @@ -113,7 +114,7 @@ struct TestJob { TestJob() = delete; TestJob(uint32_t jobid) { - jcr = new_jcr(sizeof(JobControlRecord), storagedaemon::StoredFreeJcr); + jcr = NewStoredJcr(); jcr->JobId = jobid; jcr->sd_auth_key = strdup("no key set"); } @@ -137,7 +138,7 @@ void WaitThenUnreserve(std::unique_ptr&); void WaitThenUnreserve(std::unique_ptr& job) { std::this_thread::sleep_for(std::chrono::milliseconds(10)); - job->jcr->dcr->UnreserveDevice(); + job->jcr->impl_->dcr->UnreserveDevice(); ReleaseDeviceCond(); }