// For debugging purpose, prints the RA result. func (r *Result) Report() { var content string for name, t := range r.Tables { content += "Table: " + name + "\t" + fmt.Sprint(t.RowNumbers) + "\n" } for alias, c := range r.Aliases { content += "Alias " + alias + "\tis " + c.TableName + "." + c.ColumnName + "\n" } logg.Debug("ra", "Report", content) }
// Returns existing shared and exclusive locks of a table. func LocksOf(t *table.Table) (*Locks, int) { // Read files in .shared directory. sharedLocksPath := t.Path + t.Name + ".shared" sharedLocksDir, err := os.Open(sharedLocksPath) if err != nil { return nil, st.CannotReadSharedLocksDir } defer sharedLocksDir.Close() fi, err := sharedLocksDir.Readdir(0) if err != nil { logg.Err("transaction", "LocksOf", err) return nil, st.CannotReadSharedLocksDir } locks := new(Locks) locks.Shared = make([]int64, 0) for _, fileInfo := range fi { // File name represents a transaction ID (also a timestamp). theID, err := strconv.ParseInt(fileInfo.Name(), 10, 64) // tt := time.Now().Nanosecond() + constant.LockTimeout if err != nil || theID > int64(time.Now().Nanosecond()+constant.LockTimeout) { // Remove expired shared lock. err = os.Remove(sharedLocksPath + "/" + fileInfo.Name()) logg.Warn("transaction", "LocksOf", "Expired shared lock ID "+ fileInfo.Name()+" file "+sharedLocksPath+"/"+fileInfo.Name()+" is removed") if err != nil { logg.Err("transaction", "LocksOf", err) return nil, st.CannotUnlockSharedLock } } else { locks.Shared = append(locks.Shared[:], theID) } } // Read the content of exclusive lock. exclusiveLockPath := t.Path + t.Name + ".exclusive" exclusiveFile, err := os.Open(exclusiveLockPath) if err != nil { return locks, st.OK } fi2, err := exclusiveFile.Stat() if err != nil { logg.Err("transaction", "LocksOf", err) return nil, st.CannotReadExclusiveLocksFile } // The file content is a transaction ID buffer := make([]byte, fi2.Size()) _, err = exclusiveFile.Read(buffer) if err != nil { logg.Err("transaction", "LocksOf", err) return nil, st.CannotReadExclusiveLocksFile } theID, err := strconv.ParseInt(string(buffer), 10, 64) if err != nil || theID > int64(time.Now().Nanosecond()+constant.LockTimeout) { // Remove expired exclusive lock. err = os.Remove(exclusiveLockPath) logg.Debug("transaction", "LocksOf", err) logg.Warn("transaction", "LocksOf", "Expired exclusive lock ID "+ string(buffer)+" file "+exclusiveLockPath+" is removed") if err != nil { logg.Err("transaction", "LocksOf", err) return nil, st.CannotUnlockExclusiveLock } } else { locks.Exclusive = theID } return locks, st.OK }