Presentation is loading. Please wait.

Presentation is loading. Please wait.

What’s New in the OpenEdge Database Norwegian PUG Event Richard Banville, Fellow, OpenEdge Development April 8, 2014.

Similar presentations


Presentation on theme: "What’s New in the OpenEdge Database Norwegian PUG Event Richard Banville, Fellow, OpenEdge Development April 8, 2014."— Presentation transcript:

1 What’s New in the OpenEdge Database Norwegian PUG Event Richard Banville, Fellow, OpenEdge Development April 8, 2014

2 © 2014 Progress Software Corporation. All rights reserved. 2 Introduction  Parallel development between OpenEdge 10.2B and OpenEdge 11 Including rollout of some enhancements in the older releases Some OE 10.2B releases occurred after OE 11.0 shipped –This confuses where some features exist  Release information provided with each topic Indicates there and above  Not a deep dive into each feature Just going to scratch the surface

3 © 2014 Progress Software Corporation. All rights reserved. 3 Agenda  Major Features  Not So Major Features  Relatively Unknown or Forgotten Features

4 © 2014 Progress Software Corporation. All rights reserved. 4 Major Features

5 © 2014 Progress Software Corporation. All rights reserved. 5 Application transparent data encryption Full index query support No need to move data Application transparent data encryption Full index query support No need to move data Transparent Encrypt individual objects or areas Can change encryption policies online Storage engine encrypts blocks on disk Encrypt individual objects or areas Can change encryption policies online Storage engine encrypts blocks on disk Flexible Provides secure encryption key storage Support industry standard ciphers Limits access to physical data Provides secure encryption key storage Support industry standard ciphers Limits access to physical data Secure Very low overhead (0 – 4%) Transparent Data Encryption – TDE (OE 10.2B)

6 © 2014 Progress Software Corporation. All rights reserved. 6 OpenEdge Transparent Data Encryption (TDE) plain text Encrypt Shared Memory Buffer Pool (plain text block) Database Storage Engine Product Install  Key store Database Master Key (DMK) Admin/User Passphrase Manual/Automatic  Encryption Policy Area Encryption Policies What to encrypt How to encrypt (cipher) Read I/O Write I/O How Does It Work? Key Store Database Policies Keys Decrypt & Policy Area Encrypted Data

7 © 2014 Progress Software Corporation. All rights reserved. 7 Other Encryption Features  Encrypted backup/restore  Optionally encrypt binary data dump  Migration Encrypt data over time or immediately No application changes –Full index capabilities on encrypted data  Supporting utilities Enable/disable Epolicy manage rekey | update | encrypt Epolicy scan Table/index move w/possible re-encryption Can change encryption policies online

8 © 2014 Progress Software Corporation. All rights reserved. 8 Multi-tenant Tables (OE 11.0) Multi-tenancy *Fictitious example 1 Ben Affleck 2 Mark Wahlberg 3 Steve Carrell 4 Robin Williams 7 Harrison Ford 8 Berrnie Mac 2 Dennis Rodman 7 Nick Nolte 9 Lindsay Lohan 10 Charlie Sheen Customer Car Rental Application Tenant 3 (Rent-a-wreck) Tenant 2 (Hertz-Chicago) Simplifies Development of Multi-tenant Applications Tenant 1 (Hertz-Boston)  Ease maintenance & app. upgrades  Basic multi-tenant paradigm Multi-tenant tables built into the database  Tenants share same schema definition  Data physically partitioned by tenant identity  Minimal application changes Just establish tenant identity (per database)

9 © 2014 Progress Software Corporation. All rights reserved. 9 Multi-tenant Tables (OE 11.0)  Index keys unique per tenant partition  Shared & tenant sequences/tables  Query is tenant specific Authenticate as tenant –_ User –Client Principal –SQL only _users Assert tenant identity  Useful for database consolidation Same application & schema Multi-tenancy *Fictitious example 1 Ben Affleck 2 Mark Wahlberg 3 Steve Carrell 4 Robin Williams 7 Harrison Ford 8 Berrnie Mac 2 Dennis Rodman 7 Nick Nolte 9 Lindsay Lohan 10 Charlie Sheen Customer Car Rental Application Tenant 3 (Rent-a-wreck) Tenant 2 (Hertz-Chicago) Tenant 1: Hertz-Boston FIND CUSTOMER WHERE cust-num=2. FIND CUSTOMER WHERE cust-num=2. Simplifies Development of Multi-tenant Applications

10 © 2014 Progress Software Corporation. All rights reserved. 10 Multi-tenant Tables (OE 11.0)  Keys unique per tenant partition  Shared & tenant sequences/tables  Query is tenant specific Authenticate as tenant –_ User –Client Principal –SQL only _users Assert tenant identity  Useful for database consolidation Same application & schema Multi-tenancy *Fictitious example 1 Ben Affleck 2 Mark Wahlberg 3 Steve Carrell 4 Robin Williams 7 Harrison Ford 8 Berrnie Mac 2 Dennis Rodman 7 Nick Nolte 9 Lindsay Lohan 10 Charlie Sheen Customer Car Rental Application Tenant 1: Hertz-Boston FIND CUSTOMER WHERE cust-num=2. FIND CUSTOMER WHERE cust-num=2. Simplifies Development of Multi-tenant Applications Tenant 3: Rent-a-wreck FIND CUSTOMER WHERE cust-num=2. FIND CUSTOMER WHERE cust-num=2.

11 © 2014 Progress Software Corporation. All rights reserved. 11 Multi-Tenancy Enhancements  Resource Governors (OE 11.1) -LGovernor - % of lock table any one tenant (user group) is allowed to occupy -nGovernor – Number of database connections any one tenant is allowed to consume  Tenant Index Rebuild online (OE 11.3) proutil -C enablemtidxbld (online & offline) proutil -C mtidxbuild table index tenant | group Acquires EXCLUSIVE table partition lock Tenant data for associated table is restricted to no-lock Index being rebuilt is offline Can run multiple concurrently Data access to table available for all other tenants and other tables of this tenant proutil -C enablemtidxbld proutil -C mtidxbuild table index tenant | group

12 © 2014 Progress Software Corporation. All rights reserved. 12 Multi-Tenancy Enhancements  Tenant Data Recovery (OE 11.3) Basically a restore, roll forward, binary transfer between databases Proutil -C datamove source [ tenant [ table ] | [ sequence ] [ recs ] Schema validation performed automatically Progress OpenEdge Tenant/Group Data Move Source Database: Destination Database: 1. Move Table Data by Tenant 2. Move Sequence Data by Tenant 3. Move Table Data by Group 4. Set Records per Transaction ( Current: 100 ) 5. Quit Enter your selection: proutil -C datamove source tenant table sequence [recs ] Table Instance Control Txn Size

13 © 2014 Progress Software Corporation. All rights reserved. 13 Not So Major Features

14 © 2014 Progress Software Corporation. All rights reserved. 14  Roll forward enhancements (OE 11.3) rfutil -C roll forward –ailist Can now specify a list of files to roll forward rather than individual ones –Avoids redo on each restart Also per file completion status information provided  Dbrestrict (OE 11.3) Restricts access to the database for processes other than the specified operation Unlike “oplock”, allows access by certain read-only activities and prostrct add For “datamove” allows DB Broker, promon & proshut Prorest can enable –dbrestrict too! 10:01:10: 50% of aimage file processed (100 notes processed)... Utility Enhancements proutil -C dbrestrict [ datamove | rollforward ] [ enable | disable | status] rfutil -C rollforward –ailist

15 © 2014 Progress Software Corporation. All rights reserved. 15 Utility Performance  Online Backup Pause (OE 11.3) Requires new backup header version for bi cluster information –Applies to online only –Not backward compatible –On by default –Use –bibackup all option for backward compatibility Backup active clusters only Skips unused clusters regardless of where they are in the cluster ring or bi file Restore will reorder cluster to compact state probkup online [ incremental ] [ bibackup {active | all } ] [enableai ] [ enableaiarchiver – aiarchdir ]

16 © 2014 Progress Software Corporation. All rights reserved. 16 Index Rebuild Performance (OE 10.2B06, OE 11.2) sort block size (8K – 64K, note new limit) # threads for data scan phase merge block size ( default -TB) merge pool fraction of system memory (in %) # threads per concurrent sort group merging # concurrent sort group merging # merge buffers to merge each merge pass report system usage statistics a bit quieter than before -mergethreads -threadnum -TM -rusage -silent -TB -datascanthreads -TMB -TF X -threadnum = 1.5 X #CPUs 2 or rusage -silent X #CPUs 64 80%

17 © 2014 Progress Software Corporation. All rights reserved. 17 Index Rebuild Performance (OE 10.2B06, OE 11.2) sort block size (8K – 64K, note new limit) # threads for data scan phase merge block size ( default -TB) merge pool fraction of system memory (in %) # threads per concurrent sort group merging -mergethreads # concurrent sort group merging -threadnum # merge buffers to merge each merge pass -TM report system usage statistics a bit quieter than before -rusage -silent -TB -datascanthreads -TMB -TF X -threadnum = 1.5 X #CPUs 2 or rusage -silent X #CPUs 64 80%

18 © 2014 Progress Software Corporation. All rights reserved. 18 Networking Control  Process-based control -Ma, -Mn, -Mi –Controls the order users are assigned to servers  Resource-based control -Mm –Maximum size of network message –Client & server startup  New tuning knobs – resource-based control Alleviate excessive system CPU usage by network layer Control record data stuffed in a network message –Applicable for “prefetch” queries Philosophy: Throughput by keeping server busy without remote client waits!

19 © 2014 Progress Software Corporation. All rights reserved. 19 Networking – Prefetch Query  No-lock query with guaranteed forward motion or scrolling Multiple records stuffed into single network message Browsed static and preselected queries scrolling by default define query cust-q for customer SCROLLING. open query cust-q FOR EACH customer NO-LOCK. repeat: get next cust-q. end. FOR EACH customer NO-LOCK: …. end. DO PRESELECT EACH customer NO-LOCK: …. end.

20 © 2014 Progress Software Corporation. All rights reserved. 20 -NmsgWait (OE 10.2B06 & OE 11.1)  Determines how long a server waits for remote request  Benefit: Could reduce polling thereby reducing system CPU  Detriment: Could make remote client wait longer for a lock  Tuning suggestions:  There are better ways to reduce polling.  Leave it alone  Set it to 1 (default is 2) FOR EACH customer NO-LOCK: …. end. Remote Client TCP I/O -Mm 8192 Server

21 © 2014 Progress Software Corporation. All rights reserved. 21 -prefetchPriority (OE 10.2B06 & OE 11.1) Server -Mm 8192  Defers check (poll) for requests from other remote clients while network buffer is populated with multiple records  Reduces System CPU costs  Tuning suggestions:  Set to 100 (worked best in my tests)  Some field testing suggests 50 is best  Watch out for slower response to non-prefetch queries FOR EACH customer NO-LOCK: …. end. TCP I/O Remote Client

22 © 2014 Progress Software Corporation. All rights reserved. 22 -prefetchDelay (OE 10.2B06 & OE 11.1) -Mm 8192  Puts multiple records in first message when set.  If not set, first response message only contains 1 record  Benefits:  Can improve browse widget window population  Can reduce TCP I/O for a single query by 1  Tuning suggestions:  In theory, enabling this should improve performance  I have seen no difference in my testing  Avg record size = 200 bytes  ~40 records per msg maximum (-Mm 8192) FOR EACH customer NO-LOCK: …. end. Server TCP I/O Remote Client

23 © 2014 Progress Software Corporation. All rights reserved. 23 -prefetchNumRecs and –prefetchFactor (OE 10.2B06 & OE 11.1) -Mm 8192  Determines how many records are “stuffed” in a message  Number of records vs percentage full  Reduces network traffic and improves TCP/IP I/O efficiency  Tuning suggestions:  -prefetchNumRecs 100 records  Reduce if remote clients complain of “choppy” behavior  Default is 16 records  Record size and –Mm matter! Avg record size = 200 bytes ~40 records per msg maximum  Too small –Mm negates affect FOR EACH customer NO-LOCK: …. end. Server TCP I/O Remote Client

24 © 2014 Progress Software Corporation. All rights reserved. 24 Enhancements to Database Buffering Database Buffer Pool Bi Buffers Ai Buffers File system cache.d.b.d.a System Memory Process Shared Memory Multi level caches  Memory access much faster than disk access  Reduce read and write I/O via caching Memory is finite Working set concept  Managing the buffer pool Primary buffer pool Alternate buffer pool Private Buffers Replacement mechanisms I/O

25 © 2014 Progress Software Corporation. All rights reserved. 25 The Database Buffer Pool Primary Buffer Pool -B buffers LRU buffer eviction policy LRUMRU Database Buffer Lookup  Database block lookup via single hash table  Replacement policy via LRU mechanism LRU vs MRU end of replacement chain Manages “working set” well Easily “fouled” High housekeeping cost

26 © 2014 Progress Software Corporation. All rights reserved. 26 Reducing “Housekeeping” Costs (OE 10.2B06 and OE 11.1) Primary Buffer Pool -B buffers LRU buffer eviction policy LRU MRU  -lruskips (-lru2skips for alternate buffer pool) (OE 10.2B06 and OE 11.1) Skip LRU maintenance for accesses LRU and LFU (least frequently used) combined Small numbers make a BIG difference (100 works well) FIND _Startup. ASSIGN _Startup-LRU-Skips = 100. FIND _Startup. ASSIGN _Startup-LRU-Skips = 100. Promon, R&D 4. Administrative Functions Adjust Latch Options 4. Adjust LRU force skips: 100 Promon, R&D 4. Administrative Functions Adjust Latch Options 4. Adjust LRU force skips: 100 Database Buffer Lookup

27 © 2014 Progress Software Corporation. All rights reserved. 27 Alternate Buffer Pool (OE 10.2B) Primary Buffer Pool -B buffers LRU buffer eviction policy LRU MRU Alternate Buffer Pool -B2 buffers LRU MRU LRU2 buffer eviction policy (only when needed)  Object specific data managed separately  Reduces “housekeeping” cost  Data can become resident in memory  Data Dictionary (by table/index/LOB)  proutil enableB2 (by storage area)  proutil viewB2 option  1 buffer pool cache  1 Hash table  Multiple LRU replacement chains Database Buffer Lookup

28 © 2014 Progress Software Corporation. All rights reserved. 28 Private (per user) Read-only Buffers (little known/used category)  Selfless act for table scan users Will not improve performance of user Helps others since it avoids fouling of LRU mechanism Use it for operations like dbanalys or table scan queries  Intended to improve performance overall Primary Buffer Pool -B buffers LRU buffer eviction policy LRU MRU Alternate Buffer Pool -B2 buffers LRU MRU Buffer pool hash table Database Buffer Lookup LRU2 buffer eviction policy (only when needed) LRU MRU LRU MRU -Bp (per user) eviction policies

29 © 2014 Progress Software Corporation. All rights reserved. 29 Private (per user) Read-only Buffers (little known/used category) Primary Buffer Pool -B buffers LRU buffer eviction policy LRU MRU Alternate Buffer Pool -B2 buffers LRU MRU Buffer pool hash table Database Buffer Lookup LRU2 buffer eviction policy (only when needed) LRU MRU LRU MRU -Bp (per user) eviction policies  Values Default: 0; Max 64 per client (cumulative total limited to 25% of –B) Change per client maximum with -Bpmax at db startup Set # buffers via -Bp at client startup –Can be changed at runtime via _MyConnection._Myconn-NumSeqBuffers

30 © 2014 Progress Software Corporation. All rights reserved. 30 Some Tuning Suggestions  -lruskips (OE 10.2B06 & OE 11.1) 100 seems to work well Only helps if LRU latch contention  -B2 (OE 10.2B) Set large enough to hold very active “small” tables Include indexes as well as the table  -Bp (V 9.0A) Set to # tables in query + depth of each index used –2 way join query: 8 to 10 will work well Use for table scan type queries –Application as well as utilities (dbanalys)  -B Tune to acceptable read I/O rates, not buffer pool hit ratio

31 © 2014 Progress Software Corporation. All rights reserved. 31 Auditing (OE 10.1A)  Policy based (flexible) Change capture internal to database Audit logs highly protected Create, update and delete change capture –(no read capture provided) Application events Archive for reporting  Reclaim Audit Space (OE 11.2) proutil -C auditreconfig [ tablearea ] [ indexarea ] –Re-creates audit tables and indexes in new area –Drops old audit tables and indexes –Existing data is truncated Carefully use prostrct truncate/remove to reclaim area’s disk space proutil -C auditreconfig [ tablearea ] [ indexarea

32 © 2014 Progress Software Corporation. All rights reserved. 32 OpenEdge Replication

33 © 2014 Progress Software Corporation. All rights reserved. 33 Maintain a “hot” standby with OpenEdge Replication (V9.?)

34 © 2014 Progress Software Corporation. All rights reserved. 34 OpenEdge Replication Enhancements  Increase max –pica (OE 11.2) Database Service Communication Area Size (-pica) Maximum value of increased from 512 to 1,000,000 Avoid database “slowdown” when target not keeping up  JTA & Replication (OE 11.2) Allow JTA distributed transactions and OpenEdge Replication

35 © 2014 Progress Software Corporation. All rights reserved. 35 OpenEdge Replication Enhancements  Table move/index move (OE 11.3) Now propagated to target  -asc : asynchronous level (relatively unknown category) Default is 10, Max is 500 Disabled with setting of 501 Server tells agent # blocks to be sent before ACK Increasing can greatly improve performance Set in pmmgr.properties file replserv option [replserv] arguments=-logging 2 –asc 501

36 © 2014 Progress Software Corporation. All rights reserved. 36 Relatively Unknown or Forgotten Features

37 © 2014 Progress Software Corporation. All rights reserved. 37 Misc Parameters  -keeptargetlfe (OE 10.2B04) Keep target large file enabled (lfe) Restores a backup without enabling large files By default: Target = Source on restore prorest [ -keeptargetlfe ]

38 © 2014 Progress Software Corporation. All rights reserved. 38 Client Database-Request Statement Caching (OE 10.1C)  What is it? Client execution stack trace dump Includes: Line #, procedure name, file name  When should you use it? Diagnosing deployed application problems Local and remote access  What’s in a name? Don’t confuse with other “statement caches”  Documentation OpenEdge Data Management: Database Administration

39 © 2014 Progress Software Corporation. All rights reserved. 39 Location Enablement – Multi-level activation Activate View promon  R&D  1. Status Displays Client Database-Request Statement Cache Activate For Selected Users 2. Activate For All Users 3. Activate For All Future Users 4. Deactivate For Selected Users 5. Deactivate For All Users 6. Deactivate For All Future Users 7. View Database-Request Statement Cache 8. Specify Directory for Statement Cache Files

40 © 2014 Progress Software Corporation. All rights reserved. 40 Procedure Call Stack  Top is last procedure executed  Bottom is first procedure executed  Top down, newest to oldest  One time full stack  Continuous full stack  Continuous current location It’s just a LIFO… # Procedure Name File Name 19 : reallyLongNamedInternalProcedure3 proctestb.r 12 : reallyLongNamedInternalProcedure2 proctestb.r 5 : reallyLongNamedInternalProcedure1 proctesta.r 445 : reallyLongNamedInternalProcedure0 proctesta.r 1 : /usr1/stmtest/p72340_Untitled1.ped Newest Oldest Top Bottom

41 © 2014 Progress Software Corporation. All rights reserved. 41 Manual Stack Generation  Stack also available via “prostack” or “progetstack” Useful for “non-responsive” connections Available with 10.1c Must have access to client’s machine  kill –SIGUSR1 (Don’t forget the dash) protrace. –Startup parameters –Execution stack –** ABL Stack Trace ** (OE 10.2B) –** Persistent procedures/Classes ** –** PROPATH ** –** Databases (logical/type/physical) **

42 © 2014 Progress Software Corporation. All rights reserved. 42 Object Mapping Cache - OM Latch: OM Lookup and LRU Table ATable BCust TblTable DIndex A-1Index B-1Name IdxCust# IdxSRep IdxIndex D-1Index D-2 Logical Mapping Languages Get _StorageObject record Schema

43 © 2014 Progress Software Corporation. All rights reserved. 43 Object Mapping Cache - OM Latch: OM Lookup and LRU Table ATable BCust TblTable DIndex A-1Index B-1Name IdxCust# IdxSRep IdxIndex D-1Index D-2 Logical Mapping Languages OM cache loaded at startup No latching, no paging Zero contention! Primary Cache Get _StorageObject record Schema -omsize Hash Table

44 © 2014 Progress Software Corporation. All rights reserved. 44 Object Mapping Cache - OM Latch: OM Lookup and LRU Table ATable BCust TblTable DIndex A-1Index B-1Name IdxCust# IdxSRep IdxIndex D-1Index D-2 Logical Mapping Languages OM cache loaded at startup No latching, no paging Zero contention! Primary Cache Little contention 2 nd cache for over flow & new objects OM latch needed for paging maintenance Get _StorageObject record Secondary Cache OM Schema -omsize Hash Table

45 © 2014 Progress Software Corporation. All rights reserved. 45 How to manage Object Mapping Cache  Do I have a problem? Check latch statistics define variable prev-latches as integer. repeat: find _latch where _latch-name = "MTL_OM". display _Latch-Name _Latch-Lock /* # times latch acquired */ _Latch-Wait /* # time conflict occurred */ _Latch-Lock - prev-latches label "latch/sec". prev-latches = _Latch-Lock. pause 1. end. Activity Contention

46 © 2014 Progress Software Corporation. All rights reserved. 46 How to manage Object Mapping Cache  Do I have a problem? Check latch statistics  Identify proper value  Set it properly on startup to avoid eviction & latch contention (V9.0a !)  Memory used: ~192 bytes per entry  Default 1024 = ~384K  This is shared memory 1 primary and 1 secondary cache per database select count(*) from _storageObject proserv -omsize …

47 © 2014 Progress Software Corporation. All rights reserved. 47 Altering Performance Related Parameters Online Paramater NamepromonVST recspacesearchdepthAdjust Latch Options lru2EnabledAdjust Latch Options_ActBuffer. _Buffer-LRUEnabled lruskipsAdjust Latch Options_startup._Startup-LRU-Skips lru2skipsAdjust Latch Options_startup._Startup-LRU2-Skips spinAdjust Latch Options_startup._Startup-Spin nGovernorAdjust Governor options_startup._Startup-nGovernor LGovernorAdjust Governor options_startup._Startup-Lgovernor pwqdwlayAdjust Page Writer Options_startup._Startup-APWQTime pwsdelayAdjust Page Writer Options_startup._Startup-APWSTime pwscanAdjust Page Writer Options_startup_Startup-APWBuffs pwwmaxAdjust Page Writer Options_startup._Startup-APWMaxWrites client trace levelClient DB-Request Statement Cache_connect._Connect-CachingType client trace requestClient DB-Request Statement Cache enablelargekeys _Database-Feature NmsgwaitServer Options_startup._Startup-NmsgWait prefetchFactorServer Options_startup._Startup-Prefetch-Factor prefetchNumRecsServer Options_startup._Startup-Prefetch-Num-Recs prefetchPriorityServer Options_startup._Startup-Prefetch-Priority prefetchDelayServer Options_startup._Startup-Prefetch-Delay Bp (Private Buffers)_myConnect._MyConn-NumSeqBuffers TableBase_statbase._TableBase IndexBase_statbase._IndexBase

48 © 2014 Progress Software Corporation. All rights reserved. 48 Increase Resource Startup Parameters Online (OE 10.1C)  Parameter list -aibuf, -bibufs -B, -B2 -L -omsize -mtpmsize (OE 11.0) -Mxs  Increase, not decrease  New segment restrictions Kernel restrictions apply Security restrictions –Servers: automatically attach quickly –Self serve: attach w/db action over time Minimum segment size created: 128 MB proutil -C increaseto

49 © 2014 Progress Software Corporation. All rights reserved. 49 Increase startup parameters online Example requiring new shared memory segment proutil myDb -C increaseto -Mxs Waiting for broker connection to newly added shared memory segments. Usr Name Type Pid 7 userb ABL 5957 The connections above have not attached to recently added shm segments. Do you wish to recheck? (y/n) (n): Increase params aborted because of shared memory allocation issue. (y): Increase params increasing excess shared memory (-Mxs) from 1024 to Shm Seg 2 More -Mxs Shm Seg 1 -L, -B, -omsize, -bibufs, -aibufs, -Mxs SSClient

50 © 2014 Progress Software Corporation. All rights reserved. 50 OpenEdge Database Enhancement Summary  Major Enhancements Transparent Data Encryption Multi-tenancy  Other Enhancements Runtime tuning Utility Performance Application insights Auditing  Little known or forgotten Private buffers Om cache (-omsize) Changing parameters online

51


Download ppt "What’s New in the OpenEdge Database Norwegian PUG Event Richard Banville, Fellow, OpenEdge Development April 8, 2014."

Similar presentations


Ads by Google