Thursday, July 23, 2015

It's time for me to start blogging again. 

First, and most pleasantly, I no longer feel so overwhelmed.  Work is starting to be a pleasure again.
After struggling, for far too long, to transfer a single integer from a xen front end to a xen back end, I expanded this code to handle multiple data transfers, of varying sizes, as multiple requests and responses.  This second task took me 3.5 days.  Quite a difference, and a relief.

I still want to be sure that before this internship is over, I have done something useful:  at a minimum a decent subset of the original task.   If I am able to continue to work more effectively, I might be able to finish the task.

I have learned a lot, so, for me, this hasn't been a waste of time,  but I do like to give value for money being paid me.  I began this project wanting to get into the Linux world (after 30 years of not touching Unix), and I have learned numerous tools, from shell scripting to an easy facility with find and grep, to git; concepts such as the Xen project, and how it is organized and the 9p file system.

Since I lost a week to health issues, I've committed to my mentors that I will continue for a week after the internship is officially over.  I suspect I will use much of that time to update documentation that tripped me up, so the next person will find their task easier.

Tuesday, July 7, 2015

I have been asked by my mentors to do a self-assessment.  I thought I'd post this, as a simple way to share where I'm at.

I am having trouble evaluating how I'm doing, because it's a matter of "compared to what?"  
I have a masters degree in CS and 30 years of experience.  For that background, what I have accomplished is pathetic, and painful to observe.  For comparison, I could not have done this project, at all, when I first finished school - three years out, I would have found it a cake-walk.

On the other hand, I have not worked regularly since 2003, due to health problems.  In 2011, I began working, with the intention of coming up to speed in web technologies, and the latest tools, environments, etc.  That was when I suffered a head injury. 

So my goals for this outreach internship were as follows (in this priority):
     Do something useful
     Come up to speed in some area of CS, with the shortest learning curve - i.e. so I can be useful in the future

     Learn where I still have cognitive deficits, and learn to compensate for them.
     Learn what my limitations are, so I don't oversell myself (I don't work as well if someone expects something of me that I can't deliver.)

Since this internship began, I have discovered two goals/outcomes, that I didn't expect:
     Rediscover the joy in software development
     Stretching my brain, so that the work is gradually becoming easier.  (too slowly by half but...)

What I’ve done:
    Set up a Linux box and built kernel and xen from source
                Wrote a requirements document for project
                Wrote a combination low level requirements doc and partial design document for the 9P portion of the project.
                Determined that there is no 9P server code for my back-end to talk to, but that there is a server embedded in virtio’s 9p back end.
                Agreed with mentors that simplest approach is to port virtio, and use as much of their server code as possible.
                Coded, compiled a simple frontend that writes an integer to a ring, and a backend that reads the int.

What I’ve learned.
9p file system requirements for client and transport.
Much about how virtio implemented the 9p fs transport and server.
The xen communication model between front and back ends, including xenbus/xenstore (finally (!) got it that they were the same), ring buffer, grant tables, and how to access each of these.
            Relearned many Linux commands:  Find, grep, makefiles, cat, cd man, scp etc.
How to track down and solve errors with google
Different versions of Qemu, and which one to use
What it takes to build in Qemu, and add modules to it
            How to set up linux kernel configuration file.
            How to build and run a kernel module in debian
            Many tools (emacs, vi, pastebin, github, blog, etc.
The biggest hold-up is that I have taken a number of false paths, and, more importantly, taken too long to recognize them as such, in chronological order:
               Trying to get Network manager to work with bridges (this was 4 days)
               Misreading something and thinking v9fs was a 9p server, not a client. (3 days)

               Road maps that did not match mentor’s expectations (?)

               Trying to set up VMbox for testing. (2 days)
               Spending too much time trying to understand blkback.c (2 days)
               Tried to compile my backend stand-alone – bad idea (a few hours)    
                   Others I’ve forgotten
It's possible that it's taking less time for me to recognize these false paths, but it's too soon to tell.  But it's not like all that time was wasted, since I did learn things in the process.

As far as where I'm going - the small modules I've written will provide a secure scaffolding to develop the main project in.  I've provided a communication between front and back end, learned to build them, and (very soon) will know how to test them. 

The next steps are to modify my modules to handle multiple requests, from multiple sources.  And then add 9p transport code.  This last step would be impossible in the time allotted if I had to write the server side from scratch (as virtio did).  Using what they've done on the front and back end (making this project a port), it is still possible to finish this, by late August.