What the heck?

S. Dale Morrey sdalemorrey at gmail.com
Thu Dec 12 12:30:49 MST 2013


So this probably belongs on StackOverflow, but I figured there was a chance
someone on the list might be able to help me figure out what I'm missing
here.

I have an app I refactored to take advantage of asynchronous called in
node.js.
Now my log is full of this...

Setting up 267176 of 267180 block hash requests.
Setting up 267177 of 267180 block hash requests.
Setting up 267178 of 267180 block hash requests.
Setting up 267179 of 267180 block hash requests.

The function spewing this out is an iterator that is calling setTimeout to
run these requests with about 500ms of delay (so as not to swamp the server
I'm getting the request from.  Once it has the result of the block hash it
should be feeding it to a message queue, but it's not.

I would expect that at sometime during this process the timer would fire
and I should see debug spew from the function being called by the timer.
 Fact is that I'm not.

Here is the function itself...
function blockCountCallBack(err, blockcount){

    console.log("BlockCount: ", blockcount);
    for(var i = lastblock; i < blockcount; i++){
        //Multiplex across multiple clients so we don't overwhelm a single
server
        blockDB.put("lastblock",i);
        var clientnum = 0;
        if(i >= clients.length){
          clientnum = i%clients.length;
        }
        console.log("Setting up "+i+" of "+blockcount+" block hash
requests.");
        setTimeout(function(){
                clients[clientnum].getBlockHash(i,addBlockToMessage);
        },500);
    }
}


And here is the addBlockToMessage function that should be getting called,
but never does.
//Adds blockhashes to the blocks array
//When the array reaches it's max size (currently 7KB), it creates an SQS
message and sends it off.
//It then clears the blocks[] so the whole process can start over again
function addBlockToMessage(err, blockhash){

    //This error handling isn't likely to work, we need somehow verify that
we are going to preserve the number itself.
    //This is WAY too fragile!!!
    if(err){
        console.log(err);
        if(err.code ==="ECONNREFUSED"){
            console.log("link appears to be down.  Sleeping for 5 minutes");
            var blockid = blockhash;
            setTimeout(function(){
                fetchBlockID(blockid);
                },FIVEMINUTES);
            return;
        }
    }

    //We should batch these into a couple hundred, just check the byte
length and not exceed 7k
    blocks.push(blockhash);

    var msgContent = JSON.stringify(blocks);
    var msgLength = msgContent.length;
    if(msgLength >= 7000){
        console.log("Sending: ",msgContent);
        //We've reached the size limit
        //Now we setup and send the SQS message
        AWS.Request.send(sqs.SendMessage(qURL, msgContent));
        //Finally clear blocks
        blocks = [];
    }

}

As you can see there should be plenty of debug log output, but all this
thing is doing is iterating.
Any thoughts?


More information about the PLUG mailing list