public ThreadTest(RemoteServer server, bool alsoPurgeLocal) { _server = server; //setup the test by adding 100 shared assets Console.WriteLine("Putting 100 random assets to server"); Console.WriteLine(DateTime.Now); SHA1 sha = new SHA1CryptoServiceProvider(); for (int i = 0; i < 100; i++) { string uuidstr = OpenMetaverse.UUID.Random().ToString(); byte[] randomBytes = TestUtil.RandomBytes(); byte[] challengeHash = sha.ComputeHash(randomBytes); _assetUuids.Add(uuidstr); _existingAssets.Add(uuidstr, challengeHash); Asset asset = new Asset(uuidstr, 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); _server.PutAsset(asset); } if (alsoPurgeLocal) { _server.MaintPurgeLocals(); } Console.WriteLine("Done: " + DateTime.Now); }
public CrossServerBiasTest3(RemoteServer server1, RemoteServer[] server2, RemoteServer server3) { _server1 = server1; _server2 = server2; _server3 = server3; //setup the test by adding 200 shared assets Console.WriteLine("Putting 200 random assets to server1"); Console.WriteLine(DateTime.Now); SHA1 sha = new SHA1CryptoServiceProvider(); for (int i = 0; i < 200; i++) { string uuidstr = OpenMetaverse.UUID.Random().ToString(); byte[] randomBytes = TestUtil.RandomBytes(); byte[] challengeHash = sha.ComputeHash(randomBytes); _assetUuids.Add(uuidstr); _existingAssets.Add(uuidstr, challengeHash); Asset asset = new Asset(uuidstr, 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); _server1.PutAsset(asset); } Console.WriteLine("Done: " + DateTime.Now); Console.WriteLine("Putting 10 random assets to server2"); Console.WriteLine(DateTime.Now); for (int i = 0; i < 10; i++) { string uuidstr = OpenMetaverse.UUID.Random().ToString(); byte[] randomBytes = TestUtil.RandomBytes(1000, 50000); byte[] challengeHash = sha.ComputeHash(randomBytes); _assetUuids.Add(uuidstr); _existingAssets.Add(uuidstr, challengeHash); Asset asset = new Asset(uuidstr, 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); _server2[0].PutAsset(asset); _server3.PutAsset(asset); } Console.WriteLine("Done: " + DateTime.Now); }
public void SingleWrite() { string uuidstr = OpenMetaverse.UUID.Random().ToString(); byte[] randomBytes = TestUtil.RandomBytes(); Asset asset = new Asset(uuidstr, 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); RandomServer().PutAsset(asset); }
public void Run() { int i = 0; int count = 0; MySqlCommand countCmd = new MySqlCommand( "SELECT COUNT(*) as CNT " + "FROM assets " + "WHERE create_time >= ?createTime ", _conn); countCmd.Parameters.AddWithValue("?createTime", _startAt); countCmd.CommandType = CommandType.Text; count = Convert.ToInt32(countCmd.ExecuteScalar()); countCmd.Dispose(); MySqlCommand cmd = new MySqlCommand( "SELECT id, name, description, assetType, local, temporary, data, create_time " + "FROM assets " + "WHERE create_time >= ?createTime " + "ORDER BY create_time", _conn); cmd.Parameters.AddWithValue("?createTime", _startAt); try { using (MySqlDataReader dbReader = cmd.ExecuteReader()) { while (dbReader.Read() && ! _stop) { bool local; bool temp; try { local = (bool)dbReader["local"]; } catch (InvalidCastException) { local = false; } try { temp = (bool)dbReader["temporary"]; } catch (InvalidCastException) { temp = false; } string uuid = (string)dbReader["id"]; sbyte assetType = (sbyte) dbReader["assetType"]; int createTime = (int)dbReader["create_time"]; string name = (string)dbReader["name"]; string desc = (string)dbReader["description"]; byte[] data = (byte[])dbReader["data"]; Asset whipAsset = new Asset( uuid, (byte)assetType, local, temp, createTime, name, desc, data); try { _server.PutAsset(whipAsset); } catch (Exception e) { Console.WriteLine("Error putting asset: " + e.Message); } Console.WriteLine("Writing " + (string)dbReader["id"]); Console.WriteLine(++i + " of " + count); _startAt = (int)dbReader["create_time"]; } dbReader.Close(); cmd.Dispose(); } } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine("Last time written: " + _startAt); } Console.WriteLine("Last time written: " + _startAt); }
public void SingleWrite() { string uuidstr = OpenMetaverse.UUID.Random().ToString(); byte[] randomBytes = TestUtil.RandomBytes(); Asset asset = new Asset(uuidstr, 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); RandomServer().PutAsset(asset); lock (_existingAssets) { SHA1 sha = new SHA1CryptoServiceProvider(); byte[] challengeHash = sha.ComputeHash(randomBytes); _assetUuids.Add(uuidstr); _existingAssets.Add(uuidstr, challengeHash); } }
static void ExecCmd(RemoteServer server, string cmd) { if (cmd == "iwim_heartbeat") { Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sendSocket.Bind(new IPEndPoint(IPAddress.Any, 32702)); Console.WriteLine("Sending heartbeat to server"); IPAddress sendTo = Dns.GetHostAddresses(server.HostName)[0]; IPEndPoint sendEndPoint = new IPEndPoint(sendTo, 32701); byte[] buffer = new byte[5]; buffer[0] = 2; buffer[1] = 0xFF; buffer[2] = 0xFF; buffer[3] = 0xFF; buffer[4] = 0xFF; sendSocket.SendTo(buffer, 5, SocketFlags.None, sendEndPoint); sendSocket.Close(); } if (cmd == "iwim_query_random" || cmd == "iwim_query_random_loop") { Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); int loops; if (cmd == "iwim_query_random") { loops = 1; } else { loops = 1000; } Console.WriteLine("Searching for {0} random assets starting {1}", loops, DateTime.Now); IPAddress sendTo = Dns.GetHostAddresses(server.HostName)[0]; IPEndPoint sendEndPoint = new IPEndPoint(sendTo, 32701); byte[] buffer = new byte[33]; buffer[0] = 0; for (int i = 0; i < loops; i++) { Guid guid = Guid.NewGuid(); string fguid = guid.ToString().Replace("-", ""); Array.Copy(Util.UuidToAscii(fguid), 0, buffer, 1, 32); sendSocket.SendTo(buffer, 33, SocketFlags.None, sendEndPoint); EndPoint recvEndpoint = new IPEndPoint(IPAddress.Any, sendEndPoint.Port); byte[] response = new byte[34]; sendSocket.ReceiveFrom(response, ref recvEndpoint); } Console.WriteLine("Done {0}", DateTime.Now); } if (cmd.Length > 10 && cmd.Substring(0, 10) == "iwim_query") { string uuid = cmd.Substring(11); Console.WriteLine("Asking for named asset " + uuid); server.GetAsset(uuid); } if (cmd == "getrandom") { Guid guid = Guid.NewGuid(); Console.WriteLine("Asking for random asset " + guid.ToString()); server.GetAsset(guid.ToString()); } if (cmd.Length > 11 && cmd.Substring(0, 11) == "randomforce") { string begUUID = cmd.Substring(12); Guid guid = Guid.NewGuid(); string newGuid = guid.ToString(); newGuid = begUUID + newGuid.Substring(3); Console.WriteLine("Asking for semirandom asset " + newGuid); server.GetAsset(newGuid); } if (cmd.Length > 10 && cmd.Substring(0, 10) == "srandomput") { string begUUID = cmd.Substring(11); Guid guid = Guid.NewGuid(); string newGuid = guid.ToString(); newGuid = begUUID + newGuid.Substring(3); Console.WriteLine("Putting semirandom asset " + newGuid); Asset asset = new Asset(newGuid, 1, false, false, 0, "Random Asset", "Radom Asset Desc", TestUtil.RandomBytes()); server.PutAsset(asset); } if (cmd.Length > 6 && cmd.Substring(0, 6) == "getone") { string uuid = cmd.Substring(7); Console.WriteLine("Asking for named asset " + uuid); Asset asset = server.GetAsset(uuid); using (System.IO.FileStream outstream = System.IO.File.OpenWrite("asset.txt")) { outstream.Write(asset.Data, 0, asset.Data.Length); outstream.Close(); } } if (cmd == "put") { Console.WriteLine("Putting 1000 random assets to server"); Console.WriteLine(DateTime.Now); for (int i = 0; i < 1000; i++) { Asset asset = new Asset(OpenMetaverse.UUID.Random().ToString(), 1, false, false, 0, "Random Asset", "Radom Asset Desc", TestUtil.RandomBytes()); server.PutAsset(asset); } Console.WriteLine("Done: " + DateTime.Now); } if (cmd == "putone") { string uuid = OpenMetaverse.UUID.Random().ToString(); _lastRandom = uuid; Console.WriteLine("Putting 1 random asset to server"); Console.WriteLine(uuid); Console.WriteLine(DateTime.Now); Asset asset = new Asset(uuid, 1, false, false, 0, "Random Asset", "Radom Asset Desc", TestUtil.RandomBytes()); server.PutAsset(asset); Console.WriteLine("Done: " + DateTime.Now); } if (cmd == "repeatput") { Console.WriteLine("Reputting random asset to server"); Console.WriteLine(_lastRandom); Console.WriteLine(DateTime.Now); Asset asset = new Asset(_lastRandom, 1, false, false, 0, "Random Asset", "Radom Asset Desc", TestUtil.RandomBytes()); server.PutAsset(asset); Console.WriteLine("Done: " + DateTime.Now); } if (cmd == "verify") { Dictionary<string, byte[]> uuids = new Dictionary<string, byte[]>(); Console.WriteLine("Putting 1000 random 100K assets to server"); Console.WriteLine(DateTime.Now); SHA1 sha = new SHA1CryptoServiceProvider(); for (int i = 0; i < 1000; i++) { string uuidstr = OpenMetaverse.UUID.Random().ToString(); byte[] randomBytes = TestUtil.RandomBytes(); byte[] challengeHash = sha.ComputeHash(randomBytes); uuids.Add(uuidstr, challengeHash); Asset asset = new Asset(uuidstr, 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); server.PutAsset(asset); } Console.WriteLine("Done: " + DateTime.Now); Console.WriteLine("Rereading written assets"); Console.WriteLine(DateTime.Now); foreach (KeyValuePair<string, byte[]> kvp in uuids) { Asset a = server.GetAsset(kvp.Key); byte[] hash = sha.ComputeHash(a.Data); if (!TestUtil.Test.test(hash, kvp.Value)) { Console.WriteLine("Mismatched hash on " + kvp.Key); Console.WriteLine("Got " + Util.HashToHex(hash) + " expected " + Util.HashToHex(kvp.Value)); ASCIIEncoding encoding = new ASCIIEncoding(); Console.WriteLine("Data " + encoding.GetString(a.Data)); } } Console.WriteLine("finished verifing assets"); Console.WriteLine(DateTime.Now); } if (cmd == "purgelocals") { server.MaintPurgeLocals(); } if (cmd == "thread") { Console.WriteLine("Starting heavy thread test"); ThreadTest test = new ThreadTest(server, false); test.Start(); } if (cmd == "thread_purgelocal") { Console.WriteLine("Starting heavy thread test"); ThreadTest test = new ThreadTest(server, true); test.Start(); } if (cmd == "threadmesh") { RemoteServer server2 = ConnectServerByConsole(); Console.WriteLine("Starting heavy thread mesh test"); CrossServerThreadTest test = new CrossServerThreadTest(server, server2); test.Start(); } if (cmd == "threadmesh3") { RemoteServer server2 = ConnectServerByConsole(); RemoteServer server3 = ConnectServerByConsole(); Console.WriteLine("Starting heavy thread mesh test"); CrossServerThreadTest3 test = new CrossServerThreadTest3(server, server2, server3); test.Start(); } if (cmd == "testmulticonn") { RemoteServer[] server1 = ConnectServerByConsoleX(10); RemoteServer[] server2 = ConnectServerByConsoleX(10); RemoteServer[] server3 = ConnectServerByConsoleX(10); List<RemoteServer> allServers = new List<RemoteServer>(); allServers.AddRange(server1); allServers.AddRange(server2); allServers.AddRange(server3); CrossServerTestMulticonn test = new CrossServerTestMulticonn(server1[0], server2[0], server3[0], allServers.ToArray(), true); test.Start(); } if (cmd == "testmulticonnsingle") { RemoteServer[] server1 = ConnectServerByConsoleX(10); CrossServerTestMulticonn test = new CrossServerTestMulticonn(server1[0], server1[0], server1[0], server1, false); test.Start(); } if (cmd == "meshbias3") { RemoteServer[] servers2 = ConnectServerByConsoleX(10); RemoteServer server3 = ConnectServerByConsole(); Console.WriteLine("Starting heavy thread biased mesh test"); CrossServerBiasTest3 test = new CrossServerBiasTest3(server, servers2, server3); test.Start(); } if (cmd == "connect") { //fast connect and disconnect to try and kill the whip service for (int i = 0; i < 1000; i++) { server.Stop(); server.Start(); } } if (cmd == "status") { Console.WriteLine(server.GetServerStatus()); } if (cmd == "prefix") { Console.WriteLine(server.GetAssetIds("00000000000000000000000000000000")); } if (cmd == "compare") { RemoteServer server1 = ConnectServerByConsole(); RemoteServer server2 = ConnectServerByConsole(); RunCompare(server1, server2); } if (cmd == "import") { Console.Write("Connection String: "); string connString = Console.ReadLine(); Console.WriteLine(); Console.Write("Start at: "); int startAt = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(); _import = new AssetImport(server, connString, startAt); _import.Start(); } if (cmd == "msimport") { Console.Write("Connection String: "); string connString = Console.ReadLine(); Console.WriteLine(); Console.Write("Start at: "); Guid startAt = new Guid(Console.ReadLine()); Console.WriteLine(); _msimport = new MsSqlAssetImport(server, connString, startAt); _msimport.Start(); } if (cmd == "stop import") { if (_import != null) _import.Stop(); _import = null; if (_msimport != null) _msimport.Stop(); _msimport = null; } }
/// <summary> /// Converts a whip asset to an opensim asset /// </summary> /// <param name="whipAsset"></param> /// <returns></returns> private AssetBase WhipAssetToOpensim(Asset whipAsset) { AssetBase osAsset = new AssetBase(); osAsset.Data = whipAsset.Data; osAsset.Name = whipAsset.Name; osAsset.Description = whipAsset.Description; osAsset.Type = (sbyte)whipAsset.Type; osAsset.Local = whipAsset.Local; osAsset.Temporary = whipAsset.Temporary; osAsset.FullID = new OpenMetaverse.UUID(whipAsset.Uuid); return osAsset; }
private Asset OpensimAssetToWhip(AssetBase osAsset) { Asset whipAsset = new Asset(osAsset.FullID.ToString(), (byte)osAsset.Type, osAsset.Local, osAsset.Temporary, OpenSim.Framework.Util.UnixTimeSinceEpoch(), osAsset.Name, osAsset.Description, osAsset.Data); return whipAsset; }
public CrossServerTestMulticonn(RemoteServer server1, RemoteServer server2, RemoteServer server3, RemoteServer[] allConnections, bool putDupesToAll) { _server1 = server1; _server2 = server2; _server3 = server3; _allConnections = allConnections; Console.WriteLine("Putting 100 random assets to server1"); Console.WriteLine(DateTime.Now); SHA1 sha = new SHA1CryptoServiceProvider(); for (int i = 0; i < 100; i++) { string uuidstr = OpenMetaverse.UUID.Random().ToString(); byte[] randomBytes = TestUtil.RandomBytes(500, 800000); byte[] challengeHash = sha.ComputeHash(randomBytes); _assetUuids.Add(uuidstr); _existingAssets.Add(uuidstr, challengeHash); Asset asset = new Asset(uuidstr, 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); _server1.PutAsset(asset); } Console.WriteLine("Done: " + DateTime.Now); Console.WriteLine("Putting 100 random assets to server2"); Console.WriteLine(DateTime.Now); for (int i = 0; i < 100; i++) { string uuidstr = OpenMetaverse.UUID.Random().ToString(); byte[] randomBytes = TestUtil.RandomBytes(500, 800000); byte[] challengeHash = sha.ComputeHash(randomBytes); _assetUuids.Add(uuidstr); _existingAssets.Add(uuidstr, challengeHash); Asset asset = new Asset(uuidstr, 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); _server2.PutAsset(asset); } Console.WriteLine("Done: " + DateTime.Now); Console.WriteLine("Putting 100 random assets to server3"); Console.WriteLine(DateTime.Now); for (int i = 0; i < 100; i++) { string uuidstr = OpenMetaverse.UUID.Random().ToString(); byte[] randomBytes = TestUtil.RandomBytes(500, 800000); byte[] challengeHash = sha.ComputeHash(randomBytes); _assetUuids.Add(uuidstr); _existingAssets.Add(uuidstr, challengeHash); Asset asset = new Asset(uuidstr, 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); _server3.PutAsset(asset); } Console.WriteLine("Putting duplicate assets to all servers"); for (int i = 0; i < 20; i++) { string uuidstr = OpenMetaverse.UUID.Random().ToString(); byte[] randomBytes = TestUtil.RandomBytes(500, 800000); byte[] challengeHash = sha.ComputeHash(randomBytes); _assetUuids.Add(uuidstr); _existingAssets.Add(uuidstr, challengeHash); Asset asset = new Asset(uuidstr, 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); _server1.PutAsset(asset); if (putDupesToAll) { _server2.PutAsset(asset); _server3.PutAsset(asset); } _assetsThatExistOnAll.Add(uuidstr); } Console.WriteLine("Done: " + DateTime.Now); }
public void SingleWrite() { string uuidstr = OpenMetaverse.UUID.Random().ToString(); byte[] randomBytes = TestUtil.RandomBytes(500, 800000); Asset asset = new Asset(uuidstr, 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); RandomServer().PutAsset(asset); //also try to put an asset that already exists int index; lock (randomAsset) { index = (int)Math.Floor(_assetsThatExistOnAll.Count * randomAsset.NextDouble()); } try { Asset existing = new Asset(_assetsThatExistOnAll[index], 1, false, false, 0, "Random Asset", "Radom Asset Desc", randomBytes); RandomServer().PutAsset(existing); Console.WriteLine("Write duplicate expected to error, but no error caught!"); } catch (Exception) { } }
/// <summary> /// Calls all waiters waiting on the given asset UUID /// </summary> /// <param name="message"></param> private void CallGetWaiters(ServerResponseMsg message, Asset asset) { List<ResponseWaiter> getWaitList = _getResponseWaiters[message.AssetUUID]; foreach (ResponseWaiter waiter in getWaitList) { waiter.response = message; waiter.asset = asset; waiter.waitEvent.Set(); this.HandleAsyncResponse(waiter); } //remove the list, everyone has been notified _getResponseWaiters.Remove(message.AssetUUID); }
/// <summary> /// Attempts to retrieve the given asset from the server /// </summary> /// <param name="uuid">The asset UUID as a string</param> /// <returns>Asset</returns> public void PutAsset(Asset asset) { //build the request ClientRequestMsg request = new ClientRequestMsg(ClientRequestMsg.RequestType.PUT, asset.Uuid, asset.Serialize().data); //send request and wait for response try { ResponseWaiter responseWaiter = this.SendRequest(request, null); responseWaiter.waitEvent.WaitOne(); //we got a response //is there an error? this.CheckThrowError(responseWaiter); } catch (SocketException e) { //a socket exception means we need to signal all waiters this.HandleSendError(e); throw new AssetServerError(e.Message, e); } }
public void Run() { int i = 0; /*int count = 0; SqlCommand countCmd = new SqlCommand( "SELECT COUNT(*) as CNT " + "FROM assets " + "WHERE id >= @id ", _conn); countCmd.Parameters.AddWithValue("@id", _startAt); countCmd.CommandType = CommandType.Text; count = Convert.ToInt32(countCmd.ExecuteScalar()); countCmd.Dispose(); */ while (true) { SqlCommand cmd = new SqlCommand( "SELECT TOP 100 id, name, description, assetType, local, temporary, data, create_time " + "FROM assets " + "WHERE id > @id " + "ORDER BY id", _conn); cmd.Parameters.AddWithValue("@id", _startAt); try { using (SqlDataReader dbReader = cmd.ExecuteReader()) { while (dbReader.Read() && !_stop) { bool local; bool temp; try { local = (bool)dbReader["local"]; } catch (InvalidCastException) { local = false; } try { temp = (bool)dbReader["temporary"]; } catch (InvalidCastException) { temp = false; } string uuid = ((Guid)dbReader["id"]).ToString(); sbyte assetType = (sbyte)(byte)dbReader["assetType"]; int createTime = (int)dbReader["create_time"]; string name = (string)dbReader["name"]; string desc = (string)dbReader["description"]; byte[] data = (byte[])dbReader["data"]; Asset whipAsset = new Asset( uuid, (byte)assetType, local, temp, createTime, name, desc, data); try { _server.PutAsset(whipAsset); } catch (Exception e) { Log("Error putting asset: " + e); Console.Read(); } Log("Writing " + ((Guid)dbReader["id"]).ToString()); Log(++i + " this run"); _startAt = (Guid)dbReader["id"]; } dbReader.Close(); cmd.Dispose(); } } catch (Exception e) { Log(e.ToString()); Log("Last asset written: " + _startAt); } Log("Last asset written: " + _startAt); } }