)]}'
{
  "commit": "6d691129594f87958ecaf4169b2e1f62f90d3616",
  "tree": "4c1fb7ec763de18938af31f1f261f47db8da3391",
  "parents": [
    "b0498dc6ff0510efe9467fbaed41945f3f056af4"
  ],
  "author": {
    "name": "Paul Jakma",
    "email": "paul.jakma@sun.com",
    "time": "Thu Jul 27 21:49:00 2006 +0000"
  },
  "committer": {
    "name": "Paul Jakma",
    "email": "paul.jakma@sun.com",
    "time": "Thu Jul 27 21:49:00 2006 +0000"
  },
  "message": "[zebra] Bug #268, Fix race between add/delete of routes, sanitise rib queueing\n\n2006-07-27 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* rib.h: (struct rib) Add a route_node rn_status flag field,\n\t  this has to be copied every time head RIB of a route_node\n\t  changes.\n\t  Remove the rib lock field, not needed - see below.\n\t  Add a status field for RIB-private flags.\n\t* zebra_rib.c: Add a global for the workqueue hold time, useful\n\t  for testing.\n\t  (general) Fix for bug #268. Problem originally\n\t  detailed by Simon Bryden in [quagga-dev 4001].\n\t  Essentially, add/delete of a RIB must happen /before/ the\n\t  queue. Best-path selection (ie rib_process) and reaping of\n\t  freed RIBs can then be done after queueing. Only the route_node\n\t  is queued - no important RIB state (i.e. whether a RIB is to be\n\t  deleted) is queued.\n\t  (struct zebra_queue_node_t) Disappears, no longer need to\n\t  track multiple things on the queue, only the route_node.\n\t  (rib_{lock,unlock}) removed, RIBs no longer need to be\n\t  refcounted, no longer queued.\n\t  (rib_queue_qnode_del) Removed, deleted RIBs no longer deleted\n\t  via the queue.\n\t  (rib_queue_add_qnode) deleted\n\t  (rib_queue_add) Only the route_node is queued for best-path\n\t  selection, we can check whether it is already queued or\n\t  not and avoid queueing same node twice - struct rib * argument\n\t  is not needed.\n\t  (rib_link/unlink) (un)link RIB from route_node.\n\t  (rib_{add,del}node) Front-end to updates of a RIB.\n\t  (rib_process) Reap any deleted RIBs via rib_unlink.\n\t  Unset the route_node \u0027QUEUED\u0027 flag.\n\t  (General) Remove calls to rib_queue_add where add/del node was\n\t  called - not needed, update calls where not.\n\t  Ignore RIB_ENTRY_REMOVEd ribs in loops through route_nodes\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "a9bb0d07b15137ffad7047e816bb699661d7c866",
      "old_mode": 33188,
      "old_path": "zebra/ChangeLog",
      "new_id": "fde3f513d6528f2d0c592c6997aa5c871de7d255",
      "new_mode": 33188,
      "new_path": "zebra/ChangeLog"
    },
    {
      "type": "modify",
      "old_id": "3827b6e78e2ae62453ad84d6bbb08569293d19bc",
      "old_mode": 33188,
      "old_path": "zebra/rib.h",
      "new_id": "04fbbecf9e0c68aa86b234f55ab05230f145960e",
      "new_mode": 33188,
      "new_path": "zebra/rib.h"
    },
    {
      "type": "modify",
      "old_id": "7373c6d8460949d5bfbe04f85494c54f1e58588b",
      "old_mode": 33188,
      "old_path": "zebra/zebra_rib.c",
      "new_id": "acad065a02c53a2b0963beefb614c2c0526e54d5",
      "new_mode": 33188,
      "new_path": "zebra/zebra_rib.c"
    }
  ]
}
