public object Clone() { BucketsPack pack = new BucketsPack(new ArrayList(_bucketIds), _owner); return(pack); }
/// <summary> /// Updates the state transfer task in synchronus way. It adds/remove buckets /// to be transferred by the state transfer task. /// </summary> /// <param name="myBuckets"></param> public override bool UpdateStateTransfer(ArrayList myBuckets, int updateId) { if (_databasesManager != null && _databasesManager.HasDisposed(taskIdentity.DBName, taskIdentity.ColName) /* _parent.HasDisposed*/) { return(false); } StringBuilder sb = new StringBuilder(); lock (_updateIdMutex) { if (updateId != updateCount) { if (LoggerManager.Instance.StateXferLogger != null && LoggerManager.Instance.StateXferLogger.IsInfoEnabled) { LoggerManager.Instance.StateXferLogger.Info(loggingModule + "UpdateStateTxfr", " Do not need to update the task as update id does not match; provided id :" + updateId + " currentId :" + updateCount); } return(false); } } lock (_stateTxfrMutex) { try { if (myBuckets != null) { if (LoggerManager.Instance.StateXferLogger != null && LoggerManager.Instance.StateXferLogger.IsInfoEnabled) { LoggerManager.Instance.StateXferLogger.Info(loggingModule + ".UpdateStateTxfr", " my buckets " + myBuckets.Count); } //we work on the copy of the map. ArrayList buckets = myBuckets.Clone() as ArrayList; ArrayList leavingShards = new ArrayList(); //if (_sparsedBuckets != null && _sparsedBuckets.Count > 0) //{ // //ArrayList tmp = _sparsedBuckets.Clone() as ArrayList; // IEnumerator e = _sparsedBuckets.GetEnumerator(); // lock (_sparsedBuckets.SyncRoot) // { // while (e.MoveNext()) // { // BucketsPack bPack = (BucketsPack)e.Current; // ArrayList bucketIds = bPack.BucketIds.Clone() as ArrayList; // foreach (int bucketId in bucketIds) // { // HashMapBucket current = new HashMapBucket(null, bucketId); // if (!buckets.Contains(current)) // { // ((BucketsPack)e.Current).BucketIds.Remove(bucketId); // } // else // { // HashMapBucket bucket = buckets[buckets.IndexOf(current)] as HashMapBucket; // if (!bPack.Owner.Equals(new NodeIdentity(bucket.CurrentShard, GetShardPrimary(bucket.CurrentShard)))) // { // //either i have become owner of the bucket or // //some one else for e.g a replica node // if (logger != null && logger.IsInfoEnabled) // logger.Info(loggingModule + ".UpdateStateTxfer", bucket.BucketId + "bucket owner changed old :" + bPack.Owner + " new :" + bucket.CurrentShard); // bPack.BucketIds.Remove(bucketId); // } // } // } // if (bPack.BucketIds.Count == 0) // { // //This owner has left. // leavingShards.Add(bPack.Owner); // } // } // foreach (NodeIdentity leavingShard in leavingShards) // { // BucketsPack bPack = new BucketsPack(null, leavingShard); // _sparsedBuckets.Remove(bPack); // } // leavingShards.Clear(); // } //} if (_filledBuckets != null && _filledBuckets.Count > 0) { //ArrayList tmp = _filledBuckets.Clone() as ArrayList; IEnumerator e = _filledBuckets.GetEnumerator(); lock (_filledBuckets.SyncRoot) { while (e.MoveNext()) { BucketsPack bPack = (BucketsPack)e.Current; ArrayList bucketIds = bPack.BucketIds.Clone() as ArrayList; foreach (int bucketId in bucketIds) { HashMapBucket current = new HashMapBucket(null, bucketId); if (!buckets.Contains(current)) { ((BucketsPack)e.Current).BucketIds.Remove(bucketId); } else { HashMapBucket bucket = buckets[buckets.IndexOf(current)] as HashMapBucket; if (!bPack.Owner.Equals(new NodeIdentity(bucket.CurrentShard /*, GetShardPrimary(bucket.CurrentShard)*/))) { //either i have become owner of the bucket or //some one else for e.g a replica node bPack.BucketIds.Remove(bucketId); } } } if (bPack.BucketIds.Count == 0) { //This owner has left. leavingShards.Add(bPack.Owner); } } foreach (NodeIdentity leavingShard in leavingShards) { BucketsPack bPack = new BucketsPack(null, leavingShard); _filledBuckets.Remove(bPack); } leavingShards.Clear(); } } //Now we add those buckets which we have to be state transferred //and are not currently in our list IEnumerator ie = buckets.GetEnumerator(); ArrayList loggableBuckets = new ArrayList(); while (ie.MoveNext()) { HashMapBucket bucket = ie.Current as HashMapBucket; if (Context.LocalShardName.Equals(bucket.FinalShard, StringComparison.OrdinalIgnoreCase) && Context.LocalShardName.Equals(bucket.CurrentShard, StringComparison.OrdinalIgnoreCase)) { BucketsPack bPack = new BucketsPack(null, new NodeIdentity(bucket.CurrentShard /*, GetShardPrimary(bucket.CurrentShard)*/)); //if (IsSparsedBucket(bucket.BucketId, bPack.Owner)) //{ // int index = _sparsedBuckets.IndexOf(bPack); // if (index != -1) // { // bPack = _sparsedBuckets[index] as BucketsPack; // } // else // _sparsedBuckets.Add(bPack); // if (!bPack.BucketIds.Contains(bucket.BucketId)) // { // bPack.BucketIds.Add(bucket.BucketId); // } //} //else { int index = _filledBuckets.IndexOf(bPack); if (index != -1) { bPack = _filledBuckets[index] as BucketsPack; } else { _filledBuckets.Add(bPack); } if (!bPack.BucketIds.Contains(bucket.BucketId)) { bPack.BucketIds.Add(bucket.BucketId); loggableBuckets.Add(bucket.BucketId); } } } } _startedFrom = StartLoggingOnReplica(loggableBuckets); } } catch (NullReferenceException ex) { if (LoggerManager.Instance.StateXferLogger != null && LoggerManager.Instance.StateXferLogger.IsErrorEnabled) { LoggerManager.Instance.StateXferLogger.Error(loggingModule + ".UpdateStateTxfr", ex.ToString()); } } catch (Exception e) { if (LoggerManager.Instance.StateXferLogger != null && LoggerManager.Instance.StateXferLogger.IsErrorEnabled) { LoggerManager.Instance.StateXferLogger.Error(loggingModule + ".UpdateStateTxfr", e.ToString()); } } finally { if (LoggerManager.Instance.StateXferLogger != null && LoggerManager.Instance.StateXferLogger.IsInfoEnabled) { LoggerManager.Instance.StateXferLogger.Info(loggingModule + ".UpdateStateTxfr", " Pulsing waiting thread"); } System.Threading.Monitor.PulseAll(_stateTxfrMutex); } } return(true); }