Deaf, dumb and blind (by )

The scene: I'm happily working away in London. Sarah is at home, and finds that the Internet connection is down. So she resets the wifi AP and the router and so on, but it doesn't get better. So she rings me.

I can't ping the router from afar, and a traceroute ends at an address that I don't think looks like the last hop before the ADSL link from memory, so I file a ticket with the ISP and get on with work.

But there's no reply to the ticket, so I ring, and sit in a queue, which eventually hangs me up.

So I google and find:

186k, Elite Internet, Mailbox Internet Services Go Bust?

Ah. Apparently my broadband ISP has become one with the Force. So Sarah can't get any work done at home, and I'll have to figure something out so that I can get some work done when I go home, and we'll need to join the queue for a MAC code to migrate to a new broadband provider, which we'll have to choose. And I doubt we'll get back any of the money - we paid a year in advance...

Bleargh...

Jean and her guitar (by )

I dug Jean's guitar out of storage - Barbara thought it was new but I pointed out she had it before the flood - Barbara thought this was odd and that I was 'assuming' genius as Jean wouldn't have been old enough to hold it properlly etc... but thats not the case.

Jean at the time would not leave my guitar along - I could not practice for little chubby hands trying to join in so I found a small cheap guitar and got it for her - at the moment it is annoyingly holding tune better than mine :/

Jean was excited to get her guitar back and we 'played' a few tunes - she now knows what the different bits are called anyway!

jammin Just me and my guitar Jean and her guitar

We also have a music corner in the bedroom which has Seths drum and other sundries like my recorder etc...

Information Request I (by )

Ok so I realised that I hadn't actually remembered to put this public so yes request one is now after request II - sigh!

As some of you know I have a cooking blog which I have been neglectful over telling people about!

I am looking for recipes for it, I would especially like all those ones that people don't really think about you know - grans chicken soup that sort of thing. Becca, @ndy and Ella have already contributed. Which is cool.

I am veiwing the cooking blog as a sort of research tool and store of recipes. Any interesting food facts are welcome too 🙂

When I say cooking I mean everything form how to make a sandwitch to making preserves to making wine, butter etc... The blog still need some work as it was sort of abandoned with all the flood stuff and the posts that are live aren't even edited yet but its getting there 🙂

Also any cool food websites you know about - let me know - if you have a food bit on your blog let me know etc...

I still have like a hundred recipes to type up from when we lived at Barbaras for it as well.

Ugarit update (by )

Jean woke us up at 6am today, wanting to be in Mummy and Daddy's Bed, but I couldn't get back to sleep after this so lay there thinking about things.

I was pondering the cache-deletion issue in Ugarit that I mentioned before.

The cache in Ugarit serves an important function: in order to know if it needs to upload a block of data or not, Ugarit checks first to see if a block with the same Tiger hash already exists. This operation is performed on everything in your entire filesystem every time you do a snapshot (although I'm scheming up some optimsiations to avoid this based on caching the hashes of files by their modtime and all that). If you have a slow remote archive, such as in S3, then each check for existence of a block might easily take a tenth of a second or more - and since the largest filesystem I need backing up will contain at least a million blocks, that'd be over a day just spent on checking what blocks already exist. So the cache contains a list of known-existing blocks, stored in a B-Tree on the local filesystem. Whenever a block is uploaded, it's added to the B-Tree, as we know it exists in the archive. When a check for the existance of a block comes in, we check the cache; if we see it, then we know instantly that the block exists. Otherwise we check the archive, and if the block was found, we mark this fact in the cache so that we can use it in future. And, of course, if we are asked to unlink a block, we pass that request to the archive, and if it reports that it finally deleted the block rather than just decrementing its reference count, we remove the block's hash from the cache.

However, if you have multiple computers sharing a single archive - which is a perfectly sensible thing to do, as the shared archive will mean that all the different filesystems being backed up to it will share copies (and thus not waste upload bandwidth) of files that appear in both (such as most of everything outside of /var, /home, and */etc on a NetBSD system) - then deletion with caches poses an issue: if you delete a file, and update your local cache, but somebody else is also using a cache on the same archive, then their cache will not know about the deletion. This is dangerous since it means that cache will then falsely report existence of a block that's not actually in the archive, which means the contents of that block won't be uploaded - and since it was deleted from the archive, it means that block won't be backed up anywhere. Danger, danger!

But as I lay there thinking, a solution came to me.

I should make the cache backend maintain an intent log of deletions it proposes to make. When this log is about to become too big to fit in a block itself, it should:

  1. Upload it to the storage backend
  2. Request the key of the block pointed at by a special **DELETION CHAIN HEAD** tag
  3. Upload a small block containing that key, and the key of the block full of deleted block keys.
  4. Update the **DELETION CHAIN HEAD** tag to point to the new block
  5. Process the actual deletions

That way, it keeps a log of deleted references in the archive, and makes sure it's initialised before doing any actual deletes.

Then the cache just needs to store a local copy of the **DELETION CHAIN HEAD** tag. When it starts up (or wants to do a periodic check) it can fetch the one from the archive; if they differ, then it should follow the chain of deletion blocks, removing them from the cache, until it reaches the deletion block with the key it has stored, or the end of the list, at which point it can stop and update its local copy of the tag.

There's still potential races - another deletion operation running in parallel might race over the **DELETION CHAIN HEAD** tag, although I've tried to keep only a very small block upload within the window between getting and setting the tag - so I've added tag-lock! and tag-unlock! primitives to the storage engine API, to avoid that entirely.

More excitingly, if a deletion is running in parallel with a snapshot, then the cache being used by the snapshot might not realise a block has been deleted and return success right away.

Perhaps I need to extend tag-lock! and tag-unlock! to be a full-fledged semaphore system, so I can maintain archive invariants, such as that there may be N snapshots running or 1 deletion, like a read/write lock. But I don't like locks - doing it without locks would be much better!

Currently, the archive storage engine API won't quite allow the intent log, anyway, since it just has an unlink! function that returns false if the block still has references, and returns the contents of the block if it does not (so that the caller can then recursively unlink! everything mentioned from within that block). So there's no easy way of asking the storage engine we're wrapping the cache around whether an unlink! would delete a block without actually deleting it. But, we can make do without, at the cost of a little less safety; we can instead make the cache store an after-the-fact log of deleted block keys, and just upload them when it gets full.

So, I'm still not sure if we need the complexity of safe deletions. Are frequent deletions actually a good idea anyway? The neat thing about a content-addressed store is that it does work well as a continual archive, as it essentially stores differences. I decided to implement deletion since I know there will be situations where the thought of freeing up a hundred gigabytes will be more inviting than having a year's snapshots from a decade ago lying around; if I don't implement deletion, then users will forever be pestering me about it. So perhaps I should just leave deletion in as is, along with a warning (automatically output when a cache spots its first deletion request of a session) to the user that doing a deletion will invalidate any other caches around the same archive on different machines.

Still, one cheery thought struck me: if you're running a snapshot, and your computer crashes, then you can just start the snapshot again. We'll only update the snapshot tag when a snapshot is completed, so you won't get a partial snapshot; but when you start again, all the blocks you'd already uploaded will not need to be uploaded again, so it'll just pick up about where it left off last time. Excellent!

My 28th Birthday (by )

For my 28th birthday Alaric made me a butterfly cake out of the left over swiss roll and chocolate from christmas!

Butterfly cake

I'll be posting about this over on Salaric cooking for those interested in how he did it 🙂 But there was a lot of chocolate involved and Jeany got to lick the pot out - eek!

Oh no! Jeans found the chocolate pot!

After she was hyper from that we sent her off to a place called Magic Land in Cirencester for her friend Jame's birthday. She had a great and exhusting 2 hours jumping on soft play kits and the like. Al had forgotten the camera so I photographed my boots and things - I love having a camera again. But I was sad as I thought I had lost all the cool pictures of Jeany sledging as the camera was only showing 2 pictures but it wasn't - it was becuase Al had put my birthday presant in the camera - an SD card that has like 1600 picture capacity on it!

The camera was only showing me what was on the new card and not what was on the internal memory!

He also got me a card reader so I can extract not only these picks easily but all those that are traped on the cards of the old cameras!

I had a nice long bath with defoliating face scrub whilst they were at the party too. Then they came back and Jean had more things than she went with!

Each child had got a presant and Jeans was this book of paper dolls you construct and then dress up - we sat infront of the fire on her road map mat and made the two princesses from it! I'll do a bigger post about them on Salaric Carft along with the lovely Japanese stickers Andy gave her which she decided to stick half of in my diary as she knows I love stickers 🙂 We also made some pictures out of them that are now on the fridge - I'll put these on Salaric Craft too 🙂

Two princess's together Jean with her creation

Al made me a cheese fondue with crusty bread and raw cualiflower, he didn't get time to cut the other vegtables up but there turned out to be just enough for the fondue dipping anyway!

Barbara came round and we opened a bottle of fizzy wine we'd got as a christmas presant (the fondue was made with christmas presant wine too).

Birthday meal

I got out the fluted glasses from the wedding as I now have them back in the house and no longer in storage!

Purple glass

Andy also sent back a birthday presant with Al for me which was four lovely slate coasters which come from the same place as our slate place mats and that we got as a wedding presant. I was so excited about this I decided I should lay the table with the slate stuff purely so I could use them! I also got out the four butterfly napkin rings my brother and his girlfriend got me last year!

Table layout

Al bought the butterfly cake out - me and Jean blew the candles out and Barbara took her piece over to the Mill to eat but even though I warned her the candle holders where still on the cake she managed to chomp one of them up which she duly returned as her TV wasn't working and she needed Al to go and fix it for her.

Me and Al then put Jean to bed who had had two party loads of cake and sugar and was very very tired! We then played chinese checkers - or attempted to work out from the rules how to play, I eat some chocolate fondue that had ment to be desert to the meal and went to bed.

the end

WordPress Themes

Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales
Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales