private LogicalVolumeStatus GetVolumeStatus(VolumeRecord volume)
        {
            int   numFailed           = 0;
            ulong numOK               = 0;
            LogicalVolumeStatus worst = LogicalVolumeStatus.Healthy;

            foreach (var cmpnt in _database.GetVolumeComponents(volume.Id))
            {
                LogicalVolumeStatus cmpntStatus = GetComponentStatus(cmpnt);
                worst = WorstOf(worst, cmpntStatus);
                if (cmpntStatus == LogicalVolumeStatus.Failed)
                {
                    numFailed++;
                }
                else
                {
                    numOK++;
                }
            }

            if (numOK < 1)
            {
                return(LogicalVolumeStatus.Failed);
            }
            else if (numOK == volume.ComponentCount)
            {
                return(worst);
            }
            else
            {
                return(LogicalVolumeStatus.FailedRedundancy);
            }
        }
        private LogicalVolumeStatus GetVolumeStatus(VolumeRecord volume)
        {
            int numFailed = 0;
            ulong numOK = 0;
            LogicalVolumeStatus worst = LogicalVolumeStatus.Healthy;
            foreach (var cmpnt in _database.GetVolumeComponents(volume.Id))
            {
                LogicalVolumeStatus cmpntStatus = GetComponentStatus(cmpnt);
                worst = WorstOf(worst, cmpntStatus);
                if (cmpntStatus == LogicalVolumeStatus.Failed)
                {
                    numFailed++;
                }
                else
                {
                    numOK++;
                }
            }

            if (numOK < 1)
            {
                return LogicalVolumeStatus.Failed;
            }
            else if (numOK == volume.ComponentCount)
            {
                return worst;
            }
            else
            {
                return LogicalVolumeStatus.FailedRedundancy;
            }
        }
        private SparseStream OpenVolume(VolumeRecord volume)
        {
            List <SparseStream> cmpntStreams = new List <SparseStream>();

            foreach (var component in _database.GetVolumeComponents(volume.Id))
            {
                if (GetComponentStatus(component) == LogicalVolumeStatus.Healthy)
                {
                    cmpntStreams.Add(OpenComponent(component));
                }
            }

            if (cmpntStreams.Count < 1)
            {
                throw new IOException("Volume with no associated or healthy components");
            }
            else if (cmpntStreams.Count == 1)
            {
                return(cmpntStreams[0]);
            }
            else
            {
                return(new MirrorStream(Ownership.Dispose, cmpntStreams.ToArray()));
            }
        }
Exemple #4
0
        public static DatabaseRecord ReadFrom(byte[] buffer, int offset)
        {
            DatabaseRecord result = null;

            if (Utilities.ToInt32BigEndian(buffer, offset + 0xC) != 0)
            {
                switch ((RecordType)(buffer[offset + 0x13] & 0xF))
                {
                    case RecordType.Volume:
                        result = new VolumeRecord();
                        break;

                    case RecordType.Component:
                        result = new ComponentRecord();
                        break;

                    case RecordType.Extent:
                        result = new ExtentRecord();
                        break;

                    case RecordType.Disk:
                        result = new DiskRecord();
                        break;

                    case RecordType.DiskGroup:
                        result = new DiskGroupRecord();
                        break;

                    default:
                        throw new NotImplementedException("Unrecognized record type: " + buffer[offset + 0x13]);
                }

                result.DoReadFrom(buffer, offset);
            }

            return result;
        }
        public static DatabaseRecord ReadFrom(byte[] buffer, int offset)
        {
            DatabaseRecord result = null;

            if (Utilities.ToInt32BigEndian(buffer, offset + 0xC) != 0)
            {
                switch ((RecordType)(buffer[offset + 0x13] & 0xF))
                {
                case RecordType.Volume:
                    result = new VolumeRecord();
                    break;

                case RecordType.Component:
                    result = new ComponentRecord();
                    break;

                case RecordType.Extent:
                    result = new ExtentRecord();
                    break;

                case RecordType.Disk:
                    result = new DiskRecord();
                    break;

                case RecordType.DiskGroup:
                    result = new DiskGroupRecord();
                    break;

                default:
                    throw new NotImplementedException("Unrecognized record type: " + buffer[offset + 0x13]);
                }

                result.DoReadFrom(buffer, offset);
            }

            return(result);
        }
        private SparseStream OpenVolume(VolumeRecord volume)
        {
            List<SparseStream> cmpntStreams = new List<SparseStream>();
            foreach (var component in _database.GetVolumeComponents(volume.Id))
            {
                cmpntStreams.Add(OpenComponent(component));
            }

            if (cmpntStreams.Count < 1)
            {
                throw new IOException("Volume with no associated components");
            }
            else if (cmpntStreams.Count == 1)
            {
                return cmpntStreams[0];
            }
            else
            {
                return new MirrorStream(Ownership.Dispose, cmpntStreams.ToArray());
            }
        }