User loses all his memberships upon login

Hi,

I recently ran into a strange issue and hopefully someone will be able to give me some tips or directions to this problem. Here's the scenario:

1. "User X" belongs to the Drupal Role "Group Manager". User X is a regular member of "Group X".
2. When the User X visits the "My Groups" view page, he can see that he is indeed a member of Group X.
3. Site Admin edits the Drupal role "Group Manager" and toggles "Administer Organic groups permissions" to true
4. "User X" logs in the "My Groups" view does not list any of the groups he was a member of prior the update made by Site Admin

Here are my findings:

* This issue seems to be affecting only one user
* This issue happens only when the "Administer Organic groups permissions" is set to true
* This issue does drop all the records for this user from the og_membership table

Initially, I thought it was one of my custom modules causing this issue but I ran a xDebug stacktrace on DeleteQuery::execute() and discovered that the groupAudiencegetDiff() method for some reason thinks the affected memberships should be deleted. You can see the full stacktrace below. My question is, is this a bug? And why the method groupAudiencegetDiff() thinks the memberships of this particular user should be deleted?

groupAudiencegetDiff method

  /**
   * Get the difference in group audience for a saved field.
   *
   * @return
   *   Array with all the differences, or an empty array if none found.
   */
  public function groupAudiencegetDiff($entity_type, $entity, $field, $instance, $langcode, $items) {
    $return = FALSE;

    $field_name = $field['field_name'];
    $wrapper = entity_metadata_wrapper($entity_type, $entity);
    $og_memberships = $wrapper->{$field_name . '__og_membership'}->value();

    $new_memberships = array();
    foreach ($items as $item) {
      $new_memberships[$item['target_id']] = TRUE;
    }

    foreach ($og_memberships as $og_membership) {
      $gid = $og_membership->gid;
      if (empty($new_memberships[$gid])) {
        // Membership was deleted.
        if ($og_membership->entity_type == 'user') {
          // Make sure this is not the group manager, if exists.
          $group = entity_load_single($og_membership->group_type, $og_membership->gid);
          if (!empty($group->uid) && $group->uid == $og_membership->etid) {
            continue;
          }
        }

        $return['delete'][] = $og_membership->id;
        unset($new_memberships[$gid]);
      }
      else {
        // Existing membership.
        unset($new_memberships[$gid]);
      }
    }
    if ($new_memberships) {
      // New memberships.
      $return['insert'] = array_keys($new_memberships);
    }

    return $return;
  }

Stack Trace

Array
(
    [0] => Array
        (
            [function] => {main}
            [file] => /Users/user/Sites/mydrupal/index.php
            [line] => 0
            [params] => Array
                (
                )

        )

    [1] => Array
        (
            [function] => drupal_bootstrap
            [file] => /Users/user/Sites/mydrupal/index.php
            [line] => 20
            [params] => Array
                (
                    [phase] => 
                    [new_phase] => 
                )

        )

    [2] => Array
        (
            [function] => _drupal_bootstrap_full
            [file] => /Users/user/Sites/mydrupal/includes/bootstrap.inc
            [line] => 2267
            [params] => Array
                (
                )

        )

    [3] => Array
        (
            [function] => module_invoke_all
            [file] => /Users/user/Sites/mydrupal/includes/common.inc
            [line] => 5157
            [params] => Array
                (
                    [hook] => 
                )

        )

    [4] => Array
        (
            [function] => call_user_func_array:{/Users/user/Sites/mydrupal/includes/module.inc:895}
            [file] => /Users/user/Sites/mydrupal/includes/module.inc
            [line] => 895
            [params] => Array
                (
                    [0] => 
                    [1] => 
                )

        )

    [5] => Array
        (
            [function] => invite_notifications_init
            [file] => /Users/user/Sites/mydrupal/includes/module.inc
            [line] => 895
            [params] => Array
                (
                )

        )

    [6] => Array
        (
            [function] => user_save
            [file] => /Users/user/Sites/mydrupal/sites/all/modules/invite/modules/invite_notifications/invite_notifications.module
            [line] => 25
            [params] => Array
                (
                    [account] => 
                    [edit] => 
                    [category] => 
                )

        )

    [7] => Array
        (
            [function] => field_attach_update
            [file] => /Users/user/Sites/mydrupal/modules/user/user.module
            [line] => 549
            [params] => Array
                (
                    [entity_type] => 
                    [entity] => 
                )

        )

    [8] => Array
        (
            [function] => _field_invoke
            [file] => /Users/user/Sites/mydrupal/modules/field/field.attach.inc
            [line] => 991
            [params] => Array
                (
                    [op] => 
                    [entity_type] => 
                    [entity] => 
                    [a] => 
                    [b] => 
                    [options] => 
                )

        )

    [9] => Array
        (
            [function] => entityreference_field_update
            [file] => /Users/user/Sites/mydrupal/modules/field/field.attach.inc
            [line] => 209
            [params] => Array
                (
                    [entity_type] => 
                    [entity] => 
                    [field] => 
                    [instance] => 
                    [langcode] => 
                    [items] => 
                    [6] => 
                    [7] => 
                )

        )

    [10] => Array
        (
            [function] => update
            [type] => dynamic
            [class] => OgBehaviorHandler
            [file] => /Users/user/Sites/mydrupal/sites/all/modules/entityreference/entityreference.module
            [line] => 285
            [params] => Array
                (
                    [entity_type] => 
                    [entity] => 
                    [field] => 
                    [instance] => 
                    [langcode] => 
                    [items] => 
                )

        )

    [11] => Array
        (
            [function] => OgMembershipCrud
            [type] => dynamic
            [class] => OgBehaviorHandler
            [file] => /Users/user/Sites/mydrupal/sites/all/modules/og/plugins/entityreference/behavior/OgBehaviorHandler.class.php
            [line] => 62
            [params] => Array
                (
                    [entity_type] => 
                    [entity] => 
                    [field] => 
                    [instance] => 
                    [langcode] => 
                    [items] => 
                )

        )

    [12] => Array
        (
            [function] => og_membership_delete_multiple
            [file] => /Users/user/Sites/mydrupal/sites/all/modules/og/plugins/entityreference/behavior/OgBehaviorHandler.class.php
            [line] => 113
            [params] => Array
                (
                    [ids] => 
                )

        )

    [13] => Array
        (
            [function] => entity_delete_multiple
            [file] => /Users/user/Sites/mydrupal/sites/all/modules/og/og.module
            [line] => 1602
            [params] => Array
                (
                    [entity_type] => 
                    [ids] => 
                )

        )

    [14] => Array
        (
            [function] => delete
            [type] => dynamic
            [class] => EntityAPIController
            [file] => /Users/user/Sites/mydrupal/sites/all/modules/entity/entity.module
            [line] => 334
            [params] => Array
                (
                    [ids] => 
                    [transaction] => 
                )

        )

    [15] => Array
        (
            [function] => execute
            [type] => dynamic
            [class] => DeleteQuery
            [file] => /Users/user/Sites/mydrupal/sites/all/modules/entity/includes/entity.controller.inc
            [line] => 383
            [params] => Array
                (
                )

        )

)