Done :)

Phill

On Friday, September 30, 2016 at 8:52:30 AM UTC+1, Andrey Lomakin wrote:
>
> Hi Philip ,
> Could you send thread dump for 2.2.10 version ?
>
> пт, 30 Сен 2016, 8:47 Phillip Henry <phill...@gmail.com <javascript:>>:
>
>> Hi, Andrey.
>>
>> I was using 2.2.10 but just to be sure, I ran it a second time making 
>> sure that 2.2.10 was the first thing in my classpath and I am afraid that I 
>> saw it again. It's quite predictable (anywhere between 200 and 250 million 
>> edges).
>>
>> Regards,
>>
>> Phillip
>>
>>
>> On Monday, September 26, 2016 at 9:06:44 AM UTC+1, Andrey Lomakin wrote:
>>
>>> Hi,
>>> I have looked at your thread dump we have already identified and fixed 
>>> your issue in 2.2.9 version. 
>>> So if you use 2.2.10 (latest one), you will not experience this problem.
>>>
>>> I strongly recommend using 2.2.10 version because several deadlocks are 
>>> fixed in 2.2.9 version also 2.2.10 contains few minor optimizations.
>>>
>>
>>> On Fri, Sep 23, 2016 at 6:51 PM Phillip Henry <phill...@gmail.com> 
>>> wrote:
>>>
>>>> Hi, Luca.
>>>>
>>>> > How many GB?
>>>>
>>>> The input file is 22gb of text.
>>>>
>>>> > If the file is ordered ...
>>>>
>>>> You are only sorting by the first account. The second account can be 
>>>> anywhere in the entire range. My understanding is that both vertices are 
>>>> updated when an edge is written. If this is true, will there not be 
>>>> potential contention when the "to" vertex is updated?
>>>>
>>>> > OGraphBatchInsert ... keeps everything in RAM before flushing
>>>>
>>>> I assume I will still have to write retry code in the event of a 
>>>> collision (see above)?
>>>>
>>>> > You cna use support --at- orientdb.com ... 
>>>>
>>>> Sent.
>>>>
>>>> Regards,
>>>>
>>>> Phill
>>>>
>>>> On Friday, September 23, 2016 at 4:06:49 PM UTC+1, l.garulli wrote:
>>>>
>>>>> On 23 September 2016 at 03:50, Phillip Henry <phill...@gmail.com> 
>>>>> wrote:
>>>>>
>>>>>> > How big is your file the sort cannot write?
>>>>>>
>>>>>> One bil-ee-on lines... :-P
>>>>>>
>>>>>
>>>>> How many GB?
>>>>>  
>>>>>
>>>>>> > ...This should help a lot. 
>>>>>>
>>>>>> The trouble is that the size of a block of contiguous accounts in the 
>>>>>> real data is not-uniform (even if it might be with my test data). 
>>>>>> Therefore, it is highly likely a contiguous block of account numbers 
>>>>>> will 
>>>>>> span 2 or more batches. This will lead to a lot of contention. In your 
>>>>>> example, if Account 2 spills over into the next batch, chances are I'll 
>>>>>> have to rollback that batch.
>>>>>>
>>>>>> Don't you also have a problem that if X, Y, Z and W in your example 
>>>>>> are account numbers in the next batch, you'll also get contention? 
>>>>>> Admittedly, randomization doesn't solve this problem either.
>>>>>>
>>>>>
>>>>> If the file is ordered, you could have X threads (where X is the 
>>>>> number of cores) that parse the file not sequentially. For example with 4 
>>>>> threads, you could start the parsing in this way:
>>>>>
>>>>> Thread 1, starts from 0
>>>>> Thread 2, starts from length * 1/4
>>>>> Thread 3, starts from length * 2/4
>>>>> Thread 1, starts from length * 3/4
>>>>>  
>>>>> Of course the parsing should browse until the next LF+LR if it's a 
>>>>> CSV. It requires some lines of code, but you could avoid many conflicts.
>>>>>
>>>>>
>>>>>> > you can use the special Batch Importer: OGraphBatchInsert
>>>>>>
>>>>>> Would this not be subject to the same contention problems?
>>>>>> At what point is it flushed to disk? (Obviously, it can't live in 
>>>>>> heap forever).
>>>>>>
>>>>>
>>>>> It keeps everything in RAM before flushing. Up to a few hundreds of 
>>>>> millions of vertices/edges should be fine if you have a lot of heap, like 
>>>>> 58GB (and 4GB of DISKCACHE). It depends by the number of attributes you 
>>>>> have.
>>>>>  
>>>>>
>>>>>> > You should definitely using transactions with batch size of 100 
>>>>>> items. 
>>>>>>
>>>>>> I thought I read somewhere else (can't find the link at the moment) 
>>>>>> that you said only use transactions when using the remote protocol?
>>>>>>
>>>>>
>>>>> This was true before v2.2. With v2.2 the management of the transaction 
>>>>> is parallel and very light. Transactions work well with graphs because 
>>>>> every addEdge() operation is 2 update and having a TX that works like a 
>>>>> batch really helps.
>>>>>  
>>>>>
>>>>>>
>>>>>> > Please use last 2.2.10. ... try to define 50GB of DISKCACHE and 
>>>>>> 14GB of Heap
>>>>>>
>>>>>> Will do on the next run.
>>>>>>
>>>>>> > If happens again, could you please send a thread dump?
>>>>>>
>>>>>> I have the full thread dump but it's on my work machine so can't post 
>>>>>> it in this forum (all access to Google Groups is banned by the bank so I 
>>>>>> am 
>>>>>> writing this on my personal computer). Happy to email them to you. Which 
>>>>>> email shall I use?
>>>>>>
>>>>>
>>>>> You cna use support --at- orientdb.com referring at this thread in 
>>>>> the subject.
>>>>>  
>>>>>
>>>>>>
>>>>>> Phill
>>>>>>
>>>>>
>>>>>
>>>>> Best Regards,
>>>>>
>>>>> Luca Garulli
>>>>> Founder & CEO
>>>>> OrientDB LTD <http://orientdb.com/>
>>>>>
>>>>> Want to share your opinion about OrientDB?
>>>>> Rate & review us at Gartner's Software Review 
>>>>> <https://www.gartner.com/reviews/survey/home>
>>>>>
>>>>>  
>>>>>
>>>>>> On Friday, September 23, 2016 at 7:41:29 AM UTC+1, l.garulli wrote:
>>>>>>
>>>>>>> On 23 September 2016 at 00:49, Phillip Henry <phill...@gmail.com> 
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Hi, Luca.
>>>>>>>>
>>>>>>>
>>>>>>> Hi Phillip.
>>>>>>>  
>>>>>>>
>>>>>>>> I have:
>>>>>>>>
>>>>>>>> 4. sorting is an overhead, albeit outside of Orient. Using the Unix 
>>>>>>>> sort command failed with "No space left on device". Oops. OK, so I ran 
>>>>>>>> my 
>>>>>>>> program to generate the data again, this time it is ordered by the 
>>>>>>>> first 
>>>>>>>> account number. Performance was much slower as there appeared to be a 
>>>>>>>> lot 
>>>>>>>> of contention for this account (ie, all writes were contending for 
>>>>>>>> this 
>>>>>>>> account, even if the other account had less contention). More 
>>>>>>>> randomized 
>>>>>>>> data was faster.
>>>>>>>>
>>>>>>>
>>>>>>> How big is your file the sort cannot write? Anyway, if you have the 
>>>>>>> accounts sorted, you should have transactions of about 100 items where 
>>>>>>> the 
>>>>>>> bank account and edges are in the same transaction. This should help a 
>>>>>>> lot. 
>>>>>>> Example:
>>>>>>>
>>>>>>> Account 1 -> Payment 1 -> Account X
>>>>>>> Account 1 -> Payment 2 -> Account Y
>>>>>>> Account 1 -> Payment 3 -> Account Z
>>>>>>> Account 2 -> Payment 1 -> Account X
>>>>>>> Account 2 -> Payment 1 -> Account W
>>>>>>>
>>>>>>> If the transaction batch is 5 (I suggest you to start with 100), all 
>>>>>>> the operations are executed in one transaction. In another thread has:
>>>>>>>
>>>>>>> Account 99 -> Payment 1 -> Account W
>>>>>>>
>>>>>>> It could go in conflict because the shared Account W.
>>>>>>>
>>>>>>> If you can export Account's IDs that are numbers and incremental, 
>>>>>>> you can use the special Batch Importer: OGraphBatchInsert. Example:
>>>>>>>
>>>>>>> OGraphBatchInsert batch = new OGraphBatchInsert("plocal:/temp/mydb", 
>>>>>>> "admin", "admin");
>>>>>>> batch.begin();
>>>>>>>
>>>>>>> batch.createEdge(0L, 1L, null); // CREATE EDGES BETWEEN VERTEX 0 and 1. 
>>>>>>> IF VERTICES
>>>>>>>
>>>>>>>                                 // DON'T EXISTS, ARE CREATED IMPLICITELY
>>>>>>> batch.createEdge(1L, 2L, null);
>>>>>>> batch.createEdge(2L, 0L, null);
>>>>>>>
>>>>>>>
>>>>>>> batch.createVertex(3L); // CREATE AN NON CONNECTED VERTEX
>>>>>>>
>>>>>>>
>>>>>>> Map<String, Object> vertexProps = new HashMap<String, Object>();
>>>>>>> vertexProps.put("foo", "foo");
>>>>>>> vertexProps.put("bar", 3);
>>>>>>> batch.setVertexProperties(0L, vertexProps); // SET PROPERTY FOR VERTEX 0
>>>>>>> batch.end();
>>>>>>>
>>>>>>> This is blazing fast, but uses Heap so run it with a lot of it.
>>>>>>>  
>>>>>>>
>>>>>>>>
>>>>>>>> 6. I've mutlithreaded my loader. The details are now:
>>>>>>>>
>>>>>>>> - using plocal
>>>>>>>> - using 30 threads
>>>>>>>> - not using transactions (OrientGraphFactory.getNoTx)
>>>>>>>>
>>>>>>>
>>>>>>> You should definitely using transactions with batch size of 100 
>>>>>>> items. This speeds up things.
>>>>>>>  
>>>>>>>
>>>>>>>> - retrying forever upon write collisions.
>>>>>>>> - using Orient 2.2.7.
>>>>>>>>
>>>>>>>
>>>>>>> Please use last 2.2.10.
>>>>>>>  
>>>>>>>
>>>>>>>> - using -XX:MaxDirectMemorySize:258040m
>>>>>>>>
>>>>>>>
>>>>>>> This is not really important, it's just an upper bound for the JVM. 
>>>>>>> Please set it to 512GB so you can forget about it. The 2 most important 
>>>>>>> values are DISKCACHE and JVM heap. The sum must lower than the 
>>>>>>> available 
>>>>>>> RAM in the server before you run OrientDB.
>>>>>>>
>>>>>>> If you have 64GB, try to define 50GB of DISKCACHE and 14GB of Heap.
>>>>>>>
>>>>>>> If you use the Batch Importer, you should use more Heap and less 
>>>>>>> DISKCACHE.
>>>>>>>  
>>>>>>>
>>>>>>>> The good news is I've achieved an initial write throughput of about 
>>>>>>>> 30k/second.
>>>>>>>>
>>>>>>>> The bad news is I've tried several runs and only been able to 
>>>>>>>> achieve 200mil < number of writes < 300mil.
>>>>>>>>
>>>>>>>> The first time I tried it, the loader deadlocked. Using jstat 
>>>>>>>> showed that the deadlock was between 3 threads at:
>>>>>>>> - 
>>>>>>>> OOneKeyEntryPerKeyLockManager.acquireLock(OOneKeyEntryPerKeyLockManager.java:173)
>>>>>>>> - 
>>>>>>>> OPartitionedLockManager.acquireExclusiveLock(OPartitionedLockManager.java:210)
>>>>>>>> - 
>>>>>>>> OOneKeyEntryPerKeyLockManager.acquireLock(OOneKeyEntryPerKeyLockManager.java:171)
>>>>>>>>
>>>>>>>
>>>>>>> If happens again, could you please send a thread dump?
>>>>>>>  
>>>>>>>
>>>>>>>> The second time it failed was due to a NullPointerException at 
>>>>>>>> OByteBufferPool.java:297. I've looked at the code and the only way I 
>>>>>>>> can 
>>>>>>>> see this happening is if OByteBufferPool.allocateBuffer throws an 
>>>>>>>> error 
>>>>>>>> (perhaps an OutOfMemoryError in java.nio.Bits.reserveMemory). This 
>>>>>>>> StackOverflow posting (
>>>>>>>> http://stackoverflow.com/questions/8462200/examples-of-forcing-freeing-of-native-memory-direct-bytebuffer-has-allocated-us)
>>>>>>>>  
>>>>>>>> seems to indicate that this can happen if the underlying 
>>>>>>>> DirectByteBuffer's 
>>>>>>>> Cleaner doesn't have its clean() method called. 
>>>>>>>>
>>>>>>>
>>>>>>> This is because the database was bigger than this setting: - using 
>>>>>>> -XX:MaxDirectMemorySize:258040m. Please set this at 512GB (see above).
>>>>>>>  
>>>>>>>
>>>>>>>> Alternatively, I followed the SO suggestion and lowered the heap 
>>>>>>>> space to a mere 1gb (it was 50gb) to make the GC more active. 
>>>>>>>> Unfortunately, after a good start, the job is still running some 15 
>>>>>>>> hours 
>>>>>>>> later with a hugely reduced write throughput (~ 7k/s). Jstat shows 
>>>>>>>> 4292 
>>>>>>>> full GCs taking a total time of 4597s - not great but not hugely awful 
>>>>>>>> either. At this rate, the remaining 700mil or so payments are going to 
>>>>>>>> take 
>>>>>>>> another 30 hours.
>>>>>>>>
>>>>>>>
>>>>>>> See above the suggested settings.
>>>>>>>  
>>>>>>>
>>>>>>>> 7. Even with the highest throughput I have achieved, 30k writes per 
>>>>>>>> second, I'm looking at about 20 hours of loading. We've taken the same 
>>>>>>>> data 
>>>>>>>> and, after trial and error that was not without its own problems, put 
>>>>>>>> it 
>>>>>>>> into Neo4J in 37 minutes. This is a significant difference. It appears 
>>>>>>>> that 
>>>>>>>> they are approaching the problem differently to avoid contention on 
>>>>>>>> updating the vertices during an edge write.
>>>>>>>>
>>>>>>>
>>>>>>> With all this suggestion you should be able to have much better 
>>>>>>> numbers. If you can use the Batch Importer the number should be close 
>>>>>>> to 
>>>>>>> Neo4j.
>>>>>>>  
>>>>>>>
>>>>>>>>
>>>>>>>> Thoughts?
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>>
>>>>>>>> Phillip
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> Best Regards,
>>>>>>>
>>>>>>> Luca Garulli
>>>>>>> Founder & CEO
>>>>>>> OrientDB LTD <http://orientdb.com/>
>>>>>>>
>>>>>>> Want to share your opinion about OrientDB?
>>>>>>> Rate & review us at Gartner's Software Review 
>>>>>>> <https://www.gartner.com/reviews/survey/home>
>>>>>>>
>>>>>>>
>>>>>>>  
>>>>>>>
>>>>>>>>
>>>>>>>> On Thursday, September 15, 2016 at 10:06:44 PM UTC+1, l.garulli 
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>> On 15 September 2016 at 09:54, Phillip Henry <phill...@gmail.com> 
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> Hi, Luca.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Hi Phillip,
>>>>>>>>>
>>>>>>>>> 3. Yes, default configuration. Apart from adding an index for 
>>>>>>>>>> ACCOUNTS, I did nothing further.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Ok, so you have writeQuorum="majority" that means 2 sycnhronous 
>>>>>>>>> writes and 1 asynchronous per transaction.
>>>>>>>>>  
>>>>>>>>>
>>>>>>>>>> 4. Good question. With real data, we expect it to be as you 
>>>>>>>>>> suggest: some nodes with the majority of the payments (eg, 
>>>>>>>>>> supermarkets). 
>>>>>>>>>> However, for the test data, payments were assigned randomly and, 
>>>>>>>>>> therefore, 
>>>>>>>>>> should be uniformly distributed.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> What's your average in terms of number of edges? <10, <50, <200, 
>>>>>>>>> <1000?
>>>>>>>>>  
>>>>>>>>>
>>>>>>>>>> 2. Yes, I tried plocal minutes after posting (d'oh!). I saw a 
>>>>>>>>>> good improvement. It started about 3 times faster and got faster 
>>>>>>>>>> still 
>>>>>>>>>> (about 10 times faster) by the time I checked this morning on a job 
>>>>>>>>>> running 
>>>>>>>>>> overnight. However, even though it is now running at about 7k 
>>>>>>>>>> transactions 
>>>>>>>>>> per second, a billion edges is still going to take about 40 hours. 
>>>>>>>>>> So, I 
>>>>>>>>>> ask myself: is there anyway I can make it faster still?
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Here it's missing the usage of AUTO-SHARDING INDEX. Example:
>>>>>>>>>
>>>>>>>>> accountClass.createIndex("Account.number", 
>>>>>>>>> OClass.INDEX_TYPE.UNIQUE.toString(), (OProgressListener) null, 
>>>>>>>>> (ODocument) null,
>>>>>>>>>     "AUTOSHARDING", new String[] { "number" });
>>>>>>>>>
>>>>>>>>> In this way you should go more in parallel, because the index is 
>>>>>>>>> distributed across all the shards (clusters) of Account class. you 
>>>>>>>>> should 
>>>>>>>>> have 32 of them by default because you have 32 cores. 
>>>>>>>>>
>>>>>>>>> Please let me know if by sorting the from_accounts and with this 
>>>>>>>>> change if it's much faster.
>>>>>>>>>
>>>>>>>>> This is the best you can have out of the box. To push numbers up 
>>>>>>>>> it's slightly more complicated: you should be sure that transactions 
>>>>>>>>> go in 
>>>>>>>>> parallel and they aren't serialized. This is possible by playing with 
>>>>>>>>> internal OrientDB settings (mainly the distributed workerThreads), by 
>>>>>>>>> having many clusters per class (You could try with 128 first and see 
>>>>>>>>> how 
>>>>>>>>> it's going).
>>>>>>>>>  
>>>>>>>>>
>>>>>>>>>> I assume when I start the servers up in distributed mode once 
>>>>>>>>>> more, the data will then be distributed across all nodes in the 
>>>>>>>>>> cluster?
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> That's right.
>>>>>>>>>  
>>>>>>>>>
>>>>>>>>>> 3. I'll return to concurrent, remote inserts when this job has 
>>>>>>>>>> finished. Hopefully, a smaller batch size will mean there is no 
>>>>>>>>>> degradation 
>>>>>>>>>> in performance either... FYI: with a somewhat unscientific approach, 
>>>>>>>>>> I was 
>>>>>>>>>> polling the server JVM with JStack and saw only a single thread 
>>>>>>>>>> doing all 
>>>>>>>>>> the work and it *seemed* to spend a lot of its time in ODirtyManager 
>>>>>>>>>> on 
>>>>>>>>>> collection manipulation.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I think it's because you didn't use the AUTO-SHARDING index. 
>>>>>>>>> Furthermore running distributed, unfortunately, means the tree ridbag 
>>>>>>>>> is 
>>>>>>>>> not available (we will support it in the future), so every change to 
>>>>>>>>> the 
>>>>>>>>> edges takes a lot of CPU to demarshall and marshall the entire edge 
>>>>>>>>> list 
>>>>>>>>> everytime you update a vertex. That's why my recommendation about 
>>>>>>>>> sorting 
>>>>>>>>> the vertices.
>>>>>>>>>  
>>>>>>>>>
>>>>>>>>>> I totally appreciate that performance tuning is an empirical 
>>>>>>>>>> science, but do you have any opinions as to which would probably be 
>>>>>>>>>> faster: 
>>>>>>>>>> single-threaded plocal or multithreaded remote? 
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> With v2.2 yo can go in parallel, by using the tips above. For sure 
>>>>>>>>> the replication has a cost. I'm sure you can go much faster with just 
>>>>>>>>> one 
>>>>>>>>> node and then start the other 2 nodes to have the database replicated 
>>>>>>>>> automatically. At least for the first massive insertion.
>>>>>>>>>  
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Regards,
>>>>>>>>>>
>>>>>>>>>> Phillip
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Luca
>>>>>>>>>
>>>>>>>>>  
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Wednesday, September 14, 2016 at 3:48:56 PM UTC+1, Phillip 
>>>>>>>>>> Henry wrote:
>>>>>>>>>>>
>>>>>>>>>>> Hi, guys.
>>>>>>>>>>>
>>>>>>>>>>> I'm conducting a proof-of-concept for a large bank (Luca, we had 
>>>>>>>>>>> a 'phone conf on August 5...) and I'm trying to bulk insert a 
>>>>>>>>>>> humongous 
>>>>>>>>>>> amount of data: 1 million vertices and 1 billion edges.
>>>>>>>>>>>
>>>>>>>>>>> Firstly, I'm impressed about how easy it was to configure a 
>>>>>>>>>>> cluster. However, the performance of batch inserting is bad (and 
>>>>>>>>>>> seems to 
>>>>>>>>>>> get considerably worse as I add more data). It starts at about 2k 
>>>>>>>>>>> vertices-and-edges per second and deteriorates to about 500/second 
>>>>>>>>>>> after 
>>>>>>>>>>> only about 3 million edges have been added. This also takes ~ 30 
>>>>>>>>>>> minutes. 
>>>>>>>>>>> Needless to say that 1 billion payments (edges) will take over a 
>>>>>>>>>>> week at 
>>>>>>>>>>> this rate. 
>>>>>>>>>>>
>>>>>>>>>>> This is a show-stopper for us.
>>>>>>>>>>>
>>>>>>>>>>> My data model is simply payments between accounts and I store it 
>>>>>>>>>>> in one large file. It's just 3 fields and looks like:
>>>>>>>>>>>
>>>>>>>>>>> FROM_ACCOUNT TO_ACCOUNT AMOUNT
>>>>>>>>>>>
>>>>>>>>>>> In the test data I generated, I had 1 million accounts and 1 
>>>>>>>>>>> billion payments randomly distributed between pairs of accounts.
>>>>>>>>>>>
>>>>>>>>>>> I have 2 classes in OrientDB: ACCOUNTS (extending V) and PAYMENT 
>>>>>>>>>>> (extending E). There is a UNIQUE_HASH_INDEX on ACCOUNTS for the 
>>>>>>>>>>> account 
>>>>>>>>>>> number (a string).
>>>>>>>>>>>
>>>>>>>>>>> We're using OrientDB 2.2.7.
>>>>>>>>>>>
>>>>>>>>>>> My batch size is 5k and I am using the "remote" protocol to 
>>>>>>>>>>> connect to our cluster.
>>>>>>>>>>>
>>>>>>>>>>> I'm using JDK 8 and my 3 boxes are beefy machines (32 cores 
>>>>>>>>>>> each) but without SSDs. I wrote the importing code myself but did 
>>>>>>>>>>> nothing 
>>>>>>>>>>> 'clever' (I think) and used the Graph API. This client code has 
>>>>>>>>>>> been given 
>>>>>>>>>>> lots of memory and using jstat I can see it is not excessively 
>>>>>>>>>>> GCing.
>>>>>>>>>>>
>>>>>>>>>>> So, my questions are:
>>>>>>>>>>>
>>>>>>>>>>> 1. what kind of performance can I realistically expect and can I 
>>>>>>>>>>> improve what I have at the moment?
>>>>>>>>>>>
>>>>>>>>>>> 2. what kind of degradation should I expect as the graph grows?
>>>>>>>>>>>
>>>>>>>>>>> Thanks, guys.
>>>>>>>>>>>
>>>>>>>>>>> Phillip
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> -- 
>>>>>>>>>>
>>>>>>>>>> --- 
>>>>>>>>>> You received this message because you are subscribed to the 
>>>>>>>>>> Google Groups "OrientDB" group.
>>>>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>>>>> send an email to orient-databa...@googlegroups.com.
>>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> -- 
>>>>>>>>
>>>>>>>> --- 
>>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>>> Groups "OrientDB" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>>> send an email to orient-databa...@googlegroups.com.
>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>
>>>>>> --- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "OrientDB" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to orient-databa...@googlegroups.com.
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>> -- 
>>>>
>>>> --- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "OrientDB" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to orient-databa...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>> -- 
>>>
>> Best regards,
>>> Andrey Lomakin, R&D lead. 
>>> OrientDB Ltd
>>>
>>> twitter: @Andrey_Lomakin 
>>> linkedin: https://ua.linkedin.com/in/andreylomakin
>>> blogger: http://andreylomakin.blogspot.com/ 
>>>
>> -- 
>>
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "OrientDB" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to orient-databa...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
> -- 
> Best regards,
> Andrey Lomakin, R&D lead. 
> OrientDB Ltd
>
> twitter: @Andrey_Lomakin 
> linkedin: https://ua.linkedin.com/in/andreylomakin
> blogger: http://andreylomakin.blogspot.com/ 
>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to orient-database+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to