Marco, how did you first get involved in contributing code to the Bacula Project?
I started looking at an OpenSource backup tool this summer to replace my aging Legato Networker setup, which I had for the last eight years. I had been traveling in Australia for two months until May this year, and after returning I was unemployed; that gave me the opportunity to give the search for a new solution some quality time.
As I wanted to do disk-to-disk-to-tape backups, I needed a replacement product as Legato has all those very annoying licenses for each extra feature. I didn’t want to buy all sorts of new licenses, so I was looking for other software that could support that. I looked first at amanda (but without the zManda add-ons), but that didn’t seem to give me the flexibility I needed. So I looked further and found Bacula. The first thing I found was that Bacula has very good documentation – at least something I could understand. It also has quite a lot of things which reminded me of Legato Networker, which I had used for so many years with customers.
I first made a proof-of-concept setup, which I still have, as I still run Bacula as a shadow copy of my Legato setup. Then I dived right in, and started to look at how to implement disk-to-disk-to-tape backups. I soon found out that I need the so called ‘copy jobs’ which were in the development branch of Bacula; and as I used it as a proof-of-concept, I could easily test some real bleeding-edge code. After reading the mailing list archive, I found that someone else had already found out how to copy jobs from one pool to another using some sql code. Kern had already said in that email discussion that it was something he would like to add to Bacula. As I looked at the code, I saw that it didn’t support that particular job natively.
Instead of nagging about it on the mailinglist, I took the plunge and looked at the source code of Bacula, to see if I could implement things easily. And I was struck by the straightforward way most of the code is written – and for me,having a programming background, being the original author of the Linux diskquota code in 1994, I was able to implement the stuff in less then 2 days. At the same time, I also added some small patches to get the code compiling with the same Solaris compiler that I normally use, being mainly focused on Solaris nowadays. In addition to that, I also added some small add-ons to the restore functions so that I could use the ‘add’ and ‘delete’ keyword in selecting what files to restore – which was a methodology I was used to as a result of using Legato for so many years.
When I had tested it for a couple of days, I sent an email to Kern to ask what he thought about my patches. I got a reply which was very encouraging. He thought my patches were “very nice” and that I had “grasped the Bacula programming style”, which of course, is very much due to the fact that the Bacula code is well designed and easily understandable for programmers
What’s your favourite part of Bacula that you have worked on?
Well, probably the second patch I added. It was a bigger one than the first, and it had the ability to use shared libraries to re-use big chunks of code between the different parts of Bacula. I asked Kern first if he thought it would make sense to do so and after getting positive feedback from him, I went for it!
I mastered the use of GNU autoconf first; as up until now I had never done anything with it, other than hacking it somewhat every now and then to get things to compile on Solaris. Shared libraries are a big lifesaver on Solaris, as I build all software on that platform for both 32 bits and 64 bits before packaging it into a native Solaris package. The previous way Bacula was built had left me with very large packages, and the utilization of shared libaries have now cut the size down by at least half. In adding libtool, which is used to build the shared libraries, I also did a major overhaul of the configure process; which is much cleaner now. At least, that is what I think!
What’s your favorite time of day to work on it? Why?
Up until a couple of weeks ago I had the luxury of being able to work on Bacula when I wanted to – be it during the day or during the night – because I was unemployed after my trip and looking for a new consultancy job. But now that I have a consultancy job during the day, I focus mainly on system integration issues for customers, so Bacula is my evening and weekend hobby. Which is healthier!
I like to work and deliver things, but also every now and then, step back and think conceptually about how to solve problems. The nice thing about a project like Bacula is that there are no deadlines that I have to meet. But when I get something working, I use it myself, so as well as giving other people something of value, I also gain something from it myself.
What do you feel has been your best piece of code for Bacula? What does/did it do?
Personally, I’m very pleased with the overhaul of the ACL code, and the newly introduced extended attribute code. Although there is more to be done there, the first stab of code went into SVN just a couple of days ago. Due to the fact that some code was prototypes using only the man pages I expect some problems that need to be ironed out. First I added support for ZFS acls in an earlier version of the acl code of Bacula because I was missing that particular support on Solaris, as I run a home server with lots of ZFS storage. When I then looked at the acl code and at the project file, I found an interesting subject I wanted to address.
After posting an message on the developer mailing list and getting some very valuable input from Kern, I started designing the new code and the major code was implemented within a couple of days. The first version didn’t even compile, and when it did it crashed horribly! So for the first time in years, I single-stepped using gdb through some code on Linux, which was kind of fun, and brought back lots of great memories about earlier coding exercises I did years ago.
What do you think you might work on in the future, with Bacula?
I’ll probably work a lot on the acl stuff, if needed. And I hope to develop the extended attribute code to support Solaris extended attributes. Currently I don’t use extended attributes myself, but I would like to see good support for Solaris and OpenSolaris in Bacula, as I have made my living with Solaris for ten or more years now, and really like the OS. So in the end it is as much about gaining something from it myself on my primary platforms. This does not mean I have forgotten about other platforms, as people might have seen from my previous overhaul of the acl and extended attributes code – which for now covers Linux, FreeBSD, OSX and NetBSD.
Also, I hope that we get some form of storage plug-in framework in the storage daemon so we could add different types of storage in the future. Things I think about are S3 and NDMP, for example. And as SUN is pushing OpenStorage a lot, Bacula might play a role in that arena too; for now, I think the focus is too much on zManda.
Do you have any advice for other people wanting to get involved in being a Bacula developer?
Read the documentation very well, and have a good look at the source code. Reading it really helps a lot to code in the same style that Bacula is written in. I like how things work in OpenSolaris now, with the so-called ARC process, where you first agree on the architecture of things. This also saves you a lot of disappointment when you then try to get things integrated.
I really like to spar with Kern on some things, as he always has good input and has a much better overall view of things… then again, he has been working on it for eight years, and I’m just starting!