001: /*
002:
003: Derby - Derby - Class org.apache.derbyTesting.functionTests.util.corruptio.CorruptibleIo
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to You under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derbyTesting.functionTests.util.corruptio;
023:
024: import java.io.File;
025:
026: /*
027: * This is a helper class to instrument the CorruptDiskStorageFactory
028: * to modify the i/o opertions before the request are sent to
029: * a real storage factory.
030: *
031: * Tests can specify what type of corruption is required like log/data files
032: * and the at what and offset and the length of the corruption to be
033: * done in the write requests.
034: *
035: * Only one instance of this class will exist in the system, Tests should hold
036: * onto the instance of this class until they are done sending the i/o
037: * requests by executing statement that will actuall will trigger i/o ,
038: * for example a commit will flush the log buffers. Otherwise class garbage
039: * collector can reinitialize the values.
040: *
041: * @author <a href="mailto:suresh.thalamati@gmail.com">Suresh Thalamati</a>
042: * @version 1.0
043: * @see WritableStorageFactory
044: * @see StorageFactory
045: */
046:
047: public class CorruptibleIo {
048:
049: private static CorruptibleIo instance = new CorruptibleIo();
050: private boolean corruptLog = false; //corrupt the log i/o to log*.dat files
051: private boolean corruptData = false; //corrupt the files under seg0(data)
052: private int corruptLength; // no of bytes to corrupt
053: private int corruptOffset; // offset inside the write request
054:
055: private CorruptibleIo() {
056: }
057:
058: public static CorruptibleIo getInstance() {
059: return instance;
060: }
061:
062: public void setLogCorruption(boolean corrupt) {
063: corruptLog = corrupt;
064: }
065:
066: public void setDataCorruption(boolean corrupt) {
067: corruptData = corrupt;
068: }
069:
070: public void setOffset(int off) {
071: corruptOffset = off;
072: }
073:
074: public void setLength(int len) {
075: corruptLength = len;
076: }
077:
078: public int getOffset() {
079: return corruptOffset;
080: }
081:
082: public int getLength() {
083: return corruptLength;
084: }
085:
086: public boolean isCorruptibleFile(File file) {
087: String name = file.getName();
088: String parentName = file.getParent();
089: if (parentName.endsWith("log") && name.endsWith("dat")) {
090: return corruptLog;
091: } else if (parentName.endsWith("seg0")) {
092: return corruptData;
093: }
094:
095: return false;
096: }
097:
098: /**
099: * corrupt the byte array at the specified bytes, currenly this
100: * metods just complemetns the bits at the specified offsets.
101: */
102: public byte[] corrupt(byte b[], int off, int len) {
103: if (corruptOffset >= off
104: && (corruptOffset + corruptLength) < (off + len)) {
105: for (int i = corruptOffset; i < corruptOffset
106: + corruptLength; i++) {
107: //System.out.println(b[i]);
108: b[i] = (byte) ~b[i];
109: //System.out.println(b[i]);
110: }
111: // System.out.println("Corrupted the write request : Off = " + off + " Length = " + len);
112: } else {
113: System.out.println("Not valid corrupt request :"
114: + "Write Request" + "Off=" + off + "size = " + len
115: + "Corrupt Request" + "Off=" + corruptOffset
116: + "size = " + corruptLength);
117: }
118: return b;
119: }
120:
121: }
|