It seems that jqGrid event loadError is not triggered when GET returns error:
414 Request-URI Too Long
It can be reproduced by appending post data with data greater than 2048 bytes. 
Maybe someone knows how to use POST instead of GET request in jqGrid?
$grid.jqGrid({
    url:'/greenarrow_campaign_statistics/get_all_for_grid',
    datatype: "json",
    mtype: "POST",
    colNames:['Campaign Name', 'Last Date', '# of mailings', 'Recipients', 'Hard bounces', '%', 'Opens', '%', 'Clicks', '%', 'Upgrades', '%', 'FBL Compl.', '%'],
    colModel :[
        {name:'campaign_name', index:'campaign_name', width:220, sorttype:'text',align:'left',fixed:true},
        {name:'finishtime_str', index:'finishtime_sec', width:140, sorttype:'number',align:'center',fixed:true},
        {name:'count', index:'mailings_cnt', width:70, sorttype:'number',align:'right',fixed:true,hidden:true},
        {name:'recips_total', index:'recips_total', width:75, sorttype:'number',align:'right',fixed:true},
        {name:'num_bounces_hard', index:'num_bounces_hard', width:60, sorttype:'number',align:'right',fixed:true},
        {name:'num_bounces_hard_perc', index:'num_bounces_hard_perc', width:40, sorttype:'number',align:'right',fixed:true, formatter: percFormatter},
        {name:'num_opens', index:'num_opens', width:75, sorttype:'number',align:'right',fixed:true},
        {name:'num_opens_perc', index:'num_opens_perc', width:40, sorttype:'number',align:'right',fixed:true, formatter: percFormatter},
        {name:'num_clicks', index:'num_clicks', width:70, sorttype:'number',align:'right',fixed:true},
        {name:'num_clicks_perc', index:'num_clicks_perc', width:40, sorttype:'number',align:'right',fixed:true, formatter: percFormatter},
        {name:'num_upgrade', index:'num_upgrade', width:60, sorttype:'number',align:'right',fixed:true},
        {name:'num_upgrade_perc', index:'num_upgrade_perc', width:40, sorttype:'number',align:'right',fixed:true, formatter: percFormatter},
        {name:'num_fbl', index:'num_fbl', width:60, sorttype:'number',align:'right',fixed:true},
        {name:'num_fbl_perc', index:'num_fbl_perc', width:40, sorttype:'number',align:'right',fixed:true, formatter: percFormatter}
    ],
    rowList:[20, 30, 50, 100, 500],
    pager: '#pager',
    rowNum:20,
    shrinkToFit: true,
    sortname: 'finishtime_sec',
    viewrecords: true,
    sortorder: "desc",
    toolbar: [true, 'top'],
    multiselect: true,
    multiboxonly: true,
    footerrow: true,
    userDataOnFooter: true,
    height: "auto",
    caption:"",
    beforeRequest: function()
    {
        $grid.jqGrid(
            'appendPostData',
            {
                period: $period.val(),
                from: $('#start_date').val(),
                to: $('#end_date').val(),
                campaigns: $('input[name="campaign_names"]').val(),
                search_text: $('#search_text').val()
            });
    },
    ondblClickRow: function(id)
    {
        $('#btn_edit').trigger('click');
    },
    loadComplete: function(data) {
        $("tr.jqgrow:odd").css("background", "#DDDDDC");
    },
    loadError: function(xhr, status, error) {
        jQuery("#rsperror").html("Type: " + status + "; Response: " + xhr.status + " " + xhr.statusText);
    }
})
 
     
    